ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGM4Mzg2MDAuLmQ0ZDlhMzMgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMTEwLDcgKzExMCw5IEBACiAJY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya01hbmFnZW1lbnRFdmVudE9ic2VydmVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JVGhyb3R0bGVNYW5hZ2VyLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeUxpc3RlbmVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeU1hbmFnZXIuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrU3RhdHNTZXJ2aWNlLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25mYy9JTGxjcENvbm5lY3Rpb25sZXNzU29ja2V0LmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL25mYy9JTGxjcFNlcnZpY2VTb2NrZXQuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lMbGNwU29ja2V0LmFpZGwgXApAQCAtMTIzLDE0ICsxMjUsMTUgQEAKIAljb3JlL2phdmEvYW5kcm9pZC9vcy9JSGFyZHdhcmVTZXJ2aWNlLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL29zL0lNZXNzZW5nZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5haWRsIFwKLQljb3JlL2phdmEvYW5kcm9pZC9vcy9JTmV0U3RhdFNlcnZpY2UuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvb3MvSVBlcm1pc3Npb25Db250cm9sbGVyLmFpZGwgXAogCWNvcmUvamF2YS9hbmRyb2lkL29zL0lQb3dlck1hbmFnZXIuYWlkbCBcCi0gICAgY29yZS9qYXZhL2FuZHJvaWQvb3MvSVJlbW90ZUNhbGxiYWNrLmFpZGwgXAorCWNvcmUvamF2YS9hbmRyb2lkL29zL0lSZW1vdGVDYWxsYmFjay5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC9vcy9JVmlicmF0b3JTZXJ2aWNlLmFpZGwgXAotICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJDb25uZWN0aW9uLmFpZGwgXAotICAgIGNvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL0lXYWxscGFwZXJFbmdpbmUuYWlkbCBcCi0gICAgY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlclNlcnZpY2UuYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckNvbm5lY3Rpb24uYWlkbCBcCisJY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvSVdhbGxwYXBlckVuZ2luZS5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9JV2FsbHBhcGVyU2VydmljZS5haWRsIFwKKwljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24uYWlkbFwKKwljb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjay5haWRsXAogCWNvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbCBcCiAJY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudC5haWRsIFwKIAljb3JlL2phdmEvYW5kcm9pZC92aWV3L0lBcHBsaWNhdGlvblRva2VuLmFpZGwgXApAQCAtMTYyLDcgKzE2NSw3IEBACiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kU2Vzc2lvbi5haWRsIFwKIAljb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0lSZW1vdGVWaWV3c0ZhY3RvcnkuYWlkbCBcCiAJY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9JUmVtb3RlVmlld3NBZGFwdGVyQ29ubmVjdGlvbi5haWRsIFwKLQlrZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvSUtleUNoYWluQWxpYXNSZXNwb25zZS5haWRsIFwKKwlrZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvSUtleUNoYWluQWxpYXNDYWxsYmFjay5haWRsIFwKIAlrZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvSUtleUNoYWluU2VydmljZS5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlEZXRlY3Rvci5haWRsIFwKIAlsb2NhdGlvbi9qYXZhL2FuZHJvaWQvbG9jYXRpb24vSUNvdW50cnlMaXN0ZW5lci5haWRsIFwKQEAgLTM3OSw4ICszODIsMTIgQEAKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UgIkFjY2Vzc2liaWxpdHkgU2VydmljZSIgXAogCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL0FjY2VsZXJvbWV0ZXJQbGF5IFwKIAkJICAgICAgICAgICAgcmVzb3VyY2VzL3NhbXBsZXMvQWNjZWxlcm9tZXRlclBsYXkgIkFjY2VsZXJvbWV0ZXIgUGxheSIgXAotCSAgLXNhbXBsZWNvZGUgJChzYW1wbGVfZGlyKS9BcGlEZW1vcyBcCisJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvQXBpRGVtb3MgXAogCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9BcGlEZW1vcyAiQVBJIERlbW9zIiBcCisJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvU3VwcG9ydDREZW1vcyBcCisJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL1N1cHBvcnQ0RGVtb3MgIkFQSSA0KyBTdXBwb3J0IERlbW9zIiBcCisJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvU3VwcG9ydDEzRGVtb3MgXAorCQkgICAgICAgICAgICByZXNvdXJjZXMvc2FtcGxlcy9TdXBwb3J0MTNEZW1vcyAiQVBJIDEzKyBTdXBwb3J0IERlbW9zIiBcCiAJCS1zYW1wbGVjb2RlICQoc2FtcGxlX2RpcikvQmFja3VwUmVzdG9yZSBcCiAJCSAgICAgICAgICAgIHJlc291cmNlcy9zYW1wbGVzL0JhY2t1cFJlc3RvcmUgIkJhY2t1cCBhbmQgUmVzdG9yZSIgXAogCQktc2FtcGxlY29kZSAkKHNhbXBsZV9kaXIpL0JsdWV0b290aENoYXQgXApkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IGIxOWJlZDAuLjhkMzQ2MzYgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTk4LDYgKzk4LDggQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2NvcmUvamF2YS9hbmRyb2lkL25mYykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMpCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzdGFnZWZyaWdodF9pbnRlcm1lZGlhdGVzKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvY29yZS9qYXZhL2FuZHJvaWQvb3MpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9JS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlLmphdmEpCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKICMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hcGkvMTMueG1sIGIvYXBpLzEzLnhtbAppbmRleCBmZjI3OWUxLi45YWYwNjQwIDEwMDY0NAotLS0gYS9hcGkvMTMueG1sCisrKyBiL2FwaS8xMy54bWwKQEAgLTEwMjQsNiArMTAyNCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iU0VUX1BPSU5URVJfU1BFRUQiCisgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iJnF1b3Q7YW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9QT0lOVEVSX1NQRUVEJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlNFVF9QUkVGRVJSRURfQVBQTElDQVRJT05TIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTMxMjgsNiArMzEzOSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iY29tcGF0aWJsZVdpZHRoTGltaXREcCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2ODQzNjIxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImNvbXBsZXRpb25IaW50IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTg3OCw2ICs1OTAwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJsYXJnZXN0V2lkdGhMaW1pdERwIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY4NDM2MjIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibGF1bmNoTW9kZSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTc5MTMsNiArNzk0NiwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0icmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjg0MzYyMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJyZXNpemVNb2RlIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTUxNjQsNiArMTUyMDgsMzI1IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwNzUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfSG9sb19EaWFsb2dXaW5kb3dUaXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MTAzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fSW52ZXJzZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDc2IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fTGFyZ2UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA3NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX0xhcmdlX0ludmVyc2UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA3OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX01lZGl1bSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDc5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fTWVkaXVtX0ludmVyc2UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA4MCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1NlYXJjaFJlc3VsdF9TdWJ0aXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDg0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fU2VhcmNoUmVzdWx0X1RpdGxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwODMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfSG9sb19TbWFsbCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDgxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fU21hbGxfSW52ZXJzZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDgyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwODUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfQWN0aW9uQmFyX1N1YnRpdGxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwOTkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfQWN0aW9uQmFyX1RpdGxlIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwOTgiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfQWN0aW9uTW9kZV9TdWJ0aXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MTAxIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X0FjdGlvbk1vZGVfVGl0bGUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDEwMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9CdXR0b24iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA4NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9Ecm9wRG93bkhpbnQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA5MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9Ecm9wRG93bkl0ZW0iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA5MiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9FZGl0VGV4dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDk0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X0ljb25NZW51X0l0ZW0iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA4NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9Qb3B1cE1lbnUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA5NSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9Qb3B1cE1lbnVfTGFyZ2UiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9Qb3B1cE1lbnVfU21hbGwiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA5NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9UYWJXaWRnZXQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA4OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9UZXh0VmlldyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDg5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X1RleHRWaWV3X1BvcHVwTWVudSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDkwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X1RleHRWaWV3X1NwaW5uZXJJdGVtIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwOTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGV4dEFwcGVhcmFuY2VfSG9sb19XaW5kb3dUaXRsZSIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MTAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRleHRBcHBlYXJhbmNlX0ludmVyc2UiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTY3MCw2ICsxNjAzMywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVGhlbWVfSG9sb19MaWdodF9Ob0FjdGlvbkJhciIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDY0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTGlnaHRfTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDY1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRoZW1lX0hvbG9fTGlnaHRfUGFuZWwiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNTk3OCw2ICsxNjM2MywzOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iV2lkZ2V0X0FjdGlvbkJhcl9UYWJCYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA2OCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfQWN0aW9uQmFyX1RhYlRleHQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA2NyIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfQWN0aW9uQmFyX1RhYlZpZXciCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA2NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJXaWRnZXRfQWN0aW9uQnV0dG9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTYyMzEsNiArMTY2NDksMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9Ib2xvX0FjdGlvbkJhcl9UYWJCYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA3MSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfSG9sb19BY3Rpb25CYXJfVGFiVGV4dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDcwIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9Ib2xvX0FjdGlvbkJhcl9UYWJWaWV3IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwNjkiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0X0hvbG9fQWN0aW9uQnV0dG9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTY1MDYsNiArMTY5NTcsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9Ib2xvX0xpZ2h0X0FjdGlvbkJhcl9UYWJCYXIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxNjk3NDA3NCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJXaWRnZXRfSG9sb19MaWdodF9BY3Rpb25CYXJfVGFiVGV4dCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE2OTc0MDczIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IldpZGdldF9Ib2xvX0xpZ2h0X0FjdGlvbkJhcl9UYWJWaWV3IgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTY5NzQwNzIiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iV2lkZ2V0X0hvbG9fTGlnaHRfQWN0aW9uQnV0dG9uIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMjI3MDcsNyArMjMxOTEsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+CkBAIC0yMjk4MSw3ICsyMzQ2NSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtMjM0MzQsNyArMjM5MTgsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgpAQCAtMjM3OTgsNyArMjQyODIsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwcm90ZWN0ZWQiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgpAQCAtMjM4ODAsNyArMjQzNjQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L21ldGhvZD4KQEAgLTI0MTAyLDcgKzI0NTg2LDcgQEAKICBzeW5jaHJvbml6ZWQ9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9InRydWUiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImlkIiB0eXBlPSJpbnQiPgpAQCAtMjQ0NTIsNyArMjQ5MzYsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0idHJ1ZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDxwYXJhbWV0ZXIgbmFtZT0iaWQiIHR5cGU9ImludCI+CkBAIC0yNDQ2NSw3ICsyNDk0OSw3IEBACiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPHBhcmFtZXRlciBuYW1lPSJpZCIgdHlwZT0iaW50Ij4KQEAgLTMwNTI5LDYgKzMxMDEzLDIxIEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9Im9uVmlld0NyZWF0ZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJ2aWV3IiB0eXBlPSJhbmRyb2lkLnZpZXcuVmlldyI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0ic2F2ZWRJbnN0YW5jZVN0YXRlIiB0eXBlPSJhbmRyb2lkLm9zLkJ1bmRsZSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJyZWdpc3RlckZvckNvbnRleHRNZW51IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0zMDU2OCw2ICszMTA2NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJoYXNNZW51IiB0eXBlPSJib29sZWFuIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEluaXRpYWxTYXZlZFN0YXRlIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ic3RhdGUiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50LlNhdmVkU3RhdGUiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0UmV0YWluSW5zdGFuY2UiCiAgcmV0dXJuPSJ2b2lkIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMwNjU5LDYgKzMxMTcxLDUzIEBACiA8L3BhcmFtZXRlcj4KIDwvY29uc3RydWN0b3I+CiA8L2NsYXNzPgorPGNsYXNzIG5hbWU9IkZyYWdtZW50LlNhdmVkU3RhdGUiCisgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLm9zLlBhcmNlbGFibGUiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9IndyaXRlVG9QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJkZXN0IiB0eXBlPSJhbmRyb2lkLm9zLlBhcmNlbCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0iZmxhZ3MiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPGZpZWxkIG5hbWU9IkNSRUFUT1IiCisgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNsYXNzTG9hZGVyQ3JlYXRvciIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzwvY2xhc3M+CiA8Y2xhc3MgbmFtZT0iRnJhZ21lbnRCcmVhZENydW1icyIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlld0dyb3VwIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTMxMDkyLDYgKzMxNjUxLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9Imxpc3RlbmVyIiB0eXBlPSJhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0ic2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZSIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50LlNhdmVkU3RhdGUiCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZiIgdHlwZT0iYW5kcm9pZC5hcHAuRnJhZ21lbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxmaWVsZCBuYW1lPSJQT1BfQkFDS19TVEFDS19JTkNMVVNJVkUiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0zMTI2Miw2ICszMTgzNCwxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImF0dGFjaCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNvbW1pdCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0idHJ1ZSIKQEAgLTMxMjg0LDYgKzMxODY5LDE5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImRldGFjaCIKKyByZXR1cm49ImFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb24iCisgYWJzdHJhY3Q9InRydWUiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZnJhZ21lbnQiIHR5cGU9ImFuZHJvaWQuYXBwLkZyYWdtZW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImRpc2FsbG93QWRkVG9CYWNrU3RhY2siCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzE0NDIsNiArMzIwNDAsMjUgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZXhpdCIgdHlwZT0iaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InNldEN1c3RvbUFuaW1hdGlvbnMiCisgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImVudGVyIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImV4aXQiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9wRW50ZXIiIHR5cGU9ImludCI+Cis8L3BhcmFtZXRlcj4KKzxwYXJhbWV0ZXIgbmFtZT0icG9wRXhpdCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldFRyYW5zaXRpb24iCiAgcmV0dXJuPSJhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uIgogIGFic3RyYWN0PSJ0cnVlIgpAQCAtMzI2MjMsNyArMzMyNDAsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLmFwcC5LZXlndWFyZE1hbmFnZXIuT25LZXlndWFyZEV4aXRSZXN1bHQiPgpAQCAtMzI2NDcsNyArMzMyNjQsNyBAQAogIHN5bmNocm9uaXplZD0iZmFsc2UiCiAgc3RhdGljPSJmYWxzZSIKICBmaW5hbD0iZmFsc2UiCi0gZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8cGFyYW1ldGVyIG5hbWU9InRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyI+CkBAIC0zMjY1OSw3ICszMzI3Niw3IEBACiAgYWJzdHJhY3Q9ImZhbHNlIgogIHN0YXRpYz0iZmFsc2UiCiAgZmluYWw9ImZhbHNlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPG1ldGhvZCBuYW1lPSJkaXNhYmxlS2V5Z3VhcmQiCkBAIC01Nzg0MCw2ICs1ODQ1NywyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iQ09ORklHX1NDUkVFTl9TSVpFIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyNCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJDT05GSUdfU01BTExFU1RfU0NSRUVOX1NJWkUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMDQ4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkNPTkZJR19UT1VDSFNDUkVFTiIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTU4NTg4LDYgKzU5MjI3LDE2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJjb21wYXRpYmxlV2lkdGhMaW1pdERwIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9ImRhdGFEaXIiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTg2MjgsNiArNTkyNzcsMTYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Imxhcmdlc3RXaWR0aExpbWl0RHAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ibWFuYWdlU3BhY2VBY3Rpdml0eU5hbWUiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNTg2NzgsNiArNTkzMzcsMTYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InJlcXVpcmVzU21hbGxlc3RXaWR0aERwIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InNoYXJlZExpYnJhcnlGaWxlcyIKICB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTYxMDUzLDYgKzYxNzIyLDI4IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJGRUFUVVJFX0ZBS0VUT1VDSF9NVUxUSVRPVUNIX0RJU1RJTkNUIgorIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IiZxdW90O2FuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guZGlzdGluY3QmcXVvdDsiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iRkVBVFVSRV9GQUtFVE9VQ0hfTVVMVElUT1VDSF9KQVpaSEFORCIKKyB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSImcXVvdDthbmRyb2lkLmhhcmR3YXJlLmZha2V0b3VjaC5tdWx0aXRvdWNoLmphenpoYW5kJnF1b3Q7IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IkZFQVRVUkVfTElWRV9XQUxMUEFQRVIiCiAgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjM5MDIsNiArNjQ1OTMsMzkgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlNDUkVFTl9IRUlHSFRfRFBfVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTQ1JFRU5fV0lEVEhfRFBfVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJTTUFMTEVTVF9TQ1JFRU5fV0lEVEhfRFBfVU5ERUZJTkVEIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMCIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJUT1VDSFNDUkVFTl9GSU5HRVIiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02NDAzNCw2ICs2NDc1OCwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVUlfTU9ERV9UWVBFX1RFTEVWSVNJT04iCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlVJX01PREVfVFlQRV9VTkRFRklORUQiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC02NDE0NSw2ICs2NDg4MCwxNiBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic2NyZWVuSGVpZ2h0RHAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0ic2NyZWVuTGF5b3V0IgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtNjQxNTUsNiArNjQ5MDAsMjYgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9InNjcmVlbldpZHRoRHAiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0ic21hbGxlc3RTY3JlZW5XaWR0aERwIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9InRvdWNoc2NyZWVuIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtODQ1ODQsNiArODUzNDksOCBAQAogIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KKzxpbXBsZW1lbnRzIG5hbWU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZSI+Cis8L2ltcGxlbWVudHM+CiA8Y29uc3RydWN0b3IgbmFtZT0iUG9pbnQiCiAgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5Qb2ludCIKICBzdGF0aWM9ImZhbHNlIgpAQCAtODQ2MTQsNiArODUzODEsMTcgQEAKIDxwYXJhbWV0ZXIgbmFtZT0ic3JjIiB0eXBlPSJhbmRyb2lkLmdyYXBoaWNzLlBvaW50Ij4KIDwvcGFyYW1ldGVyPgogPC9jb25zdHJ1Y3Rvcj4KKzxtZXRob2QgbmFtZT0iZGVzY3JpYmVDb250ZW50cyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJlcXVhbHMiCiAgcmV0dXJuPSJib29sZWFuIgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTg0NjU1LDYgKzg1NDMzLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImR5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0icmVhZEZyb21QYXJjZWwiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJpbiIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0ic2V0IgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC04NDY3MCw2ICs4NTQ2MSwzMSBAQAogPHBhcmFtZXRlciBuYW1lPSJ5IiB0eXBlPSJpbnQiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IngiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC04NDY5OSw2ICs4NTUxNSw4IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlIj4KKzwvaW1wbGVtZW50cz4KIDxjb25zdHJ1Y3RvciBuYW1lPSJQb2ludEYiCiAgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5Qb2ludEYiCiAgc3RhdGljPSJmYWxzZSIKQEAgLTg0NzI5LDYgKzg1NTQ3LDE3IEBACiA8cGFyYW1ldGVyIG5hbWU9InAiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJkZXNjcmliZUNvbnRlbnRzIgorIHJldHVybj0iaW50IgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImVxdWFscyIKICByZXR1cm49ImJvb2xlYW4iCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtODQ3OTYsNiArODU2MjUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iZHkiIHR5cGU9ImZsb2F0Ij4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InJlYWRGcm9tUGFyY2VsIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iaW4iIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9InNldCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtODQ4MjQsNiArODU2NjYsMzEgQEAKIDxwYXJhbWV0ZXIgbmFtZT0icCIgdHlwZT0iYW5kcm9pZC5ncmFwaGljcy5Qb2ludEYiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0id3JpdGVUb1BhcmNlbCIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dCIgdHlwZT0iYW5kcm9pZC5vcy5QYXJjZWwiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImZsYWdzIiB0eXBlPSJpbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxmaWVsZCBuYW1lPSJDUkVBVE9SIgorIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IngiCiAgdHlwZT0iZmxvYXQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTk1MjUzLDYgKzk2MTIwLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldFJhd0Rlc2NyaXB0b3JzIgorIHJldHVybj0iYnl0ZVtdIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldFNlcmlhbCIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTE0MDYwLDYgKzExNDkzOCwyOCBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iVFlQRV9CTFVFVE9PVEgiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI3IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IlRZUEVfRVRIRVJORVQiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9IlRZUEVfTU9CSUxFIgogIHR5cGU9ImludCIKICB0cmFuc2llbnQ9ImZhbHNlIgpAQCAtMTQzNDAyLDYgKzE0NDMwMiwyMSBAQAogPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZHVtcEFzeW5jIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0iZmQiIHR5cGU9ImphdmEuaW8uRmlsZURlc2NyaXB0b3IiPgorPC9wYXJhbWV0ZXI+Cis8cGFyYW1ldGVyIG5hbWU9ImFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmdbXSI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmbHVzaFBlbmRpbmdDb21tYW5kcyIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTQ0MDMyLDYgKzE0NDk0NywxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iSE9ORVlDT01CX01SMiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEzIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJCdW5kbGUiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE0Nzg2Myw2ICsxNDg3ODksMjMgQEAKIDxleGNlcHRpb24gbmFtZT0iUmVtb3RlRXhjZXB0aW9uIiB0eXBlPSJhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiI+CiA8L2V4Y2VwdGlvbj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJkdW1wQXN5bmMiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9ImZkIiB0eXBlPSJqYXZhLmlvLkZpbGVEZXNjcmlwdG9yIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJhcmdzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nW10iPgorPC9wYXJhbWV0ZXI+Cis8ZXhjZXB0aW9uIG5hbWU9IlJlbW90ZUV4Y2VwdGlvbiIgdHlwZT0iYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0iZ2V0SW50ZXJmYWNlRGVzY3JpcHRvciIKICByZXR1cm49ImphdmEubGFuZy5TdHJpbmciCiAgYWJzdHJhY3Q9InRydWUiCkBAIC0xNTAxNjksNiArMTUxMTEyLDE5IEBACiA8cGFyYW1ldGVyIG5hbWU9ImRlc2NyaXB0b3IiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiPgogPC9wYXJhbWV0ZXI+CiA8L2NvbnN0cnVjdG9yPgorPG1ldGhvZCBuYW1lPSJhZG9wdEZkIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImNsb3NlIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTAyMTcsNiArMTUxMTczLDM2IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImR1cCIKKyByZXR1cm49ImFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzxwYXJhbWV0ZXIgbmFtZT0ib3JpZyIgdHlwZT0iamF2YS5pby5GaWxlRGVzY3JpcHRvciI+Cis8L3BhcmFtZXRlcj4KKzxleGNlcHRpb24gbmFtZT0iSU9FeGNlcHRpb24iIHR5cGU9ImphdmEuaW8uSU9FeGNlcHRpb24iPgorPC9leGNlcHRpb24+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZnJvbUZkIgorIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJmZCIgdHlwZT0iaW50Ij4KKzwvcGFyYW1ldGVyPgorPGV4Y2VwdGlvbiBuYW1lPSJJT0V4Y2VwdGlvbiIgdHlwZT0iamF2YS5pby5JT0V4Y2VwdGlvbiI+Cis8L2V4Y2VwdGlvbj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJmcm9tU29ja2V0IgogIHJldHVybj0iYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xNTA1OTYsNiArMTUxNTgyLDMxIEBACiA+CiA8L2ZpZWxkPgogPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IlBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IiPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJjcmVhdGVGcm9tUGFyY2VsIgorIHJldHVybj0iVCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJzb3VyY2UiIHR5cGU9ImFuZHJvaWQub3MuUGFyY2VsIj4KKzwvcGFyYW1ldGVyPgorPHBhcmFtZXRlciBuYW1lPSJsb2FkZXIiIHR5cGU9ImphdmEubGFuZy5DbGFzc0xvYWRlciI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgorPC9pbnRlcmZhY2U+CiA8aW50ZXJmYWNlIG5hbWU9IlBhcmNlbGFibGUuQ3JlYXRvciIKICBhYnN0cmFjdD0idHJ1ZSIKICBzdGF0aWM9InRydWUiCkBAIC0xNTA4OTMsNyArMTUxOTA0LDcgQEAKICB2YWx1ZT0iMTAiCiAgc3RhdGljPSJ0cnVlIgogIGZpbmFsPSJ0cnVlIgotIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIGRlcHJlY2F0ZWQ9ImRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KQEAgLTE4NDE1NSw2ICsxODUxNjYsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9Ik5FVFdPUktfVFlQRV9IU1BBUCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjE1IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPGZpZWxkIG5hbWU9Ik5FVFdPUktfVFlQRV9IU1VQQSIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwNTc4OSw2ICsyMDY4MTEsMTcgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IkRFTlNJVFlfVFYiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIyMTMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+CiA8ZmllbGQgbmFtZT0iREVOU0lUWV9YSElHSCIKICB0eXBlPSJpbnQiCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTIwOTk1MCwxMSArMjEwOTgzLDExIEBACiA8bWV0aG9kIG5hbWU9ImdldEhlaWdodCIKICByZXR1cm49ImludCIKICBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKLSBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgpAQCAtMjA5OTkzLDYgKzIxMTAyNiwxOSBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJnZXRSZWN0U2l6ZSIKKyByZXR1cm49InZvaWQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFNpemUiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUmVjdCI+Cis8L3BhcmFtZXRlcj4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJnZXRSZWZyZXNoUmF0ZSIKICByZXR1cm49ImZsb2F0IgogIGFic3RyYWN0PSJmYWxzZSIKQEAgLTIxMDAxNSwxNiArMjExMDYxLDI5IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Ci08bWV0aG9kIG5hbWU9ImdldFdpZHRoIgotIHJldHVybj0iaW50IgorPG1ldGhvZCBuYW1lPSJnZXRTaXplIgorIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCi0gbmF0aXZlPSJ0cnVlIgorIG5hdGl2ZT0iZmFsc2UiCiAgc3luY2hyb25pemVkPSJmYWxzZSIKICBzdGF0aWM9ImZhbHNlIgogIGZpbmFsPSJmYWxzZSIKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Cis8cGFyYW1ldGVyIG5hbWU9Im91dFNpemUiIHR5cGU9ImFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQiPgorPC9wYXJhbWV0ZXI+Cis8L21ldGhvZD4KKzxtZXRob2QgbmFtZT0iZ2V0V2lkdGgiCisgcmV0dXJuPSJpbnQiCisgYWJzdHJhY3Q9ImZhbHNlIgorIG5hdGl2ZT0iZmFsc2UiCisgc3luY2hyb25pemVkPSJmYWxzZSIKKyBzdGF0aWM9ImZhbHNlIgorIGZpbmFsPSJmYWxzZSIKKyBkZXByZWNhdGVkPSJkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KIDwvbWV0aG9kPgogPGZpZWxkIG5hbWU9IkRFRkFVTFRfRElTUExBWSIKICB0eXBlPSJpbnQiCkBAIC0yMTI3NDIsNiArMjEzODAxLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9ImdldE1vZGlmaWVycyIKKyByZXR1cm49ImludCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9ImdldE51bWJlciIKICByZXR1cm49ImNoYXIiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMjIwOTY2LDcgKzIyMjAzNiw3IEBACiAgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCiAgdmlzaWJpbGl0eT0icHVibGljIgogPgotPHBhcmFtZXRlciBuYW1lPSJldiIgdHlwZT0iYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50Ij4KKzxwYXJhbWV0ZXIgbmFtZT0iZXZlbnQiIHR5cGU9ImFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJjbGVhciIKZGlmZiAtLWdpdCBhL2FwaS8xNC50eHQgYi9hcGkvMTQudHh0CmluZGV4IGIwODBkMjUuLjA1MDU0MGIgMTAwNjQ0Ci0tLSBhL2FwaS8xNC50eHQKKysrIGIvYXBpLzE0LnR4dApAQCAtMTkyMSwxMiArMTkyMSwxMiBAQAogCiAgIHB1YmxpYyBjbGFzcyBGbG9hdEV2YWx1YXRvciBpbXBsZW1lbnRzIGFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IgewogICAgIGN0b3IgcHVibGljIEZsb2F0RXZhbHVhdG9yKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGV2YWx1YXRlKGZsb2F0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5GbG9hdCBldmFsdWF0ZShmbG9hdCwgamF2YS5sYW5nLk51bWJlciwgamF2YS5sYW5nLk51bWJlcik7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgSW50RXZhbHVhdG9yIGltcGxlbWVudHMgYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciB7CiAgICAgY3RvciBwdWJsaWMgSW50RXZhbHVhdG9yKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGV2YWx1YXRlKGZsb2F0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5JbnRlZ2VyIGV2YWx1YXRlKGZsb2F0LCBqYXZhLmxhbmcuSW50ZWdlciwgamF2YS5sYW5nLkludGVnZXIpOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEtleWZyYW1lIGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSB7CkBAIC0yMDEyLDcgKzIwMTIsNyBAQAogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBUeXBlRXZhbHVhdG9yIHsKLSAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZXZhbHVhdGUoZmxvYXQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgVCBldmFsdWF0ZShmbG9hdCwgVCwgVCk7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgVmFsdWVBbmltYXRvciBleHRlbmRzIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIHsKQEAgLTYyNzMsNiArNjI3Myw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3Vyc29ySm9pbmVyLlJlc3VsdCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIuUmVzdWx0IEJPVEg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyLlJlc3VsdCBMRUZUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHQgUklHSFQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQ3Vyc29yV2luZG93IGV4dGVuZHMgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlQ2xvc2FibGUgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewpAQCAtNzE5MSw2ICs3MTk0LDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBdm9pZFhmZXJtb2RlLk1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkF2b2lkWGZlcm1vZGUuTW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkF2b2lkWGZlcm1vZGUuTW9kZSBBVk9JRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGUgVEFSR0VUOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIEJpdG1hcCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CkBAIC03MjQzLDExICs3MjQ4LDE3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQml0bWFwLkNvbXByZXNzRm9ybWF0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXQgSlBFRzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXQgUE5HOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCaXRtYXAuQ29uZmlnIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZ1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgQUxQSEFfODsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgQVJHQl80NDQ0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgQVJHQl84ODg4OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgUkdCXzU2NTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBCaXRtYXBGYWN0b3J5IHsKQEAgLTczMTEsNiArNzMyMiwxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJsdXJNYXNrRmlsdGVyLkJsdXIgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciBJTk5FUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIE5PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIE9VVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyLkJsdXIgU09MSUQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQ2FtZXJhIHsKQEAgLTc0MjQsMTEgKzc0MzksMTYgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYW52YXMuRWRnZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5FZGdlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5FZGdlVHlwZSBBQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGUgQlc7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbnZhcy5WZXJ0ZXhNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGUgVFJJQU5HTEVTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlIFRSSUFOR0xFX0ZBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuVmVydGV4TW9kZSBUUklBTkdMRV9TVFJJUDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBDb2xvciB7CkBAIC03NTQzLDYgKzc1NjMsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEludGVycG9sYXRvci5SZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdCBGUkVFWkVfRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQgRlJFRVpFX1NUQVJUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQgTk9STUFMOwogICB9CiAKICAgcHVibGljIGNsYXNzIExheWVyUmFzdGVyaXplciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUmFzdGVyaXplciB7CkBAIC03NjI2LDYgKzc2NDksMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNYXRyaXguU2NhbGVUb0ZpdCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeC5TY2FsZVRvRml0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeC5TY2FsZVRvRml0IENFTlRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCBFTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQgRklMTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCBTVEFSVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBNb3ZpZSB7CkBAIC03NzU1LDExICs3NzgyLDE3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFpbnQuQWxpZ24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludC5BbGlnbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ25bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5BbGlnbiBDRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gTEVGVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5BbGlnbiBSSUdIVDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFpbnQuQ2FwIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5DYXBbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5DYXAgQlVUVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5DYXAgUk9VTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIFNRVUFSRTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFpbnQuRm9udE1ldHJpY3MgewpAQCAtNzc4MywxMSArNzgxNiwxNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LkpvaW4gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbiBCRVZFTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luIE1JVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkpvaW4gUk9VTkQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LlN0eWxlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgRklMTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZSBGSUxMX0FORF9TVFJPS0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgU1RST0tFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhaW50RmxhZ3NEcmF3RmlsdGVyIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyIHsKQEAgLTc4MzksMTEgKzc4NzgsMTcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXRoLkRpcmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRGlyZWN0aW9uIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRGlyZWN0aW9uIENDVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbiBDVzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aC5GaWxsVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRmlsbFR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRmlsbFR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIEVWRU5fT0REOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRmlsbFR5cGUgSU5WRVJTRV9FVkVOX09ERDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIElOVkVSU0VfV0lORElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIFdJTkRJTkc7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUGF0aERhc2hQYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0IHsKQEAgLTc4NTMsNiArNzg5OCw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QuU3R5bGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QuU3R5bGUgTU9SUEg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIFJPVEFURTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QuU3R5bGUgVFJBTlNMQVRFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhdGhFZmZlY3QgewpAQCAtNzk0OSw2ICs3OTk3LDI0IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUG9ydGVyRHVmZi5Nb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgQUREOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBDTEVBUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgREFSS0VOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERTVF9BVE9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfSU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERTVF9PVVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERTVF9PVkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBMSUdIVEVOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBNVUxUSVBMWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgT1ZFUkxBWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgU0NSRUVOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNSQ19BVE9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfSU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNSQ19PVVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNSQ19PVkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBYT1I7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUG9ydGVyRHVmZkNvbG9yRmlsdGVyIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlciB7CkBAIC04MDkwLDYgKzgxNTYsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWdpb24uT3AgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBESUZGRVJFTkNFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBJTlRFUlNFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFJFUExBQ0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFJFVkVSU0VfRElGRkVSRU5DRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgVU5JT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFhPUjsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBSZWdpb25JdGVyYXRvciB7CkBAIC04MTA2LDYgKzgxNzgsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNoYWRlci5UaWxlTW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlIENMQU1QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSBNSVJST1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlIFJFUEVBVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBTdW1QYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0IHsKQEAgLTgzODAsNiArODQ1NSwxNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBCTF9UUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIEJPVFRPTV9UT1A7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBCUl9UTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIExFRlRfUklHSFQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBSSUdIVF9MRUZUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gVExfQlI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBUT1BfQk9UVE9NOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gVFJfQkw7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgSW5zZXREcmF3YWJsZSBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUgaW1wbGVtZW50cyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNhbGxiYWNrIHsKQEAgLTEwODEyLDYgKzEwODk1LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgQUJTVFJBQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgRklMRVNZU1RFTTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZSBSRVNFUlZFRDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBNYWlsVG8gewpAQCAtMTA4NDYsMTEgKzEwOTMyLDI3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIEFVVEhFTlRJQ0FUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIENPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIERJU0NPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBESVNDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIEZBSUxFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBJRExFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIE9CVEFJTklOR19JUEFERFI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgU0NBTk5JTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgU1VTUEVOREVEOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOZXR3b3JrSW5mby5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIENPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgQ09OTkVDVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgRElTQ09OTkVDVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBESVNDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBTVVNQRU5ERUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB7CkBAIC0xMTM2Myw2ICsxMTQ2NSwxNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGVbXSB2YWx1ZXMoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQVNTT0NJQVRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQVNTT0NJQVRJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIENPTVBMRVRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgRElTQ09OTkVDVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBET1JNQU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBGT1VSX1dBWV9IQU5EU0hBS0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEdST1VQX0hBTkRTSEFLRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgSU5BQ1RJVkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIElOVkFMSUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIFNDQU5OSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBVTklOSVRJQUxJWkVEOwogICB9CiAKICAgcHVibGljIGNsYXNzIFdpZmlDb25maWd1cmF0aW9uIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKQEAgLTEzMTg0LDYgKzEzMjk3LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBc3luY1Rhc2suU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQub3MuQXN5bmNUYXNrLlN0YXR1cyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuQXN5bmNUYXNrLlN0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgRklOSVNIRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuQXN5bmNUYXNrLlN0YXR1cyBQRU5ESU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgUlVOTklORzsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBCYWRQYXJjZWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgYW5kcm9pZC51dGlsLkFuZHJvaWRSdW50aW1lRXhjZXB0aW9uIHsKQEAgLTE0MTM5LDIwICsxNDI1NSwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZSB7CiAKLSAgcHVibGljIGNsYXNzIENoZWNrQm94UHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIHsKKyAgICBwdWJsaWMgY2xhc3MgQ2hlY2tCb3hQcmVmZXJlbmNlIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLlR3b1N0YXRlUHJlZmVyZW5jZSB7CiAgICAgY3RvciBwdWJsaWMgQ2hlY2tCb3hQcmVmZXJlbmNlKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOwogICAgIGN0b3IgcHVibGljIENoZWNrQm94UHJlZmVyZW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCk7CiAgICAgY3RvciBwdWJsaWMgQ2hlY2tCb3hQcmVmZXJlbmNlKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKLSAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZSgpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5T2ZmKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFN1bW1hcnlPbigpOwotICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZShib29sZWFuKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZihpbnQpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5T24oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN1bW1hcnlPbihpbnQpOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIERpYWxvZ1ByZWZlcmVuY2UgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSBpbXBsZW1lbnRzIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyIGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VNYW5hZ2VyLk9uQWN0aXZpdHlEZXN0cm95TGlzdGVuZXIgewpAQCAtMTYxNTksNiArMTYyNjUsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLk1pcG1hcENvbnRyb2wgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLk1pcG1hcENvbnRyb2xbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIE1JUE1BUF9GVUxMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLk1pcG1hcENvbnRyb2wgTUlQTUFQX05PTkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCBNSVBNQVBfT05fU1lOQ19UT19URVhUVVJFOwogICB9CiAKICAgcHVibGljIGNsYXNzIEFsbG9jYXRpb25BZGFwdGVyIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbiB7CkBAIC0xNjI1NiwxMSArMTYzNjUsNDUgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbGVtZW50LkRhdGFLaW5kIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCBQSVhFTF9ERVBUSDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCBQSVhFTF9MOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0xBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX1JHQjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCBQSVhFTF9SR0JBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFVTRVI7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVsZW1lbnQuRGF0YVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBCT09MRUFOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIEZMT0FUXzMyOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIEZMT0FUXzY0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIE1BVFJJWF8yWDI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgTUFUUklYXzNYMzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBNQVRSSVhfNFg0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX0FMTE9DQVRJT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfRUxFTUVOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19NRVNIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1BST0dSQU1fRlJBR01FTlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfUFJPR1JBTV9SQVNURVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfUFJPR1JBTV9TVE9SRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1ZFUlRFWDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19TQU1QTEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1NDUklQVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19UWVBFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFNJR05FRF8xNjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBTSUdORURfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzY0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFNJR05FRF84OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzE2OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzMyOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzRfNF80XzQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfNV81XzVfMTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBVTlNJR05FRF81XzZfNTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBVTlNJR05FRF82NDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBVTlNJR05FRF84OwogICB9CiAKICAgcHVibGljIGNsYXNzIEZpZWxkUGFja2VyIHsKQEAgLTE2MzIwLDYgKzE2NDYzLDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWxlQTNELkVudHJ5VHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5GaWxlQTNELkVudHJ5VHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0QuRW50cnlUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0QuRW50cnlUeXBlIE1FU0g7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0QuRW50cnlUeXBlIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVBM0QuSW5kZXhFbnRyeSB7CkBAIC0xNjM2NCw2ICsxNjUwOSwxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZvbnQuU3R5bGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRm9udC5TdHlsZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRm9udC5TdHlsZSBCT0xEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIEJPTERfSVRBTElDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIElUQUxJQzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRm9udC5TdHlsZSBOT1JNQUw7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgSW50MiB7CkBAIC0xNjUwNyw2ICsxNjY1NiwxMiBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1lc2guUHJpbWl0aXZlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guUHJpbWl0aXZlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgTElORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgTElORV9TVFJJUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgUE9JTlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guUHJpbWl0aXZlIFRSSUFOR0xFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBUUklBTkdMRV9GQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guUHJpbWl0aXZlIFRSSUFOR0xFX1NUUklQOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIgewpAQCAtMTY1NDMsNiArMTY2OTgsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW0uVGV4dHVyZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbS5UZXh0dXJlVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0uVGV4dHVyZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbS5UZXh0dXJlVHlwZSBURVhUVVJFXzJEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIFRFWFRVUkVfQ1VCRTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtRnJhZ21lbnQgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtIHsKQEAgLTE2NTY4LDExICsxNjcyNSwxOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgREVDQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlIE1PRFVMQVRFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZSBSRVBMQUNFOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgTFVNSU5BTkNFX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0IFJHQjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBSR0JBOwogICB9CiAKICAgcHVibGljIGNsYXNzIFByb2dyYW1SYXN0ZXIgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5CYXNlT2JqIHsKQEAgLTE2NTkxLDYgKzE2NzU1LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9ncmFtUmFzdGVyLkN1bGxNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGUgQkFDSzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSBGUk9OVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSBOT05FOwogICB9CiAKICAgcHVibGljIGNsYXNzIFByb2dyYW1TdG9yZSBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LkJhc2VPYmogewpAQCAtMTY2MDMsMTEgKzE2NzcwLDI4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuY1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIERTVF9BTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBPTkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBPTkVfTUlOVVNfU1JDX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORV9NSU5VU19TUkNfQ09MT1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgU1JDX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIFNSQ19DT0xPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBaRVJPOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIERTVF9DT0xPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBPTkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgT05FX01JTlVTX0RTVF9BTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBPTkVfTUlOVVNfRFNUX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgU1JDX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIFNSQ19BTFBIQV9TQVRVUkFURTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBaRVJPOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9ncmFtU3RvcmUuQnVpbGRlciB7CkBAIC0xNjYyMyw2ICsxNjgwNywxMyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBBTFdBWVM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgRVFVQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgR1JFQVRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBHUkVBVEVSX09SX0VRVUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIExFU1M7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgTEVTU19PUl9FUVVBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBOT1RfRVFVQUw7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVZlcnRleCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0gewpAQCAtMTY2OTgsNiArMTY4ODksOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlbmRlclNjcmlwdC5Qcmlvcml0eSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHlbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0LlByaW9yaXR5IExPVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0LlByaW9yaXR5IE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVuZGVyU2NyaXB0LlJTRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgamF2YS5sYW5nLlJ1bm5hYmxlIHsKQEAgLTE2NzYwLDYgKzE2OTUzLDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2FtcGxlci5WYWx1ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIENMQU1QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZSBMSU5FQVJfTUlQX0xJTkVBUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZSBMSU5FQVJfTUlQX05FQVJFU1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgTkVBUkVTVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZSBXUkFQOwogICB9CiAKICAgcHVibGljIGNsYXNzIFNjcmlwdCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LkJhc2VPYmogewpAQCAtMTY4MzksNiArMTcwMzgsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUeXBlLkN1YmVtYXBGYWNlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgTkVHQVRJVkVfWDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBORUdBVElWRV9ZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIE5FR0FUSVZFX1o7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgUE9TSVRWRV9YOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUVkVfWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBQT1NJVFZFX1o7CiAgIH0KIAogfQpAQCAtMTcyODcsNiArMTc0OTIsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFNtc01lc3NhZ2UuU3VibWl0UGR1IHsKQEAgLTE3NDU4LDYgKzE3NjY4LDExIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBjbGFzcyBTbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3NbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBDTEFTU18xOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBVTktOT1dOOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBkZXByZWNhdGVkIGNsYXNzIFNtc01lc3NhZ2UuU3VibWl0UGR1IHsKQEAgLTE4MjkyLDYgKzE4NTA3LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMYXlvdXQuQWxpZ25tZW50IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgQUxJR05fQ0VOVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudCBBTElHTl9OT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50IEFMSUdOX09QUE9TSVRFOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYXlvdXQuRGlyZWN0aW9ucyB7CkBAIC0xODU0OSw2ICsxODc2NywxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRVdGlscy5UcnVuY2F0ZUF0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgTUFSUVVFRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0IE1JRERMRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0IFNUQVJUOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBUZXh0V2F0Y2hlciBpbXBsZW1lbnRzIGFuZHJvaWQudGV4dC5Ob0NvcHlTcGFuIHsKQEAgLTE4OTM0LDYgKzE5MTU2LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBDSEFSQUNURVJTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIE5PTkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgU0VOVEVOQ0VTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIFdPUkRTOwogICB9CiAKICAgcHVibGljIGNsYXNzIFRpbWVLZXlMaXN0ZW5lciBleHRlbmRzIGFuZHJvaWQudGV4dC5tZXRob2QuTnVtYmVyS2V5TGlzdGVuZXIgewpAQCAtMTk0ODMsNiArMTk3MDksMTYgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIEpzb25Ub2tlbiBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnV0aWwuSnNvblRva2VuIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEJFR0lOX0FSUkFZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEJFR0lOX09CSkVDVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBCT09MRUFOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEVORF9BUlJBWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBFTkRfRE9DVU1FTlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gRU5EX09CSkVDVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBOQU1FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIE5VTEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gTlVNQkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIFNUUklORzsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBKc29uV3JpdGVyIGltcGxlbWVudHMgamF2YS5pby5DbG9zZWFibGUgewpAQCAtMTk3NzIsNiArMjAwMDgsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBYbWwuRW5jb2RpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmdbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyBJU09fODg1OV8xOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIFVTX0FTQ0lJOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIFVURl8xNjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyBVVEZfODsKICAgfQogCiB9CkBAIC0yMTQyNCw2ICsyMTY2NCwxNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBCVUlMRF9DQUNIRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgRFJBVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgSU5WQUxJREFURTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgSU5WQUxJREFURV9DSElMRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgSU5WQUxJREFURV9DSElMRF9JTl9QQVJFTlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIE9OX0xBWU9VVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgT05fTUVBU1VSRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgUkVRVUVTVF9MQVlPVVQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyBpbXBsZW1lbnRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24gewpAQCAtMjE0MzIsNiArMjE2ODAsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBWaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBCSU5EX1ZJRVc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgTU9WRV9GUk9NX0FDVElWRV9UT19TQ1JBUF9IRUFQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIE1PVkVfVE9fU0NSQVBfSEVBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBORVdfVklFVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBSRUNZQ0xFX0ZST01fQUNUSVZFX0hFQVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgUkVDWUNMRV9GUk9NX1NDUkFQX0hFQVA7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwIGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXcgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld01hbmFnZXIgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQgewpAQCAtMjE5ODUsMTEgKzIyMjM5LDggQEAKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5UmVjb3JkIHsKLSAgICBjdG9yIHByb3RlY3RlZCBBY2Nlc3NpYmlsaXR5UmVjb3JkKCk7Ci0gICAgbWV0aG9kIHByb3RlY3RlZCB2b2lkIGNsZWFyKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0QWRkZWRDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRCZWZvcmVUZXh0KCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDbGFzc05hbWUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEl0ZW1JbmRleCgpOwpAQCAtMjIwMTcsMTcgKzIyMjY4LDYgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UGFyY2VsYWJsZURhdGEoYW5kcm9pZC5vcy5QYXJjZWxhYmxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJlbW92ZWRDb3VudChpbnQpOwotICAgIGZpZWxkIHByb3RlY3RlZCBpbnQgbUFkZGVkQ291bnQ7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbUJlZm9yZVRleHQ7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGludCBtQm9vbGVhblByb3BlcnRpZXM7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgbUNsYXNzTmFtZTsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtQ29udGVudERlc2NyaXB0aW9uOwotICAgIGZpZWxkIHByb3RlY3RlZCBpbnQgbUN1cnJlbnRJdGVtSW5kZXg7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGludCBtRnJvbUluZGV4OwotICAgIGZpZWxkIHByb3RlY3RlZCBpbnQgbUl0ZW1Db3VudDsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIG1QYXJjZWxhYmxlRGF0YTsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgaW50IG1SZW1vdmVkQ291bnQ7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGZpbmFsIGphdmEudXRpbC5MaXN0IG1UZXh0OwogICB9CiB9CiAKQEAgLTIyNjQwLDYgKzIyODgwLDExIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgREVCVUc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBFUlJPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIExPRzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIFRJUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIFdBUk5JTkc7CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgQ29va2llTWFuYWdlciB7CkBAIC0yMjkyMiwyNiArMjMxNjcsNDMgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGNsYXNzIFdlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0gdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG1bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtIE5BUlJPV19DT0xVTU5TOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0gTk9STUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0gU0lOR0xFX0NPTFVNTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuUGx1Z2luU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUGx1Z2luU3RhdGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSBPRkY7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9OOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSBPTl9ERU1BTkQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFdlYlNldHRpbmdzLlJlbmRlclByaW9yaXR5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlJlbmRlclByaW9yaXR5IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHlbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgSElHSDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgTE9XOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBOT1JNQUw7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFdlYlNldHRpbmdzLlRleHRTaXplIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgTEFSR0VSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBMQVJHRVNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIFNNQUxMRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIFNNQUxMRVNUOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWJTZXR0aW5ncy5ab29tRGVuc2l0eSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5ab29tRGVuc2l0eSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5IENMT1NFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5ab29tRGVuc2l0eSBGQVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlpvb21EZW5zaXR5IE1FRElVTTsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBXZWJTdG9yYWdlIHsKQEAgLTI0MDA4LDYgKzI0MjcwLDE0IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW1hZ2VWaWV3LlNjYWxlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIENFTlRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBDRU5URVJfQ1JPUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBDRU5URVJfSU5TSURFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIEZJVF9DRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgRklUX0VORDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBGSVRfU1RBUlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgRklUX1hZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIE1BVFJJWDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBMaW5lYXJMYXlvdXQgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwIHsKQEAgLTI1MDY0LDYgKzI1MzM0LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0Vmlldy5CdWZmZXJUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGUgRURJVEFCTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3LkJ1ZmZlclR5cGUgTk9STUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlIFNQQU5OQUJMRTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIFRleHRWaWV3Lk9uRWRpdG9yQWN0aW9uTGlzdGVuZXIgewpAQCAtMjgwNTIsNiArMjgzMjUsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUaHJlYWQuU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBCTE9DS0VEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIE5FVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBSVU5OQUJMRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBURVJNSU5BVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIFRJTUVEX1dBSVRJTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgV0FJVElORzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIFRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgewpAQCAtMjgxODUsNiArMjg0NjQsMTQgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIEVsZW1lbnRUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgQU5OT1RBVElPTl9UWVBFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBDT05TVFJVQ1RPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgRklFTEQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIExPQ0FMX1ZBUklBQkxFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBNRVRIT0Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIFBBQ0tBR0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIFBBUkFNRVRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgVFlQRTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBJbmNvbXBsZXRlQW5ub3RhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHsKQEAgLTI4MjAyLDYgKzI4NDg5LDkgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIFJldGVudGlvblBvbGljeSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3lbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5IENMQVNTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kgUlVOVElNRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5IFNPVVJDRTsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYXJnZXQgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIHsKQEAgLTI4NjE1LDYgKzI4OTA1LDE0IEBACiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgdmFsdWVPZihpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBDRUlMSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIERPV047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgRkxPT1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgSEFMRl9ET1dOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIEhBTEZfRVZFTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBIQUxGX1VQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIFVOTkVDRVNTQVJZOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIFVQOwogICB9CiAKIH0KQEAgLTI4NjQxLDYgKzI4OTM5LDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5uZXQuQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LkF1dGhlbnRpY2F0b3IuUmVxdWVzdG9yVHlwZSBQUk9YWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlIFNFUlZFUjsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBCaW5kRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIHsKQEAgLTI5MDU1LDYgKzI5MzU1LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm94eS5UeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubmV0LlByb3h5LlR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eS5UeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5LlR5cGUgRElSRUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eS5UeXBlIEhUVFA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LlByb3h5LlR5cGUgU09DS1M7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJveHlTZWxlY3RvciB7CkBAIC0zMDQ1MSw2ICszMDc1NCw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgS2V5UmVwLlR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5zZWN1cml0eS5LZXlSZXAuVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlSZXAuVHlwZSBQUklWQVRFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlIFBVQkxJQzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlSZXAuVHlwZSBTRUNSRVQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgS2V5U3RvcmUgewpAQCAtMzE4MjQsNiArMzIxMzAsMTAgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIENsaWVudEluZm9TdGF0dXMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyBSRUFTT05fVU5LTk9XTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyBSRUFTT05fVU5LTk9XTl9QUk9QRVJUWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyBSRUFTT05fVkFMVUVfSU5WQUxJRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuQ2xpZW50SW5mb1N0YXR1cyBSRUFTT05fVkFMVUVfVFJVTkNBVEVEOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBDbG9iIHsKQEAgLTMyNTA4LDYgKzMyODE4LDExIEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBSb3dJZExpZmV0aW1lIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgUk9XSURfVU5TVVBQT1JURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgUk9XSURfVkFMSURfRk9SRVZFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9WQUxJRF9PVEhFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9WQUxJRF9TRVNTSU9OOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1ZBTElEX1RSQU5TQUNUSU9OOwogICB9CiAKICAgcHVibGljIGNsYXNzIFNRTENsaWVudEluZm9FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLnNxbC5TUUxFeGNlcHRpb24gewpAQCAtMzMyOTcsNiArMzM2MTIsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOb3JtYWxpemVyLkZvcm0gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm1bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSBORkM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0gTkZEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIE5GS0M7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0gTkZLRDsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdW1iZXJGb3JtYXQgZXh0ZW5kcyBqYXZhLnRleHQuRm9ybWF0IHsKQEAgLTM0MDM4LDYgKzM0MzU3LDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm0gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS51dGlsLkZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm1bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybSBERUNJTUFMX0ZMT0FUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtIFNDSUVOVElGSUM7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgRm9ybWF0dGVyQ2xvc2VkRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKQEAgLTM1NDg0LDYgKzM1ODA1LDEzIEBACiAgICAgbWV0aG9kIHB1YmxpYyBsb25nIHRvU2Vjb25kcyhsb25nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IERBWVM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IEhPVVJTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBNSUNST1NFQ09ORFM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE1JTExJU0VDT05EUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgTUlOVVRFUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgTkFOT1NFQ09ORFM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IFNFQ09ORFM7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgVGltZW91dEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24gewpAQCAtMzgxNDAsMTEgKzM4NDY4LDIwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIEZJTklTSEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgTkVFRF9UQVNLOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgTkVFRF9VTldSQVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBORUVEX1dSQVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBOT1RfSEFORFNIQUtJTkc7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBCVUZGRVJfT1ZFUkZMT1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyBCVUZGRVJfVU5ERVJGTE9XOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgQ0xPU0VEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgT0s7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU1NMRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5pby5JT0V4Y2VwdGlvbiB7CkBAIC00MDY1OCwxMSArNDA5OTUsMTUgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8uTGF5ZXJUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLkxheWVyVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLkxheWVyVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5MYXllclR5cGUgTEFZRVJFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uTGF5ZXJUeXBlIFBMQUlOOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8uVHVubmVsVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5UdW5uZWxUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uVHVubmVsVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5UdW5uZWxUeXBlIFBMQUlOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5UdW5uZWxUeXBlIFRVTk5FTExFRDsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBSb3V0ZVRyYWNrZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvIHsKZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnR4dCBiL2FwaS9jdXJyZW50LnR4dAppbmRleCBhNWYxOTM2Li5kNDkwZTI5IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC50eHQKKysrIGIvYXBpL2N1cnJlbnQudHh0CkBAIC03OCw2ICs3OCw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfSU5QVVRfU1RBVEUgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfSU5QVVRfU1RBVEUiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX0xPR1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfTE9HUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfUEhPTkVfU1RBVEUgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUEhPTkVfU1RBVEUiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRUFEX1BST0ZJTEUgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUFJPRklMRSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfU01TID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1NNUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFQURfU1lOQ19TRVRUSU5HUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9TWU5DX1NFVFRJTkdTIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkVBRF9TWU5DX1NUQVRTID0gImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX1NZTkNfU1RBVFMiOwpAQCAtOTAsNiArOTEsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRU1PVkVfVEFTS1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFTU9WRV9UQVNLUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJFT1JERVJfVEFTS1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFT1JERVJfVEFTS1MiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBqYXZhLmxhbmcuU3RyaW5nIFJFU1RBUlRfUEFDS0FHRVMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFU1RBUlRfUEFDS0FHRVMiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBSRVRSSUVWRV9XSU5ET1dfQ09OVEVOVCA9ICJhbmRyb2lkLnBlcm1pc3Npb24uUkVUUklFVkVfV0lORE9XX0NPTlRFTlQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRU5EX1NNUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VORF9TTVMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfQUNUSVZJVFlfV0FUQ0hFUiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0FDVElWSVRZX1dBVENIRVIiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfQUxBUk0gPSAiY29tLmFuZHJvaWQuYWxhcm0ucGVybWlzc2lvbi5TRVRfQUxBUk0iOwpAQCAtOTcsNiArOTksNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfQU5JTUFUSU9OX1NDQUxFID0gImFuZHJvaWQucGVybWlzc2lvbi5TRVRfQU5JTUFUSU9OX1NDQUxFIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX0RFQlVHX0FQUCA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0RFQlVHX0FQUCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFVF9PUklFTlRBVElPTiA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX09SSUVOVEFUSU9OIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VUX1BPSU5URVJfU1BFRUQgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFVF9QT0lOVEVSX1NQRUVEIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgamF2YS5sYW5nLlN0cmluZyBTRVRfUFJFRkVSUkVEX0FQUExJQ0FUSU9OUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1BSRUZFUlJFRF9BUFBMSUNBVElPTlMiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfUFJPQ0VTU19MSU1JVCA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1BST0NFU1NfTElNSVQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVRfVElNRSA9ICJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX1RJTUUiOwpAQCAtMTE5LDYgKzEyMiw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0VYVEVSTkFMX1NUT1JBR0UgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9HU0VSVklDRVMgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0dTRVJWSUNFUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX0hJU1RPUllfQk9PS01BUktTID0gImNvbS5hbmRyb2lkLmJyb3dzZXIucGVybWlzc2lvbi5XUklURV9ISVNUT1JZX0JPT0tNQVJLUyI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX1BST0ZJTEUgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1BST0ZJTEUiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBXUklURV9TRUNVUkVfU0VUVElOR1MgPSAiYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX1NFVFRJTkdTID0gImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRVRUSU5HUyI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFdSSVRFX1NNUyA9ICJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU01TIjsKQEAgLTE3OSw2ICsxODMsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFIuYXR0ciB7CiAgICAgY3RvciBwdWJsaWMgUi5hdHRyKCk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWJzTGlzdFZpZXdTdHlsZSA9IDE2ODQyODU4OyAvLyAweDEwMTAwNmEKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2Nlc3NpYmlsaXR5RXZlbnRUeXBlcyA9IDE2ODQzNjUwOyAvLyAweDEwMTAzODIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2Nlc3NpYmlsaXR5RmVlZGJhY2tUeXBlID0gMTY4NDM2NTI7IC8vIDB4MTAxMDM4NAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjY2Vzc2liaWxpdHlGbGFncyA9IDE2ODQzNjU0OyAvLyAweDEwMTAzODYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY2NvdW50UHJlZmVyZW5jZXMgPSAxNjg0MzQyMzsgLy8gMHgxMDEwMjlmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWNjb3VudFR5cGUgPSAxNjg0MzQwNzsgLy8gMHgxMDEwMjhmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uID0gMTY4NDI3OTc7IC8vIDB4MTAxMDAyZApAQCAtMTk4LDYgKzIwNSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSA9IDE2ODQzNTM4OyAvLyAweDEwMTAzMTIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhY3Rpb25Nb2RlQ3V0RHJhd2FibGUgPSAxNjg0MzUzNzsgLy8gMHgxMDEwMzExCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uTW9kZVBhc3RlRHJhd2FibGUgPSAxNjg0MzUzOTsgLy8gMHgxMDEwMzEzCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uTW9kZVNlbGVjdEFsbERyYXdhYmxlID0gMTY4NDM2NDg7IC8vIDB4MTAxMDM4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGlvbk92ZXJmbG93QnV0dG9uU3R5bGUgPSAxNjg0MzUxMDsgLy8gMHgxMDEwMmY2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWN0aW9uVmlld0NsYXNzID0gMTY4NDM1MTY7IC8vIDB4MTAxMDJmYwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFjdGl2YXRlZEJhY2tncm91bmRJbmRpY2F0b3IgPSAxNjg0MzUxNzsgLy8gMHgxMDEwMmZkCkBAIC0yMTAsNiArMjE4LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbGVydERpYWxvZ0ljb24gPSAxNjg0MzYwNTsgLy8gMHgxMDEwMzU1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxlcnREaWFsb2dTdHlsZSA9IDE2ODQyODQ1OyAvLyAweDEwMTAwNWQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhbGVydERpYWxvZ1RoZW1lID0gMTY4NDM1Mjk7IC8vIDB4MTAxMDMwOQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsaWdubWVudE1vZGUgPSAxNjg0MzY0MjsgLy8gMHgxMDEwMzdhCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYWxsQ29udGFjdHNOYW1lID0gMTY4NDM0Njg7IC8vIDB4MTAxMDJjYwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsbG93QmFja3VwID0gMTY4NDMzOTI7IC8vIDB4MTAxMDI4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGFsbG93Q2xlYXJVc2VyRGF0YSA9IDE2ODQyNzU3OyAvLyAweDEwMTAwMDUKQEAgLTI1MSw2ICsyNjAsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvcmRlcmxlc3NCdXR0b25TdHlsZSA9IDE2ODQzNTYzOyAvLyAweDEwMTAzMmIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b20gPSAxNjg0MzE4NDsgLy8gMHgxMDEwMWIwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tQnJpZ2h0ID0gMTY4NDI5NTc7IC8vIDB4MTAxMDBjZAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbUNoZXZyb25EcmF3YWJsZSA9IDE2ODQzNjYxOyAvLyAweDEwMTAzOGQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBib3R0b21EYXJrID0gMTY4NDI5NTM7IC8vIDB4MTAxMDBjOQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGJvdHRvbUxlZnRSYWRpdXMgPSAxNjg0MzE3OTsgLy8gMHgxMDEwMWFiCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgYm90dG9tTWVkaXVtID0gMTY4NDI5NTg7IC8vIDB4MTAxMDBjZQpAQCAtMjY5LDYgKzI3OSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FjaGVDb2xvckhpbnQgPSAxNjg0MzAwOTsgLy8gMHgxMDEwMTAxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FsZW5kYXJWaWV3U2hvd24gPSAxNjg0MzU5NjsgLy8gMHgxMDEwMzRjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FsZW5kYXJWaWV3U3R5bGUgPSAxNjg0MzYxMzsgLy8gMHgxMDEwMzVkCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2FuUmV0cmlldmVXaW5kb3dDb250ZW50ID0gMTY4NDM2NTU7IC8vIDB4MTAxMDM4NwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNhbmRpZGF0ZXNUZXh0U3R5bGVTcGFucyA9IDE2ODQzMzEyOyAvLyAweDEwMTAyMzAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgaW50IGNhcGl0YWxpemUgPSAxNjg0MzExMzsgLy8gMHgxMDEwMTY5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY2VudGVyQnJpZ2h0ID0gMTY4NDI5NTY7IC8vIDB4MTAxMDBjYwpAQCAtMzAxLDEwICszMTIsMTEgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb2xvckJhY2tncm91bmRDYWNoZUhpbnQgPSAxNjg0MzQzNTsgLy8gMHgxMDEwMmFiCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sb3JGb3JlZ3JvdW5kID0gMTY4NDI4MDA7IC8vIDB4MTAxMDAzMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbG9yRm9yZWdyb3VuZEludmVyc2UgPSAxNjg0MzI3MDsgLy8gMHgxMDEwMjA2Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uQ291bnQgPSAxNjg0MzYzMzsgLy8gMHgxMDEwMzcxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uQ291bnQgPSAxNjg0MzYzOTsgLy8gMHgxMDEwMzc3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uRGVsYXkgPSAxNjg0MzIxNTsgLy8gMHgxMDEwMWNmCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uT3JkZXJQcmVzZXJ2ZWQgPSAxNjg0MzYzNDsgLy8gMHgxMDEwMzcyCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uT3JkZXJQcmVzZXJ2ZWQgPSAxNjg0MzY0MDsgLy8gMHgxMDEwMzc4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29sdW1uV2lkdGggPSAxNjg0MzAzMTsgLy8gMHgxMDEwMTE3CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGF0aWJsZVdpZHRoTGltaXREcCA9IDE2ODQzNjIxOyAvLyAweDEwMTAzNjUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uSGludCA9IDE2ODQzMTIyOyAvLyAweDEwMTAxNzIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21wbGV0aW9uSGludFZpZXcgPSAxNjg0MzEyMzsgLy8gMHgxMDEwMTczCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY29tcGxldGlvblRocmVzaG9sZCA9IDE2ODQzMTI0OyAvLyAweDEwMTAxNzQKQEAgLTQxNSw2ICs0MjcsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZhc3RTY3JvbGxUZXh0Q29sb3IgPSAxNjg0MzYwOTsgLy8gMHgxMDEwMzU5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFzdFNjcm9sbFRodW1iRHJhd2FibGUgPSAxNjg0MzU3NDsgLy8gMHgxMDEwMzM2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmFzdFNjcm9sbFRyYWNrRHJhd2FibGUgPSAxNjg0MzU3NzsgLy8gMHgxMDEwMzM5CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmVlZGJhY2tDb3VudCA9IDE2ODQzNjY3OyAvLyAweDEwMTAzOTMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaWxsQWZ0ZXIgPSAxNjg0MzE5NzsgLy8gMHgxMDEwMWJkCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZmlsbEJlZm9yZSA9IDE2ODQzMTk2OyAvLyAweDEwMTAxYmMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmaWxsRW5hYmxlZCA9IDE2ODQzMzQzOyAvLyAweDEwMTAyNGYKQEAgLTQ0Nyw3ICs0NjAsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZyb21YU2NhbGUgPSAxNjg0MzIwMjsgLy8gMHgxMDEwMWMyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnJvbVlEZWx0YSA9IDE2ODQzMjA4OyAvLyAweDEwMTAxYzgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmcm9tWVNjYWxlID0gMTY4NDMyMDQ7IC8vIDB4MTAxMDFjNAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZ1bGxCYWNrdXBBZ2VudCA9IDE2ODQzNjI5OyAvLyAweDEwMTAzNmQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdWxsQmFja3VwQWdlbnQgPSAxNjg0MzYzNTsgLy8gMHgxMDEwMzczCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZnVsbEJyaWdodCA9IDE2ODQyOTU0OyAvLyAweDEwMTAwY2EKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdWxsRGFyayA9IDE2ODQyOTUwOyAvLyAweDEwMTAwYzYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBmdW5jdGlvbmFsVGVzdCA9IDE2ODQyNzg3OyAvLyAweDEwMTAwMjMKQEAgLTQ2OCw2ICs0ODEsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhbmRfaG91ciA9IDE2ODQzMDExOyAvLyAweDEwMTAxMDMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYW5kX21pbnV0ZSA9IDE2ODQzMDEyOyAvLyAweDEwMTAxMDQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYW5kbGUgPSAxNjg0MzM1NDsgLy8gMHgxMDEwMjVhCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFuZGxlRHJhd2FibGUgPSAxNjg0MzY1NzsgLy8gMHgxMDEwMzg5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGFuZGxlUHJvZmlsaW5nID0gMTY4NDI3ODY7IC8vIDB4MTAxMDAyMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhhcHRpY0ZlZWRiYWNrRW5hYmxlZCA9IDE2ODQzMzU4OyAvLyAweDEwMTAyNWUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoYXJkd2FyZUFjY2VsZXJhdGVkID0gMTY4NDM0NzU7IC8vIDB4MTAxMDJkMwpAQCAtNDc2LDExICs0OTAsMTIgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBoZWFkZXJEaXZpZGVyc0VuYWJsZWQgPSAxNjg0MzMxMDsgLy8gMHgxMDEwMjJlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGVpZ2h0ID0gMTY4NDMwOTM7IC8vIDB4MTAxMDE1NQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhpbnQgPSAxNjg0MzA4ODsgLy8gMHgxMDEwMTUwCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaGl0UmFkaXVzID0gMTY4NDM2NjQ7IC8vIDB4MTAxMDM5MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvbWVBc1VwSW5kaWNhdG9yID0gMTY4NDM1MzE7IC8vIDB4MTAxMDMwYgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvbWVMYXlvdXQgPSAxNjg0MzU0OTsgLy8gMHgxMDEwMzFkCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbERpcmVjdGlvbiA9IDE2ODQzNjI4OyAvLyAweDEwMTAzNmMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3Jpem9udGFsRGl2aWRlciA9IDE2ODQzMDUzOyAvLyAweDEwMTAxMmQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3Jpem9udGFsR2FwID0gMTY4NDMzMjc7IC8vIDB4MTAxMDIzZgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGhvcml6b250YWxPZmZzZXQgPSAxNjg0MzY2OTsgLy8gMHgxMDEwMzk1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaG9yaXpvbnRhbFNjcm9sbFZpZXdTdHlsZSA9IDE2ODQzNjAzOyAvLyAweDEwMTAzNTMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3Jpem9udGFsU3BhY2luZyA9IDE2ODQzMDI4OyAvLyAweDEwMTAxMTQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBob3N0ID0gMTY4NDI3OTI7IC8vIDB4MTAxMDAyOApAQCAtNTI2LDcgKzU0MSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgaW5zdGFsbExvY2F0aW9uID0gMTY4NDM0NDc7IC8vIDB4MTAxMDJiNwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGludGVycG9sYXRvciA9IDE2ODQzMDczOyAvLyAweDEwMTAxNDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpc0Fsd2F5c1N5bmNhYmxlID0gMTY4NDM1NzE7IC8vIDB4MTAxMDMzMwotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzQXV4aWxpYXJ5ID0gMTY4NDM2NDE7IC8vIDB4MTAxMDM3OQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzQXV4aWxpYXJ5ID0gMTY4NDM2NDk7IC8vIDB4MTAxMDM4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGlzRGVmYXVsdCA9IDE2ODQzMjk3OyAvLyAweDEwMTAyMjEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpc0luZGljYXRvciA9IDE2ODQzMDc5OyAvLyAweDEwMTAxNDcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBpc01vZGlmaWVyID0gMTY4NDMzMzQ7IC8vIDB4MTAxMDI0NgpAQCAtNTU4LDEwICs1NzMsMTIgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYWJlbFRleHRTaXplID0gMTY4NDMzMTc7IC8vIDB4MTAxMDIzNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxhcmdlSGVhcCA9IDE2ODQzNjEwOyAvLyAweDEwMTAzNWEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXJnZVNjcmVlbnMgPSAxNjg0MzM5ODsgLy8gMHgxMDEwMjg2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGFyZ2VzdFdpZHRoTGltaXREcCA9IDE2ODQzNjIyOyAvLyAweDEwMTAzNjYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXVuY2hNb2RlID0gMTY4NDI3ODE7IC8vIDB4MTAxMDAxZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheWVyVHlwZSA9IDE2ODQzNjA0OyAvLyAweDEwMTAzNTQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXQgPSAxNjg0Mjk5NDsgLy8gMHgxMDEwMGYyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0QW5pbWF0aW9uID0gMTY4NDI5ODg7IC8vIDB4MTAxMDBlYworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IDE2ODQzNjM0OyAvLyAweDEwMTAzNzIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfYWJvdmUgPSAxNjg0MzE0MDsgLy8gMHgxMDEwMTg0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduQmFzZWxpbmUgPSAxNjg0MzE0MjsgLy8gMHgxMDEwMTg2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2FsaWduQm90dG9tID0gMTY4NDMxNDY7IC8vIDB4MTAxMDE4YQpAQCAtNTc4LDggKzU5NSw4IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NlbnRlckluUGFyZW50ID0gMTY4NDMxNTE7IC8vIDB4MTAxMDE4ZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9jZW50ZXJWZXJ0aWNhbCA9IDE2ODQzMTUzOyAvLyAweDEwMTAxOTEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfY29sdW1uID0gMTY4NDMwODQ7IC8vIDB4MTAxMDE0YwotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9jb2x1bW5TcGFuID0gMTY4NDM2Mzk7IC8vIDB4MTAxMDM3NwotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9jb2x1bW5XZWlnaHQgPSAxNjg0MzY0MDsgLy8gMHgxMDEwMzc4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NvbHVtblNwYW4gPSAxNjg0MzY0NjsgLy8gMHgxMDEwMzdlCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X2NvbHVtbldlaWdodCA9IDE2ODQzNjQ3OyAvLyAweDEwMTAzN2YKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfZ3Jhdml0eSA9IDE2ODQyOTMxOyAvLyAweDEwMTAwYjMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfaGVpZ2h0ID0gMTY4NDI5OTc7IC8vIDB4MTAxMDBmNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9tYXJnaW4gPSAxNjg0Mjk5ODsgLy8gMHgxMDEwMGY2CkBAIC01ODcsOSArNjA0LDkgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfbWFyZ2luTGVmdCA9IDE2ODQyOTk5OyAvLyAweDEwMTAwZjcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfbWFyZ2luUmlnaHQgPSAxNjg0MzAwMTsgLy8gMHgxMDEwMGY5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X21hcmdpblRvcCA9IDE2ODQzMDAwOyAvLyAweDEwMTAwZjgKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfcm93ID0gMTY4NDM2MzY7IC8vIDB4MTAxMDM3NAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9yb3dTcGFuID0gMTY4NDM2Mzc7IC8vIDB4MTAxMDM3NQotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9yb3dXZWlnaHQgPSAxNjg0MzYzODsgLy8gMHgxMDEwMzc2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGF5b3V0X3JvdyA9IDE2ODQzNjQzOyAvLyAweDEwMTAzN2IKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfcm93U3BhbiA9IDE2ODQzNjQ0OyAvLyAweDEwMTAzN2MKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfcm93V2VpZ2h0ID0gMTY4NDM2NDU7IC8vIDB4MTAxMDM3ZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxheW91dF9zY2FsZSA9IDE2ODQzMTU1OyAvLyAweDEwMTAxOTMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfc3BhbiA9IDE2ODQzMDg1OyAvLyAweDEwMTAxNGQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfdG9MZWZ0T2YgPSAxNjg0MzEzODsgLy8gMHgxMDEwMTgyCkBAIC01OTksNiArNjE2LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfeCA9IDE2ODQzMTM1OyAvLyAweDEwMTAxN2YKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsYXlvdXRfeSA9IDE2ODQzMTM2OyAvLyAweDEwMTAxODAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsZWZ0ID0gMTY4NDMxODE7IC8vIDB4MTAxMDFhZAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxlZnRDaGV2cm9uRHJhd2FibGUgPSAxNjg0MzY1ODsgLy8gMHgxMDEwMzhhCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZVNwYWNpbmdFeHRyYSA9IDE2ODQzMjg3OyAvLyAweDEwMTAyMTcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaW5lU3BhY2luZ011bHRpcGxpZXIgPSAxNjg0MzI4ODsgLy8gMHgxMDEwMjE4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGluZXMgPSAxNjg0MzA5MjsgLy8gMHgxMDEwMTU0CkBAIC02MTAsNiArNjI4LDggQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0RGl2aWRlckFsZXJ0RGlhbG9nID0gMTY4NDM1MjU7IC8vIDB4MTAxMDMwNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RQb3B1cFdpbmRvd1N0eWxlID0gMTY4NDM1MTk7IC8vIDB4MTAxMDJmZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0ID0gMTY4NDI4Mjk7IC8vIDB4MTAxMDA0ZAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0TGFyZ2UgPSAxNjg0MzY3MDsgLy8gMHgxMDEwMzk2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHRTbWFsbCA9IDE2ODQzNjcxOyAvLyAweDEwMTAzOTcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBsaXN0U2VsZWN0b3IgPSAxNjg0MzAwMzsgLy8gMHgxMDEwMGZiCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFNlcGFyYXRvclRleHRWaWV3U3R5bGUgPSAxNjg0MzI3MjsgLy8gMHgxMDEwMjA4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbGlzdFZpZXdTdHlsZSA9IDE2ODQyODY4OyAvLyAweDEwMTAwNzQKQEAgLTY1NSw2ICs2NzUsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRGb2N1c1VwID0gMTY4NDI5Nzk7IC8vIDB4MTAxMDBlMwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vSGlzdG9yeSA9IDE2ODQzMzA5OyAvLyAweDEwMTAyMmQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBub3JtYWxTY3JlZW5zID0gMTY4NDMzOTc7IC8vIDB4MTAxMDI4NQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5vdGlmaWNhdGlvblRpbWVvdXQgPSAxNjg0MzY1MzsgLy8gMHgxMDEwMzg1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtQ29sdW1ucyA9IDE2ODQzMDMyOyAvLyAweDEwMTAxMTgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1TdGFycyA9IDE2ODQzMDc2OyAvLyAweDEwMTAxNDQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgaW50IG51bWVyaWMgPSAxNjg0MzEwOTsgLy8gMHgxMDEwMTY1CkBAIC02NjgsMTMgKzY4OSwxNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG9yZGVyaW5nRnJvbVhtbCA9IDE2ODQzMjM5OyAvLyAweDEwMTAxZTcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvcmllbnRhdGlvbiA9IDE2ODQyOTQ4OyAvLyAweDEwMTAwYzQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvdXRBbmltYXRpb24gPSAxNjg0MzEyODsgLy8gMHgxMDEwMTc4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3V0ZXJSYWRpdXMgPSAxNjg0MzY2MzsgLy8gMHgxMDEwMzhmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgb3ZlclNjcm9sbEZvb3RlciA9IDE2ODQzNDU5OyAvLyAweDEwMTAyYzMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBvdmVyU2Nyb2xsSGVhZGVyID0gMTY4NDM0NTg7IC8vIDB4MTAxMDJjMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG92ZXJTY3JvbGxNb2RlID0gMTY4NDM0NTc7IC8vIDB4MTAxMDJjMQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhY2thZ2VOYW1lcyA9IDE2ODQzNjUxOyAvLyAweDEwMTAzODMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nID0gMTY4NDI5NjU7IC8vIDB4MTAxMDBkNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdCb3R0b20gPSAxNjg0Mjk2OTsgLy8gMHgxMDEwMGQ5CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ0VuZCA9IDE2ODQzNjczOyAvLyAweDEwMTAzOTkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nTGVmdCA9IDE2ODQyOTY2OyAvLyAweDEwMTAwZDYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYWRkaW5nUmlnaHQgPSAxNjg0Mjk2ODsgLy8gMHgxMDEwMGQ4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFkZGluZ1N0YXJ0ID0gMTY4NDM2NzI7IC8vIDB4MTAxMDM5OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhZGRpbmdUb3AgPSAxNjg0Mjk2NzsgLy8gMHgxMDEwMGQ3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFuZWxCYWNrZ3JvdW5kID0gMTY4NDI4NDY7IC8vIDB4MTAxMDA1ZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhbmVsQ29sb3JCYWNrZ3JvdW5kID0gMTY4NDI4NDk7IC8vIDB4MTAxMDA2MQpAQCAtNzQ4LDIyICs3NzMsMjQgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXFOYXZpZ2F0aW9uID0gMTY4NDMzMDY7IC8vIDB4MTAxMDIyYQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcVRvdWNoU2NyZWVuID0gMTY4NDMzMDM7IC8vIDB4MTAxMDIyNwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcXVpcmVkID0gMTY4NDM0MDY7IC8vIDB4MTAxMDI4ZQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlcXVpcmVzU21hbGxlc3RXaWR0aERwID0gMTY4NDM2MjA7IC8vIDB4MTAxMDM2NAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJlc2l6ZU1vZGUgPSAxNjg0MzYxOTsgLy8gMHgxMDEwMzYzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcmVzaXplYWJsZSA9IDE2ODQzNDA1OyAvLyAweDEwMTAyOGQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXNvdXJjZSA9IDE2ODQyNzg5OyAvLyAweDEwMTAwMjUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByZXN0b3JlQW55VmVyc2lvbiA9IDE2ODQzNDUwOyAvLyAweDEwMTAyYmEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgaW50IHJlc3RvcmVOZWVkc0FwcGxpY2F0aW9uID0gMTY4NDM0MjE7IC8vIDB4MTAxMDI5ZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpZ2h0ID0gMTY4NDMxODM7IC8vIDB4MTAxMDFhZgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpZ2h0Q2hldnJvbkRyYXdhYmxlID0gMTY4NDM2NTk7IC8vIDB4MTAxMDM4YgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpbmd0b25lUHJlZmVyZW5jZVN0eWxlID0gMTY4NDI4OTk7IC8vIDB4MTAxMDA5MwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJpbmd0b25lVHlwZSA9IDE2ODQzMjU3OyAvLyAweDEwMTAxZjkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3RhdGlvbiA9IDE2ODQzNTU4OyAvLyAweDEwMTAzMjYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3RhdGlvblggPSAxNjg0MzU1OTsgLy8gMHgxMDEwMzI3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm90YXRpb25ZID0gMTY4NDM1NjA7IC8vIDB4MTAxMDMyOAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0NvdW50ID0gMTY4NDM2MzE7IC8vIDB4MTAxMDM2ZgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0NvdW50ID0gMTY4NDM2Mzc7IC8vIDB4MTAxMDM3NQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0RlbGF5ID0gMTY4NDMyMTY7IC8vIDB4MTAxMDFkMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHJvd0VkZ2VGbGFncyA9IDE2ODQzMzI5OyAvLyAweDEwMTAyNDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCByb3dIZWlnaHQgPSAxNjg0MzA1ODsgLy8gMHgxMDEwMTMyCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm93T3JkZXJQcmVzZXJ2ZWQgPSAxNjg0MzYzMjsgLy8gMHgxMDEwMzcwCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcm93T3JkZXJQcmVzZXJ2ZWQgPSAxNjg0MzYzODsgLy8gMHgxMDEwMzc2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2F2ZUVuYWJsZWQgPSAxNjg0Mjk4MzsgLy8gMHgxMDEwMGU3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2NhbGVHcmF2aXR5ID0gMTY4NDMyNjI7IC8vIDB4MTAxMDFmZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNjYWxlSGVpZ2h0ID0gMTY4NDMyNjE7IC8vIDB4MTAxMDFmZApAQCAtODI5LDYgKzg1Niw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc21hbGxJY29uID0gMTY4NDM0MjI7IC8vIDB4MTAxMDI5ZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNtYWxsU2NyZWVucyA9IDE2ODQzMzk2OyAvLyAweDEwMTAyODQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzbW9vdGhTY3JvbGxiYXIgPSAxNjg0MzMxMzsgLy8gMHgxMDEwMjMxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc25hcE1hcmdpbiA9IDE2ODQzNjY2OyAvLyAweDEwMTAzOTIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzb3VuZEVmZmVjdHNFbmFibGVkID0gMTY4NDMyODU7IC8vIDB4MTAxMDIxNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNwYWNpbmcgPSAxNjg0MzAyNzsgLy8gMHgxMDEwMTEzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3Bpbm5lckRyb3BEb3duSXRlbVN0eWxlID0gMTY4NDI4ODc7IC8vIDB4MTAxMDA4NwpAQCAtODUwLDE0ICs4NzgsMTQgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9hY3RpdmUgPSAxNjg0MjkxNDsgLy8gMHgxMDEwMGEyCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfY2hlY2thYmxlID0gMTY4NDI5MTE7IC8vIDB4MTAxMDA5ZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2NoZWNrZWQgPSAxNjg0MjkxMjsgLy8gMHgxMDEwMGEwCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZHJhZ19jYW5fYWNjZXB0ID0gMTY4NDM2MjE7IC8vIDB4MTAxMDM2NQotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2RyYWdfaG92ZXJlZCA9IDE2ODQzNjIyOyAvLyAweDEwMTAzNjYKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9kcmFnX2Nhbl9hY2NlcHQgPSAxNjg0MzYyNDsgLy8gMHgxMDEwMzY4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZHJhZ19ob3ZlcmVkID0gMTY4NDM2MjU7IC8vIDB4MTAxMDM2OQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2VtcHR5ID0gMTY4NDI5MjE7IC8vIDB4MTAxMDBhOQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2VuYWJsZWQgPSAxNjg0MjkxMDsgLy8gMHgxMDEwMDllCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZXhwYW5kZWQgPSAxNjg0MjkyMDsgLy8gMHgxMDEwMGE4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZmlyc3QgPSAxNjg0MjkxNjsgLy8gMHgxMDEwMGE0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfZm9jdXNlZCA9IDE2ODQyOTA4OyAvLyAweDEwMTAwOWMKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9ob3ZlcmVkID0gMTY4NDM2MjA7IC8vIDB4MTAxMDM2NAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXRlX2hvdmVyZWQgPSAxNjg0MzYyMzsgLy8gMHgxMDEwMzY3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RhdGVfbGFzdCA9IDE2ODQyOTE4OyAvLyAweDEwMTAwYTYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9sb25nX3ByZXNzYWJsZSA9IDE2ODQzMzI0OyAvLyAweDEwMTAyM2MKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV9taWRkbGUgPSAxNjg0MjkxNzsgLy8gMHgxMDEwMGE1CkBAIC04NjgsNyArODk2LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0ZV93aW5kb3dfZm9jdXNlZCA9IDE2ODQyOTA5OyAvLyAweDEwMTAwOWQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0aWNXYWxscGFwZXJQcmV2aWV3ID0gMTY4NDM1Njk7IC8vIDB4MTAxMDMzMQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0ZXBTaXplID0gMTY4NDMwNzg7IC8vIDB4MTAxMDE0NgotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0b3BXaXRoVGFzayA9IDE2ODQzNjIzOyAvLyAweDEwMTAzNjcKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdG9wV2l0aFRhc2sgPSAxNjg0MzYyNjsgLy8gMHgxMDEwMzZhCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3RyZWFtVHlwZSA9IDE2ODQzMjczOyAvLyAweDEwMTAyMDkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdHJldGNoQ29sdW1ucyA9IDE2ODQzMDgxOyAvLyAweDEwMTAxNDkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdHJldGNoTW9kZSA9IDE2ODQzMDMwOyAvLyAweDEwMTAxMTYKQEAgLTg3NiwxMiArOTA0LDE1IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VidGl0bGVUZXh0U3R5bGUgPSAxNjg0MzUxMzsgLy8gMHgxMDEwMmY5CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VnZ2VzdEFjdGlvbk1zZyA9IDE2ODQzMjI4OyAvLyAweDEwMTAxZGMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWdnZXN0QWN0aW9uTXNnQ29sdW1uID0gMTY4NDMyMjk7IC8vIDB4MTAxMDFkZAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1Z2dlc3Rpb25zRW5hYmxlZCA9IDE2ODQzNjMwOyAvLyAweDEwMTAzNmUKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdWdnZXN0aW9uc0VuYWJsZWQgPSAxNjg0MzYzNjsgLy8gMHgxMDEwMzc0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VtbWFyeSA9IDE2ODQzMjQxOyAvLyAweDEwMTAxZTkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdW1tYXJ5Q29sdW1uID0gMTY4NDM0MjY7IC8vIDB4MTAxMDJhMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1bW1hcnlPZmYgPSAxNjg0MzI0ODsgLy8gMHgxMDEwMWYwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc3VtbWFyeU9uID0gMTY4NDMyNDc7IC8vIDB4MTAxMDFlZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN1cHBvcnRzVXBsb2FkaW5nID0gMTY4NDM0MTk7IC8vIDB4MTAxMDI5YgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN3aXRjaFByZWZlcmVuY2VTdHlsZSA9IDE2ODQzNjI5OyAvLyAweDEwMTAzNmQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzd2l0Y2hUZXh0T2ZmID0gMTY4NDM2Mjg7IC8vIDB4MTAxMDM2YworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN3aXRjaFRleHRPbiA9IDE2ODQzNjI3OyAvLyAweDEwMTAzNmIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzeW5jYWJsZSA9IDE2ODQyNzc3OyAvLyAweDEwMTAwMTkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWJTdHJpcEVuYWJsZWQgPSAxNjg0MzQ1MzsgLy8gMHgxMDEwMmJkCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFiU3RyaXBMZWZ0ID0gMTY4NDM0NTE7IC8vIDB4MTAxMDJiYgpAQCAtODkwLDYgKzkyMSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnID0gMTY4NDI5NjE7IC8vIDB4MTAxMDBkMQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhcmdldEFjdGl2aXR5ID0gMTY4NDMyNjY7IC8vIDB4MTAxMDIwMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhcmdldENsYXNzID0gMTY4NDI3OTk7IC8vIDB4MTAxMDAyZgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhcmdldERyYXdhYmxlcyA9IDE2ODQzNjU2OyAvLyAweDEwMTAzODgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YXJnZXRQYWNrYWdlID0gMTY4NDI3ODU7IC8vIDB4MTAxMDAyMQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhcmdldFNka1ZlcnNpb24gPSAxNjg0MzM3NjsgLy8gMHgxMDEwMjcwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFza0FmZmluaXR5ID0gMTY4NDI3NzA7IC8vIDB4MTAxMDAxMgpAQCAtOTQ0LDkgKzk3Niw5IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEVkaXRQYXN0ZVdpbmRvd0xheW91dCA9IDE2ODQzNTQwOyAvLyAweDEwMTAzMTQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RWRpdFNpZGVOb1Bhc3RlV2luZG93TGF5b3V0ID0gMTY4NDM2MTU7IC8vIDB4MTAxMDM1ZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRFZGl0U2lkZVBhc3RlV2luZG93TGF5b3V0ID0gMTY4NDM2MTQ7IC8vIDB4MTAxMDM1ZQotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRFZGl0U3VnZ2VzdGlvbkl0ZW1MYXlvdXQgPSAxNjg0MzYyNzsgLy8gMHgxMDEwMzZiCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEVkaXRTdWdnZXN0aW9uc0JvdHRvbVdpbmRvd0xheW91dCA9IDE2ODQzNjI1OyAvLyAweDEwMTAzNjkKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RWRpdFN1Z2dlc3Rpb25zVG9wV2luZG93TGF5b3V0ID0gMTY4NDM2MjY7IC8vIDB4MTAxMDM2YQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRFZGl0U3VnZ2VzdGlvbkl0ZW1MYXlvdXQgPSAxNjg0MzYzMzsgLy8gMHgxMDEwMzcxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dEVkaXRTdWdnZXN0aW9uc0JvdHRvbVdpbmRvd0xheW91dCA9IDE2ODQzNjMxOyAvLyAweDEwMTAzNmYKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0RWRpdFN1Z2dlc3Rpb25zVG9wV2luZG93TGF5b3V0ID0gMTY4NDM2MzI7IC8vIDB4MTAxMDM3MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRGaWx0ZXJFbmFibGVkID0gMTY4NDMwMDc7IC8vIDB4MTAxMDBmZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRJc1NlbGVjdGFibGUgPSAxNjg0MzU0MjsgLy8gMHgxMDEwMzE2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dE9mZiA9IDE2ODQzMDQ1OyAvLyAweDEwMTAxMjUKQEAgLTk1OCw3ICs5OTAsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRleHRTZWxlY3RIYW5kbGVXaW5kb3dTdHlsZSA9IDE2ODQzNDY0OyAvLyAweDEwMTAyYzgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U2l6ZSA9IDE2ODQyOTAxOyAvLyAweDEwMTAwOTUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0ZXh0U3R5bGUgPSAxNjg0MjkwMzsgLy8gMHgxMDEwMDk3Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFN1Z2dlc3Rpb25zV2luZG93U3R5bGUgPSAxNjg0MzYyNDsgLy8gMHgxMDEwMzY4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFN1Z2dlc3Rpb25zV2luZG93U3R5bGUgPSAxNjg0MzYzMDsgLy8gMHgxMDEwMzZlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGV4dFZpZXdTdHlsZSA9IDE2ODQyODg0OyAvLyAweDEwMTAwODQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGVtZSA9IDE2ODQyNzUyOyAvLyAweDEwMTAwMDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0aGlja25lc3MgPSAxNjg0MzM2MDsgLy8gMHgxMDEwMjYwCkBAIC05NzksNiArMTAxMSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9ZU2NhbGUgPSAxNjg0MzIwNTsgLy8gMHgxMDEwMWM1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9wID0gMTY4NDMxODI7IC8vIDB4MTAxMDFhZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcEJyaWdodCA9IDE2ODQyOTU1OyAvLyAweDEwMTAwY2IKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BDaGV2cm9uRHJhd2FibGUgPSAxNjg0MzY2MDsgLy8gMHgxMDEwMzhjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdG9wRGFyayA9IDE2ODQyOTUxOyAvLyAweDEwMTAwYzcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0b3BMZWZ0UmFkaXVzID0gMTY4NDMxNzc7IC8vIDB4MTAxMDFhOQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRvcE9mZnNldCA9IDE2ODQzMzUyOyAvLyAweDEwMTAyNTgKQEAgLTk5NCw3ICsxMDI3LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB1bmZvY3VzZWRNb250aERhdGVDb2xvciA9IDE2ODQzNTg4OyAvLyAweDEwMTAzNDQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB1bnNlbGVjdGVkQWxwaGEgPSAxNjg0MzI3ODsgLy8gMHgxMDEwMjBlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdXBkYXRlUGVyaW9kTWlsbGlzID0gMTY4NDMzNDQ7IC8vIDB4MTAxMDI1MAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVzZURlZmF1bHRNYXJnaW5zID0gMTY4NDM2MzU7IC8vIDB4MTAxMDM3MworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVzZURlZmF1bHRNYXJnaW5zID0gMTY4NDM2NDE7IC8vIDB4MTAxMDM3OQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHVzZUludHJpbnNpY1NpemVBc01pbmltdW0gPSAxNjg0MzUzNjsgLy8gMHgxMDEwMzEwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdXNlTGV2ZWwgPSAxNjg0MzE2NzsgLy8gMHgxMDEwMTlmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdXNlclZpc2libGUgPSAxNjg0MzQwOTsgLy8gMHgxMDEwMjkxCkBAIC0xMDA4LDggKzEwNDEsMTAgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB2ZXJ0aWNhbENvcnJlY3Rpb24gPSAxNjg0MzMyMjsgLy8gMHgxMDEwMjNhCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVydGljYWxEaXZpZGVyID0gMTY4NDMwNTQ7IC8vIDB4MTAxMDEyZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZlcnRpY2FsR2FwID0gMTY4NDMzMjg7IC8vIDB4MTAxMDI0MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZlcnRpY2FsT2Zmc2V0ID0gMTY4NDM2Njg7IC8vIDB4MTAxMDM5NAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZlcnRpY2FsU2Nyb2xsYmFyUG9zaXRpb24gPSAxNjg0MzU3MjsgLy8gMHgxMDEwMzM0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmVydGljYWxTcGFjaW5nID0gMTY4NDMwMjk7IC8vIDB4MTAxMDExNQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZpYnJhdGlvbkR1cmF0aW9uID0gMTY4NDM2NjU7IC8vIDB4MTAxMDM5MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHZpc2liaWxpdHkgPSAxNjg0Mjk3MjsgLy8gMHgxMDEwMGRjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdmlzaWJsZSA9IDE2ODQzMTU2OyAvLyAweDEwMTAxOTQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB2bVNhZmVNb2RlID0gMTY4NDM0NDg7IC8vIDB4MTAxMDJiOApAQCAtMTAyNiw2ICsxMDYxLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB3YWxscGFwZXJJbnRyYU9wZW5FeGl0QW5pbWF0aW9uID0gMTY4NDM0MTY7IC8vIDB4MTAxMDI5OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHdhbGxwYXBlck9wZW5FbnRlckFuaW1hdGlvbiA9IDE2ODQzNDExOyAvLyAweDEwMTAyOTMKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB3YWxscGFwZXJPcGVuRXhpdEFuaW1hdGlvbiA9IDE2ODQzNDEyOyAvLyAweDEwMTAyOTQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB3YXZlRHJhd2FibGUgPSAxNjg0MzY2MjsgLy8gMHgxMDEwMzhlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2ViVGV4dFZpZXdTdHlsZSA9IDE2ODQzNDQ5OyAvLyAweDEwMTAyYjkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB3ZWJWaWV3U3R5bGUgPSAxNjg0Mjg4NTsgLy8gMHgxMDEwMDg1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgd2Vla0RheVRleHRBcHBlYXJhbmNlID0gMTY4NDM1OTI7IC8vIDB4MTAxMDM0OApAQCAtMTM0Miw2ICsxMzc4LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb25maWdfbG9uZ0FuaW1UaW1lID0gMTc2OTQ3MjI7IC8vIDB4MTBlMDAwMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbmZpZ19tZWRpdW1BbmltVGltZSA9IDE3Njk0NzIxOyAvLyAweDEwZTAwMDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb25maWdfc2hvcnRBbmltVGltZSA9IDE3Njk0NzIwOyAvLyAweDEwZTAwMDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9pbmZvX21heG51bSA9IDE3Njk0NzIzOyAvLyAweDEwZTAwMDMKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUi5pbnRlcnBvbGF0b3IgewpAQCAtMTQyOCw2ICsxNDY1LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzZWFyY2hfZ28gPSAxNzAzOTM3MjsgLy8gMHgxMDQwMDBjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgc2VsZWN0QWxsID0gMTcwMzkzNzM7IC8vIDB4MTA0MDAwZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHNlbGVjdFRleHRNb2RlID0gMTcwMzkzODI7IC8vIDB4MTA0MDAxNgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHN0YXR1c19iYXJfbm90aWZpY2F0aW9uX2luZm9fb3ZlcmZsb3cgPSAxNzAzOTM4MzsgLy8gMHgxMDQwMDE3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW5rbm93bk5hbWUgPSAxNzAzOTM3NDsgLy8gMHgxMDQwMDBlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdW50aXRsZWQgPSAxNzAzOTM3NTsgLy8gMHgxMDQwMDBmCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgeWVzID0gMTcwMzkzNzk7IC8vIDB4MTA0MDAxMwpAQCAtMTQ1Niw2ICsxNDk0LDM1IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTWVkaWFCdXR0b25fUmV3ID0gMTY5NzM4ODQ7IC8vIDB4MTAzMDAzYwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlID0gMTY5NzM4ODY7IC8vIDB4MTAzMDAzZQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0RpYWxvZ1dpbmRvd1RpdGxlID0gMTY5NzM4ODk7IC8vIDB4MTAzMDA0MQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0hvbG8gPSAxNjk3NDA3NTsgLy8gMHgxMDMwMGZiCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19EaWFsb2dXaW5kb3dUaXRsZSA9IDE2OTc0MTAzOyAvLyAweDEwMzAxMTcKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX0ludmVyc2UgPSAxNjk3NDA3NjsgLy8gMHgxMDMwMGZjCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19MYXJnZSA9IDE2OTc0MDc3OyAvLyAweDEwMzAwZmQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX0xhcmdlX0ludmVyc2UgPSAxNjk3NDA3ODsgLy8gMHgxMDMwMGZlCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19NZWRpdW0gPSAxNjk3NDA3OTsgLy8gMHgxMDMwMGZmCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19NZWRpdW1fSW52ZXJzZSA9IDE2OTc0MDgwOyAvLyAweDEwMzAxMDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1NlYXJjaFJlc3VsdF9TdWJ0aXRsZSA9IDE2OTc0MDg0OyAvLyAweDEwMzAxMDQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1NlYXJjaFJlc3VsdF9UaXRsZSA9IDE2OTc0MDgzOyAvLyAweDEwMzAxMDMKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1NtYWxsID0gMTY5NzQwODE7IC8vIDB4MTAzMDEwMQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0hvbG9fU21hbGxfSW52ZXJzZSA9IDE2OTc0MDgyOyAvLyAweDEwMzAxMDIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldCA9IDE2OTc0MDg1OyAvLyAweDEwMzAxMDUKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9BY3Rpb25CYXJfU3VidGl0bGUgPSAxNjk3NDA5OTsgLy8gMHgxMDMwMTEzCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfQWN0aW9uQmFyX1RpdGxlID0gMTY5NzQwOTg7IC8vIDB4MTAzMDExMgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X0FjdGlvbk1vZGVfU3VidGl0bGUgPSAxNjk3NDEwMTsgLy8gMHgxMDMwMTE1CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfQWN0aW9uTW9kZV9UaXRsZSA9IDE2OTc0MTAwOyAvLyAweDEwMzAxMTQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9CdXR0b24gPSAxNjk3NDA4NjsgLy8gMHgxMDMwMTA2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfRHJvcERvd25IaW50ID0gMTY5NzQwOTE7IC8vIDB4MTAzMDEwYgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X0Ryb3BEb3duSXRlbSA9IDE2OTc0MDkyOyAvLyAweDEwMzAxMGMKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9FZGl0VGV4dCA9IDE2OTc0MDk0OyAvLyAweDEwMzAxMGUKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9JY29uTWVudV9JdGVtID0gMTY5NzQwODc7IC8vIDB4MTAzMDEwNworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X1BvcHVwTWVudSA9IDE2OTc0MDk1OyAvLyAweDEwMzAxMGYKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9Qb3B1cE1lbnVfTGFyZ2UgPSAxNjk3NDA5NjsgLy8gMHgxMDMwMTEwCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfUG9wdXBNZW51X1NtYWxsID0gMTY5NzQwOTc7IC8vIDB4MTAzMDExMQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0hvbG9fV2lkZ2V0X1RhYldpZGdldCA9IDE2OTc0MDg4OyAvLyAweDEwMzAxMDgKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9UZXh0VmlldyA9IDE2OTc0MDg5OyAvLyAweDEwMzAxMDkKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9Ib2xvX1dpZGdldF9UZXh0Vmlld19Qb3B1cE1lbnUgPSAxNjk3NDA5MDsgLy8gMHgxMDMwMTBhCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19XaWRnZXRfVGV4dFZpZXdfU3Bpbm5lckl0ZW0gPSAxNjk3NDA5MzsgLy8gMHgxMDMwMTBkCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV4dEFwcGVhcmFuY2VfSG9sb19XaW5kb3dUaXRsZSA9IDE2OTc0MTAyOyAvLyAweDEwMzAxMTYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUZXh0QXBwZWFyYW5jZV9JbnZlcnNlID0gMTY5NzM4ODc7IC8vIDB4MTAzMDAzZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0xhcmdlID0gMTY5NzM4OTA7IC8vIDB4MTAzMDA0MgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRleHRBcHBlYXJhbmNlX0xhcmdlX0ludmVyc2UgPSAxNjk3Mzg5MTsgLy8gMHgxMDMwMDQzCkBAIC0xNTAzLDEyICsxNTcwLDEzIEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfSG9sb19MaWdodF9EaWFsb2dfTm9BY3Rpb25CYXIgPSAxNjk3Mzk0MTsgLy8gMHgxMDMwMDc1CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfSG9sb19MaWdodF9EaWFsb2dfTm9BY3Rpb25CYXJfTWluV2lkdGggPSAxNjk3Mzk0MjsgLy8gMHgxMDMwMDc2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfSG9sb19MaWdodF9Ob0FjdGlvbkJhciA9IDE2OTc0MDY0OyAvLyAweDEwMzAwZjAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9Ib2xvX0xpZ2h0X05vQWN0aW9uQmFyX0Z1bGxzY3JlZW4gPSAxNjk3NDA2NTsgLy8gMHgxMDMwMGYxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfSG9sb19MaWdodF9QYW5lbCA9IDE2OTczOTQ4OyAvLyAweDEwMzAwN2MKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9Ib2xvX0xpZ2h0X1NwbGl0QWN0aW9uQmFyV2hlbk5hcnJvdyA9IDE2OTc0MDY3OyAvLyAweDEwMzAwZjMKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9Ib2xvX0xpZ2h0X1NwbGl0QWN0aW9uQmFyV2hlbk5hcnJvdyA9IDE2OTc0MTA2OyAvLyAweDEwMzAxMWEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9Ib2xvX05vQWN0aW9uQmFyID0gMTY5NzM5MzI7IC8vIDB4MTAzMDA2YwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0hvbG9fTm9BY3Rpb25CYXJfRnVsbHNjcmVlbiA9IDE2OTczOTMzOyAvLyAweDEwMzAwNmQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaGVtZV9Ib2xvX1BhbmVsID0gMTY5NzM5NDc7IC8vIDB4MTAzMDA3YgotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0hvbG9fU3BsaXRBY3Rpb25CYXJXaGVuTmFycm93ID0gMTY5NzQwNjY7IC8vIDB4MTAzMDBmMgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0hvbG9fU3BsaXRBY3Rpb25CYXJXaGVuTmFycm93ID0gMTY5NzQxMDU7IC8vIDB4MTAzMDExOQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0hvbG9fV2FsbHBhcGVyID0gMTY5NzM5NDk7IC8vIDB4MTAzMDA3ZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRoZW1lX0hvbG9fV2FsbHBhcGVyX05vVGl0bGVCYXIgPSAxNjk3Mzk1MDsgLy8gMHgxMDMwMDdlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGhlbWVfSW5wdXRNZXRob2QgPSAxNjk3MzkwODsgLy8gMHgxMDMwMDU0CkBAIC0xNTMzLDYgKzE2MDEsOSBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldCA9IDE2OTczODQyOyAvLyAweDEwMzAwMTIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQWJzTGlzdFZpZXcgPSAxNjk3Mzg0MzsgLy8gMHgxMDMwMDEzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0FjdGlvbkJhciA9IDE2OTczOTU0OyAvLyAweDEwMzAwODIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQWN0aW9uQmFyX1RhYkJhciA9IDE2OTc0MDY4OyAvLyAweDEwMzAwZjQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfQWN0aW9uQmFyX1RhYlRleHQgPSAxNjk3NDA2NzsgLy8gMHgxMDMwMGYzCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0FjdGlvbkJhcl9UYWJWaWV3ID0gMTY5NzQwNjY7IC8vIDB4MTAzMDBmMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9BY3Rpb25CdXR0b24gPSAxNjk3Mzk1NjsgLy8gMHgxMDMwMDg0CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0FjdGlvbkJ1dHRvbl9DbG9zZU1vZGUgPSAxNjk3Mzk2MDsgLy8gMHgxMDMwMDg4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0FjdGlvbkJ1dHRvbl9PdmVyZmxvdyA9IDE2OTczOTU5OyAvLyAweDEwMzAwODcKQEAgLTE1NTYsNiArMTYyNyw5IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0dyaWRWaWV3ID0gMTY5NzM4NzQ7IC8vIDB4MTAzMDAzMgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvID0gMTY5NzM5NjI7IC8vIDB4MTAzMDA4YQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0FjdGlvbkJhciA9IDE2OTc0MDA0OyAvLyAweDEwMzAwYjQKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19BY3Rpb25CYXJfVGFiQmFyID0gMTY5NzQwNzE7IC8vIDB4MTAzMDBmNworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0FjdGlvbkJhcl9UYWJUZXh0ID0gMTY5NzQwNzA7IC8vIDB4MTAzMDBmNgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0FjdGlvbkJhcl9UYWJWaWV3ID0gMTY5NzQwNjk7IC8vIDB4MTAzMDBmNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0FjdGlvbkJ1dHRvbiA9IDE2OTczOTk5OyAvLyAweDEwMzAwYWYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19BY3Rpb25CdXR0b25fQ2xvc2VNb2RlID0gMTY5NzQwMDM7IC8vIDB4MTAzMDBiMwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0FjdGlvbkJ1dHRvbl9PdmVyZmxvdyA9IDE2OTc0MDAwOyAvLyAweDEwMzAwYjAKQEAgLTE1NjQsNiArMTYzOCw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fQXV0b0NvbXBsZXRlVGV4dFZpZXcgPSAxNjk3Mzk2ODsgLy8gMHgxMDMwMDkwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fQnV0dG9uID0gMTY5NzM5NjM7IC8vIDB4MTAzMDA4YgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0J1dHRvbl9Cb3JkZXJsZXNzID0gMTY5NzQwNTA7IC8vIDB4MTAzMDBlMgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0J1dHRvbl9Cb3JkZXJsZXNzX1NtYWxsID0gMTY5NzQxMDc7IC8vIDB4MTAzMDExYgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0J1dHRvbl9JbnNldCA9IDE2OTczOTY1OyAvLyAweDEwMzAwOGQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19CdXR0b25fU21hbGwgPSAxNjk3Mzk2NDsgLy8gMHgxMDMwMDhjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fQnV0dG9uX1RvZ2dsZSA9IDE2OTczOTY2OyAvLyAweDEwMzAwOGUKQEAgLTE1ODEsMTIgKzE2NTYsMTYgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19JbWFnZUJ1dHRvbiA9IDE2OTczOTc0OyAvLyAweDEwMzAwOTYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodCA9IDE2OTc0MDA1OyAvLyAweDEwMzAwYjUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9BY3Rpb25CYXIgPSAxNjk3NDA0OTsgLy8gMHgxMDMwMGUxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fTGlnaHRfQWN0aW9uQmFyX1RhYkJhciA9IDE2OTc0MDc0OyAvLyAweDEwMzAwZmEKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9BY3Rpb25CYXJfVGFiVGV4dCA9IDE2OTc0MDczOyAvLyAweDEwMzAwZjkKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9BY3Rpb25CYXJfVGFiVmlldyA9IDE2OTc0MDcyOyAvLyAweDEwMzAwZjgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9BY3Rpb25CdXR0b24gPSAxNjk3NDA0NTsgLy8gMHgxMDMwMGRkCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fTGlnaHRfQWN0aW9uQnV0dG9uX0Nsb3NlTW9kZSA9IDE2OTc0MDQ4OyAvLyAweDEwMzAwZTAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9BY3Rpb25CdXR0b25fT3ZlcmZsb3cgPSAxNjk3NDA0NjsgLy8gMHgxMDMwMGRlCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fTGlnaHRfQWN0aW9uTW9kZSA9IDE2OTc0MDQ3OyAvLyAweDEwMzAwZGYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9BdXRvQ29tcGxldGVUZXh0VmlldyA9IDE2OTc0MDExOyAvLyAweDEwMzAwYmIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9CdXR0b24gPSAxNjk3NDAwNjsgLy8gMHgxMDMwMGI2CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fTGlnaHRfQnV0dG9uX0JvcmRlcmxlc3NfU21hbGwgPSAxNjk3NDEwODsgLy8gMHgxMDMwMTFjCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2lkZ2V0X0hvbG9fTGlnaHRfQnV0dG9uX0luc2V0ID0gMTY5NzQwMDg7IC8vIDB4MTAzMDBiOAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpZGdldF9Ib2xvX0xpZ2h0X0J1dHRvbl9TbWFsbCA9IDE2OTc0MDA3OyAvLyAweDEwMzAwYjcKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXaWRnZXRfSG9sb19MaWdodF9CdXR0b25fVG9nZ2xlID0gMTY5NzQwMDk7IC8vIDB4MTAzMDBiOQpAQCAtMTY5MywxMSArMTc3MiwxOCBAQAogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoKTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIHZvaWQgc2V0U2VydmljZUluZm8oYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBTRVJWSUNFX0lOVEVSRkFDRSA9ICJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgU0VSVklDRV9NRVRBX0RBVEEgPSAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZSI7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKICAgICBjdG9yIHB1YmxpYyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBmZWVkYmFja1R5cGVUb1N0cmluZyhpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZmxhZ1RvU3RyaW5nKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldENhblJldHJpZXZlV2luZG93Q29udGVudCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRJZCgpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvIGdldFJlc29sdmVJbmZvKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFNldHRpbmdzQWN0aXZpdHlOYW1lKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvciBDUkVBVE9SOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFQgPSAxOyAvLyAweDEKQEAgLTE5NDcsMTIgKzIwMzMsMTIgQEAKIAogICBwdWJsaWMgY2xhc3MgRmxvYXRFdmFsdWF0b3IgaW1wbGVtZW50cyBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yIHsKICAgICBjdG9yIHB1YmxpYyBGbG9hdEV2YWx1YXRvcigpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBldmFsdWF0ZShmbG9hdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuRmxvYXQgZXZhbHVhdGUoZmxvYXQsIGphdmEubGFuZy5OdW1iZXIsIGphdmEubGFuZy5OdW1iZXIpOwogICB9CiAKICAgcHVibGljIGNsYXNzIEludEV2YWx1YXRvciBpbXBsZW1lbnRzIGFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IgewogICAgIGN0b3IgcHVibGljIEludEV2YWx1YXRvcigpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBldmFsdWF0ZShmbG9hdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuSW50ZWdlciBldmFsdWF0ZShmbG9hdCwgamF2YS5sYW5nLkludGVnZXIsIGphdmEubGFuZy5JbnRlZ2VyKTsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBLZXlmcmFtZSBpbXBsZW1lbnRzIGphdmEubGFuZy5DbG9uZWFibGUgewpAQCAtMjAxMyw5ICsyMDk5LDEzIEBACiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRUYXJnZXQoKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciBvZkZsb2F0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGZsb2F0Li4uKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciBvZkZsb2F0KFQsIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTxULCBqYXZhLmxhbmcuRmxvYXQ+LCBmbG9hdC4uLik7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3Igb2ZJbnQoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgaW50Li4uKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvciBvZkludChULCBhbmRyb2lkLnV0aWwuUHJvcGVydHk8VCwgamF2YS5sYW5nLkludGVnZXI+LCBpbnQuLi4pOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIG9mT2JqZWN0KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IsIGphdmEubGFuZy5PYmplY3QuLi4pOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yIG9mT2JqZWN0KFQsIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTxULCBWPiwgYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvcjxWPiwgVi4uLik7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3Igb2ZQcm9wZXJ0eVZhbHVlc0hvbGRlcihqYXZhLmxhbmcuT2JqZWN0LCBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlci4uLik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShqYXZhLmxhbmcuU3RyaW5nKTsKICAgfQogCkBAIC0yMDIzLDE0ICsyMTEzLDE5IEBACiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciBjbG9uZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciBvZkZsb2F0KGphdmEubGFuZy5TdHJpbmcsIGZsb2F0Li4uKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciBvZkZsb2F0KGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTw/LCBqYXZhLmxhbmcuRmxvYXQ+LCBmbG9hdC4uLik7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2ZJbnQoamF2YS5sYW5nLlN0cmluZywgaW50Li4uKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFuaW1hdGlvbi5Qcm9wZXJ0eVZhbHVlc0hvbGRlciBvZkludChhbmRyb2lkLnV0aWwuUHJvcGVydHk8PywgamF2YS5sYW5nLkludGVnZXI+LCBpbnQuLi4pOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIG9mS2V5ZnJhbWUoamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUuLi4pOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyIG9mS2V5ZnJhbWUoYW5kcm9pZC51dGlsLlByb3BlcnR5LCBhbmRyb2lkLmFuaW1hdGlvbi5LZXlmcmFtZS4uLik7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2ZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC5hbmltYXRpb24uVHlwZUV2YWx1YXRvciwgamF2YS5sYW5nLk9iamVjdC4uLik7CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2ZPYmplY3QoYW5kcm9pZC51dGlsLlByb3BlcnR5LCBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yPFY+LCBWLi4uKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RXZhbHVhdG9yKGFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3IpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRGbG9hdFZhbHVlcyhmbG9hdC4uLik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEludFZhbHVlcyhpbnQuLi4pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRLZXlmcmFtZXMoYW5kcm9pZC5hbmltYXRpb24uS2V5ZnJhbWUuLi4pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZXMoamF2YS5sYW5nLk9iamVjdC4uLik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShqYXZhLmxhbmcuU3RyaW5nKTsKICAgfQogCkBAIC0yMDM5LDcgKzIxMzQsNyBAQAogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBUeXBlRXZhbHVhdG9yIHsKLSAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5PYmplY3QgZXZhbHVhdGUoZmxvYXQsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgVCBldmFsdWF0ZShmbG9hdCwgVCwgVCk7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgVmFsdWVBbmltYXRvciBleHRlbmRzIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yIHsKQEAgLTIzNjEsNyArMjQ1Niw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTVUxUX09LID0gLTE7IC8vIDB4ZmZmZmZmZmYKICAgfQogCi0gIHB1YmxpYyBjbGFzcyBBY3Rpdml0eUdyb3VwIGV4dGVuZHMgYW5kcm9pZC5hcHAuQWN0aXZpdHkgeworICBwdWJsaWMgZGVwcmVjYXRlZCBjbGFzcyBBY3Rpdml0eUdyb3VwIGV4dGVuZHMgYW5kcm9pZC5hcHAuQWN0aXZpdHkgewogICAgIGN0b3IgcHVibGljIEFjdGl2aXR5R3JvdXAoKTsKICAgICBjdG9yIHB1YmxpYyBBY3Rpdml0eUdyb3VwKGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5hcHAuQWN0aXZpdHkgZ2V0Q3VycmVudEFjdGl2aXR5KCk7CkBAIC0yODM5LDYgKzI5MzQsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuYXBwLkZyYWdtZW50IGluc3RhbnRpYXRlKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmFwcC5GcmFnbWVudCBpbnN0YW50aWF0ZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FkZGVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRGV0YWNoZWQoKTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNIaWRkZW4oKTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbkxheW91dCgpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1JlbW92aW5nKCk7CkBAIC0yODc0LDYgKzI5NzAsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCByZWdpc3RlckZvckNvbnRleHRNZW51KGFuZHJvaWQudmlldy5WaWV3KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0QXJndW1lbnRzKGFuZHJvaWQub3MuQnVuZGxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uc01lbnUoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTYXZlZFN0YXRlKGFuZHJvaWQuYXBwLkZyYWdtZW50LlNhdmVkU3RhdGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRSZXRhaW5JbnN0YW5jZShib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VGFyZ2V0RnJhZ21lbnQoYW5kcm9pZC5hcHAuRnJhZ21lbnQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN0YXJ0QWN0aXZpdHkoYW5kcm9pZC5jb250ZW50LkludGVudCk7CkBAIC0yODg1LDYgKzI5ODIsMTIgQEAKICAgICBjdG9yIHB1YmxpYyBGcmFnbWVudC5JbnN0YW50aWF0aW9uRXhjZXB0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBGcmFnbWVudC5TYXZlZFN0YXRlIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIHsKKyAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yIENSRUFUT1I7CisgIH0KKwogICBwdWJsaWMgY2xhc3MgRnJhZ21lbnRCcmVhZENydW1icyBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3R3JvdXAgaW1wbGVtZW50cyBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXIuT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIgewogICAgIGN0b3IgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwogICAgIGN0b3IgcHVibGljIEZyYWdtZW50QnJlYWRDcnVtYnMoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwpAQCAtMjkyMiw2ICszMDI1LDcgQEAKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcG9wQmFja1N0YWNrSW1tZWRpYXRlKGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgcHV0RnJhZ21lbnQoYW5kcm9pZC5vcy5CdW5kbGUsIGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQuYXBwLkZyYWdtZW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlT25CYWNrU3RhY2tDaGFuZ2VkTGlzdGVuZXIoYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyLk9uQmFja1N0YWNrQ2hhbmdlZExpc3RlbmVyKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQuYXBwLkZyYWdtZW50LlNhdmVkU3RhdGUgc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZShhbmRyb2lkLmFwcC5GcmFnbWVudCk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9QX0JBQ0tfU1RBQ0tfSU5DTFVTSVZFID0gMTsgLy8gMHgxCiAgIH0KIApAQCAtMzE0MSw3ICszMjQ1LDcgQEAKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgb25Mb2FkZXJSZXNldChhbmRyb2lkLmNvbnRlbnQuTG9hZGVyPEQ+KTsKICAgfQogCi0gIHB1YmxpYyBjbGFzcyBMb2NhbEFjdGl2aXR5TWFuYWdlciB7CisgIHB1YmxpYyBkZXByZWNhdGVkIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBjdG9yIHB1YmxpYyBMb2NhbEFjdGl2aXR5TWFuYWdlcihhbmRyb2lkLmFwcC5BY3Rpdml0eSwgYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuV2luZG93IGRlc3Ryb3lBY3Rpdml0eShqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgZGlzcGF0Y2hDcmVhdGUoYW5kcm9pZC5vcy5CdW5kbGUpOwpAQCAtMzQyNCw3ICszNTI4LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TVElDS1lfQ09NUEFUSUJJTElUWSA9IDA7IC8vIDB4MAogICB9CiAKLSAgcHVibGljIGNsYXNzIFRhYkFjdGl2aXR5IGV4dGVuZHMgYW5kcm9pZC5hcHAuQWN0aXZpdHlHcm91cCB7CisgIHB1YmxpYyBkZXByZWNhdGVkIGNsYXNzIFRhYkFjdGl2aXR5IGV4dGVuZHMgYW5kcm9pZC5hcHAuQWN0aXZpdHlHcm91cCB7CiAgICAgY3RvciBwdWJsaWMgVGFiQWN0aXZpdHkoKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQud2lkZ2V0LlRhYkhvc3QgZ2V0VGFiSG9zdCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC53aWRnZXQuVGFiV2lkZ2V0IGdldFRhYldpZGdldCgpOwpAQCAtMzUyNSw2ICszNjI5LDcgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yIENSRUFUT1I7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFU19FTkNSWVBURURfU1RPUkFHRSA9IDc7IC8vIDB4NworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX0RJU0FCTEVfQ0FNRVJBID0gODsgLy8gMHg4CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFU19QT0xJQ1lfRVhQSVJFX1BBU1NXT1JEID0gNjsgLy8gMHg2CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFU19QT0xJQ1lfRk9SQ0VfTE9DSyA9IDM7IC8vIDB4MwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVNfUE9MSUNZX0xJTUlUX1BBU1NXT1JEID0gMDsgLy8gMHgwCkBAIC0zNTU4LDYgKzM2NjMsNyBAQAogCiAgIHB1YmxpYyBjbGFzcyBEZXZpY2VQb2xpY3lNYW5hZ2VyIHsKICAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lPiBnZXRBY3RpdmVBZG1pbnMoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0Q2FtZXJhRGlzYWJsZWQoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEN1cnJlbnRGYWlsZWRQYXNzd29yZEF0dGVtcHRzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWF4aW11bUZhaWxlZFBhc3N3b3Jkc0ZvcldpcGUoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwogICAgIG1ldGhvZCBwdWJsaWMgbG9uZyBnZXRNYXhpbXVtVGltZVRvTG9jayhhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSk7CkBAIC0zNTgxLDYgKzM2ODcsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBsb2NrTm93KCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2ZUFkbWluKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gcmVzZXRQYXNzd29yZChqYXZhLmxhbmcuU3RyaW5nLCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDYW1lcmFEaXNhYmxlZChhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lLCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXhpbXVtVGltZVRvTG9jayhhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZSwgbG9uZyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkRXhwaXJhdGlvblRpbWVvdXQoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUsIGxvbmcpOwpAQCAtNDExNyw2ICs0MjI0LDcgQEAKICAgICBtZXRob2QgcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKICAgICBtZXRob2QgcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoRGV2aWNlIGdldFJlbW90ZURldmljZSgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpOwogICB9CiAKIH0KQEAgLTQ5MzgsNiArNTA0Niw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9JTlNFUlRfT1JfRURJVCA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uSU5TRVJUX09SX0VESVQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTE9DQUxFX0NIQU5HRUQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkxPQ0FMRV9DSEFOR0VEIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01BSU4gPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUFOQUdFX05FVFdPUktfVVNBR0UgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BTkFHRV9ORVRXT1JLX1VTQUdFIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01BTkFHRV9QQUNLQUdFX1NUT1JBR0UgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BTkFHRV9QQUNLQUdFX1NUT1JBR0UiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fTUVESUFfQkFEX1JFTU9WQUwgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1FRElBX0JBRF9SRU1PVkFMIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX01FRElBX0JVVFRPTiA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uTUVESUFfQlVUVE9OIjsKQEAgLTQ5ODYsOCArNTA5NSw4IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9USU1FX0NIQU5HRUQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlRJTUVfU0VUIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1RJTUVfVElDSyA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uVElNRV9USUNLIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1VJRF9SRU1PVkVEID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VSURfUkVNT1ZFRCI7Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9VTVNfQ09OTkVDVEVEID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VTVNfQ09OTkVDVEVEIjsKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1VNU19ESVNDT05ORUNURUQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVNU19ESVNDT05ORUNURUQiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9VTVNfQ09OTkVDVEVEID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VTVNfQ09OTkVDVEVEIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgamF2YS5sYW5nLlN0cmluZyBBQ1RJT05fVU1TX0RJU0NPTk5FQ1RFRCA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uVU1TX0RJU0NPTk5FQ1RFRCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9VU0VSX1BSRVNFTlQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVTRVJfUFJFU0VOVCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEFDVElPTl9WSUVXID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WSUVXIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQUNUSU9OX1ZPSUNFX0NPTU1BTkQgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZPSUNFX0NPTU1BTkQiOwpAQCAtNTQ4NSwxNSArNTU5NCwxOCBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMQUdfVk1fU0FGRV9NT0RFID0gMTYzODQ7IC8vIDB4NDAwMAogICAgIGZpZWxkIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGJhY2t1cEFnZW50TmFtZTsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBjbGFzc05hbWU7CisgICAgZmllbGQgcHVibGljIGludCBjb21wYXRpYmxlV2lkdGhMaW1pdERwOwogICAgIGZpZWxkIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGRhdGFEaXI7CiAgICAgZmllbGQgcHVibGljIGludCBkZXNjcmlwdGlvblJlczsKICAgICBmaWVsZCBwdWJsaWMgYm9vbGVhbiBlbmFibGVkOwogICAgIGZpZWxkIHB1YmxpYyBpbnQgZmxhZ3M7CisgICAgZmllbGQgcHVibGljIGludCBsYXJnZXN0V2lkdGhMaW1pdERwOwogICAgIGZpZWxkIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG1hbmFnZVNwYWNlQWN0aXZpdHlOYW1lOwogICAgIGZpZWxkIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIG5hdGl2ZUxpYnJhcnlEaXI7CiAgICAgZmllbGQgcHVibGljIGphdmEubGFuZy5TdHJpbmcgcGVybWlzc2lvbjsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwcm9jZXNzTmFtZTsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBwdWJsaWNTb3VyY2VEaXI7CisgICAgZmllbGQgcHVibGljIGludCByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcDsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZ1tdIHNoYXJlZExpYnJhcnlGaWxlczsKICAgICBmaWVsZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzb3VyY2VEaXI7CiAgICAgZmllbGQgcHVibGljIGludCB0YXJnZXRTZGtWZXJzaW9uOwpAQCAtNTcwMCw2ICs1ODEyLDcgQEAKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfREVGQVVMVCA9IDA7IC8vIDB4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVEID0gMjsgLy8gMHgyCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRURfVVNFUiA9IDM7IC8vIDB4MwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0VOQUJMRUQgPSAxOyAvLyAweDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBET05UX0tJTExfQVBQID0gMTsgLy8gMHgxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfQVVESU9fTE9XX0xBVEVOQ1kgPSAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5sb3dfbGF0ZW5jeSI7CkBAIC01NzA5LDEyICs1ODIyLDE2IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfQ0FNRVJBX0ZMQVNIID0gImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmZsYXNoIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkVBVFVSRV9DQU1FUkFfRlJPTlQgPSAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZnJvbnQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX0ZBS0VUT1VDSCA9ICJhbmRyb2lkLmhhcmR3YXJlLmZha2V0b3VjaCI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfRkFLRVRPVUNIX01VTFRJVE9VQ0hfRElTVElOQ1QgPSAiYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gubXVsdGl0b3VjaC5kaXN0aW5jdCI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfRkFLRVRPVUNIX01VTFRJVE9VQ0hfSkFaWkhBTkQgPSAiYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gubXVsdGl0b3VjaC5qYXp6aGFuZCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfTElWRV9XQUxMUEFQRVIgPSAiYW5kcm9pZC5zb2Z0d2FyZS5saXZlX3dhbGxwYXBlciI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfTE9DQVRJT04gPSAiYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbiI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfTE9DQVRJT05fR1BTID0gImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24uZ3BzIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgRkVBVFVSRV9MT0NBVElPTl9ORVRXT1JLID0gImFuZHJvaWQuaGFyZHdhcmUubG9jYXRpb24ubmV0d29yayI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfTUlDUk9QSE9ORSA9ICJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmUiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX05GQyA9ICJhbmRyb2lkLmhhcmR3YXJlLm5mYyI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5sYW5kc2NhcGUiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX1NDUkVFTl9QT1JUUkFJVCA9ICJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5wb3J0cmFpdCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfU0VOU09SX0FDQ0VMRVJPTUVURVIgPSAiYW5kcm9pZC5oYXJkd2FyZS5zZW5zb3IuYWNjZWxlcm9tZXRlciI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEZFQVRVUkVfU0VOU09SX0JBUk9NRVRFUiA9ICJhbmRyb2lkLmhhcmR3YXJlLnNlbnNvci5iYXJvbWV0ZXIiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBGRUFUVVJFX1NFTlNPUl9DT01QQVNTID0gImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmNvbXBhc3MiOwpAQCAtNjMyMiw2ICs2NDM5LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDdXJzb3JKb2luZXIuUmVzdWx0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyLlJlc3VsdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyLlJlc3VsdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvckpvaW5lci5SZXN1bHQgQk9USDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JKb2luZXIuUmVzdWx0IExFRlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29ySm9pbmVyLlJlc3VsdCBSSUdIVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBDdXJzb3JXaW5kb3cgZXh0ZW5kcyBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVDbG9zYWJsZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CkBAIC02Nzk2LDYgKzY5MTYsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDdXJzb3JGYWN0b3J5KGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZURhdGFiYXNlLkN1cnNvckZhY3RvcnkpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXREaXN0aW5jdChib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UHJvamVjdGlvbk1hcChqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmc+KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3RyaWN0KGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRUYWJsZXMoamF2YS5sYW5nLlN0cmluZyk7CiAgIH0KIApAQCAtNzI0MCw2ICs3MzYxLDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBdm9pZFhmZXJtb2RlLk1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkF2b2lkWGZlcm1vZGUuTW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkF2b2lkWGZlcm1vZGUuTW9kZSBBVk9JRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Bdm9pZFhmZXJtb2RlLk1vZGUgVEFSR0VUOwogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIEJpdG1hcCBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CkBAIC03MjkyLDExICs3NDE1LDE3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQml0bWFwLkNvbXByZXNzRm9ybWF0IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbXByZXNzRm9ybWF0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXQgSlBFRzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAuQ29tcHJlc3NGb3JtYXQgUE5HOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCaXRtYXAuQ29uZmlnIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwLkNvbmZpZ1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgQUxQSEFfODsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgQVJHQl80NDQ0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgQVJHQl84ODg4OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWcgUkdCXzU2NTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBCaXRtYXBGYWN0b3J5IHsKQEAgLTczNjAsNiArNzQ4OSwxMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJsdXJNYXNrRmlsdGVyLkJsdXIgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQmx1ck1hc2tGaWx0ZXIuQmx1ciBJTk5FUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIE5PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5CbHVyTWFza0ZpbHRlci5CbHVyIE9VVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkJsdXJNYXNrRmlsdGVyLkJsdXIgU09MSUQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQ2FtZXJhIHsKQEAgLTc0NzMsMTEgKzc2MDYsMTYgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYW52YXMuRWRnZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5FZGdlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5FZGdlVHlwZSBBQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuRWRnZVR5cGUgQlc7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbnZhcy5WZXJ0ZXhNb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzLlZlcnRleE1vZGUgVFJJQU5HTEVTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcy5WZXJ0ZXhNb2RlIFRSSUFOR0xFX0ZBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5DYW52YXMuVmVydGV4TW9kZSBUUklBTkdMRV9TVFJJUDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBDb2xvciB7CkBAIC03NTkyLDYgKzc3MzAsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEludGVycG9sYXRvci5SZXN1bHQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5JbnRlcnBvbGF0b3IuUmVzdWx0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuSW50ZXJwb2xhdG9yLlJlc3VsdCBGUkVFWkVfRU5EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQgRlJFRVpFX1NUQVJUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLkludGVycG9sYXRvci5SZXN1bHQgTk9STUFMOwogICB9CiAKICAgcHVibGljIGNsYXNzIExheWVyUmFzdGVyaXplciBleHRlbmRzIGFuZHJvaWQuZ3JhcGhpY3MuUmFzdGVyaXplciB7CkBAIC03Njc1LDYgKzc4MTYsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNYXRyaXguU2NhbGVUb0ZpdCBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeC5TY2FsZVRvRml0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLk1hdHJpeC5TY2FsZVRvRml0IENFTlRFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCBFTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4LlNjYWxlVG9GaXQgRklMTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXguU2NhbGVUb0ZpdCBTVEFSVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBNb3ZpZSB7CkBAIC03ODA0LDExICs3OTQ5LDE3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFpbnQuQWxpZ24gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludC5BbGlnbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ25bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5BbGlnbiBDRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQWxpZ24gTEVGVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5BbGlnbiBSSUdIVDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGFpbnQuQ2FwIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5DYXBbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5DYXAgQlVUVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5DYXAgUk9VTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuQ2FwIFNRVUFSRTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFpbnQuRm9udE1ldHJpY3MgewpAQCAtNzgzMiwxMSArNzk4MywxNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LkpvaW4gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuSm9pbiBCRVZFTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5Kb2luIE1JVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LkpvaW4gUk9VTkQ7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBhaW50LlN0eWxlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50LlN0eWxlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgRklMTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYWludC5TdHlsZSBGSUxMX0FORF9TVFJPS0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQuU3R5bGUgU1RST0tFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhaW50RmxhZ3NEcmF3RmlsdGVyIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5EcmF3RmlsdGVyIHsKQEAgLTc4ODgsMTEgKzgwNDUsMTcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXRoLkRpcmVjdGlvbiBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRGlyZWN0aW9uIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRGlyZWN0aW9uIENDVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkRpcmVjdGlvbiBDVzsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aC5GaWxsVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRmlsbFR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRmlsbFR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIEVWRU5fT0REOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBhdGguRmlsbFR5cGUgSU5WRVJTRV9FVkVOX09ERDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIElOVkVSU0VfV0lORElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoLkZpbGxUeXBlIFdJTkRJTkc7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUGF0aERhc2hQYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0IHsKQEAgLTc5MDIsNiArODA2NSw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QuU3R5bGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QuU3R5bGUgTU9SUEg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUGF0aERhc2hQYXRoRWZmZWN0LlN0eWxlIFJPVEFURTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5QYXRoRGFzaFBhdGhFZmZlY3QuU3R5bGUgVFJBTlNMQVRFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFBhdGhFZmZlY3QgewpAQCAtODAwNiw2ICs4MTcyLDI0IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUG9ydGVyRHVmZi5Nb2RlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgQUREOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBDTEVBUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgREFSS0VOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERTVF9BVE9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBEU1RfSU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERTVF9PVVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIERTVF9PVkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBMSUdIVEVOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBNVUxUSVBMWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgT1ZFUkxBWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmLk1vZGUgU0NSRUVOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNSQ19BVE9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBTUkNfSU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNSQ19PVVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZi5Nb2RlIFNSQ19PVkVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmYuTW9kZSBYT1I7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUG9ydGVyRHVmZkNvbG9yRmlsdGVyIGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlciB7CkBAIC04MTQ3LDYgKzgzMzEsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWdpb24uT3AgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBESUZGRVJFTkNFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcCBJTlRFUlNFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFJFUExBQ0U7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFJFVkVSU0VfRElGRkVSRU5DRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AgVU5JT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uLk9wIFhPUjsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBSZWdpb25JdGVyYXRvciB7CkBAIC04MTYzLDYgKzgzNTMsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNoYWRlci5UaWxlTW9kZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlIENMQU1QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlci5UaWxlTW9kZSBNSVJST1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyLlRpbGVNb2RlIFJFUEVBVDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBTdW1QYXRoRWZmZWN0IGV4dGVuZHMgYW5kcm9pZC5ncmFwaGljcy5QYXRoRWZmZWN0IHsKQEAgLTgzMjgsMTEgKzg1MjEsMTEgQEAKICAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5pbXVtV2lkdGgoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGludCBnZXRPcGFjaXR5KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldFBhZGRpbmcoYW5kcm9pZC5ncmFwaGljcy5SZWN0KTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvblNlbGYoKTsKICAgICBtZXRob2QgcHVibGljIGludFtdIGdldFN0YXRlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbiBnZXRUcmFuc3BhcmVudFJlZ2lvbigpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBpbmZsYXRlKGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyLCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKICAgICBtZXRob2QgcHVibGljIHZvaWQgaW52YWxpZGF0ZVNlbGYoKTsKLSAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGxTZWxmKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzU3RhdGVmdWwoKTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWaXNpYmxlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGp1bXBUb0N1cnJlbnRTdGF0ZSgpOwpAQCAtODM2NCw3ICs4NTU3LDcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIERyYXdhYmxlLkNhbGxiYWNrMiBpbXBsZW1lbnRzIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUuQ2FsbGJhY2sgewotICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xheW91dFJ0bChhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGludCBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbihhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSB7CkBAIC04NDQzLDYgKzg2MzYsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbltdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gQkxfVFI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBCT1RUT01fVE9QOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gQlJfVEw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuR3JhZGllbnREcmF3YWJsZS5PcmllbnRhdGlvbiBMRUZUX1JJR0hUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gUklHSFRfTEVGVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIFRMX0JSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkdyYWRpZW50RHJhd2FibGUuT3JpZW50YXRpb24gVE9QX0JPVFRPTTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5HcmFkaWVudERyYXdhYmxlLk9yaWVudGF0aW9uIFRSX0JMOwogICB9CiAKICAgcHVibGljIGNsYXNzIEluc2V0RHJhd2FibGUgZXh0ZW5kcyBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlIGltcGxlbWVudHMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5DYWxsYmFjayB7CkBAIC0xMDkwNSw2ICsxMTEwNiw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIEFCU1RSQUNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5Mb2NhbFNvY2tldEFkZHJlc3MuTmFtZXNwYWNlIEZJTEVTWVNURU07CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LkxvY2FsU29ja2V0QWRkcmVzcy5OYW1lc3BhY2UgUkVTRVJWRUQ7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgTWFpbFRvIHsKQEAgLTEwOTM5LDExICsxMTE0MywyOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBBVVRIRU5USUNBVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBCTE9DS0VEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIENPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIERJU0NPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBESVNDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIEZBSUxFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uRGV0YWlsZWRTdGF0ZSBJRExFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlIE9CVEFJTklOR19JUEFERFI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgU0NBTk5JTkc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLkRldGFpbGVkU3RhdGUgU1VTUEVOREVEOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOZXR3b3JrSW5mby5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIENPTk5FQ1RFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgQ09OTkVDVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuTmV0d29ya0luZm8uU3RhdGUgRElTQ09OTkVDVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBESVNDT05ORUNUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5TdGF0ZSBTVVNQRU5ERUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvLlN0YXRlIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB7CkBAIC0xMDk3Miw2ICsxMTE5Myw4IEBACiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlNTTFNvY2tldEZhY3RvcnkgZ2V0SHR0cFNvY2tldEZhY3RvcnkoaW50LCBhbmRyb2lkLm5ldC5TU0xTZXNzaW9uQ2FjaGUpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeSBnZXRJbnNlY3VyZShpbnQsIGFuZHJvaWQubmV0LlNTTFNlc3Npb25DYWNoZSk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEtleU1hbmFnZXJzKGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlcltdKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VHJ1c3RNYW5hZ2VycyhqYXZheC5uZXQuc3NsLlRydXN0TWFuYWdlcltdKTsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBTU0xTZXNzaW9uQ2FjaGUgewpAQCAtMTE0NzUsNiArMTE2OTgsMTkgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlW10gdmFsdWVzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwsIGludCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEFTU09DSUFURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEFTU09DSUFUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBBVVRIRU5USUNBVElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgQ09NUExFVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBESVNDT05ORUNURUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIERPUk1BTlQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LndpZmkuU3VwcGxpY2FudFN0YXRlIEZPVVJfV0FZX0hBTkRTSEFLRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgR1JPVVBfSEFORFNIQUtFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBJTkFDVElWRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgSU5URVJGQUNFX0RJU0FCTEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBJTlZBTElEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC53aWZpLlN1cHBsaWNhbnRTdGF0ZSBTQ0FOTklORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQud2lmaS5TdXBwbGljYW50U3RhdGUgVU5JTklUSUFMSVpFRDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBXaWZpQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CkBAIC0xMzMwMyw2ICsxMzUzOSw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXN5bmNUYXNrLlN0YXR1cyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5Bc3luY1Rhc2suU3RhdHVzIEZJTklTSEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm9zLkFzeW5jVGFzay5TdGF0dXMgUEVORElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5Bc3luY1Rhc2suU3RhdHVzIFJVTk5JTkc7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQmFkUGFyY2VsYWJsZUV4Y2VwdGlvbiBleHRlbmRzIGFuZHJvaWQudXRpbC5BbmRyb2lkUnVudGltZUV4Y2VwdGlvbiB7CkBAIC0xMzM2Miw2ICsxMzYwMSw3IEBACiAKICAgcHVibGljIGNsYXNzIEJ1aWxkIHsKICAgICBjdG9yIHB1YmxpYyBCdWlsZCgpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0UmFkaW9WZXJzaW9uKCk7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEJPQVJEOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCT09UTE9BREVSOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBCUkFORDsKQEAgLTEzMzc2LDcgKzEzNjE2LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTUFOVUZBQ1RVUkVSOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBNT0RFTDsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPRFVDVDsKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkFESU87CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGphdmEubGFuZy5TdHJpbmcgUkFESU87CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFNFUklBTDsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVEFHUzsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRTsKQEAgLTEzNDA5LDcgKzEzNjQ5LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHSU5HRVJCUkVBRF9NUjEgPSAxMDsgLy8gMHhhCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CID0gMTE7IC8vIDB4YgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQl9NUjEgPSAxMjsgLy8gMHhjCi0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9ORVlDT01CX01SMiA9IDEwMDAwOyAvLyAweDI3MTAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIT05FWUNPTUJfTVIyID0gMTM7IC8vIDB4ZAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElDRV9DUkVBTV9TQU5EV0lDSCA9IDEwMDAwOyAvLyAweDI3MTAKICAgfQogCkBAIC0xMzc3MSw2ICsxNDAxMSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJGQUNFX1RSQU5TQUNUSU9OID0gMTU5ODk2ODkwMjsgLy8gMHg1ZjRlNTQ0NgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBU1RfQ0FMTF9UUkFOU0FDVElPTiA9IDE2Nzc3MjE1OyAvLyAweGZmZmZmZgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTkdfVFJBTlNBQ1RJT04gPSAxNTk5MDk4NDM5OyAvLyAweDVmNTA0ZTQ3CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFdFRVRfVFJBTlNBQ1RJT04gPSAxNTk5MzYyOTAwOyAvLyAweDVmNTQ1NzU0CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGludGVyZmFjZSBJQmluZGVyLkRlYXRoUmVjaXBpZW50IHsKQEAgLTE0MDIxLDYgKzE0MjYyLDEwIEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQ0VMQUJMRV9XUklURV9SRVRVUk5fVkFMVUUgPSAxOyAvLyAweDEKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIFBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yIGltcGxlbWVudHMgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IgeworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgVCBjcmVhdGVGcm9tUGFyY2VsKGFuZHJvaWQub3MuUGFyY2VsLCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIpOworICB9CisKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgUGFyY2VsYWJsZS5DcmVhdG9yIHsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IFQgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBUW10gbmV3QXJyYXkoaW50KTsKQEAgLTE0MjY2LDIwICsxNDUxMSwxMCBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZSB7CiAKLSAgcHVibGljIGNsYXNzIENoZWNrQm94UHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlIHsKKyAgcHVibGljIGNsYXNzIENoZWNrQm94UHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5Ud29TdGF0ZVByZWZlcmVuY2UgewogICAgIGN0b3IgcHVibGljIENoZWNrQm94UHJlZmVyZW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCwgaW50KTsKICAgICBjdG9yIHB1YmxpYyBDaGVja0JveFByZWZlcmVuY2UoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwogICAgIGN0b3IgcHVibGljIENoZWNrQm94UHJlZmVyZW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldERpc2FibGVEZXBlbmRlbnRzU3RhdGUoKTsKLSAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0U3VtbWFyeU9mZigpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5T24oKTsKLSAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNDaGVja2VkKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbik7Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldERpc2FibGVEZXBlbmRlbnRzU3RhdGUoYm9vbGVhbik7Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN1bW1hcnlPZmYoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7Ci0gICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN1bW1hcnlPZmYoaW50KTsKLSAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9uKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwotICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5T24oaW50KTsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFsb2dQcmVmZXJlbmNlIGV4dGVuZHMgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2UgaW1wbGVtZW50cyBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIGFuZHJvaWQucHJlZmVyZW5jZS5QcmVmZXJlbmNlTWFuYWdlci5PbkFjdGl2aXR5RGVzdHJveUxpc3RlbmVyIHsKQEAgLTE0NjA3LDYgKzE0ODQyLDM0IEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFNob3dTaWxlbnQoYm9vbGVhbik7CiAgIH0KIAorICBwdWJsaWMgY2xhc3MgU3dpdGNoUHJlZmVyZW5jZSBleHRlbmRzIGFuZHJvaWQucHJlZmVyZW5jZS5Ud29TdGF0ZVByZWZlcmVuY2UgeworICAgIGN0b3IgcHVibGljIFN3aXRjaFByZWZlcmVuY2UoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQsIGludCk7CisgICAgY3RvciBwdWJsaWMgU3dpdGNoUHJlZmVyZW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCk7CisgICAgY3RvciBwdWJsaWMgU3dpdGNoUHJlZmVyZW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFN3aXRjaFRleHRPZmYoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0U3dpdGNoVGV4dE9uKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN3aXRjaFRleHRPZmYoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN3aXRjaFRleHRPZmYoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3dpdGNoVGV4dE9uKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTd2l0Y2hUZXh0T24oaW50KTsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUd29TdGF0ZVByZWZlcmVuY2UgZXh0ZW5kcyBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZSB7CisgICAgY3RvciBwdWJsaWMgVHdvU3RhdGVQcmVmZXJlbmNlKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOworICAgIGN0b3IgcHVibGljIFR3b1N0YXRlUHJlZmVyZW5jZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCk7CisgICAgY3RvciBwdWJsaWMgVHdvU3RhdGVQcmVmZXJlbmNlKGFuZHJvaWQuY29udGVudC5Db250ZXh0KTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5T2ZmKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFN1bW1hcnlPbigpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZShib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZihqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZihpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5T24oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN1bW1hcnlPbihpbnQpOworICB9CisKIH0KIAogcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyIHsKQEAgLTE1MDA3LDcgKzE1MjcwLDEwIEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQVVUSE9SSVRZX1VSSTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ0FMTEVSX0lTX1NZTkNBREFQVEVSID0gImNhbGxlcl9pc19zeW5jYWRhcHRlciI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJUkVDVE9SWV9QQVJBTV9LRVkgPSAiZGlyZWN0b3J5IjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgSU5DTFVERV9QUk9GSUxFID0gImluY2x1ZGVfcHJvZmlsZSI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIExJTUlUX1BBUkFNX0tFWSA9ICJsaW1pdCI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSU1BUllfQUNDT1VOVF9OQU1FID0gIm5hbWVfZm9yX3ByaW1hcnlfYWNjb3VudCI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBSSU1BUllfQUNDT1VOVF9UWVBFID0gInR5cGVfZm9yX3ByaW1hcnlfYWNjb3VudCI7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRhY3RzQ29udHJhY3QuQWdncmVnYXRpb25FeGNlcHRpb25zIGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyB7CkBAIC0xNTMwNiw2ICsxNTU3Miw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIERJU1BMQVlfTkFNRSA9ICJkaXNwbGF5X25hbWUiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBIQVNfUEhPTkVfTlVNQkVSID0gImhhc19waG9uZV9udW1iZXIiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJTl9WSVNJQkxFX0dST1VQID0gImluX3Zpc2libGVfZ3JvdXAiOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBJU19VU0VSX1BST0ZJTEUgPSAiaXNfdXNlcl9wcm9maWxlIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgTE9PS1VQX0tFWSA9ICJsb29rdXAiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBQSE9UT19JRCA9ICJwaG90b19pZCI7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFBIT1RPX1RIVU1CTkFJTF9VUkkgPSAicGhvdG9fdGh1bWJfdXJpIjsKQEAgLTE1MzQ5LDYgKzE1NjE2LDE1IEBACiAgIHByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIENvbnRhY3RzQ29udHJhY3QuRGF0YUNvbHVtbnNXaXRoSm9pbnMgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdFN0YXR1c0NvbHVtbnMgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzQ29sdW1ucyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YUNvbHVtbnMgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzQ29sdW1ucyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuU3RhdHVzQ29sdW1ucyB7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbnRhY3RzQ29udHJhY3QuRGF0YVVzYWdlRmVlZGJhY2sgeworICAgIGN0b3IgcHVibGljIENvbnRhY3RzQ29udHJhY3QuRGF0YVVzYWdlRmVlZGJhY2soKTsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQubmV0LlVyaSBGRUVEQkFDS19VUkk7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTQUdFX1RZUEUgPSAidHlwZSI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFVTQUdFX1RZUEVfQ0FMTCA9ICJjYWxsIjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVNBR0VfVFlQRV9MT05HX1RFWFQgPSAibG9uZ190ZXh0IjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgVVNBR0VfVFlQRV9TSE9SVF9URVhUID0gInNob3J0X3RleHQiOworICB9CisKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250YWN0c0NvbnRyYWN0LkRpcmVjdG9yeSBpbXBsZW1lbnRzIGFuZHJvaWQucHJvdmlkZXIuQmFzZUNvbHVtbnMgewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIHZvaWQgbm90aWZ5RGlyZWN0b3J5Q2hhbmdlKGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIpOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudE5hbWUiOwpAQCAtMTU0ODksNiArMTU3NjUsMTIgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUFJPVE9DT0wgPSAicHJvdG9jb2wiOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250YWN0c0NvbnRyYWN0LlByb2ZpbGUgaW1wbGVtZW50cyBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zIGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0TmFtZUNvbHVtbnMgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RPcHRpb25zQ29sdW1ucyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29udGFjdFN0YXR1c0NvbHVtbnMgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzQ29sdW1ucyB7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLm5ldC5VcmkgQ09OVEVOVF9SQVdfQ09OVEFDVFNfVVJJOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVVJJOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5uZXQuVXJpIENPTlRFTlRfVkNBUkRfVVJJOworICB9CisKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250YWN0c0NvbnRyYWN0LlF1aWNrQ29udGFjdCB7CiAgICAgY3RvciBwdWJsaWMgQ29udGFjdHNDb250cmFjdC5RdWlja0NvbnRhY3QoKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyB2b2lkIHNob3dRdWlja0NvbnRhY3QoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudmlldy5WaWV3LCBhbmRyb2lkLm5ldC5VcmksIGludCwgamF2YS5sYW5nLlN0cmluZ1tdKTsKQEAgLTE1NTI0LDYgKzE1ODA2LDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgQ09OVEFDVF9JRCA9ICJjb250YWN0X2lkIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgREVMRVRFRCA9ICJkZWxldGVkIjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5TdHJpbmcgUkFXX0NPTlRBQ1RfSVNfUkVBRF9PTkxZID0gInJhd19jb250YWN0X2lzX3JlYWRfb25seSI7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFJBV19DT05UQUNUX0lTX1VTRVJfUFJPRklMRSA9ICJyYXdfY29udGFjdF9pc191c2VyX3Byb2ZpbGUiOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzRW50aXR5IGltcGxlbWVudHMgYW5kcm9pZC5wcm92aWRlci5CYXNlQ29sdW1ucyBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuRGF0YUNvbHVtbnMgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LlJhd0NvbnRhY3RzQ29sdW1ucyB7CkBAIC0xNjIzOCw2ICsxNjUyMSw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGNvcHkxRFJhbmdlRnJvbShpbnQsIGludCwgc2hvcnRbXSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGNvcHkxRFJhbmdlRnJvbShpbnQsIGludCwgYnl0ZVtdKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY29weTFEUmFuZ2VGcm9tKGludCwgaW50LCBmbG9hdFtdKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgY29weTFEUmFuZ2VGcm9tKGludCwgaW50LCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjb3B5MURSYW5nZUZyb21VbmNoZWNrZWQoaW50LCBpbnQsIGludFtdKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY29weTFEUmFuZ2VGcm9tVW5jaGVja2VkKGludCwgaW50LCBzaG9ydFtdKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY29weTFEUmFuZ2VGcm9tVW5jaGVja2VkKGludCwgaW50LCBieXRlW10pOwpAQCAtMTYyNDYsNiArMTY1MzAsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjb3B5MkRSYW5nZUZyb20oaW50LCBpbnQsIGludCwgaW50LCBzaG9ydFtdKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY29weTJEUmFuZ2VGcm9tKGludCwgaW50LCBpbnQsIGludCwgaW50W10pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjb3B5MkRSYW5nZUZyb20oaW50LCBpbnQsIGludCwgaW50LCBmbG9hdFtdKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgY29weTJEUmFuZ2VGcm9tKGludCwgaW50LCBpbnQsIGludCwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbiwgaW50LCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjb3B5MkRSYW5nZUZyb20oaW50LCBpbnQsIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY29weUZyb20oYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9ialtdKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY29weUZyb20oaW50W10pOwpAQCAtMTYyODMsNiArMTY1NjgsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRGcm9tRmllbGRQYWNrZXIoaW50LCBpbnQsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpZWxkUGFja2VyKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3luY0FsbChpbnQpOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTQUdFX0dSQVBISUNTX0NPTlNUQU5UUyA9IDg7IC8vIDB4OAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTQUdFX0dSQVBISUNTX1JFTkRFUl9UQVJHRVQgPSAxNjsgLy8gMHgxMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTQUdFX0dSQVBISUNTX1RFWFRVUkUgPSAyOyAvLyAweDIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0FHRV9HUkFQSElDU19WRVJURVggPSA0OyAvLyAweDQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0FHRV9TQ1JJUFQgPSAxOyAvLyAweDEKQEAgLTE2MjkxLDYgKzE2NTc3LDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBbGxvY2F0aW9uLk1pcG1hcENvbnRyb2wgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24uTWlwbWFwQ29udHJvbCBNSVBNQVBfRlVMTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sIE1JUE1BUF9OT05FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uLk1pcG1hcENvbnRyb2wgTUlQTUFQX09OX1NZTkNfVE9fVEVYVFVSRTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBBbGxvY2F0aW9uQWRhcHRlciBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb24gewpAQCAtMTYzMDYsOCArMTY1OTUsMTAgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3ViRGF0YTFEKGludCwgaW50LCBzaG9ydFtdKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc3ViRGF0YTFEKGludCwgaW50LCBieXRlW10pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdWJEYXRhMUQoaW50LCBpbnQsIGZsb2F0W10pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdWJEYXRhMUQoaW50LCBpbnQsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb25BZGFwdGVyLCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdWJEYXRhMkQoaW50LCBpbnQsIGludCwgaW50LCBpbnRbXSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHN1YkRhdGEyRChpbnQsIGludCwgaW50LCBpbnQsIGZsb2F0W10pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdWJEYXRhMkQoaW50LCBpbnQsIGludCwgaW50LCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uQWRhcHRlciwgaW50LCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzdWJFbGVtZW50RGF0YShpbnQsIGludCwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmllbGRQYWNrZXIpOwogICB9CiAKQEAgLTE2NDI4LDYgKzE2NzE5LDcgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50IFU4XzQoYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50IGNyZWF0ZVBpeGVsKGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdCwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudCBjcmVhdGVWZWN0b3IoYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0LCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlLCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzQ29tcGxleCgpOwogICB9CiAKQEAgLTE2NDQxLDExICsxNjczMyw0NSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEVsZW1lbnQuRGF0YUtpbmQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhS2luZCBQSVhFTF9BOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0RFUFRIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX0w7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfTEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgUElYRUxfUkdCOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFLaW5kIFBJWEVMX1JHQkE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQgVVNFUjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRWxlbWVudC5EYXRhVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIEJPT0xFQU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgRkxPQVRfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgRkxPQVRfNjQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgTUFUUklYXzJYMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBNQVRSSVhfM1gzOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIE1BVFJJWF80WDQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfQUxMT0NBVElPTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19FTEVNRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX01FU0g7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfUFJPR1JBTV9GUkFHTUVOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1JBU1RFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBSU19QUk9HUkFNX1NUT1JFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1BST0dSQU1fVkVSVEVYOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1NBTVBMRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgUlNfU0NSSVBUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFJTX1RZUEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzE2OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFNJR05FRF8zMjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBTSUdORURfNjQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgU0lHTkVEXzg7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfMTY7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfMzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YVR5cGUgVU5TSUdORURfNF80XzRfNDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRWxlbWVudC5EYXRhVHlwZSBVTlNJR05FRF81XzVfNV8xOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzVfNl81OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzY0OworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlIFVOU0lHTkVEXzg7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgRmllbGRQYWNrZXIgewpAQCAtMTY1MDUsNiArMTY4MzEsOCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVBM0QuRW50cnlUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZpbGVBM0QuRW50cnlUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGUgTUVTSDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRmlsZUEzRC5FbnRyeVR5cGUgVU5LTk9XTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZUEzRC5JbmRleEVudHJ5IHsKQEAgLTE2NTQ5LDYgKzE2ODc3LDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRm9udC5TdHlsZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuRm9udC5TdHlsZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIEJPTEQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGUgQk9MRF9JVEFMSUM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LkZvbnQuU3R5bGUgSVRBTElDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250LlN0eWxlIE5PUk1BTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBJbnQyIHsKQEAgLTE2Njk4LDYgKzE3MDMwLDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWVzaC5QcmltaXRpdmUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBMSU5FOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBMSU5FX1NUUklQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZSBQT0lOVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgVFJJQU5HTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guUHJpbWl0aXZlIFRSSUFOR0xFX0ZBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5QcmltaXRpdmUgVFJJQU5HTEVfU1RSSVA7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB7CkBAIC0xNjczNCw2ICsxNzA3Miw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbS5UZXh0dXJlVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbS5UZXh0dXJlVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtLlRleHR1cmVUeXBlIFRFWFRVUkVfMkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0uVGV4dHVyZVR5cGUgVEVYVFVSRV9DVUJFOwogICB9CiAKICAgcHVibGljIGNsYXNzIFByb2dyYW1GcmFnbWVudCBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW0gewpAQCAtMTY3NTksMTEgKzE3MDk5LDE4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRW52TW9kZSBERUNBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUgTU9EVUxBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlIFJFUExBQ0U7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXRbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBBTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdCBMVU1JTkFOQ0VfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQgUkdCOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0IFJHQkE7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVJhc3RlciBleHRlbmRzIGFuZHJvaWQucmVuZGVyc2NyaXB0LkJhc2VPYmogewpAQCAtMTY3ODIsNiArMTcxMjksOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1SYXN0ZXIuQ3VsbE1vZGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1SYXN0ZXIuQ3VsbE1vZGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVJhc3Rlci5DdWxsTW9kZSBCQUNLOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlIEZST05UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyLkN1bGxNb2RlIE5PTkU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgUHJvZ3JhbVN0b3JlIGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9iaiB7CkBAIC0xNjc5NCwxMSArMTcxNDQsMjggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBPTkVfTUlOVVNfRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIE9ORV9NSU5VU19TUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgT05FX01JTlVTX1NSQ19DT0xPUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kRHN0RnVuYyBTUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmMgU1JDX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmREc3RGdW5jIFpFUk87CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmNbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBEU1RfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgRFNUX0NPTE9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBPTkVfTUlOVVNfRFNUX0FMUEhBOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIE9ORV9NSU5VU19EU1RfQ09MT1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgT05FX01JTlVTX1NSQ19BTFBIQTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkJsZW5kU3JjRnVuYyBTUkNfQUxQSEE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZFNyY0Z1bmMgU1JDX0FMUEhBX1NBVFVSQVRFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuQmxlbmRTcmNGdW5jIFpFUk87CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2dyYW1TdG9yZS5CdWlsZGVyIHsKQEAgLTE2ODE0LDYgKzE3MTgxLDEzIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuY1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIEFMV0FZUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBFUVVBTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBHUkVBVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIEdSRUFURVJfT1JfRVFVQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5EZXB0aEZ1bmMgTEVTUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYyBMRVNTX09SX0VRVUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtU3RvcmUuRGVwdGhGdW5jIE5PVF9FUVVBTDsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtVmVydGV4IGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbSB7CkBAIC0xNjg4OSw2ICsxNzI2Myw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVuZGVyU2NyaXB0LlByaW9yaXR5IGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5Qcmlvcml0eSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdC5Qcmlvcml0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgTE9XOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUHJpb3JpdHkgTk9STUFMOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZW5kZXJTY3JpcHQuUlNFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBqYXZhLmxhbmcuUnVubmFibGUgewpAQCAtMTY5NTEsNiArMTczMjcsMTIgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTYW1wbGVyLlZhbHVlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgQ0xBTVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNhbXBsZXIuVmFsdWUgTElORUFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUl9NSVBfTElORUFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIExJTkVBUl9NSVBfTkVBUkVTVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZSBORUFSRVNUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyLlZhbHVlIFdSQVA7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU2NyaXB0IGV4dGVuZHMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQmFzZU9iaiB7CkBAIC0xNzAzMyw2ICsxNzQxNSwxNSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFR5cGUuQ3ViZW1hcEZhY2UgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2VbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBORUdBVElWRV9YOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIE5FR0FUSVZFX1k7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgTkVHQVRJVkVfWjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZS5DdWJlbWFwRmFjZSBQT1NJVElWRV9YOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUSVZFX1k7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGUuQ3ViZW1hcEZhY2UgUE9TSVRJVkVfWjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUVkVfWDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUVkVfWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkN1YmVtYXBGYWNlIFBPU0lUVkVfWjsKICAgfQogCiB9CkBAIC0xNzA3Nyw2ICsxNzQ2OCwyOCBAQAogCiB9CiAKK3BhY2thZ2UgYW5kcm9pZC5zZWN1cml0eSB7CisKKyAgcHVibGljIGZpbmFsIGNsYXNzIEtleUNoYWluIHsKKyAgICBjdG9yIHB1YmxpYyBLZXlDaGFpbigpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIHZvaWQgY2hvb3NlUHJpdmF0ZUtleUFsaWFzKGFuZHJvaWQuYXBwLkFjdGl2aXR5LCBhbmRyb2lkLnNlY3VyaXR5LktleUNoYWluQWxpYXNDYWxsYmFjaywgamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbFtdLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGVbXSBnZXRDZXJ0aWZpY2F0ZUNoYWluKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKSB0aHJvd3MgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uLCBhbmRyb2lkLnNlY3VyaXR5LktleUNoYWluRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleSBnZXRQcml2YXRlS2V5KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKSB0aHJvd3MgamF2YS5sYW5nLkludGVycnVwdGVkRXhjZXB0aW9uLCBhbmRyb2lkLnNlY3VyaXR5LktleUNoYWluRXhjZXB0aW9uOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBLZXlDaGFpbkFsaWFzQ2FsbGJhY2sgeworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhbGlhcyhqYXZhLmxhbmcuU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBLZXlDaGFpbkV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5FeGNlcHRpb24geworICAgIGN0b3IgcHVibGljIEtleUNoYWluRXhjZXB0aW9uKCk7CisgICAgY3RvciBwdWJsaWMgS2V5Q2hhaW5FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZyk7CisgICAgY3RvciBwdWJsaWMgS2V5Q2hhaW5FeGNlcHRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlRocm93YWJsZSk7CisgICAgY3RvciBwdWJsaWMgS2V5Q2hhaW5FeGNlcHRpb24oamF2YS5sYW5nLlRocm93YWJsZSk7CisgIH0KKworfQorCiBwYWNrYWdlIGFuZHJvaWQuc2VydmljZS53YWxscGFwZXIgewogCiAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXYWxscGFwZXJTZXJ2aWNlIGV4dGVuZHMgYW5kcm9pZC5hcHAuU2VydmljZSB7CkBAIC0xNzIxNCwyMSArMTc2MjcsMjQgQEAKIAogcGFja2FnZSBhbmRyb2lkLnNwZWVjaC50dHMgewogCi0gIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTeW50aGVzaXNSZXF1ZXN0IHsKLSAgICBjdG9yIHB1YmxpYyBTeW50aGVzaXNSZXF1ZXN0KGphdmEubGFuZy5TdHJpbmcsIGFuZHJvaWQub3MuQnVuZGxlKTsKKyAgcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBTeW50aGVzaXNDYWxsYmFjayB7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBpbnQgYXVkaW9BdmFpbGFibGUoYnl0ZVtdLCBpbnQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcGxldGVBdWRpb0F2YWlsYWJsZShpbnQsIGludCwgaW50LCBieXRlW10sIGludCwgaW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGludCBkb25lKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yKCk7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWF4QnVmZmVyU2l6ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0KGludCwgaW50LCBpbnQpOworICB9CisKKyAgcHVibGljIGZpbmFsIGNsYXNzIFN5bnRoZXNpc1JlcXVlc3QgeworICAgIGN0b3IgcHVibGljIFN5bnRoZXNpc1JlcXVlc3QoamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC5vcy5CdW5kbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDb3VudHJ5KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TWF4QnVmZmVyU2l6ZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5vcy5CdW5kbGUgZ2V0UGFyYW1zKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0UGl0Y2goKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRTcGVlY2hSYXRlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmFyaWFudCgpOwotICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0KGludCwgaW50LCBpbnQpOwogICB9CiAKICAgcHVibGljIGNsYXNzIFRleHRUb1NwZWVjaCB7CkBAIC0xNzI0Niw3ICsxNzY2Miw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzU3BlYWtpbmcoKTsKICAgICBtZXRob2QgcHVibGljIGludCBwbGF5RWFyY29uKGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZz4pOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IHBsYXlTaWxlbmNlKGxvbmcsIGludCwgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZz4pOwotICAgIG1ldGhvZCBwdWJsaWMgaW50IHNldEVuZ2luZUJ5UGFja2FnZU5hbWUoamF2YS5sYW5nLlN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyBkZXByZWNhdGVkIGludCBzZXRFbmdpbmVCeVBhY2thZ2VOYW1lKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IHNldExhbmd1YWdlKGphdmEudXRpbC5Mb2NhbGUpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IHNldE9uVXR0ZXJhbmNlQ29tcGxldGVkTGlzdGVuZXIoYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaC5PblV0dGVyYW5jZUNvbXBsZXRlZExpc3RlbmVyKTsKICAgICBtZXRob2QgcHVibGljIGludCBzZXRQaXRjaChmbG9hdCk7CkBAIC0xNzMxNCw3ICsxNzczMCw3IEBACiAgICAgbWV0aG9kIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgb25Jc0xhbmd1YWdlQXZhaWxhYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IG9uTG9hZExhbmd1YWdlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblN0b3AoKTsKLSAgICBtZXRob2QgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25TeW50aGVzaXplVGV4dChhbmRyb2lkLnNwZWVjaC50dHMuU3ludGhlc2lzUmVxdWVzdCk7CisgICAgbWV0aG9kIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uU3ludGhlc2l6ZVRleHQoYW5kcm9pZC5zcGVlY2gudHRzLlN5bnRoZXNpc1JlcXVlc3QsIGFuZHJvaWQuc3BlZWNoLnR0cy5TeW50aGVzaXNDYWxsYmFjayk7CiAgIH0KIAogfQpAQCAtMTc1MjEsNiArMTc5MzcsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFNtc01lc3NhZ2UuU3VibWl0UGR1IHsKQEAgLTE3NTgxLDYgKzE4MDAyLDcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfR1BSUyA9IDE7IC8vIDB4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfVFlQRV9IU0RQQSA9IDg7IC8vIDB4OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfVFlQRV9IU1BBID0gMTA7IC8vIDB4YQorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfVFlQRV9IU1BBUCA9IDE1OyAvLyAweGYKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfSFNVUEEgPSA5OyAvLyAweDkKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfSURFTiA9IDExOyAvLyAweGIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfTFRFID0gMTM7IC8vIDB4ZApAQCAtMTc2OTIsNiArMTgxMTQsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBkZXByZWNhdGVkIGNsYXNzIFNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzc1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIENMQVNTXzE7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGVsZXBob255LmdzbS5TbXNNZXNzYWdlLk1lc3NhZ2VDbGFzcyBDTEFTU18yOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRlbGVwaG9ueS5nc20uU21zTWVzc2FnZS5NZXNzYWdlQ2xhc3MgQ0xBU1NfMzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuTWVzc2FnZUNsYXNzIFVOS05PV047CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGRlcHJlY2F0ZWQgY2xhc3MgU21zTWVzc2FnZS5TdWJtaXRQZHUgewpAQCAtMTg1MjYsNiArMTg5NTMsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIExheW91dC5BbGlnbm1lbnQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuTGF5b3V0LkFsaWdubWVudCBBTElHTl9DRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5MYXlvdXQuQWxpZ25tZW50IEFMSUdOX05PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LkxheW91dC5BbGlnbm1lbnQgQUxJR05fT1BQT1NJVEU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIExheW91dC5EaXJlY3Rpb25zIHsKQEAgLTE4NzgzLDYgKzE5MjEzLDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dFV0aWxzLlRydW5jYXRlQXQgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0LlRleHRVdGlscy5UcnVuY2F0ZUF0W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCBFTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdCBNQVJRVUVFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgTUlERExFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzLlRydW5jYXRlQXQgU1RBUlQ7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgaW50ZXJmYWNlIFRleHRXYXRjaGVyIGltcGxlbWVudHMgYW5kcm9pZC50ZXh0Lk5vQ29weVNwYW4gewpAQCAtMTkxNjgsNiArMTk2MDIsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnRleHQubWV0aG9kLlRleHRLZXlMaXN0ZW5lci5DYXBpdGFsaXplIENIQVJBQ1RFUlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgTk9ORTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC50ZXh0Lm1ldGhvZC5UZXh0S2V5TGlzdGVuZXIuQ2FwaXRhbGl6ZSBTRU5URU5DRVM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVGV4dEtleUxpc3RlbmVyLkNhcGl0YWxpemUgV09SRFM7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgVGltZUtleUxpc3RlbmVyIGV4dGVuZHMgYW5kcm9pZC50ZXh0Lm1ldGhvZC5OdW1iZXJLZXlMaXN0ZW5lciB7CkBAIC0xOTY2NSw2ICsyMDEwMyw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9ISUdIID0gMjQwOyAvLyAweGYwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVOU0lUWV9MT1cgPSAxMjA7IC8vIDB4NzgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX01FRElVTSA9IDE2MDsgLy8gMHhhMAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTlNJVFlfVFYgPSAyMTM7IC8vIDB4ZDUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX1hISUdIID0gMzIwOyAvLyAweDE0MAogICAgIGZpZWxkIHB1YmxpYyBmbG9hdCBkZW5zaXR5OwogICAgIGZpZWxkIHB1YmxpYyBpbnQgZGVuc2l0eURwaTsKQEAgLTE5NzM3LDYgKzIwMTc2LDE2IEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBKc29uVG9rZW4gZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW5bXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBCRUdJTl9BUlJBWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBCRUdJTl9PQkpFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gQk9PTEVBTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBFTkRfQVJSQVk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gRU5EX0RPQ1VNRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIEVORF9PQkpFQ1Q7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Kc29uVG9rZW4gTkFNRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBOVUxMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuSnNvblRva2VuIE5VTUJFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLkpzb25Ub2tlbiBTVFJJTkc7CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgSnNvbldyaXRlciBpbXBsZW1lbnRzIGphdmEuaW8uQ2xvc2VhYmxlIHsKQEAgLTE5ODMyLDYgKzIwMjgxLDEwIEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHByZXZpb3VzTW9udGgoKTsKICAgfQogCisgIHB1YmxpYyBjbGFzcyBOb1N1Y2hQcm9wZXJ0eUV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIHsKKyAgICBjdG9yIHB1YmxpYyBOb1N1Y2hQcm9wZXJ0eUV4Y2VwdGlvbihqYXZhLmxhbmcuU3RyaW5nKTsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBQYWlyIHsKICAgICBjdG9yIHB1YmxpYyBQYWlyKEYsIFMpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5QYWlyPEEsIEI+IGNyZWF0ZShBLCBCKTsKQEAgLTE5ODY3LDYgKzIwMzIwLDE2IEBACiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW50bG4oamF2YS5sYW5nLlN0cmluZyk7CiAgIH0KIAorICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHkgeworICAgIGN0b3IgcHVibGljIFByb3BlcnR5KGphdmEubGFuZy5DbGFzczxWPiwgamF2YS5sYW5nLlN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBWIGdldChUKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNsYXNzPFY+IGdldFR5cGUoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTxULCBWPiBvZihqYXZhLmxhbmcuQ2xhc3M8VD4sIGphdmEubGFuZy5DbGFzczxWPiwgamF2YS5sYW5nLlN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldChULCBWKTsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBTcGFyc2VBcnJheSB7CiAgICAgY3RvciBwdWJsaWMgU3BhcnNlQXJyYXkoKTsKICAgICBjdG9yIHB1YmxpYyBTcGFyc2VBcnJheShpbnQpOwpAQCAtMjAwMjYsNiArMjA0ODksMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBYbWwuRW5jb2RpbmcgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5YbWwuRW5jb2RpbmdbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyBJU09fODg1OV8xOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIFVTX0FTQ0lJOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuWG1sLkVuY29kaW5nIFVURl8xNjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlhtbC5FbmNvZGluZyBVVEZfODsKICAgfQogCiB9CkBAIC0yMDE2OCwxNyArMjA2MzUsMTUgQEAKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5KGludCwgaW50LCBpbnQsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCwgYW5kcm9pZC5ncmFwaGljcy5SZWN0KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyB2b2lkIGFwcGx5KGludCwgaW50LCBpbnQsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCwgaW50LCBpbnQsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseURpc3BsYXkoaW50LCBhbmRyb2lkLmdyYXBoaWNzLlJlY3QsIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgaW50IGdldEFic29sdXRlR3Jhdml0eShpbnQsIGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGludCBnZXRBYnNvbHV0ZUdyYXZpdHkoaW50LCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIb3Jpem9udGFsKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZlcnRpY2FsKGludCk7Ci0gICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVIgPSA4Mzg4NjEzOyAvLyAweDgwMDAwNQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfQ0xJUCA9IDg7IC8vIDB4OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfUFVMTF9BRlRFUiA9IDQ7IC8vIDB4NAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfUFVMTF9CRUZPUkUgPSAyOyAvLyAweDIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBWElTX1NQRUNJRklFRCA9IDE7IC8vIDB4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfWF9TSElGVCA9IDA7IC8vIDB4MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFYSVNfWV9TSElGVCA9IDQ7IC8vIDB4NAotICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFRk9SRSA9IDgzODg2MTE7IC8vIDB4ODAwMDAzCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gODA7IC8vIDB4NTAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRU5URVIgPSAxNzsgLy8gMHgxMQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUl9IT1JJWk9OVEFMID0gMTsgLy8gMHgxCkBAIC0yMDE4NywxNSArMjA2NTIsMTcgQEAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElQX1ZFUlRJQ0FMID0gMTI4OyAvLyAweDgwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9DTElQX0hPUklaT05UQUwgPSAxNjc3NzIxNjsgLy8gMHgxMDAwMDAwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9DTElQX1ZFUlRJQ0FMID0gMjY4NDM1NDU2OyAvLyAweDEwMDAwMDAwCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EID0gODM4ODYxMzsgLy8gMHg4MDAwMDUKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMID0gMTE5OyAvLyAweDc3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9IT1JJWk9OVEFMID0gNzsgLy8gMHg3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9WRVJUSUNBTCA9IDExMjsgLy8gMHg3MAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUxfR1JBVklUWV9NQVNLID0gNzsgLy8gMHg3CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVCA9IDM7IC8vIDB4MwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0dSQVZJVFkgPSAwOyAvLyAweDAKLSAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTiA9IDgzODg2MDg7IC8vIDB4ODAwMDAwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0sgPSA4Mzg4NjE1OyAvLyAweDgwMDAwNworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSVZFX0xBWU9VVF9ESVJFQ1RJT04gPSA4Mzg4NjA4OyAvLyAweDgwMDAwMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUID0gNTsgLy8gMHg1CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSA4Mzg4NjExOyAvLyAweDgwMDAwMwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPUCA9IDQ4OyAvLyAweDMwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUxfR1JBVklUWV9NQVNLID0gMTEyOyAvLyAweDcwCiAgIH0KQEAgLTIwNzMxLDYgKzIxMTk4LDggQEAKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgTWVudUl0ZW0geworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjb2xsYXBzZUFjdGlvblZpZXcoKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhwYW5kQWN0aW9uVmlldygpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3LlZpZXcgZ2V0QWN0aW9uVmlldygpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgY2hhciBnZXRBbHBoYWJldGljU2hvcnRjdXQoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGludCBnZXRHcm91cElkKCk7CkBAIC0yMDc0NCw2ICsyMTIxMyw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRpdGxlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRpdGxlQ29uZGVuc2VkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc1N1Yk1lbnUoKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBY3Rpb25WaWV3RXhwYW5kZWQoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDaGVja2FibGUoKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNDaGVja2VkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzRW5hYmxlZCgpOwpAQCAtMjA3NTgsMTkgKzIxMjI4LDI3IEBACiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0SWNvbihpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldEludGVudChhbmRyb2lkLmNvbnRlbnQuSW50ZW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXROdW1lcmljU2hvcnRjdXQoY2hhcik7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0T25BY3Rpb25FeHBhbmRMaXN0ZW5lcihhbmRyb2lkLnZpZXcuTWVudUl0ZW0uT25BY3Rpb25FeHBhbmRMaXN0ZW5lcik7CiAgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0T25NZW51SXRlbUNsaWNrTGlzdGVuZXIoYW5kcm9pZC52aWV3Lk1lbnVJdGVtLk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRTaG9ydGN1dChjaGFyLCBjaGFyKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0U2hvd0FzQWN0aW9uKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBhbmRyb2lkLnZpZXcuTWVudUl0ZW0gc2V0U2hvd0FzQWN0aW9uRmxhZ3MoaW50KTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRUaXRsZShqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKICAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGFuZHJvaWQudmlldy5NZW51SXRlbSBzZXRUaXRsZShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFRpdGxlQ29uZGVuc2VkKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYW5kcm9pZC52aWV3Lk1lbnVJdGVtIHNldFZpc2libGUoYm9vbGVhbik7CiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fQUxXQVlTID0gMjsgLy8gMHgyCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVcgPSA4OyAvLyAweDgKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9JRl9ST09NID0gMTsgLy8gMHgxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fTkVWRVIgPSAwOyAvLyAweDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9XX0FTX0FDVElPTl9XSVRIX1RFWFQgPSA0OyAvLyAweDQKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIE1lbnVJdGVtLk9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgeworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbk1lbnVJdGVtQWN0aW9uQ29sbGFwc2UoYW5kcm9pZC52aWV3Lk1lbnVJdGVtKTsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gb25NZW51SXRlbUFjdGlvbkV4cGFuZChhbmRyb2lkLnZpZXcuTWVudUl0ZW0pOworICB9CisKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgTWVudUl0ZW0uT25NZW51SXRlbUNsaWNrTGlzdGVuZXIgewogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBvbk1lbnVJdGVtQ2xpY2soYW5kcm9pZC52aWV3Lk1lbnVJdGVtKTsKICAgfQpAQCAtMjExNDAsMTQgKzIxNjE4LDE5IEBACiAgICAgY3RvciBwdWJsaWMgVGV4dHVyZVZpZXcoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQpOwogICAgIGN0b3IgcHVibGljIFRleHR1cmVWaWV3KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgdm9pZCBkcmF3KGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGdldEJpdG1hcCgpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXAgZ2V0Qml0bWFwKGludCwgaW50KTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwIGdldEJpdG1hcChhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlIGdldFN1cmZhY2VUZXh0dXJlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciBnZXRTdXJmYWNlVGV4dHVyZUxpc3RlbmVyKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCk7CiAgICAgbWV0aG9kIHByb3RlY3RlZCBmaW5hbCB2b2lkIG9uRHJhdyhhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIoYW5kcm9pZC52aWV3LlRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7Ci0gICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZSk7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZSwgaW50LCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmUpOwogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblN1cmZhY2VUZXh0dXJlU2l6ZUNoYW5nZWQoYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZSwgaW50LCBpbnQpOwogICB9CiAKQEAgLTIxMTkwLDYgKzIxNjczLDggQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgYnVpbGREcmF3aW5nQ2FjaGUoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgYnVpbGREcmF3aW5nQ2FjaGUoYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGJ1aWxkTGF5ZXIoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gY2FuU2Nyb2xsSG9yaXpvbnRhbGx5KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGNhblNjcm9sbFZlcnRpY2FsbHkoaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgY2FuY2VsTG9uZ1ByZXNzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGNoZWNrSW5wdXRDb25uZWN0aW9uUHJveHkoYW5kcm9pZC52aWV3LlZpZXcpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBjbGVhckFuaW1hdGlvbigpOwpAQCAtMjEyMDIsNiArMjE2ODcsNyBAQAogICAgIG1ldGhvZCBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbE9mZnNldCgpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgaW50IGNvbXB1dGVWZXJ0aWNhbFNjcm9sbFJhbmdlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY3JlYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KGFuZHJvaWQudmlldy5Db250ZXh0TWVudSk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGRlc3Ryb3lEcmF3aW5nQ2FjaGUoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgZGlzcGF0Y2hDb25maWd1cmF0aW9uQ2hhbmdlZChhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24pOwpAQCAtMjEyMzAsNiArMjE3MTYsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC52aWV3LlZpZXcgZmluZEZvY3VzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlldyBmaW5kVmlld0J5SWQoaW50KTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3IGZpbmRWaWV3V2l0aFRhZyhqYXZhLmxhbmcuT2JqZWN0KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgZmluZFZpZXdzV2l0aFRleHQoamF2YS51dGlsLkFycmF5TGlzdDxhbmRyb2lkLnZpZXcuVmlldz4sIGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgYm9vbGVhbiBmaXRTeXN0ZW1XaW5kb3dzKGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuVmlldyBmb2N1c1NlYXJjaChpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBmb3JjZUxheW91dCgpOwpAQCAtMjEyOTMsNiArMjE3ODAsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQgZ2V0UGFyZW50KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmbG9hdCBnZXRQaXZvdFgoKTsKICAgICBtZXRob2QgcHVibGljIGZsb2F0IGdldFBpdm90WSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UmlnaHQoKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGZsb2F0IGdldFJpZ2h0RmFkaW5nRWRnZVN0cmVuZ3RoKCk7CkBAIC0yMTM1OCw4ICsyMTg0Niw2IEBACiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzSW5FZGl0TW9kZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0luVG91Y2hNb2RlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UmVxdWVzdGVkKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0xvbmdDbGlja2FibGUoKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWRkaW5nT2Zmc2V0UmVxdWlyZWQoKTsKQEAgLTIxMzk4LDYgKzIxODg0LDcgQEAKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25HZW5lcmljTW90aW9uRXZlbnQoYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50KTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25Ib3ZlckV2ZW50KGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlFdmVudChhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCwgYW5kcm9pZC52aWV3LktleUV2ZW50KTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gb25LZXlMb25nUHJlc3MoaW50LCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBvbktleU11bHRpcGxlKGludCwgaW50LCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQpOwpAQCAtMjE1OTUsNiArMjIwODIsMTEgQEAKICAgICBmaWVsZCBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdIFBSRVNTRURfU0VMRUNURURfU1RBVEVfU0VUOwogICAgIGZpZWxkIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gUFJFU1NFRF9TRUxFQ1RFRF9XSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CiAgICAgZmllbGQgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBQUkVTU0VEX1dJTkRPV19GT0NVU0VEX1NUQVRFX1NFVDsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBST1RBVElPTjsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBST1RBVElPTl9YOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLlByb3BlcnR5IFJPVEFUSU9OX1k7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBhbmRyb2lkLnV0aWwuUHJvcGVydHkgU0NBTEVfWDsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBTQ0FMRV9ZOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX0lOU0VUID0gMTY3NzcyMTY7IC8vIDB4MTAwMDAwMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkgPSAwOyAvLyAweDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX09VVFNJREVfSU5TRVQgPSA1MDMzMTY0ODsgLy8gMHgzMDAwMDAwCkBAIC0yMTYwNyw5ICsyMjA5OSwxMyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVU5EX0VGRkVDVFNfRU5BQkxFRCA9IDEzNDIxNzcyODsgLy8gMHg4MDAwMDAwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0JBUl9ISURERU4gPSAxOyAvLyAweDEKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQkFSX1ZJU0lCTEUgPSAwOyAvLyAweDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBUUkFOU0xBVElPTl9YOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC51dGlsLlByb3BlcnR5IFRSQU5TTEFUSU9OX1k7CiAgICAgZmllbGQgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIFZJRVdfTE9HX1RBRyA9ICJWaWV3IjsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNJQkxFID0gMDsgLy8gMHgwCiAgICAgZmllbGQgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBXSU5ET1dfRk9DVVNFRF9TVEFURV9TRVQ7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBhbmRyb2lkLnV0aWwuUHJvcGVydHkgWDsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBZOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBWaWV3LkJhc2VTYXZlZFN0YXRlIGV4dGVuZHMgYW5kcm9pZC52aWV3LkFic1NhdmVkU3RhdGUgewpAQCAtMjE3NDQsNiArMjIyNDAsMTQgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBWaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5IaWVyYXJjaHlUcmFjZVR5cGUgQlVJTERfQ0FDSEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIERSQVc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEVfQ0hJTEQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIElOVkFMSURBVEVfQ0hJTERfSU5fUEFSRU5UOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLkhpZXJhcmNoeVRyYWNlVHlwZSBPTl9MQVlPVVQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIE9OX01FQVNVUkU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuSGllcmFyY2h5VHJhY2VUeXBlIFJFUVVFU1RfTEFZT1VUOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBWaWV3RGVidWcuSW50VG9TdHJpbmcgaW1wbGVtZW50cyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIHsKQEAgLTIxNzUyLDYgKzIyMjU2LDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgQklORF9WSUVXOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIE1PVkVfRlJPTV9BQ1RJVkVfVE9fU0NSQVBfSEVBUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC52aWV3LlZpZXdEZWJ1Zy5SZWN5Y2xlclRyYWNlVHlwZSBNT1ZFX1RPX1NDUkFQX0hFQVA7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgTkVXX1ZJRVc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudmlldy5WaWV3RGVidWcuUmVjeWNsZXJUcmFjZVR5cGUgUkVDWUNMRV9GUk9NX0FDVElWRV9IRUFQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnLlJlY3ljbGVyVHJhY2VUeXBlIFJFQ1lDTEVfRlJPTV9TQ1JBUF9IRUFQOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cCBleHRlbmRzIGFuZHJvaWQudmlldy5WaWV3IGltcGxlbWVudHMgYW5kcm9pZC52aWV3LlZpZXdNYW5hZ2VyIGFuZHJvaWQudmlldy5WaWV3UGFyZW50IHsKQEAgLTIyMjc2LDYgKzIyNzg2LDcgQEAKICAgcHVibGljIGZpbmFsIGNsYXNzIEFjY2Vzc2liaWxpdHlFdmVudCBleHRlbmRzIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlSZWNvcmQgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBhcHBlbmRSZWNvcmQoYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVJlY29yZCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZXZlbnRUeXBlVG9TdHJpbmcoaW50KTsKICAgICBtZXRob2QgcHVibGljIGxvbmcgZ2V0RXZlbnRUaW1lKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFBhY2thZ2VOYW1lKCk7CkBAIC0yMjI4Myw2ICsyMjc5NCw3IEBACiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0UmVjb3JkQ291bnQoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgaW5pdEZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCBvYnRhaW4oaW50KTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQgb2J0YWluKGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50IG9idGFpbigpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFdmVudFRpbWUobG9uZyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZShpbnQpOwpAQCAtMjIzMDIsNiArMjI4MTQsNyBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVklFV19MT05HX0NMSUNLRUQgPSAyOyAvLyAweDIKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1ZJRVdfU0VMRUNURUQgPSA0OyAvLyAweDQKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1ZJRVdfVEVYVF9DSEFOR0VEID0gMTY7IC8vIDB4MTAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQgPSAyMDQ4OyAvLyAweDgwMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQgPSAzMjsgLy8gMHgyMAogICB9CiAKQEAgLTIyMzExLDE5ICsyMjgyNCw3NyBAQAogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIHsKLSAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbz4gZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8+IGdldEVuYWJsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoaW50KTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gYWRkQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIoYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXIuQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIpOworICAgIG1ldGhvZCBwdWJsaWMgZGVwcmVjYXRlZCBqYXZhLnV0aWwuTGlzdDxhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm8+IGdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEVuYWJsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoaW50KTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBnZXRJbnN0YWxsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgaW50ZXJydXB0KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiByZW1vdmVBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcihhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlci5BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50KTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyLkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKKyAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IHZvaWQgb25BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VkKGJvb2xlYW4pOworICB9CisKKyAgcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGFkZEFjdGlvbihpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBhZGRDaGlsZChhbmRyb2lkLnZpZXcuVmlldyk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8YW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dChqYXZhLmxhbmcuU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRBY3Rpb25zKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGdldEJvdW5kc0luUGFyZW50KGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIGdldEJvdW5kc0luU2NyZWVuKGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCk7CisgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0Q2hpbGQoaW50KTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRDaGlsZENvdW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldENsYXNzTmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb24oKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0UGFja2FnZU5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbyBnZXRQYXJlbnQoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0VGV4dCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFdpbmRvd0lkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzQ2hlY2thYmxlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0NsaWNrYWJsZSgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNGb2N1c2FibGUoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzTG9uZ0NsaWNrYWJsZSgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8gb2J0YWluKGFuZHJvaWQudmlldy5WaWV3KTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8gb2J0YWluKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY3Rpb24oaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgcmVjeWNsZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRCb3VuZHNJblBhcmVudChhbmRyb2lkLmdyYXBoaWNzLlJlY3QpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRCb3VuZHNJblNjcmVlbihhbmRyb2lkLmdyYXBoaWNzLlJlY3QpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDaGVja2FibGUoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q2xpY2thYmxlKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGVzY3JpcHRpb24oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEZvY3VzYWJsZShib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Rm9jdXNlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TG9uZ0NsaWNrYWJsZShib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFBhcmVudChhbmRyb2lkLnZpZXcuVmlldyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U291cmNlKGFuZHJvaWQudmlldy5WaWV3KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VGV4dChqYXZhLmxhbmcuQ2hhclNlcXVlbmNlKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KTsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0xFQVJfRk9DVVMgPSAyOyAvLyAweDIKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0xFQVJfU0VMRUNUSU9OID0gODsgLy8gMHg4CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0ZPQ1VTID0gMTsgLy8gMHgxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NFTEVDVCA9IDQ7IC8vIDB4NAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3IgQ1JFQVRPUjsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBBY2Nlc3NpYmlsaXR5UmVjb3JkIHsKLSAgICBjdG9yIHByb3RlY3RlZCBBY2Nlc3NpYmlsaXR5UmVjb3JkKCk7Ci0gICAgbWV0aG9kIHByb3RlY3RlZCB2b2lkIGNsZWFyKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0QWRkZWRDb3VudCgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRCZWZvcmVUZXh0KCk7Ci0gICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShpbnQpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDbGFzc05hbWUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5DaGFyU2VxdWVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEl0ZW1JbmRleCgpOwpAQCAtMjIzMzEsMTEgKzIyOTAyLDE0IEBACiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgZ2V0UGFyY2VsYWJsZURhdGEoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRSZW1vdmVkQ291bnQoKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbyBnZXRTb3VyY2UoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5DaGFyU2VxdWVuY2U+IGdldFRleHQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRXaW5kb3dJZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGlzRnVsbFNjcmVlbigpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc1Bhc3N3b3JkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVJlY29yZCBvYnRhaW4oYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVJlY29yZCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eVJlY29yZCBvYnRhaW4oKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgcmVjeWNsZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRBZGRlZENvdW50KGludCk7CkBAIC0yMjM1MSwxNyArMjI5MjUsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRQYXJjZWxhYmxlRGF0YShhbmRyb2lkLm9zLlBhcmNlbGFibGUpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UmVtb3ZlZENvdW50KGludCk7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGludCBtQWRkZWRDb3VudDsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtQmVmb3JlVGV4dDsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgaW50IG1Cb29sZWFuUHJvcGVydGllczsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBtQ2xhc3NOYW1lOwotICAgIGZpZWxkIHByb3RlY3RlZCBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIG1Db250ZW50RGVzY3JpcHRpb247Ci0gICAgZmllbGQgcHJvdGVjdGVkIGludCBtQ3VycmVudEl0ZW1JbmRleDsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgaW50IG1Gcm9tSW5kZXg7Ci0gICAgZmllbGQgcHJvdGVjdGVkIGludCBtSXRlbUNvdW50OwotICAgIGZpZWxkIHByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgbVBhcmNlbGFibGVEYXRhOwotICAgIGZpZWxkIHByb3RlY3RlZCBpbnQgbVJlbW92ZWRDb3VudDsKLSAgICBmaWVsZCBwcm90ZWN0ZWQgZmluYWwgamF2YS51dGlsLkxpc3QgbVRleHQ7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFNvdXJjZShhbmRyb2lkLnZpZXcuVmlldyk7CiAgIH0KIAogfQpAQCAtMjI4NzgsNiArMjM0NDIsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc1dhdGNoaW5nQ3Vyc29yKGFuZHJvaWQudmlldy5WaWV3KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgcmVzdGFydElucHV0KGFuZHJvaWQudmlldy5WaWV3KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2VuZEFwcFByaXZhdGVDb21tYW5kKGFuZHJvaWQudmlldy5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBhbmRyb2lkLm9zLkJ1bmRsZSk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIHNldEFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVzKGFuZHJvaWQub3MuSUJpbmRlciwgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZVtdKTsKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gc2V0Q3VycmVudElucHV0TWV0aG9kU3VidHlwZShhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RTdWJ0eXBlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SW5wdXRNZXRob2QoYW5kcm9pZC5vcy5JQmluZGVyLCBqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SW5wdXRNZXRob2RBbmRTdWJ0eXBlKGFuZHJvaWQub3MuSUJpbmRlciwgamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kU3VidHlwZSk7CkBAIC0yMjkyMCw4ICsyMzQ4NSwxMSBAQAogICB9CiAKICAgcHVibGljIGZpbmFsIGNsYXNzIElucHV0TWV0aG9kU3VidHlwZSBpbXBsZW1lbnRzIGFuZHJvaWQub3MuUGFyY2VsYWJsZSB7CisgICAgY3RvciBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlKGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKTsKKyAgICBjdG9yIHB1YmxpYyBJbnB1dE1ldGhvZFN1YnR5cGUoaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBjb250YWluc0V4dHJhVmFsdWVLZXkoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXREaXNwbGF5TmFtZShhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLlN0cmluZywgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEV4dHJhVmFsdWUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RXh0cmFWYWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldEljb25SZXNJZCgpOwpAQCAtMjI5NzcsNiArMjM1NDUsMTEgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LkNvbnNvbGVNZXNzYWdlLk1lc3NhZ2VMZXZlbCBERUJVRzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuQ29uc29sZU1lc3NhZ2UuTWVzc2FnZUxldmVsIEVSUk9SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgTE9HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgVElQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5Db25zb2xlTWVzc2FnZS5NZXNzYWdlTGV2ZWwgV0FSTklORzsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBDb29raWVNYW5hZ2VyIHsKQEAgLTIzMTE3LDYgKzIzNjkwLDcgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgb25SZWNlaXZlZFRvdWNoSWNvblVybChhbmRyb2lkLndlYmtpdC5XZWJWaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgb25SZXF1ZXN0Rm9jdXMoYW5kcm9pZC53ZWJraXQuV2ViVmlldyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uU2hvd0N1c3RvbVZpZXcoYW5kcm9pZC52aWV3LlZpZXcsIGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudC5DdXN0b21WaWV3Q2FsbGJhY2spOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvblNob3dDdXN0b21WaWV3KGFuZHJvaWQudmlldy5WaWV3LCBpbnQsIGFuZHJvaWQud2Via2l0LldlYkNocm9tZUNsaWVudC5DdXN0b21WaWV3Q2FsbGJhY2spOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBpbnRlcmZhY2UgV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjayB7CkBAIC0yMzE5MSw3ICsyMzc2NSw4IEBACiAgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldFNhdmVQYXNzd29yZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgc3luY2hyb25pemVkIGphdmEubGFuZy5TdHJpbmcgZ2V0U2VyaWZGb250RmFtaWx5KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBzeW5jaHJvbml6ZWQgamF2YS5sYW5nLlN0cmluZyBnZXRTdGFuZGFyZEZvbnRGYW1pbHkoKTsKLSAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBnZXRUZXh0U2l6ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgZGVwcmVjYXRlZCBzeW5jaHJvbml6ZWQgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgZ2V0VGV4dFNpemUoKTsKKyAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VGV4dFpvb20oKTsKICAgICBtZXRob2QgcHVibGljIGRlcHJlY2F0ZWQgc3luY2hyb25pemVkIGJvb2xlYW4gZ2V0VXNlRG91YmxlVHJlZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgZGVwcmVjYXRlZCBib29sZWFuIGdldFVzZVdlYlZpZXdCYWNrZ3JvdW5kRm9yT3ZlcnNjcm9sbEJhY2tncm91bmQoKTsKICAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGdldFVzZVdpZGVWaWV3UG9ydCgpOwpAQCAtMjMyNDEsNyArMjM4MTYsOCBAQAogICAgIG1ldGhvZCBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3RhbmRhcmRGb250RmFtaWx5KGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U3VwcG9ydE11bHRpcGxlV2luZG93cyhib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3VwcG9ydFpvb20oYm9vbGVhbik7Ci0gICAgbWV0aG9kIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUZXh0U2l6ZShhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSk7CisgICAgbWV0aG9kIHB1YmxpYyBkZXByZWNhdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldFRleHRTaXplKGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplKTsKKyAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRleHRab29tKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyBkZXByZWNhdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldFVzZURvdWJsZVRyZWUoYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyBkZXByZWNhdGVkIHZvaWQgc2V0VXNlV2ViVmlld0JhY2tncm91bmRGb3JPdmVyc2Nyb2xsQmFja2dyb3VuZChib29sZWFuKTsKICAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFVzZVdpZGVWaWV3UG9ydChib29sZWFuKTsKQEAgLTIzMjU5LDI2ICsyMzgzNSw0MyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGRlcHJlY2F0ZWQgY2xhc3MgV2ViU2V0dGluZ3MuTGF5b3V0QWxnb3JpdGhtIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5MYXlvdXRBbGdvcml0aG0gTkFSUk9XX0NPTFVNTlM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBOT1JNQUw7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLkxheW91dEFsZ29yaXRobSBTSU5HTEVfQ09MVU1OOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5QbHVnaW5TdGF0ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9GRjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUGx1Z2luU3RhdGUgT047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlBsdWdpblN0YXRlIE9OX0RFTUFORDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuUmVuZGVyUHJpb3JpdHkgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBISUdIOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5SZW5kZXJQcmlvcml0eSBMT1c7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlJlbmRlclByaW9yaXR5IE5PUk1BTDsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuVGV4dFNpemUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgZGVwcmVjYXRlZCBjbGFzcyBXZWJTZXR0aW5ncy5UZXh0U2l6ZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2Via2l0LldlYlNldHRpbmdzLlRleHRTaXplIExBUkdFUjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgTEFSR0VTVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuVGV4dFNpemUgTk9STUFMOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBTTUFMTEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5UZXh0U2l6ZSBTTUFMTEVTVDsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5ab29tRGVuc2l0eVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5ab29tRGVuc2l0eSBDTE9TRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53ZWJraXQuV2ViU2V0dGluZ3MuWm9vbURlbnNpdHkgRkFSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndlYmtpdC5XZWJTZXR0aW5ncy5ab29tRGVuc2l0eSBNRURJVU07CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgV2ViU3RvcmFnZSB7CkBAIC0yNDIzNCw2ICsyNDgyNyw3IEBACiAgICAgY3RvciBwdWJsaWMgR3JpZExheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCk7CiAgICAgY3RvciBwdWJsaWMgR3JpZExheW91dChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCwgaW50KTsKICAgICBjdG9yIHB1YmxpYyBHcmlkTGF5b3V0KGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0KTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRBbGlnbm1lbnRNb2RlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRPcmllbnRhdGlvbigpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFJvd0NvdW50KCk7CkBAIC0yNDI0MSwxMiArMjQ4MzUsMTUgQEAKICAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gaXNDb2x1bW5PcmRlclByZXNlcnZlZCgpOwogICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBpc1Jvd09yZGVyUHJlc2VydmVkKCk7CiAgICAgbWV0aG9kIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4sIGludCwgaW50LCBpbnQsIGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEFsaWdubWVudE1vZGUoaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29sdW1uQ291bnQoaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29sdW1uT3JkZXJQcmVzZXJ2ZWQoYm9vbGVhbik7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE9yaWVudGF0aW9uKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJvd0NvdW50KGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJvd09yZGVyUHJlc2VydmVkKGJvb2xlYW4pOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0TWFyZ2lucyhib29sZWFuKTsKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTl9CT1VORFMgPSAwOyAvLyAweDAKKyAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTElHTl9NQVJHSU5TID0gMTsgLy8gMHgxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkFsaWdubWVudCBCQVNFTElORTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuQWxpZ25tZW50IEJPVFRPTTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuQWxpZ25tZW50IENFTlRFUjsKQEAgLTI0MjU1LDI2ICsyNDg1MiwyMCBAQAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5BbGlnbm1lbnQgTEVGVDsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuQWxpZ25tZW50IFJJR0hUOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5BbGlnbm1lbnQgVE9QOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRCA9IC0yMTQ3NDgzNjQ4OyAvLyAweDgwMDAwMDAwCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUwgPSAxOyAvLyAweDEKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgaW50ZXJmYWNlIEdyaWRMYXlvdXQuQWxpZ25tZW50IHsKLSAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGludCBnZXRBbGlnbm1lbnRWYWx1ZShhbmRyb2lkLnZpZXcuVmlldywgaW50KTsKLSAgICBtZXRob2QgcHVibGljIGFic3RyYWN0IGludCBnZXRTaXplSW5DZWxsKGFuZHJvaWQudmlldy5WaWV3LCBpbnQsIGludCk7CisgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgR3JpZExheW91dC5BbGlnbm1lbnQgeworICAgIGN0b3IgcHVibGljIEdyaWRMYXlvdXQuQWxpZ25tZW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0QWxpZ25tZW50VmFsdWUoYW5kcm9pZC52aWV3LlZpZXcsIGludCwgaW50KTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRTaXplSW5DZWxsKGFuZHJvaWQudmlldy5WaWV3LCBpbnQsIGludCwgaW50KTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpZExheW91dC5Hcm91cCB7Ci0gICAgY3RvciBwdWJsaWMgR3JpZExheW91dC5Hcm91cChhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkludGVydmFsLCBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkFsaWdubWVudCk7CiAgICAgY3RvciBwdWJsaWMgR3JpZExheW91dC5Hcm91cChpbnQsIGludCwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5BbGlnbm1lbnQpOwogICAgIGN0b3IgcHVibGljIEdyaWRMYXlvdXQuR3JvdXAoaW50LCBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkFsaWdubWVudCk7CiAgICAgZmllbGQgcHVibGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuQWxpZ25tZW50IGFsaWdubWVudDsKLSAgICBmaWVsZCBwdWJsaWMgZmluYWwgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC5JbnRlcnZhbCBzcGFuOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBHcmlkTGF5b3V0LkludGVydmFsIHsKLSAgICBjdG9yIHB1YmxpYyBHcmlkTGF5b3V0LkludGVydmFsKGludCwgaW50KTsKLSAgICBmaWVsZCBwdWJsaWMgZmluYWwgaW50IG1heDsKLSAgICBmaWVsZCBwdWJsaWMgZmluYWwgaW50IG1pbjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpZExheW91dC5MYXlvdXRQYXJhbXMgZXh0ZW5kcyBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtcyB7CkBAIC0yNDQwOCw2ICsyNDk5OSwxNCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEltYWdlVmlldy5TY2FsZVR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBDRU5URVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgQ0VOVEVSX0NST1A7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgQ0VOVEVSX0lOU0lERTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBGSVRfQ0VOVEVSOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIEZJVF9FTkQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldy5TY2FsZVR5cGUgRklUX1NUQVJUOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXcuU2NhbGVUeXBlIEZJVF9YWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3LlNjYWxlVHlwZSBNQVRSSVg7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgTGluZWFyTGF5b3V0IGV4dGVuZHMgYW5kcm9pZC52aWV3LlZpZXdHcm91cCB7CkBAIC0yNTQ3Nyw2ICsyNjA3Niw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dFZpZXcuQnVmZmVyVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlIEVESVRBQkxFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLndpZGdldC5UZXh0Vmlldy5CdWZmZXJUeXBlIE5PUk1BTDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXcuQnVmZmVyVHlwZSBTUEFOTkFCTEU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGludGVyZmFjZSBUZXh0Vmlldy5PbkVkaXRvckFjdGlvbkxpc3RlbmVyIHsKQEAgLTI4NDY4LDYgKzI5MDcwLDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGhyZWFkLlN0YXRlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgQkxPQ0tFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBORVc7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgUlVOTkFCTEU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5UaHJlYWQuU3RhdGUgVEVSTUlOQVRFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLlRocmVhZC5TdGF0ZSBUSU1FRF9XQUlUSU5HOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuVGhyZWFkLlN0YXRlIFdBSVRJTkc7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGludGVyZmFjZSBUaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHsKQEAgLTI4NjAxLDYgKzI5MjA5LDE0IEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBFbGVtZW50VHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIEFOTk9UQVRJT05fVFlQRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgQ09OU1RSVUNUT1I7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIEZJRUxEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBMT0NBTF9WQVJJQUJMRTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUgTUVUSE9EOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBQQUNLQUdFOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZSBQQVJBTUVURVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlIFRZUEU7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgSW5jb21wbGV0ZUFubm90YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiB7CkBAIC0yODYxOCw2ICsyOTIzNCw5IEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBSZXRlbnRpb25Qb2xpY3kgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5IHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5W10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSBDTEFTUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5IFJVTlRJTUU7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeSBTT1VSQ0U7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGFyZ2V0IGltcGxlbWVudHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbiB7CkBAIC0yOTAzNCw2ICsyOTY1MywxNCBAQAogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLm1hdGguUm91bmRpbmdNb2RlIHZhbHVlT2YoaW50KTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgQ0VJTElORzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBET1dOOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIEZMT09SOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm1hdGguUm91bmRpbmdNb2RlIEhBTEZfRE9XTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBIQUxGX0VWRU47CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubWF0aC5Sb3VuZGluZ01vZGUgSEFMRl9VUDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBVTk5FQ0VTU0FSWTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5tYXRoLlJvdW5kaW5nTW9kZSBVUDsKICAgfQogCiB9CkBAIC0yOTA2MCw2ICsyOTY4Nyw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXV0aGVudGljYXRvci5SZXF1ZXN0b3JUeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEubmV0LkF1dGhlbnRpY2F0b3IuUmVxdWVzdG9yVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LkF1dGhlbnRpY2F0b3IuUmVxdWVzdG9yVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5BdXRoZW50aWNhdG9yLlJlcXVlc3RvclR5cGUgUFJPWFk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEubmV0LkF1dGhlbnRpY2F0b3IuUmVxdWVzdG9yVHlwZSBTRVJWRVI7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgQmluZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbiB7CkBAIC0yOTQ3NCw2ICszMDEwMyw5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJveHkuVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLm5ldC5Qcm94eS5UeXBlIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkuVHlwZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eS5UeXBlIERJUkVDVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uZXQuUHJveHkuVHlwZSBIVFRQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5ldC5Qcm94eS5UeXBlIFNPQ0tTOwogICB9CiAKICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3h5U2VsZWN0b3IgewpAQCAtMzA4NzAsNiArMzE1MDIsOSBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEtleVJlcC5UeXBlIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNlY3VyaXR5LktleVJlcC5UeXBlW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUgUFJJVkFURTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zZWN1cml0eS5LZXlSZXAuVHlwZSBQVUJMSUM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc2VjdXJpdHkuS2V5UmVwLlR5cGUgU0VDUkVUOwogICB9CiAKICAgcHVibGljIGNsYXNzIEtleVN0b3JlIHsKQEAgLTMyMjQzLDYgKzMyODc4LDEwIEBACiAgIHB1YmxpYyBmaW5hbCBjbGFzcyBDbGllbnRJbmZvU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5DbGllbnRJbmZvU3RhdHVzW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMgUkVBU09OX1VOS05PV047CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMgUkVBU09OX1VOS05PV05fUFJPUEVSVFk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMgUkVBU09OX1ZBTFVFX0lOVkFMSUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLkNsaWVudEluZm9TdGF0dXMgUkVBU09OX1ZBTFVFX1RSVU5DQVRFRDsKICAgfQogCiAgIHB1YmxpYyBhYnN0cmFjdCBpbnRlcmZhY2UgQ2xvYiB7CkBAIC0zMjkyNyw2ICszMzU2NiwxMSBAQAogICBwdWJsaWMgZmluYWwgY2xhc3MgUm93SWRMaWZldGltZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZVtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1VOU1VQUE9SVEVEOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnNxbC5Sb3dJZExpZmV0aW1lIFJPV0lEX1ZBTElEX0ZPUkVWRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgUk9XSURfVkFMSURfT1RIRVI7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEuc3FsLlJvd0lkTGlmZXRpbWUgUk9XSURfVkFMSURfU0VTU0lPTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5zcWwuUm93SWRMaWZldGltZSBST1dJRF9WQUxJRF9UUkFOU0FDVElPTjsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBTUUxDbGllbnRJbmZvRXhjZXB0aW9uIGV4dGVuZHMgamF2YS5zcWwuU1FMRXhjZXB0aW9uIHsKQEAgLTMzNzE2LDYgKzM0MzYwLDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTm9ybWFsaXplci5Gb3JtIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0gdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudGV4dC5Ob3JtYWxpemVyLkZvcm0gTkZDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIE5GRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS50ZXh0Lk5vcm1hbGl6ZXIuRm9ybSBORktDOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnRleHQuTm9ybWFsaXplci5Gb3JtIE5GS0Q7CiAgIH0KIAogICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVtYmVyRm9ybWF0IGV4dGVuZHMgamF2YS50ZXh0LkZvcm1hdCB7CkBAIC0zNDQ1Nyw2ICszNTEwNSw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmEudXRpbC5Gb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm0gdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuRm9ybWF0dGVyLkJpZ0RlY2ltYWxMYXlvdXRGb3JtW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5Gb3JtYXR0ZXIuQmlnRGVjaW1hbExheW91dEZvcm0gREVDSU1BTF9GTE9BVDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLkZvcm1hdHRlci5CaWdEZWNpbWFsTGF5b3V0Rm9ybSBTQ0lFTlRJRklDOwogICB9CiAKICAgcHVibGljIGNsYXNzIEZvcm1hdHRlckNsb3NlZEV4Y2VwdGlvbiBleHRlbmRzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24gaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CkBAIC0zNTkwMyw2ICszNjU1MywxMyBAQAogICAgIG1ldGhvZCBwdWJsaWMgbG9uZyB0b1NlY29uZHMobG9uZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdFtdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBEQVlTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBIT1VSUzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQgTUlDUk9TRUNPTkRTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBNSUxMSVNFQ09ORFM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE1JTlVURVM7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0IE5BTk9TRUNPTkRTOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdCBTRUNPTkRTOwogICB9CiAKICAgcHVibGljIGNsYXNzIFRpbWVvdXRFeGNlcHRpb24gZXh0ZW5kcyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsKQEAgLTM4NTU5LDExICszOTIxNiwyMCBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIHZhbHVlT2YoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzW10gdmFsdWVzKCk7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBGSU5JU0hFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIE5FRURfVEFTSzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIE5FRURfVU5XUkFQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgTkVFRF9XUkFQOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMgTk9UX0hBTkRTSEFLSU5HOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTU0xFbmdpbmVSZXN1bHQuU3RhdHVzIGV4dGVuZHMgamF2YS5sYW5nLkVudW0gewogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1cyB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIGphdmF4Lm5ldC5zc2wuU1NMRW5naW5lUmVzdWx0LlN0YXR1c1tdIHZhbHVlcygpOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgQlVGRkVSX09WRVJGTE9XOworICAgIGVudW1fY29uc3RhbnQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC5TdGF0dXMgQlVGRkVSX1VOREVSRkxPVzsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIENMT1NFRDsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YXgubmV0LnNzbC5TU0xFbmdpbmVSZXN1bHQuU3RhdHVzIE9LOwogICB9CiAKICAgcHVibGljIGNsYXNzIFNTTEV4Y2VwdGlvbiBleHRlbmRzIGphdmEuaW8uSU9FeGNlcHRpb24gewpAQCAtNDEwNzcsMTEgKzQxNzQzLDE1IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvLkxheWVyVHlwZSBleHRlbmRzIGphdmEubGFuZy5FbnVtIHsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5MYXllclR5cGUgdmFsdWVPZihqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mby5MYXllclR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uTGF5ZXJUeXBlIExBWUVSRUQ7CisgICAgZW51bV9jb25zdGFudCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLkxheWVyVHlwZSBQTEFJTjsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvLlR1bm5lbFR5cGUgZXh0ZW5kcyBqYXZhLmxhbmcuRW51bSB7CiAgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uVHVubmVsVHlwZSB2YWx1ZU9mKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUuaHR0cC5jb25uLnJvdXRpbmcuUm91dGVJbmZvLlR1bm5lbFR5cGVbXSB2YWx1ZXMoKTsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uVHVubmVsVHlwZSBQTEFJTjsKKyAgICBlbnVtX2NvbnN0YW50IHB1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5Sb3V0ZUluZm8uVHVubmVsVHlwZSBUVU5ORUxMRUQ7CiAgIH0KIAogICBwdWJsaWMgZmluYWwgY2xhc3MgUm91dGVUcmFja2VyIGltcGxlbWVudHMgamF2YS5sYW5nLkNsb25lYWJsZSBvcmcuYXBhY2hlLmh0dHAuY29ubi5yb3V0aW5nLlJvdXRlSW5mbyB7CmRpZmYgLS1naXQgYS9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhIGIvY21kcy9hbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYW0vQW0uamF2YQppbmRleCAzOGNhY2RkLi40MjRiNzBhIDEwMDY0NAotLS0gYS9jbWRzL2FtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9hbS9BbS5qYXZhCisrKyBiL2NtZHMvYW0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2FtL0FtLmphdmEKQEAgLTk4LDYgKzk4LDggQEAKICAgICAgICAgICAgIHJ1blN0YXJ0KCk7CiAgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJzdGFydHNlcnZpY2UiKSkgewogICAgICAgICAgICAgcnVuU3RhcnRTZXJ2aWNlKCk7CisgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJmb3JjZS1zdG9wIikpIHsKKyAgICAgICAgICAgIHJ1bkZvcmNlU3RvcCgpOwogICAgICAgICB9IGVsc2UgaWYgKG9wLmVxdWFscygiaW5zdHJ1bWVudCIpKSB7CiAgICAgICAgICAgICBydW5JbnN0cnVtZW50KCk7CiAgICAgICAgIH0gZWxzZSBpZiAob3AuZXF1YWxzKCJicm9hZGNhc3QiKSkgewpAQCAtMzY1LDYgKzM2NywxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkZvcmNlU3RvcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtQW0uZm9yY2VTdG9wUGFja2FnZShuZXh0QXJnUmVxdWlyZWQoKSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNlbmRCcm9hZGNhc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG1ha2VJbnRlbnQoKTsKICAgICAgICAgSW50ZW50UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgSW50ZW50UmVjZWl2ZXIoKTsKQEAgLTg1MSw3ICs4NTcsNyBAQAogICAgICAgICAgICAgICAgIHdtLmNsZWFyRm9yY2VkRGlzcGxheVNpemUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIEludGVudFJlY2VpdmVyIGV4dGVuZHMgSUludGVudFJlY2VpdmVyLlN0dWIgewpAQCAtMTAxMyw2ICsxMDE5LDggQEAKICAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IGEgU2VydmljZTogYW0gc3RhcnRzZXJ2aWNlIDxJTlRFTlQ+XG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKKyAgICAgICAgICAgICAgICAiICAgIGZvcmNlIHN0b3AgZXZlcnl0aGluZyBhc3NvY2lhdGVkIHdpdGggYSBwYWNrYWdlOiBmb3JjZS1zdG9wIDxwYWNrYWdlPlxuIiArCisgICAgICAgICAgICAgICAgIlxuIiArCiAgICAgICAgICAgICAgICAgIiAgICBzZW5kIGEgYnJvYWRjYXN0IEludGVudDogYW0gYnJvYWRjYXN0IDxJTlRFTlQ+XG4iICsKICAgICAgICAgICAgICAgICAiXG4iICsKICAgICAgICAgICAgICAgICAiICAgIHN0YXJ0IGFuIEluc3RydW1lbnRhdGlvbjogYW0gaW5zdHJ1bWVudCBbZmxhZ3NdIDxDT01QT05FTlQ+XG4iICsKZGlmZiAtLWdpdCBhL2NtZHMvYm9vdGFuaW1hdGlvbi9Cb290QW5pbWF0aW9uLmNwcCBiL2NtZHMvYm9vdGFuaW1hdGlvbi9Cb290QW5pbWF0aW9uLmNwcAppbmRleCA2OWM0NTk3Li4wYWNiYThiIDEwMDY0NAotLS0gYS9jbWRzL2Jvb3RhbmltYXRpb24vQm9vdEFuaW1hdGlvbi5jcHAKKysrIGIvY21kcy9ib290YW5pbWF0aW9uL0Jvb3RBbmltYXRpb24uY3BwCkBAIC0zMTMsOSArMzEzLDYgQEAKICAgICBjb25zdCBHTGludCB5YyA9IChtSGVpZ2h0IC0gbUFuZHJvaWRbMF0uaCkgLyAyOwogICAgIGNvbnN0IFJlY3QgdXBkYXRlUmVjdCh4YywgeWMsIHhjICsgbUFuZHJvaWRbMF0udywgeWMgKyBtQW5kcm9pZFswXS5oKTsKIAotICAgIC8vIGRyYXcgYW5kIHVwZGF0ZSBvbmx5IHdoYXQgd2UgbmVlZAotICAgIG1GbGluZ2VyU3VyZmFjZS0+c2V0U3dhcFJlY3RhbmdsZSh1cGRhdGVSZWN0KTsKLQogICAgIGdsU2Npc3Nvcih1cGRhdGVSZWN0LmxlZnQsIG1IZWlnaHQgLSB1cGRhdGVSZWN0LmJvdHRvbSwgdXBkYXRlUmVjdC53aWR0aCgpLAogICAgICAgICAgICAgdXBkYXRlUmVjdC5oZWlnaHQoKSk7CiAKZGlmZiAtLWdpdCBhL2NtZHMvYnUvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2J1L0JhY2t1cC5qYXZhIGIvY21kcy9idS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvYnUvQmFja3VwLmphdmEKaW5kZXggZjNmMDQzMjYuLmU4MWY3OTkgMTAwNjQ0Ci0tLSBhL2NtZHMvYnUvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2J1L0JhY2t1cC5qYXZhCisrKyBiL2NtZHMvYnUvc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL2J1L0JhY2t1cC5qYXZhCkBAIC0zNCwxMSArMzQsMTIgQEAKICAgICBJQmFja3VwTWFuYWdlciBtQmFja3VwTWFuYWdlcjsKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiQmVnaW5uaW5nOiAiICsgYXJnc1swXSk7CiAgICAgICAgIG1BcmdzID0gYXJnczsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG5ldyBCYWNrdXAoKS5ydW4oKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHJ1bm5pbmcgYmFja3VwIiwgZSk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBydW5uaW5nIGJhY2t1cC9yZXN0b3JlIiwgZSk7CiAgICAgICAgIH0KICAgICAgICAgTG9nLmQoVEFHLCAiRmluaXNoZWQuIik7CiAgICAgfQpAQCAtNDYsNyArNDcsNyBAQAogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgbUJhY2t1cE1hbmFnZXIgPSBJQmFja3VwTWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoImJhY2t1cCIpKTsKICAgICAgICAgaWYgKG1CYWNrdXBNYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRVJST1I6IGNvdWxkIG5vdCBjb250YWN0IGJhY2t1cCBtYW5hZ2VyIik7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCBvYnRhaW4gQmFja3VwIE1hbmFnZXIgYmluZGVyIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtNTYsNyArNTcsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoInJlc3RvcmUiKSkgewogICAgICAgICAgICAgZG9GdWxsUmVzdG9yZSgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFUlJPUjogaW52YWxpZCBvcGVyYXRpb24gJyIgKyBhcmcgKyAiJyIpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBvcGVyYXRpb24gJyIgKyBhcmcgKyAiJyIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MCw3ICs4MSw2IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiLWFsbCIuZXF1YWxzKGFyZykpIHsKICAgICAgICAgICAgICAgICAgICAgZG9FdmVyeXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IHVua25vd24gYmFja3VwIGZsYWcgIiArIGFyZyk7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVua25vd24gYmFja3VwIGZsYWcgIiArIGFyZyk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTkxLDEzICs5MSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRvRXZlcnl0aGluZyAmJiBwYWNrYWdlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6IC1hbGwgdXNlZCB3aXRoIGV4cGxpY2l0IGJhY2t1cCBwYWNrYWdlIHNldCIpOwogICAgICAgICAgICAgTG9nLncoVEFHLCAiLWFsbCBwYXNzZWQgZm9yIGJhY2t1cCBhbG9uZyB3aXRoIHNwZWNpZmljIHBhY2thZ2UgbmFtZXMiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghZG9FdmVyeXRoaW5nICYmICFzYXZlU2hhcmVkICYmIHBhY2thZ2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oCi0gICAgICAgICAgICAgICAgICAgICJFUlJPUjogbm8gcGFja2FnZXMgc3VwcGxpZWQgZm9yIGJhY2t1cCBhbmQgbmVpdGhlciAtc2hhcmVkIG5vciAtYWxsIGdpdmVuIik7CiAgICAgICAgICAgICBMb2cuZShUQUcsICJubyBiYWNrdXAgcGFja2FnZXMgc3VwcGxpZWQgYW5kIG5laXRoZXIgLXNoYXJlZCBub3IgLWFsbCBnaXZlbiIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMDgsMTMgKzEwNSwyMiBAQAogICAgICAgICAgICAgbUJhY2t1cE1hbmFnZXIuZnVsbEJhY2t1cChmZCwgc2F2ZUFwa3MsIHNhdmVTaGFyZWQsIGRvRXZlcnl0aGluZywKICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMudG9BcnJheShwYWNrQXJyYXkpKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFUlJPUjogY2Fubm90IGR1cCBTeXN0ZW0ub3V0Iik7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW4ndCBkdXAgb3V0Iik7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SOiB1bmFibGUgdG8gaW52b2tlIGJhY2t1cCBtYW5hZ2VyIHNlcnZpY2UiKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBpbnZva2UgYmFja3VwIG1hbmFnZXIgZm9yIGJhY2t1cCIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvRnVsbFJlc3RvcmUoKSB7CisgICAgICAgIC8vIE5vIGFyZ3VtZW50cyB0byByZXN0b3JlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmR1cChGaWxlRGVzY3JpcHRvci5pbik7CisgICAgICAgICAgICBtQmFja3VwTWFuYWdlci5mdWxsUmVzdG9yZShmZCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbid0IGR1cCBTeXN0ZW0uaW4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlVuYWJsZSB0byBpbnZva2UgYmFja3VwIG1hbmFnZXIgZm9yIHJlc3RvcmUiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIG5leHRBcmcoKSB7CmRpZmYgLS1naXQgYS9jbWRzL2luc3RhbGxkL2NvbW1hbmRzLmMgYi9jbWRzL2luc3RhbGxkL2NvbW1hbmRzLmMKaW5kZXggOWFhNzBhNC4uZDQ1YWMxOTIgMTAwNjQ0Ci0tLSBhL2NtZHMvaW5zdGFsbGQvY29tbWFuZHMuYworKysgYi9jbWRzL2luc3RhbGxkL2NvbW1hbmRzLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogICAgIGlmIChjcmVhdGVfY2FjaGVfcGF0aChzcmNfZGV4LCBzcmMpKSByZXR1cm4gLTE7CiAgICAgaWYgKGNyZWF0ZV9jYWNoZV9wYXRoKGRzdF9kZXgsIGRzdCkpIHJldHVybiAtMTsKIAotICAgIExPR0koIm1vdmUgJXMgLT4gJXNcbiIsIHNyY19kZXgsIGRzdF9kZXgpOworICAgIExPR1YoIm1vdmUgJXMgLT4gJXNcbiIsIHNyY19kZXgsIGRzdF9kZXgpOwogICAgIGlmIChyZW5hbWUoc3JjX2RleCwgZHN0X2RleCkgPCAwKSB7CiAgICAgICAgIExPR0UoIkNvdWxkbid0IG1vdmUgJXM6ICVzXG4iLCBzcmNfZGV4LCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICBpZiAodmFsaWRhdGVfYXBrX3BhdGgocGF0aCkpIHJldHVybiAtMTsKICAgICBpZiAoY3JlYXRlX2NhY2hlX3BhdGgoZGV4X3BhdGgsIHBhdGgpKSByZXR1cm4gLTE7CiAKLSAgICBMT0dJKCJ1bmxpbmsgJXNcbiIsIGRleF9wYXRoKTsKKyAgICBMT0dWKCJ1bmxpbmsgJXNcbiIsIGRleF9wYXRoKTsKICAgICBpZiAodW5saW5rKGRleF9wYXRoKSA8IDApIHsKICAgICAgICAgTE9HRSgiQ291bGRuJ3QgdW5saW5rICVzOiAlc1xuIiwgZGV4X3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogICAgIH0KIAogICAgIGlmIChXSUZFWElURUQoc3RhdHVzKSAmJiBXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApIHsKLSAgICAgICAgTE9HRCgiRGV4SW52OiAtLS0gRU5EICclcycgKHN1Y2Nlc3MpIC0tLVxuIiwgYXBrX3BhdGgpOworICAgICAgICBMT0dWKCJEZXhJbnY6IC0tLSBFTkQgJyVzJyAoc3VjY2VzcykgLS0tXG4iLCBhcGtfcGF0aCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPR1coIkRleEludjogLS0tIEVORCAnJXMnIC0tLSBzdGF0dXM9MHglMDR4LCBwcm9jZXNzIGZhaWxlZFxuIiwKQEAgLTUxOSw3ICs1MTksNyBAQAogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgTE9HRCgiRGV4SW52OiAtLS0gQkVHSU4gJyVzJyAtLS1cbiIsIGFwa19wYXRoKTsKKyAgICBMT0dWKCJEZXhJbnY6IC0tLSBCRUdJTiAnJXMnIC0tLVxuIiwgYXBrX3BhdGgpOwogCiAgICAgcGlkX3QgcGlkOwogICAgIHBpZCA9IGZvcmsoKTsKQEAgLTU4Nyw3ICs1ODcsNyBAQAogICAgICAgICBpZiAocGF0aFtiYXNlcG9zXSA9PSAnLycpIHsKICAgICAgICAgICAgIHBhdGhbYmFzZXBvc10gPSAwOwogICAgICAgICAgICAgaWYgKGxzdGF0KHBhdGgsIHN0YXRidWYpIDwgMCkgewotICAgICAgICAgICAgICAgIExPR0koIk1ha2luZyBkaXJlY3Rvcnk6ICVzXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJNYWtpbmcgZGlyZWN0b3J5OiAlc1xuIiwgcGF0aCk7CiAgICAgICAgICAgICAgICAgaWYgKG1rZGlyKHBhdGgsIG1vZGUpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgY2hvd24ocGF0aCwgdWlkLCBnaWQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02MTksNyArNjE5LDcgQEAKICAgICBpZiAoKHN0YXRidWYtPnN0X21vZGUmU19JRkRJUikgPT0gMCkgewogICAgICAgICBta2lubmVyZGlycyhkc3RwYXRoLCBkc3RiYXNlcG9zLCBTX0lSV1hVfFNfSVJXWEd8U19JWE9USCwKICAgICAgICAgICAgICAgICBkc3R1aWQsIGRzdGdpZCwgc3RhdGJ1Zik7Ci0gICAgICAgIExPR0koIlJlbmFtaW5nICVzIHRvICVzICh1aWQgJWQpXG4iLCBzcmNwYXRoLCBkc3RwYXRoLCBkc3R1aWQpOworICAgICAgICBMT0dWKCJSZW5hbWluZyAlcyB0byAlcyAodWlkICVkKVxuIiwgc3JjcGF0aCwgZHN0cGF0aCwgZHN0dWlkKTsKICAgICAgICAgaWYgKHJlbmFtZShzcmNwYXRoLCBkc3RwYXRoKSA+PSAwKSB7CiAgICAgICAgICAgICBpZiAoY2hvd24oZHN0cGF0aCwgZHN0dWlkLCBkc3RnaWQpIDwgMCkgewogICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCBjaG93biAlczogJXNcbiIsIGRzdHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CmRpZmYgLS1naXQgYS9jbWRzL2tleXN0b3JlL0FuZHJvaWQubWsgYi9jbWRzL2tleXN0b3JlL0FuZHJvaWQubWsKaW5kZXggMTVhMTk5Zi4uNjdkZDlmOCAxMDA2NDQKLS0tIGEvY21kcy9rZXlzdG9yZS9BbmRyb2lkLm1rCisrKyBiL2NtZHMva2V5c3RvcmUvQW5kcm9pZC5tawpAQCAtMTksMTQgKzE5LDE0IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9TUkNfRklMRVMgOj0ga2V5c3RvcmUuYworTE9DQUxfU1JDX0ZJTEVTIDo9IGtleXN0b3JlLmNwcAogTE9DQUxfQ19JTkNMVURFUyA6PSBleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmNyeXB0bwogTE9DQUxfTU9EVUxFOj0ga2V5c3RvcmUKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBrZXlzdG9yZV9jbGkuYworTE9DQUxfU1JDX0ZJTEVTIDo9IGtleXN0b3JlX2NsaS5jcHAKIExPQ0FMX0NfSU5DTFVERVMgOj0gZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJjcnlwdG8KIExPQ0FMX01PRFVMRTo9IGtleXN0b3JlX2NsaQpkaWZmIC0tZ2l0IGEvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5jIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQwNTNiLi4wMDAwMDAwCi0tLSBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0KLSNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KLQotI2RlZmluZSBMT0dfVEFHICJrZXlzdG9yZSIKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQotI2luY2x1ZGUgImtleXN0b3JlLmgiCi0KLS8qIEtleVN0b3JlIGlzIGEgc2VjdXJlZCBzdG9yYWdlIGZvciBrZXktdmFsdWUgcGFpcnMuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sCi0gKiBlYWNoIGZpbGUgc3RvcmVzIG9uZSBrZXktdmFsdWUgcGFpci4gS2V5cyBhcmUgZW5jb2RlZCBpbiBmaWxlIG5hbWVzLCBhbmQKLSAqIHZhbHVlcyBhcmUgZW5jcnlwdGVkIHdpdGggY2hlY2tzdW1zLiBUaGUgZW5jcnlwdGlvbiBrZXkgaXMgcHJvdGVjdGVkIGJ5IGEKLSAqIHVzZXItZGVmaW5lZCBwYXNzd29yZC4gVG8ga2VlcCB0aGluZ3Mgc2ltcGxlLCBidWZmZXJzIGFyZSBhbHdheXMgbGFyZ2VyIHRoYW4KLSAqIHRoZSBtYXhpbXVtIHNwYWNlIHdlIG5lZWRlZCwgc28gYm91bmRhcnkgY2hlY2tzIG9uIGJ1ZmZlcnMgYXJlIG9taXR0ZWQuICovCi0KLSNkZWZpbmUgS0VZX1NJWkUgICAgICAgICgoTkFNRV9NQVggLSAxNSkgLyAyKQotI2RlZmluZSBWQUxVRV9TSVpFICAgICAgMzI3NjgKLSNkZWZpbmUgUEFTU1dPUkRfU0laRSAgIFZBTFVFX1NJWkUKLQotLyogSGVyZSBpcyB0aGUgZW5jb2Rpbmcgb2Yga2V5cy4gVGhpcyBpcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gYWxsb3cgYXJiaXRyYXJ5Ci0gKiBjaGFyYWN0ZXJzIGluIGtleXMuIENoYXJhY3RlcnMgaW4gWzAtfl0gYXJlIG5vdCBlbmNvZGVkLiBPdGhlcnMgYXJlIGVuY29kZWQKLSAqIGludG8gdHdvIGJ5dGVzLiBUaGUgZmlyc3QgYnl0ZSBpcyBvbmUgb2YgWystLl0gd2hpY2ggcmVwcmVzZW50cyB0aGUgZmlyc3QKLSAqIHR3byBiaXRzIG9mIHRoZSBjaGFyYWN0ZXIuIFRoZSBzZWNvbmQgYnl0ZSBlbmNvZGVzIHRoZSByZXN0IG9mIHRoZSBiaXRzIGludG8KLSAqIFswLW9dLiBUaGVyZWZvcmUgaW4gdGhlIHdvcnN0IGNhc2UgdGhlIGxlbmd0aCBvZiBhIGtleSBnZXRzIGRvdWJsZWQuIE5vdGUKLSAqIHRoYXQgQmFzZTY0IGNhbm5vdCBiZSB1c2VkIGhlcmUgZHVlIHRvIHRoZSBuZWVkIG9mIHByZWZpeCBtYXRjaCBvbiBrZXlzLiAqLwotCi1zdGF0aWMgaW50IGVuY29kZV9rZXkoY2hhciAqb3V0LCB1aW50OF90ICppbiwgaW50IGxlbmd0aCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSBsZW5ndGg7IGkgPiAwOyAtLWksICsraW4sICsrb3V0KSB7Ci0gICAgICAgIGlmICgqaW4gPj0gJzAnICYmICppbiA8PSAnficpIHsKLSAgICAgICAgICAgICpvdXQgPSAqaW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqb3V0ID0gJysnICsgKCppbiA+PiA2KTsKLSAgICAgICAgICAgICorK291dCA9ICcwJyArICgqaW4gJiAweDNGKTsKLSAgICAgICAgICAgICsrbGVuZ3RoOwotICAgICAgICB9Ci0gICAgfQotICAgICpvdXQgPSAwOwotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX2tleSh1aW50OF90ICpvdXQsIGNoYXIgKmluLCBpbnQgbGVuZ3RoKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSwgKytpbiwgKytvdXQpIHsKLSAgICAgICAgaWYgKCppbiA+PSAnMCcgJiYgKmluIDw9ICd+JykgewotICAgICAgICAgICAgKm91dCA9ICppbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpvdXQgPSAoKmluIC0gJysnKSA8PCA2OwotICAgICAgICAgICAgKm91dCB8PSAoKisraW4gLSAnMCcpICYgMHgzRjsKLSAgICAgICAgICAgIC0tbGVuZ3RoOwotICAgICAgICB9Ci0gICAgfQotICAgICpvdXQgPSAwOwotICAgIHJldHVybiBsZW5ndGg7Ci19Ci0KLS8qIEhlcmUgaXMgdGhlIHByb3RvY29sIHVzZWQgaW4gYm90aCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzOgotICogICAgIGNvZGUgW2xlbmd0aF8xIG1lc3NhZ2VfMSAuLi4gbGVuZ3RoX24gbWVzc2FnZV9uXSBlbmQtb2YtZmlsZQotICogd2hlcmUgY29kZSBpcyBvbmUgYnl0ZSBsb25nIGFuZCBsZW5ndGhzIGFyZSB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlcnMgaW4KLSAqIG5ldHdvcmsgb3JkZXIuIFRodXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgbWVzc2FnZSBpcyA2NTUzNSBieXRlcy4gKi8KLQotc3RhdGljIGludCB0aGVfc29ja2V0ID0gLTE7Ci0KLXN0YXRpYyBpbnQgcmVjdl9jb2RlKGludDhfdCAqY29kZSkKLXsKLSAgICByZXR1cm4gcmVjdih0aGVfc29ja2V0LCBjb2RlLCAxLCAwKSA9PSAxOwotfQotCi1zdGF0aWMgaW50IHJlY3ZfbWVzc2FnZSh1aW50OF90ICptZXNzYWdlLCBpbnQgbGVuZ3RoKQotewotICAgIHVpbnQ4X3QgYnl0ZXNbMl07Ci0gICAgaWYgKHJlY3YodGhlX3NvY2tldCwgJmJ5dGVzWzBdLCAxLCAwKSAhPSAxIHx8Ci0gICAgICAgIHJlY3YodGhlX3NvY2tldCwgJmJ5dGVzWzFdLCAxLCAwKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgb2Zmc2V0ID0gYnl0ZXNbMF0gPDwgOCB8IGJ5dGVzWzFdOwotICAgICAgICBpZiAobGVuZ3RoIDwgb2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuZ3RoID0gb2Zmc2V0OwotICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlY3YodGhlX3NvY2tldCwgJm1lc3NhZ2Vbb2Zmc2V0XSwgbGVuZ3RoIC0gb2Zmc2V0LCAwKTsKLSAgICAgICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvZmZzZXQgKz0gbjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi1zdGF0aWMgaW50IHJlY3ZfZW5kX29mX2ZpbGUoKQotewotICAgIHVpbnQ4X3QgYnl0ZTsKLSAgICByZXR1cm4gcmVjdih0aGVfc29ja2V0LCAmYnl0ZSwgMSwgMCkgPT0gMDsKLX0KLQotc3RhdGljIHZvaWQgc2VuZF9jb2RlKGludDhfdCBjb2RlKQotewotICAgIHNlbmQodGhlX3NvY2tldCwgJmNvZGUsIDEsIDApOwotfQotCi1zdGF0aWMgdm9pZCBzZW5kX21lc3NhZ2UodWludDhfdCAqbWVzc2FnZSwgaW50IGxlbmd0aCkKLXsKLSAgICB1aW50MTZfdCBieXRlcyA9IGh0b25zKGxlbmd0aCk7Ci0gICAgc2VuZCh0aGVfc29ja2V0LCAmYnl0ZXMsIDIsIDApOwotICAgIHNlbmQodGhlX3NvY2tldCwgbWVzc2FnZSwgbGVuZ3RoLCAwKTsKLX0KLQotLyogSGVyZSBpcyB0aGUgZmlsZSBmb3JtYXQuIFRoZXJlIGFyZSB0d28gcGFydHMgaW4gYmxvYi52YWx1ZSwgdGhlIHNlY3JldCBhbmQKLSAqIHRoZSBkZXNjcmlwdGlvbi4gVGhlIHNlY3JldCBpcyBzdG9yZWQgaW4gY2lwaGVydGV4dCwgYW5kIGl0cyBvcmlnaW5hbCBzaXplCi0gKiBjYW4gYmUgZm91bmQgaW4gYmxvYi5sZW5ndGguIFRoZSBkZXNjcmlwdGlvbiBpcyBzdG9yZWQgYWZ0ZXIgdGhlIHNlY3JldCBpbgotICogcGxhaW50ZXh0LCBhbmQgaXRzIHNpemUgaXMgc3BlY2lmaWVkIGluIGJsb2IuaW5mby4gVGhlIHRvdGFsIHNpemUgb2YgdGhlIHR3bwotICogcGFydHMgbXVzdCBiZSBubyBtb3JlIHRoYW4gVkFMVUVfU0laRSBieXRlcy4gVGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQotICogZmlsZSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGFyZSBhbHdheXMgc2V0IHRvIHplcm8uIEZpZWxkcyBvdGhlcgotICogdGhhbiBibG9iLmluZm8sIGJsb2IubGVuZ3RoLCBhbmQgYmxvYi52YWx1ZSBhcmUgbW9kaWZpZWQgYnkgZW5jcnlwdF9ibG9iKCkKLSAqIGFuZCBkZWNyeXB0X2Jsb2IoKS4gVGh1cyB0aGV5IHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlLiAqLwotCi1zdGF0aWMgaW50IHRoZV9lbnRyb3B5ID0gLTE7Ci0KLXN0YXRpYyBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgewotICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107Ci0gICAgdWludDhfdCBpbmZvOwotICAgIHVpbnQ4X3QgdmVjdG9yW0FFU19CTE9DS19TSVpFXTsKLSAgICB1aW50OF90IGVuY3J5cHRlZFswXTsKLSAgICB1aW50OF90IGRpZ2VzdFtNRDVfRElHRVNUX0xFTkdUSF07Ci0gICAgdWludDhfdCBkaWdlc3RlZFswXTsKLSAgICBpbnQzMl90IGxlbmd0aDsKLSAgICB1aW50OF90IHZhbHVlW1ZBTFVFX1NJWkUgKyBBRVNfQkxPQ0tfU0laRV07Ci19IGJsb2I7Ci0KLXN0YXRpYyBpbnQ4X3QgZW5jcnlwdF9ibG9iKGNoYXIgKm5hbWUsIEFFU19LRVkgKmFlc19rZXkpCi17Ci0gICAgdWludDhfdCB2ZWN0b3JbQUVTX0JMT0NLX1NJWkVdOwotICAgIGludCBsZW5ndGg7Ci0gICAgaW50IGZkOwotCi0gICAgaWYgKHJlYWQodGhlX2VudHJvcHksIGJsb2IudmVjdG9yLCBBRVNfQkxPQ0tfU0laRSkgIT0gQUVTX0JMT0NLX1NJWkUpIHsKLSAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKLSAgICB9Ci0KLSAgICBsZW5ndGggPSBibG9iLmxlbmd0aCArIChibG9iLnZhbHVlIC0gYmxvYi5lbmNyeXB0ZWQpOwotICAgIGxlbmd0aCA9IChsZW5ndGggKyBBRVNfQkxPQ0tfU0laRSAtIDEpIC8gQUVTX0JMT0NLX1NJWkUgKiBBRVNfQkxPQ0tfU0laRTsKLQotICAgIGlmIChibG9iLmluZm8gIT0gMCkgewotICAgICAgICBtZW1tb3ZlKCZibG9iLmVuY3J5cHRlZFtsZW5ndGhdLCAmYmxvYi52YWx1ZVtibG9iLmxlbmd0aF0sIGJsb2IuaW5mbyk7Ci0gICAgfQotCi0gICAgYmxvYi5sZW5ndGggPSBodG9ubChibG9iLmxlbmd0aCk7Ci0gICAgTUQ1KGJsb2IuZGlnZXN0ZWQsIGxlbmd0aCAtIChibG9iLmRpZ2VzdGVkIC0gYmxvYi5lbmNyeXB0ZWQpLCBibG9iLmRpZ2VzdCk7Ci0KLSAgICBtZW1jcHkodmVjdG9yLCBibG9iLnZlY3RvciwgQUVTX0JMT0NLX1NJWkUpOwotICAgIEFFU19jYmNfZW5jcnlwdChibG9iLmVuY3J5cHRlZCwgYmxvYi5lbmNyeXB0ZWQsIGxlbmd0aCwgYWVzX2tleSwgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICBBRVNfRU5DUllQVCk7Ci0KLSAgICBtZW1zZXQoYmxvYi5yZXNlcnZlZCwgMCwgc2l6ZW9mKGJsb2IucmVzZXJ2ZWQpKTsKLSAgICBsZW5ndGggKz0gKGJsb2IuZW5jcnlwdGVkIC0gKHVpbnQ4X3QgKikmYmxvYikgKyBibG9iLmluZm87Ci0KLSAgICBmZCA9IG9wZW4oIi50bXAiLCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFULCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgbGVuZ3RoIC09IHdyaXRlKGZkLCAmYmxvYiwgbGVuZ3RoKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgcmV0dXJuIChsZW5ndGggfHwgcmVuYW1lKCIudG1wIiwgbmFtZSkpID8gU1lTVEVNX0VSUk9SIDogTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgZGVjcnlwdF9ibG9iKGNoYXIgKm5hbWUsIEFFU19LRVkgKmFlc19rZXkpCi17Ci0gICAgaW50IGZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7Ci0gICAgaW50IGxlbmd0aDsKLQotICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICByZXR1cm4gKGVycm5vID09IEVOT0VOVCkgPyBLRVlfTk9UX0ZPVU5EIDogU1lTVEVNX0VSUk9SOwotICAgIH0KLSAgICBsZW5ndGggPSByZWFkKGZkLCAmYmxvYiwgc2l6ZW9mKGJsb2IpKTsKLSAgICBjbG9zZShmZCk7Ci0KLSAgICBsZW5ndGggLT0gKGJsb2IuZW5jcnlwdGVkIC0gKHVpbnQ4X3QgKikmYmxvYikgKyBibG9iLmluZm87Ci0gICAgaWYgKGxlbmd0aCA8IGJsb2IudmFsdWUgLSBibG9iLmVuY3J5cHRlZCB8fCBsZW5ndGggJSBBRVNfQkxPQ0tfU0laRSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBWQUxVRV9DT1JSVVBURUQ7Ci0gICAgfQotCi0gICAgQUVTX2NiY19lbmNyeXB0KGJsb2IuZW5jcnlwdGVkLCBibG9iLmVuY3J5cHRlZCwgbGVuZ3RoLCBhZXNfa2V5LAotICAgICAgICAgICAgICAgICAgICBibG9iLnZlY3RvciwgQUVTX0RFQ1JZUFQpOwotICAgIGxlbmd0aCAtPSBibG9iLmRpZ2VzdGVkIC0gYmxvYi5lbmNyeXB0ZWQ7Ci0gICAgaWYgKG1lbWNtcChibG9iLmRpZ2VzdCwgTUQ1KGJsb2IuZGlnZXN0ZWQsIGxlbmd0aCwgTlVMTCksCi0gICAgICAgICAgICAgICBNRDVfRElHRVNUX0xFTkdUSCkpIHsKLSAgICAgICAgcmV0dXJuIFZBTFVFX0NPUlJVUFRFRDsKLSAgICB9Ci0KLSAgICBsZW5ndGggLT0gYmxvYi52YWx1ZSAtIGJsb2IuZGlnZXN0ZWQ7Ci0gICAgYmxvYi5sZW5ndGggPSBudG9obChibG9iLmxlbmd0aCk7Ci0gICAgaWYgKGJsb2IubGVuZ3RoIDwgMCB8fCBibG9iLmxlbmd0aCA+IGxlbmd0aCkgewotICAgICAgICByZXR1cm4gVkFMVUVfQ09SUlVQVEVEOwotICAgIH0KLSAgICBpZiAoYmxvYi5pbmZvICE9IDApIHsKLSAgICAgICAgbWVtbW92ZSgmYmxvYi52YWx1ZVtibG9iLmxlbmd0aF0sICZibG9iLnZhbHVlW2xlbmd0aF0sIGJsb2IuaW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyogSGVyZSBhcmUgdGhlIGFjdGlvbnMuIEVhY2ggb2YgdGhlbSBpcyBhIGZ1bmN0aW9uIHdpdGhvdXQgYXJndW1lbnRzLiBBbGwKLSAqIGluZm9ybWF0aW9uIGlzIGRlZmluZWQgaW4gZ2xvYmFsIHZhcmlhYmxlcywgd2hpY2ggYXJlIHNldCBwcm9wZXJseSBiZWZvcmUKLSAqIHBlcmZvcm1pbmcgYW4gYWN0aW9uLiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgcmVxdWlyZWQgYnkgZWFjaCBhY3Rpb24gaXMKLSAqIGZpeGVkIGFuZCBkZWZpbmVkIGluIGEgdGFibGUuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4gYWN0aW9uIGlzIHBvc2l0aXZlLAotICogaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVzcG9uc2UgY29kZSBhbmQgdHJhbnNtaXR0ZWQgdG8gdGhlIGNsaWVudC4gTm90ZQotICogdGhhdCB0aGUgbGVuZ3RocyBvZiBwYXJhbWV0ZXJzIGFyZSBjaGVja2VkIHdoZW4gdGhleSBhcmUgcmVjZWl2ZWQsIHNvCi0gKiBib3VuZGFyeSBjaGVja3Mgb24gcGFyYW1ldGVycyBhcmUgb21pdHRlZC4gKi8KLQotI2RlZmluZSBNQVhfUEFSQU0gICAyCi0jZGVmaW5lIE1BWF9SRVRSWSAgIDQKLQotc3RhdGljIHVpZF90IHVpZCA9IC0xOwotc3RhdGljIGludDhfdCBzdGF0ZSA9IFVOSU5JVElBTElaRUQ7Ci1zdGF0aWMgaW50OF90IHJldHJ5ID0gTUFYX1JFVFJZOwotCi1zdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgbGVuZ3RoOwotICAgIHVpbnQ4X3QgdmFsdWVbVkFMVUVfU0laRV07Ci19IHBhcmFtc1tNQVhfUEFSQU1dOwotCi1zdGF0aWMgQUVTX0tFWSBlbmNyeXB0aW9uX2tleTsKLXN0YXRpYyBBRVNfS0VZIGRlY3J5cHRpb25fa2V5OwotCi1zdGF0aWMgaW50OF90IHRlc3QoKQotewotICAgIHJldHVybiBzdGF0ZTsKLX0KLQotc3RhdGljIGludDhfdCBnZXQoKQotewotICAgIGNoYXIgbmFtZVtOQU1FX01BWF07Ci0gICAgaW50IG4gPSBzcHJpbnRmKG5hbWUsICIldV8iLCB1aWQpOwotICAgIGVuY29kZV9rZXkoJm5hbWVbbl0sIHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCk7Ci0gICAgbiA9IGRlY3J5cHRfYmxvYihuYW1lLCAmZGVjcnlwdGlvbl9rZXkpOwotICAgIGlmIChuICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLSAgICBzZW5kX2NvZGUoTk9fRVJST1IpOwotICAgIHNlbmRfbWVzc2FnZShibG9iLnZhbHVlLCBibG9iLmxlbmd0aCk7Ci0gICAgcmV0dXJuIC1OT19FUlJPUjsKLX0KLQotc3RhdGljIGludDhfdCBpbnNlcnQoKQotewotICAgIGNoYXIgbmFtZVtOQU1FX01BWF07Ci0gICAgaW50IG4gPSBzcHJpbnRmKG5hbWUsICIldV8iLCB1aWQpOwotICAgIGVuY29kZV9rZXkoJm5hbWVbbl0sIHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCk7Ci0gICAgYmxvYi5pbmZvID0gMDsKLSAgICBibG9iLmxlbmd0aCA9IHBhcmFtc1sxXS5sZW5ndGg7Ci0gICAgbWVtY3B5KGJsb2IudmFsdWUsIHBhcmFtc1sxXS52YWx1ZSwgcGFyYW1zWzFdLmxlbmd0aCk7Ci0gICAgcmV0dXJuIGVuY3J5cHRfYmxvYihuYW1lLCAmZW5jcnlwdGlvbl9rZXkpOwotfQotCi1zdGF0aWMgaW50OF90IGRlbGV0ZSgpCi17Ci0gICAgY2hhciBuYW1lW05BTUVfTUFYXTsKLSAgICBpbnQgbiA9IHNwcmludGYobmFtZSwgIiV1XyIsIHVpZCk7Ci0gICAgZW5jb2RlX2tleSgmbmFtZVtuXSwgcGFyYW1zWzBdLnZhbHVlLCBwYXJhbXNbMF0ubGVuZ3RoKTsKLSAgICByZXR1cm4gKHVubGluayhuYW1lKSAmJiBlcnJubyAhPSBFTk9FTlQpID8gU1lTVEVNX0VSUk9SIDogTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgZXhpc3QoKQotewotICAgIGNoYXIgbmFtZVtOQU1FX01BWF07Ci0gICAgaW50IG4gPSBzcHJpbnRmKG5hbWUsICIldV8iLCB1aWQpOwotICAgIGVuY29kZV9rZXkoJm5hbWVbbl0sIHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCk7Ci0gICAgaWYgKGFjY2VzcyhuYW1lLCBSX09LKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gKGVycm5vICE9IEVOT0VOVCkgPyBTWVNURU1fRVJST1IgOiBLRVlfTk9UX0ZPVU5EOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXRpYyBpbnQ4X3Qgc2F3KCkKLXsKLSAgICBESVIgKmRpciA9IG9wZW5kaXIoIi4iKTsKLSAgICBzdHJ1Y3QgZGlyZW50ICpmaWxlOwotICAgIGNoYXIgbmFtZVtOQU1FX01BWF07Ci0gICAgaW50IG47Ci0KLSAgICBpZiAoIWRpcikgewotICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOwotICAgIH0KLSAgICBuID0gc3ByaW50ZihuYW1lLCAiJXVfIiwgdWlkKTsKLSAgICBuICs9IGVuY29kZV9rZXkoJm5hbWVbbl0sIHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCk7Ci0gICAgc2VuZF9jb2RlKE5PX0VSUk9SKTsKLSAgICB3aGlsZSAoKGZpbGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKG5hbWUsIGZpbGUtPmRfbmFtZSwgbikpIHsKLSAgICAgICAgICAgIGNoYXIgKnAgPSAmZmlsZS0+ZF9uYW1lW25dOwotICAgICAgICAgICAgcGFyYW1zWzBdLmxlbmd0aCA9IGRlY29kZV9rZXkocGFyYW1zWzBdLnZhbHVlLCBwLCBzdHJsZW4ocCkpOwotICAgICAgICAgICAgc2VuZF9tZXNzYWdlKHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY2xvc2VkaXIoZGlyKTsKLSAgICByZXR1cm4gLU5PX0VSUk9SOwotfQotCi1zdGF0aWMgaW50OF90IHJlc2V0KCkKLXsKLSAgICBESVIgKmRpciA9IG9wZW5kaXIoIi4iKTsKLSAgICBzdHJ1Y3QgZGlyZW50ICpmaWxlOwotCi0gICAgbWVtc2V0KCZlbmNyeXB0aW9uX2tleSwgMCwgc2l6ZW9mKGVuY3J5cHRpb25fa2V5KSk7Ci0gICAgbWVtc2V0KCZkZWNyeXB0aW9uX2tleSwgMCwgc2l6ZW9mKGRlY3J5cHRpb25fa2V5KSk7Ci0gICAgc3RhdGUgPSBVTklOSVRJQUxJWkVEOwotICAgIHJldHJ5ID0gTUFYX1JFVFJZOwotCi0gICAgaWYgKCFkaXIpIHsKLSAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKLSAgICB9Ci0gICAgd2hpbGUgKChmaWxlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7Ci0gICAgICAgIHVubGluayhmaWxlLT5kX25hbWUpOwotICAgIH0KLSAgICBjbG9zZWRpcihkaXIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotI2RlZmluZSBNQVNURVJfS0VZX0ZJTEUgIi5tYXN0ZXJrZXkiCi0jZGVmaW5lIE1BU1RFUl9LRVlfU0laRSAxNgotI2RlZmluZSBTQUxUX1NJWkUgICAgICAgMTYKLQotc3RhdGljIHZvaWQgc2V0X2tleSh1aW50OF90ICprZXksIHVpbnQ4X3QgKnBhc3N3b3JkLCBpbnQgbGVuZ3RoLCB1aW50OF90ICpzYWx0KQotewotICAgIGlmIChzYWx0KSB7Ci0gICAgICAgIFBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEoKGNoYXIgKilwYXNzd29yZCwgbGVuZ3RoLCBzYWx0LCBTQUxUX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE5MiwgTUFTVEVSX0tFWV9TSVpFLCBrZXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEoKGNoYXIgKilwYXNzd29yZCwgbGVuZ3RoLCAodWludDhfdCAqKSJrZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJrZXlzdG9yZSIpLCAxMDI0LCBNQVNURVJfS0VZX1NJWkUsIGtleSk7Ci0gICAgfQotfQotCi0vKiBIZXJlIGlzIHRoZSBoaXN0b3J5LiBUbyBpbXByb3ZlIHRoZSBzZWN1cml0eSwgdGhlIHBhcmFtZXRlcnMgdG8gZ2VuZXJhdGUgdGhlCi0gKiBtYXN0ZXIga2V5IGhhcyBiZWVuIGNoYW5nZWQuIFRvIG1ha2UgYSBzZWFtbGVzcyB0cmFuc2l0aW9uLCB3ZSB1cGRhdGUgdGhlCi0gKiBmaWxlIHVzaW5nIHRoZSBzYW1lIHBhc3N3b3JkIHdoZW4gdGhlIHVzZXIgdW5sb2NrIGl0IGZvciB0aGUgZmlyc3QgdGltZS4gSWYKLSAqIGFueSB0aGluZyBnb2VzIHdyb25nIGR1cmluZyB0aGUgdHJhbnNpdGlvbiwgdGhlIG5ldyBmaWxlIHdpbGwgbm90IG92ZXJ3cml0ZQotICogdGhlIG9sZCBvbmUuIFRoaXMgYXZvaWRzIHBlcm1hbmVudCBkYW1hZ2VzIG9mIHRoZSBleGlzdGluZyBkYXRhLiAqLwotCi1zdGF0aWMgaW50OF90IHBhc3N3b3JkKCkKLXsKLSAgICB1aW50OF90IGtleVtNQVNURVJfS0VZX1NJWkVdOwotICAgIEFFU19LRVkgYWVzX2tleTsKLSAgICBpbnQ4X3QgcmVzcG9uc2UgPSBTWVNURU1fRVJST1I7Ci0KLSAgICBpZiAoc3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICBpZiAocmVhZCh0aGVfZW50cm9weSwgYmxvYi52YWx1ZSwgTUFTVEVSX0tFWV9TSVpFKSAhPSBNQVNURVJfS0VZX1NJWkUpIHsKLSAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBmZCA9IG9wZW4oTUFTVEVSX0tFWV9GSUxFLCBPX1JET05MWSk7Ci0gICAgICAgIHVpbnQ4X3QgKnNhbHQgPSBOVUxMOwotICAgICAgICBpZiAoZmQgIT0gLTEpIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSByZWFkKGZkLCAmYmxvYiwgc2l6ZW9mKGJsb2IpKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiBTQUxUX1NJWkUgJiYgYmxvYi5pbmZvID09IFNBTFRfU0laRSkgewotICAgICAgICAgICAgICAgIHNhbHQgPSAodWludDhfdCAqKSZibG9iICsgbGVuZ3RoIC0gU0FMVF9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2V0X2tleShrZXksIHBhcmFtc1swXS52YWx1ZSwgcGFyYW1zWzBdLmxlbmd0aCwgc2FsdCk7Ci0gICAgICAgIEFFU19zZXRfZGVjcnlwdF9rZXkoa2V5LCBNQVNURVJfS0VZX1NJWkUgKiA4LCAmYWVzX2tleSk7Ci0gICAgICAgIHJlc3BvbnNlID0gZGVjcnlwdF9ibG9iKE1BU1RFUl9LRVlfRklMRSwgJmFlc19rZXkpOwotICAgICAgICBpZiAocmVzcG9uc2UgPT0gU1lTVEVNX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNwb25zZSAhPSBOT19FUlJPUiB8fCBibG9iLmxlbmd0aCAhPSBNQVNURVJfS0VZX1NJWkUpIHsKLSAgICAgICAgICAgIGlmIChyZXRyeSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzZXQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5JTklUSUFMSVpFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBXUk9OR19QQVNTV09SRCArIC0tcmV0cnk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXNhbHQgJiYgcGFyYW1zWzFdLmxlbmd0aCA9PSAtMSkgewotICAgICAgICAgICAgcGFyYW1zWzFdID0gcGFyYW1zWzBdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBhcmFtc1sxXS5sZW5ndGggPT0gLTEpIHsKLSAgICAgICAgbWVtY3B5KGtleSwgYmxvYi52YWx1ZSwgTUFTVEVSX0tFWV9TSVpFKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50OF90ICpzYWx0ID0gJmJsb2IudmFsdWVbTUFTVEVSX0tFWV9TSVpFXTsKLSAgICAgICAgaWYgKHJlYWQodGhlX2VudHJvcHksIHNhbHQsIFNBTFRfU0laRSkgIT0gU0FMVF9TSVpFKSB7Ci0gICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0X2tleShrZXksIHBhcmFtc1sxXS52YWx1ZSwgcGFyYW1zWzFdLmxlbmd0aCwgc2FsdCk7Ci0gICAgICAgIEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5LCBNQVNURVJfS0VZX1NJWkUgKiA4LCAmYWVzX2tleSk7Ci0gICAgICAgIG1lbWNweShrZXksIGJsb2IudmFsdWUsIE1BU1RFUl9LRVlfU0laRSk7Ci0gICAgICAgIGJsb2IuaW5mbyA9IFNBTFRfU0laRTsKLSAgICAgICAgYmxvYi5sZW5ndGggPSBNQVNURVJfS0VZX1NJWkU7Ci0gICAgICAgIHJlc3BvbnNlID0gZW5jcnlwdF9ibG9iKE1BU1RFUl9LRVlfRklMRSwgJmFlc19rZXkpOwotICAgIH0KLQotICAgIGlmIChyZXNwb25zZSA9PSBOT19FUlJPUikgewotICAgICAgICBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgTUFTVEVSX0tFWV9TSVpFICogOCwgJmVuY3J5cHRpb25fa2V5KTsKLSAgICAgICAgQUVTX3NldF9kZWNyeXB0X2tleShrZXksIE1BU1RFUl9LRVlfU0laRSAqIDgsICZkZWNyeXB0aW9uX2tleSk7Ci0gICAgICAgIHN0YXRlID0gTk9fRVJST1I7Ci0gICAgICAgIHJldHJ5ID0gTUFYX1JFVFJZOwotICAgIH0KLSAgICByZXR1cm4gcmVzcG9uc2U7Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgbG9jaygpCi17Ci0gICAgbWVtc2V0KCZlbmNyeXB0aW9uX2tleSwgMCwgc2l6ZW9mKGVuY3J5cHRpb25fa2V5KSk7Ci0gICAgbWVtc2V0KCZkZWNyeXB0aW9uX2tleSwgMCwgc2l6ZW9mKGRlY3J5cHRpb25fa2V5KSk7Ci0gICAgc3RhdGUgPSBMT0NLRUQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgaW50OF90IHVubG9jaygpCi17Ci0gICAgcGFyYW1zWzFdLmxlbmd0aCA9IC0xOwotICAgIHJldHVybiBwYXNzd29yZCgpOwotfQotCi0vKiBIZXJlIGFyZSB0aGUgcGVybWlzc2lvbnMsIGFjdGlvbnMsIHVzZXJzLCBhbmQgdGhlIG1haW4gZnVuY3Rpb24uICovCi0KLWVudW0gcGVybSB7Ci0gICAgVEVTVCAgICAgPSAgIDEsCi0gICAgR0VUICAgICAgPSAgIDIsCi0gICAgSU5TRVJUICAgPSAgIDQsCi0gICAgREVMRVRFICAgPSAgIDgsCi0gICAgRVhJU1QgICAgPSAgMTYsCi0gICAgU0FXICAgICAgPSAgMzIsCi0gICAgUkVTRVQgICAgPSAgNjQsCi0gICAgUEFTU1dPUkQgPSAxMjgsCi0gICAgTE9DSyAgICAgPSAyNTYsCi0gICAgVU5MT0NLICAgPSA1MTIsCi19OwotCi1zdGF0aWMgc3RydWN0IGFjdGlvbiB7Ci0gICAgaW50OF90ICgqcnVuKSgpOwotICAgIGludDhfdCBjb2RlOwotICAgIGludDhfdCBzdGF0ZTsKLSAgICB1aW50MzJfdCBwZXJtOwotICAgIGludCBsZW5ndGhzW01BWF9QQVJBTV07Ci19IGFjdGlvbnNbXSA9IHsKLSAgICB7dGVzdCwgICAgICd0JywgMCwgICAgICAgIFRFU1QsICAgICB7MH19LAotICAgIHtnZXQsICAgICAgJ2cnLCBOT19FUlJPUiwgR0VULCAgICAgIHtLRVlfU0laRX19LAotICAgIHtpbnNlcnQsICAgJ2knLCBOT19FUlJPUiwgSU5TRVJULCAgIHtLRVlfU0laRSwgVkFMVUVfU0laRX19LAotICAgIHtkZWxldGUsICAgJ2QnLCAwLCAgICAgICAgREVMRVRFLCAgIHtLRVlfU0laRX19LAotICAgIHtleGlzdCwgICAgJ2UnLCAwLCAgICAgICAgRVhJU1QsICAgIHtLRVlfU0laRX19LAotICAgIHtzYXcsICAgICAgJ3MnLCAwLCAgICAgICAgU0FXLCAgICAgIHtLRVlfU0laRX19LAotICAgIHtyZXNldCwgICAgJ3InLCAwLCAgICAgICAgUkVTRVQsICAgIHswfX0sCi0gICAge3Bhc3N3b3JkLCAncCcsIDAsICAgICAgICBQQVNTV09SRCwge1BBU1NXT1JEX1NJWkUsIFBBU1NXT1JEX1NJWkV9fSwKLSAgICB7bG9jaywgICAgICdsJywgTk9fRVJST1IsIExPQ0ssICAgICB7MH19LAotICAgIHt1bmxvY2ssICAgJ3UnLCBMT0NLRUQsICAgVU5MT0NLLCAgIHtQQVNTV09SRF9TSVpFfX0sCi0gICAge05VTEwsICAgICAgMCAsIDAsICAgICAgICAwLCAgICAgICAgezB9fSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNlciB7Ci0gICAgdWlkX3QgdWlkOwotICAgIHVpZF90IGV1aWQ7Ci0gICAgdWludDMyX3QgcGVybXM7Ci19IHVzZXJzW10gPSB7Ci0gICAge0FJRF9TWVNURU0sICAgfjAsICAgICAgICAgfkdFVH0sCi0gICAge0FJRF9WUE4sICAgICAgQUlEX1NZU1RFTSwgR0VUfSwKLSAgICB7QUlEX1dJRkksICAgICBBSURfU1lTVEVNLCBHRVR9LAotICAgIHtBSURfUk9PVCwgICAgIEFJRF9TWVNURU0sIEdFVH0sCi0gICAge0FJRF9LRVlDSEFJTiwgQUlEX1NZU1RFTSwgVEVTVCB8IEdFVCB8IFNBV30sCi0gICAge34wLCAgICAgICAgICAgfjAsICAgICAgICAgVEVTVCB8IEdFVCB8IElOU0VSVCB8IERFTEVURSB8IEVYSVNUIHwgU0FXfSwKLX07Ci0KLXN0YXRpYyBpbnQ4X3QgcHJvY2VzcyhpbnQ4X3QgY29kZSkgewotICAgIHN0cnVjdCB1c2VyICp1c2VyID0gdXNlcnM7Ci0gICAgc3RydWN0IGFjdGlvbiAqYWN0aW9uID0gYWN0aW9uczsKLSAgICBpbnQgaTsKLQotICAgIHdoaWxlICh+dXNlci0+dWlkICYmIHVzZXItPnVpZCAhPSB1aWQpIHsKLSAgICAgICAgKyt1c2VyOwotICAgIH0KLSAgICB3aGlsZSAoYWN0aW9uLT5jb2RlICYmIGFjdGlvbi0+Y29kZSAhPSBjb2RlKSB7Ci0gICAgICAgICsrYWN0aW9uOwotICAgIH0KLSAgICBpZiAoIWFjdGlvbi0+Y29kZSkgewotICAgICAgICByZXR1cm4gVU5ERUZJTkVEX0FDVElPTjsKLSAgICB9Ci0gICAgaWYgKCEoYWN0aW9uLT5wZXJtICYgdXNlci0+cGVybXMpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0gICAgaWYgKGFjdGlvbi0+c3RhdGUgJiYgYWN0aW9uLT5zdGF0ZSAhPSBzdGF0ZSkgewotICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgfQotICAgIGlmICh+dXNlci0+ZXVpZCkgewotICAgICAgICB1aWQgPSB1c2VyLT5ldWlkOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1BBUkFNICYmIGFjdGlvbi0+bGVuZ3Roc1tpXTsgKytpKSB7Ci0gICAgICAgIHBhcmFtc1tpXS5sZW5ndGggPSByZWN2X21lc3NhZ2UocGFyYW1zW2ldLnZhbHVlLCBhY3Rpb24tPmxlbmd0aHNbaV0pOwotICAgICAgICBpZiAocGFyYW1zW2ldLmxlbmd0aCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIFBST1RPQ09MX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghcmVjdl9lbmRfb2ZfZmlsZSgpKSB7Ci0gICAgICAgIHJldHVybiBQUk9UT0NPTF9FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIGFjdGlvbi0+cnVuKCk7Ci19Ci0KLSNkZWZpbmUgUkFORE9NX0RFVklDRSAgICIvZGV2L3VyYW5kb20iCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgY29udHJvbF9zb2NrZXQgPSBhbmRyb2lkX2dldF9jb250cm9sX3NvY2tldCgia2V5c3RvcmUiKTsKLSAgICBpZiAoYXJnYyA8IDIpIHsKLSAgICAgICAgTE9HRSgiQSBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQhIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoY2hkaXIoYXJndlsxXSkgPT0gLTEpIHsKLSAgICAgICAgTE9HRSgiY2hkaXI6ICVzOiAlcyIsIGFyZ3ZbMV0sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoKHRoZV9lbnRyb3B5ID0gb3BlbihSQU5ET01fREVWSUNFLCBPX1JET05MWSkpID09IC0xKSB7Ci0gICAgICAgIExPR0UoIm9wZW46ICVzOiAlcyIsIFJBTkRPTV9ERVZJQ0UsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAobGlzdGVuKGNvbnRyb2xfc29ja2V0LCAzKSA9PSAtMSkgewotICAgICAgICBMT0dFKCJsaXN0ZW46ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotICAgIGlmIChhY2Nlc3MoTUFTVEVSX0tFWV9GSUxFLCBSX09LKSA9PSAwKSB7Ci0gICAgICAgIHN0YXRlID0gTE9DS0VEOwotICAgIH0KLQotICAgIHdoaWxlICgodGhlX3NvY2tldCA9IGFjY2VwdChjb250cm9sX3NvY2tldCwgTlVMTCwgMCkpICE9IC0xKSB7Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2ID0gey50dl9zZWMgPSAzfTsKLSAgICAgICAgc3RydWN0IHVjcmVkIGNyZWQ7Ci0gICAgICAgIHNvY2tsZW5fdCBzaXplID0gc2l6ZW9mKGNyZWQpOwotICAgICAgICBpbnQ4X3QgcmVxdWVzdDsKLQotICAgICAgICBzZXRzb2Nrb3B0KHRoZV9zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAmdHYsIHNpemVvZih0dikpOwotICAgICAgICBzZXRzb2Nrb3B0KHRoZV9zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAmdHYsIHNpemVvZih0dikpOwotCi0gICAgICAgIGlmIChnZXRzb2Nrb3B0KHRoZV9zb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1BFRVJDUkVELCAmY3JlZCwgJnNpemUpKSB7Ci0gICAgICAgICAgICBMT0dXKCJnZXRzb2Nrb3B0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVjdl9jb2RlKCZyZXF1ZXN0KSkgewotICAgICAgICAgICAgaW50OF90IG9sZF9zdGF0ZSA9IHN0YXRlOwotICAgICAgICAgICAgaW50OF90IHJlc3BvbnNlOwotICAgICAgICAgICAgdWlkID0gY3JlZC51aWQ7Ci0KLSAgICAgICAgICAgIGlmICgocmVzcG9uc2UgPSBwcm9jZXNzKHJlcXVlc3QpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzZW5kX2NvZGUocmVzcG9uc2UpOwotICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gLXJlc3BvbnNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMT0dJKCJ1aWQ6ICVkIGFjdGlvbjogJWMgLT4gJWQgc3RhdGU6ICVkIC0+ICVkIHJldHJ5OiAlZCIsCi0gICAgICAgICAgICAgICAgIGNyZWQudWlkLCByZXF1ZXN0LCAtcmVzcG9uc2UsIG9sZF9zdGF0ZSwgc3RhdGUsIHJldHJ5KTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZSh0aGVfc29ja2V0KTsKLSAgICB9Ci0gICAgTE9HRSgiYWNjZXB0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9jbWRzL2tleXN0b3JlL2tleXN0b3JlLmNwcCBiL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OGJlNmVmCi0tLSAvZGV2L251bGwKKysrIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5jcHAKQEAgLTAsMCArMSw4MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCisjZGVmaW5lIExPR19UQUcgImtleXN0b3JlIgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvc29ja2V0cy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCisjaW5jbHVkZSAia2V5c3RvcmUuaCIKKworLyogS2V5U3RvcmUgaXMgYSBzZWN1cmVkIHN0b3JhZ2UgZm9yIGtleS12YWx1ZSBwYWlycy4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKKyAqIGVhY2ggZmlsZSBzdG9yZXMgb25lIGtleS12YWx1ZSBwYWlyLiBLZXlzIGFyZSBlbmNvZGVkIGluIGZpbGUgbmFtZXMsIGFuZAorICogdmFsdWVzIGFyZSBlbmNyeXB0ZWQgd2l0aCBjaGVja3N1bXMuIFRoZSBlbmNyeXB0aW9uIGtleSBpcyBwcm90ZWN0ZWQgYnkgYQorICogdXNlci1kZWZpbmVkIHBhc3N3b3JkLiBUbyBrZWVwIHRoaW5ncyBzaW1wbGUsIGJ1ZmZlcnMgYXJlIGFsd2F5cyBsYXJnZXIgdGhhbgorICogdGhlIG1heGltdW0gc3BhY2Ugd2UgbmVlZGVkLCBzbyBib3VuZGFyeSBjaGVja3Mgb24gYnVmZmVycyBhcmUgb21pdHRlZC4gKi8KKworI2RlZmluZSBLRVlfU0laRSAgICAgICAgKChOQU1FX01BWCAtIDE1KSAvIDIpCisjZGVmaW5lIFZBTFVFX1NJWkUgICAgICAzMjc2OAorI2RlZmluZSBQQVNTV09SRF9TSVpFICAgVkFMVUVfU0laRQorCitzdHJ1Y3QgVmFsdWUgeworICAgIGludCBsZW5ndGg7CisgICAgdWludDhfdCB2YWx1ZVtWQUxVRV9TSVpFXTsKK307CisKKy8qIEhlcmUgaXMgdGhlIGVuY29kaW5nIG9mIGtleXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGFsbG93IGFyYml0cmFyeQorICogY2hhcmFjdGVycyBpbiBrZXlzLiBDaGFyYWN0ZXJzIGluIFswLX5dIGFyZSBub3QgZW5jb2RlZC4gT3RoZXJzIGFyZSBlbmNvZGVkCisgKiBpbnRvIHR3byBieXRlcy4gVGhlIGZpcnN0IGJ5dGUgaXMgb25lIG9mIFsrLS5dIHdoaWNoIHJlcHJlc2VudHMgdGhlIGZpcnN0CisgKiB0d28gYml0cyBvZiB0aGUgY2hhcmFjdGVyLiBUaGUgc2Vjb25kIGJ5dGUgZW5jb2RlcyB0aGUgcmVzdCBvZiB0aGUgYml0cyBpbnRvCisgKiBbMC1vXS4gVGhlcmVmb3JlIGluIHRoZSB3b3JzdCBjYXNlIHRoZSBsZW5ndGggb2YgYSBrZXkgZ2V0cyBkb3VibGVkLiBOb3RlCisgKiB0aGF0IEJhc2U2NCBjYW5ub3QgYmUgdXNlZCBoZXJlIGR1ZSB0byB0aGUgbmVlZCBvZiBwcmVmaXggbWF0Y2ggb24ga2V5cy4gKi8KKworc3RhdGljIGludCBlbmNvZGVfa2V5KGNoYXIqIG91dCwgdWlkX3QgdWlkLCBjb25zdCBWYWx1ZSoga2V5KSB7CisgICAgaW50IG4gPSBzbnByaW50ZihvdXQsIE5BTUVfTUFYLCAiJXVfIiwgdWlkKTsKKyAgICBvdXQgKz0gbjsKKyAgICBjb25zdCB1aW50OF90KiBpbiA9IGtleS0+dmFsdWU7CisgICAgaW50IGxlbmd0aCA9IGtleS0+bGVuZ3RoOworICAgIGZvciAoaW50IGkgPSBsZW5ndGg7IGkgPiAwOyAtLWksICsraW4sICsrb3V0KSB7CisgICAgICAgIGlmICgqaW4gPj0gJzAnICYmICppbiA8PSAnficpIHsKKyAgICAgICAgICAgICpvdXQgPSAqaW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3V0ID0gJysnICsgKCppbiA+PiA2KTsKKyAgICAgICAgICAgICorK291dCA9ICcwJyArICgqaW4gJiAweDNGKTsKKyAgICAgICAgICAgICsrbGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgICpvdXQgPSAnXDAnOworICAgIHJldHVybiBuICsgbGVuZ3RoOworfQorCitzdGF0aWMgaW50IGRlY29kZV9rZXkodWludDhfdCogb3V0LCBjaGFyKiBpbiwgaW50IGxlbmd0aCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2ksICsraW4sICsrb3V0KSB7CisgICAgICAgIGlmICgqaW4gPj0gJzAnICYmICppbiA8PSAnficpIHsKKyAgICAgICAgICAgICpvdXQgPSAqaW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3V0ID0gKCppbiAtICcrJykgPDwgNjsKKyAgICAgICAgICAgICpvdXQgfD0gKCorK2luIC0gJzAnKSAmIDB4M0Y7CisgICAgICAgICAgICAtLWxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3V0ID0gJ1wwJzsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgc2l6ZV90IHJlYWRGdWxseShpbnQgZmQsIHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IHJlbWFpbmluZyA9IHNpemU7CisgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgc3NpemVfdCBuID0gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQsIGRhdGEsIHNpemUpKTsKKyAgICAgICAgaWYgKG4gPT0gLTEgfHwgbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZS1yZW1haW5pbmc7CisgICAgICAgIH0KKyAgICAgICAgZGF0YSArPSBuOworICAgICAgICByZW1haW5pbmcgLT0gbjsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzaXplX3Qgd3JpdGVGdWxseShpbnQgZmQsIHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IHJlbWFpbmluZyA9IHNpemU7CisgICAgd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKKyAgICAgICAgc3NpemVfdCBuID0gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCBkYXRhLCBzaXplKSk7CisgICAgICAgIGlmIChuID09IC0xIHx8IG4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNpemUtcmVtYWluaW5nOworICAgICAgICB9CisgICAgICAgIGRhdGEgKz0gbjsKKyAgICAgICAgcmVtYWluaW5nIC09IG47CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCitjbGFzcyBFbnRyb3B5IHsKK3B1YmxpYzoKKyAgICBFbnRyb3B5KCkgOiBtUmFuZG9tKC0xKSB7fQorICAgIH5FbnRyb3B5KCkgeworICAgICAgICBpZiAobVJhbmRvbSAhPSAtMSkgeworICAgICAgICAgICAgY2xvc2UobVJhbmRvbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG9wZW4oKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHJhbmRvbURldmljZSA9ICIvZGV2L3VyYW5kb20iOworICAgICAgICBtUmFuZG9tID0gOjpvcGVuKHJhbmRvbURldmljZSwgT19SRE9OTFkpOworICAgICAgICBpZiAobVJhbmRvbSA9PSAtMSkgeworICAgICAgICAgICAgTE9HRSgib3BlbjogJXM6ICVzIiwgcmFuZG9tRGV2aWNlLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2VuZXJhdGVfcmFuZG9tX2RhdGEodWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIChyZWFkRnVsbHkobVJhbmRvbSwgZGF0YSwgc2l6ZSkgPT0gc2l6ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGludCBtUmFuZG9tOworfTsKKworLyogSGVyZSBpcyB0aGUgZmlsZSBmb3JtYXQuIFRoZXJlIGFyZSB0d28gcGFydHMgaW4gYmxvYi52YWx1ZSwgdGhlIHNlY3JldCBhbmQKKyAqIHRoZSBkZXNjcmlwdGlvbi4gVGhlIHNlY3JldCBpcyBzdG9yZWQgaW4gY2lwaGVydGV4dCwgYW5kIGl0cyBvcmlnaW5hbCBzaXplCisgKiBjYW4gYmUgZm91bmQgaW4gYmxvYi5sZW5ndGguIFRoZSBkZXNjcmlwdGlvbiBpcyBzdG9yZWQgYWZ0ZXIgdGhlIHNlY3JldCBpbgorICogcGxhaW50ZXh0LCBhbmQgaXRzIHNpemUgaXMgc3BlY2lmaWVkIGluIGJsb2IuaW5mby4gVGhlIHRvdGFsIHNpemUgb2YgdGhlIHR3bworICogcGFydHMgbXVzdCBiZSBubyBtb3JlIHRoYW4gVkFMVUVfU0laRSBieXRlcy4gVGhlIGZpcnN0IHRocmVlIGJ5dGVzIG9mIHRoZQorICogZmlsZSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgYW5kIGFyZSBhbHdheXMgc2V0IHRvIHplcm8uIEZpZWxkcyBvdGhlcgorICogdGhhbiBibG9iLmluZm8sIGJsb2IubGVuZ3RoLCBhbmQgYmxvYi52YWx1ZSBhcmUgbW9kaWZpZWQgYnkgZW5jcnlwdEJsb2IoKQorICogYW5kIGRlY3J5cHRCbG9iKCkuIFRodXMgdGhleSBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGZyb20gb3V0c2lkZS4gKi8KKworc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGJsb2IgeworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107CisgICAgdWludDhfdCBpbmZvOworICAgIHVpbnQ4X3QgdmVjdG9yW0FFU19CTE9DS19TSVpFXTsKKyAgICB1aW50OF90IGVuY3J5cHRlZFswXTsKKyAgICB1aW50OF90IGRpZ2VzdFtNRDVfRElHRVNUX0xFTkdUSF07CisgICAgdWludDhfdCBkaWdlc3RlZFswXTsKKyAgICBpbnQzMl90IGxlbmd0aDsgLy8gaW4gbmV0d29yayBieXRlIG9yZGVyIHdoZW4gZW5jcnlwdGVkCisgICAgdWludDhfdCB2YWx1ZVtWQUxVRV9TSVpFICsgQUVTX0JMT0NLX1NJWkVdOworfTsKKworY2xhc3MgQmxvYiB7CitwdWJsaWM6CisgICAgQmxvYih1aW50OF90KiB2YWx1ZSwgaW50MzJfdCB2YWx1ZUxlbmd0aCwgdWludDhfdCogaW5mbywgdWludDhfdCBpbmZvTGVuZ3RoKSB7CisgICAgICAgIG1CbG9iLmxlbmd0aCA9IHZhbHVlTGVuZ3RoOworICAgICAgICBtZW1jcHkobUJsb2IudmFsdWUsIHZhbHVlLCB2YWx1ZUxlbmd0aCk7CisKKyAgICAgICAgbUJsb2IuaW5mbyA9IGluZm9MZW5ndGg7CisgICAgICAgIG1lbWNweShtQmxvYi52YWx1ZSArIHZhbHVlTGVuZ3RoLCBpbmZvLCBpbmZvTGVuZ3RoKTsKKyAgICB9CisKKyAgICBCbG9iKGJsb2IgYikgeworICAgICAgICBtQmxvYiA9IGI7CisgICAgfQorCisgICAgQmxvYigpIHt9CisKKyAgICB1aW50OF90KiBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CbG9iLnZhbHVlOworICAgIH0KKworICAgIGludDMyX3QgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gbUJsb2IubGVuZ3RoOworICAgIH0KKworICAgIHVpbnQ4X3QgZ2V0SW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1CbG9iLmluZm87CisgICAgfQorCisgICAgUmVzcG9uc2VDb2RlIGVuY3J5cHRCbG9iKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBBRVNfS0VZICphZXNfa2V5LCBFbnRyb3B5KiBlbnRyb3B5KSB7CisgICAgICAgIGlmICghZW50cm9weS0+Z2VuZXJhdGVfcmFuZG9tX2RhdGEobUJsb2IudmVjdG9yLCBBRVNfQkxPQ0tfU0laRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvLyBkYXRhIGluY2x1ZGVzIHRoZSB2YWx1ZSBhbmQgdGhlIHZhbHVlJ3MgbGVuZ3RoCisgICAgICAgIHNpemVfdCBkYXRhTGVuZ3RoID0gbUJsb2IubGVuZ3RoICsgc2l6ZW9mKG1CbG9iLmxlbmd0aCk7CisgICAgICAgIC8vIHBhZCBkYXRhIHRvIHRoZSBBRVNfQkxPQ0tfU0laRQorICAgICAgICBzaXplX3QgZGlnZXN0ZWRMZW5ndGggPSAoKGRhdGFMZW5ndGggKyBBRVNfQkxPQ0tfU0laRSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIEFFU19CTE9DS19TSVpFICogQUVTX0JMT0NLX1NJWkUpOworICAgICAgICAvLyBlbmNyeXB0ZWQgZGF0YSBpbmNsdWRlcyB0aGUgZGlnZXN0IHZhbHVlCisgICAgICAgIHNpemVfdCBlbmNyeXB0ZWRMZW5ndGggPSBkaWdlc3RlZExlbmd0aCArIE1ENV9ESUdFU1RfTEVOR1RIOworICAgICAgICAvLyBtb3ZlIGluZm8gYWZ0ZXIgc3BhY2UgZm9yIHBhZGRpbmcKKyAgICAgICAgbWVtbW92ZSgmbUJsb2IuZW5jcnlwdGVkW2VuY3J5cHRlZExlbmd0aF0sICZtQmxvYi52YWx1ZVttQmxvYi5sZW5ndGhdLCBtQmxvYi5pbmZvKTsKKyAgICAgICAgLy8gemVybyBwYWRkaW5nIGFyZWEKKyAgICAgICAgbWVtc2V0KG1CbG9iLnZhbHVlICsgbUJsb2IubGVuZ3RoLCAwLCBkaWdlc3RlZExlbmd0aCAtIGRhdGFMZW5ndGgpOworCisgICAgICAgIG1CbG9iLmxlbmd0aCA9IGh0b25sKG1CbG9iLmxlbmd0aCk7CisgICAgICAgIE1ENShtQmxvYi5kaWdlc3RlZCwgZGlnZXN0ZWRMZW5ndGgsIG1CbG9iLmRpZ2VzdCk7CisKKyAgICAgICAgdWludDhfdCB2ZWN0b3JbQUVTX0JMT0NLX1NJWkVdOworICAgICAgICBtZW1jcHkodmVjdG9yLCBtQmxvYi52ZWN0b3IsIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgQUVTX2NiY19lbmNyeXB0KG1CbG9iLmVuY3J5cHRlZCwgbUJsb2IuZW5jcnlwdGVkLCBlbmNyeXB0ZWRMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBhZXNfa2V5LCB2ZWN0b3IsIEFFU19FTkNSWVBUKTsKKworICAgICAgICBtZW1zZXQobUJsb2IucmVzZXJ2ZWQsIDAsIHNpemVvZihtQmxvYi5yZXNlcnZlZCkpOworICAgICAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gKG1CbG9iLmVuY3J5cHRlZCAtICh1aW50OF90KikgJm1CbG9iKTsKKyAgICAgICAgc2l6ZV90IGZpbGVMZW5ndGggPSBlbmNyeXB0ZWRMZW5ndGggKyBoZWFkZXJMZW5ndGggKyBtQmxvYi5pbmZvOworCisgICAgICAgIGNvbnN0IGNoYXIqIHRtcEZpbGVOYW1lID0gIi50bXAiOworICAgICAgICBpbnQgb3V0ID0gb3Blbih0bXBGaWxlTmFtZSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgICAgICBpZiAob3V0ID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHNpemVfdCB3cml0dGVuQnl0ZXMgPSB3cml0ZUZ1bGx5KG91dCwgKHVpbnQ4X3QqKSAmbUJsb2IsIGZpbGVMZW5ndGgpOworICAgICAgICBpZiAoY2xvc2Uob3V0KSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0dGVuQnl0ZXMgIT0gZmlsZUxlbmd0aCkgeworICAgICAgICAgICAgdW5saW5rKHRtcEZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChyZW5hbWUodG1wRmlsZU5hbWUsIGZpbGVuYW1lKSA9PSAwKSA/IE5PX0VSUk9SIDogU1lTVEVNX0VSUk9SOworICAgIH0KKworICAgIFJlc3BvbnNlQ29kZSBkZWNyeXB0QmxvYihjb25zdCBjaGFyKiBmaWxlbmFtZSwgQUVTX0tFWSAqYWVzX2tleSkgeworICAgICAgICBpbnQgaW4gPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgICAgIGlmIChpbiA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIChlcnJubyA9PSBFTk9FTlQpID8gS0VZX05PVF9GT1VORCA6IFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBmaWxlTGVuZ3RoIG1heSBiZSBsZXNzIHRoYW4gc2l6ZW9mKG1CbG9iKSBzaW5jZSB0aGUgaW4KKyAgICAgICAgLy8gbWVtb3J5IHZlcnNpb24gaGFzIGV4dHJhIHBhZGRpbmcgdG8gdG9sZXJhdGUgcm91bmRpbmcgdXAgdG8KKyAgICAgICAgLy8gdGhlIEFFU19CTE9DS19TSVpFCisgICAgICAgIHNpemVfdCBmaWxlTGVuZ3RoID0gcmVhZEZ1bGx5KGluLCAodWludDhfdCopICZtQmxvYiwgc2l6ZW9mKG1CbG9iKSk7CisgICAgICAgIGlmIChjbG9zZShpbikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gKG1CbG9iLmVuY3J5cHRlZCAtICh1aW50OF90KikgJm1CbG9iKTsKKyAgICAgICAgaWYgKGZpbGVMZW5ndGggPCBoZWFkZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRV9DT1JSVVBURUQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IGVuY3J5cHRlZExlbmd0aCA9IGZpbGVMZW5ndGggLSAoaGVhZGVyTGVuZ3RoICsgbUJsb2IuaW5mbyk7CisgICAgICAgIGlmIChlbmNyeXB0ZWRMZW5ndGggPCAwIHx8IGVuY3J5cHRlZExlbmd0aCAlIEFFU19CTE9DS19TSVpFICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRV9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQUVTX2NiY19lbmNyeXB0KG1CbG9iLmVuY3J5cHRlZCwgbUJsb2IuZW5jcnlwdGVkLCBlbmNyeXB0ZWRMZW5ndGgsIGFlc19rZXksCisgICAgICAgICAgICAgICAgICAgICAgICBtQmxvYi52ZWN0b3IsIEFFU19ERUNSWVBUKTsKKyAgICAgICAgc2l6ZV90IGRpZ2VzdGVkTGVuZ3RoID0gZW5jcnlwdGVkTGVuZ3RoIC0gTUQ1X0RJR0VTVF9MRU5HVEg7CisgICAgICAgIHVpbnQ4X3QgY29tcHV0ZWREaWdlc3RbTUQ1X0RJR0VTVF9MRU5HVEhdOworICAgICAgICBNRDUobUJsb2IuZGlnZXN0ZWQsIGRpZ2VzdGVkTGVuZ3RoLCBjb21wdXRlZERpZ2VzdCk7CisgICAgICAgIGlmIChtZW1jbXAobUJsb2IuZGlnZXN0LCBjb21wdXRlZERpZ2VzdCwgTUQ1X0RJR0VTVF9MRU5HVEgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRV9DT1JSVVBURUQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG1heFZhbHVlTGVuZ3RoID0gZGlnZXN0ZWRMZW5ndGggLSBzaXplb2YobUJsb2IubGVuZ3RoKTsKKyAgICAgICAgbUJsb2IubGVuZ3RoID0gbnRvaGwobUJsb2IubGVuZ3RoKTsKKyAgICAgICAgaWYgKG1CbG9iLmxlbmd0aCA8IDAgfHwgbUJsb2IubGVuZ3RoID4gbWF4VmFsdWVMZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRV9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CbG9iLmluZm8gIT0gMCkgeworICAgICAgICAgICAgLy8gbW92ZSBpbmZvIGZyb20gYWZ0ZXIgcGFkZGluZyB0byBhZnRlciBkYXRhCisgICAgICAgICAgICBtZW1tb3ZlKCZtQmxvYi52YWx1ZVttQmxvYi5sZW5ndGhdLCAmbUJsb2IudmFsdWVbbWF4VmFsdWVMZW5ndGhdLCBtQmxvYi5pbmZvKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0cnVjdCBibG9iIG1CbG9iOworfTsKKworY2xhc3MgS2V5U3RvcmUgeworcHVibGljOgorICAgIEtleVN0b3JlKEVudHJvcHkqIGVudHJvcHkpIDogbUVudHJvcHkoZW50cm9weSksIG1SZXRyeShNQVhfUkVUUlkpIHsKKyAgICAgICAgaWYgKGFjY2VzcyhNQVNURVJfS0VZX0ZJTEUsIFJfT0spID09IDApIHsKKyAgICAgICAgICAgIHNldFN0YXRlKFNUQVRFX0xPQ0tFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRTdGF0ZShTVEFURV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN0YXRlIGdldFN0YXRlKCkgeworICAgICAgICByZXR1cm4gbVN0YXRlOworICAgIH0KKworICAgIGludDhfdCBnZXRSZXRyeSgpIHsKKyAgICAgICAgcmV0dXJuIG1SZXRyeTsKKyAgICB9CisKKyAgICBSZXNwb25zZUNvZGUgaW5pdGlhbGl6ZShWYWx1ZSogcHcpIHsKKyAgICAgICAgaWYgKCFnZW5lcmF0ZU1hc3RlcktleSgpKSB7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisgICAgICAgIFJlc3BvbnNlQ29kZSByZXNwb25zZSA9IHdyaXRlTWFzdGVyS2V5KHB3KTsKKyAgICAgICAgaWYgKHJlc3BvbnNlICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgIH0KKyAgICAgICAgc2V0dXBNYXN0ZXJLZXlzKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBSZXNwb25zZUNvZGUgd3JpdGVNYXN0ZXJLZXkoVmFsdWUqIHB3KSB7CisgICAgICAgIHVpbnQ4X3QgcGFzc3dvcmRLZXlbTUFTVEVSX0tFWV9TSVpFX0JZVEVTXTsKKyAgICAgICAgZ2VuZXJhdGVLZXlGcm9tUGFzc3dvcmQocGFzc3dvcmRLZXksIE1BU1RFUl9LRVlfU0laRV9CWVRFUywgcHcsIG1TYWx0KTsKKyAgICAgICAgQUVTX0tFWSBwYXNzd29yZEFlc0tleTsKKyAgICAgICAgQUVTX3NldF9lbmNyeXB0X2tleShwYXNzd29yZEtleSwgTUFTVEVSX0tFWV9TSVpFX0JJVFMsICZwYXNzd29yZEFlc0tleSk7CisgICAgICAgIEJsb2IgbWFzdGVyS2V5QmxvYihtTWFzdGVyS2V5LCBzaXplb2YobU1hc3RlcktleSksIG1TYWx0LCBzaXplb2YobVNhbHQpKTsKKyAgICAgICAgcmV0dXJuIG1hc3RlcktleUJsb2IuZW5jcnlwdEJsb2IoTUFTVEVSX0tFWV9GSUxFLCAmcGFzc3dvcmRBZXNLZXksIG1FbnRyb3B5KTsKKyAgICB9CisKKyAgICBSZXNwb25zZUNvZGUgcmVhZE1hc3RlcktleShWYWx1ZSogcHcpIHsKKyAgICAgICAgaW50IGluID0gb3BlbihNQVNURVJfS0VZX0ZJTEUsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKGluID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgcmVhZCB0aGUgcmF3IGJsb2IgdG8ganVzdCB0byBnZXQgdGhlIHNhbHQgdG8gZ2VuZXJhdGUKKyAgICAgICAgLy8gdGhlIEFFUyBrZXksIHRoZW4gd2UgY3JlYXRlIHRoZSBCbG9iIHRvIHVzZSB3aXRoIGRlY3J5cHRCbG9iCisgICAgICAgIGJsb2IgcmF3QmxvYjsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHJlYWRGdWxseShpbiwgKHVpbnQ4X3QqKSAmcmF3QmxvYiwgc2l6ZW9mKHJhd0Jsb2IpKTsKKyAgICAgICAgaWYgKGNsb3NlKGluKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIGZpbmQgc2FsdCBhdCBFT0YgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHdlIGhhdmUgYW4gb2xkIGZpbGUKKyAgICAgICAgdWludDhfdCogc2FsdDsKKyAgICAgICAgaWYgKGxlbmd0aCA+IFNBTFRfU0laRSAmJiByYXdCbG9iLmluZm8gPT0gU0FMVF9TSVpFKSB7CisgICAgICAgICAgICBzYWx0ID0gKHVpbnQ4X3QqKSAmcmF3QmxvYiArIGxlbmd0aCAtIFNBTFRfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNhbHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgcGFzc3dvcmRLZXlbTUFTVEVSX0tFWV9TSVpFX0JZVEVTXTsKKyAgICAgICAgZ2VuZXJhdGVLZXlGcm9tUGFzc3dvcmQocGFzc3dvcmRLZXksIE1BU1RFUl9LRVlfU0laRV9CWVRFUywgcHcsIHNhbHQpOworICAgICAgICBBRVNfS0VZIHBhc3N3b3JkQWVzS2V5OworICAgICAgICBBRVNfc2V0X2RlY3J5cHRfa2V5KHBhc3N3b3JkS2V5LCBNQVNURVJfS0VZX1NJWkVfQklUUywgJnBhc3N3b3JkQWVzS2V5KTsKKyAgICAgICAgQmxvYiBtYXN0ZXJLZXlCbG9iKHJhd0Jsb2IpOworICAgICAgICBSZXNwb25zZUNvZGUgcmVzcG9uc2UgPSBtYXN0ZXJLZXlCbG9iLmRlY3J5cHRCbG9iKE1BU1RFUl9LRVlfRklMRSwgJnBhc3N3b3JkQWVzS2V5KTsKKyAgICAgICAgaWYgKHJlc3BvbnNlID09IFNZU1RFTV9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzcG9uc2UgPT0gTk9fRVJST1IgJiYgbWFzdGVyS2V5QmxvYi5nZXRMZW5ndGgoKSA9PSBNQVNURVJfS0VZX1NJWkVfQllURVMpIHsKKyAgICAgICAgICAgIC8vIGlmIHNhbHQgd2FzIG1pc3NpbmcsIGdlbmVyYXRlIG9uZSBhbmQgd3JpdGUgYSBuZXcgbWFzdGVyIGtleSBmaWxlIHdpdGggdGhlIHNhbHQuCisgICAgICAgICAgICBpZiAoc2FsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZW5lcmF0ZVNhbHQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHdyaXRlTWFzdGVyS2V5KHB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHNldHVwTWFzdGVyS2V5cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9CisgICAgICAgIGlmIChtUmV0cnkgPD0gMCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBVTklOSVRJQUxJWkVEOworICAgICAgICB9CisgICAgICAgIC0tbVJldHJ5OworICAgICAgICBzd2l0Y2ggKG1SZXRyeSkgeworICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gV1JPTkdfUEFTU1dPUkRfMDsKKyAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIFdST05HX1BBU1NXT1JEXzE7CisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBXUk9OR19QQVNTV09SRF8yOworICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gV1JPTkdfUEFTU1dPUkRfMzsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBXUk9OR19QQVNTV09SRF8zOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCByZXNldCgpIHsKKyAgICAgICAgY2xlYXJNYXN0ZXJLZXlzKCk7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX1VOSU5JVElBTElaRUQpOworCisgICAgICAgIERJUiogZGlyID0gb3BlbmRpcigiLiIpOworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBmaWxlOworCisgICAgICAgIGlmICghZGlyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChmaWxlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICB1bmxpbmsoZmlsZS0+ZF9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkaXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGlzRW1wdHkoKSB7CisgICAgICAgIERJUiogZGlyID0gb3BlbmRpcigiLiIpOworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBmaWxlOworICAgICAgICBpZiAoIWRpcikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCByZXN1bHQgPSB0cnVlOworICAgICAgICB3aGlsZSAoKGZpbGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChpc0tleUZpbGUoZmlsZS0+ZF9uYW1lKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGRpcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdm9pZCBsb2NrKCkgeworICAgICAgICBjbGVhck1hc3RlcktleXMoKTsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfTE9DS0VEKTsKKyAgICB9CisKKyAgICBSZXNwb25zZUNvZGUgZ2V0KGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBCbG9iKiBrZXlCbG9iKSB7CisgICAgICAgIHJldHVybiBrZXlCbG9iLT5kZWNyeXB0QmxvYihmaWxlbmFtZSwgJm1NYXN0ZXJLZXlEZWNyeXB0aW9uKTsKKyAgICB9CisKKyAgICBSZXNwb25zZUNvZGUgcHV0KGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBCbG9iKiBrZXlCbG9iKSB7CisgICAgICAgIHJldHVybiBrZXlCbG9iLT5lbmNyeXB0QmxvYihmaWxlbmFtZSwgJm1NYXN0ZXJLZXlFbmNyeXB0aW9uLCBtRW50cm9weSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBNQVNURVJfS0VZX0ZJTEU7CisgICAgc3RhdGljIGNvbnN0IGludCBNQVNURVJfS0VZX1NJWkVfQllURVMgPSAxNjsKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BU1RFUl9LRVlfU0laRV9CSVRTID0gTUFTVEVSX0tFWV9TSVpFX0JZVEVTICogODsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgTUFYX1JFVFJZID0gNDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IFNBTFRfU0laRSA9IDE2OworCisgICAgRW50cm9weSogbUVudHJvcHk7CisKKyAgICBTdGF0ZSBtU3RhdGU7CisgICAgaW50OF90IG1SZXRyeTsKKworICAgIHVpbnQ4X3QgbU1hc3RlcktleVtNQVNURVJfS0VZX1NJWkVfQllURVNdOworICAgIHVpbnQ4X3QgbVNhbHRbU0FMVF9TSVpFXTsKKworICAgIEFFU19LRVkgbU1hc3RlcktleUVuY3J5cHRpb247CisgICAgQUVTX0tFWSBtTWFzdGVyS2V5RGVjcnlwdGlvbjsKKworICAgIHZvaWQgc2V0U3RhdGUoU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgbVN0YXRlID0gc3RhdGU7CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfTk9fRVJST1IgfHwgbVN0YXRlID09IFNUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIG1SZXRyeSA9IE1BWF9SRVRSWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgZ2VuZXJhdGVTYWx0KCkgeworICAgICAgICByZXR1cm4gbUVudHJvcHktPmdlbmVyYXRlX3JhbmRvbV9kYXRhKG1TYWx0LCBzaXplb2YobVNhbHQpKTsKKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlTWFzdGVyS2V5KCkgeworICAgICAgICBpZiAoIW1FbnRyb3B5LT5nZW5lcmF0ZV9yYW5kb21fZGF0YShtTWFzdGVyS2V5LCBzaXplb2YobU1hc3RlcktleSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZW5lcmF0ZVNhbHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgc2V0dXBNYXN0ZXJLZXlzKCkgeworICAgICAgICBBRVNfc2V0X2VuY3J5cHRfa2V5KG1NYXN0ZXJLZXksIE1BU1RFUl9LRVlfU0laRV9CSVRTLCAmbU1hc3RlcktleUVuY3J5cHRpb24pOworICAgICAgICBBRVNfc2V0X2RlY3J5cHRfa2V5KG1NYXN0ZXJLZXksIE1BU1RFUl9LRVlfU0laRV9CSVRTLCAmbU1hc3RlcktleURlY3J5cHRpb24pOworICAgICAgICBzZXRTdGF0ZShTVEFURV9OT19FUlJPUik7CisgICAgfQorCisgICAgdm9pZCBjbGVhck1hc3RlcktleXMoKSB7CisgICAgICAgIG1lbXNldChtTWFzdGVyS2V5LCAwLCBzaXplb2YobU1hc3RlcktleSkpOworICAgICAgICBtZW1zZXQobVNhbHQsIDAsIHNpemVvZihtU2FsdCkpOworICAgICAgICBtZW1zZXQoJm1NYXN0ZXJLZXlFbmNyeXB0aW9uLCAwLCBzaXplb2YobU1hc3RlcktleUVuY3J5cHRpb24pKTsKKyAgICAgICAgbWVtc2V0KCZtTWFzdGVyS2V5RGVjcnlwdGlvbiwgMCwgc2l6ZW9mKG1NYXN0ZXJLZXlEZWNyeXB0aW9uKSk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgZ2VuZXJhdGVLZXlGcm9tUGFzc3dvcmQodWludDhfdCoga2V5LCBzc2l6ZV90IGtleVNpemUsIFZhbHVlKiBwdywgdWludDhfdCogc2FsdCkgeworICAgICAgICBzaXplX3Qgc2FsdFNpemU7CisgICAgICAgIGlmIChzYWx0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNhbHRTaXplID0gU0FMVF9TSVpFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcHJlLWdpbmdlcmJyZWFkIHVzZWQgdGhpcyBoYXJkd2lyZWQgc2FsdCwgcmVhZE1hc3RlcktleSB3aWxsIHJld3JpdGUgdGhlc2Ugd2hlbiBmb3VuZAorICAgICAgICAgICAgc2FsdCA9ICh1aW50OF90KikgImtleXN0b3JlIjsKKyAgICAgICAgICAgIC8vIHNpemVvZiA9IDksIG5vdCBzdHJsZW4gPSA4CisgICAgICAgICAgICBzYWx0U2l6ZSA9IHNpemVvZigia2V5c3RvcmUiKTsKKyAgICAgICAgfQorICAgICAgICBQS0NTNV9QQktERjJfSE1BQ19TSEExKChjaGFyKikgcHctPnZhbHVlLCBwdy0+bGVuZ3RoLCBzYWx0LCBzYWx0U2l6ZSwgODE5Miwga2V5U2l6ZSwga2V5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0tleUZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgICAgICAgcmV0dXJuICgoc3RyY21wKGZpbGVuYW1lLCBNQVNURVJfS0VZX0ZJTEUpICE9IDApCisgICAgICAgICAgICAgICAgJiYgKHN0cmNtcChmaWxlbmFtZSwgIi4iKSAhPSAwKQorICAgICAgICAgICAgICAgICYmIChzdHJjbXAoZmlsZW5hbWUsICIuLiIpICE9IDApKTsKKyAgICB9Cit9OworCitjb25zdCBjaGFyKiBLZXlTdG9yZTo6TUFTVEVSX0tFWV9GSUxFID0gIi5tYXN0ZXJrZXkiOworCisvKiBIZXJlIGlzIHRoZSBwcm90b2NvbCB1c2VkIGluIGJvdGggcmVxdWVzdHMgYW5kIHJlc3BvbnNlczoKKyAqICAgICBjb2RlIFtsZW5ndGhfMSBtZXNzYWdlXzEgLi4uIGxlbmd0aF9uIG1lc3NhZ2Vfbl0gZW5kLW9mLWZpbGUKKyAqIHdoZXJlIGNvZGUgaXMgb25lIGJ5dGUgbG9uZyBhbmQgbGVuZ3RocyBhcmUgdW5zaWduZWQgMTYtYml0IGludGVnZXJzIGluCisgKiBuZXR3b3JrIG9yZGVyLiBUaHVzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIG1lc3NhZ2UgaXMgNjU1MzUgYnl0ZXMuICovCisKK3N0YXRpYyBpbnQgcmVjdl9jb2RlKGludCBzb2NrLCBpbnQ4X3QqIGNvZGUpIHsKKyAgICByZXR1cm4gcmVjdihzb2NrLCBjb2RlLCAxLCAwKSA9PSAxOworfQorCitzdGF0aWMgaW50IHJlY3ZfbWVzc2FnZShpbnQgc29jaywgdWludDhfdCogbWVzc2FnZSwgaW50IGxlbmd0aCkgeworICAgIHVpbnQ4X3QgYnl0ZXNbMl07CisgICAgaWYgKHJlY3Yoc29jaywgJmJ5dGVzWzBdLCAxLCAwKSAhPSAxIHx8CisgICAgICAgIHJlY3Yoc29jaywgJmJ5dGVzWzFdLCAxLCAwKSAhPSAxKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgb2Zmc2V0ID0gYnl0ZXNbMF0gPDwgOCB8IGJ5dGVzWzFdOworICAgICAgICBpZiAobGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gb2Zmc2V0OworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgbiA9IHJlY3Yoc29jaywgJm1lc3NhZ2Vbb2Zmc2V0XSwgbGVuZ3RoIC0gb2Zmc2V0LCAwKTsKKyAgICAgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZmZzZXQgKz0gbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgaW50IHJlY3ZfZW5kX29mX2ZpbGUoaW50IHNvY2spIHsKKyAgICB1aW50OF90IGJ5dGU7CisgICAgcmV0dXJuIHJlY3Yoc29jaywgJmJ5dGUsIDEsIDApID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfY29kZShpbnQgc29jaywgaW50OF90IGNvZGUpIHsKKyAgICBzZW5kKHNvY2ssICZjb2RlLCAxLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9tZXNzYWdlKGludCBzb2NrLCB1aW50OF90KiBtZXNzYWdlLCBpbnQgbGVuZ3RoKSB7CisgICAgdWludDE2X3QgYnl0ZXMgPSBodG9ucyhsZW5ndGgpOworICAgIHNlbmQoc29jaywgJmJ5dGVzLCAyLCAwKTsKKyAgICBzZW5kKHNvY2ssIG1lc3NhZ2UsIGxlbmd0aCwgMCk7Cit9CisKKy8qIEhlcmUgYXJlIHRoZSBhY3Rpb25zLiBFYWNoIG9mIHRoZW0gaXMgYSBmdW5jdGlvbiB3aXRob3V0IGFyZ3VtZW50cy4gQWxsCisgKiBpbmZvcm1hdGlvbiBpcyBkZWZpbmVkIGluIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGFyZSBzZXQgcHJvcGVybHkgYmVmb3JlCisgKiBwZXJmb3JtaW5nIGFuIGFjdGlvbi4gVGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IGVhY2ggYWN0aW9uIGlzCisgKiBmaXhlZCBhbmQgZGVmaW5lZCBpbiBhIHRhYmxlLiBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuIGFjdGlvbiBpcyBwb3NpdGl2ZSwKKyAqIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlc3BvbnNlIGNvZGUgYW5kIHRyYW5zbWl0dGVkIHRvIHRoZSBjbGllbnQuIE5vdGUKKyAqIHRoYXQgdGhlIGxlbmd0aHMgb2YgcGFyYW1ldGVycyBhcmUgY2hlY2tlZCB3aGVuIHRoZXkgYXJlIHJlY2VpdmVkLCBzbworICogYm91bmRhcnkgY2hlY2tzIG9uIHBhcmFtZXRlcnMgYXJlIG9taXR0ZWQuICovCisKK3N0YXRpYyBjb25zdCBSZXNwb25zZUNvZGUgTk9fRVJST1JfUkVTUE9OU0VfQ09ERV9TRU5UID0gKFJlc3BvbnNlQ29kZSkgMDsKKworc3RhdGljIFJlc3BvbnNlQ29kZSB0ZXN0KEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqLCBWYWx1ZSopIHsKKyAgICByZXR1cm4gKFJlc3BvbnNlQ29kZSkga2V5U3RvcmUtPmdldFN0YXRlKCk7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgZ2V0KEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqIGtleU5hbWUsIFZhbHVlKikgeworICAgIGNoYXIgZmlsZW5hbWVbTkFNRV9NQVhdOworICAgIGVuY29kZV9rZXkoZmlsZW5hbWUsIHVpZCwga2V5TmFtZSk7CisgICAgQmxvYiBrZXlCbG9iOworICAgIFJlc3BvbnNlQ29kZSByZXNwb25zZUNvZGUgPSBrZXlTdG9yZS0+Z2V0KGZpbGVuYW1lLCAma2V5QmxvYik7CisgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VDb2RlOworICAgIH0KKyAgICBzZW5kX2NvZGUoc29jaywgTk9fRVJST1IpOworICAgIHNlbmRfbWVzc2FnZShzb2NrLCBrZXlCbG9iLmdldFZhbHVlKCksIGtleUJsb2IuZ2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBOT19FUlJPUl9SRVNQT05TRV9DT0RFX1NFTlQ7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgaW5zZXJ0KEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqIGtleU5hbWUsIFZhbHVlKiB2YWwpIHsKKyAgICBjaGFyIGZpbGVuYW1lW05BTUVfTUFYXTsKKyAgICBlbmNvZGVfa2V5KGZpbGVuYW1lLCB1aWQsIGtleU5hbWUpOworICAgIEJsb2Iga2V5QmxvYih2YWwtPnZhbHVlLCB2YWwtPmxlbmd0aCwgMCwgTlVMTCk7CisgICAgcmV0dXJuIGtleVN0b3JlLT5wdXQoZmlsZW5hbWUsICZrZXlCbG9iKTsKK30KKworc3RhdGljIFJlc3BvbnNlQ29kZSBkZWwoS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSoga2V5TmFtZSwgVmFsdWUqKSB7CisgICAgY2hhciBmaWxlbmFtZVtOQU1FX01BWF07CisgICAgZW5jb2RlX2tleShmaWxlbmFtZSwgdWlkLCBrZXlOYW1lKTsKKyAgICByZXR1cm4gKHVubGluayhmaWxlbmFtZSkgJiYgZXJybm8gIT0gRU5PRU5UKSA/IFNZU1RFTV9FUlJPUiA6IE5PX0VSUk9SOworfQorCitzdGF0aWMgUmVzcG9uc2VDb2RlIGV4aXN0KEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqIGtleU5hbWUsIFZhbHVlKikgeworICAgIGNoYXIgZmlsZW5hbWVbTkFNRV9NQVhdOworICAgIGVuY29kZV9rZXkoZmlsZW5hbWUsIHVpZCwga2V5TmFtZSk7CisgICAgaWYgKGFjY2VzcyhmaWxlbmFtZSwgUl9PSykgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIChlcnJubyAhPSBFTk9FTlQpID8gU1lTVEVNX0VSUk9SIDogS0VZX05PVF9GT1VORDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgUmVzcG9uc2VDb2RlIHNhdyhLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiBrZXlQcmVmaXgsIFZhbHVlKikgeworICAgIERJUiogZGlyID0gb3BlbmRpcigiLiIpOworICAgIGlmICghZGlyKSB7CisgICAgICAgIHJldHVybiBTWVNURU1fRVJST1I7CisgICAgfQorICAgIGNoYXIgZmlsZW5hbWVbTkFNRV9NQVhdOworICAgIGludCBuID0gZW5jb2RlX2tleShmaWxlbmFtZSwgdWlkLCBrZXlQcmVmaXgpOworICAgIHNlbmRfY29kZShzb2NrLCBOT19FUlJPUik7CisKKyAgICBzdHJ1Y3QgZGlyZW50KiBmaWxlOworICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cm5jbXAoZmlsZW5hbWUsIGZpbGUtPmRfbmFtZSwgbikpIHsKKyAgICAgICAgICAgIGNoYXIqIHAgPSAmZmlsZS0+ZF9uYW1lW25dOworICAgICAgICAgICAga2V5UHJlZml4LT5sZW5ndGggPSBkZWNvZGVfa2V5KGtleVByZWZpeC0+dmFsdWUsIHAsIHN0cmxlbihwKSk7CisgICAgICAgICAgICBzZW5kX21lc3NhZ2Uoc29jaywga2V5UHJlZml4LT52YWx1ZSwga2V5UHJlZml4LT5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorICAgIGNsb3NlZGlyKGRpcik7CisgICAgcmV0dXJuIE5PX0VSUk9SX1JFU1BPTlNFX0NPREVfU0VOVDsKK30KKworc3RhdGljIFJlc3BvbnNlQ29kZSByZXNldChLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiwgVmFsdWUqKSB7CisgICAgcmV0dXJuIGtleVN0b3JlLT5yZXNldCgpID8gTk9fRVJST1IgOiBTWVNURU1fRVJST1I7Cit9CisKKy8qIEhlcmUgaXMgdGhlIGhpc3RvcnkuIFRvIGltcHJvdmUgdGhlIHNlY3VyaXR5LCB0aGUgcGFyYW1ldGVycyB0byBnZW5lcmF0ZSB0aGUKKyAqIG1hc3RlciBrZXkgaGFzIGJlZW4gY2hhbmdlZC4gVG8gbWFrZSBhIHNlYW1sZXNzIHRyYW5zaXRpb24sIHdlIHVwZGF0ZSB0aGUKKyAqIGZpbGUgdXNpbmcgdGhlIHNhbWUgcGFzc3dvcmQgd2hlbiB0aGUgdXNlciB1bmxvY2sgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLiBJZgorICogYW55IHRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIHRoZSB0cmFuc2l0aW9uLCB0aGUgbmV3IGZpbGUgd2lsbCBub3Qgb3ZlcndyaXRlCisgKiB0aGUgb2xkIG9uZS4gVGhpcyBhdm9pZHMgcGVybWFuZW50IGRhbWFnZXMgb2YgdGhlIGV4aXN0aW5nIGRhdGEuICovCisKK3N0YXRpYyBSZXNwb25zZUNvZGUgcGFzc3dvcmQoS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSogcHcsIFZhbHVlKikgeworICAgIHN3aXRjaCAoa2V5U3RvcmUtPmdldFN0YXRlKCkpIHsKKyAgICAgICAgY2FzZSBTVEFURV9VTklOSVRJQUxJWkVEOiB7CisgICAgICAgICAgICAvLyBnZW5lcmF0ZSBtYXN0ZXIga2V5LCBlbmNyeXB0IHdpdGggcGFzc3dvcmQsIHdyaXRlIHRvIGZpbGUsIGluaXRpYWxpemUgbU1hc3RlcktleSouCisgICAgICAgICAgICByZXR1cm4ga2V5U3RvcmUtPmluaXRpYWxpemUocHcpOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RBVEVfTk9fRVJST1I6IHsKKyAgICAgICAgICAgIC8vIHJld3JpdGUgbWFzdGVyIGtleSB3aXRoIG5ldyBwYXNzd29yZC4KKyAgICAgICAgICAgIHJldHVybiBrZXlTdG9yZS0+d3JpdGVNYXN0ZXJLZXkocHcpOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RBVEVfTE9DS0VEOiB7CisgICAgICAgICAgICAvLyByZWFkIG1hc3RlciBrZXksIGRlY3J5cHQgd2l0aCBwYXNzd29yZCwgaW5pdGlhbGl6ZSBtTWFzdGVyS2V5Ki4KKyAgICAgICAgICAgIHJldHVybiBrZXlTdG9yZS0+cmVhZE1hc3RlcktleShwdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKK30KKworc3RhdGljIFJlc3BvbnNlQ29kZSBsb2NrKEtleVN0b3JlKiBrZXlTdG9yZSwgaW50IHNvY2ssIHVpZF90IHVpZCwgVmFsdWUqLCBWYWx1ZSopIHsKKyAgICBrZXlTdG9yZS0+bG9jaygpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIFJlc3BvbnNlQ29kZSB1bmxvY2soS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBWYWx1ZSogcHcsIFZhbHVlKiB1bnVzZWQpIHsKKyAgICByZXR1cm4gcGFzc3dvcmQoa2V5U3RvcmUsIHNvY2ssIHVpZCwgcHcsIHVudXNlZCk7Cit9CisKK3N0YXRpYyBSZXNwb25zZUNvZGUgemVybyhLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiwgVmFsdWUqKSB7CisgICAgcmV0dXJuIGtleVN0b3JlLT5pc0VtcHR5KCkgPyBLRVlfTk9UX0ZPVU5EIDogTk9fRVJST1I7Cit9CisKKy8qIEhlcmUgYXJlIHRoZSBwZXJtaXNzaW9ucywgYWN0aW9ucywgdXNlcnMsIGFuZCB0aGUgbWFpbiBmdW5jdGlvbi4gKi8KKworZW51bSBwZXJtIHsKKyAgICBURVNUICAgICA9ICAgIDEsCisgICAgR0VUICAgICAgPSAgICAyLAorICAgIElOU0VSVCAgID0gICAgNCwKKyAgICBERUxFVEUgICA9ICAgIDgsCisgICAgRVhJU1QgICAgPSAgIDE2LAorICAgIFNBVyAgICAgID0gICAzMiwKKyAgICBSRVNFVCAgICA9ICAgNjQsCisgICAgUEFTU1dPUkQgPSAgMTI4LAorICAgIExPQ0sgICAgID0gIDI1NiwKKyAgICBVTkxPQ0sgICA9ICA1MTIsCisgICAgWkVSTyAgICAgPSAxMDI0LAorfTsKKworc3RhdGljIGNvbnN0IGludCBNQVhfUEFSQU0gPSAyOworCitzdGF0aWMgY29uc3QgU3RhdGUgU1RBVEVfQU5ZID0gKFN0YXRlKSAwOworCitzdGF0aWMgc3RydWN0IGFjdGlvbiB7CisgICAgUmVzcG9uc2VDb2RlICgqcnVuKShLZXlTdG9yZSoga2V5U3RvcmUsIGludCBzb2NrLCB1aWRfdCB1aWQsIFZhbHVlKiBwYXJhbTEsIFZhbHVlKiBwYXJhbTIpOworICAgIGludDhfdCBjb2RlOworICAgIFN0YXRlIHN0YXRlOworICAgIHVpbnQzMl90IHBlcm07CisgICAgaW50IGxlbmd0aHNbTUFYX1BBUkFNXTsKK30gYWN0aW9uc1tdID0geworICAgIHt0ZXN0LCAgICAgJ3QnLCBTVEFURV9BTlksICAgICAgVEVTVCwgICAgIHswLCAwfX0sCisgICAge2dldCwgICAgICAnZycsIFNUQVRFX05PX0VSUk9SLCBHRVQsICAgICAge0tFWV9TSVpFLCAwfX0sCisgICAge2luc2VydCwgICAnaScsIFNUQVRFX05PX0VSUk9SLCBJTlNFUlQsICAge0tFWV9TSVpFLCBWQUxVRV9TSVpFfX0sCisgICAge2RlbCwgICAgICAnZCcsIFNUQVRFX0FOWSwgICAgICBERUxFVEUsICAge0tFWV9TSVpFLCAwfX0sCisgICAge2V4aXN0LCAgICAnZScsIFNUQVRFX0FOWSwgICAgICBFWElTVCwgICAge0tFWV9TSVpFLCAwfX0sCisgICAge3NhdywgICAgICAncycsIFNUQVRFX0FOWSwgICAgICBTQVcsICAgICAge0tFWV9TSVpFLCAwfX0sCisgICAge3Jlc2V0LCAgICAncicsIFNUQVRFX0FOWSwgICAgICBSRVNFVCwgICAgezAsIDB9fSwKKyAgICB7cGFzc3dvcmQsICdwJywgU1RBVEVfQU5ZLCAgICAgIFBBU1NXT1JELCB7UEFTU1dPUkRfU0laRSwgMH19LAorICAgIHtsb2NrLCAgICAgJ2wnLCBTVEFURV9OT19FUlJPUiwgTE9DSywgICAgIHswLCAwfX0sCisgICAge3VubG9jaywgICAndScsIFNUQVRFX0xPQ0tFRCwgICBVTkxPQ0ssICAge1BBU1NXT1JEX1NJWkUsIDB9fSwKKyAgICB7emVybywgICAgICd6JywgU1RBVEVfQU5ZLCAgICAgIFpFUk8sICAgICB7MCwgMH19LAorICAgIHtOVUxMLCAgICAgIDAgLCBTVEFURV9BTlksICAgICAgMCwgICAgICAgIHswLCAwfX0sCit9OworCitzdGF0aWMgc3RydWN0IHVzZXIgeworICAgIHVpZF90IHVpZDsKKyAgICB1aWRfdCBldWlkOworICAgIHVpbnQzMl90IHBlcm1zOworfSB1c2Vyc1tdID0geworICAgIHtBSURfU1lTVEVNLCAgIH4wLCAgICAgICAgIH5HRVR9LAorICAgIHtBSURfVlBOLCAgICAgIEFJRF9TWVNURU0sIEdFVH0sCisgICAge0FJRF9XSUZJLCAgICAgQUlEX1NZU1RFTSwgR0VUfSwKKyAgICB7QUlEX1JPT1QsICAgICBBSURfU1lTVEVNLCBHRVR9LAorICAgIHtBSURfS0VZQ0hBSU4sIEFJRF9TWVNURU0sIFRFU1QgfCBHRVQgfCBTQVd9LAorICAgIHt+MCwgICAgICAgICAgIH4wLCAgICAgICAgIFRFU1QgfCBHRVQgfCBJTlNFUlQgfCBERUxFVEUgfCBFWElTVCB8IFNBV30sCit9OworCitzdGF0aWMgUmVzcG9uc2VDb2RlIHByb2Nlc3MoS2V5U3RvcmUqIGtleVN0b3JlLCBpbnQgc29jaywgdWlkX3QgdWlkLCBpbnQ4X3QgY29kZSkgeworICAgIHN0cnVjdCB1c2VyKiB1c2VyID0gdXNlcnM7CisgICAgc3RydWN0IGFjdGlvbiogYWN0aW9uID0gYWN0aW9uczsKKyAgICBpbnQgaTsKKworICAgIHdoaWxlICh+dXNlci0+dWlkICYmIHVzZXItPnVpZCAhPSB1aWQpIHsKKyAgICAgICAgKyt1c2VyOworICAgIH0KKyAgICB3aGlsZSAoYWN0aW9uLT5jb2RlICYmIGFjdGlvbi0+Y29kZSAhPSBjb2RlKSB7CisgICAgICAgICsrYWN0aW9uOworICAgIH0KKyAgICBpZiAoIWFjdGlvbi0+Y29kZSkgeworICAgICAgICByZXR1cm4gVU5ERUZJTkVEX0FDVElPTjsKKyAgICB9CisgICAgaWYgKCEoYWN0aW9uLT5wZXJtICYgdXNlci0+cGVybXMpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKGFjdGlvbi0+c3RhdGUgIT0gU1RBVEVfQU5ZICYmIGFjdGlvbi0+c3RhdGUgIT0ga2V5U3RvcmUtPmdldFN0YXRlKCkpIHsKKyAgICAgICAgcmV0dXJuIChSZXNwb25zZUNvZGUpIGtleVN0b3JlLT5nZXRTdGF0ZSgpOworICAgIH0KKyAgICBpZiAofnVzZXItPmV1aWQpIHsKKyAgICAgICAgdWlkID0gdXNlci0+ZXVpZDsKKyAgICB9CisgICAgVmFsdWUgcGFyYW1zW01BWF9QQVJBTV07CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QQVJBTSAmJiBhY3Rpb24tPmxlbmd0aHNbaV0gIT0gMDsgKytpKSB7CisgICAgICAgIHBhcmFtc1tpXS5sZW5ndGggPSByZWN2X21lc3NhZ2Uoc29jaywgcGFyYW1zW2ldLnZhbHVlLCBhY3Rpb24tPmxlbmd0aHNbaV0pOworICAgICAgICBpZiAocGFyYW1zW2ldLmxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQUk9UT0NPTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXJlY3ZfZW5kX29mX2ZpbGUoc29jaykpIHsKKyAgICAgICAgcmV0dXJuIFBST1RPQ09MX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gYWN0aW9uLT5ydW4oa2V5U3RvcmUsIHNvY2ssIHVpZCwgJnBhcmFtc1swXSwgJnBhcmFtc1sxXSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgICBpbnQgY29udHJvbFNvY2tldCA9IGFuZHJvaWRfZ2V0X2NvbnRyb2xfc29ja2V0KCJrZXlzdG9yZSIpOworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBMT0dFKCJBIGRpcmVjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCEiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChjaGRpcihhcmd2WzFdKSA9PSAtMSkgeworICAgICAgICBMT0dFKCJjaGRpcjogJXM6ICVzIiwgYXJndlsxXSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgRW50cm9weSBlbnRyb3B5OworICAgIGlmICghZW50cm9weS5vcGVuKCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChsaXN0ZW4oY29udHJvbFNvY2tldCwgMykgPT0gLTEpIHsKKyAgICAgICAgTE9HRSgibGlzdGVuOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworICAgIEtleVN0b3JlIGtleVN0b3JlKCZlbnRyb3B5KTsKKyAgICBpbnQgc29jazsKKyAgICB3aGlsZSAoKHNvY2sgPSBhY2NlcHQoY29udHJvbFNvY2tldCwgTlVMTCwgMCkpICE9IC0xKSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICB0di50dl9zZWMgPSAzOworICAgICAgICBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLCAmdHYsIHNpemVvZih0dikpOworICAgICAgICBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLCAmdHYsIHNpemVvZih0dikpOworCisgICAgICAgIHN0cnVjdCB1Y3JlZCBjcmVkOworICAgICAgICBzb2NrbGVuX3Qgc2l6ZSA9IHNpemVvZihjcmVkKTsKKyAgICAgICAgaW50IGNyZWRSZXN1bHQgPSBnZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX1BFRVJDUkVELCAmY3JlZCwgJnNpemUpOworICAgICAgICBpZiAoY3JlZFJlc3VsdCAhPSAwKSB7CisgICAgICAgICAgICBMT0dXKCJnZXRzb2Nrb3B0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ4X3QgcmVxdWVzdDsKKyAgICAgICAgICAgIGlmIChyZWN2X2NvZGUoc29jaywgJnJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgU3RhdGUgb2xkX3N0YXRlID0ga2V5U3RvcmUuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgICAgICBSZXNwb25zZUNvZGUgcmVzcG9uc2UgPSBwcm9jZXNzKCZrZXlTdG9yZSwgc29jaywgY3JlZC51aWQsIHJlcXVlc3QpOworICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSA9PSBOT19FUlJPUl9SRVNQT05TRV9DT0RFX1NFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZW5kX2NvZGUoc29jaywgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0dJKCJ1aWQ6ICVkIGFjdGlvbjogJWMgLT4gJWQgc3RhdGU6ICVkIC0+ICVkIHJldHJ5OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICBjcmVkLnVpZCwKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgb2xkX3N0YXRlLCBrZXlTdG9yZS5nZXRTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAga2V5U3RvcmUuZ2V0UmV0cnkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2Uoc29jayk7CisgICAgfQorICAgIExPR0UoImFjY2VwdDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5oIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZS5oCmluZGV4IDVlZjUxZTkuLjVhZTNkMjQgMTAwNjQ0Ci0tLSBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmUuaAorKysgYi9jbWRzL2tleXN0b3JlL2tleXN0b3JlLmgKQEAgLTE3LDE3ICsxNywyNyBAQAogI2lmbmRlZiBfX0tFWVNUT1JFX0hfXwogI2RlZmluZSBfX0tFWVNUT1JFX0hfXwogCi1lbnVtIHJlc3BvbnNlX2NvZGUgewotICAgIE5PX0VSUk9SICAgICAgICAgID0gIDEsCi0gICAgTE9DS0VEICAgICAgICAgICAgPSAgMiwKLSAgICBVTklOSVRJQUxJWkVEICAgICA9ICAzLAorLy8gbm90ZSBzdGF0ZSB2YWx1ZXMgb3ZlcmxhcCB3aXRoIFJlc3BvbnNlQ29kZSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBzdGF0ZSgpIEFQSQorZW51bSBTdGF0ZSB7CisgICAgU1RBVEVfTk9fRVJST1IgICAgICA9IDEsCisgICAgU1RBVEVfTE9DS0VEICAgICAgICA9IDIsCisgICAgU1RBVEVfVU5JTklUSUFMSVpFRCA9IDMsCit9OworCitlbnVtIFJlc3BvbnNlQ29kZSB7CisgICAgTk9fRVJST1IgICAgICAgICAgPSAgU1RBVEVfTk9fRVJST1IsIC8vIDEKKyAgICBMT0NLRUQgICAgICAgICAgICA9ICBTVEFURV9MT0NLRUQsIC8vIDIKKyAgICBVTklOSVRJQUxJWkVEICAgICA9ICBTVEFURV9VTklOSVRJQUxJWkVELCAvLyAzCiAgICAgU1lTVEVNX0VSUk9SICAgICAgPSAgNCwKICAgICBQUk9UT0NPTF9FUlJPUiAgICA9ICA1LAogICAgIFBFUk1JU1NJT05fREVOSUVEID0gIDYsCiAgICAgS0VZX05PVF9GT1VORCAgICAgPSAgNywKICAgICBWQUxVRV9DT1JSVVBURUQgICA9ICA4LAogICAgIFVOREVGSU5FRF9BQ1RJT04gID0gIDksCi0gICAgV1JPTkdfUEFTU1dPUkQgICAgPSAxMCwKKyAgICBXUk9OR19QQVNTV09SRF8wICA9IDEwLAorICAgIFdST05HX1BBU1NXT1JEXzEgID0gMTEsCisgICAgV1JPTkdfUEFTU1dPUkRfMiAgPSAxMiwKKyAgICBXUk9OR19QQVNTV09SRF8zICA9IDEzLCAvLyBNQVhfUkVUUlkgPSA0CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmVfY2xpLmMgYi9jbWRzL2tleXN0b3JlL2tleXN0b3JlX2NsaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFmYjVhLi4wMDAwMDAwCi0tLSBhL2NtZHMva2V5c3RvcmUva2V5c3RvcmVfY2xpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL3NvY2tldHMuaD4KLQotI2luY2x1ZGUgImtleXN0b3JlLmgiCi0KLWNoYXIgKnJlc3BvbnNlc1syNTZdID0gewotICAgIFtOT19FUlJPUl0gICAgICAgICAgID0gIk5vIGVycm9yIiwKLSAgICBbTE9DS0VEXSAgICAgICAgICAgICA9ICJMb2NrZWQiLAotICAgIFtVTklOSVRJQUxJWkVEXSAgICAgID0gIlVuaW5pdGlhbGl6ZWQiLAotICAgIFtTWVNURU1fRVJST1JdICAgICAgID0gIlN5c3RlbSBlcnJvciIsCi0gICAgW1BST1RPQ09MX0VSUk9SXSAgICAgPSAiUHJvdG9jb2wgZXJyb3IiLAotICAgIFtQRVJNSVNTSU9OX0RFTklFRF0gID0gIlBlcm1pc3Npb24gZGVuaWVkIiwKLSAgICBbS0VZX05PVF9GT1VORF0gICAgICA9ICJLZXkgbm90IGZvdW5kIiwKLSAgICBbVkFMVUVfQ09SUlVQVEVEXSAgICA9ICJWYWx1ZSBjb3JydXB0ZWQiLAotICAgIFtVTkRFRklORURfQUNUSU9OXSAgID0gIlVuZGVmaW5lZCBhY3Rpb24iLAotICAgIFtXUk9OR19QQVNTV09SRF0gICAgID0gIldyb25nIHBhc3N3b3JkIChsYXN0IGNoYW5jZSkiLAotICAgIFtXUk9OR19QQVNTV09SRCArIDFdID0gIldyb25nIHBhc3N3b3JkICgyIHRyaWVzIGxlZnQpIiwKLSAgICBbV1JPTkdfUEFTU1dPUkQgKyAyXSA9ICJXcm9uZyBwYXNzd29yZCAoMyB0cmllcyBsZWZ0KSIsCi0gICAgW1dST05HX1BBU1NXT1JEICsgM10gPSAiV3JvbmcgcGFzc3dvcmQgKDQgdHJpZXMgbGVmdCkiLAotfTsKLQotI2RlZmluZSBNQVhfUkVTUE9OU0UgKFdST05HX1BBU1NXT1JEICsgMykKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIHVpbnQ4X3QgYnl0ZXNbNjU1MzZdOwotICAgIHVpbnQ4X3QgY29kZTsKLSAgICBpbnQgc29jaywgaTsKLQotICAgIGlmIChhcmdjIDwgMikgewotICAgICAgICBwcmludGYoIlVzYWdlOiAlcyBhY3Rpb24gW3BhcmFtZXRlciAuLi5dXG4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc29jayA9IHNvY2tldF9sb2NhbF9jbGllbnQoImtleXN0b3JlIiwgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX1JFU0VSVkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPQ0tfU1RSRUFNKTsKLSAgICBpZiAoc29jayA9PSAtMSkgewotICAgICAgICBwdXRzKCJGYWlsZWQgdG8gY29ubmVjdCIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBzZW5kKHNvY2ssIGFyZ3ZbMV0sIDEsIDApOwotICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyArK2kpIHsKLSAgICAgICAgdWludDE2X3QgbGVuZ3RoID0gc3RybGVuKGFyZ3ZbaV0pOwotICAgICAgICBieXRlc1swXSA9IGxlbmd0aCA+PiA4OwotICAgICAgICBieXRlc1sxXSA9IGxlbmd0aDsKLSAgICAgICAgc2VuZChzb2NrLCAmYnl0ZXMsIDIsIDApOwotICAgICAgICBzZW5kKHNvY2ssIGFyZ3ZbaV0sIGxlbmd0aCwgMCk7Ci0gICAgfQotICAgIHNodXRkb3duKHNvY2ssIFNIVVRfV1IpOwotCi0gICAgaWYgKHJlY3Yoc29jaywgJmNvZGUsIDEsIDApICE9IDEpIHsKLSAgICAgICAgcHV0cygiRmFpbGVkIHRvIHJlY2VpdmUiKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHByaW50ZigiJWQgJXNcbiIsIGNvZGUgLCByZXNwb25zZXNbY29kZV0gPyByZXNwb25zZXNbY29kZV0gOiAiVW5rbm93biIpOwotICAgIHdoaWxlICgoaSA9IHJlY3Yoc29jaywgJmJ5dGVzWzBdLCAxLCAwKSkgPT0gMSkgewotICAgICAgICBpbnQgbGVuZ3RoOwotICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICBpZiAoKGkgPSByZWN2KHNvY2ssICZieXRlc1sxXSwgMSwgMCkpICE9IDEpIHsKLSAgICAgICAgICAgIHB1dHMoIkZhaWxlZCB0byByZWNlaXZlIik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBsZW5ndGggPSBieXRlc1swXSA8PCA4IHwgYnl0ZXNbMV07Ci0gICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbGVuZ3RoOyBvZmZzZXQgKz0gaSkgewotICAgICAgICAgICAgaSA9IHJlY3Yoc29jaywgJmJ5dGVzW29mZnNldF0sIGxlbmd0aCAtIG9mZnNldCwgMCk7Ci0gICAgICAgICAgICBpZiAoaSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHV0cygiRmFpbGVkIHRvIHJlY2VpdmUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmd3JpdGUoYnl0ZXMsIDEsIGxlbmd0aCwgc3Rkb3V0KTsKLSAgICAgICAgcHV0cygiIik7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvY21kcy9rZXlzdG9yZS9rZXlzdG9yZV9jbGkuY3BwIGIvY21kcy9rZXlzdG9yZS9rZXlzdG9yZV9jbGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDNiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL2tleXN0b3JlL2tleXN0b3JlX2NsaS5jcHAKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPGN1dGlscy9zb2NrZXRzLmg+CisKKyNpbmNsdWRlICJrZXlzdG9yZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciogcmVzcG9uc2VzW10gPSB7CisgICAgTlVMTCwKKyAgICAvKiBbTk9fRVJST1JdICAgICAgICAgICA9ICovICJObyBlcnJvciIsCisgICAgLyogW0xPQ0tFRF0gICAgICAgICAgICAgPSAqLyAiTG9ja2VkIiwKKyAgICAvKiBbVU5JTklUSUFMSVpFRF0gICAgICA9ICovICJVbmluaXRpYWxpemVkIiwKKyAgICAvKiBbU1lTVEVNX0VSUk9SXSAgICAgICA9ICovICJTeXN0ZW0gZXJyb3IiLAorICAgIC8qIFtQUk9UT0NPTF9FUlJPUl0gICAgID0gKi8gIlByb3RvY29sIGVycm9yIiwKKyAgICAvKiBbUEVSTUlTU0lPTl9ERU5JRURdICA9ICovICJQZXJtaXNzaW9uIGRlbmllZCIsCisgICAgLyogW0tFWV9OT1RfRk9VTkRdICAgICAgPSAqLyAiS2V5IG5vdCBmb3VuZCIsCisgICAgLyogW1ZBTFVFX0NPUlJVUFRFRF0gICAgPSAqLyAiVmFsdWUgY29ycnVwdGVkIiwKKyAgICAvKiBbVU5ERUZJTkVEX0FDVElPTl0gICA9ICovICJVbmRlZmluZWQgYWN0aW9uIiwKKyAgICAvKiBbV1JPTkdfUEFTU1dPUkRdICAgICA9ICovICJXcm9uZyBwYXNzd29yZCAobGFzdCBjaGFuY2UpIiwKKyAgICAvKiBbV1JPTkdfUEFTU1dPUkQgKyAxXSA9ICovICJXcm9uZyBwYXNzd29yZCAoMiB0cmllcyBsZWZ0KSIsCisgICAgLyogW1dST05HX1BBU1NXT1JEICsgMl0gPSAqLyAiV3JvbmcgcGFzc3dvcmQgKDMgdHJpZXMgbGVmdCkiLAorICAgIC8qIFtXUk9OR19QQVNTV09SRCArIDNdID0gKi8gIldyb25nIHBhc3N3b3JkICg0IHRyaWVzIGxlZnQpIiwKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgICAgaWYgKGFyZ2MgPCAyKSB7CisgICAgICAgIHByaW50ZigiVXNhZ2U6ICVzIGFjdGlvbiBbcGFyYW1ldGVyIC4uLl1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgc29jayA9IHNvY2tldF9sb2NhbF9jbGllbnQoImtleXN0b3JlIiwgQU5EUk9JRF9TT0NLRVRfTkFNRVNQQUNFX1JFU0VSVkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0NLX1NUUkVBTSk7CisgICAgaWYgKHNvY2sgPT0gLTEpIHsKKyAgICAgICAgcHV0cygiRmFpbGVkIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc2VuZChzb2NrLCBhcmd2WzFdLCAxLCAwKTsKKyAgICB1aW50OF90IGJ5dGVzWzY1NTM2XTsKKyAgICBmb3IgKGludCBpID0gMjsgaSA8IGFyZ2M7ICsraSkgeworICAgICAgICB1aW50MTZfdCBsZW5ndGggPSBzdHJsZW4oYXJndltpXSk7CisgICAgICAgIGJ5dGVzWzBdID0gbGVuZ3RoID4+IDg7CisgICAgICAgIGJ5dGVzWzFdID0gbGVuZ3RoOworICAgICAgICBzZW5kKHNvY2ssICZieXRlcywgMiwgMCk7CisgICAgICAgIHNlbmQoc29jaywgYXJndltpXSwgbGVuZ3RoLCAwKTsKKyAgICB9CisgICAgc2h1dGRvd24oc29jaywgU0hVVF9XUik7CisKKyAgICB1aW50OF90IGNvZGU7CisgICAgaWYgKHJlY3Yoc29jaywgJmNvZGUsIDEsIDApICE9IDEpIHsKKyAgICAgICAgcHV0cygiRmFpbGVkIHRvIHJlY2VpdmUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHByaW50ZigiJWQgJXNcbiIsIGNvZGUgLCByZXNwb25zZXNbY29kZV0gPyByZXNwb25zZXNbY29kZV0gOiAiVW5rbm93biIpOworICAgIGludCBpOworICAgIHdoaWxlICgoaSA9IHJlY3Yoc29jaywgJmJ5dGVzWzBdLCAxLCAwKSkgPT0gMSkgeworICAgICAgICBpbnQgbGVuZ3RoOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBpZiAoKGkgPSByZWN2KHNvY2ssICZieXRlc1sxXSwgMSwgMCkpICE9IDEpIHsKKyAgICAgICAgICAgIHB1dHMoIkZhaWxlZCB0byByZWNlaXZlIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggPSBieXRlc1swXSA8PCA4IHwgYnl0ZXNbMV07CisgICAgICAgIGZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbGVuZ3RoOyBvZmZzZXQgKz0gaSkgeworICAgICAgICAgICAgaSA9IHJlY3Yoc29jaywgJmJ5dGVzW29mZnNldF0sIGxlbmd0aCAtIG9mZnNldCwgMCk7CisgICAgICAgICAgICBpZiAoaSA8PSAwKSB7CisgICAgICAgICAgICAgICAgcHV0cygiRmFpbGVkIHRvIHJlY2VpdmUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmd3JpdGUoYnl0ZXMsIDEsIGxlbmd0aCwgc3Rkb3V0KTsKKyAgICAgICAgcHV0cygiIik7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YSBiL2NtZHMvcG0vc3JjL2NvbS9hbmRyb2lkL2NvbW1hbmRzL3BtL1BtLmphdmEKaW5kZXggYjBlNGE4Ni4uZTQzMzA3OSAxMDA2NDQKLS0tIGEvY21kcy9wbS9zcmMvY29tL2FuZHJvaWQvY29tbWFuZHMvcG0vUG0uamF2YQorKysgYi9jbWRzL3BtL3NyYy9jb20vYW5kcm9pZC9jb21tYW5kcy9wbS9QbS5qYXZhCkBAIC0xMjAsNiArMTIwLDExIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoImRpc2FibGUtdXNlciIuZXF1YWxzKG9wKSkgeworICAgICAgICAgICAgcnVuU2V0RW5hYmxlZFNldHRpbmcoUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRURfVVNFUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBpZiAoInNldEluc3RhbGxMb2NhdGlvbiIuZXF1YWxzKG9wKSkgewogICAgICAgICAgICAgcnVuU2V0SW5zdGFsbExvY2F0aW9uKCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC05NzAsNiArOTc1LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gImVuYWJsZWQiOwogICAgICAgICAgICAgY2FzZSBQYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRDoKICAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkIjsKKyAgICAgICAgICAgIGNhc2UgUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRURfVVNFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gImRpc2FibGVkLXVzZXIiOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAidW5rbm93biI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMTI2MmZhLi5jYTc3MTg1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtNjYsNiArNjYsNyBAQAogc3RhdGljIGxvbmcgZ01heE51bUZyYW1lczsgIC8vIDAgbWVhbnMgZGVjb2RlIGFsbCBhdmFpbGFibGUuCiBzdGF0aWMgbG9uZyBnUmVwcm9kdWNlQnVnOyAgLy8gaWYgbm90IC0xLgogc3RhdGljIGJvb2wgZ1ByZWZlclNvZnR3YXJlQ29kZWM7CitzdGF0aWMgYm9vbCBnRm9yY2VUb1VzZUhhcmR3YXJlQ29kZWM7CiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOwpAQCAtMTQ0LDEwICsxNDUsMTggQEAKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLCBtaW1lKSkgewogICAgICAgICByYXdTb3VyY2UgPSBzb3VyY2U7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKGdQcmVmZXJTb2Z0d2FyZUNvZGVjKSB7CisgICAgICAgICAgICBmbGFncyB8PSBPTVhDb2RlYzo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOworICAgICAgICB9CisgICAgICAgIGlmIChnRm9yY2VUb1VzZUhhcmR3YXJlQ29kZWMpIHsKKyAgICAgICAgICAgIENIRUNLKCFnUHJlZmVyU29mdHdhcmVDb2RlYyk7CisgICAgICAgICAgICBmbGFncyB8PSBPTVhDb2RlYzo6a0hhcmR3YXJlQ29kZWNzT25seTsKKyAgICAgICAgfQogICAgICAgICByYXdTb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAogICAgICAgICAgICAgY2xpZW50LT5pbnRlcmZhY2UoKSwgbWV0YSwgZmFsc2UgLyogY3JlYXRlRW5jb2RlciAqLywgc291cmNlLAogICAgICAgICAgICAgTlVMTCAvKiBtYXRjaENvbXBvbmVudE5hbWUgKi8sCi0gICAgICAgICAgICBnUHJlZmVyU29mdHdhcmVDb2RlYyA/IE9NWENvZGVjOjprUHJlZmVyU29mdHdhcmVDb2RlY3MgOiAwLAorICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICBnU3VyZmFjZSk7CiAKICAgICAgICAgaWYgKHJhd1NvdXJjZSA9PSBOVUxMKSB7CkBAIC01NDUsNiArNTU0LDcgQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcChyb2ZpbGVzKSBkdW1wIGRlY29kZXIgcHJvZmlsZXMgc3VwcG9ydGVkXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdChodW1ibmFpbCkgZXh0cmFjdCB2aWRlbyB0aHVtYm5haWwgb3IgYWxidW0gYXJ0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcyhvZnR3YXJlKSBwcmVmZXIgc29mdHdhcmUgY29kZWNcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1yKGhhcmR3YXJlKSBmb3JjZSB0byB1c2UgaGFyZHdhcmUgY29kZWNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1vIHBsYXliYWNrIGF1ZGlvXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdyhyaXRlKSBmaWxlbmFtZSAod3JpdGUgdG8gLm1wNCBmaWxlKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWsgc2VlayB0ZXN0XG4iKTsKQEAgLTU2Niw2ICs1NzYsNyBAQAogICAgIGdNYXhOdW1GcmFtZXMgPSAwOwogICAgIGdSZXByb2R1Y2VCdWcgPSAtMTsKICAgICBnUHJlZmVyU29mdHdhcmVDb2RlYyA9IGZhbHNlOworICAgIGdGb3JjZVRvVXNlSGFyZHdhcmVDb2RlYyA9IGZhbHNlOwogICAgIGdQbGF5YmFja0F1ZGlvID0gZmFsc2U7CiAgICAgZ1dyaXRlTVA0ID0gZmFsc2U7CiAgICAgZ0Rpc3BsYXlIaXN0b2dyYW0gPSBmYWxzZTsKQEAgLTU3NSw3ICs1ODYsNyBAQAogICAgIHNwPExpdmVTZXNzaW9uPiBsaXZlU2Vzc2lvbjsKIAogICAgIGludCByZXM7Ci0gICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c293Omt4UyIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c3JvdzpreFMiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC02MzYsNiArNjQ3LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdGb3JjZVRvVXNlSGFyZHdhcmVDb2RlYyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGdQbGF5YmFja0F1ZGlvID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZS5qYXZhCmluZGV4IDAzMzQ2ZmUuLjE2NGFjYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0FjY2Vzc2liaWxpdHlTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2UuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKIAogLyoqCiAgKiBBbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgcnVucyBpbiB0aGUgYmFja2dyb3VuZCBhbmQgcmVjZWl2ZXMgY2FsbGJhY2tzIGJ5IHRoZSBzeXN0ZW0KQEAgLTM5LDIxICs0MCw2NyBAQAogICogPHA+CiAgKiA8Y29kZT4KICAqICZsdDtzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLk15QWNjZXNzaWJpbGl0eVNlcnZpY2UiJmd0Ozxicj4KLSAqICAgICAmbHQ7aW50ZW50LWZpbHRlciZndDs8YnI+Ci0gKiAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlIiAvJmd0Ozxicj4KLSAqICAgICAmbHQ7L2ludGVudC1maWx0ZXImZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jmx0O2ludGVudC1maWx0ZXImZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0O2FjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiIC8mZ3Q7PGJyPgorICogJm5ic3A7Jm5ic3A7Jmx0Oy9pbnRlbnQtZmlsdGVyJmd0Ozxicj4KICAqICZsdDsvc2VydmljZSZndDs8YnI+CiAgKiA8L2NvZGU+CisgKiA8L3A+CiAgKiA8cD4KICAqIFRoZSBsaWZlY3ljbGUgb2YgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG1hbmFnZWQgZXhjbHVzaXZlbHkgYnkgdGhlIHN5c3RlbS4gU3RhcnRpbmcKICAqIG9yIHN0b3BwaW5nIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyB0cmlnZ2VyZWQgYnkgYW4gZXhwbGljaXQgdXNlciBhY3Rpb24gdGhyb3VnaAogICogZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0IGluIHRoZSBkZXZpY2Ugc2V0dGluZ3MuIEFmdGVyIHRoZSBzeXN0ZW0gYmluZHMgdG8gYSBzZXJ2aWNlIGl0CiAgKiBjYWxscyB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2Ujb25TZXJ2aWNlQ29ubmVjdGVkKCl9LiBUaGlzIG1ldGhvZCBjYW4gYmUKLSAqIG92ZXJyaWRlbiBieSBjbGllbnRzIHRoYXQgd2FudCB0byBwZXJmb3JtIHBvc3QgYmluZGluZyBzZXR1cC4gQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCi0gKiBpcyBjb25maWd1cmVkIHRob3VnaCBzZXR0aW5nIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99IGJ5IGNhbGxpbmcKLSAqIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZSNzZXRTZXJ2aWNlSW5mbyhBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pfS4gWW91IGNhbiBjYWxsIHRoaXMKLSAqIG1ldGhvZCBhbnkgdGltZSB0byBjaGFuZ2UgdGhlIHNlcnZpY2UgY29uZmlndXJhdGlvbiBidXQgaXQgaXMgZ29vZCBwcmFjdGljZSB0byBkbyB0aGF0Ci0gKiBpbiB0aGUgb3ZlcnJpZGVuIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZSNvblNlcnZpY2VDb25uZWN0ZWQoKX0uCisgKiBvdmVycmlkZW4gYnkgY2xpZW50cyB0aGF0IHdhbnQgdG8gcGVyZm9ybSBwb3N0IGJpbmRpbmcgc2V0dXAuCisgKiA8L3A+CisgKiA8cD4KKyAqIEFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBjYW4gYmUgY29uZmlndXJlZCB0byByZWNlaXZlIHNwZWNpZmljIHR5cGVzIG9mIGFjY2Vzc2liaWxpdHkgZXZlbnRzLAorICogbGlzdGVuIG9ubHkgdG8gc3BlY2lmaWMgcGFja2FnZXMsIGdldCBldmVudHMgZnJvbSBlYWNoIHR5cGUgb25seSBvbmNlIGluIGEgZ2l2ZW4gdGltZSBmcmFtZSwKKyAqIHJldHJpZXZlIHdpbmRvdyBjb250ZW50LCBzcGVjaWZ5IGEgc2V0dGluZ3MgYWN0aXZpdHksIGV0Yy4KKyAqIDwvcD4KKyAqIFRoZXJlIGFyZSB0d28gYXBwcm9hY2hlcyBmb3IgY29uZmlndXJpbmcgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlOgorICogPHVsPgorICogICA8bGk+CisgKiAgICAgUHJvdmlkaW5nIGEge0BsaW5rICNTRVJWSUNFX01FVEFfREFUQSBtZXRhLWRhdGF9IGVudHJ5IGluIHRoZSBtYW5pZmVzdCB3aGVuIGRlY2xhcmluZworICogICAgIHRoZSBzZXJ2aWNlLiBBIHNlcnZpY2UgZGVjbGFyYXRpb24gd2l0aCBhIG1ldGEtZGF0YSB0YWcgaXMgcHJlc2VudGVkIGJlbG93OgorICogICAgIDxwPgorICogICAgICAgPGNvZGU+CisgKiAgICAgICAgICZsdDtzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iLk15QWNjZXNzaWJpbGl0eVNlcnZpY2UiJmd0Ozxicj4KKyAqICAgICAgICAgJm5ic3A7Jm5ic3A7Jmx0O2ludGVudC1maWx0ZXImZ3Q7PGJyPgorICogICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIgLyZndDs8YnI+CisgKiAgICAgICAgICZuYnNwOyZuYnNwOyZsdDsvaW50ZW50LWZpbHRlciZndDs8YnI+CisgKiAgICAgICAgICZuYnNwOyZuYnNwOyZsdDttZXRhLWRhdGEgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLmFzIiBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2FjY2Vzc2liaWxpdHlzZXJ2aWNlIiAvJmd0Ozxicj4KKyAqICAgICAgICAgJmx0Oy9zZXJ2aWNlJmd0Ozxicj4KKyAqICAgICAgIDwvY29kZT4KKyAqICAgICA8L3A+CisgKiAgICAgPHA+CisgKiAgICAgPHN0cm9uZz4KKyAqICAgICAgIFRoaXMgYXBwcm9hY2ggZW5hYmxlcyBzZXR0aW5nIGFsbCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgcHJvcGVydGllcy4KKyAqICAgICA8L3N0cm9uZz4KKyAqICAgICA8L3A+CisgKiAgICAgPHA+CisgKiAgICAgICBGb3IgbW9yZSBkZXRhaWxzIHJlZmVyIHRvIHtAbGluayAjU0VSVklDRV9NRVRBX0RBVEF9LgorICogICAgIDwvcD4KKyAqICAgPC9saT4KKyAqICAgPGxpPgorICogICAgIENhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlI3NldFNlcnZpY2VJbmZvKEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyl9LiBOb3RlCisgKiAgICAgdGhhdCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGFueSB0aW1lIHRvIGNoYW5nZSB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uLjxicj4KKyAqICAgICA8cD4KKyAqICAgICA8c3Ryb25nPgorICogICAgICAgVGhpcyBhcHByb2FjaCBlbmFibGVzIHNldHRpbmcgb25seSBkeW5hbWljYWxseSBjb25maWd1cmFibGUgYWNjZXNzaWJpbGl0eQorICogICAgICAgc2VydmljZSBwcm9wZXJ0aWVzOgorICogICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNldmVudFR5cGVzfSwKKyAqICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jZmVlZGJhY2tUeXBlfSwKKyAqICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jZmxhZ3N9LAorICogICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNub3RpZmljYXRpb25UaW1lb3V0fSwKKyAqICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jcGFja2FnZU5hbWVzfQorICogICAgIDwvc3Ryb25nPgorICogICAgIDwvcD4KKyAqICAgICA8cD4KKyAqICAgICAgIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30uCisgKiAgICAgPC9wPgorICogICA8L2xpPgorICogPC91bD4KICAqIDxwPgogICogQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGNhbiBiZSByZWdpc3RlcmVkIGZvciBldmVudHMgaW4gc3BlY2lmaWMgcGFja2FnZXMgdG8gcHJvdmlkZSBhCiAgKiBzcGVjaWZpYyB0eXBlIG9mIGZlZWRiYWNrIGFuZCBpcyBub3RpZmllZCB3aXRoIGEgY2VydGFpbiB0aW1lb3V0IGFmdGVyIHRoZSBsYXN0IGV2ZW50CkBAIC0xMDUsNiArMTUyLDYyIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPQogICAgICAgICAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSI7CiAKKyAgICAvKioKKyAgICAgKiBOYW1lIHVuZGVyIHdoaWNoIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIGNvbXBvbmVudCBwdWJsaXNoZXMgaW5mb3JtYXRpb24KKyAgICAgKiBhYm91dCBpdHNlbGYuIFRoaXMgbWV0YS1kYXRhIG11c3QgcmVmZXJlbmNlIGFuIFhNTCByZXNvdXJjZSBjb250YWluaW5nCisgICAgICogYW4KKyAgICAgKiA8Y29kZT4mbHQ7e0BsaW5rIGFuZHJvaWQuUi5zdHlsZWFibGUjQWNjZXNzaWJpbGl0eVNlcnZpY2UgYWNjZXNzaWJpbGl0eS1zZXJ2aWNlfSZndDs8L2NvZGU+CisgICAgICogdGFnLiBUaGlzIGlzIGEgYSBzYW1wbGUgWE1MIGZpbGUgY29uZmlndXJpbmcgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlOgorICAgICAqIDxwPgorICAgICAqIDxjb2RlPgorICAgICAqICAgJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPyZndDs8YnI+CisgICAgICogICAmbHQ7YWNjZXNzaWJpbGl0eS1zZXJ2aWNlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI8YnI+CisgICAgICogICAmbmJzcDsmbmJzcDthbmRyb2lkOmFjY2Vzc2liaWxpdHlFdmVudFR5cGVzPSJ0eXBlVmlld0NsaWNrZWR8dHlwZVZpZXdGb2N1c2VkIjxicj4KKyAgICAgKiAgICZuYnNwOyZuYnNwO2FuZHJvaWQ6cGFja2FnZU5hbWVzPSJmb28uYmFyLCBmb28uYmF6Ijxicj4KKyAgICAgKiAgICZuYnNwOyZuYnNwO2FuZHJvaWQ6YWNjZXNzaWJpbGl0eUZlZWRiYWNrVHlwZT0iZmVlZGJhY2tTcG9rZW4iPGJyPgorICAgICAqICAgJm5ic3A7Jm5ic3A7YW5kcm9pZDpub3RpZmljYXRpb25UaW1lb3V0PSIxMDAiPGJyPgorICAgICAqICAgJm5ic3A7Jm5ic3A7YW5kcm9pZDphY2Nlc3NpYmlsaXR5RmxhZ3M9ImZsYWdEZWZhdWx0Ijxicj4KKyAgICAgKiAgICZuYnNwOyZuYnNwO2FuZHJvaWQ6c2V0dGluZ3NBY3Rpdml0eT0iZm9vLmJhci5UZXN0QmFja0FjdGl2aXR5Ijxicj4KKyAgICAgKiAgICZuYnNwOyZuYnNwOy4gLiAuPGJyPgorICAgICAqICAgLyZndDsKKyAgICAgKiA8L2NvZGU+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEEgc2VydmljZSBjYW4gcmV0cmlldmUgb25seSB0aGUgY29udGVudCBvZiB0aGUgYWN0aXZlIHdpbmRvdy4KKyAgICAgKiAgICAgICAgICBBbiBhY3RpdmUgd2luZG93IGlzIHRoZSBzb3VyY2Ugb2YgdGhlIG1vc3QgcmVjZW50IGV2ZW50IG9mIHR5cGUKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVE9VQ0hfRVhQTE9SQVRJT05fR0VTVFVSRV9TVEFSVH0sCisgICAgICogICAgICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfRU5EfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19DTElDS0VEfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19GT0NVU0VEfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19IT1ZFUl9FTlRFUn0sCisgICAgICogICAgICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfSE9WRVJfRVhJVH0sCisgICAgICogICAgICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfTE9OR19DTElDS0VEfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19TRUxFQ1RFRH0sCisgICAgICogICAgICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfVEVYVF9DSEFOR0VEfSwKKyAgICAgKiAgICAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUR9LgorICAgICAqICAgICAgICAgIFRoZXJlZm9yZSB0aGUgc2VydmljZSBzaG91bGQ6CisgICAgICogICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgPGxpPgorICAgICAqICAgICAgICAgICAgICBSZWdpc3RlciBmb3IgYWxsIGV2ZW50IHR5cGVzIHdpdGggbm8gbm90aWZpY2F0aW9uIHRpbWVvdXQgYW5kIGtlZXAgdHJhY2sKKyAgICAgKiAgICAgICAgICAgICAgZm9yIHRoZSBhY3RpdmUgd2luZG93IGJ5IGNhbGxpbmcKKyAgICAgKiAgICAgICAgICAgICAge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudCNnZXRXaW5kb3dJZCgpfSBvZiB0aGUgbGFzdCByZWNlaXZlZAorICAgICAqICAgICAgICAgICAgICBldmVudCBhbmQgY29tcGFyZSB0aGlzIHdpdGggdGhlCisgICAgICogICAgICAgICAgICAgIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jZ2V0V2luZG93SWQoKX0gYmVmb3JlIGNhbGxpbmcKKyAgICAgKiAgICAgICAgICAgICAgcmV0cmlldmFsIG1ldGhvZHMgb24gdGhlIGxhdHRlci4KKyAgICAgKiAgICAgICAgICAgIDwvbGk+CisgICAgICogICAgICAgICAgICA8bGk+CisgICAgICogICAgICAgICAgICAgIFByZXBhcmUgdGhhdCBhIHJldHJpZXZhbCBtZXRob2Qgb24ge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30gbWF5IGZhaWwKKyAgICAgKiAgICAgICAgICAgICAgc2luY2UgdGhlIGFjdGl2ZSB3aW5kb3cgaGFzIGNoYW5nZWQgYW5kIHRoZSBzZXJ2aWNlIGRpZCBub3QgZ2V0IHRoZSAKKyAgICAgKiAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eSBldmVudC4gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSByZXRyaWV2YWwgbWV0aG9kCisgICAgICogICAgICAgICAgICAgIGZhaWxpbmcgZXZlbnQgYWRvcHRpbmcgdGhlIHN0cmF0ZWd5IHNwZWNpZmllZCBpbiB0aGUgcHJldmlvdXMgYnVsbGV0CisgICAgICogICAgICAgICAgICAgIGJlY2F1c2UgdGhlIGFjY2Vzc2liaWxpdHkgZXZlbnQgZGlzcGF0Y2ggaXMgYXN5bmNocm9ub3VzIGFuZCBjcm9zc2VzCisgICAgICogICAgICAgICAgICAgIHByb2Nlc3MgYm91bmRhcmllcy4gCisgICAgICogICAgICAgICAgICA8L2xpPgorICAgICAqICAgICAgICAgIDx1bD4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9NRVRBX0RBVEEgPSAiYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZSI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJBY2Nlc3NpYmlsaXR5U2VydmljZSI7CiAKICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBtSW5mbzsKQEAgLTE2NSw3ICsyNjgsNyBAQAogCiAgICAgLyoqCiAgICAgICogSW1wbGVtZW50IHRvIHJldHVybiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGFjY2Vzc2liaWxpdHkKLSAgICAgKiBzZXJ2aWNlIGludGVyZmFjZS4gIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBvdmVycmlkZS4KKyAgICAgKiBzZXJ2aWNlIGludGVyZmFjZS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uamF2YQppbmRleCBiZjllMDdkLi5iOTg3OGNkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uamF2YQpAQCAtMTYsOCArMTYsMjUgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlOwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKKworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIC8qKgogICogVGhpcyBjbGFzcyBkZXNjcmliZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4gVGhlIHN5c3RlbQpAQCAtMzAsNiArNDcsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDQ0VTU0lCSUxJVFlfU0VSVklDRSA9ICJhY2Nlc3NpYmlsaXR5LXNlcnZpY2UiOworCiAgICAgLyoqCiAgICAgICogRGVub3RlcyBzcG9rZW4gZmVlZGJhY2suCiAgICAgICovCkBAIC02NCw3ICs4Myw5IEBACiAKICAgICAvKioKICAgICAgKiBUaGUgZXZlbnQgdHlwZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfSBpcyBpbnRlcmVzdGVkIGluLgotICAgICAqCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPkNhbiBiZSBkeW5hbWljYWxseSBzZXQgYXQgcnVudGltZS48L3N0cm9uZz4KKyAgICAgKiA8L3A+CiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0NMSUNLRUQKICAgICAgKiBAc2VlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfTE9OR19DTElDS0VECiAgICAgICogQHNlZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0ZPQ1VTRUQKQEAgLTc3LDEzICs5OCwxOCBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIHBhY2thZ2UgbmFtZXMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfSBpcyBpbnRlcmVzdGVkIGluLiBTZXR0aW5nCi0gICAgICogdG8gbnVsbCBpcyBlcXVpdmFsZW50IHRvIGFsbCBwYWNrYWdlcy4gCisgICAgICogdG8gbnVsbCBpcyBlcXVpdmFsZW50IHRvIGFsbCBwYWNrYWdlcy4KKyAgICAgKiA8cD4KKyAgICAgKiAgIDxzdHJvbmc+Q2FuIGJlIGR5bmFtaWNhbGx5IHNldCBhdCBydW50aW1lLjwvc3Ryb25nPgorICAgICAqIDwvcD4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gcGFja2FnZU5hbWVzOwogCiAgICAgLyoqCiAgICAgICogVGhlIGZlZWRiYWNrIHR5cGUgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfSBwcm92aWRlcy4KLSAgICAgKgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz5DYW4gYmUgZHluYW1pY2FsbHkgc2V0IGF0IHJ1bnRpbWUuPC9zdHJvbmc+CisgICAgICogPC9wPgogICAgICAqIEBzZWUgI0ZFRURCQUNLX0FVRElCTEUKICAgICAgKiBAc2VlICNGRUVEQkFDS19HRU5FUklDCiAgICAgICogQHNlZSAjRkVFREJBQ0tfSEFQVElDCkBAIC05Niw2ICsxMjIsOSBAQAogICAgICAqIFRoZSB0aW1lb3V0IGFmdGVyIHRoZSBtb3N0IHJlY2VudCBldmVudCBvZiBhIGdpdmVuIHR5cGUgYmVmb3JlIGFuCiAgICAgICoge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfSBpcyBub3RpZmllZC4KICAgICAgKiA8cD4KKyAgICAgKiAgIDxzdHJvbmc+Q2FuIGJlIGR5bmFtaWNhbGx5IHNldCBhdCBydW50aW1lLjwvc3Ryb25nPi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CiAgICAgICogTm90ZTogVGhlIGV2ZW50IG5vdGlmaWNhdGlvbiB0aW1lb3V0IGlzIHVzZWZ1bCB0byBhdm9pZCBwcm9wYWdhdGluZyBldmVudHMgdG8gdGhlIGNsaWVudAogICAgICAqICAgICAgIHRvbyBmcmVxdWVudGx5IHNpbmNlIHRoaXMgaXMgYWNjb21wbGlzaGVkIHZpYSBhbiBleHBlbnNpdmUgaW50ZXJwcm9jZXNzIGNhbGwuCiAgICAgICogICAgICAgT25lIGNhbiB0aGluayBvZiB0aGUgdGltZW91dCBhcyBhIGNyaXRlcmlhIHRvIGRldGVybWluZSB3aGVuIGV2ZW50IGdlbmVyYXRpb24gaGFzCkBAIC0xMDYsMTEgKzEzNSwxODEgQEAKICAgICAvKioKICAgICAgKiBUaGlzIGZpZWxkIHJlcHJlc2VudHMgYSBzZXQgb2YgZmxhZ3MgdXNlZCBmb3IgY29uZmlndXJpbmcgYW4KICAgICAgKiB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgotICAgICAqCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPkNhbiBiZSBkeW5hbWljYWxseSBzZXQgYXQgcnVudGltZS48L3N0cm9uZz4KKyAgICAgKiA8L3A+CiAgICAgICogQHNlZSAjREVGQVVMVAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZmxhZ3M7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgdW5pcXVlIHN0cmluZyBJZCB0byBpZGVudGlmeSB0aGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1JZDsKKworICAgIC8qKgorICAgICAqIFRoZSBTZXJ2aWNlIHRoYXQgaW1wbGVtZW50cyB0aGlzIGFjY2Vzc2liaWxpdHkgc2VydmljZSBjb21wb25lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNvbHZlSW5mbyBtUmVzb2x2ZUluZm87CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHNldHRpbmcgYWN0aXZpdHkncyBuYW1lLCB1c2VkIGJ5IHRoZSBzeXN0ZW0KKyAgICAgKiBzZXR0aW5ncyB0byBsYXVuY2ggdGhlIHNldHRpbmcgYWN0aXZpdHkgb2YgdGhpcyBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbVNldHRpbmdzQWN0aXZpdHlOYW1lOworCisgICAgLyoqCisgICAgICogRmxhZyB3aGV0aGVyIHRoaXMgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGNhbiByZXRyaWV2ZSBzY3JlZW4gY29udGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbUNhblJldHJpZXZlV2luZG93Q29udGVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpIHsKKyAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZUluZm8gVGhlIHNlcnZpY2UgcmVzb2x2ZSBpbmZvLgorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIGFjY2Vzc2luZyByZXNvdXJjZXMuCisgICAgICogQHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIElmIGEgWE1MIHBhcnNpbmcgZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgYSBYTUwgcGFyc2luZyBlcnJvciBvY2N1cnMuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8sIENvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gcmVzb2x2ZUluZm8uc2VydmljZUluZm87CisgICAgICAgIG1JZCA9IG5ldyBDb21wb25lbnROYW1lKHNlcnZpY2VJbmZvLnBhY2thZ2VOYW1lLCBzZXJ2aWNlSW5mby5uYW1lKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOworICAgICAgICBtUmVzb2x2ZUluZm8gPSByZXNvbHZlSW5mbzsKKworICAgICAgICBTdHJpbmcgc2V0dGluZ3NBY3Rpdml0eU5hbWUgPSBudWxsOworICAgICAgICBib29sZWFuIHJldHJpZXZlU2NyZWVuQ29udGVudCA9IGZhbHNlOworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwYWNrYWdlTWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgICAgIHBhcnNlciA9IHNlcnZpY2VJbmZvLmxvYWRYbWxNZXRhRGF0YShwYWNrYWdlTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2UuU0VSVklDRV9NRVRBX0RBVEEpOworICAgICAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgdHlwZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IHBhcnNlci5uZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICBpZiAoIVRBR19BQ0NFU1NJQklMSVRZX1NFUlZJQ0UuZXF1YWxzKG5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uKCAiTWV0YS1kYXRhIGRvZXMgbm90IHN0YXJ0IHdpdGgiCisgICAgICAgICAgICAgICAgICAgICAgICArIFRBR19BQ0NFU1NJQklMSVRZX1NFUlZJQ0UgKyAiIHRhZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBdHRyaWJ1dGVTZXQgYWxsQXR0cmlidXRlcyA9IFhtbC5hc0F0dHJpYnV0ZVNldChwYXJzZXIpOworICAgICAgICAgICAgUmVzb3VyY2VzIHJlc291cmNlcyA9IHBhY2thZ2VNYW5hZ2VyLmdldFJlc291cmNlc0ZvckFwcGxpY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSW5mby5hcHBsaWNhdGlvbkluZm8pOworICAgICAgICAgICAgVHlwZWRBcnJheSBhc0F0dHJpYnV0ZXMgPSByZXNvdXJjZXMub2J0YWluQXR0cmlidXRlcyhhbGxBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY2Nlc3NpYmlsaXR5U2VydmljZSk7CisgICAgICAgICAgICBldmVudFR5cGVzID0gYXNBdHRyaWJ1dGVzLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWNjZXNzaWJpbGl0eVNlcnZpY2VfYWNjZXNzaWJpbGl0eUV2ZW50VHlwZXMsCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1leiA9IGFzQXR0cmlidXRlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlX3BhY2thZ2VOYW1lcyk7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWV6ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZXMgPSBwYWNrYWdlTmFtZXouc3BsaXQoIihcXHMpKiwoXFxzKSoiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZlZWRiYWNrVHlwZSA9IGFzQXR0cmlidXRlcy5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlX2FjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgbm90aWZpY2F0aW9uVGltZW91dCA9IGFzQXR0cmlidXRlcy5nZXRJbnQoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlX25vdGlmaWNhdGlvblRpbWVvdXQsIAorICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGZsYWdzID0gYXNBdHRyaWJ1dGVzLmdldEludCgKKyAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWNjZXNzaWJpbGl0eVNlcnZpY2VfYWNjZXNzaWJpbGl0eUZsYWdzLCAwKTsKKyAgICAgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IGFzQXR0cmlidXRlcy5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlX3NldHRpbmdzQWN0aXZpdHkpOworICAgICAgICAgICAgbUNhblJldHJpZXZlV2luZG93Q29udGVudCA9IGFzQXR0cmlidXRlcy5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BY2Nlc3NpYmlsaXR5U2VydmljZV9jYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgIGFzQXR0cmlidXRlcy5yZWN5Y2xlKCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiggIlVuYWJsZSB0byBjcmVhdGUgY29udGV4dCBmb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgdGhhdCBhbiBBY2Nlc3NpYmlsaXR5U2VyaXZpY2UgY2FuIGNoYW5nZSBkeW5hbWljYWxseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciBUaGUgaW5mbyBmcm9tIHdoaWNoIHRvIHVwZGF0ZSB0aGUgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRHluYW1pY2FsbHlDb25maWd1cmFibGVQcm9wZXJ0aWVzKEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBvdGhlcikgeworICAgICAgICBldmVudFR5cGVzID0gb3RoZXIuZXZlbnRUeXBlczsKKyAgICAgICAgcGFja2FnZU5hbWVzID0gb3RoZXIucGFja2FnZU5hbWVzOworICAgICAgICBmZWVkYmFja1R5cGUgPSBvdGhlci5mZWVkYmFja1R5cGU7CisgICAgICAgIG5vdGlmaWNhdGlvblRpbWVvdXQgPSBvdGhlci5ub3RpZmljYXRpb25UaW1lb3V0OworICAgICAgICBmbGFncyA9IG90aGVyLmZsYWdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaWQuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPkdlbmVyYXRlZCBieSB0aGUgc3lzdGVtLjwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIFRoZSBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIHtAbGluayBSZXNvbHZlSW5mb30uCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPkdlbmVyYXRlZCBieSB0aGUgc3lzdGVtLjwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvbHZlSW5mbyBnZXRSZXNvbHZlSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1SZXNvbHZlSW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2V0dGluZ3MgYWN0aXZpdHkgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiAgICA8c3Ryb25nPlN0YXRpY2FsbHkgc2V0IGZyb20KKyAgICAgKiAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2UjU0VSVklDRV9NRVRBX0RBVEEgbWV0YS1kYXRhfS48L3N0cm9uZz4KKyAgICAgKiA8L3A+CisgICAgICogQHJldHVybiBUaGUgc2V0dGluZ3MgYWN0aXZpdHkgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNldHRpbmdzQWN0aXZpdHlOYW1lKCkgeworICAgICAgICByZXR1cm4gbVNldHRpbmdzQWN0aXZpdHlOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyBzZXJ2aWNlIGNhbiByZXRyaWV2ZSB0aGUgY3VycmVudGx5IGZvY3VzZWQgd2luZG93IGNvbnRlbnQuCisgICAgICogPHA+CisgICAgICogICAgPHN0cm9uZz5TdGF0aWNhbGx5IHNldCBmcm9tCisgICAgICogICAge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlI1NFUlZJQ0VfTUVUQV9EQVRBIG1ldGEtZGF0YX0uPC9zdHJvbmc+CisgICAgICogPC9wPgorICAgICAqIEByZXR1cm4gVHJ1ZSBzY3JlZW4gY29udGVudCBpcyByZXRyaWV2ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q2FuUmV0cmlldmVXaW5kb3dDb250ZW50KCkgeworICAgICAgICByZXR1cm4gbUNhblJldHJpZXZlV2luZG93Q29udGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCiAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMjEsNiArMzIwLDE0MiBAQAogICAgICAgICBwYXJjZWwud3JpdGVJbnQoZmVlZGJhY2tUeXBlKTsKICAgICAgICAgcGFyY2VsLndyaXRlTG9uZyhub3RpZmljYXRpb25UaW1lb3V0KTsKICAgICAgICAgcGFyY2VsLndyaXRlSW50KGZsYWdzKTsKKyAgICAgICAgcGFyY2VsLndyaXRlU3RyaW5nKG1JZCk7CisgICAgICAgIHBhcmNlbC53cml0ZVBhcmNlbGFibGUobVJlc29sdmVJbmZvLCAwKTsKKyAgICAgICAgcGFyY2VsLndyaXRlU3RyaW5nKG1TZXR0aW5nc0FjdGl2aXR5TmFtZSk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtQ2FuUmV0cmlldmVXaW5kb3dDb250ZW50ID8gMSA6IDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0RnJvbVBhcmNlbChQYXJjZWwgcGFyY2VsKSB7CisgICAgICAgIGV2ZW50VHlwZXMgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBwYWNrYWdlTmFtZXMgPSBwYXJjZWwucmVhZFN0cmluZ0FycmF5KCk7CisgICAgICAgIGZlZWRiYWNrVHlwZSA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG5vdGlmaWNhdGlvblRpbWVvdXQgPSBwYXJjZWwucmVhZExvbmcoKTsKKyAgICAgICAgZmxhZ3MgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtSWQgPSBwYXJjZWwucmVhZFN0cmluZygpOworICAgICAgICBtUmVzb2x2ZUluZm8gPSBwYXJjZWwucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIG1TZXR0aW5nc0FjdGl2aXR5TmFtZSA9IHBhcmNlbC5yZWFkU3RyaW5nKCk7CisgICAgICAgIG1DYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQgPSAocGFyY2VsLnJlYWRJbnQoKSA9PSAxKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBhcHBlbmRFdmVudFR5cGVzKHN0cmluZ0J1aWxkZXIsIGV2ZW50VHlwZXMpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kUGFja2FnZU5hbWVzKHN0cmluZ0J1aWxkZXIsIHBhY2thZ2VOYW1lcyk7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRGZWVkYmFja1R5cGVzKHN0cmluZ0J1aWxkZXIsIGZlZWRiYWNrVHlwZSk7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgibm90aWZpY2F0aW9uVGltZW91dDogIikuYXBwZW5kKG5vdGlmaWNhdGlvblRpbWVvdXQpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kRmxhZ3Moc3RyaW5nQnVpbGRlciwgZmxhZ3MpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoImlkOiAiKS5hcHBlbmQobUlkKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJyZXNvbHZlSW5mbzogIikuYXBwZW5kKG1SZXNvbHZlSW5mbyk7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgic2V0dGluZ3NBY3Rpdml0eU5hbWU6ICIpLmFwcGVuZChtU2V0dGluZ3NBY3Rpdml0eU5hbWUpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoInJldHJpZXZlU2NyZWVuQ29udGVudDogIikuYXBwZW5kKG1DYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQpOworICAgICAgICByZXR1cm4gc3RyaW5nQnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRmVlZGJhY2tUeXBlcyhTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIsIGludCBmZWVkYmFja1R5cGVzKSB7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJmZWVkYmFja1R5cGVzOiIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiWyIpOworICAgICAgICB3aGlsZSAoZmVlZGJhY2tUeXBlcyAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZmVlZGJhY2tUeXBlQml0ID0gKDEgPDwgSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoZmVlZGJhY2tUeXBlcykpOworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoZmVlZGJhY2tUeXBlVG9TdHJpbmcoZmVlZGJhY2tUeXBlQml0KSk7CisgICAgICAgICAgICBmZWVkYmFja1R5cGVzICY9IH5mZWVkYmFja1R5cGVCaXQ7CisgICAgICAgICAgICBpZiAoZmVlZGJhY2tUeXBlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZFBhY2thZ2VOYW1lcyhTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIsIFN0cmluZ1tdIHBhY2thZ2VOYW1lcykgeworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgicGFja2FnZU5hbWVzOiIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiWyIpOworICAgICAgICBpZiAocGFja2FnZU5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBwYWNrYWdlTmFtZUNvdW50ID0gcGFja2FnZU5hbWVzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZU5hbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQocGFja2FnZU5hbWVzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IHBhY2thZ2VOYW1lQ291bnQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiXSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRXZlbnRUeXBlcyhTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIsIGludCBldmVudFR5cGVzKSB7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJldmVudFR5cGVzOiIpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiWyIpOworICAgICAgICB3aGlsZSAoZXZlbnRUeXBlcyAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZXZlbnRUeXBlQml0ID0gKDEgPDwgSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoZXZlbnRUeXBlcykpOworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoQWNjZXNzaWJpbGl0eUV2ZW50LmV2ZW50VHlwZVRvU3RyaW5nKGV2ZW50VHlwZUJpdCkpOworICAgICAgICAgICAgZXZlbnRUeXBlcyAmPSB+ZXZlbnRUeXBlQml0OworICAgICAgICAgICAgaWYgKGV2ZW50VHlwZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRGbGFncyhTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIsIGludCBmbGFncykgeworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiZmxhZ3M6Iik7CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJbIik7CisgICAgICAgIHdoaWxlIChmbGFncyAhPSAwKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ0JpdCA9ICgxIDw8IEludGVnZXIubnVtYmVyT2ZUcmFpbGluZ1plcm9zKGZsYWdzKSk7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChmbGFnVG9TdHJpbmcoZmxhZ0JpdCkpOworICAgICAgICAgICAgZmxhZ3MgJj0gfmZsYWdCaXQ7CisgICAgICAgICAgICBpZiAoZmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJdIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgZmVlZGJhY2sgdHlwZS4gRm9yIGV4YW1wbGUsCisgICAgICoge0BsaW5rICNGRUVEQkFDS19TUE9LRU59IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgRkVFREJBQ0tfU1BPS0VOLgorICAgICAqCisgICAgICogQHBhcmFtIGZlZWRiYWNrVHlwZSBUaGUgZmVlZGJhY2sgdHlwZS4KKyAgICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmVlZGJhY2tUeXBlVG9TdHJpbmcoaW50IGZlZWRiYWNrVHlwZSkgeworICAgICAgICBzd2l0Y2ggKGZlZWRiYWNrVHlwZSkgeworICAgICAgICAgICAgY2FzZSBGRUVEQkFDS19BVURJQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiRkVFREJBQ0tfQVVESUJMRSI7CisgICAgICAgICAgICBjYXNlIEZFRURCQUNLX0hBUFRJQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkZFRURCQUNLX0hBUFRJQyI7CisgICAgICAgICAgICBjYXNlIEZFRURCQUNLX0dFTkVSSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGRUVEQkFDS19HRU5FUklDIjsKKyAgICAgICAgICAgIGNhc2UgRkVFREJBQ0tfU1BPS0VOOgorICAgICAgICAgICAgICAgIHJldHVybiAiRkVFREJBQ0tfU1BPS0VOIjsKKyAgICAgICAgICAgIGNhc2UgRkVFREJBQ0tfVklTVUFMOgorICAgICAgICAgICAgICAgIHJldHVybiAiRkVFREJBQ0tfVklTVUFMIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBmbGFnLiBGb3IgZXhhbXBsZSwKKyAgICAgKiB7QGxpbmsgI0RFRkFVTFR9IGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgREVGQVVMVC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnLgorICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmbGFnVG9TdHJpbmcoaW50IGZsYWcpIHsKKyAgICAgICAgc3dpdGNoIChmbGFnKSB7CisgICAgICAgICAgICBjYXNlIERFRkFVTFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJERUZBVUxUIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTEzMCwxMSArNDY1LDcgQEAKICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPigpIHsKICAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBwYXJjZWwpIHsKICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvID0gbmV3IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbygpOwotICAgICAgICAgICAgaW5mby5ldmVudFR5cGVzID0gcGFyY2VsLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGluZm8ucGFja2FnZU5hbWVzID0gcGFyY2VsLnJlYWRTdHJpbmdBcnJheSgpOwotICAgICAgICAgICAgaW5mby5mZWVkYmFja1R5cGUgPSBwYXJjZWwucmVhZEludCgpOwotICAgICAgICAgICAgaW5mby5ub3RpZmljYXRpb25UaW1lb3V0ID0gcGFyY2VsLnJlYWRMb25nKCk7Ci0gICAgICAgICAgICBpbmZvLmZsYWdzID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGluZm8uaW5pdEZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgICAgIHJldHVybiBpbmZvOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0lBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24uYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0lBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24uYWlkbAppbmRleCA3MTU3ZGVmLi44YjRlN2FlZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbi5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0lBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24uYWlkbApAQCAtMTcsMTQgKzE3LDk3IEBACiBwYWNrYWdlIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2U7CiAKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiAKIC8qKgotICogSW50ZXJmYWNlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSNTZXJ2aWNlIGltcGxlbWVudHMsIGFuZCBwYXNzZXMgdG8gYW4KLSAqIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHNvIGl0IGNhbiBkeW5hbWljYWxseSBjb25maWd1cmUgaG93IHRoZSBzeXN0ZW0gaGFuZGxlcyBpdC4KKyAqIEludGVyZmFjZSBnaXZlbiB0byBhbiBBY2Nlc3NpYmlsaXR5U2VyaXZjZSB0byB0YWxrIHRvIHRoZSBBY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuCiAgKgogICogQGhpZGUKICAqLwotb25ld2F5IGludGVyZmFjZSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIHsKK2ludGVyZmFjZSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIHsKIAogICAgIHZvaWQgc2V0U2VydmljZUluZm8oaW4gQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8pOworCisgICAgLyoqCisgICAgICogRmluZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb30gYnkgYWNjZXNzaWJpbGl0eSBpZC4KKyAgICAgKiA8cD4KKyAgICAgKiAgIDxzdHJvbmc+CisgICAgICogICAgIEl0IGlzIGEgY2xpZW50IHJlc3BvbnNpYmlsaXR5IHRvIHJlY3ljbGUgdGhlIHJlY2VpdmVkIGluZm8gYnkKKyAgICAgKiAgICAgY2FsbGluZyB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3JlY3ljbGUoKX0gdG8gYXZvaWQgY3JlYXRpbmcKKyAgICAgKiAgICAgb2YgbXVsdGlwbGUgaW5zdGFuY2VzLgorICAgICAqICAgPC9zdHJvbmc+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlXaW5kb3dJZCBBIHVuaXF1ZSB3aW5kb3cgaWQuCisgICAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlWaWV3SWQgQSB1bmlxdWUgVmlldyBhY2Nlc3NpYmlsaXR5IGlkLgorICAgICAqIEByZXR1cm4gVGhlIG5vZGUgaW5mby4KKyAgICAgKi8KKyAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKGludCBhY2Nlc3NpYmlsaXR5V2luZG93SWQsCisgICAgICAgIGludCBhY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKworICAgIC8qKgorICAgICAqIEZpbmRzIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99cyBieSBWaWV3IHRleHQuIFRoZSBtYXRjaCBpcyBjYXNlCisgICAgICogaW5zZW5zaXRpdmUgY29udGFpbm1lbnQuIFRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkIGluIHRoZSB3aW5kb3cgd2hvc2UKKyAgICAgKiBpZCBpcyBzcGVjaWZpZWQgYW5kIHN0YXJ0cyBmcm9tIHRoZSBWaWV3IHdob3NlIGFjY2Vzc2liaWxpdHkgaWQgaXMKKyAgICAgKiBzcGVjaWZpZWQuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvcyBieQorICAgICAqICAgICBjYWxsaW5nIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jcmVjeWNsZSgpfSB0byBhdm9pZCBjcmVhdGluZworICAgICAqICAgICBvZiBtdWx0aXBsZSBpbnN0YW5jZXMuCisgICAgICogICA8L3N0cm9uZz4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgc2VhcmNoZWQgdGV4dC4KKyAgICAgKiBAcGFyYW0gYWNjZXNzaWJpbGl0eUlkIFRoZSBpZCBvZiB0aGUgdmlldyBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZy4KKyAgICAgKiAgICAgICAgVXNlIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNOT19JRH0gdG8gc3RhcnQgZnJvbSB0aGUgcm9vdC4KKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBub2RlIGluZm8uCisgICAgICovCisgICAgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3VGV4dChTdHJpbmcgdGV4dCwKKyAgICAgICAgaW50IGFjY2Vzc2liaWxpdHlXaW5kb3dJZCwgaW50IGFjY2Vzc2liaWxpdHlWaWV3SWQpOworCisgICAgLyoqCisgICAgICogRmluZHMge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mb31zIGJ5IFZpZXcgdGV4dC4gVGhlIG1hdGNoIGlzIGNhc2UKKyAgICAgKiBpbnNlbnNpdGl2ZSBjb250YWlubWVudC4gVGhlIHNlYXJjaCBpcyBwZXJmb3JtZWQgaW4gdGhlIGN1cnJlbnRseQorICAgICAqIGFjdGl2ZSB3aW5kb3cgYW5kIHN0YXJ0IGZyb20gdGhlIHJvb3QgVmlldyBpbiB0aGUgd2luZG93LgorICAgICAqIDxwPgorICAgICAqICAgPHN0cm9uZz4KKyAgICAgKiAgICAgSXQgaXMgYSBjbGllbnQgcmVzcG9uc2liaWxpdHkgdG8gcmVjeWNsZSB0aGUgcmVjZWl2ZWQgaW5mb3MgYnkKKyAgICAgKiAgICAgY2FsbGluZyB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3JlY3ljbGUoKX0gdG8gYXZvaWQgY3JlYXRpbmcKKyAgICAgKiAgICAgb2YgbXVsdGlwbGUgaW5zdGFuY2VzLgorICAgICAqICAgPC9zdHJvbmc+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRleHQgVGhlIHNlYXJjaGVkIHRleHQuCisgICAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlJZCBUaGUgaWQgb2YgdGhlIHZpZXcgZnJvbSB3aGljaCB0byBzdGFydCBzZWFyY2hpbmcuCisgICAgICogICAgICAgIFVzZSB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjTk9fSUR9IHRvIHN0YXJ0IGZyb20gdGhlIHJvb3QuCisgICAgICogQHJldHVybiBBIGxpc3Qgb2Ygbm9kZSBpbmZvLgorICAgICAqLworICAgIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHRJbkFjdGl2ZVdpbmRvdyhTdHJpbmcgdGV4dCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvfSBieSBWaWV3IGlkLiBUaGUgc2VhcmNoIGlzIHBlcmZvcm1lZAorICAgICAqIGluIHRoZSBjdXJyZW50bHkgYWN0aXZlIHdpbmRvdyBhbmQgc3RhcnQgZnJvbSB0aGUgcm9vdCBWaWV3IGluIHRoZSB3aW5kb3cuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvIGJ5CisgICAgICogICAgIGNhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNyZWN5Y2xlKCl9IHRvIGF2b2lkIGNyZWF0aW5nCisgICAgICogICAgIG9mIG11bHRpcGxlIGluc3RhbmNlcy4KKyAgICAgKiAgIDwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG5vZGUuCisgICAgICogQHJldHVybiBUaGUgbm9kZSBpbmZvLgorICAgICAqLworICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRJbkFjdGl2ZVdpbmRvdyhpbnQgdmlld0lkKTsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGFuIGFjY2Vzc2liaWxpdHkgYWN0aW9uIG9uIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99LgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc2liaWxpdHlXaW5kb3dJZCBUaGUgaWQgb2YgdGhlIHdpbmRvdy4KKyAgICAgKiBAcGFyYW0gYWNjZXNzaWJpbGl0eVZpZXdJZCBUaGUgb2YgYSB2aWV3IGluIHRoZSAuCisgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSBhY3Rpb24gd2FzIHBlcmZvcm1lZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uKGludCBhY2Nlc3NpYmlsaXR5V2luZG93SWQsIGludCBhY2Nlc3NpYmlsaXR5Vmlld0lkLAorICAgICAgICBpbnQgYWN0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9GbG9hdEV2YWx1YXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEKaW5kZXggOWUyMDU0ZC4uOTQ2M2FhMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0Zsb2F0RXZhbHVhdG9yLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIC8qKgogICogVGhpcyBldmFsdWF0b3IgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSB0eXBlIGludGVycG9sYXRpb24gYmV0d2VlbiA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWVzLgogICovCi1wdWJsaWMgY2xhc3MgRmxvYXRFdmFsdWF0b3IgaW1wbGVtZW50cyBUeXBlRXZhbHVhdG9yIHsKK3B1YmxpYyBjbGFzcyBGbG9hdEV2YWx1YXRvciBpbXBsZW1lbnRzIFR5cGVFdmFsdWF0b3I8TnVtYmVyPiB7CiAKICAgICAvKioKICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aApAQCAtMzUsOCArMzUsOCBAQAogICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCiAgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgogICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKLSAgICAgICAgZmxvYXQgc3RhcnRGbG9hdCA9ICgoTnVtYmVyKSBzdGFydFZhbHVlKS5mbG9hdFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBzdGFydEZsb2F0ICsgZnJhY3Rpb24gKiAoKChOdW1iZXIpIGVuZFZhbHVlKS5mbG9hdFZhbHVlKCkgLSBzdGFydEZsb2F0KTsKKyAgICBwdWJsaWMgRmxvYXQgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE51bWJlciBzdGFydFZhbHVlLCBOdW1iZXIgZW5kVmFsdWUpIHsKKyAgICAgICAgZmxvYXQgc3RhcnRGbG9hdCA9IHN0YXJ0VmFsdWUuZmxvYXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gc3RhcnRGbG9hdCArIGZyYWN0aW9uICogKGVuZFZhbHVlLmZsb2F0VmFsdWUoKSAtIHN0YXJ0RmxvYXQpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vSW50RXZhbHVhdG9yLmphdmEKaW5kZXggNzI4ODkyNy4uMzRmYjBkYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL0ludEV2YWx1YXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9JbnRFdmFsdWF0b3IuamF2YQpAQCAtMTksNyArMTksNyBAQAogLyoqCiAgKiBUaGlzIGV2YWx1YXRvciBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHR5cGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIDxjb2RlPmludDwvY29kZT4gdmFsdWVzLgogICovCi1wdWJsaWMgY2xhc3MgSW50RXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CitwdWJsaWMgY2xhc3MgSW50RXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvcjxJbnRlZ2VyPiB7CiAKICAgICAvKioKICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aApAQCAtMzUsOCArMzUsOCBAQAogICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCiAgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgogICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpIHsKLSAgICAgICAgaW50IHN0YXJ0SW50ID0gKChOdW1iZXIpIHN0YXJ0VmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiAoaW50KSAoc3RhcnRJbnQgKyBmcmFjdGlvbiAqICgoKE51bWJlcikgZW5kVmFsdWUpLmludFZhbHVlKCkgLSBzdGFydEludCkpOworICAgIHB1YmxpYyBJbnRlZ2VyIGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBJbnRlZ2VyIHN0YXJ0VmFsdWUsIEludGVnZXIgZW5kVmFsdWUpIHsKKyAgICAgICAgaW50IHN0YXJ0SW50ID0gc3RhcnRWYWx1ZTsKKyAgICAgICAgcmV0dXJuIChpbnQpKHN0YXJ0SW50ICsgZnJhY3Rpb24gKiAoZW5kVmFsdWUgLSBzdGFydEludCkpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vT2JqZWN0QW5pbWF0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhCmluZGV4IGI4YTdjYjIuLjMxYzVmOGQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9PYmplY3RBbmltYXRvci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQuYW5pbWF0aW9uOwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUHJvcGVydHk7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM5LDYgKzQwLDggQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIG1Qcm9wZXJ0eU5hbWU7CiAKKyAgICBwcml2YXRlIFByb3BlcnR5IG1Qcm9wZXJ0eTsKKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgdG8gZGVyaXZlCiAgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgpAQCAtNjMsNyArNjYsNyBAQAogICAgICAqIHVzaW5nIG1vcmUgdGhhbiBvbmUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cywgdGhlbiBzZXR0aW5nIHRoZSBwcm9wZXJ0eU5hbWUgc2ltcGx5CiAgICAgICogc2V0cyB0aGUgcHJvcGVydHlOYW1lIGluIHRoZSBmaXJzdCBvZiB0aG9zZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzLjwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiBTaG91bGQgbm90IGJlIG51bGwuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKICAgICAgICAgLy8gbVZhbHVlcyBjb3VsZCBiZSBudWxsIGlmIHRoaXMgaXMgYmVpbmcgY29uc3RydWN0ZWQgcGllY2VtZWFsLiBKdXN0IHJlY29yZCB0aGUKQEAgLTgxLDYgKzg0LDMxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBQcm9wZXJ0eSBvYmplY3RzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIKKyAgICAgKiBwcm9wZXJ0aWVzIHNwZWNpZmllZCBieSB0aGUge0BsaW5rICNzZXRQcm9wZXJ0eU5hbWUoU3RyaW5nKX0gbWV0aG9kLiBBbmltYXRpb25zIHNob3VsZAorICAgICAqIGJlIHNldCB1cCB0byB1c2Ugb25lIG9yIHRoZSBvdGhlciwgbm90IGJvdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLiBTaG91bGQgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICAgICAgLy8gbVZhbHVlcyBjb3VsZCBiZSBudWxsIGlmIHRoaXMgaXMgYmVpbmcgY29uc3RydWN0ZWQgcGllY2VtZWFsLiBKdXN0IHJlY29yZCB0aGUKKyAgICAgICAgLy8gcHJvcGVydHlOYW1lIHRvIGJlIHVzZWQgbGF0ZXIgd2hlbiBzZXRWYWx1ZXMoKSBpcyBjYWxsZWQgaWYgc28uCisgICAgICAgIGlmIChtVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHZhbHVlc0hvbGRlciA9IG1WYWx1ZXNbMF07CisgICAgICAgICAgICBTdHJpbmcgb2xkTmFtZSA9IHZhbHVlc0hvbGRlci5nZXRQcm9wZXJ0eU5hbWUoKTsKKyAgICAgICAgICAgIHZhbHVlc0hvbGRlci5zZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgICAgICBtVmFsdWVzTWFwLnJlbW92ZShvbGROYW1lKTsKKyAgICAgICAgICAgIG1WYWx1ZXNNYXAucHV0KG1Qcm9wZXJ0eU5hbWUsIHZhbHVlc0hvbGRlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Qcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJvcGVydHlOYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIG1Qcm9wZXJ0eSA9IHByb3BlcnR5OworICAgICAgICAvLyBOZXcgcHJvcGVydHkvdmFsdWVzL3RhcmdldCBzaG91bGQgY2F1c2UgcmUtaW5pdGlhbGl6YXRpb24gcHJpb3IgdG8gc3RhcnRpbmcKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGJlIGFuaW1hdGVkLiBUaGlzIG5hbWUgd2lsbCBiZSB1c2VkIHRvIGRlcml2ZQogICAgICAqIGEgc2V0dGVyIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgdG8gc2V0IGFuaW1hdGVkIHZhbHVlcy4KICAgICAgKiBGb3IgZXhhbXBsZSwgYSBwcm9wZXJ0eSBuYW1lIG9mIDxjb2RlPmZvbzwvY29kZT4gd2lsbCByZXN1bHQKQEAgLTkzLDM2ICsxMjEsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERldGVybWluZSB0aGUgc2V0dGVyIG9yIGdldHRlciBmdW5jdGlvbiB1c2luZyB0aGUgSmF2YUJlYW5zIGNvbnZlbnRpb24gb2Ygc2V0Rm9vIG9yCi0gICAgICogZ2V0Rm9vIGZvciBhIHByb3BlcnR5IG5hbWVkICdmb28nLiBUaGlzIGZ1bmN0aW9uIGZpZ3VyZXMgb3V0IHdoYXQgdGhlIG5hbWUgb2YgdGhlCi0gICAgICogZnVuY3Rpb24gc2hvdWxkIGJlIGFuZCB1c2VzIHJlZmxlY3Rpb24gdG8gZmluZCB0aGUgTWV0aG9kIHdpdGggdGhhdCBuYW1lIG9uIHRoZQotICAgICAqIHRhcmdldCBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlZml4ICJzZXQiIG9yICJnZXQiLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBuZWVkIGEgc2V0dGVyIG9yIGdldHRlci4KLSAgICAgKiBAcmV0dXJuIE1ldGhvZCB0aGUgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCBtUHJvcGVydHlOYW1lLgotICAgICAqLwotICAgIHByaXZhdGUgTWV0aG9kIGdldFByb3BlcnR5RnVuY3Rpb24oU3RyaW5nIHByZWZpeCwgQ2xhc3MgdmFsdWVUeXBlKSB7Ci0gICAgICAgIC8vIFRPRE86IGZhc3RlciBpbXBsZW1lbnRhdGlvbi4uLgotICAgICAgICBNZXRob2QgcmV0dXJuVmFsID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGZpcnN0TGV0dGVyID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMCwgMSk7Ci0gICAgICAgIFN0cmluZyB0aGVSZXN0ID0gbVByb3BlcnR5TmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgIGZpcnN0TGV0dGVyID0gZmlyc3RMZXR0ZXIudG9VcHBlckNhc2UoKTsKLSAgICAgICAgU3RyaW5nIHNldHRlck5hbWUgPSBwcmVmaXggKyBmaXJzdExldHRlciArIHRoZVJlc3Q7Ci0gICAgICAgIENsYXNzIGFyZ3NbXSA9IG51bGw7Ci0gICAgICAgIGlmICh2YWx1ZVR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYXJncyA9IG5ldyBDbGFzc1sxXTsKLSAgICAgICAgICAgIGFyZ3NbMF0gPSB2YWx1ZVR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVyblZhbCA9IG1UYXJnZXQuZ2V0Q2xhc3MoKS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwgYXJncyk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZSgiT2JqZWN0QW5pbWF0b3IiLAotICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBzZXR0ZXIvZ2V0dGVyIGZvciBwcm9wZXJ0eSAiICsgbVByb3BlcnR5TmFtZSArICI6ICIgKyBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0dXJuVmFsOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgT2JqZWN0QW5pbWF0b3Igb2JqZWN0LiBUaGlzIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgcHJpbWFyaWx5IGZvcgogICAgICAqIHVzZSBpbnRlcm5hbGx5OyB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHdoaWNoIHRha2UgcGFyYW1ldGVycyBhcmUgbW9yZSBnZW5lcmFsbHkKICAgICAgKiB1c2VmdWwuCkBAIC0xMzEsOCArMTI5LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSBzaW5nbGUgcHJvcGVydHkgbmFtZSBhbmQgc2V0IG9mIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RvciBpcwotICAgICAqIHVzZWQgaW4gdGhlIHNpbXBsZSBjYXNlIG9mIGFuaW1hdGluZyBhIHNpbmdsZSBwcm9wZXJ0eS4KKyAgICAgKiBQcml2YXRlIHV0aWxpdHkgY29uc3RydWN0b3IgdGhhdCBpbml0aWFsaXplcyB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgbmFtZSBvZiB0aGUKKyAgICAgKiBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCiAgICAgICogaGF2ZSBhIHB1YmxpYyBtZXRob2Qgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCkBAIC0xNDUsMTkgKzE0MywyOSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFByaXZhdGUgdXRpbGl0eSBjb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqLworICAgIHByaXZhdGUgPFQ+IE9iamVjdEFuaW1hdG9yKFQgdGFyZ2V0LCBQcm9wZXJ0eTxULCA/PiBwcm9wZXJ0eSkgeworICAgICAgICBtVGFyZ2V0ID0gdGFyZ2V0OworICAgICAgICBzZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhbiBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIGJldHdlZW4gaW50IHZhbHVlcy4gQSBzaW5nbGUKLSAgICAgKiB2YWx1ZSBpbXBsaWVzIHRoYXQgdGhhdCB2YWx1ZSBpcyB0aGUgb25lIGJlaW5nIGFuaW1hdGVkIHRvLiBIb3dldmVyLCB0aGlzIGlzIG5vdCB0eXBpY2FsbHkKLSAgICAgKiB1c2VmdWwgaW4gYSBWYWx1ZUFuaW1hdG9yIG9iamVjdCBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSBmb3IgdGhlIG9iamVjdCB0byBkZXRlcm1pbmUgdGhlCi0gICAgICogc3RhcnRpbmcgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24gKHVubGlrZSBPYmplY3RBbmltYXRvciwgd2hpY2ggY2FuIGRlcml2ZSB0aGF0IHZhbHVlCi0gICAgICogZnJvbSB0aGUgdGFyZ2V0IG9iamVjdCBhbmQgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQpLiBUaGVyZWZvcmUsIHRoZXJlIHNob3VsZCB0eXBpY2FsbHkKLSAgICAgKiBiZSB0d28gb3IgbW9yZSB2YWx1ZXMuCisgICAgICogdmFsdWUgaW1wbGllcyB0aGF0IHRoYXQgdmFsdWUgaXMgdGhlIG9uZSBiZWluZyBhbmltYXRlZCB0by4gVHdvIHZhbHVlcyBpbXBseSBhIHN0YXJ0aW5nCisgICAgICogYW5kIGVuZGluZyB2YWx1ZXMuIE1vcmUgdGhhbiB0d28gdmFsdWVzIGltcGx5IGEgc3RhcnRpbmcgdmFsdWUsIHZhbHVlcyB0byBhbmltYXRlIHRocm91Z2gKKyAgICAgKiBhbG9uZyB0aGUgd2F5LCBhbmQgYW4gZW5kaW5nIHZhbHVlICh0aGVzZSB2YWx1ZXMgd2lsbCBiZSBkaXN0cmlidXRlZCBldmVubHkgYWNyb3NzCisgICAgICogdGhlIGR1cmF0aW9uIG9mIHRoZSBhbmltYXRpb24pLgogICAgICAqCiAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLiBUaGlzIG9iamVjdCBzaG91bGQKICAgICAgKiBoYXZlIGEgcHVibGljIG1ldGhvZCBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKICAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgogICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBzZXQgb2YgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGFuaW1hdGUgYmV0d2VlbiBvdmVyIHRpbWUuCi0gICAgICogQHJldHVybiBBIFZhbHVlQW5pbWF0b3Igb2JqZWN0IHRoYXQgaXMgc2V0IHVwIHRvIGFuaW1hdGUgYmV0d2VlbiB0aGUgZ2l2ZW4gdmFsdWVzLgorICAgICAqIEByZXR1cm4gQW4gT2JqZWN0QW5pbWF0b3Igb2JqZWN0IHRoYXQgaXMgc2V0IHVwIHRvIGFuaW1hdGUgYmV0d2VlbiB0aGUgZ2l2ZW4gdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0QW5pbWF0b3Igb2ZJbnQoT2JqZWN0IHRhcmdldCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50Li4uIHZhbHVlcykgewogICAgICAgICBPYmplY3RBbmltYXRvciBhbmltID0gbmV3IE9iamVjdEFuaW1hdG9yKHRhcmdldCwgcHJvcGVydHlOYW1lKTsKQEAgLTE2NiwxOSArMTc0LDM2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhbiBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIGJldHdlZW4gaW50IHZhbHVlcy4gQSBzaW5nbGUKKyAgICAgKiB2YWx1ZSBpbXBsaWVzIHRoYXQgdGhhdCB2YWx1ZSBpcyB0aGUgb25lIGJlaW5nIGFuaW1hdGVkIHRvLiBUd28gdmFsdWVzIGltcGx5IGEgc3RhcnRpbmcKKyAgICAgKiBhbmQgZW5kaW5nIHZhbHVlcy4gTW9yZSB0aGFuIHR3byB2YWx1ZXMgaW1wbHkgYSBzdGFydGluZyB2YWx1ZSwgdmFsdWVzIHRvIGFuaW1hdGUgdGhyb3VnaAorICAgICAqIGFsb25nIHRoZSB3YXksIGFuZCBhbiBlbmRpbmcgdmFsdWUgKHRoZXNlIHZhbHVlcyB3aWxsIGJlIGRpc3RyaWJ1dGVkIGV2ZW5seSBhY3Jvc3MKKyAgICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIEEgc2V0IG9mIHZhbHVlcyB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBhbmltYXRlIGJldHdlZW4gb3ZlciB0aW1lLgorICAgICAqIEByZXR1cm4gQW4gT2JqZWN0QW5pbWF0b3Igb2JqZWN0IHRoYXQgaXMgc2V0IHVwIHRvIGFuaW1hdGUgYmV0d2VlbiB0aGUgZ2l2ZW4gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE9iamVjdEFuaW1hdG9yIG9mSW50KFQgdGFyZ2V0LCBQcm9wZXJ0eTxULCBJbnRlZ2VyPiBwcm9wZXJ0eSwgaW50Li4uIHZhbHVlcykgeworICAgICAgICBPYmplY3RBbmltYXRvciBhbmltID0gbmV3IE9iamVjdEFuaW1hdG9yKHRhcmdldCwgcHJvcGVydHkpOworICAgICAgICBhbmltLnNldEludFZhbHVlcyh2YWx1ZXMpOworICAgICAgICByZXR1cm4gYW5pbTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGFuIE9iamVjdEFuaW1hdG9yIHRoYXQgYW5pbWF0ZXMgYmV0d2VlbiBmbG9hdCB2YWx1ZXMuIEEgc2luZ2xlCi0gICAgICogdmFsdWUgaW1wbGllcyB0aGF0IHRoYXQgdmFsdWUgaXMgdGhlIG9uZSBiZWluZyBhbmltYXRlZCB0by4gSG93ZXZlciwgdGhpcyBpcyBub3QgdHlwaWNhbGx5Ci0gICAgICogdXNlZnVsIGluIGEgVmFsdWVBbmltYXRvciBvYmplY3QgYmVjYXVzZSB0aGVyZSBpcyBubyB3YXkgZm9yIHRoZSBvYmplY3QgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAqIHN0YXJ0aW5nIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uICh1bmxpa2UgT2JqZWN0QW5pbWF0b3IsIHdoaWNoIGNhbiBkZXJpdmUgdGhhdCB2YWx1ZQotICAgICAqIGZyb20gdGhlIHRhcmdldCBvYmplY3QgYW5kIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkKS4gVGhlcmVmb3JlLCB0aGVyZSBzaG91bGQgdHlwaWNhbGx5Ci0gICAgICogYmUgdHdvIG9yIG1vcmUgdmFsdWVzLgorICAgICAqIHZhbHVlIGltcGxpZXMgdGhhdCB0aGF0IHZhbHVlIGlzIHRoZSBvbmUgYmVpbmcgYW5pbWF0ZWQgdG8uIFR3byB2YWx1ZXMgaW1wbHkgYSBzdGFydGluZworICAgICAqIGFuZCBlbmRpbmcgdmFsdWVzLiBNb3JlIHRoYW4gdHdvIHZhbHVlcyBpbXBseSBhIHN0YXJ0aW5nIHZhbHVlLCB2YWx1ZXMgdG8gYW5pbWF0ZSB0aHJvdWdoCisgICAgICogYWxvbmcgdGhlIHdheSwgYW5kIGFuIGVuZGluZyB2YWx1ZSAodGhlc2UgdmFsdWVzIHdpbGwgYmUgZGlzdHJpYnV0ZWQgZXZlbmx5IGFjcm9zcworICAgICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uKS4KICAgICAgKgogICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4gVGhpcyBvYmplY3Qgc2hvdWxkCiAgICAgICogaGF2ZSBhIHB1YmxpYyBtZXRob2Qgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCiAgICAgICogdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5wcm9wZXJ0eU5hbWU8L2NvZGU+IHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KICAgICAgKiBAcGFyYW0gdmFsdWVzIEEgc2V0IG9mIHZhbHVlcyB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBhbmltYXRlIGJldHdlZW4gb3ZlciB0aW1lLgotICAgICAqIEByZXR1cm4gQSBWYWx1ZUFuaW1hdG9yIG9iamVjdCB0aGF0IGlzIHNldCB1cCB0byBhbmltYXRlIGJldHdlZW4gdGhlIGdpdmVuIHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIEFuIE9iamVjdEFuaW1hdG9yIG9iamVjdCB0aGF0IGlzIHNldCB1cCB0byBhbmltYXRlIGJldHdlZW4gdGhlIGdpdmVuIHZhbHVlcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE9iamVjdEFuaW1hdG9yIG9mRmxvYXQoT2JqZWN0IHRhcmdldCwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmxvYXQuLi4gdmFsdWVzKSB7CiAgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW0gPSBuZXcgT2JqZWN0QW5pbWF0b3IodGFyZ2V0LCBwcm9wZXJ0eU5hbWUpOwpAQCAtMTg3LDIxICsyMTIsNDAgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgPGNvZGU+UHJvcGVydHlWYWx1ZUhvbGRlcjwvY29kZT4gdmFsdWVzLiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZAotICAgICAqIGJlIHVzZWQgd2hlbiBhbmltYXRpbmcgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF0IG9uY2Ugd2l0aCB0aGUgc2FtZSBPYmplY3RBbmltYXRvciwgc2luY2UKLSAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBhbGxvd3MgeW91IHRvIGFzc29jaWF0ZSBhIHNldCBvZiBhbmltYXRpb24gdmFsdWVzIHdpdGggYSBwcm9wZXJ0eQotICAgICAqIG5hbWUuCisgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhbiBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIGJldHdlZW4gZmxvYXQgdmFsdWVzLiBBIHNpbmdsZQorICAgICAqIHZhbHVlIGltcGxpZXMgdGhhdCB0aGF0IHZhbHVlIGlzIHRoZSBvbmUgYmVpbmcgYW5pbWF0ZWQgdG8uIFR3byB2YWx1ZXMgaW1wbHkgYSBzdGFydGluZworICAgICAqIGFuZCBlbmRpbmcgdmFsdWVzLiBNb3JlIHRoYW4gdHdvIHZhbHVlcyBpbXBseSBhIHN0YXJ0aW5nIHZhbHVlLCB2YWx1ZXMgdG8gYW5pbWF0ZSB0aHJvdWdoCisgICAgICogYWxvbmcgdGhlIHdheSwgYW5kIGFuIGVuZGluZyB2YWx1ZSAodGhlc2UgdmFsdWVzIHdpbGwgYmUgZGlzdHJpYnV0ZWQgZXZlbmx5IGFjcm9zcworICAgICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgYW5pbWF0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBpcyB0byBiZSBhbmltYXRlZC4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBzZXQgb2YgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGFuaW1hdGUgYmV0d2VlbiBvdmVyIHRpbWUuCisgICAgICogQHJldHVybiBBbiBPYmplY3RBbmltYXRvciBvYmplY3QgdGhhdCBpcyBzZXQgdXAgdG8gYW5pbWF0ZSBiZXR3ZWVuIHRoZSBnaXZlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gT2JqZWN0QW5pbWF0b3Igb2ZGbG9hdChUIHRhcmdldCwgUHJvcGVydHk8VCwgRmxvYXQ+IHByb3BlcnR5LAorICAgICAgICAgICAgZmxvYXQuLi4gdmFsdWVzKSB7CisgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW0gPSBuZXcgT2JqZWN0QW5pbWF0b3IodGFyZ2V0LCBwcm9wZXJ0eSk7CisgICAgICAgIGFuaW0uc2V0RmxvYXRWYWx1ZXModmFsdWVzKTsKKyAgICAgICAgcmV0dXJuIGFuaW07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhbiBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIGJldHdlZW4gT2JqZWN0IHZhbHVlcy4gQSBzaW5nbGUKKyAgICAgKiB2YWx1ZSBpbXBsaWVzIHRoYXQgdGhhdCB2YWx1ZSBpcyB0aGUgb25lIGJlaW5nIGFuaW1hdGVkIHRvLiBUd28gdmFsdWVzIGltcGx5IGEgc3RhcnRpbmcKKyAgICAgKiBhbmQgZW5kaW5nIHZhbHVlcy4gTW9yZSB0aGFuIHR3byB2YWx1ZXMgaW1wbHkgYSBzdGFydGluZyB2YWx1ZSwgdmFsdWVzIHRvIGFuaW1hdGUgdGhyb3VnaAorICAgICAqIGFsb25nIHRoZSB3YXksIGFuZCBhbiBlbmRpbmcgdmFsdWUgKHRoZXNlIHZhbHVlcyB3aWxsIGJlIGRpc3RyaWJ1dGVkIGV2ZW5seSBhY3Jvc3MKKyAgICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbikuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAotICAgICAqIGhhdmUgcHVibGljIG1ldGhvZHMgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCi0gICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgZm9yCi0gICAgICogZWFjaCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4KKyAgICAgKiBoYXZlIGEgcHVibGljIG1ldGhvZCBvbiBpdCBjYWxsZWQgPGNvZGU+c2V0TmFtZSgpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bmFtZTwvY29kZT4gaXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyLgogICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgogICAgICAqIEBwYXJhbSBldmFsdWF0b3IgQSBUeXBlRXZhbHVhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBhbmltYXRpb24gZnJhbWUgdG8KLSAgICAgKiBwcm92aWRlIHRoZSBuY2Vzc3J5IGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgT2JqZWN0IHZhbHVlcyB0byBkZXJpdmUgdGhlIGFuaW1hdGVkCisgICAgICogcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgT2JqZWN0IHZhbHVlcyB0byBkZXJpdmUgdGhlIGFuaW1hdGVkCiAgICAgICogdmFsdWUuCi0gICAgICogQHBhcmFtIHZhbHVlcyBUaGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cyB3aGljaCBob2xkIGVhY2ggdGhlIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlcwotICAgICAqIHRvIGFuaW1hdGUgdGhhdCBwcm9wZXJ0eSBiZXR3ZWVuLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBzZXQgb2YgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGFuaW1hdGUgYmV0d2VlbiBvdmVyIHRpbWUuCisgICAgICogQHJldHVybiBBbiBPYmplY3RBbmltYXRvciBvYmplY3QgdGhhdCBpcyBzZXQgdXAgdG8gYW5pbWF0ZSBiZXR3ZWVuIHRoZSBnaXZlbiB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3RBbmltYXRvciBvZk9iamVjdChPYmplY3QgdGFyZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLAogICAgICAgICAgICAgVHlwZUV2YWx1YXRvciBldmFsdWF0b3IsIE9iamVjdC4uLiB2YWx1ZXMpIHsKQEAgLTIxMiwxOSArMjU2LDQ0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhbiBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIGJldHdlZW4gdGhlIHNldHMgb2YgdmFsdWVzCi0gICAgICogc3BlY2lmZWQgaW4gPGNvZGU+UHJvcGVydHlWYWx1ZUhvbGRlcjwvY29kZT4gb2JqZWN0cy4gVGhpcyB2YXJpYW50IHNob3VsZAotICAgICAqIGJlIHVzZWQgd2hlbiBhbmltYXRpbmcgc2V2ZXJhbCBwcm9wZXJ0aWVzIGF0IG9uY2Ugd2l0aCB0aGUgc2FtZSBPYmplY3RBbmltYXRvciwgc2luY2UKLSAgICAgKiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBhbGxvd3MgeW91IHRvIGFzc29jaWF0ZSBhIHNldCBvZiBhbmltYXRpb24gdmFsdWVzIHdpdGggYSBwcm9wZXJ0eQotICAgICAqIG5hbWUuCisgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhbiBPYmplY3RBbmltYXRvciB0aGF0IGFuaW1hdGVzIGJldHdlZW4gT2JqZWN0IHZhbHVlcy4gQSBzaW5nbGUKKyAgICAgKiB2YWx1ZSBpbXBsaWVzIHRoYXQgdGhhdCB2YWx1ZSBpcyB0aGUgb25lIGJlaW5nIGFuaW1hdGVkIHRvLiBUd28gdmFsdWVzIGltcGx5IGEgc3RhcnRpbmcKKyAgICAgKiBhbmQgZW5kaW5nIHZhbHVlcy4gTW9yZSB0aGFuIHR3byB2YWx1ZXMgaW1wbHkgYSBzdGFydGluZyB2YWx1ZSwgdmFsdWVzIHRvIGFuaW1hdGUgdGhyb3VnaAorICAgICAqIGFsb25nIHRoZSB3YXksIGFuZCBhbiBlbmRpbmcgdmFsdWUgKHRoZXNlIHZhbHVlcyB3aWxsIGJlIGRpc3RyaWJ1dGVkIGV2ZW5seSBhY3Jvc3MKKyAgICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbikuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIFRoaXMgb2JqZWN0IHNob3VsZAotICAgICAqIGhhdmUgcHVibGljIG1ldGhvZHMgb24gaXQgY2FsbGVkIDxjb2RlPnNldE5hbWUoKTwvY29kZT4sIHdoZXJlIDxjb2RlPm5hbWU8L2NvZGU+IGlzCi0gICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHBhc3NlZCBpbiBhcyB0aGUgPGNvZGU+cHJvcGVydHlOYW1lPC9jb2RlPiBwYXJhbWV0ZXIgZm9yCi0gICAgICogZWFjaCBvZiB0aGUgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gdmFsdWVzIEEgc2V0IG9mIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgYW5pbWF0ZWQKLSAgICAgKiBiZXR3ZWVuIG92ZXIgdGltZS4KLSAgICAgKiBAcmV0dXJuIEEgVmFsdWVBbmltYXRvciBvYmplY3QgdGhhdCBpcyBzZXQgdXAgdG8gYW5pbWF0ZSBiZXR3ZWVuIHRoZSBnaXZlbiB2YWx1ZXMuCisgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIGFuaW1hdGVkLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuCisgICAgICogQHBhcmFtIGV2YWx1YXRvciBBIFR5cGVFdmFsdWF0b3IgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0bworICAgICAqIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlIE9iamVjdCB2YWx1ZXMgdG8gZGVyaXZlIHRoZSBhbmltYXRlZAorICAgICAqIHZhbHVlLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBzZXQgb2YgdmFsdWVzIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIGFuaW1hdGUgYmV0d2VlbiBvdmVyIHRpbWUuCisgICAgICogQHJldHVybiBBbiBPYmplY3RBbmltYXRvciBvYmplY3QgdGhhdCBpcyBzZXQgdXAgdG8gYW5pbWF0ZSBiZXR3ZWVuIHRoZSBnaXZlbiB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VCwgVj4gT2JqZWN0QW5pbWF0b3Igb2ZPYmplY3QoVCB0YXJnZXQsIFByb3BlcnR5PFQsIFY+IHByb3BlcnR5LAorICAgICAgICAgICAgVHlwZUV2YWx1YXRvcjxWPiBldmFsdWF0b3IsIFYuLi4gdmFsdWVzKSB7CisgICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW0gPSBuZXcgT2JqZWN0QW5pbWF0b3IodGFyZ2V0LCBwcm9wZXJ0eSk7CisgICAgICAgIGFuaW0uc2V0T2JqZWN0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIGFuaW0uc2V0RXZhbHVhdG9yKGV2YWx1YXRvcik7CisgICAgICAgIHJldHVybiBhbmltOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYW4gT2JqZWN0QW5pbWF0b3IgdGhhdCBhbmltYXRlcyBiZXR3ZWVuIHRoZSBzZXRzIG9mIHZhbHVlcyBzcGVjaWZpZWQKKyAgICAgKiBpbiA8Y29kZT5Qcm9wZXJ0eVZhbHVlSG9sZGVyPC9jb2RlPiBvYmplY3RzLiBUaGlzIHZhcmlhbnQgc2hvdWxkIGJlIHVzZWQgd2hlbiBhbmltYXRpbmcKKyAgICAgKiBzZXZlcmFsIHByb3BlcnRpZXMgYXQgb25jZSB3aXRoIHRoZSBzYW1lIE9iamVjdEFuaW1hdG9yLCBzaW5jZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBhbGxvd3MKKyAgICAgKiB5b3UgdG8gYXNzb2NpYXRlIGEgc2V0IG9mIGFuaW1hdGlvbiB2YWx1ZXMgd2l0aCBhIHByb3BlcnR5IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3Qgd2hvc2UgcHJvcGVydHkgaXMgdG8gYmUgYW5pbWF0ZWQuIERlcGVuZGluZyBvbiBob3cgdGhlCisgICAgICogUHJvcGVydHlWYWx1ZXNPYmplY3RzIHdlcmUgY29uc3RydWN0ZWQsIHRoZSB0YXJnZXQgb2JqZWN0IHNob3VsZCBlaXRoZXIgaGF2ZSB0aGUge0BsaW5rCisgICAgICogYW5kcm9pZC51dGlsLlByb3BlcnR5fSBvYmplY3RzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIG9yIChpZiB0aGUKKyAgICAgKiBQcm9wZXJ0eVZhbHVlc0hPbGRlciBvYmplY3RzIHdlcmUgY3JlYXRlZCB3aXRoIHByb3BlcnR5IG5hbWVzKSB0aGUgdGFyZ2V0IG9iamVjdCBzaG91bGQgaGF2ZQorICAgICAqIHB1YmxpYyBtZXRob2RzIG9uIGl0IGNhbGxlZCA8Y29kZT5zZXROYW1lKCk8L2NvZGU+LCB3aGVyZSA8Y29kZT5uYW1lPC9jb2RlPiBpcyB0aGUgbmFtZSBvZgorICAgICAqIHRoZSBwcm9wZXJ0eSBwYXNzZWQgaW4gYXMgdGhlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4gcGFyYW1ldGVyIGZvciBlYWNoIG9mIHRoZQorICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdHMuCisgICAgICogQHBhcmFtIHZhbHVlcyBBIHNldCBvZiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3RzIHdob3NlIHZhbHVlcyB3aWxsIGJlIGFuaW1hdGVkIGJldHdlZW4KKyAgICAgKiBvdmVyIHRpbWUuCisgICAgICogQHJldHVybiBBbiBPYmplY3RBbmltYXRvciBvYmplY3QgdGhhdCBpcyBzZXQgdXAgdG8gYW5pbWF0ZSBiZXR3ZWVuIHRoZSBnaXZlbiB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3RBbmltYXRvciBvZlByb3BlcnR5VmFsdWVzSG9sZGVyKE9iamVjdCB0YXJnZXQsCiAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlci4uLiB2YWx1ZXMpIHsKQEAgLTIzOSw3ICszMDgsMTEgQEAKICAgICAgICAgaWYgKG1WYWx1ZXMgPT0gbnVsbCB8fCBtVmFsdWVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAvLyBObyB2YWx1ZXMgeWV0IC0gdGhpcyBhbmltYXRvciBpcyBiZWluZyBjb25zdHJ1Y3RlZCBwaWVjZW1lYWwuIEluaXQgdGhlIHZhbHVlcyB3aXRoCiAgICAgICAgICAgICAvLyB3aGF0ZXZlciB0aGUgY3VycmVudCBwcm9wZXJ0eU5hbWUgaXMKLSAgICAgICAgICAgIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkludChtUHJvcGVydHlOYW1lLCB2YWx1ZXMpKTsKKyAgICAgICAgICAgIGlmIChtUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkludChtUHJvcGVydHksIHZhbHVlcykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZXMoUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZJbnQobVByb3BlcnR5TmFtZSwgdmFsdWVzKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdXBlci5zZXRJbnRWYWx1ZXModmFsdWVzKTsKICAgICAgICAgfQpAQCAtMjUwLDcgKzMyMywxMSBAQAogICAgICAgICBpZiAobVZhbHVlcyA9PSBudWxsIHx8IG1WYWx1ZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgIC8vIE5vIHZhbHVlcyB5ZXQgLSB0aGlzIGFuaW1hdG9yIGlzIGJlaW5nIGNvbnN0cnVjdGVkIHBpZWNlbWVhbC4gSW5pdCB0aGUgdmFsdWVzIHdpdGgKICAgICAgICAgICAgIC8vIHdoYXRldmVyIHRoZSBjdXJyZW50IHByb3BlcnR5TmFtZSBpcwotICAgICAgICAgICAgc2V0VmFsdWVzKFByb3BlcnR5VmFsdWVzSG9sZGVyLm9mRmxvYXQobVByb3BlcnR5TmFtZSwgdmFsdWVzKSk7CisgICAgICAgICAgICBpZiAobVByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZXMoUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdChtUHJvcGVydHksIHZhbHVlcykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZXMoUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdChtUHJvcGVydHlOYW1lLCB2YWx1ZXMpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN1cGVyLnNldEZsb2F0VmFsdWVzKHZhbHVlcyk7CiAgICAgICAgIH0KQEAgLTI2MSw3ICszMzgsMTEgQEAKICAgICAgICAgaWYgKG1WYWx1ZXMgPT0gbnVsbCB8fCBtVmFsdWVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAvLyBObyB2YWx1ZXMgeWV0IC0gdGhpcyBhbmltYXRvciBpcyBiZWluZyBjb25zdHJ1Y3RlZCBwaWVjZW1lYWwuIEluaXQgdGhlIHZhbHVlcyB3aXRoCiAgICAgICAgICAgICAvLyB3aGF0ZXZlciB0aGUgY3VycmVudCBwcm9wZXJ0eU5hbWUgaXMKLSAgICAgICAgICAgIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZk9iamVjdChtUHJvcGVydHlOYW1lLCAoVHlwZUV2YWx1YXRvciludWxsLCB2YWx1ZXMpKTsKKyAgICAgICAgICAgIGlmIChtUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldFZhbHVlcyhQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZk9iamVjdChtUHJvcGVydHksIChUeXBlRXZhbHVhdG9yKW51bGwsIHZhbHVlcykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRWYWx1ZXMoUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZPYmplY3QobVByb3BlcnR5TmFtZSwgKFR5cGVFdmFsdWF0b3IpbnVsbCwgdmFsdWVzKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzdXBlci5zZXRPYmplY3RWYWx1ZXModmFsdWVzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1Byb3BlcnR5VmFsdWVzSG9sZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlWYWx1ZXNIb2xkZXIuamF2YQppbmRleCA2ZjkxZmMwLi41OGYyM2Y3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlWYWx1ZXNIb2xkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vUHJvcGVydHlWYWx1ZXNIb2xkZXIuamF2YQpAQCAtMTYsNyArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLmFuaW1hdGlvbjsKIAoraW1wb3J0IGFuZHJvaWQudXRpbC5GbG9hdFByb3BlcnR5OworaW1wb3J0IGFuZHJvaWQudXRpbC5JbnRQcm9wZXJ0eTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwpAQCAtMzksNiArNDIsMTEgQEAKICAgICBTdHJpbmcgbVByb3BlcnR5TmFtZTsKIAogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIFByb3BlcnR5IG1Qcm9wZXJ0eTsKKworICAgIC8qKgogICAgICAqIFRoZSBzZXR0ZXIgZnVuY3Rpb24sIGlmIG5lZWRlZC4gT2JqZWN0QW5pbWF0b3IgaGFuZHMgb2ZmIHRoaXMgZnVuY3Rpb25hbGl0eSB0bwogICAgICAqIFByb3BlcnR5VmFsdWVzSG9sZGVyLCBzaW5jZSBpdCBob2xkcyBhbGwgb2YgdGhlIHBlci1wcm9wZXJ0eSBpbmZvcm1hdGlvbi4gVGhpcwogICAgICAqIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkKQEAgLTEyNCw2ICsxMzIsMTcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbnRlcm5hbCB1dGlsaXR5IGNvbnN0cnVjdG9yLCB1c2VkIGJ5IHRoZSBmYWN0b3J5IG1ldGhvZHMgdG8gc2V0IHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGZvciB0aGlzIGhvbGRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFByb3BlcnR5VmFsdWVzSG9sZGVyKFByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgICAgIG1Qcm9wZXJ0eSA9IHByb3BlcnR5OworICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgbVByb3BlcnR5TmFtZSA9IHByb3BlcnR5LmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYSBQcm9wZXJ0eVZhbHVlc0hvbGRlciB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQKICAgICAgKiBzZXQgb2YgaW50IHZhbHVlcy4KICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KQEAgLTEzMSw4ICsxNTAsMTggQEAKICAgICAgKiBAcmV0dXJuIFByb3BlcnR5VmFsdWVzSG9sZGVyIFRoZSBjb25zdHJ1Y3RlZCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvZkludChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQuLi4gdmFsdWVzKSB7Ci0gICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aCA9IG5ldyBJbnRQcm9wZXJ0eVZhbHVlc0hvbGRlcihwcm9wZXJ0eU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBwdmg7CisgICAgICAgIHJldHVybiBuZXcgSW50UHJvcGVydHlWYWx1ZXNIb2xkZXIocHJvcGVydHlOYW1lLCB2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW5kIHJldHVybnMgYSBQcm9wZXJ0eVZhbHVlc0hvbGRlciB3aXRoIGEgZ2l2ZW4gcHJvcGVydHkgYW5kCisgICAgICogc2V0IG9mIGludCB2YWx1ZXMuCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4gU2hvdWxkIG5vdCBiZSBudWxsLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyB0aGF0IHRoZSBwcm9wZXJ0eSB3aWxsIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKiBAcmV0dXJuIFByb3BlcnR5VmFsdWVzSG9sZGVyIFRoZSBjb25zdHJ1Y3RlZCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvZkludChQcm9wZXJ0eTw/LCBJbnRlZ2VyPiBwcm9wZXJ0eSwgaW50Li4uIHZhbHVlcykgeworICAgICAgICByZXR1cm4gbmV3IEludFByb3BlcnR5VmFsdWVzSG9sZGVyKHByb3BlcnR5LCB2YWx1ZXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQzLDE4ICsxNzIsMjggQEAKICAgICAgKiBAcmV0dXJuIFByb3BlcnR5VmFsdWVzSG9sZGVyIFRoZSBjb25zdHJ1Y3RlZCBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvYmplY3QuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvZkZsb2F0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZsb2F0Li4uIHZhbHVlcykgewotICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmggPSBuZXcgRmxvYXRQcm9wZXJ0eVZhbHVlc0hvbGRlcihwcm9wZXJ0eU5hbWUsIHZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBwdmg7CisgICAgICAgIHJldHVybiBuZXcgRmxvYXRQcm9wZXJ0eVZhbHVlc0hvbGRlcihwcm9wZXJ0eU5hbWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBhbmQKKyAgICAgKiBzZXQgb2YgZmxvYXQgdmFsdWVzLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIFNob3VsZCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdGhhdCB0aGUgcHJvcGVydHkgd2lsbCBhbmltYXRlIGJldHdlZW4uCisgICAgICogQHJldHVybiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBUaGUgY29uc3RydWN0ZWQgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2ZGbG9hdChQcm9wZXJ0eTw/LCBGbG9hdD4gcHJvcGVydHksIGZsb2F0Li4uIHZhbHVlcykgeworICAgICAgICByZXR1cm4gbmV3IEZsb2F0UHJvcGVydHlWYWx1ZXNIb2xkZXIocHJvcGVydHksIHZhbHVlcyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhbmQgcmV0dXJucyBhIFByb3BlcnR5VmFsdWVzSG9sZGVyIHdpdGggYSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGFuZAogICAgICAqIHNldCBvZiBPYmplY3QgdmFsdWVzLiBUaGlzIHZhcmlhbnQgYWxzbyB0YWtlcyBhIFR5cGVFdmFsdWF0b3IgYmVjYXVzZSB0aGUgc3lzdGVtCi0gICAgICogY2Fubm90IGludGVycG9sYXRlIGJldHdlZW4gb2JqZWN0cyBvZiB1bmtub3duIHR5cGUuCisgICAgICogY2Fubm90IGF1dG9tYXRpY2FsbHkgaW50ZXJwb2xhdGUgYmV0d2VlbiBvYmplY3RzIG9mIHVua25vd24gdHlwZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGJlaW5nIGFuaW1hdGVkLgogICAgICAqIEBwYXJhbSBldmFsdWF0b3IgQSBUeXBlRXZhbHVhdG9yIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBhbmltYXRpb24gZnJhbWUgdG8KLSAgICAgKiBwcm92aWRlIHRoZSBuY2Vzc3J5IGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgT2JqZWN0IHZhbHVlcyB0byBkZXJpdmUgdGhlIGFuaW1hdGVkCisgICAgICogcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgT2JqZWN0IHZhbHVlcyB0byBkZXJpdmUgdGhlIGFuaW1hdGVkCiAgICAgICogdmFsdWUuCiAgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRoYXQgdGhlIG5hbWVkIHByb3BlcnR5IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuLgogICAgICAqIEByZXR1cm4gUHJvcGVydHlWYWx1ZXNIb2xkZXIgVGhlIGNvbnN0cnVjdGVkIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4KQEAgLTE2OCw2ICsyMDcsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgd2l0aCBhIGdpdmVuIHByb3BlcnR5IGFuZAorICAgICAqIHNldCBvZiBPYmplY3QgdmFsdWVzLiBUaGlzIHZhcmlhbnQgYWxzbyB0YWtlcyBhIFR5cGVFdmFsdWF0b3IgYmVjYXVzZSB0aGUgc3lzdGVtCisgICAgICogY2Fubm90IGF1dG9tYXRpY2FsbHkgaW50ZXJwb2xhdGUgYmV0d2VlbiBvYmplY3RzIG9mIHVua25vd24gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgYmVpbmcgYW5pbWF0ZWQuIFNob3VsZCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gZXZhbHVhdG9yIEEgVHlwZUV2YWx1YXRvciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYW5pbWF0aW9uIGZyYW1lIHRvCisgICAgICogcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgT2JqZWN0IHZhbHVlcyB0byBkZXJpdmUgdGhlIGFuaW1hdGVkCisgICAgICogdmFsdWUuCisgICAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRoYXQgdGhlIHByb3BlcnR5IHdpbGwgYW5pbWF0ZSBiZXR3ZWVuLgorICAgICAqIEByZXR1cm4gUHJvcGVydHlWYWx1ZXNIb2xkZXIgVGhlIGNvbnN0cnVjdGVkIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxWPiBQcm9wZXJ0eVZhbHVlc0hvbGRlciBvZk9iamVjdChQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgIFR5cGVFdmFsdWF0b3I8Vj4gZXZhbHVhdG9yLCBWLi4uIHZhbHVlcykgeworICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmggPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXIocHJvcGVydHkpOworICAgICAgICBwdmguc2V0T2JqZWN0VmFsdWVzKHZhbHVlcyk7CisgICAgICAgIHB2aC5zZXRFdmFsdWF0b3IoZXZhbHVhdG9yKTsKKyAgICAgICAgcmV0dXJuIHB2aDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBuYW1lIGFuZCBzZXQKICAgICAgKiBvZiB2YWx1ZXMuIFRoZXNlIHZhbHVlcyBjYW4gYmUgb2YgYW55IHR5cGUsIGJ1dCB0aGUgdHlwZSBzaG91bGQgYmUgY29uc2lzdGVudCBzbyB0aGF0CiAgICAgICogYW4gYXBwcm9wcmlhdGUge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLlR5cGVFdmFsdWF0b3J9IGNhbiBiZSBmb3VuZCB0aGF0IG1hdGNoZXMKQEAgLTIwMiw2ICsyNjEsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuZCByZXR1cm5zIGEgUHJvcGVydHlWYWx1ZXNIb2xkZXIgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBhbmQgc2V0CisgICAgICogb2YgdmFsdWVzLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIG9mIGFueSB0eXBlLCBidXQgdGhlIHR5cGUgc2hvdWxkIGJlIGNvbnNpc3RlbnQgc28gdGhhdAorICAgICAqIGFuIGFwcHJvcHJpYXRlIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yfSBjYW4gYmUgZm91bmQgdGhhdCBtYXRjaGVzCisgICAgICogdGhlIGNvbW1vbiB0eXBlLgorICAgICAqIDxwPklmIHRoZXJlIGlzIG9ubHkgb25lIHZhbHVlLCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBlbmQgdmFsdWUgb2YgYW4gYW5pbWF0aW9uLAorICAgICAqIGFuZCBhbiBpbml0aWFsIHZhbHVlIHdpbGwgYmUgZGVyaXZlZCwgaWYgcG9zc2libGUsIGJ5IGNhbGxpbmcgdGhlIHByb3BlcnR5J3MKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC51dGlsLlByb3BlcnR5I2dldChPYmplY3QpfSBmdW5jdGlvbi4KKyAgICAgKiBBbHNvLCBpZiBhbnkgdmFsdWUgaXMgbnVsbCwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gdGhlIGFuaW1hdGlvbgorICAgICAqIHN0YXJ0cyBpbiB0aGUgc2FtZSB3YXkuIFRoaXMgbWVjaGFuaXNtIG9mIGF1dG9tYXRpY2FsbHkgZ2V0dGluZyBudWxsIHZhbHVlcyBvbmx5IHdvcmtzCisgICAgICogaWYgdGhlIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKKyAgICAgKiB7QGxpbmsgT2JqZWN0QW5pbWF0b3J9LCBzaW5jZSBvdGhlcndpc2UgUHJvcGVydHlWYWx1ZXNIb2xkZXIgaGFzCisgICAgICogbm8gd2F5IG9mIGRldGVybWluaW5nIHdoYXQgdGhlIHZhbHVlIHNob3VsZCBiZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNldCBvZiB2YWx1ZXMuIFNob3VsZCBub3QgYmUgbnVsbC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzIFRoZSBzZXQgb2YgdmFsdWVzIHRvIGFuaW1hdGUgYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9mS2V5ZnJhbWUoUHJvcGVydHkgcHJvcGVydHksIEtleWZyYW1lLi4uIHZhbHVlcykgeworICAgICAgICBLZXlmcmFtZVNldCBrZXlmcmFtZVNldCA9IEtleWZyYW1lU2V0Lm9mS2V5ZnJhbWUodmFsdWVzKTsKKyAgICAgICAgaWYgKGtleWZyYW1lU2V0IGluc3RhbmNlb2YgSW50S2V5ZnJhbWVTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50UHJvcGVydHlWYWx1ZXNIb2xkZXIocHJvcGVydHksIChJbnRLZXlmcmFtZVNldCkga2V5ZnJhbWVTZXQpOworICAgICAgICB9IGVsc2UgaWYgKGtleWZyYW1lU2V0IGluc3RhbmNlb2YgRmxvYXRLZXlmcmFtZVNldCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdFByb3BlcnR5VmFsdWVzSG9sZGVyKHByb3BlcnR5LCAoRmxvYXRLZXlmcmFtZVNldCkga2V5ZnJhbWVTZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZoID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyKHByb3BlcnR5KTsKKyAgICAgICAgICAgIHB2aC5tS2V5ZnJhbWVTZXQgPSBrZXlmcmFtZVNldDsKKyAgICAgICAgICAgIHB2aC5tVmFsdWVUeXBlID0gKChLZXlmcmFtZSl2YWx1ZXNbMF0pLmdldFR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiBwdmg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIGFuaW1hdGVkIHZhbHVlcyBmb3IgdGhpcyBvYmplY3QgdG8gdGhpcyBzZXQgb2YgaW50cy4KICAgICAgKiBJZiB0aGVyZSBpcyBvbmx5IG9uZSB2YWx1ZSwgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgZW5kIHZhbHVlIG9mIGFuIGFuaW1hdGlvbiwKICAgICAgKiBhbmQgYW4gaW5pdGlhbCB2YWx1ZSB3aWxsIGJlIGRlcml2ZWQsIGlmIHBvc3NpYmxlLCBieSBjYWxsaW5nIGEgZ2V0dGVyIGZ1bmN0aW9uCkBAIC0zNDksNyArNDM5LDYgQEAKICAgICAgICAgICAgIC8vIEhhdmUgdG8gbG9jayBwcm9wZXJ0eSBtYXAgcHJpb3IgdG8gcmVhZGluZyBpdCwgdG8gZ3VhcmQgYWdhaW5zdAogICAgICAgICAgICAgLy8gYW5vdGhlciB0aHJlYWQgcHV0dGluZyBzb21ldGhpbmcgaW4gdGhlcmUgYWZ0ZXIgd2UndmUgY2hlY2tlZCBpdAogICAgICAgICAgICAgLy8gYnV0IGJlZm9yZSB3ZSd2ZSBhZGRlZCBhbiBlbnRyeSB0byBpdAotICAgICAgICAgICAgLy8gVE9ETzogY2FuIHdlIHN0b3JlIHRoZSBzZXR0ZXIvZ2V0dGVyIHBlciBDbGFzcyBpbnN0ZWFkIG9mIHBlciBPYmplY3Q/CiAgICAgICAgICAgICBtUHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+IHByb3BlcnR5TWFwID0gcHJvcGVydHlNYXBNYXAuZ2V0KHRhcmdldENsYXNzKTsKICAgICAgICAgICAgIGlmIChwcm9wZXJ0eU1hcCAhPSBudWxsKSB7CkBAIC0zOTUsNiArNDg0LDIyIEBACiAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBzZXR0ZXIgKGFuZCBwb3NzaWJseSBnZXR0ZXIpIGV4aXN0LgogICAgICAqLwogICAgIHZvaWQgc2V0dXBTZXR0ZXJBbmRHZXR0ZXIoT2JqZWN0IHRhcmdldCkgeworICAgICAgICBpZiAobVByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IG1Qcm9wZXJ0eSBpcyBvbiB0aGUgY2xhc3Mgb2YgdGFyZ2V0CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE9iamVjdCB0ZXN0VmFsdWUgPSBtUHJvcGVydHkuZ2V0KHRhcmdldCk7CisgICAgICAgICAgICAgICAgZm9yIChLZXlmcmFtZSBrZiA6IG1LZXlmcmFtZVNldC5tS2V5ZnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgha2YuaGFzVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAga2Yuc2V0VmFsdWUobVByb3BlcnR5LmdldCh0YXJnZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKCJQcm9wZXJ0eVZhbHVlc0hvbGRlciIsIk5vIHN1Y2ggcHJvcGVydHkgKCIgKyBtUHJvcGVydHkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIpIG9uIHRhcmdldCBvYmplY3QgIiArIHRhcmdldCArICIuIFRyeWluZyByZWZsZWN0aW9uIGluc3RlYWQiKTsKKyAgICAgICAgICAgICAgICBtUHJvcGVydHkgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CiAgICAgICAgIGlmIChtU2V0dGVyID09IG51bGwpIHsKICAgICAgICAgICAgIHNldHVwU2V0dGVyKHRhcmdldENsYXNzKTsKQEAgLTQyMyw2ICs1MjgsOSBAQAogICAgICAqIEBwYXJhbSBrZiBUaGUga2V5ZnJhbWUgd2hpY2ggaG9sZHMgdGhlIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZXR1cFZhbHVlKE9iamVjdCB0YXJnZXQsIEtleWZyYW1lIGtmKSB7CisgICAgICAgIGlmIChtUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAga2Yuc2V0VmFsdWUobVByb3BlcnR5LmdldCh0YXJnZXQpKTsKKyAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKG1HZXR0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0LmdldENsYXNzKCk7CkBAIC00NjUsNiArNTczLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIG5ld1BWSCA9IChQcm9wZXJ0eVZhbHVlc0hvbGRlcikgc3VwZXIuY2xvbmUoKTsKICAgICAgICAgICAgIG5ld1BWSC5tUHJvcGVydHlOYW1lID0gbVByb3BlcnR5TmFtZTsKKyAgICAgICAgICAgIG5ld1BWSC5tUHJvcGVydHkgPSBtUHJvcGVydHk7CiAgICAgICAgICAgICBuZXdQVkgubUtleWZyYW1lU2V0ID0gbUtleWZyYW1lU2V0LmNsb25lKCk7CiAgICAgICAgICAgICBuZXdQVkgubUV2YWx1YXRvciA9IG1FdmFsdWF0b3I7CiAgICAgICAgICAgICByZXR1cm4gbmV3UFZIOwpAQCAtNDgyLDYgKzU5MSw5IEBACiAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgdmFsdWUgaXMgc2V0CiAgICAgICovCiAgICAgdm9pZCBzZXRBbmltYXRlZFZhbHVlKE9iamVjdCB0YXJnZXQpIHsKKyAgICAgICAgaWYgKG1Qcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtUHJvcGVydHkuc2V0KHRhcmdldCwgZ2V0QW5pbWF0ZWRWYWx1ZSgpKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVNldHRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1UbXBWYWx1ZUFycmF5WzBdID0gZ2V0QW5pbWF0ZWRWYWx1ZSgpOwpAQCAtNTU4LDYgKzY3MCwxOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBhbmltYXRlZC4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCBpZiB0aGlzIFByb3BlcnR5VmFsdWVzSG9sZGVyIG9iamVjdCBpcyB1c2VkIHdpdGggT2JqZWN0QW5pbWF0b3IsIHRoZSBwcm9wZXJ0eQorICAgICAqIG11c3QgZXhpc3Qgb24gdGhlIHRhcmdldCBvYmplY3Qgc3BlY2lmaWVkIGluIHRoYXQgT2JqZWN0QW5pbWF0b3IuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSBiZWluZyBhbmltYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgICAgICBtUHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgYW5pbWF0ZWQuIFRoaXMgbmFtZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlCiAgICAgICogYSBzZXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB0byBzZXQgYW5pbWF0ZWQgdmFsdWVzLgogICAgICAqIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWUgb2YgPGNvZGU+Zm9vPC9jb2RlPiB3aWxsIHJlc3VsdApAQCAtNTk3LDE3ICs3MjEsMjIgQEAKICAgICAgKiBzcGVjaWZpZWQgYWJvdmUuCiAgICAgICovCiAgICAgc3RhdGljIFN0cmluZyBnZXRNZXRob2ROYW1lKFN0cmluZyBwcmVmaXgsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLSAgICAgICAgY2hhciBmaXJzdExldHRlciA9IHByb3BlcnR5TmFtZS5jaGFyQXQoMCk7CisgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCB8fCBwcm9wZXJ0eU5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICByZXR1cm4gcHJlZml4OworICAgICAgICB9CisgICAgICAgIGNoYXIgZmlyc3RMZXR0ZXIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UocHJvcGVydHlOYW1lLmNoYXJBdCgwKSk7CiAgICAgICAgIFN0cmluZyB0aGVSZXN0ID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgZmlyc3RMZXR0ZXIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoZmlyc3RMZXR0ZXIpOwogICAgICAgICByZXR1cm4gcHJlZml4ICsgZmlyc3RMZXR0ZXIgKyB0aGVSZXN0OwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBJbnRQcm9wZXJ0eVZhbHVlc0hvbGRlciBleHRlbmRzIFByb3BlcnR5VmFsdWVzSG9sZGVyIHsKIAorICAgICAgICAvLyBDYWNoZSBKTkkgZnVuY3Rpb25zIHRvIGF2b2lkIGxvb2tpbmcgdGhlbSB1cCB0d2ljZQogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzLCBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4+IHNKTklTZXR0ZXJQcm9wZXJ0eU1hcCA9CiAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPj4oKTsKICAgICAgICAgaW50IG1KbmlTZXR0ZXI7CisgICAgICAgIHByaXZhdGUgSW50UHJvcGVydHkgbUludFByb3BlcnR5OwogCiAgICAgICAgIEludEtleWZyYW1lU2V0IG1JbnRLZXlmcmFtZVNldDsKICAgICAgICAgaW50IG1JbnRBbmltYXRlZFZhbHVlOwpAQCAtNjE5LDExICs3NDgsMjkgQEAKICAgICAgICAgICAgIG1JbnRLZXlmcmFtZVNldCA9IChJbnRLZXlmcmFtZVNldCkgbUtleWZyYW1lU2V0OwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEludFByb3BlcnR5VmFsdWVzSG9sZGVyKFByb3BlcnR5IHByb3BlcnR5LCBJbnRLZXlmcmFtZVNldCBrZXlmcmFtZVNldCkgeworICAgICAgICAgICAgc3VwZXIocHJvcGVydHkpOworICAgICAgICAgICAgbVZhbHVlVHlwZSA9IGludC5jbGFzczsKKyAgICAgICAgICAgIG1LZXlmcmFtZVNldCA9IGtleWZyYW1lU2V0OworICAgICAgICAgICAgbUludEtleWZyYW1lU2V0ID0gKEludEtleWZyYW1lU2V0KSBtS2V5ZnJhbWVTZXQ7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiAgSW50UHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICBtSW50UHJvcGVydHkgPSAoSW50UHJvcGVydHkpIG1Qcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBJbnRQcm9wZXJ0eVZhbHVlc0hvbGRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQuLi4gdmFsdWVzKSB7CiAgICAgICAgICAgICBzdXBlcihwcm9wZXJ0eU5hbWUpOwogICAgICAgICAgICAgc2V0SW50VmFsdWVzKHZhbHVlcyk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgSW50UHJvcGVydHlWYWx1ZXNIb2xkZXIoUHJvcGVydHkgcHJvcGVydHksIGludC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3BlcnR5KTsKKyAgICAgICAgICAgIHNldEludFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgIEludFByb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgbUludFByb3BlcnR5ID0gKEludFByb3BlcnR5KSBtUHJvcGVydHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc2V0SW50VmFsdWVzKGludC4uLiB2YWx1ZXMpIHsKICAgICAgICAgICAgIHN1cGVyLnNldEludFZhbHVlcyh2YWx1ZXMpOwpAQCAtNjU2LDYgKzgwMywxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHZvaWQgc2V0QW5pbWF0ZWRWYWx1ZShPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgICAgICBpZiAobUludFByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSW50UHJvcGVydHkuc2V0VmFsdWUodGFyZ2V0LCBtSW50QW5pbWF0ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVByb3BlcnR5LnNldCh0YXJnZXQsIG1JbnRBbmltYXRlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUpuaVNldHRlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbkNhbGxJbnRNZXRob2QodGFyZ2V0LCBtSm5pU2V0dGVyLCBtSW50QW5pbWF0ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNjc0LDYgKzgyOSw5IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHZvaWQgc2V0dXBTZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChtUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENoZWNrIG5ldyBzdGF0aWMgaGFzaG1hcDxwcm9wTmFtZSwgaW50PiBmb3Igc2V0dGVyIG1ldGhvZAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtUHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKQEAgLTY5Niw3ICs4NTQsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZSkgewotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBuYXRpdmUgbWV0aG9kIHVzaW5nIEpOSSwgdXNlIHJlZmxlY3Rpb24iICsgZSk7CisgICAgICAgICAgICAgICAgTG9nLmQoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBmaW5kIG5hdGl2ZSBtZXRob2QgdXNpbmcgSk5JLCB1c2UgcmVmbGVjdGlvbiIgKyBlKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgbVByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKICAgICAgICAgICAgIH0KQEAgLTcwOSw5ICs4NjgsMTEgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBGbG9hdFByb3BlcnR5VmFsdWVzSG9sZGVyIGV4dGVuZHMgUHJvcGVydHlWYWx1ZXNIb2xkZXIgewogCisgICAgICAgIC8vIENhY2hlIEpOSSBmdW5jdGlvbnMgdG8gYXZvaWQgbG9va2luZyB0aGVtIHVwIHR3aWNlCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPj4gc0pOSVNldHRlclByb3BlcnR5TWFwID0KICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxDbGFzcywgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+PigpOwogICAgICAgICBpbnQgbUpuaVNldHRlcjsKKyAgICAgICAgcHJpdmF0ZSBGbG9hdFByb3BlcnR5IG1GbG9hdFByb3BlcnR5OwogCiAgICAgICAgIEZsb2F0S2V5ZnJhbWVTZXQgbUZsb2F0S2V5ZnJhbWVTZXQ7CiAgICAgICAgIGZsb2F0IG1GbG9hdEFuaW1hdGVkVmFsdWU7CkBAIC03MjMsMTEgKzg4NCwyOSBAQAogICAgICAgICAgICAgbUZsb2F0S2V5ZnJhbWVTZXQgPSAoRmxvYXRLZXlmcmFtZVNldCkgbUtleWZyYW1lU2V0OwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEZsb2F0UHJvcGVydHlWYWx1ZXNIb2xkZXIoUHJvcGVydHkgcHJvcGVydHksIEZsb2F0S2V5ZnJhbWVTZXQga2V5ZnJhbWVTZXQpIHsKKyAgICAgICAgICAgIHN1cGVyKHByb3BlcnR5KTsKKyAgICAgICAgICAgIG1WYWx1ZVR5cGUgPSBmbG9hdC5jbGFzczsKKyAgICAgICAgICAgIG1LZXlmcmFtZVNldCA9IGtleWZyYW1lU2V0OworICAgICAgICAgICAgbUZsb2F0S2V5ZnJhbWVTZXQgPSAoRmxvYXRLZXlmcmFtZVNldCkgbUtleWZyYW1lU2V0OworICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgRmxvYXRQcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIG1GbG9hdFByb3BlcnR5ID0gKEZsb2F0UHJvcGVydHkpIG1Qcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBGbG9hdFByb3BlcnR5VmFsdWVzSG9sZGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZsb2F0Li4uIHZhbHVlcykgewogICAgICAgICAgICAgc3VwZXIocHJvcGVydHlOYW1lKTsKICAgICAgICAgICAgIHNldEZsb2F0VmFsdWVzKHZhbHVlcyk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgRmxvYXRQcm9wZXJ0eVZhbHVlc0hvbGRlcihQcm9wZXJ0eSBwcm9wZXJ0eSwgZmxvYXQuLi4gdmFsdWVzKSB7CisgICAgICAgICAgICBzdXBlcihwcm9wZXJ0eSk7CisgICAgICAgICAgICBzZXRGbG9hdFZhbHVlcyh2YWx1ZXMpOworICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgIEZsb2F0UHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICBtRmxvYXRQcm9wZXJ0eSA9IChGbG9hdFByb3BlcnR5KSBtUHJvcGVydHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZXMoZmxvYXQuLi4gdmFsdWVzKSB7CiAgICAgICAgICAgICBzdXBlci5zZXRGbG9hdFZhbHVlcyh2YWx1ZXMpOwpAQCAtNzYwLDYgKzkzOSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHZvaWQgc2V0QW5pbWF0ZWRWYWx1ZShPYmplY3QgdGFyZ2V0KSB7CisgICAgICAgICAgICBpZiAobUZsb2F0UHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1GbG9hdFByb3BlcnR5LnNldFZhbHVlKHRhcmdldCwgbUZsb2F0QW5pbWF0ZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVByb3BlcnR5LnNldCh0YXJnZXQsIG1GbG9hdEFuaW1hdGVkVmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtSm5pU2V0dGVyICE9IDApIHsKICAgICAgICAgICAgICAgICBuQ2FsbEZsb2F0TWV0aG9kKHRhcmdldCwgbUpuaVNldHRlciwgbUZsb2F0QW5pbWF0ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzc4LDYgKzk2NSw5IEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHZvaWQgc2V0dXBTZXR0ZXIoQ2xhc3MgdGFyZ2V0Q2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChtUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIENoZWNrIG5ldyBzdGF0aWMgaGFzaG1hcDxwcm9wTmFtZSwgaW50PiBmb3Igc2V0dGVyIG1ldGhvZAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtUHJvcGVydHlNYXBMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKQEAgLTgwMCw3ICs5OTAsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZSkgewotICAgICAgICAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBuYXRpdmUgbWV0aG9kIHVzaW5nIEpOSSwgdXNlIHJlZmxlY3Rpb24iICsgZSk7CisgICAgICAgICAgICAgICAgTG9nLmQoIlByb3BlcnR5VmFsdWVzSG9sZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBmaW5kIG5hdGl2ZSBtZXRob2QgdXNpbmcgSk5JLCB1c2UgcmVmbGVjdGlvbiIgKyBlKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgbVByb3BlcnR5TWFwTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVHlwZUV2YWx1YXRvci5qYXZhCmluZGV4IGZhNDkxNzUuLmU3MzhkYTEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9UeXBlRXZhbHVhdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1R5cGVFdmFsdWF0b3IuamF2YQpAQCAtMjQsNyArMjQsNyBAQAogICoKICAqIEBzZWUgVmFsdWVBbmltYXRvciNzZXRFdmFsdWF0b3IoVHlwZUV2YWx1YXRvcikKICAqLwotcHVibGljIGludGVyZmFjZSBUeXBlRXZhbHVhdG9yIHsKK3B1YmxpYyBpbnRlcmZhY2UgVHlwZUV2YWx1YXRvcjxUPiB7CiAKICAgICAvKioKICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBsaW5lYXJseSBpbnRlcnBvbGF0aW5nIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgd2l0aApAQCAtMzksNiArMzksNiBAQAogICAgICAqIEByZXR1cm4gQSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHZhbHVlcywgZ2l2ZW4gdGhlCiAgICAgICogICAgICAgICA8Y29kZT5mcmFjdGlvbjwvY29kZT4gcGFyYW1ldGVyLgogICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGUoZmxvYXQgZnJhY3Rpb24sIE9iamVjdCBzdGFydFZhbHVlLCBPYmplY3QgZW5kVmFsdWUpOworICAgIHB1YmxpYyBUIGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBUIHN0YXJ0VmFsdWUsIFQgZW5kVmFsdWUpOwogCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGlvbkJhci5qYXZhCmluZGV4IGNhYzA2ZWMuLjNlYzVlZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpb25CYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aW9uQmFyLmphdmEKQEAgLTQ4Nyw2ICs0ODcsMTIgQEAKICAgICAgKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyB7QGxpbmsgVGFifS4KICAgICAgKiBUaGlzIHRhYiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0aW9uIGJhciB1bnRpbCBpdCBpcyBhZGRlZC4KICAgICAgKgorICAgICAqIDxwPlZlcnkgb2Z0ZW4gdGFicyB3aWxsIGJlIHVzZWQgdG8gc3dpdGNoIGJldHdlZW4ge0BsaW5rIEZyYWdtZW50fQorICAgICAqIG9iamVjdHMuICBIZXJlIGlzIGEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBvZiBzdWNoIHRhYnM6PC9wPgorICAgICAqCisgICAgICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFRhYnMuamF2YQorICAgICAqICAgICAgY29tcGxldGV9CisgICAgICoKICAgICAgKiBAcmV0dXJuIEEgbmV3IFRhYgogICAgICAqCiAgICAgICogQHNlZSAjYWRkVGFiKFRhYikKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggMzg3N2JkMC4uYWViMTZmNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTcyMyw2ICs3MjMsOCBAQAogICAgIAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50W10gRk9DVVNFRF9TVEFURV9TRVQgPSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLnN0YXRlX2ZvY3VzZWR9OwogCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUluc3RhbmNlVHJhY2tlciA9IFN0cmljdE1vZGUudHJhY2tBY3Rpdml0eSh0aGlzKTsKKwogICAgIHByaXZhdGUgVGhyZWFkIG1VaVRocmVhZDsKICAgICBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKIApAQCAtNDQxNyw3ICs0NDE5LDkgQEAKICAgICAgICAgbUZyYWdtZW50cy5kaXNwYXRjaFN0YXJ0KCk7CiAgICAgICAgIGlmIChtQWxsTG9hZGVyTWFuYWdlcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChpbnQgaT1tQWxsTG9hZGVyTWFuYWdlcnMuc2l6ZSgpLTE7IGk+PTA7IGktLSkgewotICAgICAgICAgICAgICAgIG1BbGxMb2FkZXJNYW5hZ2Vycy52YWx1ZUF0KGkpLmZpbmlzaFJldGFpbigpOworICAgICAgICAgICAgICAgIExvYWRlck1hbmFnZXJJbXBsIGxtID0gbUFsbExvYWRlck1hbmFnZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgbG0uZmluaXNoUmV0YWluKCk7CisgICAgICAgICAgICAgICAgbG0uZG9SZXBvcnRTdGFydCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDQyNSwyNyArNDQyOSwyOSBAQAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybVJlc3RhcnQoKSB7CiAgICAgICAgIG1GcmFnbWVudHMubm90ZVN0YXRlTm90U2F2ZWQoKTsKIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgewotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtTWFuYWdlZEN1cnNvcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChtYy5tUmVsZWFzZWQgfHwgbWMubVVwZGF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtYy5tQ3Vyc29yLnJlcXVlcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyeWluZyB0byByZXF1ZXJ5IGFuIGFscmVhZHkgY2xvc2VkIGN1cnNvciIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1jLm1SZWxlYXNlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtYy5tVXBkYXRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGlmIChtU3RvcHBlZCkgewogICAgICAgICAgICAgbVN0b3BwZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChtVG9rZW4gIT0gbnVsbCAmJiBtUGFyZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuc2V0U3RvcHBlZFN0YXRlKG1Ub2tlbiwgZmFsc2UpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NYW5hZ2VkQ3Vyc29ycykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1hbmFnZWRDdXJzb3JzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE1hbmFnZWRDdXJzb3IgbWMgPSBtTWFuYWdlZEN1cnNvcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAobWMubVJlbGVhc2VkIHx8IG1jLm1VcGRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1jLm1DdXJzb3IucmVxdWVyeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnlpbmcgdG8gcmVxdWVyeSBhbiBhbHJlYWR5IGNsb3NlZCBjdXJzb3IgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWMubUN1cnNvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtYy5tUmVsZWFzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jLm1VcGRhdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1DYWxsZWQgPSBmYWxzZTsKICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uY2FsbEFjdGl2aXR5T25SZXN0YXJ0KHRoaXMpOwogICAgICAgICAgICAgaWYgKCFtQ2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKApAQCAtNDU1MCw5ICs0NTU2LDYgQEAKICAgICAgICAgICAgIG1TdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOwotCi0gICAgICAgIC8vIENoZWNrIGZvciBBY3Rpdml0eSBsZWFrcywgaWYgZW5hYmxlZC4KLSAgICAgICAgU3RyaWN0TW9kZS5jb25kaXRpb25hbGx5Q2hlY2tJbnN0YW5jZUNvdW50cygpOwogICAgIH0KIAogICAgIGZpbmFsIHZvaWQgcGVyZm9ybURlc3Ryb3koKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlHcm91cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5R3JvdXAuamF2YQppbmRleCA1YjA0MjUzLi5mYmQ3OGJlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlHcm91cC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eUdyb3VwLmphdmEKQEAgLTIzLDggKzIzLDEzIEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCisgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG5ldyB7QGxpbmsgRnJhZ21lbnR9IGFuZCB7QGxpbmsgRnJhZ21lbnRNYW5hZ2VyfSBBUElzCisgKiBpbnN0ZWFkOyB0aGVzZSBhcmUgYWxzbworICogYXZhaWxhYmxlIG9uIG9sZGVyIHBsYXRmb3JtcyB0aHJvdWdoIHRoZSBBbmRyb2lkIGNvbXBhdGliaWxpdHkgcGFja2FnZS4KKyAqCiAgKiBBIHNjcmVlbiB0aGF0IGNvbnRhaW5zIGFuZCBydW5zIG11bHRpcGxlIGVtYmVkZGVkIGFjdGl2aXRpZXMuCiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgQWN0aXZpdHlHcm91cCBleHRlbmRzIEFjdGl2aXR5IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkFjdGl2aXR5R3JvdXAiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURVNfS0VZID0gImFuZHJvaWQ6c3RhdGVzIjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCBlZjJlNTRhLi5hNjY1OGNjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlci5qYXZhCkBAIC0xMzgsNiArMTM4LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlck5hdGl2ZS5nZXREZWZhdWx0KCkuZ2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChwYWNrYWdlTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTeXN0ZW0gZGVhZCwgd2Ugd2lsbCBiZSBkZWFkIHRvbyBzb29uIQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gYXNrKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXJOYXRpdmUuZ2V0RGVmYXVsdCgpLnNldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQocGFja2FnZU5hbWUsIGFzayk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBTeXN0ZW0gZGVhZCwgd2Ugd2lsbCBiZSBkZWFkIHRvbyBzb29uIQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBwZXItYXBwbGljYXRpb24gbWVtb3J5IGNsYXNzIG9mIHRoZSBjdXJyZW50CiAgICAgICogZGV2aWNlLiAgVGhpcyBnaXZlcyB5b3UgYW4gaWRlYSBvZiBob3cgaGFyZCBhIG1lbW9yeSBsaW1pdCB5b3Ugc2hvdWxkCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlNYW5hZ2VyTmF0aXZlLmphdmEKaW5kZXggMmEwZDc5OC4uODVmNDBjOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlck5hdGl2ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eU1hbmFnZXJOYXRpdmUuamF2YQpAQCAtMTQ4Myw2ICsxNDgzLDI2IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX1BBQ0tBR0VfQVNLX1NDUkVFTl9DT01QQVRfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgU3RyaW5nIHBrZyA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgYm9vbGVhbiBhc2sgPSBnZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KHBrZyk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXBseS53cml0ZUludChhc2sgPyAxIDogMCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1BBQ0tBR0VfQVNLX1NDUkVFTl9DT01QQVRfVFJBTlNBQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGEuZW5mb3JjZUludGVyZmFjZShJQWN0aXZpdHlNYW5hZ2VyLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgU3RyaW5nIHBrZyA9IGRhdGEucmVhZFN0cmluZygpOworICAgICAgICAgICAgYm9vbGVhbiBhc2sgPSBkYXRhLnJlYWRJbnQoKSAhPSAwOworICAgICAgICAgICAgc2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChwa2csIGFzayk7CisgICAgICAgICAgICByZXBseS53cml0ZU5vRXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gc3VwZXIub25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwpAQCAtMzI1NCw3ICszMjc0LDggQEAKICAgICAgICAgUGFyY2VsIGRhdGEgPSBQYXJjZWwub2J0YWluKCk7CiAgICAgICAgIFBhcmNlbCByZXBseSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBY3Rpdml0eU1hbmFnZXIuZGVzY3JpcHRvcik7Ci0gICAgICAgIG1SZW1vdGUudHJhbnNhY3QoU0VUX1BBQ0tBR0VfU0NSRUVOX0NPTVBBVF9NT0RFX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcocGFja2FnZU5hbWUpOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KEdFVF9QQUNLQUdFX1NDUkVFTl9DT01QQVRfTU9ERV9UUkFOU0FDVElPTiwgZGF0YSwgcmVwbHksIDApOwogICAgICAgICByZXBseS5yZWFkRXhjZXB0aW9uKCk7CiAgICAgICAgIGludCBtb2RlID0gcmVwbHkucmVhZEludCgpOwogICAgICAgICByZXBseS5yZWN5Y2xlKCk7CkBAIC0zMjc1LDYgKzMyOTYsMzIgQEAKICAgICAgICAgZGF0YS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYWNrYWdlTmFtZSk7CisgICAgICAgIG1SZW1vdGUudHJhbnNhY3QoR0VUX1BBQ0tBR0VfQVNLX1NDUkVFTl9DT01QQVRfVFJBTlNBQ1RJT04sIGRhdGEsIHJlcGx5LCAwKTsKKyAgICAgICAgcmVwbHkucmVhZEV4Y2VwdGlvbigpOworICAgICAgICBib29sZWFuIGFzayA9IHJlcGx5LnJlYWRJbnQoKSAhPSAwOworICAgICAgICByZXBseS5yZWN5Y2xlKCk7CisgICAgICAgIGRhdGEucmVjeWNsZSgpOworICAgICAgICByZXR1cm4gYXNrOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGFzaykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFjdGl2aXR5TWFuYWdlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZyhwYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQoYXNrID8gMSA6IDApOworICAgICAgICBtUmVtb3RlLnRyYW5zYWN0KFNFVF9QQUNLQUdFX0FTS19TQ1JFRU5fQ09NUEFUX1RSQU5TQUNUSU9OLCBkYXRhLCByZXBseSwgMCk7CisgICAgICAgIHJlcGx5LnJlYWRFeGNlcHRpb24oKTsKKyAgICAgICAgcmVwbHkucmVjeWNsZSgpOworICAgICAgICBkYXRhLnJlY3ljbGUoKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBzd2l0Y2hVc2VyKGludCB1c2VyaWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBQYXJjZWwgZGF0YSA9IFBhcmNlbC5vYnRhaW4oKTsKICAgICAgICAgUGFyY2VsIHJlcGx5ID0gUGFyY2VsLm9idGFpbigpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5VGhyZWFkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQppbmRleCA4NWU1OWIzLi4xZWM3YTk2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQWN0aXZpdHlUaHJlYWQuamF2YQpAQCAtMTU1LDcgKzE1NSw5IEBACiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPElCaW5kZXIsIFNlcnZpY2U+KCk7CiAgICAgQXBwQmluZERhdGEgbUJvdW5kQXBwbGljYXRpb247CiAgICAgQ29uZmlndXJhdGlvbiBtQ29uZmlndXJhdGlvbjsKKyAgICBDb25maWd1cmF0aW9uIG1Db21wYXRDb25maWd1cmF0aW9uOwogICAgIENvbmZpZ3VyYXRpb24gbVJlc0NvbmZpZ3VyYXRpb247CisgICAgQ29tcGF0aWJpbGl0eUluZm8gbVJlc0NvbXBhdGliaWxpdHlJbmZvOwogICAgIEFwcGxpY2F0aW9uIG1Jbml0aWFsQXBwbGljYXRpb247CiAgICAgZmluYWwgQXJyYXlMaXN0PEFwcGxpY2F0aW9uPiBtQWxsQXBwbGljYXRpb25zCiAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8QXBwbGljYXRpb24+KCk7CkBAIC0xNzIsMTIgKzE3NCwxNyBAQAogICAgIC8vIFRoZXNlIGNhbiBiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzOyBtUGFja2FnZXMgaXMgdGhlIGxvY2suCiAgICAgLy8gWFhYIEZvciBub3cgd2Uga2VlcCBhcm91bmQgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHBhY2thZ2VzIHdlIGhhdmUKICAgICAvLyBzZWVuLCBub3QgcmVtb3ZpbmcgZW50cmllcyBmcm9tIHRoaXMgbWFwLgorICAgIC8vIE5PVEU6IFRoZSBhY3Rpdml0eSBtYW5hZ2VyIGluIGl0cyBwcm9jZXNzIG5lZWRzIHRvIGNhbGwgaW4gdG8KKyAgICAvLyBBY3Rpdml0eVRocmVhZCB0byBkbyB0aGluZ3MgbGlrZSB1cGRhdGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbnMsCisgICAgLy8gd2hpY2ggbWVhbnMgdGhpcyBsb2NrIGdldHMgaGVsZCB3aGlsZSB0aGUgYWN0aXZpdHkgbWFuYWdlciBob2xkcyBpdHMKKyAgICAvLyBvd24gbG9jay4gIFRodXMgeW91IE1VU1QgTkVWRVIgY2FsbCBiYWNrIGludG8gdGhlIGFjdGl2aXR5IG1hbmFnZXIKKyAgICAvLyBvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gaXQgd2hpbGUgaG9sZGluZyB0aGlzIGxvY2suCiAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFdlYWtSZWZlcmVuY2U8TG9hZGVkQXBrPj4gbVBhY2thZ2VzCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgV2Vha1JlZmVyZW5jZTxMb2FkZWRBcGs+PigpOwogICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBXZWFrUmVmZXJlbmNlPExvYWRlZEFwaz4+IG1SZXNvdXJjZVBhY2thZ2VzCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZywgV2Vha1JlZmVyZW5jZTxMb2FkZWRBcGs+PigpOwotICAgIERpc3BsYXkgbURpc3BsYXkgPSBudWxsOwotICAgIERpc3BsYXlNZXRyaWNzIG1EaXNwbGF5TWV0cmljcyA9IG51bGw7CisgICAgZmluYWwgSGFzaE1hcDxDb21wYXRpYmlsaXR5SW5mbywgRGlzcGxheU1ldHJpY3M+IG1EaXNwbGF5TWV0cmljcworICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxDb21wYXRpYmlsaXR5SW5mbywgRGlzcGxheU1ldHJpY3M+KCk7CiAgICAgZmluYWwgSGFzaE1hcDxSZXNvdXJjZXNLZXksIFdlYWtSZWZlcmVuY2U8UmVzb3VyY2VzPiA+IG1BY3RpdmVSZXNvdXJjZXMKICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8UmVzb3VyY2VzS2V5LCBXZWFrUmVmZXJlbmNlPFJlc291cmNlcz4gPigpOwogICAgIGZpbmFsIEFycmF5TGlzdDxBY3Rpdml0eUNsaWVudFJlY29yZD4gbVJlbGF1bmNoaW5nQWN0aXZpdGllcwpAQCAtMTI3MSwyMCArMTI3OCw0NSBAQAogICAgICAgICByZXR1cm4gc1BhY2thZ2VNYW5hZ2VyOwogICAgIH0KIAotICAgIERpc3BsYXlNZXRyaWNzIGdldERpc3BsYXlNZXRyaWNzTG9ja2VkKGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5TWV0cmljcyAhPSBudWxsICYmICFmb3JjZVVwZGF0ZSkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TWV0cmljczsKKyAgICBEaXNwbGF5TWV0cmljcyBnZXREaXNwbGF5TWV0cmljc0xvY2tlZChDb21wYXRpYmlsaXR5SW5mbyBjaSwgYm9vbGVhbiBmb3JjZVVwZGF0ZSkgeworICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IG1EaXNwbGF5TWV0cmljcy5nZXQoY2kpOworICAgICAgICBpZiAoZG0gIT0gbnVsbCAmJiAhZm9yY2VVcGRhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBkbTsKICAgICAgICAgfQotICAgICAgICBpZiAobURpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKTsKLSAgICAgICAgICAgIG1EaXNwbGF5ID0gd20uZ2V0RGVmYXVsdERpc3BsYXkoKTsKKyAgICAgICAgaWYgKGRtID09IG51bGwpIHsKKyAgICAgICAgICAgIGRtID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7CisgICAgICAgICAgICBtRGlzcGxheU1ldHJpY3MucHV0KGNpLCBkbSk7CiAgICAgICAgIH0KLSAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IG1EaXNwbGF5TWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgICAgICBtRGlzcGxheS5nZXRNZXRyaWNzKG1ldHJpY3MpOworICAgICAgICBEaXNwbGF5IGQgPSBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KGNpKS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICBkLmdldE1ldHJpY3MoZG0pOwogICAgICAgICAvL1Nsb2cuaSgiZm9vIiwgIk5ldyBtZXRyaWNzOiB3PSIgKyBtZXRyaWNzLndpZHRoUGl4ZWxzICsgIiBoPSIKICAgICAgICAgLy8gICAgICAgICsgbWV0cmljcy5oZWlnaHRQaXhlbHMgKyAiIGRlbj0iICsgbWV0cmljcy5kZW5zaXR5CiAgICAgICAgIC8vICAgICAgICArICIgeGRwaT0iICsgbWV0cmljcy54ZHBpICsgIiB5ZHBpPSIgKyBtZXRyaWNzLnlkcGkpOwotICAgICAgICByZXR1cm4gbWV0cmljczsKKyAgICAgICAgcmV0dXJuIGRtOworICAgIH0KKworICAgIHN0YXRpYyBDb25maWd1cmF0aW9uIGFwcGx5Q29uZmlnQ29tcGF0KENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXQpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcGF0ICE9IG51bGwgJiYgIWNvbXBhdC5zdXBwb3J0c1NjcmVlbigpKSB7CisgICAgICAgICAgICBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcpOworICAgICAgICAgICAgY29tcGF0LmFwcGx5VG9Db25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gbU1haW5UaHJlYWRDb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgIENvbmZpZ3VyYXRpb24gYXBwbHlDb25maWdDb21wYXRNYWluVGhyZWFkKENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXQpIHsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcGF0ICE9IG51bGwgJiYgIWNvbXBhdC5zdXBwb3J0c1NjcmVlbigpKSB7CisgICAgICAgICAgICBtTWFpblRocmVhZENvbmZpZy5zZXRUbyhjb25maWcpOworICAgICAgICAgICAgY29uZmlnID0gbU1haW5UaHJlYWRDb25maWc7CisgICAgICAgICAgICBjb21wYXQuYXBwbHlUb0NvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlnOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMyNiw3ICsxMzU4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vU2xvZy5pKFRBRywgIlJlc291cmNlOiBrZXk9IiArIGtleSArICIsIGRpc3BsYXkgbWV0cmljcz0iICsgbWV0cmljcyk7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBnZXREaXNwbGF5TWV0cmljc0xvY2tlZChmYWxzZSk7CisgICAgICAgIERpc3BsYXlNZXRyaWNzIG1ldHJpY3MgPSBnZXREaXNwbGF5TWV0cmljc0xvY2tlZChjb21wSW5mbywgZmFsc2UpOwogICAgICAgICByID0gbmV3IFJlc291cmNlcyhhc3NldHMsIG1ldHJpY3MsIGdldENvbmZpZ3VyYXRpb24oKSwgY29tcEluZm8pOwogICAgICAgICBpZiAoZmFsc2UpIHsKICAgICAgICAgICAgIFNsb2cuaShUQUcsICJDcmVhdGVkIGFwcCByZXNvdXJjZXMgIiArIHJlc0RpciArICIgIiArIHIgKyAiOiAiCkBAIC0xMzU0LDcgKzEzODYsNyBAQAogICAgICAqIENyZWF0ZXMgdGhlIHRvcCBsZXZlbCByZXNvdXJjZXMgZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgogICAgICAqLwogICAgIFJlc291cmNlcyBnZXRUb3BMZXZlbFJlc291cmNlcyhTdHJpbmcgcmVzRGlyLCBMb2FkZWRBcGsgcGtnSW5mbykgewotICAgICAgICByZXR1cm4gZ2V0VG9wTGV2ZWxSZXNvdXJjZXMocmVzRGlyLCBwa2dJbmZvLm1Db21wYXRpYmlsaXR5SW5mbyk7CisgICAgICAgIHJldHVybiBnZXRUb3BMZXZlbFJlc291cmNlcyhyZXNEaXIsIHBrZ0luZm8ubUNvbXBhdGliaWxpdHlJbmZvLmdldCgpKTsKICAgICB9CiAKICAgICBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7CkBAIC0xNDg5LDcgKzE1MjEsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQ29uZmlndXJhdGlvbjsKKyAgICAgICAgcmV0dXJuIG1SZXNDb25maWd1cmF0aW9uOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzUHJvZmlsaW5nKCkgewpAQCAtMTUyMSw3ICsxNTUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvLkRFRkFVTFRfQ09NUEFUSUJJTElUWV9JTkZPKTsKICAgICAgICAgICAgICAgICBjb250ZXh0LmluaXQoaW5mbywgbnVsbCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRSZXNvdXJjZXMoKS51cGRhdGVDb25maWd1cmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhdGlvbigpLCBnZXREaXNwbGF5TWV0cmljc0xvY2tlZChmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhdGlvbigpLCBnZXREaXNwbGF5TWV0cmljc0xvY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8uREVGQVVMVF9DT01QQVRJQklMSVRZX0lORk8sIGZhbHNlKSk7CiAgICAgICAgICAgICAgICAgbVN5c3RlbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgIkNyZWF0ZWQgc3lzdGVtIHJlc291cmNlcyAiICsgY29udGV4dC5nZXRSZXNvdXJjZXMoKQogICAgICAgICAgICAgICAgIC8vICAgICAgICArICI6ICIgKyBjb250ZXh0LmdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKSk7CkBAIC0xNTM0LDcgKzE1NjcsNyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIENvbnRleHRJbXBsIGNvbnRleHQgPSBnZXRTeXN0ZW1Db250ZXh0KCk7CiAgICAgICAgICAgICBjb250ZXh0LmluaXQobmV3IExvYWRlZEFwayh0aGlzLCAiYW5kcm9pZCIsIGNvbnRleHQsIGluZm8sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21wYXRpYmlsaXR5SW5mbyhpbmZvLCAwLCBmYWxzZSkpLCBudWxsLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8uREVGQVVMVF9DT01QQVRJQklMSVRZX0lORk8pLCBudWxsLCB0aGlzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTczNCw3ICsxNzY3LDcgQEAKICAgICAgICAgICAgICAgICBhcHBDb250ZXh0LmluaXQoci5wYWNrYWdlSW5mbywgci50b2tlbiwgdGhpcyk7CiAgICAgICAgICAgICAgICAgYXBwQ29udGV4dC5zZXRPdXRlckNvbnRleHQoYWN0aXZpdHkpOwogICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0aXRsZSA9IHIuYWN0aXZpdHlJbmZvLmxvYWRMYWJlbChhcHBDb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkpOwotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24obUNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24obUNvbXBhdENvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChERUJVR19DT05GSUdVUkFUSU9OKSBTbG9nLnYoVEFHLCAiTGF1bmNoaW5nIGFjdGl2aXR5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgci5hY3Rpdml0eUluZm8ubmFtZSArICIgd2l0aCBjb25maWcgIiArIGNvbmZpZyk7CiAgICAgICAgICAgICAgICAgYWN0aXZpdHkuYXR0YWNoKGFwcENvbnRleHQsIHRoaXMsIGdldEluc3RydW1lbnRhdGlvbigpLCByLnRva2VuLApAQCAtMTg3OSw3ICsxOTEyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGl2ZXJOZXdJbnRlbnRzKHIsIGludGVudHMpOwogICAgICAgICAgICAgaWYgKHJlc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uUmVzdW1lKHIuYWN0aXZpdHkpOworICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkucGVyZm9ybVJlc3VtZSgpOwogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubVRlbXBvcmFyeVBhdXNlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE5ODAsNyArMjAxMyw4IEBACiAgICAgICAgIEJhY2t1cEFnZW50IGFnZW50ID0gbnVsbDsKICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGRhdGEuYXBwSW5mby5iYWNrdXBBZ2VudE5hbWU7CiAKLSAgICAgICAgaWYgKGRhdGEuYmFja3VwTW9kZSA9PSBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfRlVMTCkgeworICAgICAgICBpZiAoZGF0YS5iYWNrdXBNb2RlID09IElBcHBsaWNhdGlvblRocmVhZC5CQUNLVVBfTU9ERV9GVUxMCisgICAgICAgICAgICAgICAgfHwgZGF0YS5iYWNrdXBNb2RlID09IElBcHBsaWNhdGlvblRocmVhZC5CQUNLVVBfTU9ERV9SRVNUT1JFX0ZVTEwpIHsKICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJhbmRyb2lkLmFwcC5iYWNrdXAuRnVsbEJhY2t1cEFnZW50IjsKICAgICAgICAgICAgIGlmICgoZGF0YS5hcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1lTVEVNKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHBhY2thZ2VzIGNhbiBzdXBwbHkgdGhlaXIgb3duIGZ1bGwtYmFja3VwIGFnZW50CkBAIC0yMDExLDcgKzIwNDUsOCBAQAogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgZHVyaW5nIHJlc3RvcmUsIGZhaWwgc2lsZW50bHk7IG90aGVyd2lzZSBnbwogICAgICAgICAgICAgICAgIC8vIGFoZWFkIGFuZCBsZXQgdGhlIHVzZXIgc2VlIHRoZSBjcmFzaC4KICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQWdlbnQgdGhyZXcgZHVyaW5nIGNyZWF0aW9uOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEuYmFja3VwTW9kZSAhPSBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfUkVTVE9SRSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhLmJhY2t1cE1vZGUgIT0gSUFwcGxpY2F0aW9uVGhyZWFkLkJBQ0tVUF9NT0RFX1JFU1RPUkUKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRhdGEuYmFja3VwTW9kZSAhPSBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfUkVTVE9SRV9GVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGZhbGxpbmcgdGhyb3VnaCB3aXRoICdiaW5kZXInIHN0aWxsIG51bGwKQEAgLTI3NzUsMTMgKzI4MTAsMTQgQEAKICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVXBkYXRlUGFja2FnZUNvbXBhdGliaWxpdHlJbmZvKFVwZGF0ZUNvbXBhdGliaWxpdHlEYXRhIGRhdGEpIHsKICAgICAgICAgTG9hZGVkQXBrIGFwayA9IHBlZWtQYWNrYWdlSW5mbyhkYXRhLnBrZywgZmFsc2UpOwogICAgICAgICBpZiAoYXBrICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFway5tQ29tcGF0aWJpbGl0eUluZm8gPSBkYXRhLmluZm87CisgICAgICAgICAgICBhcGsubUNvbXBhdGliaWxpdHlJbmZvLnNldChkYXRhLmluZm8pOwogICAgICAgICB9CiAgICAgICAgIGFwayA9IHBlZWtQYWNrYWdlSW5mbyhkYXRhLnBrZywgdHJ1ZSk7CiAgICAgICAgIGlmIChhcGsgIT0gbnVsbCkgewotICAgICAgICAgICAgYXBrLm1Db21wYXRpYmlsaXR5SW5mbyA9IGRhdGEuaW5mbzsKKyAgICAgICAgICAgIGFway5tQ29tcGF0aWJpbGl0eUluZm8uc2V0KGRhdGEuaW5mbyk7CiAgICAgICAgIH0KICAgICAgICAgaGFuZGxlQ29uZmlndXJhdGlvbkNoYW5nZWQobUNvbmZpZ3VyYXRpb24sIGRhdGEuaW5mbyk7CisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5yZXBvcnROZXdDb25maWd1cmF0aW9uKG1Db25maWd1cmF0aW9uKTsKICAgICB9CiAKICAgICBwcml2YXRlIGZpbmFsIHZvaWQgZGVsaXZlclJlc3VsdHMoQWN0aXZpdHlDbGllbnRSZWNvcmQgciwgTGlzdDxSZXN1bHRJbmZvPiByZXN1bHRzKSB7CkBAIC0yODQzLDcgKzI4NzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVsaXZlclJlc3VsdHMociwgcmVzLnJlc3VsdHMpOwogICAgICAgICAgICAgaWYgKHJlc3VtZWQpIHsKLSAgICAgICAgICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmNhbGxBY3Rpdml0eU9uUmVzdW1lKHIuYWN0aXZpdHkpOworICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkucGVyZm9ybVJlc3VtZSgpOwogICAgICAgICAgICAgICAgIHIuYWN0aXZpdHkubVRlbXBvcmFyeVBhdXNlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMyMDQsMjAgKzMyNDAsMjIgQEAKICAgICAgICAgICAgICAgICBBY3Rpdml0eUNsaWVudFJlY29yZCBhciA9IGl0Lm5leHQoKTsKICAgICAgICAgICAgICAgICBBY3Rpdml0eSBhID0gYXIuYWN0aXZpdHk7CiAgICAgICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHRoaXNDb25maWcgPSBhcHBseUNvbmZpZ0NvbXBhdE1haW5UaHJlYWQobmV3Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyLnBhY2thZ2VJbmZvLm1Db21wYXRpYmlsaXR5SW5mby5nZXRJZk5lZWRlZCgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFhci5hY3Rpdml0eS5tRmluaXNoZWQgJiYgKGFsbEFjdGl2aXRpZXMgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSAhPSBudWxsICYmICFhci5wYXVzZWQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFjdGl2aXR5IGlzIGN1cnJlbnRseSByZXN1bWVkLCBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZHMgdG8gY2hhbmdlIHJpZ2h0IG5vdy4KICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5hZGQoYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3Q29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzQ29uZmlnICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2Ugd2lsbCB0ZWxsIGl0IGFib3V0IHRoZSBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IHRpbWUgaXQgaXMgcmVzdW1lZCBvciBzaG93bi4gIE5vdGUgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdGl2aXR5IG1hbmFnZXIgbWF5LCBiZWZvcmUgdGhlbiwgZGVjaWRlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgbmVlZHMgdG8gYmUgZGVzdHJveWVkIHRvIGhhbmRsZSBpdHMgbmV3CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHX0NPTkZJR1VSQVRJT04pIFNsb2cudihUQUcsICJTZXR0aW5nIGFjdGl2aXR5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhci5hY3Rpdml0eUluZm8ubmFtZSArICIgbmV3Q29uZmlnPSIgKyBuZXdDb25maWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXIubmV3Q29uZmlnID0gbmV3Q29uZmlnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFyLmFjdGl2aXR5SW5mby5uYW1lICsgIiBuZXdDb25maWc9IiArIHRoaXNDb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgYXIubmV3Q29uZmlnID0gdGhpc0NvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTMyNjQsMTEgKzMzMDIsMTAgQEAKICAgICAgICAgICAgIC8vIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQKICAgICAgICAgICAgIGludCBkaWZmID0gYWN0aXZpdHkubUN1cnJlbnRDb25maWcuZGlmZihjb25maWcpOwogICAgICAgICAgICAgaWYgKGRpZmYgIT0gMCkgewotCiAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhY3Rpdml0eSBkb2Vzbid0IGhhbmRsZSBhbnkgb2YgdGhlIGNvbmZpZyBjaGFuZ2VzCiAgICAgICAgICAgICAgICAgLy8gdGhlbiBkb24ndCBib3RoZXIgY2FsbGluZyBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkIGFzIHdlJ3JlCiAgICAgICAgICAgICAgICAgLy8gZ29pbmcgdG8gZGVzdHJveSBpdC4KLSAgICAgICAgICAgICAgICBpZiAoKH5hY3Rpdml0eS5tQWN0aXZpdHlJbmZvLmNvbmZpZ0NoYW5nZXMgJiBkaWZmKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCh+YWN0aXZpdHkubUFjdGl2aXR5SW5mby5nZXRSZWFsQ29uZmlnQ2hhbmdlZCgpICYgZGlmZikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzaG91bGRDaGFuZ2VDb25maWcgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTMyOTEsNiArMzMyOCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIGZpbmFsIHZvaWQgYXBwbHlDb25maWd1cmF0aW9uVG9SZXNvdXJjZXMoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtUGFja2FnZXMpIHsKKyAgICAgICAgICAgIGFwcGx5Q29uZmlndXJhdGlvblRvUmVzb3VyY2VzTG9ja2VkKGNvbmZpZywgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmaW5hbCBib29sZWFuIGFwcGx5Q29uZmlndXJhdGlvblRvUmVzb3VyY2VzTG9ja2VkKENvbmZpZ3VyYXRpb24gY29uZmlnLAogICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0KSB7CiAgICAgICAgIGlmIChtUmVzQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CkBAIC0zMzAyLDcgKzMzNDUsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpbnQgY2hhbmdlcyA9IG1SZXNDb25maWd1cmF0aW9uLnVwZGF0ZUZyb20oY29uZmlnKTsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgZG0gPSBnZXREaXNwbGF5TWV0cmljc0xvY2tlZCh0cnVlKTsKKyAgICAgICAgRGlzcGxheU1ldHJpY3MgZG0gPSBnZXREaXNwbGF5TWV0cmljc0xvY2tlZChjb21wYXQsIHRydWUpOworCisgICAgICAgIGlmIChjb21wYXQgIT0gbnVsbCAmJiAobVJlc0NvbXBhdGliaWxpdHlJbmZvID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAhbVJlc0NvbXBhdGliaWxpdHlJbmZvLmVxdWFscyhjb21wYXQpKSkgeworICAgICAgICAgICAgbVJlc0NvbXBhdGliaWxpdHlJbmZvID0gY29tcGF0OworICAgICAgICAgICAgY2hhbmdlcyB8PSBBY3Rpdml0eUluZm8uQ09ORklHX1NDUkVFTl9MQVlPVVQKKyAgICAgICAgICAgICAgICAgICAgfCBBY3Rpdml0eUluZm8uQ09ORklHX1NDUkVFTl9TSVpFCisgICAgICAgICAgICAgICAgICAgIHwgQWN0aXZpdHlJbmZvLkNPTkZJR19TTUFMTEVTVF9TQ1JFRU5fU0laRTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHNldCBpdCBmb3IgamF2YSwgdGhpcyBhbHNvIGFmZmVjdHMgbmV3bHkgY3JlYXRlZCBSZXNvdXJjZXMKICAgICAgICAgaWYgKGNvbmZpZy5sb2NhbGUgIT0gbnVsbCkgewpAQCAtMzM2NCwxMyArMzQxNSwxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Db25maWd1cmF0aW9uLnVwZGF0ZUZyb20oY29uZmlnKTsKLSAgICAgICAgICAgIGlmIChjb21wYXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIENhbid0IGRvIHRoaXMgaGVyZSwgYmVjYXVzZSBpdCBjYXVzZXMgdXMgdG8gcmVwb3J0IHRoZQotICAgICAgICAgICAgICAgIC8vIGNvbWF0aWJsZSBjb25maWcgYmFjayB0byB0aGUgYW0gYXMgdGhlIGN1cnJlbnQgY29uZmlnCi0gICAgICAgICAgICAgICAgLy8gb2YgdGhlIGFjdGl2aXR5LCBhbmQgbXVjaCB1bmhhcHBpbmVzcyByZXN1bHRzLgotICAgICAgICAgICAgICAgIC8vY29tcGF0LmFwcGx5VG9Db25maWd1cmF0aW9uKG1Db25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChtQ29tcGF0Q29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbXBhdENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgfQotCisgICAgICAgICAgICBtQ29tcGF0Q29uZmlndXJhdGlvbi5zZXRUbyhtQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBpZiAobVJlc0NvbXBhdGliaWxpdHlJbmZvICE9IG51bGwgJiYgIW1SZXNDb21wYXRpYmlsaXR5SW5mby5zdXBwb3J0c1NjcmVlbigpKSB7CisgICAgICAgICAgICAgICAgbVJlc0NvbXBhdGliaWxpdHlJbmZvLmFwcGx5VG9Db25maWd1cmF0aW9uKG1Db21wYXRDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBtQ29tcGF0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhbGxiYWNrcyA9IGNvbGxlY3RDb21wb25lbnRDYWxsYmFja3NMb2NrZWQoZmFsc2UsIGNvbmZpZyk7CiAgICAgICAgIH0KIApAQCAtMzM5MSw3ICszNDQzLDcgQEAKICAgICAgICAgaWYgKERFQlVHX0NPTkZJR1VSQVRJT04pIFNsb2cudihUQUcsICJIYW5kbGUgYWN0aXZpdHkgY29uZmlnIGNoYW5nZWQ6ICIKICAgICAgICAgICAgICAgICArIHIuYWN0aXZpdHlJbmZvLm5hbWUpOwogICAgICAgICAKLSAgICAgICAgcGVyZm9ybUNvbmZpZ3VyYXRpb25DaGFuZ2VkKHIuYWN0aXZpdHksIG1Db25maWd1cmF0aW9uKTsKKyAgICAgICAgcGVyZm9ybUNvbmZpZ3VyYXRpb25DaGFuZ2VkKHIuYWN0aXZpdHksIG1Db21wYXRDb25maWd1cmF0aW9uKTsKICAgICB9CiAKICAgICBmaW5hbCB2b2lkIGhhbmRsZVByb2ZpbGVyQ29udHJvbChib29sZWFuIHN0YXJ0LCBQcm9maWxlckNvbnRyb2xEYXRhIHBjZCkgewpAQCAtMzQ4NSw2ICszNTM3LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIHZvaWQgaGFuZGxlQmluZEFwcGxpY2F0aW9uKEFwcEJpbmREYXRhIGRhdGEpIHsKICAgICAgICAgbUJvdW5kQXBwbGljYXRpb24gPSBkYXRhOwogICAgICAgICBtQ29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKGRhdGEuY29uZmlnKTsKKyAgICAgICAgbUNvbXBhdENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbihkYXRhLmNvbmZpZyk7CiAKICAgICAgICAgLy8gc2VuZCB1cCBhcHAgbmFtZTsgZG8gdGhpcyAqYmVmb3JlKiB3YWl0aW5nIGZvciBkZWJ1Z2dlcgogICAgICAgICBQcm9jZXNzLnNldEFyZ1YwKGRhdGEucHJvY2Vzc05hbWUpOwpAQCAtMzUxNiw4ICszNTY5LDcgQEAKICAgICAgICAgICogcmVmbGVjdCBjb25maWd1cmF0aW9uIGNoYW5nZXMuIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBwYXNzZWQKICAgICAgICAgICogaW4gQXBwQmluZERhdGEgY2FuIGJlIHNhZmVseSBhc3N1bWVkIHRvIGJlIHVwIHRvIGRhdGUKICAgICAgICAgICovCi0gICAgICAgIFJlc291cmNlcy5nZXRTeXN0ZW0oKS51cGRhdGVDb25maWd1cmF0aW9uKG1Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXREaXNwbGF5TWV0cmljcygpLCBkYXRhLmNvbXBhdEluZm8pOworICAgICAgICBhcHBseUNvbmZpZ3VyYXRpb25Ub1Jlc291cmNlc0xvY2tlZChkYXRhLmNvbmZpZywgZGF0YS5jb21wYXRJbmZvKTsKIAogICAgICAgICBkYXRhLmluZm8gPSBnZXRQYWNrYWdlSW5mb05vQ2hlY2soZGF0YS5hcHBJbmZvLCBkYXRhLmNvbXBhdEluZm8pOwogCkBAIC0zNjU4LDEyICszNzEwLDE2IEBACiAgICAgICAgIEFwcGxpY2F0aW9uIGFwcCA9IGRhdGEuaW5mby5tYWtlQXBwbGljYXRpb24oZGF0YS5yZXN0cmljdGVkQmFja3VwTW9kZSwgbnVsbCk7CiAgICAgICAgIG1Jbml0aWFsQXBwbGljYXRpb24gPSBhcHA7CiAKLSAgICAgICAgTGlzdDxQcm92aWRlckluZm8+IHByb3ZpZGVycyA9IGRhdGEucHJvdmlkZXJzOwotICAgICAgICBpZiAocHJvdmlkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGluc3RhbGxDb250ZW50UHJvdmlkZXJzKGFwcCwgcHJvdmlkZXJzKTsKLSAgICAgICAgICAgIC8vIEZvciBwcm9jZXNzIHRoYXQgY29udGFpbnMgY29udGVudCBwcm92aWRlcnMsIHdlIHdhbnQgdG8KLSAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBKSVQgaXMgZW5hYmxlZCAiYXQgc29tZSBwb2ludCIuCi0gICAgICAgICAgICBtSC5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChILkVOQUJMRV9KSVQsIDEwKjEwMDApOworICAgICAgICAvLyBkb24ndCBicmluZyB1cCBwcm92aWRlcnMgaW4gcmVzdHJpY3RlZCBtb2RlOyB0aGV5IG1heSBkZXBlbmQgb24gdGhlCisgICAgICAgIC8vIGFwcCdzIGN1c3RvbSBBcHBsaWNhdGlvbiBjbGFzcworICAgICAgICBpZiAoIWRhdGEucmVzdHJpY3RlZEJhY2t1cE1vZGUpeyAKKyAgICAgICAgICAgIExpc3Q8UHJvdmlkZXJJbmZvPiBwcm92aWRlcnMgPSBkYXRhLnByb3ZpZGVyczsKKyAgICAgICAgICAgIGlmIChwcm92aWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluc3RhbGxDb250ZW50UHJvdmlkZXJzKGFwcCwgcHJvdmlkZXJzKTsKKyAgICAgICAgICAgICAgICAvLyBGb3IgcHJvY2VzcyB0aGF0IGNvbnRhaW5zIGNvbnRlbnQgcHJvdmlkZXJzLCB3ZSB3YW50IHRvCisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIEpJVCBpcyBlbmFibGVkICJhdCBzb21lIHBvaW50Ii4KKyAgICAgICAgICAgICAgICBtSC5zZW5kRW1wdHlNZXNzYWdlRGVsYXllZChILkVOQUJMRV9KSVQsIDEwKjEwMDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BbGVydERpYWxvZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEKaW5kZXggZTgzZDEwNC4uN2E0NjVjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FsZXJ0RGlhbG9nLmphdmEKQEAgLTg5MCw3ICs4OTAsNyBAQAogICAgICAgICBwdWJsaWMgQWxlcnREaWFsb2cgY3JlYXRlKCkgewogICAgICAgICAgICAgZmluYWwgQWxlcnREaWFsb2cgZGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nKFAubUNvbnRleHQsIG1UaGVtZSwgZmFsc2UpOwogICAgICAgICAgICAgUC5hcHBseShkaWFsb2cubUFsZXJ0KTsKLSAgICAgICAgICAgIGRpYWxvZy5zZXRDYW5jZWxhYmxlKFAubUNhbmNlbGFibGUpOworICAgICAgICAgICAgZGlhbG9nLnNldENhbmNlbGVkT25Ub3VjaE91dHNpZGUoUC5tQ2FuY2VsYWJsZSk7CiAgICAgICAgICAgICBkaWFsb2cuc2V0T25DYW5jZWxMaXN0ZW5lcihQLm1PbkNhbmNlbExpc3RlbmVyKTsKICAgICAgICAgICAgIGlmIChQLm1PbktleUxpc3RlbmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBkaWFsb2cuc2V0T25LZXlMaXN0ZW5lcihQLm1PbktleUxpc3RlbmVyKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BcHBsaWNhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uLmphdmEKaW5kZXggYjlhYzg0OC4uMTBjYzlmOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uLmphdmEKQEAgLTM3LDYgKzM3LDggQEAKICAqIHdoZW4gZmlyc3QgY29uc3RydWN0aW5nIHRoZSBzaW5nbGV0b24uPC9wPgogICovCiBwdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gZXh0ZW5kcyBDb250ZXh0V3JhcHBlciBpbXBsZW1lbnRzIENvbXBvbmVudENhbGxiYWNrcyB7CisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIExvYWRlZEFwayBtTG9hZGVkQXBrOwogICAgIAogICAgIHB1YmxpYyBBcHBsaWNhdGlvbigpIHsKICAgICAgICAgc3VwZXIobnVsbCk7CkBAIC03NSw2ICs3Nyw2IEBACiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCB2b2lkIGF0dGFjaChDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgYXR0YWNoQmFzZUNvbnRleHQoY29udGV4dCk7CisgICAgICAgIG1Mb2FkZWRBcGsgPSBDb250ZXh0SW1wbC5nZXRJbXBsKGNvbnRleHQpLm1QYWNrYWdlSW5mbzsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKaW5kZXggNTFmMWUzZC4uOTRhNGFmYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0NvbnRleHRJbXBsLmphdmEKQEAgLTUyLDYgKzUyLDggQEAKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrUG9saWN5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5UaHJvdHRsZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuSVRocm90dGxlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CkBAIC0zMzksNiArMzQxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYXRpb25NYW5hZ2VyKElMb2NhdGlvbk1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZShiKSk7CiAgICAgICAgICAgICAgICAgfX0pOwogCisgICAgICAgIHJlZ2lzdGVyU2VydmljZShORVRXT1JLX1BPTElDWV9TRVJWSUNFLCBuZXcgU2VydmljZUZldGNoZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlU2VydmljZShDb250ZXh0SW1wbCBjdHgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtQb2xpY3lNYW5hZ2VyKElOZXR3b3JrUG9saWN5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShORVRXT1JLX1BPTElDWV9TRVJWSUNFKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKwogICAgICAgICByZWdpc3RlclNlcnZpY2UoTk9USUZJQ0FUSU9OX1NFUlZJQ0UsIG5ldyBTZXJ2aWNlRmV0Y2hlcigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZVNlcnZpY2UoQ29udGV4dEltcGwgY3R4KSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgb3V0ZXJDb250ZXh0ID0gY3R4LmdldE91dGVyQ29udGV4dCgpOwpAQCAtNDI1LDE0ICs0MzUsMTkgQEAKIAogICAgICAgICByZWdpc3RlclNlcnZpY2UoV0lORE9XX1NFUlZJQ0UsIG5ldyBTZXJ2aWNlRmV0Y2hlcigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2UoQ29udGV4dEltcGwgY3R4KSB7Ci0gICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVFeGNlcHRpb24gZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmb28iKTsKLSAgICAgICAgICAgICAgICAgICAgZS5maWxsSW5TdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkdldHRpbmcgd2luZG93IG1hbmFnZXIiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2kgPSBjdHgubVJlc291cmNlcy5nZXRDb21wYXRpYmlsaXR5SW5mbygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdChjaSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KGN0eC5tUGFja2FnZUluZm8ubUNvbXBhdGliaWxpdHlJbmZvKTsKICAgICAgICAgICAgICAgICB9fSk7CiAgICAgfQogCisgICAgc3RhdGljIENvbnRleHRJbXBsIGdldEltcGwoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIENvbnRleHQgbmV4dENvbnRleHQ7CisgICAgICAgIHdoaWxlICgoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHRXcmFwcGVyKSAmJgorICAgICAgICAgICAgICAgIChuZXh0Q29udGV4dD0oKENvbnRleHRXcmFwcGVyKWNvbnRleHQpLmdldEJhc2VDb250ZXh0KCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBuZXh0Q29udGV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKENvbnRleHRJbXBsKWNvbnRleHQ7CisgICAgfQorCiAgICAgLy8gVGhlIHN5c3RlbSBzZXJ2aWNlIGNhY2hlIGZvciB0aGUgc3lzdGVtIHNlcnZpY2VzIHRoYXQgYXJlCiAgICAgLy8gY2FjaGVkIHBlci1Db250ZXh0SW1wbC4gIFBhY2thZ2Utc2NvcGVkIHRvIGF2b2lkIGFjY2Vzc29yCiAgICAgLy8gbWV0aG9kcy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Eb3dubG9hZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Eb3dubG9hZE1hbmFnZXIuamF2YQppbmRleCBiODhlNWNmLi5hZDhkNDFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRG93bmxvYWRNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0Rvd25sb2FkTWFuYWdlci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXcmFwcGVyOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKQEAgLTE3MCw3ICsxNzEsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRVU19GQUlMRUQgPSAxIDw8IDQ7CiAKLQogICAgIC8qKgogICAgICAqIFZhbHVlIG9mIENPTFVNTl9FUlJPUl9DT0RFIHdoZW4gdGhlIGRvd25sb2FkIGhhcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvciB0aGF0IGRvZXNuJ3QgZml0CiAgICAgICogdW5kZXIgYW55IG90aGVyIGVycm9yIGNvZGUuCkBAIC0yMjYsNiArMjI2LDE0IEBACiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyA9IDEwMDk7CiAKICAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9SRUFTT059IHdoZW4gdGhlIGRvd25sb2FkIGhhcyBmYWlsZWQgYmVjYXVzZSBvZgorICAgICAqIHtAbGluayBOZXR3b3JrUG9saWN5TWFuYWdlcn0gY29udHJvbHMgb24gdGhlIHJlcXVlc3RpbmcgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0JMT0NLRUQgPSAxMDEwOworCisgICAgLyoqCiAgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fUkVBU09OfSB3aGVuIHRoZSBkb3dubG9hZCBpcyBwYXVzZWQgYmVjYXVzZSBzb21lIG5ldHdvcmsgZXJyb3IKICAgICAgKiBvY2N1cnJlZCBhbmQgdGhlIGRvd25sb2FkIG1hbmFnZXIgaXMgd2FpdGluZyBiZWZvcmUgcmV0cnlpbmcgdGhlIHJlcXVlc3QuCiAgICAgICovCkBAIC0xMzA0LDYgKzEzMTIsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLkltcGwuU1RBVFVTX0ZJTEVfQUxSRUFEWV9FWElTVFNfRVJST1I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwogCisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuSW1wbC5TVEFUVVNfQkxPQ0tFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JMT0NLRUQ7CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKaW5kZXggNmYwYmJkNy4uY2I5N2M0NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50LmphdmEKQEAgLTI0NCwxMiArMjQ0LDEyIEBACiAgKiBvbiB7QGxpbmsgTGlzdEZyYWdtZW50fSBmb3IgbW9zdCBvZiBpdHMgd29yay4gIE5vdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mCiAgKiBjbGlja2luZyBhbiBpdGVtOiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgYWN0aXZpdHkncyBsYXlvdXQsIGl0IGNhbiBlaXRoZXIKICAqIGNyZWF0ZSBhbmQgZGlzcGxheSBhIG5ldyBmcmFnbWVudCB0byBzaG93IHRoZSBkZXRhaWxzIGluLXBsYWNlIChtb3JlIGFib3V0Ci0gKiB0aGlzIGxhdGVyKSwgb3Igc3RhcnQgYSBuZXcgYWN0aXZpdHkgc2hvdyB0aGUgZGV0YWlscy48L3A+CisgKiB0aGlzIGxhdGVyKSwgb3Igc3RhcnQgYSBuZXcgYWN0aXZpdHkgdG8gc2hvdyB0aGUgZGV0YWlscy48L3A+CiAgKgogICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCiAgKiAgICAgIHRpdGxlc30KICAqCi0gKiA8cD5UaGUgZGV0YWlscyBmcmFnbWVudCBzaG93aW5nIHRoZSBjb250ZW50cyBvZiBzZWxlY3RlZCBpdGVtIGhlcmUganVzdAorICogPHA+VGhlIGRldGFpbHMgZnJhZ21lbnQgc2hvd2luZyB0aGUgY29udGVudHMgb2YgYSBzZWxlY3RlZCBpdGVtIGp1c3QKICAqIGRpc3BsYXlzIGEgc3RyaW5nIG9mIHRleHQgYmFzZWQgb24gYW4gaW5kZXggb2YgYSBzdHJpbmcgYXJyYXkgYnVpbHQgaW4gdG8KICAqIHRoZSBhcHA6PC9wPgogICoKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICogICAgICBkZXRhaWxzfQogICoKICAqIDxwPkluIHRoaXMgY2FzZSB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIHRpdGxlLCB0aGVyZSBpcyBubyBkZXRhaWxzCi0gKiBjb250YWluZXIgaW4gdGhlIGN1cnJlbnQgYWN0aXZpdHksIHNvIHRoZSB0aXRsZSB0aXRsZSBmcmFnbWVudCdzIGNsaWNrIGNvZGUgd2lsbAorICogY29udGFpbmVyIGluIHRoZSBjdXJyZW50IGFjdGl2aXR5LCBzbyB0aGUgdGl0bGVzIGZyYWdtZW50J3MgY2xpY2sgY29kZSB3aWxsCiAgKiBsYXVuY2ggYSBuZXcgYWN0aXZpdHkgdG8gZGlzcGxheSB0aGUgZGV0YWlscyBmcmFnbWVudDo8L3A+CiAgKgogICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCkBAIC0zNjcsNiArMzY3LDkgQEAKICAgICAvLyBUYXJnZXQgZnJhZ21lbnQuCiAgICAgRnJhZ21lbnQgbVRhcmdldDsKIAorICAgIC8vIEZvciB1c2Ugd2hlbiByZXRhaW5pbmcgYSBmcmFnbWVudDogdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgbVRhcmdldC4KKyAgICBpbnQgbVRhcmdldEluZGV4ID0gLTE7CisKICAgICAvLyBUYXJnZXQgcmVxdWVzdCBjb2RlLgogICAgIGludCBtVGFyZ2V0UmVxdWVzdENvZGU7CiAKQEAgLTQ1MCw2ICs0NTMsNTEgQEAKICAgICBib29sZWFuIG1DaGVja2VkRm9yTG9hZGVyTWFuYWdlcjsKICAgICAKICAgICAvKioKKyAgICAgKiBTdGF0ZSBpbmZvcm1hdGlvbiB0aGF0IGhhcyBiZWVuIHJldHJpZXZlZCBmcm9tIGEgZnJhZ21lbnQgaW5zdGFuY2UKKyAgICAgKiB0aHJvdWdoIHtAbGluayBGcmFnbWVudE1hbmFnZXIjc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZShGcmFnbWVudCkKKyAgICAgKiBGcmFnbWVudE1hbmFnZXIuc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBtU3RhdGU7CisKKyAgICAgICAgU2F2ZWRTdGF0ZShCdW5kbGUgc3RhdGUpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgU2F2ZWRTdGF0ZShQYXJjZWwgaW4sIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAgICAgbVN0YXRlID0gaW4ucmVhZEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlLnNldENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnVuZGxlKG1TdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IKKyAgICAgICAgICAgICAgICA9IG5ldyBQYXJjZWxhYmxlLkNsYXNzTG9hZGVyQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluLCBudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4sIENsYXNzTG9hZGVyIGxvYWRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbiwgbG9hZGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaHJvd24gYnkge0BsaW5rIEZyYWdtZW50I2luc3RhbnRpYXRlKENvbnRleHQsIFN0cmluZywgQnVuZGxlKX0gd2hlbgogICAgICAqIHRoZXJlIGlzIGFuIGluc3RhbnRpYXRpb24gZmFpbHVyZS4KICAgICAgKi8KQEAgLTU0MiwxMSArNTkwLDYgQEAKICAgICAgICAgbVdobyA9ICJhbmRyb2lkOmZyYWdtZW50OiIgKyBtSW5kZXg7CiAgICB9CiAgICAgCi0gICAgZmluYWwgdm9pZCBjbGVhckluZGV4KCkgewotICAgICAgICBtSW5kZXggPSAtMTsKLSAgICAgICAgbVdobyA9IG51bGw7Ci0gICAgfQotICAgIAogICAgIGZpbmFsIGJvb2xlYW4gaXNJbkJhY2tTdGFjaygpIHsKICAgICAgICAgcmV0dXJuIG1CYWNrU3RhY2tOZXN0aW5nID4gMDsKICAgICB9CkBAIC02MjQsNiArNjY3LDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBpbml0aWFsIHNhdmVkIHN0YXRlIHRoYXQgdGhpcyBGcmFnbWVudCBzaG91bGQgcmVzdG9yZSBpdHNlbGYKKyAgICAgKiBmcm9tIHdoZW4gZmlyc3QgYmVpbmcgY29uc3RydWN0ZWQsIGFzIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEZyYWdtZW50TWFuYWdlciNzYXZlRnJhZ21lbnRJbnN0YW5jZVN0YXRlKEZyYWdtZW50KQorICAgICAqIEZyYWdtZW50TWFuYWdlci5zYXZlRnJhZ21lbnRJbnN0YW5jZVN0YXRlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgc3RhdGUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSByZXN0b3JlZCBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTYXZlZFN0YXRlKFNhdmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgaWYgKG1JbmRleCA+PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCBhbHJlYWR5IGFjdGl2ZSIpOworICAgICAgICB9CisgICAgICAgIG1TYXZlZEZyYWdtZW50U3RhdGUgPSBzdGF0ZSAhPSBudWxsICYmIHN0YXRlLm1TdGF0ZSAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBzdGF0ZS5tU3RhdGUgOiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIE9wdGlvbmFsIHRhcmdldCBmb3IgdGhpcyBmcmFnbWVudC4gIFRoaXMgbWF5IGJlIHVzZWQsIGZvciBleGFtcGxlLAogICAgICAqIGlmIHRoaXMgZnJhZ21lbnQgaXMgYmVpbmcgc3RhcnRlZCBieSBhbm90aGVyLCBhbmQgd2hlbiBkb25lIHdhbnRzIHRvCiAgICAgICogZ2l2ZSBhIHJlc3VsdCBiYWNrIHRvIHRoZSBmaXJzdC4gIFRoZSB0YXJnZXQgc2V0IGhlcmUgaXMgcmV0YWluZWQKQEAgLTcyMiw2ICs3ODEsMTUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gZXhwbGljaXRseSBkZXRhY2hlZCBmcm9tIHRoZSBVSS4KKyAgICAgKiBUaGF0IGlzLCB7QGxpbmsgRnJhZ21lbnRUcmFuc2FjdGlvbiNkZXRhY2goRnJhZ21lbnQpCisgICAgICogRnJhZ21lbnRUcmFuc2FjdGlvbi5kZXRhY2goRnJhZ21lbnQpfSBoYXMgYmVlbiB1c2VkIG9uIGl0LgorICAgICAqLworICAgIGZpbmFsIHB1YmxpYyBib29sZWFuIGlzRGV0YWNoZWQoKSB7CisgICAgICAgIHJldHVybiBtRGV0YWNoZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBmcmFnbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcmVtb3ZlZCBmcm9tIGl0cwogICAgICAqIGFjdGl2aXR5LiAgVGhpcyBpcyAgPGVtPm5vdDwvZW0+IHdoZXRoZXIgaXRzIGFjdGl2aXR5IGlzIGZpbmlzaGluZywgYnV0CiAgICAgICogcmF0aGVyIHdoZXRoZXIgaXQgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVtb3ZlZCBmcm9tIGl0cyBhY3Rpdml0eS4KQEAgLTExNDIsNiArMTIxMCwzNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENhbGxlZCBieSB0aGUgZnJhZ21lbnQgbWFuYWdlciBvbmNlIHRoaXMgZnJhZ21lbnQgaGFzIGJlZW4gcmVtb3ZlZCwKKyAgICAgKiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYW55IGxlZnQtb3ZlciBzdGF0ZSBpZiB0aGUgYXBwbGljYXRpb24gZGVjaWRlcworICAgICAqIHRvIHJlLXVzZSB0aGUgaW5zdGFuY2UuICBUaGlzIG9ubHkgY2xlYXJzIHN0YXRlIHRoYXQgdGhlIGZyYW1ld29yaworICAgICAqIGludGVybmFsbHkgbWFuYWdlcywgbm90IHRoaW5ncyB0aGUgYXBwbGljYXRpb24gc2V0cy4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRTdGF0ZSgpIHsKKyAgICAgICAgbUluZGV4ID0gLTE7CisgICAgICAgIG1XaG8gPSBudWxsOworICAgICAgICBtQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgbVJlbW92aW5nID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgICAgIG1Gcm9tTGF5b3V0ID0gZmFsc2U7CisgICAgICAgIG1JbkxheW91dCA9IGZhbHNlOworICAgICAgICBtUmVzdG9yZWQgPSBmYWxzZTsKKyAgICAgICAgbUJhY2tTdGFja05lc3RpbmcgPSAwOworICAgICAgICBtRnJhZ21lbnRNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgbUFjdGl2aXR5ID0gbUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKKyAgICAgICAgbUZyYWdtZW50SWQgPSAwOworICAgICAgICBtQ29udGFpbmVySWQgPSAwOworICAgICAgICBtVGFnID0gbnVsbDsKKyAgICAgICAgbUhpZGRlbiA9IGZhbHNlOworICAgICAgICBtRGV0YWNoZWQgPSBmYWxzZTsKKyAgICAgICAgbVJldGFpbmluZyA9IGZhbHNlOworICAgICAgICBtTG9hZGVyTWFuYWdlciA9IG51bGw7CisgICAgICAgIG1Mb2FkZXJzU3RhcnRlZCA9IGZhbHNlOworICAgICAgICBtQ2hlY2tlZEZvckxvYWRlck1hbmFnZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZnJhZ21lbnQgaXMgbm8gbG9uZ2VyIGF0dGFjaGVkIHRvIGl0cyBhY3Rpdml0eS4gIFRoaXMKICAgICAgKiBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNvbkRlc3Ryb3koKX0uCiAgICAgICovCkBAIC0xMzY4LDYgKzE0NjUsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgcGVyZm9ybVN0YXJ0KCkgeworICAgICAgICBvblN0YXJ0KCk7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1JlcG9ydFN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2b2lkIHBlcmZvcm1TdG9wKCkgewogICAgICAgICBvblN0b3AoKTsKICAgICAgICAgCkBAIC0xMzg2LDQgKzE0OTAsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIHZvaWQgcGVyZm9ybURlc3Ryb3lWaWV3KCkgeworICAgICAgICBvbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgIGlmIChtTG9hZGVyTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtTG9hZGVyTWFuYWdlci5kb1JlcG9ydE5leHRTdGFydCgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0ZyYWdtZW50TWFuYWdlci5qYXZhCmluZGV4IDBkYTY1NmYuLjI4NWYxYzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9GcmFnbWVudE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvRnJhZ21lbnRNYW5hZ2VyLmphdmEKQEAgLTI3NCw2ICsyNzQsMzAgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgRnJhZ21lbnQgZ2V0RnJhZ21lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSk7CiAKICAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBjdXJyZW50IGluc3RhbmNlIHN0YXRlIG9mIHRoZSBnaXZlbiBGcmFnbWVudC4gIFRoaXMgY2FuIGJlCisgICAgICogdXNlZCBsYXRlciB3aGVuIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBGcmFnbWVudCBhbmQgYWRkaW5nCisgICAgICogaXQgdG8gdGhlIGZyYWdtZW50IG1hbmFnZXIsIHRvIGhhdmUgaXQgY3JlYXRlIGl0c2VsZiB0byBtYXRjaCB0aGUKKyAgICAgKiBjdXJyZW50IHN0YXRlIHJldHVybmVkIGhlcmUuICBOb3RlIHRoYXQgdGhlcmUgYXJlIGxpbWl0cyBvbiBob3cKKyAgICAgKiB0aGlzIGNhbiBiZSB1c2VkOgorICAgICAqCisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgRnJhZ21lbnQgbXVzdCBjdXJyZW50bHkgYmUgYXR0YWNoZWQgdG8gdGhlIEZyYWdtZW50TWFuYWdlci4KKyAgICAgKiA8bGk+QSBuZXcgRnJhZ21lbnQgY3JlYXRlZCB1c2luZyB0aGlzIHNhdmVkIHN0YXRlIG11c3QgYmUgdGhlIHNhbWUgY2xhc3MKKyAgICAgKiB0eXBlIGFzIHRoZSBGcmFnbWVudCBpdCB3YXMgY3JlYXRlZCBmcm9tLgorICAgICAqIDxsaT5UaGUgc2F2ZWQgc3RhdGUgY2FuIG5vdCBjb250YWluIGRlcGVuZGVuY2llcyBvbiBvdGhlciBmcmFnbWVudHMgLS0KKyAgICAgKiB0aGF0IGlzIGl0IGNhbid0IHVzZSB7QGxpbmsgI3B1dEZyYWdtZW50KEJ1bmRsZSwgU3RyaW5nLCBGcmFnbWVudCl9IHRvCisgICAgICogc3RvcmUgYSBmcmFnbWVudCByZWZlcmVuY2UgYmVjYXVzZSB0aGF0IHJlZmVyZW5jZSBtYXkgbm90IGJlIHZhbGlkIHdoZW4KKyAgICAgKiB0aGlzIHNhdmVkIHN0YXRlIGlzIGxhdGVyIHVzZWQuICBMaWtld2lzZSB0aGUgRnJhZ21lbnQncyB0YXJnZXQgYW5kCisgICAgICogcmVzdWx0IGNvZGUgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGlzIHN0YXRlLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZiBUaGUgRnJhZ21lbnQgd2hvc2Ugc3RhdGUgaXMgdG8gYmUgc2F2ZWQuCisgICAgICogQHJldHVybiBUaGUgZ2VuZXJhdGVkIHN0YXRlLiAgVGhpcyB3aWxsIGJlIG51bGwgaWYgdGhlcmUgd2FzIG5vCisgICAgICogaW50ZXJlc3Rpbmcgc3RhdGUgY3JlYXRlZCBieSB0aGUgZnJhZ21lbnQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEZyYWdtZW50LlNhdmVkU3RhdGUgc2F2ZUZyYWdtZW50SW5zdGFuY2VTdGF0ZShGcmFnbWVudCBmKTsKKworICAgIC8qKgogICAgICAqIFByaW50IHRoZSBGcmFnbWVudE1hbmFnZXIncyBzdGF0ZSBpbnRvIHRoZSBnaXZlbiBzdHJlYW0uCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJlZml4IFRleHQgdG8gcHJpbnQgYXQgdGhlIGZyb250IG9mIGVhY2ggbGluZS4KQEAgLTQ5Miw2ICs1MTYsMTkgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRnJhZ21lbnQuU2F2ZWRTdGF0ZSBzYXZlRnJhZ21lbnRJbnN0YW5jZVN0YXRlKEZyYWdtZW50IGZyYWdtZW50KSB7CisgICAgICAgIGlmIChmcmFnbWVudC5tSW5kZXggPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZnJhZ21lbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBjdXJyZW50bHkgaW4gdGhlIEZyYWdtZW50TWFuYWdlciIpOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFnbWVudC5tU3RhdGUgPiBGcmFnbWVudC5JTklUSUFMSVpJTkcpIHsKKyAgICAgICAgICAgIEJ1bmRsZSByZXN1bHQgPSBzYXZlRnJhZ21lbnRCYXNpY1N0YXRlKGZyYWdtZW50KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IG5ldyBGcmFnbWVudC5TYXZlZFN0YXRlKHJlc3VsdCkgOiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwogICAgICAgICBzYi5hcHBlbmQoIkZyYWdtZW50TWFuYWdlcnsiKTsKQEAgLTY1OCw2ICs2OTUsMTAgQEAKICAgICAgICAgaWYgKCFmLm1BZGRlZCAmJiBuZXdTdGF0ZSA+IEZyYWdtZW50LkNSRUFURUQpIHsKICAgICAgICAgICAgIG5ld1N0YXRlID0gRnJhZ21lbnQuQ1JFQVRFRDsKICAgICAgICAgfQorICAgICAgICBpZiAoZi5tUmVtb3ZpbmcgJiYgbmV3U3RhdGUgPiBmLm1TdGF0ZSkgeworICAgICAgICAgICAgLy8gV2hpbGUgcmVtb3ZpbmcgYSBmcmFnbWVudCwgd2UgY2FuJ3QgY2hhbmdlIGl0IHRvIGEgaGlnaGVyIHN0YXRlLgorICAgICAgICAgICAgbmV3U3RhdGUgPSBmLm1TdGF0ZTsKKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKGYubVN0YXRlIDwgbmV3U3RhdGUpIHsKICAgICAgICAgICAgIC8vIEZvciBmcmFnbWVudHMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIGEgbGF5b3V0LCB3aGVuIHJlc3RvcmluZyBmcm9tCkBAIC03MTUsNyArNzU2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1WaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1WaWV3LnNldFNhdmVGcm9tUGFyZW50RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5vblZpZXdDcmVhdGVkKGYubVZpZXcsIGYubVNhdmVkRnJhZ21lbnRTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc0Nyw3ICs3ODcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoZi5tVmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubUhpZGRlbikgZi5tVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucmVzdG9yZVZpZXdTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm9uVmlld0NyZWF0ZWQoZi5tVmlldywgZi5tU2F2ZWRGcmFnbWVudFN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC03NTksNiArNzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkFjdGl2aXR5Q3JlYXRlZCgpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXN0b3JlVmlld1N0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBmLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC03NjcsNyArODA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXRlID4gRnJhZ21lbnQuU1RPUFBFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZldG8gU1RBUlRFRDogIiArIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgZi5tQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLm9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYucGVyZm9ybVN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubUNhbGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXBlck5vdENhbGxlZEV4Y2VwdGlvbigiRnJhZ21lbnQgIiArIGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vblN0YXJ0KCkiKTsKQEAgLTgyMCw3ICs4NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGYubUNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgZi5vbkRlc3Ryb3lWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLnBlcmZvcm1EZXN0cm95VmlldygpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1DYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3VwZXJOb3RDYWxsZWRFeGNlcHRpb24oIkZyYWdtZW50ICIgKyBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlkIG5vdCBjYWxsIHRocm91Z2ggdG8gc3VwZXIub25EZXN0cm95VmlldygpIik7CkBAIC04NzksNiArOTE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZnJhZ21lbnQgbm93IHNob3VsZCBtb3ZlIHRvIG9uY2UgdGhlIGFuaW1hdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGRvbmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tU3RhdGVBZnRlckFuaW1hdGluZyA9IG5ld1N0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gRnJhZ21lbnQuQ1JFQVRFRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJtb3ZlZnJvbSBDUkVBVEVEOiAiICsgZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLm1SZXRhaW5pbmcpIHsKQEAgLTg5Niw5ICs5MzcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN1cGVyTm90Q2FsbGVkRXhjZXB0aW9uKCJGcmFnbWVudCAiICsgZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaWQgbm90IGNhbGwgdGhyb3VnaCB0byBzdXBlci5vbkRldGFjaCgpIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUltbWVkaWF0ZUFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tRnJhZ21lbnRNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYubVJldGFpbmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlSW5hY3RpdmUoZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5tSW1tZWRpYXRlQWN0aXZpdHkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm1BY3Rpdml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubUZyYWdtZW50TWFuYWdlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05NzAsNyArMTAxNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgbUF2YWlsSW5kaWNlcy5hZGQoZi5tSW5kZXgpOwogICAgICAgICBtQWN0aXZpdHkuaW52YWxpZGF0ZUZyYWdtZW50SW5kZXgoZi5tSW5kZXgpOwotICAgICAgICBmLmNsZWFySW5kZXgoKTsKKyAgICAgICAgZi5pbml0U3RhdGUoKTsKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgYWRkRnJhZ21lbnQoRnJhZ21lbnQgZnJhZ21lbnQsIGJvb2xlYW4gbW92ZVRvU3RhdGVOb3cpIHsKQEAgLTEwMDQsOSArMTA0OSw2IEBACiAgICAgICAgICAgICBmcmFnbWVudC5tUmVtb3ZpbmcgPSB0cnVlOwogICAgICAgICAgICAgbW92ZVRvU3RhdGUoZnJhZ21lbnQsIGluYWN0aXZlID8gRnJhZ21lbnQuSU5JVElBTElaSU5HIDogRnJhZ21lbnQuQ1JFQVRFRCwKICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwgdHJhbnNpdGlvblN0eWxlKTsKLSAgICAgICAgICAgIGlmIChpbmFjdGl2ZSkgewotICAgICAgICAgICAgICAgIG1ha2VJbmFjdGl2ZShmcmFnbWVudCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgCkBAIC0xMDczLDcgKzExMTUsNiBAQAogICAgICAgICAgICAgICAgICAgICBtTmVlZE1lbnVJbnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZnJhZ21lbnQubVJlbW92aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtb3ZlVG9TdGF0ZShmcmFnbWVudCwgRnJhZ21lbnQuQ1JFQVRFRCwgdHJhbnNpdGlvbiwgdHJhbnNpdGlvblN0eWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTA4Niw3ICsxMTI3LDYgQEAKICAgICAgICAgICAgIGlmICghZnJhZ21lbnQubUFkZGVkKSB7CiAgICAgICAgICAgICAgICAgbUFkZGVkLmFkZChmcmFnbWVudCk7CiAgICAgICAgICAgICAgICAgZnJhZ21lbnQubUFkZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmcmFnbWVudC5tUmVtb3ZpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQubUhhc01lbnUpIHsKICAgICAgICAgICAgICAgICAgICAgbU5lZWRNZW51SW52YWxpZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM2Myw2ICsxNDAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMuYWRkKGYpOwogICAgICAgICAgICAgICAgICAgICBmLm1SZXRhaW5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXRJbmRleCA9IGYubVRhcmdldCAhPSBudWxsID8gZi5tVGFyZ2V0Lm1JbmRleCA6IC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTM3NSw2ICsxNDE2LDggQEAKICAgICAgICAgfQogICAgICAgICBpZiAobVN0YXRlQXJyYXkgPT0gbnVsbCkgewogICAgICAgICAgICAgbVN0YXRlQXJyYXkgPSBuZXcgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0ZUFycmF5LmNsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgZi5tVmlldy5zYXZlSGllcmFyY2h5U3RhdGUobVN0YXRlQXJyYXkpOwogICAgICAgICBpZiAobVN0YXRlQXJyYXkuc2l6ZSgpID4gMCkgewpAQCAtMTM4Myw2ICsxNDI2LDMyIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgQnVuZGxlIHNhdmVGcmFnbWVudEJhc2ljU3RhdGUoRnJhZ21lbnQgZikgeworICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbnVsbDsKKworICAgICAgICBpZiAobVN0YXRlQnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TdGF0ZUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICBmLm9uU2F2ZUluc3RhbmNlU3RhdGUobVN0YXRlQnVuZGxlKTsKKyAgICAgICAgaWYgKCFtU3RhdGVCdW5kbGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHQgPSBtU3RhdGVCdW5kbGU7CisgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKGYpOworICAgICAgICB9CisgICAgICAgIGlmIChmLm1TYXZlZFZpZXdTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAorICAgICAgICAgICAgICAgICAgICBGcmFnbWVudE1hbmFnZXJJbXBsLlZJRVdfU1RBVEVfVEFHLCBmLm1TYXZlZFZpZXdTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogICAgIFBhcmNlbGFibGUgc2F2ZUFsbFN0YXRlKCkgewogICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyBoYXZlIG5vdyBiZWVuIGV4ZWN1dGVkIHRvIGdldAogICAgICAgICAvLyBvdXIgc3RhdGUgdXBkYXRlLXRvLWRhdGUuCkBAIC0xNDA3LDI1ICsxNDc2LDcgQEAKICAgICAgICAgICAgICAgICBhY3RpdmVbaV0gPSBmczsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoZi5tU3RhdGUgPiBGcmFnbWVudC5JTklUSUFMSVpJTkcgJiYgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGVCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGYub25TYXZlSW5zdGFuY2VTdGF0ZShtU3RhdGVCdW5kbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdGF0ZUJ1bmRsZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBtU3RhdGVCdW5kbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGVCdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGYubVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZyYWdtZW50Vmlld1N0YXRlKGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVNhdmVkVmlld1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnMubVNhdmVkRnJhZ21lbnRTdGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUucHV0U3BhcnNlUGFyY2VsYWJsZUFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRNYW5hZ2VySW1wbC5WSUVXX1NUQVRFX1RBRywgZi5tU2F2ZWRWaWV3U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZzLm1TYXZlZEZyYWdtZW50U3RhdGUgPSBzYXZlRnJhZ21lbnRCYXNpY1N0YXRlKGYpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYubVRhcmdldC5tSW5kZXggPCAwKSB7CkBAIC0xNTE3LDYgKzE1NjgsNyBAQAogICAgICAgICAgICAgICAgIGYubUJhY2tTdGFja05lc3RpbmcgPSAwOwogICAgICAgICAgICAgICAgIGYubUluTGF5b3V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgZi5tQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBudWxsOwogICAgICAgICAgICAgICAgIGlmIChmcy5tU2F2ZWRGcmFnbWVudFN0YXRlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5zZXRDbGFzc0xvYWRlcihtQWN0aXZpdHkuZ2V0Q2xhc3NMb2FkZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgIGYubVNhdmVkVmlld1N0YXRlID0gZnMubVNhdmVkRnJhZ21lbnRTdGF0ZS5nZXRTcGFyc2VQYXJjZWxhYmxlQXJyYXkoCkBAIC0xNTU2LDEyICsxNjA4LDEyIEBACiAgICAgICAgIGlmIChub25Db25maWcgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5vbkNvbmZpZy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIEZyYWdtZW50IGYgPSBub25Db25maWcuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChmLm1UYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0Lm1JbmRleCA8IG1BY3RpdmUuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLm1UYXJnZXQgPSBtQWN0aXZlLmdldChmLm1UYXJnZXQubUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0SW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5tVGFyZ2V0SW5kZXggPCBtQWN0aXZlLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZi5tVGFyZ2V0ID0gbUFjdGl2ZS5nZXQoZi5tVGFyZ2V0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiUmUtYXR0YWNoaW5nIHJldGFpbmVkIGZyYWdtZW50ICIgKyBmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXJnZXQgbm8gbG9uZ2VyIGV4aXN0czogIiArIGYubVRhcmdldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXJnZXQgbm8gbG9uZ2VyIGV4aXN0czogIiArIGYubVRhcmdldEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGYubVRhcmdldCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCAxZjUzYzBlLi5lMjU4OGNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTM0Nyw2ICszNDcsOSBAQAogICAgIHB1YmxpYyBpbnQgZ2V0UGFja2FnZVNjcmVlbkNvbXBhdE1vZGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwogICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VTY3JlZW5Db21wYXRNb2RlKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IG1vZGUpCiAgICAgICAgICAgICB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyBib29sZWFuIGdldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOworICAgIHB1YmxpYyB2b2lkIHNldFBhY2thZ2VBc2tTY3JlZW5Db21wYXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGFzaykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgCiAgICAgLy8gTXVsdGktdXNlciBBUElzCiAgICAgcHVibGljIGJvb2xlYW4gc3dpdGNoVXNlcihpbnQgdXNlcmlkKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uOwpAQCAtNTc3LDkgKzU4MCwxMSBAQAogICAgIGludCBTRVRfRlJPTlRfQUNUSVZJVFlfU0NSRUVOX0NPTVBBVF9NT0RFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyNDsKICAgICBpbnQgR0VUX1BBQ0tBR0VfU0NSRUVOX0NPTVBBVF9NT0RFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyNTsKICAgICBpbnQgU0VUX1BBQ0tBR0VfU0NSRUVOX0NPTVBBVF9NT0RFX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyNjsKLSAgICBpbnQgU1dJVENIX1VTRVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTI3OwotICAgIGludCBSRU1PVkVfU1VCX1RBU0tfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTI4OwotICAgIGludCBSRU1PVkVfVEFTS19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMjk7Ci0gICAgaW50IFJFR0lTVEVSX1BST0NFU1NfT0JTRVJWRVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTMwOwotICAgIGludCBVTlJFR0lTVEVSX1BST0NFU1NfT0JTRVJWRVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTMxOworICAgIGludCBHRVRfUEFDS0FHRV9BU0tfU0NSRUVOX0NPTVBBVF9UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMjc7CisgICAgaW50IFNFVF9QQUNLQUdFX0FTS19TQ1JFRU5fQ09NUEFUX1RSQU5TQUNUSU9OID0gSUJpbmRlci5GSVJTVF9DQUxMX1RSQU5TQUNUSU9OKzEyODsKKyAgICBpbnQgU1dJVENIX1VTRVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTI5OworICAgIGludCBSRU1PVkVfU1VCX1RBU0tfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTMwOworICAgIGludCBSRU1PVkVfVEFTS19UUkFOU0FDVElPTiA9IElCaW5kZXIuRklSU1RfQ0FMTF9UUkFOU0FDVElPTisxMzE7CisgICAgaW50IFJFR0lTVEVSX1BST0NFU1NfT0JTRVJWRVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTMyOworICAgIGludCBVTlJFR0lTVEVSX1BST0NFU1NfT0JTRVJWRVJfVFJBTlNBQ1RJT04gPSBJQmluZGVyLkZJUlNUX0NBTExfVFJBTlNBQ1RJT04rMTMzOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lBcHBsaWNhdGlvblRocmVhZC5qYXZhCmluZGV4IDhjMzE1NTkuLjA1YTY4YTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQXBwbGljYXRpb25UaHJlYWQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUFwcGxpY2F0aW9uVGhyZWFkLmphdmEKQEAgLTY4LDYgKzY4LDcgQEAKICAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tVUF9NT0RFX0lOQ1JFTUVOVEFMID0gMDsKICAgICBzdGF0aWMgZmluYWwgaW50IEJBQ0tVUF9NT0RFX0ZVTEwgPSAxOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX01PREVfUkVTVE9SRSA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBCQUNLVVBfTU9ERV9SRVNUT1JFX0ZVTEwgPSAzOwogICAgIHZvaWQgc2NoZWR1bGVDcmVhdGVCYWNrdXBBZ2VudChBcHBsaWNhdGlvbkluZm8gYXBwLCBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRJbmZvLAogICAgICAgICAgICAgaW50IGJhY2t1cE1vZGUpIHRocm93cyBSZW1vdGVFeGNlcHRpb247CiAgICAgdm9pZCBzY2hlZHVsZURlc3Ryb3lCYWNrdXBBZ2VudChBcHBsaWNhdGlvbkluZm8gYXBwLCBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRJbmZvKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lCYWNrdXBBZ2VudC5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0lCYWNrdXBBZ2VudC5haWRsCmluZGV4IDUyZmM2MjMuLjhhZjc4ZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9JQmFja3VwQWdlbnQuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvSUJhY2t1cEFnZW50LmFpZGwKQEAgLTc5LDQgKzc5LDIzIEBACiAgICAgICovCiAgICAgdm9pZCBkb1Jlc3RvcmUoaW4gUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwgaW50IGFwcFZlcnNpb25Db2RlLAogICAgICAgICAgICAgaW4gUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUsIGludCB0b2tlbiwgSUJhY2t1cE1hbmFnZXIgY2FsbGJhY2tCaW5kZXIpOworCisgICAgLyoqCisgICAgICogUmVzdG9yZSBhIHNpbmdsZSAiZmlsZSIgdG8gdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGZpbGUgd2FzIHR5cGljYWxseSBvYnRhaW5lZCBmcm9tCisgICAgICogYSBmdWxsLWJhY2t1cCBkYXRhc2V0LiAgVGhlIGFnZW50IHJlYWRzICdzaXplJyBieXRlcyBvZiBmaWxlIGNvbnRlbnQKKyAgICAgKiBmcm9tIHRoZSBwcm92aWRlZCBmaWxlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBSZWFkLW9ubHkgcGlwZSBkZWxpdmVyaW5nIHRoZSBmaWxlIGNvbnRlbnQgaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgU2l6ZSBvZiB0aGUgZmlsZSBiZWluZyByZXN0b3JlZC4KKyAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIG9mIGZpbGUgc3lzdGVtIGVudGl0eSwgZS5nLiBGdWxsQmFja3VwLlRZUEVfRElSRUNUT1JZLgorICAgICAqIEBwYXJhbSBkb21haW4gTmFtZSBvZiB0aGUgZmlsZSdzIHNlbWFudGljIGRvbWFpbiB0byB3aGljaCB0aGUgJ3BhdGgnIGFyZ3VtZW50IGlzIGEKKyAgICAgKiAgICAgICAgcmVsYXRpdmUgcGF0aC4gIGUuZy4gRnVsbEJhY2t1cC5EQVRBQkFTRV9UUkVFX1RPS0VOLgorICAgICAqIEBwYXJhbSBwYXRoIFJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgd2l0aGluIGl0cyBzZW1hbnRpYyBkb21haW4uCisgICAgICogQHBhcmFtIG1vZGUgQWNjZXNzIG1vZGUgb2YgdGhlIGZpbGUgc3lzdGVtIGVudGl0eSwgZS5nLiAwNjYwLgorICAgICAqIEBwYXJhbSBtdGltZSBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlIHN5c3RlbSBlbnRpdHkuCisgICAgICovCisgICAgdm9pZCBkb1Jlc3RvcmVGaWxlKGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgIGludCB0eXBlLCBTdHJpbmcgZG9tYWluLCBTdHJpbmcgcGF0aCwgbG9uZyBtb2RlLCBsb25nIG10aW1lLAorICAgICAgICAgICAgaW50IHRva2VuLCBJQmFja3VwTWFuYWdlciBjYWxsYmFja0JpbmRlcik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTGlzdEZyYWdtZW50LmphdmEKaW5kZXggYTVlZTI2Yy4uZGM4NDIwZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xpc3RGcmFnbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9MaXN0RnJhZ21lbnQuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgVGV4dFZpZXcgbVN0YW5kYXJkRW1wdHlWaWV3OwogICAgIFZpZXcgbVByb2dyZXNzQ29udGFpbmVyOwogICAgIFZpZXcgbUxpc3RDb250YWluZXI7Ci0gICAgYm9vbGVhbiBtU2V0RW1wdHlUZXh0OworICAgIENoYXJTZXF1ZW5jZSBtRW1wdHlUZXh0OwogICAgIGJvb2xlYW4gbUxpc3RTaG93bjsKIAogICAgIHB1YmxpYyBMaXN0RnJhZ21lbnQoKSB7CkBAIC0yMTAsNiArMjEwLDkgQEAKICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3lWaWV3KCkgewogICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3MobVJlcXVlc3RGb2N1cyk7CiAgICAgICAgIG1MaXN0ID0gbnVsbDsKKyAgICAgICAgbUxpc3RTaG93biA9IGZhbHNlOworICAgICAgICBtRW1wdHlWaWV3ID0gbVByb2dyZXNzQ29udGFpbmVyID0gbUxpc3RDb250YWluZXIgPSBudWxsOworICAgICAgICBtU3RhbmRhcmRFbXB0eVZpZXcgPSBudWxsOwogICAgICAgICBzdXBlci5vbkRlc3Ryb3lWaWV3KCk7CiAgICAgfQogCkBAIC0yODksMTAgKzI5MiwxMCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2FuJ3QgYmUgdXNlZCB3aXRoIGEgY3VzdG9tIGNvbnRlbnQgdmlldyIpOwogICAgICAgICB9CiAgICAgICAgIG1TdGFuZGFyZEVtcHR5Vmlldy5zZXRUZXh0KHRleHQpOwotICAgICAgICBpZiAoIW1TZXRFbXB0eVRleHQpIHsKKyAgICAgICAgaWYgKG1FbXB0eVRleHQgPT0gbnVsbCkgewogICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1TdGFuZGFyZEVtcHR5Vmlldyk7Ci0gICAgICAgICAgICBtU2V0RW1wdHlUZXh0ID0gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBtRW1wdHlUZXh0ID0gdGV4dDsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC0zNDYsNiArMzQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfb3V0KSk7CiAgICAgICAgICAgICAgICAgbUxpc3RDb250YWluZXIuc3RhcnRBbmltYXRpb24oQW5pbWF0aW9uVXRpbHMubG9hZEFuaW1hdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgbUxpc3RDb250YWluZXIuY2xlYXJBbmltYXRpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CiAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CkBAIC0zNTUsNiArMzYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5KCksIGFuZHJvaWQuUi5hbmltLmZhZGVfaW4pKTsKICAgICAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zdGFydEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKSwgYW5kcm9pZC5SLmFuaW0uZmFkZV9vdXQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyLmNsZWFyQW5pbWF0aW9uKCk7CisgICAgICAgICAgICAgICAgbUxpc3RDb250YWluZXIuY2xlYXJBbmltYXRpb24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Qcm9ncmVzc0NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgICAgICAgICBtTGlzdENvbnRhaW5lci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CkBAIC0zODMsNiArMzkyLDggQEAKICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbnRlcm5hbEVtcHR5KTsKICAgICAgICAgICAgIGlmIChtU3RhbmRhcmRFbXB0eVZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1FbXB0eVZpZXcgPSByb290LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhbmRhcmRFbXB0eVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVByb2dyZXNzQ29udGFpbmVyID0gcm9vdC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5wcm9ncmVzc0NvbnRhaW5lcik7CiAgICAgICAgICAgICBtTGlzdENvbnRhaW5lciA9IHJvb3QuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQubGlzdENvbnRhaW5lcik7CkBAIC00MDAsMTIgKzQxMSwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1FbXB0eVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1MaXN0LnNldEVtcHR5VmlldyhtRW1wdHlWaWV3KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUVtcHR5VGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVN0YW5kYXJkRW1wdHlWaWV3LnNldFRleHQobUVtcHR5VGV4dCk7CisgICAgICAgICAgICAgICAgbUxpc3Quc2V0RW1wdHlWaWV3KG1TdGFuZGFyZEVtcHR5Vmlldyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbUxpc3RTaG93biA9IHRydWU7CiAgICAgICAgIG1MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CiAgICAgICAgIGlmIChtQWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihtQWRhcHRlcik7CisgICAgICAgICAgICBMaXN0QWRhcHRlciBhZGFwdGVyID0gbUFkYXB0ZXI7CisgICAgICAgICAgICBtQWRhcHRlciA9IG51bGw7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihhZGFwdGVyKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIGFyZSBzdGFydGluZyB3aXRob3V0IGFuIGFkYXB0ZXIsIHNvIGFzc3VtZSB3ZSB3b24ndAogICAgICAgICAgICAgLy8gaGF2ZSBvdXIgZGF0YSByaWdodCBhd2F5IGFuZCBzdGFydCB3aXRoIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVkQXBrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVkQXBrLmphdmEKaW5kZXggNTMwNzY5Ni4uMjU0OWM4NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlZEFway5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZWRBcGsuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuU3RyaWN0TW9kZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbXBhdGliaWxpdHlJbmZvSG9sZGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC02NCw3ICs2NSw3IEBACiAgKiBMb2NhbCBzdGF0ZSBtYWludGFpbmVkIGFib3V0IGEgY3VycmVudGx5IGxvYWRlZCAuYXBrLgogICogQGhpZGUKICAqLwotZmluYWwgY2xhc3MgTG9hZGVkQXBrIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2FkZWRBcGsgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBBY3Rpdml0eVRocmVhZCBtQWN0aXZpdHlUaHJlYWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBBcHBsaWNhdGlvbkluZm8gbUFwcGxpY2F0aW9uSW5mbzsKQEAgLTc4LDEwICs3OSwxMCBAQAogICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgbUJhc2VDbGFzc0xvYWRlcjsKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbVNlY3VyaXR5VmlvbGF0aW9uOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSW5jbHVkZUNvZGU7CisgICAgcHVibGljIGZpbmFsIENvbXBhdGliaWxpdHlJbmZvSG9sZGVyIG1Db21wYXRpYmlsaXR5SW5mbyA9IG5ldyBDb21wYXRpYmlsaXR5SW5mb0hvbGRlcigpOwogICAgIFJlc291cmNlcyBtUmVzb3VyY2VzOwogICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgbUNsYXNzTG9hZGVyOwogICAgIHByaXZhdGUgQXBwbGljYXRpb24gbUFwcGxpY2F0aW9uOwotICAgIENvbXBhdGliaWxpdHlJbmZvIG1Db21wYXRpYmlsaXR5SW5mbzsKIAogICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxDb250ZXh0LCBIYXNoTWFwPEJyb2FkY2FzdFJlY2VpdmVyLCBMb2FkZWRBcGsuUmVjZWl2ZXJEaXNwYXRjaGVyPj4gbVJlY2VpdmVycwogICAgICAgICA9IG5ldyBIYXNoTWFwPENvbnRleHQsIEhhc2hNYXA8QnJvYWRjYXN0UmVjZWl2ZXIsIExvYWRlZEFway5SZWNlaXZlckRpc3BhdGNoZXI+PigpOwpAQCAtOTgsNiArOTksMTIgQEAKICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgaW5mb3JtYXRpb24gYWJvdXQgYSBuZXcgLmFwaworICAgICAqCisgICAgICogTk9URTogVGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgd2l0aCBBY3Rpdml0eVRocmVhZCdzIGxvY2sgaGVsZCwKKyAgICAgKiBzbyBNVVNUIE5PVCBjYWxsIGJhY2sgb3V0IHRvIHRoZSBhY3Rpdml0eSBtYW5hZ2VyLgorICAgICAqLwogICAgIHB1YmxpYyBMb2FkZWRBcGsoQWN0aXZpdHlUaHJlYWQgYWN0aXZpdHlUaHJlYWQsIEFwcGxpY2F0aW9uSW5mbyBhSW5mbywKICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNvbXBhdEluZm8sCiAgICAgICAgICAgICBBY3Rpdml0eVRocmVhZCBtYWluVGhyZWFkLCBDbGFzc0xvYWRlciBiYXNlTG9hZGVyLApAQCAtMTE1LDcgKzEyMiw3IEBACiAgICAgICAgIG1CYXNlQ2xhc3NMb2FkZXIgPSBiYXNlTG9hZGVyOwogICAgICAgICBtU2VjdXJpdHlWaW9sYXRpb24gPSBzZWN1cml0eVZpb2xhdGlvbjsKICAgICAgICAgbUluY2x1ZGVDb2RlID0gaW5jbHVkZUNvZGU7Ci0gICAgICAgIG1Db21wYXRpYmlsaXR5SW5mbyA9IGNvbXBhdEluZm87CisgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mby5zZXQoY29tcGF0SW5mbyk7CiAKICAgICAgICAgaWYgKG1BcHBEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKEFjdGl2aXR5VGhyZWFkLm1TeXN0ZW1Db250ZXh0ID09IG51bGwpIHsKQEAgLTEyMyw3ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICBDb250ZXh0SW1wbC5jcmVhdGVTeXN0ZW1Db250ZXh0KG1haW5UaHJlYWQpOwogICAgICAgICAgICAgICAgIEFjdGl2aXR5VGhyZWFkLm1TeXN0ZW1Db250ZXh0LmdldFJlc291cmNlcygpLnVwZGF0ZUNvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpblRocmVhZC5nZXRDb25maWd1cmF0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWFpblRocmVhZC5nZXREaXNwbGF5TWV0cmljc0xvY2tlZChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFpblRocmVhZC5nZXREaXNwbGF5TWV0cmljc0xvY2tlZChjb21wYXRJbmZvLCBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0SW5mbyk7CiAgICAgICAgICAgICAgICAgLy9TbG9nLmkoVEFHLCAiQ3JlYXRlZCBzeXN0ZW0gcmVzb3VyY2VzICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKyBtU3lzdGVtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSArICI6ICIKQEAgLTE1MSw3ICsxNTgsNyBAQAogICAgICAgICBtSW5jbHVkZUNvZGUgPSB0cnVlOwogICAgICAgICBtQ2xhc3NMb2FkZXIgPSBzeXN0ZW1Db250ZXh0LmdldENsYXNzTG9hZGVyKCk7CiAgICAgICAgIG1SZXNvdXJjZXMgPSBzeXN0ZW1Db250ZXh0LmdldFJlc291cmNlcygpOwotICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8gPSBjb21wYXRJbmZvOworICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8uc2V0KGNvbXBhdEluZm8pOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvYWRlck1hbmFnZXIuamF2YQppbmRleCAxNjQxNDFjLi40NmEwMDhkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTG9hZGVyTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2FkZXJNYW5hZ2VyLmphdmEKQEAgLTIyMyw2ICsyMjMsNyBAQAogICAgICAgICBib29sZWFuIG1TdGFydGVkOwogICAgICAgICBib29sZWFuIG1SZXRhaW5pbmc7CiAgICAgICAgIGJvb2xlYW4gbVJldGFpbmluZ1N0YXJ0ZWQ7CisgICAgICAgIGJvb2xlYW4gbVJlcG9ydE5leHRTdGFydDsKICAgICAgICAgYm9vbGVhbiBtRGVzdHJveWVkOwogICAgICAgICBib29sZWFuIG1MaXN0ZW5lclJlZ2lzdGVyZWQ7CiAKQEAgLTI5MSw3ICsyOTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1IYXZlRGF0YSkgeworICAgICAgICAgICAgaWYgKG1TdGFydGVkICYmIG1IYXZlRGF0YSAmJiAhbVJlcG9ydE5leHRTdGFydCkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9hZGVyIGhhcyByZXRhaW5lZCBpdHMgZGF0YSwgZWl0aGVyIGNvbXBsZXRlbHkgYWNyb3NzCiAgICAgICAgICAgICAgICAgLy8gYSBjb25maWd1cmF0aW9uIGNoYW5nZSBvciBqdXN0IHdoYXRldmVyIHRoZSBsYXN0IGRhdGEgc2V0CiAgICAgICAgICAgICAgICAgLy8gd2FzIGFmdGVyIGJlaW5nIHJlc3RhcnRlZCBmcm9tIGEgc3RvcCwgYW5kIG5vdyBhdCB0aGUgcG9pbnQgb2YKQEAgLTMwMiw2ICszMDMsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKKyAgICAgICAgdm9pZCByZXBvcnRTdGFydCgpIHsKKyAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIGlmIChtUmVwb3J0TmV4dFN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXBvcnROZXh0U3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXZlRGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbE9uTG9hZEZpbmlzaGVkKG1Mb2FkZXIsIG1EYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHZvaWQgc3RvcCgpIHsKICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiICBTdG9wcGluZzogIiArIHRoaXMpOwogICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTQ0OSwxMCArNDYxLDExIEBACiAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KHByZWZpeCk7IHdyaXRlci5wcmludCgibURhdGE9Iik7IHdyaXRlci5wcmludGxuKG1EYXRhKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1TdGFydGVkPSIpOyB3cml0ZXIucHJpbnQobVN0YXJ0ZWQpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQoIiBtUmV0YWluaW5nPSIpOyB3cml0ZXIucHJpbnQobVJldGFpbmluZyk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1SZXBvcnROZXh0U3RhcnQ9Iik7IHdyaXRlci5wcmludChtUmVwb3J0TmV4dFN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbURlc3Ryb3llZD0iKTsgd3JpdGVyLnByaW50bG4obURlc3Ryb3llZCk7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50KCJtTGlzdGVuZXJSZWdpc3RlcmVkPSIpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihtTGlzdGVuZXJSZWdpc3RlcmVkKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludChwcmVmaXgpOyB3cml0ZXIucHJpbnQoIm1SZXRhaW5pbmc9Iik7IHdyaXRlci5wcmludChtUmV0YWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgbVJldGFpbmluZ1N0YXJ0ZWQ9Iik7IHdyaXRlci5wcmludChtUmV0YWluaW5nU3RhcnRlZCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCgiIG1MaXN0ZW5lclJlZ2lzdGVyZWQ9Iik7IHdyaXRlci5wcmludGxuKG1MaXN0ZW5lclJlZ2lzdGVyZWQpOwogICAgICAgICAgICAgaWYgKG1QZW5kaW5nTG9hZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnQocHJlZml4KTsgd3JpdGVyLnByaW50bG4oIlBlbmRpbmcgTG9hZGVyICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KG1QZW5kaW5nTG9hZGVyKTsgd3JpdGVyLnByaW50bG4oIjoiKTsKQEAgLTc0MCw2ICs3NTMsMTggQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICB2b2lkIGRvUmVwb3J0TmV4dFN0YXJ0KCkgeworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLm1SZXBvcnROZXh0U3RhcnQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBkb1JlcG9ydFN0YXJ0KCkgeworICAgICAgICBmb3IgKGludCBpID0gbUxvYWRlcnMuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICBtTG9hZGVycy52YWx1ZUF0KGkpLnJlcG9ydFN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICB2b2lkIGRvRGVzdHJveSgpIHsKICAgICAgICAgaWYgKCFtUmV0YWluaW5nKSB7CiAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkRlc3Ryb3lpbmcgQWN0aXZlIGluICIgKyB0aGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Mb2NhbEFjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKaW5kZXggYzk1OGUxYi4uMGE2YjgwNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0xvY2FsQWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTI4LDEyICsyOCwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyBtdWx0aXBsZSBydW5uaW5nIGVtYmVkZGVkIGFjdGl2aXRpZXMgaW4gdGhlIHNhbWUKKyAqIEBkZXByZWNhdGVkIFVzZSB0aGUgbmV3IHtAbGluayBGcmFnbWVudH0gYW5kIHtAbGluayBGcmFnbWVudE1hbmFnZXJ9IEFQSXMKKyAqIGluc3RlYWQ7IHRoZXNlIGFyZSBhbHNvCisgKiBhdmFpbGFibGUgb24gb2xkZXIgcGxhdGZvcm1zIHRocm91Z2ggdGhlIEFuZHJvaWQgY29tcGF0aWJpbGl0eSBwYWNrYWdlLgorICoKKyAqIDxwPkhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgbXVsdGlwbGUgcnVubmluZyBlbWJlZGRlZCBhY3Rpdml0aWVzIGluIHRoZSBzYW1lCiAgKiBwcm9jZXNzLiBUaGlzIGNsYXNzIGlzIG5vdCBub3JtYWxseSB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIGNyZWF0ZWQgZm9yCiAgKiB5b3UgYXMgcGFydCBvZiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5R3JvdXB9IGltcGxlbWVudGF0aW9uLgogICoKICAqIEBzZWUgQWN0aXZpdHlHcm91cAogICovCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIExvY2FsQWN0aXZpdHlNYW5hZ2VyIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkxvY2FsQWN0aXZpdHlNYW5hZ2VyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGxvY2FsTE9HViA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5qYXZhCmluZGV4IGM5MzUxYWYuLjE3MGQyYjUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Ob3RpZmljYXRpb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTm90aWZpY2F0aW9uLmphdmEKQEAgLTkyOSwxNSArOTI5LDE1IEBACiAgICAgICAgICAgICBpZiAobUNvbnRlbnRJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5zZXRUZXh0Vmlld1RleHQoUi5pZC5pbmZvLCBtQ29udGVudEluZm8pOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtTnVtYmVyID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChtTnVtYmVyID4gOTk5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnNldFRleHRWaWV3VGV4dChSLmlkLmluZm8sICI5OTkrIik7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHRvb0JpZyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25faW5mb19tYXhudW0pOworICAgICAgICAgICAgICAgIGlmIChtTnVtYmVyID4gdG9vQmlnKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnNldFRleHRWaWV3VGV4dChSLmlkLmluZm8sIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25faW5mb19vdmVyZmxvdykpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdCBmID0gTnVtYmVyRm9ybWF0LmdldEludGVnZXJJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5zZXRUZXh0Vmlld1RleHQoUi5pZC5pbmZvLCBmLmZvcm1hdChtTnVtYmVyKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LnNldEZsb2F0KFIuaWQuaW5mbywgInNldFRleHRTaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmRpbWVuLnN0YXR1c19iYXJfY29udGVudF9udW1iZXJfc2l6ZSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb250ZW50Vmlldy5zZXRWaWV3VmlzaWJpbGl0eShSLmlkLmluZm8sIFZpZXcuR09ORSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvVGFiQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UYWJBY3Rpdml0eS5qYXZhCmluZGV4IDAzM2ZhMGMuLjBmZDBjMmMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UYWJBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9UYWJBY3Rpdml0eS5qYXZhCkBAIC0yMyw4ICsyMywzNCBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwogCiAvKioKLSAqIEFuIGFjdGl2aXR5IHRoYXQgY29udGFpbnMgYW5kIHJ1bnMgbXVsdGlwbGUgZW1iZWRkZWQgYWN0aXZpdGllcyBvciB2aWV3cy4KKyAqIEBkZXByZWNhdGVkIE5ldyBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSBGcmFnbWVudHMgaW5zdGVhZCBvZiB0aGlzIGNsYXNzOworICogdG8gY29udGludWUgdG8gcnVuIG9uIG9sZGVyIGRldmljZXMsIHlvdSBjYW4gdXNlIHRoZSB2NCBzdXBwb3J0IGxpYnJhcnkKKyAqIHdoaWNoIHByb3ZpZGVzIGEgdmVyc2lvbiBvZiB0aGUgRnJhZ21lbnQgQVBJIHRoYXQgaXMgY29tcGF0aWJsZSBkb3duIHRvCisgKiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0RPTlVUfS4KKyAqCisgKiA8cD5Gb3IgYXBwcyBkZXZlbG9waW5nIGFnYWluc3Qge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CisgKiBvciBsYXRlciwgdGFicyBhcmUgdHlwaWNhbGx5IHByZXNlbnRlZCBpbiB0aGUgVUkgdXNpbmcgdGhlIG5ldworICoge0BsaW5rIEFjdGlvbkJhciNuZXdUYWIoKSBBY3Rpb25CYXIubmV3VGFiKCl9IGFuZAorICogcmVsYXRlZCBBUElzIGZvciBwbGFjaW5nIHRhYnMgd2l0aGluIHRoZWlyIGFjdGlvbiBiYXIgYXJlYS48L3A+CisgKgorICogPHA+QSByZXBsYWNlbWVudCBmb3IgVGFiQWN0aXZpdHkgY2FuIGFsc28gYmUgaW1wbGVtZW50ZWQgYnkgZGlyZWN0bHkgdXNpbmcKKyAqIFRhYkhvc3QuICBZb3Ugd2lsbCBuZWVkIHRvIGRlZmluZSBhIGxheW91dCB0aGF0IGNvcnJlY3RseSB1c2VzIGEgVGFiSG9zdAorICogd2l0aCBhIFRhYldpZGdldCBhcyB3ZWxsIGFzIGFuIGFyZWEgaW4gd2hpY2ggdG8gZGlzcGxheSB5b3VyIHRhYiBjb250ZW50LgorICogQSB0eXBpY2FsIGV4YW1wbGUgd291bGQgYmU6PC9wPgorICoKKyAqIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvU3VwcG9ydDREZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X3RhYnMueG1sIGNvbXBsZXRlfQorICoKKyAqIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byB0YWtlIG92ZXIgcmVzcG9uc2liaWxpdHkgZm9yIHN3aXRjaGluZworICogdGhlIHNob3duIGNvbnRlbnQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHRhYnMuCisgKgorICoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy9TdXBwb3J0NERlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3N1cHBvcnR2NC9hcHAvRnJhZ21lbnRUYWJzLmphdmEKKyAqICAgICAgY29tcGxldGV9CisgKgorICogPHA+QWxzbyBzZWUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9TdXBwb3J0NERlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3N1cHBvcnR2NC9hcHAvRnJhZ21lbnRUYWJzUGFnZXIuaHRtbCI+CisgKiBGcmFnbWVudCBUYWJzIFBhZ2VyPC9hPiBzYW1wbGUgZm9yIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIHN1cHBvcnQgbGlicmFyeSdzIFZpZXdQYWdlciB0bworICogYWxsb3cgdGhlIHVzZXIgdG8gc3dpcGUgdGhlIGNvbnRlbnQgdG8gc3dpdGNoIGJldHdlZW4gdGFicy48L3A+CiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgVGFiQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eUdyb3VwIHsKICAgICBwcml2YXRlIFRhYkhvc3QgbVRhYkhvc3Q7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbURlZmF1bHRUYWIgPSBudWxsOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dhbGxwYXBlck1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9XYWxscGFwZXJNYW5hZ2VyLmphdmEKaW5kZXggMTEzYzYxMC4uN2ZkNWE3ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1dhbGxwYXBlck1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvV2FsbHBhcGVyTWFuYWdlci5qYXZhCkBAIC0yNSw2ICsyNSw4IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvckZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CkBAIC0xMTUsNyArMTE3LDkgQEAKIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChtQml0bWFwLCBtRHJhd0xlZnQsIG1EcmF3VG9wLCBudWxsKTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBwYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkMpKTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1CaXRtYXAsIG1EcmF3TGVmdCwgbURyYXdUb3AsIHBhaW50KTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMjQ1LDQwICsyNDksMjAgQEAKICAgICAgICAgICAgICAgICBpZiAoZmQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBwYXJhbXMuZ2V0SW50KCJ3aWR0aCIsIDApOwogICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gcGFyYW1zLmdldEludCgiaGVpZ2h0IiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVnZW5lcmF0ZSBjYXNlOiBubyBzaXplIHJlcXVlc3RlZCwganVzdCBsb2FkCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXRtYXAgYXMtaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlRmlsZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZGVjb2RlIGZpbGUiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBCaXRtYXBGYWN0b3J5LmRlY29kZUZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBudWxsLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUJpdG1hcChjb250ZXh0LCBibSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZGVjb2RlIGZpbGUiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm0uc2V0RGVuc2l0eShEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vIExvYWQgdGhlIGJpdG1hcCB3aXRoIGZ1bGwgY29sb3IgZGVwdGgsIHRvIHByZXNlcnZlCi0gICAgICAgICAgICAgICAgICAgIC8vIHF1YWxpdHkgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCi0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluRGl0aGVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5QcmVmZXJyZWRDb25maWcgPSBCaXRtYXAuQ29uZmlnLkFSR0JfODg4ODsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVGaWxlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC5nZXRGaWxlRGVzY3JpcHRvcigpLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZkLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQml0bWFwKGNvbnRleHQsIGJtLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgfQpAQCAtMjkyLDQyICsyNzYsMTggQEAKICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBtU2VydmljZS5nZXRXaWR0aEhpbnQoKTsKICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IG1TZXJ2aWNlLmdldEhlaWdodEhpbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWdlbmVyYXRlIGNhc2U6IG5vIHNpemUgcmVxdWVzdGVkLCBqdXN0IGxvYWQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdG1hcCBhcy1pcy4KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtID0gQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oaXMsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZGVjb2RlIHN0cmVhbSIsIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMgb3B0aW9ucyA9IG5ldyBCaXRtYXBGYWN0b3J5Lk9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdG1hcCBibSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGlzLCBudWxsLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUJpdG1hcChjb250ZXh0LCBibSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZGVjb2RlIHN0cmVhbSIsIGUpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibS5zZXREZW5zaXR5KERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgYml0bWFwIHdpdGggZnVsbCBjb2xvciBkZXB0aCwgdG8gcHJlc2VydmUKLSAgICAgICAgICAgICAgICAgICAgLy8gcXVhbGl0eSBmb3IgbGF0ZXIgcHJvY2Vzc2luZy4KLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5EaXRoZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblByZWZlcnJlZENvbmZpZyA9IEJpdG1hcC5Db25maWcuQVJHQl84ODg4OwotICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm0gPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpcywgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVCaXRtYXAoY29udGV4dCwgYm0sIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGdlbmVyYXRlIGRlZmF1bHQgYml0bWFwIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm07CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtNzExLDQ4ICs2NzEsNTUgQEAKICAgICAKICAgICBzdGF0aWMgQml0bWFwIGdlbmVyYXRlQml0bWFwKENvbnRleHQgY29udGV4dCwgQml0bWFwIGJtLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgICAgICAgaWYgKGJtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgYm0uc2V0RGVuc2l0eShEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSk7CisKKyAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAKKyAgICAgICAgICAgICAgICB8fCAoYm0uZ2V0V2lkdGgoKSA9PSB3aWR0aCAmJiBibS5nZXRIZWlnaHQoKSA9PSBoZWlnaHQpKSB7CiAgICAgICAgICAgICByZXR1cm4gYm07CiAgICAgICAgIH0KLSAgICAgICAgYm0uc2V0RGVuc2l0eShEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpbmFsIGJpdG1hcCB3ZSB3YW50IHRvIHJldHVybi4KLSAgICAgICAgLy8gWFhYIFdlIHNob3VsZCBnZXQgdGhlIHBpeGVsIGRlcHRoIGZyb20gdGhlIHN5c3RlbSAodG8gbWF0Y2ggdGhlCi0gICAgICAgIC8vIHBoeXNpY2FsIGRpc3BsYXkgZGVwdGgpLCB3aGVuIHRoZXJlIGlzIGEgd2F5LgotICAgICAgICBCaXRtYXAgbmV3Ym0gPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5SR0JfNTY1KTsKLSAgICAgICAgbmV3Ym0uc2V0RGVuc2l0eShEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSk7Ci0gICAgICAgIENhbnZhcyBjID0gbmV3IENhbnZhcyhuZXdibSk7Ci0gICAgICAgIGMuc2V0RGVuc2l0eShEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRSk7Ci0gICAgICAgIFJlY3QgdGFyZ2V0UmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIHRhcmdldFJlY3QubGVmdCA9IHRhcmdldFJlY3QudG9wID0gMDsKLSAgICAgICAgdGFyZ2V0UmVjdC5yaWdodCA9IGJtLmdldFdpZHRoKCk7Ci0gICAgICAgIHRhcmdldFJlY3QuYm90dG9tID0gYm0uZ2V0SGVpZ2h0KCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgZGVsdGF3ID0gd2lkdGggLSB0YXJnZXRSZWN0LnJpZ2h0OwotICAgICAgICBpbnQgZGVsdGFoID0gaGVpZ2h0IC0gdGFyZ2V0UmVjdC5ib3R0b207Ci0gICAgICAgIAotICAgICAgICBpZiAoZGVsdGF3ID4gMCB8fCBkZWx0YWggPiAwKSB7Ci0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNjYWxlIHVwIHNvIGl0IGNvdmVycyB0aGUgZW50aXJlCi0gICAgICAgICAgICAvLyBhcmVhLgotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAxLjBmOwotICAgICAgICAgICAgaWYgKGRlbHRhdyA+IGRlbHRhaCkgewotICAgICAgICAgICAgICAgIHNjYWxlID0gd2lkdGggLyAoZmxvYXQpdGFyZ2V0UmVjdC5yaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2NhbGUgPSBoZWlnaHQgLyAoZmxvYXQpdGFyZ2V0UmVjdC5ib3R0b207CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCaXRtYXAgbmV3Ym0gPSBCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKKyAgICAgICAgICAgIG5ld2JtLnNldERlbnNpdHkoRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0UpOworCisgICAgICAgICAgICBDYW52YXMgYyA9IG5ldyBDYW52YXMobmV3Ym0pOworICAgICAgICAgICAgUmVjdCB0YXJnZXRSZWN0ID0gbmV3IFJlY3QoKTsKKyAgICAgICAgICAgIHRhcmdldFJlY3QucmlnaHQgPSBibS5nZXRXaWR0aCgpOworICAgICAgICAgICAgdGFyZ2V0UmVjdC5ib3R0b20gPSBibS5nZXRIZWlnaHQoKTsKKworICAgICAgICAgICAgaW50IGRlbHRhdyA9IHdpZHRoIC0gdGFyZ2V0UmVjdC5yaWdodDsKKyAgICAgICAgICAgIGludCBkZWx0YWggPSBoZWlnaHQgLSB0YXJnZXRSZWN0LmJvdHRvbTsKKworICAgICAgICAgICAgaWYgKGRlbHRhdyA+IDAgfHwgZGVsdGFoID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2NhbGUgdXAgc28gaXQgY292ZXJzIHRoZSBlbnRpcmUgYXJlYS4KKyAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IDEuMGY7CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhdyA+IGRlbHRhaCkgeworICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHdpZHRoIC8gKGZsb2F0KXRhcmdldFJlY3QucmlnaHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBoZWlnaHQgLyAoZmxvYXQpdGFyZ2V0UmVjdC5ib3R0b207CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRhcmdldFJlY3QucmlnaHQgPSAoaW50KSh0YXJnZXRSZWN0LnJpZ2h0KnNjYWxlKTsKKyAgICAgICAgICAgICAgICB0YXJnZXRSZWN0LmJvdHRvbSA9IChpbnQpKHRhcmdldFJlY3QuYm90dG9tKnNjYWxlKTsKKyAgICAgICAgICAgICAgICBkZWx0YXcgPSB3aWR0aCAtIHRhcmdldFJlY3QucmlnaHQ7CisgICAgICAgICAgICAgICAgZGVsdGFoID0gaGVpZ2h0IC0gdGFyZ2V0UmVjdC5ib3R0b207CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJnZXRSZWN0LnJpZ2h0ID0gKGludCkodGFyZ2V0UmVjdC5yaWdodCpzY2FsZSk7Ci0gICAgICAgICAgICB0YXJnZXRSZWN0LmJvdHRvbSA9IChpbnQpKHRhcmdldFJlY3QuYm90dG9tKnNjYWxlKTsKLSAgICAgICAgICAgIGRlbHRhdyA9IHdpZHRoIC0gdGFyZ2V0UmVjdC5yaWdodDsKLSAgICAgICAgICAgIGRlbHRhaCA9IGhlaWdodCAtIHRhcmdldFJlY3QuYm90dG9tOworCisgICAgICAgICAgICB0YXJnZXRSZWN0Lm9mZnNldChkZWx0YXcvMiwgZGVsdGFoLzIpOworCisgICAgICAgICAgICBQYWludCBwYWludCA9IG5ldyBQYWludCgpOworICAgICAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKHRydWUpOworICAgICAgICAgICAgcGFpbnQuc2V0WGZlcm1vZGUobmV3IFBvcnRlckR1ZmZYZmVybW9kZShQb3J0ZXJEdWZmLk1vZGUuU1JDKSk7CisgICAgICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIHRhcmdldFJlY3QsIHBhaW50KTsKKworICAgICAgICAgICAgYm0ucmVjeWNsZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ld2JtOworICAgICAgICB9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGdlbmVyYXRlIGRlZmF1bHQgYml0bWFwIiwgZSk7CisgICAgICAgICAgICByZXR1cm4gYm07CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRhcmdldFJlY3Qub2Zmc2V0KGRlbHRhdy8yLCBkZWx0YWgvMik7Ci0gICAgICAgIFBhaW50IHBhaW50ID0gbmV3IFBhaW50KCk7Ci0gICAgICAgIHBhaW50LnNldEZpbHRlckJpdG1hcCh0cnVlKTsKLSAgICAgICAgcGFpbnQuc2V0RGl0aGVyKHRydWUpOwotICAgICAgICBjLmRyYXdCaXRtYXAoYm0sIG51bGwsIHRhcmdldFJlY3QsIHBhaW50KTsKLSAgICAgICAgCi0gICAgICAgIGJtLnJlY3ljbGUoKTsKLSAgICAgICAgcmV0dXJuIG5ld2JtOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VBZG1pbkluZm8uamF2YQppbmRleCAxYzdlYjk4Li4xYzM3NDE0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlQWRtaW5JbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZUFkbWluSW5mby5qYXZhCkBAIC0xMzAsNiArMTMwLDE0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNFU19FTkNSWVBURURfU1RPUkFHRSA9IDc7CiAKKyAgICAvKioKKyAgICAgKiBBIHR5cGUgb2YgcG9saWN5IHRoYXQgdGhpcyBkZXZpY2UgYWRtaW4gY2FuIHVzZTogZGlzYWJsZXMgdXNlIG9mIGFsbCBkZXZpY2UgY2FtZXJhcy4KKyAgICAgKgorICAgICAqIDxwPlRvIGNvbnRyb2wgdGhpcyBwb2xpY3ksIHRoZSBkZXZpY2UgYWRtaW4gbXVzdCBoYXZlIGEgImRpc2FibGUtY2FtZXJhIgorICAgICAqIHRhZyBpbiB0aGUgInVzZXMtcG9saWNpZXMiIHNlY3Rpb24gb2YgaXRzIG1ldGEtZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VTX1BPTElDWV9ESVNBQkxFX0NBTUVSQSA9IDg7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvbGljeUluZm8gewogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkZW50OwpAQCAtMTc0LDYgKzE4Miw5IEBACiAgICAgICAgIHNQb2xpY2llc0Rpc3BsYXlPcmRlci5hZGQobmV3IFBvbGljeUluZm8oVVNFU19FTkNSWVBURURfU1RPUkFHRSwgImVuY3J5cHRlZC1zdG9yYWdlIiwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfZW5jcnlwdGVkU3RvcmFnZSwKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX2VuY3J5cHRlZFN0b3JhZ2UpKTsKKyAgICAgICAgc1BvbGljaWVzRGlzcGxheU9yZGVyLmFkZChuZXcgUG9saWN5SW5mbyhVU0VTX1BPTElDWV9ESVNBQkxFX0NBTUVSQSwgImRpc2FibGUtY2FtZXJhIiwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lsYWJfZGlzYWJsZUNhbWVyYSwKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5wb2xpY3lkZXNjX2Rpc2FibGVDYW1lcmEpKTsKIAogICAgICAgICBmb3IgKGludCBpPTA7IGk8c1BvbGljaWVzRGlzcGxheU9yZGVyLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBQb2xpY3lJbmZvIHBpID0gc1BvbGljaWVzRGlzcGxheU9yZGVyLmdldChpKTsKQEAgLTM2NSw3ICszNzYsOCBAQAogICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfTElNSVRfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfUE9MSUNZX1dBVENIX0xPR0lOfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1JFU0VUX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX1BPTElDWV9GT1JDRV9MT0NLfSwKICAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX1dJUEVfREFUQX0sCi0gICAgICoge0BsaW5rICNVU0VTX1BPTElDWV9FWFBJUkVfUEFTU1dPUkR9LCB7QGxpbmsgI1VTRVNfRU5DUllQVEVEX1NUT1JBR0V9LgorICAgICAqIHtAbGluayAjVVNFU19QT0xJQ1lfRVhQSVJFX1BBU1NXT1JEfSwge0BsaW5rICNVU0VTX0VOQ1JZUFRFRF9TVE9SQUdFfSwKKyAgICAgKiB7QGxpbmsgI1VTRVNfUE9MSUNZX0RJU0FCTEVfQ0FNRVJBfS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiB1c2VzUG9saWN5KGludCBwb2xpY3lJZGVudCkgewogICAgICAgICByZXR1cm4gKG1Vc2VzUG9saWNpZXMgJiAoMTw8cG9saWN5SWRlbnQpKSAhPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9EZXZpY2VQb2xpY3lNYW5hZ2VyLmphdmEKaW5kZXggZWZlMjYzMy4uNDE0N2IwZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0RldmljZVBvbGljeU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYWRtaW4vRGV2aWNlUG9saWN5TWFuYWdlci5qYXZhCkBAIC0xMjI4LDYgKzEyMjgsNDUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgYW4gYXBwbGljYXRpb24gdGhhdCBpcyBhZG1pbmlzdGVyaW5nIHRoZSBkZXZpY2UgdG8gZGlzYWJsZSBhbGwgY2FtZXJhcworICAgICAqIG9uIHRoZSBkZXZpY2UuICBBZnRlciBzZXR0aW5nIHRoaXMsIG5vIGFwcGxpY2F0aW9ucyB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIGFueSBjYW1lcmFzCisgICAgICogb24gdGhlIGRldmljZS4KKyAgICAgKgorICAgICAqIDxwPlRoZSBjYWxsaW5nIGRldmljZSBhZG1pbiBtdXN0IGhhdmUgcmVxdWVzdGVkCisgICAgICoge0BsaW5rIERldmljZUFkbWluSW5mbyNVU0VTX1BPTElDWV9ESVNBQkxFX0NBTUVSQX0gdG8gYmUgYWJsZSB0byBjYWxsCisgICAgICogdGhpcyBtZXRob2Q7IGlmIGl0IGhhcyBub3QsIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGFkbWluIFdoaWNoIHtAbGluayBEZXZpY2VBZG1pblJlY2VpdmVyfSB0aGlzIHJlcXVlc3QgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgICAqIEBwYXJhbSBkaXNhYmxlZCBXaGV0aGVyIG9yIG5vdCB0aGUgY2FtZXJhIHNob3VsZCBiZSBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYW1lcmFEaXNhYmxlZChDb21wb25lbnROYW1lIGFkbWluLCBib29sZWFuIGRpc2FibGVkKSB7CisgICAgICAgIGlmIChtU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnNldENhbWVyYURpc2FibGVkKGFkbWluLCBkaXNhYmxlZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0YWxraW5nIHdpdGggZGV2aWNlIHBvbGljeSBzZXJ2aWNlIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGRldmljZSdzIGNhbWVyYXMgaGF2ZSBiZWVuIGRpc2FibGVkIGVpdGhlciBieSB0aGUgY3VycmVudAorICAgICAqIGFkbWluLCBpZiBzcGVjaWZpZWQsIG9yIGFsbCBhZG1pbnMuCisgICAgICogQHBhcmFtIGFkbWluIFRoZSBuYW1lIG9mIHRoZSBhZG1pbiBjb21wb25lbnQgdG8gY2hlY2ssIG9yIG51bGwgdG8gY2hlY2sgaWYgYW55IGFkbWlucworICAgICAqIGhhdmUgZGlzYWJsZWQgdGhlIGNhbWVyYQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENhbWVyYURpc2FibGVkKENvbXBvbmVudE5hbWUgYWRtaW4pIHsKKyAgICAgICAgaWYgKG1TZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldENhbWVyYURpc2FibGVkKGFkbWluKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRhbGtpbmcgd2l0aCBkZXZpY2UgcG9saWN5IHNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVBZG1pbihDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyLCBib29sZWFuIHJlZnJlc2hpbmcpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9hZG1pbi9JRGV2aWNlUG9saWN5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwKaW5kZXggZThjYWNhMS4uOTQxOWE2MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2FkbWluL0lEZXZpY2VQb2xpY3lNYW5hZ2VyLmFpZGwKQEAgLTc5LDYgKzc5LDkgQEAKICAgICBib29sZWFuIGdldFN0b3JhZ2VFbmNyeXB0aW9uKGluIENvbXBvbmVudE5hbWUgd2hvKTsKICAgICBpbnQgZ2V0U3RvcmFnZUVuY3J5cHRpb25TdGF0dXMoKTsKIAorICAgIHZvaWQgc2V0Q2FtZXJhRGlzYWJsZWQoaW4gQ29tcG9uZW50TmFtZSB3aG8sIGJvb2xlYW4gZGlzYWJsZWQpOworICAgIGJvb2xlYW4gZ2V0Q2FtZXJhRGlzYWJsZWQoaW4gQ29tcG9uZW50TmFtZSB3aG8pOworCiAgICAgdm9pZCBzZXRBY3RpdmVBZG1pbihpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyLCBib29sZWFuIHJlZnJlc2hpbmcpOwogICAgIGJvb2xlYW4gaXNBZG1pbkFjdGl2ZShpbiBDb21wb25lbnROYW1lIHBvbGljeVJlY2VpdmVyKTsKICAgICBMaXN0PENvbXBvbmVudE5hbWU+IGdldEFjdGl2ZUFkbWlucygpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9CYWNrdXBBZ2VudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9CYWNrdXBBZ2VudC5qYXZhCmluZGV4IGRjNjBlMjQuLjYzZjMyNTggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvQmFja3VwQWdlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0JhY2t1cEFnZW50LmphdmEKQEAgLTE3OSwxMCArMTc5LDE4IEBACiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUZpbGUoUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwgbG9uZyBzaXplLAorICAgICAgICAgICAgaW50IHR5cGUsIFN0cmluZyBkb21haW4sIFN0cmluZyBwYXRoLCBsb25nIG1vZGUsIGxvbmcgbXRpbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBlbXB0eSBzdHViIGltcGxlbWVudGF0aW9uCisgICAgfQorCisgICAgLyoqCiAgICAgICogUGFja2FnZS1wcml2YXRlLCB1c2VkIG9ubHkgZm9yIGRpc3BhdGNoaW5nIGFuIGV4dHJhIHN0ZXAgZHVyaW5nIGZ1bGwgYmFja3VwCiAgICAgICovCiAgICAgdm9pZCBvblNhdmVBcGsoQmFja3VwRGF0YU91dHB1dCBkYXRhKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiLS0tIGJhc2Ugb25TYXZlQXBrKCkgLS0tIik7CiAgICAgfQogCiAgICAgLy8gLS0tLS0gQ29yZSBpbXBsZW1lbnRhdGlvbiAtLS0tLQpAQCAtMjAzLDYgKzIxMSw3IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBCYWNrdXBTZXJ2aWNlQmluZGVyIGV4dGVuZHMgSUJhY2t1cEFnZW50LlN0dWIgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJhY2t1cFNlcnZpY2VCaW5kZXIiOwogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBkb0JhY2t1cChQYXJjZWxGaWxlRGVzY3JpcHRvciBvbGRTdGF0ZSwKICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLAogICAgICAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5ld1N0YXRlLApAQCAtMjM2LDYgKzI0NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZG9SZXN0b3JlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGRhdGEsIGludCBhcHBWZXJzaW9uQ29kZSwKICAgICAgICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBuZXdTdGF0ZSwKICAgICAgICAgICAgICAgICBpbnQgdG9rZW4sIElCYWNrdXBNYW5hZ2VyIGNhbGxiYWNrQmluZGVyKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKQEAgLTI2MSw1ICsyNzEsMjQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZG9SZXN0b3JlRmlsZShQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLCBsb25nIHNpemUsCisgICAgICAgICAgICAgICAgaW50IHR5cGUsIFN0cmluZyBkb21haW4sIFN0cmluZyBwYXRoLCBsb25nIG1vZGUsIGxvbmcgbXRpbWUsCisgICAgICAgICAgICAgICAgaW50IHRva2VuLCBJQmFja3VwTWFuYWdlciBjYWxsYmFja0JpbmRlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJhY2t1cEFnZW50LnRoaXMub25SZXN0b3JlRmlsZShkYXRhLCBzaXplLCB0eXBlLCBkb21haW4sIHBhdGgsIG1vZGUsIG10aW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrQmluZGVyLm9wQ29tcGxldGUodG9rZW4pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlJ2xsIHRpbWUgb3V0IGFueXdheSwgc28gd2UncmUgc2FmZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvRnVsbEJhY2t1cC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwLmphdmEKaW5kZXggOTg1MDU2Ni4uM2I3MGUxOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwLmphdmEKQEAgLTE2LDYgKzE2LDE3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hcHAuYmFja3VwOwogCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgbGliY29yZS5pby5FcnJub0V4Y2VwdGlvbjsKK2ltcG9ydCBsaWJjb3JlLmlvLkxpYmNvcmU7CisKIC8qKgogICogR2xvYmFsIGNvbnN0YW50IGRlZmluaXRpb25zIGV0IGNldGVyYSByZWxhdGVkIHRvIHRoZSBmdWxsLWJhY2t1cC10by1mZAogICogYmluYXJ5IGZvcm1hdC4KQEAgLTIzLDE4ICszNCw5NiBAQAogICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIEZ1bGxCYWNrdXAgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQS19UUkVFX1RPS0VOID0gImEiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9CQl9UUkVFX1RPS0VOID0gIm9iYiI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUk9PVF9UUkVFX1RPS0VOID0gInIiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERBVEFfVFJFRV9UT0tFTiA9ICJmIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEQVRBQkFTRV9UUkVFX1RPS0VOID0gImRiIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTSEFSRURQUkVGU19UUkVFX1RPS0VOID0gInNwIjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDQUNIRV9UUkVFX1RPS0VOID0gImMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZ1bGxCYWNrdXAiOwogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRlVMTF9CQUNLVVBfSU5URU5UX0FDVElPTiA9ICJmdWxsYmFjayI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRlVMTF9SRVNUT1JFX0lOVEVOVF9BQ1RJT04gPSAiZnVsbHJlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTkZfVE9LRU5fSU5URU5UX0VYVFJBID0gImNvbmZ0b2tlbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBLX1RSRUVfVE9LRU4gPSAiYSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JCX1RSRUVfVE9LRU4gPSAib2JiIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1RSRUVfVE9LRU4gPSAiciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UUkVFX1RPS0VOID0gImYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFX1RSRUVfVE9LRU4gPSAiZGIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRFBSRUZTX1RSRUVfVE9LRU4gPSAic3AiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RSRUVfVE9LRU4gPSAiYyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX1NUT1JBR0VfVE9LRU4gPSAic2hhcmVkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUFNfUFJFRklYID0gImFwcHMvIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfUFJFRklYID0gU0hBUkVEX1NUT1JBR0VfVE9LRU4gKyAiLyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX0JBQ0tVUF9JTlRFTlRfQUNUSU9OID0gImZ1bGxiYWNrIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMX1JFU1RPUkVfSU5URU5UX0FDVElPTiA9ICJmdWxscmVzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORl9UT0tFTl9JTlRFTlRfRVhUUkEgPSAiY29uZnRva2VuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRU9GID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZJTEUgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRElSRUNUT1JZID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NZTUxJTksgPSAzOwogCiAgICAgc3RhdGljIHB1YmxpYyBuYXRpdmUgaW50IGJhY2t1cFRvVGFyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGRvbWFpbiwKICAgICAgICAgICAgIFN0cmluZyBsaW5rZG9tYWluLCBTdHJpbmcgcm9vdHBhdGgsIFN0cmluZyBwYXRoLCBCYWNrdXBEYXRhT3V0cHV0IG91dHB1dCk7CisKKyAgICBzdGF0aWMgcHVibGljIHZvaWQgcmVzdG9yZVRvRmlsZShQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLAorICAgICAgICAgICAgbG9uZyBzaXplLCBpbnQgdHlwZSwgbG9uZyBtb2RlLCBsb25nIG10aW1lLCBGaWxlIG91dEZpbGUsCisgICAgICAgICAgICBib29sZWFuIGRvQ2htb2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0eXBlID09IEZ1bGxCYWNrdXAuVFlQRV9ESVJFQ1RPUlkpIHsKKyAgICAgICAgICAgIC8vIENhbm9uaWNhbGx5IGEgZGlyZWN0b3J5IGhhcyBubyBhc3NvY2lhdGVkIGNvbnRlbnQsIHNvIHdlIGRvbid0IG5lZWQgdG8gcmVhZAorICAgICAgICAgICAgLy8gYW55dGhpbmcgZnJvbSB0aGUgcGlwZSBpbiB0aGlzIGNhc2UuICBKdXN0IGNyZWF0ZSB0aGUgZGlyZWN0b3J5IGhlcmUgYW5kCisgICAgICAgICAgICAvLyBkcm9wIGRvd24gdG8gdGhlIGZpbmFsIG1ldGFkYXRhIGFkanVzdG1lbnQuCisgICAgICAgICAgICBpZiAob3V0RmlsZSAhPSBudWxsKSBvdXRGaWxlLm1rZGlycygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworCisgICAgICAgICAgICAvLyBQdWxsIHRoZSBkYXRhIGZyb20gdGhlIHBpcGUsIGNvcHlpbmcgaXQgdG8gdGhlIG91dHB1dCBmaWxlLCB1bnRpbCB3ZSdyZSBkb25lCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBvdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHByYWN0aWNlIHRoaXMgd2lsbCBvbmx5IGJlIGZvciB0aGUgZGVmYXVsdCBzZW1hbnRpYyBkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB1c2luZyB0aGUgZGVmYXVsdCBtb2RlIGZvciB0aG9zZSBpcyBhcHByb3ByaWF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgdGhlIGVkZ2UgY2FzZSBvZiBhcHBzIHRoYXQgaGF2ZSBhZGp1c3RlZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHBlcm1pc3Npb25zIG9uIHRoZXNlIGNvcmUgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIGNyZWF0ZS9vcGVuIGZpbGUgIiArIG91dEZpbGUuZ2V0UGF0aCgpLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzMyICogMTAyNF07CisgICAgICAgICAgICBmaW5hbCBsb25nIG9yaWdTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZGF0YS5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIGludCB0b1JlYWQgPSAoc2l6ZSA+IGJ1ZmZlci5sZW5ndGgpID8gYnVmZmVyLmxlbmd0aCA6IChpbnQpc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQgZ290ID0gaW4ucmVhZChidWZmZXIsIDAsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgaWYgKGdvdCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkluY29tcGxldGUgcmVhZDogZXhwZWN0ZWQgIiArIHNpemUgKyAiIGJ1dCBnb3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG9yaWdTaXplIC0gc2l6ZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBnb3QpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9ibGVtIHdyaXRpbmcgdG8gdGhlIGZpbGUuICBRdWl0IGNvcHlpbmcgZGF0YSBhbmQgZGVsZXRlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmlsZSwgYnV0IG9mIGNvdXJzZSBrZWVwIGNvbnN1bWluZyB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5hYmxlIHRvIHdyaXRlIHRvIGZpbGUgIiArIG91dEZpbGUuZ2V0UGF0aCgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBnb3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIG91dC5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHR3aWRkbGUgdGhlIHN0YXRlIHRvIG1hdGNoIHRoZSBiYWNrdXAsIGFzc3VtaW5nIGFsbCB3ZW50IHdlbGwKKyAgICAgICAgaWYgKGRvQ2htb2QgJiYgb3V0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExpYmNvcmUub3MuY2htb2Qob3V0RmlsZS5nZXRQYXRoKCksIChpbnQpbW9kZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFcnJub0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5yZXRocm93QXNJT0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0RmlsZS5zZXRMYXN0TW9kaWZpZWQobXRpbWUpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwQWdlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvRnVsbEJhY2t1cEFnZW50LmphdmEKaW5kZXggZjBhMWYyYS4uZGYxYzM2MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9GdWxsQmFja3VwQWdlbnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0Z1bGxCYWNrdXBBZ2VudC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgbGliY29yZS5pby5TdHJ1Y3RTdGF0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiAKQEAgLTUzLDggKzU0LDEyIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbUNhY2hlRGlyOwogICAgIHByaXZhdGUgU3RyaW5nIG1MaWJEaXI7CiAKKyAgICBwcml2YXRlIEZpbGUgTlVMTF9GSUxFOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgICAgIE5VTExfRklMRSA9IG5ldyBGaWxlKCIvZGV2L251bGwiKTsKKwogICAgICAgICBtUG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8gPSBtUG0uZ2V0QXBwbGljYXRpb25JbmZvKGdldFBhY2thZ2VOYW1lKCksIDApOwpAQCAtNzcsOSArODIsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQmFja3VwKFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9sZFN0YXRlLCBCYWNrdXBEYXRhT3V0cHV0IGRhdGEsCi0gICAgICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBuZXdTdGF0ZSkgeworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIEZpbHRlcnMsIHRoZSBzY2FuIHF1ZXVlLCBhbmQgdGhlIHNldCBvZiByZXN1bHRpbmcgZW50aXRpZXMKICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGZpbHRlclNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKIAogICAgICAgICAvLyBPa2F5LCBzdGFydCB3aXRoIHRoZSBhcHAncyByb290IHRyZWUsIGJ1dCBleGNsdWRlIGFsbCBvZiB0aGUgY2Fub25pY2FsIHN1YmRpcnMKICAgICAgICAgaWYgKG1MaWJEaXIgIT0gbnVsbCkgewpAQCAtODksMjUgKzk1LDI4IEBACiAgICAgICAgIGZpbHRlclNldC5hZGQobURhdGFiYXNlRGlyKTsKICAgICAgICAgZmlsdGVyU2V0LmFkZChtU2hhcmVkUHJlZnNEaXIpOwogICAgICAgICBmaWx0ZXJTZXQuYWRkKG1GaWxlc0Rpcik7Ci0gICAgICAgIHByb2Nlc3NUcmVlKEZ1bGxCYWNrdXAuUk9PVF9UUkVFX1RPS0VOLCBtTWFpbkRpciwgZmlsdGVyU2V0LCBkYXRhKTsKKyAgICAgICAgcHJvY2Vzc1RyZWUocGFja2FnZU5hbWUsIEZ1bGxCYWNrdXAuUk9PVF9UUkVFX1RPS0VOLCBtTWFpbkRpciwgZmlsdGVyU2V0LCBkYXRhKTsKIAogICAgICAgICAvLyBOb3cgZG8gdGhlIHNhbWUgZm9yIHRoZSBmaWxlcyBkaXIsIGRiIGRpciwgYW5kIHNoYXJlZCBwcmVmcyBkaXIKICAgICAgICAgZmlsdGVyU2V0LmFkZChtTWFpbkRpcik7CiAgICAgICAgIGZpbHRlclNldC5yZW1vdmUobUZpbGVzRGlyKTsKLSAgICAgICAgcHJvY2Vzc1RyZWUoRnVsbEJhY2t1cC5EQVRBX1RSRUVfVE9LRU4sIG1GaWxlc0RpciwgZmlsdGVyU2V0LCBkYXRhKTsKKyAgICAgICAgcHJvY2Vzc1RyZWUocGFja2FnZU5hbWUsIEZ1bGxCYWNrdXAuREFUQV9UUkVFX1RPS0VOLCBtRmlsZXNEaXIsIGZpbHRlclNldCwgZGF0YSk7CiAKICAgICAgICAgZmlsdGVyU2V0LmFkZChtRmlsZXNEaXIpOwogICAgICAgICBmaWx0ZXJTZXQucmVtb3ZlKG1EYXRhYmFzZURpcik7Ci0gICAgICAgIHByb2Nlc3NUcmVlKEZ1bGxCYWNrdXAuREFUQUJBU0VfVFJFRV9UT0tFTiwgbURhdGFiYXNlRGlyLCBmaWx0ZXJTZXQsIGRhdGEpOworICAgICAgICBwcm9jZXNzVHJlZShwYWNrYWdlTmFtZSwgRnVsbEJhY2t1cC5EQVRBQkFTRV9UUkVFX1RPS0VOLCBtRGF0YWJhc2VEaXIsIGZpbHRlclNldCwgZGF0YSk7CiAKICAgICAgICAgZmlsdGVyU2V0LmFkZChtRGF0YWJhc2VEaXIpOwogICAgICAgICBmaWx0ZXJTZXQucmVtb3ZlKG1TaGFyZWRQcmVmc0Rpcik7Ci0gICAgICAgIHByb2Nlc3NUcmVlKEZ1bGxCYWNrdXAuU0hBUkVEUFJFRlNfVFJFRV9UT0tFTiwgbVNoYXJlZFByZWZzRGlyLCBmaWx0ZXJTZXQsIGRhdGEpOworICAgICAgICBwcm9jZXNzVHJlZShwYWNrYWdlTmFtZSwgRnVsbEJhY2t1cC5TSEFSRURQUkVGU19UUkVFX1RPS0VOLCBtU2hhcmVkUHJlZnNEaXIsIGZpbHRlclNldCwgZGF0YSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUcmVlKFN0cmluZyBkb21haW4sIFN0cmluZyByb290UGF0aCwKKyAgICAvLyBTY2FuIHRoZSBkaXIgdHJlZSAoaWYgaXQgYWN0dWFsbHkgZXhpc3RzKSBhbmQgcHJvY2VzcyBlYWNoIGVudHJ5IHdlIGZpbmQuICBJZiB0aGUKKyAgICAvLyAnZXhjbHVkZXMnIHBhcmFtZXRlciBpcyBub24tbnVsbCwgaXQgaXMgY29uc3VsdGVkIGVhY2ggdGltZSBhIG5ldyBmaWxlIHN5c3RlbSBlbnRpdHkKKyAgICAvLyBpcyB2aXNpdGVkIHRvIHNlZSB3aGV0aGVyIHRoYXQgZW50aXR5IChhbmQgaXRzIHN1YnRyZWUsIGlmIGFwcHJvcHJpYXRlKSBzaG91bGQgYmUKKyAgICAvLyBvbWl0dGVkIGZyb20gdGhlIGJhY2t1cCBwcm9jZXNzLgorICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NUcmVlKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGRvbWFpbiwgU3RyaW5nIHJvb3RQYXRoLAogICAgICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGV4Y2x1ZGVzLCBCYWNrdXBEYXRhT3V0cHV0IGRhdGEpIHsKLSAgICAgICAgLy8gU2NhbiB0aGUgZGlyIHRyZWUgKGlmIGl0IGFjdHVhbGx5IGV4aXN0cykgYW5kIHByb2Nlc3MgZWFjaCBlbnRyeSB3ZSBmaW5kCiAgICAgICAgIEZpbGUgcm9vdEZpbGUgPSBuZXcgRmlsZShyb290UGF0aCk7CiAgICAgICAgIGlmIChyb290RmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgTGlua2VkTGlzdDxGaWxlPiBzY2FuUXVldWUgPSBuZXcgTGlua2VkTGlzdDxGaWxlPigpOwpAQCAtMTE4LDcgKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKIAogICAgICAgICAgICAgICAgIC8vIHBydW5lIHRoaXMgc3VidHJlZT8KLSAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZXMuY29udGFpbnMoZmlsZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwgJiYgZXhjbHVkZXMuY29udGFpbnMoZmlsZVBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMTQyLDcgKzE1MSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gRmluYWxseSwgYmFjayB0aGlzIGZpbGUgdXAgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKGdldFBhY2thZ2VOYW1lKCksIGRvbWFpbiwgbnVsbCwgcm9vdFBhdGgsIGZpbGVQYXRoLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKHBhY2thZ2VOYW1lLCBkb21haW4sIG51bGwsIHJvb3RQYXRoLCBmaWxlUGF0aCwgZGF0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzcsNyArMTg2LDQwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEdW1teSAtLSBXZSdyZSBuZXZlciB1c2VkIGZvciByZXN0b3JlIG9mIGFuIGluY3JlbWVudGFsIGRhdGFzZXQKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmUoQmFja3VwRGF0YUlucHV0IGRhdGEsIGludCBhcHBWZXJzaW9uQ29kZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUpIHsKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmUoQmFja3VwRGF0YUlucHV0IGRhdGEsIGludCBhcHBWZXJzaW9uQ29kZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RvcmUgdGhlIGRlc2NyaWJlZCBmaWxlIGZyb20gdGhlIGdpdmVuIHBpcGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN0b3JlRmlsZShQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLCBsb25nIHNpemUsCisgICAgICAgICAgICBpbnQgdHlwZSwgU3RyaW5nIGRvbWFpbiwgU3RyaW5nIHJlbHBhdGgsIGxvbmcgbW9kZSwgbG9uZyBtdGltZSkgCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYmFzZVBhdGggPSBudWxsOworICAgICAgICBGaWxlIG91dEZpbGUgPSBudWxsOworCisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25SZXN0b3JlRmlsZSgpIHNpemU9IiArIHNpemUgKyAiIHR5cGU9IiArIHR5cGUKKyAgICAgICAgICAgICAgICArICIgZG9tYWluPSIgKyBkb21haW4gKyAiIHJlbHBhdGg9IiArIHJlbHBhdGggKyAiIG1vZGU9IiArIG1vZGUKKyAgICAgICAgICAgICAgICArICIgbXRpbWU9IiArIG10aW1lKTsKKworICAgICAgICAvLyBQYXJzZSBvdXQgdGhlIHNlbWFudGljIGRvbWFpbnMgaW50byB0aGUgY29ycmVjdCBwaHlzaWNhbCBsb2NhdGlvbgorICAgICAgICBpZiAoZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkRBVEFfVFJFRV9UT0tFTikpIGJhc2VQYXRoID0gbUZpbGVzRGlyOworICAgICAgICBlbHNlIGlmIChkb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuREFUQUJBU0VfVFJFRV9UT0tFTikpIGJhc2VQYXRoID0gbURhdGFiYXNlRGlyOworICAgICAgICBlbHNlIGlmIChkb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuUk9PVF9UUkVFX1RPS0VOKSkgYmFzZVBhdGggPSBtTWFpbkRpcjsKKyAgICAgICAgZWxzZSBpZiAoZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLlNIQVJFRFBSRUZTX1RSRUVfVE9LRU4pKSBiYXNlUGF0aCA9IG1TaGFyZWRQcmVmc0RpcjsKKworICAgICAgICAvLyBOb3QgYSBzdXBwb3J0ZWQgb3V0cHV0IGxvY2F0aW9uPyAgV2UgbmVlZCB0byBjb25zdW1lIHRoZSBkYXRhCisgICAgICAgIC8vIGFueXdheSwgc28gc2VuZCBpdCB0byAvZGV2L251bGwKKyAgICAgICAgb3V0RmlsZSA9IChiYXNlUGF0aCAhPSBudWxsKSA/IG5ldyBGaWxlKGJhc2VQYXRoLCByZWxwYXRoKSA6IG51bGw7CisgICAgICAgIGlmIChERUJVRykgTG9nLmkoVEFHLCAiWyIgKyBkb21haW4gKyAiIDogIiArIHJlbHBhdGggKyAiXSBtYXBwZWQgdG8gIiArIG91dEZpbGUuZ2V0UGF0aCgpKTsKKworICAgICAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBmaWd1cmVkIG91dCB3aGVyZSB0aGUgZGF0YSBnb2VzLCBzZW5kIGl0IG9uIGl0cyB3YXkKKyAgICAgICAgRnVsbEJhY2t1cC5yZXN0b3JlVG9GaWxlKGRhdGEsIHNpemUsIHR5cGUsIG1vZGUsIG10aW1lLCBvdXRGaWxlLCB0cnVlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0lCYWNrdXBNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvYmFja3VwL0lCYWNrdXBNYW5hZ2VyLmFpZGwKaW5kZXggOTRlMzFhOC4uYmFjODc0ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL2JhY2t1cC9JQmFja3VwTWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9iYWNrdXAvSUJhY2t1cE1hbmFnZXIuYWlkbApAQCAtMTQ3LDYgKzE0NywxNCBAQAogICAgICAgICAgICAgYm9vbGVhbiBhbGxBcHBzLCBpbiBTdHJpbmdbXSBwYWNrYWdlTmFtZXMpOwogCiAgICAgLyoqCisgICAgICogUmVzdG9yZSBkZXZpY2UgY29udGVudCBmcm9tIHRoZSBkYXRhIHN0cmVhbSBwYXNzZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gc29ja2V0LiAgVGhlCisgICAgICogZGF0YSBzdHJlYW0gbXVzdCBiZSBpbiB0aGUgZm9ybWF0IGVtaXR0ZWQgYnkgZnVsbEJhY2t1cCgpLgorICAgICAqCisgICAgICogPHA+Q2FsbGVycyBtdXN0IGhvbGQgdGhlIGFuZHJvaWQucGVybWlzc2lvbi5CQUNLVVAgcGVybWlzc2lvbiB0byB1c2UgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgdm9pZCBmdWxsUmVzdG9yZShpbiBQYXJjZWxGaWxlRGVzY3JpcHRvciBmZCk7CisKKyAgICAvKioKICAgICAgKiBDb25maXJtIHRoYXQgdGhlIHJlcXVlc3RlZCBmdWxsIGJhY2t1cC9yZXN0b3JlIG9wZXJhdGlvbiBjYW4gcHJvY2VlZC4gIFRoZSBzeXN0ZW0gd2lsbAogICAgICAqIG5vdCBhY3R1YWxseSBwZXJmb3JtIHRoZSBvcGVyYXRpb24gZGVzY3JpYmVkIHRvIGZ1bGxCYWNrdXAoKSAvIGZ1bGxSZXN0b3JlKCkgdW5sZXNzIHRoZQogICAgICAqIFVJIGNhbGxzIGJhY2sgaW50byB0aGUgQmFja3VwIE1hbmFnZXIgdG8gY29uZmlybSwgcGFzc2luZyB0aGUgY29ycmVjdCB0b2tlbi4gIEF0CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEEyZHAuamF2YQppbmRleCA5MjQ2YTEwLi42MWQzNzA3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQTJkcC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBMmRwLmphdmEKQEAgLTEzMCw3ICsxMzAsMjUgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogSW5pdGlhdGUgY29ubmVjdGlvbiB0byBhIHByb2ZpbGUgb2YgdGhlIHJlbW90ZSBibHVldG9vdGggZGV2aWNlLgorICAgICAqCisgICAgICogPHA+IEN1cnJlbnRseSwgdGhlIHN5c3RlbSBzdXBwb3J0cyBvbmx5IDEgY29ubmVjdGlvbiB0byB0aGUKKyAgICAgKiBBMkRQIHByb2ZpbGUuIFRoZSBBUEkgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3QgY29ubmVjdGVkCisgICAgICogZGV2aWNlcyBiZWZvcmUgY29ubmVjdGluZy4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIEFQSSByZXR1cm5zIGZhbHNlIGluIHNjZW5hcmlvcyBsaWtlIHRoZSBwcm9maWxlIG9uIHRoZQorICAgICAqIGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBCbHVldG9vdGggaXMgbm90IHR1cm5lZCBvbi4KKyAgICAgKiBXaGVuIHRoaXMgQVBJIHJldHVybnMgdHJ1ZSwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CisgICAgICogY29ubmVjdGlvbiBzdGF0ZSBpbnRlbnQgZm9yIHRoZSBwcm9maWxlIHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aAorICAgICAqIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewpAQCAtMTQ5LDcgKzE2NywyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0aW9uIGZyb20gYSBwcm9maWxlCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgd2lsbCByZXR1cm4gZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCisgICAgICogQmx1ZXRvb3RoIGRldmljZSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIGV0Yy4gV2hlbiB0aGlzIEFQSSByZXR1cm5zLAorICAgICAqIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UKKyAgICAgKiBpbnRlbnQgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUKKyAgICAgKiBkaXNjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD4gSWYgdGhlIGRpc2Nvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIGJ5IGEgcmVtb3RlIGRldmljZSwgdGhlIHN0YXRlCisgICAgICogd2lsbCB0cmFuc2l0aW9uIGZyb20ge0BsaW5rICNTVEFURV9DT05ORUNURUR9IHRvCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LiBJZiB0aGUgZGlzY29ubmVjdCBpcyBpbml0aWF0ZWQgYnkgdGhlCisgICAgICogaG9zdCAobG9jYWwpIGRldmljZSB0aGUgc3RhdGUgd2lsbCB0cmFuc2l0aW9uIGZyb20KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0gdG8gc3RhdGUge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSB0bworICAgICAqIHN0YXRlIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfS4gVGhlIHRyYW5zaXRpb24gdG8KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlCisgICAgICogdHdvIHNjZW5hcmlvcy4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqIHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsCisgICAgICogICAgICAgICAgICAgICB0cnVlIG90aGVyd2lzZQogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CkBAIC0yMjAsNyArMjYwLDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIFNldCBwcmlvcml0eSBvZiB0aGUgcHJvZmlsZQorICAgICAqCisgICAgICogPHA+IFRoZSBkZXZpY2Ugc2hvdWxkIGFscmVhZHkgYmUgcGFpcmVkLgorICAgICAqICBQcmlvcml0eSBjYW4gYmUgb25lIG9mIHtAbGluayAjUFJJT1JJVFlfT059IG9yCisgICAgICoge0BsaW5rICNQUklPUklUWV9PRkZ9LAorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICogcGVybWlzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUGFpcmVkIGJsdWV0b290aCBkZXZpY2UKKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpb3JpdHkgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0UHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CkBAIC0yNDMsNyArMjk0LDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEdldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHByb2ZpbGUuCisgICAgICoKKyAgICAgKiA8cD4gVGhlIHByaW9yaXR5IGNhbiBiZSBhbnkgb2Y6CisgICAgICoge0BsaW5rICNQUklPUklUWV9BVVRPX0NPTk5FQ1R9LCB7QGxpbmsgI1BSSU9SSVRZX09GRn0sCisgICAgICoge0BsaW5rICNQUklPUklUWV9PTn0sIHtAbGluayAjUFJJT1JJVFlfVU5ERUZJTkVEfQorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIEJsdWV0b290aCBkZXZpY2UKKyAgICAgKiBAcmV0dXJuIHByaW9yaXR5IG9mIHRoZSBkZXZpY2UKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhBZGFwdGVyLmphdmEKaW5kZXggZTFjOTA0NC4uYThjMzFmOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEFkYXB0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoQWRhcHRlci5qYXZhCkBAIC02OTksNyArNjk5LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWxEaXNjb3ZlcnkoKSB7CiAgICAgICAgIGlmIChnZXRTdGF0ZSgpICE9IFNUQVRFX09OKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtU2VydmljZS5jYW5jZWxEaXNjb3ZlcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5jYW5jZWxEaXNjb3ZlcnkoKTsKICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHtMb2cuZShUQUcsICIiLCBlKTt9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC04NzMsMTAgKzg3MywxMCBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbGlzdGVuaW5nLCBpbnNlY3VyZSBSRkNPTU0gQmx1ZXRvb3RoIHNvY2tldCB3aXRoIFNlcnZpY2UgUmVjb3JkLgotICAgICAqIDxwPlRoZSBsaW5rIGtleSB3aWxsIGJlIHVuYXV0aGVudGljYXRlZCBpLmUgdGhlIGNvbW11bmljYXRpb24gaXMKKyAgICAgKiA8cD5UaGUgbGluayBrZXkgaXMgbm90IHJlcXVpcmVkIHRvIGJlIGF1dGhlbnRpY2F0ZWQsIGkuZSB0aGUgY29tbXVuaWNhdGlvbiBtYXkgYmUKICAgICAgKiB2dWxuZXJhYmxlIHRvIE1hbiBJbiB0aGUgTWlkZGxlIGF0dGFja3MuIEZvciBCbHVldG9vdGggMi4xIGRldmljZXMsCi0gICAgICogdGhlIGxpbmsga2V5IHdpbGwgYmUgZW5jcnlwdGVkLCBhcyBlbmNyeXB0aW9uIGlzIG1hbmRhcnRvcnkuCi0gICAgICogRm9yIGxlZ2FjeSBkZXZpY2VzIChwcmUgQmx1ZXRvb3RoIDIuMSBkZXZpY2VzKSB0aGUgbGluayBrZXkgd2lsbCBub3QKKyAgICAgKiB0aGUgbGluayB3aWxsIGJlIGVuY3J5cHRlZCwgYXMgZW5jcnlwdGlvbiBpcyBtYW5kYXJ0b3J5LgorICAgICAqIEZvciBsZWdhY3kgZGV2aWNlcyAocHJlIEJsdWV0b290aCAyLjEgZGV2aWNlcykgdGhlIGxpbmsgd2lsbCBub3QKICAgICAgKiBiZSBlbmNyeXB0ZWQuIFVzZSB7QGxpbmsgI2xpc3RlblVzaW5nUmZjb21tV2l0aFNlcnZpY2VSZWNvcmR9LCBpZiBhbgogICAgICAqIGVuY3J5cHRlZCBhbmQgYXV0aGVudGljYXRlZCBjb21tdW5pY2F0aW9uIGNoYW5uZWwgaXMgZGVzaXJlZC4KICAgICAgKiA8cD5Vc2Uge0BsaW5rIEJsdWV0b290aFNlcnZlclNvY2tldCNhY2NlcHR9IHRvIHJldHJpZXZlIGluY29taW5nCkBAIC05MDIsNiArOTAyLDQ0IEBACiAgICAgICAgIHJldHVybiBjcmVhdGVOZXdSZmNvbW1Tb2NrZXRBbmRSZWNvcmQobmFtZSwgdXVpZCwgZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKKyAgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGlzdGVuaW5nLCBlbmNyeXB0ZWQsCisgICAgICogUkZDT01NIEJsdWV0b290aCBzb2NrZXQgd2l0aCBTZXJ2aWNlIFJlY29yZC4KKyAgICAgKiA8cD5UaGUgbGluayB3aWxsIGJlIGVuY3J5cHRlZCwgYnV0IHRoZSBsaW5rIGtleSBpcyBub3QgcmVxdWlyZWQgdG8gYmUgYXV0aGVudGljYXRlZAorICAgICAqIGkuZSB0aGUgY29tbXVuaWNhdGlvbiBpcyB2dWxuZXJhYmxlIHRvIE1hbiBJbiB0aGUgTWlkZGxlIGF0dGFja3MuIFVzZQorICAgICAqIHtAbGluayAjbGlzdGVuVXNpbmdSZmNvbW1XaXRoU2VydmljZVJlY29yZH0sIHRvIGVuc3VyZSBhbiBhdXRoZW50aWNhdGVkIGxpbmsga2V5LgorICAgICAqIDxwPiBVc2UgdGhpcyBzb2NrZXQgaWYgYXV0aGVudGljYXRpb24gb2YgbGluayBrZXkgaXMgbm90IHBvc3NpYmxlLgorICAgICAqIEZvciBleGFtcGxlLCBmb3IgQmx1ZXRvb3RoIDIuMSBkZXZpY2VzLCBpZiBhbnkgb2YgdGhlIGRldmljZXMgZG9lcyBub3QgaGF2ZQorICAgICAqIGFuIGlucHV0IGFuZCBvdXRwdXQgY2FwYWJpbGl0eSBvciBqdXN0IGhhcyB0aGUgYWJpbGl0eSB0byBkaXNwbGF5IGEgbnVtZXJpYyBrZXksCisgICAgICogYSBzZWN1cmUgc29ja2V0IGNvbm5lY3Rpb24gaXMgbm90IHBvc3NpYmxlIGFuZCB0aGlzIHNvY2tldCBjYW4gYmUgdXNlZC4KKyAgICAgKiBVc2Uge0BsaW5rICNsaXN0ZW5Vc2luZ0luc2VjdXJlUmZjb21tV2l0aFNlcnZpY2VSZWNvcmR9LCBpZiBlbmNyeXB0aW9uIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKiBGb3IgQmx1ZXRvb3RoIDIuMSBkZXZpY2VzLCB0aGUgbGluayB3aWxsIGJlIGVuY3J5cHRlZCwgYXMgZW5jcnlwdGlvbiBpcyBtYW5kYXJ0b3J5LgorICAgICAqIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIHRoZSBTZWN1cml0eSBNb2RlbCBzZWN0aW9uIDUuMiAodm9sIDMpIG9mCisgICAgICogQmx1ZXRvb3RoIENvcmUgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuMSArIEVEUi4KKyAgICAgKiA8cD5Vc2Uge0BsaW5rIEJsdWV0b290aFNlcnZlclNvY2tldCNhY2NlcHR9IHRvIHJldHJpZXZlIGluY29taW5nCisgICAgICogY29ubmVjdGlvbnMgZnJvbSBhIGxpc3RlbmluZyB7QGxpbmsgQmx1ZXRvb3RoU2VydmVyU29ja2V0fS4KKyAgICAgKiA8cD5UaGUgc3lzdGVtIHdpbGwgYXNzaWduIGFuIHVudXNlZCBSRkNPTU0gY2hhbm5lbCB0byBsaXN0ZW4gb24uCisgICAgICogPHA+VGhlIHN5c3RlbSB3aWxsIGFsc28gcmVnaXN0ZXIgYSBTZXJ2aWNlIERpc2NvdmVyeQorICAgICAqIFByb3RvY29sIChTRFApIHJlY29yZCB3aXRoIHRoZSBsb2NhbCBTRFAgc2VydmVyIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZAorICAgICAqIFVVSUQsIHNlcnZpY2UgbmFtZSwgYW5kIGF1dG8tYXNzaWduZWQgY2hhbm5lbC4gUmVtb3RlIEJsdWV0b290aCBkZXZpY2VzCisgICAgICogY2FuIHVzZSB0aGUgc2FtZSBVVUlEIHRvIHF1ZXJ5IG91ciBTRFAgc2VydmVyIGFuZCBkaXNjb3ZlciB3aGljaCBjaGFubmVsCisgICAgICogdG8gY29ubmVjdCB0by4gVGhpcyBTRFAgcmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoaXMgc29ja2V0IGlzCisgICAgICogY2xvc2VkLCBvciBpZiB0aGlzIGFwcGxpY2F0aW9uIGNsb3NlcyB1bmV4cGVjdGVkbHkuCisgICAgICogPHA+VXNlIHtAbGluayBCbHVldG9vdGhEZXZpY2UjY3JlYXRlUmZjb21tU29ja2V0VG9TZXJ2aWNlUmVjb3JkfSB0bworICAgICAqIGNvbm5lY3QgdG8gdGhpcyBzb2NrZXQgZnJvbSBhbm90aGVyIGRldmljZSB1c2luZyB0aGUgc2FtZSB7QGxpbmsgVVVJRH0uCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9CisgICAgICogQHBhcmFtIG5hbWUgc2VydmljZSBuYW1lIGZvciBTRFAgcmVjb3JkCisgICAgICogQHBhcmFtIHV1aWQgdXVpZCBmb3IgU0RQIHJlY29yZAorICAgICAqIEByZXR1cm4gYSBsaXN0ZW5pbmcgUkZDT01NIEJsdWV0b290aFNlcnZlclNvY2tldAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IsIGZvciBleGFtcGxlIEJsdWV0b290aCBub3QgYXZhaWxhYmxlLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLCBvciBjaGFubmVsIGluIHVzZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQgbGlzdGVuVXNpbmdFbmNyeXB0ZWRSZmNvbW1XaXRoU2VydmljZVJlY29yZCgKKyAgICAgICAgICAgIFN0cmluZyBuYW1lLCBVVUlEIHV1aWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVOZXdSZmNvbW1Tb2NrZXRBbmRSZWNvcmQobmFtZSwgdXVpZCwgZmFsc2UsIHRydWUpOworICAgIH0KKwogICAgIHByaXZhdGUgQmx1ZXRvb3RoU2VydmVyU29ja2V0IGNyZWF0ZU5ld1JmY29tbVNvY2tldEFuZFJlY29yZChTdHJpbmcgbmFtZSwgVVVJRCB1dWlkLAogICAgICAgICAgICAgYm9vbGVhbiBhdXRoLCBib29sZWFuIGVuY3J5cHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFJmY29tbUNoYW5uZWxQaWNrZXIgcGlja2VyID0gbmV3IFJmY29tbUNoYW5uZWxQaWNrZXIodXVpZCk7CkBAIC05NzMsNiArMTAxMSwyOCBAQAogICAgICAgICByZXR1cm4gc29ja2V0OwogICAgIH0KIAorICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZW5jcnlwdGVkLCBSRkNPTU0gc2VydmVyIHNvY2tldC4KKyAgICAgKiBDYWxsICNhY2NlcHQgdG8gcmV0cmlldmUgY29ubmVjdGlvbnMgdG8gdGhpcyBzb2NrZXQuCisgICAgICogQHJldHVybiBBbiBSRkNPTU0gQmx1ZXRvb3RoU2VydmVyU29ja2V0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBPbiBlcnJvciwgZm9yIGV4YW1wbGUgQmx1ZXRvb3RoIG5vdCBhdmFpbGFibGUsIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQmx1ZXRvb3RoU2VydmVyU29ja2V0IGxpc3RlblVzaW5nRW5jcnlwdGVkUmZjb21tT24oaW50IHBvcnQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCbHVldG9vdGhTZXJ2ZXJTb2NrZXQgc29ja2V0ID0gbmV3IEJsdWV0b290aFNlcnZlclNvY2tldCgKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhTb2NrZXQuVFlQRV9SRkNPTU0sIGZhbHNlLCB0cnVlLCBwb3J0KTsKKyAgICAgICAgaW50IGVycm5vID0gc29ja2V0Lm1Tb2NrZXQuYmluZExpc3RlbigpOworICAgICAgICBpZiAoZXJybm8gIT0gMCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgICAgICBzb2NrZXQubVNvY2tldC50aHJvd0Vycm5vTmF0aXZlKGVycm5vKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc29ja2V0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIFNDTyBzZXJ2ZXIgc29ja2V0LgogICAgICAqIENhbGwgI2FjY2VwdCB0byByZXRyaWV2ZSBjb25uZWN0aW9ucyB0byB0aGlzIHNvY2tldC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSGVhZHNldC5qYXZhCmluZGV4IDhhOWJlZjAuLjIzNzI0ZjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhIZWFkc2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aEhlYWRzZXQuamF2YQpAQCAtMjQ4LDcgKzI0OCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBJbml0aWF0ZSBjb25uZWN0aW9uIHRvIGEgcHJvZmlsZSBvZiB0aGUgcmVtb3RlIGJsdWV0b290aCBkZXZpY2UuCisgICAgICoKKyAgICAgKiA8cD4gQ3VycmVudGx5LCB0aGUgc3lzdGVtIHN1cHBvcnRzIG9ubHkgMSBjb25uZWN0aW9uIHRvIHRoZQorICAgICAqIGhlYWRzZXQvaGFuZHNmcmVlIHByb2ZpbGUuIFRoZSBBUEkgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3QgY29ubmVjdGVkCisgICAgICogZGV2aWNlcyBiZWZvcmUgY29ubmVjdGluZy4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIEFQSSByZXR1cm5zIGZhbHNlIGluIHNjZW5hcmlvcyBsaWtlIHRoZSBwcm9maWxlIG9uIHRoZQorICAgICAqIGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBCbHVldG9vdGggaXMgbm90IHR1cm5lZCBvbi4KKyAgICAgKiBXaGVuIHRoaXMgQVBJIHJldHVybnMgdHJ1ZSwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CisgICAgICogY29ubmVjdGlvbiBzdGF0ZSBpbnRlbnQgZm9yIHRoZSBwcm9maWxlIHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aAorICAgICAqIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewpAQCAtMjY3LDcgKzI4NSwyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0aW9uIGZyb20gYSBwcm9maWxlCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgd2lsbCByZXR1cm4gZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCisgICAgICogQmx1ZXRvb3RoIGRldmljZSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIGV0Yy4gV2hlbiB0aGlzIEFQSSByZXR1cm5zLAorICAgICAqIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UKKyAgICAgKiBpbnRlbnQgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUKKyAgICAgKiBkaXNjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD4gSWYgdGhlIGRpc2Nvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIGJ5IGEgcmVtb3RlIGRldmljZSwgdGhlIHN0YXRlCisgICAgICogd2lsbCB0cmFuc2l0aW9uIGZyb20ge0BsaW5rICNTVEFURV9DT05ORUNURUR9IHRvCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LiBJZiB0aGUgZGlzY29ubmVjdCBpcyBpbml0aWF0ZWQgYnkgdGhlCisgICAgICogaG9zdCAobG9jYWwpIGRldmljZSB0aGUgc3RhdGUgd2lsbCB0cmFuc2l0aW9uIGZyb20KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0gdG8gc3RhdGUge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSB0bworICAgICAqIHN0YXRlIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfS4gVGhlIHRyYW5zaXRpb24gdG8KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlCisgICAgICogdHdvIHNjZW5hcmlvcy4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqIHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsCisgICAgICogICAgICAgICAgICAgICB0cnVlIG90aGVyd2lzZQogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CkBAIC0zMzgsNyArMzc4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIFNldCBwcmlvcml0eSBvZiB0aGUgcHJvZmlsZQorICAgICAqCisgICAgICogPHA+IFRoZSBkZXZpY2Ugc2hvdWxkIGFscmVhZHkgYmUgcGFpcmVkLgorICAgICAqICBQcmlvcml0eSBjYW4gYmUgb25lIG9mIHtAbGluayAjUFJJT1JJVFlfT059IG9yCisgICAgICoge0BsaW5rICNQUklPUklUWV9PRkZ9LAorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICogcGVybWlzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUGFpcmVkIGJsdWV0b290aCBkZXZpY2UKKyAgICAgKiBAcGFyYW0gcHJpb3JpdHkKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcHJpb3JpdHkgaXMgc2V0LCBmYWxzZSBvbiBlcnJvcgogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0UHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByaW9yaXR5KSB7CkBAIC0zNjEsNyArNDEyLDE2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEdldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHByb2ZpbGUuCisgICAgICoKKyAgICAgKiA8cD4gVGhlIHByaW9yaXR5IGNhbiBiZSBhbnkgb2Y6CisgICAgICoge0BsaW5rICNQUklPUklUWV9BVVRPX0NPTk5FQ1R9LCB7QGxpbmsgI1BSSU9SSVRZX09GRn0sCisgICAgICoge0BsaW5rICNQUklPUklUWV9PTn0sIHtAbGluayAjUFJJT1JJVFlfVU5ERUZJTkVEfQorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEh9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIEJsdWV0b290aCBkZXZpY2UKKyAgICAgKiBAcmV0dXJuIHByaW9yaXR5IG9mIHRoZSBkZXZpY2UKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aElucHV0RGV2aWNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQppbmRleCBkZjIxMmE4Li4yODJiNzBhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoSW5wdXREZXZpY2UuamF2YQpAQCAtMTE5LDcgKzExOSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBJbml0aWF0ZSBjb25uZWN0aW9uIHRvIGEgcHJvZmlsZSBvZiB0aGUgcmVtb3RlIGJsdWV0b290aCBkZXZpY2UuCisgICAgICoKKyAgICAgKiA8cD4gVGhlIHN5c3RlbSBzdXBwb3J0cyBjb25uZWN0aW9uIHRvIG11bHRpcGxlIGlucHV0IGRldmljZXMuCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgcmV0dXJucyBmYWxzZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGUgcHJvZmlsZSBvbiB0aGUKKyAgICAgKiBkZXZpY2UgaXMgYWxyZWFkeSBjb25uZWN0ZWQgb3IgQmx1ZXRvb3RoIGlzIG5vdCB0dXJuZWQgb24uCisgICAgICogV2hlbiB0aGlzIEFQSSByZXR1cm5zIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdAorICAgICAqIGNvbm5lY3Rpb24gc3RhdGUgaW50ZW50IGZvciB0aGUgcHJvZmlsZSB3aWxsIGJlIGJyb2FkY2FzdGVkIHdpdGgKKyAgICAgKiB0aGUgc3RhdGUuIFVzZXJzIGNhbiBnZXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHByb2ZpbGUKKyAgICAgKiBmcm9tIHRoaXMgaW50ZW50LgorICAgICAqCisgICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59CisgICAgICogcGVybWlzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJsdWV0b290aCBEZXZpY2UKKyAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwKKyAgICAgKiAgICAgICAgICAgICAgIHRydWUgb3RoZXJ3aXNlCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKQEAgLTEzOCw3ICsxNTQsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogSW5pdGlhdGUgZGlzY29ubmVjdGlvbiBmcm9tIGEgcHJvZmlsZQorICAgICAqCisgICAgICogPHA+IFRoaXMgQVBJIHdpbGwgcmV0dXJuIGZhbHNlIGluIHNjZW5hcmlvcyBsaWtlIHRoZSBwcm9maWxlIG9uIHRoZQorICAgICAqIEJsdWV0b290aCBkZXZpY2UgaXMgbm90IGluIGNvbm5lY3RlZCBzdGF0ZSBldGMuIFdoZW4gdGhpcyBBUEkgcmV0dXJucywKKyAgICAgKiB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlCisgICAgICogaW50ZW50IHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aCB0aGUgc3RhdGUuIFVzZXJzIGNhbiBnZXQgdGhlCisgICAgICogZGlzY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZSBmcm9tIHRoaXMgaW50ZW50LgorICAgICAqCisgICAgICogPHA+IElmIHRoZSBkaXNjb25uZWN0aW9uIGlzIGluaXRpYXRlZCBieSBhIHJlbW90ZSBkZXZpY2UsIHRoZSBzdGF0ZQorICAgICAqIHdpbGwgdHJhbnNpdGlvbiBmcm9tIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSB0bworICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfS4gSWYgdGhlIGRpc2Nvbm5lY3QgaXMgaW5pdGlhdGVkIGJ5IHRoZQorICAgICAqIGhvc3QgKGxvY2FsKSBkZXZpY2UgdGhlIHN0YXRlIHdpbGwgdHJhbnNpdGlvbiBmcm9tCisgICAgICoge0BsaW5rICNTVEFURV9DT05ORUNURUR9IHRvIHN0YXRlIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30gdG8KKyAgICAgKiBzdGF0ZSB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0uIFRoZSB0cmFuc2l0aW9uIHRvCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSBjYW4gYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZQorICAgICAqIHR3byBzY2VuYXJpb3MuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2Nvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewpAQCAtMjA5LDcgKzI0NywxOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBTZXQgcHJpb3JpdHkgb2YgdGhlIHByb2ZpbGUKKyAgICAgKgorICAgICAqIDxwPiBUaGUgZGV2aWNlIHNob3VsZCBhbHJlYWR5IGJlIHBhaXJlZC4KKyAgICAgKiAgUHJpb3JpdHkgY2FuIGJlIG9uZSBvZiB7QGxpbmsgI1BSSU9SSVRZX09OfSBvcgorICAgICAqIHtAbGluayAjUFJJT1JJVFlfT0ZGfSwKKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqIHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBibHVldG9vdGggZGV2aWNlCisgICAgICogQHBhcmFtIHByaW9yaXR5CisgICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSkgewpAQCAtMjMyLDcgKzI4MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBHZXQgdGhlIHByaW9yaXR5IG9mIHRoZSBwcm9maWxlLgorICAgICAqCisgICAgICogPHA+IFRoZSBwcmlvcml0eSBjYW4gYmUgYW55IG9mOgorICAgICAqIHtAbGluayAjUFJJT1JJVFlfQVVUT19DT05ORUNUfSwge0BsaW5rICNQUklPUklUWV9PRkZ9LAorICAgICAqIHtAbGluayAjUFJJT1JJVFlfT059LCB7QGxpbmsgI1BSSU9SSVRZX1VOREVGSU5FRH0KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBCbHVldG9vdGggZGV2aWNlCisgICAgICogQHJldHVybiBwcmlvcml0eSBvZiB0aGUgZGV2aWNlCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQYW4uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQYW4uamF2YQppbmRleCA5ZmZlZDI2Li43NDkwZjllIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUGFuLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFBhbi5qYXZhCkBAIC0xNDAsNyArMTQwLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEluaXRpYXRlIGNvbm5lY3Rpb24gdG8gYSBwcm9maWxlIG9mIHRoZSByZW1vdGUgYmx1ZXRvb3RoIGRldmljZS4KKyAgICAgKgorICAgICAqIDxwPiBUaGlzIEFQSSByZXR1cm5zIGZhbHNlIGluIHNjZW5hcmlvcyBsaWtlIHRoZSBwcm9maWxlIG9uIHRoZQorICAgICAqIGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBvciBCbHVldG9vdGggaXMgbm90IHR1cm5lZCBvbi4KKyAgICAgKiBXaGVuIHRoaXMgQVBJIHJldHVybnMgdHJ1ZSwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0CisgICAgICogY29ubmVjdGlvbiBzdGF0ZSBpbnRlbnQgZm9yIHRoZSBwcm9maWxlIHdpbGwgYmUgYnJvYWRjYXN0ZWQgd2l0aAorICAgICAqIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcHJvZmlsZQorICAgICAqIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD5SZXF1aXJlcyB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI0JMVUVUT09USF9BRE1JTn0KKyAgICAgKiBwZXJtaXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRldmljZSBSZW1vdGUgQmx1ZXRvb3RoIERldmljZQorICAgICAqIEByZXR1cm4gZmFsc2Ugb24gaW1tZWRpYXRlIGVycm9yLAorICAgICAqICAgICAgICAgICAgICAgdHJ1ZSBvdGhlcndpc2UKICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGNvbm5lY3QoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewpAQCAtMTU5LDcgKzE3MywyOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiBJbml0aWF0ZSBkaXNjb25uZWN0aW9uIGZyb20gYSBwcm9maWxlCisgICAgICoKKyAgICAgKiA8cD4gVGhpcyBBUEkgd2lsbCByZXR1cm4gZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCisgICAgICogQmx1ZXRvb3RoIGRldmljZSBpcyBub3QgaW4gY29ubmVjdGVkIHN0YXRlIGV0Yy4gV2hlbiB0aGlzIEFQSSByZXR1cm5zLAorICAgICAqIHRydWUsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2UKKyAgICAgKiBpbnRlbnQgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoIHRoZSBzdGF0ZS4gVXNlcnMgY2FuIGdldCB0aGUKKyAgICAgKiBkaXNjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlIGZyb20gdGhpcyBpbnRlbnQuCisgICAgICoKKyAgICAgKiA8cD4gSWYgdGhlIGRpc2Nvbm5lY3Rpb24gaXMgaW5pdGlhdGVkIGJ5IGEgcmVtb3RlIGRldmljZSwgdGhlIHN0YXRlCisgICAgICogd2lsbCB0cmFuc2l0aW9uIGZyb20ge0BsaW5rICNTVEFURV9DT05ORUNURUR9IHRvCisgICAgICoge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LiBJZiB0aGUgZGlzY29ubmVjdCBpcyBpbml0aWF0ZWQgYnkgdGhlCisgICAgICogaG9zdCAobG9jYWwpIGRldmljZSB0aGUgc3RhdGUgd2lsbCB0cmFuc2l0aW9uIGZyb20KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0gdG8gc3RhdGUge0BsaW5rICNTVEFURV9ESVNDT05ORUNUSU5HfSB0bworICAgICAqIHN0YXRlIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVEVEfS4gVGhlIHRyYW5zaXRpb24gdG8KKyAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IGNhbiBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlCisgICAgICogdHdvIHNjZW5hcmlvcy4KKyAgICAgKgorICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQorICAgICAqIHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCisgICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsCisgICAgICogICAgICAgICAgICAgICB0cnVlIG90aGVyd2lzZQogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZGlzY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CkBAIC0yMjksMjcgKzI2NSw2IEBACiAgICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZXRQcmlvcml0eShCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJpb3JpdHkpIHsKLSAgICAgICAgLy8gUHJpb3JpdGllcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgUEFOIGRldmljZXMgLSBzaW5jZSB3ZSBkb24ndAotICAgICAgICAvLyBhdXRvIGNvbm5lY3QuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJnZXRQcmlvcml0eSgiICsgZGV2aWNlICsgIikiKTsKLSAgICAgICAgLy8gUHJpb3JpdGllcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgUEFOIGRldmljZXMgLSBzaW5jZSB3ZSBkb24ndAotICAgICAgICAvLyBhdXRvIGNvbm5lY3QuCi0gICAgICAgIHJldHVybiBCbHVldG9vdGhQcm9maWxlLlBSSU9SSVRZX09OOwotICAgIH0KLQogICAgIHB1YmxpYyB2b2lkIHNldEJsdWV0b290aFRldGhlcmluZyhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGlmIChEQkcpIGxvZygic2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKCIgKyB2YWx1ZSArICIpIik7CiAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFByb2ZpbGUuamF2YQppbmRleCAxYWQ2NmY3Li4yMjU1NWYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUHJvZmlsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhQcm9maWxlLmphdmEKQEAgLTEwNCw1OCArMTA0LDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9VTkRFRklORUQgPSAtMTsKIAogICAgIC8qKgotICAgICAqIEluaXRpYXRlIGNvbm5lY3Rpb24gdG8gYSBwcm9maWxlIG9mIHRoZSByZW1vdGUgYmx1ZXRvb3RoIGRldmljZS4KLSAgICAgKgotICAgICAqIDxwPiBDdXJyZW50bHksIHRoZSBzeXN0ZW0gc3VwcG9ydHMgb25seSAxIGNvbm5lY3Rpb24gdG8gdGhlCi0gICAgICogQTJEUCBhbmQgSGVhZHNldC9IYW5kc2ZyZWUgcHJvZmlsZS4gVGhlIEFQSSB3aWxsIGF1dG9tYXRpY2FsbHkKLSAgICAgKiBkaXNjb25uZWN0IGNvbm5lY3RlZCBkZXZpY2VzIGJlZm9yZSBjb25uZWN0aW5nLgotICAgICAqCi0gICAgICogPHA+IFRoaXMgQVBJIHJldHVybnMgZmFsc2UgaW4gc2NlbmFyaW9zIGxpa2UgdGhlIHByb2ZpbGUgb24gdGhlCi0gICAgICogZGV2aWNlIGlzIGFscmVhZHkgY29ubmVjdGVkIG9yIEJsdWV0b290aCBpcyBub3QgdHVybmVkIG9uLgotICAgICAqIFdoZW4gdGhpcyBBUEkgcmV0dXJucyB0cnVlLCBpdCBpcyBndWFyYW50ZWVkIHRoYXQKLSAgICAgKiBjb25uZWN0aW9uIHN0YXRlIGludGVudCBmb3IgdGhlIHByb2ZpbGUgd2lsbCBiZSBicm9hZGNhc3RlZCB3aXRoCi0gICAgICogdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBwcm9maWxlCi0gICAgICogZnJvbSB0aGlzIGludGVudC4KLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQotICAgICAqIHBlcm1pc3Npb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIFJlbW90ZSBCbHVldG9vdGggRGV2aWNlCi0gICAgICogQHJldHVybiBmYWxzZSBvbiBpbW1lZGlhdGUgZXJyb3IsCi0gICAgICogICAgICAgICAgICAgICB0cnVlIG90aGVyd2lzZQotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29ubmVjdChCbHVldG9vdGhEZXZpY2UgZGV2aWNlKTsKLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlIGRpc2Nvbm5lY3Rpb24gZnJvbSBhIHByb2ZpbGUKLSAgICAgKgotICAgICAqIDxwPiBUaGlzIEFQSSB3aWxsIHJldHVybiBmYWxzZSBpbiBzY2VuYXJpb3MgbGlrZSB0aGUgcHJvZmlsZSBvbiB0aGUKLSAgICAgKiBCbHVldG9vdGggZGV2aWNlIGlzIG5vdCBpbiBjb25uZWN0ZWQgc3RhdGUgZXRjLiBXaGVuIHRoaXMgQVBJIHJldHVybnMsCi0gICAgICogdHJ1ZSwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZQotICAgICAqIGludGVudCB3aWxsIGJlIGJyb2FkY2FzdGVkIHdpdGggdGhlIHN0YXRlLiBVc2VycyBjYW4gZ2V0IHRoZQotICAgICAqIGRpc2Nvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHByb2ZpbGUgZnJvbSB0aGlzIGludGVudC4KLSAgICAgKgotICAgICAqIDxwPiBJZiB0aGUgZGlzY29ubmVjdGlvbiBpcyBpbml0aWF0ZWQgYnkgYSByZW1vdGUgZGV2aWNlLCB0aGUgc3RhdGUKLSAgICAgKiB3aWxsIHRyYW5zaXRpb24gZnJvbSB7QGxpbmsgI1NUQVRFX0NPTk5FQ1RFRH0gdG8KLSAgICAgKiB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RFRH0uIElmIHRoZSBkaXNjb25uZWN0IGlzIGluaXRpYXRlZCBieSB0aGUKLSAgICAgKiBob3N0IChsb2NhbCkgZGV2aWNlIHRoZSBzdGF0ZSB3aWxsIHRyYW5zaXRpb24gZnJvbQotICAgICAqIHtAbGluayAjU1RBVEVfQ09OTkVDVEVEfSB0byBzdGF0ZSB7QGxpbmsgI1NUQVRFX0RJU0NPTk5FQ1RJTkd9IHRvCi0gICAgICogc3RhdGUge0BsaW5rICNTVEFURV9ESVNDT05ORUNURUR9LiBUaGUgdHJhbnNpdGlvbiB0bwotICAgICAqIHtAbGluayAjU1RBVEVfRElTQ09OTkVDVElOR30gY2FuIGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUKLSAgICAgKiB0d28gc2NlbmFyaW9zLgotICAgICAqCi0gICAgICogPHA+UmVxdWlyZXMge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNCTFVFVE9PVEhfQURNSU59Ci0gICAgICogcGVybWlzc2lvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXZpY2UgUmVtb3RlIEJsdWV0b290aCBEZXZpY2UKLSAgICAgKiBAcmV0dXJuIGZhbHNlIG9uIGltbWVkaWF0ZSBlcnJvciwKLSAgICAgKiAgICAgICAgICAgICAgIHRydWUgb3RoZXJ3aXNlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNjb25uZWN0KEJsdWV0b290aERldmljZSBkZXZpY2UpOwotCi0gICAgLyoqCiAgICAgICogR2V0IGNvbm5lY3RlZCBkZXZpY2VzIGZvciB0aGlzIHNwZWNpZmljIHByb2ZpbGUuCiAgICAgICoKICAgICAgKiA8cD4gUmV0dXJuIHRoZSBzZXQgb2YgZGV2aWNlcyB3aGljaCBhcmUgaW4gc3RhdGUge0BsaW5rICNTVEFURV9DT05ORUNURUR9CkBAIC0xOTUsMzggKzE0Myw2IEBACiAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSk7CiAKICAgICAvKioKLSAgICAgKiBTZXQgcHJpb3JpdHkgb2YgdGhlIHByb2ZpbGUKLSAgICAgKgotICAgICAqIDxwPiBUaGUgZGV2aWNlIHNob3VsZCBhbHJlYWR5IGJlIHBhaXJlZC4KLSAgICAgKiAgUHJpb3JpdHkgY2FuIGJlIG9uZSBvZiB7QGxpbmsgI1BSSU9SSVRZX09OfSBvcgotICAgICAqIHtAbGluayAjUFJJT1JJVFlfT0ZGfSwKLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIX0FETUlOfQotICAgICAqIHBlcm1pc3Npb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGV2aWNlIFBhaXJlZCBibHVldG9vdGggZGV2aWNlCi0gICAgICogQHBhcmFtIHByaW9yaXR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHByaW9yaXR5IGlzIHNldCwgZmFsc2Ugb24gZXJyb3IKLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcmlvcml0eSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByaW9yaXR5IG9mIHRoZSBwcm9maWxlLgotICAgICAqCi0gICAgICogPHA+IFRoZSBwcmlvcml0eSBjYW4gYmUgYW55IG9mOgotICAgICAqIHtAbGluayAjUFJJT1JJVFlfQVVUT19DT05ORUNUfSwge0BsaW5rICNQUklPUklUWV9PRkZ9LAotICAgICAqIHtAbGluayAjUFJJT1JJVFlfT059LCB7QGxpbmsgI1BSSU9SSVRZX1VOREVGSU5FRH0KLSAgICAgKgotICAgICAqIDxwPlJlcXVpcmVzIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jQkxVRVRPT1RIfSBwZXJtaXNzaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIGRldmljZSBCbHVldG9vdGggZGV2aWNlCi0gICAgICogQHJldHVybiBwcmlvcml0eSBvZiB0aGUgZGV2aWNlCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KEJsdWV0b290aERldmljZSBkZXZpY2UpOwotCi0gICAgLyoqCiAgICAgICogQW4gaW50ZXJmYWNlIGZvciBub3RpZnlpbmcgQmx1ZXRvb3RoUHJvZmlsZSBJUEMgY2xpZW50cyB3aGVuIHRoZXkgaGF2ZQogICAgICAqIGJlZW4gY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCB0byB0aGUgc2VydmljZS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTb2NrZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTb2NrZXQuamF2YQppbmRleCA3MTlkNzMwLi45YTEzYzNlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoU29ja2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFNvY2tldC5qYXZhCkBAIC05NCwxMCArOTQsMTYgQEAKIAogICAgIHByaXZhdGUgaW50IG1Qb3J0OyAgLyogUkZDT01NIGNoYW5uZWwgb3IgTDJDQVAgcHNtICovCiAKLSAgICAvKiogcHJldmVudHMgYWxsIG5hdGl2ZSBjYWxscyBhZnRlciBkZXN0cm95TmF0aXZlKCkgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUNsb3NlZDsKKyAgICBwcml2YXRlIGVudW0gU29ja2V0U3RhdGUgeworICAgICAgICBJTklULAorICAgICAgICBDT05ORUNURUQsCisgICAgICAgIENMT1NFRAorICAgIH0KIAotICAgIC8qKiBwcm90ZWN0cyBtQ2xvc2VkICovCisgICAgLyoqIHByZXZlbnRzIGFsbCBuYXRpdmUgY2FsbHMgYWZ0ZXIgZGVzdHJveU5hdGl2ZSgpICovCisgICAgcHJpdmF0ZSBTb2NrZXRTdGF0ZSBtU29ja2V0U3RhdGU7CisKKyAgICAvKiogcHJvdGVjdHMgbVNvY2tldFN0YXRlICovCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIG1Mb2NrOwogCiAgICAgLyoqIHVzZWQgYnkgbmF0aXZlIGNvZGUgb25seSAqLwpAQCAtMTQ1LDcgKzE1MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgbUlucHV0U3RyZWFtID0gbmV3IEJsdWV0b290aElucHV0U3RyZWFtKHRoaXMpOwogICAgICAgICBtT3V0cHV0U3RyZWFtID0gbmV3IEJsdWV0b290aE91dHB1dFN0cmVhbSh0aGlzKTsKLSAgICAgICAgbUNsb3NlZCA9IGZhbHNlOworICAgICAgICBtU29ja2V0U3RhdGUgPSBTb2NrZXRTdGF0ZS5JTklUOwogICAgICAgICBtTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CiAgICAgfQogCkBAIC0xOTUsMTMgKzIwMSwxNCBAQAogICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2xvc2VkKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKKyAgICAgICAgICAgIGlmIChtU29ja2V0U3RhdGUgPT0gU29ja2V0U3RhdGUuQ0xPU0VEKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKIAogICAgICAgICAgICAgaWYgKG1TZHAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1Qb3J0ID0gbVNkcC5kb1NkcCgpOyAgLy8gYmxvY2tzCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNvbm5lY3ROYXRpdmUoKTsgIC8vIGJsb2NrcworICAgICAgICAgICAgbVNvY2tldFN0YXRlID0gU29ja2V0U3RhdGUuQ09OTkVDVEVEOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKICAgICAgICAgfQpAQCAtMjE2LDcgKzIyMyw3IEBACiAgICAgICAgIC8vIGFib3J0IGJsb2NraW5nIG9wZXJhdGlvbnMgb24gdGhlIHNvY2tldAogICAgICAgICBtTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2xvc2VkKSByZXR1cm47CisgICAgICAgICAgICBpZiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNMT1NFRCkgcmV0dXJuOwogICAgICAgICAgICAgaWYgKG1TZHAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1TZHAuY2FuY2VsKCk7CiAgICAgICAgICAgICB9CkBAIC0yMjksNyArMjM2LDcgQEAKICAgICAgICAgLy8gYWJvcnROYXRpdmUoKSwgc28gdGhpcyBsb2NrIHNob3VsZCBpbW1lZGlhdGVseSBhY3F1aXJlCiAgICAgICAgIG1Mb2NrLndyaXRlTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1DbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgbVNvY2tldFN0YXRlID0gU29ja2V0U3RhdGUuQ0xPU0VEOwogICAgICAgICAgICAgZGVzdHJveU5hdGl2ZSgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CkBAIC0yNjcsMTMgKzI3NCwyMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgY29ubmVjdGlvbiBzdGF0dXMgb2YgdGhpcyBzb2NrZXQsIGllLCB3aGV0aGVyIHRoZXJlIGlzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIHdpdGgKKyAgICAgKiByZW1vdGUgZGV2aWNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb25uZWN0ZWQKKyAgICAgKiAgICAgICAgIGZhbHNlIGlmIG5vdCBjb25uZWN0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtU29ja2V0U3RhdGUgPT0gU29ja2V0U3RhdGUuQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDdXJyZW50bHkgcmV0dXJucyB1bml4IGVycm5vIGluc3RlYWQgb2YgdGhyb3dpbmcgSU9FeGNlcHRpb24sCiAgICAgICogc28gdGhhdCBCbHVldG9vdGhBZGFwdGVyIGNhbiBjaGVjayB0aGUgZXJyb3IgY29kZSBmb3IgRUFERFJJTlVTRQogICAgICAqLwogICAgIC8qcGFja2FnZSovIGludCBiaW5kTGlzdGVuKCkgewogICAgICAgICBtTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2xvc2VkKSByZXR1cm4gRUJBREZEOworICAgICAgICAgICAgaWYgKG1Tb2NrZXRTdGF0ZSA9PSBTb2NrZXRTdGF0ZS5DTE9TRUQpIHJldHVybiBFQkFERkQ7CiAgICAgICAgICAgICByZXR1cm4gYmluZExpc3Rlbk5hdGl2ZSgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKQEAgLTI4Myw4ICszMDAsMTEgQEAKICAgICAvKnBhY2thZ2UqLyBCbHVldG9vdGhTb2NrZXQgYWNjZXB0KGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2xvc2VkKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBhY2NlcHROYXRpdmUodGltZW91dCk7CisgICAgICAgICAgICBpZiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNMT1NFRCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CisKKyAgICAgICAgICAgIEJsdWV0b290aFNvY2tldCBhY2NlcHRlZFNvY2tldCA9IGFjY2VwdE5hdGl2ZSh0aW1lb3V0KTsKKyAgICAgICAgICAgIG1Tb2NrZXRTdGF0ZSA9IFNvY2tldFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgICAgIHJldHVybiBhY2NlcHRlZFNvY2tldDsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KQEAgLTI5Myw3ICszMTMsNyBAQAogICAgIC8qcGFja2FnZSovIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2xvc2VkKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKKyAgICAgICAgICAgIGlmIChtU29ja2V0U3RhdGUgPT0gU29ja2V0U3RhdGUuQ0xPU0VEKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKICAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVOYXRpdmUoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIG1Mb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CkBAIC0zMDMsNyArMzIzLDcgQEAKICAgICAvKnBhY2thZ2UqLyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbUxvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobUNsb3NlZCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CisgICAgICAgICAgICBpZiAobVNvY2tldFN0YXRlID09IFNvY2tldFN0YXRlLkNMT1NFRCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzb2NrZXQgY2xvc2VkIik7CiAgICAgICAgICAgICByZXR1cm4gcmVhZE5hdGl2ZShiLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwpAQCAtMzEzLDcgKzMzMyw3IEBACiAgICAgLypwYWNrYWdlKi8gaW50IHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBtTG9jay5yZWFkTG9jaygpLmxvY2soKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtQ2xvc2VkKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKKyAgICAgICAgICAgIGlmIChtU29ja2V0U3RhdGUgPT0gU29ja2V0U3RhdGUuQ0xPU0VEKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInNvY2tldCBjbG9zZWQiKTsKICAgICAgICAgICAgIHJldHVybiB3cml0ZU5hdGl2ZShiLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBtTG9jay5yZWFkTG9jaygpLnVubG9jaygpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQppbmRleCBhNjYwYmQ3Li5hZWNlYzY2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQpAQCAtMTU0NSw2ICsxNTQ1LDggQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFID0gIm5ldHdvcmtfbWFuYWdlbWVudCI7CiAKICAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFdPUktfU1RBVFNfU0VSVklDRSA9ICJuZXRzdGF0cyI7CisgICAgLyoqIHtAaGlkZX0gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRXT1JLX1BPTElDWV9TRVJWSUNFID0gIm5ldHBvbGljeSI7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCmluZGV4IDNkNjM3ZTkuLjJmOTYyN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQpAQCAtMTE2MCw2ICsxMTYwLDE1IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1VQR1JBREVfU0VUVVAgPSAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlVQR1JBREVfU0VUVVAiOwogCiAgICAgLyoqCisgICAgICogQWN0aXZpdHkgQWN0aW9uOiBTaG93IHNldHRpbmdzIGZvciBtYW5hZ2luZyBuZXR3b3JrIGRhdGEgdXNhZ2Ugb2YgYQorICAgICAqIHNwZWNpZmljIGFwcGxpY2F0aW9uLiBBcHBsaWNhdGlvbnMgc2hvdWxkIGRlZmluZSBhbiBhY3Rpdml0eSB0aGF0IG9mZmVycworICAgICAqIG9wdGlvbnMgdG8gY29udHJvbCBkYXRhIHVzYWdlLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQUNUSVZJVFlfSU5URU5UX0FDVElPTikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTUFOQUdFX05FVFdPUktfVVNBR0UgPQorICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQU5BR0VfTkVUV09SS19VU0FHRSI7CisKKyAgICAvKioKICAgICAgKiBBIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgI0FDVElPTl9VUEdSQURFX1NFVFVQfSBhY3Rpdml0eQogICAgICAqIGRlc2NyaWJpbmcgdGhlIGxhc3QgcnVuIHZlcnNpb24gb2YgdGhlIHBsYXRmb3JtIHRoYXQgd2FzIHNldHVwLgogICAgICAqIEBoaWRlCkBAIC0xNjU0LDggKzE2NjMsOSBAQAogICAgICAqIFRoaXMgaXMgdXNlZCBtYWlubHkgZm9yIHRoZSBVU0IgU2V0dGluZ3MgcGFuZWwuCiAgICAgICogQXBwcyBzaG91bGQgbGlzdGVuIGZvciBBQ1RJT05fTUVESUFfTU9VTlRFRCBhbmQgQUNUSU9OX01FRElBX1VOTU9VTlRFRCBicm9hZGNhc3RzIHRvIGJlIG5vdGlmaWVkCiAgICAgICogd2hlbiB0aGUgU0QgY2FyZCBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIG9yIHVubW91bnRlZAorICAgICAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIGJ5IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlRXZlbnRMaXN0ZW5lcgogICAgICAqLwotICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuQlJPQURDQVNUX0lOVEVOVF9BQ1RJT04pCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fVU1TX0NPTk5FQ1RFRCA9ICJhbmRyb2lkLmludGVudC5hY3Rpb24uVU1TX0NPTk5FQ1RFRCI7CiAKICAgICAvKioKQEAgLTE2NjMsOCArMTY3Myw5IEBACiAgICAgICogVGhpcyBpcyB1c2VkIG1haW5seSBmb3IgdGhlIFVTQiBTZXR0aW5ncyBwYW5lbC4KICAgICAgKiBBcHBzIHNob3VsZCBsaXN0ZW4gZm9yIEFDVElPTl9NRURJQV9NT1VOVEVEIGFuZCBBQ1RJT05fTUVESUFfVU5NT1VOVEVEIGJyb2FkY2FzdHMgdG8gYmUgbm90aWZpZWQKICAgICAgKiB3aGVuIHRoZSBTRCBjYXJkIGZpbGUgc3lzdGVtIGlzIG1vdW50ZWQgb3IgdW5tb3VudGVkCisgICAgICogQGRlcHJlY2F0ZWQgcmVwbGFjZWQgYnkgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyCiAgICAgICovCi0gICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VTVNfRElTQ09OTkVDVEVEID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5VTVNfRElTQ09OTkVDVEVEIjsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50RmlsdGVyLmphdmEKaW5kZXggMmEwZWJjZi4uZjNiMWQ5NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnRGaWx0ZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudEZpbHRlci5qYXZhCkBAIC0xNiwxNiArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuY29udGVudDsKIAotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwpAQCAtMzYsNiArMjYsMTUgQEAKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CiAKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKwogLyoqCiAgKiBTdHJ1Y3R1cmVkIGRlc2NyaXB0aW9uIG9mIEludGVudCB2YWx1ZXMgdG8gYmUgbWF0Y2hlZC4gIEFuIEludGVudEZpbHRlciBjYW4KICAqIG1hdGNoIGFnYWluc3QgYWN0aW9ucywgY2F0ZWdvcmllcywgYW5kIGRhdGEgKGVpdGhlciB2aWEgaXRzIHR5cGUsIHNjaGVtZSwKQEAgLTc1NCw3ICs3NTMsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZCBhIG5ldyBJbnRlbnQgZGF0YSBvYXRoIHRvIG1hdGNoIGFnYWluc3QuICBUaGUgZmlsdGVyIG11c3QKKyAgICAgKiBBZGQgYSBuZXcgSW50ZW50IGRhdGEgcGF0aCB0byBtYXRjaCBhZ2FpbnN0LiAgVGhlIGZpbHRlciBtdXN0CiAgICAgICogaW5jbHVkZSBvbmUgb3IgbW9yZSBzY2hlbWVzICh2aWEge0BsaW5rICNhZGREYXRhU2NoZW1lfSkgPGVtPmFuZDwvZW0+CiAgICAgICogb25lIG9yIG1vcmUgYXV0aG9yaXRpZXMgKHZpYSB7QGxpbmsgI2FkZERhdGFBdXRob3JpdHl9KSBmb3IgdGhlCiAgICAgICogcGF0aCB0byBiZSBjb25zaWRlcmVkLiAgSWYgYW55IHBhdGhzIGFyZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQWN0aXZpdHlJbmZvLmphdmEKaW5kZXggNDI4NTM4OC4uNDg1OGYxNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BY3Rpdml0eUluZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FjdGl2aXR5SW5mby5qYXZhCkBAIC0zMzUsMTMgKzMzNSwyNSBAQAogICAgIC8qKgogICAgICAqIEJpdCBpbiB7QGxpbmsgI2NvbmZpZ0NoYW5nZXN9IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGFjdGl2aXR5CiAgICAgICogY2FuIGl0c2VsZiBoYW5kbGUgdGhlIHNjcmVlbiBzaXplLiBTZXQgZnJvbSB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmF0dHIjY29uZmlnQ2hhbmdlc30gYXR0cmlidXRlLgorICAgICAqIHtAbGluayBhbmRyb2lkLlIuYXR0ciNjb25maWdDaGFuZ2VzfSBhdHRyaWJ1dGUuICBUaGlzIHdpbGwgYmUKKyAgICAgKiBzZXQgYnkgZGVmYXVsdCBmb3IgYXBwbGljYXRpb25zIHRoYXQgdGFyZ2V0IGFuIGVhcmxpZXIgdmVyc2lvbgorICAgICAqIHRoYW4ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJfTVIyfS4uLgorICAgICAqIDxiPmhvd2V2ZXI8L2I+LCB5b3Ugd2lsbCBub3Qgc2VlIHRoZSBiaXQgc2V0IGhlcmUgYmVjb21lcyBzb21lCisgICAgICogYXBwbGljYXRpb25zIGluY29ycmVjdGx5IGNvbXBhcmUge0BsaW5rICNjb25maWdDaGFuZ2VzfSBhZ2FpbnN0CisgICAgICogYW4gYWJzb2x1dGUgdmFsdWUgcmF0aGVyIHRoYW4gY29ycmVjdGx5IG1hc2tpbmcgb3V0IHRoZSBiaXRzCisgICAgICogdGhleSBhcmUgaW50ZXJlc3RlZCBpbi4gIFBsZWFzZSBkb24ndCBkbyB0aGF0LCB0aGFua3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX1NDUkVFTl9TSVpFID0gMHgwNDAwOwogICAgIC8qKgogICAgICAqIEJpdCBpbiB7QGxpbmsgI2NvbmZpZ0NoYW5nZXN9IHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGFjdGl2aXR5CiAgICAgICogY2FuIGl0c2VsZiBoYW5kbGUgdGhlIHNtYWxsZXN0IHNjcmVlbiBzaXplLiBTZXQgZnJvbSB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLmF0dHIjY29uZmlnQ2hhbmdlc30gYXR0cmlidXRlLgorICAgICAqIHtAbGluayBhbmRyb2lkLlIuYXR0ciNjb25maWdDaGFuZ2VzfSBhdHRyaWJ1dGUuICBUaGlzIHdpbGwgYmUKKyAgICAgKiBzZXQgYnkgZGVmYXVsdCBmb3IgYXBwbGljYXRpb25zIHRoYXQgdGFyZ2V0IGFuIGVhcmxpZXIgdmVyc2lvbgorICAgICAqIHRoYW4ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJfTVIyfS4uLgorICAgICAqIDxiPmhvd2V2ZXI8L2I+LCB5b3Ugd2lsbCBub3Qgc2VlIHRoZSBiaXQgc2V0IGhlcmUgYmVjb21lcyBzb21lCisgICAgICogYXBwbGljYXRpb25zIGluY29ycmVjdGx5IGNvbXBhcmUge0BsaW5rICNjb25maWdDaGFuZ2VzfSBhZ2FpbnN0CisgICAgICogYW4gYWJzb2x1dGUgdmFsdWUgcmF0aGVyIHRoYW4gY29ycmVjdGx5IG1hc2tpbmcgb3V0IHRoZSBiaXRzCisgICAgICogdGhleSBhcmUgaW50ZXJlc3RlZCBpbi4gIFBsZWFzZSBkb24ndCBkbyB0aGF0LCB0aGFua3MuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklHX1NNQUxMRVNUX1NDUkVFTl9TSVpFID0gMHgwODAwOwogICAgIC8qKgpAQCAtMzg2LDYgKzM5OCwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICogVW5mb3J0dW5hdGVseSBzb21lIGRldmVsb3BlcnMgKE9wZW5GZWludCBJIGFtIGxvb2tpbmcgYXQgeW91KSBoYXZlCisgICAgICogY29tcGFyZWQgdGhlIGNvbmZpZ0NoYW5nZXMgYml0IGZpZWxkIGFnYWluc3QgYWJzb2x1dGUgdmFsdWVzLCBzbyBpZiB3ZQorICAgICAqIGludHJvZHVjZSBhIG5ldyBiaXQgdGhleSBicmVhay4gIFRvIGRlYWwgd2l0aCB0aGF0LCB3ZSB3aWxsIG1ha2Ugc3VyZQorICAgICAqIHRoZSBwdWJsaWMgZmllbGQgd2lsbCBub3QgaGF2ZSBhIHZhbHVlIHRoYXQgYnJlYWtzIHRoZW0sIGFuZCBsZXQgdGhlCisgICAgICogZnJhbWV3b3JrIGNhbGwgaGVyZSB0byBnZXQgdGhlIHJlYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWFsQ29uZmlnQ2hhbmdlZCgpIHsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uIDwgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTLkhPTkVZQ09NQl9NUjIKKyAgICAgICAgICAgICAgICA/IChjb25maWdDaGFuZ2VzIHwgQWN0aXZpdHlJbmZvLkNPTkZJR19TQ1JFRU5fU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgfCBBY3Rpdml0eUluZm8uQ09ORklHX1NNQUxMRVNUX1NDUkVFTl9TSVpFKQorICAgICAgICAgICAgICAgIDogY29uZmlnQ2hhbmdlczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBCaXQgbWFzayBvZiBraW5kcyBvZiBjb25maWd1cmF0aW9uIGNoYW5nZXMgdGhhdCB0aGlzIGFjdGl2aXR5CiAgICAgICogY2FuIGhhbmRsZSBpdHNlbGYgKHdpdGhvdXQgYmVpbmcgcmVzdGFydGVkIGJ5IHRoZSBzeXN0ZW0pLgogICAgICAqIENvbnRhaW5zIGFueSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI0NPTkZJR19GT05UX1NDQUxFfSwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL0FwcGxpY2F0aW9uSW5mby5qYXZhCmluZGV4IDRiMzhkNDguLjQ1NGNiMzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9BcHBsaWNhdGlvbkluZm8uamF2YQpAQCAtMzMwLDYgKzMzMCwzMCBAQAogICAgIHB1YmxpYyBpbnQgZmxhZ3MgPSAwOwogICAgIAogICAgIC8qKgorICAgICAqIFRoZSByZXF1aXJlZCBzbWFsbGVzdCBzY3JlZW4gd2lkdGggdGhlIGFwcGxpY2F0aW9uIGNhbiBydW4gb24uICBJZiAwLAorICAgICAqIG5vdGhpbmcgaGFzIGJlZW4gc3BlY2lmaWVkLiAgQ29tZXMgZnJvbQorICAgICAqIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0FuZHJvaWRNYW5pZmVzdFN1cHBvcnRzU2NyZWVuc19yZXF1aXJlc1NtYWxsZXN0V2lkdGhEcAorICAgICAqIGFuZHJvaWQ6cmVxdWlyZXNTbWFsbGVzdFdpZHRoRHB9IGF0dHJpYnV0ZSBvZiB0aGUgJmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7IHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlcXVpcmVzU21hbGxlc3RXaWR0aERwID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHNtYWxsZXN0IHNjcmVlbiB3aWR0aCB0aGUgYXBwbGljYXRpb24gaXMgZGVzaWduZWQgZm9yLiAgSWYgMCwKKyAgICAgKiBub3RoaW5nIGhhcyBiZWVuIHNwZWNpZmllZC4gIENvbWVzIGZyb20KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNBbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfY29tcGF0aWJsZVdpZHRoTGltaXREcAorICAgICAqIGFuZHJvaWQ6Y29tcGF0aWJsZVdpZHRoTGltaXREcH0gYXR0cmlidXRlIG9mIHRoZSAmbHQ7c3VwcG9ydHMtc2NyZWVucyZndDsgdGFnLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGF0aWJsZVdpZHRoTGltaXREcCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBzbWFsbGVzdCBzY3JlZW4gd2lkdGggdGhlIGFwcGxpY2F0aW9uIHdpbGwgd29yayBvbi4gIElmIDAsCisgICAgICogbm90aGluZyBoYXMgYmVlbiBzcGVjaWZpZWQuICBDb21lcyBmcm9tCisgICAgICoge0BsaW5rIGFuZHJvaWQuUi5zdHlsZWFibGUjQW5kcm9pZE1hbmlmZXN0U3VwcG9ydHNTY3JlZW5zX2xhcmdlc3RXaWR0aExpbWl0RHAKKyAgICAgKiBhbmRyb2lkOmxhcmdlc3RXaWR0aExpbWl0RHB9IGF0dHJpYnV0ZSBvZiB0aGUgJmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7IHRhZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGxhcmdlc3RXaWR0aExpbWl0RHAgPSAwOworCisgICAgLyoqCiAgICAgICogRnVsbCBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGlzIHBhY2thZ2UuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBzb3VyY2VEaXI7CkBAIC0zOTMsNiArNDE3LDEyIEBACiAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CiAKICAgICAvKioKKyAgICAgKiBGb3IgY29udmVuaWVudCBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgZW5hYmxlZCBzZXR0aW5nIG9mIHRoaXMgYXBwLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBlbmFibGVkU2V0dGluZyA9IFBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RFRkFVTFQ7CisKKyAgICAvKioKICAgICAgKiBGb3IgY29udmVuaWVudCBhY2Nlc3MgdG8gcGFja2FnZSdzIGluc3RhbGwgbG9jYXRpb24uCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTQxMCw2ICs0NDAsOSBAQAogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJ0YXNrQWZmaW5pdHk9IiArIHRhc2tBZmZpbml0eSk7CiAgICAgICAgIHB3LnByaW50bG4ocHJlZml4ICsgInVpZD0iICsgdWlkICsgIiBmbGFncz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKQogICAgICAgICAgICAgICAgICsgIiB0aGVtZT0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHRoZW1lKSk7CisgICAgICAgIHB3LnByaW50bG4ocHJlZml4ICsgInJlcXVpcmVzU21hbGxlc3RXaWR0aERwPSIgKyByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcAorICAgICAgICAgICAgICAgICsgIiBjb21wYXRpYmxlV2lkdGhMaW1pdERwPSIgKyBjb21wYXRpYmxlV2lkdGhMaW1pdERwCisgICAgICAgICAgICAgICAgKyAiIGxhcmdlc3RXaWR0aExpbWl0RHA9IiArIGxhcmdlc3RXaWR0aExpbWl0RHApOwogICAgICAgICBwdy5wcmludGxuKHByZWZpeCArICJzb3VyY2VEaXI9IiArIHNvdXJjZURpcik7CiAgICAgICAgIGlmIChzb3VyY2VEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHB1YmxpY1NvdXJjZURpciAhPSBudWxsKSB7CkBAIC00NjksNiArNTAyLDkgQEAKICAgICAgICAgY2xhc3NOYW1lID0gb3JpZy5jbGFzc05hbWU7CiAgICAgICAgIHRoZW1lID0gb3JpZy50aGVtZTsKICAgICAgICAgZmxhZ3MgPSBvcmlnLmZsYWdzOworICAgICAgICByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA9IG9yaWcucmVxdWlyZXNTbWFsbGVzdFdpZHRoRHA7CisgICAgICAgIGNvbXBhdGlibGVXaWR0aExpbWl0RHAgPSBvcmlnLmNvbXBhdGlibGVXaWR0aExpbWl0RHA7CisgICAgICAgIGxhcmdlc3RXaWR0aExpbWl0RHAgPSBvcmlnLmxhcmdlc3RXaWR0aExpbWl0RHA7CiAgICAgICAgIHNvdXJjZURpciA9IG9yaWcuc291cmNlRGlyOwogICAgICAgICBwdWJsaWNTb3VyY2VEaXIgPSBvcmlnLnB1YmxpY1NvdXJjZURpcjsKICAgICAgICAgbmF0aXZlTGlicmFyeURpciA9IG9yaWcubmF0aXZlTGlicmFyeURpcjsKQEAgLTQ3OCw2ICs1MTQsNyBAQAogICAgICAgICB1aWQgPSBvcmlnLnVpZDsKICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiA9IG9yaWcudGFyZ2V0U2RrVmVyc2lvbjsKICAgICAgICAgZW5hYmxlZCA9IG9yaWcuZW5hYmxlZDsKKyAgICAgICAgZW5hYmxlZFNldHRpbmcgPSBvcmlnLmVuYWJsZWRTZXR0aW5nOwogICAgICAgICBpbnN0YWxsTG9jYXRpb24gPSBvcmlnLmluc3RhbGxMb2NhdGlvbjsKICAgICAgICAgbWFuYWdlU3BhY2VBY3Rpdml0eU5hbWUgPSBvcmlnLm1hbmFnZVNwYWNlQWN0aXZpdHlOYW1lOwogICAgICAgICBkZXNjcmlwdGlvblJlcyA9IG9yaWcuZGVzY3JpcHRpb25SZXM7CkBAIC01MDIsNiArNTM5LDkgQEAKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhjbGFzc05hbWUpOwogICAgICAgICBkZXN0LndyaXRlSW50KHRoZW1lKTsKICAgICAgICAgZGVzdC53cml0ZUludChmbGFncyk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQocmVxdWlyZXNTbWFsbGVzdFdpZHRoRHApOworICAgICAgICBkZXN0LndyaXRlSW50KGNvbXBhdGlibGVXaWR0aExpbWl0RHApOworICAgICAgICBkZXN0LndyaXRlSW50KGxhcmdlc3RXaWR0aExpbWl0RHApOwogICAgICAgICBkZXN0LndyaXRlU3RyaW5nKHNvdXJjZURpcik7CiAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcocHVibGljU291cmNlRGlyKTsKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhuYXRpdmVMaWJyYXJ5RGlyKTsKQEAgLTUxMSw2ICs1NTEsNyBAQAogICAgICAgICBkZXN0LndyaXRlSW50KHVpZCk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQodGFyZ2V0U2RrVmVyc2lvbik7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQoZW5hYmxlZCA/IDEgOiAwKTsKKyAgICAgICAgZGVzdC53cml0ZUludChlbmFibGVkU2V0dGluZyk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQoaW5zdGFsbExvY2F0aW9uKTsKICAgICAgICAgZGVzdC53cml0ZVN0cmluZyhtYW5hZ2VTcGFjZUFjdGl2aXR5TmFtZSk7CiAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcoYmFja3VwQWdlbnROYW1lKTsKQEAgLTUzNiw2ICs1NzcsOSBAQAogICAgICAgICBjbGFzc05hbWUgPSBzb3VyY2UucmVhZFN0cmluZygpOwogICAgICAgICB0aGVtZSA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIGZsYWdzID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgcmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAgPSBzb3VyY2UucmVhZEludCgpOworICAgICAgICBjb21wYXRpYmxlV2lkdGhMaW1pdERwID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgbGFyZ2VzdFdpZHRoTGltaXREcCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIHNvdXJjZURpciA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIHB1YmxpY1NvdXJjZURpciA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIG5hdGl2ZUxpYnJhcnlEaXIgPSBzb3VyY2UucmVhZFN0cmluZygpOwpAQCAtNTQ1LDYgKzU4OSw3IEBACiAgICAgICAgIHVpZCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIHRhcmdldFNka1ZlcnNpb24gPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICBlbmFibGVkID0gc291cmNlLnJlYWRJbnQoKSAhPSAwOworICAgICAgICBlbmFibGVkU2V0dGluZyA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIGluc3RhbGxMb2NhdGlvbiA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIG1hbmFnZVNwYWNlQWN0aXZpdHlOYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKICAgICAgICAgYmFja3VwQWdlbnROYW1lID0gc291cmNlLnJlYWRTdHJpbmcoKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcG0vUGFja2FnZU1hbmFnZXIuamF2YQppbmRleCBmZjgxN2MxLi5kZDY4NGNkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VNYW5hZ2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5qYXZhCkBAIC0yMjQsMTEgKzIyNCw0MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJR05BVFVSRV9VTktOT1dOX1BBQ0tBR0UgPSAtNDsKIAorICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHtAbGluayAjc2V0QXBwbGljYXRpb25FbmFibGVkU2V0dGluZyhTdHJpbmcsIGludCwgaW50KX0KKyAgICAgKiBhbmQge0BsaW5rICNzZXRDb21wb25lbnRFbmFibGVkU2V0dGluZyhDb21wb25lbnROYW1lLCBpbnQsIGludCl9OiBUaGlzCisgICAgICogY29tcG9uZW50IG9yIGFwcGxpY2F0aW9uIGlzIGluIGl0cyBkZWZhdWx0IGVuYWJsZWQgc3RhdGUgKGFzIHNwZWNpZmllZAorICAgICAqIGluIGl0cyBtYW5pZmVzdCkuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfREVGQVVMVCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB7QGxpbmsgI3NldEFwcGxpY2F0aW9uRW5hYmxlZFNldHRpbmcoU3RyaW5nLCBpbnQsIGludCl9CisgICAgICogYW5kIHtAbGluayAjc2V0Q29tcG9uZW50RW5hYmxlZFNldHRpbmcoQ29tcG9uZW50TmFtZSwgaW50LCBpbnQpfTogVGhpcworICAgICAqIGNvbXBvbmVudCBvciBhcHBsaWNhdGlvbiBoYXMgYmVlbiBleHBsaWN0aWx5IGVuYWJsZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgICAgKiB3aGF0IGl0IGhhcyBzcGVjaWZpZWQgaW4gaXRzIG1hbmlmZXN0LgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0VOQUJMRUQgPSAxOworCisgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNzZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKFN0cmluZywgaW50LCBpbnQpfQorICAgICAqIGFuZCB7QGxpbmsgI3NldENvbXBvbmVudEVuYWJsZWRTZXR0aW5nKENvbXBvbmVudE5hbWUsIGludCwgaW50KX06IFRoaXMKKyAgICAgKiBjb21wb25lbnQgb3IgYXBwbGljYXRpb24gaGFzIGJlZW4gZXhwbGljaXRseSBkaXNhYmxlZCwgcmVnYXJkbGVzcyBvZgorICAgICAqIHdoYXQgaXQgaGFzIHNwZWNpZmllZCBpbiBpdHMgbWFuaWZlc3QuCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRUQgPSAyOwogCiAgICAgLyoqCisgICAgICogRmxhZyBmb3Ige0BsaW5rICNzZXRBcHBsaWNhdGlvbkVuYWJsZWRTZXR0aW5nKFN0cmluZywgaW50LCBpbnQpfSBvbmx5OiBUaGUKKyAgICAgKiB1c2VyIGhhcyBleHBsaWNpdGx5IGRpc2FibGVkIHRoZSBhcHBsaWNhdGlvbiwgcmVnYXJkbGVzcyBvZiB3aGF0IGl0IGhhcworICAgICAqIHNwZWNpZmllZCBpbiBpdHMgbWFuaWZlc3QuICBCZWNhdXNlIHRoaXMgaXMgZHVlIHRvIHRoZSB1c2VyJ3MgcmVxdWVzdCwKKyAgICAgKiB0aGV5IG1heSByZS1lbmFibGUgaXQgaWYgZGVzaXJlZCB0aHJvdWdoIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0gVUkuICBUaGlzCisgICAgICogb3B0aW9uIGN1cnJlbnRseSA8c3Ryb25nPmNhbiBub3Q8L3N0cm9uZz4gYmUgdXNlZCB3aXRoCisgICAgICoge0BsaW5rICNzZXRDb21wb25lbnRFbmFibGVkU2V0dGluZyhDb21wb25lbnROYW1lLCBpbnQsIGludCl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVEX1VTRVIgPSAzOworCisgICAgLyoqCiAgICAgICogRmxhZyBwYXJhbWV0ZXIgZm9yIHtAbGluayAjaW5zdGFsbFBhY2thZ2UoYW5kcm9pZC5uZXQuVXJpLCBJUGFja2FnZUluc3RhbGxPYnNlcnZlciwgaW50KX0gdG8KICAgICAgKiBpbmRpY2F0ZSB0aGF0IHRoaXMgcGFja2FnZSBzaG91bGQgYmUgaW5zdGFsbGVkIGFzIGZvcndhcmQgbG9ja2VkLCBpLmUuIG9ubHkgdGhlIGFwcCBpdHNlbGYKICAgICAgKiBzaG91bGQgaGF2ZSBhY2Nlc3MgdG8gaXRzIGNvZGUgYW5kIG5vbi1yZXNvdXJjZSBhc3NldHMuCkBAIC04OTMsNiArOTIzLDU4IEBACiAKICAgICAvKioKICAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKKyAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSB0b3VjaCBzY3JlZW4sIGJ1dAorICAgICAqIGRvZXMgc3VwcG9ydCB0b3VjaCBlbXVsYXRpb24gZm9yIGJhc2ljIGV2ZW50cyB0aGF0IHN1cHBvcnRzIGRpc3RpbmN0CisgICAgICogdHJhY2tpbmcgb2YgdHdvIG9yIG1vcmUgZmluZ2Vycy4gIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mCisgICAgICoge0BsaW5rICNGRUFUVVJFX0ZBS0VUT1VDSH0gZm9yIGlucHV0IGRldmljZXMgd2l0aCB0aGlzIGNhcGFiaWxpdHkuICBOb3RlCisgICAgICogdGhhdCB1bmxpa2UgYSBkaXN0aW5jdCBtdWx0aXRvdWNoIHNjcmVlbiBhcyBkZWZpbmVkIGJ5CisgICAgICoge0BsaW5rICNGRUFUVVJFX1RPVUNIU0NSRUVOX01VTFRJVE9VQ0hfRElTVElOQ1R9LCB0aGVzZSBraW5kcyBvZiBpbnB1dAorICAgICAqIGRldmljZXMgd2lsbCBub3QgYWN0dWFsbHkgcHJvdmlkZSBmdWxsIHR3by1maW5nZXIgZ2VzdHVyZXMgc2luY2UgdGhlCisgICAgICogaW5wdXQgaXMgYmVpbmcgdHJhbnNmb3JtZWQgdG8gY3Vyc29yIG1vdmVtZW50IG9uIHRoZSBzY3JlZW4uICBUaGF0IGlzLAorICAgICAqIHNpbmdsZSBmaW5nZXIgZ2VzdHVyZXMgd2lsbCBtb3ZlIGEgY3Vyc29yOyB0d28tZmluZ2VyIHN3aXBlcyB3aWxsCisgICAgICogcmVzdWx0IGluIHNpbmdsZS1maW5nZXIgdG91Y2ggZXZlbnRzOyBvdGhlciB0d28tZmluZ2VyIGdlc3R1cmVzIHdpbGwKKyAgICAgKiByZXN1bHQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdHdvLWZpbmdlciB0b3VjaCBldmVudC4KKyAgICAgKi8KKyAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkZFQVRVUkUpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9GQUtFVE9VQ0hfTVVMVElUT1VDSF9ESVNUSU5DVCA9ICJhbmRyb2lkLmhhcmR3YXJlLmZha2V0b3VjaC5tdWx0aXRvdWNoLmRpc3RpbmN0IjsKKworICAgIC8qKgorICAgICAqIEZlYXR1cmUgZm9yIHtAbGluayAjZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXN9IGFuZAorICAgICAqIHtAbGluayAjaGFzU3lzdGVtRmVhdHVyZX06IFRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIHRvdWNoIHNjcmVlbiwgYnV0CisgICAgICogZG9lcyBzdXBwb3J0IHRvdWNoIGVtdWxhdGlvbiBmb3IgYmFzaWMgZXZlbnRzIHRoYXQgc3VwcG9ydHMgdHJhY2tpbmcKKyAgICAgKiBhIGhhbmQgb2YgZmluZ2VycyAoNSBvciBtb3JlIGZpbmdlcnMpIGZ1bGx5IGluZGVwZW5kZW50bHkuCisgICAgICogVGhpcyBpcyBhbiBleHRlbnNpb24gb2YKKyAgICAgKiB7QGxpbmsgI0ZFQVRVUkVfRkFLRVRPVUNIfSBmb3IgaW5wdXQgZGV2aWNlcyB3aXRoIHRoaXMgY2FwYWJpbGl0eS4gIE5vdGUKKyAgICAgKiB0aGF0IHVubGlrZSBhIG11bHRpdG91Y2ggc2NyZWVuIGFzIGRlZmluZWQgYnkKKyAgICAgKiB7QGxpbmsgI0ZFQVRVUkVfVE9VQ0hTQ1JFRU5fTVVMVElUT1VDSF9KQVpaSEFORH0sIG5vdCBhbGwgdHdvIGZpbmdlcgorICAgICAqIGdlc3R1cmVzIGNhbiBiZSBkZXRlY3RlZCBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIGRlc2NyaWJlZCBmb3IKKyAgICAgKiB7QGxpbmsgI0ZFQVRVUkVfRkFLRVRPVUNIX01VTFRJVE9VQ0hfRElTVElOQ1R9LgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuRkVBVFVSRSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0ZBS0VUT1VDSF9NVUxUSVRPVUNIX0pBWlpIQU5EID0gImFuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guamF6emhhbmQiOworCisgICAgLyoqCisgICAgICogRmVhdHVyZSBmb3Ige0BsaW5rICNnZXRTeXN0ZW1BdmFpbGFibGVGZWF0dXJlc30gYW5kCisgICAgICoge0BsaW5rICNoYXNTeXN0ZW1GZWF0dXJlfTogVGhlIGRldmljZSBzdXBwb3J0cyBwb3J0cmFpdCBvcmllbnRhdGlvbgorICAgICAqIHNjcmVlbnMuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHlvdSBjYW4gYXNzdW1lIHRoYXQgaWYgbmVpdGhlcgorICAgICAqIHRoaXMgbm9yIHtAbGluayAjRkVBVFVSRV9TQ1JFRU5fTEFORFNDQVBFfSBpcyBzZXQgdGhlbiB0aGUgZGV2aWNlIHN1cHBvcnRzCisgICAgICogYm90aCBwb3J0cmFpdCBhbmQgbGFuZHNjYXBlLgorICAgICAqLworICAgIEBTZGtDb25zdGFudChTZGtDb25zdGFudFR5cGUuRkVBVFVSRSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1NDUkVFTl9QT1JUUkFJVCA9ICJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5wb3J0cmFpdCI7CisKKyAgICAvKioKKyAgICAgKiBGZWF0dXJlIGZvciB7QGxpbmsgI2dldFN5c3RlbUF2YWlsYWJsZUZlYXR1cmVzfSBhbmQKKyAgICAgKiB7QGxpbmsgI2hhc1N5c3RlbUZlYXR1cmV9OiBUaGUgZGV2aWNlIHN1cHBvcnRzIGxhbmRzY2FwZSBvcmllbnRhdGlvbgorICAgICAqIHNjcmVlbnMuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHlvdSBjYW4gYXNzdW1lIHRoYXQgaWYgbmVpdGhlcgorICAgICAqIHRoaXMgbm9yIHtAbGluayAjRkVBVFVSRV9TQ1JFRU5fUE9SVFJBSVR9IGlzIHNldCB0aGVuIHRoZSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiBib3RoIHBvcnRyYWl0IGFuZCBsYW5kc2NhcGUuCisgICAgICovCisgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5GRUFUVVJFKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfU0NSRUVOX0xBTkRTQ0FQRSA9ICJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5sYW5kc2NhcGUiOworCisgICAgLyoqCisgICAgICogRmVhdHVyZSBmb3Ige0BsaW5rICNnZXRTeXN0ZW1BdmFpbGFibGVGZWF0dXJlc30gYW5kCiAgICAgICoge0BsaW5rICNoYXNTeXN0ZW1GZWF0dXJlfTogVGhlIGRldmljZSBzdXBwb3J0cyBsaXZlIHdhbGxwYXBlcnMuCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5GRUFUVVJFKQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlUGFyc2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQppbmRleCA5ZmYzMjRiLi5lOTI3ZjZjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3BtL1BhY2thZ2VQYXJzZXIuamF2YQpAQCAtOTkzLDYgKzk5MywxNiBAQAogICAgICAgICAgICAgICAgIHNhID0gcmVzLm9idGFpbkF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnMpOwogCisgICAgICAgICAgICAgICAgcGtnLmFwcGxpY2F0aW9uSW5mby5yZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA9IHNhLmdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5BbmRyb2lkTWFuaWZlc3RTdXBwb3J0c1NjcmVlbnNfcmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICBwa2cuYXBwbGljYXRpb25JbmZvLmNvbXBhdGlibGVXaWR0aExpbWl0RHAgPSBzYS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U3VwcG9ydHNTY3JlZW5zX2NvbXBhdGlibGVXaWR0aExpbWl0RHAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICBwa2cuYXBwbGljYXRpb25JbmZvLmxhcmdlc3RXaWR0aExpbWl0RHAgPSBzYS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0U3VwcG9ydHNTY3JlZW5zX2xhcmdlc3RXaWR0aExpbWl0RHAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKwogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB0cmljayB0byBnZXQgYSBib29sZWFuIGFuZCBzdGlsbCBhYmxlIHRvIGRldGVjdAogICAgICAgICAgICAgICAgIC8vIGlmIGEgdmFsdWUgd2FzIGFjdHVhbGx5IHNldC4KICAgICAgICAgICAgICAgICBzdXBwb3J0c1NtYWxsU2NyZWVucyA9IHNhLmdldEludGVnZXIoCkBAIC0xNTA3LDExICsxNTE3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBmdWxsQmFja3VwQWdlbnQgaXMgZXhwbGljaXRseSBoYW5kbGVkIGV2ZW4gaWYgYWxsb3dCYWNrdXAgaXMgZmFsc2UKICAgICAgICAgbmFtZSA9IHNhLmdldE5vbkNvbmZpZ3VyYXRpb25TdHJpbmcoCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQW5kcm9pZE1hbmlmZXN0QXBwbGljYXRpb25fZnVsbEJhY2t1cEFnZW50LCAwKTsKICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgYWkuZnVsbEJhY2t1cEFnZW50TmFtZSA9IGJ1aWxkQ2xhc3NOYW1lKHBrZ05hbWUsIG5hbWUsIG91dEVycm9yKTsKLSAgICAgICAgICAgIGlmICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoZmFsc2UpIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJhbmRyb2lkOmZ1bGxCYWNrdXBBZ2VudD0iICsgYWkuZnVsbEJhY2t1cEFnZW50TmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZyb20gIiArIHBrZ05hbWUgKyAiKyIgKyBuYW1lKTsKICAgICAgICAgICAgIH0KQEAgLTE5NDEsMTEgKzE5NTIsNiBAQAogICAgICAgICAgICAgYS5pbmZvLmNvbmZpZ0NoYW5nZXMgPSBzYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X2NvbmZpZ0NoYW5nZXMsCiAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgaWYgKG93bmVyLmFwcGxpY2F0aW9uSW5mby50YXJnZXRTZGtWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8IGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUy5IT05FWUNPTUJfTVIyKSB7Ci0gICAgICAgICAgICAgICAgYS5pbmZvLmNvbmZpZ0NoYW5nZXMgfD0gQWN0aXZpdHlJbmZvLkNPTkZJR19TQ1JFRU5fU0laRQotICAgICAgICAgICAgICAgICAgICAgICAgfCBBY3Rpdml0eUluZm8uQ09ORklHX1NNQUxMRVNUX1NDUkVFTl9TSVpFOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgYS5pbmZvLnNvZnRJbnB1dE1vZGUgPSBzYS5nZXRJbnQoCiAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkFuZHJvaWRNYW5pZmVzdEFjdGl2aXR5X3dpbmRvd1NvZnRJbnB1dE1vZGUsCiAgICAgICAgICAgICAgICAgICAgIDApOwpAQCAtMzEyMiw5ICszMTI4LDExIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHAubVNldEVuYWJsZWQgPT0gUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRU5BQkxFRCkgewogICAgICAgICAgICAgYWkuZW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocC5tU2V0RW5hYmxlZCA9PSBQYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRCkgeworICAgICAgICB9IGVsc2UgaWYgKHAubVNldEVuYWJsZWQgPT0gUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRUQKKyAgICAgICAgICAgICAgICB8fCBwLm1TZXRFbmFibGVkID09IFBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVEX1VTRVIpIHsKICAgICAgICAgICAgIGFpLmVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBhaS5lbmFibGVkU2V0dGluZyA9IHAubVNldEVuYWJsZWQ7CiAgICAgICAgIHJldHVybiBhaTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTNkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5haWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwYWNrYWdlIGFuZHJvaWQuY29udGVudC5yZXM7CisKK3BhcmNlbGFibGUgQ29tcGF0aWJpbGl0eUluZm87CisKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5qYXZhCmluZGV4IDg1NGQ0MTAuLmFjZjJmMmYxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db21wYXRpYmlsaXR5SW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbXBhdGliaWxpdHlJbmZvLmphdmEKQEAgLTYzLDM3ICs2MywxOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FMSU5HX1JFUVVJUkVEID0gMTsgCiAKICAgICAvKioKLSAgICAgKiBIYXMgdGhlIGFwcGxpY2F0aW9uIHNhaWQgdGhhdCBpdHMgVUkgaXMgZXhwYW5kYWJsZT8gIEJhc2VkIG9uIHRoZQotICAgICAqIDxzdXBwb3J0cy1zY3JlZW4+IGFuZHJvaWQ6ZXhwYW5kaWJsZSBpbiB0aGUgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUEFOREFCTEUgPSAyOwotICAgIAotICAgIC8qKgotICAgICAqIEhhcyB0aGUgYXBwbGljYXRpb24gc2FpZCB0aGF0IGl0cyBVSSBzdXBwb3J0cyBsYXJnZSBzY3JlZW5zPyAgQmFzZWQgb24gdGhlCi0gICAgICogPHN1cHBvcnRzLXNjcmVlbj4gYW5kcm9pZDpsYXJnZVNjcmVlbnMgaW4gdGhlIG1hbmlmZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVJHRV9TQ1JFRU5TID0gODsKLSAgICAKLSAgICAvKioKLSAgICAgKiBIYXMgdGhlIGFwcGxpY2F0aW9uIHNhaWQgdGhhdCBpdHMgVUkgc3VwcG9ydHMgeGxhcmdlIHNjcmVlbnM/ICBCYXNlZCBvbiB0aGUKLSAgICAgKiA8c3VwcG9ydHMtc2NyZWVuPiBhbmRyb2lkOnhsYXJnZVNjcmVlbnMgaW4gdGhlIG1hbmlmZXN0LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBYTEFSR0VfU0NSRUVOUyA9IDMyOwotICAgIAotICAgIC8qKgogICAgICAqIEFwcGxpY2F0aW9uIG11c3QgYWx3YXlzIHJ1biBpbiBjb21wYXRpYmlsaXR5IG1vZGU/CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFMV0FZU19DT01QQVQgPSA2NDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxXQVlTX05FRURTX0NPTVBBVCA9IDI7CiAKICAgICAvKioKICAgICAgKiBBcHBsaWNhdGlvbiBuZXZlciBzaG91bGQgcnVuIGluIGNvbXBhdGliaWxpdHkgbW9kZT8KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVJfQ09NUEFUID0gMTI4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORVZFUl9ORUVEU19DT01QQVQgPSA0OwogCiAgICAgLyoqCiAgICAgICogU2V0IGlmIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byBydW4gaW4gc2NyZWVuIHNpemUgY29tcGF0aWJpbGl0eSBtb2RlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORUVEU19TQ1JFRU5fQ09NUEFUID0gMjU2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORUVEU19TQ1JFRU5fQ09NUEFUID0gODsKIAogICAgIC8qKgogICAgICAqIFRoZSBlZmZlY3RpdmUgc2NyZWVuIGRlbnNpdHkgd2UgaGF2ZSBzZWxlY3RlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KQEAgLTExMCw3NyArOTIsMTUwIEBACiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIGZsb2F0IGFwcGxpY2F0aW9uSW52ZXJ0ZWRTY2FsZTsKIAotICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyhBcHBsaWNhdGlvbkluZm8gYXBwSW5mbywgaW50IHNjcmVlbkxheW91dCwgYm9vbGVhbiBmb3JjZUNvbXBhdCkgeworICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyhBcHBsaWNhdGlvbkluZm8gYXBwSW5mbywgaW50IHNjcmVlbkxheW91dCwgaW50IHN3LAorICAgICAgICAgICAgYm9vbGVhbiBmb3JjZUNvbXBhdCkgewogICAgICAgICBpbnQgY29tcGF0RmxhZ3MgPSAwOwogCi0gICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NVUFBPUlRTX0xBUkdFX1NDUkVFTlMpICE9IDApIHsKLSAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IExBUkdFX1NDUkVFTlM7Ci0gICAgICAgICAgICBpZiAoIWZvcmNlQ29tcGF0KSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlbid0IGZvcmNpbmcgdGhlIGFwcCBpbnRvIGNvbXBhdGliaWxpdHkgbW9kZSwgdGhlbgotICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBpZiBpdCBzdXBwb3J0cyBsYXJnZSBzY3JlZW5zIHRoYXQgd2Ugc2hvdWxkIGFsbG93IGl0Ci0gICAgICAgICAgICAgICAgLy8gdG8gdXNlIHRoZSBmdWxsIHNwYWNlIG9mIGFuIHhsYXJnZSBzY3JlZW4gYXMgd2VsbC4KLSAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBYTEFSR0VfU0NSRUVOUyB8IEVYUEFOREFCTEU7CisgICAgICAgIGlmIChhcHBJbmZvLnJlcXVpcmVzU21hbGxlc3RXaWR0aERwICE9IDAgfHwgYXBwSW5mby5jb21wYXRpYmxlV2lkdGhMaW1pdERwICE9IDAKKyAgICAgICAgICAgICAgICB8fCBhcHBJbmZvLmxhcmdlc3RXaWR0aExpbWl0RHAgIT0gMCkgeworICAgICAgICAgICAgLy8gTmV3IHN0eWxlIHNjcmVlbiByZXF1aXJlbWVudHMgc3BlYy4KKyAgICAgICAgICAgIGludCByZXF1aXJlZCA9IGFwcEluZm8ucmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAgIT0gMAorICAgICAgICAgICAgICAgICAgICA/IGFwcEluZm8ucmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAKKyAgICAgICAgICAgICAgICAgICAgOiBhcHBJbmZvLmNvbXBhdGlibGVXaWR0aExpbWl0RHA7CisgICAgICAgICAgICBpZiAocmVxdWlyZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gYXBwSW5mby5sYXJnZXN0V2lkdGhMaW1pdERwOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NVUFBPUlRTX1hMQVJHRV9TQ1JFRU5TKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb21wYXRGbGFncyB8PSBYTEFSR0VfU0NSRUVOUyB8IEVYUEFOREFCTEU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfUkVTSVpFQUJMRV9GT1JfU0NSRUVOUykgIT0gMCkgewotICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gRVhQQU5EQUJMRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3JjZUNvbXBhdCkgewotICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGZvcmNpbmcgY29tcGF0aWJpbGl0eSBtb2RlLCB0aGVuIGlnbm9yZSBhbiBhcHAgdGhhdAotICAgICAgICAgICAgLy8ganVzdCBzYXlzIGl0IGlzIHJlc2l6YWJsZSBmb3Igc2NyZWVucy4gIFdlJ2xsIG9ubHkgaGF2ZSBpdCBmaWxsCi0gICAgICAgICAgICAvLyB0aGUgc2NyZWVuIGlmIGl0IGV4cGxpY2l0bHkgc2F5cyBpdCBzdXBwb3J0cyB0aGUgc2NyZWVuIHNpemUgd2UKLSAgICAgICAgICAgIC8vIGFyZSBydW5uaW5nIGluLgotICAgICAgICAgICAgY29tcGF0RmxhZ3MgJj0gfkVYUEFOREFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHN1cHBvcnRzU2NyZWVuID0gZmFsc2U7Ci0gICAgICAgIHN3aXRjaCAoc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgewotICAgICAgICAgICAgY2FzZSBDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX1hMQVJHRToKLSAgICAgICAgICAgICAgICBpZiAoKGNvbXBhdEZsYWdzJlhMQVJHRV9TQ1JFRU5TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzU2NyZWVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfWExBUkdFX1NDUkVFTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVWRVJfQ09NUEFUOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9MQVJHRToKLSAgICAgICAgICAgICAgICBpZiAoKGNvbXBhdEZsYWdzJkxBUkdFX1NDUkVFTlMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNTY3JlZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19MQVJHRV9TQ1JFRU5TKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FVkVSX0NPTVBBVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHNjcmVlbkxheW91dCZDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9DT01QQVRfTkVFREVEKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoKGNvbXBhdEZsYWdzJkVYUEFOREFCTEUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c1NjcmVlbiA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfUkVTSVpFQUJMRV9GT1JfU0NSRUVOUykgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IEFMV0FZU19DT01QQVQ7CisgICAgICAgICAgICBpbnQgY29tcGF0ID0gYXBwSW5mby5jb21wYXRpYmxlV2lkdGhMaW1pdERwICE9IDAKKyAgICAgICAgICAgICAgICAgICAgPyBhcHBJbmZvLmNvbXBhdGlibGVXaWR0aExpbWl0RHAgOiByZXF1aXJlZDsKKyAgICAgICAgICAgIGlmIChjb21wYXQgPCByZXF1aXJlZCkgIHsKKyAgICAgICAgICAgICAgICBjb21wYXQgPSByZXF1aXJlZDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgaW50IGxhcmdlc3QgPSBhcHBJbmZvLmxhcmdlc3RXaWR0aExpbWl0RHA7CiAKLSAgICAgICAgaWYgKHN1cHBvcnRzU2NyZWVuKSB7Ci0gICAgICAgICAgICBjb21wYXRGbGFncyAmPSB+TkVFRFNfU0NSRUVOX0NPTVBBVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FRURTX1NDUkVFTl9DT01QQVQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NVUFBPUlRTX1NDUkVFTl9ERU5TSVRJRVMpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChyZXF1aXJlZCA+IERFRkFVTFRfTk9STUFMX1NIT1JUX0RJTUVOU0lPTikgeworICAgICAgICAgICAgICAgIC8vIEZvciBub3cgLS0gaWYgdGhleSByZXF1aXJlIGEgc2l6ZSBsYXJnZXIgdGhhbiB0aGUgb25seQorICAgICAgICAgICAgICAgIC8vIHNpemUgd2UgY2FuIGRvIGluIGNvbXBhdGliaWxpdHkgbW9kZSwgdGhlbiBkb24ndCBldmVyCisgICAgICAgICAgICAgICAgLy8gYWxsb3cgdGhlIGFwcCB0byBnbyBpbiB0byBjb21wYXQgbW9kZS4gIFRyeWluZyB0byBydW4KKyAgICAgICAgICAgICAgICAvLyBpdCBhdCBhIHNtYWxsZXIgc2l6ZSBpdCBjYW4gaGFuZGxlIHdpbGwgbWFrZSBpdCBmYXIgbW9yZQorICAgICAgICAgICAgICAgIC8vIGJyb2tlbiB0aGFuIHJ1bm5pbmcgYXQgYSBsYXJnZXIgc2l6ZSB0aGFuIGl0IHdhbnRzIG9yCisgICAgICAgICAgICAgICAgLy8gdGhpbmtzIGl0IGNhbiBoYW5kbGUuCisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVWRVJfTkVFRFNfQ09NUEFUOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXJnZXN0ICE9IDAgJiYgc3cgPiBsYXJnZXN0KSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmVlbiBzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBsYXJnZXN0IHNpemUgdGhlCisgICAgICAgICAgICAgICAgLy8gYXBwIHRoaW5rcyBpdCBjYW4gd29yayB3aXRoLCB0aGVuIGFsd2F5cyBmb3JjZSBpdCBpbiB0bworICAgICAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBORUVEU19TQ1JFRU5fQ09NUEFUIHwgQUxXQVlTX05FRURTX0NPTVBBVDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGF0ID49IHN3KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHNjcmVlbiBzaXplIGlzIHNvbWV0aGluZyB0aGUgYXBwIHNheXMgaXQgd2FzIGRlc2lnbmVkCisgICAgICAgICAgICAgICAgLy8gZm9yLCBzbyBuZXZlciBkbyBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVWRVJfTkVFRFNfQ09NUEFUOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JjZUNvbXBhdCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBhcHAgbWF5IHdvcmsgYmV0dGVyIHdpdGggb3Igd2l0aG91dCBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSB1c2VyIGRlY2lkZS4KKyAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBORUVEU19TQ1JFRU5fQ09NUEFUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNb2Rlcm4gYXBwcyBhbHdheXMgc3VwcG9ydCBkZW5zaXRpZXMuCiAgICAgICAgICAgICBhcHBsaWNhdGlvbkRlbnNpdHkgPSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRTsKICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2NhbGUgPSAxLjBmOwogICAgICAgICAgICAgYXBwbGljYXRpb25JbnZlcnRlZFNjYWxlID0gMS4wZjsKKwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwbGljYXRpb25EZW5zaXR5ID0gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxUOwotICAgICAgICAgICAgYXBwbGljYXRpb25TY2FsZSA9IERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFCi0gICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFRkFVTFQ7Ci0gICAgICAgICAgICBhcHBsaWNhdGlvbkludmVydGVkU2NhbGUgPSAxLjBmIC8gYXBwbGljYXRpb25TY2FsZTsKLSAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IFNDQUxJTkdfUkVRVUlSRUQ7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEhhcyB0aGUgYXBwbGljYXRpb24gc2FpZCB0aGF0IGl0cyBVSSBpcyBleHBhbmRhYmxlPyAgQmFzZWQgb24gdGhlCisgICAgICAgICAgICAgKiA8c3VwcG9ydHMtc2NyZWVuPiBhbmRyb2lkOmV4cGFuZGlibGUgaW4gdGhlIG1hbmlmZXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmaW5hbCBpbnQgRVhQQU5EQUJMRSA9IDI7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogSGFzIHRoZSBhcHBsaWNhdGlvbiBzYWlkIHRoYXQgaXRzIFVJIHN1cHBvcnRzIGxhcmdlIHNjcmVlbnM/ICBCYXNlZCBvbiB0aGUKKyAgICAgICAgICAgICAqIDxzdXBwb3J0cy1zY3JlZW4+IGFuZHJvaWQ6bGFyZ2VTY3JlZW5zIGluIHRoZSBtYW5pZmVzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmluYWwgaW50IExBUkdFX1NDUkVFTlMgPSA4OworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEhhcyB0aGUgYXBwbGljYXRpb24gc2FpZCB0aGF0IGl0cyBVSSBzdXBwb3J0cyB4bGFyZ2Ugc2NyZWVucz8gIEJhc2VkIG9uIHRoZQorICAgICAgICAgICAgICogPHN1cHBvcnRzLXNjcmVlbj4gYW5kcm9pZDp4bGFyZ2VTY3JlZW5zIGluIHRoZSBtYW5pZmVzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmluYWwgaW50IFhMQVJHRV9TQ1JFRU5TID0gMzI7CisKKyAgICAgICAgICAgIGludCBzaXplSW5mbyA9IDA7CisKKyAgICAgICAgICAgIC8vIFdlIGNhbid0IHJlbHkgb24gdGhlIGFwcGxpY2F0aW9uIGFsd2F5cyBzZXR0aW5nCisgICAgICAgICAgICAvLyBGTEFHX1JFU0laRUFCTEVfRk9SX1NDUkVFTlMgc28gd2lsbCBjb21wdXRlIGl0IGJhc2VkIG9uIHZhcmlvdXMgaW5wdXQuCisgICAgICAgICAgICBib29sZWFuIGFueVJlc2l6ZWFibGUgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKChhcHBJbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfTEFSR0VfU0NSRUVOUykgIT0gMCkgeworICAgICAgICAgICAgICAgIHNpemVJbmZvIHw9IExBUkdFX1NDUkVFTlM7CisgICAgICAgICAgICAgICAgYW55UmVzaXplYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKCFmb3JjZUNvbXBhdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgZm9yY2luZyB0aGUgYXBwIGludG8gY29tcGF0aWJpbGl0eSBtb2RlLCB0aGVuCisgICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBpZiBpdCBzdXBwb3J0cyBsYXJnZSBzY3JlZW5zIHRoYXQgd2Ugc2hvdWxkIGFsbG93IGl0CisgICAgICAgICAgICAgICAgICAgIC8vIHRvIHVzZSB0aGUgZnVsbCBzcGFjZSBvZiBhbiB4bGFyZ2Ugc2NyZWVuIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgIHNpemVJbmZvIHw9IFhMQVJHRV9TQ1JFRU5TIHwgRVhQQU5EQUJMRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOUykgIT0gMCkgeworICAgICAgICAgICAgICAgIGFueVJlc2l6ZWFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmICghZm9yY2VDb21wYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZUluZm8gfD0gWExBUkdFX1NDUkVFTlMgfCBFWFBBTkRBQkxFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoYXBwSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1JFU0laRUFCTEVfRk9SX1NDUkVFTlMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBhbnlSZXNpemVhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzaXplSW5mbyB8PSBFWFBBTkRBQkxFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9yY2VDb21wYXQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZm9yY2luZyBjb21wYXRpYmlsaXR5IG1vZGUsIHRoZW4gaWdub3JlIGFuIGFwcCB0aGF0CisgICAgICAgICAgICAgICAgLy8ganVzdCBzYXlzIGl0IGlzIHJlc2l6YWJsZSBmb3Igc2NyZWVucy4gIFdlJ2xsIG9ubHkgaGF2ZSBpdCBmaWxsCisgICAgICAgICAgICAgICAgLy8gdGhlIHNjcmVlbiBpZiBpdCBleHBsaWNpdGx5IHNheXMgaXQgc3VwcG9ydHMgdGhlIHNjcmVlbiBzaXplIHdlCisgICAgICAgICAgICAgICAgLy8gYXJlIHJ1bm5pbmcgaW4uCisgICAgICAgICAgICAgICAgc2l6ZUluZm8gJj0gfkVYUEFOREFCTEU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbXBhdEZsYWdzIHw9IE5FRURTX1NDUkVFTl9DT01QQVQ7CisgICAgICAgICAgICBzd2l0Y2ggKHNjcmVlbkxheW91dCZDb25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFOgorICAgICAgICAgICAgICAgICAgICBpZiAoKHNpemVJbmZvJlhMQVJHRV9TQ1JFRU5TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRGbGFncyAmPSB+TkVFRFNfU0NSRUVOX0NPTVBBVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19YTEFSR0VfU0NSRUVOUykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVWRVJfTkVFRFNfQ09NUEFUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9MQVJHRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzaXplSW5mbyZMQVJHRV9TQ1JFRU5TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRGbGFncyAmPSB+TkVFRFNfU0NSRUVOX0NPTVBBVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19MQVJHRV9TQ1JFRU5TKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBORVZFUl9ORUVEU19DT01QQVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoc2NyZWVuTGF5b3V0JkNvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX0NPTVBBVF9ORUVERUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKHNpemVJbmZvJkVYUEFOREFCTEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgJj0gfk5FRURTX1NDUkVFTl9DT01QQVQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYW55UmVzaXplYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBBTFdBWVNfTkVFRFNfQ09NUEFUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgJj0gfk5FRURTX1NDUkVFTl9DT01QQVQ7CisgICAgICAgICAgICAgICAgY29tcGF0RmxhZ3MgfD0gTkVWRVJfTkVFRFNfQ09NUEFUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TVVBQT1JUU19TQ1JFRU5fREVOU0lUSUVTKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25EZW5zaXR5ID0gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0U7CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25TY2FsZSA9IDEuMGY7CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JbnZlcnRlZFNjYWxlID0gMS4wZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25EZW5zaXR5ID0gRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERUZBVUxUOworICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2NhbGUgPSBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFVklDRQorICAgICAgICAgICAgICAgICAgICAgICAgLyAoZmxvYXQpIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVGQVVMVDsKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkludmVydGVkU2NhbGUgPSAxLjBmIC8gYXBwbGljYXRpb25TY2FsZTsKKyAgICAgICAgICAgICAgICBjb21wYXRGbGFncyB8PSBTQ0FMSU5HX1JFUVVJUkVEOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgbUNvbXBhdGliaWxpdHlGbGFncyA9IGNvbXBhdEZsYWdzOwpAQCAtMTk1LDggKzI1MCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBDb21wYXRpYmlsaXR5SW5mbygpIHsKLSAgICAgICAgdGhpcyhYTEFSR0VfU0NSRUVOUyB8IExBUkdFX1NDUkVFTlMgfCBFWFBBTkRBQkxFLAotICAgICAgICAgICAgICAgIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFLAorICAgICAgICB0aGlzKE5FVkVSX05FRURTX0NPTVBBVCwgRGlzcGxheU1ldHJpY3MuREVOU0lUWV9ERVZJQ0UsCiAgICAgICAgICAgICAgICAgMS4wZiwKICAgICAgICAgICAgICAgICAxLjBmKTsKICAgICB9CkBAIC0yMDUsNyArMjU5LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNjYWxpbmcgaXMgcmVxdWlyZWQKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1NjYWxpbmdSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtQ29tcGF0aWJpbGl0eUZsYWdzICYgU0NBTElOR19SRVFVSVJFRCkgIT0gMDsKKyAgICAgICAgcmV0dXJuIChtQ29tcGF0aWJpbGl0eUZsYWdzJlNDQUxJTkdfUkVRVUlSRUQpICE9IDA7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzU2NyZWVuKCkgewpAQCAtMjEzLDE2ICsyNjcsMTEgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIGJvb2xlYW4gbmV2ZXJTdXBwb3J0c1NjcmVlbigpIHsKLSAgICAgICAgcmV0dXJuIChtQ29tcGF0aWJpbGl0eUZsYWdzJk5FVkVSX0NPTVBBVCkgIT0gMDsKKyAgICAgICAgcmV0dXJuIChtQ29tcGF0aWJpbGl0eUZsYWdzJkFMV0FZU19ORUVEU19DT01QQVQpICE9IDA7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gYWx3YXlzU3VwcG9ydHNTY3JlZW4oKSB7Ci0gICAgICAgIHJldHVybiAobUNvbXBhdGliaWxpdHlGbGFncyZBTFdBWVNfQ09NUEFUKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiQ29tcGF0aWJpbGl0eUluZm97c2NhbGU9IiArIGFwcGxpY2F0aW9uU2NhbGUgKyAifSI7CisgICAgICAgIHJldHVybiAobUNvbXBhdGliaWxpdHlGbGFncyZORVZFUl9ORUVEU19DT01QQVQpICE9IDA7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODEsMTAgKzQzMCwxMCBAQAogICAgICAgICBpZiAoIXN1cHBvcnRzU2NyZWVuKCkpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXJnZXIgc2NyZWVuIGRldmljZSBhbmQgdGhlIGFwcCBpcyBub3QKICAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgd2l0aCBsYXJnZSBzY3JlZW5zLCBzbyBkaWRkbGUgaXQuCi0gICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mby51cGRhdGVDb21wYXRpYmxlU2NyZWVuRnJhbWUoaW5vdXREbSwgbnVsbCwgaW5vdXREbSk7CisgICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mby5jb21wdXRlQ29tcGF0aWJsZVNjYWxpbmcoaW5vdXREbSwgaW5vdXREbSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbm91dERtLndpZHRoUGl4ZWxzID0gaW5vdXREbS5yZWFsV2lkdGhQaXhlbHM7Ci0gICAgICAgICAgICBpbm91dERtLmhlaWdodFBpeGVscyA9IGlub3V0RG0ucmVhbEhlaWdodFBpeGVsczsKKyAgICAgICAgICAgIGlub3V0RG0ud2lkdGhQaXhlbHMgPSBpbm91dERtLnVuc2NhbGVkV2lkdGhQaXhlbHM7CisgICAgICAgICAgICBpbm91dERtLmhlaWdodFBpeGVscyA9IGlub3V0RG0udW5zY2FsZWRIZWlnaHRQaXhlbHM7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTY2FsaW5nUmVxdWlyZWQoKSkgewpAQCAtNDA3LDYgKzQ1Niw5IEBACiAgICAgICAgICAgICBpbm91dENvbmZpZy5zY3JlZW5MYXlvdXQgPQogICAgICAgICAgICAgICAgICAgICAoaW5vdXRDb25maWcuc2NyZWVuTGF5b3V0Jn5Db25maWd1cmF0aW9uLlNDUkVFTkxBWU9VVF9TSVpFX01BU0spCiAgICAgICAgICAgICAgICAgICAgIHwgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9OT1JNQUw7CisgICAgICAgICAgICBpbm91dENvbmZpZy5zY3JlZW5XaWR0aERwID0gaW5vdXRDb25maWcuY29tcGF0U2NyZWVuV2lkdGhEcDsKKyAgICAgICAgICAgIGlub3V0Q29uZmlnLnNjcmVlbkhlaWdodERwID0gaW5vdXRDb25maWcuY29tcGF0U2NyZWVuSGVpZ2h0RHA7CisgICAgICAgICAgICBpbm91dENvbmZpZy5zbWFsbGVzdFNjcmVlbldpZHRoRHAgPSBpbm91dENvbmZpZy5jb21wYXRTbWFsbGVzdFNjcmVlbldpZHRoRHA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxOCwxMCArNDcwLDkgQEAKICAgICAgKiBAcGFyYW0gb3V0UmVjdCB0aGUgb3V0cHV0IHBhcmFtZXRlciB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIHJlc3VsdC4KICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNjYWxpbmcgZmFjdG9yIGZvciB0aGUgd2luZG93LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgdXBkYXRlQ29tcGF0aWJsZVNjcmVlbkZyYW1lKERpc3BsYXlNZXRyaWNzIGRtLAotICAgICAgICAgICAgUmVjdCBvdXRSZWN0LCBEaXNwbGF5TWV0cmljcyBvdXREbSkgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBkbS5yZWFsV2lkdGhQaXhlbHM7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBkbS5yZWFsSGVpZ2h0UGl4ZWxzOworICAgIHB1YmxpYyBzdGF0aWMgZmxvYXQgY29tcHV0ZUNvbXBhdGlibGVTY2FsaW5nKERpc3BsYXlNZXRyaWNzIGRtLCBEaXNwbGF5TWV0cmljcyBvdXREbSkgeworICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBkbS51bnNjYWxlZFdpZHRoUGl4ZWxzOworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZG0udW5zY2FsZWRIZWlnaHRQaXhlbHM7CiAgICAgICAgIGludCBzaG9ydFNpemUsIGxvbmdTaXplOwogICAgICAgICBpZiAod2lkdGggPCBoZWlnaHQpIHsKICAgICAgICAgICAgIHNob3J0U2l6ZSA9IHdpZHRoOwpAQCAtNDUyLDEyICs1MDMsNiBAQAogICAgICAgICAgICAgc2NhbGUgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG91dFJlY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSAoaW50KSgod2lkdGgtKG5ld1dpZHRoKnNjYWxlKSkvMik7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gKGludCkoKGhlaWdodC0obmV3SGVpZ2h0KnNjYWxlKSkvMik7Ci0gICAgICAgICAgICBvdXRSZWN0LnNldChsZWZ0LCB0b3AsIGxlZnQrbmV3V2lkdGgsIHRvcCtuZXdIZWlnaHQpOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKG91dERtICE9IG51bGwpIHsKICAgICAgICAgICAgIG91dERtLndpZHRoUGl4ZWxzID0gbmV3V2lkdGg7CiAgICAgICAgICAgICBvdXREbS5oZWlnaHRQaXhlbHMgPSBuZXdIZWlnaHQ7CkBAIC00ODEsNiArNTI2LDI4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHNiLmFwcGVuZCgieyIpOworICAgICAgICBzYi5hcHBlbmQoYXBwbGljYXRpb25EZW5zaXR5KTsKKyAgICAgICAgc2IuYXBwZW5kKCJkcGkiKTsKKyAgICAgICAgaWYgKGlzU2NhbGluZ1JlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHNjYWxpbmciKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1cHBvcnRzU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHJlc2l6aW5nIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5ldmVyU3VwcG9ydHNTY3JlZW4oKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIgbmV2ZXItY29tcGF0Iik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsd2F5c1N1cHBvcnRzU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIGFsd2F5cy1jb21wYXQiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IDE3OwogICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG1Db21wYXRpYmlsaXR5RmxhZ3M7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9Db25maWd1cmF0aW9uLmphdmEKaW5kZXggZDQ3Njk5Ny4uYTAwZjc5MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvcmVzL0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2NhbGVVdGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIApAQCAtMjY5LDYgKzI3MCwxOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc21hbGxlc3RTY3JlZW5XaWR0aERwOwogCisgICAgLyoqIEBoaWRlIEhhY2sgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gZnJvbSBXTSB0byBhcHAgcnVubmluZyBpbiBjb21wYXQgbW9kZS4gKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhdFNjcmVlbldpZHRoRHA7CisgICAgLyoqIEBoaWRlIEhhY2sgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gZnJvbSBXTSB0byBhcHAgcnVubmluZyBpbiBjb21wYXQgbW9kZS4gKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhdFNjcmVlbkhlaWdodERwOworICAgIC8qKiBAaGlkZSBIYWNrIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20gV00gdG8gYXBwIHJ1bm5pbmcgaW4gY29tcGF0IG1vZGUuICovCisgICAgcHVibGljIGludCBjb21wYXRTbWFsbGVzdFNjcmVlbldpZHRoRHA7CisKKyAgICAvKioKKyAgICAgKiBAaGlkZSBUaGUgdGV4dCBsYXlvdXQgZGlyZWN0aW9uIGFzc29jaWF0ZWQgdG8gdGhlIGN1cnJlbnQgTG9jYWxlCisgICAgICovCisgICAgcHVibGljIGludCB0ZXh0TGF5b3V0RGlyZWN0aW9uOworCiAgICAgLyoqCiAgICAgICogQGhpZGUgSW50ZXJuYWwgYm9vay1rZWVwaW5nLgogICAgICAqLwpAQCAtMjk1LDYgKzMwOCw3IEBACiAgICAgICAgIG1uYyA9IG8ubW5jOwogICAgICAgICBpZiAoby5sb2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgbG9jYWxlID0gKExvY2FsZSkgby5sb2NhbGUuY2xvbmUoKTsKKyAgICAgICAgICAgIHRleHRMYXlvdXREaXJlY3Rpb24gPSBvLnRleHRMYXlvdXREaXJlY3Rpb247CiAgICAgICAgIH0KICAgICAgICAgdXNlclNldExvY2FsZSA9IG8udXNlclNldExvY2FsZTsKICAgICAgICAgdG91Y2hzY3JlZW4gPSBvLnRvdWNoc2NyZWVuOwpAQCAtMzA5LDYgKzMyMyw5IEBACiAgICAgICAgIHNjcmVlbldpZHRoRHAgPSBvLnNjcmVlbldpZHRoRHA7CiAgICAgICAgIHNjcmVlbkhlaWdodERwID0gby5zY3JlZW5IZWlnaHREcDsKICAgICAgICAgc21hbGxlc3RTY3JlZW5XaWR0aERwID0gby5zbWFsbGVzdFNjcmVlbldpZHRoRHA7CisgICAgICAgIGNvbXBhdFNjcmVlbldpZHRoRHAgPSBvLmNvbXBhdFNjcmVlbldpZHRoRHA7CisgICAgICAgIGNvbXBhdFNjcmVlbkhlaWdodERwID0gby5jb21wYXRTY3JlZW5IZWlnaHREcDsKKyAgICAgICAgY29tcGF0U21hbGxlc3RTY3JlZW5XaWR0aERwID0gby5jb21wYXRTbWFsbGVzdFNjcmVlbldpZHRoRHA7CiAgICAgICAgIHNlcSA9IG8uc2VxOwogICAgIH0KICAgICAKQEAgLTMyNywyMCArMzQ0LDI1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoIiAobm8gbG9jYWxlKSIpOwogICAgICAgICB9CisgICAgICAgIHN3aXRjaCAodGV4dExheW91dERpcmVjdGlvbikgeworICAgICAgICAgICAgY2FzZSBMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9VTkRFRklORURfRE9fTk9UX1VTRTogc2IuYXBwZW5kKCIgP2xheW91dGRpciIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0U6IHNiLmFwcGVuZCgiIHJ0bCIpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHNiLmFwcGVuZCgiIGxheW91dGRpcj0iKTsgc2IuYXBwZW5kKHRleHRMYXlvdXREaXJlY3Rpb24pOyBicmVhazsKKyAgICAgICAgfQogICAgICAgICBpZiAoc21hbGxlc3RTY3JlZW5XaWR0aERwICE9IFNNQUxMRVNUX1NDUkVFTl9XSURUSF9EUF9VTkRFRklORUQpIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHN3Iik7IHNiLmFwcGVuZChzbWFsbGVzdFNjcmVlbldpZHRoRHApOyBzYi5hcHBlbmQoImRwIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIj9zd2RwIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiA/c3dkcCIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzY3JlZW5XaWR0aERwICE9IFNDUkVFTl9XSURUSF9EUF9VTkRFRklORUQpIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHciKTsgc2IuYXBwZW5kKHNjcmVlbldpZHRoRHApOyBzYi5hcHBlbmQoImRwIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIj93ZHAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiID93ZHAiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2NyZWVuSGVpZ2h0RHAgIT0gU0NSRUVOX0hFSUdIVF9EUF9VTkRFRklORUQpIHsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiIGgiKTsgc2IuYXBwZW5kKHNjcmVlbkhlaWdodERwKTsgc2IuYXBwZW5kKCJkcCIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2IuYXBwZW5kKCI/aGRwIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiA/aGRwIik7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoICgoc2NyZWVuTGF5b3V0JlNDUkVFTkxBWU9VVF9TSVpFX01BU0spKSB7CiAgICAgICAgICAgICBjYXNlIFNDUkVFTkxBWU9VVF9TSVpFX1VOREVGSU5FRDogc2IuYXBwZW5kKCIgP2xzaXplIik7IGJyZWFrOwpAQCAtNDQ0LDkgKzQ2NiwxMCBAQAogICAgICAgICBvcmllbnRhdGlvbiA9IE9SSUVOVEFUSU9OX1VOREVGSU5FRDsKICAgICAgICAgc2NyZWVuTGF5b3V0ID0gU0NSRUVOTEFZT1VUX1NJWkVfVU5ERUZJTkVEOwogICAgICAgICB1aU1vZGUgPSBVSV9NT0RFX1RZUEVfVU5ERUZJTkVEOwotICAgICAgICBzY3JlZW5XaWR0aERwID0gU0NSRUVOX1dJRFRIX0RQX1VOREVGSU5FRDsKLSAgICAgICAgc2NyZWVuSGVpZ2h0RHAgPSBTQ1JFRU5fSEVJR0hUX0RQX1VOREVGSU5FRDsKLSAgICAgICAgc21hbGxlc3RTY3JlZW5XaWR0aERwID0gU01BTExFU1RfU0NSRUVOX1dJRFRIX0RQX1VOREVGSU5FRDsKKyAgICAgICAgc2NyZWVuV2lkdGhEcCA9IGNvbXBhdFNjcmVlbldpZHRoRHAgPSBTQ1JFRU5fV0lEVEhfRFBfVU5ERUZJTkVEOworICAgICAgICBzY3JlZW5IZWlnaHREcCA9IGNvbXBhdFNjcmVlbkhlaWdodERwID0gU0NSRUVOX0hFSUdIVF9EUF9VTkRFRklORUQ7CisgICAgICAgIHNtYWxsZXN0U2NyZWVuV2lkdGhEcCA9IGNvbXBhdFNtYWxsZXN0U2NyZWVuV2lkdGhEcCA9IFNNQUxMRVNUX1NDUkVFTl9XSURUSF9EUF9VTkRFRklORUQ7CisgICAgICAgIHRleHRMYXlvdXREaXJlY3Rpb24gPSBMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRTsKICAgICAgICAgc2VxID0gMDsKICAgICB9CiAKQEAgLTQ4Miw2ICs1MDUsNyBAQAogICAgICAgICAgICAgY2hhbmdlZCB8PSBBY3Rpdml0eUluZm8uQ09ORklHX0xPQ0FMRTsKICAgICAgICAgICAgIGxvY2FsZSA9IGRlbHRhLmxvY2FsZSAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgID8gKExvY2FsZSkgZGVsdGEubG9jYWxlLmNsb25lKCkgOiBudWxsOworICAgICAgICAgICAgdGV4dExheW91dERpcmVjdGlvbiA9IExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZWx0YS51c2VyU2V0TG9jYWxlICYmICghdXNlclNldExvY2FsZSB8fCAoKGNoYW5nZWQgJiBBY3Rpdml0eUluZm8uQ09ORklHX0xPQ0FMRSkgIT0gMCkpKQogICAgICAgICB7CkBAIC01NTAsMTEgKzU3NCwxOCBAQAogICAgICAgICAgICAgY2hhbmdlZCB8PSBBY3Rpdml0eUluZm8uQ09ORklHX1NDUkVFTl9TSVpFOwogICAgICAgICAgICAgc2NyZWVuSGVpZ2h0RHAgPSBkZWx0YS5zY3JlZW5IZWlnaHREcDsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVsdGEuc21hbGxlc3RTY3JlZW5XaWR0aERwICE9IFNNQUxMRVNUX1NDUkVFTl9XSURUSF9EUF9VTkRFRklORUQKLSAgICAgICAgICAgICAgICAmJiBzbWFsbGVzdFNjcmVlbldpZHRoRHAgIT0gZGVsdGEuc21hbGxlc3RTY3JlZW5XaWR0aERwKSB7Ci0gICAgICAgICAgICBjaGFuZ2VkIHw9IEFjdGl2aXR5SW5mby5DT05GSUdfU01BTExFU1RfU0NSRUVOX1NJWkU7CisgICAgICAgIGlmIChkZWx0YS5zbWFsbGVzdFNjcmVlbldpZHRoRHAgIT0gU01BTExFU1RfU0NSRUVOX1dJRFRIX0RQX1VOREVGSU5FRCkgewogICAgICAgICAgICAgc21hbGxlc3RTY3JlZW5XaWR0aERwID0gZGVsdGEuc21hbGxlc3RTY3JlZW5XaWR0aERwOwogICAgICAgICB9CisgICAgICAgIGlmIChkZWx0YS5jb21wYXRTY3JlZW5XaWR0aERwICE9IFNDUkVFTl9XSURUSF9EUF9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGNvbXBhdFNjcmVlbldpZHRoRHAgPSBkZWx0YS5jb21wYXRTY3JlZW5XaWR0aERwOworICAgICAgICB9CisgICAgICAgIGlmIChkZWx0YS5jb21wYXRTY3JlZW5IZWlnaHREcCAhPSBTQ1JFRU5fSEVJR0hUX0RQX1VOREVGSU5FRCkgeworICAgICAgICAgICAgY29tcGF0U2NyZWVuSGVpZ2h0RHAgPSBkZWx0YS5jb21wYXRTY3JlZW5IZWlnaHREcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVsdGEuY29tcGF0U21hbGxlc3RTY3JlZW5XaWR0aERwICE9IFNNQUxMRVNUX1NDUkVFTl9XSURUSF9EUF9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGNvbXBhdFNtYWxsZXN0U2NyZWVuV2lkdGhEcCA9IGRlbHRhLmNvbXBhdFNtYWxsZXN0U2NyZWVuV2lkdGhEcDsKKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgaWYgKGRlbHRhLnNlcSAhPSAwKSB7CiAgICAgICAgICAgICBzZXEgPSBkZWx0YS5zZXE7CkBAIC03MzksNiArNzcwLDEwIEBACiAgICAgICAgIGRlc3Qud3JpdGVJbnQoc2NyZWVuV2lkdGhEcCk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQoc2NyZWVuSGVpZ2h0RHApOwogICAgICAgICBkZXN0LndyaXRlSW50KHNtYWxsZXN0U2NyZWVuV2lkdGhEcCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoY29tcGF0U2NyZWVuV2lkdGhEcCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoY29tcGF0U2NyZWVuSGVpZ2h0RHApOworICAgICAgICBkZXN0LndyaXRlSW50KGNvbXBhdFNtYWxsZXN0U2NyZWVuV2lkdGhEcCk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQodGV4dExheW91dERpcmVjdGlvbik7CiAgICAgICAgIGRlc3Qud3JpdGVJbnQoc2VxKTsKICAgICB9CiAKQEAgLTc2Myw2ICs3OTgsMTAgQEAKICAgICAgICAgc2NyZWVuV2lkdGhEcCA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIHNjcmVlbkhlaWdodERwID0gc291cmNlLnJlYWRJbnQoKTsKICAgICAgICAgc21hbGxlc3RTY3JlZW5XaWR0aERwID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgY29tcGF0U2NyZWVuV2lkdGhEcCA9IHNvdXJjZS5yZWFkSW50KCk7CisgICAgICAgIGNvbXBhdFNjcmVlbkhlaWdodERwID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgY29tcGF0U21hbGxlc3RTY3JlZW5XaWR0aERwID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgdGV4dExheW91dERpcmVjdGlvbiA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgICAgIHNlcSA9IHNvdXJjZS5yZWFkSW50KCk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9yZXMvUmVzb3VyY2VzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQppbmRleCBlNjNlN2ViLi5iZDhiMWE0IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L3Jlcy9SZXNvdXJjZXMuamF2YQpAQCAtMjgsMTQgKzI4LDEzIEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZS5Db25zdGFudFN0YXRlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CkBAIC0xOTMsMTEgKzE5Miw3IEBACiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZywgQ29tcGF0aWJpbGl0eUluZm8gY29tcEluZm8pIHsKICAgICAgICAgbUFzc2V0cyA9IGFzc2V0czsKICAgICAgICAgbU1ldHJpY3Muc2V0VG9EZWZhdWx0cygpOwotICAgICAgICBpZiAoY29tcEluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvID0gQ29tcGF0aWJpbGl0eUluZm8uREVGQVVMVF9DT01QQVRJQklMSVRZX0lORk87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8gPSBjb21wSW5mbzsKLSAgICAgICAgfQorICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8gPSBjb21wSW5mbzsKICAgICAgICAgdXBkYXRlQ29uZmlndXJhdGlvbihjb25maWcsIG1ldHJpY3MpOwogICAgICAgICBhc3NldHMuZW5zdXJlU3RyaW5nQmxvY2tzKCk7CiAgICAgfQpAQCAtMTQxMCwxOSArMTQwNSwxNSBAQAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvbiBjb25maWcsCiAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzLCBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtVG1wVmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChmYWxzZSkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICIqKioqIFVwZGF0aW5nIGNvbmZpZyBvZiAiICsgdGhpcyArICI6IG9sZCBjb25maWcgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29uZmlndXJhdGlvbiArICIgb2xkIGNvbXBhdCBpcyAiICsgbUNvbXBhdGliaWxpdHlJbmZvKTsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiKioqKiBVcGRhdGluZyBjb25maWcgb2YgIiArIHRoaXMgKyAiOiBuZXcgY29uZmlnIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY29uZmlnICsgIiBuZXcgY29tcGF0IGlzICIgKyBjb21wYXQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNvbXBhdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvID0gY29tcGF0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvbmZpZ0NoYW5nZXMgPSAweGZmZmZmZmY7Ci0gICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVG1wQ29uZmlnLnNldFRvKGNvbmZpZyk7Ci0gICAgICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvLmFwcGx5VG9Db25maWd1cmF0aW9uKG1UbXBDb25maWcpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0NoYW5nZXMgPSBtQ29uZmlndXJhdGlvbi51cGRhdGVGcm9tKG1UbXBDb25maWcpOwotICAgICAgICAgICAgICAgIGNvbmZpZ0NoYW5nZXMgPSBBY3Rpdml0eUluZm8uYWN0aXZpdHlJbmZvQ29uZmlnVG9OYXRpdmUoY29uZmlnQ2hhbmdlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNvbmZpZ3VyYXRpb24ubG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbi5sb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1ldHJpY3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1NZXRyaWNzLnNldFRvKG1ldHJpY3MpOwogICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIHNob3VsZCByZS1hcnJhbmdlIHRoaXMgY29kZSB0byBjcmVhdGUgYSBEaXNwbGF5CkBAIC0xNDM0LDkgKzE0MjUsMjkgQEAKICAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBiZSBjbGVhbmVyIGFuZCBtb3JlIG1haW50YWluYmxlIHRvIGp1c3QgYmUKICAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW50bHkgZGVhbGluZyB3aXRoIGEgY29tcGF0aWJsZSBkaXNwbGF5IGV2ZXJ5d2hlcmUgaW4KICAgICAgICAgICAgICAgICAvLyB0aGUgZnJhbWV3b3JrLgorICAgICAgICAgICAgICAgIGlmIChtQ29tcGF0aWJpbGl0eUluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8uYXBwbHlUb0Rpc3BsYXlNZXRyaWNzKG1NZXRyaWNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNvbXBhdGliaWxpdHlJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUluZm8uYXBwbHlUb0Rpc3BsYXlNZXRyaWNzKG1NZXRyaWNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1NZXRyaWNzLnNjYWxlZERlbnNpdHkgPSBtTWV0cmljcy5kZW5zaXR5ICogbUNvbmZpZ3VyYXRpb24uZm9udFNjYWxlOworICAgICAgICAgICAgaW50IGNvbmZpZ0NoYW5nZXMgPSAweGZmZmZmZmY7CisgICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVG1wQ29uZmlnLnNldFRvKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgaWYgKG1Db21wYXRpYmlsaXR5SW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mby5hcHBseVRvQ29uZmlndXJhdGlvbihtVG1wQ29uZmlnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1UbXBDb25maWcubG9jYWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRtcENvbmZpZy5sb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VzID0gbUNvbmZpZ3VyYXRpb24udXBkYXRlRnJvbShtVG1wQ29uZmlnKTsKKyAgICAgICAgICAgICAgICBjb25maWdDaGFuZ2VzID0gQWN0aXZpdHlJbmZvLmFjdGl2aXR5SW5mb0NvbmZpZ1RvTmF0aXZlKGNvbmZpZ0NoYW5nZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Db25maWd1cmF0aW9uLmxvY2FsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUNvbmZpZ3VyYXRpb24ubG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nIGxvY2FsZSA9IG51bGw7CiAgICAgICAgICAgICBpZiAobUNvbmZpZ3VyYXRpb24ubG9jYWxlICE9IG51bGwpIHsKQEAgLTE0NzEsNiArMTQ4MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbi5zY3JlZW5MYXlvdXQsIG1Db25maWd1cmF0aW9uLnVpTW9kZSwKICAgICAgICAgICAgICAgICAgICAgQnVpbGQuVkVSU0lPTi5SRVNPVVJDRVNfU0RLX0lOVCk7CiAKKyAgICAgICAgICAgIGlmIChERUJVR19DT05GSUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiKioqKiBVcGRhdGluZyBjb25maWcgb2YgIiArIHRoaXMgKyAiOiBmaW5hbCBjb25maWcgaXMgIiArIG1Db25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZmluYWwgY29tcGF0IGlzICIgKyBtQ29tcGF0aWJpbGl0eUluZm8pOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjbGVhckRyYXdhYmxlQ2FjaGUobURyYXdhYmxlQ2FjaGUsIGNvbmZpZ0NoYW5nZXMpOwogICAgICAgICAgICAgY2xlYXJEcmF3YWJsZUNhY2hlKG1Db2xvckRyYXdhYmxlQ2FjaGUsIGNvbmZpZ0NoYW5nZXMpOwogCkBAIC0xNTQ4LDYgKzE1NjQsOCBAQAogICAgICAqIEByZXR1cm4gVGhlIHJlc291cmNlJ3MgY3VycmVudCBkaXNwbGF5IG1ldHJpY3MuIAogICAgICAqLwogICAgIHB1YmxpYyBEaXNwbGF5TWV0cmljcyBnZXREaXNwbGF5TWV0cmljcygpIHsKKyAgICAgICAgaWYgKERFQlVHX0NPTkZJRykgU2xvZy52KFRBRywgIlJldHVybmluZyBEaXNwbGF5TWV0cmljczogIiArIG1NZXRyaWNzLndpZHRoUGl4ZWxzCisgICAgICAgICAgICAgICAgKyAieCIgKyBtTWV0cmljcy5oZWlnaHRQaXhlbHMgKyAiICIgKyBtTWV0cmljcy5kZW5zaXR5KTsKICAgICAgICAgcmV0dXJuIG1NZXRyaWNzOwogICAgIH0KIApAQCAtMTU2NSwxMSArMTU4MywxMiBAQAogICAgICAqIFJldHVybiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlIGluZm9ybWF0aW9uIGZvciB0aGUgYXBwbGljYXRpb24uCiAgICAgICogVGhlIHJldHVybmVkIG9iamVjdCBzaG91bGQgYmUgdHJlYXRlZCBhcyByZWFkLW9ubHkuCiAgICAgICogCi0gICAgICogQHJldHVybiBjb21wYXRpYmlsaXR5IGluZm8uIG51bGwgaWYgdGhlIGFwcCBkb2VzIG5vdCByZXF1aXJlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICAgKiBAcmV0dXJuIGNvbXBhdGliaWxpdHkgaW5mby4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyBnZXRDb21wYXRpYmlsaXR5SW5mbygpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wYXRpYmlsaXR5SW5mbzsKKyAgICAgICAgcmV0dXJuIG1Db21wYXRpYmlsaXR5SW5mbyAhPSBudWxsID8gbUNvbXBhdGliaWxpdHlJbmZvCisgICAgICAgICAgICAgICAgOiBDb21wYXRpYmlsaXR5SW5mby5ERUZBVUxUX0NPTVBBVElCSUxJVFlfSU5GTzsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2RhdGFiYXNlL3NxbGl0ZS9TUUxpdGVRdWVyeUJ1aWxkZXIuamF2YQppbmRleCBiNmFjYTJiLi44ZjhlYjZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9kYXRhYmFzZS9zcWxpdGUvU1FMaXRlUXVlcnlCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvZGF0YWJhc2Uvc3FsaXRlL1NRTGl0ZVF1ZXJ5QnVpbGRlci5qYXZhCkBAIC0yNCw4ICsyNCw4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogLyoqCkBAIC00Myw3ICs0Myw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1XaGVyZUNsYXVzZSA9IG51bGw7ICAvLyBsYXppbHkgY3JlYXRlZAogICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzdGluY3Q7CiAgICAgcHJpdmF0ZSBTUUxpdGVEYXRhYmFzZS5DdXJzb3JGYWN0b3J5IG1GYWN0b3J5OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3RyaWN0UHJvamVjdGlvbk1hcDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0cmljdDsKIAogICAgIHB1YmxpYyBTUUxpdGVRdWVyeUJ1aWxkZXIoKSB7CiAgICAgICAgIG1EaXN0aW5jdCA9IGZhbHNlOwpAQCAtMTQ1LDEwICsxNDUsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQorICAgICAqIFdoZW4gc2V0LCB0aGUgc2VsZWN0aW9uIGlzIHZlcmlmaWVkIGFnYWluc3QgbWFsaWNpb3VzIGFyZ3VtZW50cy4KKyAgICAgKiBXaGVuIHVzaW5nIHRoaXMgY2xhc3MgdG8gY3JlYXRlIGEgc3RhdGVtZW50IHVzaW5nCisgICAgICoge0BsaW5rICNidWlsZFF1ZXJ5U3RyaW5nKGJvb2xlYW4sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0sCisgICAgICogbm9uLW51bWVyaWMgbGltaXRzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLiBJZiBhIHByb2plY3Rpb24gbWFwIGlzIHNwZWNpZmllZCwgZmllbGRzCisgICAgICogbm90IGluIHRoYXQgbWFwIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBJZiB0aGlzIGNsYXNzIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGRpcmVjdGx5IHVzaW5nCisgICAgICoge0BsaW5rICNxdWVyeShTUUxpdGVEYXRhYmFzZSwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfQorICAgICAqIG9yCisgICAgICoge0BsaW5rICNxdWVyeShTUUxpdGVEYXRhYmFzZSwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9LAorICAgICAqIGFkZGl0aW9uYWxseSBhbHNvIHBhcmVudGhlc2lzIGVzY2FwaW5nIHNlbGVjdGlvbiBhcmUgY2F1Z2h0LgorICAgICAqCisgICAgICogVG8gc3VtbWFyaXplOiBUbyBnZXQgbWF4aW11bSBwcm90ZWN0aW9uIGFnYWluc3QgbWFsaWNpb3VzIHRoaXJkIHBhcnR5IGFwcHMgKGZvciBleGFtcGxlCisgICAgICogY29udGVudCBwcm92aWRlciBjb25zdW1lcnMpLCBtYWtlIHN1cmUgdG8gZG8gdGhlIGZvbGxvd2luZzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPlNldCB0aGlzIHZhbHVlIHRvIHRydWU8L2xpPgorICAgICAqIDxsaT5Vc2UgYSBwcm9qZWN0aW9uIG1hcDwvbGk+CisgICAgICogPGxpPlVzZSBvbmUgb2YgdGhlIHF1ZXJ5IG92ZXJsb2FkcyBpbnN0ZWFkIG9mIGdldHRpbmcgdGhlIHN0YXRlbWVudCBhcyBhIHNxbCBzdHJpbmc8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBmYWxzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpY3RQcm9qZWN0aW9uTWFwKGJvb2xlYW4gZmxhZykgewotICAgICAgICBtU3RyaWN0UHJvamVjdGlvbk1hcCA9IGZsYWc7CisgICAgcHVibGljIHZvaWQgc2V0U3RyaWN0KGJvb2xlYW4gZmxhZykgeworICAgICAgICBtU3RyaWN0ID0gZmxhZzsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNywxMyArMjM1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQ2xhdXNlRXNjYXBlQ2xhdXNlKFN0cmluZ0J1aWxkZXIgcywgU3RyaW5nIG5hbWUsIFN0cmluZyBjbGF1c2UpIHsKLSAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShjbGF1c2UpKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuYXBwZW5kRXNjYXBlZFNRTFN0cmluZyhzLCBjbGF1c2UpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWRkIHRoZSBuYW1lcyB0aGF0IGFyZSBub24tbnVsbCBpbiBjb2x1bW5zIHRvIHMsIHNlcGFyYXRpbmcKICAgICAgKiB0aGVtIHdpdGggY29tbWFzLgpAQCAtMzIwLDYgKzMzMSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVN0cmljdCAmJiBzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24ubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgdXNlci1zdXBwbGllZCBzZWxlY3Rpb24gdG8gZGV0ZWN0IHN5bnRhY3RpYyBhbm9tYWxpZXMKKyAgICAgICAgICAgIC8vIGluIHRoZSBzZWxlY3Rpb24gc3RyaW5nIHRoYXQgY291bGQgaW5kaWNhdGUgYSBTUUwgaW5qZWN0aW9uIGF0dGVtcHQuCisgICAgICAgICAgICAvLyBUaGUgaWRlYSBpcyB0byBlbnN1cmUgdGhhdCB0aGUgc2VsZWN0aW9uIGNsYXVzZSBpcyBhIHZhbGlkIFNRTCBleHByZXNzaW9uCisgICAgICAgICAgICAvLyBieSBjb21waWxpbmcgaXQgdHdpY2U6IG9uY2Ugd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyBhbmQgb25jZSBhcworICAgICAgICAgICAgLy8gb3JpZ2luYWxseSBzcGVjaWZpZWQuIEFuIGF0dGFja2VyIGNhbm5vdCBjcmVhdGUgYW4gZXhwcmVzc2lvbiB0aGF0CisgICAgICAgICAgICAvLyB3b3VsZCBlc2NhcGUgdGhlIFNRTCBleHByZXNzaW9uIHdoaWxlIG1haW50YWluaW5nIGJhbGFuY2VkIHBhcmVudGhlc2VzCisgICAgICAgICAgICAvLyBpbiBib3RoIHRoZSB3cmFwcGVkIGFuZCBvcmlnaW5hbCBmb3Jtcy4KKyAgICAgICAgICAgIFN0cmluZyBzcWxGb3JWYWxpZGF0aW9uID0gYnVpbGRRdWVyeShwcm9qZWN0aW9uSW4sICIoIiArIHNlbGVjdGlvbiArICIpIiwgZ3JvdXBCeSwKKyAgICAgICAgICAgICAgICAgICAgaGF2aW5nLCBzb3J0T3JkZXIsIGxpbWl0KTsKKyAgICAgICAgICAgIHZhbGlkYXRlU3FsKGRiLCBzcWxGb3JWYWxpZGF0aW9uKTsgLy8gd2lsbCB0aHJvdyBpZiBxdWVyeSBpcyBpbnZhbGlkCisgICAgICAgIH0KKwogICAgICAgICBTdHJpbmcgc3FsID0gYnVpbGRRdWVyeSgKICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uSW4sIHNlbGVjdGlvbiwgZ3JvdXBCeSwgaGF2aW5nLAogICAgICAgICAgICAgICAgIHNvcnRPcmRlciwgbGltaXQpOwpAQCAtMzI5LDcgKzM1MywyMCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkYi5yYXdRdWVyeVdpdGhGYWN0b3J5KAogICAgICAgICAgICAgICAgIG1GYWN0b3J5LCBzcWwsIHNlbGVjdGlvbkFyZ3MsCi0gICAgICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuZmluZEVkaXRUYWJsZShtVGFibGVzKSk7CisgICAgICAgICAgICAgICAgU1FMaXRlRGF0YWJhc2UuZmluZEVkaXRUYWJsZShtVGFibGVzKSk7IC8vIHdpbGwgdGhyb3cgaWYgcXVlcnkgaXMgaW52YWxpZAorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoYXQgYSBTUUwgc3RhdGVtZW50IGlzIHZhbGlkIGJ5IGNvbXBpbGluZyBpdC4KKyAgICAgKiBJZiB0aGUgU1FMIHN0YXRlbWVudCBpcyBub3QgdmFsaWQsIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYSB7QGxpbmsgU1FMaXRlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVTcWwoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBzcWwpIHsKKyAgICAgICAgZGIubG9jayhzcWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IFNRTGl0ZUNvbXBpbGVkU3FsKGRiLCBzcWwpLnJlbGVhc2VTcWxTdGF0ZW1lbnQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRiLnVubG9jaygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC01NDEsNyArNTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtU3RyaWN0UHJvamVjdGlvbk1hcCAmJgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1TdHJpY3QgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHVzZXJDb2x1bW4uY29udGFpbnMoIiBBUyAiKSB8fCB1c2VyQ29sdW1uLmNvbnRhaW5zKCIgYXMgIikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIGNvbHVtbiBhbGlhcyBhbHJlYWR5IGV4aXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uW2ldID0gdXNlckNvbHVtbjsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEKaW5kZXggZDVjNGFjZS4uMzM4ZTZjOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEKQEAgLTE2LDIyICsxNiwyMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmU7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuSW1hZ2VGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCiAvKioKICAqIFRoZSBDYW1lcmEgY2xhc3MgaXMgdXNlZCB0byBzZXQgaW1hZ2UgY2FwdHVyZSBzZXR0aW5ncywgc3RhcnQvc3RvcCBwcmV2aWV3LApAQCAtMTczLDE2ICsxNzMsMTYgQEAKICAgICAgICAgcHVibGljIGludCBmYWNpbmc7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgY2FtZXJhIGltYWdlLiBUaGUgdmFsdWUgaXMgdGhlIGFuZ2xlIHRoYXQgdGhlCisgICAgICAgICAqIDxwPlRoZSBvcmllbnRhdGlvbiBvZiB0aGUgY2FtZXJhIGltYWdlLiBUaGUgdmFsdWUgaXMgdGhlIGFuZ2xlIHRoYXQgdGhlCiAgICAgICAgICAqIGNhbWVyYSBpbWFnZSBuZWVkcyB0byBiZSByb3RhdGVkIGNsb2Nrd2lzZSBzbyBpdCBzaG93cyBjb3JyZWN0bHkgb24KLSAgICAgICAgICogdGhlIGRpc3BsYXkgaW4gaXRzIG5hdHVyYWwgb3JpZW50YXRpb24uIEl0IHNob3VsZCBiZSAwLCA5MCwgMTgwLCBvciAyNzAuCisgICAgICAgICAqIHRoZSBkaXNwbGF5IGluIGl0cyBuYXR1cmFsIG9yaWVudGF0aW9uLiBJdCBzaG91bGQgYmUgMCwgOTAsIDE4MCwgb3IgMjcwLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBkZXZpY2UgaGFzIGEgbmF0dXJhbGx5IHRhbGwgc2NyZWVuLiBUaGUKKyAgICAgICAgICogPHA+Rm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBkZXZpY2UgaGFzIGEgbmF0dXJhbGx5IHRhbGwgc2NyZWVuLiBUaGUKICAgICAgICAgICogYmFjay1mYWNpbmcgY2FtZXJhIHNlbnNvciBpcyBtb3VudGVkIGluIGxhbmRzY2FwZS4gWW91IGFyZSBsb29raW5nIGF0CiAgICAgICAgICAqIHRoZSBzY3JlZW4uIElmIHRoZSB0b3Agc2lkZSBvZiB0aGUgY2FtZXJhIHNlbnNvciBpcyBhbGlnbmVkIHdpdGggdGhlCiAgICAgICAgICAqIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNjcmVlbiBpbiBuYXR1cmFsIG9yaWVudGF0aW9uLCB0aGUgdmFsdWUgc2hvdWxkIGJlCiAgICAgICAgICAqIDkwLiBJZiB0aGUgdG9wIHNpZGUgb2YgYSBmcm9udC1mYWNpbmcgY2FtZXJhIHNlbnNvciBpcyBhbGlnbmVkIHdpdGgKLSAgICAgICAgICogdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW4sIHRoZSB2YWx1ZSBzaG91bGQgYmUgMjcwLgorICAgICAgICAgKiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbiwgdGhlIHZhbHVlIHNob3VsZCBiZSAyNzAuPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAc2VlICNzZXREaXNwbGF5T3JpZW50YXRpb24oaW50KQogICAgICAgICAgKiBAc2VlIFBhcmFtZXRlcnMjc2V0Um90YXRpb24oaW50KQpAQCAtMjE2LDcgKzIxNiw5IEBACiAgICAgICogICAgIHtAbGluayAjZ2V0TnVtYmVyT2ZDYW1lcmFzKCl9LTEuCiAgICAgICogQHJldHVybiBhIG5ldyBDYW1lcmEgb2JqZWN0LCBjb25uZWN0ZWQsIGxvY2tlZCBhbmQgcmVhZHkgZm9yIHVzZS4KICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgY29ubmVjdGlvbiB0byB0aGUgY2FtZXJhIHNlcnZpY2UgZmFpbHMgKGZvcgotICAgICAqICAgICBleGFtcGxlLCBpZiB0aGUgY2FtZXJhIGlzIGluIHVzZSBieSBhbm90aGVyIHByb2Nlc3MpLgorICAgICAqICAgICBleGFtcGxlLCBpZiB0aGUgY2FtZXJhIGlzIGluIHVzZSBieSBhbm90aGVyIHByb2Nlc3Mgb3IgZGV2aWNlIHBvbGljeQorICAgICAqICAgICBtYW5hZ2VyIGhhcyBkaXNhYmxlZCB0aGUgY2FtZXJhKS4KKyAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLmFkbWluLkRldmljZVBvbGljeU1hbmFnZXIjZ2V0Q2FtZXJhRGlzYWJsZWQoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDYW1lcmEgb3BlbihpbnQgY2FtZXJhSWQpIHsKICAgICAgICAgcmV0dXJuIG5ldyBDYW1lcmEoY2FtZXJhSWQpOwpAQCAtMzc1LDcgKzM3Nyw3IEBACiAgICAgICogVGhlIHByZXZpZXcgc3VyZmFjZSB0ZXh0dXJlIG1heSBub3Qgb3RoZXJ3aXNlIGNoYW5nZSB3aGlsZSBwcmV2aWV3IGlzCiAgICAgICogcnVubmluZy4KICAgICAgKgotICAgICAqIFRoZSB0aW1lc3RhbXBzIHByb3ZpZGVkIGJ5IHtAbGluayBTdXJmYWNlVGV4dHVyZSNnZXRUaW1lc3RhbXAoKX0gZm9yIGEKKyAgICAgKiA8cD5UaGUgdGltZXN0YW1wcyBwcm92aWRlZCBieSB7QGxpbmsgU3VyZmFjZVRleHR1cmUjZ2V0VGltZXN0YW1wKCl9IGZvciBhCiAgICAgICogU3VyZmFjZVRleHR1cmUgc2V0IGFzIHRoZSBwcmV2aWV3IHRleHR1cmUgaGF2ZSBhbiB1bnNwZWNpZmllZCB6ZXJvIHBvaW50LAogICAgICAqIGFuZCBjYW5ub3QgYmUgZGlyZWN0bHkgY29tcGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgY2FtZXJhcyBvciBkaWZmZXJlbnQKICAgICAgKiBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2FtZXJhLCBvciBhY3Jvc3MgbXVsdGlwbGUgcnVucyBvZiB0aGUgc2FtZQpAQCAtNTYxLDEyICs1NjMsMTIgQEAKICAgICAgKiBpcyB1c2VkIHdoaWxlIGNhbGxpbmcge0BsaW5rICN0YWtlUGljdHVyZShDYW1lcmEuU2h1dHRlckNhbGxiYWNrLAogICAgICAqIENhbWVyYS5QaWN0dXJlQ2FsbGJhY2ssIENhbWVyYS5QaWN0dXJlQ2FsbGJhY2ssIENhbWVyYS5QaWN0dXJlQ2FsbGJhY2spfS4KICAgICAgKgotICAgICAqIFBsZWFzZSBub3RlIHRoYXQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIG1vZGUgZm9yIGFwcGxpY2F0aW9uLW1hbmFnZWQKLSAgICAgKiBjYWxsYmFjayBidWZmZXJzIGlzIHRyaWdnZXJlZC4gSWYgdGhpcyBtZXRob2QgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLAotICAgICAqIG51bGwgd2lsbCBiZSByZXR1cm5lZCBieSB0aGUgcmF3IGltYWdlIGNhbGxiYWNrIHNpbmNlIHRoZXJlIGlzCi0gICAgICogbm8gaW1hZ2UgY2FsbGJhY2sgYnVmZmVyIGF2YWlsYWJsZS4gRnVydGhlcm1vcmUsIFdoZW4gYSBzdXBwbGllZCBidWZmZXIKLSAgICAgKiBpcyB0b28gc21hbGwgdG8gaG9sZCB0aGUgcmF3IGltYWdlIGRhdGEsIHJhdyBpbWFnZSBjYWxsYmFjayB3aWxsIHJldHVybgotICAgICAqIG51bGwgYW5kIHRoZSBidWZmZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlciBxdWV1ZS4KKyAgICAgKiA8cD5QbGVhc2Ugbm90ZSB0aGF0IGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBtb2RlIGZvcgorICAgICAqIGFwcGxpY2F0aW9uLW1hbmFnZWQgY2FsbGJhY2sgYnVmZmVycyBpcyB0cmlnZ2VyZWQuIElmIHRoaXMgbWV0aG9kIGhhcworICAgICAqIG5ldmVyIGJlZW4gY2FsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIHJhdyBpbWFnZSBjYWxsYmFjayBzaW5jZQorICAgICAqIHRoZXJlIGlzIG5vIGltYWdlIGNhbGxiYWNrIGJ1ZmZlciBhdmFpbGFibGUuIEZ1cnRoZXJtb3JlLCBXaGVuIGEgc3VwcGxpZWQKKyAgICAgKiBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgdGhlIHJhdyBpbWFnZSBkYXRhLCByYXcgaW1hZ2UgY2FsbGJhY2sgd2lsbAorICAgICAqIHJldHVybiBudWxsIGFuZCB0aGUgYnVmZmVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIgcXVldWUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2FsbGJhY2tCdWZmZXIgdGhlIGJ1ZmZlciB0byBhZGQgdG8gdGhlIHJhdyBpbWFnZSBjYWxsYmFjayBidWZmZXIKICAgICAgKiAgICAgcXVldWUuIFRoZSBzaXplIHNob3VsZCBiZSB3aWR0aCAqIGhlaWdodCAqIChiaXRzIHBlciBwaXhlbCkgLyA4LiBBbgpAQCAtODM0LDggKzgzNiw2IEBACiAgICAgICogQHBhcmFtIHJhdyAgICAgICB0aGUgY2FsbGJhY2sgZm9yIHJhdyAodW5jb21wcmVzc2VkKSBpbWFnZSBkYXRhLCBvciBudWxsCiAgICAgICogQHBhcmFtIHBvc3R2aWV3ICBjYWxsYmFjayB3aXRoIHBvc3R2aWV3IGltYWdlIGRhdGEsIG1heSBiZSBudWxsCiAgICAgICogQHBhcmFtIGpwZWcgICAgICB0aGUgY2FsbGJhY2sgZm9yIEpQRUcgaW1hZ2UgZGF0YSwgb3IgbnVsbAotICAgICAqCi0gICAgICogQHNlZSAjYWRkUmF3SW1hZ2VDYWxsYmFja0J1ZmZlcihieXRlW10pCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGFrZVBpY3R1cmUoU2h1dHRlckNhbGxiYWNrIHNodXR0ZXIsIFBpY3R1cmVDYWxsYmFjayByYXcsCiAgICAgICAgICAgICBQaWN0dXJlQ2FsbGJhY2sgcG9zdHZpZXcsIFBpY3R1cmVDYWxsYmFjayBqcGVnKSB7CkBAIC0xMDg0LDE3ICsxMDg0LDQyIEBACiAgICAgfTsKIAogICAgIC8qKgotICAgICAqIEFyZWEgY2xhc3MgZm9yIGZvY3VzLgorICAgICAqIDxwPlRoZSBBcmVhIGNsYXNzIGlzIHVzZWQgZm9yIGNob29zaW5nIHNwZWNpZmljIG1ldGVyaW5nIGFuZCBmb2N1cyBhcmVhcyBmb3IKKyAgICAgKiB0aGUgY2FtZXJhIHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIGF1dG8tZXhwb3N1cmUsIGF1dG8td2hpdGUgYmFsYW5jZSwgYW5kCisgICAgICogYXV0by1mb2N1cy48L3A+CiAgICAgICoKLSAgICAgKiBAc2VlICNzZXRGb2N1c0FyZWFzKExpc3QpCi0gICAgICogQHNlZSAjZ2V0Rm9jdXNBcmVhcygpCisgICAgICogPHA+VG8gZmluZCBvdXQgaG93IG1hbnkgc2ltdWx0YW5lb3VzIGFyZWFzIGEgZ2l2ZW4gY2FtZXJhIHN1cHBvcnRzLCB1c2UKKyAgICAgKiB7QGxpbmsgUGFyYW1ldGVycyNnZXRNYXhOdW1NZXRlcmluZ0FyZWFzKCl9IGFuZAorICAgICAqIHtAbGluayBQYXJhbWV0ZXJzI2dldE1heE51bUZvY3VzQXJlYXMoKX0uIElmIG1ldGVyaW5nIG9yIGZvY3VzaW5nIGFyZWEKKyAgICAgKiBzZWxlY3Rpb24gaXMgdW5zdXBwb3J0ZWQsIHRoZXNlIG1ldGhvZHMgd2lsbCByZXR1cm4gMC48L3A+CisgICAgICoKKyAgICAgKiA8cD5FYWNoIEFyZWEgY29uc2lzdHMgb2YgYSByZWN0YW5nbGUgc3BlY2lmeWluZyBpdHMgYm91bmRzLCBhbmQgYSB3ZWlnaHQKKyAgICAgKiB0aGF0IGRldGVybWluZXMgaXRzIGltcG9ydGFuY2UuIFRoZSBib3VuZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjYW1lcmEncworICAgICAqIGN1cnJlbnQgZmllbGQgb2Ygdmlldy4gVGhlIGNvb3JkaW5hdGVzIGFyZSBtYXBwZWQgc28gdGhhdCAoLTEwMDAsIC0xMDAwKQorICAgICAqIGlzIGFsd2F5cyB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcsIGFuZCAoMTAwMCwKKyAgICAgKiAxMDAwKSBpcyBhbHdheXMgdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgdGhlIGN1cnJlbnQgZmllbGQgb2YKKyAgICAgKiB2aWV3LiBTZXR0aW5nIEFyZWFzIHdpdGggYm91bmRzIG91dHNpZGUgdGhhdCByYW5nZSBpcyBub3QgYWxsb3dlZC4gQXJlYXMKKyAgICAgKiB3aXRoIHplcm8gb3IgbmVnYXRpdmUgd2lkdGggb3IgaGVpZ2h0IGFyZSBub3QgYWxsb3dlZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgd2VpZ2h0IG11c3QgcmFuZ2UgZnJvbSAxIHRvIDEwMDAsIGFuZCByZXByZXNlbnRzIGEgd2VpZ2h0IGZvcgorICAgICAqIGV2ZXJ5IHBpeGVsIGluIHRoZSBhcmVhLiBUaGlzIG1lYW5zIHRoYXQgYSBsYXJnZSBtZXRlcmluZyBhcmVhIHdpdGgKKyAgICAgKiB0aGUgc2FtZSB3ZWlnaHQgYXMgYSBzbWFsbGVyIGFyZWEgd2lsbCBoYXZlIG1vcmUgZWZmZWN0IGluIHRoZQorICAgICAqIG1ldGVyaW5nIHJlc3VsdC4gIE1ldGVyaW5nIGFyZWFzIGNhbiBvdmVybGFwIGFuZCB0aGUgZHJpdmVyCisgICAgICogd2lsbCBhZGQgdGhlIHdlaWdodHMgaW4gdGhlIG92ZXJsYXAgcmVnaW9uLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgUGFyYW1ldGVycyNzZXRGb2N1c0FyZWFzKExpc3QpCisgICAgICogQHNlZSBQYXJhbWV0ZXJzI2dldEZvY3VzQXJlYXMoKQorICAgICAqIEBzZWUgUGFyYW1ldGVycyNnZXRNYXhOdW1Gb2N1c0FyZWFzKCkKKyAgICAgKiBAc2VlIFBhcmFtZXRlcnMjc2V0TWV0ZXJpbmdBcmVhcyhMaXN0KQorICAgICAqIEBzZWUgUGFyYW1ldGVycyNnZXRNZXRlcmluZ0FyZWFzKCkKKyAgICAgKiBAc2VlIFBhcmFtZXRlcnMjZ2V0TWF4TnVtTWV0ZXJpbmdBcmVhcygpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmVhIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZSBhbiBhcmVhIHdpdGggc3BlY2lmaWVkIHJlY3RhbmdsZSBhbmQgd2VpZ2h0LgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVjdCB0aGUgcmVjdGFuZ2xlIG9mIHRoZSBhcmVhCi0gICAgICAgICAqIEBwYXJhbSB3ZWlnaHQgdGhlIHdlaWdodCBvZiB0aGUgYXJlYQorICAgICAgICAgKiBAcGFyYW0gcmVjdCB0aGUgYm91bmRzIG9mIHRoZSBhcmVhLgorICAgICAgICAgKiBAcGFyYW0gd2VpZ2h0IHRoZSB3ZWlnaHQgb2YgdGhlIGFyZWEuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgQXJlYShSZWN0IHJlY3QsIGludCB3ZWlnaHQpIHsKICAgICAgICAgICAgIHRoaXMucmVjdCA9IHJlY3Q7CkBAIC0xMTIxLDEyICsxMTQ2LDMwIEBACiAgICAgICAgICAgICByZXR1cm4gd2VpZ2h0ID09IGEud2VpZ2h0OwogICAgICAgICB9CiAKLSAgICAgICAgLyoqIHJlY3RhbmdsZSBvZiB0aGUgYXJlYSAqLworICAgICAgICAvKioKKyAgICAgICAgICogQm91bmRzIG9mIHRoZSBhcmVhLiAoLTEwMDAsIC0xMDAwKSByZXByZXNlbnRzIHRoZSB0b3AtbGVmdCBvZiB0aGUKKyAgICAgICAgICogY2FtZXJhIGZpZWxkIG9mIHZpZXcsIGFuZCAoMTAwMCwgMTAwMCkgcmVwcmVzZW50cyB0aGUgYm90dG9tLXJpZ2h0IG9mCisgICAgICAgICAqIHRoZSBmaWVsZCBvZiB2aWV3LiBTZXR0aW5nIGJvdW5kcyBvdXRzaWRlIHRoYXQgcmFuZ2UgaXMgbm90CisgICAgICAgICAqIGFsbG93ZWQuIEJvdW5kcyB3aXRoIHplcm8gb3IgbmVnYXRpdmUgd2lkdGggb3IgaGVpZ2h0IGFyZSBub3QKKyAgICAgICAgICogYWxsb3dlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBQYXJhbWV0ZXJzI2dldEZvY3VzQXJlYXMoKQorICAgICAgICAgKiBAc2VlIFBhcmFtZXRlcnMjZ2V0TWV0ZXJpbmdBcmVhcygpCisgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgUmVjdCByZWN0OwogCi0gICAgICAgIC8qKiB3ZWlnaHQgb2YgdGhlIGFyZWEgKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFdlaWdodCBvZiB0aGUgYXJlYS4gVGhlIHdlaWdodCBtdXN0IHJhbmdlIGZyb20gMSB0byAxMDAwLCBhbmQKKyAgICAgICAgICogcmVwcmVzZW50cyBhIHdlaWdodCBmb3IgZXZlcnkgcGl4ZWwgaW4gdGhlIGFyZWEuIFRoaXMgbWVhbnMgdGhhdCBhCisgICAgICAgICAqIGxhcmdlIG1ldGVyaW5nIGFyZWEgd2l0aCB0aGUgc2FtZSB3ZWlnaHQgYXMgYSBzbWFsbGVyIGFyZWEgd2lsbCBoYXZlCisgICAgICAgICAqIG1vcmUgZWZmZWN0IGluIHRoZSBtZXRlcmluZyByZXN1bHQuICBNZXRlcmluZyBhcmVhcyBjYW4gb3ZlcmxhcCBhbmQKKyAgICAgICAgICogdGhlIGRyaXZlciB3aWxsIGFkZCB0aGUgd2VpZ2h0cyBpbiB0aGUgb3ZlcmxhcCByZWdpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgUGFyYW1ldGVycyNnZXRGb2N1c0FyZWFzKCkKKyAgICAgICAgICogQHNlZSBQYXJhbWV0ZXJzI2dldE1ldGVyaW5nQXJlYXMoKQorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCB3ZWlnaHQ7Ci0gICAgfTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDYW1lcmEgc2VydmljZSBzZXR0aW5ncy4KQEAgLTE2MjAsMTUgKzE2NjMsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBzdXBwb3J0ZWQgdmlkZW8gZnJhbWUgc2l6ZXMgdGhhdCBjYW4gYmUgdXNlZCBieQotICAgICAgICAgKiBNZWRpYVJlY29yZGVyLgorICAgICAgICAgKiA8cD5HZXRzIHRoZSBzdXBwb3J0ZWQgdmlkZW8gZnJhbWUgc2l6ZXMgdGhhdCBjYW4gYmUgdXNlZCBieQorICAgICAgICAgKiBNZWRpYVJlY29yZGVyLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhlIHJldHVybmVkIGxpc3QgaXMgbm90IG51bGwsIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgY29udGFpbiBhdAorICAgICAgICAgKiA8cD5JZiB0aGUgcmV0dXJuZWQgbGlzdCBpcyBub3QgbnVsbCwgdGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGF0CiAgICAgICAgICAqIGxlYXN0IG9uZSBTaXplIGFuZCBvbmUgb2YgdGhlIHNpemVzIGluIHRoZSByZXR1cm5lZCBsaXN0IG11c3QgYmUKICAgICAgICAgICogcGFzc2VkIHRvIE1lZGlhUmVjb3JkZXIuc2V0VmlkZW9TaXplKCkgZm9yIGNhbWNvcmRlciBhcHBsaWNhdGlvbiBpZgogICAgICAgICAgKiBjYW1lcmEgaXMgdXNlZCBhcyB0aGUgdmlkZW8gc291cmNlLiBJbiB0aGlzIGNhc2UsIHRoZSBzaXplIG9mIHRoZQogICAgICAgICAgKiBwcmV2aWV3IGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVjb3JkZWQgdmlkZW8KLSAgICAgICAgICogZHVyaW5nIHZpZGVvIHJlY29yZGluZy4KKyAgICAgICAgICogZHVyaW5nIHZpZGVvIHJlY29yZGluZy48L3A+CiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIFNpemUgb2JqZWN0IGlmIGNhbWVyYSBoYXMgc2VwYXJhdGUgcHJldmlldyBhbmQKICAgICAgICAgICogICAgICAgICB2aWRlbyBvdXRwdXQ7IG90aGVyd2lzZSwgbnVsbCBpcyByZXR1cm5lZC4KQEAgLTE2NjAsMTIgKzE3MDMsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBkaW1lbnNpb25zIGZvciBFWElGIHRodW1ibmFpbCBpbiBKcGVnIHBpY3R1cmUuIElmCisgICAgICAgICAqIDxwPlNldHMgdGhlIGRpbWVuc2lvbnMgZm9yIEVYSUYgdGh1bWJuYWlsIGluIEpwZWcgcGljdHVyZS4gSWYKICAgICAgICAgICogYXBwbGljYXRpb25zIHNldCBib3RoIHdpZHRoIGFuZCBoZWlnaHQgdG8gMCwgRVhJRiB3aWxsIG5vdCBjb250YWluCi0gICAgICAgICAqIHRodW1ibmFpbC4KKyAgICAgICAgICogdGh1bWJuYWlsLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogQXBwbGljYXRpb25zIG5lZWQgdG8gY29uc2lkZXIgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24uIFNlZSB7QGxpbmsKLSAgICAgICAgICogI3NldFByZXZpZXdTaXplKGludCxpbnQpfSBmb3IgcmVmZXJlbmNlLgorICAgICAgICAgKiA8cD5BcHBsaWNhdGlvbnMgbmVlZCB0byBjb25zaWRlciB0aGUgZGlzcGxheSBvcmllbnRhdGlvbi4gU2VlIHtAbGluaworICAgICAgICAgKiAjc2V0UHJldmlld1NpemUoaW50LGludCl9IGZvciByZWZlcmVuY2UuPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gd2lkdGggIHRoZSB3aWR0aCBvZiB0aGUgdGh1bWJuYWlsLCBpbiBwaXhlbHMKICAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSB0aHVtYm5haWwsIGluIHBpeGVscwpAQCAtMTg4NSwxMCArMTkyOCwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGRpbWVuc2lvbnMgZm9yIHBpY3R1cmVzLgorICAgICAgICAgKiA8cD5TZXRzIHRoZSBkaW1lbnNpb25zIGZvciBwaWN0dXJlcy48L3A+CiAgICAgICAgICAqCi0gICAgICAgICAqIEFwcGxpY2F0aW9ucyBuZWVkIHRvIGNvbnNpZGVyIHRoZSBkaXNwbGF5IG9yaWVudGF0aW9uLiBTZWUge0BsaW5rCi0gICAgICAgICAqICNzZXRQcmV2aWV3U2l6ZShpbnQsaW50KX0gZm9yIHJlZmVyZW5jZS4KKyAgICAgICAgICogPHA+QXBwbGljYXRpb25zIG5lZWQgdG8gY29uc2lkZXIgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24uIFNlZSB7QGxpbmsKKyAgICAgICAgICogI3NldFByZXZpZXdTaXplKGludCxpbnQpfSBmb3IgcmVmZXJlbmNlLjwvcD4KICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHdpZHRoICB0aGUgd2lkdGggZm9yIHBpY3R1cmVzLCBpbiBwaXhlbHMKICAgICAgICAgICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IGZvciBwaWN0dXJlcywgaW4gcGl4ZWxzCkBAIC0yNzE0LDI2ICsyNzU3LDI2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgZGlzdGFuY2VzIGZyb20gdGhlIGNhbWVyYSB0byB3aGVyZSBhbiBvYmplY3QgYXBwZWFycyB0byBiZQorICAgICAgICAgKiA8cD5HZXRzIHRoZSBkaXN0YW5jZXMgZnJvbSB0aGUgY2FtZXJhIHRvIHdoZXJlIGFuIG9iamVjdCBhcHBlYXJzIHRvIGJlCiAgICAgICAgICAqIGluIGZvY3VzLiBUaGUgb2JqZWN0IGlzIHNoYXJwZXN0IGF0IHRoZSBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlLiBUaGUKLSAgICAgICAgICogZGVwdGggb2YgZmllbGQgaXMgdGhlIGZhciBmb2N1cyBkaXN0YW5jZSBtaW51cyBuZWFyIGZvY3VzIGRpc3RhbmNlLgorICAgICAgICAgKiBkZXB0aCBvZiBmaWVsZCBpcyB0aGUgZmFyIGZvY3VzIGRpc3RhbmNlIG1pbnVzIG5lYXIgZm9jdXMgZGlzdGFuY2UuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBGb2N1cyBkaXN0YW5jZXMgbWF5IGNoYW5nZSBhZnRlciBjYWxsaW5nIHtAbGluaworICAgICAgICAgKiA8cD5Gb2N1cyBkaXN0YW5jZXMgbWF5IGNoYW5nZSBhZnRlciBjYWxsaW5nIHtAbGluawogICAgICAgICAgKiAjYXV0b0ZvY3VzKEF1dG9Gb2N1c0NhbGxiYWNrKX0sIHtAbGluayAjY2FuY2VsQXV0b0ZvY3VzfSwgb3Ige0BsaW5rCiAgICAgICAgICAqICNzdGFydFByZXZpZXcoKX0uIEFwcGxpY2F0aW9ucyBjYW4gY2FsbCB7QGxpbmsgI2dldFBhcmFtZXRlcnMoKX0KICAgICAgICAgICogYW5kIHRoaXMgbWV0aG9kIGFueXRpbWUgdG8gZ2V0IHRoZSBsYXRlc3QgZm9jdXMgZGlzdGFuY2VzLiBJZiB0aGUKICAgICAgICAgICogZm9jdXMgbW9kZSBpcyBGT0NVU19NT0RFX0NPTlRJTlVPVVNfVklERU8sIGZvY3VzIGRpc3RhbmNlcyBtYXkgY2hhbmdlCi0gICAgICAgICAqIGZyb20gdGltZSB0byB0aW1lLgorICAgICAgICAgKiBmcm9tIHRpbWUgdG8gdGltZS48L3A+CiAgICAgICAgICAqCi0gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGVzdGltYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjYW1lcmEKKyAgICAgICAgICogPHA+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgdG8gZXN0aW1hdGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIGNhbWVyYQogICAgICAgICAgKiBhbmQgdGhlIHN1YmplY3QuIEFmdGVyIGF1dG9mb2N1cywgdGhlIHN1YmplY3QgZGlzdGFuY2UgbWF5IGJlIHdpdGhpbgogICAgICAgICAgKiBuZWFyIGFuZCBmYXIgZm9jdXMgZGlzdGFuY2UuIEhvd2V2ZXIsIHRoZSBwcmVjaXNpb24gZGVwZW5kcyBvbiB0aGUKICAgICAgICAgICogY2FtZXJhIGhhcmR3YXJlLCBhdXRvZm9jdXMgYWxnb3JpdGhtLCB0aGUgZm9jdXMgYXJlYSwgYW5kIHRoZSBzY2VuZS4KLSAgICAgICAgICogVGhlIGVycm9yIGNhbiBiZSBsYXJnZSBhbmQgaXQgc2hvdWxkIGJlIG9ubHkgdXNlZCBhcyBhIHJlZmVyZW5jZS4KKyAgICAgICAgICogVGhlIGVycm9yIGNhbiBiZSBsYXJnZSBhbmQgaXQgc2hvdWxkIGJlIG9ubHkgdXNlZCBhcyBhIHJlZmVyZW5jZS48L3A+CiAgICAgICAgICAqCi0gICAgICAgICAqIEZhciBmb2N1cyBkaXN0YW5jZSA+PSBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlID49IG5lYXIgZm9jdXMgZGlzdGFuY2UuCisgICAgICAgICAqIDxwPkZhciBmb2N1cyBkaXN0YW5jZSA+PSBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlID49IG5lYXIgZm9jdXMgZGlzdGFuY2UuCiAgICAgICAgICAqIElmIHRoZSBmb2N1cyBkaXN0YW5jZSBpcyBpbmZpbml0eSwgdGhlIHZhbHVlIHdpbGwgYmUKLSAgICAgICAgICogRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkuCisgICAgICAgICAqIHtAY29kZSBGbG9hdC5QT1NJVElWRV9JTkZJTklUWX0uPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gb3V0cHV0IGZvY3VzIGRpc3RhbmNlcyBpbiBtZXRlcnMuIG91dHB1dCBtdXN0IGJlIGEgZmxvYXQKICAgICAgICAgICogICAgICAgIGFycmF5IHdpdGggdGhyZWUgZWxlbWVudHMuIE5lYXIgZm9jdXMgZGlzdGFuY2UsIG9wdGltYWwgZm9jdXMKQEAgLTI3NjMsNDIgKzI4MDYsNDMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGZvY3VzIGFyZWFzLiBDYW1lcmEgZHJpdmVyIHVzZXMgdGhlIGFyZWFzIHRvIGRlY2lkZQotICAgICAgICAgKiBmb2N1cy4KKyAgICAgICAgICogPHA+R2V0cyB0aGUgY3VycmVudCBmb2N1cyBhcmVhcy4gQ2FtZXJhIGRyaXZlciB1c2VzIHRoZSBhcmVhcyB0byBkZWNpZGUKKyAgICAgICAgICogZm9jdXMuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBCZWZvcmUgdXNpbmcgdGhpcyBBUEkgb3Ige0BsaW5rICNzZXRGb2N1c0FyZWFzKExpc3QpfSwgYXBwcyBzaG91bGQKKyAgICAgICAgICogPHA+QmVmb3JlIHVzaW5nIHRoaXMgQVBJIG9yIHtAbGluayAjc2V0Rm9jdXNBcmVhcyhMaXN0KX0sIGFwcHMgc2hvdWxkCiAgICAgICAgICAqIGNhbGwge0BsaW5rICNnZXRNYXhOdW1Gb2N1c0FyZWFzKCl9IHRvIGtub3cgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgICAqIGZvY3VzIGFyZWFzIGZpcnN0LiBJZiB0aGUgdmFsdWUgaXMgMCwgZm9jdXMgYXJlYSBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgKiBmb2N1cyBhcmVhcyBmaXJzdC4gSWYgdGhlIHZhbHVlIGlzIDAsIGZvY3VzIGFyZWEgaXMgbm90IHN1cHBvcnRlZC48L3A+CiAgICAgICAgICAqCi0gICAgICAgICAqIEVhY2ggZm9jdXMgYXJlYSBpcyBhIHJlY3RhbmdsZSB3aXRoIHNwZWNpZmllZCB3ZWlnaHQuIFRoZSBkaXJlY3Rpb24KKyAgICAgICAgICogPHA+RWFjaCBmb2N1cyBhcmVhIGlzIGEgcmVjdGFuZ2xlIHdpdGggc3BlY2lmaWVkIHdlaWdodC4gVGhlIGRpcmVjdGlvbgogICAgICAgICAgKiBpcyByZWxhdGl2ZSB0byB0aGUgc2Vuc29yIG9yaWVudGF0aW9uLCB0aGF0IGlzLCB3aGF0IHRoZSBzZW5zb3Igc2Vlcy4KICAgICAgICAgICogVGhlIGRpcmVjdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHJvdGF0aW9uIG9yIG1pcnJvcmluZyBvZgogICAgICAgICAgKiB7QGxpbmsgI3NldERpc3BsYXlPcmllbnRhdGlvbihpbnQpfS4gQ29vcmRpbmF0ZXMgb2YgdGhlIHJlY3RhbmdsZQogICAgICAgICAgKiByYW5nZSBmcm9tIC0xMDAwIHRvIDEwMDAuICgtMTAwMCwgLTEwMDApIGlzIHRoZSB1cHBlciBsZWZ0IHBvaW50LgotICAgICAgICAgKiAoMTAwMCwgMTAwMCkgaXMgdGhlIGxvd2VyIHJpZ2h0IHBvaW50LiBUaGUgbGVuZ3RoIGFuZCB3aWR0aCBvZiBmb2N1cwotICAgICAgICAgKiBhcmVhcyBjYW5ub3QgYmUgMCBvciBuZWdhdGl2ZS4KKyAgICAgICAgICogKDEwMDAsIDEwMDApIGlzIHRoZSBsb3dlciByaWdodCBwb2ludC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgZm9jdXMKKyAgICAgICAgICogYXJlYXMgY2Fubm90IGJlIDAgb3IgbmVnYXRpdmUuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBUaGUgd2VpZ2h0IG11c3QgcmFuZ2UgZnJvbSAxIHRvIDEwMDAuIFRoZSB3ZWlnaHQgc2hvdWxkIGJlCisgICAgICAgICAqIDxwPlRoZSB3ZWlnaHQgbXVzdCByYW5nZSBmcm9tIDEgdG8gMTAwMC4gVGhlIHdlaWdodCBzaG91bGQgYmUKICAgICAgICAgICogaW50ZXJwcmV0ZWQgYXMgYSBwZXItcGl4ZWwgd2VpZ2h0IC0gYWxsIHBpeGVscyBpbiB0aGUgYXJlYSBoYXZlIHRoZQogICAgICAgICAgKiBzcGVjaWZpZWQgd2VpZ2h0LiBUaGlzIG1lYW5zIGEgc21hbGwgYXJlYSB3aXRoIHRoZSBzYW1lIHdlaWdodCBhcyBhCiAgICAgICAgICAqIGxhcmdlciBhcmVhIHdpbGwgaGF2ZSBsZXNzIGluZmx1ZW5jZSBvbiB0aGUgZm9jdXNpbmcgdGhhbiB0aGUgbGFyZ2VyCiAgICAgICAgICAqIGFyZWEuIEZvY3VzIGFyZWFzIGNhbiBwYXJ0aWFsbHkgb3ZlcmxhcCBhbmQgdGhlIGRyaXZlciB3aWxsIGFkZCB0aGUKLSAgICAgICAgICogd2VpZ2h0cyBpbiB0aGUgb3ZlcmxhcCByZWdpb24uCisgICAgICAgICAqIHdlaWdodHMgaW4gdGhlIG92ZXJsYXAgcmVnaW9uLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogQSBzcGVjaWFsIGNhc2Ugb2YgbnVsbCBmb2N1cyBhcmVhIG1lYW5zIGRyaXZlciB0byBkZWNpZGUgdGhlIGZvY3VzCi0gICAgICAgICAqIGFyZWEuIEZvciBleGFtcGxlLCB0aGUgZHJpdmVyIG1heSB1c2UgbW9yZSBzaWduYWxzIHRvIGRlY2lkZSBmb2N1cwotICAgICAgICAgKiBhcmVhcyBhbmQgY2hhbmdlIHRoZW0gZHluYW1pY2FsbHkuIEFwcHMgY2FuIHNldCBhbGwtemVybyBpZiB0aGV5IHdhbnQKLSAgICAgICAgICogdGhlIGRyaXZlciB0byBkZWNpZGUgZm9jdXMgYXJlYXMuCisgICAgICAgICAqIDxwPkEgc3BlY2lhbCBjYXNlIG9mIGEge0Bjb2RlIG51bGx9IGZvY3VzIGFyZWEgbGlzdCBtZWFucyB0aGUgZHJpdmVyIGlzCisgICAgICAgICAqIGZyZWUgdG8gc2VsZWN0IGZvY3VzIHRhcmdldHMgYXMgaXQgd2FudHMuIEZvciBleGFtcGxlLCB0aGUgZHJpdmVyIG1heQorICAgICAgICAgKiB1c2UgbW9yZSBzaWduYWxzIHRvIHNlbGVjdCBmb2N1cyBhcmVhcyBhbmQgY2hhbmdlIHRoZW0KKyAgICAgICAgICogZHluYW1pY2FsbHkuIEFwcHMgY2FuIHNldCB0aGUgZm9jdXMgYXJlYSBsaXN0IHRvIHtAY29kZSBudWxsfSBpZiB0aGV5CisgICAgICAgICAqIHdhbnQgdGhlIGRyaXZlciB0byBjb21wbGV0ZWx5IGNvbnRyb2wgZm9jdXNpbmcuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBGb2N1cyBhcmVhcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmllbGQgb2YgdmlldworICAgICAgICAgKiA8cD5Gb2N1cyBhcmVhcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZmllbGQgb2YgdmlldwogICAgICAgICAgKiAoe0BsaW5rICNnZXRab29tKCl9KS4gTm8gbWF0dGVyIHdoYXQgdGhlIHpvb20gbGV2ZWwgaXMsICgtMTAwMCwtMTAwMCkKICAgICAgICAgICogcmVwcmVzZW50cyB0aGUgdG9wIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBjYW1lcmEgZnJhbWUuIFRoZSBmb2N1cwogICAgICAgICAgKiBhcmVhIGNhbm5vdCBiZSBzZXQgdG8gYmUgb3V0c2lkZSB0aGUgY3VycmVudCBmaWVsZCBvZiB2aWV3LCBldmVuCi0gICAgICAgICAqIHdoZW4gdXNpbmcgem9vbS4KKyAgICAgICAgICogd2hlbiB1c2luZyB6b29tLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogRm9jdXMgYXJlYSBvbmx5IGhhcyBlZmZlY3QgaWYgdGhlIGN1cnJlbnQgZm9jdXMgbW9kZSBpcworICAgICAgICAgKiA8cD5Gb2N1cyBhcmVhIG9ubHkgaGFzIGVmZmVjdCBpZiB0aGUgY3VycmVudCBmb2N1cyBtb2RlIGlzCiAgICAgICAgICAqIHtAbGluayAjRk9DVVNfTU9ERV9BVVRPfSwge0BsaW5rICNGT0NVU19NT0RFX01BQ1JPfSwgb3IKLSAgICAgICAgICoge0BsaW5rICNGT0NVU19NT0RFX0NPTlRJTlVPVVNfVklERU99LgorICAgICAgICAgKiB7QGxpbmsgI0ZPQ1VTX01PREVfQ09OVElOVU9VU19WSURFT30uPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjdXJyZW50IGZvY3VzIGFyZWFzCiAgICAgICAgICAqLwpAQCAtMjgyOSw0MSArMjg3Myw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbWV0ZXJpbmcgYXJlYXMuIENhbWVyYSBkcml2ZXIgdXNlcyB0aGVzZSBhcmVhcyB0bwotICAgICAgICAgKiBkZWNpZGUgZXhwb3N1cmUuCisgICAgICAgICAqIDxwPkdldHMgdGhlIGN1cnJlbnQgbWV0ZXJpbmcgYXJlYXMuIENhbWVyYSBkcml2ZXIgdXNlcyB0aGVzZSBhcmVhcyB0bworICAgICAgICAgKiBkZWNpZGUgZXhwb3N1cmUuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBCZWZvcmUgdXNpbmcgdGhpcyBBUEkgb3Ige0BsaW5rICNzZXRNZXRlcmluZ0FyZWFzKExpc3QpfSwgYXBwcyBzaG91bGQKKyAgICAgICAgICogPHA+QmVmb3JlIHVzaW5nIHRoaXMgQVBJIG9yIHtAbGluayAjc2V0TWV0ZXJpbmdBcmVhcyhMaXN0KX0sIGFwcHMgc2hvdWxkCiAgICAgICAgICAqIGNhbGwge0BsaW5rICNnZXRNYXhOdW1NZXRlcmluZ0FyZWFzKCl9IHRvIGtub3cgdGhlIG1heGltdW0gbnVtYmVyIG9mCiAgICAgICAgICAqIG1ldGVyaW5nIGFyZWFzIGZpcnN0LiBJZiB0aGUgdmFsdWUgaXMgMCwgbWV0ZXJpbmcgYXJlYSBpcyBub3QKLSAgICAgICAgICogc3VwcG9ydGVkLgorICAgICAgICAgKiBzdXBwb3J0ZWQuPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBFYWNoIG1ldGVyaW5nIGFyZWEgaXMgYSByZWN0YW5nbGUgd2l0aCBzcGVjaWZpZWQgd2VpZ2h0LiBUaGUKKyAgICAgICAgICogPHA+RWFjaCBtZXRlcmluZyBhcmVhIGlzIGEgcmVjdGFuZ2xlIHdpdGggc3BlY2lmaWVkIHdlaWdodC4gVGhlCiAgICAgICAgICAqIGRpcmVjdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgc2Vuc29yIG9yaWVudGF0aW9uLCB0aGF0IGlzLCB3aGF0IHRoZQogICAgICAgICAgKiBzZW5zb3Igc2Vlcy4gVGhlIGRpcmVjdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHJvdGF0aW9uIG9yCiAgICAgICAgICAqIG1pcnJvcmluZyBvZiB7QGxpbmsgI3NldERpc3BsYXlPcmllbnRhdGlvbihpbnQpfS4gQ29vcmRpbmF0ZXMgb2YgdGhlCiAgICAgICAgICAqIHJlY3RhbmdsZSByYW5nZSBmcm9tIC0xMDAwIHRvIDEwMDAuICgtMTAwMCwgLTEwMDApIGlzIHRoZSB1cHBlciBsZWZ0Ci0gICAgICAgICAqIHBvaW50LiAoMTAwMCwgMTAwMCkgaXMgdGhlIGxvd2VyIHJpZ2h0IHBvaW50LiBUaGUgbGVuZ3RoIGFuZCB3aWR0aCBvZgotICAgICAgICAgKiBtZXRlcmluZyBhcmVhcyBjYW5ub3QgYmUgMCBvciBuZWdhdGl2ZS4KKyAgICAgICAgICogcG9pbnQuICgxMDAwLCAxMDAwKSBpcyB0aGUgbG93ZXIgcmlnaHQgcG9pbnQuIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mCisgICAgICAgICAqIG1ldGVyaW5nIGFyZWFzIGNhbm5vdCBiZSAwIG9yIG5lZ2F0aXZlLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogVGhlIHdlaWdodCBtdXN0IHJhbmdlIGZyb20gMSB0byAxMDAwLCBhbmQgcmVwcmVzZW50cyBhIHdlaWdodCBmb3IKKyAgICAgICAgICogPHA+VGhlIHdlaWdodCBtdXN0IHJhbmdlIGZyb20gMSB0byAxMDAwLCBhbmQgcmVwcmVzZW50cyBhIHdlaWdodCBmb3IKICAgICAgICAgICogZXZlcnkgcGl4ZWwgaW4gdGhlIGFyZWEuIFRoaXMgbWVhbnMgdGhhdCBhIGxhcmdlIG1ldGVyaW5nIGFyZWEgd2l0aAogICAgICAgICAgKiB0aGUgc2FtZSB3ZWlnaHQgYXMgYSBzbWFsbGVyIGFyZWEgd2lsbCBoYXZlIG1vcmUgZWZmZWN0IGluIHRoZQogICAgICAgICAgKiBtZXRlcmluZyByZXN1bHQuICBNZXRlcmluZyBhcmVhcyBjYW4gcGFydGlhbGx5IG92ZXJsYXAgYW5kIHRoZSBkcml2ZXIKLSAgICAgICAgICogd2lsbCBhZGQgdGhlIHdlaWdodHMgaW4gdGhlIG92ZXJsYXAgcmVnaW9uLgorICAgICAgICAgKiB3aWxsIGFkZCB0aGUgd2VpZ2h0cyBpbiB0aGUgb3ZlcmxhcCByZWdpb24uPC9wPgogICAgICAgICAgKgotICAgICAgICAgKiBBIHNwZWNpYWwgY2FzZSBvZiBudWxsIG1ldGVyaW5nIGFyZWEgbWVhbnMgZHJpdmVyIHRvIGRlY2lkZSB0aGUKLSAgICAgICAgICogbWV0ZXJpbmcgYXJlYS4gRm9yIGV4YW1wbGUsIHRoZSBkcml2ZXIgbWF5IHVzZSBtb3JlIHNpZ25hbHMgdG8gZGVjaWRlCi0gICAgICAgICAqIG1ldGVyaW5nIGFyZWFzIGFuZCBjaGFuZ2UgdGhlbSBkeW5hbWljYWxseS4gQXBwcyBjYW4gc2V0IGFsbC16ZXJvIGlmCi0gICAgICAgICAqIHRoZXkgd2FudCB0aGUgZHJpdmVyIHRvIGRlY2lkZSBtZXRlcmluZyBhcmVhcy4KKyAgICAgICAgICogPHA+QSBzcGVjaWFsIGNhc2Ugb2YgYSB7QGNvZGUgbnVsbH0gbWV0ZXJpbmcgYXJlYSBsaXN0IG1lYW5zIHRoZSBkcml2ZXIKKyAgICAgICAgICogaXMgZnJlZSB0byBtZXRlciBhcyBpdCBjaG9vc2VzLiBGb3IgZXhhbXBsZSwgdGhlIGRyaXZlciBtYXkgdXNlIG1vcmUKKyAgICAgICAgICogc2lnbmFscyB0byBzZWxlY3QgbWV0ZXJpbmcgYXJlYXMgYW5kIGNoYW5nZSB0aGVtIGR5bmFtaWNhbGx5LiBBcHBzCisgICAgICAgICAqIGNhbiBzZXQgdGhlIG1ldGVyaW5nIGFyZWEgbGlzdCB0byB7QGNvZGUgbnVsbH0gaWYgdGhleSB3YW50IHRoZQorICAgICAgICAgKiBkcml2ZXIgdG8gY29tcGxldGVseSBjb250cm9sIG1ldGVyaW5nLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogTWV0ZXJpbmcgYXJlYXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcKKyAgICAgICAgICogPHA+TWV0ZXJpbmcgYXJlYXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpZWxkIG9mIHZpZXcKICAgICAgICAgICogKHtAbGluayAjZ2V0Wm9vbSgpfSkuIE5vIG1hdHRlciB3aGF0IHRoZSB6b29tIGxldmVsIGlzLCAoLTEwMDAsLTEwMDApCiAgICAgICAgICAqIHJlcHJlc2VudHMgdGhlIHRvcCBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgY2FtZXJhIGZyYW1lLiBUaGUKICAgICAgICAgICogbWV0ZXJpbmcgYXJlYSBjYW5ub3QgYmUgc2V0IHRvIGJlIG91dHNpZGUgdGhlIGN1cnJlbnQgZmllbGQgb2YgdmlldywKLSAgICAgICAgICogZXZlbiB3aGVuIHVzaW5nIHpvb20uCisgICAgICAgICAqIGV2ZW4gd2hlbiB1c2luZyB6b29tLjwvcD4KICAgICAgICAgICoKLSAgICAgICAgICogTm8gbWF0dGVyIHdoYXQgbWV0ZXJpbmcgYXJlYXMgYXJlLCB0aGUgZmluYWwgZXhwb3N1cmUgYXJlIGNvbXBlbnNhdGVkCi0gICAgICAgICAqIGJ5IHtAbGluayAjc2V0RXhwb3N1cmVDb21wZW5zYXRpb24oaW50KX0uCisgICAgICAgICAqIDxwPk5vIG1hdHRlciB3aGF0IG1ldGVyaW5nIGFyZWFzIGFyZSwgdGhlIGZpbmFsIGV4cG9zdXJlIGFyZSBjb21wZW5zYXRlZAorICAgICAgICAgKiBieSB7QGxpbmsgI3NldEV4cG9zdXJlQ29tcGVuc2F0aW9uKGludCl9LjwvcD4KICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgY3VycmVudCBtZXRlcmluZyBhcmVhcwogICAgICAgICAgKi8KQEAgLTMwMzMsNyArMzA3OCw3IEBACiAgICAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA9PSAwKSByZXR1cm4gbnVsbDsKIAogICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIEFyZWEgYXJlYSA9IChBcmVhKSByZXN1bHQuZ2V0KDApOworICAgICAgICAgICAgICAgIEFyZWEgYXJlYSA9IHJlc3VsdC5nZXQoMCk7CiAgICAgICAgICAgICAgICAgUmVjdCByZWN0ID0gYXJlYS5yZWN0OwogICAgICAgICAgICAgICAgIGlmIChyZWN0LmxlZnQgPT0gMCAmJiByZWN0LnRvcCA9PSAwICYmIHJlY3QucmlnaHQgPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVjdC5ib3R0b20gPT0gMCAmJiBhcmVhLndlaWdodCA9PSAwKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS91c2IvSVVzYk1hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL3VzYi9JVXNiTWFuYWdlci5haWRsCmluZGV4IDVkZjIzNDMuLjJiOWMwODIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL3VzYi9JVXNiTWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL3VzYi9JVXNiTWFuYWdlci5haWRsCkBAIC04MSw0ICs4MSwxMyBAQAogCiAgICAgLyogQ2xlYXJzIGRlZmF1bHQgcHJlZmVyZW5jZXMgYW5kIHBlcm1pc3Npb25zIGZvciB0aGUgcGFja2FnZSAqLwogICAgIHZvaWQgY2xlYXJEZWZhdWx0cyhTdHJpbmcgcGFja2FnZU5hbWUpOworCisgICAgLyogU2V0cyB0aGUgY3VycmVudCBwcmltYXJ5IFVTQiBmdW5jdGlvbi4gKi8KKyAgICB2b2lkIHNldFByaW1hcnlGdW5jdGlvbihTdHJpbmcgZnVuY3Rpb25zKTsKKworICAgIC8qIFNldHMgdGhlIGRlZmF1bHQgcHJpbWFyeSBVU0IgZnVuY3Rpb24uICovCisgICAgdm9pZCBzZXREZWZhdWx0RnVuY3Rpb24oU3RyaW5nIGZ1bmN0aW9ucyk7CisKKyAgICAvKiBTZXRzIHRoZSBmaWxlIHBhdGggZm9yIFVTQiBtYXNzIHN0b3JhZ2UgYmFja2luZyBmaWxlLiAqLworICAgIHZvaWQgc2V0TWFzc1N0b3JhZ2VCYWNraW5nRmlsZShTdHJpbmcgcGF0aCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS91c2IvVXNiTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvdXNiL1VzYk1hbmFnZXIuamF2YQppbmRleCA2MGIzN2ExLi5hODI4YTIzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS91c2IvVXNiTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL3VzYi9Vc2JNYW5hZ2VyLmphdmEKQEAgLTIyLDEyICsyMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAogLyoqCkBAIC01MCwxMSArNDcsMjAgQEAKICAgICAgKiBUaGlzIGlzIGEgc3RpY2t5IGJyb2FkY2FzdCBmb3IgY2xpZW50cyB0aGF0IGluY2x1ZGVzIFVTQiBjb25uZWN0ZWQvZGlzY29ubmVjdGVkIHN0YXRlLAogICAgICAqIDx1bD4KICAgICAgKiA8bGk+IHtAbGluayAjVVNCX0NPTk5FQ1RFRH0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgVVNCIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQuCi0gICAgICogPGxpPiB7QGxpbmsgI1VTQl9DT05GSUdVUkFUSU9OfSBhIEJ1bmRsZSBjb250YWluaW5nIG5hbWUvdmFsdWUgcGFpcnMgd2hlcmUgdGhlIG5hbWUKLSAgICAgKiBpcyB0aGUgbmFtZSBvZiBhIFVTQiBmdW5jdGlvbiBhbmQgdGhlIHZhbHVlIGlzIGVpdGhlciB7QGxpbmsgI1VTQl9GVU5DVElPTl9FTkFCTEVEfQotICAgICAqIG9yIHtAbGluayAjVVNCX0ZVTkNUSU9OX0RJU0FCTEVEfS4gIFRoZSBwb3NzaWJsZSBmdW5jdGlvbiBuYW1lcyBpbmNsdWRlCi0gICAgICoge0BsaW5rICNVU0JfRlVOQ1RJT05fTUFTU19TVE9SQUdFfSwge0BsaW5rICNVU0JfRlVOQ1RJT05fQURCfSwge0BsaW5rICNVU0JfRlVOQ1RJT05fUk5ESVN9LAotICAgICAqIHtAbGluayAjVVNCX0ZVTkNUSU9OX01UUH0gYW5kIHtAbGluayAjVVNCX0ZVTkNUSU9OX0FDQ0VTU09SWX0uCisgICAgICogPGxpPiB7QGxpbmsgI1VTQl9DT05GSUdVUkVEfSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29uZmlndXJlZC4KKyAgICAgKiBjdXJyZW50bHkgemVybyBpZiBub3QgY29uZmlndXJlZCwgb25lIGZvciBjb25maWd1cmVkLgorICAgICAqIDxsaT4ge0BsaW5rICNVU0JfRlVOQ1RJT05fTUFTU19TVE9SQUdFfSBib29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAgICAgKiBtYXNzIHN0b3JhZ2UgZnVuY3Rpb24gaXMgZW5hYmxlZAorICAgICAqIDxsaT4ge0BsaW5rICNVU0JfRlVOQ1RJT05fQURCfSBib29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAgICAgKiBhZGIgZnVuY3Rpb24gaXMgZW5hYmxlZAorICAgICAqIDxsaT4ge0BsaW5rICNVU0JfRlVOQ1RJT05fUk5ESVN9IGJvb2xlYW4gZXh0cmEgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICAgICAqIFJORElTIGV0aGVybmV0IGZ1bmN0aW9uIGlzIGVuYWJsZWQKKyAgICAgKiA8bGk+IHtAbGluayAjVVNCX0ZVTkNUSU9OX01UUH0gYm9vbGVhbiBleHRyYSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgICAgICogTVRQIGZ1bmN0aW9uIGlzIGVuYWJsZWQKKyAgICAgKiA8bGk+IHtAbGluayAjVVNCX0ZVTkNUSU9OX1BUUH0gYm9vbGVhbiBleHRyYSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgICAgICogUFRQIGZ1bmN0aW9uIGlzIGVuYWJsZWQKKyAgICAgKiA8bGk+IHtAbGluayAjVVNCX0ZVTkNUSU9OX1BUUH0gYm9vbGVhbiBleHRyYSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgICAgICogYWNjZXNzb3J5IGZ1bmN0aW9uIGlzIGVuYWJsZWQKICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICoge0BoaWRlfQpAQCAtMTE5LDEyICsxMjUsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfQ09OTkVDVEVEID0gImNvbm5lY3RlZCI7CiAKICAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGV4dHJhIGNvbnRhaW5pbmcgY3VycmVudGx5IHNldCBVU0IgY29uZmlndXJhdGlvbi4KKyAgICAgKiBCb29sZWFuIGV4dHJhIGluZGljYXRpbmcgd2hldGhlciBVU0IgaXMgY29uZmlndXJlZC4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0LgogICAgICAqCiAgICAgICoge0BoaWRlfQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05GSUdVUkFUSU9OID0gImNvbmZpZ3VyYXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05GSUdVUkVEID0gImNvbmZpZ3VyZWQiOwogCiAgICAgLyoqCiAgICAgICogTmFtZSBvZiB0aGUgVVNCIG1hc3Mgc3RvcmFnZSBVU0IgZnVuY3Rpb24uCkBAIC0xNTksNiArMTY1LDE0IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OX01UUCA9ICJtdHAiOwogCiAgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgUFRQIFVTQiBmdW5jdGlvbi4KKyAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0CisgICAgICoKKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OX1BUUCA9ICJwdHAiOworCisgICAgLyoqCiAgICAgICogTmFtZSBvZiB0aGUgQWNjZXNzb3J5IFVTQiBmdW5jdGlvbi4KICAgICAgKiBVc2VkIGluIGV4dHJhcyBmb3IgdGhlIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0CiAgICAgICoKQEAgLTE2NywyNCArMTgxLDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfRlVOQ1RJT05fQUNDRVNTT1JZID0gImFjY2Vzc29yeSI7CiAKICAgICAvKioKLSAgICAgKiBWYWx1ZSBpbmRpY2F0aW5nIHRoYXQgYSBVU0IgZnVuY3Rpb24gaXMgZW5hYmxlZC4KLSAgICAgKiBVc2VkIGluIHtAbGluayAjVVNCX0NPTkZJR1VSQVRJT059IGV4dHJhcyBidW5kbGUgZm9yIHRoZQotICAgICAqIHtAbGluayAjQUNUSU9OX1VTQl9TVEFURX0gYnJvYWRjYXN0Ci0gICAgICoKLSAgICAgKiB7QGhpZGV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBWYWx1ZSBpbmRpY2F0aW5nIHRoYXQgYSBVU0IgZnVuY3Rpb24gaXMgZGlzYWJsZWQuCi0gICAgICogVXNlZCBpbiB7QGxpbmsgI1VTQl9DT05GSUdVUkFUSU9OfSBleHRyYXMgYnVuZGxlIGZvciB0aGUKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9VU0JfU1RBVEV9IGJyb2FkY2FzdAotICAgICAqCi0gICAgICoge0BoaWRlfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9GVU5DVElPTl9ESVNBQkxFRCA9ICJkaXNhYmxlZCI7Ci0KLSAgICAvKioKICAgICAgKiBOYW1lIG9mIGV4dHJhIGZvciB7QGxpbmsgI0FDVElPTl9VU0JfREVWSUNFX0FUVEFDSEVEfSBhbmQKICAgICAgKiB7QGxpbmsgI0FDVElPTl9VU0JfREVWSUNFX0RFVEFDSEVEfSBicm9hZGNhc3RzCiAgICAgICogY29udGFpbmluZyB0aGUgVXNiRGV2aWNlIG9iamVjdCBmb3IgdGhlIGRldmljZS4KQEAgLTM4OSwyMSArMzg1LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBGaWxlIGdldEZ1bmN0aW9uRW5hYmxlRmlsZShTdHJpbmcgZnVuY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCIvc3lzL2NsYXNzL3VzYl9jb21wb3NpdGUvIiArIGZ1bmN0aW9uICsgIi9lbmFibGUiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBVU0IgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuCi0gICAgICogTm90ZSB0aGF0IGEgVVNCIGZ1bmN0aW9uIG1heWJlIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnVuY3Rpb24gbmFtZSBvZiB0aGUgVVNCIGZ1bmN0aW9uCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBVU0IgZnVuY3Rpb24gaXMgc3VwcG9ydGVkLgotICAgICAqCi0gICAgICoge0BoaWRlfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Z1bmN0aW9uU3VwcG9ydGVkKFN0cmluZyBmdW5jdGlvbikgewotICAgICAgICByZXR1cm4gZ2V0RnVuY3Rpb25FbmFibGVGaWxlKGZ1bmN0aW9uKS5leGlzdHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb3BlcnR5Q29udGFpbnNGdW5jdGlvbihTdHJpbmcgcHJvcGVydHksIFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICBTdHJpbmcgZnVuY3Rpb25zID0gU3lzdGVtUHJvcGVydGllcy5nZXQocHJvcGVydHksICIiKTsKKyAgICAgICAgaW50IGluZGV4ID0gZnVuY3Rpb25zLmluZGV4T2YoZnVuY3Rpb24pOworICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChpbmRleCA+IDAgJiYgZnVuY3Rpb25zLmNoYXJBdChpbmRleCAtIDEpICE9ICcsJykgcmV0dXJuIGZhbHNlOworICAgICAgICBpbnQgY2hhckFmdGVyID0gaW5kZXggKyBmdW5jdGlvbi5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGNoYXJBZnRlciA8IGZ1bmN0aW9ucy5sZW5ndGgoKSAmJiBmdW5jdGlvbnMuY2hhckF0KGNoYXJBZnRlcikgIT0gJywnKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE0LDMwICs0MDMsNTIgQEAKICAgICAgKgogICAgICAqIHtAaGlkZX0KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGdW5jdGlvbkVuYWJsZWQoU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgcHVibGljIGJvb2xlYW4gaXNGdW5jdGlvbkVuYWJsZWQoU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eUNvbnRhaW5zRnVuY3Rpb24oInN5cy51c2IuY29uZmlnIiwgZnVuY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByaW1hcnkgVVNCIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bmN0aW9uIG5hbWUgb2YgdGhlIFVTQiBmdW5jdGlvbgorICAgICAqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlGdW5jdGlvbihTdHJpbmcgZnVuY3Rpb24pIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGdldEZ1bmN0aW9uRW5hYmxlRmlsZShmdW5jdGlvbikpOwotICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkID0gKHN0cmVhbS5yZWFkKCkgPT0gJzEnKTsKLSAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWQ7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNldFByaW1hcnlGdW5jdGlvbihmdW5jdGlvbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gc2V0UHJpbWFyeUZ1bmN0aW9uIiwgZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgVVNCIGZ1bmN0aW9uLgorICAgICAqIFNldHMgdGhlIGRlZmF1bHQgcHJpbWFyeSBVU0IgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVuY3Rpb24gbmFtZSBvZiB0aGUgVVNCIGZ1bmN0aW9uCiAgICAgICoKICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNldEZ1bmN0aW9uRW5hYmxlZChTdHJpbmcgZnVuY3Rpb24sIGJvb2xlYW4gZW5hYmxlKSB7CisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEZ1bmN0aW9uKFN0cmluZyBmdW5jdGlvbikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShnZXRGdW5jdGlvbkVuYWJsZUZpbGUoZnVuY3Rpb24pKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZShlbmFibGUgPyAnMScgOiAnMCcpOwotICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbVNlcnZpY2Uuc2V0RGVmYXVsdEZ1bmN0aW9uKGZ1bmN0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlJlbW90ZUV4Y2VwdGlvbiBpbiBzZXREZWZhdWx0RnVuY3Rpb24iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGUgcGF0aCBmb3IgVVNCIG1hc3Mgc3RvcmFnZSBiYWNraW5nIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBiYWNraW5nIGZpbGUgcGF0aAorICAgICAqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hc3NTdG9yYWdlQmFja2luZ0ZpbGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNldE1hc3NTdG9yYWdlQmFja2luZ0ZpbGUocGF0aCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gaW4gc2V0RGVmYXVsdEZ1bmN0aW9uIiwgZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEJ1dHRvbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RCdXR0b24uamF2YQppbmRleCBmOTFjZDRlLi5iNmI3NTk1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2lucHV0bWV0aG9kc2VydmljZS9FeHRyYWN0QnV0dG9uLmphdmEKQEAgLTQxLDYgKzQxLDYgQEAKICAgICAgKiBoaWdobGlnaHQgd2hlbiBzZWxlY3RlZC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gaGFzV2luZG93Rm9jdXMoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmlzRW5hYmxlZCgpID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICByZXR1cm4gaXNFbmFibGVkKCkgJiYgZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUgPyB0cnVlIDogZmFsc2U7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0TGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9pbnB1dG1ldGhvZHNlcnZpY2UvRXh0cmFjdEVkaXRMYXlvdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZmZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvaW5wdXRtZXRob2RzZXJ2aWNlL0V4dHJhY3RFZGl0TGF5b3V0LmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVCdWlsZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5NZW51UG9wdXBIZWxwZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5BY3Rpb25Nb2RlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKKy8qKgorICogRXh0cmFjdEVkaXRMYXlvdXQgcHJvdmlkZXMgYW4gQWN0aW9uTW9kZSBwcmVzZW50YXRpb24gZm9yIHRoZQorICogbGltaXRlZCBzY3JlZW4gcmVhbCBlc3RhdGUgaW4gZXh0cmFjdCBtb2RlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRyYWN0RWRpdExheW91dCBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgRXh0cmFjdEFjdGlvbk1vZGUgbUFjdGlvbk1vZGU7CisgICAgQnV0dG9uIG1FeHRyYWN0QWN0aW9uQnV0dG9uOworICAgIEJ1dHRvbiBtRWRpdEJ1dHRvbjsKKworICAgIHB1YmxpYyBFeHRyYWN0RWRpdExheW91dChDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgfQorCisgICAgcHVibGljIEV4dHJhY3RFZGl0TGF5b3V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWN0aW9uTW9kZSBzdGFydEFjdGlvbk1vZGVGb3JDaGlsZChWaWV3IHNvdXJjZVZpZXcsIEFjdGlvbk1vZGUuQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgZmluYWwgRXh0cmFjdEFjdGlvbk1vZGUgbW9kZSA9IG5ldyBFeHRyYWN0QWN0aW9uTW9kZShjYik7CisgICAgICAgIGlmIChtb2RlLmRpc3BhdGNoT25DcmVhdGUoKSkgeworICAgICAgICAgICAgbW9kZS5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBtRXh0cmFjdEFjdGlvbkJ1dHRvbi5zZXRWaXNpYmlsaXR5KElOVklTSUJMRSk7CisgICAgICAgICAgICBtRWRpdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgbUFjdGlvbk1vZGUgPSBtb2RlOworICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKyAgICAgICAgbUV4dHJhY3RBY3Rpb25CdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5pbnB1dEV4dHJhY3RBY3Rpb24pOworICAgICAgICBtRWRpdEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmlucHV0RXh0cmFjdEVkaXRCdXR0b24pOworICAgICAgICBtRWRpdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyBjbGlja2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IE1lbnVQb3B1cEhlbHBlcihnZXRDb250ZXh0KCksIG1BY3Rpb25Nb2RlLm1NZW51LCBjbGlja2VkKS5zaG93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEV4dHJhY3RBY3Rpb25Nb2RlIGV4dGVuZHMgQWN0aW9uTW9kZSBpbXBsZW1lbnRzIE1lbnVCdWlsZGVyLkNhbGxiYWNrIHsKKyAgICAgICAgcHJpdmF0ZSBBY3Rpb25Nb2RlLkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICAgICAgTWVudUJ1aWxkZXIgbU1lbnU7CisKKyAgICAgICAgcHVibGljIEV4dHJhY3RBY3Rpb25Nb2RlKENhbGxiYWNrIGNiKSB7CisgICAgICAgICAgICBtTWVudSA9IG5ldyBNZW51QnVpbGRlcihnZXRDb250ZXh0KCkpOworICAgICAgICAgICAgbU1lbnUuc2V0Q2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaXRsZShDaGFyU2VxdWVuY2UgdGl0bGUpIHsKKyAgICAgICAgICAgIC8vIFRpdGxlIHdpbGwgbm90IGJlIHNob3duLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCByZXNJZCkgeworICAgICAgICAgICAgLy8gVGl0bGUgd2lsbCBub3IgYmUgc2hvd24uCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGUoQ2hhclNlcXVlbmNlIHN1YnRpdGxlKSB7CisgICAgICAgICAgICAvLyBTdWJ0aXRsZSB3aWxsIG5vdCBiZSBzaG93bi4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZShpbnQgcmVzSWQpIHsKKyAgICAgICAgICAgIC8vIFN1YnRpdGxlIHdpbGwgbm90IGJlIHNob3duLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbVZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgICAgICAvLyBDdXN0b20gdmlldyBpcyBub3Qgc3VwcG9ydGVkIGhlcmUuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIG1NZW51LnN0b3BEaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1NZW51LnN0YXJ0RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoT25DcmVhdGUoKSB7CisgICAgICAgICAgICBtTWVudS5zdG9wRGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkNyZWF0ZUFjdGlvbk1vZGUodGhpcywgbU1lbnUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtTWVudS5zdGFydERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmluaXNoKCkgeworICAgICAgICAgICAgaWYgKG1BY3Rpb25Nb2RlICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgdGhlIGFjdGl2ZSBhY3Rpb24gbW9kZSAtIG5vLW9wCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ2FsbGJhY2sub25EZXN0cm95QWN0aW9uTW9kZSh0aGlzKTsKKyAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7CisKKyAgICAgICAgICAgIG1FeHRyYWN0QWN0aW9uQnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICBtRWRpdEJ1dHRvbi5zZXRWaXNpYmlsaXR5KElOVklTSUJMRSk7CisKKyAgICAgICAgICAgIG1BY3Rpb25Nb2RlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0VGl0bGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1YnRpdGxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0Q3VzdG9tVmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZW51SW5mbGF0ZXIgZ2V0TWVudUluZmxhdGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNZW51SW5mbGF0ZXIoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtU2VsZWN0ZWQoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW0gaXRlbSkgeworICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkFjdGlvbkl0ZW1DbGlja2VkKHRoaXMsIGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVudU1vZGVDaGFuZ2UoTWVudUJ1aWxkZXIgbWVudSkgeworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Nvbm5lY3Rpdml0eU1hbmFnZXIuamF2YQppbmRleCA0MTkyODhiLi4yMjQyZTllIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvQ29ubmVjdGl2aXR5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKQEAgLTE5LDEwICsxOSwxMCBAQAogaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5TZGtDb25zdGFudDsKIGltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uU2RrQ29uc3RhbnQuU2RrQ29uc3RhbnRUeXBlOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBDbGFzcyB0aGF0IGFuc3dlcnMgcXVlcmllcyBhYm91dCB0aGUgc3RhdGUgb2YgbmV0d29yayBjb25uZWN0aXZpdHkuIEl0IGFsc28KQEAgLTQwLDggKzQwLDkgQEAKICAqIHN0YXRlIG9mIHRoZSBhdmFpbGFibGUgbmV0d29ya3M8L2xpPgogICogPC9vbD4KICAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpdml0eU1hbmFnZXIKLXsKK3B1YmxpYyBjbGFzcyBDb25uZWN0aXZpdHlNYW5hZ2VyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbm5lY3Rpdml0eU1hbmFnZXIiOworCiAgICAgLyoqCiAgICAgICogQSBjaGFuZ2UgaW4gbmV0d29yayBjb25uZWN0aXZpdHkgaGFzIG9jY3VycmVkLiBBIGNvbm5lY3Rpb24gaGFzIGVpdGhlcgogICAgICAqIGJlZW4gZXN0YWJsaXNoZWQgb3IgbG9zdC4gVGhlIE5ldHdvcmtJbmZvIGZvciB0aGUgYWZmZWN0ZWQgbmV0d29yayBpcwpAQCAtMTA5LDcgKzExMCw3IEBACiAgICAgICogVGhlIGxvb2t1cCBrZXkgZm9yIGFuIGludCB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0CiAgICAgICogb3VyIGNvbm5lY3Rpb24gdG8gdGhlIGludGVybmV0IGF0IGxhcmdlLiAgMCBpbmRpY2F0ZXMgbm8gY29ubmVjdGlvbiwKICAgICAgKiAxMDAgaW5kaWNhdGVzIGEgZ3JlYXQgY29ubmVjdGlvbi4gIFJldHJpZXZlIGl0IHdpdGgKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudEBnZXRJbnRFeHRyYShTdHJpbmcpfS4KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudCNnZXRJbnRFeHRyYShTdHJpbmcsIGludCl9LgogICAgICAqIHtAaGlkZX0KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JTkVUX0NPTkRJVElPTiA9ICJpbmV0Q29uZGl0aW9uIjsKQEAgLTEyMCwxMyArMTIxLDEyIEBACiAgICAgICogPHA+CiAgICAgICogSWYgYW4gYXBwbGljYXRpb24gdXNlcyB0aGUgbmV0d29yayBpbiB0aGUgYmFja2dyb3VuZCwgaXQgc2hvdWxkIGxpc3RlbgogICAgICAqIGZvciB0aGlzIGJyb2FkY2FzdCBhbmQgc3RvcCB1c2luZyB0aGUgYmFja2dyb3VuZCBkYXRhIGlmIHRoZSB2YWx1ZSBpcwotICAgICAqIGZhbHNlLgorICAgICAqIHtAY29kZSBmYWxzZX0uCiAgICAgICovCiAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fQkFDS0dST1VORF9EQVRBX1NFVFRJTkdfQ0hBTkdFRCA9CiAgICAgICAgICAgICAiYW5kcm9pZC5uZXQuY29ubi5CQUNLR1JPVU5EX0RBVEFfU0VUVElOR19DSEFOR0VEIjsKIAotCiAgICAgLyoqCiAgICAgICogQnJvYWRjYXN0IEFjdGlvbjogVGhlIG5ldHdvcmsgY29ubmVjdGlvbiBtYXkgbm90IGJlIGdvb2QKICAgICAgKiB1c2VzIHtAY29kZSBDb25uZWN0aXZpdHlNYW5hZ2VyLkVYVFJBX0lORVRfQ09ORElUSU9OfSBhbmQKQEAgLTE2NSwxNCArMTY1LDEyIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgRGVmYXVsdCBNb2JpbGUgZGF0YSBjb25uZWN0aW9uLiAgV2hlbiBhY3RpdmUsIGFsbCBkYXRhIHRyYWZmaWMKLSAgICAgKiB3aWxsIHVzZSB0aGlzIGNvbm5lY3Rpb24gYnkgZGVmYXVsdC4gIFNob3VsZCBub3QgY29leGlzdCB3aXRoIG90aGVyCi0gICAgICogZGVmYXVsdCBjb25uZWN0aW9ucy4KKyAgICAgKiB3aWxsIHVzZSB0aGlzIGNvbm5lY3Rpb24gYnkgZGVmYXVsdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01PQklMRSAgICAgID0gMDsKICAgICAvKioKICAgICAgKiBUaGUgRGVmYXVsdCBXSUZJIGRhdGEgY29ubmVjdGlvbi4gIFdoZW4gYWN0aXZlLCBhbGwgZGF0YSB0cmFmZmljCi0gICAgICogd2lsbCB1c2UgdGhpcyBjb25uZWN0aW9uIGJ5IGRlZmF1bHQuICBTaG91bGQgbm90IGNvZXhpc3Qgd2l0aCBvdGhlcgotICAgICAqIGRlZmF1bHQgY29ubmVjdGlvbnMuCisgICAgICogd2lsbCB1c2UgdGhpcyBjb25uZWN0aW9uIGJ5IGRlZmF1bHQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9XSUZJICAgICAgICA9IDE7CiAgICAgLyoqCkBAIC0yMDgsMTMgKzIwNiwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTU9CSUxFX0hJUFJJID0gNTsKICAgICAvKioKICAgICAgKiBUaGUgRGVmYXVsdCBXaU1BWCBkYXRhIGNvbm5lY3Rpb24uICBXaGVuIGFjdGl2ZSwgYWxsIGRhdGEgdHJhZmZpYwotICAgICAqIHdpbGwgdXNlIHRoaXMgY29ubmVjdGlvbiBieSBkZWZhdWx0LiAgU2hvdWxkIG5vdCBjb2V4aXN0IHdpdGggb3RoZXIKLSAgICAgKiBkZWZhdWx0IGNvbm5lY3Rpb25zLgorICAgICAqIHdpbGwgdXNlIHRoaXMgY29ubmVjdGlvbiBieSBkZWZhdWx0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfV0lNQVggICAgICAgPSA2OwogCiAgICAgLyoqCi0gICAgICogQmx1ZXRvb3RoIGRhdGEgY29ubmVjdGlvbi4gVGhpcyBpcyB1c2VkIGZvciBCbHVldG9vdGggcmV2ZXJzZSB0ZXRoZXJpbmcuCisgICAgICogVGhlIERlZmF1bHQgQmx1ZXRvb3RoIGRhdGEgY29ubmVjdGlvbi4gV2hlbiBhY3RpdmUsIGFsbCBkYXRhIHRyYWZmaWMKKyAgICAgKiB3aWxsIHVzZSB0aGlzIGNvbm5lY3Rpb24gYnkgZGVmYXVsdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0JMVUVUT09USCAgID0gNzsKIApAQCAtMjI0LDggKzIyMiw4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9EVU1NWSAgICAgICA9IDg7CiAKICAgICAvKioKLSAgICAgKiBFdGhlcm5ldCBkYXRhIGNvbm5lY3Rpb24uICBUaGlzIG1heSBiZSB2aWEgVVNCIGRvbmdsZSBvciBtb3JlCi0gICAgICogdHJhZGl0aW9uYWwgbWVhbnMuCisgICAgICogVGhlIERlZmF1bHQgRXRoZXJuZXQgZGF0YSBjb25uZWN0aW9uLiAgV2hlbiBhY3RpdmUsIGFsbCBkYXRhIHRyYWZmaWMKKyAgICAgKiB3aWxsIHVzZSB0aGlzIGNvbm5lY3Rpb24gYnkgZGVmYXVsdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VUSEVSTkVUICAgID0gOTsKIApAQCAtMjU1LDEyICsyNTMsNjMgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTkVUV09SS19QUkVGRVJFTkNFID0gVFlQRV9XSUZJOwogCi0gICAgcHJpdmF0ZSBJQ29ubmVjdGl2aXR5TWFuYWdlciBtU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1TZXJ2aWNlOwogCi0gICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzTmV0d29ya1R5cGVWYWxpZChpbnQgbmV0d29ya1R5cGUpIHsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXR3b3JrVHlwZVZhbGlkKGludCBuZXR3b3JrVHlwZSkgewogICAgICAgICByZXR1cm4gbmV0d29ya1R5cGUgPj0gMCAmJiBuZXR3b3JrVHlwZSA8PSBNQVhfTkVUV09SS19UWVBFOwogICAgIH0KIAorICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmV0d29ya1R5cGVOYW1lKGludCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1PQklMRSI7CisgICAgICAgICAgICBjYXNlIFRZUEVfV0lGSToKKyAgICAgICAgICAgICAgICByZXR1cm4gIldJRkkiOworICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9NTVM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNT0JJTEVfTU1TIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9NT0JJTEVfU1VQTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1PQklMRV9TVVBMIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9NT0JJTEVfRFVOOgorICAgICAgICAgICAgICAgIHJldHVybiAiTU9CSUxFX0RVTiI7CisgICAgICAgICAgICBjYXNlIFRZUEVfTU9CSUxFX0hJUFJJOgorICAgICAgICAgICAgICAgIHJldHVybiAiTU9CSUxFX0hJUFJJIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9XSU1BWDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIldJTUFYIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9CTFVFVE9PVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuICJCTFVFVE9PVEgiOworICAgICAgICAgICAgY2FzZSBUWVBFX0RVTU1ZOgorICAgICAgICAgICAgICAgIHJldHVybiAiRFVNTVkiOworICAgICAgICAgICAgY2FzZSBUWVBFX0VUSEVSTkVUOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVRIRVJORVQiOworICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9GT1RBOgorICAgICAgICAgICAgICAgIHJldHVybiAiTU9CSUxFX0ZPVEEiOworICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9JTVM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNT0JJTEVfSU1TIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9NT0JJTEVfQ0JTOgorICAgICAgICAgICAgICAgIHJldHVybiAiTU9CSUxFX0NCUyI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXR3b3JrVHlwZU1vYmlsZShpbnQgbmV0d29ya1R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChuZXR3b3JrVHlwZSkgeworICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRToKKyAgICAgICAgICAgIGNhc2UgVFlQRV9NT0JJTEVfTU1TOgorICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9TVVBMOgorICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9EVU46CisgICAgICAgICAgICBjYXNlIFRZUEVfTU9CSUxFX0hJUFJJOgorICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9GT1RBOgorICAgICAgICAgICAgY2FzZSBUWVBFX01PQklMRV9JTVM6CisgICAgICAgICAgICBjYXNlIFRZUEVfTU9CSUxFX0NCUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2V0TmV0d29ya1ByZWZlcmVuY2UoaW50IHByZWZlcmVuY2UpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1TZXJ2aWNlLnNldE5ldHdvcmtQcmVmZXJlbmNlKHByZWZlcmVuY2UpOwpAQCAtMjg0LDYgKzMzMywxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0QWN0aXZlTmV0d29ya0luZm9Gb3JVaWQoaW50IHVpZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEFjdGl2ZU5ldHdvcmtJbmZvRm9yVWlkKHVpZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbyhpbnQgbmV0d29ya1R5cGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5nZXROZXR3b3JrSW5mbyhuZXR3b3JrVHlwZSk7CkBAIC0zMDAsNyArMzU4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBAaGlkZSAqLworICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldEFjdGl2ZUxpbmtQcm9wZXJ0aWVzKCk7CkBAIC0zMDksNyArMzY3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBAaGlkZSAqLworICAgIC8qKiB7QGhpZGV9ICovCiAgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKGludCBuZXR3b3JrVHlwZSkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldExpbmtQcm9wZXJ0aWVzKG5ldHdvcmtUeXBlKTsKQEAgLTQ3OSwxOSArNTM3LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRG9uJ3QgYWxsb3cgdXNlIG9mIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQotICAgIHByaXZhdGUgQ29ubmVjdGl2aXR5TWFuYWdlcigpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiB7QGhpZGV9CiAgICAgICovCiAgICAgcHVibGljIENvbm5lY3Rpdml0eU1hbmFnZXIoSUNvbm5lY3Rpdml0eU1hbmFnZXIgc2VydmljZSkgewogICAgICAgICBpZiAoc2VydmljZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDb25uZWN0aXZpdHlNYW5hZ2VyKCkgY2Fubm90IGJlIGNvbnN0cnVjdGVkIHdpdGggbnVsbCBzZXJ2aWNlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaXNzaW5nIElDb25uZWN0aXZpdHlNYW5hZ2VyIik7CiAgICAgICAgIH0KICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9EaGNwU3RhdGVNYWNoaW5lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRGhjcFN0YXRlTWFjaGluZS5qYXZhCmluZGV4IGVhZjA4N2YuLmM0OWMwMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9EaGNwU3RhdGVNYWNoaW5lLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0RoY3BTdGF0ZU1hY2hpbmUuamF2YQpAQCAtNjYsNiArNjYsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESENQX1JFTkVXID0gMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0RIQ1BfUkVORVcgPSAiYW5kcm9pZC5uZXQud2lmaS5ESENQX1JFTkVXIjsKIAorICAgIC8vVXNlZCBmb3Igc2FuaXR5IGNoZWNrIG9uIHNldHRpbmcgdXAgcmVuZXdhbAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fUkVORVdBTF9USU1FX1NFQ1MgPSA1ICogNjA7ICAvLyA1IG1pbnV0ZXMKKwogICAgIHByaXZhdGUgZW51bSBEaGNwQWN0aW9uIHsKICAgICAgICAgU1RBUlQsCiAgICAgICAgIFJFTkVXCkBAIC0zMzEsMTMgKzMzNCwyMSBAQAogCiAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICBMb2cuZChUQUcsICJESENQIHN1Y2NlZWRlZCBvbiAiICsgbUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgLy9EbyBpdCBhIGJpdCBlYXJsaWVyIHRoYW4gaGFsZiB0aGUgbGVhc2UgZHVyYXRpb24gdGltZQotICAgICAgICAgICAgLy90byBiZWF0IHRoZSBuYXRpdmUgREhDUCBjbGllbnQgYW5kIGF2b2lkIGV4dHJhIHBhY2tldHMKLSAgICAgICAgICAgIC8vNDglIGZvciBvbmUgaG91ciBsZWFzZSB0aW1lID0gMjkgbWludXRlcwotICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSArCi0gICAgICAgICAgICAgICAgICAgIGRoY3BJbmZvSW50ZXJuYWwubGVhc2VEdXJhdGlvbiAqIDQ4MCwgLy9pbiBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgICAgICAgICAgbURoY3BSZW5ld2FsSW50ZW50KTsKKyAgICAgICAgICAgbG9uZyBsZWFzZUR1cmF0aW9uID0gZGhjcEluZm9JbnRlcm5hbC5sZWFzZUR1cmF0aW9uOyAvL2ludCB0byBsb25nIGNvbnZlcnNpb24KKworICAgICAgICAgICAvL1Nhbml0eSBjaGVjayBmb3IgcmVuZXdhbAorICAgICAgICAgICAvL1RPRE86IHdvdWxkIGJlIGdvb2QgdG8gbm90aWZ5IHRoZSB1c2VyIHRoYXQgaGlzIG5ldHdvcmsgY29uZmlndXJhdGlvbiBpcworICAgICAgICAgICAvL2JhZCBhbmQgdGhhdCB0aGUgZGV2aWNlIGNhbm5vdCByZW5ldyBiZWxvdyBNSU5fUkVORVdBTF9USU1FX1NFQ1MKKyAgICAgICAgICAgaWYgKGxlYXNlRHVyYXRpb24gPCBNSU5fUkVORVdBTF9USU1FX1NFQ1MpIHsKKyAgICAgICAgICAgICAgIGxlYXNlRHVyYXRpb24gPSBNSU5fUkVORVdBTF9USU1FX1NFQ1M7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgLy9EbyBpdCBhIGJpdCBlYXJsaWVyIHRoYW4gaGFsZiB0aGUgbGVhc2UgZHVyYXRpb24gdGltZQorICAgICAgICAgICAvL3RvIGJlYXQgdGhlIG5hdGl2ZSBESENQIGNsaWVudCBhbmQgYXZvaWQgZXh0cmEgcGFja2V0cworICAgICAgICAgICAvLzQ4JSBmb3Igb25lIGhvdXIgbGVhc2UgdGltZSA9IDI5IG1pbnV0ZXMKKyAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAorICAgICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpICsKKyAgICAgICAgICAgICAgICAgICBsZWFzZUR1cmF0aW9uICogNDgwLCAvL2luIG1pbGxpc2Vjb25kcworICAgICAgICAgICAgICAgICAgIG1EaGNwUmVuZXdhbEludGVudCk7CiAKICAgICAgICAgICAgIG1Db250cm9sbGVyLm9idGFpbk1lc3NhZ2UoQ01EX1BPU1RfREhDUF9BQ1RJT04sIERIQ1BfU1VDQ0VTUywgMCwgZGhjcEluZm9JbnRlcm5hbCkKICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRXRoZXJuZXREYXRhVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0V0aGVybmV0RGF0YVRyYWNrZXIuamF2YQppbmRleCA1NTg1MGM5Li42ZjkyMjQ3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvRXRoZXJuZXREYXRhVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9FdGhlcm5ldERhdGFUcmFja2VyLmphdmEKQEAgLTYzLDYgKzYzLDcgQEAKICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CiAKICAgICBwcml2YXRlIHN0YXRpYyBFdGhlcm5ldERhdGFUcmFja2VyIHNJbnN0YW5jZTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc0lmYWNlTWF0Y2ggPSAiIjsKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbUlmYWNlID0gIiI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRlcmZhY2VPYnNlcnZlciBleHRlbmRzIElOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXIuU3R1YiB7CkBAIC05Niw3ICs5Nyw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGludGVyZmFjZUFkZGVkKFN0cmluZyBpZmFjZSkgewotICAgICAgICBpZiAoIWlmYWNlLm1hdGNoZXMoImV0aFxcZCIpKQorICAgICAgICBpZiAoIWlmYWNlLm1hdGNoZXMoc0lmYWNlTWF0Y2gpKQogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIExvZy5kKFRBRywgIkFkZGluZyAiICsgaWZhY2UpOwpAQCAtMTg3LDYgKzE4OCwyMiBAQAogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHJlZ2lzdGVyIEludGVyZmFjZU9ic2VydmVyICIgKyBlKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIGNvbm5lY3QgdG8gYW4gZXRoZXJuZXQgaW50ZXJmYWNlIHRoYXQgYWxyZWFkeSBleGlzdHMKKyAgICAgICAgc0lmYWNlTWF0Y2ggPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZygKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmNvbmZpZ19ldGhlcm5ldF9pZmFjZV9yZWdleCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBpZmFjZXMgPSBzZXJ2aWNlLmxpc3RJbnRlcmZhY2VzKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IGlmYWNlcykgeworICAgICAgICAgICAgICAgIGlmIChpZmFjZS5tYXRjaGVzKHNJZmFjZU1hdGNoKSkgeworICAgICAgICAgICAgICAgICAgICBtSWZhY2UgPSBpZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBnZXQgbGlzdCBvZiBpbnRlcmZhY2VzICIgKyBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lDb25uZWN0aXZpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAppbmRleCA4YmU0OTJjLi5mYmExNmUxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSUNvbm5lY3Rpdml0eU1hbmFnZXIuYWlkbApAQCAtMTgsOCArMTgsMTIgQEAKIAogaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJbmZvOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5uZXQuVnBuQ29uZmlnOwogCiAvKioKICAqIEludGVyZmFjZSB0aGF0IGFuc3dlcnMgcXVlcmllcyBhYm91dCwgYW5kIGFsbG93cyBjaGFuZ2luZywgdGhlCkBAIC0zMywxNSArMzcsMTUgQEAKICAgICBpbnQgZ2V0TmV0d29ya1ByZWZlcmVuY2UoKTsKIAogICAgIE5ldHdvcmtJbmZvIGdldEFjdGl2ZU5ldHdvcmtJbmZvKCk7Ci0KKyAgICBOZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mb0ZvclVpZChpbnQgdWlkKTsKICAgICBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbyhpbnQgbmV0d29ya1R5cGUpOwotCiAgICAgTmV0d29ya0luZm9bXSBnZXRBbGxOZXR3b3JrSW5mbygpOwogCiAgICAgTGlua1Byb3BlcnRpZXMgZ2V0QWN0aXZlTGlua1Byb3BlcnRpZXMoKTsKLQogICAgIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKGludCBuZXR3b3JrVHlwZSk7CiAKKyAgICBOZXR3b3JrU3RhdGVbXSBnZXRBbGxOZXR3b3JrU3RhdGUoKTsKKwogICAgIGJvb2xlYW4gc2V0UmFkaW9zKGJvb2xlYW4gb25PZmYpOwogCiAgICAgYm9vbGVhbiBzZXRSYWRpbyhpbnQgbmV0d29ya1R5cGUsIGJvb2xlYW4gdHVybk9uKTsKQEAgLTk0LDQgKzk4LDEwIEBACiAgICAgUHJveHlQcm9wZXJ0aWVzIGdldFByb3h5KCk7CiAKICAgICB2b2lkIHNldERhdGFEZXBlbmRlbmN5KGludCBuZXR3b3JrVHlwZSwgYm9vbGVhbiBtZXQpOworCisgICAgdm9pZCBwcm90ZWN0VnBuKGluIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHNvY2tldCk7CisKKyAgICBTdHJpbmcgcHJlcGFyZVZwbihTdHJpbmcgcGFja2FnZU5hbWUpOworCisgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZXN0YWJsaXNoVnBuKGluIFZwbkNvbmZpZyBjb25maWcpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrUG9saWN5TGlzdGVuZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeUxpc3RlbmVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZWM1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeUxpc3RlbmVyLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKKy8qKiB7QGhpZGV9ICovCitvbmV3YXkgaW50ZXJmYWNlIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgeworCisgICAgdm9pZCBvblVpZFJ1bGVzQ2hhbmdlZChpbnQgdWlkLCBpbnQgdWlkUnVsZXMpOworICAgIHZvaWQgb25NZXRlcmVkSWZhY2VzQ2hhbmdlZChpbiBTdHJpbmdbXSBtZXRlcmVkSWZhY2VzKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrUG9saWN5TWFuYWdlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrUG9saWN5TWFuYWdlci5haWRsCmluZGV4IGQ5MzUxZWUuLjgyNDk1ZTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1BvbGljeU1hbmFnZXIuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvSU5ldHdvcmtQb2xpY3lNYW5hZ2VyLmFpZGwKQEAgLTE2LDYgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldDsKIAoraW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrUG9saWN5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeTsKKwogLyoqCiAgKiBJbnRlcmZhY2UgdGhhdCBjcmVhdGVzIGFuZCBtb2RpZmllcyBuZXR3b3JrIHBvbGljeSBydWxlcy4KICAqCkBAIC0yNiw2ICsyOSwxMiBAQAogICAgIHZvaWQgc2V0VWlkUG9saWN5KGludCB1aWQsIGludCBwb2xpY3kpOwogICAgIGludCBnZXRVaWRQb2xpY3koaW50IHVpZCk7CiAKLSAgICAvLyBUT0RPOiBidWlsZCBBUEkgdG8gc3VyZmFjZSBzdGF0cyBkZXRhaWxzIGZvciBzZXR0aW5ncyBVSQorICAgIGJvb2xlYW4gaXNVaWRGb3JlZ3JvdW5kKGludCB1aWQpOworCisgICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbGlzdGVuZXIpOworICAgIHZvaWQgdW5yZWdpc3Rlckxpc3RlbmVyKElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgdm9pZCBzZXROZXR3b3JrUG9saWNpZXMoaW4gTmV0d29ya1BvbGljeVtdIHBvbGljaWVzKTsKKyAgICBOZXR3b3JrUG9saWN5W10gZ2V0TmV0d29ya1BvbGljaWVzKCk7CiAKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1N0YXRzU2VydmljZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0lOZXR3b3JrU3RhdHNTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5YWEwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9JTmV0d29ya1N0YXRzU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0c0hpc3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1RlbXBsYXRlOworCisvKioge0BoaWRlfSAqLworaW50ZXJmYWNlIElOZXR3b3JrU3RhdHNTZXJ2aWNlIHsKKworICAgIC8qKiBSZXR1cm4gaGlzdG9yaWNhbCBzdGF0cyBmb3IgdHJhZmZpYyB0aGF0IG1hdGNoZXMgdGVtcGxhdGUuICovCisgICAgTmV0d29ya1N0YXRzSGlzdG9yeSBnZXRIaXN0b3J5Rm9yTmV0d29yayhpbiBOZXR3b3JrVGVtcGxhdGUgdGVtcGxhdGUpOworICAgIC8qKiBSZXR1cm4gaGlzdG9yaWNhbCBzdGF0cyBmb3Igc3BlY2lmaWMgVUlEIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRlbXBsYXRlLiAqLworICAgIE5ldHdvcmtTdGF0c0hpc3RvcnkgZ2V0SGlzdG9yeUZvclVpZChpbiBOZXR3b3JrVGVtcGxhdGUgdGVtcGxhdGUsIGludCB1aWQsIGludCB0YWcpOworCisgICAgLyoqIFJldHVybiB1c2FnZSBzdW1tYXJ5IGZvciB0cmFmZmljIHRoYXQgbWF0Y2hlcyB0ZW1wbGF0ZS4gKi8KKyAgICBOZXR3b3JrU3RhdHMgZ2V0U3VtbWFyeUZvck5ldHdvcmsoaW4gTmV0d29ya1RlbXBsYXRlIHRlbXBsYXRlLCBsb25nIHN0YXJ0LCBsb25nIGVuZCk7CisgICAgLyoqIFJldHVybiB1c2FnZSBzdW1tYXJ5IHBlciBVSUQgZm9yIHRyYWZmaWMgdGhhdCBtYXRjaGVzIHRlbXBsYXRlLiAqLworICAgIE5ldHdvcmtTdGF0cyBnZXRTdW1tYXJ5Rm9yQWxsVWlkKGluIE5ldHdvcmtUZW1wbGF0ZSB0ZW1wbGF0ZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQsIGJvb2xlYW4gaW5jbHVkZVRhZ3MpOworCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L01vYmlsZURhdGFTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA3NzBmMTUyLi5mM2M4NjNmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTW9iaWxlRGF0YVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Nb2JpbGVEYXRhU3RhdGVUcmFja2VyLmphdmEKQEAgLTY5LDEwICs2OSw2IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1Qcml2YXRlRG5zUm91dGVTZXQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbURlZmF1bHRSb3V0ZVNldCA9IGZhbHNlOwogCi0gICAgLy8gREVGQVVMVCBhbmQgSElQUkkgYXJlIHRoZSBzYW1lIGNvbm5lY3Rpb24uICBJZiB3ZSdyZSBvbmUgb2YgdGhlc2Ugd2UgbmVlZCB0byBjaGVjayBpZgotICAgIC8vIHRoZSBvdGhlciBpcyBhbHNvIGRpc2Nvbm5lY3RlZCBiZWZvcmUgd2UgcmVzZXQgc29ja2V0cwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNEZWZhdWx0T3JIaXByaSA9IGZhbHNlOwotCiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwogICAgIHByaXZhdGUgQXN5bmNDaGFubmVsIG1EYXRhQ29ubmVjdGlvblRyYWNrZXJBYzsKICAgICBwcml2YXRlIE1lc3NlbmdlciBtTWVzc2VuZ2VyOwpAQCAtODcsMTIgKzgzLDYgQEAKICAgICAgICAgICAgICAgICBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXROZXR3b3JrVHlwZSgpLCB0YWcsCiAgICAgICAgICAgICAgICAgVGVsZXBob255TWFuYWdlci5nZXREZWZhdWx0KCkuZ2V0TmV0d29ya1R5cGVOYW1lKCkpOwogICAgICAgICBtQXBuVHlwZSA9IG5ldHdvcmtUeXBlVG9BcG5UeXBlKG5ldFR5cGUpOwotICAgICAgICBpZiAobmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFIHx8Ci0gICAgICAgICAgICAgICAgbmV0VHlwZSA9PSBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJKSB7Ci0gICAgICAgICAgICBtSXNEZWZhdWx0T3JIaXByaSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtUGhvbmVTZXJ2aWNlID0gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTE4MCw4ICsxNzAsNiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgTW9iaWxlRGF0YVN0YXRlUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uZWN0aXZpdHlNYW5hZ2VyOwotCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhUZWxlcGhvbnlJbnRlbnRzLgpAQCAtMjE4LDM1ICsyMDYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERldGFpbGVkU3RhdGUoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIHJlYXNvbiwgYXBuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkb1Jlc2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlzRGVmYXVsdE9ySGlwcmkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGRlZmF1bHQgYW5kIGhpcHJpIG11c3QgZ28gZG93biBiZWZvcmUgd2UgcmVzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGVUb0NoZWNrID0gKFBob25lLkFQTl9UWVBFX0RFRkFVTFQuZXF1YWxzKG1BcG5UeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfTU9CSUxFX0hJUFJJIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpdml0eU1hbmFnZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGl2aXR5TWFuYWdlciA9IElDb25uZWN0aXZpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGl2aXR5TWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG1Db25uZWN0aXZpdHlNYW5hZ2VyLmdldE5ldHdvcmtJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRvQ2hlY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmlzQ29ubmVjdGVkKCkgPT0gdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1Jlc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBnbyBhaGVhZCB3aXRoIHRoZSByZXNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZSgiRXhjZXB0aW9uIHRyeWluZyB0byBjb250YWN0IENvbm5TZXJ2aWNlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVzZXQgJiYgbUxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlmYWNlID0gbUxpbmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlmYWNlICE9IG51bGwpIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKGlmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGNoZWNrIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBkbyB0aGlzIGhlcmUgLSBDb25uZWN0aXZpdHlTZXJ2aWNlIG5lZWRzIGl0IHRvIGNsZWFyIHN0dWZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBvayB0aG91Z2ggLSBqdXN0IGxlYXZlIGl0IHRvIGJlIHJlZnJlc2hlZCBuZXh0IHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjb25uZWN0LgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJZGVudGl0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJZGVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZWYxMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0lkZW50aXR5LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuaXNOZXR3b3JrVHlwZU1vYmlsZTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLk9iamVjdHM7CisKKy8qKgorICogTmV0d29yayBkZWZpbml0aW9uIHRoYXQgaW5jbHVkZXMgc3Ryb25nIGlkZW50aXR5LiBBbmFsb2dvdXMgdG8gY29tYmluaW5nCisgKiB7QGxpbmsgTmV0d29ya0luZm99IGFuZCBhbiBJTVNJLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrSWRlbnRpdHkgeworICAgIGZpbmFsIGludCBtVHlwZTsKKyAgICBmaW5hbCBpbnQgbVN1YlR5cGU7CisgICAgZmluYWwgU3RyaW5nIG1TdWJzY3JpYmVySWQ7CisgICAgZmluYWwgYm9vbGVhbiBtUm9hbWluZzsKKworICAgIHB1YmxpYyBOZXR3b3JrSWRlbnRpdHkoaW50IHR5cGUsIGludCBzdWJUeXBlLCBTdHJpbmcgc3Vic2NyaWJlcklkLCBib29sZWFuIHJvYW1pbmcpIHsKKyAgICAgICAgdGhpcy5tVHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMubVN1YlR5cGUgPSBzdWJUeXBlOworICAgICAgICB0aGlzLm1TdWJzY3JpYmVySWQgPSBzdWJzY3JpYmVySWQ7CisgICAgICAgIHRoaXMubVJvYW1pbmcgPSByb2FtaW5nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG1UeXBlLCBtU3ViVHlwZSwgbVN1YnNjcmliZXJJZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5ldHdvcmtJZGVudGl0eSkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya0lkZW50aXR5IGlkZW50ID0gKE5ldHdvcmtJZGVudGl0eSkgb2JqOworICAgICAgICAgICAgcmV0dXJuIG1UeXBlID09IGlkZW50Lm1UeXBlICYmIG1TdWJUeXBlID09IGlkZW50Lm1TdWJUeXBlCisgICAgICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwobVN1YnNjcmliZXJJZCwgaWRlbnQubVN1YnNjcmliZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbVJvYW1pbmcgPT0gaWRlbnQubVJvYW1pbmc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IENvbm5lY3Rpdml0eU1hbmFnZXIuZ2V0TmV0d29ya1R5cGVOYW1lKG1UeXBlKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1YlR5cGVOYW1lOworICAgICAgICBpZiAoQ29ubmVjdGl2aXR5TWFuYWdlci5pc05ldHdvcmtUeXBlTW9iaWxlKG1UeXBlKSkgeworICAgICAgICAgICAgc3ViVHlwZU5hbWUgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtUeXBlTmFtZShtU3ViVHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWJUeXBlTmFtZSA9IEludGVnZXIudG9TdHJpbmcobVN1YlR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjcnViU3Vic2NyaWJlcklkID0gbVN1YnNjcmliZXJJZCAhPSBudWxsID8gInZhbGlkIiA6ICJudWxsIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJvYW1pbmcgPSBtUm9hbWluZyA/ICIsIFJPQU1JTkciIDogIiI7CisgICAgICAgIHJldHVybiAiW3R5cGU9IiArIHR5cGVOYW1lICsgIiwgc3ViVHlwZT0iICsgc3ViVHlwZU5hbWUgKyAiLCBzdWJzY3JpYmVySWQ9IgorICAgICAgICAgICAgICAgICsgc2NydWJTdWJzY3JpYmVySWQgKyByb2FtaW5nICsgIl0iOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1UeXBlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3ViVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJUeXBlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3Vic2NyaWJlcklkKCkgeworICAgICAgICByZXR1cm4gbVN1YnNjcmliZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSb2FtaW5nKCkgeworICAgICAgICByZXR1cm4gbVJvYW1pbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgYSB7QGxpbmsgTmV0d29ya0lkZW50aXR5fSBmcm9tIHRoZSBnaXZlbiB7QGxpbmsgTmV0d29ya1N0YXRlfSwKKyAgICAgKiBhc3N1bWluZyB0aGF0IGFueSBtb2JpbGUgbmV0d29ya3MgYXJlIHVzaW5nIHRoZSBjdXJyZW50IElNU0kuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOZXR3b3JrSWRlbnRpdHkgYnVpbGROZXR3b3JrSWRlbnRpdHkoQ29udGV4dCBjb250ZXh0LCBOZXR3b3JrU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgZmluYWwgaW50IHR5cGUgPSBzdGF0ZS5uZXR3b3JrSW5mby5nZXRUeXBlKCk7CisgICAgICAgIGZpbmFsIGludCBzdWJUeXBlID0gc3RhdGUubmV0d29ya0luZm8uZ2V0U3VidHlwZSgpOworCisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIG1vdmluZyBzdWJzY3JpYmVySWQgb3ZlciB0byBMaW5rQ2FwYWJpbGl0aWVzLCBzbyBpdAorICAgICAgICAvLyBjb21lcyBmcm9tIGFuIGF1dGhvcml0YXRpdmUgc291cmNlLgorCisgICAgICAgIGZpbmFsIFN0cmluZyBzdWJzY3JpYmVySWQ7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcm9hbWluZzsKKyAgICAgICAgaWYgKGlzTmV0d29ya1R5cGVNb2JpbGUodHlwZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFRlbGVwaG9ueU1hbmFnZXIgdGVsZXBob255ID0gKFRlbGVwaG9ueU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKKyAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5URUxFUEhPTllfU0VSVklDRSk7CisgICAgICAgICAgICByb2FtaW5nID0gdGVsZXBob255LmlzTmV0d29ya1JvYW1pbmcoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5zdWJzY3JpYmVySWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1YnNjcmliZXJJZCA9IHN0YXRlLnN1YnNjcmliZXJJZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3Vic2NyaWJlcklkID0gdGVsZXBob255LmdldFN1YnNjcmliZXJJZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3Vic2NyaWJlcklkID0gbnVsbDsKKyAgICAgICAgICAgIHJvYW1pbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtJZGVudGl0eSh0eXBlLCBzdWJUeXBlLCBzdWJzY3JpYmVySWQsIHJvYW1pbmcpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtJbmZvLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQppbmRleCA1ZjVlMTFjLi41Mzc3NTBhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya0luZm8uamF2YQpAQCAtNzQsNyArNzQsOSBAQAogICAgICAgICAvKiogSVAgdHJhZmZpYyBub3QgYXZhaWxhYmxlLiAqLwogICAgICAgICBESVNDT05ORUNURUQsCiAgICAgICAgIC8qKiBBdHRlbXB0IHRvIGNvbm5lY3QgZmFpbGVkLiAqLwotICAgICAgICBGQUlMRUQKKyAgICAgICAgRkFJTEVELAorICAgICAgICAvKiogQWNjZXNzIHRvIHRoaXMgbmV0d29yayBpcyBibG9ja2VkLiAqLworICAgICAgICBCTE9DS0VECiAgICAgfQogCiAgICAgLyoqCkBAIC05Niw2ICs5OCw3IEBACiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkRJU0NPTk5FQ1RJTkcsIFN0YXRlLkRJU0NPTk5FQ1RJTkcpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQsIFN0YXRlLkRJU0NPTk5FQ1RFRCk7CiAgICAgICAgIHN0YXRlTWFwLnB1dChEZXRhaWxlZFN0YXRlLkZBSUxFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc3RhdGVNYXAucHV0KERldGFpbGVkU3RhdGUuQkxPQ0tFRCwgU3RhdGUuRElTQ09OTkVDVEVEKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCBtTmV0d29ya1R5cGU7CkBAIC0xMzgsNiArMTQxLDIzIEBACiAgICAgICAgIG1Jc1JvYW1pbmcgPSBmYWxzZTsKICAgICB9CiAKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBOZXR3b3JrSW5mbyhOZXR3b3JrSW5mbyBzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtTmV0d29ya1R5cGUgPSBzb3VyY2UubU5ldHdvcmtUeXBlOworICAgICAgICAgICAgbVN1YnR5cGUgPSBzb3VyY2UubVN1YnR5cGU7CisgICAgICAgICAgICBtVHlwZU5hbWUgPSBzb3VyY2UubVR5cGVOYW1lOworICAgICAgICAgICAgbVN1YnR5cGVOYW1lID0gc291cmNlLm1TdWJ0eXBlTmFtZTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IHNvdXJjZS5tU3RhdGU7CisgICAgICAgICAgICBtRGV0YWlsZWRTdGF0ZSA9IHNvdXJjZS5tRGV0YWlsZWRTdGF0ZTsKKyAgICAgICAgICAgIG1SZWFzb24gPSBzb3VyY2UubVJlYXNvbjsKKyAgICAgICAgICAgIG1FeHRyYUluZm8gPSBzb3VyY2UubUV4dHJhSW5mbzsKKyAgICAgICAgICAgIG1Jc0ZhaWxvdmVyID0gc291cmNlLm1Jc0ZhaWxvdmVyOworICAgICAgICAgICAgbUlzUm9hbWluZyA9IHNvdXJjZS5tSXNSb2FtaW5nOworICAgICAgICAgICAgbUlzQXZhaWxhYmxlID0gc291cmNlLm1Jc0F2YWlsYWJsZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlcG9ydHMgdGhlIHR5cGUgb2YgbmV0d29yayAoY3VycmVudGx5IG1vYmlsZSBvciBXaS1GaSkgdG8gd2hpY2ggdGhlCiAgICAgICogaW5mbyBpbiB0aGlzIG9iamVjdCBwZXJ0YWlucy4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUG9saWN5LmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1BvbGljeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWJiMDYwOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUG9saWN5LmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIE5ldHdvcmtQb2xpY3k7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1BvbGljeS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNhYjMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtQb2xpY3kuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCisvKioKKyAqIFBvbGljeSBmb3IgbmV0d29ya3MgbWF0Y2hpbmcgYSB7QGxpbmsgTmV0d29ya1RlbXBsYXRlfSwgaW5jbHVkaW5nIHVzYWdlIGN5Y2xlCisgKiBhbmQgbGltaXRzIHRvIGJlIGVuZm9yY2VkLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrUG9saWN5IGltcGxlbWVudHMgUGFyY2VsYWJsZSwgQ29tcGFyYWJsZTxOZXR3b3JrUG9saWN5PiB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFdBUk5JTkdfRElTQUJMRUQgPSAtMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTElNSVRfRElTQUJMRUQgPSAtMTsKKworICAgIHB1YmxpYyBmaW5hbCBOZXR3b3JrVGVtcGxhdGUgdGVtcGxhdGU7CisgICAgcHVibGljIGludCBjeWNsZURheTsKKyAgICBwdWJsaWMgbG9uZyB3YXJuaW5nQnl0ZXM7CisgICAgcHVibGljIGxvbmcgbGltaXRCeXRlczsKKworICAgIC8vIFRPRE86IHRlYWNoIGhvdyB0byBzbm9vemUgbGltaXQgZm9yIGN1cnJlbnQgY3ljbGUKKworICAgIHB1YmxpYyBOZXR3b3JrUG9saWN5KAorICAgICAgICAgICAgTmV0d29ya1RlbXBsYXRlIHRlbXBsYXRlLCBpbnQgY3ljbGVEYXksIGxvbmcgd2FybmluZ0J5dGVzLCBsb25nIGxpbWl0Qnl0ZXMpIHsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IGNoZWNrTm90TnVsbCh0ZW1wbGF0ZSwgIm1pc3NpbmcgTmV0d29ya1RlbXBsYXRlIik7CisgICAgICAgIHRoaXMuY3ljbGVEYXkgPSBjeWNsZURheTsKKyAgICAgICAgdGhpcy53YXJuaW5nQnl0ZXMgPSB3YXJuaW5nQnl0ZXM7CisgICAgICAgIHRoaXMubGltaXRCeXRlcyA9IGxpbWl0Qnl0ZXM7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtQb2xpY3koUGFyY2VsIGluKSB7CisgICAgICAgIHRlbXBsYXRlID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIGN5Y2xlRGF5ID0gaW4ucmVhZEludCgpOworICAgICAgICB3YXJuaW5nQnl0ZXMgPSBpbi5yZWFkTG9uZygpOworICAgICAgICBsaW1pdEJ5dGVzID0gaW4ucmVhZExvbmcoKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBkZXN0LndyaXRlUGFyY2VsYWJsZSh0ZW1wbGF0ZSwgZmxhZ3MpOworICAgICAgICBkZXN0LndyaXRlSW50KGN5Y2xlRGF5KTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcod2FybmluZ0J5dGVzKTsKKyAgICAgICAgZGVzdC53cml0ZUxvbmcobGltaXRCeXRlcyk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIGludCBjb21wYXJlVG8oTmV0d29ya1BvbGljeSBhbm90aGVyKSB7CisgICAgICAgIGlmIChhbm90aGVyID09IG51bGwgfHwgYW5vdGhlci5saW1pdEJ5dGVzID09IExJTUlUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAvLyBvdGhlciB2YWx1ZSBpcyBtaXNzaW5nIG9yIGRpc2FibGVkOyB3ZSB3aW4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGltaXRCeXRlcyA9PSBMSU1JVF9ESVNBQkxFRCB8fCBhbm90aGVyLmxpbWl0Qnl0ZXMgPCBsaW1pdEJ5dGVzKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBkaXNhYmxlZCBvciBvdGhlciBsaW1pdCBpcyBzbWFsbGVyOyB0aGV5IHdpbgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJOZXR3b3JrUG9saWN5WyIgKyB0ZW1wbGF0ZSArICJdOiBjeWNsZURheT0iICsgY3ljbGVEYXkgKyAiLCB3YXJuaW5nQnl0ZXM9IgorICAgICAgICAgICAgICAgICsgd2FybmluZ0J5dGVzICsgIiwgbGltaXRCeXRlcz0iICsgbGltaXRCeXRlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8TmV0d29ya1BvbGljeT4gQ1JFQVRPUiA9IG5ldyBDcmVhdG9yPE5ldHdvcmtQb2xpY3k+KCkgeworICAgICAgICBwdWJsaWMgTmV0d29ya1BvbGljeSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrUG9saWN5KGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOZXR3b3JrUG9saWN5W10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1BvbGljeVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1BvbGljeU1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUG9saWN5TWFuYWdlci5qYXZhCmluZGV4IDE5MTNhYTcuLjkxYWYxNmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUG9saWN5TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrUG9saWN5TWFuYWdlci5qYXZhCkBAIC0xNiw4ICsxNiwxNCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZS5NT05USF9EQVk7CisKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiAKIC8qKgogICogTWFuYWdlciBmb3IgY3JlYXRpbmcgYW5kIG1vZGlmeWluZyBuZXR3b3JrIHBvbGljeSBydWxlcy4KQEAgLTI4LDEyICszNCwzNSBAQAogCiAgICAgLyoqIE5vIHNwZWNpZmljIG5ldHdvcmsgcG9saWN5LCB1c2Ugc3lzdGVtIGRlZmF1bHQuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX05PTkUgPSAweDA7Ci0gICAgLyoqIFJlamVjdCBuZXR3b3JrIHVzYWdlIHdoZW4gYXBwbGljYXRpb24gaW4gYmFja2dyb3VuZC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfUkVKRUNUX0JBQ0tHUk9VTkQgPSAweDE7Ci0gICAgLyoqIFJlamVjdCBuZXR3b3JrIHVzYWdlIG9uIHBhaWQgbmV0d29yayBjb25uZWN0aW9ucy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfUkVKRUNUX1BBSUQgPSAweDI7Ci0gICAgLyoqIEFwcGxpY2F0aW9uIHNob3VsZCBjb25zZXJ2ZSBkYXRhLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPTElDWV9DT05TRVJWRV9EQVRBID0gMHg0OworICAgIC8qKiBSZWplY3QgbmV0d29yayB1c2FnZSBvbiBtZXRlcmVkIG5ldHdvcmtzIHdoZW4gYXBwbGljYXRpb24gaW4gYmFja2dyb3VuZC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfUkVKRUNUX01FVEVSRURfQkFDS0dST1VORCA9IDB4MTsKKworICAgIC8qKiBBbGwgbmV0d29yayB0cmFmZmljIHNob3VsZCBiZSBhbGxvd2VkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQUxMT1dfQUxMID0gMHgwOworICAgIC8qKiBSZWplY3QgdHJhZmZpYyBvbiBtZXRlcmVkIG5ldHdvcmtzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfUkVKRUNUX01FVEVSRUQgPSAweDE7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgSW50ZW50fSBhY3Rpb24gbGF1bmNoZWQgd2hlbiB1c2VyIHNlbGVjdHMge0BsaW5rIE5ldHdvcmtQb2xpY3l9CisgICAgICogd2FybmluZyBub3RpZmljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0RBVEFfVVNBR0VfV0FSTklORyA9CisgICAgICAgICAgICAiYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkRBVEFfVVNBR0VfV0FSTklORyI7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgSW50ZW50fSBhY3Rpb24gbGF1bmNoZWQgd2hlbiB1c2VyIHNlbGVjdHMge0BsaW5rIE5ldHdvcmtQb2xpY3l9CisgICAgICogbGltaXQgbm90aWZpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9EQVRBX1VTQUdFX0xJTUlUID0KKyAgICAgICAgICAgICJhbmRyb2lkLmludGVudC5hY3Rpb24uREFUQV9VU0FHRV9MSU1JVCI7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgSW50ZW50fSBleHRyYSBpbmNsdWRlZCBpbiB7QGxpbmsgI0FDVElPTl9EQVRBX1VTQUdFX1dBUk5JTkd9IGFuZAorICAgICAqIHtAbGluayAjQUNUSU9OX0RBVEFfVVNBR0VfTElNSVR9IHRvIGluZGljYXRlIHdoaWNoCisgICAgICoge0BsaW5rIE5ldHdvcmtUZW1wbGF0ZX0gcnVsZSBpdCBhcHBsaWVzIHRvLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX05FVFdPUktfVEVNUExBVEUgPQorICAgICAgICAgICAgImFuZHJvaWQuaW50ZW50LmV4dHJhLk5FVFdPUktfVEVNUExBVEUiOwogCiAgICAgcHJpdmF0ZSBJTmV0d29ya1BvbGljeU1hbmFnZXIgbVNlcnZpY2U7CiAKQEAgLTQ4LDEyICs3NywyOCBAQAogICAgICAgICByZXR1cm4gKE5ldHdvcmtQb2xpY3lNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ORVRXT1JLX1BPTElDWV9TRVJWSUNFKTsKICAgICB9CiAKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyB2b2lkIHNldE5ldHdvcmtQb2xpY2llcyhOZXR3b3JrUG9saWN5W10gcG9saWNpZXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXJ2aWNlLnNldE5ldHdvcmtQb2xpY2llcyhwb2xpY2llcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBOZXR3b3JrUG9saWN5W10gZ2V0TmV0d29ya1BvbGljaWVzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLmdldE5ldHdvcmtQb2xpY2llcygpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXQgcG9saWN5IGZsYWdzIGZvciBzcGVjaWZpYyBVSUQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcG9saWN5IHtAbGluayAjUE9MSUNZX05PTkV9IG9yIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI1BPTElDWV9SRUpFQ1RfQkFDS0dST1VORH0sIHtAbGluayAjUE9MSUNZX1JFSkVDVF9QQUlEfSwKLSAgICAgKiAgICAgICAgICAgIG9yIHtAbGluayAjUE9MSUNZX0NPTlNFUlZFX0RBVEF9LgorICAgICAqIEBwYXJhbSBwb2xpY3kge0BsaW5rICNQT0xJQ1lfTk9ORX0gb3IgY29tYmluYXRpb24gb2YgZmxhZ3MgbGlrZQorICAgICAqICAgICAgICAgICAge0BsaW5rICNQT0xJQ1lfUkVKRUNUX01FVEVSRURfQkFDS0dST1VORH0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VWlkUG9saWN5KGludCB1aWQsIGludCBwb2xpY3kpIHsKICAgICAgICAgdHJ5IHsKQEAgLTcwLDQgKzExNSwxMjEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoSU5ldHdvcmtQb2xpY3lMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UucmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyTGlzdGVuZXIoSU5ldHdvcmtQb2xpY3lMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UudW5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGUgdGhlIGxhc3QgY3ljbGUgYm91bmRhcnkgZm9yIHRoZSBnaXZlbiB7QGxpbmsgTmV0d29ya1BvbGljeX0uIEZvcgorICAgICAqIGV4YW1wbGUsIGlmIGN5Y2xlIGRheSBpcyAyMHRoLCBhbmQgdG9kYXkgaXMgSnVuZSAxNXRoLCBpdCB3aWxsIHJldHVybiBNYXkKKyAgICAgKiAyMHRoLiBXaGVuIGN5Y2xlIGRheSBkb2Vzbid0IGV4aXN0IGluIGN1cnJlbnQgbW9udGgsIGl0IHNuYXBzIHRvIHRoZSAxc3QKKyAgICAgKiBvZiBmb2xsb3dpbmcgbW9udGguCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb21wdXRlTGFzdEN5Y2xlQm91bmRhcnkobG9uZyBjdXJyZW50VGltZSwgTmV0d29ya1BvbGljeSBwb2xpY3kpIHsKKyAgICAgICAgZmluYWwgVGltZSBub3cgPSBuZXcgVGltZShUaW1lLlRJTUVaT05FX1VUQyk7CisgICAgICAgIG5vdy5zZXQoY3VycmVudFRpbWUpOworCisgICAgICAgIC8vIGZpcnN0LCBmaW5kIGN5Y2xlIGJvdW5kYXJ5IGZvciBjdXJyZW50IG1vbnRoCisgICAgICAgIGZpbmFsIFRpbWUgY3ljbGUgPSBuZXcgVGltZShub3cpOworICAgICAgICBjeWNsZS5ob3VyID0gY3ljbGUubWludXRlID0gY3ljbGUuc2Vjb25kID0gMDsKKyAgICAgICAgc25hcFRvQ3ljbGVEYXkoY3ljbGUsIHBvbGljeS5jeWNsZURheSk7CisKKyAgICAgICAgaWYgKFRpbWUuY29tcGFyZShjeWNsZSwgbm93KSA+PSAwKSB7CisgICAgICAgICAgICAvLyBjeWNsZSBib3VuZGFyeSBpcyBiZXlvbmQgbm93LCB1c2UgbGFzdCBjeWNsZSBib3VuZGFyeTsgc3RhcnQgYnkKKyAgICAgICAgICAgIC8vIHB1c2hpbmcgb3Vyc2VsdmVzIHNxdWFyZWx5IGludG8gbGFzdCBtb250aC4KKyAgICAgICAgICAgIGZpbmFsIFRpbWUgbGFzdE1vbnRoID0gbmV3IFRpbWUobm93KTsKKyAgICAgICAgICAgIGxhc3RNb250aC5ob3VyID0gbGFzdE1vbnRoLm1pbnV0ZSA9IGxhc3RNb250aC5zZWNvbmQgPSAwOworICAgICAgICAgICAgbGFzdE1vbnRoLm1vbnRoRGF5ID0gMTsKKyAgICAgICAgICAgIGxhc3RNb250aC5tb250aCAtPSAxOworICAgICAgICAgICAgbGFzdE1vbnRoLm5vcm1hbGl6ZSh0cnVlKTsKKworICAgICAgICAgICAgY3ljbGUuc2V0KGxhc3RNb250aCk7CisgICAgICAgICAgICBzbmFwVG9DeWNsZURheShjeWNsZSwgcG9saWN5LmN5Y2xlRGF5KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjeWNsZS50b01pbGxpcyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjb21wdXRlTmV4dEN5Y2xlQm91bmRhcnkobG9uZyBjdXJyZW50VGltZSwgTmV0d29ya1BvbGljeSBwb2xpY3kpIHsKKyAgICAgICAgZmluYWwgVGltZSBub3cgPSBuZXcgVGltZShUaW1lLlRJTUVaT05FX1VUQyk7CisgICAgICAgIG5vdy5zZXQoY3VycmVudFRpbWUpOworCisgICAgICAgIC8vIGZpcnN0LCBmaW5kIGN5Y2xlIGJvdW5kYXJ5IGZvciBjdXJyZW50IG1vbnRoCisgICAgICAgIGZpbmFsIFRpbWUgY3ljbGUgPSBuZXcgVGltZShub3cpOworICAgICAgICBjeWNsZS5ob3VyID0gY3ljbGUubWludXRlID0gY3ljbGUuc2Vjb25kID0gMDsKKyAgICAgICAgc25hcFRvQ3ljbGVEYXkoY3ljbGUsIHBvbGljeS5jeWNsZURheSk7CisKKyAgICAgICAgaWYgKFRpbWUuY29tcGFyZShjeWNsZSwgbm93KSA8PSAwKSB7CisgICAgICAgICAgICAvLyBjeWNsZSBib3VuZGFyeSBpcyBiZWZvcmUgbm93LCB1c2UgbmV4dCBjeWNsZSBib3VuZGFyeTsgc3RhcnQgYnkKKyAgICAgICAgICAgIC8vIHB1c2hpbmcgb3Vyc2VsdmVzIHNxdWFyZWx5IGludG8gbmV4dCBtb250aC4KKyAgICAgICAgICAgIGZpbmFsIFRpbWUgbmV4dE1vbnRoID0gbmV3IFRpbWUobm93KTsKKyAgICAgICAgICAgIG5leHRNb250aC5ob3VyID0gbmV4dE1vbnRoLm1pbnV0ZSA9IG5leHRNb250aC5zZWNvbmQgPSAwOworICAgICAgICAgICAgbmV4dE1vbnRoLm1vbnRoRGF5ID0gMTsKKyAgICAgICAgICAgIG5leHRNb250aC5tb250aCArPSAxOworICAgICAgICAgICAgbmV4dE1vbnRoLm5vcm1hbGl6ZSh0cnVlKTsKKworICAgICAgICAgICAgY3ljbGUuc2V0KG5leHRNb250aCk7CisgICAgICAgICAgICBzbmFwVG9DeWNsZURheShjeWNsZSwgcG9saWN5LmN5Y2xlRGF5KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjeWNsZS50b01pbGxpcyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTbmFwIHRvIHRoZSBjeWNsZSBkYXkgZm9yIHRoZSBjdXJyZW50IG1vbnRoIGdpdmVuOyB3aGVuIGN5Y2xlIGRheSBkb2Vzbid0CisgICAgICogZXhpc3QsIGl0IHNuYXBzIHRvIDFzdCBvZiBmb2xsb3dpbmcgbW9udGguCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbmFwVG9DeWNsZURheShUaW1lIHRpbWUsIGludCBjeWNsZURheSkgeworICAgICAgICBpZiAoY3ljbGVEYXkgPiB0aW1lLmdldEFjdHVhbE1heGltdW0oTU9OVEhfREFZKSkgeworICAgICAgICAgICAgLy8gY3ljbGUgZGF5IGlzbid0IHZhbGlkIHRoaXMgbW9udGg7IHNuYXAgdG8gMXN0IG9mIG5leHQgbW9udGgKKyAgICAgICAgICAgIHRpbWUubW9udGggKz0gMTsKKyAgICAgICAgICAgIHRpbWUubW9udGhEYXkgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGltZS5tb250aERheSA9IGN5Y2xlRGF5OworICAgICAgICB9CisgICAgICAgIHRpbWUubm9ybWFsaXplKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGdpdmVuIFVJRCBjYW4gaGF2ZSBhIHtAbGluayAjc2V0VWlkUG9saWN5KGludCwgaW50KX0gZGVmaW5lZCwKKyAgICAgKiB1c3VhbGx5IHRvIHByb3RlY3QgY3JpdGljYWwgc3lzdGVtIHNlcnZpY2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VpZFZhbGlkRm9yUG9saWN5KENvbnRleHQgY29udGV4dCwgaW50IHVpZCkgeworICAgICAgICByZXR1cm4gKHVpZCA+PSBhbmRyb2lkLm9zLlByb2Nlc3MuRklSU1RfQVBQTElDQVRJT05fVUlECisgICAgICAgICAgICAgICAgJiYgdWlkIDw9IGFuZHJvaWQub3MuUHJvY2Vzcy5MQVNUX0FQUExJQ0FUSU9OX1VJRCk7CisgICAgfQorCisgICAgLyoqIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVtcFBvbGljeShQcmludFdyaXRlciBmb3V0LCBpbnQgcG9saWN5KSB7CisgICAgICAgIGZvdXQud3JpdGUoIlsiKTsKKyAgICAgICAgaWYgKChwb2xpY3kgJiBQT0xJQ1lfUkVKRUNUX01FVEVSRURfQkFDS0dST1VORCkgIT0gMCkgeworICAgICAgICAgICAgZm91dC53cml0ZSgiUkVKRUNUX01FVEVSRURfQkFDS0dST1VORCIpOworICAgICAgICB9CisgICAgICAgIGZvdXQud3JpdGUoIl0iKTsKKyAgICB9CisKKyAgICAvKioge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wUnVsZXMoUHJpbnRXcml0ZXIgZm91dCwgaW50IHJ1bGVzKSB7CisgICAgICAgIGZvdXQud3JpdGUoIlsiKTsKKyAgICAgICAgaWYgKChydWxlcyAmIFJVTEVfUkVKRUNUX01FVEVSRUQpICE9IDApIHsKKyAgICAgICAgICAgIGZvdXQud3JpdGUoIlJFSkVDVF9NRVRFUkVEIik7CisgICAgICAgIH0KKyAgICAgICAgZm91dC53cml0ZSgiXSIpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjZjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRlLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIE5ldHdvcmtTdGF0ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQxMTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCisvKioKKyAqIFNuYXBzaG90IG9mIG5ldHdvcmsgc3RhdGUuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIE5ldHdvcmtTdGF0ZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworCisgICAgcHVibGljIGZpbmFsIE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvOworICAgIHB1YmxpYyBmaW5hbCBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllczsKKyAgICBwdWJsaWMgZmluYWwgTGlua0NhcGFiaWxpdGllcyBsaW5rQ2FwYWJpbGl0aWVzOworICAgIC8qKiBDdXJyZW50bHkgb25seSB1c2VkIGJ5IHRlc3RpbmcuICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBzdWJzY3JpYmVySWQ7CisKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRlKE5ldHdvcmtJbmZvIG5ldHdvcmtJbmZvLCBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcywKKyAgICAgICAgICAgIExpbmtDYXBhYmlsaXRpZXMgbGlua0NhcGFiaWxpdGllcykgeworICAgICAgICB0aGlzKG5ldHdvcmtJbmZvLCBsaW5rUHJvcGVydGllcywgbGlua0NhcGFiaWxpdGllcywgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtTdGF0ZShOZXR3b3JrSW5mbyBuZXR3b3JrSW5mbywgTGlua1Byb3BlcnRpZXMgbGlua1Byb3BlcnRpZXMsCisgICAgICAgICAgICBMaW5rQ2FwYWJpbGl0aWVzIGxpbmtDYXBhYmlsaXRpZXMsIFN0cmluZyBzdWJzY3JpYmVySWQpIHsKKyAgICAgICAgdGhpcy5uZXR3b3JrSW5mbyA9IG5ldHdvcmtJbmZvOworICAgICAgICB0aGlzLmxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CisgICAgICAgIHRoaXMubGlua0NhcGFiaWxpdGllcyA9IGxpbmtDYXBhYmlsaXRpZXM7CisgICAgICAgIHRoaXMuc3Vic2NyaWJlcklkID0gc3Vic2NyaWJlcklkOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrU3RhdGUoUGFyY2VsIGluKSB7CisgICAgICAgIG5ldHdvcmtJbmZvID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIGxpbmtQcm9wZXJ0aWVzID0gaW4ucmVhZFBhcmNlbGFibGUobnVsbCk7CisgICAgICAgIGxpbmtDYXBhYmlsaXRpZXMgPSBpbi5yZWFkUGFyY2VsYWJsZShudWxsKTsKKyAgICAgICAgc3Vic2NyaWJlcklkID0gaW4ucmVhZFN0cmluZygpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgIG91dC53cml0ZVBhcmNlbGFibGUobmV0d29ya0luZm8sIGZsYWdzKTsKKyAgICAgICAgb3V0LndyaXRlUGFyY2VsYWJsZShsaW5rUHJvcGVydGllcywgZmxhZ3MpOworICAgICAgICBvdXQud3JpdGVQYXJjZWxhYmxlKGxpbmtDYXBhYmlsaXRpZXMsIGZsYWdzKTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nKHN1YnNjcmliZXJJZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDcmVhdG9yPE5ldHdvcmtTdGF0ZT4gQ1JFQVRPUiA9IG5ldyBDcmVhdG9yPE5ldHdvcmtTdGF0ZT4oKSB7CisgICAgICAgIHB1YmxpYyBOZXR3b3JrU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1N0YXRlKGluKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOZXR3b3JrU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrU3RhdGVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzLmphdmEKaW5kZXggMGYyMDdiYy4uOWQ0MGM0MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0cy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHMuamF2YQpAQCAtMTksMTAwICsxOSwxMDggQEAKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQm9vbGVhbkFycmF5OwogCiBpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogCiAvKioKLSAqIENvbGxlY3Rpb24gb2YgbmV0d29yayBzdGF0aXN0aWNzLiBDYW4gY29udGFpbiBzdW1tYXJ5IGRldGFpbHMgYWNyb3NzIGFsbAotICogaW50ZXJmYWNlcywgb3IgZGV0YWlscyB3aXRoIHBlci1VSUQgZ3JhbnVsYXJpdHkuIERlc2lnbmVkIHRvIHBhcmNlbCBxdWlja2x5Ci0gKiBhY3Jvc3MgcHJvY2VzcyBib3VuZGFyaWVzLgorICogQ29sbGVjdGlvbiBvZiBhY3RpdmUgbmV0d29yayBzdGF0aXN0aWNzLiBDYW4gY29udGFpbiBzdW1tYXJ5IGRldGFpbHMgYWNyb3NzCisgKiBhbGwgaW50ZXJmYWNlcywgb3IgZGV0YWlscyB3aXRoIHBlci1VSUQgZ3JhbnVsYXJpdHkuIEludGVybmFsbHkgc3RvcmVzIGRhdGEKKyAqIGFzIGEgbGFyZ2UgdGFibGUsIGNsb3NlbHkgbWF0Y2hpbmcge0Bjb2RlIC9wcm9jL30gZGF0YSBmb3JtYXQuIFRoaXMgc3RydWN0dXJlCisgKiBvcHRpbWl6ZXMgZm9yIHJhcGlkIGluLW1lbW9yeSBjb21wYXJpc29uLCBidXQgY29uc2lkZXIgdXNpbmcKKyAqIHtAbGluayBOZXR3b3JrU3RhdHNIaXN0b3J5fSB3aGVuIHBlcnNpc3RpbmcuCiAgKgogICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIE5ldHdvcmtTdGF0cyBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewotICAgIC8qKiB7QGxpbmsgI2lmYWNlfSB2YWx1ZSB3aGVuIGVudHJ5IGlzIHN1bW1hcml6ZWQgb3ZlciBhbGwgaW50ZXJmYWNlcy4gKi8KKyAgICAvKioge0BsaW5rICNpZmFjZX0gdmFsdWUgd2hlbiBpbnRlcmZhY2UgZGV0YWlscyB1bmF2YWlsYWJsZS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRkFDRV9BTEwgPSBudWxsOwotICAgIC8qKiB7QGxpbmsgI3VpZH0gdmFsdWUgd2hlbiBlbnRyeSBpcyBzdW1tYXJpemVkIG92ZXIgYWxsIFVJRHMuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlEX0FMTCA9IDA7Ci0KLSAgICAvLyBOT1RFOiBkYXRhIHNob3VsZCBvbmx5IGJlIGFjY291bnRlZCBmb3Igb25jZSBpbiB0aGlzIHN0cnVjdHVyZTsgaWYgZGF0YQotICAgIC8vIGlzIGJyb2tlbiBvdXQsIHRoZSBzdW1tYXJpemVkIHZlcnNpb24gc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAvKioge0BsaW5rICN1aWR9IHZhbHVlIHdoZW4gVUlEIGRldGFpbHMgdW5hdmFpbGFibGUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVUlEX0FMTCA9IC0xOworICAgIC8qKiB7QGxpbmsgI3RhZ30gdmFsdWUgZm9yIHdpdGhvdXQgdGFnLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBR19OT05FID0gMDsKIAogICAgIC8qKgogICAgICAqIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZXN0YW1wIHdoZW4gdGhpcyBkYXRhIHdhcwogICAgICAqIGdlbmVyYXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgbG9uZyBlbGFwc2VkUmVhbHRpbWU7Ci0gICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGlmYWNlOwotICAgIHB1YmxpYyBmaW5hbCBpbnRbXSB1aWQ7Ci0gICAgcHVibGljIGZpbmFsIGxvbmdbXSByeDsKLSAgICBwdWJsaWMgZmluYWwgbG9uZ1tdIHR4OworICAgIHB1YmxpYyBpbnQgc2l6ZTsKKyAgICBwdWJsaWMgU3RyaW5nW10gaWZhY2U7CisgICAgcHVibGljIGludFtdIHVpZDsKKyAgICBwdWJsaWMgaW50W10gdGFnOworICAgIHB1YmxpYyBsb25nW10gcng7CisgICAgcHVibGljIGxvbmdbXSB0eDsKIAotICAgIC8vIFRPRE86IGFkZCBmZy9iZyBzdGF0cyBhbmQgdGFnIGdyYW51bGFyaXR5Ci0KLSAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyhsb25nIGVsYXBzZWRSZWFsdGltZSwgU3RyaW5nW10gaWZhY2UsIGludFtdIHVpZCwgbG9uZ1tdIHJ4LCBsb25nW10gdHgpIHsKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzKGxvbmcgZWxhcHNlZFJlYWx0aW1lLCBpbnQgaW5pdGlhbFNpemUpIHsKICAgICAgICAgdGhpcy5lbGFwc2VkUmVhbHRpbWUgPSBlbGFwc2VkUmVhbHRpbWU7Ci0gICAgICAgIHRoaXMuaWZhY2UgPSBpZmFjZTsKLSAgICAgICAgdGhpcy51aWQgPSB1aWQ7Ci0gICAgICAgIHRoaXMucnggPSByeDsKLSAgICAgICAgdGhpcy50eCA9IHR4OworICAgICAgICB0aGlzLnNpemUgPSAwOworICAgICAgICB0aGlzLmlmYWNlID0gbmV3IFN0cmluZ1tpbml0aWFsU2l6ZV07CisgICAgICAgIHRoaXMudWlkID0gbmV3IGludFtpbml0aWFsU2l6ZV07CisgICAgICAgIHRoaXMudGFnID0gbmV3IGludFtpbml0aWFsU2l6ZV07CisgICAgICAgIHRoaXMucnggPSBuZXcgbG9uZ1tpbml0aWFsU2l6ZV07CisgICAgICAgIHRoaXMudHggPSBuZXcgbG9uZ1tpbml0aWFsU2l6ZV07CiAgICAgfQogCiAgICAgcHVibGljIE5ldHdvcmtTdGF0cyhQYXJjZWwgcGFyY2VsKSB7CiAgICAgICAgIGVsYXBzZWRSZWFsdGltZSA9IHBhcmNlbC5yZWFkTG9uZygpOworICAgICAgICBzaXplID0gcGFyY2VsLnJlYWRJbnQoKTsKICAgICAgICAgaWZhY2UgPSBwYXJjZWwuY3JlYXRlU3RyaW5nQXJyYXkoKTsKICAgICAgICAgdWlkID0gcGFyY2VsLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIHRhZyA9IHBhcmNlbC5jcmVhdGVJbnRBcnJheSgpOwogICAgICAgICByeCA9IHBhcmNlbC5jcmVhdGVMb25nQXJyYXkoKTsKICAgICAgICAgdHggPSBwYXJjZWwuY3JlYXRlTG9uZ0FycmF5KCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1FbGFwc2VkUmVhbHRpbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbUlmYWNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIG1VaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIG1SeDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nW10gbVR4OwotCi0gICAgICAgIHByaXZhdGUgaW50IG1JbmRleCA9IDA7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIobG9uZyBlbGFwc2VkUmVhbHRpbWUsIGludCBzaXplKSB7Ci0gICAgICAgICAgICBtRWxhcHNlZFJlYWx0aW1lID0gZWxhcHNlZFJlYWx0aW1lOwotICAgICAgICAgICAgbUlmYWNlID0gbmV3IFN0cmluZ1tzaXplXTsKLSAgICAgICAgICAgIG1VaWQgPSBuZXcgaW50W3NpemVdOwotICAgICAgICAgICAgbVJ4ID0gbmV3IGxvbmdbc2l6ZV07Ci0gICAgICAgICAgICBtVHggPSBuZXcgbG9uZ1tzaXplXTsKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IHN0YXRzIGVudHJ5IHdpdGggZ2l2ZW4gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBOZXR3b3JrU3RhdHMgYWRkRW50cnkoU3RyaW5nIGlmYWNlLCBpbnQgdWlkLCBpbnQgdGFnLCBsb25nIHJ4LCBsb25nIHR4KSB7CisgICAgICAgIGlmIChzaXplID49IHRoaXMuaWZhY2UubGVuZ3RoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmV3TGVuZ3RoID0gTWF0aC5tYXgodGhpcy5pZmFjZS5sZW5ndGgsIDEwKSAqIDMgLyAyOworICAgICAgICAgICAgdGhpcy5pZmFjZSA9IEFycmF5cy5jb3B5T2YodGhpcy5pZmFjZSwgbmV3TGVuZ3RoKTsKKyAgICAgICAgICAgIHRoaXMudWlkID0gQXJyYXlzLmNvcHlPZih0aGlzLnVpZCwgbmV3TGVuZ3RoKTsKKyAgICAgICAgICAgIHRoaXMudGFnID0gQXJyYXlzLmNvcHlPZih0aGlzLnRhZywgbmV3TGVuZ3RoKTsKKyAgICAgICAgICAgIHRoaXMucnggPSBBcnJheXMuY29weU9mKHRoaXMucngsIG5ld0xlbmd0aCk7CisgICAgICAgICAgICB0aGlzLnR4ID0gQXJyYXlzLmNvcHlPZih0aGlzLnR4LCBuZXdMZW5ndGgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRW50cnkoU3RyaW5nIGlmYWNlLCBpbnQgdWlkLCBsb25nIHJ4LCBsb25nIHR4KSB7Ci0gICAgICAgICAgICBtSWZhY2VbbUluZGV4XSA9IGlmYWNlOwotICAgICAgICAgICAgbVVpZFttSW5kZXhdID0gdWlkOwotICAgICAgICAgICAgbVJ4W21JbmRleF0gPSByeDsKLSAgICAgICAgICAgIG1UeFttSW5kZXhdID0gdHg7Ci0gICAgICAgICAgICBtSW5kZXgrKzsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgICAgICAgIHRoaXMuaWZhY2Vbc2l6ZV0gPSBpZmFjZTsKKyAgICAgICAgdGhpcy51aWRbc2l6ZV0gPSB1aWQ7CisgICAgICAgIHRoaXMudGFnW3NpemVdID0gdGFnOworICAgICAgICB0aGlzLnJ4W3NpemVdID0gcng7CisgICAgICAgIHRoaXMudHhbc2l6ZV0gPSB0eDsKKyAgICAgICAgc2l6ZSsrOwogCi0gICAgICAgIHB1YmxpYyBOZXR3b3JrU3RhdHMgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUluZGV4ICE9IG1JZmFjZS5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0cyhtRWxhcHNlZFJlYWx0aW1lLCBtSWZhY2UsIG1VaWQsIG1SeCwgbVR4KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKLSAgICAgICAgLy8gbGVuZ3RoIGlzIGlkZW50aWNhbCBmb3IgYWxsIGZpZWxkcwotICAgICAgICByZXR1cm4gaWZhY2UubGVuZ3RoOworICAgIC8qKgorICAgICAqIENvbWJpbmUgZ2l2ZW4gdmFsdWVzIHdpdGggYW4gZXhpc3Rpbmcgcm93LCBvciBjcmVhdGUgYSBuZXcgcm93IGlmCisgICAgICoge0BsaW5rICNmaW5kSW5kZXgoU3RyaW5nLCBpbnQsIGludCl9IGlzIHVuYWJsZSB0byBmaW5kIG1hdGNoLiBDYW4gYWxzbyBiZQorICAgICAqIHVzZWQgdG8gc3VidHJhY3QgdmFsdWVzIGZyb20gZXhpc3Rpbmcgcm93cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzIGNvbWJpbmVFbnRyeShTdHJpbmcgaWZhY2UsIGludCB1aWQsIGludCB0YWcsIGxvbmcgcngsIGxvbmcgdHgpIHsKKyAgICAgICAgZmluYWwgaW50IGkgPSBmaW5kSW5kZXgoaWZhY2UsIHVpZCwgdGFnKTsKKyAgICAgICAgaWYgKGkgPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIG9ubHkgY3JlYXRlIG5ldyBlbnRyeSB3aGVuIHBvc2l0aXZlIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgYWRkRW50cnkoaWZhY2UsIHVpZCwgdGFnLCByeCwgdHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5yeFtpXSArPSByeDsKKyAgICAgICAgICAgIHRoaXMudHhbaV0gKz0gdHg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRmluZCBmaXJzdCBzdGF0cyBpbmRleCB0aGF0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZmluZEluZGV4KFN0cmluZyBpZmFjZSwgaW50IHVpZCkgewotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gbGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChlcXVhbChpZmFjZSwgdGhpcy5pZmFjZVtpXSkgJiYgdWlkID09IHRoaXMudWlkW2ldKSB7CisgICAgcHVibGljIGludCBmaW5kSW5kZXgoU3RyaW5nIGlmYWNlLCBpbnQgdWlkLCBpbnQgdGFnKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZXF1YWwoaWZhY2UsIHRoaXMuaWZhY2VbaV0pICYmIHVpZCA9PSB0aGlzLnVpZFtpXSAmJiB0YWcgPT0gdGhpcy50YWdbaV0pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTIwLDMzICsxMjgsMTA0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJuIGxpc3Qgb2YgdW5pcXVlIGludGVyZmFjZXMga25vd24gYnkgdGhpcyBkYXRhIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VW5pcXVlSWZhY2VzKCkgeworICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gaWZhY2VzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IHRoaXMuaWZhY2UpIHsKKyAgICAgICAgICAgIGlmIChpZmFjZSAhPSBJRkFDRV9BTEwpIHsKKyAgICAgICAgICAgICAgICBpZmFjZXMuYWRkKGlmYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaWZhY2VzLnRvQXJyYXkobmV3IFN0cmluZ1tpZmFjZXMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGxpc3Qgb2YgdW5pcXVlIFVJRHMga25vd24gYnkgdGhpcyBkYXRhIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50W10gZ2V0VW5pcXVlVWlkcygpIHsKKyAgICAgICAgZmluYWwgU3BhcnNlQm9vbGVhbkFycmF5IHVpZHMgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KCk7CisgICAgICAgIGZvciAoaW50IHVpZCA6IHRoaXMudWlkKSB7CisgICAgICAgICAgICB1aWRzLnB1dCh1aWQsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSB1aWRzLnNpemUoKTsKKyAgICAgICAgZmluYWwgaW50W10gcmVzdWx0ID0gbmV3IGludFtzaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHVpZHMua2V5QXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTdWJ0cmFjdCB0aGUgZ2l2ZW4ge0BsaW5rIE5ldHdvcmtTdGF0c30sIGVmZmVjdGl2ZWx5IGxlYXZpbmcgdGhlIGRlbHRhCiAgICAgICogYmV0d2VlbiB0d28gc25hcHNob3RzIGluIHRpbWUuIEFzc3VtZXMgdGhhdCBzdGF0aXN0aWNzIHJvd3MgY29sbGVjdCBvdmVyCiAgICAgICogdGltZSwgYW5kIHRoYXQgbm9uZSBvZiB0aGVtIGhhdmUgZGlzYXBwZWFyZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIGdpdmVuIHtAbGluayBOZXR3b3JrU3RhdHN9IGlzCisgICAgICogICAgICAgICAgICAgbm9uLW1vbm90b25pYy4KICAgICAgKi8KICAgICBwdWJsaWMgTmV0d29ya1N0YXRzIHN1YnRyYWN0KE5ldHdvcmtTdGF0cyB2YWx1ZSkgewotICAgICAgICAvLyByZXN1bHQgd2lsbCBoYXZlIG91ciByb3dzLCBidXQgbm8gbWVhbmluZ2Z1bCB0aW1lc3RhbXAKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGxlbmd0aCgpOwotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMuQnVpbGRlciByZXN1bHQgPSBuZXcgTmV0d29ya1N0YXRzLkJ1aWxkZXIoLTEsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBzdWJ0cmFjdCh2YWx1ZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgLyoqCisgICAgICogU3VidHJhY3QgdGhlIGdpdmVuIHtAbGluayBOZXR3b3JrU3RhdHN9LCBlZmZlY3RpdmVseSBsZWF2aW5nIHRoZSBkZWx0YQorICAgICAqIGJldHdlZW4gdHdvIHNuYXBzaG90cyBpbiB0aW1lLiBBc3N1bWVzIHRoYXQgc3RhdGlzdGljcyByb3dzIGNvbGxlY3Qgb3ZlcgorICAgICAqIHRpbWUsIGFuZCB0aGF0IG5vbmUgb2YgdGhlbSBoYXZlIGRpc2FwcGVhcmVkLgorICAgICAqIDxwPgorICAgICAqIEluc3RlYWQgb2YgdGhyb3dpbmcgd2hlbiBjb3VudGVycyBhcmUgbm9uLW1vbm90b25pYywgdGhpcyB2YXJpYW50IGNsYW1wcworICAgICAqIHJlc3VsdHMgdG8gbmV2ZXIgYmUgbmVnYXRpdmUuCisgICAgICovCisgICAgcHVibGljIE5ldHdvcmtTdGF0cyBzdWJ0cmFjdENsYW1wZWQoTmV0d29ya1N0YXRzIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBzdWJ0cmFjdCh2YWx1ZSwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YnRyYWN0IHRoZSBnaXZlbiB7QGxpbmsgTmV0d29ya1N0YXRzfSwgZWZmZWN0aXZlbHkgbGVhdmluZyB0aGUgZGVsdGEKKyAgICAgKiBiZXR3ZWVuIHR3byBzbmFwc2hvdHMgaW4gdGltZS4gQXNzdW1lcyB0aGF0IHN0YXRpc3RpY3Mgcm93cyBjb2xsZWN0IG92ZXIKKyAgICAgKiB0aW1lLCBhbmQgdGhhdCBub25lIG9mIHRoZW0gaGF2ZSBkaXNhcHBlYXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmZvcmNlTW9ub3RvbmljIFZhbGlkYXRlIHRoYXQgaW5jb21pbmcgdmFsdWUgaXMgc3RyaWN0bHkKKyAgICAgKiAgICAgICAgICAgIG1vbm90b25pYyBjb21wYXJlZCB0byB0aGlzIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gY2xhbXBOZWdhdGl2ZSBJbnN0ZWFkIG9mIHRocm93aW5nIGxpa2Uge0Bjb2RlIGVuZm9yY2VNb25vdG9uaWN9LAorICAgICAqICAgICAgICAgICAgY2xhbXAgcmVzdWx0aW5nIGNvdW50ZXJzIGF0IDAgdG8gcHJldmVudCBuZWdhdGl2ZSB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBOZXR3b3JrU3RhdHMgc3VidHJhY3QoCisgICAgICAgICAgICBOZXR3b3JrU3RhdHMgdmFsdWUsIGJvb2xlYW4gZW5mb3JjZU1vbm90b25pYywgYm9vbGVhbiBjbGFtcE5lZ2F0aXZlKSB7CisgICAgICAgIGZpbmFsIGxvbmcgZGVsdGFSZWFsdGltZSA9IHRoaXMuZWxhcHNlZFJlYWx0aW1lIC0gdmFsdWUuZWxhcHNlZFJlYWx0aW1lOworICAgICAgICBpZiAoZW5mb3JjZU1vbm90b25pYyAmJiBkZWx0YVJlYWx0aW1lIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZm91bmQgbm9uLW1vbm90b25pYyByZWFsdGltZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVzdWx0IHdpbGwgaGF2ZSBvdXIgcm93cywgYW5kIGVsYXBzZWQgdGltZSBiZXR3ZWVuIHNuYXBzaG90cworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgcmVzdWx0ID0gbmV3IE5ldHdvcmtTdGF0cyhkZWx0YVJlYWx0aW1lLCBzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZmFjZSA9IHRoaXMuaWZhY2VbaV07CiAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gdGhpcy51aWRbaV07CisgICAgICAgICAgICBmaW5hbCBpbnQgdGFnID0gdGhpcy50YWdbaV07CiAKICAgICAgICAgICAgIC8vIGZpbmQgcmVtb3RlIHJvdyB0aGF0IG1hdGNoZXMsIGFuZCBzdWJ0cmFjdAotICAgICAgICAgICAgZmluYWwgaW50IGogPSB2YWx1ZS5maW5kSW5kZXgoaWZhY2UsIHVpZCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgaiA9IHZhbHVlLmZpbmRJbmRleChpZmFjZSwgdWlkLCB0YWcpOwogICAgICAgICAgICAgaWYgKGogPT0gLTEpIHsKICAgICAgICAgICAgICAgICAvLyBuZXdseSBhcHBlYXJpbmcgcm93LCByZXR1cm4gZW50aXJlIHZhbHVlCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVudHJ5KGlmYWNlLCB1aWQsIHRoaXMucnhbaV0sIHRoaXMudHhbaV0pOworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFbnRyeShpZmFjZSwgdWlkLCB0YWcsIHRoaXMucnhbaV0sIHRoaXMudHhbaV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyByb3csIHN1YnRyYWN0IHJlbW90ZSB2YWx1ZQotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcnggPSB0aGlzLnJ4W2ldIC0gdmFsdWUucnhbal07Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0eCA9IHRoaXMudHhbaV0gLSB2YWx1ZS50eFtqXTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkRW50cnkoaWZhY2UsIHVpZCwgcngsIHR4KTsKKyAgICAgICAgICAgICAgICBsb25nIHJ4ID0gdGhpcy5yeFtpXSAtIHZhbHVlLnJ4W2pdOworICAgICAgICAgICAgICAgIGxvbmcgdHggPSB0aGlzLnR4W2ldIC0gdmFsdWUudHhbal07CisgICAgICAgICAgICAgICAgaWYgKGVuZm9yY2VNb25vdG9uaWMgJiYgKHJ4IDwgMCB8fCB0eCA8IDApKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZvdW5kIG5vbi1tb25vdG9uaWMgdmFsdWVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjbGFtcE5lZ2F0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIHJ4ID0gTWF0aC5tYXgoMCwgcngpOworICAgICAgICAgICAgICAgICAgICB0eCA9IE1hdGgubWF4KDAsIHR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVudHJ5KGlmYWNlLCB1aWQsIHRhZywgcngsIHR4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsKE9iamVjdCBhLCBPYmplY3QgYikgewpAQCAtMTYwLDYgKzIzOSw3IEBACiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgaWZhY2U9Iik7IHB3LnByaW50KGlmYWNlW2ldKTsKICAgICAgICAgICAgIHB3LnByaW50KCIgdWlkPSIpOyBwdy5wcmludCh1aWRbaV0pOworICAgICAgICAgICAgcHcucHJpbnQoIiB0YWc9Iik7IHB3LnByaW50KHRhZ1tpXSk7CiAgICAgICAgICAgICBwdy5wcmludCgiIHJ4PSIpOyBwdy5wcmludChyeFtpXSk7CiAgICAgICAgICAgICBwdy5wcmludCgiIHR4PSIpOyBwdy5wcmludGxuKHR4W2ldKTsKICAgICAgICAgfQpAQCAtMTgwLDggKzI2MCwxMCBAQAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCiAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CiAgICAgICAgIGRlc3Qud3JpdGVMb25nKGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGRlc3Qud3JpdGVJbnQoc2l6ZSk7CiAgICAgICAgIGRlc3Qud3JpdGVTdHJpbmdBcnJheShpZmFjZSk7CiAgICAgICAgIGRlc3Qud3JpdGVJbnRBcnJheSh1aWQpOworICAgICAgICBkZXN0LndyaXRlSW50QXJyYXkodGFnKTsKICAgICAgICAgZGVzdC53cml0ZUxvbmdBcnJheShyeCk7CiAgICAgICAgIGRlc3Qud3JpdGVMb25nQXJyYXkodHgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5LmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzSGlzdG9yeS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTA2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzSGlzdG9yeS5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworcGFyY2VsYWJsZSBOZXR3b3JrU3RhdHNIaXN0b3J5OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c0hpc3RvcnkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2ZTIyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5LmphdmEKQEAgLTAsMCArMSwzNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogQ29sbGVjdGlvbiBvZiBoaXN0b3JpY2FsIG5ldHdvcmsgc3RhdGlzdGljcywgcmVjb3JkZWQgaW50byBlcXVhbGx5LXNpemVkCisgKiAiYnVja2V0cyIgaW4gdGltZS4gSW50ZXJuYWxseSBpdCBzdG9yZXMgZGF0YSBpbiB7QGNvZGUgbG9uZ30gc2VyaWVzIGZvciBtb3JlCisgKiBlZmZpY2llbnQgcGVyc2lzdGVuY2UuCisgKiA8cD4KKyAqIEVhY2ggYnVja2V0IGlzIGRlZmluZWQgYnkgYSB7QGxpbmsgI2J1Y2tldFN0YXJ0fSB0aW1lc3RhbXAsIGFuZCBsYXN0cyBmb3IKKyAqIHtAbGluayAjYnVja2V0RHVyYXRpb259LiBJbnRlcm5hbGx5IGFzc3VtZXMgdGhhdCB7QGxpbmsgI2J1Y2tldFN0YXJ0fSBpcworICogc29ydGVkIGF0IGFsbCB0aW1lcy4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgTmV0d29ya1N0YXRzSGlzdG9yeSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0lOSVQgPSAxOworCisgICAgLy8gVE9ETzogdGVhY2ggYWJvdXQgdmFyaW50IGVuY29kaW5nIHRvIHVzZSBsZXNzIGRpc2sgc3BhY2UKKworICAgIHB1YmxpYyBmaW5hbCBsb25nIGJ1Y2tldER1cmF0aW9uOworCisgICAgcHVibGljIGludCBidWNrZXRDb3VudDsKKyAgICBwdWJsaWMgbG9uZ1tdIGJ1Y2tldFN0YXJ0OworICAgIHB1YmxpYyBsb25nW10gcng7CisgICAgcHVibGljIGxvbmdbXSB0eDsKKworICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5KGxvbmcgYnVja2V0RHVyYXRpb24pIHsKKyAgICAgICAgdGhpcyhidWNrZXREdXJhdGlvbiwgMTApOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5KGxvbmcgYnVja2V0RHVyYXRpb24sIGludCBpbml0aWFsU2l6ZSkgeworICAgICAgICB0aGlzLmJ1Y2tldER1cmF0aW9uID0gYnVja2V0RHVyYXRpb247CisgICAgICAgIGJ1Y2tldFN0YXJ0ID0gbmV3IGxvbmdbaW5pdGlhbFNpemVdOworICAgICAgICByeCA9IG5ldyBsb25nW2luaXRpYWxTaXplXTsKKyAgICAgICAgdHggPSBuZXcgbG9uZ1tpbml0aWFsU2l6ZV07CisgICAgICAgIGJ1Y2tldENvdW50ID0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzSGlzdG9yeShQYXJjZWwgaW4pIHsKKyAgICAgICAgYnVja2V0RHVyYXRpb24gPSBpbi5yZWFkTG9uZygpOworICAgICAgICBidWNrZXRTdGFydCA9IHJlYWRMb25nQXJyYXkoaW4pOworICAgICAgICByeCA9IGluLmNyZWF0ZUxvbmdBcnJheSgpOworICAgICAgICB0eCA9IGluLmNyZWF0ZUxvbmdBcnJheSgpOworICAgICAgICBidWNrZXRDb3VudCA9IGJ1Y2tldFN0YXJ0Lmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIG91dCwgaW50IGZsYWdzKSB7CisgICAgICAgIG91dC53cml0ZUxvbmcoYnVja2V0RHVyYXRpb24pOworICAgICAgICB3cml0ZUxvbmdBcnJheShvdXQsIGJ1Y2tldFN0YXJ0LCBidWNrZXRDb3VudCk7CisgICAgICAgIHdyaXRlTG9uZ0FycmF5KG91dCwgcngsIGJ1Y2tldENvdW50KTsKKyAgICAgICAgd3JpdGVMb25nQXJyYXkob3V0LCB0eCwgYnVja2V0Q291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5KERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSBWRVJTSU9OX0lOSVQ6IHsKKyAgICAgICAgICAgICAgICBidWNrZXREdXJhdGlvbiA9IGluLnJlYWRMb25nKCk7CisgICAgICAgICAgICAgICAgYnVja2V0U3RhcnQgPSByZWFkTG9uZ0FycmF5KGluKTsKKyAgICAgICAgICAgICAgICByeCA9IHJlYWRMb25nQXJyYXkoaW4pOworICAgICAgICAgICAgICAgIHR4ID0gcmVhZExvbmdBcnJheShpbik7CisgICAgICAgICAgICAgICAgYnVja2V0Q291bnQgPSBidWNrZXRTdGFydC5sZW5ndGg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHZlcnNpb246ICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9TdHJlYW0oRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZUludChWRVJTSU9OX0lOSVQpOworICAgICAgICBvdXQud3JpdGVMb25nKGJ1Y2tldER1cmF0aW9uKTsKKyAgICAgICAgd3JpdGVMb25nQXJyYXkob3V0LCBidWNrZXRTdGFydCwgYnVja2V0Q291bnQpOworICAgICAgICB3cml0ZUxvbmdBcnJheShvdXQsIHJ4LCBidWNrZXRDb3VudCk7CisgICAgICAgIHdyaXRlTG9uZ0FycmF5KG91dCwgdHgsIGJ1Y2tldENvdW50KTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb3JkIHRoYXQgZGF0YSB0cmFmZmljIG9jY3VycmVkIGluIHRoZSBnaXZlbiB0aW1lIHJhbmdlLiBXaWxsCisgICAgICogZGlzdHJpYnV0ZSBhY3Jvc3MgaW50ZXJuYWwgYnVja2V0cywgY3JlYXRpbmcgbmV3IGJ1Y2tldHMgYXMgbmVlZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY29yZERhdGEobG9uZyBzdGFydCwgbG9uZyBlbmQsIGxvbmcgcngsIGxvbmcgdHgpIHsKKyAgICAgICAgaWYgKHJ4IDwgMCB8fCB0eCA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ0cmllZCByZWNvcmRpbmcgbmVnYXRpdmUgZGF0YTogcng9IiArIHJ4ICsgIiwgdHg9IiArIHR4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhbnkgYnVja2V0cyBuZWVkZWQgYnkgdGhpcyByYW5nZQorICAgICAgICBlbnN1cmVCdWNrZXRzKHN0YXJ0LCBlbmQpOworCisgICAgICAgIC8vIGRpc3RyaWJ1dGUgZGF0YSB1c2FnZSBpbnRvIGJ1Y2tldHMKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICBmb3IgKGludCBpID0gYnVja2V0Q291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBjdXJTdGFydCA9IGJ1Y2tldFN0YXJ0W2ldOworICAgICAgICAgICAgZmluYWwgbG9uZyBjdXJFbmQgPSBjdXJTdGFydCArIGJ1Y2tldER1cmF0aW9uOworCisgICAgICAgICAgICAvLyBidWNrZXQgaXMgb2xkZXIgdGhhbiByZWNvcmQ7IHdlJ3JlIGZpbmlzaGVkCisgICAgICAgICAgICBpZiAoY3VyRW5kIDwgc3RhcnQpIGJyZWFrOworICAgICAgICAgICAgLy8gYnVja2V0IGlzIG5ld2VyIHRoYW4gcmVjb3JkOyBrZWVwIGxvb2tpbmcKKyAgICAgICAgICAgIGlmIChjdXJTdGFydCA+IGVuZCkgY29udGludWU7CisKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgb3ZlcmxhcCA9IE1hdGgubWluKGN1ckVuZCwgZW5kKSAtIE1hdGgubWF4KGN1clN0YXJ0LCBzdGFydCk7CisgICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJ4W2ldICs9IHJ4ICogb3ZlcmxhcCAvIGR1cmF0aW9uOworICAgICAgICAgICAgICAgIHRoaXMudHhbaV0gKz0gdHggKiBvdmVybGFwIC8gZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvcmQgYW4gZW50aXJlIHtAbGluayBOZXR3b3JrU3RhdHNIaXN0b3J5fSBpbnRvIHRoaXMgaGlzdG9yeS4gVXN1YWxseQorICAgICAqIGZvciBjb21iaW5pbmcgdG9nZXRoZXIgc3RhdHMgZm9yIGV4dGVybmFsIHJlcG9ydGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvcmRFbnRpcmVIaXN0b3J5KE5ldHdvcmtTdGF0c0hpc3RvcnkgaW5wdXQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5idWNrZXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gaW5wdXQuYnVja2V0U3RhcnRbaV07CisgICAgICAgICAgICBmaW5hbCBsb25nIGVuZCA9IHN0YXJ0ICsgaW5wdXQuYnVja2V0RHVyYXRpb247CisgICAgICAgICAgICByZWNvcmREYXRhKHN0YXJ0LCBlbmQsIGlucHV0LnJ4W2ldLCBpbnB1dC50eFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCBidWNrZXRzIGV4aXN0IGZvciBnaXZlbiB0aW1lIHJhbmdlLCBjcmVhdGluZyBhcyBuZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUJ1Y2tldHMobG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgLy8gbm9ybWFsaXplIGluY29taW5nIHJhbmdlIHRvIGJ1Y2tldCBib3VuZGFyaWVzCisgICAgICAgIHN0YXJ0IC09IHN0YXJ0ICUgYnVja2V0RHVyYXRpb247CisgICAgICAgIGVuZCArPSAoYnVja2V0RHVyYXRpb24gLSAoZW5kICUgYnVja2V0RHVyYXRpb24pKSAlIGJ1Y2tldER1cmF0aW9uOworCisgICAgICAgIGZvciAobG9uZyBub3cgPSBzdGFydDsgbm93IDwgZW5kOyBub3cgKz0gYnVja2V0RHVyYXRpb24pIHsKKyAgICAgICAgICAgIC8vIHRyeSBmaW5kaW5nIGV4aXN0aW5nIGJ1Y2tldAorICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gQXJyYXlzLmJpbmFyeVNlYXJjaChidWNrZXRTdGFydCwgMCwgYnVja2V0Q291bnQsIG5vdyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gYnVja2V0IG1pc3NpbmcsIGNyZWF0ZSBhbmQgaW5zZXJ0CisgICAgICAgICAgICAgICAgaW5zZXJ0QnVja2V0KH5pbmRleCwgbm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydCBuZXcgYnVja2V0IGF0IHJlcXVlc3RlZCBpbmRleCBhbmQgc3RhcnRpbmcgdGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QnVja2V0KGludCBpbmRleCwgbG9uZyBzdGFydCkgeworICAgICAgICAvLyBjcmVhdGUgbW9yZSBidWNrZXRzIHdoZW4gbmVlZGVkCisgICAgICAgIGlmIChidWNrZXRDb3VudCA+PSBidWNrZXRTdGFydC5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdMZW5ndGggPSBNYXRoLm1heChidWNrZXRTdGFydC5sZW5ndGgsIDEwKSAqIDMgLyAyOworICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBBcnJheXMuY29weU9mKGJ1Y2tldFN0YXJ0LCBuZXdMZW5ndGgpOworICAgICAgICAgICAgcnggPSBBcnJheXMuY29weU9mKHJ4LCBuZXdMZW5ndGgpOworICAgICAgICAgICAgdHggPSBBcnJheXMuY29weU9mKHR4LCBuZXdMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIGdhcCB3aGVuIGluc2VydGluZyBidWNrZXQgaW4gbWlkZGxlCisgICAgICAgIGlmIChpbmRleCA8IGJ1Y2tldENvdW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZHN0UG9zID0gaW5kZXggKyAxOworICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGJ1Y2tldENvdW50IC0gaW5kZXg7CisKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVja2V0U3RhcnQsIGluZGV4LCBidWNrZXRTdGFydCwgZHN0UG9zLCBsZW5ndGgpOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShyeCwgaW5kZXgsIHJ4LCBkc3RQb3MsIGxlbmd0aCk7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHR4LCBpbmRleCwgdHgsIGRzdFBvcywgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Y2tldFN0YXJ0W2luZGV4XSA9IHN0YXJ0OworICAgICAgICByeFtpbmRleF0gPSAwOworICAgICAgICB0eFtpbmRleF0gPSAwOworICAgICAgICBidWNrZXRDb3VudCsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZSBidWNrZXRzIG9sZGVyIHRoYW4gcmVxdWVzdGVkIGN1dG9mZi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVCdWNrZXRzQmVmb3JlKGxvbmcgY3V0b2ZmKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVja2V0Q291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgbG9uZyBjdXJTdGFydCA9IGJ1Y2tldFN0YXJ0W2ldOworICAgICAgICAgICAgZmluYWwgbG9uZyBjdXJFbmQgPSBjdXJTdGFydCArIGJ1Y2tldER1cmF0aW9uOworCisgICAgICAgICAgICAvLyBjdXRvZmYgaGFwcGVucyBiZWZvcmUgb3IgZHVyaW5nIHRoaXMgYnVja2V0OyBldmVyeXRoaW5nIGJlZm9yZQorICAgICAgICAgICAgLy8gdGhpcyBidWNrZXQgc2hvdWxkIGJlIHJlbW92ZWQuCisgICAgICAgICAgICBpZiAoY3VyRW5kID4gY3V0b2ZmKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGJ1Y2tldFN0YXJ0Lmxlbmd0aDsKKyAgICAgICAgICAgIGJ1Y2tldFN0YXJ0ID0gQXJyYXlzLmNvcHlPZlJhbmdlKGJ1Y2tldFN0YXJ0LCBpLCBsZW5ndGgpOworICAgICAgICAgICAgcnggPSBBcnJheXMuY29weU9mUmFuZ2UocngsIGksIGxlbmd0aCk7CisgICAgICAgICAgICB0eCA9IEFycmF5cy5jb3B5T2ZSYW5nZSh0eCwgaSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1Y2tldENvdW50IC09IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaW50ZXJwb2xhdGVkIGRhdGEgdXNhZ2UgYWNyb3NzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuIEludGVycG9sYXRlcworICAgICAqIGFjcm9zcyBidWNrZXRzLCBzbyB2YWx1ZXMgbWF5IGJlIHJvdW5kZWQgc2xpZ2h0bHkuCisgICAgICovCisgICAgcHVibGljIGxvbmdbXSBnZXRUb3RhbERhdGEobG9uZyBzdGFydCwgbG9uZyBlbmQsIGxvbmdbXSBvdXRUb3RhbCkgeworICAgICAgICBsb25nIHJ4ID0gMDsKKyAgICAgICAgbG9uZyB0eCA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IGJ1Y2tldENvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VyU3RhcnQgPSBidWNrZXRTdGFydFtpXTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VyRW5kID0gY3VyU3RhcnQgKyBidWNrZXREdXJhdGlvbjsKKworICAgICAgICAgICAgLy8gYnVja2V0IGlzIG9sZGVyIHRoYW4gcmVjb3JkOyB3ZSdyZSBmaW5pc2hlZAorICAgICAgICAgICAgaWYgKGN1ckVuZCA8IHN0YXJ0KSBicmVhazsKKyAgICAgICAgICAgIC8vIGJ1Y2tldCBpcyBuZXdlciB0aGFuIHJlY29yZDsga2VlcCBsb29raW5nCisgICAgICAgICAgICBpZiAoY3VyU3RhcnQgPiBlbmQpIGNvbnRpbnVlOworCisgICAgICAgICAgICBmaW5hbCBsb25nIG92ZXJsYXAgPSBNYXRoLm1pbihjdXJFbmQsIGVuZCkgLSBNYXRoLm1heChjdXJTdGFydCwgc3RhcnQpOworICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgcnggKz0gdGhpcy5yeFtpXSAqIG92ZXJsYXAgLyBidWNrZXREdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB0eCArPSB0aGlzLnR4W2ldICogb3ZlcmxhcCAvIGJ1Y2tldER1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dFRvdGFsID09IG51bGwgfHwgb3V0VG90YWwubGVuZ3RoICE9IDIpIHsKKyAgICAgICAgICAgIG91dFRvdGFsID0gbmV3IGxvbmdbMl07CisgICAgICAgIH0KKyAgICAgICAgb3V0VG90YWxbMF0gPSByeDsKKyAgICAgICAgb3V0VG90YWxbMV0gPSB0eDsKKyAgICAgICAgcmV0dXJuIG91dFRvdGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIG9ubHkgZm9yIHRlbXBvcmFyeSB0ZXN0aW5nCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVJhbmRvbShsb25nIHN0YXJ0LCBsb25nIGVuZCwgbG9uZyByeCwgbG9uZyB0eCkgeworICAgICAgICBlbnN1cmVCdWNrZXRzKHN0YXJ0LCBlbmQpOworCisgICAgICAgIGZpbmFsIFJhbmRvbSByID0gbmV3IFJhbmRvbSgpOworICAgICAgICB3aGlsZSAocnggPiAxMDI0ICYmIHR4ID4gMTAyNCkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBjdXJTdGFydCA9IHJhbmRvbUxvbmcociwgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIGN1ckVuZCA9IHJhbmRvbUxvbmcociwgY3VyU3RhcnQsIGVuZCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIGN1clJ4ID0gcmFuZG9tTG9uZyhyLCAwLCByeCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIGN1clR4ID0gcmFuZG9tTG9uZyhyLCAwLCB0eCk7CisKKyAgICAgICAgICAgIHJlY29yZERhdGEoY3VyU3RhcnQsIGN1ckVuZCwgY3VyUngsIGN1clR4KTsKKworICAgICAgICAgICAgcnggLT0gY3VyUng7CisgICAgICAgICAgICB0eCAtPSBjdXJUeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgcmFuZG9tTG9uZyhSYW5kb20gciwgbG9uZyBzdGFydCwgbG9uZyBlbmQpIHsKKyAgICAgICAgcmV0dXJuIChsb25nKSAoc3RhcnQgKyAoci5uZXh0RmxvYXQoKSAqIChlbmQgLSBzdGFydCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBwcmVmaXgsIFByaW50V3JpdGVyIHB3KSB7CisgICAgICAgIHB3LnByaW50KHByZWZpeCk7CisgICAgICAgIHB3LnByaW50KCJOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0iKTsgcHcucHJpbnRsbihidWNrZXREdXJhdGlvbik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVja2V0Q291bnQ7IGkrKykgeworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIGJ1Y2tldFN0YXJ0PSIpOyBwdy5wcmludChidWNrZXRTdGFydFtpXSk7CisgICAgICAgICAgICBwdy5wcmludCgiIHJ4PSIpOyBwdy5wcmludChyeFtpXSk7CisgICAgICAgICAgICBwdy5wcmludCgiIHR4PSIpOyBwdy5wcmludGxuKHR4W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIENoYXJBcnJheVdyaXRlciB3cml0ZXIgPSBuZXcgQ2hhckFycmF5V3JpdGVyKCk7CisgICAgICAgIGR1bXAoIiIsIG5ldyBQcmludFdyaXRlcih3cml0ZXIpKTsKKyAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3JlYXRvcjxOZXR3b3JrU3RhdHNIaXN0b3J5PiBDUkVBVE9SID0gbmV3IENyZWF0b3I8TmV0d29ya1N0YXRzSGlzdG9yeT4oKSB7CisgICAgICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5IGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5ldHdvcmtTdGF0c0hpc3RvcnlbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5W3NpemVdOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGxvbmdbXSByZWFkTG9uZ0FycmF5KERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgIGZpbmFsIGxvbmdbXSB2YWx1ZXMgPSBuZXcgbG9uZ1tzaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHZhbHVlc1tpXSA9IGluLnJlYWRMb25nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTG9uZ0FycmF5KERhdGFPdXRwdXRTdHJlYW0gb3V0LCBsb25nW10gdmFsdWVzLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNpemUgPiB2YWx1ZXMubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzaXplIGxhcmdlciB0aGFuIGxlbmd0aCIpOworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZUludChzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG91dC53cml0ZUxvbmcodmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmdbXSByZWFkTG9uZ0FycmF5KFBhcmNlbCBpbikgeworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgZmluYWwgbG9uZ1tdIHZhbHVlcyA9IG5ldyBsb25nW3NpemVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzW2ldID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVMb25nQXJyYXkoUGFyY2VsIG91dCwgbG9uZ1tdIHZhbHVlcywgaW50IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPiB2YWx1ZXMubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzaXplIGxhcmdlciB0aGFuIGxlbmd0aCIpOworICAgICAgICB9CisgICAgICAgIG91dC53cml0ZUludChzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIG91dC53cml0ZUxvbmcodmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtUZW1wbGF0ZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtUZW1wbGF0ZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzc0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvTmV0d29ya1RlbXBsYXRlLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubmV0OworCitwYXJjZWxhYmxlIE5ldHdvcmtUZW1wbGF0ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVGVtcGxhdGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9OZXR3b3JrVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzgxZjFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L05ldHdvcmtUZW1wbGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX1dJTUFYOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVNb2JpbGU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19DTEFTU18yX0c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19DTEFTU18zX0c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19DTEFTU180X0c7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXIuTkVUV09SS19DTEFTU19VTktOT1dOOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyLmdldE5ldHdvcmtDbGFzczsKKworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuT2JqZWN0czsKKworLyoqCisgKiBUZW1wbGF0ZSBkZWZpbml0aW9uIHVzZWQgdG8gZ2VuZXJpY2FsbHkgbWF0Y2gge0BsaW5rIE5ldHdvcmtJZGVudGl0eX0sCisgKiB1c3VhbGx5IHdoZW4gY29sbGVjdGluZyBzdGF0aXN0aWNzLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrVGVtcGxhdGUgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIHRvIGNvbWJpbmUgYWxsIHtAbGluayBDb25uZWN0aXZpdHlNYW5hZ2VyI1RZUEVfTU9CSUxFfSBzdHlsZQorICAgICAqIG5ldHdvcmtzIHRvZ2V0aGVyLiBPbmx5IHVzZXMgc3RhdGlzdGljcyBmb3IgcmVxdWVzdGVkIElNU0kuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfTU9CSUxFX0FMTCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSB0byBjb21iaW5lIGFsbCB7QGxpbmsgQ29ubmVjdGl2aXR5TWFuYWdlciNUWVBFX01PQklMRX0gc3R5bGUKKyAgICAgKiBuZXR3b3JrcyB0b2dldGhlciB0aGF0IHJvdWdobHkgbWVldCBhICIzRyIgZGVmaW5pdGlvbiwgb3IgbG93ZXIuIE9ubHkKKyAgICAgKiB1c2VzIHN0YXRpc3RpY3MgZm9yIHJlcXVlc3RlZCBJTVNJLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX01PQklMRV8zR19MT1dFUiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSB0byBjb21iaW5lIGFsbCB7QGxpbmsgQ29ubmVjdGl2aXR5TWFuYWdlciNUWVBFX01PQklMRX0gc3R5bGUKKyAgICAgKiBuZXR3b3JrcyB0b2dldGhlciB0aGF0IG1lZXQgYSAiNEciIGRlZmluaXRpb24uIE9ubHkgdXNlcyBzdGF0aXN0aWNzIGZvcgorICAgICAqIHJlcXVlc3RlZCBJTVNJLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BVENIX01PQklMRV80RyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSB0byBjb21iaW5lIGFsbCB7QGxpbmsgQ29ubmVjdGl2aXR5TWFuYWdlciNUWVBFX1dJRkl9IHN0eWxlCisgICAgICogbmV0d29ya3MgdG9nZXRoZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFUQ0hfV0lGSSA9IDQ7CisKKyAgICBmaW5hbCBpbnQgbU1hdGNoUnVsZTsKKyAgICBmaW5hbCBTdHJpbmcgbVN1YnNjcmliZXJJZDsKKworICAgIHB1YmxpYyBOZXR3b3JrVGVtcGxhdGUoaW50IG1hdGNoUnVsZSwgU3RyaW5nIHN1YnNjcmliZXJJZCkgeworICAgICAgICB0aGlzLm1NYXRjaFJ1bGUgPSBtYXRjaFJ1bGU7CisgICAgICAgIHRoaXMubVN1YnNjcmliZXJJZCA9IHN1YnNjcmliZXJJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya1RlbXBsYXRlKFBhcmNlbCBpbikgeworICAgICAgICBtTWF0Y2hSdWxlID0gaW4ucmVhZEludCgpOworICAgICAgICBtU3Vic2NyaWJlcklkID0gaW4ucmVhZFN0cmluZygpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgIGRlc3Qud3JpdGVJbnQobU1hdGNoUnVsZSk7CisgICAgICAgIGRlc3Qud3JpdGVTdHJpbmcobVN1YnNjcmliZXJJZCk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY3J1YlN1YnNjcmliZXJJZCA9IG1TdWJzY3JpYmVySWQgIT0gbnVsbCA/ICJ2YWxpZCIgOiAibnVsbCI7CisgICAgICAgIHJldHVybiAiTmV0d29ya1RlbXBsYXRlOiBtYXRjaFJ1bGU9IiArIGdldE1hdGNoUnVsZU5hbWUobU1hdGNoUnVsZSkgKyAiLCBzdWJzY3JpYmVySWQ9IgorICAgICAgICAgICAgICAgICsgc2NydWJTdWJzY3JpYmVySWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobU1hdGNoUnVsZSwgbVN1YnNjcmliZXJJZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5ldHdvcmtUZW1wbGF0ZSkgeworICAgICAgICAgICAgZmluYWwgTmV0d29ya1RlbXBsYXRlIG90aGVyID0gKE5ldHdvcmtUZW1wbGF0ZSkgb2JqOworICAgICAgICAgICAgcmV0dXJuIG1NYXRjaFJ1bGUgPT0gb3RoZXIubU1hdGNoUnVsZQorICAgICAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKG1TdWJzY3JpYmVySWQsIG90aGVyLm1TdWJzY3JpYmVySWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1hdGNoUnVsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1NYXRjaFJ1bGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdWJzY3JpYmVySWQoKSB7CisgICAgICAgIHJldHVybiBtU3Vic2NyaWJlcklkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgdGhpcyBuZXR3b3JrIG1hdGNoZXMgdGhlIGdpdmVuIHRlbXBsYXRlIGFuZCBJTUVJLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoTmV0d29ya0lkZW50aXR5IGlkZW50KSB7CisgICAgICAgIHN3aXRjaCAobU1hdGNoUnVsZSkgeworICAgICAgICAgICAgY2FzZSBNQVRDSF9NT0JJTEVfQUxMOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzTW9iaWxlKGlkZW50KTsKKyAgICAgICAgICAgIGNhc2UgTUFUQ0hfTU9CSUxFXzNHX0xPV0VSOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzTW9iaWxlM2dMb3dlcihpZGVudCk7CisgICAgICAgICAgICBjYXNlIE1BVENIX01PQklMRV80RzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc01vYmlsZTRnKGlkZW50KTsKKyAgICAgICAgICAgIGNhc2UgTUFUQ0hfV0lGSToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1dpZmkoaWRlbnQpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIG5ldHdvcmsgdGVtcGxhdGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIG1vYmlsZSBuZXR3b3JrIHdpdGggbWF0Y2hpbmcgSU1FSS4gQWxzbyBtYXRjaGVzCisgICAgICoge0BsaW5rICNUWVBFX1dJTUFYfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc01vYmlsZShOZXR3b3JrSWRlbnRpdHkgaWRlbnQpIHsKKyAgICAgICAgaWYgKGlzTmV0d29ya1R5cGVNb2JpbGUoaWRlbnQubVR5cGUpICYmIE9iamVjdHMuZXF1YWwobVN1YnNjcmliZXJJZCwgaWRlbnQubVN1YnNjcmliZXJJZCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGlkZW50Lm1UeXBlID09IFRZUEVfV0lNQVgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBtb2JpbGUgbmV0d29yayBjbGFzc2lmaWVkIDNHIG9yIGxvd2VyIHdpdGggbWF0Y2hpbmcgSU1FSS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc01vYmlsZTNnTG93ZXIoTmV0d29ya0lkZW50aXR5IGlkZW50KSB7CisgICAgICAgIGlmIChpc05ldHdvcmtUeXBlTW9iaWxlKGlkZW50Lm1UeXBlKSAmJiBPYmplY3RzLmVxdWFsKG1TdWJzY3JpYmVySWQsIGlkZW50Lm1TdWJzY3JpYmVySWQpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGdldE5ldHdvcmtDbGFzcyhpZGVudC5tU3ViVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ0xBU1NfVU5LTk9XTjoKKyAgICAgICAgICAgICAgICBjYXNlIE5FVFdPUktfQ0xBU1NfMl9HOgorICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DTEFTU18zX0c6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBtb2JpbGUgbmV0d29yayBjbGFzc2lmaWVkIDRHIHdpdGggbWF0Y2hpbmcgSU1FSS4gQWxzbyBtYXRjaGVzCisgICAgICoge0BsaW5rICNUWVBFX1dJTUFYfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc01vYmlsZTRnKE5ldHdvcmtJZGVudGl0eSBpZGVudCkgeworICAgICAgICBpZiAoaXNOZXR3b3JrVHlwZU1vYmlsZShpZGVudC5tVHlwZSkgJiYgT2JqZWN0cy5lcXVhbChtU3Vic2NyaWJlcklkLCBpZGVudC5tU3Vic2NyaWJlcklkKSkgeworICAgICAgICAgICAgc3dpdGNoIChnZXROZXR3b3JrQ2xhc3MoaWRlbnQubVN1YlR5cGUpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NMQVNTXzRfRzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaWRlbnQubVR5cGUgPT0gVFlQRV9XSU1BWCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIG1hdGNoZXMgV2ktRmkgbmV0d29yayB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc1dpZmkoTmV0d29ya0lkZW50aXR5IGlkZW50KSB7CisgICAgICAgIGlmIChpZGVudC5tVHlwZSA9PSBUWVBFX1dJRkkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNYXRjaFJ1bGVOYW1lKGludCBtYXRjaFJ1bGUpIHsKKyAgICAgICAgc3dpdGNoIChtYXRjaFJ1bGUpIHsKKyAgICAgICAgICAgIGNhc2UgTUFUQ0hfTU9CSUxFXzNHX0xPV0VSOgorICAgICAgICAgICAgICAgIHJldHVybiAiTU9CSUxFXzNHX0xPV0VSIjsKKyAgICAgICAgICAgIGNhc2UgTUFUQ0hfTU9CSUxFXzRHOgorICAgICAgICAgICAgICAgIHJldHVybiAiTU9CSUxFXzRHIjsKKyAgICAgICAgICAgIGNhc2UgTUFUQ0hfTU9CSUxFX0FMTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIk1PQklMRV9BTEwiOworICAgICAgICAgICAgY2FzZSBNQVRDSF9XSUZJOgorICAgICAgICAgICAgICAgIHJldHVybiAiV0lGSSI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENyZWF0b3I8TmV0d29ya1RlbXBsYXRlPiBDUkVBVE9SID0gbmV3IENyZWF0b3I8TmV0d29ya1RlbXBsYXRlPigpIHsKKyAgICAgICAgcHVibGljIE5ldHdvcmtUZW1wbGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXR3b3JrVGVtcGxhdGUoaW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5ldHdvcmtUZW1wbGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtUZW1wbGF0ZVtzaXplXTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvU1NMQ2VydGlmaWNhdGVTb2NrZXRGYWN0b3J5LmphdmEKaW5kZXggM2JmNjRiMi4uNWM0YjI1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1NTTENlcnRpZmljYXRlU29ja2V0RmFjdG9yeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9TU0xDZXJ0aWZpY2F0ZVNvY2tldEZhY3RvcnkuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGphdmF4Lm5ldC5Tb2NrZXRGYWN0b3J5OwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLktleU1hbmFnZXI7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb247CkBAIC04Niw2ICs4Nyw4IEBACiAKICAgICBwcml2YXRlIFNTTFNvY2tldEZhY3RvcnkgbUluc2VjdXJlRmFjdG9yeSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTU0xTb2NrZXRGYWN0b3J5IG1TZWN1cmVGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIFRydXN0TWFuYWdlcltdIG1UcnVzdE1hbmFnZXJzID0gbnVsbDsKKyAgICBwcml2YXRlIEtleU1hbmFnZXJbXSBtS2V5TWFuYWdlcnMgPSBudWxsOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUhhbmRzaGFrZVRpbWVvdXRNaWxsaXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBTU0xDbGllbnRTZXNzaW9uQ2FjaGUgbVNlc3Npb25DYWNoZTsKQEAgLTE5NywxMCArMjAwLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIFNTTFNvY2tldEZhY3RvcnkgbWFrZVNvY2tldEZhY3RvcnkoVHJ1c3RNYW5hZ2VyW10gdHJ1c3RNYW5hZ2VycykgeworICAgIHByaXZhdGUgU1NMU29ja2V0RmFjdG9yeSBtYWtlU29ja2V0RmFjdG9yeSgKKyAgICAgICAgICAgIEtleU1hbmFnZXJbXSBrZXlNYW5hZ2VycywgVHJ1c3RNYW5hZ2VyW10gdHJ1c3RNYW5hZ2VycykgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgT3BlblNTTENvbnRleHRJbXBsIHNzbENvbnRleHQgPSBuZXcgT3BlblNTTENvbnRleHRJbXBsKCk7Ci0gICAgICAgICAgICBzc2xDb250ZXh0LmVuZ2luZUluaXQobnVsbCwgdHJ1c3RNYW5hZ2VycywgbnVsbCk7CisgICAgICAgICAgICBzc2xDb250ZXh0LmVuZ2luZUluaXQoa2V5TWFuYWdlcnMsIHRydXN0TWFuYWdlcnMsIG51bGwpOwogICAgICAgICAgICAgc3NsQ29udGV4dC5lbmdpbmVHZXRDbGllbnRTZXNzaW9uQ29udGV4dCgpLnNldFBlcnNpc3RlbnRDYWNoZShtU2Vzc2lvbkNhY2hlKTsKICAgICAgICAgICAgIHJldHVybiBzc2xDb250ZXh0LmVuZ2luZUdldFNvY2tldEZhY3RvcnkoKTsKICAgICAgICAgfSBjYXRjaCAoS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiBlKSB7CkBAIC0yMjMsMTggKzIyNyw0MiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkJ5cGFzc2luZyBTU0wgc2VjdXJpdHkgY2hlY2tzIGF0IGNhbGxlcidzIHJlcXVlc3QiKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUluc2VjdXJlRmFjdG9yeSA9IG1ha2VTb2NrZXRGYWN0b3J5KElOU0VDVVJFX1RSVVNUX01BTkFHRVIpOworICAgICAgICAgICAgICAgIG1JbnNlY3VyZUZhY3RvcnkgPSBtYWtlU29ja2V0RmFjdG9yeShtS2V5TWFuYWdlcnMsIElOU0VDVVJFX1RSVVNUX01BTkFHRVIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1JbnNlY3VyZUZhY3Rvcnk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobVNlY3VyZUZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWN1cmVGYWN0b3J5ID0gbWFrZVNvY2tldEZhY3RvcnkobnVsbCk7CisgICAgICAgICAgICAgICAgbVNlY3VyZUZhY3RvcnkgPSBtYWtlU29ja2V0RmFjdG9yeShtS2V5TWFuYWdlcnMsIG1UcnVzdE1hbmFnZXJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtU2VjdXJlRmFjdG9yeTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHtAbGluayBUcnVzdE1hbmFnZXJ9cyB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyBtYWRlIGJ5IHRoaXMgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdE1hbmFnZXJzKFRydXN0TWFuYWdlcltdIHRydXN0TWFuYWdlcikgeworICAgICAgICBtVHJ1c3RNYW5hZ2VycyA9IHRydXN0TWFuYWdlcjsKKworICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGNhY2hlZCBzZWN1cmUgZmFjdG9yaWVzIHNpbmNlIGNvbmZpZ3VyYXRpb25zIGhhdmUgY2hhbmdlZC4KKyAgICAgICAgbVNlY3VyZUZhY3RvcnkgPSBudWxsOworICAgICAgICAvLyBOb3RlIC0gaW5zZWN1cmUgZmFjdG9yaWVzIG9ubHkgZXZlciB1c2UgdGhlIElOU0VDVVJFX1RSVVNUX01BTkFHRVIgc28gdGhleSBuZWVkIG5vdAorICAgICAgICAvLyBiZSBjbGVhcmVkIG91dCBoZXJlLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHtAbGluayBLZXlNYW5hZ2VyfXMgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgbWFkZSBieSB0aGlzIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5TWFuYWdlcnMoS2V5TWFuYWdlcltdIGtleU1hbmFnZXJzKSB7CisgICAgICAgIG1LZXlNYW5hZ2VycyA9IGtleU1hbmFnZXJzOworCisgICAgICAgIC8vIENsZWFyIG91dCBhbnkgZXhpc3RpbmcgY2FjaGVkIGZhY3RvcmllcyBzaW5jZSBjb25maWd1cmF0aW9ucyBoYXZlIGNoYW5nZWQuCisgICAgICAgIG1TZWN1cmVGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgbUluc2VjdXJlRmFjdG9yeSA9IG51bGw7CisgICAgfQorCisKKyAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICoKICAgICAgKiA8cD5UaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGUgcGVlcidzIGNlcnRpZmljYXRlIGhvc3RuYW1lIGFmdGVyIGNvbm5lY3RpbmcKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9UcmFmZmljU3RhdHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9UcmFmZmljU3RhdHMuamF2YQppbmRleCBjMGZmNzM0Li5jYjQ3MTkzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvVHJhZmZpY1N0YXRzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L1RyYWZmaWNTdGF0cy5qYXZhCkBAIC00Miw2ICs0MiwxNCBAQAogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOU1VQUE9SVEVEID0gLTE7CiAKICAgICAvKioKKyAgICAgKiBTcGVjaWFsIFVJRCB2YWx1ZSB1c2VkIHdoZW4gY29sbGVjdGluZyB7QGxpbmsgTmV0d29ya1N0YXRzSGlzdG9yeX0gZm9yCisgICAgICogcmVtb3ZlZCBhcHBsaWNhdGlvbnMuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVJRF9SRU1PVkVEID0gLTQ7CisKKyAgICAvKioKICAgICAgKiBTbmFwc2hvdCBvZiB7QGxpbmsgTmV0d29ya1N0YXRzfSB3aGVuIHRoZSBjdXJyZW50bHkgYWN0aXZlIHByb2ZpbGluZwogICAgICAqIHNlc3Npb24gc3RhcnRlZCwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHNlc3Npb24gYWN0aXZlLgogICAgICAqCkBAIC0xNDEsNyArMTQ5LDggQEAKIAogICAgICAgICAgICAgLy8gc3VidHJhY3Qgc3RhcnRpbmcgdmFsdWVzIGFuZCByZXR1cm4gZGVsdGEKICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBwcm9maWxpbmdTdG9wID0gZ2V0TmV0d29ya1N0YXRzRm9yVWlkKGNvbnRleHQpOwotICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHByb2ZpbGluZ0RlbHRhID0gcHJvZmlsaW5nU3RvcC5zdWJ0cmFjdChzQWN0aXZlUHJvZmlsaW5nU3RhcnQpOworICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHByb2ZpbGluZ0RlbHRhID0gcHJvZmlsaW5nU3RvcC5zdWJ0cmFjdENsYW1wZWQoCisgICAgICAgICAgICAgICAgICAgIHNBY3RpdmVQcm9maWxpbmdTdGFydCk7CiAgICAgICAgICAgICBzQWN0aXZlUHJvZmlsaW5nU3RhcnQgPSBudWxsOwogICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGluZ0RlbHRhOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvRXJyb3JDb2Rlcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0Vycm9yQ29kZXMuamF2YQppbmRleCA2OTMyOWRmLi4zYWRjZGMzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvRXJyb3JDb2Rlcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9FcnJvckNvZGVzLmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKICAgICAgICAgICAgIGNhc2UgRVJST1JfU0VfQUxSRUFEWV9TRUxFQ1RFRDogcmV0dXJuICJTRV9BTFJFQURZX1NFTEVDVEVEIjsKICAgICAgICAgICAgIGNhc2UgRVJST1JfU0VfQ09OTkVDVEVEOiByZXR1cm4gIlNFX0NPTk5FQ1RFRCI7CiAgICAgICAgICAgICBjYXNlIEVSUk9SX05PX1NFX0NPTk5FQ1RFRDogcmV0dXJuICJOT19TRV9DT05ORUNURUQiOworICAgICAgICAgICAgY2FzZSBFUlJPUl9OT1RfU1VQUE9SVEVEOiByZXR1cm4gIk5PVF9TVVBQT1JURUQiOwogICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIEVSUk9SIjsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNSw0ICsxMDYsNiBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTk9fU0VfQ09OTkVDVEVEID0gLTIwOwogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX05PVF9TVVBQT1JURUQgPSAtMjE7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjQWRhcHRlci5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwKaW5kZXggZDExZmVhMC4uZGNiZTlkYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNBZGFwdGVyLmFpZGwKQEAgLTYyLDYgKzYyLDQgQEAKICAgICBpbnQgY3JlYXRlTGxjcFNvY2tldChpbnQgc2FwLCBpbnQgbWl1LCBpbnQgcncsIGludCBsaW5lYXJCdWZmZXJMZW5ndGgpOwogICAgIGJvb2xlYW4gZGlzYWJsZSgpOwogICAgIGJvb2xlYW4gZW5hYmxlKCk7Ci0gICAgU3RyaW5nIGdldFByb3BlcnRpZXMoU3RyaW5nIHBhcmFtKTsKLSAgICBpbnQgc2V0UHJvcGVydGllcyhTdHJpbmcgcGFyYW0sIFN0cmluZyB2YWx1ZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvSU5mY0FkYXB0ZXJFeHRyYXMuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjQWRhcHRlckV4dHJhcy5haWRsCmluZGV4IDg2NzdhNTAuLjNmOGI4NTYgMTAwNzU1Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjQWRhcHRlckV4dHJhcy5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjQWRhcHRlckV4dHJhcy5haWRsCkBAIC0yOSw2ICsyOSw0IEBACiAgICAgQnVuZGxlIHRyYW5zY2VpdmUoaW4gYnl0ZVtdIGRhdGFfaW4pOwogICAgIGludCBnZXRDYXJkRW11bGF0aW9uUm91dGUoKTsKICAgICB2b2lkIHNldENhcmRFbXVsYXRpb25Sb3V0ZShpbnQgcm91dGUpOwotICAgIHZvaWQgcmVnaXN0ZXJUZWFyRG93bkFwZHVzKFN0cmluZyBwYWNrYWdlTmFtZSwgaW4gQXBkdUxpc3QgYXBkdSk7Ci0gICAgdm9pZCB1bnJlZ2lzdGVyVGVhckRvd25BcGR1cyhTdHJpbmcgcGFja2FnZU5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNUYWcuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy9JTmZjVGFnLmFpZGwKaW5kZXggNTdkYzM4Yy4uYWE1OTM3ZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL0lOZmNUYWcuYWlkbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvSU5mY1RhZy5haWRsCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQubmZjOwogCiBpbXBvcnQgYW5kcm9pZC5uZmMuTmRlZk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwogaW1wb3J0IGFuZHJvaWQubmZjLlRyYW5zY2VpdmVSZXN1bHQ7CiAKIC8qKgpAQCAtNDAsNyArNDEsOCBAQAogICAgIGludCBuZGVmTWFrZVJlYWRPbmx5KGludCBuYXRpdmVIYW5kbGUpOwogICAgIGJvb2xlYW4gbmRlZklzV3JpdGFibGUoaW50IG5hdGl2ZUhhbmRsZSk7CiAgICAgaW50IGZvcm1hdE5kZWYoaW50IG5hdGl2ZUhhbmRsZSwgaW4gYnl0ZVtdIGtleSk7CisgICAgVGFnIHJlZGlzY292ZXIoaW50IG5hdGl2ZWhhbmRsZSk7CiAKLSAgICB2b2lkIHNldElzb0RlcFRpbWVvdXQoaW50IHRpbWVvdXQpOwotICAgIHZvaWQgcmVzZXRJc29EZXBUaW1lb3V0KCk7CisgICAgaW50IHNldFRpbWVvdXQoaW50IHRlY2hub2xvZ3ksIGludCB0aW1lb3V0KTsKKyAgICB2b2lkIHJlc2V0VGltZW91dHMoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZGVmUmVjb3JkLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvTmRlZlJlY29yZC5qYXZhCmluZGV4IGZlMjE1ZmQuLjVhZGU5ZWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9OZGVmUmVjb3JkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL05kZWZSZWNvcmQuamF2YQpAQCAtMTYsMTAgKzE2LDEzIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZmM7CiAKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogCiBpbXBvcnQgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAogLyoqCiAgKiBSZXByZXNlbnRzIGEgbG9naWNhbCAodW5jaHVua2VkKSBOREVGIChORkMgRGF0YSBFeGNoYW5nZSBGb3JtYXQpIHJlY29yZC4KQEAgLTE0Miw2ICsxNDUsNTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEZMQUdfU1IgPSAoYnl0ZSkgMHgxMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEZMQUdfSUwgPSAoYnl0ZSkgMHgwODsKIAorICAgIC8qKgorICAgICAqIE5GQyBGb3J1bSAiVVJJIFJlY29yZCBUeXBlIERlZmluaXRpb24iCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGEgbWFwcGluZyBvZiAiVVJJIElkZW50aWZpZXIgQ29kZXMiIHRvIFVSSSBzdHJpbmcgcHJlZml4ZXMsCisgICAgICogcGVyIHNlY3Rpb24gMy4yLjIgb2YgdGhlIE5GQyBGb3J1bSBVUkkgUmVjb3JkIFR5cGUgRGVmaW5pdGlvbiBkb2N1bWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVUklfUFJFRklYX01BUCA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiIiwgLy8gMHgwMAorICAgICAgICAgICAgImh0dHA6Ly93d3cuIiwgLy8gMHgwMQorICAgICAgICAgICAgImh0dHBzOi8vd3d3LiIsIC8vIDB4MDIKKyAgICAgICAgICAgICJodHRwOi8vIiwgLy8gMHgwMworICAgICAgICAgICAgImh0dHBzOi8vIiwgLy8gMHgwNAorICAgICAgICAgICAgInRlbDoiLCAvLyAweDA1CisgICAgICAgICAgICAibWFpbHRvOiIsIC8vIDB4MDYKKyAgICAgICAgICAgICJmdHA6Ly9hbm9ueW1vdXM6YW5vbnltb3VzQCIsIC8vIDB4MDcKKyAgICAgICAgICAgICJmdHA6Ly9mdHAuIiwgLy8gMHgwOAorICAgICAgICAgICAgImZ0cHM6Ly8iLCAvLyAweDA5CisgICAgICAgICAgICAic2Z0cDovLyIsIC8vIDB4MEEKKyAgICAgICAgICAgICJzbWI6Ly8iLCAvLyAweDBCCisgICAgICAgICAgICAibmZzOi8vIiwgLy8gMHgwQworICAgICAgICAgICAgImZ0cDovLyIsIC8vIDB4MEQKKyAgICAgICAgICAgICJkYXY6Ly8iLCAvLyAweDBFCisgICAgICAgICAgICAibmV3czoiLCAvLyAweDBGCisgICAgICAgICAgICAidGVsbmV0Oi8vIiwgLy8gMHgxMAorICAgICAgICAgICAgImltYXA6IiwgLy8gMHgxMQorICAgICAgICAgICAgInJ0c3A6Ly8iLCAvLyAweDEyCisgICAgICAgICAgICAidXJuOiIsIC8vIDB4MTMKKyAgICAgICAgICAgICJwb3A6IiwgLy8gMHgxNAorICAgICAgICAgICAgInNpcDoiLCAvLyAweDE1CisgICAgICAgICAgICAic2lwczoiLCAvLyAweDE2CisgICAgICAgICAgICAidGZ0cDoiLCAvLyAweDE3CisgICAgICAgICAgICAiYnRzcHA6Ly8iLCAvLyAweDE4CisgICAgICAgICAgICAiYnRsMmNhcDovLyIsIC8vIDB4MTkKKyAgICAgICAgICAgICJidGdvZXA6Ly8iLCAvLyAweDFBCisgICAgICAgICAgICAidGNwb2JleDovLyIsIC8vIDB4MUIKKyAgICAgICAgICAgICJpcmRhb2JleDovLyIsIC8vIDB4MUMKKyAgICAgICAgICAgICJmaWxlOi8vIiwgLy8gMHgxRAorICAgICAgICAgICAgInVybjplcGM6aWQ6IiwgLy8gMHgxRQorICAgICAgICAgICAgInVybjplcGM6dGFnOiIsIC8vIDB4MUYKKyAgICAgICAgICAgICJ1cm46ZXBjOnBhdDoiLCAvLyAweDIwCisgICAgICAgICAgICAidXJuOmVwYzpyYXc6IiwgLy8gMHgyMQorICAgICAgICAgICAgInVybjplcGM6IiwgLy8gMHgyMgorICAgIH07CisKICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbUZsYWdzOwogICAgIHByaXZhdGUgZmluYWwgc2hvcnQgbVRuZjsKICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBtVHlwZTsKQEAgLTI1Niw2ICszMDMsNzIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBIZWxwZXIgdG8gcmV0dXJuIHRoZSBOZGVmUmVjb3JkIGFzIGEgVVJJLgorICAgICAqIFRPRE86IENvbnNpZGVyIG1ha2luZyBhIG1lbWJlciBtZXRob2QgaW5zdGVhZCBvZiBzdGF0aWMKKyAgICAgKiBUT0RPOiBDb25zaWRlciBtb3JlIHZhbGlkYXRpb24gdGhhdCB0aGlzIGlzIGEgVVJJIHJlY29yZAorICAgICAqIFRPRE86IE1ha2UgYSBwdWJsaWMgQVBJCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVyaSBwYXJzZVdlbGxLbm93blVyaVJlY29yZChOZGVmUmVjb3JkIHJlY29yZCkgdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBwYXlsb2FkID0gcmVjb3JkLmdldFBheWxvYWQoKTsKKyAgICAgICAgaWYgKHBheWxvYWQubGVuZ3RoIDwgMikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiUGF5bG9hZCBpcyBub3QgYSB2YWxpZCBVUkkgKG1pc3NpbmcgcHJlZml4KSIpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogcGF5bG9hZFswXSBjb250YWlucyB0aGUgVVJJIElkZW50aWZpZXIgQ29kZSwgcGVyIHRoZQorICAgICAgICAgKiBORkMgRm9ydW0gIlVSSSBSZWNvcmQgVHlwZSBEZWZpbml0aW9uIiBzZWN0aW9uIDMuMi4yLgorICAgICAgICAgKgorICAgICAgICAgKiBwYXlsb2FkWzFdLi4ucGF5bG9hZFtwYXlsb2FkLmxlbmd0aCAtIDFdIGNvbnRhaW5zIHRoZSByZXN0IG9mCisgICAgICAgICAqIHRoZSBVUkkuCisgICAgICAgICAqLworICAgICAgICBpbnQgcHJlZml4SW5kZXggPSAocGF5bG9hZFswXSAmIDB4ZmYpOworICAgICAgICBpZiAocHJlZml4SW5kZXggPCAwIHx8IHByZWZpeEluZGV4ID49IFVSSV9QUkVGSVhfTUFQLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiUGF5bG9hZCBpcyBub3QgYSB2YWxpZCBVUkkgKGludmFsaWQgcHJlZml4KSIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBVUklfUFJFRklYX01BUFtwcmVmaXhJbmRleF07CisgICAgICAgIGJ5dGVbXSBmdWxsVXJpID0gY29uY2F0KHByZWZpeC5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCksCisgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKHBheWxvYWQsIDEsIHBheWxvYWQubGVuZ3RoKSk7CisgICAgICAgIHJldHVybiBVcmkucGFyc2UobmV3IFN0cmluZyhmdWxsVXJpLCBDaGFyc2V0cy5VVEZfOCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gTkRFRiByZWNvcmQgb2Ygd2VsbCBrbm93biB0eXBlIFVSSS4KKyAgICAgKiBUT0RPOiBNYWtlIGEgcHVibGljIEFQSQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOZGVmUmVjb3JkIGNyZWF0ZVVyaShVcmkgdXJpKSB7CisgICAgICAgIFN0cmluZyB1cmlTdHJpbmcgPSB1cmkudG9TdHJpbmcoKTsKKyAgICAgICAgYnl0ZSBwcmVmaXggPSAweDA7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgVVJJX1BSRUZJWF9NQVAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1cmlTdHJpbmcuc3RhcnRzV2l0aChVUklfUFJFRklYX01BUFtpXSkpIHsKKyAgICAgICAgICAgICAgICBwcmVmaXggPSAoYnl0ZSkgaTsKKyAgICAgICAgICAgICAgICB1cmlTdHJpbmcgPSB1cmlTdHJpbmcuc3Vic3RyaW5nKFVSSV9QUkVGSVhfTUFQW2ldLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBieXRlW10gdXJpQnl0ZXMgPSB1cmlTdHJpbmcuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOworICAgICAgICBieXRlW10gcmVjb3JkQnl0ZXMgPSBuZXcgYnl0ZVt1cmlCeXRlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgcmVjb3JkQnl0ZXNbMF0gPSBwcmVmaXg7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodXJpQnl0ZXMsIDAsIHJlY29yZEJ5dGVzLCAxLCB1cmlCeXRlcy5sZW5ndGgpOworICAgICAgICByZXR1cm4gbmV3IE5kZWZSZWNvcmQoVE5GX1dFTExfS05PV04sIFJURF9VUkksIG5ldyBieXRlWzBdLCByZWNvcmRCeXRlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbmNhdChieXRlW10uLi4gYXJyYXlzKSB7CisgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICBmb3IgKGJ5dGVbXSBhcnJheSA6IGFycmF5cykgeworICAgICAgICAgICAgbGVuZ3RoICs9IGFycmF5Lmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIGZvciAoYnl0ZVtdIGFycmF5IDogYXJyYXlzKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIHBvcywgYXJyYXkubGVuZ3RoKTsKKyAgICAgICAgICAgIHBvcyArPSBhcnJheS5sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoaXMgZW50aXJlIE5ERUYgUmVjb3JkIGFzIGEgYnl0ZSBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL1RhZy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL1RhZy5qYXZhCmluZGV4IGI2NzY5NzUuLjU0NTgzZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy9UYWcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvVGFnLmphdmEKQEAgLTMwLDcgKzMwLDkgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKIC8qKgpAQCAtMjMzLDYgKzIzNSw1MCBAQAogICAgICAgICByZXR1cm4gbVRlY2hTdHJpbmdMaXN0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlZGlzY292ZXIgdGhlIHRlY2hub2xvZ2llcyBhdmFpbGFibGUgb24gdGhpcyB0YWcuCisgICAgICogPHA+CisgICAgICogVGhlIHRlY2hub2xvZ2llcyB0aGF0IGFyZSBhdmFpbGFibGUgb24gYSB0YWcgbWF5IGNoYW5nZSBkdWUgdG8KKyAgICAgKiBvcGVyYXRpb25zIGJlaW5nIHBlcmZvcm1lZCBvbiBhIHRhZy4gRm9yIGV4YW1wbGUsIGZvcm1hdHRpbmcgYQorICAgICAqIHRhZyBhcyBOREVGIGFkZHMgdGhlIHtAbGluayBOZGVmfSB0ZWNobm9sb2d5LiBUaGUge0BsaW5rIHJlZGlzY292ZXJ9CisgICAgICogbWV0aG9kIHJlZW51bWVyYXRlcyB0aGUgYXZhaWxhYmxlIHRlY2hub2xvZ2llcyBvbiB0aGUgdGFnCisgICAgICogYW5kIHJldHVybnMgYSBuZXcge0BsaW5rIFRhZ30gb2JqZWN0IGNvbnRhaW5pbmcgdGhlc2UgdGVjaG5vbG9naWVzLgorICAgICAqIDxwPgorICAgICAqIFlvdSBtYXkgbm90IGJlIGNvbm5lY3RlZCB0byBhbnkgb2YgdGhpcyB7QGxpbmsgVGFnfSdzIHRlY2hub2xvZ2llcworICAgICAqIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiBUaGlzIG1ldGhvZCBndWFyYW50ZWVzIHRoYXQgeW91IHdpbGwgYmUgcmV0dXJuZWQgdGhlIHNhbWUgVGFnCisgICAgICogaWYgaXQgaXMgc3RpbGwgaW4gdGhlIGZpZWxkLgorICAgICAqIDxwPk1heSBjYXVzZSBSRiBhY3Rpdml0eSBhbmQgbWF5IGJsb2NrLiBNdXN0IG5vdCBiZSBjYWxsZWQKKyAgICAgKiBmcm9tIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRocmVhZC4gQSBibG9ja2VkIGNhbGwgd2lsbCBiZSBjYW5jZWxlZCB3aXRoCisgICAgICoge0BsaW5rIElPRXhjZXB0aW9ufSBieSBjYWxsaW5nIHtAbGluayAjY2xvc2V9IGZyb20gYW5vdGhlciB0aHJlYWQuCisgICAgICogPHA+RG9lcyBub3QgcmVtb3ZlIHBvd2VyIGZyb20gdGhlIFJGIGZpZWxkLCBzbyBhIHRhZyBoYXZpbmcgYSByYW5kb20KKyAgICAgKiBJRCBzaG91bGQgbm90IGNoYW5nZSBpdHMgSUQuCisgICAgICogQHJldHVybiB0aGUgcmVkaXNjb3ZlcmVkIHRhZyBvYmplY3QuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgdGFnIGNhbm5vdCBiZSByZWRpc2NvdmVyZWQKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIC8vIFRPRE8gU2VlIGlmIHdlIG5lZWQgVGFnTG9zdEV4Y2VwdGlvbgorICAgIC8vIFRPRE8gVW5oaWRlIGZvciBJQ1MKKyAgICAvLyBUT0RPIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHdpdGggdGhlIGZpbmFsCisgICAgLy8gICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgICBwdWJsaWMgVGFnIHJlZGlzY292ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0Q29ubmVjdGVkVGVjaG5vbG9neSgpICE9IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbG9zZSBjb25uZWN0aW9uIHRvIHRoZSB0ZWNobm9sb2d5IGZpcnN0ISIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRhZyBuZXdUYWcgPSBtVGFnU2VydmljZS5yZWRpc2NvdmVyKGdldFNlcnZpY2VIYW5kbGUoKSk7CisgICAgICAgICAgICBpZiAobmV3VGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3VGFnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byByZWRpc2NvdmVyIHRhZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJORkMgc2VydmljZSBkZWFkIik7CisgICAgICAgIH0KKyAgICB9CisKKwogICAgIC8qKiBAaGlkZSAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1RlY2goaW50IHRlY2hUeXBlKSB7CiAgICAgICAgIGZvciAoaW50IHRlY2ggOiBtVGVjaExpc3QpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL0Jhc2ljVGFnVGVjaG5vbG9neS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEKaW5kZXggN2VjODA3YS4uYmNiNzE5OWYwYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvQmFzaWNUYWdUZWNobm9sb2d5LmphdmEKQEAgLTc3LDYgKzc3LDEwIEBACiAgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhpcyBpbiB0aGUgdGFnIG9iamVjdAogICAgICAgICAgICAgICAgIG1UYWcuc2V0Q29ubmVjdGVkVGVjaG5vbG9neShtU2VsZWN0ZWRUZWNobm9sb2d5KTsKICAgICAgICAgICAgICAgICBtSXNDb25uZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2Rlcy5FUlJPUl9OT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb25uZWN0aW5nIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgdGVjaG5vbG9neSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBORkMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiYWRhcHRlci4iKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CkBAIC0xMTUsNiArMTE5LDcgQEAKICAgICAgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHBoeXNpY2FsbHkgZGlzY29ubmVjdCB0aGUgdGFnLAogICAgICAgICAgICAgICogYnV0IGp1c3QgcmVjb25uZWN0IHRvIGl0IHRvIHJlc2V0IGl0cyBzdGF0ZQogICAgICAgICAgICAgICovCisgICAgICAgICAgICBtVGFnLmdldFRhZ1NlcnZpY2UoKS5yZXNldFRpbWVvdXRzKCk7CiAgICAgICAgICAgICBtVGFnLmdldFRhZ1NlcnZpY2UoKS5yZWNvbm5lY3QobVRhZy5nZXRTZXJ2aWNlSGFuZGxlKCkpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvSXNvRGVwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9Jc29EZXAuamF2YQppbmRleCA5YzMwNzRiLi5kMDIwODZmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9Jc29EZXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9Jc29EZXAuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmZjLnRlY2g7CiAKK2ltcG9ydCBhbmRyb2lkLm5mYy5FcnJvckNvZGVzOwogaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKQEAgLTkwLDIyICs5MSwxNSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UYWcuZ2V0VGFnU2VydmljZSgpLnNldElzb0RlcFRpbWVvdXQodGltZW91dCk7CisgICAgICAgICAgICBpbnQgZXJyID0gbVRhZy5nZXRUYWdTZXJ2aWNlKCkuc2V0VGltZW91dChUYWdUZWNobm9sb2d5LklTT19ERVAsIHRpbWVvdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvckNvZGVzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3VwcGxpZWQgdGltZW91dCBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1UYWcuZ2V0VGFnU2VydmljZSgpLnJlc2V0SXNvRGVwVGltZW91dCgpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBJU08tREVQIGhpc3RvcmljYWwgYnl0ZXMgZm9yIHtAbGluayBOZmNBfSB0YWdzLgogICAgICAqIDxwPkRvZXMgbm90IGNhdXNlIGFueSBSRiBhY3Rpdml0eSBhbmQgZG9lcyBub3QgYmxvY2suCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9NaWZhcmVDbGFzc2ljLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9NaWZhcmVDbGFzc2ljLmphdmEKaW5kZXggOWEyZjJiZC4uNWNhZmU1YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlQ2xhc3NpYy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZUNsYXNzaWMuamF2YQpAQCAtMTYsOSArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOwogCitpbXBvcnQgYW5kcm9pZC5uZmMuRXJyb3JDb2RlczsKIGltcG9ydCBhbmRyb2lkLm5mYy5UYWc7CiBpbXBvcnQgYW5kcm9pZC5uZmMuVGFnTG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwpAQCAtNjksNiArNzEsOCBAQAogICogcmVxdWlyZSB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBNaWZhcmVDbGFzc2ljIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5GQyI7CisKICAgICAvKioKICAgICAgKiBUaGUgZGVmYXVsdCBmYWN0b3J5IGtleS4KICAgICAgKi8KQEAgLTgyLDEyICs4NiwxMiBAQAogICAgICAgICAgICAgeyhieXRlKTB4QTAsKGJ5dGUpMHhBMSwoYnl0ZSkweEEyLChieXRlKTB4QTMsKGJ5dGUpMHhBNCwoYnl0ZSkweEE1fTsKICAgICAvKioKICAgICAgKiBUaGUgd2VsbC1rbm93biBrZXkgZm9yIHRhZ3MgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUKLSAgICAgKiBOREVGIG9uIE1pZmFyZSBDbGFzc2ljIHNwZWNpZmljYXRpb24uCisgICAgICogTkRFRiBvbiBNSUZBUkUgQ2xhc3NpYyBzcGVjaWZpY2F0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEtFWV9ORkNfRk9SVU0gPQogICAgICAgICAgICAgeyhieXRlKTB4RDMsKGJ5dGUpMHhGNywoYnl0ZSkweEQzLChieXRlKTB4RjcsKGJ5dGUpMHhEMywoYnl0ZSkweEY3fTsKIAotICAgIC8qKiBBIE1pZmFyZSBDbGFzc2ljIGNvbXBhdGlibGUgY2FyZCBvZiB1bmtub3duIHR5cGUgKi8KKyAgICAvKiogQSBNSUZBUkUgQ2xhc3NpYyBjb21wYXRpYmxlIGNhcmQgb2YgdW5rbm93biB0eXBlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTktOT1dOID0gLTE7CiAgICAgLyoqIEEgTUlGQVJFIENsYXNzaWMgdGFnICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9DTEFTU0lDID0gMDsKQEAgLTE0MSw3ICsxNDUsNyBAQAogICAgIHB1YmxpYyBNaWZhcmVDbGFzc2ljKFRhZyB0YWcpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlcih0YWcsIFRhZ1RlY2hub2xvZ3kuTUlGQVJFX0NMQVNTSUMpOwogCi0gICAgICAgIE5mY0EgYSA9IE5mY0EuZ2V0KHRhZyk7ICAvLyBNaWZhcmUgQ2xhc3NpYyBpcyBhbHdheXMgYmFzZWQgb24gTkZDIGEKKyAgICAgICAgTmZjQSBhID0gTmZjQS5nZXQodGFnKTsgIC8vIE1JRkFSRSBDbGFzc2ljIGlzIGFsd2F5cyBiYXNlZCBvbiBORkMgYQogCiAgICAgICAgIG1Jc0VtdWxhdGVkID0gZmFsc2U7CiAKQEAgLTE5Miw3ICsxOTYsNyBAQAogICAgICAgICAgICAgLy8gU3RhY2sgaW5jb3JyZWN0bHkgcmVwb3J0ZWQgYSBNaWZhcmVDbGFzc2ljLiBXZSBjYW5ub3QgaGFuZGxlIHRoaXMKICAgICAgICAgICAgIC8vIGdyYWNlZnVsbHkgLSB3ZSBoYXZlIG5vIGlkZWEgb2YgdGhlIG1lbW9yeSBsYXlvdXQuIEJhaWwuCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRhZyBpbmNvcnJlY3RseSBlbnVtZXJhdGVkIGFzIE1pZmFyZSBDbGFzc2ljLCBTQUsgPSAiICsgYS5nZXRTYWsoKSk7CisgICAgICAgICAgICAgICAgICAgICJUYWcgaW5jb3JyZWN0bHkgZW51bWVyYXRlZCBhcyBNSUZBUkUgQ2xhc3NpYywgU0FLID0gIiArIGEuZ2V0U2FrKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjEsOCArMjI1LDggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSB0YWcgaXMgZW11bGF0ZWQsIGRldGVybWluZWQgYXQgZGlzY292ZXJ5IHRpbWUuCi0gICAgICogVGhlc2UgYXJlIGFjdHVhbGx5IHNtYXJ0LWNhcmRzIHRoYXQgZW11bGF0ZSBhIE1pZmFyZSBDbGFzc2ljIGludGVyZmFjZS4KLSAgICAgKiBUaGV5IGNhbiBiZSB0cmVhdGVkIGlkZW50aWNhbGx5IHRvIGEgTWlmYXJlIENsYXNzaWMgdGFnLgorICAgICAqIFRoZXNlIGFyZSBhY3R1YWxseSBzbWFydC1jYXJkcyB0aGF0IGVtdWxhdGUgYSBNSUZBUkUgQ2xhc3NpYyBpbnRlcmZhY2UuCisgICAgICogVGhleSBjYW4gYmUgdHJlYXRlZCBpZGVudGljYWxseSB0byBhIE1JRkFSRSBDbGFzc2ljIHRhZy4KICAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRW11bGF0ZWQoKSB7CkBAIC01NjgsMTEgKzU3MiwzNiBAQAogICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVvdXQgb2Yge0BsaW5rICN0cmFuc2NlaXZlfSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogPHA+VGhlIHRpbWVvdXQgb25seSBhcHBsaWVzIHRvIE1pZmFyZVVsdHJhbGlnaHQge0BsaW5rICN0cmFuc2NlaXZlfSwKKyAgICAgKiBhbmQgaXMgcmVzZXQgdG8gYSBkZWZhdWx0IHZhbHVlIHdoZW4ge0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkLgorICAgICAqIDxwPlNldHRpbmcgYSBsb25nZXIgdGltZW91dCBtYXkgYmUgdXNlZnVsIHdoZW4gcGVyZm9ybWluZworICAgICAqIHRyYW5zYWN0aW9ucyB0aGF0IHJlcXVpcmUgYSBsb25nIHByb2Nlc3NpbmcgdGltZSBvbiB0aGUgdGFnCisgICAgICogc3VjaCBhcyBrZXkgZ2VuZXJhdGlvbi4KKyAgICAgKgorICAgICAqIDxwIGNsYXNzPSJub3RlIj5SZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcworICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gVE9ETyBVbmhpZGUgZm9yIElDUworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBlcnIgPSBtVGFnLmdldFRhZ1NlcnZpY2UoKS5zZXRUaW1lb3V0KFRhZ1RlY2hub2xvZ3kuTUlGQVJFX0NMQVNTSUMsIHRpbWVvdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvckNvZGVzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3VwcGxpZWQgdGltZW91dCBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVTZWN0b3IoaW50IHNlY3RvcikgewogICAgICAgICAvLyBEbyBub3QgYmUgdG9vIHN0cmljdCBvbiB1cHBlciBib3VuZHMgY2hlY2tpbmcsIHNpbmNlIHNvbWUgY2FyZHMKICAgICAgICAgLy8gaGF2ZSBtb3JlIGFkZHJlc3NhYmxlIG1lbW9yeSB0aGFuIHRoZXkgcmVwb3J0LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgLy8gTWlmYXJlIFBsdXMgMmsgY2FyZHMgd2lsbCBhcHBlYXIgYXMgTWlmYXJlIENsYXNzaWMgMWsgY2FyZHMgd2hlbiBpbgotICAgICAgICAvLyBNaWZhcmUgQ2xhc3NpYyBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgICAgIC8vIE1JRkFSRSBQbHVzIDJrIGNhcmRzIHdpbGwgYXBwZWFyIGFzIE1JRkFSRSBDbGFzc2ljIDFrIGNhcmRzIHdoZW4gaW4KKyAgICAgICAgLy8gTUlGQVJFIENsYXNzaWMgY29tcGF0aWJpbGl0eSBtb2RlLgogICAgICAgICAvLyBOb3RlIHRoYXQgaXNzdWluZyBhIGNvbW1hbmQgdG8gYW4gb3V0LW9mLWJvdW5kcyBibG9jayBpcyBzYWZlIC0gdGhlCiAgICAgICAgIC8vIHRhZyBzaG91bGQgcmVwb3J0IGVycm9yIGNhdXNpbmcgSU9FeGNlcHRpb24uIFRoaXMgdmFsaWRhdGlvbiBpcyBhCiAgICAgICAgIC8vIGhlbHBlciB0byBndWFyZCBhZ2FpbnN0IG9idmlvdXMgcHJvZ3JhbW1pbmcgbWlzdGFrZXMuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9NaWZhcmVVbHRyYWxpZ2h0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9NaWZhcmVVbHRyYWxpZ2h0LmphdmEKaW5kZXggNDJjMmUzZS4uM2Q0Y2RkMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTWlmYXJlVWx0cmFsaWdodC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL01pZmFyZVVsdHJhbGlnaHQuamF2YQpAQCAtMTYsMTAgKzE2LDEyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZmMudGVjaDsKIAoraW1wb3J0IGFuZHJvaWQubmZjLkVycm9yQ29kZXM7CiBpbXBvcnQgYW5kcm9pZC5uZmMuVGFnOwogaW1wb3J0IGFuZHJvaWQubmZjLlRhZ0xvc3RFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKQEAgLTU3LDYgKzU5LDggQEAKICAqIHJlcXVpcmUgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTWlmYXJlVWx0cmFsaWdodCBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJORkMiOworCiAgICAgLyoqIEEgTUlGQVJFIFVsdHJhbGlnaHQgY29tcGF0aWJsZSB0YWcgb2YgdW5rbm93biB0eXBlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VTktOT1dOID0gLTE7CiAgICAgLyoqIEEgTUlGQVJFIFVsdHJhbGlnaHQgdGFnICovCkBAIC05OSw3ICsxMDMsNyBAQAogICAgIHB1YmxpYyBNaWZhcmVVbHRyYWxpZ2h0KFRhZyB0YWcpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICBzdXBlcih0YWcsIFRhZ1RlY2hub2xvZ3kuTUlGQVJFX1VMVFJBTElHSFQpOwogCi0gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgY291bGQgYWN0dWFsbHkgYmUgYSBNaWZhcmUKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb3VsZCBhY3R1YWxseSBiZSBhIE1JRkFSRQogICAgICAgICBOZmNBIGEgPSBOZmNBLmdldCh0YWcpOwogCiAgICAgICAgIG1UeXBlID0gVFlQRV9VTktOT1dOOwpAQCAtMjA4LDYgKzIxMiwzMiBAQAogICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVvdXQgb2Yge0BsaW5rICN0cmFuc2NlaXZlfSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogPHA+VGhlIHRpbWVvdXQgb25seSBhcHBsaWVzIHRvIE1pZmFyZVVsdHJhbGlnaHQge0BsaW5rICN0cmFuc2NlaXZlfSwKKyAgICAgKiBhbmQgaXMgcmVzZXQgdG8gYSBkZWZhdWx0IHZhbHVlIHdoZW4ge0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkLgorICAgICAqIDxwPlNldHRpbmcgYSBsb25nZXIgdGltZW91dCBtYXkgYmUgdXNlZnVsIHdoZW4gcGVyZm9ybWluZworICAgICAqIHRyYW5zYWN0aW9ucyB0aGF0IHJlcXVpcmUgYSBsb25nIHByb2Nlc3NpbmcgdGltZSBvbiB0aGUgdGFnCisgICAgICogc3VjaCBhcyBrZXkgZ2VuZXJhdGlvbi4KKyAgICAgKgorICAgICAqIDxwIGNsYXNzPSJub3RlIj5SZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcworICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gVE9ETyBVbmhpZGUgZm9yIElDUworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBlcnIgPSBtVGFnLmdldFRhZ1NlcnZpY2UoKS5zZXRUaW1lb3V0KAorICAgICAgICAgICAgICAgICAgICBUYWdUZWNobm9sb2d5Lk1JRkFSRV9VTFRSQUxJR0hULCB0aW1lb3V0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gRXJyb3JDb2Rlcy5TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHN1cHBsaWVkIHRpbWVvdXQgaXMgbm90IHZhbGlkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJORkMgc2VydmljZSBkZWFkIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGFnZUluZGV4KGludCBwYWdlSW5kZXgpIHsKICAgICAgICAgLy8gRG8gbm90IGJlIHRvbyBzdHJpY3Qgb24gdXBwZXIgYm91bmRzIGNoZWNraW5nLCBzaW5jZSBzb21lIGNhcmRzCiAgICAgICAgIC8vIG1heSBoYXZlIG1vcmUgYWRkcmVzc2FibGUgbWVtb3J5IHRoYW4gdGhleSByZXBvcnQuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNBLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNBLmphdmEKaW5kZXggMTg0M2VhZS4uMDgwOTVlNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTmZjQS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY0EuamF2YQpAQCAtMTYsOSArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5mYy50ZWNoOwogCitpbXBvcnQgYW5kcm9pZC5uZmMuRXJyb3JDb2RlczsKIGltcG9ydCBhbmRyb2lkLm5mYy5UYWc7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKQEAgLTMzLDYgKzM1LDggQEAKICAqIHJlcXVpcmUgdGhlIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jTkZDfSBwZXJtaXNzaW9uLgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTmZjQSBleHRlbmRzIEJhc2ljVGFnVGVjaG5vbG9neSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJORkMiOworCiAgICAgLyoqIEBoaWRlICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0FLID0gInNhayI7CiAgICAgLyoqIEBoaWRlICovCkBAIC0xMTIsNCArMTE2LDI5IEBACiAgICAgcHVibGljIGJ5dGVbXSB0cmFuc2NlaXZlKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gdHJhbnNjZWl2ZShkYXRhLCB0cnVlKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVvdXQgb2Yge0BsaW5rICN0cmFuc2NlaXZlfSBpbiBtaWxsaXNlY29uZHMuCisgICAgICogPHA+VGhlIHRpbWVvdXQgb25seSBhcHBsaWVzIHRvIE5mY0Ege0BsaW5rICN0cmFuc2NlaXZlfSwgYW5kIGlzCisgICAgICogcmVzZXQgdG8gYSBkZWZhdWx0IHZhbHVlIHdoZW4ge0BsaW5rICNjbG9zZX0gaXMgY2FsbGVkLgorICAgICAqIDxwPlNldHRpbmcgYSBsb25nZXIgdGltZW91dCBtYXkgYmUgdXNlZnVsIHdoZW4gcGVyZm9ybWluZworICAgICAqIHRyYW5zYWN0aW9ucyB0aGF0IHJlcXVpcmUgYSBsb25nIHByb2Nlc3NpbmcgdGltZSBvbiB0aGUgdGFnCisgICAgICogc3VjaCBhcyBrZXkgZ2VuZXJhdGlvbi4KKyAgICAgKgorICAgICAqIDxwIGNsYXNzPSJub3RlIj5SZXF1aXJlcyB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZW91dCB0aW1lb3V0IHZhbHVlIGluIG1pbGxpc2Vjb25kcworICAgICAqIEBoaWRlCisgICAgICovCisgICAgLy8gVE9ETyBVbmhpZGUgZm9yIElDUworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBlcnIgPSBtVGFnLmdldFRhZ1NlcnZpY2UoKS5zZXRUaW1lb3V0KFRhZ1RlY2hub2xvZ3kuTkZDX0EsIHRpbWVvdXQpOworICAgICAgICAgICAgaWYgKGVyciAhPSBFcnJvckNvZGVzLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3VwcGxpZWQgdGltZW91dCBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIk5GQyBzZXJ2aWNlIGRlYWQiLCBlKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY0YuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25mYy90ZWNoL05mY0YuamF2YQppbmRleCBlMGViYmU4Li44NWFiZjg5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9uZmMvdGVjaC9OZmNGLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmZjL3RlY2gvTmZjRi5qYXZhCkBAIC0xNiw5ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmZjLnRlY2g7CiAKK2ltcG9ydCBhbmRyb2lkLm5mYy5FcnJvckNvZGVzOwogaW1wb3J0IGFuZHJvaWQubmZjLlRhZzsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtMzMsNiArMzUsOCBAQAogICogcmVxdWlyZSB0aGUge0BsaW5rIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbiNORkN9IHBlcm1pc3Npb24uCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBOZmNGIGV4dGVuZHMgQmFzaWNUYWdUZWNobm9sb2d5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5GQyI7CisKICAgICAvKiogQGhpZGUgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TQyA9ICJzeXN0ZW1jb2RlIjsKICAgICAvKiogQGhpZGUgKi8KQEAgLTExMSw0ICsxMTUsMjkgQEAKICAgICBwdWJsaWMgYnl0ZVtdIHRyYW5zY2VpdmUoYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiB0cmFuc2NlaXZlKGRhdGEsIHRydWUpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGltZW91dCBvZiB7QGxpbmsgI3RyYW5zY2VpdmV9IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiA8cD5UaGUgdGltZW91dCBvbmx5IGFwcGxpZXMgdG8gTmZjRiB7QGxpbmsgI3RyYW5zY2VpdmV9LCBhbmQgaXMKKyAgICAgKiByZXNldCB0byBhIGRlZmF1bHQgdmFsdWUgd2hlbiB7QGxpbmsgI2Nsb3NlfSBpcyBjYWxsZWQuCisgICAgICogPHA+U2V0dGluZyBhIGxvbmdlciB0aW1lb3V0IG1heSBiZSB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nCisgICAgICogdHJhbnNhY3Rpb25zIHRoYXQgcmVxdWlyZSBhIGxvbmcgcHJvY2Vzc2luZyB0aW1lIG9uIHRoZSB0YWcKKyAgICAgKiBzdWNoIGFzIGtleSBnZW5lcmF0aW9uLgorICAgICAqCisgICAgICogPHAgY2xhc3M9Im5vdGUiPlJlcXVpcmVzIHRoZSB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI05GQ30gcGVybWlzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lb3V0IHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICAvLyBUT0RPIFVuaGlkZSBmb3IgSUNTCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGVyciA9IG1UYWcuZ2V0VGFnU2VydmljZSgpLnNldFRpbWVvdXQoVGFnVGVjaG5vbG9neS5ORkNfRiwgdGltZW91dCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEVycm9yQ29kZXMuU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzdXBwbGllZCB0aW1lb3V0IGlzIG5vdCB2YWxpZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTkZDIHNlcnZpY2UgZGVhZCIsIGUpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0J1aWxkLmphdmEKaW5kZXggOWFjY2Y5OS4uMWIyOGFhMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvQnVpbGQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9CdWlsZC5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5vczsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5UZWxlcGhvbnlQcm9wZXJ0aWVzOworCiAvKioKICAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGJ1aWxkLCBleHRyYWN0ZWQgZnJvbSBzeXN0ZW0gcHJvcGVydGllcy4KICAqLwpAQCAtNTYsOCArNTgsMTYgQEAKICAgICAvKiogVGhlIHN5c3RlbSBib290bG9hZGVyIHZlcnNpb24gbnVtYmVyLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1RMT0FERVIgPSBnZXRTdHJpbmcoInJvLmJvb3Rsb2FkZXIiKTsKIAotICAgIC8qKiBUaGUgcmFkaW8gZmlybXdhcmUgdmVyc2lvbiBudW1iZXIuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFESU8gPSBnZXRTdHJpbmcoImdzbS52ZXJzaW9uLmJhc2ViYW5kIik7CisgICAgLyoqCisgICAgICogVGhlIHJhZGlvIGZpcm13YXJlIHZlcnNpb24gbnVtYmVyLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhlIHJhZGlvIGZpcm13YXJlIHZlcnNpb24gaXMgZnJlcXVlbnRseSBub3QKKyAgICAgKiBhdmFpbGFibGUgd2hlbiB0aGlzIGNsYXNzIGlzIGluaXRpYWxpemVkLCBsZWFkaW5nIHRvIGEgYmxhbmsgb3IKKyAgICAgKiAidW5rbm93biIgdmFsdWUgZm9yIHRoaXMgc3RyaW5nLiAgVXNlCisgICAgICoge0BsaW5rICNnZXRSYWRpb1ZlcnNpb259IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQURJTyA9IGdldFN0cmluZyhUZWxlcGhvbnlQcm9wZXJ0aWVzLlBST1BFUlRZX0JBU0VCQU5EX1ZFUlNJT04pOwogCiAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBoYXJkd2FyZSAoZnJvbSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBvciAvcHJvYykuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSRFdBUkUgPSBnZXRTdHJpbmcoInJvLmhhcmR3YXJlIik7CkBAIC0yMzIsOSArMjQyLDM5IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQl9NUjEgPSAxMjsKICAgICAgICAgCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDdXJyZW50IGRldmVsb3BtZW50IHZlcnNpb24uCisgICAgICAgICAqIEp1bmUgMjAxMTogQW5kcm9pZCAzLjIuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPlVwZGF0ZSB0byBIb25leWNvbWIgTVIxIHRvIHN1cHBvcnQgNyBpbmNoIHRhYmxldHMsIGltcHJvdmUKKyAgICAgICAgICogc2NyZWVuIGNvbXBhdGliaWxpdHkgbW9kZSwgZXRjLjwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+QXMgb2YgdGhpcyB2ZXJzaW9uLCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBzYXkgd2hldGhlciB0aGV5CisgICAgICAgICAqIHN1cHBvcnQgWExBUkdFIHNjcmVlbnMgd2lsbCBiZSBhc3N1bWVkIHRvIGRvIHNvIG9ubHkgaWYgdGhleSB0YXJnZXQKKyAgICAgICAgICoge0BsaW5rICNIT05FWUNPTUJ9IG9yIGxhdGVyOyBpdCBoYWQgYmVlbiB7QGxpbmsgI0dJTkdFUkJSRUFEfSBvcgorICAgICAgICAgKiBsYXRlci4gIEFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHN1cHBvcnQgYSBzY3JlZW4gc2l6ZSBhdCBsZWFzdCBhcworICAgICAgICAgKiBsYXJnZSBhcyB0aGUgY3VycmVudCBzY3JlZW4gd2lsbCBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBVSSB0bworICAgICAgICAgKiBzd2l0Y2ggdGhlbSBpbiB0byBzY3JlZW4gc2l6ZSBjb21wYXRpYmlsaXR5IG1vZGUuPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UaGlzIHZlcnNpb24gaW50cm9kdWNlcyBuZXcgc2NyZWVuIHNpemUgcmVzb3VyY2UgcXVhbGlmaWVycworICAgICAgICAgKiBiYXNlZCBvbiB0aGUgc2NyZWVuIHNpemUgaW4gZHA6IHNlZQorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uI3NjcmVlbldpZHRoRHB9LAorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uI3NjcmVlbkhlaWdodERwfSwgYW5kCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24jc21hbGxlc3RTY3JlZW5XaWR0aERwfS4KKyAgICAgICAgICogU3VwcGx5aW5nIHRoZXNlIGluICZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0OyBhcyBwZXIKKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8jcmVxdWlyZXNTbWFsbGVzdFdpZHRoRHB9LAorICAgICAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyNjb21wYXRpYmxlV2lkdGhMaW1pdERwfSwgYW5kCisgICAgICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvI2xhcmdlc3RXaWR0aExpbWl0RHB9IGlzCisgICAgICAgICAqIHByZWZlcnJlZCBvdmVyIHRoZSBvbGRlciBzY3JlZW4gc2l6ZSBidWNrZXRzIGFuZCBmb3Igb2xkZXIgZGV2aWNlcworICAgICAgICAgKiB0aGUgYXBwcm9wcmlhdGUgYnVja2V0cyB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlbS48L3A+CisgICAgICAgICAqCisgICAgICAgICAqIDxwPk5ldyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyI0ZFQVRVUkVfU0NSRUVOX1BPUlRSQUlUfQorICAgICAgICAgKiBhbmQge0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlciNGRUFUVVJFX1NDUkVFTl9MQU5EU0NBUEV9CisgICAgICAgICAqIGZlYXR1cmVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoaXMgcmVsZWFzZS4gIEFwcGxpY2F0aW9ucyB0aGF0IHRhcmdldAorICAgICAgICAgKiBwcmV2aW91cyBwbGF0Zm9ybSB2ZXJzaW9ucyBhcmUgYXNzdW1lZCB0byByZXF1aXJlIGJvdGggcG9ydHJhaXQgYW5kCisgICAgICAgICAqIGxhbmRzY2FwZSBzdXBwb3J0IGluIHRoZSBkZXZpY2U7IHdoZW4gdGFyZ2V0aW5nIEhvbmV5Y29tYiBNUjEgb3IKKyAgICAgICAgICogZ3JlYXRlciB0aGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHNwZWNpZnlpbmcgYW55IHNwZWNpZmljCisgICAgICAgICAqIG9yaWVudGF0aW9uIGl0IHJlcXVpcmVzLjwvcD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQl9NUjIgPSBDVVJfREVWRUxPUE1FTlQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPTkVZQ09NQl9NUjIgPSAxMzsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ3VycmVudCB2ZXJzaW9uIHVuZGVyIGRldmVsb3BtZW50LgpAQCAtMjU2LDYgKzI5NiwxNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSBnZXRTdHJpbmcoInJvLmJ1aWxkLnVzZXIiKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUID0gZ2V0U3RyaW5nKCJyby5idWlsZC5ob3N0Iik7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgdGhlIHJhZGlvIGZpcm13YXJlLiAgTWF5IHJldHVybgorICAgICAqIG51bGwgKGlmLCBmb3IgaW5zdGFuY2UsIHRoZSByYWRpbyBpcyBub3QgY3VycmVudGx5IG9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSYWRpb1ZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChUZWxlcGhvbnlQcm9wZXJ0aWVzLlBST1BFUlRZX0JBU0VCQU5EX1ZFUlNJT04sIG51bGwpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHByb3BlcnR5KSB7CiAgICAgICAgIHJldHVybiBTeXN0ZW1Qcm9wZXJ0aWVzLmdldChwcm9wZXJ0eSwgVU5LTk9XTik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvRmlsZVV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQppbmRleCBmNTZmNmE5Li4yMTVlODM2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YQpAQCAtMTksMTkgKzE5LDIxIEBACiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW07CiAKIAogLyoqCiAgKiBUb29scyBmb3IgbWFuYWdpbmcgZmlsZXMuICBOb3QgZm9yIHB1YmxpYyBjb25zdW1wdGlvbi4KICAqIEBoaWRlCiAgKi8KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbHMKLXsKK3B1YmxpYyBjbGFzcyBGaWxlVXRpbHMgewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfSVJXWFUgPSAwMDcwMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0lSVVNSID0gMDA0MDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU19JV1VTUiA9IDAwMjAwOwpAQCAtOTQsNyArOTYsNyBAQAogCiAgICAgLyoqIHJldHVybnMgdGhlIEZBVCBmaWxlIHN5c3RlbSB2b2x1bWUgSUQgZm9yIHRoZSB2b2x1bWUgbW91bnRlZCAKICAgICAgKiBhdCB0aGUgZ2l2ZW4gbW91bnQgcG9pbnQsIG9yIC0xIGZvciBmYWlsdXJlCi0gICAgICogQHBhcmFtIG1vdW50IHBvaW50IGZvciBGQVQgdm9sdW1lCisgICAgICogQHBhcmFtIG1vdW50UG9pbnQgcG9pbnQgZm9yIEZBVCB2b2x1bWUKICAgICAgKiBAcmV0dXJuIHZvbHVtZSBJRCBvciAtMQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRGYXRWb2x1bWVJZChTdHJpbmcgbW91bnRQb2ludCk7CkBAIC0yMjYsNCArMjI4LDQ4IEBACiAgICAgICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQorCisgICAvKioKKyAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgYSBmaWxlIHVzaW5nIHRoZSBDUkMzMiBjaGVja3N1bSByb3V0aW5lLgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgdGhlIGZpbGUgdG8gY2hlY2tzdW0sIG11c3Qgbm90IGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIHRoZSBjaGVja3N1bSB2YWx1ZSBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBjaGVja3N1bUNyYzMyKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBDUkMzMiBjaGVja1N1bW1lciA9IG5ldyBDUkMzMigpOworICAgICAgICBDaGVja2VkSW5wdXRTdHJlYW0gY2lzID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2lzID0gbmV3IENoZWNrZWRJbnB1dFN0cmVhbSggbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgY2hlY2tTdW1tZXIpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEyOF07CisgICAgICAgICAgICB3aGlsZShjaXMucmVhZChidWYpID49IDApIHsKKyAgICAgICAgICAgICAgICAvLyBKdXN0IHJlYWQgZm9yIGNoZWNrc3VtIHRvIGdldCBjYWxjdWxhdGVkLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNoZWNrU3VtbWVyLmdldFZhbHVlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2lzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvSUJpbmRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSUJpbmRlci5qYXZhCmluZGV4IDg4NzYzNTQuLjgxZGVmZDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0lCaW5kZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9JQmluZGVyLmphdmEKQEAgLTExMCw2ICsxMTAsMjQgQEAKICAgICBpbnQgSU5URVJGQUNFX1RSQU5TQUNUSU9OICAgPSAoJ18nPDwyNCl8KCdOJzw8MTYpfCgnVCc8PDgpfCdGJzsKIAogICAgIC8qKgorICAgICAqIElCaW5kZXIgcHJvdG9jb2wgdHJhbnNhY3Rpb24gY29kZTogc2VuZCBhIHR3ZWV0IHRvIHRoZSB0YXJnZXQKKyAgICAgKiBvYmplY3QuICBUaGUgZGF0YSBpbiB0aGUgcGFyY2VsIGlzIGludGVuZGVkIHRvIGJlIGRlbGl2ZXJlZCB0bworICAgICAqIGEgc2hhcmVkIG1lc3NhZ2luZyBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0OyBpdCBjYW4gYmUKKyAgICAgKiBhbnl0aGluZywgYXMgbG9uZyBhcyBpdCBpcyBub3QgbW9yZSB0aGFuIDEzMCBVVEYtOCBjaGFyYWN0ZXJzIHRvCisgICAgICogY29uc2VydmF0aXZlbHkgZml0IHdpdGhpbiBjb21tb24gbWVzc2FnaW5nIHNlcnZpY2VzLiAgQXMgcGFydCBvZgorICAgICAqIHtAbGluayBCdWlsZC5WRVJTSU9OX0NPREVTI0hPTkVZQ09NQl9NUjJ9LCBhbGwgQmluZGVyIG9iamVjdHMgYXJlCisgICAgICogZXhwZWN0ZWQgdG8gc3VwcG9ydCB0aGlzIHByb3RvY29sIGZvciBmdWxseSBpbnRlZ3JhdGVkIHR3ZWV0aW5nCisgICAgICogYWNyb3NzIHRoZSBwbGF0Zm9ybS4gIFRvIHN1cHBvcnQgb2xkZXIgY29kZSwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgKiBsb2dzIHRoZSB0d2VldCB0byB0aGUgbWFpbiBsb2cgYXMgYSBzaW1wbGUgZW11bGF0aW9uIG9mIGJyb2FkY2FzdGluZworICAgICAqIGl0IHB1YmxpY2x5IG92ZXIgdGhlIEludGVybmV0LgorICAgICAqIAorICAgICAqIDxwPkFsc28sIHVwb24gY29tcGxldGluZyB0aGUgZGlzcGF0Y2gsIHRoZSBvYmplY3QgbXVzdCBtYWtlIGEgY3VwCisgICAgICogb2YgdGVhLCByZXR1cm4gaXQgdG8gdGhlIGNhbGxlciwgYW5kIGV4Y2xhaW0gImpvbGx5IGdvb2QgbWVzc2FnZQorICAgICAqIG9sZCBib3khIi4KKyAgICAgKi8KKyAgICBpbnQgVFdFRVRfVFJBTlNBQ1RJT04gICA9ICgnXyc8PDI0KXwoJ1QnPDwxNil8KCdXJzw8OCl8J1QnOworCisgICAgLyoqCiAgICAgICogRmxhZyB0byB7QGxpbmsgI3RyYW5zYWN0fTogdGhpcyBpcyBhIG9uZS13YXkgY2FsbCwgbWVhbmluZyB0aGF0IHRoZQogICAgICAqIGNhbGxlciByZXR1cm5zIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgZm9yIGEgcmVzdWx0IGZyb20gdGhlCiAgICAgICogY2FsbGVlLiBBcHBsaWVzIG9ubHkgaWYgdGhlIGNhbGxlciBhbmQgY2FsbGVlIGFyZSBpbiBkaWZmZXJlbnQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0lOZXRTdGF0U2VydmljZS5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldFN0YXRTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjNkZTAuLjAwMDAwMDAKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldFN0YXRTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm9zOwotCi0vKioKLSAqIFJldHJpZXZlcyBwYWNrZXQgYW5kIGJ5dGUgY291bnRzIGZvciB0aGUgcGhvbmUgZGF0YSBpbnRlcmZhY2UsCi0gKiBhbmQgZm9yIGFsbCBpbnRlcmZhY2VzLgotICogVXNlZCBmb3IgdGhlIGRhdGEgYWN0aXZpdHkgaWNvbiBhbmQgdGhlIHBob25lIHN0YXR1cyBpbiBTZXR0aW5ncy4KLSAqCi0gKiB7QGhpZGV9Ci0gKi8KLWludGVyZmFjZSBJTmV0U3RhdFNlcnZpY2UgewotICAgIGxvbmcgZ2V0TW9iaWxlVHhQYWNrZXRzKCk7Ci0gICAgbG9uZyBnZXRNb2JpbGVSeFBhY2tldHMoKTsKLSAgICBsb25nIGdldE1vYmlsZVR4Qnl0ZXMoKTsKLSAgICBsb25nIGdldE1vYmlsZVJ4Qnl0ZXMoKTsKLSAgICBsb25nIGdldFRvdGFsVHhQYWNrZXRzKCk7Ci0gICAgbG9uZyBnZXRUb3RhbFJ4UGFja2V0cygpOwotICAgIGxvbmcgZ2V0VG90YWxUeEJ5dGVzKCk7Ci0gICAgbG9uZyBnZXRUb3RhbFJ4Qnl0ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0lOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0lOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuYWlkbAppbmRleCBmMTdhNmYyLi5iOTdlYzE5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9JTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5haWRsCkBAIC01OSw2ICs1OSwxMSBAQAogICAgIHZvaWQgc2V0SW50ZXJmYWNlQ29uZmlnKFN0cmluZyBpZmFjZSwgaW4gSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBjZmcpOwogCiAgICAgLyoqCisgICAgICogQ2xlYXIgYWxsIElQIGFkZHJlc3NlcyBvbiB0aGUgc3BlY2lmaWVkIGludGVyZmFjZQorICAgICAqLworICAgIHZvaWQgY2xlYXJJbnRlcmZhY2VBZGRyZXNzZXMoU3RyaW5nIGlmYWNlKTsKKworICAgIC8qKgogICAgICAqIFJldHJpZXZlcyB0aGUgbmV0d29yayByb3V0ZXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgb24gdGhlIHNwZWNpZmllZAogICAgICAqIGludGVyZmFjZQogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvTWVzc2FnZS5qYXZhCmluZGV4IDU1N2U1M2YuLjg0NGVkNmEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL01lc3NhZ2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9NZXNzYWdlLmphdmEKQEAgLTI0OSw5ICsyNDksMTAgQEAKICAgICAgKiBmcmVlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICBjbGVhckZvclJlY3ljbGUoKTsKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHNQb29sU3luYykgewogICAgICAgICAgICAgaWYgKHNQb29sU2l6ZSA8IE1BWF9QT09MX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBjbGVhckZvclJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICBuZXh0ID0gc1Bvb2w7CiAgICAgICAgICAgICAgICAgc1Bvb2wgPSB0aGlzOwogICAgICAgICAgICAgICAgIHNQb29sU2l6ZSsrOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWwuamF2YQppbmRleCA2YjM1MjE1Li5lOWVkNjc2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWwuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWwuamF2YQpAQCAtMTk4MCw2ICsxOTgwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChjcmVhdG9yIGluc3RhbmNlb2YgUGFyY2VsYWJsZS5DbGFzc0xvYWRlckNyZWF0b3I8Pz4pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFBhcmNlbGFibGUuQ2xhc3NMb2FkZXJDcmVhdG9yPFQ+KWNyZWF0b3IpLmNyZWF0ZUZyb21QYXJjZWwodGhpcywgbG9hZGVyKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gY3JlYXRvci5jcmVhdGVGcm9tUGFyY2VsKHRoaXMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsYWJsZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvUGFyY2VsYWJsZS5qYXZhCmluZGV4IDBhNGI2MGYuLjU5NGZiYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1BhcmNlbGFibGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9QYXJjZWxhYmxlLmphdmEKQEAgLTExMyw0ICsxMTMsMjIgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBUW10gbmV3QXJyYXkoaW50IHNpemUpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWxpemF0aW9uIG9mIHtAbGluayBDcmVhdG9yfSB0aGF0IGFsbG93cyB5b3UgdG8gcmVjZWl2ZSB0aGUKKyAgICAgKiBDbGFzc0xvYWRlciB0aGUgb2JqZWN0IGlzIGJlaW5nIGNyZWF0ZWQgaW4uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDbGFzc0xvYWRlckNyZWF0b3I8VD4gZXh0ZW5kcyBDcmVhdG9yPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGFyY2VsYWJsZSBjbGFzcywgaW5zdGFudGlhdGluZyBpdAorICAgICAgICAgKiBmcm9tIHRoZSBnaXZlbiBQYXJjZWwgd2hvc2UgZGF0YSBoYWQgcHJldmlvdXNseSBiZWVuIHdyaXR0ZW4gYnkKKyAgICAgICAgICoge0BsaW5rIFBhcmNlbGFibGUjd3JpdGVUb1BhcmNlbCBQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwoKX0gYW5kCisgICAgICAgICAqIHVzaW5nIHRoZSBnaXZlbiBDbGFzc0xvYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNvdXJjZSBUaGUgUGFyY2VsIHRvIHJlYWQgdGhlIG9iamVjdCdzIGRhdGEgZnJvbS4KKyAgICAgICAgICogQHBhcmFtIGxvYWRlciBUaGUgQ2xhc3NMb2FkZXIgdGhhdCB0aGlzIG9iamVjdCBpcyBiZWluZyBjcmVhdGVkIGluLgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBhcmNlbGFibGUgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVCBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBzb3VyY2UsIENsYXNzTG9hZGVyIGxvYWRlcik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCmluZGV4IDAxYzY0MGEuLjY4Mzg1YjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKQEAgLTE4MjcsMTkgKzE4MjcsMzAgQEAKICAgICAgICAgICAgIG5ldyBIYXNoTWFwPENsYXNzLCBJbnRlZ2VyPigpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBpcyB1c2VkIHRvIHRyYWNrIGluc3RhbmNlcyBvZiBhY3Rpdml0ZXMuCisgICAgICogVGhlIGFjdGl2aXR5IHNob3VsZCBzdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgdHJhY2tlciBvYmplY3QgaW4gb25lIG9mIGl0cyBmaWVsZHMuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCB0cmFja0FjdGl2aXR5KE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlVHJhY2tlcihpbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5jcmVtZW50RXhwZWN0ZWRBY3Rpdml0eUNvdW50KENsYXNzIGtsYXNzKSB7Ci0gICAgICAgIGlmIChrbGFzcyA9PSBudWxsIHx8IChzVm1Qb2xpY3kubWFzayAmIERFVEVDVF9WTV9BQ1RJVklUWV9MRUFLUykgPT0gMCkgeworICAgICAgICBpZiAoa2xhc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKICAgICAgICAgc3luY2hyb25pemVkIChTdHJpY3RNb2RlLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoKHNWbVBvbGljeS5tYXNrICYgREVURUNUX1ZNX0FDVElWSVRZX0xFQUtTKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBJbnRlZ2VyIGV4cGVjdGVkID0gc0V4cGVjdGVkQWN0aXZpdHlJbnN0YW5jZUNvdW50LmdldChrbGFzcyk7CiAgICAgICAgICAgICBJbnRlZ2VyIG5ld0V4cGVjdGVkID0gZXhwZWN0ZWQgPT0gbnVsbCA/IDEgOiBleHBlY3RlZCArIDE7CiAgICAgICAgICAgICBzRXhwZWN0ZWRBY3Rpdml0eUluc3RhbmNlQ291bnQucHV0KGtsYXNzLCBuZXdFeHBlY3RlZCk7Ci0gICAgICAgICAgICAvLyBOb3RlOiBhZGRpbmcgMSBoZXJlIHRvIGdpdmUgc29tZSBicmVhdGhpbmcgcm9vbSBkdXJpbmcKLSAgICAgICAgICAgIC8vIG9yaWVudGF0aW9uIGNoYW5nZXMuICAoc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgdGhvdWdoPykKLSAgICAgICAgICAgIHNldEV4cGVjdGVkQ2xhc3NJbnN0YW5jZUNvdW50KGtsYXNzLCBuZXdFeHBlY3RlZCArIDEpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODQ3LDMxICsxODU4LDQ4IEBACiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVjcmVtZW50RXhwZWN0ZWRBY3Rpdml0eUNvdW50KENsYXNzIGtsYXNzKSB7Ci0gICAgICAgIGlmIChrbGFzcyA9PSBudWxsIHx8IChzVm1Qb2xpY3kubWFzayAmIERFVEVDVF9WTV9BQ1RJVklUWV9MRUFLUykgPT0gMCkgeworICAgICAgICBpZiAoa2xhc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGxpbWl0OwogICAgICAgICBzeW5jaHJvbml6ZWQgKFN0cmljdE1vZGUuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmICgoc1ZtUG9saWN5Lm1hc2sgJiBERVRFQ1RfVk1fQUNUSVZJVFlfTEVBS1MpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIEludGVnZXIgZXhwZWN0ZWQgPSBzRXhwZWN0ZWRBY3Rpdml0eUluc3RhbmNlQ291bnQuZ2V0KGtsYXNzKTsKLSAgICAgICAgICAgIEludGVnZXIgbmV3RXhwZWN0ZWQgPSAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBleHBlY3RlZCA9PSAwKSA/IDAgOiBleHBlY3RlZCAtIDE7CisgICAgICAgICAgICBpbnQgbmV3RXhwZWN0ZWQgPSAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBleHBlY3RlZCA9PSAwKSA/IDAgOiBleHBlY3RlZCAtIDE7CiAgICAgICAgICAgICBpZiAobmV3RXhwZWN0ZWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHNFeHBlY3RlZEFjdGl2aXR5SW5zdGFuY2VDb3VudC5yZW1vdmUoa2xhc3MpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzRXhwZWN0ZWRBY3Rpdml0eUluc3RhbmNlQ291bnQucHV0KGtsYXNzLCBuZXdFeHBlY3RlZCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIE5vdGU6IGFkZGluZyAxIGhlcmUgdG8gZ2l2ZSBzb21lIGJyZWF0aGluZyByb29tIGR1cmluZwogICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gY2hhbmdlcy4gIChzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCB0aG91Z2g/KQotICAgICAgICAgICAgc2V0RXhwZWN0ZWRDbGFzc0luc3RhbmNlQ291bnQoa2xhc3MsIG5ld0V4cGVjdGVkICsgMSk7CisgICAgICAgICAgICBsaW1pdCA9IG5ld0V4cGVjdGVkICsgMTsKICAgICAgICAgfQotICAgIH0KIAotICAgIC8qKgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEV4cGVjdGVkQ2xhc3NJbnN0YW5jZUNvdW50KENsYXNzIGtsYXNzLCBpbnQgY291bnQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChTdHJpY3RNb2RlLmNsYXNzKSB7Ci0gICAgICAgICAgICBzZXRWbVBvbGljeShuZXcgVm1Qb2xpY3kuQnVpbGRlcihzVm1Qb2xpY3kpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q2xhc3NJbnN0YW5jZUxpbWl0KGtsYXNzLCBjb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgLy8gUXVpY2sgY2hlY2suCisgICAgICAgIGludCBhY3R1YWwgPSBJbnN0YW5jZVRyYWNrZXIuZ2V0SW5zdGFuY2VDb3VudChrbGFzcyk7CisgICAgICAgIGlmIChhY3R1YWwgPD0gbGltaXQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIGEgR0MgYW5kIGV4cGxpY2l0IGNvdW50IHRvIGRvdWJsZS1jaGVjay4KKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgd29yayB0aGF0IHdlIGFyZSB0cnlpbmcgdG8gYXZvaWQgYnkgdHJhY2tpbmcgdGhlIG9iamVjdCBpbnN0YW5jZXMKKyAgICAgICAgLy8gZXhwbGljaXR5LiAgUnVubmluZyBhbiBleHBsaWNpdCBHQyBjYW4gYmUgZXhwZW5zaXZlICg4MG1zKSBhbmQgc28gY2FuIHdhbGtpbmcKKyAgICAgICAgLy8gdGhlIGhlYXAgdG8gY291bnQgaW5zdGFuY2UgKDMwbXMpLiAgVGhpcyBleHRyYSB3b3JrIGNhbiBtYWtlIHRoZSBzeXN0ZW0gZmVlbAorICAgICAgICAvLyBub3RpY2VhYmx5IGxlc3MgcmVzcG9uc2l2ZSBkdXJpbmcgb3JpZW50YXRpb24gY2hhbmdlcyB3aGVuIGFjdGl2aXRpZXMgYXJlCisgICAgICAgIC8vIGJlaW5nIHJlc3RhcnRlZC4gIEdyYW50ZWQsIGl0IGlzIG9ubHkgYSBwcm9ibGVtIHdoZW4gU3RyaWN0TW9kZSBpcyBlbmFibGVkCisgICAgICAgIC8vIGJ1dCBpdCBpcyBhbm5veWluZy4KKyAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKKworICAgICAgICBsb25nIGluc3RhbmNlcyA9IFZNRGVidWcuY291bnRJbnN0YW5jZXNPZkNsYXNzKGtsYXNzLCBmYWxzZSk7CisgICAgICAgIGlmIChpbnN0YW5jZXMgPiBsaW1pdCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIHRyID0gbmV3IEluc3RhbmNlQ291bnRWaW9sYXRpb24oa2xhc3MsIGluc3RhbmNlcywgbGltaXQpOworICAgICAgICAgICAgb25WbVBvbGljeVZpb2xhdGlvbih0ci5nZXRNZXNzYWdlKCksIHRyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjA5NSw0ICsyMTIzLDQ3IEBACiAgICAgICAgICAgICBtTGltaXQgPSBsaW1pdDsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEluc3RhbmNlVHJhY2tlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IHNJbnN0YW5jZUNvdW50cyA9CisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sIEludGVnZXI+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBtS2xhc3M7CisKKyAgICAgICAgcHVibGljIEluc3RhbmNlVHJhY2tlcihPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIG1LbGFzcyA9IGluc3RhbmNlLmdldENsYXNzKCk7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlQ291bnRzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciB2YWx1ZSA9IHNJbnN0YW5jZUNvdW50cy5nZXQobUtsYXNzKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3VmFsdWUgPSB2YWx1ZSAhPSBudWxsID8gdmFsdWUgKyAxIDogMTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2VDb3VudHMucHV0KG1LbGFzcywgbmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0luc3RhbmNlQ291bnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgdmFsdWUgPSBzSW5zdGFuY2VDb3VudHMuZ2V0KG1LbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3VmFsdWUgPSB2YWx1ZSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0luc3RhbmNlQ291bnRzLnB1dChtS2xhc3MsIG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0luc3RhbmNlQ291bnRzLnJlbW92ZShtS2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5zdGFuY2VDb3VudChDbGFzczw/PiBrbGFzcykgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VDb3VudHMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHZhbHVlID0gc0luc3RhbmNlQ291bnRzLmdldChrbGFzcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VNYW5hZ2VyLmphdmEKaW5kZXggNmZkMWQwMC4uY2RiNjIyYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvb3Mvc3RvcmFnZS9TdG9yYWdlTWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZU1hbmFnZXIuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CkBAIC0xMDAsMTAgKzk5LDExIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBPYmJBY3Rpb25MaXN0ZW5lciBtT2JiQWN0aW9uTGlzdGVuZXIgPSBuZXcgT2JiQWN0aW9uTGlzdGVuZXIoKTsKIAogICAgIHByaXZhdGUgY2xhc3MgT2JiQWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBJT2JiQWN0aW9uTGlzdGVuZXIuU3R1YiB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQogICAgICAgICBwcml2YXRlIFNwYXJzZUFycmF5PE9iYkxpc3RlbmVyRGVsZWdhdGU+IG1MaXN0ZW5lcnMgPSBuZXcgU3BhcnNlQXJyYXk8T2JiTGlzdGVuZXJEZWxlZ2F0ZT4oKTsKIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25PYmJSZXN1bHQoU3RyaW5nIGZpbGVuYW1lLCBpbnQgbm9uY2UsIGludCBzdGF0dXMpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgdm9pZCBvbk9iYlJlc3VsdChTdHJpbmcgZmlsZW5hbWUsIGludCBub25jZSwgaW50IHN0YXR1cykgewogICAgICAgICAgICAgZmluYWwgT2JiTGlzdGVuZXJEZWxlZ2F0ZSBkZWxlZ2F0ZTsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxpc3RlbmVycykgewogICAgICAgICAgICAgICAgIGRlbGVnYXRlID0gbUxpc3RlbmVycy5nZXQobm9uY2UpOwpAQCAtMTQ3LDggKzE0Nyw4IEBACiAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1UZ3RMb29wZXIpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIE9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9uT2JiU3RhdGVDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VMaXN0ZW5lciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTU2LDcgKzE1Niw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy53aGF0ID09IFN0b3JhZ2VFdmVudC5FVkVOVF9PQkJfU1RBVEVfQ0hBTkdFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgT2JiU3RhdGVDaGFuZ2VkU3RvcmFnZUV2ZW50IGV2ID0gKE9iYlN0YXRlQ2hhbmdlZFN0b3JhZ2VFdmVudCkgZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uT2JiU3RhdGVDaGFuZ2UoZXYucGF0aCwgZXYuc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlTGlzdGVuZXIub25PYmJTdGF0ZUNoYW5nZShldi5wYXRoLCBldi5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBldmVudCAiICsgbXNnLndoYXQpOwogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9zdG9yYWdlL1N0b3JhZ2VWb2x1bWUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVZvbHVtZS5qYXZhCmluZGV4IGJjNmU5OTMuLjc5MmU0YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVZvbHVtZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL3N0b3JhZ2UvU3RvcmFnZVZvbHVtZS5qYXZhCkBAIC0xNiwxMCArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQub3Muc3RvcmFnZTsKIAotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCiAvKioKICAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgc3RvcmFnZSB2b2x1bWUKQEAgLTI3LDEzICsyNSwxNCBAQAogICovCiBwdWJsaWMgY2xhc3MgU3RvcmFnZVZvbHVtZSBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdG9yYWdlVm9sdW1lIjsKKyAgICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RvcmFnZVZvbHVtZSI7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGF0aDsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1SZW1vdmFibGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1FbXVsYXRlZDsKICAgICBwcml2YXRlIGZpbmFsIGludCBtTXRwUmVzZXJ2ZVNwYWNlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtQWxsb3dNYXNzU3RvcmFnZTsKICAgICBwcml2YXRlIGludCBtU3RvcmFnZUlkOwogCiAgICAgLy8gU3RvcmFnZVZvbHVtZSBleHRyYSBmb3IgQUNUSU9OX01FRElBX1JFTU9WRUQsIEFDVElPTl9NRURJQV9VTk1PVU5URUQsIEFDVElPTl9NRURJQV9DSEVDS0lORywKQEAgLTQxLDIzICs0MCwyNSBAQAogICAgIC8vIEFDVElPTl9NRURJQV9CQURfUkVNT1ZBTCwgQUNUSU9OX01FRElBX1VOTU9VTlRBQkxFIGFuZCBBQ1RJT05fTUVESUFfRUpFQ1QgYnJvYWRjYXN0cy4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TVE9SQUdFX1ZPTFVNRSA9ICJzdG9yYWdlX3ZvbHVtZSI7CiAKLSAgICBwdWJsaWMgU3RvcmFnZVZvbHVtZShTdHJpbmcgcGF0aCwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICAgICAgYm9vbGVhbiByZW1vdmFibGUsIGJvb2xlYW4gZW11bGF0ZWQsIGludCBtdHBSZXNlcnZlU3BhY2UpIHsKKyAgICBwdWJsaWMgU3RvcmFnZVZvbHVtZShTdHJpbmcgcGF0aCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIHJlbW92YWJsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gZW11bGF0ZWQsIGludCBtdHBSZXNlcnZlU3BhY2UsIGJvb2xlYW4gYWxsb3dNYXNzU3RvcmFnZSkgewogICAgICAgICBtUGF0aCA9IHBhdGg7CiAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgICAgICBtUmVtb3ZhYmxlID0gcmVtb3ZhYmxlOwogICAgICAgICBtRW11bGF0ZWQgPSBlbXVsYXRlZDsKICAgICAgICAgbU10cFJlc2VydmVTcGFjZSA9IG10cFJlc2VydmVTcGFjZTsKKyAgICAgICAgbUFsbG93TWFzc1N0b3JhZ2UgPSBhbGxvd01hc3NTdG9yYWdlOwogICAgIH0KIAogICAgIC8vIGZvciBwYXJjZWxsaW5nIG9ubHkKLSAgICBwcml2YXRlIFN0b3JhZ2VWb2x1bWUoU3RyaW5nIHBhdGgsIFN0cmluZyBkZXNjcmlwdGlvbiwKLSAgICAgICAgICAgIGJvb2xlYW4gcmVtb3ZhYmxlLCBib29sZWFuIGVtdWxhdGVkLCBpbnQgbXRwUmVzZXJ2ZVNwYWNlLCBpbnQgc3RvcmFnZUlkKSB7CisgICAgcHJpdmF0ZSBTdG9yYWdlVm9sdW1lKFN0cmluZyBwYXRoLCBTdHJpbmcgZGVzY3JpcHRpb24sIGJvb2xlYW4gcmVtb3ZhYmxlLAorICAgICAgICAgICAgYm9vbGVhbiBlbXVsYXRlZCwgaW50IG10cFJlc2VydmVTcGFjZSwgaW50IHN0b3JhZ2VJZCwgYm9vbGVhbiBhbGxvd01hc3NTdG9yYWdlKSB7CiAgICAgICAgIG1QYXRoID0gcGF0aDsKICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CiAgICAgICAgIG1SZW1vdmFibGUgPSByZW1vdmFibGU7CiAgICAgICAgIG1FbXVsYXRlZCA9IGVtdWxhdGVkOwogICAgICAgICBtTXRwUmVzZXJ2ZVNwYWNlID0gbXRwUmVzZXJ2ZVNwYWNlOworICAgICAgICBtQWxsb3dNYXNzU3RvcmFnZSA9IGFsbG93TWFzc1N0b3JhZ2U7CiAgICAgICAgIG1TdG9yYWdlSWQgPSBzdG9yYWdlSWQ7CiAgICAgfQogCkBAIC0xMzIsNiArMTMzLDE1IEBACiAgICAgICAgIHJldHVybiBtTXRwUmVzZXJ2ZVNwYWNlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZvbHVtZSBjYW4gYmUgc2hhcmVkIHZpYSBVU0IgbWFzcyBzdG9yYWdlLgorICAgICAqCisgICAgICogQHJldHVybiB3aGV0aGVyIG1hc3Mgc3RvcmFnZSBpcyBhbGxvd2VkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYWxsb3dNYXNzU3RvcmFnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd01hc3NTdG9yYWdlOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTdG9yYWdlVm9sdW1lICYmIG1QYXRoICE9IG51bGwpIHsKQEAgLTE2MCw5ICsxNzAsMTAgQEAKICAgICAgICAgICAgIGludCBlbXVsYXRlZCA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGludCBzdG9yYWdlSWQgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICBpbnQgbXRwUmVzZXJ2ZVNwYWNlID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaW50IGFsbG93TWFzc1N0b3JhZ2UgPSBpbi5yZWFkSW50KCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VWb2x1bWUocGF0aCwgZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgIHJlbW92YWJsZSA9PSAxLCBlbXVsYXRlZCA9PSAxLAotICAgICAgICAgICAgICAgICAgICBtdHBSZXNlcnZlU3BhY2UsIHN0b3JhZ2VJZCk7CisgICAgICAgICAgICAgICAgICAgIG10cFJlc2VydmVTcGFjZSwgc3RvcmFnZUlkLCBhbGxvd01hc3NTdG9yYWdlID09IDEpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0b3JhZ2VWb2x1bWVbXSBuZXdBcnJheShpbnQgc2l6ZSkgewpAQCAtMTgxLDUgKzE5Miw2IEBACiAgICAgICAgIHBhcmNlbC53cml0ZUludChtRW11bGF0ZWQgPyAxIDogMCk7CiAgICAgICAgIHBhcmNlbC53cml0ZUludChtU3RvcmFnZUlkKTsKICAgICAgICAgcGFyY2VsLndyaXRlSW50KG1NdHBSZXNlcnZlU3BhY2UpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUFsbG93TWFzc1N0b3JhZ2UgPyAxIDogMCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0LmphdmEKaW5kZXggZmRkMDc4My4uYjdmYjMyMCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9waW0vUmVjdXJyZW5jZVNldC5qYXZhCkBAIC0xOCw3ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXJDb250cmFjdDsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtNTAsMTAgKzUwLDEwIEBACiAgICAgICovCiAgICAgcHVibGljIFJlY3VycmVuY2VTZXQoQ29udGVudFZhbHVlcyB2YWx1ZXMpCiAgICAgICAgICAgICB0aHJvd3MgRXZlbnRSZWN1cnJlbmNlLkludmFsaWRGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcnJ1bGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXIuRXZlbnRzLlJSVUxFKTsKLSAgICAgICAgU3RyaW5nIHJkYXRlU3RyID0gdmFsdWVzLmdldEFzU3RyaW5nKENhbGVuZGFyLkV2ZW50cy5SREFURSk7Ci0gICAgICAgIFN0cmluZyBleHJ1bGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXIuRXZlbnRzLkVYUlVMRSk7Ci0gICAgICAgIFN0cmluZyBleGRhdGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXIuRXZlbnRzLkVYREFURSk7CisgICAgICAgIFN0cmluZyBycnVsZVN0ciA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5SUlVMRSk7CisgICAgICAgIFN0cmluZyByZGF0ZVN0ciA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5SREFURSk7CisgICAgICAgIFN0cmluZyBleHJ1bGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRVhSVUxFKTsKKyAgICAgICAgU3RyaW5nIGV4ZGF0ZVN0ciA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5FWERBVEUpOwogICAgICAgICBpbml0KHJydWxlU3RyLCByZGF0ZVN0ciwgZXhydWxlU3RyLCBleGRhdGVTdHIpOwogICAgIH0KIApAQCAtNjgsMTAgKzY4LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIFJlY3VycmVuY2VTZXQoQ3Vyc29yIGN1cnNvcikKICAgICAgICAgICAgIHRocm93cyBFdmVudFJlY3VycmVuY2UuSW52YWxpZEZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBycnVsZUNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhci5FdmVudHMuUlJVTEUpOwotICAgICAgICBpbnQgcmRhdGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXIuRXZlbnRzLlJEQVRFKTsKLSAgICAgICAgaW50IGV4cnVsZUNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhci5FdmVudHMuRVhSVUxFKTsKLSAgICAgICAgaW50IGV4ZGF0ZUNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhci5FdmVudHMuRVhEQVRFKTsKKyAgICAgICAgaW50IHJydWxlQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLlJSVUxFKTsKKyAgICAgICAgaW50IHJkYXRlQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLlJEQVRFKTsKKyAgICAgICAgaW50IGV4cnVsZUNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5FWFJVTEUpOworICAgICAgICBpbnQgZXhkYXRlQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkVYREFURSk7CiAgICAgICAgIFN0cmluZyBycnVsZVN0ciA9IGN1cnNvci5nZXRTdHJpbmcocnJ1bGVDb2x1bW4pOwogICAgICAgICBTdHJpbmcgcmRhdGVTdHIgPSBjdXJzb3IuZ2V0U3RyaW5nKHJkYXRlQ29sdW1uKTsKICAgICAgICAgU3RyaW5nIGV4cnVsZVN0ciA9IGN1cnNvci5nZXRTdHJpbmcoZXhydWxlQ29sdW1uKTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogICAgICAgICAgICAgc3RhcnQudGltZXpvbmUgPSBUaW1lLlRJTUVaT05FX1VUQzsKICAgICAgICAgfQogICAgICAgICBsb25nIG1pbGxpcyA9IHN0YXJ0LnRvTWlsbGlzKGZhbHNlIC8qIHVzZSBpc0RzdCAqLyk7Ci0gICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXIuRXZlbnRzLkRUU1RBUlQsIG1pbGxpcyk7CisgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRFRTVEFSVCwgbWlsbGlzKTsKICAgICAgICAgaWYgKG1pbGxpcyA9PSAtMSkgewogICAgICAgICAgICAgaWYgKGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRFRTVEFSVCBpcyBvdXQgb2YgcmFuZ2U6ICIgKyBjb21wb25lbnQudG9TdHJpbmcoKSk7CkBAIC0yMTYsMTMgKzIxNiwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5SUlVMRSwgcnJ1bGUpOwotICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5SREFURSwgcmRhdGUpOwotICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5FWFJVTEUsIGV4cnVsZSk7Ci0gICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXIuRXZlbnRzLkVYREFURSwgZXhkYXRlKTsKLSAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhci5FdmVudHMuRVZFTlRfVElNRVpPTkUsIHR6aWQpOwotICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5EVVJBVElPTiwgZHVyYXRpb24pOwotICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyLkV2ZW50cy5BTExfREFZLCBhbGxEYXkgPyAxIDogMCk7CisgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuUlJVTEUsIHJydWxlKTsKKyAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5SREFURSwgcmRhdGUpOworICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkVYUlVMRSwgZXhydWxlKTsKKyAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5FWERBVEUsIGV4ZGF0ZSk7CisgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRVZFTlRfVElNRVpPTkUsIHR6aWQpOworICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkRVUkFUSU9OLCBkdXJhdGlvbik7CisgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuQUxMX0RBWSwgYWxsRGF5ID8gMSA6IDApOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTIzMCwxNCArMjMwLDE0IEBACiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHBvcHVsYXRlQ29tcG9uZW50KEN1cnNvciBjdXJzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYWxlbmRhci5Db21wb25lbnQgY29tcG9uZW50KSB7CiAgICAgICAgIAotICAgICAgICBpbnQgZHRzdGFydENvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhci5FdmVudHMuRFRTVEFSVCk7Ci0gICAgICAgIGludCBkdXJhdGlvbkNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhci5FdmVudHMuRFVSQVRJT04pOwotICAgICAgICBpbnQgdHppZENvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhci5FdmVudHMuRVZFTlRfVElNRVpPTkUpOwotICAgICAgICBpbnQgcnJ1bGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXIuRXZlbnRzLlJSVUxFKTsKLSAgICAgICAgaW50IHJkYXRlQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENhbGVuZGFyLkV2ZW50cy5SREFURSk7Ci0gICAgICAgIGludCBleHJ1bGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXIuRXZlbnRzLkVYUlVMRSk7Ci0gICAgICAgIGludCBleGRhdGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXIuRXZlbnRzLkVYREFURSk7Ci0gICAgICAgIGludCBhbGxEYXlDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXIuRXZlbnRzLkFMTF9EQVkpOworICAgICAgICBpbnQgZHRzdGFydENvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5EVFNUQVJUKTsKKyAgICAgICAgaW50IGR1cmF0aW9uQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkRVUkFUSU9OKTsKKyAgICAgICAgaW50IHR6aWRDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRVZFTlRfVElNRVpPTkUpOworICAgICAgICBpbnQgcnJ1bGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuUlJVTEUpOworICAgICAgICBpbnQgcmRhdGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuUkRBVEUpOworICAgICAgICBpbnQgZXhydWxlQ29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4KENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkVYUlVMRSk7CisgICAgICAgIGludCBleGRhdGVDb2x1bW4gPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRVhEQVRFKTsKKyAgICAgICAgaW50IGFsbERheUNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleChDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5BTExfREFZKTsKIAogCiAgICAgICAgIGxvbmcgZHRzdGFydCA9IC0xOwpAQCAtMjk5LDE2ICsyOTksMTYgQEAKIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwb3B1bGF0ZUNvbXBvbmVudChDb250ZW50VmFsdWVzIHZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbGVuZGFyLkNvbXBvbmVudCBjb21wb25lbnQpIHsKICAgICAgICAgbG9uZyBkdHN0YXJ0ID0gLTE7Ci0gICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoQ2FsZW5kYXIuRXZlbnRzLkRUU1RBUlQpKSB7Ci0gICAgICAgICAgICBkdHN0YXJ0ID0gdmFsdWVzLmdldEFzTG9uZyhDYWxlbmRhci5FdmVudHMuRFRTVEFSVCk7CisgICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRFRTVEFSVCkpIHsKKyAgICAgICAgICAgIGR0c3RhcnQgPSB2YWx1ZXMuZ2V0QXNMb25nKENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkRUU1RBUlQpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBkdXJhdGlvbiA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhci5FdmVudHMuRFVSQVRJT04pOwotICAgICAgICBTdHJpbmcgdHppZCA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhci5FdmVudHMuRVZFTlRfVElNRVpPTkUpOwotICAgICAgICBTdHJpbmcgcnJ1bGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXIuRXZlbnRzLlJSVUxFKTsKLSAgICAgICAgU3RyaW5nIHJkYXRlU3RyID0gdmFsdWVzLmdldEFzU3RyaW5nKENhbGVuZGFyLkV2ZW50cy5SREFURSk7Ci0gICAgICAgIFN0cmluZyBleHJ1bGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXIuRXZlbnRzLkVYUlVMRSk7Ci0gICAgICAgIFN0cmluZyBleGRhdGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXIuRXZlbnRzLkVYREFURSk7Ci0gICAgICAgIEludGVnZXIgYWxsRGF5SW50ZWdlciA9IHZhbHVlcy5nZXRBc0ludGVnZXIoQ2FsZW5kYXIuRXZlbnRzLkFMTF9EQVkpOworICAgICAgICBTdHJpbmcgZHVyYXRpb24gPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRFVSQVRJT04pOworICAgICAgICBTdHJpbmcgdHppZCA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5FVkVOVF9USU1FWk9ORSk7CisgICAgICAgIFN0cmluZyBycnVsZVN0ciA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5SUlVMRSk7CisgICAgICAgIFN0cmluZyByZGF0ZVN0ciA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5SREFURSk7CisgICAgICAgIFN0cmluZyBleHJ1bGVTdHIgPSB2YWx1ZXMuZ2V0QXNTdHJpbmcoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRVhSVUxFKTsKKyAgICAgICAgU3RyaW5nIGV4ZGF0ZVN0ciA9IHZhbHVlcy5nZXRBc1N0cmluZyhDYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5FWERBVEUpOworICAgICAgICBJbnRlZ2VyIGFsbERheUludGVnZXIgPSB2YWx1ZXMuZ2V0QXNJbnRlZ2VyKENhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkFMTF9EQVkpOwogICAgICAgICBib29sZWFuIGFsbERheSA9IChudWxsICE9IGFsbERheUludGVnZXIpID8gKGFsbERheUludGVnZXIgPT0gMSkgOiBmYWxzZTsKIAogICAgICAgICBpZiAoKGR0c3RhcnQgPT0gLTEpIHx8CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0NoZWNrQm94UHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9DaGVja0JveFByZWZlcmVuY2UuamF2YQppbmRleCAyYmY2YzdiLi40MzdlNTUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL0NoZWNrQm94UHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvQ2hlY2tCb3hQcmVmZXJlbmNlLmphdmEKQEAgLTE2LDIwICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKIAotaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja2FibGU7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIC8qKgogICogQSB7QGxpbmsgUHJlZmVyZW5jZX0gdGhhdCBwcm92aWRlcyBjaGVja2JveCB3aWRnZXQKQEAgLTQxLDMxICszMiwxOCBAQAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ2hlY2tCb3hQcmVmZXJlbmNlX3N1bW1hcnlPbgogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjQ2hlY2tCb3hQcmVmZXJlbmNlX2Rpc2FibGVEZXBlbmRlbnRzU3RhdGUKICAqLwotcHVibGljIGNsYXNzIENoZWNrQm94UHJlZmVyZW5jZSBleHRlbmRzIFByZWZlcmVuY2UgeworcHVibGljIGNsYXNzIENoZWNrQm94UHJlZmVyZW5jZSBleHRlbmRzIFR3b1N0YXRlUHJlZmVyZW5jZSB7CiAKLSAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VtbWFyeU9uOwotICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1TdW1tYXJ5T2ZmOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBtQ2hlY2tlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRWaWV3Q2xpY2tlZFR5cGU7Ci0KLSAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gbURpc2FibGVEZXBlbmRlbnRzU3RhdGU7Ci0gICAgCiAgICAgcHVibGljIENoZWNrQm94UHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CiAgICAgICAgIAogICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQ2hlY2tCb3hQcmVmZXJlbmNlLCBkZWZTdHlsZSwgMCk7Ci0gICAgICAgIG1TdW1tYXJ5T24gPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5DaGVja0JveFByZWZlcmVuY2Vfc3VtbWFyeU9uKTsKLSAgICAgICAgbVN1bW1hcnlPZmYgPSBhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5DaGVja0JveFByZWZlcmVuY2Vfc3VtbWFyeU9mZik7Ci0gICAgICAgIG1EaXNhYmxlRGVwZW5kZW50c1N0YXRlID0gYS5nZXRCb29sZWFuKAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLkNoZWNrQm94UHJlZmVyZW5jZV9kaXNhYmxlRGVwZW5kZW50c1N0YXRlLCBmYWxzZSk7CisgICAgICAgIHNldFN1bW1hcnlPbihhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5DaGVja0JveFByZWZlcmVuY2Vfc3VtbWFyeU9uKSk7CisgICAgICAgIHNldFN1bW1hcnlPZmYoYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQ2hlY2tCb3hQcmVmZXJlbmNlX3N1bW1hcnlPZmYpKTsKKyAgICAgICAgc2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZShhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQ2hlY2tCb3hQcmVmZXJlbmNlX2Rpc2FibGVEZXBlbmRlbnRzU3RhdGUsIGZhbHNlKSk7CiAgICAgICAgIGEucmVjeWNsZSgpOwotCi0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9Ci0gICAgICAgICAgICAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKFNlcnZpY2UuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ2hlY2tCb3hQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CkBAIC04NCwyNDYgKzYyLDkgQEAKICAgICAgICAgaWYgKGNoZWNrYm94VmlldyAhPSBudWxsICYmIGNoZWNrYm94VmlldyBpbnN0YW5jZW9mIENoZWNrYWJsZSkgewogICAgICAgICAgICAgKChDaGVja2FibGUpIGNoZWNrYm94Vmlldykuc2V0Q2hlY2tlZChtQ2hlY2tlZCk7CiAKLSAgICAgICAgICAgIC8vIHNlbmQgYW4gZXZlbnQgdG8gYW5ub3VuY2UgdGhlIHZhbHVlIGNoYW5nZSBvZiB0aGUgQ2hlY2tCb3ggYW5kIGlzIGRvbmUgaGVyZQotICAgICAgICAgICAgLy8gYmVjYXVzZSBjbGlja2luZyBhIHByZWZlcmVuY2UgZG9lcyBub3QgaW1tZWRpYXRlbHkgY2hhbmdlIHRoZSBjaGVja2VkIHN0YXRlCi0gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSB3aGVuIGVuYWJsaW5nIHRoZSBXaUZpCi0gICAgICAgICAgICBpZiAobVNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRWaWV3Q2xpY2tlZFR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpICYmCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrYm94Vmlldy5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIG1TZW5kQWNjZXNzaWJpbGl0eUV2ZW50Vmlld0NsaWNrZWRUeXBlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSBzZW5kIGFuIGV2ZW50IG9uIGJlaGFsZiBvZiB0aGUgY2hlY2sgYm94IGJlY2F1c2UgaW4gb25CaW5kIHRoZSBsYXR0ZXIKLSAgICAgICAgICAgICAgICAvLyBpcyBkZXRhY2hlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIHN1Y2ggdmlld3MgZG8gbm90IHNlbmQgYWNjZXNzaWJpbGl0eSBldmVudHMKLSAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKAotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEKTsKLSAgICAgICAgICAgICAgICBldmVudC5zZXRDbGFzc05hbWUoY2hlY2tib3hWaWV3LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShnZXRDb250ZXh0KCkuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgZXZlbnQuc2V0RW5hYmxlZChjaGVja2JveFZpZXcuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIGV2ZW50LnNldENvbnRlbnREZXNjcmlwdGlvbihjaGVja2JveFZpZXcuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIGV2ZW50LnNldENoZWNrZWQoKChDaGVja2FibGUpIGNoZWNrYm94VmlldykuaXNDaGVja2VkKCkpOwotICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRGb3JWaWV3KGNoZWNrYm94Vmlldyk7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBTeW5jIHRoZSBzdW1tYXJ5IHZpZXcKLSAgICAgICAgVGV4dFZpZXcgc3VtbWFyeVZpZXcgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc3VtbWFyeSk7Ci0gICAgICAgIGlmIChzdW1tYXJ5VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIHVzZURlZmF1bHRTdW1tYXJ5ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtQ2hlY2tlZCAmJiBtU3VtbWFyeU9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdW1tYXJ5Vmlldy5zZXRUZXh0KG1TdW1tYXJ5T24pOwotICAgICAgICAgICAgICAgIHVzZURlZmF1bHRTdW1tYXJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2hlY2tlZCAmJiBtU3VtbWFyeU9mZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3VtbWFyeVZpZXcuc2V0VGV4dChtU3VtbWFyeU9mZik7Ci0gICAgICAgICAgICAgICAgdXNlRGVmYXVsdFN1bW1hcnkgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHVzZURlZmF1bHRTdW1tYXJ5KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIHN1bW1hcnkgPSBnZXRTdW1tYXJ5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN1bW1hcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5Vmlldy5zZXRUZXh0KHN1bW1hcnkpOwotICAgICAgICAgICAgICAgICAgICB1c2VEZWZhdWx0U3VtbWFyeSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG5ld1Zpc2liaWxpdHkgPSBWaWV3LkdPTkU7Ci0gICAgICAgICAgICBpZiAoIXVzZURlZmF1bHRTdW1tYXJ5KSB7Ci0gICAgICAgICAgICAgICAgLy8gU29tZW9uZSBoYXMgd3JpdHRlbiB0byBpdAotICAgICAgICAgICAgICAgIG5ld1Zpc2liaWxpdHkgPSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmV3VmlzaWJpbGl0eSAhPSBzdW1tYXJ5Vmlldy5nZXRWaXNpYmlsaXR5KCkpIHsKLSAgICAgICAgICAgICAgICBzdW1tYXJ5Vmlldy5zZXRWaXNpYmlsaXR5KG5ld1Zpc2liaWxpdHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHN5bmNTdW1tYXJ5Vmlldyh2aWV3KTsKICAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DbGljaygpIHsKLSAgICAgICAgc3VwZXIub25DbGljaygpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFpc0NoZWNrZWQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGluIG9uQmluZFZpZXcoKSBhbiBBY2Nlc3NpYmlsaXR5RXZlbnRWaWV3Q2xpY2tlZFR5cGUgaXMgc2VudCB0byBhbm5vdW5jZSB0aGUgY2hhbmdlCi0gICAgICAgIC8vIG5vdCBzZW5kaW5nCi0gICAgICAgIG1TZW5kQWNjZXNzaWJpbGl0eUV2ZW50Vmlld0NsaWNrZWRUeXBlID0gdHJ1ZTsKLQotICAgICAgICBpZiAoIWNhbGxDaGFuZ2VMaXN0ZW5lcihuZXdWYWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2V0Q2hlY2tlZChuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY2hlY2tlZCBzdGF0ZSBhbmQgc2F2ZXMgaXQgdG8gdGhlIHtAbGluayBTaGFyZWRQcmVmZXJlbmNlc30uCi0gICAgICogCi0gICAgICogQHBhcmFtIGNoZWNrZWQgVGhlIGNoZWNrZWQgc3RhdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKLSAgICAgICAgaWYgKG1DaGVja2VkICE9IGNoZWNrZWQpIHsKLSAgICAgICAgICAgIG1DaGVja2VkID0gY2hlY2tlZDsKLSAgICAgICAgICAgIHBlcnNpc3RCb29sZWFuKGNoZWNrZWQpOwotICAgICAgICAgICAgbm90aWZ5RGVwZW5kZW5jeUNoYW5nZShzaG91bGREaXNhYmxlRGVwZW5kZW50cygpKTsKLSAgICAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNoZWNrZWQgc3RhdGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBUaGUgY2hlY2tlZCBzdGF0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQ2hlY2tlZDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGlzYWJsZURlcGVuZGVudHMoKSB7Ci0gICAgICAgIGJvb2xlYW4gc2hvdWxkRGlzYWJsZSA9IG1EaXNhYmxlRGVwZW5kZW50c1N0YXRlID8gbUNoZWNrZWQgOiAhbUNoZWNrZWQ7Ci0gICAgICAgIHJldHVybiBzaG91bGREaXNhYmxlIHx8IHN1cGVyLnNob3VsZERpc2FibGVEZXBlbmRlbnRzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3VtbWFyeSB0byBiZSBzaG93biB3aGVuIGNoZWNrZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIHN1bW1hcnkgdG8gYmUgc2hvd24gd2hlbiBjaGVja2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnlPbihDaGFyU2VxdWVuY2Ugc3VtbWFyeSkgewotICAgICAgICBtU3VtbWFyeU9uID0gc3VtbWFyeTsKLSAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICBub3RpZnlDaGFuZ2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlICNzZXRTdW1tYXJ5T24oQ2hhclNlcXVlbmNlKQotICAgICAqIEBwYXJhbSBzdW1tYXJ5UmVzSWQgVGhlIHN1bW1hcnkgYXMgYSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5T24oaW50IHN1bW1hcnlSZXNJZCkgewotICAgICAgICBzZXRTdW1tYXJ5T24oZ2V0Q29udGV4dCgpLmdldFN0cmluZyhzdW1tYXJ5UmVzSWQpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3VtbWFyeSB0byBiZSBzaG93biB3aGVuIGNoZWNrZWQuCi0gICAgICogQHJldHVybiBUaGUgc3VtbWFyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1bW1hcnlPbigpIHsKLSAgICAgICAgcmV0dXJuIG1TdW1tYXJ5T247Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN1bW1hcnkgdG8gYmUgc2hvd24gd2hlbiB1bmNoZWNrZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIHN1bW1hcnkgdG8gYmUgc2hvd24gd2hlbiB1bmNoZWNrZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZihDaGFyU2VxdWVuY2Ugc3VtbWFyeSkgewotICAgICAgICBtU3VtbWFyeU9mZiA9IHN1bW1hcnk7Ci0gICAgICAgIGlmICghaXNDaGVja2VkKCkpIHsKLSAgICAgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgI3NldFN1bW1hcnlPZmYoQ2hhclNlcXVlbmNlKQotICAgICAqIEBwYXJhbSBzdW1tYXJ5UmVzSWQgVGhlIHN1bW1hcnkgYXMgYSByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5T2ZmKGludCBzdW1tYXJ5UmVzSWQpIHsKLSAgICAgICAgc2V0U3VtbWFyeU9mZihnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKHN1bW1hcnlSZXNJZCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdW1tYXJ5IHRvIGJlIHNob3duIHdoZW4gdW5jaGVja2VkLgotICAgICAqIEByZXR1cm4gVGhlIHN1bW1hcnkuCi0gICAgICovCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5T2ZmKCkgewotICAgICAgICByZXR1cm4gbVN1bW1hcnlPZmY7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGRlcGVuZGVudHMgYXJlIGRpc2FibGVkIHdoZW4gdGhpcyBwcmVmZXJlbmNlIGlzIG9uICh7QGNvZGUgdHJ1ZX0pCi0gICAgICogb3Igd2hlbiB0aGlzIHByZWZlcmVuY2UgaXMgb2ZmICh7QGNvZGUgZmFsc2V9KS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFdoZXRoZXIgZGVwZW5kZW50cyBhcmUgZGlzYWJsZWQgd2hlbiB0aGlzIHByZWZlcmVuY2UgaXMgb24gKHtAY29kZSB0cnVlfSkKLSAgICAgKiAgICAgICAgIG9yIHdoZW4gdGhpcyBwcmVmZXJlbmNlIGlzIG9mZiAoe0Bjb2RlIGZhbHNlfSkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaXNhYmxlRGVwZW5kZW50c1N0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciBkZXBlbmRlbnRzIGFyZSBkaXNhYmxlZCB3aGVuIHRoaXMgcHJlZmVyZW5jZSBpcyBvbiAoe0Bjb2RlIHRydWV9KQotICAgICAqIG9yIHdoZW4gdGhpcyBwcmVmZXJlbmNlIGlzIG9mZiAoe0Bjb2RlIGZhbHNlfSkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGRpc2FibGVEZXBlbmRlbnRzU3RhdGUgVGhlIHByZWZlcmVuY2Ugc3RhdGUgdGhhdCBzaG91bGQgZGlzYWJsZSBkZXBlbmRlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVEZXBlbmRlbnRzU3RhdGUoYm9vbGVhbiBkaXNhYmxlRGVwZW5kZW50c1N0YXRlKSB7Ci0gICAgICAgIG1EaXNhYmxlRGVwZW5kZW50c1N0YXRlID0gZGlzYWJsZURlcGVuZGVudHNTdGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9uR2V0RGVmYXVsdFZhbHVlKFR5cGVkQXJyYXkgYSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBhLmdldEJvb2xlYW4oaW5kZXgsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZShib29sZWFuIHJlc3RvcmVWYWx1ZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotICAgICAgICBzZXRDaGVja2VkKHJlc3RvcmVWYWx1ZSA/IGdldFBlcnNpc3RlZEJvb2xlYW4obUNoZWNrZWQpCi0gICAgICAgICAgICAgICAgOiAoQm9vbGVhbikgZGVmYXVsdFZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgewotICAgICAgICBmaW5hbCBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7Ci0gICAgICAgIGlmIChpc1BlcnNpc3RlbnQoKSkgewotICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzYXZlIGluc3RhbmNlIHN0YXRlIHNpbmNlIGl0J3MgcGVyc2lzdGVudAotICAgICAgICAgICAgcmV0dXJuIHN1cGVyU3RhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUpOwotICAgICAgICBteVN0YXRlLmNoZWNrZWQgPSBpc0NoZWNrZWQoKTsKLSAgICAgICAgcmV0dXJuIG15U3RhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShQYXJjZWxhYmxlIHN0YXRlKSB7Ci0gICAgICAgIGlmIChzdGF0ZSA9PSBudWxsIHx8ICFzdGF0ZS5nZXRDbGFzcygpLmVxdWFscyhTYXZlZFN0YXRlLmNsYXNzKSkgewotICAgICAgICAgICAgLy8gRGlkbid0IHNhdmUgc3RhdGUgZm9yIHVzIGluIG9uU2F2ZUluc3RhbmNlU3RhdGUKLSAgICAgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgICAKLSAgICAgICAgU2F2ZWRTdGF0ZSBteVN0YXRlID0gKFNhdmVkU3RhdGUpIHN0YXRlOwotICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKG15U3RhdGUuZ2V0U3VwZXJTdGF0ZSgpKTsKLSAgICAgICAgc2V0Q2hlY2tlZChteVN0YXRlLmNoZWNrZWQpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgewotICAgICAgICBib29sZWFuIGNoZWNrZWQ7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZShQYXJjZWwgc291cmNlKSB7Ci0gICAgICAgICAgICBzdXBlcihzb3VyY2UpOwotICAgICAgICAgICAgY2hlY2tlZCA9IHNvdXJjZS5yZWFkSW50KCkgPT0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOwotICAgICAgICAgICAgZGVzdC53cml0ZUludChjaGVja2VkID8gMSA6IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsYWJsZSBzdXBlclN0YXRlKSB7Ci0gICAgICAgICAgICBzdXBlcihzdXBlclN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+IENSRUFUT1IgPQotICAgICAgICAgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4oKSB7Ci0gICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZSBjcmVhdGVGcm9tUGFyY2VsKFBhcmNlbCBpbikgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZShpbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGVbc2l6ZV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotICAgIAogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQppbmRleCBiNmQxNTk0Li43NGEzNzZkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2UuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuQWJzU2F2ZWRTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CkBAIC05NTYsNiArOTU3LDE3IEBACiAgICAgICAgICAgICBjb250ZXh0LnN0YXJ0QWN0aXZpdHkobUludGVudCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3MgYSBQcmVmZXJlbmNlIHRvIGludGVyY2VwdCBrZXkgZXZlbnRzIHdpdGhvdXQgaGF2aW5nIGZvY3VzLgorICAgICAqIEZvciBleGFtcGxlLCBTZWVrQmFyUHJlZmVyZW5jZSB1c2VzIHRoaXMgdG8gaW50ZXJjZXB0ICsvLSB0byBhZGp1c3QKKyAgICAgKiB0aGUgcHJvZ3Jlc3MuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBQcmVmZXJlbmNlIGhhbmRsZWQgdGhlIGtleS4gUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0LgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gb25LZXkoVmlldyB2LCBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHR9IG9mIHRoaXMgUHJlZmVyZW5jZS4gCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRnJhZ21lbnQuamF2YQppbmRleCA5ZDQ2YjdhLi5mNmJhN2Y3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1ByZWZlcmVuY2VGcmFnbWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvUHJlZmVyZW5jZUZyYWdtZW50LmphdmEKQEAgLTIwLDEzICsyMCwxNCBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbktleUxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwogCiAvKioKQEAgLTE0Niw3ICsxNDcsNiBAQAogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoZ2V0QWN0aXZpdHkoKSwgRklSU1RfUkVRVUVTVF9DT0RFKTsKICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLnNldEZyYWdtZW50KHRoaXMpOwotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNzksOSArMTc5LDE2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewogICAgICAgICBzdXBlci5vblN0b3AoKTsKICAgICAgICAgbVByZWZlcmVuY2VNYW5hZ2VyLmRpc3BhdGNoQWN0aXZpdHlTdG9wKCk7CisgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5zZXRPblByZWZlcmVuY2VUcmVlQ2xpY2tMaXN0ZW5lcihudWxsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5Niw3ICsyMDMsNiBAQAogICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CiAgICAgICAgIG1QcmVmZXJlbmNlTWFuYWdlci5kaXNwYXRjaEFjdGl2aXR5RGVzdHJveSgpOwotICAgICAgICBtUHJlZmVyZW5jZU1hbmFnZXIuc2V0T25QcmVmZXJlbmNlVHJlZUNsaWNrTGlzdGVuZXIobnVsbCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zNDUsNiArMzUxLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICJZb3VyIGNvbnRlbnQgbXVzdCBoYXZlIGEgTGlzdFZpZXcgd2hvc2UgaWQgYXR0cmlidXRlIGlzICIgKwogICAgICAgICAgICAgICAgICAgICAiJ2FuZHJvaWQuUi5pZC5saXN0JyIpOwogICAgICAgICB9CisgICAgICAgIG1MaXN0LnNldE9uS2V5TGlzdGVuZXIobUxpc3RPbktleUxpc3RlbmVyKTsKICAgICAgICAgbUhhbmRsZXIucG9zdChtUmVxdWVzdEZvY3VzKTsKICAgICB9CisKKyAgICBwcml2YXRlIE9uS2V5TGlzdGVuZXIgbUxpc3RPbktleUxpc3RlbmVyID0gbmV3IE9uS2V5TGlzdGVuZXIoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5KFZpZXcgdiwgaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRJdGVtID0gbUxpc3QuZ2V0U2VsZWN0ZWRJdGVtKCk7CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgUHJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgIFZpZXcgc2VsZWN0ZWRWaWV3ID0gbUxpc3QuZ2V0U2VsZWN0ZWRWaWV3KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoUHJlZmVyZW5jZSlzZWxlY3RlZEl0ZW0pLm9uS2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3LCBrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH07CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1NlZWtCYXJEaWFsb2dQcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1NlZWtCYXJEaWFsb2dQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4OWIxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvU2Vla0JhckRpYWxvZ1ByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByZWZlcmVuY2U7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQucHJlZmVyZW5jZS5EaWFsb2dQcmVmZXJlbmNlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CisKKy8qKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFNlZWtCYXJEaWFsb2dQcmVmZXJlbmNlIGV4dGVuZHMgRGlhbG9nUHJlZmVyZW5jZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZWVrQmFyRGlhbG9nUHJlZmVyZW5jZSI7CisKKyAgICBwcml2YXRlIERyYXdhYmxlIG1NeUljb247CisKKyAgICBwdWJsaWMgU2Vla0JhckRpYWxvZ1ByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIHNldERpYWxvZ0xheW91dFJlc291cmNlKGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNlZWtiYXJfZGlhbG9nKTsKKyAgICAgICAgY3JlYXRlQWN0aW9uQnV0dG9ucygpOworCisgICAgICAgIC8vIFN0ZWFsIHRoZSBYTUwgZGlhbG9nSWNvbiBhdHRyaWJ1dGUncyB2YWx1ZQorICAgICAgICBtTXlJY29uID0gZ2V0RGlhbG9nSWNvbigpOworICAgICAgICBzZXREaWFsb2dJY29uKG51bGwpOworICAgIH0KKworICAgIC8vIEFsbG93IHN1YmNsYXNzZXMgdG8gb3ZlcnJpZGUgdGhlIGFjdGlvbiBidXR0b25zCisgICAgcHVibGljIHZvaWQgY3JlYXRlQWN0aW9uQnV0dG9ucygpIHsKKyAgICAgICAgc2V0UG9zaXRpdmVCdXR0b25UZXh0KGFuZHJvaWQuUi5zdHJpbmcub2spOworICAgICAgICBzZXROZWdhdGl2ZUJ1dHRvblRleHQoYW5kcm9pZC5SLnN0cmluZy5jYW5jZWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZERpYWxvZ1ZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIHN1cGVyLm9uQmluZERpYWxvZ1ZpZXcodmlldyk7CisKKyAgICAgICAgZmluYWwgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmljb24pOworICAgICAgICBpZiAobU15SWNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NeUljb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWNvblZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTZWVrQmFyIGdldFNlZWtCYXIoVmlldyBkaWFsb2dWaWV3KSB7CisgICAgICAgIHJldHVybiAoU2Vla0JhcikgZGlhbG9nVmlldy5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5zZWVrYmFyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1NlZWtCYXJQcmVmZXJlbmNlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1NlZWtCYXJQcmVmZXJlbmNlLmphdmEKaW5kZXggMDM3ZmI0MS4uYjg5MTljMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9TZWVrQmFyUHJlZmVyZW5jZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvU2Vla0JhclByZWZlcmVuY2UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE3LDUxICsxNywyMjYgQEAKIHBhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXI7CiAKIC8qKgogICogQGhpZGUKICAqLwotcHVibGljIGNsYXNzIFNlZWtCYXJQcmVmZXJlbmNlIGV4dGVuZHMgRGlhbG9nUHJlZmVyZW5jZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZWVrQmFyUHJlZmVyZW5jZSI7CitwdWJsaWMgY2xhc3MgU2Vla0JhclByZWZlcmVuY2UgZXh0ZW5kcyBQcmVmZXJlbmNlCisgICAgICAgIGltcGxlbWVudHMgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgewogCi0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtTXlJY29uOworICAgIHByaXZhdGUgaW50IG1Qcm9ncmVzczsKKyAgICBwcml2YXRlIGludCBtTWF4OworICAgIHByaXZhdGUgYm9vbGVhbiBtVHJhY2tpbmdUb3VjaDsKIAotICAgIHB1YmxpYyBTZWVrQmFyUHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0KLSAgICAgICAgc2V0RGlhbG9nTGF5b3V0UmVzb3VyY2UoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuc2Vla2Jhcl9kaWFsb2cpOwotICAgICAgICBjcmVhdGVBY3Rpb25CdXR0b25zKCk7Ci0KLSAgICAgICAgLy8gU3RlYWwgdGhlIFhNTCBkaWFsb2dJY29uIGF0dHJpYnV0ZSdzIHZhbHVlCi0gICAgICAgIG1NeUljb24gPSBnZXREaWFsb2dJY29uKCk7Ci0gICAgICAgIHNldERpYWxvZ0ljb24obnVsbCk7CisgICAgcHVibGljIFNlZWtCYXJQcmVmZXJlbmNlKAorICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuUHJvZ3Jlc3NCYXIsIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgc2V0TWF4KGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlByb2dyZXNzQmFyX21heCwgbU1heCkpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICAgICAgc2V0TGF5b3V0UmVzb3VyY2UoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQucHJlZmVyZW5jZV93aWRnZXRfc2Vla2Jhcik7CiAgICAgfQogCi0gICAgLy8gQWxsb3cgc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGUgYWN0aW9uIGJ1dHRvbnMKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVBY3Rpb25CdXR0b25zKCkgewotICAgICAgICBzZXRQb3NpdGl2ZUJ1dHRvblRleHQoYW5kcm9pZC5SLnN0cmluZy5vayk7Ci0gICAgICAgIHNldE5lZ2F0aXZlQnV0dG9uVGV4dChhbmRyb2lkLlIuc3RyaW5nLmNhbmNlbCk7CisgICAgcHVibGljIFNlZWtCYXJQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOworICAgIH0KKworICAgIHB1YmxpYyBTZWVrQmFyUHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkJpbmREaWFsb2dWaWV3KFZpZXcgdmlldykgewotICAgICAgICBzdXBlci5vbkJpbmREaWFsb2dWaWV3KHZpZXcpOworICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZFZpZXcoVmlldyB2aWV3KSB7CisgICAgICAgIHN1cGVyLm9uQmluZFZpZXcodmlldyk7CisgICAgICAgIFNlZWtCYXIgc2Vla0JhciA9IChTZWVrQmFyKSB2aWV3LmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNlZWtiYXIpOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKHRoaXMpOworICAgICAgICBzZWVrQmFyLnNldE1heChtTWF4KTsKKyAgICAgICAgc2Vla0Jhci5zZXRQcm9ncmVzcyhtUHJvZ3Jlc3MpOworICAgICAgICBzZWVrQmFyLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOworICAgIH0KIAotICAgICAgICBmaW5hbCBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuaWNvbik7Ci0gICAgICAgIGlmIChtTXlJY29uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUobU15SWNvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblNldEluaXRpYWxWYWx1ZShib29sZWFuIHJlc3RvcmVWYWx1ZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBzZXRQcm9ncmVzcyhyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRJbnQobVByb2dyZXNzKQorICAgICAgICAgICAgICAgIDogKEludGVnZXIpIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25LZXkoVmlldyB2LCBpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IEtleUV2ZW50LkFDVElPTl9VUCkgeworICAgICAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9QTFVTCisgICAgICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9FUVVBTFMpIHsKKyAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcyhnZXRQcm9ncmVzcygpICsgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX01JTlVTKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoZ2V0UHJvZ3Jlc3MoKSAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXgoaW50IG1heCkgeworICAgICAgICBpZiAobWF4ICE9IG1NYXgpIHsKKyAgICAgICAgICAgIG1NYXggPSBtYXg7CisgICAgICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFNlZWtCYXIgZ2V0U2Vla0JhcihWaWV3IGRpYWxvZ1ZpZXcpIHsKLSAgICAgICAgcmV0dXJuIChTZWVrQmFyKSBkaWFsb2dWaWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnNlZWtiYXIpOworICAgIHB1YmxpYyB2b2lkIHNldFByb2dyZXNzKGludCBwcm9ncmVzcykgeworICAgICAgICBzZXRQcm9ncmVzcyhwcm9ncmVzcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFByb2dyZXNzKGludCBwcm9ncmVzcywgYm9vbGVhbiBub3RpZnlDaGFuZ2VkKSB7CisgICAgICAgIGlmIChwcm9ncmVzcyA+IG1NYXgpIHsKKyAgICAgICAgICAgIHByb2dyZXNzID0gbU1heDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvZ3Jlc3MgPCAwKSB7CisgICAgICAgICAgICBwcm9ncmVzcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2dyZXNzICE9IG1Qcm9ncmVzcykgeworICAgICAgICAgICAgbVByb2dyZXNzID0gcHJvZ3Jlc3M7CisgICAgICAgICAgICBwZXJzaXN0SW50KHByb2dyZXNzKTsKKyAgICAgICAgICAgIGlmIChub3RpZnlDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRQcm9ncmVzcygpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9ncmVzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0IHRoZSBzZWVrQmFyJ3MgcHJvZ3Jlc3MgdmFsdWUgaWYgY2FsbENoYW5nZUxpc3RlbmVyCisgICAgICogcmV0dXJucyB0cnVlLCBvdGhlcndpc2Ugc2V0IHRoZSBzZWVrQmFyJ3MgcHJvZ3Jlc3MgdG8gdGhlIHN0b3JlZCB2YWx1ZQorICAgICAqLworICAgIHZvaWQgc3luY1Byb2dyZXNzKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICBpbnQgcHJvZ3Jlc3MgPSBzZWVrQmFyLmdldFByb2dyZXNzKCk7CisgICAgICAgIGlmIChwcm9ncmVzcyAhPSBtUHJvZ3Jlc3MpIHsKKyAgICAgICAgICAgIGlmIChjYWxsQ2hhbmdlTGlzdGVuZXIocHJvZ3Jlc3MpKSB7CisgICAgICAgICAgICAgICAgc2V0UHJvZ3Jlc3MocHJvZ3Jlc3MsIGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2Vla0Jhci5zZXRQcm9ncmVzcyhtUHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoCisgICAgICAgICAgICBTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICBpZiAoZnJvbVVzZXIgJiYgIW1UcmFja2luZ1RvdWNoKSB7CisgICAgICAgICAgICBzeW5jUHJvZ3Jlc3Moc2Vla0Jhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgbVRyYWNraW5nVG91Y2ggPSB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgIG1UcmFja2luZ1RvdWNoID0gZmFsc2U7CisgICAgICAgIGlmIChzZWVrQmFyLmdldFByb2dyZXNzKCkgIT0gbVByb2dyZXNzKSB7CisgICAgICAgICAgICBzeW5jUHJvZ3Jlc3Moc2Vla0Jhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUGFyY2VsYWJsZSBvblNhdmVJbnN0YW5jZVN0YXRlKCkgeworICAgICAgICAvKgorICAgICAgICAgKiBTdXBwb3NlIGEgY2xpZW50IHVzZXMgdGhpcyBwcmVmZXJlbmNlIHR5cGUgd2l0aG91dCBwZXJzaXN0aW5nLiBXZQorICAgICAgICAgKiBtdXN0IHNhdmUgdGhlIGluc3RhbmNlIHN0YXRlIHNvIGl0IGlzIGFibGUgdG8sIGZvciBleGFtcGxlLCBzdXJ2aXZlCisgICAgICAgICAqIG9yaWVudGF0aW9uIGNoYW5nZXMuCisgICAgICAgICAqLworCisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUgc2luY2UgaXQncyBwZXJzaXN0ZW50CisgICAgICAgICAgICByZXR1cm4gc3VwZXJTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNhdmUgdGhlIGluc3RhbmNlIHN0YXRlCisgICAgICAgIGZpbmFsIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUpOworICAgICAgICBteVN0YXRlLnByb2dyZXNzID0gbVByb2dyZXNzOworICAgICAgICBteVN0YXRlLm1heCA9IG1NYXg7CisgICAgICAgIHJldHVybiBteVN0YXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUoUGFyY2VsYWJsZSBzdGF0ZSkgeworICAgICAgICBpZiAoIXN0YXRlLmdldENsYXNzKCkuZXF1YWxzKFNhdmVkU3RhdGUuY2xhc3MpKSB7CisgICAgICAgICAgICAvLyBEaWRuJ3Qgc2F2ZSBzdGF0ZSBmb3IgdXMgaW4gb25TYXZlSW5zdGFuY2VTdGF0ZQorICAgICAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBpbnN0YW5jZSBzdGF0ZQorICAgICAgICBTYXZlZFN0YXRlIG15U3RhdGUgPSAoU2F2ZWRTdGF0ZSkgc3RhdGU7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUobXlTdGF0ZS5nZXRTdXBlclN0YXRlKCkpOworICAgICAgICBtUHJvZ3Jlc3MgPSBteVN0YXRlLnByb2dyZXNzOworICAgICAgICBtTWF4ID0gbXlTdGF0ZS5tYXg7CisgICAgICAgIG5vdGlmeUNoYW5nZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlZFN0YXRlLCBhIHN1YmNsYXNzIG9mIHtAbGluayBCYXNlU2F2ZWRTdGF0ZX0sIHdpbGwgc3RvcmUgdGhlIHN0YXRlCisgICAgICogb2YgTXlQcmVmZXJlbmNlLCBhIHN1YmNsYXNzIG9mIFByZWZlcmVuY2UuCisgICAgICogPHA+CisgICAgICogSXQgaXMgaW1wb3J0YW50IHRvIGFsd2F5cyBjYWxsIHRocm91Z2ggdG8gc3VwZXIgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgeworICAgICAgICBpbnQgcHJvZ3Jlc3M7CisgICAgICAgIGludCBtYXg7CisKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgY2xpY2sgY291bnRlcgorICAgICAgICAgICAgcHJvZ3Jlc3MgPSBzb3VyY2UucmVhZEludCgpOworICAgICAgICAgICAgbWF4ID0gc291cmNlLnJlYWRJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBkZXN0LCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlVG9QYXJjZWwoZGVzdCwgZmxhZ3MpOworCisgICAgICAgICAgICAvLyBTYXZlIHRoZSBjbGljayBjb3VudGVyCisgICAgICAgICAgICBkZXN0LndyaXRlSW50KHByb2dyZXNzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQobWF4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1N3aXRjaFByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvU3dpdGNoUHJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODE1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcmVmZXJlbmNlL1N3aXRjaFByZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5wcmVmZXJlbmNlOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQ2hlY2thYmxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlN3aXRjaDsKKworLyoqCisgKiBBIHtAbGluayBQcmVmZXJlbmNlfSB0aGF0IHByb3ZpZGVzIGEgdHdvLXN0YXRlIHRvZ2dsZWFibGUgb3B0aW9uLgorICogPHA+CisgKiBUaGlzIHByZWZlcmVuY2Ugd2lsbCBzdG9yZSBhIGJvb2xlYW4gaW50byB0aGUgU2hhcmVkUHJlZmVyZW5jZXMuCisgKgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoUHJlZmVyZW5jZV9zdW1tYXJ5T2ZmCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hQcmVmZXJlbmNlX3N1bW1hcnlPbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoUHJlZmVyZW5jZV9zd2l0Y2hUZXh0T2ZmCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hQcmVmZXJlbmNlX3N3aXRjaFRleHRPbgorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoUHJlZmVyZW5jZV9kaXNhYmxlRGVwZW5kZW50c1N0YXRlCisgKi8KK3B1YmxpYyBjbGFzcyBTd2l0Y2hQcmVmZXJlbmNlIGV4dGVuZHMgVHdvU3RhdGVQcmVmZXJlbmNlIHsKKyAgICAvLyBTd2l0Y2ggdGV4dCBmb3Igb24gYW5kIG9mZiBzdGF0ZXMKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3dpdGNoT247CisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN3aXRjaE9mZjsKKyAgICBwcml2YXRlIGZpbmFsIExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOworCisgICAgcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyLCBDb21wb3VuZEJ1dHRvbi5PbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgU3dpdGNoUHJlZmVyZW5jZS50aGlzLm9uQ2xpY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICBTd2l0Y2hQcmVmZXJlbmNlLnRoaXMuc2V0Q2hlY2tlZChpc0NoZWNrZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IFN3aXRjaFByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gc3R5bGUgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoYXQgd2lsbCBzdHlsZSB0aGlzIHByZWZlcmVuY2UKKyAgICAgKiBAcGFyYW0gYXR0cnMgU3R5bGUgYXR0cmlidXRlcyB0aGF0IGRpZmZlciBmcm9tIHRoZSBkZWZhdWx0CisgICAgICogQHBhcmFtIGRlZlN0eWxlIFRoZW1lIGF0dHJpYnV0ZSBkZWZpbmluZyB0aGUgZGVmYXVsdCBzdHlsZSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIFN3aXRjaFByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgeworICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Td2l0Y2hQcmVmZXJlbmNlLCBkZWZTdHlsZSwgMCk7CisgICAgICAgIHNldFN1bW1hcnlPbihhLmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Td2l0Y2hQcmVmZXJlbmNlX3N1bW1hcnlPbikpOworICAgICAgICBzZXRTdW1tYXJ5T2ZmKGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlN3aXRjaFByZWZlcmVuY2Vfc3VtbWFyeU9mZikpOworICAgICAgICBzZXRTd2l0Y2hUZXh0T24oYS5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3dpdGNoUHJlZmVyZW5jZV9zd2l0Y2hUZXh0T24pKTsKKyAgICAgICAgc2V0U3dpdGNoVGV4dE9mZihhLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5Td2l0Y2hQcmVmZXJlbmNlX3N3aXRjaFRleHRPZmYpKTsKKyAgICAgICAgc2V0RGlzYWJsZURlcGVuZGVudHNTdGF0ZShhLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3dpdGNoUHJlZmVyZW5jZV9kaXNhYmxlRGVwZW5kZW50c1N0YXRlLCBmYWxzZSkpOworICAgICAgICBhLnJlY3ljbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU3dpdGNoUHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBzdHlsZSBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIENvbnRleHQgdGhhdCB3aWxsIHN0eWxlIHRoaXMgcHJlZmVyZW5jZQorICAgICAqIEBwYXJhbSBhdHRycyBTdHlsZSBhdHRyaWJ1dGVzIHRoYXQgZGlmZmVyIGZyb20gdGhlIGRlZmF1bHQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3dpdGNoUHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmF0dHIuc3dpdGNoUHJlZmVyZW5jZVN0eWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgU3dpdGNoUHJlZmVyZW5jZSB3aXRoIGRlZmF1bHQgc3R5bGUgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IHRoYXQgd2lsbCBzdHlsZSB0aGlzIHByZWZlcmVuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgU3dpdGNoUHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkJpbmRWaWV3KFZpZXcgdmlldykgeworICAgICAgICBzdXBlci5vbkJpbmRWaWV3KHZpZXcpOworCisgICAgICAgIFZpZXcgY2hlY2thYmxlVmlldyA9IHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc3dpdGNoV2lkZ2V0KTsKKyAgICAgICAgaWYgKGNoZWNrYWJsZVZpZXcgIT0gbnVsbCAmJiBjaGVja2FibGVWaWV3IGluc3RhbmNlb2YgQ2hlY2thYmxlKSB7CisgICAgICAgICAgICAoKENoZWNrYWJsZSkgY2hlY2thYmxlVmlldykuc2V0Q2hlY2tlZChtQ2hlY2tlZCk7CisKKyAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRGb3JWaWV3KGNoZWNrYWJsZVZpZXcpOworCisgICAgICAgICAgICBpZiAoY2hlY2thYmxlVmlldyBpbnN0YW5jZW9mIFN3aXRjaCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN3aXRjaCBzd2l0Y2hWaWV3ID0gKFN3aXRjaCkgY2hlY2thYmxlVmlldzsKKyAgICAgICAgICAgICAgICBzd2l0Y2hWaWV3LnNldFRleHRPbihtU3dpdGNoT24pOworICAgICAgICAgICAgICAgIHN3aXRjaFZpZXcuc2V0VGV4dE9mZihtU3dpdGNoT2ZmKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2hWaWV3LnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGVja2FibGVWaWV3Lmhhc0ZvY3VzYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGZvY3VzYWJsZSBsaXN0IGl0ZW0uIEF0dGFjaCBhIGNsaWNrIGhhbmRsZXIgdG8gdG9nZ2xlIHRoZSBidXR0b24KKyAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGl0ZW0uCisgICAgICAgICAgICAgICAgdmlldy5zZXRPbkNsaWNrTGlzdGVuZXIobUxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN5bmNTdW1tYXJ5Vmlldyh2aWV3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSBzd2l0Y2ggd2lkZ2V0IGluIHRoZSBvbiBzdGF0ZS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBhIHZlcnkgc2hvcnQgc3RyaW5nOyBvbmUgd29yZCBpZiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvblRleHQgVGV4dCB0byBkaXNwbGF5IGluIHRoZSBvbiBzdGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN3aXRjaFRleHRPbihDaGFyU2VxdWVuY2Ugb25UZXh0KSB7CisgICAgICAgIG1Td2l0Y2hPbiA9IG9uVGV4dDsKKyAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGV4dCBkaXNwbGF5ZWQgb24gdGhlIHN3aXRjaCB3aWRnZXQgaW4gdGhlIG9mZiBzdGF0ZS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBhIHZlcnkgc2hvcnQgc3RyaW5nOyBvbmUgd29yZCBpZiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZUZXh0IFRleHQgdG8gZGlzcGxheSBpbiB0aGUgb2ZmIHN0YXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dpdGNoVGV4dE9mZihDaGFyU2VxdWVuY2Ugb2ZmVGV4dCkgeworICAgICAgICBtU3dpdGNoT2ZmID0gb2ZmVGV4dDsKKyAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGV4dCBkaXNwbGF5ZWQgb24gdGhlIHN3aXRjaCB3aWRnZXQgaW4gdGhlIG9uIHN0YXRlLgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGEgdmVyeSBzaG9ydCBzdHJpbmc7IG9uZSB3b3JkIGlmIHBvc3NpYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc0lkIFRoZSB0ZXh0IGFzIGEgc3RyaW5nIHJlc291cmNlIElECisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dpdGNoVGV4dE9uKGludCByZXNJZCkgeworICAgICAgICBzZXRTd2l0Y2hUZXh0T24oZ2V0Q29udGV4dCgpLmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdGV4dCBkaXNwbGF5ZWQgb24gdGhlIHN3aXRjaCB3aWRnZXQgaW4gdGhlIG9mZiBzdGF0ZS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSBhIHZlcnkgc2hvcnQgc3RyaW5nOyBvbmUgd29yZCBpZiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNJZCBUaGUgdGV4dCBhcyBhIHN0cmluZyByZXNvdXJjZSBJRAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN3aXRjaFRleHRPZmYoaW50IHJlc0lkKSB7CisgICAgICAgIHNldFN3aXRjaFRleHRPZmYoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhyZXNJZCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRleHQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvbiB0aGUgc3dpdGNoIHdpZGdldCBpbiB0aGUgb24gc3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN3aXRjaFRleHRPbigpIHsKKyAgICAgICAgcmV0dXJuIG1Td2l0Y2hPbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0ZXh0IHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlIHN3aXRjaCB3aWRnZXQgaW4gdGhlIG9mZiBzdGF0ZQorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0U3dpdGNoVGV4dE9mZigpIHsKKyAgICAgICAgcmV0dXJuIG1Td2l0Y2hPZmY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9Ud29TdGF0ZVByZWZlcmVuY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvVHdvU3RhdGVQcmVmZXJlbmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyMWM0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvVHdvU3RhdGVQcmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQucHJlZmVyZW5jZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNoYXJlZFByZWZlcmVuY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogQ29tbW9uIGJhc2UgY2xhc3MgZm9yIHByZWZlcmVuY2VzIHRoYXQgaGF2ZSB0d28gc2VsZWN0YWJsZSBzdGF0ZXMsIHBlcnNpc3QgYQorICogYm9vbGVhbiB2YWx1ZSBpbiBTaGFyZWRQcmVmZXJlbmNlcywgYW5kIG1heSBoYXZlIGRlcGVuZGVudCBwcmVmZXJlbmNlcyB0aGF0IGFyZQorICogZW5hYmxlZC9kaXNhYmxlZCBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFR3b1N0YXRlUHJlZmVyZW5jZSBleHRlbmRzIFByZWZlcmVuY2UgeworCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbVN1bW1hcnlPbjsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtU3VtbWFyeU9mZjsKKyAgICBib29sZWFuIG1DaGVja2VkOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VuZEFjY2Vzc2liaWxpdHlFdmVudFZpZXdDbGlja2VkVHlwZTsKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURpc2FibGVEZXBlbmRlbnRzU3RhdGU7CisKKyAgICBwdWJsaWMgVHdvU3RhdGVQcmVmZXJlbmNlKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKworICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQorICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoU2VydmljZS5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBUd29TdGF0ZVByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworCisgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9CisgICAgICAgICAgICAgICAgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyKSBnZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShTZXJ2aWNlLkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7CisgICAgfQorCisgICAgcHVibGljIFR3b1N0YXRlUHJlZmVyZW5jZShDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKFNlcnZpY2UuQUNDRVNTSUJJTElUWV9TRVJWSUNFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNsaWNrKCkgeworICAgICAgICBzdXBlci5vbkNsaWNrKCk7CisKKyAgICAgICAgYm9vbGVhbiBuZXdWYWx1ZSA9ICFpc0NoZWNrZWQoKTsKKworICAgICAgICAvLyBpbiBvbkJpbmRWaWV3KCkgYW4gQWNjZXNzaWJpbGl0eUV2ZW50Vmlld0NsaWNrZWRUeXBlIGlzIHNlbnQgdG8gYW5ub3VuY2UgdGhlIGNoYW5nZQorICAgICAgICAvLyBub3Qgc2VuZGluZworICAgICAgICBtU2VuZEFjY2Vzc2liaWxpdHlFdmVudFZpZXdDbGlja2VkVHlwZSA9IHRydWU7CisKKyAgICAgICAgaWYgKCFjYWxsQ2hhbmdlTGlzdGVuZXIobmV3VmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXRDaGVja2VkKG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjaGVja2VkIHN0YXRlIGFuZCBzYXZlcyBpdCB0byB0aGUge0BsaW5rIFNoYXJlZFByZWZlcmVuY2VzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGVja2VkIFRoZSBjaGVja2VkIHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIGlmIChtQ2hlY2tlZCAhPSBjaGVja2VkKSB7CisgICAgICAgICAgICBtQ2hlY2tlZCA9IGNoZWNrZWQ7CisgICAgICAgICAgICBwZXJzaXN0Qm9vbGVhbihjaGVja2VkKTsKKyAgICAgICAgICAgIG5vdGlmeURlcGVuZGVuY3lDaGFuZ2Uoc2hvdWxkRGlzYWJsZURlcGVuZGVudHMoKSk7CisgICAgICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGVja2VkIHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgY2hlY2tlZCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgIHJldHVybiBtQ2hlY2tlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREaXNhYmxlRGVwZW5kZW50cygpIHsKKyAgICAgICAgYm9vbGVhbiBzaG91bGREaXNhYmxlID0gbURpc2FibGVEZXBlbmRlbnRzU3RhdGUgPyBtQ2hlY2tlZCA6ICFtQ2hlY2tlZDsKKyAgICAgICAgcmV0dXJuIHNob3VsZERpc2FibGUgfHwgc3VwZXIuc2hvdWxkRGlzYWJsZURlcGVuZGVudHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzdW1tYXJ5IHRvIGJlIHNob3duIHdoZW4gY2hlY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBzdW1tYXJ5IHRvIGJlIHNob3duIHdoZW4gY2hlY2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5T24oQ2hhclNlcXVlbmNlIHN1bW1hcnkpIHsKKyAgICAgICAgbVN1bW1hcnlPbiA9IHN1bW1hcnk7CisgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSAjc2V0U3VtbWFyeU9uKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAcGFyYW0gc3VtbWFyeVJlc0lkIFRoZSBzdW1tYXJ5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9uKGludCBzdW1tYXJ5UmVzSWQpIHsKKyAgICAgICAgc2V0U3VtbWFyeU9uKGdldENvbnRleHQoKS5nZXRTdHJpbmcoc3VtbWFyeVJlc0lkKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3VtbWFyeSB0byBiZSBzaG93biB3aGVuIGNoZWNrZWQuCisgICAgICogQHJldHVybiBUaGUgc3VtbWFyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFN1bW1hcnlPbigpIHsKKyAgICAgICAgcmV0dXJuIG1TdW1tYXJ5T247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3VtbWFyeSB0byBiZSBzaG93biB3aGVuIHVuY2hlY2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBzdW1tYXJ5IHRvIGJlIHNob3duIHdoZW4gdW5jaGVja2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1bW1hcnlPZmYoQ2hhclNlcXVlbmNlIHN1bW1hcnkpIHsKKyAgICAgICAgbVN1bW1hcnlPZmYgPSBzdW1tYXJ5OworICAgICAgICBpZiAoIWlzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICBub3RpZnlDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlICNzZXRTdW1tYXJ5T2ZmKENoYXJTZXF1ZW5jZSkKKyAgICAgKiBAcGFyYW0gc3VtbWFyeVJlc0lkIFRoZSBzdW1tYXJ5IGFzIGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3VtbWFyeU9mZihpbnQgc3VtbWFyeVJlc0lkKSB7CisgICAgICAgIHNldFN1bW1hcnlPZmYoZ2V0Q29udGV4dCgpLmdldFN0cmluZyhzdW1tYXJ5UmVzSWQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdW1tYXJ5IHRvIGJlIHNob3duIHdoZW4gdW5jaGVja2VkLgorICAgICAqIEByZXR1cm4gVGhlIHN1bW1hcnkuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRTdW1tYXJ5T2ZmKCkgeworICAgICAgICByZXR1cm4gbVN1bW1hcnlPZmY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGRlcGVuZGVudHMgYXJlIGRpc2FibGVkIHdoZW4gdGhpcyBwcmVmZXJlbmNlIGlzIG9uICh7QGNvZGUgdHJ1ZX0pCisgICAgICogb3Igd2hlbiB0aGlzIHByZWZlcmVuY2UgaXMgb2ZmICh7QGNvZGUgZmFsc2V9KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciBkZXBlbmRlbnRzIGFyZSBkaXNhYmxlZCB3aGVuIHRoaXMgcHJlZmVyZW5jZSBpcyBvbiAoe0Bjb2RlIHRydWV9KQorICAgICAqICAgICAgICAgb3Igd2hlbiB0aGlzIHByZWZlcmVuY2UgaXMgb2ZmICh7QGNvZGUgZmFsc2V9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREaXNhYmxlRGVwZW5kZW50c1N0YXRlKCkgeworICAgICAgICByZXR1cm4gbURpc2FibGVEZXBlbmRlbnRzU3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIGRlcGVuZGVudHMgYXJlIGRpc2FibGVkIHdoZW4gdGhpcyBwcmVmZXJlbmNlIGlzIG9uICh7QGNvZGUgdHJ1ZX0pCisgICAgICogb3Igd2hlbiB0aGlzIHByZWZlcmVuY2UgaXMgb2ZmICh7QGNvZGUgZmFsc2V9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXNhYmxlRGVwZW5kZW50c1N0YXRlIFRoZSBwcmVmZXJlbmNlIHN0YXRlIHRoYXQgc2hvdWxkIGRpc2FibGUgZGVwZW5kZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREaXNhYmxlRGVwZW5kZW50c1N0YXRlKGJvb2xlYW4gZGlzYWJsZURlcGVuZGVudHNTdGF0ZSkgeworICAgICAgICBtRGlzYWJsZURlcGVuZGVudHNTdGF0ZSA9IGRpc2FibGVEZXBlbmRlbnRzU3RhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCBvbkdldERlZmF1bHRWYWx1ZShUeXBlZEFycmF5IGEsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gYS5nZXRCb29sZWFuKGluZGV4LCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TZXRJbml0aWFsVmFsdWUoYm9vbGVhbiByZXN0b3JlVmFsdWUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgc2V0Q2hlY2tlZChyZXN0b3JlVmFsdWUgPyBnZXRQZXJzaXN0ZWRCb29sZWFuKG1DaGVja2VkKQorICAgICAgICAgICAgICAgIDogKEJvb2xlYW4pIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZCBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50IGZvciB0aGUgZ2l2ZW4gdmlldyBpZiBhcHByb3ByaWF0ZQorICAgICAqIEBwYXJhbSB2aWV3IFZpZXcgdGhhdCBzaG91bGQgc2VuZCB0aGUgZXZlbnQKKyAgICAgKi8KKyAgICB2b2lkIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRGb3JWaWV3KFZpZXcgdmlldykgeworICAgICAgICAvLyBzZW5kIGFuIGV2ZW50IHRvIGFubm91bmNlIHRoZSB2YWx1ZSBjaGFuZ2Ugb2YgdGhlIHN0YXRlLiBJdCBpcyBkb25lIGhlcmUKKyAgICAgICAgLy8gYmVjYXVzZSBjbGlja2luZyBhIHByZWZlcmVuY2UgZG9lcyBub3QgaW1tZWRpYXRlbHkgY2hhbmdlIHRoZSBjaGVja2VkIHN0YXRlCisgICAgICAgIC8vIGZvciBleGFtcGxlIHdoZW4gZW5hYmxpbmcgdGhlIFdpRmkKKyAgICAgICAgaWYgKG1TZW5kQWNjZXNzaWJpbGl0eUV2ZW50Vmlld0NsaWNrZWRUeXBlICYmCisgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpICYmCisgICAgICAgICAgICAgICAgdmlldy5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbVNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRWaWV3Q2xpY2tlZFR5cGUgPSBmYWxzZTsKKworICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfQ0xJQ0tFRDsKKyAgICAgICAgICAgIHZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudFVuY2hlY2tlZChBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKGV2ZW50VHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3luYyBhIHN1bW1hcnkgdmlldyBjb250YWluZWQgd2l0aGluIHZpZXcncyBzdWJoaWVyYXJjaHkgd2l0aCB0aGUgY29ycmVjdCBzdW1tYXJ5IHRleHQuCisgICAgICogQHBhcmFtIHZpZXcgVmlldyB3aGVyZSBhIHN1bW1hcnkgc2hvdWxkIGJlIGxvY2F0ZWQKKyAgICAgKi8KKyAgICB2b2lkIHN5bmNTdW1tYXJ5VmlldyhWaWV3IHZpZXcpIHsKKyAgICAgICAgLy8gU3luYyB0aGUgc3VtbWFyeSB2aWV3CisgICAgICAgIFRleHRWaWV3IHN1bW1hcnlWaWV3ID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnN1bW1hcnkpOworICAgICAgICBpZiAoc3VtbWFyeVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiB1c2VEZWZhdWx0U3VtbWFyeSA9IHRydWU7CisgICAgICAgICAgICBpZiAobUNoZWNrZWQgJiYgbVN1bW1hcnlPbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3VtbWFyeVZpZXcuc2V0VGV4dChtU3VtbWFyeU9uKTsKKyAgICAgICAgICAgICAgICB1c2VEZWZhdWx0U3VtbWFyeSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbUNoZWNrZWQgJiYgbVN1bW1hcnlPZmYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1bW1hcnlWaWV3LnNldFRleHQobVN1bW1hcnlPZmYpOworICAgICAgICAgICAgICAgIHVzZURlZmF1bHRTdW1tYXJ5ID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1c2VEZWZhdWx0U3VtbWFyeSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBzdW1tYXJ5ID0gZ2V0U3VtbWFyeSgpOworICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVZpZXcuc2V0VGV4dChzdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgdXNlRGVmYXVsdFN1bW1hcnkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBuZXdWaXNpYmlsaXR5ID0gVmlldy5HT05FOworICAgICAgICAgICAgaWYgKCF1c2VEZWZhdWx0U3VtbWFyeSkgeworICAgICAgICAgICAgICAgIC8vIFNvbWVvbmUgaGFzIHdyaXR0ZW4gdG8gaXQKKyAgICAgICAgICAgICAgICBuZXdWaXNpYmlsaXR5ID0gVmlldy5WSVNJQkxFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1Zpc2liaWxpdHkgIT0gc3VtbWFyeVZpZXcuZ2V0VmlzaWJpbGl0eSgpKSB7CisgICAgICAgICAgICAgICAgc3VtbWFyeVZpZXcuc2V0VmlzaWJpbGl0eShuZXdWaXNpYmlsaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXJjZWxhYmxlIG9uU2F2ZUluc3RhbmNlU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIFBhcmNlbGFibGUgc3VwZXJTdGF0ZSA9IHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUoKTsKKyAgICAgICAgaWYgKGlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHNhdmUgaW5zdGFuY2Ugc3RhdGUgc2luY2UgaXQncyBwZXJzaXN0ZW50CisgICAgICAgICAgICByZXR1cm4gc3VwZXJTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IG5ldyBTYXZlZFN0YXRlKHN1cGVyU3RhdGUpOworICAgICAgICBteVN0YXRlLmNoZWNrZWQgPSBpc0NoZWNrZWQoKTsKKyAgICAgICAgcmV0dXJuIG15U3RhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShQYXJjZWxhYmxlIHN0YXRlKSB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsIHx8ICFzdGF0ZS5nZXRDbGFzcygpLmVxdWFscyhTYXZlZFN0YXRlLmNsYXNzKSkgeworICAgICAgICAgICAgLy8gRGlkbid0IHNhdmUgc3RhdGUgZm9yIHVzIGluIG9uU2F2ZUluc3RhbmNlU3RhdGUKKyAgICAgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgU2F2ZWRTdGF0ZSBteVN0YXRlID0gKFNhdmVkU3RhdGUpIHN0YXRlOworICAgICAgICBzdXBlci5vblJlc3RvcmVJbnN0YW5jZVN0YXRlKG15U3RhdGUuZ2V0U3VwZXJTdGF0ZSgpKTsKKyAgICAgICAgc2V0Q2hlY2tlZChteVN0YXRlLmNoZWNrZWQpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTYXZlZFN0YXRlIGV4dGVuZHMgQmFzZVNhdmVkU3RhdGUgeworICAgICAgICBib29sZWFuIGNoZWNrZWQ7CisKKyAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgeworICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKKyAgICAgICAgICAgIGNoZWNrZWQgPSBzb3VyY2UucmVhZEludCgpID09IDE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVJbnQoY2hlY2tlZCA/IDEgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlKFBhcmNlbGFibGUgc3VwZXJTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIoc3VwZXJTdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPiBDUkVBVE9SID0KKyAgICAgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFNhdmVkU3RhdGU+KCkgeworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUgY3JlYXRlRnJvbVBhcmNlbChQYXJjZWwgaW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhdmVkU3RhdGUoaW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgU2F2ZWRTdGF0ZVtdIG5ld0FycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlW3NpemVdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ByZWZlcmVuY2UvVm9sdW1lUHJlZmVyZW5jZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9Wb2x1bWVQcmVmZXJlbmNlLmphdmEKaW5kZXggM2IxMjc4MC4uYjQ4ZThjZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9Wb2x1bWVQcmVmZXJlbmNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJlZmVyZW5jZS9Wb2x1bWVQcmVmZXJlbmNlLmphdmEKQEAgLTM4LDE5ICszOCwxOSBAQAogLyoqCiAgKiBAaGlkZQogICovCi1wdWJsaWMgY2xhc3MgVm9sdW1lUHJlZmVyZW5jZSBleHRlbmRzIFNlZWtCYXJQcmVmZXJlbmNlIGltcGxlbWVudHMgCitwdWJsaWMgY2xhc3MgVm9sdW1lUHJlZmVyZW5jZSBleHRlbmRzIFNlZWtCYXJEaWFsb2dQcmVmZXJlbmNlIGltcGxlbWVudHMKICAgICAgICAgUHJlZmVyZW5jZU1hbmFnZXIuT25BY3Rpdml0eVN0b3BMaXN0ZW5lciwgVmlldy5PbktleUxpc3RlbmVyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVm9sdW1lUHJlZmVyZW5jZSI7Ci0gICAgCisKICAgICBwcml2YXRlIGludCBtU3RyZWFtVHlwZTsKIAogICAgIC8qKiBNYXkgYmUgbnVsbCBpZiB0aGUgZGlhbG9nIGlzbid0IHZpc2libGUuICovCiAgICAgcHJpdmF0ZSBTZWVrQmFyVm9sdW1pemVyIG1TZWVrQmFyVm9sdW1pemVyOwotICAgIAorCiAgICAgcHVibGljIFZvbHVtZVByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAKKwogICAgICAgICBUeXBlZEFycmF5IGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVm9sdW1lUHJlZmVyZW5jZSwgMCwgMCk7CiAgICAgICAgIG1TdHJlYW1UeXBlID0gYS5nZXRJbnQoYW5kcm9pZC5SLnN0eWxlYWJsZS5Wb2x1bWVQcmVmZXJlbmNlX3N0cmVhbVR5cGUsIDApOwpAQCAtNjQsNyArNjQsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQmluZERpYWxvZ1ZpZXcoVmlldyB2aWV3KSB7CiAgICAgICAgIHN1cGVyLm9uQmluZERpYWxvZ1ZpZXcodmlldyk7Ci0gICAgCisKICAgICAgICAgZmluYWwgU2Vla0JhciBzZWVrQmFyID0gKFNlZWtCYXIpIHZpZXcuZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuc2Vla2Jhcik7CiAgICAgICAgIG1TZWVrQmFyVm9sdW1pemVyID0gbmV3IFNlZWtCYXJWb2x1bWl6ZXIoZ2V0Q29udGV4dCgpLCBzZWVrQmFyLCBtU3RyZWFtVHlwZSk7CiAKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uRGlhbG9nQ2xvc2VkKGJvb2xlYW4gcG9zaXRpdmVSZXN1bHQpIHsKICAgICAgICAgc3VwZXIub25EaWFsb2dDbG9zZWQocG9zaXRpdmVSZXN1bHQpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIXBvc2l0aXZlUmVzdWx0ICYmIG1TZWVrQmFyVm9sdW1pemVyICE9IG51bGwpIHsKICAgICAgICAgICAgIG1TZWVrQmFyVm9sdW1pemVyLnJldmVydFZvbHVtZSgpOwogICAgICAgICB9CkBAIC0yMjIsMTYgKzIyMiwxNiBAQAogCiAgICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAKKwogICAgICAgICBwcml2YXRlIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwogICAgICAgICBwcml2YXRlIGludCBtU3RyZWFtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsU3RyZWFtVm9sdW1lOyAKKyAgICAgICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsU3RyZWFtVm9sdW1lOwogICAgICAgICBwcml2YXRlIFJpbmd0b25lIG1SaW5ndG9uZTsKLSAgICAKKwogICAgICAgICBwcml2YXRlIGludCBtTGFzdFByb2dyZXNzID0gLTE7CiAgICAgICAgIHByaXZhdGUgU2Vla0JhciBtU2Vla0JhcjsKICAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUJlZm9yZU11dGUgPSAtMTsKLSAgICAgICAgCisKICAgICAgICAgcHJpdmF0ZSBDb250ZW50T2JzZXJ2ZXIgbVZvbHVtZU9ic2VydmVyID0gbmV3IENvbnRlbnRPYnNlcnZlcihtSGFuZGxlcikgewogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgICAgICAgICAgbU9yaWdpbmFsU3RyZWFtVm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUobVN0cmVhbVR5cGUpOwogICAgICAgICAgICAgc2Vla0Jhci5zZXRQcm9ncmVzcyhtT3JpZ2luYWxTdHJlYW1Wb2x1bWUpOwogICAgICAgICAgICAgc2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFVyaUZvcihTeXN0ZW0uVk9MVU1FX1NFVFRJTkdTW21TdHJlYW1UeXBlXSksCiAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBtVm9sdW1lT2JzZXJ2ZXIpOwpAQCAtMjkwLDE3ICsyOTAsMTcgQEAKICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLnVucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIobVZvbHVtZU9ic2VydmVyKTsKICAgICAgICAgICAgIG1TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG51bGwpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyB2b2lkIHJldmVydFZvbHVtZSgpIHsKICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKG1TdHJlYW1UeXBlLCBtT3JpZ2luYWxTdHJlYW1Wb2x1bWUsIDApOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAogICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVRvdWNoKSB7CiAgICAgICAgICAgICBpZiAoIWZyb21Ub3VjaCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAKKwogICAgICAgICAgICAgcG9zdFNldFZvbHVtZShwcm9ncmVzcyk7CiAgICAgICAgIH0KIApAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7CiAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KHRoaXMpOwogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CiAgICAgICAgIH0KIApAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgICAgICAgICAgICAgc3RhcnRTYW1wbGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShtU3RyZWFtVHlwZSwgbUxhc3RQcm9ncmVzcywgMCk7CiAgICAgICAgIH0KQEAgLTMzNCw3ICszMzQsNyBAQAogICAgICAgICAgICAgICAgIG1SaW5ndG9uZS5wbGF5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBzdG9wU2FtcGxlKCkgewogICAgICAgICAgICAgaWYgKG1SaW5ndG9uZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVJpbmd0b25lLnN0b3AoKTsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgICAgICBwdWJsaWMgU2Vla0JhciBnZXRTZWVrQmFyKCkgewogICAgICAgICAgICAgcmV0dXJuIG1TZWVrQmFyOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyB2b2lkIGNoYW5nZVZvbHVtZUJ5KGludCBhbW91bnQpIHsKICAgICAgICAgICAgIG1TZWVrQmFyLmluY3JlbWVudFByb2dyZXNzQnkoYW1vdW50KTsKICAgICAgICAgICAgIGlmICghaXNTYW1wbGVQbGF5aW5nKCkpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDYxNGRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQucHJvdmlkZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKLWltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQucGltLklDYWxlbmRhcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi0vKioKLSAqIFRoZSBDYWxlbmRhciBwcm92aWRlciBjb250YWlucyBhbGwgY2FsZW5kYXIgZXZlbnRzLgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYWxlbmRhciB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FsZW5kYXIiOwotCi0gICAgLyoqCi0gICAgICogQnJvYWRjYXN0IEFjdGlvbjogQW4gZXZlbnQgcmVtaW5kZXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfUkVNSU5ERVJfQUNUSU9OID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5FVkVOVF9SRU1JTkRFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGVzZSBhcmUgdGhlIHN5bWJvbGljIG5hbWVzIGZvciB0aGUga2V5cyB1c2VkIGluIHRoZSBleHRyYSBkYXRhCi0gICAgICogcGFzc2VkIGluIHRoZSBpbnRlbnQgZm9yIGV2ZW50IHJlbWluZGVycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9CRUdJTl9USU1FID0gImJlZ2luVGltZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfRU5EX1RJTUUgPSAiZW5kVGltZSI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG11c3Qgbm90IGJlIGNoYW5nZWQgb3IgaG9ycmlibGUsIHVuc3BlYWthYmxlIHRoaW5ncyBjb3VsZCBoYXBwZW4uCi0gICAgICogRm9yIGluc3RhbmNlLCB0aGUgQ2FsZW5kYXIgYXBwIG1pZ2h0IGJyZWFrLiBBbHNvLCB0aGUgZGIgbWlnaHQgbm90IHdvcmsuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5hbmRyb2lkLmNhbGVuZGFyIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhlIHRvcC1sZXZlbCBjYWxlbmRhciBhdXRob3JpdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9Ci0gICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkpOwotCi0gICAgLyoqCi0gICAgICogQW4gb3B0aW9uYWwgaW5zZXJ0LCB1cGRhdGUgb3IgZGVsZXRlIFVSSSBwYXJhbWV0ZXIgdGhhdCBhbGxvd3MgdGhlIGNhbGxlcgotICAgICAqIHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBhIHN5bmMgYWRhcHRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIElmIHRydWUKLSAgICAgKiB0aGUgZGlydHkgZmxhZyBpcyBub3QgYXV0b21hdGljYWxseSBzZXQgYW5kIHRoZSAic3luY1RvTmV0d29yayIgcGFyYW1ldGVyCi0gICAgICogaXMgc2V0IHRvIGZhbHNlIHdoZW4gY2FsbGluZwotICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKGFuZHJvaWQubmV0LlVyaSwgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKLQotCi0gICAgLyoqCi0gICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZgotICAgICAqIHRoZXNlIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJCi0gICAgICogc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoaXMgY29sdW1uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQmFzZVN5bmNDb2x1bW5zIHsKLQotICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DMSA9ICJzeW5jMSI7Ci0gICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkMyID0gInN5bmMyIjsKLSAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzMgPSAic3luYzMiOwotICAgICAgICAvKiogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DNCA9ICJzeW5jNCI7Ci0gICAgICAgIC8qKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkM1ID0gInN5bmM1IjsKLSAgICAgICAgLyoqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQzYgPSAic3luYzYiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbHVtbnMgZm9yIFN5bmMgaW5mb3JtYXRpb24gdXNlZCBieSBDYWxlbmRhcnMgYW5kIEV2ZW50cyB0YWJsZXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTeW5jQ29sdW1ucyBleHRlbmRzIEJhc2VTeW5jQ29sdW1ucyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUgZGV2aWNlLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVF9UWVBFID0gImFjY291bnRfdHlwZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIGEgcm93IGFzc2lnbmVkIGJ5IHRoZSBzeW5jIHNvdXJjZS4gTlVMTCBpZiB0aGUgcm93IGhhcyBuZXZlciBiZWVuIHN5bmNlZC4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIF9TWU5DX0lEID0gIl9zeW5jX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxhc3QgdGltZSwgZnJvbSB0aGUgc3luYyBzb3VyY2UncyBwb2ludCBvZiB2aWV3LCB0aGF0IHRoaXMgcm93IGhhcyBiZWVuIHN5bmNocm9uaXplZC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19USU1FID0gIl9zeW5jX3RpbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcm93LCBhcyBhc3NpZ25lZCBieSB0aGUgc2VydmVyLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfVkVSU0lPTiA9ICJfc3luY192ZXJzaW9uIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCBvbmx5IGluIHBlcnNpc3RlbnQgcHJvdmlkZXJzLCBhbmQgb25seSBkdXJpbmcgbWVyZ2luZy4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfU1lOQ19NQVJLID0gIl9zeW5jX21hcmsiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUlRZID0gImRpcnR5IjsKLQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbHVtbnMgZnJvbSB0aGUgQ2FsZW5kYXJzIHRhYmxlIHRoYXQgb3RoZXIgdGFibGVzIGpvaW4gaW50byB0aGVtc2VsdmVzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzQ29sdW1ucyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY29sb3Igb2YgdGhlIGNhbGVuZGFyCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGNvbG9yIHZhbHVlKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTEVOREFSX0NPTE9SID0gImNhbGVuZGFyX2NvbG9yIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxldmVsIG9mIGFjY2VzcyB0aGF0IHRoZSB1c2VyIGhhcyBmb3IgdGhlIGNhbGVuZGFyCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKG9uZSBvZiB0aGUgdmFsdWVzIGJlbG93KTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU19MRVZFTCA9ICJhY2Nlc3NfbGV2ZWwiOwotCi0gICAgICAgIC8qKiBDYW5ub3QgYWNjZXNzIHRoZSBjYWxlbmRhciAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19BQ0NFU1MgPSAwOwotICAgICAgICAvKiogQ2FuIG9ubHkgc2VlIGZyZWUvYnVzeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2FsZW5kYXIgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJFRUJVU1lfQUNDRVNTID0gMTAwOwotICAgICAgICAvKiogQ2FuIHJlYWQgYWxsIGV2ZW50IGRldGFpbHMgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9BQ0NFU1MgPSAyMDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1BPTkRfQUNDRVNTID0gMzAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVkVSUklERV9BQ0NFU1MgPSA0MDA7Ci0gICAgICAgIC8qKiBGdWxsIGFjY2VzcyB0byBtb2RpZnkgdGhlIGNhbGVuZGFyLCBidXQgbm90IHRoZSBhY2Nlc3MgY29udHJvbCBzZXR0aW5ncyAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05UUklCVVRPUl9BQ0NFU1MgPSA1MDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRPUl9BQ0NFU1MgPSA2MDA7Ci0gICAgICAgIC8qKiBGdWxsIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1dORVJfQUNDRVNTID0gNzAwOwotICAgICAgICAvKiogRG9tYWluIGFkbWluICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPT1RfQUNDRVNTID0gODAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJcyB0aGUgY2FsZW5kYXIgc2VsZWN0ZWQgdG8gYmUgZGlzcGxheWVkPwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lCTEUgPSAidmlzaWJsZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lem9uZSB0aGUgY2FsZW5kYXIncyBldmVudHMgb2NjdXJzIGluCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9USU1FWk9ORSA9ICJjYWxlbmRhcl90aW1lem9uZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHRoaXMgY2FsZW5kYXIgaXMgaW4gdGhlIGxpc3Qgb2YgY2FsZW5kYXJzIHRoYXQgYXJlIHNlbGVjdGVkIGZvcgotICAgICAgICAgKiBzeW5jaW5nIHRoZW4gInN5bmNfZXZlbnRzIiBpcyAxLCBvdGhlcndpc2UgMC4KLSAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0VWRU5UUyA9ICJzeW5jX2V2ZW50cyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN5bmMgc3RhdGUgZGF0YS4KLSAgICAgICAgICogPHA+VHlwZTogU3RyaW5nIChibG9iKTwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfU1RBVEUgPSAic3luY19zdGF0ZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdGhlIHJvdyBoYXMgYmVlbiBkZWxldGVkLiAgQSBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEID0gImRlbGV0ZWQiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIENhbGVuZGFyIEVudGl0eS4gVGhlcmUgaXMgb25lIGVudHJ5IHBlciBjYWxlbmRhci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFyc0VudGl0eSBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKLSAgICAgICAgICAgICAgICAiL2NhbGVuZGFyX2VudGl0aWVzIik7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLAotICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCBwcm92aWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlJdGVyYXRvckltcGwgZXh0ZW5kcyBDdXJzb3JFbnRpdHlJdGVyYXRvciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKLSAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgewotICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgbVJlc29sdmVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRW50aXR5IGdldEVudGl0eUFuZEluY3JlbWVudEN1cnNvcihDdXJzb3IgY3Vyc29yKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBleHBlY3QgdGhlIGN1cnNvciBpcyBhbHJlYWR5IGF0IHRoZSByb3cgd2UgbmVlZCB0byByZWFkIGZyb20KLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGNhbGVuZGFySWQgPSBjdXJzb3IuZ2V0TG9uZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KF9JRCkpOwotCi0gICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb250ZW50IHZhbHVlCi0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgY3YucHV0KF9JRCwgY2FsZW5kYXJJZCk7Ci0KLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBQ0NPVU5UX05BTUUpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEFDQ09VTlRfVFlQRSk7Ci0KLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19JRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfVElNRSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERJUlRZKTsKLQotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DMSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkMyKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzMpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENhbGVuZGFycy5TWU5DNCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLlNZTkM1KTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuU1lOQzYpOwotCi0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ2FsZW5kYXJzLk5BTUUpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuRElTUExBWV9OQU1FKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuQ0FMRU5EQVJfQ09MT1IpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEFDQ0VTU19MRVZFTCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19FVkVOVFMpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuQ0FMRU5EQVJfTE9DQVRJT04pOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTEVOREFSX1RJTUVaT05FKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk9XTkVSX0FDQ09VTlQpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuQ0FOX09SR0FOSVpFUl9SRVNQT05EKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkNBTl9NT0RJRllfVElNRV9aT05FKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLk1BWF9SRU1JTkRFUlMpOwotCi0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIEVudGl0eSBmcm9tIHRoZSBDb250ZW50VmFsdWUKLSAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEVudGl0eShjdik7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZXQgY3Vyc29yIHRvIG5leHQgcm93Ci0gICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY3JlYXRlZCBFbnRpdHkKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRhaW5zIGEgbGlzdCBvZiBhdmFpbGFibGUgY2FsZW5kYXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLAotICAgICAgICAgICAgQ2FsZW5kYXJzQ29sdW1ucwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0RFTEVURV9GT1JfQUNDT1VOVCA9IENhbGVuZGFycy5BQ0NPVU5UX05BTUUgKyAiPT8iCi0gICAgICAgICAgICAgICAgKyAiIEFORCAiCi0gICAgICAgICAgICAgICAgKyBDYWxlbmRhcnMuQUNDT1VOVF9UWVBFICsgIj0/IjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIHdoZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgcGVyZm9ybSBhIGRlbGV0ZSBvbiB0aGUgQ2FsZW5kYXIgcHJvdmlkZXIKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgcm93cyB0byBkZWxldGUKLSAgICAgICAgICogQHJldHVybiB0aGUgY291bnQgb2Ygcm93cyB0aGF0IHdlcmUgZGVsZXRlZAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZGVsZXRlKENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNyLmRlbGV0ZShDT05URU5UX1VSSSwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGVsZXRlIGFsbCBjYWxlbmRhcnMgdGhhdCBtYXRjaCB0aGUgYWNjb3VudC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKLSAgICAgICAgICogQHBhcmFtIGFjY291bnQgdGhlIGFjY291bnQgd2hvc2Ugcm93cyBzaG91bGQgYmUgZGVsZXRlZAotICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiByb3dzIHRoYXQgd2VyZSBkZWxldGVkCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBkZWxldGVDYWxlbmRhcnNGb3JBY2NvdW50KENvbnRlbnRSZXNvbHZlciBjciwgQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgICAgICAvLyBkZWxldGUgYWxsIGNhbGVuZGFycyB0aGF0IG1hdGNoIHRoaXMgYWNjb3VudAotICAgICAgICAgICAgcmV0dXJuIENhbGVuZGFyLkNhbGVuZGFycy5kZWxldGUoY3IsCi0gICAgICAgICAgICAgICAgICAgIFdIRVJFX0RFTEVURV9GT1JfQUNDT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgYWNjb3VudC5uYW1lLCBhY2NvdW50LnR5cGUgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2NhbGVuZGFycyIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiZGlzcGxheU5hbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgVVJMIHRvIHRoZSBjYWxlbmRhcgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMID0gInVybCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBVUkwgZm9yIHRoZSBjYWxlbmRhciBpdHNlbGYKLSAgICAgICAgICogPFA+VHlwZTogVEVYVCAoVVJMKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEZfVVJMID0gInNlbGZVcmwiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgVVJMIGZvciB0aGUgY2FsZW5kYXIgdG8gYmUgZWRpdGVkCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKFVSTCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX1VSTCA9ICJlZGl0VXJsIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFVSTCBmb3IgdGhlIGNhbGVuZGFyIGV2ZW50cwotICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChVUkwpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRTX1VSTCA9ICJldmVudHNVcmwiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIKLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNhbGVuZGFyCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQTEFZX05BTUUgPSAiZGlzcGxheU5hbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbG9jYXRpb24gdGhlIG9mIHRoZSBldmVudHMgaW4gdGhlIGNhbGVuZGFyCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9MT0NBVElPTiA9ICJjYWxlbmRhcl9sb2NhdGlvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBvd25lciBhY2NvdW50IGZvciB0aGlzIGNhbGVuZGFyLCBiYXNlZCBvbiB0aGUgY2FsZW5kYXIgZmVlZC4KLSAgICAgICAgICogVGhpcyB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBfU1lOQ19BQ0NPVU5UIGZvciBkZWxlZ2F0ZWQgY2FsZW5kYXJzLgotICAgICAgICAgKiA8UD5UeXBlOiBTdHJpbmc8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05FUl9BQ0NPVU5UID0gIm93bmVyQWNjb3VudCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbiB0aGUgb3JnYW5pemVyIHJlc3BvbmQgdG8gdGhlIGV2ZW50PyAgSWYgbm8sIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICAgICAqIG9yZ2FuaXplciBzaG91bGQgbm90IGJlIHNob3duIGJ5IHRoZSBVSS4gIERlZmF1bHRzIHRvIDEKLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5fT1JHQU5JWkVSX1JFU1BPTkQgPSAiY2FuT3JnYW5pemVyUmVzcG9uZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbiB0aGUgb3JnYW5pemVyIG1vZGlmeSB0aGUgdGltZSB6b25lIG9mIHRoZSBldmVudD8KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTl9NT0RJRllfVElNRV9aT05FID0gImNhbk1vZGlmeVRpbWVab25lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlbWluZGVycyBhbGxvd2VkIGZvciBhbiBldmVudC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9SRU1JTkRFUlMgPSAibWF4UmVtaW5kZXJzIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlbWluZGVycyBhbGxvd2VkIGZvciBhbiBldmVudC4KLSAgICAgICAgICogPFA+Ci0gICAgICAgICAqIFR5cGU6IElOVEVHRVIKLSAgICAgICAgICogPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dFRF9SRU1JTkRFUlMgPSAiYWxsb3dlZFJlbWluZGVycyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0YWJsZSBieSBhIHN5bmMgYWRhcHRlci4gVG8gbW9kaWZ5IHRoZW0gdGhlCi0gICAgICAgICAqIGNhbGxlciBtdXN0IGluY2x1ZGUgQ0FMTEVSX0lTX1NZTkNBREFQVEVSLCBfU1lOQ19BQ0NPVU5ULCBhbmQKLSAgICAgICAgICogX1NZTkNfQUNDT1VOVF9UWVBFIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTWU5DX1dSSVRBQkxFX0NPTFVNTlMgPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgQUNDT1VOVF9OQU1FLAotICAgICAgICAgICAgQUNDT1VOVF9UWVBFLAotICAgICAgICAgICAgX1NZTkNfSUQsCi0gICAgICAgICAgICBfU1lOQ19USU1FLAotICAgICAgICAgICAgX1NZTkNfVkVSU0lPTiwKLSAgICAgICAgICAgIERJUlRZLAotICAgICAgICAgICAgT1dORVJfQUNDT1VOVCwKLSAgICAgICAgICAgIE1BWF9SRU1JTkRFUlMsCi0gICAgICAgICAgICBDQU5fTU9ESUZZX1RJTUVfWk9ORSwKLSAgICAgICAgICAgIENBTl9PUkdBTklaRVJfUkVTUE9ORCwKLSAgICAgICAgICAgIENBTEVOREFSX0xPQ0FUSU9OLAotICAgICAgICAgICAgQ0FMRU5EQVJfVElNRVpPTkUsCi0gICAgICAgICAgICBBQ0NFU1NfTEVWRUwsCi0gICAgICAgICAgICBERUxFVEVELAotICAgICAgICAgICAgU1lOQzEsCi0gICAgICAgICAgICBTWU5DMiwKLSAgICAgICAgICAgIFNZTkMzLAotICAgICAgICAgICAgU1lOQzQsCi0gICAgICAgICAgICBTWU5DNSwKLSAgICAgICAgICAgIFNZTkM2LAotICAgICAgICAgICAgU1lOQ19TVEFURSwKLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEF0dGVuZGVlcyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgaWQgb2YgdGhlIGV2ZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfSUQgPSAiZXZlbnRfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0ZW5kZWUuCi0gICAgICAgICAqIDxQPlR5cGU6IFNUUklORzwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEVOREVFX05BTUUgPSAiYXR0ZW5kZWVOYW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIGF0dGVuZGVlLgotICAgICAgICAgKiA8UD5UeXBlOiBTVFJJTkc8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9FTUFJTCA9ICJhdHRlbmRlZUVtYWlsIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYXR0ZW5kZWUgdG8gdGhlIHVzZXIuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKG9uZSBvZiB7QGxpbmsgI1JFTEFUSU9OU0hJUF9BVFRFTkRFRX0sIC4uLn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9SRUxBVElPTlNISVAgPSAiYXR0ZW5kZWVSZWxhdGlvbnNoaXAiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OU0hJUF9OT05FID0gMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05TSElQX0FUVEVOREVFID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05TSElQX09SR0FOSVpFUiA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OU0hJUF9QRVJGT1JNRVIgPSAzOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTlNISVBfU1BFQUtFUiA9IDQ7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0eXBlIG9mIGF0dGVuZGVlLgotICAgICAgICAgKiA8UD5UeXBlOiBJbnRlZ2VyIChvbmUgb2Yge0BsaW5rICNUWVBFX1JFUVVJUkVEfSwge0BsaW5rICNUWVBFX09QVElPTkFMfSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEVOREVFX1RZUEUgPSAiYXR0ZW5kZWVUeXBlIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05PTkUgPSAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JFUVVJUkVEID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9PUFRJT05BTCA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhdHRlbmRhbmNlIHN0YXR1cyBvZiB0aGUgYXR0ZW5kZWUuCi0gICAgICAgICAqIDxQPlR5cGU6IEludGVnZXIgKG9uZSBvZiB7QGxpbmsgI0FUVEVOREVFX1NUQVRVU19BQ0NFUFRFRH0sIC4uLn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9TVEFUVVMgPSAiYXR0ZW5kZWVTdGF0dXMiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVEVOREVFX1NUQVRVU19OT05FID0gMDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0FDQ0VQVEVEID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0RFQ0xJTkVEID0gMjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0lOVklURUQgPSAzOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRFTkRFRV9TVEFUVVNfVEVOVEFUSVZFID0gNDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEF0dGVuZGVlcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBBdHRlbmRlZXNDb2x1bW5zLCBFdmVudHNDb2x1bW5zIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9hdHRlbmRlZXMiKTsKLQotICAgICAgICAvLyBUT0RPOiBmaWxsIG91dCB0aGlzIGNsYXNzIHdoZW4gd2UgYWN0dWFsbHkgc3RhcnQgdXRpbGl6aW5nIGF0dGVuZGVlcwotICAgICAgICAvLyBpbiB0aGUgY2FsZW5kYXIgYXBwbGljYXRpb24uCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZvciB1c2UgYnkgc3luYyBhZGFwdGVyIGF0IGl0cyBkaXNjcmV0aW9uOyBub3QgbW9kaWZpZWQgYnkgQ2FsZW5kYXJQcm92aWRlcgotICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb2x1bW4gd2FzIGZvcm1lcmx5IG5hbWVkIF9TWU5DX0xPQ0FMX0lELiAgV2UgYXJlIHVzaW5nIGl0IHRvIGF2b2lkIGEKLSAgICAgICAgICogc2NoZW1hIGNoYW5nZS4KLSAgICAgICAgICogVE9ETyBSZXBsYWNlIHRoaXMgd2l0aCBzb21ldGhpbmcgbW9yZSBnZW5lcmFsIGluIHRoZSBmdXR1cmUuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfREFUQSA9ICJfc3luY19sb2NhbF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBjYWxlbmRhciB0aGUgZXZlbnQgYmVsb25ncyB0bwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChmb3JlaWduIGtleSB0byB0aGUgQ2FsZW5kYXJzIHRhYmxlKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTEVOREFSX0lEID0gImNhbGVuZGFyX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFVSSSBmb3IgYW4gSFRNTCB2ZXJzaW9uIG9mIHRoaXMgZXZlbnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1VSSSA9ICJodG1sVXJpIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpdGxlIG9mIHRoZSBldmVudAotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50Ci0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXJlIHRoZSBldmVudCB0YWtlcyBwbGFjZS4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0xPQ0FUSU9OID0gImV2ZW50TG9jYXRpb24iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZXZlbnQgc3RhdHVzCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVMgPSAiZXZlbnRTdGF0dXMiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19URU5UQVRJVkUgPSAwOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfQ09ORklSTUVEID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NBTkNFTEVEID0gMjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIGF0dGVuZGVlIHN0YXR1cyBmb3IgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQuCi0gICAgICAgICAqIFRoaXMgZmllbGQgaXMgY29waWVkIGhlcmUgc28gdGhhdCB3ZSBjYW4gZWZmaWNpZW50bHkgZmlsdGVyIG91dAotICAgICAgICAgKiBldmVudHMgdGhhdCBhcmUgZGVjbGluZWQgd2l0aG91dCBoYXZpbmcgdG8gbG9vayBpbiB0aGUgQXR0ZW5kZWVzCi0gICAgICAgICAqIHRhYmxlLgotICAgICAgICAgKgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRl9BVFRFTkRFRV9TVEFUVVMgPSAic2VsZkF0dGVuZGVlU3RhdHVzIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBjb2x1bW4gaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycwotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19EQVRBMSA9ICJzeW5jX2RhdGExIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNvbW1lbnRzIGZlZWQgdXJpLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVFNfVVJJID0gImNvbW1lbnRzVXJpIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IHN0YXJ0cwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVCA9ICJkdHN0YXJ0IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGVuZHMKLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EID0gImR0ZW5kIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudAotICAgICAgICAgKiA8UD5UeXBlOiBURVhUIChkdXJhdGlvbiBpbiBSRkMyNDQ1IGZvcm1hdCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVVJBVElPTiA9ICJkdXJhdGlvbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGV2ZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9USU1FWk9ORSA9ICJldmVudFRpbWV6b25lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpbWV6b25lIGZvciB0aGUgZXZlbnQsIGFsbERheSBldmVudHMgd2lsbCBoYXZlIGEgbG9jYWwgdHogaW5zdGVhZCBvZiBVVEMKLSAgICAgICAgICogPFA+VHlwZTogVEVYVAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfRU5EX1RJTUVaT05FID0gImV2ZW50RW5kVGltZXpvbmUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBsYXN0cyBhbGwgZGF5IG9yIG5vdAotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9EQVkgPSAiYWxsRGF5IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogRGVmaW5lcyBob3cgdGhlIGV2ZW50IHNob3dzIHVwIGZvciBvdGhlcnMgd2hlbiB0aGUgY2FsZW5kYXIgaXMKLSAgICAgICAgICogc2hhcmVkLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0xFVkVMID0gImFjY2Vzc0xldmVsIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogRGVmYXVsdCBhY2Nlc3MgaXMgY29udHJvbGxlZCBieSB0aGUgc2VydmVyIGFuZCB3aWxsIGJlIHRyZWF0ZWQgYXMKLSAgICAgICAgICogcHVibGljIG9uIHRoZSBkZXZpY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfREVGQVVMVCA9IDA7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25maWRlbnRpYWwgaXMgbm90IHVzZWQgYnkgdGhlIGFwcC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19DT05GSURFTlRJQUwgPSAxOwotICAgICAgICAvKioKLSAgICAgICAgICogUHJpdmF0ZSBhc3N1bWVzIHRoZSBldmVudCBhcHBlYXJzIGFzIGEgZnJlZS9idXN5IHNsb3Qgd2l0aCBubwotICAgICAgICAgKiBkZXRhaWxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX1BSSVZBVEUgPSAyOwotICAgICAgICAvKioKLSAgICAgICAgICogUHVibGljIGFzc3VtZXMgdGhlIGNvbnRlbnRzIGFyZSB2aXNpYmxlIHRvIGFueW9uZSB3aXRoIGFjY2VzcyB0byB0aGUKLSAgICAgICAgICogY2FsZW5kYXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfUFVCTElDID0gMzsKLQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgdGhpcyBldmVudCBjb3VudHMgYXMgYnVzeSB0aW1lIG9yIGlzIHN0aWxsIGZyZWUgdGltZSB0aGF0IGNhbiBiZQotICAgICAgICAgKiBzY2hlZHVsZWQgb3Zlci4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFWQUlMQUJJTElUWSA9ICJhdmFpbGFiaWxpdHkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIGV2ZW50IHRha2VzIHVwIHRpbWUgYW5kIHdpbGwgY29uZmxpY3Qgd2l0aCBvdGhlcgotICAgICAgICAgKiBldmVudHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfQlVTWSA9IDA7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIGV2ZW50IGlzIGZyZWUgdGltZSBhbmQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aAotICAgICAgICAgKiBvdGhlciBldmVudHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRlJFRSA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGhhcyBhbiBhbGFybSBvciBub3QKLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfQUxBUk0gPSAiaGFzQWxhcm0iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBoYXMgZXh0ZW5kZWQgcHJvcGVydGllcyBvciBub3QKLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfRVhURU5ERURfUFJPUEVSVElFUyA9ICJoYXNFeHRlbmRlZFByb3BlcnRpZXMiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBydWxlIGZvciB0aGUgZXZlbnQuCi0gICAgICAgICAqIHRoYW4gb25lLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlJVTEUgPSAicnJ1bGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBkYXRlcyBmb3IgdGhlIGV2ZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkRBVEUgPSAicmRhdGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgcmVjdXJyZW5jZSBleGNlcHRpb24gcnVsZSBmb3IgdGhlIGV2ZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhSVUxFID0gImV4cnVsZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSByZWN1cnJlbmNlIGV4Y2VwdGlvbiBkYXRlcyBmb3IgdGhlIGV2ZW50LgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhEQVRFID0gImV4ZGF0ZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBfaWQgb2YgdGhlIG9yaWdpbmFsIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcyBldmVudCBpcyBhbgotICAgICAgICAgKiBleGNlcHRpb24uCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JRCA9ICJvcmlnaW5hbF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBfc3luY19pZCBvZiB0aGUgb3JpZ2luYWwgcmVjdXJyaW5nIGV2ZW50IGZvciB3aGljaCB0aGlzIGV2ZW50IGlzCi0gICAgICAgICAqIGFuIGV4Y2VwdGlvbi4gVGhlIHByb3ZpZGVyIHNob3VsZCBrZWVwIHRoZSBvcmlnaW5hbF9pZCBpbiBzeW5jIHdoZW4KLSAgICAgICAgICogdGhpcyBpcyB1cGRhdGVkLgotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfU1lOQ19JRCA9ICJvcmlnaW5hbF9zeW5jX2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG9yaWdpbmFsIGluc3RhbmNlIHRpbWUgb2YgdGhlIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcwotICAgICAgICAgKiBldmVudCBpcyBhbiBleGNlcHRpb24uCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JTlNUQU5DRV9USU1FID0gIm9yaWdpbmFsSW5zdGFuY2VUaW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGFsbERheSBzdGF0dXMgKHRydWUgb3IgZmFsc2UpIG9mIHRoZSBvcmlnaW5hbCByZWN1cnJpbmcgZXZlbnQKLSAgICAgICAgICogZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMgYW4gZXhjZXB0aW9uLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX0FMTF9EQVkgPSAib3JpZ2luYWxBbGxEYXkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbGFzdCBkYXRlIHRoaXMgZXZlbnQgcmVwZWF0cyBvbiwgb3IgTlVMTCBpZiBpdCBuZXZlciBlbmRzCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0RBVEUgPSAibGFzdERhdGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIHRoZSBldmVudCBoYXMgYXR0ZW5kZWUgaW5mb3JtYXRpb24uICBUcnVlIGlmIHRoZSBldmVudAotICAgICAgICAgKiBoYXMgZnVsbCBhdHRlbmRlZSBkYXRhLCBmYWxzZSBpZiB0aGUgZXZlbnQgaGFzIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgICAgICAqIHNlbGYgb25seS4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVNfQVRURU5ERUVfREFUQSA9ICJoYXNBdHRlbmRlZURhdGEiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIGd1ZXN0cyBjYW4gbW9kaWZ5IHRoZSBldmVudC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUVTVFNfQ0FOX01PRElGWSA9ICJndWVzdHNDYW5Nb2RpZnkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIGd1ZXN0cyBjYW4gaW52aXRlIG90aGVyIGd1ZXN0cy4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUVTVFNfQ0FOX0lOVklURV9PVEhFUlMgPSAiZ3Vlc3RzQ2FuSW52aXRlT3RoZXJzIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogV2hldGhlciBndWVzdHMgY2FuIHNlZSB0aGUgbGlzdCBvZiBhdHRlbmRlZXMuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VFU1RTX0NBTl9TRUVfR1VFU1RTID0gImd1ZXN0c0NhblNlZUd1ZXN0cyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEVtYWlsIG9mIHRoZSBvcmdhbml6ZXIgKG93bmVyKSBvZiB0aGUgZXZlbnQuCi0gICAgICAgICAqIDxQPlR5cGU6IFNUUklORzwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR0FOSVpFUiA9ICJvcmdhbml6ZXIiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIGNhbiBpbnZpdGUgb3RoZXJzIHRvIHRoZSBldmVudC4KLSAgICAgICAgICogVGhlIEdVRVNUU19DQU5fSU5WSVRFX09USEVSUyBpcyBhIHNldHRpbmcgdGhhdCBhcHBsaWVzIHRvIGFuIGFyYml0cmFyeSBndWVzdCwKLSAgICAgICAgICogd2hpbGUgQ0FOX0lOVklURV9PVEhFUlMgaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGNhbiBpbnZpdGUgb3RoZXJzIChlaXRoZXIgdGhyb3VnaAotICAgICAgICAgKiBHVUVTVFNfQ0FOX0lOVklURV9PVEhFUlMgb3IgYmVjYXVzZSB0aGUgdXNlciBoYXMgbW9kaWZ5IGFjY2VzcyB0byB0aGUgZXZlbnQpLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuLCByZWFkb25seSk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5fSU5WSVRFX09USEVSUyA9ICJjYW5JbnZpdGVPdGhlcnMiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgb3duZXIgYWNjb3VudCBmb3IgdGhpcyBjYWxlbmRhciwgYmFzZWQgb24gdGhlIGNhbGVuZGFyIChmb3JlaWduCi0gICAgICAgICAqIGtleSBpbnRvIHRoZSBjYWxlbmRhcnMgdGFibGUpLgotICAgICAgICAgKiA8UD5UeXBlOiBTdHJpbmc8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPV05FUl9BQ0NPVU5UID0gIm93bmVyQWNjb3VudCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdoZXRoZXIgdGhlIHJvdyBoYXMgYmVlbiBkZWxldGVkLiAgQSBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEID0gImRlbGV0ZWQiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnRhaW5zIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIgZXZlbnQuIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhCi0gICAgICogc2luZ2xlIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBFdmVudHNDb2x1bW5zIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsKLSAgICAgICAgICAgICAgICAiL2V2ZW50X2VudGl0aWVzIik7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5SXRlcmF0b3JJbXBsKGN1cnNvciwgcmVzb2x2ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yLAotICAgICAgICAgICAgICAgIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCBwcm92aWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlJdGVyYXRvckltcGwgZXh0ZW5kcyBDdXJzb3JFbnRpdHlJdGVyYXRvciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRQcm92aWRlckNsaWVudCBtUHJvdmlkZXI7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFTUlOREVSU19QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgUmVtaW5kZXJzLk1JTlVURVMsCi0gICAgICAgICAgICAgICAgICAgIFJlbWluZGVycy5NRVRIT0QsCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NSU5VVEVTID0gMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUVUSE9EID0gMTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVRURU5ERUVTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXMuQVRURU5ERUVfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgQXR0ZW5kZWVzLkFUVEVOREVFX0VNQUlMLAotICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXMuQVRURU5ERUVfUkVMQVRJT05TSElQLAotICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXMuQVRURU5ERUVfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQXR0ZW5kZWVzLkFUVEVOREVFX1NUQVRVUywKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0FUVEVOREVFX05BTUUgPSAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9BVFRFTkRFRV9FTUFJTCA9IDE7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0FUVEVOREVFX1JFTEFUSU9OU0hJUCA9IDI7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0FUVEVOREVFX1RZUEUgPSAzOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9BVFRFTkRFRV9TVEFUVVMgPSA0OwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRVhURU5ERURfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkUHJvcGVydGllcy5fSUQsCi0gICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkUHJvcGVydGllcy5OQU1FLAotICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFByb3BlcnRpZXMuVkFMVUUKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lEID0gMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTkFNRSA9IDE7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1ZBTFVFID0gMjsKLQotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0VWRU5UX0lEID0gImV2ZW50X2lkPT8iOwotCi0gICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgewotICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEVudGl0eUl0ZXJhdG9ySW1wbChDdXJzb3IgY3Vyc29yLCBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOwotICAgICAgICAgICAgICAgIG1SZXNvbHZlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVyID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEVudGl0eSBnZXRFbnRpdHlBbmRJbmNyZW1lbnRDdXJzb3IoQ3Vyc29yIGN1cnNvcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgLy8gd2UgZXhwZWN0IHRoZSBjdXJzb3IgaXMgYWxyZWFkeSBhdCB0aGUgcm93IHdlIG5lZWQgdG8gcmVhZCBmcm9tCi0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBldmVudElkID0gY3Vyc29yLmdldExvbmcoY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhFdmVudHMuX0lEKSk7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyBjdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgY3YucHV0KEV2ZW50cy5fSUQsIGV2ZW50SWQpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTEVOREFSX0lEKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBIVE1MX1VSSSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgVElUTEUpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFU0NSSVBUSU9OKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFVkVOVF9MT0NBVElPTik7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1RBVFVTKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBTRUxGX0FUVEVOREVFX1NUQVRVUyk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ09NTUVOVFNfVVJJKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRFRTVEFSVCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERURU5EKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBEVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRVZFTlRfVElNRVpPTkUpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEVWRU5UX0VORF9USU1FWk9ORSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQUxMX0RBWSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQUNDRVNTX0xFVkVMKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBVkFJTEFCSUxJVFkpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEhBU19BTEFSTSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEhBU19FWFRFTkRFRF9QUk9QRVJUSUVTKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBSUlVMRSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgUkRBVEUpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEVYUlVMRSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRVhEQVRFKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBPUklHSU5BTF9TWU5DX0lEKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBPUklHSU5BTF9JRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCi0gICAgICAgICAgICAgICAgICAgICAgICBPUklHSU5BTF9JTlNUQU5DRV9USU1FKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBPUklHSU5BTF9BTExfREFZKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgTEFTVF9EQVRFKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBIQVNfQVRURU5ERUVfREFUQSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdVRVNUU19DQU5fSU5WSVRFX09USEVSUyk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgR1VFU1RTX0NBTl9NT0RJRlkpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEdVRVNUU19DQU5fU0VFX0dVRVNUUyk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgT1JHQU5JWkVSKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19JRCk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgX1NZTkNfREFUQSk7Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JMb25nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERJUlRZKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBfU1lOQ19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFdmVudHNDb2x1bW5zLkRFTEVURUQpOwotICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNZTkMxKTsKLSAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLlNZTkNfREFUQTEpOwotCi0gICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOwotICAgICAgICAgICAgICAgIEN1cnNvciBzdWJDdXJzb3I7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXNvbHZlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvciA9IG1SZXNvbHZlci5xdWVyeShSZW1pbmRlcnMuQ09OVEVOVF9VUkksIFJFTUlOREVSU19QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFX0VWRU5UX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IExvbmcudG9TdHJpbmcoZXZlbnRJZCkgfSAgLyogc2VsZWN0aW9uQXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVByb3ZpZGVyLnF1ZXJ5KFJlbWluZGVycy5DT05URU5UX1VSSSwgUkVNSU5ERVJTX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkVfRVZFTlRfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTG9uZy50b1N0cmluZyhldmVudElkKSB9ICAvKiBzZWxlY3Rpb25BcmdzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydE9yZGVyICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN1YkN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcmVtaW5kZXJWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVtaW5kZXJWYWx1ZXMucHV0KFJlbWluZGVycy5NSU5VVEVTLCBzdWJDdXJzb3IuZ2V0SW50KENPTFVNTl9NSU5VVEVTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1pbmRlclZhbHVlcy5wdXQoUmVtaW5kZXJzLk1FVEhPRCwgc3ViQ3Vyc29yLmdldEludChDT0xVTU5fTUVUSE9EKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoUmVtaW5kZXJzLkNPTlRFTlRfVVJJLCByZW1pbmRlclZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVJlc29sdmVyLnF1ZXJ5KEF0dGVuZGVlcy5DT05URU5UX1VSSSwgQVRURU5ERUVTX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkVfRVZFTlRfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTG9uZy50b1N0cmluZyhldmVudElkKSB9IC8qIHNlbGVjdGlvbkFyZ3MgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0T3JkZXIgKi8pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvciA9IG1Qcm92aWRlci5xdWVyeShBdHRlbmRlZXMuQ09OVEVOVF9VUkksIEFUVEVOREVFU19QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFX0VWRU5UX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IExvbmcudG9TdHJpbmcoZXZlbnRJZCkgfSAvKiBzZWxlY3Rpb25BcmdzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydE9yZGVyICovKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN1YkN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgYXR0ZW5kZWVWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVWYWx1ZXMucHV0KEF0dGVuZGVlcy5BVFRFTkRFRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9BVFRFTkRFRV9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZVZhbHVlcy5wdXQoQXR0ZW5kZWVzLkFUVEVOREVFX0VNQUlMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9BVFRFTkRFRV9FTUFJTCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVWYWx1ZXMucHV0KEF0dGVuZGVlcy5BVFRFTkRFRV9SRUxBVElPTlNISVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvci5nZXRJbnQoQ09MVU1OX0FUVEVOREVFX1JFTEFUSU9OU0hJUCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVWYWx1ZXMucHV0KEF0dGVuZGVlcy5BVFRFTkRFRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0SW50KENPTFVNTl9BVFRFTkRFRV9UWVBFKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZVZhbHVlcy5wdXQoQXR0ZW5kZWVzLkFUVEVOREVFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yLmdldEludChDT0xVTU5fQVRURU5ERUVfU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoQXR0ZW5kZWVzLkNPTlRFTlRfVVJJLCBhdHRlbmRlZVZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVJlc29sdmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVJlc29sdmVyLnF1ZXJ5KEV4dGVuZGVkUHJvcGVydGllcy5DT05URU5UX1VSSSwgRVhURU5ERURfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRV9FVkVOVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBMb25nLnRvU3RyaW5nKGV2ZW50SWQpIH0gLyogc2VsZWN0aW9uQXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVByb3ZpZGVyLnF1ZXJ5KEV4dGVuZGVkUHJvcGVydGllcy5DT05URU5UX1VSSSwgRVhURU5ERURfUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRV9FVkVOVF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBMb25nLnRvU3RyaW5nKGV2ZW50SWQpIH0gLyogc2VsZWN0aW9uQXJncyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdWJDdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGV4dGVuZGVkVmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkVmFsdWVzLnB1dChFeHRlbmRlZFByb3BlcnRpZXMuX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRWYWx1ZXMucHV0KEV4dGVuZGVkUHJvcGVydGllcy5OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9OQU1FKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFZhbHVlcy5wdXQoRXh0ZW5kZWRQcm9wZXJ0aWVzLlZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9WQUxVRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LmFkZFN1YlZhbHVlKEV4dGVuZGVkUHJvcGVydGllcy5DT05URU5UX1VSSSwgZXh0ZW5kZWRWYWx1ZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udGFpbnMgb25lIGVudHJ5IHBlciBjYWxlbmRhciBldmVudC4gUmVjdXJyaW5nIGV2ZW50cyBzaG93IHVwIGFzIGEgc2luZ2xlIGVudHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBFdmVudHNDb2x1bW5zIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGRVRDSF9FTlRSWV9DT0xVTU5TID0KLSAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBFdmVudHMuQUNDT1VOVF9OQU1FLCBFdmVudHMuX1NZTkNfSUQgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVFRFTkRFRVNfQ09MVU1OUyA9Ci0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQXR0ZW5kZWVzQ29sdW1ucy5BVFRFTkRFRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlc0NvbHVtbnMuQVRURU5ERUVfRU1BSUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ZW5kZWVzQ29sdW1ucy5BVFRFTkRFRV9SRUxBVElPTlNISVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0ZW5kZWVzQ29sdW1ucy5BVFRFTkRFRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlc0NvbHVtbnMuQVRURU5ERUVfU1RBVFVTIH07Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIG51bGwsIG51bGwsIERFRkFVTFRfU09SVF9PUkRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoQ09OVEVOVF9VUkksIHByb2plY3Rpb24sIHdoZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0VmFsdWUoSUNhbGVuZGFyLkNvbXBvbmVudCBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgSUNhbGVuZGFyLlByb3BlcnR5IHByb3BlcnR5ID0KLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldEZpcnN0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoaXMgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KLSAgICAgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9ldmVudHMiKTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBERUxFVEVEX0NPTlRFTlRfVVJJID0KLSAgICAgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9kZWxldGVkX2V2ZW50cyIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlc2UgYXJlIGNvbHVtbnMgdGhhdCBzaG91bGQgb25seSBldmVyIGJlIHVwZGF0ZWQgYnkgdGhlIHByb3ZpZGVyLAotICAgICAgICAgKiBlaXRoZXIgYmVjYXVzZSB0aGV5IGFyZSB2aWV3cyBtYXBwZWQgdG8gYW5vdGhlciB0YWJsZSBvciBiZWNhdXNlIHRoZXkKLSAgICAgICAgICogYXJlIHVzZWQgZm9yIHByb3ZpZGVyIG9ubHkgZnVuY3Rpb25hbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gUFJPVklERVJfV1JJVEFCTEVfQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgQUNDT1VOVF9OQU1FLAotICAgICAgICAgICAgICAgIEFDQ09VTlRfVFlQRQotICAgICAgICB9OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdGFibGUgYnkgYSBzeW5jIGFkYXB0ZXIuIFRvIG1vZGlmeSB0aGVtIHRoZQotICAgICAgICAgKiBjYWxsZXIgbXVzdCBpbmNsdWRlIENBTExFUl9JU19TWU5DQURBUFRFUiwgX1NZTkNfQUNDT1VOVCwgYW5kCi0gICAgICAgICAqIF9TWU5DX0FDQ09VTlRfVFlQRSBpbiB0aGUgcXVlcnkgcGFyYW1ldGVycy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1lOQ19XUklUQUJMRV9DT0xVTU5TID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgIF9TWU5DX0lELAotICAgICAgICAgICAgX1NZTkNfVElNRSwKLSAgICAgICAgICAgIF9TWU5DX1ZFUlNJT04sCi0gICAgICAgICAgICBESVJUWSwKLSAgICAgICAgICAgIFNZTkNfREFUQTEKLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb250YWlucyBvbmUgZW50cnkgcGVyIGNhbGVuZGFyIGV2ZW50IGluc3RhbmNlLiBSZWN1cnJpbmcgZXZlbnRzIHNob3cgdXAgZXZlcnkgdGltZQotICAgICAqIHRoZXkgb2NjdXIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgRXZlbnRzQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRCA9IENhbGVuZGFycy5WSVNJQkxFICsgIj0xIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kKSB7Ci0gICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOwotICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIERFRkFVTFRfU09SVF9PUkRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgc2VhcmNoUXVlcnkpIHsKLSAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1NFQVJDSF9VUkkuYnVpbGRVcG9uKCk7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOwotICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlYXJjaFF1ZXJ5IH0sIERFRkFVTFRfU09SVF9PUkRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYmVnaW4sIGxvbmcgZW5kLCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7Ci0gICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9ICIoIiArIHdoZXJlICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCB3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwgbG9uZyBiZWdpbiwKLSAgICAgICAgICAgICAgICBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5LCBTdHJpbmcgd2hlcmUsIFN0cmluZyBvcmRlckJ5KSB7Ci0gICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOwotICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOwotICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKLSAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFwcGVuZFBhdGgoc2VhcmNoUXVlcnkpOwotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSkgewotICAgICAgICAgICAgICAgIHdoZXJlID0gV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3aGVyZSA9ICIoIiArIHdoZXJlICsgIikgQU5EICIgKyBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBwcm9qZWN0aW9uLCB3aGVyZSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgb3JkZXJCeSA9PSBudWxsID8gREVGQVVMVF9TT1JUX09SREVSIDogb3JkZXJCeSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKwotICAgICAgICAgICAgICAgICIvaW5zdGFuY2VzL3doZW4iKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9CWV9EQVlfVVJJID0KLSAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy93aGVuYnlkYXkiKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCi0gICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvc2VhcmNoIik7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfU0VBUkNIX0JZX0RBWV9VUkkgPQotICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvaW5zdGFuY2VzL3NlYXJjaGJ5ZGF5Iik7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiYmVnaW4gQVNDIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHNvcnQgb3JkZXIgaXM6IGV2ZW50cyB3aXRoIGFuIGVhcmxpZXIgc3RhcnQgdGltZSBvY2N1cgotICAgICAgICAgKiBmaXJzdCBhbmQgaWYgdGhlIHN0YXJ0IHRpbWVzIGFyZSB0aGUgc2FtZSwgdGhlbiBldmVudHMgd2l0aAotICAgICAgICAgKiBhIGxhdGVyIGVuZCB0aW1lIG9jY3VyIGZpcnN0LiBUaGUgbGF0ZXIgZW5kIHRpbWUgaXMgb3JkZXJlZAotICAgICAgICAgKiBmaXJzdCBzbyB0aGF0IGxvbmctcnVubmluZyBldmVudHMgaW4gdGhlIGNhbGVuZGFyIHZpZXdzIGFwcGVhcgotICAgICAgICAgKiBmaXJzdC4gIElmIHRoZSBzdGFydCBhbmQgZW5kIHRpbWVzIG9mIHR3byBldmVudHMgYXJlCi0gICAgICAgICAqIHRoZSBzYW1lIHRoZW4gd2Ugc29ydCBhbHBoYWJldGljYWxseSBvbiB0aGUgdGl0bGUuICBUaGlzIGlzbid0Ci0gICAgICAgICAqIHJlcXVpcmVkIGZvciBjb3JyZWN0bmVzcywgaXQganVzdCBhZGRzIGEgbmljZSB0b3VjaC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfQ0FMRU5EQVJfVklFVyA9ICJiZWdpbiBBU0MsIGVuZCBERVNDLCB0aXRsZSBBU0MiOwotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGJlZ2lubmluZyB0aW1lIG9mIHRoZSBpbnN0YW5jZSwgaW4gVVRDIG1pbGxpc2Vjb25kcwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU4gPSAiYmVnaW4iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZW5kaW5nIHRpbWUgb2YgdGhlIGluc3RhbmNlLCBpbiBVVEMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkQgPSAiZW5kIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGV2ZW50IGZvciB0aGlzIGluc3RhbmNlCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmcsIGZvcmVpZ24ga2V5IHRvIHRoZSBFdmVudHMgdGFibGUpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfSUQgPSAiZXZlbnRfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgSnVsaWFuIHN0YXJ0IGRheSBvZiB0aGUgaW5zdGFuY2UsIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCB0aW1lem9uZQotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfREFZID0gInN0YXJ0RGF5IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEp1bGlhbiBlbmQgZGF5IG9mIHRoZSBpbnN0YW5jZSwgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHRpbWV6b25lCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfREFZID0gImVuZERheSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBzdGFydCBtaW51dGUgb2YgdGhlIGluc3RhbmNlIG1lYXN1cmVkIGZyb20gbWlkbmlnaHQgaW4gdGhlCi0gICAgICAgICAqIGxvY2FsIHRpbWV6b25lLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfTUlOVVRFID0gInN0YXJ0TWludXRlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGVuZCBtaW51dGUgb2YgdGhlIGluc3RhbmNlIG1lYXN1cmVkIGZyb20gbWlkbmlnaHQgaW4gdGhlCi0gICAgICAgICAqIGxvY2FsIHRpbWV6b25lLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX01JTlVURSA9ICJlbmRNaW51dGUiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGVuZGFyQ2FjaGUgc3RvcmVzIHNvbWUgc2V0dGluZ3MgZm9yIGNhbGVuZGFyIGluY2x1ZGluZyB0aGUgY3VycmVudAotICAgICAqIHRpbWUgem9uZSBmb3IgdGhlIGFwcC4gVGhlc2Ugc2V0dGluZ3MgYXJlIHN0b3JlZCB1c2luZyBhIGtleS92YWx1ZQotICAgICAqIHNjaGVtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyQ2FjaGVDb2x1bW5zIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBrZXkgZm9yIHRoZSBzZXR0aW5nLiBLZXlzIGFyZSBkZWZpbmVkIGluIENhbGVuZGFyQ2hhY2hlIGluIHRoZQotICAgICAgICAgKiBDYWxlbmRhciBwcm92aWRlci4KLSAgICAgICAgICogVE9ETyBBZGQga2V5cyB0byB0aGlzIGZpbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWSA9ICJrZXkiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIHNldHRpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxlbmRhckNhY2hlIGltcGxlbWVudHMgQ2FsZW5kYXJDYWNoZUNvbHVtbnMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFVSSSB0byB1c2UgZm9yIHJldHJpZXZpbmcgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgQ2FsZW5kYXIgZGIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBVUkkgPQotICAgICAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL3Byb3BlcnRpZXMiKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQT0pFQ1RJT04gPSB7IEtFWSwgVkFMVUUgfTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgdXBkYXRpbmcgYSBwcm9wZXJ0eSwgdGhpcyBtdXN0IGJlIHByb3ZpZGVkIGFzIHRoZSBzZWxlY3Rpb24uIEFsbAotICAgICAgICAgKiBvdGhlciBzZWxlY3Rpb25zIHdpbGwgZmFpbC4gRm9yIHF1ZXJpZXMgdGhpcyBmaWVsZCBjYW4gYmUgb21pdHRlZCB0bwotICAgICAgICAgKiByZXRyaWV2ZSBhbGwgcHJvcGVydGllcyBvciB1c2VkIHRvIHF1ZXJ5IGEgc2luZ2xlIHByb3BlcnR5LiBWYWxpZAotICAgICAgICAgKiBrZXlzIGluY2x1ZGUge0BsaW5rICNUSU1FWk9ORV9LRVlfVFlQRX0sCi0gICAgICAgICAqIHtAbGluayAjVElNRVpPTkVfS0VZX0lOU1RBTkNFU30sIGFuZAotICAgICAgICAgKiB7QGxpbmsgI1RJTUVaT05FX0tFWV9JTlNUQU5DRVNfUFJFVklPVVN9LCB0aG91Z2ggdGhlIGxhc3Qgb25lIGNhbgotICAgICAgICAgKiBvbmx5IGJlIHJlYWQsIG5vdCB3cml0dGVuLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkUgPSAia2V5PT8iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGV5IGtleSBmb3IgdXBkYXRpbmcgdGhlIHVzZSBvZiBhdXRvL2hvbWUgdGltZSB6b25lcyBpbiBDYWxlbmRhci4KLSAgICAgICAgICogVmFsaWQgdmFsdWVzIGFyZSB7QGxpbmsgI1RJTUVaT05FX1RZUEVfQVVUT30gb3IKLSAgICAgICAgICoge0BsaW5rICNUSU1FWk9ORV9UWVBFX0hPTUV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfS0VZX1RZUEUgPSAidGltZXpvbmVUeXBlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGtleSBmb3IgdXBkYXRpbmcgdGhlIHRpbWUgem9uZSB1c2VkIGJ5IHRoZSBwcm92aWRlciB3aGVuIGl0Ci0gICAgICAgICAqIGdlbmVyYXRlcyB0aGUgaW5zdGFuY2VzIHRhYmxlLiBUaGlzIHNob3VsZCBvbmx5IGJlIHdyaXR0ZW4gaWYgdGhlCi0gICAgICAgICAqIHR5cGUgaXMgc2V0IHRvIHtAbGluayAjVElNRVpPTkVfVFlQRV9IT01FfS4gQSB2YWxpZCB0aW1lIHpvbmUgaWQKLSAgICAgICAgICogc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWVsZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVaT05FX0tFWV9JTlNUQU5DRVMgPSAidGltZXpvbmVJbnN0YW5jZXMiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUga2V5IGZvciByZWFkaW5nIHRoZSBsYXN0IHRpbWUgem9uZSBzZXQgYnkgdGhlIHVzZXIuIFRoaXMgc2hvdWxkCi0gICAgICAgICAqIG9ubHkgYmUgcmVhZCBieSBhcHBzIGFuZCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuZXZlcgotICAgICAgICAgKiB7QGxpbmsgI1RJTUVaT05FX0tFWV9JTlNUQU5DRVN9IGlzIHVwZGF0ZWQgd2l0aAotICAgICAgICAgKiB7QGxpbmsgI1RJTUVaT05FX1RZUEVfSE9NRX0gc2V0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfS0VZX0lOU1RBTkNFU19QUkVWSU9VUyA9ICJ0aW1lem9uZUluc3RhbmNlc1ByZXZpb3VzIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHtAbGluayAjVElNRVpPTkVfS0VZX1RZUEV9IGlmIHRoZSBwcm92aWRlcgotICAgICAgICAgKiBzaG91bGQgc3RheSBpbiBzeW5jIHdpdGggdGhlIGRldmljZSdzIHRpbWUgem9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVaT05FX1RZUEVfQVVUTyA9ICJhdXRvIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHtAbGluayAjVElNRVpPTkVfS0VZX1RZUEV9IGlmIHRoZSBwcm92aWRlcgotICAgICAgICAgKiBzaG91bGQgdXNlIGEgZml4ZWQgdGltZSB6b25lIHNldCBieSB0aGUgdXNlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVaT05FX1RZUEVfSE9NRSA9ICJob21lIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGZldyBDYWxlbmRhciBnbG9iYWxzIGFyZSBuZWVkZWQgaW4gdGhlIENhbGVuZGFyUHJvdmlkZXIgZm9yIGV4cGFuZGluZwotICAgICAqIHRoZSBJbnN0YW5jZXMgdGFibGUgYW5kIHRoZXNlIGFyZSBhbGwgc3RvcmVkIGluIHRoZSBmaXJzdCAoYW5kIG9ubHkpCi0gICAgICogcm93IG9mIHRoZSBDYWxlbmRhck1ldGFEYXRhIHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxvY2FsIHRpbWV6b25lIHRoYXQgd2FzIHVzZWQgZm9yIHByZWNvbXB1dGluZyB0aGUgZmllbGRzCi0gICAgICAgICAqIGluIHRoZSBJbnN0YW5jZXMgdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9USU1FWk9ORSA9ICJsb2NhbFRpbWV6b25lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1pbmltdW0gdGltZSB1c2VkIGluIGV4cGFuZGluZyB0aGUgSW5zdGFuY2VzIHRhYmxlLAotICAgICAgICAgKiBpbiBVVEMgbWlsbGlzZWNvbmRzLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0lOU1RBTkNFID0gIm1pbkluc3RhbmNlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1heGltdW0gdGltZSB1c2VkIGluIGV4cGFuZGluZyB0aGUgSW5zdGFuY2VzIHRhYmxlLAotICAgICAgICAgKiBpbiBVVEMgbWlsbGlzZWNvbmRzLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0lOU1RBTkNFID0gIm1heEluc3RhbmNlIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1pbmltdW0gSnVsaWFuIGRheSBpbiB0aGUgRXZlbnREYXlzIHRhYmxlLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0VWRU5UREFZUyA9ICJtaW5FdmVudERheXMiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWF4aW11bSBKdWxpYW4gZGF5IGluIHRoZSBFdmVudERheXMgdGFibGUuCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhck1ldGFEYXRhIGltcGxlbWVudHMgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMsIEJhc2VDb2x1bW5zIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50RGF5c0NvbHVtbnMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEp1bGlhbiBzdGFydGluZyBkYXkgbnVtYmVyLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlREQVkgPSAic3RhcnREYXkiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkREQVkgPSAiZW5kRGF5IjsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRXZlbnREYXlzIGltcGxlbWVudHMgRXZlbnREYXlzQ29sdW1ucyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCi0gICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvZ3JvdXBieWRheSIpOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IHsgU1RBUlREQVksIEVORERBWSB9OwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RJT04gPSAic2VsZWN0ZWQ9MSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHJpZXZlcyB0aGUgZGF5cyB3aXRoIGV2ZW50cyBmb3IgdGhlIEp1bGlhbiBkYXlzIHN0YXJ0aW5nIGF0ICJzdGFydERheSIKLSAgICAgICAgICogZm9yICJudW1EYXlzIi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKLSAgICAgICAgICogQHBhcmFtIHN0YXJ0RGF5IHRoZSBmaXJzdCBKdWxpYW4gZGF5IGluIHRoZSByYW5nZQotICAgICAgICAgKiBAcGFyYW0gbnVtRGF5cyB0aGUgbnVtYmVyIG9mIGRheXMgdG8gbG9hZCAobXVzdCBiZSBhdCBsZWFzdCAxKQotICAgICAgICAgKiBAcmV0dXJuIGEgZGF0YWJhc2UgY3Vyc29yCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIGludCBzdGFydERheSwgaW50IG51bURheXMpIHsKLSAgICAgICAgICAgIGlmIChudW1EYXlzIDwgMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGVuZERheSA9IHN0YXJ0RGF5ICsgbnVtRGF5cyAtIDE7Ci0gICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBzdGFydERheSk7Ci0gICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmREYXkpOwotICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgUFJPSkVDVElPTiwgU0VMRUNUSU9OLAotICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNlbGVjdGlvbiBhcmdzICovLCBTVEFSVERBWSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbWluZGVyc0NvbHVtbnMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGV2ZW50IHRoZSByZW1pbmRlciBiZWxvbmdzIHRvCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGZvcmVpZ24ga2V5IHRvIHRoZSBFdmVudHMgdGFibGUpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfSUQgPSAiZXZlbnRfaWQiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWludXRlcyBwcmlvciB0byB0aGUgZXZlbnQgdGhhdCB0aGUgYWxhcm0gc2hvdWxkIHJpbmcuICAtMQotICAgICAgICAgKiBzcGVjaWZpZXMgdGhhdCB3ZSBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3lzdGVtLgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOVVRFUyA9ICJtaW51dGVzIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VVEVTX0RFRkFVTFQgPSAtMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGFsYXJtIG1ldGhvZCwgYXMgc2V0IG9uIHRoZSBzZXJ2ZXIuICBERUZBVUxULCBBTEVSVCwgRU1BSUwsIGFuZAotICAgICAgICAgKiBTTVMgYXJlIHBvc3NpYmxlIHZhbHVlczsgdGhlIGRldmljZSB3aWxsIG9ubHkgcHJvY2VzcyBERUZBVUxUIGFuZAotICAgICAgICAgKiBBTEVSVCByZW1pbmRlcnMgKHRoZSBvdGhlciB0eXBlcyBhcmUgc2ltcGx5IHN0b3JlZCBzbyB3ZSBjYW4gc2VuZCB0aGUKLSAgICAgICAgICogc2FtZSByZW1pbmRlciBpbmZvIGJhY2sgdG8gdGhlIHNlcnZlciB3aGVuIHdlIG1ha2UgY2hhbmdlcykuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0QgPSAibWV0aG9kIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0RfREVGQVVMVCA9IDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9BTEVSVCA9IDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9FTUFJTCA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9TTVMgPSAzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVtaW5kZXJzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFJlbWluZGVyc0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIlJlbWluZGVycyI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvcmVtaW5kZXJzIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxlbmRhckFsZXJ0c0NvbHVtbnMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGV2ZW50IHRoYXQgdGhlIGFsZXJ0IGJlbG9uZ3MgdG8KLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUdJTiA9ICJiZWdpbiI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBlbmQgdGltZSBvZiB0aGUgZXZlbnQsIGluIFVUQwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EID0gImVuZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBhbGFybSB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEFSTV9USU1FID0gImFsYXJtVGltZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoaXMgZGF0YWJhc2UgZW50cnksIGluIFVUQy4KLSAgICAgICAgICogKFVzZWZ1bCBmb3IgZGVidWdnaW5nIG1pc3NlZCByZW1pbmRlcnMuKQotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fVElNRSA9ICJjcmVhdGlvblRpbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGltZSB0aGF0IHRoZSBhbGFybSBicm9hZGNhc3Qgd2FzIHJlY2VpdmVkIGJ5IHRoZSBDYWxlbmRhciBhcHAsCi0gICAgICAgICAqIGluIFVUQy4gKFVzZWZ1bCBmb3IgZGVidWdnaW5nIG1pc3NlZCByZW1pbmRlcnMuKQotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDRUlWRURfVElNRSA9ICJyZWNlaXZlZFRpbWUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgdGltZSB0aGF0IHRoZSBub3RpZmljYXRpb24gd2FzIGNyZWF0ZWQgYnkgdGhlIENhbGVuZGFyIGFwcCwKLSAgICAgICAgICogaW4gVVRDLiAoVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzc2VkIHJlbWluZGVycy4pCi0gICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRllfVElNRSA9ICJub3RpZnlUaW1lIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHN0YXRlIG9mIHRoaXMgYWxlcnQuICBJdCBzdGFydHMgb3V0IGFzIFNDSEVEVUxFRCwgdGhlbiB3aGVuCi0gICAgICAgICAqIHRoZSBhbGFybSBnb2VzIG9mZiwgaXQgY2hhbmdlcyB0byBGSVJFRCwgYW5kIHRoZW4gd2hlbiB0aGUgdXNlcgotICAgICAgICAgKiBkaXNtaXNzZXMgdGhlIGFsYXJtIGl0IGNoYW5nZXMgdG8gRElTTUlTU0VELgotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEUgPSAic3RhdGUiOwotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFRCA9IDA7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJUkVEID0gMTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTTUlTU0VEID0gMjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG51bWJlciBvZiBtaW51dGVzIHRoYXQgdGhpcyBhbGFybSBwcmVjZWRlcyB0aGUgc3RhcnQgdGltZQotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTlVURVMgPSAibWludXRlcyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUiA9ICJiZWdpbiBBU0MsdGl0bGUgQVNDIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyQWxlcnRzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsCi0gICAgICAgICAgICBDYWxlbmRhckFsZXJ0c0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMsIENhbGVuZGFyc0NvbHVtbnMgewotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiQ2FsZW5kYXJBbGVydHMiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKwotICAgICAgICAgICAgICAgICIvY2FsZW5kYXJfYWxlcnRzIik7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0FMQVJNX0VYSVNUUyA9IEVWRU5UX0lEICsgIj0/IgotICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIEJFR0lOICsgIj0/IgotICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIEFMQVJNX1RJTUUgKyAiPT8iOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9GSU5ETkVYVEFMQVJNVElNRSA9IEFMQVJNX1RJTUUgKyAiPj0/IjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfT1JERVJfQUxBUk1USU1FX0FTQyA9IEFMQVJNX1RJTUUgKyAiIEFTQyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX1JFU0NIRURVTEVfTUlTU0VEX0FMQVJNUyA9IFNUQVRFICsgIj0iICsgU0NIRURVTEVECi0gICAgICAgICAgICAgICAgKyAiIEFORCAiICsgQUxBUk1fVElNRSArICI8PyIKLSAgICAgICAgICAgICAgICArICIgQU5EICIgKyBBTEFSTV9USU1FICsgIj4/IgotICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIEVORCArICI+PT8iOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIFVSSSBpcyBmb3IgZ3JvdXBpbmcgdGhlIHF1ZXJ5IHJlc3VsdHMgYnkgZXZlbnRfaWQgYW5kIGJlZ2luCi0gICAgICAgICAqIHRpbWUuICBUaGlzIHdpbGwgcmV0dXJuIG9uZSByZXN1bHQgcGVyIGluc3RhbmNlIG9mIGFuIGV2ZW50LiAgU28KLSAgICAgICAgICogZXZlbnRzIHdpdGggbXVsdGlwbGUgYWxhcm1zIHdpbGwgYXBwZWFyIGp1c3Qgb25jZSwgYnV0IG11bHRpcGxlCi0gICAgICAgICAqIGluc3RhbmNlcyBvZiBhIHJlcGVhdGluZyBldmVudCB3aWxsIHNob3cgdXAgbXVsdGlwbGUgdGltZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSV9CWV9JTlNUQU5DRSA9Ci0gICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9jYWxlbmRhcl9hbGVydHMvYnlfaW5zdGFuY2UiKTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBpbnNlcnQoQ29udGVudFJlc29sdmVyIGNyLCBsb25nIGV2ZW50SWQsCi0gICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIGxvbmcgYWxhcm1UaW1lLCBpbnQgbWludXRlcykgewotICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5FVkVOVF9JRCwgZXZlbnRJZCk7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQWxlcnRzLkJFR0lOLCBiZWdpbik7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQWxlcnRzLkVORCwgZW5kKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJBbGVydHMuQUxBUk1fVElNRSwgYWxhcm1UaW1lKTsKLSAgICAgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJBbGVydHMuQ1JFQVRJT05fVElNRSwgY3VycmVudFRpbWUpOwotICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5SRUNFSVZFRF9USU1FLCAwKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJBbGVydHMuTk9USUZZX1RJTUUsIDApOwotICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5TVEFURSwgU0NIRURVTEVEKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJBbGVydHMuTUlOVVRFUywgbWludXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gY3IuaW5zZXJ0KENPTlRFTlRfVVJJLCB2YWx1ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBzb3J0T3JkZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEZpbmRzIHRoZSBuZXh0IGFsYXJtIGFmdGVyIChvciBlcXVhbCB0bykgdGhlIGdpdmVuIHRpbWUgYW5kIHJldHVybnMKLSAgICAgICAgICogdGhlIHRpbWUgb2YgdGhhdCBhbGFybSBvciAtMSBpZiBubyBzdWNoIGFsYXJtIGV4aXN0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKLSAgICAgICAgICogQHBhcmFtIG1pbGxpcyB0aGUgdGltZSBpbiBVVEMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQgYWxhcm0gdGltZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gIm1pbGxpcyIsIG9yIC0xCi0gICAgICAgICAqICAgICBpZiBubyBzdWNoIGFsYXJtIGV4aXN0cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBmaW5kTmV4dEFsYXJtVGltZShDb250ZW50UmVzb2x2ZXIgY3IsIGxvbmcgbWlsbGlzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc2VsZWN0aW9uID0gQUxBUk1fVElNRSArICI+PSIgKyBtaWxsaXM7Ci0gICAgICAgICAgICAvLyBUT0RPOiBjb25zdHJ1Y3QgYW4gZXhwbGljaXQgU1FMIHF1ZXJ5IHNvIHRoYXQgd2UgY2FuIGFkZAotICAgICAgICAgICAgLy8gIkxJTUlUIDEiIHRvIHRoZSBlbmQgYW5kIGdldCBqdXN0IG9uZSByZXN1bHQuCi0gICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsgQUxBUk1fVElNRSB9OwotICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IHF1ZXJ5KGNyLCBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBXSEVSRV9GSU5ETkVYVEFMQVJNVElNRSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcobWlsbGlzKQotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICBTT1JUX09SREVSX0FMQVJNVElNRV9BU0MpOwotICAgICAgICAgICAgbG9uZyBhbGFybVRpbWUgPSAtMTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5tb3ZlVG9GaXJzdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFsYXJtVGltZSA9IGN1cnNvci5nZXRMb25nKDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhbGFybVRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VhcmNoZXMgdGhlIENhbGVuZGFyQWxlcnRzIHRhYmxlIGZvciBhbGFybXMgdGhhdCBzaG91bGQgaGF2ZSBmaXJlZAotICAgICAgICAgKiBidXQgaGF2ZSBub3QgYW5kIHRoZW4gcmVzY2hlZHVsZXMgdGhlbS4gIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQKLSAgICAgICAgICogYXQgYm9vdCB0aW1lIHRvIHJlc3RvcmUgYWxhcm1zIHRoYXQgbWF5IGhhdmUgYmVlbiBsb3N0IGR1ZSB0byBhCi0gICAgICAgICAqIHBob25lIHJlYm9vdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdGhlIENvbnRleHQKLSAgICAgICAgICogQHBhcmFtIG1hbmFnZXIgdGhlIEFsYXJtTWFuYWdlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlc2NoZWR1bGVNaXNzZWRBbGFybXMoQ29udGVudFJlc29sdmVyIGNyLAotICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQWxhcm1NYW5hZ2VyIG1hbmFnZXIpIHsKLSAgICAgICAgICAgIC8vIEdldCBhbGwgdGhlIGFsZXJ0cyB0aGF0IGhhdmUgYmVlbiBzY2hlZHVsZWQgYnV0IGhhdmUgbm90IGZpcmVkCi0gICAgICAgICAgICAvLyBhbmQgc2hvdWxkIGhhdmUgZmlyZWQgYnkgbm93IGFuZCBhcmUgbm90IHRvbyBvbGQuCi0gICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgbG9uZyBhbmNpZW50ID0gbm93IC0gRGF0ZVV0aWxzLkRBWV9JTl9NSUxMSVM7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcm9qZWN0aW9uID0gbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgQUxBUk1fVElNRSwKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGNvbnN0cnVjdCBhbiBleHBsaWNpdCBTUUwgcXVlcnkgc28gdGhhdCB3ZSBjYW4gYWRkCi0gICAgICAgICAgICAvLyAiR1JPVVBCWSIgaW5zdGVhZCBvZiBkb2luZyBhIHNvcnQgYW5kIGRlLWR1cAotICAgICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IENhbGVuZGFyQWxlcnRzLnF1ZXJ5KGNyLAotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICBXSEVSRV9SRVNDSEVEVUxFX01JU1NFRF9BTEFSTVMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG5vdyksCi0gICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKGFuY2llbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhub3cpCi0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgIFNPUlRfT1JERVJfQUxBUk1USU1FX0FTQyk7Ci0gICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1pc3NlZCBhbGFybXMgZm91bmQ6ICIgKyBjdXJzb3IuZ2V0Q291bnQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBhbGFybVRpbWUgPSAtMTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IubW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgbmV3QWxhcm1UaW1lID0gY3Vyc29yLmdldExvbmcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbGFybVRpbWUgIT0gbmV3QWxhcm1UaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZXNjaGVkdWxpbmcgbWlzc2VkIGFsYXJtLiBhbGFybVRpbWU6ICIgKyBuZXdBbGFybVRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVBbGFybShjb250ZXh0LCBtYW5hZ2VyLCBuZXdBbGFybVRpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gbmV3QWxhcm1UaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzY2hlZHVsZUFsYXJtKENvbnRleHQgY29udGV4dCwgQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIGxvbmcgYWxhcm1UaW1lKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBUaW1lIHRpbWUgPSBuZXcgVGltZSgpOwotICAgICAgICAgICAgICAgIHRpbWUuc2V0KGFsYXJtVGltZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVkVGltZSA9IHRpbWUuZm9ybWF0KCIgJWEsICViICVkLCAlWSAlSTolTSVQIik7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2NoZWR1bGUgYWxhcm0gYXQgIiArIGFsYXJtVGltZSArICIgIiArIHNjaGVkVGltZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyID0gKEFsYXJtTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEVWRU5UX1JFTUlOREVSX0FDVElPTik7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChDYWxlbmRhci5DT05URU5UX1VSSSwgYWxhcm1UaW1lKSk7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQUxBUk1fVElNRSwgYWxhcm1UaW1lKTsKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdChjb250ZXh0LCAwLCBpbnRlbnQsIDApOwotICAgICAgICAgICAgbWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLlJUQ19XQUtFVVAsIGFsYXJtVGltZSwgcGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlYXJjaGVzIGZvciBhbiBlbnRyeSBpbiB0aGUgQ2FsZW5kYXJBbGVydHMgdGFibGUgdGhhdCBtYXRjaGVzCi0gICAgICAgICAqIHRoZSBnaXZlbiBldmVudCBpZCwgYmVnaW4gdGltZSBhbmQgYWxhcm0gdGltZS4gIElmIG9uZSBpcyBmb3VuZAotICAgICAgICAgKiB0aGVuIHRoaXMgYWxhcm0gYWxyZWFkeSBleGlzdHMgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKLSAgICAgICAgICogQHBhcmFtIGV2ZW50SWQgdGhlIGV2ZW50IGlkIHRvIG1hdGNoCi0gICAgICAgICAqIEBwYXJhbSBiZWdpbiB0aGUgc3RhcnQgdGltZSBvZiB0aGUgZXZlbnQgaW4gVVRDIG1pbGxpcwotICAgICAgICAgKiBAcGFyYW0gYWxhcm1UaW1lIHRoZSBhbGFybSB0aW1lIG9mIHRoZSBldmVudCBpbiBVVEMgbWlsbGlzCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFsYXJtIGZvciB0aGUgZ2l2ZW4gZXZlbnQKLSAgICAgICAgICogICB3aXRoIHRoZSBzYW1lIHN0YXJ0IHRpbWUgYW5kIGFsYXJtIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxhcm1FeGlzdHMoQ29udGVudFJlc29sdmVyIGNyLCBsb25nIGV2ZW50SWQsCi0gICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBhbGFybVRpbWUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGNvbnN0cnVjdCBhbiBleHBsaWNpdCBTUUwgcXVlcnkgc28gdGhhdCB3ZSBjYW4gYWRkCi0gICAgICAgICAgICAvLyAiTElNSVQgMSIgdG8gdGhlIGVuZCBhbmQgZ2V0IGp1c3Qgb25lIHJlc3VsdC4KLSAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10geyBBTEFSTV9USU1FIH07Ci0gICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gcXVlcnkoY3IsCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIFdIRVJFX0FMQVJNX0VYSVNUUywKLSAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoZXZlbnRJZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKGJlZ2luKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoYWxhcm1UaW1lKQotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsICYmIGN1cnNvci5nZXRDb3VudCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZvdW5kOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBFeHRlbmRlZFByb3BlcnRpZXNDb2x1bW5zIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBldmVudCB0aGUgZXh0ZW5kZWQgcHJvcGVydHkgYmVsb25ncyB0bwotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChmb3JlaWduIGtleSB0byB0aGUgRXZlbnRzIHRhYmxlKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGV4dGVuZGVkIHByb3BlcnR5LiAgVGhpcyBpcyBhIHVyaSBvZiB0aGUgZm9ybQotICAgICAgICAgKiB7c2NoZW1lfSN7bG9jYWwtbmFtZX0gY29udmVudGlvbi4KLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgcHJvcGVydHkuCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7Ci0gICAgfQotCi0gICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV4dGVuZGVkUHJvcGVydGllcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLAotICAgICAgICAgICAgRXh0ZW5kZWRQcm9wZXJ0aWVzQ29sdW1ucywgRXZlbnRzQ29sdW1ucyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KLSAgICAgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9leHRlbmRlZHByb3BlcnRpZXMiKTsKLQotICAgICAgICAvLyBUT0RPOiBmaWxsIG91dCB0aGlzIGNsYXNzIHdoZW4gd2UgYWN0dWFsbHkgc3RhcnQgdXRpbGl6aW5nIGV4dGVuZGVkcHJvcGVydGllcwotICAgICAgICAvLyBpbiB0aGUgY2FsZW5kYXIgYXBwbGljYXRpb24uCi0gICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHRhYmxlIHByb3ZpZGVkIGZvciBzeW5jIGFkYXB0ZXJzIHRvIHVzZSBmb3Igc3RvcmluZyBwcml2YXRlIHN5bmMgc3RhdGUgZGF0YS4KLSAgICAgKgotICAgICAqIEBzZWUgU3luY1N0YXRlQ29udHJhY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN5bmNTdGF0ZSBpbXBsZW1lbnRzIFN5bmNTdGF0ZUNvbnRyYWN0LkNvbHVtbnMgewotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyB1dGlsaXR5IGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3luY1N0YXRlKCkge30KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RJUkVDVE9SWSA9Ci0gICAgICAgICAgICAgICAgU3luY1N0YXRlQ29udHJhY3QuQ29uc3RhbnRzLkNPTlRFTlRfRElSRUNUT1JZOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkkgZm9yIHRoaXMgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0KLSAgICAgICAgICAgICAgICBVcmkud2l0aEFwcGVuZGVkUGF0aChDYWxlbmRhci5DT05URU5UX1VSSSwgQ09OVEVOVF9ESVJFQ1RPUlkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbHVtbnMgZnJvbSB0aGUgRXZlbnRzUmF3VGltZXMgdGFibGUKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgY29ycmVzcG9uZGluZyBldmVudCBpZAotICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IHN0YXJ0cwotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVF8yNDQ1ID0gImR0c3RhcnQyNDQ1IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IGVuZHMKLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EXzI0NDUgPSAiZHRlbmQyNDQ1IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IG9yaWdpbmFsIGluc3RhbmNlIHRpbWUgb2YgdGhlIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcwotICAgICAgICAgKiBldmVudCBpcyBhbiBleGNlcHRpb24uCi0gICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JTlNUQU5DRV9USU1FXzI0NDUgPSAib3JpZ2luYWxJbnN0YW5jZVRpbWUyNDQ1IjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IGxhc3QgZGF0ZSB0aGlzIGV2ZW50IHJlcGVhdHMgb24sIG9yIE5VTEwgaWYgaXQgbmV2ZXIgZW5kcwotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9EQVRFXzI0NDUgPSAibGFzdERhdGUyNDQ1IjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV2ZW50c1Jhd1RpbWVzIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIEV2ZW50c1Jhd1RpbWVzQ29sdW1ucyB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXJDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsZW5kYXJDb250cmFjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjhlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxlbmRhckNvbnRyYWN0LmphdmEKQEAgLTAsMCArMSwyNDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOworCisKK2ltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ3Vyc29yRW50aXR5SXRlcmF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkVudGl0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRW50aXR5SXRlcmF0b3I7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKK2ltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkRhdGFiYXNlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogPHA+CisgKiBUaGUgY29udHJhY3QgYmV0d2VlbiB0aGUgY2FsZW5kYXIgcHJvdmlkZXIgYW5kIGFwcGxpY2F0aW9ucy4gQ29udGFpbnMKKyAqIGRlZmluaXRpb25zIGZvciB0aGUgc3VwcG9ydGVkIFVSSXMgYW5kIGRhdGEgY29sdW1ucy4KKyAqIDwvcD4KKyAqIDxoMz5PdmVydmlldzwvaDM+CisgKiA8cD4KKyAqIENhbGVuZGFyQ29udHJhY3QgZGVmaW5lcyB0aGUgZGF0YSBtb2RlbCBvZiBjYWxlbmRhciBhbmQgZXZlbnQgcmVsYXRlZAorICogaW5mb3JtYXRpb24uIFRoaXMgZGF0YSBpcyBzdG9yZWQgaW4gYSBudW1iZXIgb2YgdGFibGVzOgorICogPC9wPgorICogPHVsPgorICogPGxpPlRoZSB7QGxpbmsgQ2FsZW5kYXJzfSB0YWJsZSBob2xkcyB0aGUgY2FsZW5kYXIgc3BlY2lmaWMgaW5mb3JtYXRpb24uIEVhY2gKKyAqIHJvdyBpbiB0aGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBkZXRhaWxzIGZvciBhIHNpbmdsZSBjYWxlbmRhciwgc3VjaCBhcyB0aGUKKyAqIG5hbWUsIGNvbG9yLCBzeW5jIGluZm8sIGV0Yy48L2xpPgorICogPGxpPlRoZSB7QGxpbmsgRXZlbnRzfSB0YWJsZSBob2xkcyB0aGUgZXZlbnQgc3BlY2lmaWMgaW5mb3JtYXRpb24uIEVhY2ggcm93CisgKiBpbiB0aGlzIHRhYmxlIGhhcyB0aGUgaW5mbyBmb3IgYSBzaW5nbGUgZXZlbnQuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIHN1Y2gKKyAqIGFzIGV2ZW50IHRpdGxlLCBsb2NhdGlvbiwgc3RhcnQgdGltZSwgZW5kIHRpbWUsIGV0Yy4gVGhlIGV2ZW50IGNhbiBvY2N1cgorICogb25lLXRpbWUgb3IgY2FuIHJlY3VyIG11bHRpcGxlIHRpbWVzLiBBdHRlbmRlZXMsIHJlbWluZGVycywgYW5kIGV4dGVuZGVkCisgKiBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgb24gc2VwYXJhdGUgdGFibGVzIGFuZCByZWZlcmVuY2UgdGhlIHtAbGluayBFdmVudHMjX0lEfQorICogdG8gbGluayB0aGVtIHdpdGggdGhlIGV2ZW50LjwvbGk+CisgKiA8bGk+VGhlIHtAbGluayBJbnN0YW5jZXN9IHRhYmxlIGhvbGRzIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUgZm9yIG9jY3VycmVuY2VzCisgKiBvZiBhbiBldmVudC4gRWFjaCByb3cgaW4gdGhpcyB0YWJsZSByZXByZXNlbnRzIGEgc2luZ2xlIG9jY3VycmVuY2UuIEZvcgorICogb25lLXRpbWUgZXZlbnRzIHRoZXJlIHdpbGwgYmUgYSAxOjEgbWFwcGluZyBvZiBpbnN0YW5jZXMgdG8gZXZlbnRzLiBGb3IKKyAqIHJlY3VycmluZyBldmVudHMsIG11bHRpcGxlIHJvd3Mgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGdlbmVyYXRlZCB3aGljaAorICogY29ycmVzcG9uZCB0byBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGF0IGV2ZW50LjwvbGk+CisgKiA8bGk+VGhlIHtAbGluayBBdHRlbmRlZXN9IHRhYmxlIGhvbGRzIHRoZSBldmVudCBhdHRlbmRlZSBvciBndWVzdAorICogaW5mb3JtYXRpb24uIEVhY2ggcm93IHJlcHJlc2VudHMgYSBzaW5nbGUgZ3Vlc3Qgb2YgYW4gZXZlbnQuIEl0IHNwZWNpZmllcyB0aGUKKyAqIHR5cGUgb2YgZ3Vlc3QgdGhleSBhcmUgYW5kIHRoZWlyIGF0dGVuZGFuY2UgcmVzcG9uc2UgZm9yIHRoZSBldmVudC48L2xpPgorICogPGxpPlRoZSB7QGxpbmsgUmVtaW5kZXJzfSB0YWJsZSBob2xkcyB0aGUgYWxlcnQvbm90aWZpY2F0aW9uIGRhdGEuIEVhY2ggcm93CisgKiByZXByZXNlbnRzIGEgc2luZ2xlIGFsZXJ0IGZvciBhbiBldmVudC4gQW4gZXZlbnQgY2FuIGhhdmUgbXVsdGlwbGUgcmVtaW5kZXJzLgorICogVGhlIG51bWJlciBvZiByZW1pbmRlcnMgcGVyIGV2ZW50IGlzIHNwZWNpZmllZCBpbgorICoge0BsaW5rIENhbGVuZGFycyNNQVhfUkVNSU5ERVJTfSB3aGljaCBpcyBzZXQgYnkgdGhlIFN5bmMgQWRhcHRlciB0aGF0IG93bnMKKyAqIHRoZSBnaXZlbiBjYWxlbmRhci4gUmVtaW5kZXJzIGFyZSBzcGVjaWZpZWQgaW4gbWludXRlcyBiZWZvcmUgdGhlIGV2ZW50IGFuZAorICogaGF2ZSBhIHR5cGUuPC9saT4KKyAqIDxsaT5UaGUge0BsaW5rIEV4dGVuZGVkUHJvcGVydGllc30gdGFibGUgaG9sZCBvcGFxdWUgZGF0YSBmaWVsZHMgdXNlZCBieSB0aGUKKyAqIHN5bmMgYWRhcHRlci4gVGhlIHByb3ZpZGVyIHRha2VzIG5vIGFjdGlvbiB3aXRoIGl0ZW1zIGluIHRoaXMgdGFibGUgZXhjZXB0IHRvCisgKiBkZWxldGUgdGhlbSB3aGVuIHRoZWlyIHJlbGF0ZWQgZXZlbnRzIGFyZSBkZWxldGVkLjwvbGk+CisgKiA8L3VsPgorICogPHA+CisgKiBPdGhlciB0YWJsZXMgaW5jbHVkZToKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT4KKyAqIHtAbGluayBTeW5jU3RhdGV9LCB3aGljaCBjb250YWlucyBmcmVlLWZvcm0gZGF0YSBtYWludGFpbmVkIGJ5IHRoZSBzeW5jCisgKiBhZGFwdGVyczwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDYWxlbmRhckNvbnRyYWN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNhbGVuZGFyIjsKKworICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBBY3Rpb246IFRoaXMgaXMgdGhlIGludGVudCB0aGF0IGdldHMgZmlyZWQgd2hlbiBhbiBhbGFybQorICAgICAqIG5vdGlmaWNhdGlvbiBuZWVkcyB0byBiZSBwb3N0ZWQgZm9yIGEgcmVtaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfUkVNSU5ERVJfQUNUSU9OID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5FVkVOVF9SRU1JTkRFUiI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlbnQgRXh0cmFzIGtleTogVGhlIHN0YXJ0IHRpbWUgb2YgYW4gZXZlbnQgb3IgYW4gaW5zdGFuY2Ugb2YgYQorICAgICAqIHJlY3VycmluZyBldmVudC4gKG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9CRUdJTl9USU1FID0gImJlZ2luVGltZSI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlbnQgRXh0cmFzIGtleTogVGhlIGVuZCB0aW1lIG9mIGFuIGV2ZW50IG9yIGFuIGluc3RhbmNlIG9mIGEgcmVjdXJyaW5nCisgICAgICogZXZlbnQuIChtaWxsaXNlY29uZHMgc2luY2UgZXBvY2gpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfRU5EX1RJTUUgPSAiZW5kVGltZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGF1dGhvcml0eSBpcyB1c2VkIGZvciB3cml0aW5nIHRvIG9yIHF1ZXJ5aW5nIGZyb20gdGhlIGNhbGVuZGFyCisgICAgICogcHJvdmlkZXIuIE5vdGU6IFRoaXMgaXMgc2V0IGF0IGZpcnN0IHJ1biBhbmQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dAorICAgICAqIGJyZWFraW5nIGFwcHMgdGhhdCBhY2Nlc3MgdGhlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC5jYWxlbmRhciI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHRoZSB0b3AtbGV2ZWwgY2FsZW5kYXIgYXV0aG9yaXR5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZKTsKKworICAgIC8qKgorICAgICAqIEFuIG9wdGlvbmFsIGluc2VydCwgdXBkYXRlIG9yIGRlbGV0ZSBVUkkgcGFyYW1ldGVyIHRoYXQgYWxsb3dzIHRoZSBjYWxsZXIKKyAgICAgKiB0byBzcGVjaWZ5IHRoYXQgaXQgaXMgYSBzeW5jIGFkYXB0ZXIuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBJZiBzZXQKKyAgICAgKiB0byB0cnVlLCB0aGUgbW9kaWZpZWQgcm93IGlzIG5vdCBtYXJrZWQgYXMgImRpcnR5IiAobmVlZHMgdG8gYmUgc3luY2VkKQorICAgICAqIGFuZCB3aGVuIHRoZSBwcm92aWRlciBjYWxscworICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKGFuZHJvaWQubmV0LlVyaSwgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pfQorICAgICAqICwgdGhlIHRoaXJkIHBhcmFtZXRlciAic3luY1RvTmV0d29yayIgaXMgc2V0IHRvIGZhbHNlLiBGdXJ0aGVybW9yZSwgaWYKKyAgICAgKiBzZXQgdG8gdHJ1ZSwgdGhlIGNhbGxlciBtdXN0IGFsc28gaW5jbHVkZQorICAgICAqIHtAbGluayBDYWxlbmRhcnMjQUNDT1VOVF9OQU1FfSBhbmQge0BsaW5rIENhbGVuZGFycyNBQ0NPVU5UX1RZUEV9IGFzCisgICAgICogcXVlcnkgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBzZWUgVXJpLkJ1aWxkZXIjYXBwZW5kUXVlcnlQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMRVJfSVNfU1lOQ0FEQVBURVIgPSAiY2FsbGVyX2lzX3N5bmNhZGFwdGVyIjsKKworICAgIC8qKgorICAgICAqIEEgc3BlY2lhbCBhY2NvdW50IHR5cGUgZm9yIGNhbGVuZGFycyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBhY2NvdW50LgorICAgICAqIE5vcm1hbGx5IGNhbGVuZGFycyB0aGF0IGRvIG5vdCBtYXRjaCBhbiBhY2NvdW50IG9uIHRoZSBkZXZpY2Ugd2lsbCBiZQorICAgICAqIHJlbW92ZWQuIFNldHRpbmcgdGhlIGFjY291bnRfdHlwZSBvbiBhIGNhbGVuZGFyIHRvIHRoaXMgd2lsbCBwcmV2ZW50IGl0CisgICAgICogZnJvbSBiZWluZyB3aXBlZCBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbiBleGlzdGluZyBhY2NvdW50LgorICAgICAqCisgICAgICogQHNlZSBTeW5jQ29sdW1ucyNBQ0NPVU5UX1RZUEUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX1RZUEVfTE9DQUwgPSAiTE9DQUwiOworCisgICAgLyoqCisgICAgICogR2VuZXJpYyBjb2x1bW5zIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gVGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBvZiB0aGVzZQorICAgICAqIGNvbHVtbnMgYXJlIHByaXZhdGUgdG8gdGhlIHN5bmMgYWRhcHRlci4gT3RoZXIgY2xpZW50cyBvZiB0aGUgQVBJIHNob3VsZAorICAgICAqIG5vdCBhdHRlbXB0IHRvIGVpdGhlciByZWFkIG9yIHdyaXRlIHRoaXMgY29sdW1uLiBUaGVzZSBjb2x1bW5zIGFyZQorICAgICAqIGVkaXRhYmxlIGFzIHBhcnQgb2YgdGhlIENhbGVuZGFycyBVcmksIGJ1dCBjYW4gb25seSBiZSByZWFkIGlmIGFjY2Vzc2VkCisgICAgICogdGhyb3VnaCBhbnkgb3RoZXIgVXJpLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQ2FsZW5kYXJTeW5jQ29sdW1ucyB7CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTF9TWU5DMSA9ICJjYWxfc3luYzEiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMX1NZTkMyID0gImNhbF9zeW5jMiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzMgPSAiY2FsX3N5bmMzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTF9TWU5DNCA9ICJjYWxfc3luYzQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMX1NZTkM1ID0gImNhbF9zeW5jNSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzYgPSAiY2FsX3N5bmM2IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTF9TWU5DNyA9ICJjYWxfc3luYzciOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZW5lcmljIGNvbHVtbiBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMX1NZTkM4ID0gImNhbF9zeW5jOCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdlbmVyaWMgY29sdW1uIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxfU1lOQzkgPSAiY2FsX3N5bmM5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2VuZXJpYyBjb2x1bW4gZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTF9TWU5DMTAgPSAiY2FsX3N5bmMxMCI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmb3IgU3luYyBpbmZvcm1hdGlvbiB1c2VkIGJ5IENhbGVuZGFycyBhbmQgRXZlbnRzIHRhYmxlcy4gVGhlc2UKKyAgICAgKiBoYXZlIHNwZWNpZmljIHVzZXMgd2hpY2ggYXJlIGV4cGVjdGVkIHRvIGJlIGNvbnNpc3RlbnQgYnkgdGhlIGFwcCBhbmQKKyAgICAgKiBzeW5jIGFkYXB0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIFN5bmNDb2x1bW5zIGV4dGVuZHMgQ2FsZW5kYXJTeW5jQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWNjb3VudCB0aGF0IHdhcyB1c2VkIHRvIHN5bmMgdGhlIGVudHJ5IHRvIHRoZSBkZXZpY2UuIElmIHRoZQorICAgICAgICAgKiBhY2NvdW50X3R5cGUgaXMgbm90IHtAbGluayAjQUNDT1VOVF9UWVBFX0xPQ0FMfSB0aGVuIHRoZSBuYW1lIGFuZAorICAgICAgICAgKiB0eXBlIG11c3QgbWF0Y2ggYW4gYWNjb3VudCBvbiB0aGUgZGV2aWNlIG9yIHRoZSBjYWxlbmRhciB3aWxsIGJlCisgICAgICAgICAqIGRlbGV0ZWQuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NPVU5UX05BTUUgPSAiYWNjb3VudF9uYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgdGhlIGFjY291bnQgdGhhdCB3YXMgdXNlZCB0byBzeW5jIHRoZSBlbnRyeSB0byB0aGUKKyAgICAgICAgICogZGV2aWNlLiBBIHR5cGUgb2Yge0BsaW5rICNBQ0NPVU5UX1RZUEVfTE9DQUx9IHdpbGwga2VlcCB0aGlzIGV2ZW50CisgICAgICAgICAqIGZvcm0gYmVpbmcgZGVsZXRlZCBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgYWNjb3VudHMgb24gdGhlIGRldmljZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ09VTlRfVFlQRSA9ICJhY2NvdW50X3R5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdW5pcXVlIElEIGZvciBhIHJvdyBhc3NpZ25lZCBieSB0aGUgc3luYyBzb3VyY2UuIE5VTEwgaWYgdGhlIHJvdworICAgICAgICAgKiBoYXMgbmV2ZXIgYmVlbiBzeW5jZWQuIFRoaXMgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZSBpZCBmb3IgZXhjZXB0aW9ucworICAgICAgICAgKiBhbG9uZyB3aXRoIHtAbGluayBCYXNlQ29sdW1ucyNfSUR9LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1NZTkNfSUQgPSAiX3N5bmNfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIHRvIGluZGljYXRlIHRoYXQgbG9jYWwsIHVuc3luY2VkLCBjaGFuZ2VzIGFyZSBwcmVzZW50LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUlRZID0gImRpcnR5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGUgcm93IGhhcyBiZWVuIGRlbGV0ZWQgYnV0IG5vdCBzeW5jZWQgdG8gdGhlIHNlcnZlci4gQQorICAgICAgICAgKiBkZWxldGVkIHJvdyBzaG91bGQgYmUgaWdub3JlZC4KKyAgICAgICAgICogPFA+CisgICAgICAgICAqIFR5cGU6IElOVEVHRVIgKGJvb2xlYW4pCisgICAgICAgICAqIDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURUQgPSAiZGVsZXRlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHNldCB0byAxIHRoaXMgY2F1c2VzIGV2ZW50cyBvbiB0aGlzIGNhbGVuZGFyIHRvIGJlIGR1cGxpY2F0ZWQgd2l0aAorICAgICAgICAgKiB7QGxpbmsgRXZlbnRzI0xBU1RfU1lOQ0VEfSBzZXQgdG8gMSB3aGVuZXZlciB0aGUgZXZlbnQKKyAgICAgICAgICogdHJhbnNpdGlvbnMgZnJvbSBub24tZGlydHkgdG8gZGlydHkuIFRoZSBkdXBsaWNhdGVkIGV2ZW50IHdpbGwgbm90IGJlCisgICAgICAgICAqIGV4cGFuZGVkIGluIHRoZSBpbnN0YW5jZXMgdGFibGUgYW5kIHdpbGwgb25seSBzaG93IHVwIGluIHN5bmMgYWRhcHRlcgorICAgICAgICAgKiBxdWVyaWVzIG9mIHRoZSBldmVudHMgdGFibGUuIEl0IHdpbGwgYWxzbyBiZSBkZWxldGVkIHdoZW4gdGhlCisgICAgICAgICAqIG9yaWdpbmF0aW5nIGV2ZW50IGhhcyBpdHMgZGlydHkgZmxhZyBjbGVhcmVkIGJ5IHRoZSBzeW5jIGFkYXB0ZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOX1BBUlRJQUxMWV9VUERBVEUgPSAiY2FuUGFydGlhbGx5VXBkYXRlIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIHNwZWNpZmljIHRvIHRoZSBDYWxlbmRhcnMgVXJpIHRoYXQgb3RoZXIgVXJpcyBjYW4gcXVlcnkuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludGVyZmFjZSBDYWxlbmRhcnNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgY2FsZW5kYXIKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoY29sb3IgdmFsdWUpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfQ09MT1IgPSAiY2FsZW5kYXJfY29sb3IiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjYWxlbmRhci4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9ESVNQTEFZX05BTUUgPSAiY2FsZW5kYXJfZGlzcGxheU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbGV2ZWwgb2YgYWNjZXNzIHRoYXQgdGhlIHVzZXIgaGFzIGZvciB0aGUgY2FsZW5kYXIKKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAob25lIG9mIHRoZSB2YWx1ZXMgYmVsb3cpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfQUNDRVNTX0xFVkVMID0gImNhbGVuZGFyX2FjY2Vzc19sZXZlbCI7CisKKyAgICAgICAgLyoqIENhbm5vdCBhY2Nlc3MgdGhlIGNhbGVuZGFyICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTF9BQ0NFU1NfTk9ORSA9IDA7CisgICAgICAgIC8qKiBDYW4gb25seSBzZWUgZnJlZS9idXN5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWxlbmRhciAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxfQUNDRVNTX0ZSRUVCVVNZID0gMTAwOworICAgICAgICAvKiogQ2FuIHJlYWQgYWxsIGV2ZW50IGRldGFpbHMgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMX0FDQ0VTU19SRUFEID0gMjAwOworICAgICAgICAvKiogQ2FuIHJlcGx5IHllcy9uby9tYXliZSB0byBhbiBldmVudCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxfQUNDRVNTX1JFU1BPTkQgPSAzMDA7CisgICAgICAgIC8qKiBub3QgdXNlZCAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxfQUNDRVNTX09WRVJSSURFID0gNDAwOworICAgICAgICAvKiogRnVsbCBhY2Nlc3MgdG8gbW9kaWZ5IHRoZSBjYWxlbmRhciwgYnV0IG5vdCB0aGUgYWNjZXNzIGNvbnRyb2wKKyAgICAgICAgICogc2V0dGluZ3MKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTF9BQ0NFU1NfQ09OVFJJQlVUT1IgPSA1MDA7CisgICAgICAgIC8qKiBGdWxsIGFjY2VzcyB0byBtb2RpZnkgdGhlIGNhbGVuZGFyLCBidXQgbm90IHRoZSBhY2Nlc3MgY29udHJvbAorICAgICAgICAgKiBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMX0FDQ0VTU19FRElUT1IgPSA2MDA7CisgICAgICAgIC8qKiBGdWxsIGFjY2VzcyB0byB0aGUgY2FsZW5kYXIgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMX0FDQ0VTU19PV05FUiA9IDcwMDsKKyAgICAgICAgLyoqIERvbWFpbiBhZG1pbiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxfQUNDRVNTX1JPT1QgPSA4MDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIHRoZSBjYWxlbmRhciBzZWxlY3RlZCB0byBiZSBkaXNwbGF5ZWQ/CisgICAgICAgICAqIDAgLSBkbyBub3Qgc2hvdyBldmVudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsZW5kYXIuCisgICAgICAgICAqIDEgLSBzaG93IGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxlbmRhcgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU0lCTEUgPSAidmlzaWJsZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHpvbmUgdGhlIGNhbGVuZGFyIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTEVOREFSX1RJTUVfWk9ORSA9ICJjYWxlbmRhcl90aW1lem9uZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIHRoaXMgY2FsZW5kYXIgc3luY2VkIGFuZCBhcmUgaXRzIGV2ZW50cyBzdG9yZWQgb24gdGhlIGRldmljZT8KKyAgICAgICAgICogMCAtIERvIG5vdCBzeW5jIHRoaXMgY2FsZW5kYXIgb3Igc3RvcmUgZXZlbnRzIGZvciB0aGlzIGNhbGVuZGFyLgorICAgICAgICAgKiAxIC0gU3luYyBkb3duIGV2ZW50cyBmb3IgdGhpcyBjYWxlbmRhci4KKyAgICAgICAgICogPHA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L3A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0VWRU5UUyA9ICJzeW5jX2V2ZW50cyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvd25lciBhY2NvdW50IGZvciB0aGlzIGNhbGVuZGFyLCBiYXNlZCBvbiB0aGUgY2FsZW5kYXIgZmVlZC4KKyAgICAgICAgICogVGhpcyB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBfU1lOQ19BQ0NPVU5UIGZvciBkZWxlZ2F0ZWQgY2FsZW5kYXJzLgorICAgICAgICAgKiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogU3RyaW5nPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dORVJfQUNDT1VOVCA9ICJvd25lckFjY291bnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW4gdGhlIG9yZ2FuaXplciByZXNwb25kIHRvIHRoZSBldmVudD8gIElmIG5vLCB0aGUgc3RhdHVzIG9mIHRoZQorICAgICAgICAgKiBvcmdhbml6ZXIgc2hvdWxkIG5vdCBiZSBzaG93biBieSB0aGUgVUkuICBEZWZhdWx0cyB0byAxLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5fT1JHQU5JWkVSX1JFU1BPTkQgPSAiY2FuT3JnYW5pemVyUmVzcG9uZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbiB0aGUgb3JnYW5pemVyIG1vZGlmeSB0aGUgdGltZSB6b25lIG9mIHRoZSBldmVudD8gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5fTU9ESUZZX1RJTUVfWk9ORSA9ICJjYW5Nb2RpZnlUaW1lWm9uZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZW1pbmRlcnMgYWxsb3dlZCBmb3IgYW4gZXZlbnQuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1JFTUlOREVSUyA9ICJtYXhSZW1pbmRlcnMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHJlbWluZGVyIG1ldGhvZHMgc3VwcG9ydGVkIGZvciB0aGlzCisgICAgICAgICAqIGNhbGVuZGFyIGluIHRoZSBmb3JtYXQgIiMsIywjIi4gVmFsaWQgdHlwZXMgYXJlCisgICAgICAgICAqIHtAbGluayBSZW1pbmRlcnMjTUVUSE9EX0RFRkFVTFR9LCB7QGxpbmsgUmVtaW5kZXJzI01FVEhPRF9BTEVSVH0sCisgICAgICAgICAqIHtAbGluayBSZW1pbmRlcnMjTUVUSE9EX0VNQUlMfSwge0BsaW5rIFJlbWluZGVycyNNRVRIT0RfU01TfS4gQ29sdW1uCisgICAgICAgICAqIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExPV0VEX1JFTUlOREVSUyA9ICJhbGxvd2VkUmVtaW5kZXJzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBDYWxlbmRhciBFbnRpdHkuIFRoZXJlIGlzIG9uZSBlbnRyeSBwZXIgY2FsZW5kYXIuCisgICAgICogVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0byBtYWtlIGJhdGNoIG9wZXJhdGlvbnMgZWFzaWVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FsZW5kYXJzRW50aXR5IGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIFN5bmNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgVXJpIHVzZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBjYWxlbmRhciBFbnRpdHlJdGVyYXRvci4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvY2FsZW5kYXJfZW50aXRpZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBlbnRpdHkgaXRlcmF0b3IgZm9yIHRoZSBnaXZlbiBjdXJzb3IuIEl0IGFzc3VtZXMgdGhlCisgICAgICAgICAqIGN1cnNvciBjb250YWlucyBhIGNhbGVuZGFycyBxdWVyeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGN1cnNvciBxdWVyeSBvbiB7QGxpbmsgI0NPTlRFTlRfVVJJfQorICAgICAgICAgKiBAcmV0dXJuIGFuIEVudGl0eUl0ZXJhdG9yIG9mIGNhbGVuZGFycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJdGVyYXRvciBuZXdFbnRpdHlJdGVyYXRvcihDdXJzb3IgY3Vyc29yKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5SXRlcmF0b3JJbXBsIGV4dGVuZHMgQ3Vyc29yRW50aXR5SXRlcmF0b3IgeworCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihjdXJzb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5QW5kSW5jcmVtZW50Q3Vyc29yKEN1cnNvciBjdXJzb3IpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgY3Vyc29yIGlzIGFscmVhZHkgYXQgdGhlIHJvdyB3ZSBuZWVkIHRvIHJlYWQgZnJvbQorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY2FsZW5kYXJJZCA9IGN1cnNvci5nZXRMb25nKGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coX0lEKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbnRlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBjdi5wdXQoX0lELCBjYWxlbmRhcklkKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEFDQ09VTlRfTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQUNDT1VOVF9UWVBFKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRElSVFkpOworCisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkMxKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzIpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DMyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkM0KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DNik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkM3KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzgpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DOSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkMxMCk7CisKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDYWxlbmRhcnMuTkFNRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5DQUxFTkRBUl9ESVNQTEFZX05BTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuQ0FMRU5EQVJfQ09MT1IpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTEVOREFSX0FDQ0VTU19MRVZFTCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgVklTSUJMRSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19FVkVOVFMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsCisgICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcnMuQ0FMRU5EQVJfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTEVOREFSX1RJTUVfWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5PV05FUl9BQ0NPVU5UKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkNBTl9PUkdBTklaRVJfUkVTUE9ORCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5DQU5fTU9ESUZZX1RJTUVfWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFycy5NQVhfUkVNSU5ERVJTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkNBTl9QQVJUSUFMTFlfVVBEQVRFKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJzLkFMTE9XRURfUkVNSU5ERVJTKTsKKworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERFTEVURUQpOworCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBFbnRpdHkgZnJvbSB0aGUgQ29udGVudFZhbHVlCisgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IGN1cnNvciB0byBuZXh0IHJvdworICAgICAgICAgICAgICAgIGN1cnNvci5tb3ZlVG9OZXh0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNyZWF0ZWQgRW50aXR5CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudHMgYW5kIGhlbHBlcnMgZm9yIHRoZSBDYWxlbmRhcnMgdGFibGUsIHdoaWNoIGNvbnRhaW5zIGRldGFpbHMgZm9yCisgICAgICogaW5kaXZpZHVhbCBjYWxlbmRhcnMuIDxoMz5PcGVyYXRpb25zPC9oMz4gQWxsIG9wZXJhdGlvbnMgY2FuIGJlIGRvbmUKKyAgICAgKiBlaXRoZXIgYXMgYW4gYXBwIG9yIGFzIGEgc3luYyBhZGFwdGVyLiBUbyBwZXJmb3JtIGFuIG9wZXJhdGlvbiBhcyBhIHN5bmMKKyAgICAgKiBhZGFwdGVyIHtAbGluayAjQ0FMTEVSX0lTX1NZTkNBREFQVEVSfSBzaG91bGQgYmUgc2V0IHRvIHRydWUgYW5kCisgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9IGFuZCB7QGxpbmsgI0FDQ09VTlRfVFlQRX0gbXVzdCBiZSBzZXQgaW4gdGhlIFVyaQorICAgICAqIHBhcmFtZXRlcnMuIFNlZQorICAgICAqIHtAbGluayBVcmkuQnVpbGRlciNhcHBlbmRRdWVyeVBhcmFtZXRlcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0KKyAgICAgKiBmb3IgZGV0YWlscyBvbiBhZGRpbmcgcGFyYW1ldGVycy4gU3luYyBhZGFwdGVycyBoYXZlIHdyaXRlIGFjY2VzcyB0byBtb3JlCisgICAgICogY29sdW1ucyBidXQgYXJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgYWNjb3VudCBhdCBhIHRpbWUuIENhbGVuZGFycyBhcmUKKyAgICAgKiBkZXNpZ25lZCB0byBiZSBwcmltYXJpbHkgbWFuYWdlZCBieSBhIHN5bmMgYWRhcHRlciBhbmQgaW5zZXJ0aW5nIG5ldworICAgICAqIGNhbGVuZGFycyBzaG91bGQgYmUgZG9uZSBhcyBhIHN5bmMgYWRhcHRlci4gRm9yIHRoZSBtb3N0IHBhcnQsIGFwcHMKKyAgICAgKiBzaG91bGQgb25seSB1cGRhdGUgY2FsZW5kYXJzIChzdWNoIGFzIGNoYW5naW5nIHRoZSBjb2xvciBvciBkaXNwbGF5CisgICAgICogbmFtZSkuIElmIGEgbG9jYWwgY2FsZW5kYXIgaXMgcmVxdWlyZWQgYW4gYXBwIGNhbiBkbyBzbyBieSBpbnNlcnRpbmcgYXMgYQorICAgICAqIHN5bmMgYWRhcHRlciBhbmQgdXNpbmcgYW4ge0BsaW5rICNBQ0NPVU5UX1RZUEV9IG9mCisgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEVfTE9DQUx9IC4KKyAgICAgKiA8ZGw+CisgICAgICogPGR0PjxiPkluc2VydDwvYj48L2R0PgorICAgICAqIDxkZD5XaGVuIGluc2VydGluZyBhIG5ldyBjYWxlbmRhciB0aGUgZm9sbG93aW5nIGZpZWxkcyBtdXN0IGJlIGluY2x1ZGVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNBQ0NPVU5UX05BTUV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNBQ0NPVU5UX1RZUEV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQU1FfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FMRU5EQVJfRElTUExBWV9OQU1FfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FMRU5EQVJfQ09MT1J9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxFTkRBUl9BQ0NFU1NfTEVWRUx9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNPV05FUl9BQ0NPVU5UfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IHJlcXVpcmVkIHdoZW4gaW5zZXJ0aW5nIGEgQ2FsZW5kYXIgYnV0IGFyZQorICAgICAqIGdlbmVyYWxseSBhIGdvb2QgaWRlYSB0byBpbmNsdWRlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNTWU5DX0VWRU5UU30gc2V0IHRvIDE8L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0NBTEVOREFSX1RJTUVfWk9ORX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0FMTE9XRURfUkVNSU5ERVJTfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8ZHQ+PGI+VXBkYXRlPC9iPjwvZHQ+CisgICAgICogPGRkPlRvIHBlcmZvcm0gYW4gdXBkYXRlIG9uIGEgY2FsZW5kYXIgdGhlIHtAbGluayAjX0lEfSBvZiB0aGUgY2FsZW5kYXIKKyAgICAgKiBzaG91bGQgYmUgcHJvdmlkZWQgZWl0aGVyIGFzIGFuIGFwcGVuZGVkIGlkIHRvIHRoZSBVcmkgKAorICAgICAqIHtAbGluayBDb250ZW50VXJpcyN3aXRoQXBwZW5kZWRJZH0pIG9yIGFzIHRoZSBmaXJzdCBzZWxlY3Rpb24gaXRlbS0tdGhlCisgICAgICogc2VsZWN0aW9uIHNob3VsZCBzdGFydCB3aXRoICJfaWQ9PyIgYW5kIHRoZSBmaXJzdCBzZWxlY3Rpb25Bcmcgc2hvdWxkIGJlCisgICAgICogdGhlIF9pZCBvZiB0aGUgY2FsZW5kYXIuIENhbGVuZGFycyBtYXkgYWxzbyBiZSB1cGRhdGVkIHVzaW5nIGEgc2VsZWN0aW9uCisgICAgICogd2l0aG91dCB0aGUgaWQuIEluIGdlbmVyYWwsIHRoZSB7QGxpbmsgI0FDQ09VTlRfTkFNRX0gYW5kCisgICAgICoge0BsaW5rICNBQ0NPVU5UX1RZUEV9IHNob3VsZCBub3QgYmUgY2hhbmdlZCBhZnRlciBhIGNhbGVuZGFyIGlzIGNyZWF0ZWQKKyAgICAgKiBhcyB0aGlzIGNhbiBjYXVzZSBpc3N1ZXMgZm9yIHN5bmMgYWRhcHRlcnMuCisgICAgICogPGR0PjxiPkRlbGV0ZTwvYj48L2R0PgorICAgICAqIDxkZD5DYWxlbmRhcnMgY2FuIGJlIGRlbGV0ZWQgZWl0aGVyIGJ5IHRoZSB7QGxpbmsgI19JRH0gYXMgYW4gYXBwZW5kZWQgaWQKKyAgICAgKiBvbiB0aGUgVXJpIG9yIHVzaW5nIGFueSBzdGFuZGFyZCBzZWxlY3Rpb24uIERlbGV0aW5nIGEgY2FsZW5kYXIgc2hvdWxkCisgICAgICogZ2VuZXJhbGx5IGJlIGhhbmRsZWQgYnkgYSBzeW5jIGFkYXB0ZXIgYXMgaXQgd2lsbCByZW1vdmUgdGhlIGNhbGVuZGFyCisgICAgICogZnJvbSB0aGUgZGF0YWJhc2UgYW5kIGFsbCBhc3NvY2lhdGVkIGRhdGEgKGFrYSBldmVudHMpLjwvZGQ+CisgICAgICogPGR0PjxiPlF1ZXJ5PC9iPjwvZHQ+CisgICAgICogPGRkPlF1ZXJ5aW5nIHRoZSBDYWxlbmRhcnMgdGFibGUgd2lsbCBnZXQgeW91IGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhIHNldAorICAgICAqIG9mIGNhbGVuZGFycy4gVGhlcmUgd2lsbCBiZSBvbmUgcm93IHJldHVybmVkIGZvciBlYWNoIGNhbGVuZGFyIHRoYXQKKyAgICAgKiBtYXRjaGVzIHRoZSBxdWVyeSBzZWxlY3Rpb24sIG9yIGF0IG1vc3QgYSBzaW5nbGUgcm93IGlmIHRoZSB7QGxpbmsgI19JRH0KKyAgICAgKiBpcyBhcHBlbmRlZCB0byB0aGUgVXJpLjwvZGQ+CisgICAgICogPC9kbD4KKyAgICAgKiA8aDM+Q2FsZW5kYXIgQ29sdW1uczwvaDM+IFRoZSBmb2xsb3dpbmcgQ2FsZW5kYXIgY29sdW1ucyBhcmUgd3JpdGFibGUgYnkKKyAgICAgKiBib3RoIGFuIGFwcCBhbmQgYSBzeW5jIGFkYXB0ZXIuCisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI05BTUV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxFTkRBUl9ESVNQTEFZX05BTUV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxFTkRBUl9DT0xPUn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1ZJU0lCTEV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNTWU5DX0VWRU5UU308L2xpPgorICAgICAqIDwvdWw+CisgICAgICogVGhlIGZvbGxvd2luZyBDYWxlbmRhcnMgY29sdW1ucyBhcmUgd3JpdGFibGUgb25seSBieSBhIHN5bmMgYWRhcHRlcgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rICNBQ0NPVU5UX05BTUV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNBQ0NPVU5UX1RZUEV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNfU1lOQ19JRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0RJUlRZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjT1dORVJfQUNDT1VOVH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI01BWF9SRU1JTkRFUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNBTExPV0VEX1JFTUlOREVSU308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0NBTl9NT0RJRllfVElNRV9aT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FOX09SR0FOSVpFUl9SRVNQT05EfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQ0FOX1BBUlRJQUxMWV9VUERBVEV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxFTkRBUl9MT0NBVElPTn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0NBTEVOREFSX1RJTUVfWk9ORX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0NBTEVOREFSX0FDQ0VTU19MRVZFTH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0RFTEVURUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzF9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzJ9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzZ9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzd9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzh9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzl9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNDQUxfU1lOQzEwfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBTeW5jQ29sdW1ucywgQ2FsZW5kYXJzQ29sdW1ucyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9ERUxFVEVfRk9SX0FDQ09VTlQgPSBDYWxlbmRhcnMuQUNDT1VOVF9OQU1FICsgIj0/IgorICAgICAgICAgICAgICAgICsgIiBBTkQgIgorICAgICAgICAgICAgICAgICsgQ2FsZW5kYXJzLkFDQ09VTlRfVFlQRSArICI9PyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgZ2VuZXJhdGluZyBhIGNhbGVuZGFycyBxdWVyeS4gVGhpcyBpcyBibG9ja2luZworICAgICAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSBVSSB0aHJlYWQuIFNlZQorICAgICAgICAgKiB7QGxpbmsgQ29udGVudFJlc29sdmVyI3F1ZXJ5KFVyaSwgU3RyaW5nW10sIFN0cmluZywgU3RyaW5nW10sIFN0cmluZyl9CisgICAgICAgICAqIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdXNpbmcgdGhlIHBhcmFtZXRlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciBUaGUgQ29udGVudFJlc29sdmVyIHRvIHF1ZXJ5IHdpdGgKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gQSBsaXN0IG9mIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gQSBmb3JtYXR0ZWQgc2VsZWN0aW9uIHN0cmluZworICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBhcmd1bWVudHMgdG8gdGhlIHNlbGVjdGlvbiBzdHJpbmcKKyAgICAgICAgICogQHBhcmFtIG9yZGVyQnkgSG93IHRvIG9yZGVyIHRoZSByZXR1cm5lZCByb3dzCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwgU3RyaW5nIHNlbGVjdGlvbiwKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLCBTdHJpbmcgb3JkZXJCeSkgeworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KENPTlRFTlRfVVJJLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICAgICAgICAgIG9yZGVyQnkgPT0gbnVsbCA/IERFRkFVTFRfU09SVF9PUkRFUiA6IG9yZGVyQnkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBwZXJmb3JtIGEgZGVsZXRlIG9uIHRoZSBDYWxlbmRhciBwcm92aWRlci4gVGhpcyBpcworICAgICAgICAgKiBhIGJsb2NraW5nIGNhbGwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgdGhlIENvbnRlbnRSZXNvbHZlcgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEEgZmlsdGVyIHRvIGFwcGx5IHRvIHJvd3MgYmVmb3JlIGRlbGV0aW5nLCBmb3JtYXR0ZWQKKyAgICAgICAgICogICAgICAgICAgICBhcyBhbiBTUUwgV0hFUkUgY2xhdXNlIChleGNsdWRpbmcgdGhlIFdIRVJFIGl0c2VsZikuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIEZpbGwgaW4gdGhlICc/J3MgaW4gdGhlIHNlbGVjdGlvbgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiByb3dzIHRoYXQgd2VyZSBkZWxldGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBkZWxldGUoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3IuZGVsZXRlKENPTlRFTlRfVVJJLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBkZWxldGUgYWxsIGNhbGVuZGFycyB0aGF0IG1hdGNoIHRoZSBhY2NvdW50LgorICAgICAgICAgKiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciB0aGUgQ29udGVudFJlc29sdmVyCisgICAgICAgICAqIEBwYXJhbSBhY2NvdW50IHRoZSBhY2NvdW50IHdob3NlIGNhbGVuZGFycyBhbmQgZXZlbnRzIHNob3VsZCBiZQorICAgICAgICAgKiAgICAgICAgICAgIGRlbGV0ZWQKKyAgICAgICAgICogQHJldHVybiB0aGUgY291bnQgb2YgY2FsZW5kYXIgcm93cyB0aGF0IHdlcmUgZGVsZXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZGVsZXRlQ2FsZW5kYXJzRm9yQWNjb3VudChDb250ZW50UmVzb2x2ZXIgY3IsIEFjY291bnQgYWNjb3VudCkgeworICAgICAgICAgICAgLy8gZGVsZXRlIGFsbCBjYWxlbmRhcnMgdGhhdCBtYXRjaCB0aGlzIGFjY291bnQKKyAgICAgICAgICAgIHJldHVybiBDYWxlbmRhckNvbnRyYWN0LkNhbGVuZGFycy5kZWxldGUoY3IsCisgICAgICAgICAgICAgICAgICAgIFdIRVJFX0RFTEVURV9GT1JfQUNDT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgYWNjb3VudC5uYW1lLCBhY2NvdW50LnR5cGUgfSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciBhY2Nlc3NpbmcgQ2FsZW5kYXJzCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9jYWxlbmRhcnMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBvcmRlciBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TT1JUX09SREVSID0gImRpc3BsYXlOYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGxvY2F0aW9uIGZvciB0aGUgY2FsZW5kYXIuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfTE9DQVRJT04gPSAiY2FsZW5kYXJfbG9jYXRpb24iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdGFibGUgYnkgYSBzeW5jIGFkYXB0ZXIuIFRvIG1vZGlmeSB0aGVtIHRoZQorICAgICAgICAgKiBjYWxsZXIgbXVzdCBpbmNsdWRlIHtAbGluayAjQ0FMTEVSX0lTX1NZTkNBREFQVEVSfSwKKyAgICAgICAgICoge0BsaW5rICNBQ0NPVU5UX05BTUV9LCBhbmQge0BsaW5rICNBQ0NPVU5UX1RZUEV9IGluIHRoZSBVcmkncyBxdWVyeQorICAgICAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTWU5DX1dSSVRBQkxFX0NPTFVNTlMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgQUNDT1VOVF9OQU1FLAorICAgICAgICAgICAgQUNDT1VOVF9UWVBFLAorICAgICAgICAgICAgX1NZTkNfSUQsCisgICAgICAgICAgICBESVJUWSwKKyAgICAgICAgICAgIE9XTkVSX0FDQ09VTlQsCisgICAgICAgICAgICBNQVhfUkVNSU5ERVJTLAorICAgICAgICAgICAgQUxMT1dFRF9SRU1JTkRFUlMsCisgICAgICAgICAgICBDQU5fTU9ESUZZX1RJTUVfWk9ORSwKKyAgICAgICAgICAgIENBTl9PUkdBTklaRVJfUkVTUE9ORCwKKyAgICAgICAgICAgIENBTl9QQVJUSUFMTFlfVVBEQVRFLAorICAgICAgICAgICAgQ0FMRU5EQVJfTE9DQVRJT04sCisgICAgICAgICAgICBDQUxFTkRBUl9USU1FX1pPTkUsCisgICAgICAgICAgICBDQUxFTkRBUl9BQ0NFU1NfTEVWRUwsCisgICAgICAgICAgICBERUxFVEVELAorICAgICAgICAgICAgQ0FMX1NZTkMxLAorICAgICAgICAgICAgQ0FMX1NZTkMyLAorICAgICAgICAgICAgQ0FMX1NZTkMzLAorICAgICAgICAgICAgQ0FMX1NZTkM0LAorICAgICAgICAgICAgQ0FMX1NZTkM1LAorICAgICAgICAgICAgQ0FMX1NZTkM2LAorICAgICAgICAgICAgQ0FMX1NZTkM3LAorICAgICAgICAgICAgQ0FMX1NZTkM4LAorICAgICAgICAgICAgQ0FMX1NZTkM5LAorICAgICAgICAgICAgQ0FMX1NZTkMxMCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEF0dGVuZGVlcyB0YWJsZSB0aGF0IG90aGVyIHRhYmxlcyBqb2luIGludG8gdGhlbXNlbHZlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEF0dGVuZGVlc0NvbHVtbnMgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgaWQgb2YgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIGF0dGVuZGVlLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogU1RSSU5HPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRURU5ERUVfTkFNRSA9ICJhdHRlbmRlZU5hbWUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgYXR0ZW5kZWUuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBTVFJJTkc8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9FTUFJTCA9ICJhdHRlbmRlZUVtYWlsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYXR0ZW5kZWUgdG8gdGhlIHVzZXIuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChvbmUgb2Yge0BsaW5rICNSRUxBVElPTlNISVBfQVRURU5ERUV9LCAuLi59LjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEVOREVFX1JFTEFUSU9OU0hJUCA9ICJhdHRlbmRlZVJlbGF0aW9uc2hpcCI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05TSElQX05PTkUgPSAwOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTlNISVBfQVRURU5ERUUgPSAxOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTlNISVBfT1JHQU5JWkVSID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05TSElQX1BFUkZPUk1FUiA9IDM7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OU0hJUF9TUEVBS0VSID0gNDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHR5cGUgb2YgYXR0ZW5kZWUuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJbnRlZ2VyIChvbmUgb2Yge0BsaW5rICNUWVBFX1JFUVVJUkVEfSwge0BsaW5rICNUWVBFX09QVElPTkFMfSk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9UWVBFID0gImF0dGVuZGVlVHlwZSI7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT05FID0gMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9SRVFVSVJFRCA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfT1BUSU9OQUwgPSAyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYXR0ZW5kYW5jZSBzdGF0dXMgb2YgdGhlIGF0dGVuZGVlLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSW50ZWdlciAob25lIG9mIHtAbGluayAjQVRURU5ERUVfU1RBVFVTX0FDQ0VQVEVEfSwgLi4uKS48L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRFTkRFRV9TVEFUVVMgPSAiYXR0ZW5kZWVTdGF0dXMiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVEVOREVFX1NUQVRVU19OT05FID0gMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0FDQ0VQVEVEID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0RFQ0xJTkVEID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRURU5ERUVfU1RBVFVTX0lOVklURUQgPSAzOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRFTkRFRV9TVEFUVVNfVEVOVEFUSVZFID0gNDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWVsZHMgYW5kIGhlbHBlcnMgZm9yIGludGVyYWN0aW5nIHdpdGggQXR0ZW5kZWVzLiBFYWNoIHJvdyBvZiB0aGlzIHRhYmxlCisgICAgICogcmVwcmVzZW50cyBhIHNpbmdsZSBhdHRlbmRlZSBvciBndWVzdCBvZiBhbiBldmVudC4gQ2FsbGluZworICAgICAqIHtAbGluayAjcXVlcnkoQ29udGVudFJlc29sdmVyLCBsb25nKX0gd2lsbCByZXR1cm4gYSBsaXN0IG9mIGF0dGVuZGVlcyBmb3IKKyAgICAgKiB0aGUgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gZXZlbnRJZC4gQm90aCBhcHBzIGFuZCBzeW5jIGFkYXB0ZXJzIG1heSB3cml0ZQorICAgICAqIHRvIHRoaXMgdGFibGUuIFRoZXJlIGFyZSBzaXggd3JpdGFibGUgZmllbGRzIGFuZCBhbGwgb2YgdGhlbSBleGNlcHQKKyAgICAgKiB7QGxpbmsgI0FUVEVOREVFX05BTUV9IG11c3QgYmUgaW5jbHVkZWQgd2hlbiBpbnNlcnRpbmcgYSBuZXcgYXR0ZW5kZWUuCisgICAgICogVGhleSBhcmU6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI0VWRU5UX0lEfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQVRURU5ERUVfTkFNRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0FUVEVOREVFX0VNQUlMfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQVRURU5ERUVfUkVMQVRJT05TSElQfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQVRURU5ERUVfVFlQRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0FUVEVOREVFX1NUQVRVU308L2xpPgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBdHRlbmRlZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgQXR0ZW5kZWVzQ29sdW1ucywgRXZlbnRzQ29sdW1ucyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgYWNjZXNzaW5nIEF0dGVuZGVlcyBkYXRhCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiaGlkaW5nIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9hdHRlbmRlZXMiKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIHRoZSBwcm9qZWN0aW9uIHVzZWQgYnkgdGhlIGF0dGVuZGVlcyBxdWVyeQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICBfSUQsIEFUVEVOREVFX05BTUUsIEFUVEVOREVFX0VNQUlMLCBBVFRFTkRFRV9SRUxBVElPTlNISVAsIEFUVEVOREVFX1NUQVRVUyx9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRURU5ERUVTX1dIRVJFID0gQXR0ZW5kZWVzLkVWRU5UX0lEICsgIj0/IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcmllcyBhbGwgYXR0ZW5kZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZXZlbnQuIFRoaXMgaXMgYQorICAgICAgICAgKiBibG9ja2luZyBjYWxsIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBjb250ZW50IHJlc29sdmVyIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5CisgICAgICAgICAqIEBwYXJhbSBldmVudElkIFRoZSBpZCBvZiB0aGUgZXZlbnQgdG8gcmV0cmlldmUgYXR0ZW5kZWVzIGZvcgorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIGNvbnRhaW5pbmcgYWxsIGF0dGVuZGVlcyBmb3IgdGhlIGV2ZW50CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIGxvbmcgZXZlbnRJZCkgeworICAgICAgICAgICAgU3RyaW5nW10gYXR0QXJncyA9IHtMb25nLnRvU3RyaW5nKGV2ZW50SWQpfTsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgUFJPSkVDVElPTiwgQVRURU5ERUVTX1dIRVJFLCBhdHRBcmdzIC8qIHNlbGVjdGlvbiBhcmdzICovLAorICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnQgb3JkZXIgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sdW1ucyBmcm9tIHRoZSBFdmVudHMgdGFibGUgdGhhdCBvdGhlciB0YWJsZXMgam9pbiBpbnRvIHRoZW1zZWx2ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludGVyZmFjZSBFdmVudHNDb2x1bW5zIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHtAbGluayBDYWxlbmRhcnMjX0lEfSBvZiB0aGUgY2FsZW5kYXIgdGhlIGV2ZW50IGJlbG9uZ3MgdG8uCisgICAgICAgICAqIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FMRU5EQVJfSUQgPSAiY2FsZW5kYXJfaWQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gInRpdGxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXJlIHRoZSBldmVudCB0YWtlcyBwbGFjZS4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9MT0NBVElPTiA9ICJldmVudExvY2F0aW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBzZWNvbmRhcnkgY29sb3IgZm9yIHRoZSBpbmRpdmlkdWFsIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUjwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0NPTE9SID0gImV2ZW50Q29sb3IiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZXZlbnQgc3RhdHVzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAob25lIG9mIHtAbGluayAjU1RBVFVTX1RFTlRBVElWRX0uLi4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVFVTID0gImV2ZW50U3RhdHVzIjsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVEVOVEFUSVZFID0gMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0NPTkZJUk1FRCA9IDE7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19DQU5DRUxFRCA9IDI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBhdHRlbmRlZSBzdGF0dXMgZm9yIHRoZSBvd25lciBvZiB0aGlzIGV2ZW50LgorICAgICAgICAgKiBUaGlzIGZpZWxkIGlzIGNvcGllZCBoZXJlIHNvIHRoYXQgd2UgY2FuIGVmZmljaWVudGx5IGZpbHRlciBvdXQKKyAgICAgICAgICogZXZlbnRzIHRoYXQgYXJlIGRlY2xpbmVkIHdpdGhvdXQgaGF2aW5nIHRvIGxvb2sgaW4gdGhlIEF0dGVuZGVlcworICAgICAgICAgKiB0YWJsZS4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxGX0FUVEVOREVFX1NUQVRVUyA9ICJzZWxmQXR0ZW5kZWVTdGF0dXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGNvbHVtbiBpcyBhdmFpbGFibGUgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfREFUQTEgPSAic3luY19kYXRhMSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgY29sdW1uIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19EQVRBMiA9ICJzeW5jX2RhdGEyIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBjb2x1bW4gaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0RBVEEzID0gInN5bmNfZGF0YTMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGNvbHVtbiBpcyBhdmFpbGFibGUgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfREFUQTQgPSAic3luY19kYXRhNCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgY29sdW1uIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19EQVRBNSA9ICJzeW5jX2RhdGE1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBjb2x1bW4gaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0RBVEE2ID0gInN5bmNfZGF0YTYiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGNvbHVtbiBpcyBhdmFpbGFibGUgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfREFUQTcgPSAic3luY19kYXRhNyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgY29sdW1uIGlzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IHN5bmMgYWRhcHRlcnMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lOQ19EQVRBOCA9ICJzeW5jX2RhdGE4IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBjb2x1bW4gaXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgc3luYyBhZGFwdGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DX0RBVEE5ID0gInN5bmNfZGF0YTkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGNvbHVtbiBpcyBhdmFpbGFibGUgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTkNfREFUQTEwID0gInN5bmNfZGF0YTEwIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgcm93IGlzIG5vdCBhIHJlYWwgZXZlbnQgYnV0IGFuIG9yaWdpbmFsIGNvcHkgb2YgYSBsb2NhbGx5CisgICAgICAgICAqIG1vZGlmaWVkIGV2ZW50LiBBIGNvcHkgaXMgbWFkZSB3aGVuIGFuIGV2ZW50IGNoYW5nZXMgZnJvbSBub24tZGlydHkgdG8gZGlydHkgYW5kIHRoZQorICAgICAgICAgKiBldmVudCBpcyBvbiBhIGNhbGVuZGFyIHdpdGgge0BsaW5rIENhbGVuZGFycyNDQU5fUEFSVElBTExZX1VQREFURX0gc2V0IHRvIDEuIFRoaXMgY29weQorICAgICAgICAgKiBkb2VzIG5vdCBnZXQgZXhwYW5kZWQgaW4gdGhlIGluc3RhbmNlcyB0YWJsZSBhbmQgaXMgb25seSB2aXNpYmxlIGluIHF1ZXJpZXMgbWFkZSBieSBhCisgICAgICAgICAqIHN5bmMgYWRhcHRlci4gVGhlIGNvcHkgZ2V0cyByZW1vdmVkIHdoZW4gdGhlIGV2ZW50IGlzIGNoYW5nZWQgYmFjayB0byBub24tZGlydHkgYnkgYQorICAgICAgICAgKiBzeW5jIGFkYXB0ZXIuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9TWU5DRUQgPSAibGFzdFN5bmNlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoZSBldmVudCBzdGFydHMgaW4gVVRDIG1pbGxpcyBzaW5jZSBlcG9jaC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVFNUQVJUID0gImR0c3RhcnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGltZSB0aGUgZXZlbnQgZW5kcyBpbiBVVEMgbWlsbGlzIHNpbmNlIGVwb2NoLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURU5EID0gImR0ZW5kIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudCBpbiBSRkMyNDQ1IGZvcm1hdC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQgKGR1cmF0aW9uIGluIFJGQzI0NDUgZm9ybWF0KTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUkFUSU9OID0gImR1cmF0aW9uIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWV6b25lIGZvciB0aGUgZXZlbnQuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVElNRVpPTkUgPSAiZXZlbnRUaW1lem9uZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lem9uZSBmb3IgdGhlIGVuZCB0aW1lIG9mIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9FTkRfVElNRVpPTkUgPSAiZXZlbnRFbmRUaW1lem9uZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElzIHRoZSBldmVudCBhbGwgZGF5ICh0aW1lIHpvbmUgaW5kZXBlbmRlbnQpLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfREFZID0gImFsbERheSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZXMgaG93IHRoZSBldmVudCBzaG93cyB1cCBmb3Igb3RoZXJzIHdoZW4gdGhlIGNhbGVuZGFyIGlzCisgICAgICAgICAqIHNoYXJlZC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKE9uZSBvZiB7QGxpbmsgI0FDQ0VTU19ERUZBVUxUfSwgLi4uKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU19MRVZFTCA9ICJhY2Nlc3NMZXZlbCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmF1bHQgYWNjZXNzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHNlcnZlciBhbmQgd2lsbCBiZSB0cmVhdGVkIGFzCisgICAgICAgICAqIHB1YmxpYyBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX0RFRkFVTFQgPSAwOworICAgICAgICAvKioKKyAgICAgICAgICogQ29uZmlkZW50aWFsIGlzIG5vdCB1c2VkIGJ5IHRoZSBhcHAuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfQ09ORklERU5USUFMID0gMTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByaXZhdGUgc2hhcmVzIHRoZSBldmVudCBhcyBhIGZyZWUvYnVzeSBzbG90IHdpdGggbm8gZGV0YWlscy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDQ0VTU19QUklWQVRFID0gMjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1YmxpYyBtYWtlcyB0aGUgY29udGVudHMgdmlzaWJsZSB0byBhbnlvbmUgd2l0aCBhY2Nlc3MgdG8gdGhlCisgICAgICAgICAqIGNhbGVuZGFyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX1BVQkxJQyA9IDM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHRoaXMgZXZlbnQgY291bnRzIGFzIGJ1c3kgdGltZSBvciBpcyBzdGlsbCBmcmVlIHRpbWUgdGhhdCBjYW4gYmUKKyAgICAgICAgICogc2NoZWR1bGVkIG92ZXIuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChPbmUgb2Yge0BsaW5rICNBVkFJTEFCSUxJVFlfQlVTWX0sCisgICAgICAgICAqIHtAbGluayAjQVZBSUxBQklMSVRZX0ZSRUV9KTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFWQUlMQUJJTElUWSA9ICJhdmFpbGFiaWxpdHkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIGV2ZW50IHRha2VzIHVwIHRpbWUgYW5kIHdpbGwgY29uZmxpY3Qgd2l0aCBvdGhlcgorICAgICAgICAgKiBldmVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfQlVTWSA9IDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIGV2ZW50IGlzIGZyZWUgdGltZSBhbmQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aAorICAgICAgICAgKiBvdGhlciBldmVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRlJFRSA9IDE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGhhcyBhbiBhbGFybSBvciBub3QuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBU19BTEFSTSA9ICJoYXNBbGFybSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdGhlIGV2ZW50IGhhcyBleHRlbmRlZCBwcm9wZXJ0aWVzIG9yIG5vdC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX0VYVEVOREVEX1BST1BFUlRJRVMgPSAiaGFzRXh0ZW5kZWRQcm9wZXJ0aWVzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlY3VycmVuY2UgcnVsZSBmb3IgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJSVUxFID0gInJydWxlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlY3VycmVuY2UgZGF0ZXMgZm9yIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSREFURSA9ICJyZGF0ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZWN1cnJlbmNlIGV4Y2VwdGlvbiBydWxlIGZvciB0aGUgZXZlbnQuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhSVUxFID0gImV4cnVsZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZWN1cnJlbmNlIGV4Y2VwdGlvbiBkYXRlcyBmb3IgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYREFURSA9ICJleGRhdGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUge0BsaW5rIEV2ZW50cyNfSUR9IG9mIHRoZSBvcmlnaW5hbCByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMKKyAgICAgICAgICogZXZlbnQgaXMgYW4gZXhjZXB0aW9uLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMX0lEID0gIm9yaWdpbmFsX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIF9zeW5jX2lkIG9mIHRoZSBvcmlnaW5hbCByZWN1cnJpbmcgZXZlbnQgZm9yIHdoaWNoIHRoaXMgZXZlbnQgaXMKKyAgICAgICAgICogYW4gZXhjZXB0aW9uLiBUaGUgcHJvdmlkZXIgc2hvdWxkIGtlZXAgdGhlIG9yaWdpbmFsX2lkIGluIHN5bmMgd2hlbgorICAgICAgICAgKiB0aGlzIGlzIHVwZGF0ZWQuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfU1lOQ19JRCA9ICJvcmlnaW5hbF9zeW5jX2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9yaWdpbmFsIGluc3RhbmNlIHRpbWUgb2YgdGhlIHJlY3VycmluZyBldmVudCBmb3Igd2hpY2ggdGhpcworICAgICAgICAgKiBldmVudCBpcyBhbiBleGNlcHRpb24uIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfSU5TVEFOQ0VfVElNRSA9ICJvcmlnaW5hbEluc3RhbmNlVGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhbGxEYXkgc3RhdHVzICh0cnVlIG9yIGZhbHNlKSBvZiB0aGUgb3JpZ2luYWwgcmVjdXJyaW5nIGV2ZW50CisgICAgICAgICAqIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfQUxMX0RBWSA9ICJvcmlnaW5hbEFsbERheSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBsYXN0IGRhdGUgdGhpcyBldmVudCByZXBlYXRzIG9uLCBvciBOVUxMIGlmIGl0IG5ldmVyIGVuZHMuIENvbHVtbgorICAgICAgICAgKiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9EQVRFID0gImxhc3REYXRlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGUgZXZlbnQgaGFzIGF0dGVuZGVlIGluZm9ybWF0aW9uLiAgVHJ1ZSBpZiB0aGUgZXZlbnQKKyAgICAgICAgICogaGFzIGZ1bGwgYXR0ZW5kZWUgZGF0YSwgZmFsc2UgaWYgdGhlIGV2ZW50IGhhcyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICAgKiBzZWxmIG9ubHkuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBU19BVFRFTkRFRV9EQVRBID0gImhhc0F0dGVuZGVlRGF0YSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgZ3Vlc3RzIGNhbiBtb2RpZnkgdGhlIGV2ZW50LiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUVTVFNfQ0FOX01PRElGWSA9ICJndWVzdHNDYW5Nb2RpZnkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIGd1ZXN0cyBjYW4gaW52aXRlIG90aGVyIGd1ZXN0cy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VFU1RTX0NBTl9JTlZJVEVfT1RIRVJTID0gImd1ZXN0c0Nhbkludml0ZU90aGVycyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgZ3Vlc3RzIGNhbiBzZWUgdGhlIGxpc3Qgb2YgYXR0ZW5kZWVzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbik8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUVTVFNfQ0FOX1NFRV9HVUVTVFMgPSAiZ3Vlc3RzQ2FuU2VlR3Vlc3RzIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogRW1haWwgb2YgdGhlIG9yZ2FuaXplciAob3duZXIpIG9mIHRoZSBldmVudC4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFNUUklORzwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR0FOSVpFUiA9ICJvcmdhbml6ZXIiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIGNhbiBpbnZpdGUgb3RoZXJzIHRvIHRoZSBldmVudC4gVGhlCisgICAgICAgICAqIEdVRVNUU19DQU5fSU5WSVRFX09USEVSUyBpcyBhIHNldHRpbmcgdGhhdCBhcHBsaWVzIHRvIGFuIGFyYml0cmFyeQorICAgICAgICAgKiBndWVzdCwgd2hpbGUgQ0FOX0lOVklURV9PVEhFUlMgaW5kaWNhdGVzIGlmIHRoZSB1c2VyIGNhbiBpbnZpdGUKKyAgICAgICAgICogb3RoZXJzIChlaXRoZXIgdGhyb3VnaCBHVUVTVFNfQ0FOX0lOVklURV9PVEhFUlMgb3IgYmVjYXVzZSB0aGUgdXNlcgorICAgICAgICAgKiBoYXMgbW9kaWZ5IGFjY2VzcyB0byB0aGUgZXZlbnQpLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoYm9vbGVhbiwgcmVhZG9ubHkpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOX0lOVklURV9PVEhFUlMgPSAiY2FuSW52aXRlT3RoZXJzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gRXZlbnQgRW50aXR5LiBUaGVyZSBpcyBvbmUgZW50cnkgcGVyIGV2ZW50LgorICAgICAqIFJlY3VycmluZyBldmVudHMgc2hvdyB1cCBhcyBhIHNpbmdsZSBlbnRyeS4gVGhpcyBpcyBhIGhlbHBlciBjbGFzcyB0bworICAgICAqIG1ha2UgYmF0Y2ggb3BlcmF0aW9ucyBlYXNpZXIuIEEge0BsaW5rIENvbnRlbnRSZXNvbHZlcn0gb3IKKyAgICAgKiB7QGxpbmsgQ29udGVudFByb3ZpZGVyQ2xpZW50fSBpcyByZXF1aXJlZCBhcyB0aGUgaGVscGVyIGRvZXMgYWRkaXRpb25hbAorICAgICAqIHF1ZXJpZXMgdG8gYWRkIHJlbWluZGVycyBhbmQgYXR0ZW5kZWVzIHRvIGVhY2ggZW50cnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNFbnRpdHkgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvZXZlbnRfZW50aXRpZXMiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpdGVyYXRvciBmb3IgZXZlbnRzCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgQW4gZXZlbnQgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHJlc29sdmVyIEZvciBwZXJmb3JtaW5nIGFkZGl0aW9uYWwgcXVlcmllcworICAgICAgICAgKiBAcmV0dXJuIGFuIEVudGl0eUl0ZXJhdG9yIGNvbnRhaW5pbmcgb25lIGVudGl0eSBwZXIgZXZlbnQgaW4gdGhlCisgICAgICAgICAqICAgICAgICAgY3Vyc29yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsIENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJdGVyYXRvckltcGwoY3Vyc29yLCByZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBpdGVyYXRvciBmb3IgZXZlbnRzCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjdXJzb3IgQW4gZXZlbnQgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIEZvciBwZXJmb3JtaW5nIGFkZGl0aW9uYWwgcXVlcmllcworICAgICAgICAgKiBAcmV0dXJuIGFuIEVudGl0eUl0ZXJhdG9yIGNvbnRhaW5pbmcgb25lIGVudGl0eSBwZXIgZXZlbnQgaW4gdGhlCisgICAgICAgICAqICAgICAgICAgY3Vyc29yCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEVudGl0eUl0ZXJhdG9yIG5ld0VudGl0eUl0ZXJhdG9yKEN1cnNvciBjdXJzb3IsCisgICAgICAgICAgICAgICAgQ29udGVudFByb3ZpZGVyQ2xpZW50IHByb3ZpZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUl0ZXJhdG9ySW1wbChjdXJzb3IsIHByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudGl0eUl0ZXJhdG9ySW1wbCBleHRlbmRzIEN1cnNvckVudGl0eUl0ZXJhdG9yIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGVudFByb3ZpZGVyQ2xpZW50IG1Qcm92aWRlcjsKKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVNSU5ERVJTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICBSZW1pbmRlcnMuTUlOVVRFUywKKyAgICAgICAgICAgICAgICAgICAgUmVtaW5kZXJzLk1FVEhPRCwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX01JTlVURVMgPSAwOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NRVRIT0QgPSAxOworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBVFRFTkRFRVNfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlcy5BVFRFTkRFRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXMuQVRURU5ERUVfRU1BSUwsCisgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlcy5BVFRFTkRFRV9SRUxBVElPTlNISVAsCisgICAgICAgICAgICAgICAgICAgIEF0dGVuZGVlcy5BVFRFTkRFRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBBdHRlbmRlZXMuQVRURU5ERUVfU1RBVFVTLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQVRURU5ERUVfTkFNRSA9IDA7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0FUVEVOREVFX0VNQUlMID0gMTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQVRURU5ERUVfUkVMQVRJT05TSElQID0gMjsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQVRURU5ERUVfVFlQRSA9IDM7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0FUVEVOREVFX1NUQVRVUyA9IDQ7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFWFRFTkRFRF9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRQcm9wZXJ0aWVzLl9JRCwKKyAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRQcm9wZXJ0aWVzLk5BTUUsCisgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkUHJvcGVydGllcy5WQUxVRQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSUQgPSAwOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9OQU1FID0gMTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fVkFMVUUgPSAyOworCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkVfRVZFTlRfSUQgPSAiZXZlbnRfaWQ9PyI7CisKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlJdGVyYXRvckltcGwoQ3Vyc29yIGN1cnNvciwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5SXRlcmF0b3JJbXBsKEN1cnNvciBjdXJzb3IsIENvbnRlbnRQcm92aWRlckNsaWVudCBwcm92aWRlcikgeworICAgICAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgICAgICAgICAgbVJlc29sdmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5IGdldEVudGl0eUFuZEluY3JlbWVudEN1cnNvcihDdXJzb3IgY3Vyc29yKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBleHBlY3QgdGhlIGN1cnNvciBpcyBhbHJlYWR5IGF0IHRoZSByb3cgd2UgbmVlZCB0byByZWFkIGZyb20KKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV2ZW50SWQgPSBjdXJzb3IuZ2V0TG9uZyhjdXJzb3IuZ2V0Q29sdW1uSW5kZXhPclRocm93KEV2ZW50cy5fSUQpKTsKKyAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICBjdi5wdXQoRXZlbnRzLl9JRCwgZXZlbnRJZCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMRU5EQVJfSUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFRJVExFKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBERVNDUklQVElPTik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRVZFTlRfTE9DQVRJT04pOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFNUQVRVUyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU0VMRl9BVFRFTkRFRV9TVEFUVVMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBEVFNUQVJUKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRFRFTkQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIERVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFVkVOVF9USU1FWk9ORSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRVZFTlRfRU5EX1RJTUVaT05FKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBTExfREFZKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBBQ0NFU1NfTEVWRUwpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEFWQUlMQUJJTElUWSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgSEFTX0FMQVJNKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgSEFTX0VYVEVOREVEX1BST1BFUlRJRVMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIFJSVUxFKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBSREFURSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRVhSVUxFKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBFWERBVEUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIE9SSUdJTkFMX1NZTkNfSUQpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIE9SSUdJTkFMX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9SSUdJTkFMX0lOU1RBTkNFX1RJTUUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIE9SSUdJTkFMX0FMTF9EQVkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBMQVNUX0RBVEUpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29ySW50VG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIEhBU19BVFRFTkRFRV9EQVRBKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LAorICAgICAgICAgICAgICAgICAgICAgICAgR1VFU1RTX0NBTl9JTlZJVEVfT1RIRVJTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckludFRvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBHVUVTVFNfQ0FOX01PRElGWSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgR1VFU1RTX0NBTl9TRUVfR1VFU1RTKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBPUkdBTklaRVIpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIF9TWU5DX0lEKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvckxvbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgRElSVFkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yTG9uZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBMQVNUX1NZTkNFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JJbnRUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgREVMRVRFRCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBMik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBMyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBNCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBNSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBNik7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBNyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBOCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBOSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgU1lOQ19EQVRBMTApOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DMSk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkMyKTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzMpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DNCk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkM1KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzYpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DNyk7CisgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5jdXJzb3JTdHJpbmdUb0NvbnRlbnRWYWx1ZXNJZlByZXNlbnQoY3Vyc29yLCBjdiwgQ0FMX1NZTkM4KTsKKyAgICAgICAgICAgICAgICBEYXRhYmFzZVV0aWxzLmN1cnNvclN0cmluZ1RvQ29udGVudFZhbHVlc0lmUHJlc2VudChjdXJzb3IsIGN2LCBDQUxfU1lOQzkpOworICAgICAgICAgICAgICAgIERhdGFiYXNlVXRpbHMuY3Vyc29yU3RyaW5nVG9Db250ZW50VmFsdWVzSWZQcmVzZW50KGN1cnNvciwgY3YsIENBTF9TWU5DMTApOworCisgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoY3YpOworICAgICAgICAgICAgICAgIEN1cnNvciBzdWJDdXJzb3I7CisgICAgICAgICAgICAgICAgaWYgKG1SZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvciA9IG1SZXNvbHZlci5xdWVyeShSZW1pbmRlcnMuQ09OVEVOVF9VUkksIFJFTUlOREVSU19QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFX0VWRU5UX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IExvbmcudG9TdHJpbmcoZXZlbnRJZCkgfSAgLyogc2VsZWN0aW9uQXJncyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVByb3ZpZGVyLnF1ZXJ5KFJlbWluZGVycy5DT05URU5UX1VSSSwgUkVNSU5ERVJTX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkVfRVZFTlRfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTG9uZy50b1N0cmluZyhldmVudElkKSB9ICAvKiBzZWxlY3Rpb25BcmdzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydE9yZGVyICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN1YkN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgcmVtaW5kZXJWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtaW5kZXJWYWx1ZXMucHV0KFJlbWluZGVycy5NSU5VVEVTLCBzdWJDdXJzb3IuZ2V0SW50KENPTFVNTl9NSU5VVEVTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1pbmRlclZhbHVlcy5wdXQoUmVtaW5kZXJzLk1FVEhPRCwgc3ViQ3Vyc29yLmdldEludChDT0xVTU5fTUVUSE9EKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoUmVtaW5kZXJzLkNPTlRFTlRfVVJJLCByZW1pbmRlclZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlc29sdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVJlc29sdmVyLnF1ZXJ5KEF0dGVuZGVlcy5DT05URU5UX1VSSSwgQVRURU5ERUVTX1BST0pFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkVfRVZFTlRfSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTG9uZy50b1N0cmluZyhldmVudElkKSB9IC8qIHNlbGVjdGlvbkFyZ3MgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0T3JkZXIgKi8pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvciA9IG1Qcm92aWRlci5xdWVyeShBdHRlbmRlZXMuQ09OVEVOVF9VUkksIEFUVEVOREVFU19QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIRVJFX0VWRU5UX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IExvbmcudG9TdHJpbmcoZXZlbnRJZCkgfSAvKiBzZWxlY3Rpb25BcmdzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc29ydE9yZGVyICovKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN1YkN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgYXR0ZW5kZWVWYWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVWYWx1ZXMucHV0KEF0dGVuZGVlcy5BVFRFTkRFRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9BVFRFTkRFRV9OQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZVZhbHVlcy5wdXQoQXR0ZW5kZWVzLkFUVEVOREVFX0VNQUlMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9BVFRFTkRFRV9FTUFJTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVWYWx1ZXMucHV0KEF0dGVuZGVlcy5BVFRFTkRFRV9SRUxBVElPTlNISVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkN1cnNvci5nZXRJbnQoQ09MVU1OX0FUVEVOREVFX1JFTEFUSU9OU0hJUCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW5kZWVWYWx1ZXMucHV0KEF0dGVuZGVlcy5BVFRFTkRFRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0SW50KENPTFVNTl9BVFRFTkRFRV9UWVBFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbmRlZVZhbHVlcy5wdXQoQXR0ZW5kZWVzLkFUVEVOREVFX1NUQVRVUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yLmdldEludChDT0xVTU5fQVRURU5ERUVfU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuYWRkU3ViVmFsdWUoQXR0ZW5kZWVzLkNPTlRFTlRfVVJJLCBhdHRlbmRlZVZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVJlc29sdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVJlc29sdmVyLnF1ZXJ5KEV4dGVuZGVkUHJvcGVydGllcy5DT05URU5UX1VSSSwgRVhURU5ERURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRV9FVkVOVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBMb25nLnRvU3RyaW5nKGV2ZW50SWQpIH0gLyogc2VsZWN0aW9uQXJncyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yID0gbVByb3ZpZGVyLnF1ZXJ5KEV4dGVuZGVkUHJvcGVydGllcy5DT05URU5UX1VSSSwgRVhURU5ERURfUFJPSkVDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRV9FVkVOVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBMb25nLnRvU3RyaW5nKGV2ZW50SWQpIH0gLyogc2VsZWN0aW9uQXJncyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qIHNvcnRPcmRlciAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdWJDdXJzb3IubW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50VmFsdWVzIGV4dGVuZGVkVmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkVmFsdWVzLnB1dChFeHRlbmRlZFByb3BlcnRpZXMuX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9JRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRWYWx1ZXMucHV0KEV4dGVuZGVkUHJvcGVydGllcy5OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9OQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFZhbHVlcy5wdXQoRXh0ZW5kZWRQcm9wZXJ0aWVzLlZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJDdXJzb3IuZ2V0U3RyaW5nKENPTFVNTl9WQUxVRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LmFkZFN1YlZhbHVlKEV4dGVuZGVkUHJvcGVydGllcy5DT05URU5UX1VSSSwgZXh0ZW5kZWRWYWx1ZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgc3ViQ3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3Vyc29yLm1vdmVUb05leHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RhbnRzIGFuZCBoZWxwZXJzIGZvciB0aGUgRXZlbnRzIHRhYmxlLCB3aGljaCBjb250YWlucyBkZXRhaWxzIGZvcgorICAgICAqIGluZGl2aWR1YWwgZXZlbnRzLiA8aDM+T3BlcmF0aW9uczwvaDM+IEFsbCBvcGVyYXRpb25zIGNhbiBiZSBkb25lIGVpdGhlcgorICAgICAqIGFzIGFuIGFwcCBvciBhcyBhIHN5bmMgYWRhcHRlci4gVG8gcGVyZm9ybSBhbiBvcGVyYXRpb24gYXMgYSBzeW5jIGFkYXB0ZXIKKyAgICAgKiB7QGxpbmsgI0NBTExFUl9JU19TWU5DQURBUFRFUn0gc2hvdWxkIGJlIHNldCB0byB0cnVlIGFuZAorICAgICAqIHtAbGluayAjQUNDT1VOVF9OQU1FfSBhbmQge0BsaW5rICNBQ0NPVU5UX1RZUEV9IG11c3QgYmUgc2V0IGluIHRoZSBVcmkKKyAgICAgKiBwYXJhbWV0ZXJzLiBTZWUKKyAgICAgKiB7QGxpbmsgVXJpLkJ1aWxkZXIjYXBwZW5kUXVlcnlQYXJhbWV0ZXIoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyl9CisgICAgICogZm9yIGRldGFpbHMgb24gYWRkaW5nIHBhcmFtZXRlcnMuIFN5bmMgYWRhcHRlcnMgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gbW9yZQorICAgICAqIGNvbHVtbnMgYnV0IGFyZSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGFjY291bnQgYXQgYSB0aW1lLgorICAgICAqIDxkbD4KKyAgICAgKiA8ZHQ+PGI+SW5zZXJ0PC9iPjwvZHQ+CisgICAgICogPGRkPldoZW4gaW5zZXJ0aW5nIGEgbmV3IGV2ZW50IHRoZSBmb2xsb3dpbmcgZmllbGRzIG11c3QgYmUgaW5jbHVkZWQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT5kdHN0YXJ0PC9saT4KKyAgICAgKiA8bGk+ZHRlbmQgLW9yLSBhIChycnVsZSBvciByZGF0ZSkgYW5kIGEgZHVyYXRpb248L2xpPgorICAgICAqIDxsaT5hIGNhbGVuZGFyX2lkPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIFRoZXJlIGFyZSBhbHNvIGZ1cnRoZXIgcmVxdWlyZW1lbnRzIHdoZW4gaW5zZXJ0aW5nIG9yIHVwZGF0aW5nIGFuIGV2ZW50LgorICAgICAqIFNlZSB0aGUgc2VjdGlvbiBvbiBXcml0aW5nIHRvIEV2ZW50cy48L2RkPgorICAgICAqIDxkdD48Yj5VcGRhdGU8L2I+PC9kdD4KKyAgICAgKiA8ZGQ+VG8gcGVyZm9ybSBhbiB1cGRhdGUgb2YgYW4gRXZlbnQgdGhlIHtAbGluayBFdmVudHMjX0lEfSBvZiB0aGUgZXZlbnQKKyAgICAgKiBzaG91bGQgYmUgcHJvdmlkZWQgZWl0aGVyIGFzIGFuIGFwcGVuZGVkIGlkIHRvIHRoZSBVcmkgKAorICAgICAqIHtAbGluayBDb250ZW50VXJpcyN3aXRoQXBwZW5kZWRJZH0pIG9yIGFzIHRoZSBmaXJzdCBzZWxlY3Rpb24gaXRlbS0tdGhlCisgICAgICogc2VsZWN0aW9uIHNob3VsZCBzdGFydCB3aXRoICJfaWQ9PyIgYW5kIHRoZSBmaXJzdCBzZWxlY3Rpb25Bcmcgc2hvdWxkIGJlCisgICAgICogdGhlIF9pZCBvZiB0aGUgZXZlbnQuIFVwZGF0ZXMgbWF5IGFsc28gYmUgZG9uZSB1c2luZyBhIHNlbGVjdGlvbiBhbmQgbm8KKyAgICAgKiBpZC4gVXBkYXRpbmcgYW4gZXZlbnQgbXVzdCByZXNwZWN0IHRoZSBzYW1lIHJ1bGVzIGFzIGluc2VydGluZyBhbmQgaXMKKyAgICAgKiBmdXJ0aGVyIHJlc3RyaWN0ZWQgaW4gdGhlIGZpZWxkcyB0aGF0IGNhbiBiZSB3cml0dGVuLiBTZWUgdGhlIHNlY3Rpb24gb24KKyAgICAgKiBXcml0aW5nIHRvIEV2ZW50cy48L2RkPgorICAgICAqIDxkdD48Yj5EZWxldGU8L2I+PC9kdD4KKyAgICAgKiA8ZGQ+RXZlbnRzIGNhbiBiZSBkZWxldGVkIGVpdGhlciBieSB0aGUge0BsaW5rIEV2ZW50cyNfSUR9IGFzIGFuIGFwcGVuZGVkCisgICAgICogaWQgb24gdGhlIFVyaSBvciB1c2luZyBhbnkgc3RhbmRhcmQgc2VsZWN0aW9uLiBJZiBhbiBhcHBlbmRlZCBpZCBpcyB1c2VkCisgICAgICogYSBzZWxlY3Rpb24gaXMgbm90IGFsbG93ZWQuIFRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgZGVsZXRlOiBhcyBhbiBhcHAKKyAgICAgKiBhbmQgYXMgYSBzeW5jIGFkYXB0ZXIuIEFuIGFwcCBkZWxldGUgd2lsbCBzZXQgdGhlIGRlbGV0ZWQgY29sdW1uIG9uIGFuCisgICAgICogZXZlbnQgYW5kIHJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIHRoYXQgZXZlbnQuIEEgc3luYyBhZGFwdGVyIGRlbGV0ZSB3aWxsCisgICAgICogcmVtb3ZlIHRoZSBldmVudCBmcm9tIHRoZSBkYXRhYmFzZSBhbmQgYWxsIGFzc29jaWF0ZWQgZGF0YS48L2RkPgorICAgICAqIDxkdD48Yj5RdWVyeTwvYj48L2R0PgorICAgICAqIDxkZD5RdWVyeWluZyB0aGUgRXZlbnRzIHRhYmxlIHdpbGwgZ2V0IHlvdSBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXQgb2YKKyAgICAgKiBldmVudHMgZXhjZXB0IHRoZWlyIHJlbWluZGVycywgYXR0ZW5kZWVzLCBhbmQgZXh0ZW5kZWQgcHJvcGVydGllcy4gVGhlcmUKKyAgICAgKiB3aWxsIGJlIG9uZSByb3cgcmV0dXJuZWQgZm9yIGVhY2ggZXZlbnQgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSBzZWxlY3Rpb24sCisgICAgICogb3IgYXQgbW9zdCBhIHNpbmdsZSByb3cgaWYgdGhlIHtAbGluayBFdmVudHMjX0lEfSBpcyBhcHBlbmRlZCB0byB0aGUgVXJpLgorICAgICAqIFJlY3VycmluZyBldmVudHMgd2lsbCBvbmx5IHJldHVybiBhIHNpbmdsZSByb3cgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyCisgICAgICogb2YgdGltZXMgdGhhdCBldmVudCByZXBlYXRzLjwvZGQ+CisgICAgICogPC9kbD4KKyAgICAgKiA8aDM+V3JpdGluZyB0byBFdmVudHM8L2gzPiBUaGVyZSBhcmUgZnVydGhlciByZXN0cmljdGlvbnMgb24gYWxsIFVwZGF0ZXMKKyAgICAgKiBhbmQgSW5zZXJ0cyBpbiB0aGUgRXZlbnRzIHRhYmxlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SWYgYWxsRGF5IGlzIHNldCB0byAxIGV2ZW50VGltZXpvbmUgbXVzdCBiZSB7QGxpbmsgVGltZSNUSU1FWk9ORV9VVEN9CisgICAgICogYW5kIHRoZSB0aW1lIG11c3QgY29ycmVzcG9uZCB0byBhIG1pZG5pZ2h0IGJvdW5kYXJ5LjwvbGk+CisgICAgICogPGxpPkV4Y2VwdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHJlY3VyLiBJZiBycnVsZSBvciByZGF0ZSBpcyBub3QgZW1wdHksCisgICAgICogb3JpZ2luYWxfaWQgYW5kIG9yaWdpbmFsX3N5bmNfaWQgbXVzdCBiZSBlbXB0eS48L2xpPgorICAgICAqIDxsaT5JbiBnZW5lcmFsIGEgY2FsZW5kYXJfaWQgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBhZnRlciBpbnNlcnRpb24uIFRoaXMKKyAgICAgKiBpcyBub3QgZXhwbGljaXRseSBmb3JiaWRkZW4gYnV0IG1hbnkgc3luYyBhZGFwdGVycyB3aWxsIG5vdCBiZWhhdmUgaW4gYW4KKyAgICAgKiBleHBlY3RlZCB3YXkgaWYgdGhlIGNhbGVuZGFyX2lkIGlzIG1vZGlmaWVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGUgZm9sbG93aW5nIEV2ZW50cyBjb2x1bW5zIGFyZSB3cml0YWJsZSBieSBib3RoIGFuIGFwcCBhbmQgYSBzeW5jCisgICAgICogYWRhcHRlci4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjQ0FMRU5EQVJfSUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNPUkdBTklaRVJ9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNUSVRMRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0VWRU5UX0xPQ0FUSU9OfTwvbGk+CisgICAgICogPGxpPntAbGluayAjREVTQ1JJUFRJT059PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNFVkVOVF9DT0xPUn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0RUU1RBUlR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNEVEVORH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0VWRU5UX1RJTUVaT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayAjRVZFTlRfRU5EX1RJTUVaT05FfTwvbGk+CisgICAgICogPGxpPntAbGluayAjRFVSQVRJT059PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNBTExfREFZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjUlJVTEV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNSREFURX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0VYUlVMRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI0VYREFURX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI09SSUdJTkFMX0lEfTwvbGk+CisgICAgICogPGxpPntAbGluayAjT1JJR0lOQUxfU1lOQ19JRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI09SSUdJTkFMX0lOU1RBTkNFX1RJTUV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNPUklHSU5BTF9BTExfREFZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQUNDRVNTX0xFVkVMfTwvbGk+CisgICAgICogPGxpPntAbGluayAjQVZBSUxBQklMSVRZfTwvbGk+CisgICAgICogPGxpPntAbGluayAjR1VFU1RTX0NBTl9NT0RJRll9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNHVUVTVFNfQ0FOX0lOVklURV9PVEhFUlN9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNHVUVTVFNfQ0FOX1NFRV9HVUVTVFN9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIFRoZSBmb2xsb3dpbmcgRXZlbnRzIGNvbHVtbnMgYXJlIHdyaXRhYmxlIG9ubHkgYnkgYSBzeW5jIGFkYXB0ZXIKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRElSVFl9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNfU1lOQ19JRH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1NZTkNfREFUQTF9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNTWU5DX0RBVEEyfTwvbGk+CisgICAgICogPGxpPntAbGluayAjU1lOQ19EQVRBM308L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1NZTkNfREFUQTR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNTWU5DX0RBVEE1fTwvbGk+CisgICAgICogPGxpPntAbGluayAjU1lOQ19EQVRBNn08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1NZTkNfREFUQTd9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNTWU5DX0RBVEE4fTwvbGk+CisgICAgICogPGxpPntAbGluayAjU1lOQ19EQVRBOX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1NZTkNfREFUQTEwfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGUgcmVtYWluaW5nIGNvbHVtbnMgYXJlIGVpdGhlciB1cGRhdGVkIGJ5IHRoZSBwcm92aWRlciBvbmx5IG9yIGFyZQorICAgICAqIHZpZXdzIGludG8gb3RoZXIgdGFibGVzIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB0aHJvdWdoIHRoZSBFdmVudHMgdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywgU3luY0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMsCisgICAgICAgICAgICBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcmllcyBhbGwgZXZlbnRzIHdpdGggdGhlIGdpdmVuIHByb2plY3Rpb24uIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsCisgICAgICAgICAqIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJIHRocmVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBjb250ZW50IHJlc29sdmVyIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5CisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBjb2x1bW5zIHRvIHJldHVybgorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIGNvbnRhaW5pbmcgYWxsIGV2ZW50cyBpbiB0aGUgZGIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KENPTlRFTlRfVVJJLCBwcm9qZWN0aW9uLCBudWxsLCBudWxsLCBERUZBVUxUX1NPUlRfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXJpZXMgZXZlbnRzIHVzaW5nIHRoZSBnaXZlbiBwcm9qZWN0aW9uLCBzZWxlY3Rpb24gZmlsdGVyLCBhbmQKKyAgICAgICAgICogb3JkZXJpbmcuIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJCisgICAgICAgICAqIHRocmVhZC4gRm9yIHNlbGVjdGlvbiBhbmQgc2VsZWN0aW9uQXJncyB1c2FnZSBzZWUKKyAgICAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIGNvbnRlbnQgcmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gRmlsdGVyIG9uIHRoZSBxdWVyeSBhcyBhbiBTUUwgV0hFUkUgc3RhdGVtZW50CisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIEFyZ3MgdG8gcmVwbGFjZSBhbnkgJz8ncyBpbiB0aGUgc2VsZWN0aW9uCisgICAgICAgICAqIEBwYXJhbSBvcmRlckJ5IEhvdyB0byBvcmRlciB0aGUgcm93cyBhcyBhbiBTUUwgT1JERVIgQlkgc3RhdGVtZW50CisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3IgY29udGFpbmluZyB0aGUgbWF0Y2hpbmcgZXZlbnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIG9yZGVyQnkpIHsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShDT05URU5UX1VSSSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIGludGVyYWN0aW5nIHdpdGggZXZlbnRzLiBBcHBlbmRpbmcgYW4KKyAgICAgICAgICogZXZlbnQgaWQgdXNpbmcge0BsaW5rIENvbnRlbnRVcmlzI3dpdGhBcHBlbmRlZElkKFVyaSwgbG9uZyl9IHdpbGwKKyAgICAgICAgICogc3BlY2lmeSBhIHNpbmdsZSBldmVudC4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvZXZlbnRzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgcmVjdXJyaW5nIGV2ZW50IGV4Y2VwdGlvbnMuICBJbnNlcnRpb25zIHJlcXVpcmUgYW4KKyAgICAgICAgICogYXBwZW5kZWQgZXZlbnQgSUQuICBEZWxldGlvbiBvZiBleGNlcHRpb25zIHJlcXVpcmVzIGJvdGggdGhlIG9yaWdpbmFsIGV2ZW50IElEIGFuZAorICAgICAgICAgKiB0aGUgZXhjZXB0aW9uIGV2ZW50IElEIChzZWUge0BsaW5rIFVyaS5CdWlsZGVyI2FwcGVuZFBhdGh9KS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEVYQ0VQVElPTl9DT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvZXhjZXB0aW9uIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgZm9yIHRoaXMgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlc2UgYXJlIGNvbHVtbnMgdGhhdCBzaG91bGQgb25seSBldmVyIGJlIHVwZGF0ZWQgYnkgdGhlIHByb3ZpZGVyLAorICAgICAgICAgKiBlaXRoZXIgYmVjYXVzZSB0aGV5IGFyZSB2aWV3cyBtYXBwZWQgdG8gYW5vdGhlciB0YWJsZSBvciBiZWNhdXNlIHRoZXkKKyAgICAgICAgICogYXJlIHVzZWQgZm9yIHByb3ZpZGVyIG9ubHkgZnVuY3Rpb25hbGl0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gUFJPVklERVJfV1JJVEFCTEVfQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgQUNDT1VOVF9OQU1FLAorICAgICAgICAgICAgICAgIEFDQ09VTlRfVFlQRSwKKyAgICAgICAgICAgICAgICBDQUxfU1lOQzEsCisgICAgICAgICAgICAgICAgQ0FMX1NZTkMyLAorICAgICAgICAgICAgICAgIENBTF9TWU5DMywKKyAgICAgICAgICAgICAgICBDQUxfU1lOQzQsCisgICAgICAgICAgICAgICAgQ0FMX1NZTkM1LAorICAgICAgICAgICAgICAgIENBTF9TWU5DNiwKKyAgICAgICAgICAgICAgICBDQUxfU1lOQzcsCisgICAgICAgICAgICAgICAgQ0FMX1NZTkM4LAorICAgICAgICAgICAgICAgIENBTF9TWU5DOSwKKyAgICAgICAgICAgICAgICBDQUxfU1lOQzEwLAorICAgICAgICAgICAgICAgIEFMTE9XRURfUkVNSU5ERVJTLAorICAgICAgICAgICAgICAgIENBTEVOREFSX0FDQ0VTU19MRVZFTCwKKyAgICAgICAgICAgICAgICBDQUxFTkRBUl9DT0xPUiwKKyAgICAgICAgICAgICAgICBDQUxFTkRBUl9USU1FX1pPTkUsCisgICAgICAgICAgICAgICAgQ0FOX01PRElGWV9USU1FX1pPTkUsCisgICAgICAgICAgICAgICAgQ0FOX09SR0FOSVpFUl9SRVNQT05ELAorICAgICAgICAgICAgICAgIENBTEVOREFSX0RJU1BMQVlfTkFNRSwKKyAgICAgICAgICAgICAgICBDQU5fUEFSVElBTExZX1VQREFURSwKKyAgICAgICAgICAgICAgICBTWU5DX0VWRU5UUywKKyAgICAgICAgICAgICAgICBWSVNJQkxFLAorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdGFibGUgYnkgYSBzeW5jIGFkYXB0ZXIuIFRvIG1vZGlmeSB0aGVtIHRoZQorICAgICAgICAgKiBjYWxsZXIgbXVzdCBpbmNsdWRlIENBTExFUl9JU19TWU5DQURBUFRFUiwgX1NZTkNfQUNDT1VOVCwgYW5kCisgICAgICAgICAqIF9TWU5DX0FDQ09VTlRfVFlQRSBpbiB0aGUgcXVlcnkgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1lOQ19XUklUQUJMRV9DT0xVTU5TID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIF9TWU5DX0lELAorICAgICAgICAgICAgRElSVFksCisgICAgICAgICAgICBTWU5DX0RBVEExLAorICAgICAgICAgICAgU1lOQ19EQVRBMiwKKyAgICAgICAgICAgIFNZTkNfREFUQTMsCisgICAgICAgICAgICBTWU5DX0RBVEE0LAorICAgICAgICAgICAgU1lOQ19EQVRBNSwKKyAgICAgICAgICAgIFNZTkNfREFUQTYsCisgICAgICAgICAgICBTWU5DX0RBVEE3LAorICAgICAgICAgICAgU1lOQ19EQVRBOCwKKyAgICAgICAgICAgIFNZTkNfREFUQTksCisgICAgICAgICAgICBTWU5DX0RBVEExMCwKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWVsZHMgYW5kIGhlbHBlcnMgZm9yIGludGVyYWN0aW5nIHdpdGggSW5zdGFuY2VzLiBBbiBpbnN0YW5jZSBpcyBhCisgICAgICogc2luZ2xlIG9jY3VycmVuY2Ugb2YgYW4gZXZlbnQgaW5jbHVkaW5nIHRpbWUgem9uZSBzcGVjaWZpYyBzdGFydCBhbmQgZW5kCisgICAgICogZGF5cyBhbmQgbWludXRlcy4gVGhlIGluc3RhbmNlcyB0YWJsZSBpcyBub3Qgd3JpdGFibGUgYW5kIG9ubHkgcHJvdmlkZXMgYQorICAgICAqIHdheSB0byBxdWVyeSBldmVudCBvY2N1cnJlbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEluc3RhbmNlcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEID0gQ2FsZW5kYXJzLlZJU0lCTEUgKyAiPTEiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIHF1ZXJ5IHRvIHJldHVybiBhbGwgdmlzaWJsZSBpbnN0YW5jZXMgaW4gdGhlIGdpdmVuIHJhbmdlLgorICAgICAgICAgKiBUaGlzIGlzIGEgYmxvY2tpbmcgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgZG9uZSBvbiB0aGUgVUkgdGhyZWFkLgorICAgICAgICAgKiBUaGlzIHdpbGwgY2F1c2UgYW4gZXhwYW5zaW9uIG9mIHJlY3VycmluZyBldmVudHMgdG8gZmlsbCB0aGlzIHRpbWUKKyAgICAgICAgICogcmFuZ2UgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgZXhwYW5kZWQgYW5kIHdpbGwgc2xvdyBkb3duIGZvciBsYXJnZXIKKyAgICAgICAgICogdGltZSByYW5nZXMgd2l0aCBtYW55IHJlY3VycmluZyBldmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciBUaGUgQ29udGVudFJlc29sdmVyIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5CisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBjb2x1bW5zIHRvIHJldHVybgorICAgICAgICAgKiBAcGFyYW0gYmVnaW4gVGhlIHN0YXJ0IG9mIHRoZSB0aW1lIHJhbmdlIHRvIHF1ZXJ5IGluIFVUQyBtaWxsaXMgc2luY2UKKyAgICAgICAgICogICAgICAgICAgICBlcG9jaAorICAgICAgICAgKiBAcGFyYW0gZW5kIFRoZSBlbmQgb2YgdGhlIHRpbWUgcmFuZ2UgdG8gcXVlcnkgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3IgY29udGFpbmluZyBhbGwgaW5zdGFuY2VzIGluIHRoZSBnaXZlbiByYW5nZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBTdHJpbmdbXSBwcm9qZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBERUZBVUxUX1NPUlRfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgcXVlcnkgdG8gcmV0dXJuIGFsbCB2aXNpYmxlIGluc3RhbmNlcyBpbiB0aGUgZ2l2ZW4gcmFuZ2UKKyAgICAgICAgICogdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcXVlcnkuIFRoaXMgaXMgYSBibG9ja2luZyBmdW5jdGlvbiBhbmQgc2hvdWxkCisgICAgICAgICAqIG5vdCBiZSBkb25lIG9uIHRoZSBVSSB0aHJlYWQuIFRoaXMgd2lsbCBjYXVzZSBhbiBleHBhbnNpb24gb2YKKyAgICAgICAgICogcmVjdXJyaW5nIGV2ZW50cyB0byBmaWxsIHRoaXMgdGltZSByYW5nZSBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeQorICAgICAgICAgKiBleHBhbmRlZCBhbmQgd2lsbCBzbG93IGRvd24gZm9yIGxhcmdlciB0aW1lIHJhbmdlcyB3aXRoIG1hbnkKKyAgICAgICAgICogcmVjdXJyaW5nIGV2ZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBDb250ZW50UmVzb2x2ZXIgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAgICAgICAgICogQHBhcmFtIHByb2plY3Rpb24gVGhlIGNvbHVtbnMgdG8gcmV0dXJuCisgICAgICAgICAqIEBwYXJhbSBiZWdpbiBUaGUgc3RhcnQgb2YgdGhlIHRpbWUgcmFuZ2UgdG8gcXVlcnkgaW4gVVRDIG1pbGxpcyBzaW5jZQorICAgICAgICAgKiAgICAgICAgICAgIGVwb2NoCisgICAgICAgICAqIEBwYXJhbSBlbmQgVGhlIGVuZCBvZiB0aGUgdGltZSByYW5nZSB0byBxdWVyeSBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICogQHBhcmFtIHNlYXJjaFF1ZXJ5IEEgc3RyaW5nIG9mIHNwYWNlIHNlcGFyYXRlZCBzZWFyY2ggdGVybXMuIFNlZ21lbnRzCisgICAgICAgICAqICAgICAgICAgICAgZW5jbG9zZWQgYnkgZG91YmxlIHF1b3RlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUKKyAgICAgICAgICogICAgICAgICAgICB0ZXJtLgorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIG9mIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgc2VhcmNoIHRlcm1zIGluIHRoZSBnaXZlbgorICAgICAgICAgKiAgICAgICAgIHRpbWUgcmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBiZWdpbiwgbG9uZyBlbmQsIFN0cmluZyBzZWFyY2hRdWVyeSkgeworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENPTlRFTlRfU0VBUkNIX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGJlZ2luKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZCk7CisgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5hcHBlbmRQYXRoKHNlYXJjaFF1ZXJ5KTsKKyAgICAgICAgICAgIHJldHVybiBjci5xdWVyeShidWlsZGVyLmJ1aWxkKCksIHByb2plY3Rpb24sIFdIRVJFX0NBTEVOREFSU19TRUxFQ1RFRCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9TT1JUX09SREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIHF1ZXJ5IHRvIHJldHVybiBhbGwgdmlzaWJsZSBpbnN0YW5jZXMgaW4gdGhlIGdpdmVuIHJhbmdlCisgICAgICAgICAqIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHNlbGVjdGlvbi4gVGhpcyBpcyBhIGJsb2NraW5nIGZ1bmN0aW9uIGFuZAorICAgICAgICAgKiBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gVGhpcyB3aWxsIGNhdXNlIGFuIGV4cGFuc2lvbiBvZgorICAgICAgICAgKiByZWN1cnJpbmcgZXZlbnRzIHRvIGZpbGwgdGhpcyB0aW1lIHJhbmdlIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5CisgICAgICAgICAqIGV4cGFuZGVkIGFuZCB3aWxsIHNsb3cgZG93biBmb3IgbGFyZ2VyIHRpbWUgcmFuZ2VzIHdpdGggbWFueQorICAgICAgICAgKiByZWN1cnJpbmcgZXZlbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIENvbnRlbnRSZXNvbHZlciB0byB1c2UgZm9yIHRoZSBxdWVyeQorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBUaGUgY29sdW1ucyB0byByZXR1cm4KKyAgICAgICAgICogQHBhcmFtIGJlZ2luIFRoZSBzdGFydCBvZiB0aGUgdGltZSByYW5nZSB0byBxdWVyeSBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mIHRoZSB0aW1lIHJhbmdlIHRvIHF1ZXJ5IGluIFVUQyBtaWxsaXMgc2luY2UKKyAgICAgICAgICogICAgICAgICAgICBlcG9jaAorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEZpbHRlciBvbiB0aGUgcXVlcnkgYXMgYW4gU1FMIFdIRVJFIHN0YXRlbWVudAorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBBcmdzIHRvIHJlcGxhY2UgYW55ICc/J3MgaW4gdGhlIHNlbGVjdGlvbgorICAgICAgICAgKiBAcGFyYW0gb3JkZXJCeSBIb3cgdG8gb3JkZXIgdGhlIHJvd3MgYXMgYW4gU1FMIE9SREVSIEJZIHN0YXRlbWVudAorICAgICAgICAgKiBAcmV0dXJuIEEgQ3Vyc29yIG9mIGluc3RhbmNlcyBtYXRjaGluZyB0aGUgc2VsZWN0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sIGxvbmcgYmVnaW4sCisgICAgICAgICAgICAgICAgbG9uZyBlbmQsIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsIFN0cmluZyBvcmRlckJ5KSB7CisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9VUkkuYnVpbGRVcG9uKCk7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBiZWdpbik7CisgICAgICAgICAgICBDb250ZW50VXJpcy5hcHBlbmRJZChidWlsZGVyLCBlbmQpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlbGVjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9ICIoIiArIHNlbGVjdGlvbiArICIpIEFORCAiICsgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBhIHF1ZXJ5IHRvIHJldHVybiBhbGwgdmlzaWJsZSBpbnN0YW5jZXMgaW4gdGhlIGdpdmVuIHJhbmdlCisgICAgICAgICAqIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHNlbGVjdGlvbi4gVGhpcyBpcyBhIGJsb2NraW5nIGZ1bmN0aW9uIGFuZAorICAgICAgICAgKiBzaG91bGQgbm90IGJlIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gVGhpcyB3aWxsIGNhdXNlIGFuIGV4cGFuc2lvbiBvZgorICAgICAgICAgKiByZWN1cnJpbmcgZXZlbnRzIHRvIGZpbGwgdGhpcyB0aW1lIHJhbmdlIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5CisgICAgICAgICAqIGV4cGFuZGVkIGFuZCB3aWxsIHNsb3cgZG93biBmb3IgbGFyZ2VyIHRpbWUgcmFuZ2VzIHdpdGggbWFueQorICAgICAgICAgKiByZWN1cnJpbmcgZXZlbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgVGhlIENvbnRlbnRSZXNvbHZlciB0byB1c2UgZm9yIHRoZSBxdWVyeQorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdGlvbiBUaGUgY29sdW1ucyB0byByZXR1cm4KKyAgICAgICAgICogQHBhcmFtIGJlZ2luIFRoZSBzdGFydCBvZiB0aGUgdGltZSByYW5nZSB0byBxdWVyeSBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICogQHBhcmFtIGVuZCBUaGUgZW5kIG9mIHRoZSB0aW1lIHJhbmdlIHRvIHF1ZXJ5IGluIFVUQyBtaWxsaXMgc2luY2UKKyAgICAgICAgICogICAgICAgICAgICBlcG9jaAorICAgICAgICAgKiBAcGFyYW0gc2VhcmNoUXVlcnkgQSBzdHJpbmcgb2Ygc3BhY2Ugc2VwYXJhdGVkIHNlYXJjaCB0ZXJtcy4gU2VnbWVudHMKKyAgICAgICAgICogICAgICAgICAgICBlbmNsb3NlZCBieSBkb3VibGUgcXVvdGVzIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZQorICAgICAgICAgKiAgICAgICAgICAgIHRlcm0uCisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gRmlsdGVyIG9uIHRoZSBxdWVyeSBhcyBhbiBTUUwgV0hFUkUgc3RhdGVtZW50CisgICAgICAgICAqIEBwYXJhbSBzZWxlY3Rpb25BcmdzIEFyZ3MgdG8gcmVwbGFjZSBhbnkgJz8ncyBpbiB0aGUgc2VsZWN0aW9uCisgICAgICAgICAqIEBwYXJhbSBvcmRlckJ5IEhvdyB0byBvcmRlciB0aGUgcm93cyBhcyBhbiBTUUwgT1JERVIgQlkgc3RhdGVtZW50CisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3Igb2YgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBzZWxlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgU3RyaW5nW10gcHJvamVjdGlvbiwgbG9uZyBiZWdpbiwKKyAgICAgICAgICAgICAgICBsb25nIGVuZCwgU3RyaW5nIHNlYXJjaFF1ZXJ5LCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgIFN0cmluZyBvcmRlckJ5KSB7CisgICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gQ09OVEVOVF9TRUFSQ0hfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgYmVnaW4pOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZW5kKTsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmFwcGVuZFBhdGgoc2VhcmNoUXVlcnkpOworICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlbGVjdGlvbikpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSBXSEVSRV9DQUxFTkRBUlNfU0VMRUNURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9ICIoIiArIHNlbGVjdGlvbiArICIpIEFORCAiICsgV0hFUkVfQ0FMRU5EQVJTX1NFTEVDVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KGJ1aWxkZXIuYnVpbGQoKSwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICBvcmRlckJ5ID09IG51bGwgPyBERUZBVUxUX1NPUlRfT1JERVIgOiBvcmRlckJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHF1ZXJ5aW5nIGFuIGluc3RhbmNlIHJhbmdlLiBUaGUgYmVnaW4KKyAgICAgICAgICogYW5kIGVuZCBvZiB0aGUgcmFuZ2UgdG8gcXVlcnkgc2hvdWxkIGJlIGFkZGVkIGFzIHBhdGggc2VnbWVudHMgaWYKKyAgICAgICAgICogdGhpcyBpcyB1c2VkIGRpcmVjdGx5LgorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvd2hlbiIpOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciBxdWVyeWluZyBhbiBpbnN0YW5jZSByYW5nZSBieSBKdWxpYW4KKyAgICAgICAgICogRGF5LiBUaGUgc3RhcnQgYW5kIGVuZCBkYXkgc2hvdWxkIGJlIGFkZGVkIGFzIHBhdGggc2VnbWVudHMgaWYgdGhpcworICAgICAgICAgKiBpcyB1c2VkIGRpcmVjdGx5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9CWV9EQVlfVVJJID0KKyAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL2luc3RhbmNlcy93aGVuYnlkYXkiKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgcXVlcnlpbmcgYW4gaW5zdGFuY2UgcmFuZ2Ugd2l0aCBhIHNlYXJjaAorICAgICAgICAgKiB0ZXJtLiBUaGUgYmVnaW4sIGVuZCwgYW5kIHNlYXJjaCBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIGFzIHBhdGgKKyAgICAgICAgICogc2VnbWVudHMgaWYgdGhpcyBpcyB1c2VkIGRpcmVjdGx5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArCisgICAgICAgICAgICAgICAgIi9pbnN0YW5jZXMvc2VhcmNoIik7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudDovLyBzdHlsZSBVUkwgZm9yIHF1ZXJ5aW5nIGFuIGluc3RhbmNlIHJhbmdlIHdpdGggYSBzZWFyY2gKKyAgICAgICAgICogdGVybS4gVGhlIHN0YXJ0IGRheSwgZW5kIGRheSwgYW5kIHNlYXJjaCBzdHJpbmcgc2hvdWxkIGJlIGFwcGVuZGVkIGFzCisgICAgICAgICAqIHBhdGggc2VnbWVudHMgaWYgdGhpcyBpcyB1c2VkIGRpcmVjdGx5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9TRUFSQ0hfQllfREFZX1VSSSA9CisgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9pbnN0YW5jZXMvc2VhcmNoYnlkYXkiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRlZmF1bHQgc29ydCBvcmRlciBmb3IgdGhpcyB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiYmVnaW4gQVNDIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGJlZ2lubmluZyB0aW1lIG9mIHRoZSBpbnN0YW5jZSwgaW4gVVRDIG1pbGxpc2Vjb25kcy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRUdJTiA9ICJiZWdpbiI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbmRpbmcgdGltZSBvZiB0aGUgaW5zdGFuY2UsIGluIFVUQyBtaWxsaXNlY29uZHMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nOyBtaWxsaXMgc2luY2UgZXBvY2gpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EID0gImVuZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBfaWQgb2YgdGhlIGV2ZW50IGZvciB0aGlzIGluc3RhbmNlLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZywgZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBKdWxpYW4gc3RhcnQgZGF5IG9mIHRoZSBpbnN0YW5jZSwgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHRpbWUKKyAgICAgICAgICogem9uZS4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9EQVkgPSAic3RhcnREYXkiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSnVsaWFuIGVuZCBkYXkgb2YgdGhlIGluc3RhbmNlLCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZQorICAgICAgICAgKiB6b25lLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoaW50KTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9EQVkgPSAiZW5kRGF5IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHN0YXJ0IG1pbnV0ZSBvZiB0aGUgaW5zdGFuY2UgbWVhc3VyZWQgZnJvbSBtaWRuaWdodCBpbiB0aGUKKyAgICAgICAgICogbG9jYWwgdGltZSB6b25lLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoaW50KTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX01JTlVURSA9ICJzdGFydE1pbnV0ZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbmQgbWludXRlIG9mIHRoZSBpbnN0YW5jZSBtZWFzdXJlZCBmcm9tIG1pZG5pZ2h0IGluIHRoZQorICAgICAgICAgKiBsb2NhbCB0aW1lIHpvbmUuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX01JTlVURSA9ICJlbmRNaW51dGUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGVuZGFyQ2FjaGUgc3RvcmVzIHNvbWUgc2V0dGluZ3MgZm9yIGNhbGVuZGFyIGluY2x1ZGluZyB0aGUgY3VycmVudAorICAgICAqIHRpbWUgem9uZSBmb3IgdGhlIGluc3RhY2VzLiBUaGVzZSBzZXR0aW5ncyBhcmUgc3RvcmVkIHVzaW5nIGEga2V5L3ZhbHVlCisgICAgICogc2NoZW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQ2FsZW5kYXJDYWNoZUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGtleSBmb3IgdGhlIHNldHRpbmcuIEtleXMgYXJlIGRlZmluZWQgaW4ge0BsaW5rIENhbGVuZGFyQ2FjaGV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZID0gImtleSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gc2V0dGluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbGVuZGFyQ2FjaGUgaW1wbGVtZW50cyBDYWxlbmRhckNhY2hlQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJJIHRvIHVzZSBmb3IgcmV0cmlldmluZyB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBDYWxlbmRhciBkYi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIFVSSSA9CisgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvcHJvcGVydGllcyIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBPSkVDVElPTiA9IHsgS0VZLCBWQUxVRSB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiB1cGRhdGluZyBhIHByb3BlcnR5LCB0aGlzIG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIHNlbGVjdGlvbi4gQWxsCisgICAgICAgICAqIG90aGVyIHNlbGVjdGlvbnMgd2lsbCBmYWlsLiBGb3IgcXVlcmllcyB0aGlzIGZpZWxkIGNhbiBiZSBvbWl0dGVkIHRvCisgICAgICAgICAqIHJldHJpZXZlIGFsbCBwcm9wZXJ0aWVzIG9yIHVzZWQgdG8gcXVlcnkgYSBzaW5nbGUgcHJvcGVydHkuIFZhbGlkCisgICAgICAgICAqIGtleXMgaW5jbHVkZSB7QGxpbmsgI1RJTUVaT05FX0tFWV9UWVBFfSwKKyAgICAgICAgICoge0BsaW5rICNUSU1FWk9ORV9LRVlfSU5TVEFOQ0VTfSwgYW5kCisgICAgICAgICAqIHtAbGluayAjVElNRVpPTkVfS0VZX0lOU1RBTkNFU19QUkVWSU9VU30sIHRob3VnaCB0aGUgbGFzdCBvbmUgY2FuCisgICAgICAgICAqIG9ubHkgYmUgcmVhZCwgbm90IHdyaXR0ZW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRSA9ICJrZXk9PyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZXkga2V5IGZvciB1cGRhdGluZyB0aGUgdXNlIG9mIGF1dG8vaG9tZSB0aW1lIHpvbmVzIGluIENhbGVuZGFyLgorICAgICAgICAgKiBWYWxpZCB2YWx1ZXMgYXJlIHtAbGluayAjVElNRVpPTkVfVFlQRV9BVVRPfSBvcgorICAgICAgICAgKiB7QGxpbmsgI1RJTUVaT05FX1RZUEVfSE9NRX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FWk9ORV9LRVlfVFlQRSA9ICJ0aW1lem9uZVR5cGUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUga2V5IGZvciB1cGRhdGluZyB0aGUgdGltZSB6b25lIHVzZWQgYnkgdGhlIHByb3ZpZGVyIHdoZW4gaXQKKyAgICAgICAgICogZ2VuZXJhdGVzIHRoZSBpbnN0YW5jZXMgdGFibGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgd3JpdHRlbiBpZiB0aGUKKyAgICAgICAgICogdHlwZSBpcyBzZXQgdG8ge0BsaW5rICNUSU1FWk9ORV9UWVBFX0hPTUV9LiBBIHZhbGlkIHRpbWUgem9uZSBpZAorICAgICAgICAgKiBzaG91bGQgYmUgd3JpdHRlbiB0byB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfS0VZX0lOU1RBTkNFUyA9ICJ0aW1lem9uZUluc3RhbmNlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBrZXkgZm9yIHJlYWRpbmcgdGhlIGxhc3QgdGltZSB6b25lIHNldCBieSB0aGUgdXNlci4gVGhpcyBzaG91bGQKKyAgICAgICAgICogb25seSBiZSByZWFkIGJ5IGFwcHMgYW5kIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW5ldmVyCisgICAgICAgICAqIHtAbGluayAjVElNRVpPTkVfS0VZX0lOU1RBTkNFU30gaXMgdXBkYXRlZCB3aXRoCisgICAgICAgICAqIHtAbGluayAjVElNRVpPTkVfVFlQRV9IT01FfSBzZXQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FWk9ORV9LRVlfSU5TVEFOQ0VTX1BSRVZJT1VTID0gInRpbWV6b25lSW5zdGFuY2VzUHJldmlvdXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8ge0BsaW5rICNUSU1FWk9ORV9LRVlfVFlQRX0gaWYgdGhlIHByb3ZpZGVyCisgICAgICAgICAqIHNob3VsZCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgZGV2aWNlJ3MgdGltZSB6b25lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfVFlQRV9BVVRPID0gImF1dG8iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8ge0BsaW5rICNUSU1FWk9ORV9LRVlfVFlQRX0gaWYgdGhlIHByb3ZpZGVyCisgICAgICAgICAqIHNob3VsZCB1c2UgYSBmaXhlZCB0aW1lIHpvbmUgc2V0IGJ5IHRoZSB1c2VyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVpPTkVfVFlQRV9IT01FID0gImhvbWUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmV3IENhbGVuZGFyIGdsb2JhbHMgYXJlIG5lZWRlZCBpbiB0aGUgQ2FsZW5kYXJQcm92aWRlciBmb3IgZXhwYW5kaW5nCisgICAgICogdGhlIEluc3RhbmNlcyB0YWJsZSBhbmQgdGhlc2UgYXJlIGFsbCBzdG9yZWQgaW4gdGhlIGZpcnN0IChhbmQgb25seSkgcm93CisgICAgICogb2YgdGhlIENhbGVuZGFyTWV0YURhdGEgdGFibGUuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQ2FsZW5kYXJNZXRhRGF0YUNvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxvY2FsIHRpbWV6b25lIHRoYXQgd2FzIHVzZWQgZm9yIHByZWNvbXB1dGluZyB0aGUgZmllbGRzCisgICAgICAgICAqIGluIHRoZSBJbnN0YW5jZXMgdGFibGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTF9USU1FWk9ORSA9ICJsb2NhbFRpbWV6b25lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1pbmltdW0gdGltZSB1c2VkIGluIGV4cGFuZGluZyB0aGUgSW5zdGFuY2VzIHRhYmxlLAorICAgICAgICAgKiBpbiBVVEMgbWlsbGlzZWNvbmRzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0lOU1RBTkNFID0gIm1pbkluc3RhbmNlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heGltdW0gdGltZSB1c2VkIGluIGV4cGFuZGluZyB0aGUgSW5zdGFuY2VzIHRhYmxlLAorICAgICAgICAgKiBpbiBVVEMgbWlsbGlzZWNvbmRzLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0lOU1RBTkNFID0gIm1heEluc3RhbmNlIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1pbmltdW0gSnVsaWFuIGRheSBpbiB0aGUgRXZlbnREYXlzIHRhYmxlLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOX0VWRU5UREFZUyA9ICJtaW5FdmVudERheXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF4aW11bSBKdWxpYW4gZGF5IGluIHRoZSBFdmVudERheXMgdGFibGUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfRVZFTlREQVlTID0gIm1heEV2ZW50RGF5cyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENhbGVuZGFyTWV0YURhdGEgaW1wbGVtZW50cyBDYWxlbmRhck1ldGFEYXRhQ29sdW1ucywgQmFzZUNvbHVtbnMgeworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgRXZlbnREYXlzQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgSnVsaWFuIHN0YXJ0aW5nIGRheSBudW1iZXIuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChpbnQpPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlREQVkgPSAic3RhcnREYXkiOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEp1bGlhbiBlbmRpbmcgZGF5IG51bWJlci4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGludCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkREQVkgPSAiZW5kRGF5IjsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpZWxkcyBhbmQgaGVscGVycyBmb3IgcXVlcnlpbmcgZm9yIGEgbGlzdCBvZiBkYXlzIHRoYXQgY29udGFpbiBldmVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudERheXMgaW1wbGVtZW50cyBFdmVudERheXNDb2x1bW5zIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZCisgICAgICAgICAgICAgICAgKyAiL2luc3RhbmNlcy9ncm91cGJ5ZGF5Iik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwcm9qZWN0aW9uIHVzZWQgYnkgdGhlIEV2ZW50RGF5cyBxdWVyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IHsgU1RBUlREQVksIEVORERBWSB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0gInNlbGVjdGVkPTEiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGRheXMgd2l0aCBldmVudHMgZm9yIHRoZSBKdWxpYW4gZGF5cyBzdGFydGluZyBhdAorICAgICAgICAgKiAic3RhcnREYXkiIGZvciAibnVtRGF5cyIuIEl0IHJldHVybnMgYSBjdXJzb3IgY29udGFpbmluZyBzdGFydGRheSBhbmQKKyAgICAgICAgICogZW5kZGF5IHJlcHJlc2VudGluZyB0aGUgbWF4IHJhbmdlIG9mIGRheXMgZm9yIGFsbCBldmVudHMgYmVnaW5uaW5nIG9uCisgICAgICAgICAqIGVhY2ggc3RhcnRkYXkuVGhpcyBpcyBhIGJsb2NraW5nIGZ1bmN0aW9uIGFuZCBzaG91bGQgbm90IGJlIGRvbmUgb24KKyAgICAgICAgICogdGhlIFVJIHRocmVhZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIHRoZSBDb250ZW50UmVzb2x2ZXIKKyAgICAgICAgICogQHBhcmFtIHN0YXJ0RGF5IHRoZSBmaXJzdCBKdWxpYW4gZGF5IGluIHRoZSByYW5nZQorICAgICAgICAgKiBAcGFyYW0gbnVtRGF5cyB0aGUgbnVtYmVyIG9mIGRheXMgdG8gbG9hZCAobXVzdCBiZSBhdCBsZWFzdCAxKQorICAgICAgICAgKiBAcmV0dXJuIGEgZGF0YWJhc2UgY3Vyc29yIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHN0YXJ0IGFuZCBlbmQgZGF5cyBmb3IKKyAgICAgICAgICogICAgICAgICBldmVudHMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ3Vyc29yIHF1ZXJ5KENvbnRlbnRSZXNvbHZlciBjciwgaW50IHN0YXJ0RGF5LCBpbnQgbnVtRGF5cykgeworICAgICAgICAgICAgaWYgKG51bURheXMgPCAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZW5kRGF5ID0gc3RhcnREYXkgKyBudW1EYXlzIC0gMTsKKyAgICAgICAgICAgIFVyaS5CdWlsZGVyIGJ1aWxkZXIgPSBDT05URU5UX1VSSS5idWlsZFVwb24oKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIHN0YXJ0RGF5KTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLmFwcGVuZElkKGJ1aWxkZXIsIGVuZERheSk7CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoYnVpbGRlci5idWlsZCgpLCBQUk9KRUNUSU9OLCBTRUxFQ1RJT04sCisgICAgICAgICAgICAgICAgICAgIG51bGwgLyogc2VsZWN0aW9uIGFyZ3MgKi8sIFNUQVJUREFZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgUmVtaW5kZXJzQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZXZlbnQgdGhlIHJlbWluZGVyIGJlbG9uZ3MgdG8uIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChmb3JlaWduIGtleSB0byB0aGUgRXZlbnRzIHRhYmxlKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0lEID0gImV2ZW50X2lkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1pbnV0ZXMgcHJpb3IgdG8gdGhlIGV2ZW50IHRoYXQgdGhlIGFsYXJtIHNob3VsZCByaW5nLiAgLTEKKyAgICAgICAgICogc3BlY2lmaWVzIHRoYXQgd2Ugc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN5c3RlbS4KKyAgICAgICAgICogQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VVEVTID0gIm1pbnV0ZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXNzaW5nIHRoaXMgYXMgYSBtaW51dGVzIHZhbHVlIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHJlbWluZGVyCisgICAgICAgICAqIG1pbnV0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5VVEVTX0RFRkFVTFQgPSAtMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFsYXJtIG1ldGhvZCwgYXMgc2V0IG9uIHRoZSBzZXJ2ZXIuIHtAbGluayAjTUVUSE9EX0RFRkFVTFR9LAorICAgICAgICAgKiB7QGxpbmsgI01FVEhPRF9BTEVSVH0sIHtAbGluayAjTUVUSE9EX0VNQUlMfSwgYW5kIHtAbGluayAjTUVUSE9EX1NNU30KKyAgICAgICAgICogYXJlIHBvc3NpYmxlIHZhbHVlczsgdGhlIGRldmljZSB3aWxsIG9ubHkgcHJvY2VzcworICAgICAgICAgKiB7QGxpbmsgI01FVEhPRF9ERUZBVUxUfSBhbmQge0BsaW5rICNNRVRIT0RfQUxFUlR9IHJlbWluZGVycyAodGhlCisgICAgICAgICAqIG90aGVyIHR5cGVzIGFyZSBzaW1wbHkgc3RvcmVkIHNvIHdlIGNhbiBzZW5kIHRoZSBzYW1lIHJlbWluZGVyIGluZm8KKyAgICAgICAgICogYmFjayB0byB0aGUgc2VydmVyIHdoZW4gd2UgbWFrZSBjaGFuZ2VzKS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRCA9ICJtZXRob2QiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9ERUZBVUxUID0gMDsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0FMRVJUID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0VNQUlMID0gMjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX1NNUyA9IDM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmllbGRzIGFuZCBoZWxwZXJzIGZvciBhY2Nlc3NpbmcgcmVtaW5kZXJzIGZvciBhbiBldmVudC4gRWFjaCByb3cgb2YgdGhpcworICAgICAqIHRhYmxlIHJlcHJlc2VudHMgYSBzaW5nbGUgcmVtaW5kZXIgZm9yIGFuIGV2ZW50LiBDYWxsaW5nCisgICAgICoge0BsaW5rICNxdWVyeShDb250ZW50UmVzb2x2ZXIsIGxvbmcpfSB3aWxsIHJldHVybiBhIGxpc3Qgb2YgcmVtaW5kZXJzIGZvcgorICAgICAqIHRoZSBldmVudCB3aXRoIHRoZSBnaXZlbiBldmVudElkLiBCb3RoIGFwcHMgYW5kIHN5bmMgYWRhcHRlcnMgbWF5IHdyaXRlCisgICAgICogdG8gdGhpcyB0YWJsZS4gVGhlcmUgYXJlIHRocmVlIHdyaXRhYmxlIGZpZWxkcyBhbmQgYWxsIG9mIHRoZW0gbXVzdCBiZQorICAgICAqIGluY2x1ZGVkIHdoZW4gaW5zZXJ0aW5nIGEgbmV3IHJlbWluZGVyLiBUaGV5IGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVZFTlRfSUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNNSU5VVEVTfTwvbGk+CisgICAgICogPGxpPntAbGluayAjTUVUSE9EfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlbWluZGVycyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBSZW1pbmRlcnNDb2x1bW5zLCBFdmVudHNDb2x1bW5zIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTUlOREVSU19XSEVSRSA9IENhbGVuZGFyQ29udHJhY3QuUmVtaW5kZXJzLkVWRU5UX0lEICsgIj0/IjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwcm9qZWN0aW9uIHVzZWQgYnkgdGhlIHJlbWluZGVycyBxdWVyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgX0lELCBNSU5VVEVTLCBNRVRIT0QsfTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvcmVtaW5kZXJzIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1ZXJpZXMgYWxsIHJlbWluZGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGV2ZW50LiBUaGlzIGlzIGEKKyAgICAgICAgICogYmxvY2tpbmcgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSBkb25lIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciBUaGUgY29udGVudCByZXNvbHZlciB0byB1c2UgZm9yIHRoZSBxdWVyeQorICAgICAgICAgKiBAcGFyYW0gZXZlbnRJZCBUaGUgaWQgb2YgdGhlIGV2ZW50IHRvIHJldHJpZXZlIHJlbWluZGVycyBmb3IKKyAgICAgICAgICogQHJldHVybiBBIEN1cnNvciBjb250YWluaW5nIGFsbCByZW1pbmRlcnMgZm9yIHRoZSBldmVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXJzb3IgcXVlcnkoQ29udGVudFJlc29sdmVyIGNyLCBsb25nIGV2ZW50SWQpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHJlbUFyZ3MgPSB7TG9uZy50b1N0cmluZyhldmVudElkKX07CisgICAgICAgICAgICByZXR1cm4gY3IucXVlcnkoQ09OVEVOVF9VUkksIFBST0pFQ1RJT04sIFJFTUlOREVSU19XSEVSRSwgcmVtQXJncyAvKiBzZWxlY3Rpb24gYXJncyAqLywKKyAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBzb3J0IG9yZGVyICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgQ2FsZW5kYXJBbGVydHNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBldmVudCB0aGF0IHRoZSBhbGVydCBiZWxvbmdzIHRvLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdGFydCB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFR0lOID0gImJlZ2luIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGVuZCB0aW1lIG9mIHRoZSBldmVudCwgaW4gVVRDLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORCA9ICJlbmQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYWxhcm0gdGltZSBvZiB0aGUgZXZlbnQsIGluIFVUQy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEFSTV9USU1FID0gImFsYXJtVGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoaXMgZGF0YWJhc2UgZW50cnksIGluIFVUQy4KKyAgICAgICAgICogVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzc2VkIHJlbWluZGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9USU1FID0gImNyZWF0aW9uVGltZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0aW1lIHRoYXQgdGhlIGFsYXJtIGJyb2FkY2FzdCB3YXMgcmVjZWl2ZWQgYnkgdGhlIENhbGVuZGFyIGFwcCwKKyAgICAgICAgICogaW4gVVRDLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyBtaXNzZWQgcmVtaW5kZXJzLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZzsgbWlsbGlzIHNpbmNlIGVwb2NoKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ0VJVkVEX1RJTUUgPSAicmVjZWl2ZWRUaW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHRpbWUgdGhhdCB0aGUgbm90aWZpY2F0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBDYWxlbmRhciBhcHAsCisgICAgICAgICAqIGluIFVUQy4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgbWlzc2VkIHJlbWluZGVycy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGxvbmc7IG1pbGxpcyBzaW5jZSBlcG9jaCk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRllfVElNRSA9ICJub3RpZnlUaW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHN0YXRlIG9mIHRoaXMgYWxlcnQuIEl0IHN0YXJ0cyBvdXQgYXMge0BsaW5rICNTQ0hFRFVMRUR9LCB0aGVuCisgICAgICAgICAqIHdoZW4gdGhlIGFsYXJtIGdvZXMgb2ZmLCBpdCBjaGFuZ2VzIHRvIHtAbGluayAjRklSRUR9LCBhbmQgdGhlbiB3aGVuCisgICAgICAgICAqIHRoZSB1c2VyIGRpc21pc3NlcyB0aGUgYWxhcm0gaXQgY2hhbmdlcyB0byB7QGxpbmsgI0RJU01JU1NFRH0uIENvbHVtbgorICAgICAgICAgKiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEUgPSAic3RhdGUiOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDSEVEVUxFRCA9IDA7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJUkVEID0gMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTTUlTU0VEID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBtaW51dGVzIHRoYXQgdGhpcyBhbGFybSBwcmVjZWRlcyB0aGUgc3RhcnQgdGltZS4gQ29sdW1uCisgICAgICAgICAqIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVI8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5VVEVTID0gIm1pbnV0ZXMiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIGFsZXJ0cyBxdWVyaWVzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAiYmVnaW4gQVNDLHRpdGxlIEFTQyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmllbGRzIGFuZCBoZWxwZXJzIGZvciBhY2Nlc3NpbmcgY2FsZW5kYXIgYWxlcnRzIGluZm9ybWF0aW9uLiBUaGVzZQorICAgICAqIGZpZWxkcyBhcmUgZm9yIHRyYWNraW5nIHdoaWNoIGFsZXJ0cyBoYXZlIGJlZW4gZmlyZWQuIFNjaGVkdWxlZCBhbGFybXMKKyAgICAgKiB3aWxsIGdlbmVyYXRlIGFuIGludGVudCB1c2luZyB7QGxpbmsgI0VWRU5UX1JFTUlOREVSX0FDVElPTn0uIEFwcHMgdGhhdAorICAgICAqIHJlY2VpdmUgdGhpcyBhY3Rpb24gbWF5IHVwZGF0ZSB0aGUge0BsaW5rICNTVEFURX0gZm9yIHRoZSByZW1pbmRlciB3aGVuCisgICAgICogdGhleSBoYXZlIGZpbmlzaGVkIGhhbmRsaW5nIGl0LiBBcHBzIHRoYXQgaGF2ZSB0aGVpciBub3RpZmljYXRpb25zCisgICAgICogZGlzYWJsZWQgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHRhYmxlIHRvIGVuc3VyZSB0aGF0IHRoZXkgZG8gbm90IGNvbmZsaWN0CisgICAgICogd2l0aCBhbm90aGVyIGFwcCB0aGF0IGlzIGdlbmVyYXRpbmcgYSBub3RpZmljYXRpb24uIEluIGdlbmVyYWwsIGFwcHMKKyAgICAgKiBzaG91bGQgbm90IG5lZWQgdG8gd3JpdGUgdG8gdGhpcyB0YWJsZSBkaXJlY3RseSBleGNlcHQgdG8gdXBkYXRlIHRoZQorICAgICAqIHN0YXRlIG9mIGEgcmVtaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxlbmRhckFsZXJ0cyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLAorICAgICAgICAgICAgQ2FsZW5kYXJBbGVydHNDb2x1bW5zLCBFdmVudHNDb2x1bW5zLCBDYWxlbmRhcnNDb2x1bW5zIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiQ2FsZW5kYXJBbGVydHMiOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVyaSBmb3IgcXVlcnlpbmcgY2FsZW5kYXIgYWxlcnQgaW5mb3JtYXRpb24KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKworICAgICAgICAgICAgICAgICIvY2FsZW5kYXJfYWxlcnRzIik7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX0FMQVJNX0VYSVNUUyA9IEVWRU5UX0lEICsgIj0/IgorICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIEJFR0lOICsgIj0/IgorICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIEFMQVJNX1RJTUUgKyAiPT8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSEVSRV9GSU5ETkVYVEFMQVJNVElNRSA9IEFMQVJNX1RJTUUgKyAiPj0/IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPUlRfT1JERVJfQUxBUk1USU1FX0FTQyA9IEFMQVJNX1RJTUUgKyAiIEFTQyI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdIRVJFX1JFU0NIRURVTEVfTUlTU0VEX0FMQVJNUyA9IFNUQVRFICsgIj0iICsgU0NIRURVTEVECisgICAgICAgICAgICAgICAgKyAiIEFORCAiICsgQUxBUk1fVElNRSArICI8PyIKKyAgICAgICAgICAgICAgICArICIgQU5EICIgKyBBTEFSTV9USU1FICsgIj4/IgorICAgICAgICAgICAgICAgICsgIiBBTkQgIiArIEVORCArICI+PT8iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIFVSSSBpcyBmb3IgZ3JvdXBpbmcgdGhlIHF1ZXJ5IHJlc3VsdHMgYnkgZXZlbnRfaWQgYW5kIGJlZ2luCisgICAgICAgICAqIHRpbWUuICBUaGlzIHdpbGwgcmV0dXJuIG9uZSByZXN1bHQgcGVyIGluc3RhbmNlIG9mIGFuIGV2ZW50LiAgU28KKyAgICAgICAgICogZXZlbnRzIHdpdGggbXVsdGlwbGUgYWxhcm1zIHdpbGwgYXBwZWFyIGp1c3Qgb25jZSwgYnV0IG11bHRpcGxlCisgICAgICAgICAqIGluc3RhbmNlcyBvZiBhIHJlcGVhdGluZyBldmVudCB3aWxsIHNob3cgdXAgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSV9CWV9JTlNUQU5DRSA9CisgICAgICAgICAgICBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iICsgQVVUSE9SSVRZICsgIi9jYWxlbmRhcl9hbGVydHMvYnlfaW5zdGFuY2UiKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGVscGVyIGZvciBpbnNlcnRpbmcgYW4gYWxhcm0gdGltZSBhc3NvY2lhdGVkIHdpdGggYW4gZXZlbnQKKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIGluc2VydChDb250ZW50UmVzb2x2ZXIgY3IsIGxvbmcgZXZlbnRJZCwKKyAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGVuZCwgbG9uZyBhbGFybVRpbWUsIGludCBtaW51dGVzKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQWxlcnRzLkVWRU5UX0lELCBldmVudElkKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJBbGVydHMuQkVHSU4sIGJlZ2luKTsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJBbGVydHMuRU5ELCBlbmQpOworICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5BTEFSTV9USU1FLCBhbGFybVRpbWUpOworICAgICAgICAgICAgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5DUkVBVElPTl9USU1FLCBjdXJyZW50VGltZSk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQWxlcnRzLlJFQ0VJVkVEX1RJTUUsIDApOworICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5OT1RJRllfVElNRSwgMCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KENhbGVuZGFyQWxlcnRzLlNUQVRFLCBTQ0hFRFVMRUQpOworICAgICAgICAgICAgdmFsdWVzLnB1dChDYWxlbmRhckFsZXJ0cy5NSU5VVEVTLCBtaW51dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBjci5pbnNlcnQoQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUXVlcmllcyBhbGVydHMgaW5mbyB1c2luZyB0aGUgZ2l2ZW4gcHJvamVjdGlvbiwgc2VsZWN0aW9uIGZpbHRlciwgYW5kCisgICAgICAgICAqIG9yZGVyaW5nLiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSBkb25lIG9uIHRoZSBVSQorICAgICAgICAgKiB0aHJlYWQuIEZvciBzZWxlY3Rpb24gYW5kIHNlbGVjdGlvbkFyZ3MgdXNhZ2Ugc2VlCisgICAgICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjcXVlcnkoVXJpLCBTdHJpbmdbXSwgU3RyaW5nLCBTdHJpbmdbXSwgU3RyaW5nKX0KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIFRoZSBjb250ZW50IHJlc29sdmVyIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5CisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBjb2x1bW5zIHRvIHJldHVybgorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIEZpbHRlciBvbiB0aGUgcXVlcnkgYXMgYW4gU1FMIFdIRVJFIHN0YXRlbWVudAorICAgICAgICAgKiBAcGFyYW0gc2VsZWN0aW9uQXJncyBBcmdzIHRvIHJlcGxhY2UgYW55ICc/J3MgaW4gdGhlIHNlbGVjdGlvbgorICAgICAgICAgKiBAcGFyYW0gc29ydE9yZGVyIEhvdyB0byBvcmRlciB0aGUgcm93cyBhcyBhbiBTUUwgT1JERVIgQlkgc3RhdGVtZW50CisgICAgICAgICAqIEByZXR1cm4gQSBDdXJzb3IgY29udGFpbmluZyB0aGUgbWF0Y2hpbmcgYWxlcnRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEN1cnNvciBxdWVyeShDb250ZW50UmVzb2x2ZXIgY3IsIFN0cmluZ1tdIHByb2plY3Rpb24sCisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiwgU3RyaW5nW10gc2VsZWN0aW9uQXJncywgU3RyaW5nIHNvcnRPcmRlcikgeworICAgICAgICAgICAgcmV0dXJuIGNyLnF1ZXJ5KENPTlRFTlRfVVJJLCBwcm9qZWN0aW9uLCBzZWxlY3Rpb24sIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZHMgdGhlIG5leHQgYWxhcm0gYWZ0ZXIgKG9yIGVxdWFsIHRvKSB0aGUgZ2l2ZW4gdGltZSBhbmQgcmV0dXJucworICAgICAgICAgKiB0aGUgdGltZSBvZiB0aGF0IGFsYXJtIG9yIC0xIGlmIG5vIHN1Y2ggYWxhcm0gZXhpc3RzLiBUaGlzIGlzIGEKKyAgICAgICAgICogYmxvY2tpbmcgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSBkb25lIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjciB0aGUgQ29udGVudFJlc29sdmVyCisgICAgICAgICAqIEBwYXJhbSBtaWxsaXMgdGhlIHRpbWUgaW4gVVRDIG1pbGxpc2Vjb25kcworICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGFsYXJtIHRpbWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICJtaWxsaXMiLCBvciAtMQorICAgICAgICAgKiAgICAgICAgIGlmIG5vIHN1Y2ggYWxhcm0gZXhpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGZpbmROZXh0QWxhcm1UaW1lKENvbnRlbnRSZXNvbHZlciBjciwgbG9uZyBtaWxsaXMpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3Rpb24gPSBBTEFSTV9USU1FICsgIj49IiArIG1pbGxpczsKKyAgICAgICAgICAgIC8vIFRPRE86IGNvbnN0cnVjdCBhbiBleHBsaWNpdCBTUUwgcXVlcnkgc28gdGhhdCB3ZSBjYW4gYWRkCisgICAgICAgICAgICAvLyAiTElNSVQgMSIgdG8gdGhlIGVuZCBhbmQgZ2V0IGp1c3Qgb25lIHJlc3VsdC4KKyAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10geyBBTEFSTV9USU1FIH07CisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gcXVlcnkoY3IsIHByb2plY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIFdIRVJFX0ZJTkRORVhUQUxBUk1USU1FLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhtaWxsaXMpCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIFNPUlRfT1JERVJfQUxBUk1USU1FX0FTQyk7CisgICAgICAgICAgICBsb25nIGFsYXJtVGltZSA9IC0xOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxhcm1UaW1lID0gY3Vyc29yLmdldExvbmcoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFsYXJtVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZWFyY2hlcyB0aGUgQ2FsZW5kYXJBbGVydHMgdGFibGUgZm9yIGFsYXJtcyB0aGF0IHNob3VsZCBoYXZlIGZpcmVkCisgICAgICAgICAqIGJ1dCBoYXZlIG5vdCBhbmQgdGhlbiByZXNjaGVkdWxlcyB0aGVtLiAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZAorICAgICAgICAgKiBhdCBib290IHRpbWUgdG8gcmVzdG9yZSBhbGFybXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGxvc3QgZHVlIHRvIGEKKyAgICAgICAgICogcGhvbmUgcmVib290LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgdGhlIENvbnRlbnRSZXNvbHZlcgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgQ29udGV4dAorICAgICAgICAgKiBAcGFyYW0gbWFuYWdlciB0aGUgQWxhcm1NYW5hZ2VyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVzY2hlZHVsZU1pc3NlZEFsYXJtcyhDb250ZW50UmVzb2x2ZXIgY3IsCisgICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBbGFybU1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgYWxlcnRzIHRoYXQgaGF2ZSBiZWVuIHNjaGVkdWxlZCBidXQgaGF2ZSBub3QgZmlyZWQKKyAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgaGF2ZSBmaXJlZCBieSBub3cgYW5kIGFyZSBub3QgdG9vIG9sZC4KKyAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICBsb25nIGFuY2llbnQgPSBub3cgLSBEYXRlVXRpbHMuREFZX0lOX01JTExJUzsKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb2plY3Rpb24gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICBBTEFSTV9USU1FLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gVE9ETzogY29uc3RydWN0IGFuIGV4cGxpY2l0IFNRTCBxdWVyeSBzbyB0aGF0IHdlIGNhbiBhZGQKKyAgICAgICAgICAgIC8vICJHUk9VUEJZIiBpbnN0ZWFkIG9mIGRvaW5nIGEgc29ydCBhbmQgZGUtZHVwCisgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gQ2FsZW5kYXJBbGVydHMucXVlcnkoY3IsCisgICAgICAgICAgICAgICAgICAgIHByb2plY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIFdIRVJFX1JFU0NIRURVTEVfTUlTU0VEX0FMQVJNUywKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcobm93KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoYW5jaWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG5vdykKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgU09SVF9PUkRFUl9BTEFSTVRJTUVfQVNDKTsKKyAgICAgICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibWlzc2VkIGFsYXJtcyBmb3VuZDogIiArIGN1cnNvci5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIGFsYXJtVGltZSA9IC0xOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBuZXdBbGFybVRpbWUgPSBjdXJzb3IuZ2V0TG9uZygwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsYXJtVGltZSAhPSBuZXdBbGFybVRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInJlc2NoZWR1bGluZyBtaXNzZWQgYWxhcm0uIGFsYXJtVGltZTogIiArIG5ld0FsYXJtVGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZUFsYXJtKGNvbnRleHQsIG1hbmFnZXIsIG5ld0FsYXJtVGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGFybVRpbWUgPSBuZXdBbGFybVRpbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGN1cnNvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNjaGVkdWxlcyBhbiBhbGFybSBpbnRlbnQgd2l0aCB0aGUgc3lzdGVtIEFsYXJtTWFuYWdlciB0aGF0IHdpbGwKKyAgICAgICAgICogbm90aWZ5IGxpc3RlbmVycyB3aGVuIGEgcmVtaW5kZXIgc2hvdWxkIGJlIGZpcmVkLiBUaGUgcHJvdmlkZXIgd2lsbAorICAgICAgICAgKiBrZWVwIHNjaGVkdWxlZCByZW1pbmRlcnMgdXAgdG8gZGF0ZSBidXQgYXBwcyBtYXkgdXNlIHRoaXMgdG8KKyAgICAgICAgICogaW1wbGVtZW50IHNub296ZSBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSByZW1pbmRlcnMgdGFibGUuCisgICAgICAgICAqIFNjaGVkdWxlZCBhbGFybXMgd2lsbCBnZW5lcmF0ZSBhbiBpbnRlbnQgdXNpbmcKKyAgICAgICAgICoge0BsaW5rICNFVkVOVF9SRU1JTkRFUl9BQ1RJT059LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQgZm9yIHJlZmVyZW5jaW5nIHN5c3RlbSByZXNvdXJjZXMKKyAgICAgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIEFsYXJtTWFuYWdlciB0byB1c2Ugb3IgbnVsbAorICAgICAgICAgKiBAcGFyYW0gYWxhcm1UaW1lIFRoZSB0aW1lIHRvIGZpcmUgdGhlIGludGVudCBpbiBVVEMgbWlsbGlzIHNpbmNlCisgICAgICAgICAqICAgICAgICAgICAgZXBvY2gKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzY2hlZHVsZUFsYXJtKENvbnRleHQgY29udGV4dCwgQWxhcm1NYW5hZ2VyIG1hbmFnZXIsIGxvbmcgYWxhcm1UaW1lKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBUaW1lIHRpbWUgPSBuZXcgVGltZSgpOworICAgICAgICAgICAgICAgIHRpbWUuc2V0KGFsYXJtVGltZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVkVGltZSA9IHRpbWUuZm9ybWF0KCIgJWEsICViICVkLCAlWSAlSTolTSVQIik7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2NoZWR1bGUgYWxhcm0gYXQgIiArIGFsYXJtVGltZSArICIgIiArIHNjaGVkVGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYW5hZ2VyID0gKEFsYXJtTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEVWRU5UX1JFTUlOREVSX0FDVElPTik7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChDYWxlbmRhckNvbnRyYWN0LkNPTlRFTlRfVVJJLCBhbGFybVRpbWUpKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShBTEFSTV9USU1FLCBhbGFybVRpbWUpOworICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KGNvbnRleHQsIDAsIGludGVudCwgMCk7CisgICAgICAgICAgICBtYW5hZ2VyLnNldChBbGFybU1hbmFnZXIuUlRDX1dBS0VVUCwgYWxhcm1UaW1lLCBwaSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VhcmNoZXMgZm9yIGFuIGVudHJ5IGluIHRoZSBDYWxlbmRhckFsZXJ0cyB0YWJsZSB0aGF0IG1hdGNoZXMKKyAgICAgICAgICogdGhlIGdpdmVuIGV2ZW50IGlkLCBiZWdpbiB0aW1lIGFuZCBhbGFybSB0aW1lLiAgSWYgb25lIGlzIGZvdW5kCisgICAgICAgICAqIHRoZW4gdGhpcyBhbGFybSBhbHJlYWR5IGV4aXN0cyBhbmQgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3IgdGhlIENvbnRlbnRSZXNvbHZlcgorICAgICAgICAgKiBAcGFyYW0gZXZlbnRJZCB0aGUgZXZlbnQgaWQgdG8gbWF0Y2gKKyAgICAgICAgICogQHBhcmFtIGJlZ2luIHRoZSBzdGFydCB0aW1lIG9mIHRoZSBldmVudCBpbiBVVEMgbWlsbGlzCisgICAgICAgICAqIEBwYXJhbSBhbGFybVRpbWUgdGhlIGFsYXJtIHRpbWUgb2YgdGhlIGV2ZW50IGluIFVUQyBtaWxsaXMKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gYWxhcm0gZm9yIHRoZSBnaXZlbiBldmVudAorICAgICAgICAgKiAgIHdpdGggdGhlIHNhbWUgc3RhcnQgdGltZSBhbmQgYWxhcm0gdGltZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBhbGFybUV4aXN0cyhDb250ZW50UmVzb2x2ZXIgY3IsIGxvbmcgZXZlbnRJZCwKKyAgICAgICAgICAgICAgICBsb25nIGJlZ2luLCBsb25nIGFsYXJtVGltZSkgeworICAgICAgICAgICAgLy8gVE9ETzogY29uc3RydWN0IGFuIGV4cGxpY2l0IFNRTCBxdWVyeSBzbyB0aGF0IHdlIGNhbiBhZGQKKyAgICAgICAgICAgIC8vICJMSU1JVCAxIiB0byB0aGUgZW5kIGFuZCBnZXQganVzdCBvbmUgcmVzdWx0LgorICAgICAgICAgICAgU3RyaW5nW10gcHJvamVjdGlvbiA9IG5ldyBTdHJpbmdbXSB7IEFMQVJNX1RJTUUgfTsKKyAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBxdWVyeShjciwKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgV0hFUkVfQUxBUk1fRVhJU1RTLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhldmVudElkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcoYmVnaW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhhbGFybVRpbWUpCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY3Vyc29yICE9IG51bGwgJiYgY3Vyc29yLmdldENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjdXJzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEV4dGVuZGVkUHJvcGVydGllc0NvbHVtbnMgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGV2ZW50IHRoZSBleHRlbmRlZCBwcm9wZXJ0eSBiZWxvbmdzIHRvLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAoZm9yZWlnbiBrZXkgdG8gdGhlIEV2ZW50cyB0YWJsZSk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBleHRlbmRlZCBwcm9wZXJ0eS4gIFRoaXMgaXMgYSB1cmkgb2YgdGhlIGZvcm0KKyAgICAgICAgICoge3NjaGVtZX0je2xvY2FsLW5hbWV9IGNvbnZlbnRpb24uIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBwcm9wZXJ0eS4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmllbGRzIGZvciBhY2Nlc3NpbmcgdGhlIEV4dGVuZGVkIFByb3BlcnRpZXMuIFRoaXMgaXMgYSBnZW5lcmljIHNldCBvZgorICAgICAqIG5hbWUvdmFsdWUgcGFpcnMgZm9yIHVzZSBieSBzeW5jIGFkYXB0ZXJzIG9yIGFwcHMgdG8gYWRkIGV4dHJhCisgICAgICogaW5mb3JtYXRpb24gdG8gZXZlbnRzLiBUaGVyZSBhcmUgdGhyZWUgd3JpdGFibGUgY29sdW1ucyBhbmQgYWxsIHRocmVlCisgICAgICogbXVzdCBiZSBwcmVzZW50IHdoZW4gaW5zZXJ0aW5nIGEgbmV3IHZhbHVlLiBUaGV5IGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayAjRVZFTlRfSUR9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rICNOQU1FfTwvbGk+CisgICAgICogPGxpPntAbGluayAjVkFMVUV9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFeHRlbmRlZFByb3BlcnRpZXMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucywKKyAgICAgICAgICAgIEV4dGVuZGVkUHJvcGVydGllc0NvbHVtbnMsIEV2ZW50c0NvbHVtbnMgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvZXh0ZW5kZWRwcm9wZXJ0aWVzIik7CisKKyAgICAgICAgLy8gVE9ETzogZmlsbCBvdXQgdGhpcyBjbGFzcyB3aGVuIHdlIGFjdHVhbGx5IHN0YXJ0IHV0aWxpemluZyBleHRlbmRlZHByb3BlcnRpZXMKKyAgICAgICAgLy8gaW4gdGhlIGNhbGVuZGFyIGFwcGxpY2F0aW9uLgorICAgfQorCisgICAgLyoqCisgICAgICogQSB0YWJsZSBwcm92aWRlZCBmb3Igc3luYyBhZGFwdGVycyB0byB1c2UgZm9yIHN0b3JpbmcgcHJpdmF0ZSBzeW5jIHN0YXRlIGRhdGEuCisgICAgICoKKyAgICAgKiBAc2VlIFN5bmNTdGF0ZUNvbnRyYWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW5jU3RhdGUgaW1wbGVtZW50cyBTeW5jU3RhdGVDb250cmFjdC5Db2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgdXRpbGl0eSBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN5bmNTdGF0ZSgpIHt9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRElSRUNUT1JZID0KKyAgICAgICAgICAgICAgICBTeW5jU3RhdGVDb250cmFjdC5Db25zdGFudHMuQ09OVEVOVF9ESVJFQ1RPUlk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKENhbGVuZGFyQ29udHJhY3QuQ09OVEVOVF9VUkksIENPTlRFTlRfRElSRUNUT1JZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2x1bW5zIGZyb20gdGhlIEV2ZW50c1Jhd1RpbWVzIHRhYmxlCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgRXZlbnRzUmF3VGltZXNDb2x1bW5zIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb3JyZXNwb25kaW5nIGV2ZW50IGlkLiBDb2x1bW4gbmFtZS4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9JRCA9ICJldmVudF9pZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBSRkMyNDQ1IGNvbXBsaWFudCB0aW1lIHRoZSBldmVudCBzdGFydHMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRTVEFSVF8yNDQ1ID0gImR0c3RhcnQyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IHRpbWUgdGhlIGV2ZW50IGVuZHMuIENvbHVtbiBuYW1lLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRFTkRfMjQ0NSA9ICJkdGVuZDI0NDUiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgUkZDMjQ0NSBjb21wbGlhbnQgb3JpZ2luYWwgaW5zdGFuY2UgdGltZSBvZiB0aGUgcmVjdXJyaW5nIGV2ZW50CisgICAgICAgICAqIGZvciB3aGljaCB0aGlzIGV2ZW50IGlzIGFuIGV4Y2VwdGlvbi4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUklHSU5BTF9JTlNUQU5DRV9USU1FXzI0NDUgPSAib3JpZ2luYWxJbnN0YW5jZVRpbWUyNDQ1IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFJGQzI0NDUgY29tcGxpYW50IGxhc3QgZGF0ZSB0aGlzIGV2ZW50IHJlcGVhdHMgb24sIG9yIE5VTEwgaWYgaXQKKyAgICAgICAgICogbmV2ZXIgZW5kcy4gQ29sdW1uIG5hbWUuCisgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0RBVEVfMjQ0NSA9ICJsYXN0RGF0ZTI0NDUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFdmVudHNSYXdUaW1lcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zLCBFdmVudHNSYXdUaW1lc0NvbHVtbnMgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NhbGxMb2cuamF2YQppbmRleCBiZjA1MWY1Li4wMmZhZjQ5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9DYWxsTG9nLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ2FsbExvZy5qYXZhCkBAIC03Nyw5ICs3NywxNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKIAorICAgICAgICAvKiogQ2FsbCBsb2cgdHlwZSBmb3IgaW5jb21pbmcgY2FsbHMuICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ09NSU5HX1RZUEUgPSAxOworICAgICAgICAvKiogQ2FsbCBsb2cgdHlwZSBmb3Igb3V0Z29pbmcgY2FsbHMuICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVEdPSU5HX1RZUEUgPSAyOworICAgICAgICAvKiogQ2FsbCBsb2cgdHlwZSBmb3IgbWlzc2VkIGNhbGxzLiAqLwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSVNTRURfVFlQRSA9IDM7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsIGxvZyB0eXBlIGZvciB2b2ljZW1haWxzLgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9JQ0VNQUlMX1RZUEUgPSA0OwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIGFzIHRoZSB1c2VyIGVudGVyZWQgaXQuCkBAIC0xNDMsNiArMTUxLDEzIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFRF9OVU1CRVJfTEFCRUwgPSAibnVtYmVybGFiZWwiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBVUkkgb2YgdGhlIHZvaWNlbWFpbCBlbnRyeS4gUG9wdWxhdGVkIG9ubHkgZm9yIHtAbGluayAjVk9JQ0VNQUlMX1RZUEV9LgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JQ0VNQUlMX1VSSSA9ICJ2b2ljZW1haWxfdXJpIjsKKworICAgICAgICAvKioKICAgICAgICAgICogQWRkcyBhIGNhbGwgdG8gdGhlIGNhbGwgbG9nLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gY2kgdGhlIENhbGxlckluZm8gb2JqZWN0IHRvIGdldCB0aGUgdGFyZ2V0IGNvbnRhY3QgZnJvbS4gIENhbiBiZSBudWxsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Db250YWN0c0NvbnRyYWN0LmphdmEKaW5kZXggMjJiNGM3Ni4uYjVhMTFhYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvQ29udGFjdHNDb250cmFjdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0NvbnRhY3RzQ29udHJhY3QuamF2YQpAQCAtMTIyLDYgKzEyMiwxNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExFUl9JU19TWU5DQURBUFRFUiA9ICJjYWxsZXJfaXNfc3luY2FkYXB0ZXIiOwogCiAgICAgLyoqCisgICAgICogQW4gb3B0aW9uYWwgVVJJIHBhcmFtZXRlciBmb3Igc2VsZWN0aW9uIHF1ZXJpZXMgdGhhdCBpbnN0cnVjdHMgdGhlCisgICAgICogcHJvdmlkZXIgdG8gaW5jbHVkZSB0aGUgdXNlcidzIHBlcnNvbmFsIHByb2ZpbGUgY29udGFjdCBlbnRyeSAoaWYgYW55KQorICAgICAqIGluIHRoZSBjb250YWN0IHJlc3VsdHMuICBJZiBwcmVzZW50LCB0aGUgdXNlcidzIHByb2ZpbGUgd2lsbCBhbHdheXMgYmUKKyAgICAgKiB0aGUgZmlyc3QgZW50cnkgcmV0dXJuZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKgorICAgICAqIFNwZWNpZnlpbmcgdGhpcyBwYXJhbWV0ZXIgd2lsbCByZXN1bHQgaW4gYSBzZWN1cml0eSBlcnJvciBpZiB0aGUgY2FsbGluZworICAgICAqIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUFJPRklMRSBwZXJtaXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfUFJPRklMRSA9ICJpbmNsdWRlX3Byb2ZpbGUiOworCisgICAgLyoqCiAgICAgICogQSBxdWVyeSBwYXJhbWV0ZXIga2V5IHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFja2FnZSB0aGF0IGlzIHJlcXVlc3RpbmcgYSBxdWVyeS4KICAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHJlc3RyaWN0aW5nIGRhdGEgYmFzZWQgb24gcGFja2FnZSBuYW1lLgogICAgICAqCkBAIC0xNTIsMTQgKzE2MywxMiBAQAogICAgICAqIG9idGFpbmluZyBwb3NzaWJsZSByZWNpcGllbnRzLCBsZXR0aW5nIHRoZSBwcm92aWRlciBrbm93IHdoaWNoIGFjY291bnQgaXMgc2VsZWN0ZWQgZHVyaW5nCiAgICAgICogdGhlIGNvbXBvc2l0aW9uLiBUaGUgcHJvdmlkZXIgbWF5IHVzZSB0aGUgInByaW1hcnkgYWNjb3VudCIgaW5mb3JtYXRpb24gdG8gb3B0aW1pemUKICAgICAgKiB0aGUgc2VhcmNoIHJlc3VsdC4KLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfQUNDT1VOVF9OQU1FID0gIm5hbWVfZm9yX3ByaW1hcnlfYWNjb3VudCI7CiAKICAgICAvKioKICAgICAgKiBBIHF1ZXJ5IHBhcmFtZXRlciBzcGVjaWZpbmcgYSBwcmltYXJ5IGFjY291bnQuIFRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSB1c2VkIHdpdGgKICAgICAgKiB7QGxpbmsgI1BSSU1BUllfQUNDT1VOVF9OQU1FfS4gU2VlIHRoZSBkb2MgaW4ge0BsaW5rICNQUklNQVJZX0FDQ09VTlRfTkFNRX0uCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0FDQ09VTlRfVFlQRSA9ICJ0eXBlX2Zvcl9wcmltYXJ5X2FjY291bnQiOwogCkBAIC03NjMsMTIgKzc3MiwxOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9UT19USFVNQk5BSUxfVVJJID0gInBob3RvX3RodW1iX3VyaSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIExvb2t1cCB2YWx1ZSB0aGF0IHJlZmxlY3RzIHRoZSB7QGxpbmsgR3JvdXBzI0dST1VQX1ZJU0lCTEV9IHN0YXRlIG9mCi0gICAgICAgICAqIGFueSB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcH0gZm9yIHRoaXMgY29udGFjdC4KKyAgICAgICAgICogRmxhZyB0aGF0IHJlZmxlY3RzIHRoZSB7QGxpbmsgR3JvdXBzI0dST1VQX1ZJU0lCTEV9IHN0YXRlIG9mIGFueQorICAgICAgICAgKiB7QGxpbmsgQ29tbW9uRGF0YUtpbmRzLkdyb3VwTWVtYmVyc2hpcH0gZm9yIHRoaXMgY29udGFjdC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOX1ZJU0lCTEVfR1JPVVAgPSAiaW5fdmlzaWJsZV9ncm91cCI7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgdGhhdCByZWZsZWN0cyB3aGV0aGVyIHRoaXMgY29udGFjdCByZXByZXNlbnRzIHRoZSB1c2VyJ3MKKyAgICAgICAgICogcGVyc29uYWwgcHJvZmlsZSBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1VTRVJfUFJPRklMRSA9ICJpc191c2VyX3Byb2ZpbGUiOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBBbiBpbmRpY2F0b3Igb2Ygd2hldGhlciB0aGlzIGNvbnRhY3QgaGFzIGF0IGxlYXN0IG9uZSBwaG9uZSBudW1iZXIuICIxIiBpZiB0aGVyZSBpcwogICAgICAgICAgKiBhdCBsZWFzdCBvbmUgcGhvbmUgbnVtYmVyLCAiMCIgb3RoZXJ3aXNlLgogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgpAQCAtMTI4MSwxMSArMTI5NiwyMCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1ZDQVJEX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKENPTlRFTlRfVVJJLAogICAgICAgICAgICAgICAgICJhc192Y2FyZCIpOwogCisgICAgICAgLyoqCisgICAgICAgICogQm9vbGVhbiBwYXJhbWV0ZXIgdGhhdCBtYXkgYmUgdXNlZCB3aXRoIHtAbGluayAjQ09OVEVOVF9WQ0FSRF9VUkl9CisgICAgICAgICogYW5kIHtAbGluayAjQ09OVEVOVF9NVUxUSV9WQ0FSRF9VUkl9IHRvIGluZGljYXRlIHRoYXQgdGhlIHJldHVybmVkCisgICAgICAgICogdmNhcmQgc2hvdWxkIG5vdCBjb250YWluIGEgcGhvdG8uCisgICAgICAgICoKKyAgICAgICAgKiBAaGlkZQorICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTUVURVJfVkNBUkRfTk9fUEhPVE8gPSAibm9waG90byI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEJhc2Uge0BsaW5rIFVyaX0gZm9yIHJlZmVyZW5jaW5nIG11bHRpcGxlIHtAbGluayBDb250YWN0c30gZW50cnksCiAgICAgICAgICAqIGNyZWF0ZWQgYnkgYXBwZW5kaW5nIHtAbGluayAjTE9PS1VQX0tFWX0gdXNpbmcKICAgICAgICAgICoge0BsaW5rIFVyaSN3aXRoQXBwZW5kZWRQYXRoKFVyaSwgU3RyaW5nKX0uIFRoZSBsb29rdXAga2V5cyBoYXZlIHRvIGJlCi0gICAgICAgICAqIGVuY29kZWQgYW5kIGpvaW5lZCB3aXRoIHRoZSBjb2xvbiAoIjoiKSBzZXBlcmF0b3IuIFRoZSByZXN1bHRpbmcgc3RyaW5nCisgICAgICAgICAqIGVuY29kZWQgYW5kIGpvaW5lZCB3aXRoIHRoZSBjb2xvbiAoIjoiKSBzZXBhcmF0b3IuIFRoZSByZXN1bHRpbmcgc3RyaW5nCiAgICAgICAgICAqIGhhcyB0byBiZSBlbmNvZGVkIGFnYWluLiBQcm92aWRlcwogICAgICAgICAgKiB7QGxpbmsgT3BlbmFibGVDb2x1bW5zfSBjb2x1bW5zIHdoZW4gcXVlcmllZCwgb3IgcmV0dXJucyB0aGUKICAgICAgICAgICogcmVmZXJlbmNlZCBjb250YWN0IGZvcm1hdHRlZCBhcyBhIHZDYXJkIHdoZW4gb3BlbmVkIHRocm91Z2gKQEAgLTE3MzgsNiArMTc2Miw4OCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogQ29uc3RhbnRzIGZvciB0aGUgdXNlcidzIHByb2ZpbGUgZGF0YSwgd2hpY2ggaXMgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGUgY29udGFjdCBvbgorICAgICAqIHRoZSBkZXZpY2UgdGhhdCByZXByZXNlbnRzIHRoZSB1c2VyLiAgVGhlIHByb2ZpbGUgY29udGFjdCBpcyBub3QgYWdncmVnYXRlZAorICAgICAqIHRvZ2V0aGVyIGF1dG9tYXRpY2FsbHkgaW4gdGhlIHNhbWUgd2F5IHRoYXQgbm9ybWFsIGNvbnRhY3RzIGFyZTsgaW5zdGVhZCwgZWFjaAorICAgICAqIGFjY291bnQgb24gdGhlIGRldmljZSBtYXkgY29udHJpYnV0ZSBhIHNpbmdsZSByYXcgY29udGFjdCByZXByZXNlbnRpbmcgdGhlIHVzZXIncworICAgICAqIHBlcnNvbmFsIHByb2ZpbGUgZGF0YSBmcm9tIHRoYXQgc291cmNlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBY2Nlc3MgdG8gdGhlIHByb2ZpbGUgZW50cnkgdGhyb3VnaCB0aGVzZSBVUklzIChvciBpbmNpZGVudGFsIGFjY2VzcyB0byBwYXJ0cyBvZgorICAgICAqIHRoZSBwcm9maWxlIGlmIHJldHJpZXZlZCBkaXJlY3RseSB2aWEgSUQpIHJlcXVpcmVzIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYmV5b25kCisgICAgICogdGhlIHJlYWQvd3JpdGUgY29udGFjdCBwZXJtaXNzaW9ucyByZXF1aXJlZCBieSB0aGUgcHJvdmlkZXIuICBRdWVyeWluZyBmb3IgcHJvZmlsZQorICAgICAqIGRhdGEgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUFJPRklMRSBwZXJtaXNzaW9uLCBhbmQgaW5zZXJ0aW5nIG9yCisgICAgICogdXBkYXRpbmcgcHJvZmlsZSBkYXRhIHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9QUk9GSUxFIHBlcm1pc3Npb24uCisgICAgICogPC9wPgorICAgICAqIDxoMz5PcGVyYXRpb25zPC9oMz4KKyAgICAgKiA8ZGw+CisgICAgICogPGR0PjxiPkluc2VydDwvYj48L2R0PgorICAgICAqIDxkZD5UaGUgdXNlcidzIHByb2ZpbGUgZW50cnkgY2Fubm90IGJlIGNyZWF0ZWQgZXhwbGljaXRseSAoYXR0ZW1wdGluZyB0byBkbyBzbworICAgICAqIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uKS4gV2hlbiBhIHJhdyBjb250YWN0IGlzIGluc2VydGVkIGludG8gdGhlIHByb2ZpbGUsIHRoZQorICAgICAqIHByb3ZpZGVyIHdpbGwgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9maWxlIG9uIHRoZSBkZXZpY2UuICBJZiBvbmUgaXMKKyAgICAgKiBmb3VuZCwgdGhlIHJhdyBjb250YWN0J3Mge0BsaW5rIFJhd0NvbnRhY3RzI0NPTlRBQ1RfSUR9IGNvbHVtbiBnZXRzIHRoZSBfSUQgb2YKKyAgICAgKiB0aGUgcHJvZmlsZSBDb250YWN0LiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgdGhlIHByb2ZpbGUgQ29udGFjdCBpcyBjcmVhdGVkIGFuZAorICAgICAqIGl0cyBfSUQgaXMgcHV0IGludG8gdGhlIHtAbGluayBSYXdDb250YWN0cyNDT05UQUNUX0lEfSBjb2x1bW4gb2YgdGhlIG5ld2x5CisgICAgICogaW5zZXJ0ZWQgcmF3IGNvbnRhY3QuPC9kZD4KKyAgICAgKiA8ZHQ+PGI+VXBkYXRlPC9iPjwvZHQ+CisgICAgICogPGRkPlRoZSBwcm9maWxlIENvbnRhY3QgaGFzIHRoZSBzYW1lIHVwZGF0ZSByZXN0cmljdGlvbnMgYXMgQ29udGFjdHMgaW4gZ2VuZXJhbCwKKyAgICAgKiBidXQgcmVxdWlyZXMgdGhlIGFuZHJvaWQucGVybWlzc2lvbi5XUklURV9QUk9GSUxFIHBlcm1pc3Npb24uPC9kZD4KKyAgICAgKiA8ZHQ+PGI+RGVsZXRlPC9iPjwvZHQ+CisgICAgICogPGRkPlRoZSBwcm9maWxlIENvbnRhY3QgY2Fubm90IGJlIGV4cGxpY2l0bHkgZGVsZXRlZC4gIEl0IHdpbGwgYmUgcmVtb3ZlZAorICAgICAqIGF1dG9tYXRpY2FsbHkgaWYgYWxsIG9mIGl0cyBjb25zdGl0dWVudCByYXcgY29udGFjdCBlbnRyaWVzIGFyZSBkZWxldGVkLjwvZGQ+CisgICAgICogPGR0PjxiPlF1ZXJ5PC9iPjwvZHQ+CisgICAgICogPGRkPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+VGhlIHtAbGluayAjQ09OVEVOVF9VUkl9IGZvciBwcm9maWxlcyBiZWhhdmVzIGluIG11Y2ggdGhlIHNhbWUgd2F5IGFzCisgICAgICogcmV0cmlldmluZyBhIGNvbnRhY3QgYnkgSUQsIGV4Y2VwdCB0aGF0IGl0IHdpbGwgb25seSBldmVyIHJldHVybiB0aGUgdXNlcidzCisgICAgICogcHJvZmlsZSBjb250YWN0LgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIFRoZSBwcm9maWxlIGNvbnRhY3Qgc3VwcG9ydHMgYWxsIG9mIHRoZSBzYW1lIHN1Yi1wYXRocyBhcyBhbiBpbmRpdmlkdWFsIGNvbnRhY3QKKyAgICAgKiBkb2VzIC0gdGhlIGNvbnRlbnQgb2YgdGhlIHByb2ZpbGUgY29udGFjdCBjYW4gYmUgcmV0cmlldmVkIGFzIGVudGl0aWVzIG9yCisgICAgICogZGF0YSByb3dzLiAgU2ltaWxhcmx5LCBzcGVjaWZpYyByYXcgY29udGFjdCBlbnRyaWVzIGNhbiBiZSByZXRyaWV2ZWQgYnkgYXBwZW5kaW5nCisgICAgICogdGhlIGRlc2lyZWQgcmF3IGNvbnRhY3QgSUQgd2l0aGluIHRoZSBwcm9maWxlLgorICAgICAqIDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L2RkPgorICAgICAqIDwvZGw+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm9maWxlIGltcGxlbWVudHMgQmFzZUNvbHVtbnMsIENvbnRhY3RzQ29sdW1ucywKKyAgICAgICAgICAgIENvbnRhY3RPcHRpb25zQ29sdW1ucywgQ29udGFjdE5hbWVDb2x1bW5zLCBDb250YWN0U3RhdHVzQ29sdW1ucyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBQcm9maWxlKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSSSBmb3IgdGhpcyB0YWJsZSwgd2hpY2ggcmVxdWVzdHMgdGhlIGNvbnRhY3QgZW50cnkKKyAgICAgICAgICogcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChBVVRIT1JJVFlfVVJJLCAicHJvZmlsZSIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiB7QGxpbmsgVXJpfSBmb3IgcmVmZXJlbmNpbmcgdGhlIHVzZXIncyBwcm9maWxlIHtAbGluayBDb250YWN0c30gZW50cnksCisgICAgICAgICAqIFByb3ZpZGVzIHtAbGluayBPcGVuYWJsZUNvbHVtbnN9IGNvbHVtbnMgd2hlbiBxdWVyaWVkLCBvciByZXR1cm5zIHRoZQorICAgICAgICAgKiB1c2VyJ3MgcHJvZmlsZSBjb250YWN0IGZvcm1hdHRlZCBhcyBhIHZDYXJkIHdoZW4gb3BlbmVkIHRocm91Z2gKKyAgICAgICAgICoge0BsaW5rIENvbnRlbnRSZXNvbHZlciNvcGVuQXNzZXRGaWxlRGVzY3JpcHRvcihVcmksIFN0cmluZyl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9WQ0FSRF9VUkkgPSBVcmkud2l0aEFwcGVuZGVkUGF0aChDT05URU5UX1VSSSwKKyAgICAgICAgICAgICAgICAiYXNfdmNhcmQiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICoge0BsaW5rIFVyaX0gZm9yIHJlZmVyZW5jaW5nIHRoZSByYXcgY29udGFjdHMgdGhhdCBtYWtlIHVwIHRoZSB1c2VyJ3MgcHJvZmlsZQorICAgICAgICAgKiB7QGxpbmsgQ29udGFjdHN9IGVudHJ5LiAgQW4gaW5kaXZpZHVhbCByYXcgY29udGFjdCBlbnRyeSB3aXRoaW4gdGhlIHByb2ZpbGUKKyAgICAgICAgICogY2FuIGJlIGFkZHJlc3NlZCBieSBhcHBlbmRpbmcgdGhlIHJhdyBjb250YWN0IElELiAgVGhlIGVudGl0aWVzIG9yIGRhdGEgd2l0aGluCisgICAgICAgICAqIHRoYXQgc3BlY2lmaWMgcmF3IGNvbnRhY3QgY2FuIGJlIHJlcXVlc3RlZCBieSBhcHBlbmRpbmcgdGhlIGVudGl0eSBvciBkYXRhCisgICAgICAgICAqIHBhdGggYXMgd2VsbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfUkFXX0NPTlRBQ1RTX1VSSSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKENPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgICJyYXdfY29udGFjdHMiKTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIFJhd0NvbnRhY3RzQ29sdW1ucyB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIENvbnRhY3RzQ29udHJhY3QuQ29udGFjdHMjX0lEfSB0aGF0IHRoaXMKQEAgLTE4MDYsNiArMTkxMiwxMiBAQAogICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFXX0NPTlRBQ1RfSVNfUkVBRF9PTkxZID0gInJhd19jb250YWN0X2lzX3JlYWRfb25seSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgdGhhdCByZWZsZWN0cyB3aGV0aGVyIHRoaXMgcmF3IGNvbnRhY3QgYmVsb25ncyB0byB0aGUgdXNlcidzCisgICAgICAgICAqIHBlcnNvbmFsIHByb2ZpbGUgZW50cnkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVdfQ09OVEFDVF9JU19VU0VSX1BST0ZJTEUgPSAicmF3X2NvbnRhY3RfaXNfdXNlcl9wcm9maWxlIjsKICAgICB9CiAKICAgICAvKioKQEAgLTYxNTYsNiArNjI2OCw5NSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIDxwPgorICAgICAqIEFQSSBhbGxvd2luZyBhcHBsaWNhdGlvbnMgdG8gc2VuZCB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCB7QGxpbmsgRGF0YX0gcm93IHRvIHRoZQorICAgICAqIENvbnRhY3RzIFByb3ZpZGVyLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaXRoIHRoZSBmZWVkYmFjaywgQ29udGFjdHMgUHJvdmlkZXIgbWF5IHJldHVybiBtb3JlIGNvbnRleHR1YWxseSBhcHByb3ByaWF0ZSByZXN1bHRzIGZvcgorICAgICAqIERhdGEgbGlzdGluZywgdHlwaWNhbGx5IHN1cHBsaWVkIHdpdGgKKyAgICAgKiB7QGxpbmsgQ29udGFjdHNDb250cmFjdC5Db250YWN0cyNDT05URU5UX0ZJTFRFUl9VUkl9LAorICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5FbWFpbCNDT05URU5UX0ZJTFRFUl9VUkl9LAorICAgICAqIHtAbGluayBDb250YWN0c0NvbnRyYWN0LkNvbW1vbkRhdGFLaW5kcy5QaG9uZSNDT05URU5UX0ZJTFRFUl9VUkl9LCBhbmQgdXNlcnMgY2FuIGJlbmVmaXQKKyAgICAgKiBmcm9tIGJldHRlciByYW5rZWQgKHNvcnRlZCkgbGlzdHMgaW4gYXBwbGljYXRpb25zIHRoYXQgc2hvdyBhdXRvLWNvbXBsZXRlIGxpc3QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBmb3IgaG93IHRoaXMgZmVlZGJhY2sgaXMgdXNlZCwgb3IgZXZlbiB3aGV0aGVyIGl0IGlzIHVzZWQgYXQgYWxsLgorICAgICAqIFRoZSByYW5raW5nIGFsZ29yaXRobSB3aWxsIG1ha2UgYmVzdCBlZmZvcnRzIHRvIHVzZSB0aGUgZmVlZGJhY2sgZGF0YSwgYnV0IHRoZSBleGFjdAorICAgICAqIGltcGxlbWVudGF0aW9uLCB0aGUgc3RvcmFnZSBkYXRhIHN0cnVjdHVyZXMgYXMgd2VsbCBhcyB0aGUgcmVzdWx0aW5nIHNvcnQgb3JkZXIgaXMgZGV2aWNlCisgICAgICogYW5kIHZlcnNpb24gc3BlY2lmaWMgYW5kIGNhbiBjaGFuZ2Ugb3ZlciB0aW1lLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHVwZGF0aW5nIHVzYWdlIGluZm9ybWF0aW9uLCB1c2VycyBvZiB0aGlzIEFQSSBuZWVkIHRvIHVzZQorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjdXBkYXRlKFVyaSwgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9IHdpdGggYSBVcmkgY29uc3RydWN0ZWQKKyAgICAgKiBmcm9tIHtAbGluayBEYXRhVXNhZ2VGZWVkYmFjayNGRUVEQkFDS19VUkl9LiBUaGUgVXJpIG11c3QgY29udGFpbiBvbmUgb3IgbW9yZSBkYXRhIGlkKHMpIGFzCisgICAgICogaXRzIGxhc3QgcGF0aC4gVGhleSBhbHNvIG5lZWQgdG8gYXBwZW5kIGEgcXVlcnkgcGFyYW1ldGVyIHRvIHRoZSBVcmksIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YKKyAgICAgKiB0aGUgY29tbXVuaWNhdGlvbiwgd2hpY2ggZW5hYmxlcyB0aGUgQ29udGFjdHMgUHJvdmlkZXIgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGtpbmRzIG9mCisgICAgICogaW50ZXJhY3Rpb25zIHVzaW5nIHRoZSBzYW1lIGNvbnRhY3QgZGF0YSBmaWVsZCAoZm9yIGV4YW1wbGUgYSBwaG9uZSBudW1iZXIgY2FuIGJlIHVzZWQgdG8KKyAgICAgKiBtYWtlIHBob25lIGNhbGxzIG9yIHNlbmQgU01TKS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogU2VsZWN0aW9uIGFuZCBzZWxlY3Rpb25BcmdzIGFyZSBpZ25vcmVkIGFuZCBtdXN0IGJlIHNldCB0byBudWxsLiBUbyBnZXQgZGF0YSBpZHMsCisgICAgICogeW91IG1heSBuZWVkIHRvIGNhbGwge0BsaW5rIENvbnRlbnRSZXNvbHZlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfQorICAgICAqIHRvd2FyZCB7QGxpbmsgRGF0YSNDT05URU5UX1VSSX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBDb250ZW50UmVzb2x2ZXIjdXBkYXRlKFVyaSwgQ29udGVudFZhbHVlcywgU3RyaW5nLCBTdHJpbmdbXSl9IHJldHVybnMgYSBwb3NpdGl2ZQorICAgICAqIGludGVnZXIgd2hlbiBzdWNjZXNzZnVsLCBhbmQgcmV0dXJucyAwIGlmIG5vIGNvbnRhY3Qgd2l0aCB0aGF0IGlkIHdhcyBmb3VuZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRXhhbXBsZToKKyAgICAgKiA8cHJlPgorICAgICAqIFVyaSB1cmkgPSBEYXRhVXNhZ2VGZWVkYmFjay5GRUVEQkFDS19VUkkuYnVpbGRVcG9uKCkKKyAgICAgKiAgICAgICAgIC5hcHBlbmRQYXRoKFRleHRVdGlscy5qb2luKCIsIiwgZGF0YUlkcykpCisgICAgICogICAgICAgICAuYXBwZW5kUXVlcnlQYXJhbWV0ZXIoRGF0YVVzYWdlRmVlZGJhY2suVVNBR0VfVFlQRSwKKyAgICAgKiAgICAgICAgICAgICAgICAgRGF0YVVzYWdlRmVlZGJhY2suVVNBR0VfVFlQRV9DQUxMKQorICAgICAqICAgICAgICAgLmJ1aWxkKCk7CisgICAgICogYm9vbGVhbiBzdWNjZXNzZnVsID0gcmVzb2x2ZXIudXBkYXRlKHVyaSwgbmV3IENvbnRlbnRWYWx1ZXMoKSwgbnVsbCwgbnVsbCkgPiAwOworICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERhdGFVc2FnZUZlZWRiYWNrIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJJIGZvciBzZW5kaW5nIHVzYWdlIGZlZWRiYWNrLgorICAgICAgICAgKiBNdXN0IGJlIHVzZWQgd2l0aCB7QGxpbmsgQ29udGVudFJlc29sdmVyI3VwZGF0ZShVcmksIENvbnRlbnRWYWx1ZXMsIFN0cmluZywgU3RyaW5nW10pfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIEZFRURCQUNLX1VSSSA9CisgICAgICAgICAgICAgICAgVXJpLndpdGhBcHBlbmRlZFBhdGgoRGF0YS5DT05URU5UX1VSSSwgInVzYWdlZmVlZGJhY2siKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE5hbWUgZm9yIHF1ZXJ5IHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGRhdGEgdXNhZ2UuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX1RZUEUgPSAidHlwZSI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlIG9mIHVzYWdlIGZvciB2b2ljZSBpbnRlcmFjdGlvbiwgd2hpY2ggaW5jbHVkZXMgcGhvbmUgY2FsbCwgdm9pY2UgY2hhdCwgYW5kCisgICAgICAgICAqIHZpZGVvIGNoYXQuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX1RZUEVfQ0FMTCA9ICJjYWxsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFR5cGUgb2YgdXNhZ2UgZm9yIHRleHQgaW50ZXJhY3Rpb24gaW52b2x2aW5nIGxvbmdlciBtZXNzYWdlcywgd2hpY2ggaW5jbHVkZXMgZW1haWwuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFX1RZUEVfTE9OR19URVhUID0gImxvbmdfdGV4dCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUeXBlIG9mIHVzYWdlIGZvciB0ZXh0IGludGVyYWN0aW9uIGludm9sdmluZyBzaG9ydGVyIG1lc3NhZ2VzLCB3aGljaCBpbmNsdWRlcyBTTVMsCisgICAgICAgICAqIHRleHQgY2hhdCB3aXRoIGVtYWlsIGFkZHJlc3Nlcy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfVFlQRV9TSE9SVF9URVhUID0gInNob3J0X3RleHQiOworICAgIH0KKworICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2RzIHRvIGRpc3BsYXkgUXVpY2tDb250YWN0IGRpYWxvZ3MgdGhhdCBhbGxvdyB1c2VycyB0byBwaXZvdCBvbgogICAgICAqIGEgc3BlY2lmaWMge0BsaW5rIENvbnRhY3RzfSBlbnRyeS4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL0Rvd25sb2Fkcy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRG93bmxvYWRzLmphdmEKaW5kZXggM2M0YmI3OS4uYmE0ODA0ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRG93bmxvYWRzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRG93bmxvYWRzLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIHBhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkRvd25sb2FkTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiAKIC8qKgpAQCAtNjk1LDYgKzY5NiwxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfVE9PX01BTllfUkVESVJFQ1RTID0gNDk3OwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGRvd25sb2FkIGhhcyBmYWlsZWQgYmVjYXVzZSByZXF1ZXN0aW5nIGFwcGxpY2F0aW9uIGhhcyBiZWVuCisgICAgICAgICAqIGJsb2NrZWQgYnkge0BsaW5rIE5ldHdvcmtQb2xpY3lNYW5hZ2VyfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19CTE9DS0VEID0gNDk4OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGRvd25sb2FkIGlzIHZpc2libGUgYnV0IG9ubHkgc2hvd3MgaW4gdGhlIG5vdGlmaWNhdGlvbnMKICAgICAgICAgICogd2hpbGUgaXQncyBpbiBwcm9ncmVzcy4KICAgICAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCBjNzhiOTM1Li42MDNlZGYwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTE3NjgsMTIgKzE3NjgsNiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkxPQ0tfU09VTkQgPSAidW5sb2NrX3NvdW5kIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgYXBwZWFyIGFzIGEgUFRQIGRldmljZSBpbnN0ZWFkIG9mIE1UUC4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9QVFBfSU5URVJGQUNFID0gInVzZV9wdHBfaW50ZXJmYWNlIjsKLQotICAgICAgICAvKioKICAgICAgICAgICogUmVjZWl2ZSBpbmNvbWluZyBTSVAgY2FsbHM/CiAgICAgICAgICAqIDAgPSBubwogICAgICAgICAgKiAxID0geWVzCkBAIC0xODA5LDYgKzE4MDMsMTYgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lQX0FTS19NRV9FQUNIX1RJTUUgPSAiU0lQX0FTS19NRV9FQUNIX1RJTUUiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBQb2ludGVyIHNwZWVkIHNldHRpbmcuCisgICAgICAgICAqIFRoaXMgaXMgYW4gaW50ZWdlciB2YWx1ZSBpbiBhIHJhbmdlIGJldHdlZW4gLTcgYW5kICs3LCBzbyB0aGVyZSBhcmUgMTUgcG9zc2libGUgdmFsdWVzLgorICAgICAgICAgKiAgIC03ID0gc2xvd2VzdAorICAgICAgICAgKiAgICAwID0gZGVmYXVsdCBzcGVlZAorICAgICAgICAgKiAgICs3ID0gZmFzdGVzdAorICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9JTlRFUl9TUEVFRCA9ICJwb2ludGVyX3NwZWVkIjsKKworICAgICAgICAvKioKICAgICAgICAgICogU2V0dGluZ3MgdG8gYmFja3VwLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBpdCdzIGluIHRoZSBzYW1lIHBsYWNlIGFzIHRoZSBzZXR0aW5ncwogICAgICAgICAgKiBrZXlzIGFuZCBlYXN5IHRvIHVwZGF0ZS4KICAgICAgICAgICogQGhpZGUKQEAgLTE4NjksOSArMTg3Myw5IEBACiAgICAgICAgICAgICBMT0NLU0NSRUVOX1NPVU5EU19FTkFCTEVELAogICAgICAgICAgICAgU0hPV19XRUJfU1VHR0VTVElPTlMsCiAgICAgICAgICAgICBOT1RJRklDQVRJT05fTElHSFRfUFVMU0UsCi0gICAgICAgICAgICBVU0VfUFRQX0lOVEVSRkFDRSwKICAgICAgICAgICAgIFNJUF9DQUxMX09QVElPTlMsCiAgICAgICAgICAgICBTSVBfUkVDRUlWRV9DQUxMUywKKyAgICAgICAgICAgIFBPSU5URVJfU1BFRUQsCiAgICAgICAgIH07CiAKICAgICAgICAgLy8gU2V0dGluZ3MgbW92ZWQgdG8gU2V0dGluZ3MuU2VjdXJlCkBAIC0yOTEzLDYgKzI5MTcsMzAgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lGSV9XQVRDSERPR19QSU5HX1RJTUVPVVRfTVMgPSAid2lmaV93YXRjaGRvZ19waW5nX3RpbWVvdXRfbXMiOwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBTZXR0aW5nIHRvIHR1cm4gb2ZmIHdhbGxlZCBnYXJkZW4gdGVzdCBvbiBXaS1GaS4gRmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kCisgICAgICAgICAqIHRoZSBzZXR0aW5nIG5lZWRzIHRvIGJlIHNldCB0byAwIHRvIGRpc2FibGUgaXQuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSUZJX1dBVENIRE9HX1dBTExFRF9HQVJERU5fVEVTVF9FTkFCTEVEID0KKyAgICAgICAgICAgICAgICAid2lmaV93YXRjaGRvZ193YWxsZWRfZ2FyZGVuX3Rlc3RfZW5hYmxlZCI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkwgdXNlZCBmb3Igd2FsbGVkIGdhcmRlbiBjaGVjayB1cG9uIGEgbmV3IGNvbmVjdGlvbi4gV2lmaVdhdGNoZG9nU2VydmljZQorICAgICAgICAgKiBmZXRjaGVzIHRoZSBVUkwgYW5kIGNoZWNrcyB0byBzZWUgaWYge0BsaW5rICNXSUZJX1dBVENIRE9HX1dBTExFRF9HQVJERU5fUEFUVEVSTn0KKyAgICAgICAgICogaXMgbm90IHBhcnQgb2YgdGhlIHRpdGxlIHN0cmluZyB0byBub3RpZnkgdGhlIHVzZXIgb24gdGhlIHByZXNlbmNlIG9mIGEgd2FsbGVkIGdhcmRlbi4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJRklfV0FUQ0hET0dfV0FMTEVEX0dBUkRFTl9VUkwgPQorICAgICAgICAgICAgICAgICJ3aWZpX3dhdGNoZG9nX3dhbGxlZF9nYXJkZW5fdXJsIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhdHRlcm4gc3RyaW5nIGluIHRoZSBmZXRjaGVkIFVSTCB1c2VkIHRvIGRldGVjdCBhIHdhbGxlZCBnYXJkZW4KKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJRklfV0FUQ0hET0dfV0FMTEVEX0dBUkRFTl9QQVRURVJOID0KKyAgICAgICAgICAgICAgICAid2lmaV93YXRjaGRvZ193YWxsZWRfZ2FyZGVuX3BhdHRlcm4iOworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgd2Ugd2lsbCByZXRyeSBhIGNvbm5lY3Rpb24gdG8gYW4gYWNjZXNzCiAgICAgICAgICAqIHBvaW50IGZvciB3aGljaCB3ZSBoYXZlIGZhaWxlZCBpbiBhY3F1aXJpbmcgYW4gSVAgYWRkcmVzcyBmcm9tIERIQ1AuCiAgICAgICAgICAqIEEgdmFsdWUgb2YgTiBtZWFucyB0aGF0IHdlIHdpbGwgbWFrZSBOKzEgY29ubmVjdGlvbiBhdHRlbXB0cyBpbiBhbGwuCkBAIC0zNzYwLDYgKzM3ODgsMjEgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJFQU1fVElNRU9VVCA9CiAgICAgICAgICAgICAgICAgImRyZWFtX3RpbWVvdXQiOwogCisgICAgICAgIC8qKiB7QGhpZGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFNUQVRTX1BPTExfSU5URVJWQUwgPSAibmV0c3RhdHNfcG9sbF9pbnRlcnZhbCI7CisgICAgICAgIC8qKiB7QGhpZGV9ICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVFNUQVRTX1BFUlNJU1RfVEhSRVNIT0xEID0gIm5ldHN0YXRzX3BlcnNpc3RfdGhyZXNob2xkIjsKKyAgICAgICAgLyoqIHtAaGlkZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUU1RBVFNfTkVUV09SS19CVUNLRVRfRFVSQVRJT04gPSAibmV0c3RhdHNfbmV0d29ya19idWNrZXRfZHVyYXRpb24iOworICAgICAgICAvKioge0BoaWRlfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTVEFUU19ORVRXT1JLX01BWF9ISVNUT1JZID0gIm5ldHN0YXRzX25ldHdvcmtfbWF4X2hpc3RvcnkiOworICAgICAgICAvKioge0BoaWRlfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTVEFUU19VSURfQlVDS0VUX0RVUkFUSU9OID0gIm5ldHN0YXRzX3VpZF9idWNrZXRfZHVyYXRpb24iOworICAgICAgICAvKioge0BoaWRlfSAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTVEFUU19VSURfTUFYX0hJU1RPUlkgPSAibmV0c3RhdHNfdWlkX21heF9oaXN0b3J5IjsKKyAgICAgICAgLyoqIHtAaGlkZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUU1RBVFNfVEFHX01BWF9ISVNUT1JZID0gIm5ldHN0YXRzX3RhZ19tYXhfaGlzdG9yeSI7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEBoaWRlCiAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVGVsZXBob255LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YQppbmRleCA5MWE3MmE1Li42NTg1ZTgyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9UZWxlcGhvbnkuamF2YQpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgICAgICAgICAgICAgKiB2YWx1ZXM6PC9wPgogICAgICAgICAgICAgICoKICAgICAgICAgICAgICAqIDx1bD4KLSAgICAgICAgICAgICAqICAgPGxpPjxlbT5wZHVzPC9lbT4gLSBBbiBPYmplY3RbXSBvZCBieXRlW11zIGNvbnRhaW5pbmcgdGhlIFBEVXMKKyAgICAgICAgICAgICAqICAgPGxpPjxlbT5wZHVzPC9lbT4gLSBBbiBPYmplY3RbXSBvZiBieXRlW11zIGNvbnRhaW5pbmcgdGhlIFBEVXMKICAgICAgICAgICAgICAqICAgdGhhdCBtYWtlIHVwIHRoZSBtZXNzYWdlLjwvbGk+CiAgICAgICAgICAgICAgKiA8L3VsPgogICAgICAgICAgICAgICoKQEAgLTU5MSw2ICs1OTEsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucHJvdmlkZXIuVGVsZXBob255LldBUF9QVVNIX1JFQ0VJVkVEIjsKIAogICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBBIG5ldyBDZWxsIEJyb2FkY2FzdCBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCisgICAgICAgICAgICAgKiBieSB0aGUgZGV2aWNlLiBUaGUgaW50ZW50IHdpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGV4dHJhCisgICAgICAgICAgICAgKiB2YWx1ZXM6PC9wPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDx1bD4KKyAgICAgICAgICAgICAqICAgPGxpPjxlbT5wZHVzPC9lbT4gLSBBbiBPYmplY3RbXSBvZiBieXRlW11zIGNvbnRhaW5pbmcgdGhlIFBEVXMKKyAgICAgICAgICAgICAqICAgdGhhdCBtYWtlIHVwIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICAgICAgICAgKiA8L3VsPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDxwPlRoZSBleHRyYSB2YWx1ZXMgY2FuIGJlIGV4dHJhY3RlZCB1c2luZworICAgICAgICAgICAgICoge0BsaW5rICNnZXRNZXNzYWdlc0Zyb21JbnRlbnQoSW50ZW50KX0uPC9wPgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIDxwPklmIGEgQnJvYWRjYXN0UmVjZWl2ZXIgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZSBwcm9jZXNzaW5nCisgICAgICAgICAgICAgKiB0aGlzIGludGVudCBpdCBzaG91bGQgc2V0IHRoZSByZXN1bHQgY29kZSBhcHByb3ByaWF0ZWx5LjwvcD4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQFNka0NvbnN0YW50KFNka0NvbnN0YW50VHlwZS5CUk9BRENBU1RfSU5URU5UX0FDVElPTikKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNNU19DQl9SRUNFSVZFRF9BQ1RJT04gPQorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU01TX0NCX1JFQ0VJVkVEIjsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBCcm9hZGNhc3QgQWN0aW9uOiBBIG5ldyBFbWVyZ2VuY3kgQnJvYWRjYXN0IG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQKKyAgICAgICAgICAgICAqIGJ5IHRoZSBkZXZpY2UuIFRoZSBpbnRlbnQgd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZXh0cmEKKyAgICAgICAgICAgICAqIHZhbHVlczo8L3A+CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogPHVsPgorICAgICAgICAgICAgICogICA8bGk+PGVtPnBkdXM8L2VtPiAtIEFuIE9iamVjdFtdIG9mIGJ5dGVbXXMgY29udGFpbmluZyB0aGUgUERVcworICAgICAgICAgICAgICogICB0aGF0IG1ha2UgdXAgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgICAgICAgICAqIDwvdWw+CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogPHA+VGhlIGV4dHJhIHZhbHVlcyBjYW4gYmUgZXh0cmFjdGVkIHVzaW5nCisgICAgICAgICAgICAgKiB7QGxpbmsgI2dldE1lc3NhZ2VzRnJvbUludGVudChJbnRlbnQpfS48L3A+CisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogPHA+SWYgYSBCcm9hZGNhc3RSZWNlaXZlciBlbmNvdW50ZXJzIGFuIGVycm9yIHdoaWxlIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAqIHRoaXMgaW50ZW50IGl0IHNob3VsZCBzZXQgdGhlIHJlc3VsdCBjb2RlIGFwcHJvcHJpYXRlbHkuPC9wPgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBAU2RrQ29uc3RhbnQoU2RrQ29uc3RhbnRUeXBlLkJST0FEQ0FTVF9JTlRFTlRfQUNUSU9OKQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU01TX0VNRVJHRU5DWV9DQl9SRUNFSVZFRF9BQ1RJT04gPQorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5wcm92aWRlci5UZWxlcGhvbnkuU01TX0VNRVJHRU5DWV9DQl9SRUNFSVZFRCI7CisKKyAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogQnJvYWRjYXN0IEFjdGlvbjogVGhlIFNJTSBzdG9yYWdlIGZvciBTTVMgbWVzc2FnZXMgaXMgZnVsbC4gIElmCiAgICAgICAgICAgICAgKiBzcGFjZSBpcyBub3QgZnJlZWQsIG1lc3NhZ2VzIHRhcmdldGVkIGZvciB0aGUgU0lNIChjbGFzcyAyKSBtYXkKICAgICAgICAgICAgICAqIG5vdCBiZSBzYXZlZC4KQEAgLTYyMyw3ICs2NjMsNyBAQAogICAgICAgICAgICAgICogQHBhcmFtIGludGVudCB0aGUgaW50ZW50IHRvIHJlYWQgZnJvbQogICAgICAgICAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBTbXNNZXNzYWdlcyBmb3IgdGhlIFBEVXMKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTbXNNZXNzYWdlW10gZ2V0TWVzc2FnZXNGcm9tSW50ZW50KAorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTbXNNZXNzYWdlW10gZ2V0TWVzc2FnZXNGcm9tSW50ZW50KAogICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICAgICAgT2JqZWN0W10gbWVzc2FnZXMgPSAoT2JqZWN0W10pIGludGVudC5nZXRTZXJpYWxpemFibGVFeHRyYSgicGR1cyIpOwogICAgICAgICAgICAgICAgIGJ5dGVbXVtdIHBkdU9ianMgPSBuZXcgYnl0ZVttZXNzYWdlcy5sZW5ndGhdW107CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Wb2ljZW1haWxDb250cmFjdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVm9pY2VtYWlsQ29udHJhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTQxODc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvVm9pY2VtYWlsQ29udHJhY3QuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5wcm92aWRlcjsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ2FsbExvZy5DYWxsczsKKworLyoqCisgKiBUaGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdm9pY2VtYWlsIHByb3ZpZGVyIGFuZCBhcHBsaWNhdGlvbnMuIENvbnRhaW5zCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIHN1cHBvcnRlZCBVUklzIGFuZCBjb2x1bW5zLgorICoKKyAqIDxQPlZvaWNlbWFpbHMgYXJlIGluc2VydGVkIGJ5IHdoYXQgaXMgY2FsbGVkIGFzIGEgInZvaWNlbWFpbCBzb3VyY2UiCisgKiBhcHBsaWNhdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHN5bmNpbmcgdm9pY2VtYWlsIGRhdGEgYmV0d2VlbiBhIHJlbW90ZQorICogc2VydmVyIGFuZCB0aGUgbG9jYWwgdm9pY2VtYWlsIGNvbnRlbnQgcHJvdmlkZXIuICJ2b2ljZW1haWwgc291cmNlIgorICogYXBwbGljYXRpb24gc2hvdWxkIHVzZSB0aGUgc291cmNlIHNwZWNpZmljIHtAbGluayAjQ09OVEVOVF9VUklfU09VUkNFfSBVUkkKKyAqIHRvIGluc2VydCBhbmQgcmV0cmlldmUgdm9pY2VtYWlscy4KKyAqCisgKiA8UD5JbiBhZGRpdGlvbiB0byB0aGUge0BsaW5rIENvbnRlbnRPYnNlcnZlcn0gbm90aWZpY2F0aW9ucyB0aGUgdm9pY2VtYWlsCisgKiBwcm92aWRlciBhbHNvIGdlbmVyYXRlcyBicm9hZGNhc3QgaW50ZW50cyB0byBub3RpZnkgY2hhbmdlIGZvciBhcHBsaWNhdGlvbnMKKyAqIHRoYXQgYXJlIG5vdCBhY3RpdmUgYW5kIHRoZXJlZm9yZSBjYW5ub3QgbGlzdGVuIHRvIENvbnRlbnRPYnNlcnZlcgorICogbm90aWZpY2F0aW9ucy4gQnJvYWRjYXN0IGludGVudHMgd2l0aCBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgZ2VuZXJhdGVkOgorICogPHVsPgorICogICA8bGk+IHtAbGluayAjQUNUSU9OX05FV19WT0lDRU1BSUx9IGlzIGdlbmVyYXRlZCBmb3IgZWFjaCBuZXcgdm9pY2VtYWlsCisgKiAgIGluc2VydGVkLgorICogICA8L2xpPgorICogICA8bGk+IHtAbGluayBJbnRlbnQjQUNUSU9OX1BST1ZJREVSX0NIQU5HRUR9IGlzIGdlbmVyYXRlZCBmb3IgYW55IGNoYW5nZQorICogICAgbWFkZSBpbnRvIHRoZSBkYXRhYmFzZSwgaW5jbHVkaW5nIG5ldyB2b2ljZW1haWwuCisgKiAgIDwvbGk+CisgKiA8L3VsPgorICogQGhpZGUKKyAqLworLy8gVE9ETzogdW5oaWRlIHdoZW4gdGhlIEFQSSBpcyBhcHByb3ZlZCBieSBhbmRyb2lkLWFwaS1jb3VuY2lsCitwdWJsaWMgY2xhc3MgVm9pY2VtYWlsQ29udHJhY3QgeworICAgIC8qKiBOb3QgaW5zdGFudGlhYmxlLiAqLworICAgIHByaXZhdGUgVm9pY2VtYWlsQ29udHJhY3QoKSB7CisgICAgfQorCisgICAgLyoqIFRoZSBhdXRob3JpdHkgdXNlZCBieSB0aGUgdm9pY2VtYWlsIHByb3ZpZGVyLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUklUWSA9ICJjb20uYW5kcm9pZC52b2ljZW1haWwiOworCisgICAgLyoqIFVSSSB0byBpbnNlcnQvcmV0cmlldmUgYWxsIHZvaWNlbWFpbHMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPQorICAgICAgICAgICAgVXJpLnBhcnNlKCJjb250ZW50Oi8vIiArIEFVVEhPUklUWSArICIvdm9pY2VtYWlsIik7CisgICAgLyoqIFVSSSB0byBpbnNlcnQvcmV0cmlldmUgdm9pY2VtYWlscyBieSBhIGdpdmVuIHZvaWNlbWFpbCBzb3VyY2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUklfU09VUkNFID0KKyAgICAgICAgICAgIFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL3ZvaWNlbWFpbC9zb3VyY2UvIik7CisKKyAgICAvLyBUT0RPOiBNb3ZlIEFDVElPTl9ORVdfVk9JQ0VNQUlMIHRvIHRoZSBJbnRlbnQgY2xhc3MuCisgICAgLyoqIEJyb2FkY2FzdCBpbnRlbnQgd2hlbiBhIG5ldyB2b2ljZW1haWwgcmVjb3JkIGlzIGluc2VydGVkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9ORVdfVk9JQ0VNQUlMID0gImFuZHJvaWQuaW50ZW50LmFjdGlvbi5ORVdfVk9JQ0VNQUlMIjsKKyAgICAvKioKKyAgICAgKiBFeHRyYSBpbmNsdWRlZCBpbiB7QHZhbHVlIEludGVudCNBQ1RJT05fUFJPVklERVJfQ0hBTkdFRH0gYW5kCisgICAgICoge0B2YWx1ZSAjQUNUSU9OX05FV19WT0lDRU1BSUx9IGJyb2FkY2FzdCBpbnRlbnRzIHRvIGluZGljYXRlIHRoZSBwYWNrYWdlCisgICAgICogdGhhdCBjYXVzZWQgdGhlIGNoYW5nZSBpbiBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIDxwPlJlY2VpdmVycyBvZiB0aGUgYnJvYWRjYXN0IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcworICAgICAqIGEgc2VsZiBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQ0hBTkdFRF9CWSA9ICJjb20uYW5kcm9pZC52b2ljZW1haWwuZXh0cmEuQ0hBTkdFRF9CWSI7CisKKyAgICAvKiogVGhlIG1pbWUgdHlwZSBmb3IgYSBjb2xsZWN0aW9uIG9mIHZvaWNlbWFpbHMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1RZUEUgPQorICAgICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvdm9pY2VtYWlscyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFZvaWNlbWFpbHMgaW1wbGVtZW50cyBCYXNlQ29sdW1ucyB7CisgICAgICAgIC8qKiBOb3QgaW5zdGFudGlhYmxlLiAqLworICAgICAgICBwcml2YXRlIFZvaWNlbWFpbHMoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGhvbmUgbnVtYmVyIG9mIHRoZSB2b2ljZW1haWwgc2VuZGVyLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gQ2FsbHMuTlVNQkVSOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGRhdGUgdGhlIHZvaWNlbWFpbCB3YXMgc2VudCwgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaAorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChsb25nKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEUgPSBDYWxscy5EQVRFOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGR1cmF0aW9uIG9mIHRoZSB2b2ljZW1haWwgaW4gc2Vjb25kcy4KKyAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVVJBVElPTiA9IENhbGxzLkRVUkFUSU9OOworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGlzIGlzIGEgbmV3IHZvaWNlbWFpbCAoaS5lLiBoYXMgbm90IGJlZW4gaGVhcmQpLgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSIChib29sZWFuKTwvUD4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9IENhbGxzLk5FVzsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYWlsIGJveCBzdGF0ZSBvZiB0aGUgdm9pY2VtYWlsLgorICAgICAgICAgKiA8UD4gUG9zc2libGUgdmFsdWVzOiB7QGxpbmsgI1NUQVRFX0lOQk9YfSwge0BsaW5rICNTVEFURV9ERUxFVEVEfSwKKyAgICAgICAgICoge0BsaW5rICNTVEFURV9VTkRFTEVURUR9LgorICAgICAgICAgKiA8UD5UeXBlOiBJTlRFR0VSPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEUgPSAic3RhdGUiOworICAgICAgICAvKiogVmFsdWUgb2Yge0BsaW5rICNTVEFURX0gd2hlbiB0aGUgdm9pY2VtYWlsIGlzIGluIGluYm94LiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTVEFURV9JTkJPWCA9IDA7CisgICAgICAgIC8qKiBWYWx1ZSBvZiB7QGxpbmsgI1NUQVRFfSB3aGVuIHRoZSB2b2ljZW1haWwgaGFzIGJlZW4gbWFya2VkIGFzIGRlbGV0ZWQuICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IFNUQVRFX0RFTEVURUQgPSAxOworICAgICAgICAvKiogVmFsdWUgb2Yge0BsaW5rICNTVEFURX0gd2hlbiB0aGUgdm9pY2VtYWlsIGhhcyBtYXJrZWQgYXMgdW5kZWxldGVkLiAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBTVEFURV9VTkRFTEVURUQgPSAyOworICAgICAgICAvKioKKyAgICAgICAgICogUGFja2FnZSBuYW1lIG9mIHRoZSBzb3VyY2UgYXBwbGljYXRpb24gdGhhdCBpbnNlcnRlZCB0aGUgdm9pY2VtYWlsLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1BBQ0tBR0UgPSAic291cmNlX3BhY2thZ2UiOworICAgICAgICAvKioKKyAgICAgICAgICogQXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YSBhdmFpbGFibGUgdG8gdGhlIHNvdXJjZSBhcHBsaWNhdGlvbiB0aGF0CisgICAgICAgICAqIGluc2VydGVkIHRoZSB2b2ljZW1haWwuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgdGhlIHNvdXJjZQorICAgICAgICAgKiBzcGVjaWZpYyBtZXNzYWdlIGlkIHRvIGlkZW50aWZ5IHRoaXMgdm9pY2VtYWlsIG9uIHRoZSByZW1vdGUKKyAgICAgICAgICogdm9pY2VtYWlsIHNlcnZlci4KKyAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KKyAgICAgICAgICogPFA+IE5vdGUgdGhhdCB0aGlzIGlzIE5PVCB0aGUgdm9pY2VtYWlsIG1lZGlhIGNvbnRlbnQgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9EQVRBID0gInNvdXJjZV9kYXRhIjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdGhlIG1lZGlhIGNvbnRlbnQgZm9yIHRoaXMgdm9pY2VtYWlsIGlzIGF2YWlsYWJsZSBmb3IKKyAgICAgICAgICogY29uc3VtcHRpb24uCisgICAgICAgICAqIDxQPlR5cGU6IElOVEVHRVIgKGJvb2xlYW4pPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFTX0NPTlRFTlQgPSAiaGFzX2NvbnRlbnQiOworICAgICAgICAvKioKKyAgICAgICAgICogTUlNRSB0eXBlIG9mIHRoZSBtZWRpYSBjb250ZW50IGZvciB0aGUgdm9pY2VtYWlsLgorICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9UWVBFID0gIm1pbWVfdHlwZSI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXRoIHRvIHRoZSBtZWRpYSBjb250ZW50IGZpbGUuIEludGVybmFsIG9ubHkgZmllbGQuCisgICAgICAgICAqIEBoaWRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfREFUQSA9ICJfZGF0YSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvcGFja2FnZS5odG1sIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM2MzAzLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPEhUTUw+Ci08Qk9EWT4KLVV0aWxpdGllcyBmb3IgZW5jcnlwdGluZyBtZXNzYWdlcyBmcm9tIGhhc2ggZnVuY3Rpb25zLgote0BoaWRlfQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZlci9CbHVldG9vdGhTZXJ2aWNlLmphdmEKaW5kZXggNjBiZWU5YS4uNjI3OTJmNCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmVyL0JsdWV0b290aFNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2ZXIvQmx1ZXRvb3RoU2VydmljZS5qYXZhCkBAIC0xNzM3LDcgKzE3MzcsNiBAQAogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIk51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlczoiICsgZGV2aWNlTGlzdC5zaXplKCkpOwogICAgICAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBkZXZpY2VMaXN0LmdldCgwKTsKICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJnZXRDb25uZWN0ZWREZXZpY2VzWzBdID0gIiArIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiUHJpb3JpdHkgb2YgQ29ubmVjdGVkIGRldmljZSA9ICIgKyBtUGFuLmdldFByaW9yaXR5KGRldmljZSkpOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChtUGFuLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfQ09OTkVDVElORzoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQppbmRleCBlYWU3NTc0Li44ZmM4YjlkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCkBAIC0xODEsNyArMTgxLDcgQEAKICAgICAgICAgCiAgICAgICAgIGZpbmFsIEJhc2VTdXJmYWNlSG9sZGVyIG1TdXJmYWNlSG9sZGVyID0gbmV3IEJhc2VTdXJmYWNlSG9sZGVyKCkgewogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRGb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JfNTY1OworICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRGb3JtYXQgPSBQaXhlbEZvcm1hdC5SR0JYXzg4ODg7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9BYnN0cmFjdFN5bnRoZXNpc0NhbGxiYWNrLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0Fic3RyYWN0U3ludGhlc2lzQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0YWYwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9BYnN0cmFjdFN5bnRoZXNpc0NhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNwZWVjaC50dHM7CisKKy8qKgorICogRGVmaW5lcyBhZGRpdGlvbmFsIG1ldGhvZHMgdGhlIHN5bnRoZXNpcyBjYWxsYmFjayBtdXN0IGltcGxlbWVudCB0aGF0CisgKiBhcmUgcHJpdmF0ZSB0byB0aGUgVFRTIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0U3ludGhlc2lzQ2FsbGJhY2sgaW1wbGVtZW50cyBTeW50aGVzaXNDYWxsYmFjayB7CisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHN5bnRoZXNpcyByZXF1ZXN0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgYWJzdHJhY3QgYm9vbGVhbiBpc0RvbmUoKTsKKworICAgIC8qKgorICAgICAqIEFib3J0cyB0aGUgc3BlZWNoIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBDYW4gYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCB2b2lkIHN0b3AoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvQXVkaW9NZXNzYWdlUGFyYW1zLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0F1ZGlvTWVzc2FnZVBhcmFtcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDg3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0F1ZGlvTWVzc2FnZVBhcmFtcy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zcGVlY2gudHRzOworCitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaFNlcnZpY2UuVXR0ZXJhbmNlQ29tcGxldGVkRGlzcGF0Y2hlcjsKKworY2xhc3MgQXVkaW9NZXNzYWdlUGFyYW1zIGV4dGVuZHMgTWVzc2FnZVBhcmFtcyB7CisgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ01lZGlhUGxheWVyIG1QbGF5ZXI7CisKKyAgICBBdWRpb01lc3NhZ2VQYXJhbXMoVXR0ZXJhbmNlQ29tcGxldGVkRGlzcGF0Y2hlciBkaXNwYXRjaGVyLAorICAgICAgICAgICAgU3RyaW5nIGNhbGxpbmdBcHAsIEJsb2NraW5nTWVkaWFQbGF5ZXIgcGxheWVyKSB7CisgICAgICAgIHN1cGVyKGRpc3BhdGNoZXIsIGNhbGxpbmdBcHApOworICAgICAgICBtUGxheWVyID0gcGxheWVyOworICAgIH0KKworICAgIEJsb2NraW5nTWVkaWFQbGF5ZXIgZ2V0UGxheWVyKCkgeworICAgICAgICByZXR1cm4gbVBsYXllcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfQVVESU87CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0F1ZGlvUGxheWJhY2tIYW5kbGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0F1ZGlvUGxheWJhY2tIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2ODZiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvQXVkaW9QbGF5YmFja0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDUyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNwZWVjaC50dHM7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjazsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlByaW9yaXR5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworY2xhc3MgQXVkaW9QbGF5YmFja0hhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVFRTLkF1ZGlvUGxheWJhY2tIYW5kbGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9BVURJT19CVUZGRVJfU0laRSA9IDgxOTI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhFU0lTX1NUQVJUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhFU0lTX0RBVEFfQVZBSUxBQkxFID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhFU0lTX0NPTVBMRVRFX0RBVEFfQVZBSUxBQkxFID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1lOVEhFU0lTX0RPTkUgPSA0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVlfQVVESU8gPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZX1NJTEVOQ0UgPSA2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIVVRET1dOID0gLTE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUklPUklUWSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhJR0hfUFJJT1JJVFkgPSAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBQcmlvcml0eUJsb2NraW5nUXVldWU8TGlzdEVudHJ5PiBtUXVldWUgPQorICAgICAgICAgICAgbmV3IFByaW9yaXR5QmxvY2tpbmdRdWV1ZTxMaXN0RW50cnk+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWQgbUhhbmRsZXJUaHJlYWQ7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1lc3NhZ2VQYXJhbXMgbUN1cnJlbnRQYXJhbXMgPSBudWxsOworICAgIC8vIFVzZWQgb25seSBmb3IgYm9vayBrZWVwaW5nIGFuZCBlcnJvciBkZXRlY3Rpb24uCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTeW50aGVzaXNNZXNzYWdlUGFyYW1zIG1MYXN0U3ludGhlc2lzUmVxdWVzdCA9IG51bGw7CisgICAgLy8gVXNlZCB0byBvcmRlciBpbmNvbWluZyBtZXNzYWdlcyBpbiBvdXIgcHJpb3JpdHkgcXVldWUuCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG1TZXF1ZW5jZUlkQ3RyID0gbmV3IEF0b21pY0xvbmcoMCk7CisKKworICAgIEF1ZGlvUGxheWJhY2tIYW5kbGVyKCkgeworICAgICAgICBtSGFuZGxlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IE1lc3NhZ2VMb29wKCksICJUVFMuQXVkaW9QbGF5YmFja1RocmVhZCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIGFsbCBzeW50aGVzaXMgZm9yIGEgZ2l2ZW4ge0Bjb2RlIHRva2VufS4gSWYgdGhlIGN1cnJlbnQgdG9rZW4KKyAgICAgKiBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLCBhbiBlZmZvcnQgd2lsbCBiZSBtYWRlIHRvIHN0b3AgaXQgYnV0CisgICAgICogdGhhdCBpcyBub3QgZ3VhcmFudGVlZC4KKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgc3RvcChNZXNzYWdlUGFyYW1zIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByZW1vdmVNZXNzYWdlcyh0b2tlbik7CisKKyAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKSA9PSBNZXNzYWdlUGFyYW1zLlRZUEVfU1lOVEhFU0lTKSB7CisgICAgICAgICAgICBtUXVldWUuYWRkKG5ldyBMaXN0RW50cnkoU1lOVEhFU0lTX0RPTkUsIHRva2VuLCBISUdIX1BSSU9SSVRZKSk7CisgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgZmluYWwgTWVzc2FnZVBhcmFtcyBjdXJyZW50ID0gZ2V0Q3VycmVudFBhcmFtcygpOworCisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLmdldFR5cGUoKSA9PSBNZXNzYWdlUGFyYW1zLlRZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICAgICAgKChBdWRpb01lc3NhZ2VQYXJhbXMpIGN1cnJlbnQpLmdldFBsYXllcigpLnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLmdldFR5cGUoKSA9PSBNZXNzYWdlUGFyYW1zLlRZUEVfU0lMRU5DRSkgeworICAgICAgICAgICAgICAgICAgICAoKFNpbGVuY2VNZXNzYWdlUGFyYW1zKSBjdXJyZW50KS5nZXRDb25kaXRpb25WYXJpYWJsZSgpLm9wZW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcmVtb3ZlUGxheWJhY2tJdGVtcyhTdHJpbmcgY2FsbGluZ0FwcCkgeworICAgICAgICByZW1vdmVNZXNzYWdlcyhjYWxsaW5nQXBwKTsKKyAgICAgICAgc3RvcChnZXRDdXJyZW50UGFyYW1zKCkpOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCByZW1vdmVBbGxJdGVtcygpIHsKKyAgICAgICAgcmVtb3ZlQWxsTWVzc2FnZXMoKTsKKyAgICAgICAgc3RvcChnZXRDdXJyZW50UGFyYW1zKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXQgZG93biB0aGUgYXVkaW8gcGxheWJhY2sgdGhyZWFkLgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBxdWl0KCkgeworICAgICAgICBzdG9wKGdldEN1cnJlbnRQYXJhbXMoKSk7CisgICAgICAgIG1RdWV1ZS5hZGQobmV3IExpc3RFbnRyeShTSFVURE9XTiwgbnVsbCwgSElHSF9QUklPUklUWSkpOworICAgIH0KKworICAgIHZvaWQgZW5xdWV1ZVN5bnRoZXNpc1N0YXJ0KFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMgdG9rZW4pIHsKKyAgICAgICAgbVF1ZXVlLmFkZChuZXcgTGlzdEVudHJ5KFNZTlRIRVNJU19TVEFSVCwgdG9rZW4pKTsKKyAgICB9CisKKyAgICB2b2lkIGVucXVldWVTeW50aGVzaXNEYXRhQXZhaWxhYmxlKFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMgdG9rZW4pIHsKKyAgICAgICAgbVF1ZXVlLmFkZChuZXcgTGlzdEVudHJ5KFNZTlRIRVNJU19EQVRBX0FWQUlMQUJMRSwgdG9rZW4pKTsKKyAgICB9CisKKyAgICB2b2lkIGVucXVldWVTeW50aGVzaXNDb21wbGV0ZURhdGFBdmFpbGFibGUoU3ludGhlc2lzTWVzc2FnZVBhcmFtcyB0b2tlbikgeworICAgICAgICBtUXVldWUuYWRkKG5ldyBMaXN0RW50cnkoU1lOVEhFU0lTX0NPTVBMRVRFX0RBVEFfQVZBSUxBQkxFLCB0b2tlbikpOworICAgIH0KKworICAgIHZvaWQgZW5xdWV1ZVN5bnRoZXNpc0RvbmUoU3ludGhlc2lzTWVzc2FnZVBhcmFtcyB0b2tlbikgeworICAgICAgICBtUXVldWUuYWRkKG5ldyBMaXN0RW50cnkoU1lOVEhFU0lTX0RPTkUsIHRva2VuKSk7CisgICAgfQorCisgICAgdm9pZCBlbnF1ZXVlQXVkaW8oQXVkaW9NZXNzYWdlUGFyYW1zIHRva2VuKSB7CisgICAgICAgIG1RdWV1ZS5hZGQobmV3IExpc3RFbnRyeShQTEFZX0FVRElPLCB0b2tlbikpOworICAgIH0KKworICAgIHZvaWQgZW5xdWV1ZVNpbGVuY2UoU2lsZW5jZU1lc3NhZ2VQYXJhbXMgdG9rZW4pIHsKKyAgICAgICAgbVF1ZXVlLmFkZChuZXcgTGlzdEVudHJ5KFBMQVlfU0lMRU5DRSwgdG9rZW4pKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEVuZCBvZiBwdWJsaWMgQVBJIG1ldGhvZHMuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTWV0aG9kcyBmb3IgbWFuYWdpbmcgdGhlIG1lc3NhZ2UgcXVldWUuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qCisgICAgICogVGhlIE1lc3NhZ2VMb29wIGlzIGEgaGFuZGxlciBsaWtlIGltcGxlbWVudGF0aW9uIHRoYXQKKyAgICAgKiBwcm9jZXNzZXMgbWVzc2FnZXMgZnJvbSBhIHByaW9yaXR5IHF1ZXVlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVzc2FnZUxvb3AgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIExpc3RFbnRyeSBlbnRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBtUXVldWUudGFrZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkubVdoYXQgPT0gU0hVVERPV04pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiTWVzc2FnZUxvb3AgOiBTaHV0dGluZyBkb3duIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk1lc3NhZ2VMb29wIDogSGFuZGxpbmcgbWVzc2FnZSA6IiArIGVudHJ5Lm1XaGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICxzZXFJZCA6ICIgKyBlbnRyeS5tU2VxdWVuY2VJZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFBhcmFtcyhlbnRyeS5tTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgaGFuZGxlTWVzc2FnZShlbnRyeSk7CisgICAgICAgICAgICAgICAgc2V0Q3VycmVudFBhcmFtcyhudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmVtb3ZlIGFsbCBtZXNzYWdlcyBmcm9tIHRoZSBxdWV1ZSB0aGF0IGNvbnRhaW4gdGhlIHN1cHBsaWVkIHRva2VuLgorICAgICAqIE5vdGUgdGhhdCB0aGUgSXRlcmF0b3IgaXMgdGhyZWFkIHNhZmUsIGFuZCBvdGhlciBtZXRob2RzIGNhbiBzYWZlbHkKKyAgICAgKiBjb250aW51ZSBhZGRpbmcgdG8gdGhlIHF1ZXVlIGF0IHRoaXMgcG9pbnQuCisgICAgICovCisgICAgc3luY2hyb25pemVkIHByaXZhdGUgdm9pZCByZW1vdmVNZXNzYWdlcyhNZXNzYWdlUGFyYW1zIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvcjxMaXN0RW50cnk+IGl0ID0gbVF1ZXVlLml0ZXJhdG9yKCk7CisKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgTGlzdEVudHJ5IGN1cnJlbnQgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBpZiAoY3VycmVudC5tTWVzc2FnZSA9PSB0b2tlbikgeworICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBdG9taWNhbGx5IGNsZWFyIHRoZSBxdWV1ZSBvZiBhbGwgbWVzc2FnZXMuCisgICAgICovCisgICAgc3luY2hyb25pemVkIHByaXZhdGUgdm9pZCByZW1vdmVBbGxNZXNzYWdlcygpIHsKKyAgICAgICAgbVF1ZXVlLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgb3JpZ2luYXRlIGZyb20gYSBnaXZlbiBjYWxsaW5nIGFwcC4KKyAgICAgKi8KKyAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSB2b2lkIHJlbW92ZU1lc3NhZ2VzKFN0cmluZyBjYWxsaW5nQXBwKSB7CisgICAgICAgIEl0ZXJhdG9yPExpc3RFbnRyeT4gaXQgPSBtUXVldWUuaXRlcmF0b3IoKTsKKworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0RW50cnkgY3VycmVudCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIC8vIFRoZSBudWxsIGNoZWNrIGlzIHRvIHByZXZlbnQgdXMgZnJvbSByZW1vdmluZyBjb250cm9sIG1lc3NhZ2VzLAorICAgICAgICAgICAgLy8gc3VjaCBhcyBhIHNodXRkb3duIG1lc3NhZ2UuCisgICAgICAgICAgICBpZiAoY3VycmVudC5tTWVzc2FnZSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdBcHAuZXF1YWxzKGN1cnJlbnQubU1lc3NhZ2UuZ2V0Q2FsbGluZ0FwcCgpKSkgeworICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBbiBlbGVtZW50IG9mIG91ciBwcmlvcml0eSBxdWV1ZSBvZiBtZXNzYWdlcy4gRWFjaCBtZXNzYWdlIGhhcyBhIHByaW9yaXR5LAorICAgICAqIGFuZCBhIHNlcXVlbmNlIGlkIChkZWZpbmVkIGJ5IHRoZSBvcmRlciBvZiBlbnF1ZXVlIGNhbGxzKS4gQW1vbmcgbWVzc2FnZXMKKyAgICAgKiB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LCBtZXNzYWdlcyB0aGF0IHdlcmUgcmVjZWl2ZWQgZWFybGllciB3aW4gb3V0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTGlzdEVudHJ5IGltcGxlbWVudHMgQ29tcGFyYWJsZTxMaXN0RW50cnk+IHsKKyAgICAgICAgZmluYWwgaW50IG1XaGF0OworICAgICAgICBmaW5hbCBNZXNzYWdlUGFyYW1zIG1NZXNzYWdlOworICAgICAgICBmaW5hbCBpbnQgbVByaW9yaXR5OworICAgICAgICBmaW5hbCBsb25nIG1TZXF1ZW5jZUlkOworCisgICAgICAgIHByaXZhdGUgTGlzdEVudHJ5KGludCB3aGF0LCBNZXNzYWdlUGFyYW1zIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMod2hhdCwgbWVzc2FnZSwgREVGQVVMVF9QUklPUklUWSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIExpc3RFbnRyeShpbnQgd2hhdCwgTWVzc2FnZVBhcmFtcyBtZXNzYWdlLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgICAgIG1XaGF0ID0gd2hhdDsKKyAgICAgICAgICAgIG1NZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICAgICAgbVNlcXVlbmNlSWQgPSBtU2VxdWVuY2VJZEN0ci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaXN0RW50cnkgdGhhdCkgeworICAgICAgICAgICAgaWYgKHRoYXQgPT0gdGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBhbHdheXMgMCwgMSBvciAtMS4KKyAgICAgICAgICAgIGludCBwcmlvcml0eURpZmYgPSBtUHJpb3JpdHkgLSB0aGF0Lm1Qcmlvcml0eTsKKyAgICAgICAgICAgIGlmIChwcmlvcml0eURpZmYgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSA9PSBjYXNlIGNhbm5vdCBvY2N1ci4KKyAgICAgICAgICAgICAgICByZXR1cm4gKG1TZXF1ZW5jZUlkIDwgdGhhdC5tU2VxdWVuY2VJZCkgPyAtMSA6IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBwcmlvcml0eURpZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0Q3VycmVudFBhcmFtcyhNZXNzYWdlUGFyYW1zIHApIHsKKyAgICAgICAgbUN1cnJlbnRQYXJhbXMgPSBwOworICAgIH0KKworICAgIHByaXZhdGUgTWVzc2FnZVBhcmFtcyBnZXRDdXJyZW50UGFyYW1zKCkgeworICAgICAgICByZXR1cm4gbUN1cnJlbnRQYXJhbXM7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzIGZvciBkZWFsaW5nIHdpdGggaW5kaXZpZHVhbCBtZXNzYWdlcywgdGhlIG1ldGhvZHMKKyAgICAvLyBiZWxvdyBkbyB0aGUgYWN0dWFsIHdvcmsuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVNZXNzYWdlKExpc3RFbnRyeSBlbnRyeSkgeworICAgICAgICBmaW5hbCBNZXNzYWdlUGFyYW1zIG1zZyA9IGVudHJ5Lm1NZXNzYWdlOworICAgICAgICBpZiAoZW50cnkubVdoYXQgPT0gU1lOVEhFU0lTX1NUQVJUKSB7CisgICAgICAgICAgICBoYW5kbGVTeW50aGVzaXNTdGFydChtc2cpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lm1XaGF0ID09IFNZTlRIRVNJU19EQVRBX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgaGFuZGxlU3ludGhlc2lzRGF0YUF2YWlsYWJsZShtc2cpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lm1XaGF0ID09IFNZTlRIRVNJU19ET05FKSB7CisgICAgICAgICAgICBoYW5kbGVTeW50aGVzaXNEb25lKG1zZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubVdoYXQgPT0gU1lOVEhFU0lTX0NPTVBMRVRFX0RBVEFfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICBoYW5kbGVTeW50aGVzaXNDb21wbGV0ZURhdGFBdmFpbGFibGUobXNnKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5tV2hhdCA9PSBQTEFZX0FVRElPKSB7CisgICAgICAgICAgICBoYW5kbGVBdWRpbyhtc2cpOworICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Lm1XaGF0ID09IFBMQVlfU0lMRU5DRSkgeworICAgICAgICAgICAgaGFuZGxlU2lsZW5jZShtc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ3VycmVudGx5IGltcGxlbWVudGVkIGFzIGJsb2NraW5nIHRoZSBhdWRpbyBwbGF5YmFjayB0aHJlYWQgZm9yIHRoZQorICAgIC8vIHNwZWNpZmllZCBkdXJhdGlvbi4gSWYgYSBjYWxsIHRvIHN0b3AoKSBpcyBtYWRlLCB0aGUgdGhyZWFkCisgICAgLy8gdW5ibG9ja3MuCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNpbGVuY2UoTWVzc2FnZVBhcmFtcyBtc2cpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiaGFuZGxlU2lsZW5jZSgpIik7CisgICAgICAgIFNpbGVuY2VNZXNzYWdlUGFyYW1zIHBhcmFtcyA9IChTaWxlbmNlTWVzc2FnZVBhcmFtcykgbXNnOworICAgICAgICBpZiAocGFyYW1zLmdldFNpbGVuY2VEdXJhdGlvbk1zKCkgPiAwKSB7CisgICAgICAgICAgICBwYXJhbXMuZ2V0Q29uZGl0aW9uVmFyaWFibGUoKS5ibG9jayhwYXJhbXMuZ2V0U2lsZW5jZUR1cmF0aW9uTXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLmdldERpc3BhdGNoZXIoKS5kaXNwYXRjaFV0dGVyYW5jZUNvbXBsZXRlZCgpOworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJoYW5kbGVTaWxlbmNlKCkgZG9uZS4iKTsKKyAgICB9CisKKyAgICAvLyBQbGF5cyBiYWNrIGF1ZGlvIGZyb20gYSBnaXZlbiBVUkkuIE5vIFRUUyBlbmdpbmUgaW52b2x2ZW1lbnQgaGVyZS4KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQXVkaW8oTWVzc2FnZVBhcmFtcyBtc2cpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiaGFuZGxlQXVkaW8oKSIpOworICAgICAgICBBdWRpb01lc3NhZ2VQYXJhbXMgcGFyYW1zID0gKEF1ZGlvTWVzc2FnZVBhcmFtcykgbXNnOworICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIEJsb2NraW5nTWVkaWFQbGF5ZXIgc3Bhd25zIGEgc2VwYXJhdGUgdGhyZWFkLgorICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBUaGlzIGNhbiBiZSBhdm9pZGVkLgorICAgICAgICBwYXJhbXMuZ2V0UGxheWVyKCkuc3RhcnRBbmRXYWl0KCk7CisgICAgICAgIHBhcmFtcy5nZXREaXNwYXRjaGVyKCkuZGlzcGF0Y2hVdHRlcmFuY2VDb21wbGV0ZWQoKTsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiaGFuZGxlQXVkaW8oKSBkb25lLiIpOworICAgIH0KKworICAgIC8vIERlbm90ZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHN5bnRoZXNpcyByZXF1ZXN0LiBXZSBjcmVhdGUgYSBuZXcKKyAgICAvLyBhdWRpbyB0cmFjaywgYW5kIHByZXBhcmUgaXQgZm9yIGluY29taW5nIGRhdGEuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgc2luY2UgYWxsIFRUUyBzeW50aGVzaXMgaGFwcGVucyBvbiBhIHNpbmdsZSB0aHJlYWQsIHdlCisgICAgLy8gc2hvdWxkIEFMV0FZUyBzZWUgdGhlIGZvbGxvd2luZyBvcmRlciA6CisgICAgLy8KKyAgICAvLyBoYW5kbGVTeW50aGVzaXNTdGFydCAtPiBoYW5kbGVTeW50aGVzaXNEYXRhQXZhaWxhYmxlKCopIC0+IGhhbmRsZVN5bnRoZXNpc0RvbmUKKyAgICAvLyBPUgorICAgIC8vIGhhbmRsZVN5bnRoZXNpc0NvbXBsZXRlRGF0YUF2YWlsYWJsZS4KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlU3ludGhlc2lzU3RhcnQoTWVzc2FnZVBhcmFtcyBtc2cpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiaGFuZGxlU3ludGhlc2lzU3RhcnQoKSIpOworICAgICAgICBmaW5hbCBTeW50aGVzaXNNZXNzYWdlUGFyYW1zIHBhcmFtID0gKFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMpIG1zZzsKKworICAgICAgICAvLyBPb3BzLCBsb29rcyBsaWtlIHRoZSBlbmdpbmUgZm9yZ290IHRvIGNhbGwgZG9uZSgpLiBXZSBnbyB0aHJvdWdoCisgICAgICAgIC8vIGV4dHJhIHRyb3VibGUgdG8gY2xlYW4gdGhlIGRhdGEgdG8gcHJldmVudCB0aGUgQXVkaW9UcmFjayByZXNvdXJjZXMKKyAgICAgICAgLy8gZnJvbSBiZWluZyBsZWFrZWQuCisgICAgICAgIGlmIChtTGFzdFN5bnRoZXNpc1JlcXVlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRXJyb3IgOiBNaXNzaW5nIGNhbGwgdG8gZG9uZSgpIGZvciByZXF1ZXN0IDogIiArCisgICAgICAgICAgICAgICAgICAgIG1MYXN0U3ludGhlc2lzUmVxdWVzdCk7CisgICAgICAgICAgICBoYW5kbGVTeW50aGVzaXNEb25lKG1MYXN0U3ludGhlc2lzUmVxdWVzdCk7CisgICAgICAgIH0KKworICAgICAgICBtTGFzdFN5bnRoZXNpc1JlcXVlc3QgPSBwYXJhbTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGF1ZGlvIHRyYWNrLgorICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBjcmVhdGVTdHJlYW1pbmdBdWRpb1RyYWNrKAorICAgICAgICAgICAgICAgIHBhcmFtLm1TdHJlYW1UeXBlLCBwYXJhbS5tU2FtcGxlUmF0ZUluSHosIHBhcmFtLm1BdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICBwYXJhbS5tQ2hhbm5lbENvdW50LCBwYXJhbS5tVm9sdW1lLCBwYXJhbS5tUGFuKTsKKworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJDcmVhdGVkIGF1ZGlvIHRyYWNrIFsiICsgYXVkaW9UcmFjay5oYXNoQ29kZSgpICsgIl0iKTsKKworICAgICAgICBwYXJhbS5zZXRBdWRpb1RyYWNrKGF1ZGlvVHJhY2spOworICAgIH0KKworICAgIC8vIE1vcmUgZGF0YSBhdmFpbGFibGUgdG8gYmUgZmx1c2hlZCB0byB0aGUgYXVkaW8gdHJhY2suCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN5bnRoZXNpc0RhdGFBdmFpbGFibGUoTWVzc2FnZVBhcmFtcyBtc2cpIHsKKyAgICAgICAgZmluYWwgU3ludGhlc2lzTWVzc2FnZVBhcmFtcyBwYXJhbSA9IChTeW50aGVzaXNNZXNzYWdlUGFyYW1zKSBtc2c7CisgICAgICAgIGlmIChwYXJhbS5nZXRBdWRpb1RyYWNrKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiRXJyb3IgOiBudWxsIGF1ZGlvIHRyYWNrIGluIGhhbmRsZURhdGFBdmFpbGFibGUuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW0gIT0gbUxhc3RTeW50aGVzaXNSZXF1ZXN0KSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYWxsIHRvIGRhdGFBdmFpbGFibGUgd2l0aG91dCBkb25lKCkgLyBzdGFydCgpIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBwYXJhbS5nZXRBdWRpb1RyYWNrKCk7CisgICAgICAgIGZpbmFsIFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMuTGlzdEVudHJ5IGJ1ZmZlckNvcHkgPSBwYXJhbS5nZXROZXh0QnVmZmVyKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlckNvcHkgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gYnVmZmVycyBhdmFpbGFibGUgdG8gcGxheS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwbGF5U3RhdGUgPSBhdWRpb1RyYWNrLmdldFBsYXlTdGF0ZSgpOworICAgICAgICBpZiAocGxheVN0YXRlID09IEF1ZGlvVHJhY2suUExBWVNUQVRFX1NUT1BQRUQpIHsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIkF1ZGlvVHJhY2sgc3RvcHBlZCwgcmVzdGFydGluZyA6ICIgKyBhdWRpb1RyYWNrLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgYXVkaW9UcmFjay5wbGF5KCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGNvdW50IDwgYnVmZmVyQ29weS5tTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgdGFrZSBidWZmZXJDb3B5Lm1PZmZzZXQgaW50byBhY2NvdW50IGJlY2F1c2UKKyAgICAgICAgICAgIC8vIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgMC4KKyAgICAgICAgICAgIGludCB3cml0dGVuID0gYXVkaW9UcmFjay53cml0ZShidWZmZXJDb3B5Lm1CeXRlcywgY291bnQsIGJ1ZmZlckNvcHkubUxlbmd0aCk7CisgICAgICAgICAgICBpZiAod3JpdHRlbiA8PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudCArPSB3cml0dGVuOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN5bnRoZXNpc0RvbmUoTWVzc2FnZVBhcmFtcyBtc2cpIHsKKyAgICAgICAgZmluYWwgU3ludGhlc2lzTWVzc2FnZVBhcmFtcyBwYXJhbXMgPSAoU3ludGhlc2lzTWVzc2FnZVBhcmFtcykgbXNnOworICAgICAgICBoYW5kbGVTeW50aGVzaXNEb25lKHBhcmFtcyk7CisgICAgfQorCisgICAgLy8gRmx1c2ggYWxsIHJlbWFpbmluZyBkYXRhIHRvIHRoZSBhdWRpbyB0cmFjaywgc3RvcCBpdCBhbmQgcmVsZWFzZQorICAgIC8vIGFsbCBpdCdzIHJlc291cmNlcy4KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlU3ludGhlc2lzRG9uZShTeW50aGVzaXNNZXNzYWdlUGFyYW1zIHBhcmFtcykgeworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJoYW5kbGVTeW50aGVzaXNEb25lKCkiKTsKKyAgICAgICAgZmluYWwgQXVkaW9UcmFjayBhdWRpb1RyYWNrID0gcGFyYW1zLmdldEF1ZGlvVHJhY2soKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2suZmx1c2goKTsKKyAgICAgICAgICAgICAgICBhdWRpb1RyYWNrLnN0b3AoKTsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZWxlYXNpbmcgYXVkaW8gdHJhY2sgWyIgKyBhdWRpb1RyYWNrLmhhc2hDb2RlKCkgKyAiXSIpOworICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2sucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcGFyYW1zLnNldEF1ZGlvVHJhY2sobnVsbCk7CisgICAgICAgICAgICBwYXJhbXMuZ2V0RGlzcGF0Y2hlcigpLmRpc3BhdGNoVXR0ZXJhbmNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICBtTGFzdFN5bnRoZXNpc1JlcXVlc3QgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVN5bnRoZXNpc0NvbXBsZXRlRGF0YUF2YWlsYWJsZShNZXNzYWdlUGFyYW1zIG1zZykgeworICAgICAgICBmaW5hbCBTeW50aGVzaXNNZXNzYWdlUGFyYW1zIHBhcmFtcyA9IChTeW50aGVzaXNNZXNzYWdlUGFyYW1zKSBtc2c7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImNvbXBsZXRlQXVkaW9BdmFpbGFibGUoIiArIHBhcmFtcyArICIpIik7CisKKyAgICAgICAgLy8gQ2hhbm5lbCBjb25maWcgYW5kIGJ5dGVzIHBlciBmcmFtZSBhcmUgY2hlY2tlZCBiZWZvcmUKKyAgICAgICAgLy8gdGhpcyBtZXNzYWdlIGlzIHNlbnQuCisgICAgICAgIGludCBjaGFubmVsQ29uZmlnID0gQXVkaW9QbGF5YmFja0hhbmRsZXIuZ2V0Q2hhbm5lbENvbmZpZyhwYXJhbXMubUNoYW5uZWxDb3VudCk7CisgICAgICAgIGludCBieXRlc1BlckZyYW1lID0gQXVkaW9QbGF5YmFja0hhbmRsZXIuZ2V0Qnl0ZXNQZXJGcmFtZShwYXJhbXMubUF1ZGlvRm9ybWF0KTsKKworICAgICAgICBTeW50aGVzaXNNZXNzYWdlUGFyYW1zLkxpc3RFbnRyeSBlbnRyeSA9IHBhcmFtcy5nZXROZXh0QnVmZmVyKCk7CisKKyAgICAgICAgaWYgKGVudHJ5ID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImNvbXBsZXRlRGF0YUF2YWlsYWJsZSA6IE5vIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHBsYXkuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjayhwYXJhbXMubVN0cmVhbVR5cGUsIHBhcmFtcy5tU2FtcGxlUmF0ZUluSHosCisgICAgICAgICAgICAgICAgY2hhbm5lbENvbmZpZywgcGFyYW1zLm1BdWRpb0Zvcm1hdCwgZW50cnkubUxlbmd0aCwgQXVkaW9UcmFjay5NT0RFX1NUQVRJQyk7CisKKyAgICAgICAgLy8gU28gdGhhdCBoYW5kbGVEb25lIGNhbiBhY2Nlc3MgdGhpcyBjb3JyZWN0bHkuCisgICAgICAgIHBhcmFtcy5tQXVkaW9UcmFjayA9IGF1ZGlvVHJhY2s7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF1ZGlvVHJhY2sud3JpdGUoZW50cnkubUJ5dGVzLCBlbnRyeS5tT2Zmc2V0LCBlbnRyeS5tTGVuZ3RoKTsKKyAgICAgICAgICAgIHNldHVwVm9sdW1lKGF1ZGlvVHJhY2ssIHBhcmFtcy5tVm9sdW1lLCBwYXJhbXMubVBhbik7CisgICAgICAgICAgICBhdWRpb1RyYWNrLnBsYXkoKTsKKyAgICAgICAgICAgIGJsb2NrVW50aWxEb25lKGF1ZGlvVHJhY2ssIGJ5dGVzUGVyRnJhbWUsIGVudHJ5Lm1MZW5ndGgpOworICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiV3JvdGUgZGF0YSB0byBhdWRpbyB0cmFjayBzdWNjZXNzZnVsbHkgOiAiICsgZW50cnkubUxlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2sgZXJyb3IiLCBleCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBoYW5kbGVTeW50aGVzaXNEb25lKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYmxvY2tVbnRpbERvbmUoQXVkaW9UcmFjayBhdWRpb1RyYWNrLCBpbnQgYnl0ZXNQZXJGcmFtZSwgaW50IGxlbmd0aCkgeworICAgICAgICBpbnQgbGVuZ3RoSW5GcmFtZXMgPSBsZW5ndGggLyBieXRlc1BlckZyYW1lOworICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gMDsKKyAgICAgICAgd2hpbGUgKChjdXJyZW50UG9zaXRpb24gPSBhdWRpb1RyYWNrLmdldFBsYXliYWNrSGVhZFBvc2l0aW9uKCkpIDwgbGVuZ3RoSW5GcmFtZXMpIHsKKyAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkVGltZU1zID0gKChsZW5ndGhJbkZyYW1lcyAtIGN1cnJlbnRQb3NpdGlvbikgKiAxMDAwKSAvCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2suZ2V0U2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgYXVkaW9UcmFjay5nZXRQbGF5U3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIkFib3V0IHRvIHNsZWVwIGZvciA6ICIgKyBlc3RpbWF0ZWRUaW1lTXMgKyAiIG1zLCIgKworICAgICAgICAgICAgICAgICAgICAiIFBsYXliYWNrIHBvc2l0aW9uIDogIiArIGN1cnJlbnRQb3NpdGlvbik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChlc3RpbWF0ZWRUaW1lTXMpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEF1ZGlvVHJhY2sgY3JlYXRlU3RyZWFtaW5nQXVkaW9UcmFjayhpbnQgc3RyZWFtVHlwZSwgaW50IHNhbXBsZVJhdGVJbkh6LAorICAgICAgICAgICAgaW50IGF1ZGlvRm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LCBmbG9hdCB2b2x1bWUsIGZsb2F0IHBhbikgeworICAgICAgICBpbnQgY2hhbm5lbENvbmZpZyA9IGdldENoYW5uZWxDb25maWcoY2hhbm5lbENvdW50KTsKKworICAgICAgICBpbnQgbWluQnVmZmVyU2l6ZUluQnl0ZXMKKyAgICAgICAgICAgICAgICA9IEF1ZGlvVHJhY2suZ2V0TWluQnVmZmVyU2l6ZShzYW1wbGVSYXRlSW5IeiwgY2hhbm5lbENvbmZpZywgYXVkaW9Gb3JtYXQpOworICAgICAgICBpbnQgYnVmZmVyU2l6ZUluQnl0ZXMgPSBNYXRoLm1heChNSU5fQVVESU9fQlVGRkVSX1NJWkUsIG1pbkJ1ZmZlclNpemVJbkJ5dGVzKTsKKworICAgICAgICBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjayhzdHJlYW1UeXBlLCBzYW1wbGVSYXRlSW5IeiwgY2hhbm5lbENvbmZpZywKKyAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwgYnVmZmVyU2l6ZUluQnl0ZXMsIEF1ZGlvVHJhY2suTU9ERV9TVFJFQU0pOworICAgICAgICBpZiAoYXVkaW9UcmFjay5nZXRTdGF0ZSgpICE9IEF1ZGlvVHJhY2suU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2suIik7CisgICAgICAgICAgICBhdWRpb1RyYWNrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgc2V0dXBWb2x1bWUoYXVkaW9UcmFjaywgdm9sdW1lLCBwYW4pOworICAgICAgICByZXR1cm4gYXVkaW9UcmFjazsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGdldENoYW5uZWxDb25maWcoaW50IGNoYW5uZWxDb3VudCkgeworICAgICAgICBpZiAoY2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF9NT05POworICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PSAyKXsKKyAgICAgICAgICAgIHJldHVybiBBdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGdldEJ5dGVzUGVyRnJhbWUoaW50IGF1ZGlvRm9ybWF0KSB7CisgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fOEJJVCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoYXVkaW9Gb3JtYXQgPT0gQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzE2QklUKSB7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldHVwVm9sdW1lKEF1ZGlvVHJhY2sgYXVkaW9UcmFjaywgZmxvYXQgdm9sdW1lLCBmbG9hdCBwYW4pIHsKKyAgICAgICAgZmxvYXQgdm9sID0gY2xpcCh2b2x1bWUsIDAuMGYsIDEuMGYpOworICAgICAgICBmbG9hdCBwYW5uaW5nID0gY2xpcChwYW4sIC0xLjBmLCAxLjBmKTsKKyAgICAgICAgZmxvYXQgdm9sTGVmdCA9IHZvbDsKKyAgICAgICAgZmxvYXQgdm9sUmlnaHQgPSB2b2w7CisgICAgICAgIGlmIChwYW5uaW5nID4gMC4wZikgeworICAgICAgICAgICAgdm9sTGVmdCAqPSAoMS4wZiAtIHBhbm5pbmcpOworICAgICAgICB9IGVsc2UgaWYgKHBhbm5pbmcgPCAwLjBmKSB7CisgICAgICAgICAgICB2b2xSaWdodCAqPSAoMS4wZiArIHBhbm5pbmcpOworICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInZvbExlZnQ9IiArIHZvbExlZnQgKyAiLHZvbFJpZ2h0PSIgKyB2b2xSaWdodCk7CisgICAgICAgIGlmIChhdWRpb1RyYWNrLnNldFN0ZXJlb1ZvbHVtZSh2b2xMZWZ0LCB2b2xSaWdodCkgIT0gQXVkaW9UcmFjay5TVUNDRVNTKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gc2V0IHZvbHVtZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmxvYXQgY2xpcChmbG9hdCB2YWx1ZSwgZmxvYXQgbWluLCBmbG9hdCBtYXgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlID4gbWF4ID8gbWF4IDogKHZhbHVlIDwgbWluID8gbWluIDogdmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9GaWxlU3ludGhlc2lzQ2FsbGJhY2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvRmlsZVN5bnRoZXNpc0NhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0YjNmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvRmlsZVN5bnRoZXNpc0NhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zcGVlY2gudHRzOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKKworLyoqCisgKiBTcGVlY2ggc3ludGhlc2lzIHJlcXVlc3QgdGhhdCB3cml0ZXMgdGhlIGF1ZGlvIHRvIGEgV0FWIGZpbGUuCisgKi8KK2NsYXNzIEZpbGVTeW50aGVzaXNDYWxsYmFjayBleHRlbmRzIEFic3RyYWN0U3ludGhlc2lzQ2FsbGJhY2sgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGaWxlU3ludGhlc2lzUmVxdWVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQVVESU9fQlVGRkVSX1NJWkUgPSA4MTkyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBVl9IRUFERVJfTEVOR1RIID0gNDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgV0FWX0ZPUk1BVF9QQ00gPSAweDAwMDE7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtU3RhdGVMb2NrID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBtRmlsZU5hbWU7CisgICAgcHJpdmF0ZSBpbnQgbVNhbXBsZVJhdGVJbkh6OworICAgIHByaXZhdGUgaW50IG1BdWRpb0Zvcm1hdDsKKyAgICBwcml2YXRlIGludCBtQ2hhbm5lbENvdW50OworICAgIHByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSBtRmlsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbURvbmUgPSBmYWxzZTsKKworICAgIEZpbGVTeW50aGVzaXNDYWxsYmFjayhGaWxlIGZpbGVOYW1lKSB7CisgICAgICAgIG1GaWxlTmFtZSA9IGZpbGVOYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBtU3RvcHBlZCA9IHRydWU7CisgICAgICAgICAgICBjbGVhblVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNdXN0IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHRoZSBtb25pdG9yIG9uIHtAbGluayAjbVN0YXRlTG9ja30uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgIGNsb3NlRmlsZSgpOworICAgICAgICBpZiAobUZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgbUZpbGVOYW1lLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyB0aGUgbW9uaXRvciBvbiB7QGxpbmsgI21TdGF0ZUxvY2t9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbG9zZUZpbGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobUZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1GaWxlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgbUZpbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNsb3NlICIgKyBtRmlsZU5hbWUgKyAiOiAiICsgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRNYXhCdWZmZXJTaXplKCkgeworICAgICAgICByZXR1cm4gTUFYX0FVRElPX0JVRkZFUl9TSVpFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gaXNEb25lKCkgeworICAgICAgICByZXR1cm4gbURvbmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzdGFydChpbnQgc2FtcGxlUmF0ZUluSHosIGludCBhdWRpb0Zvcm1hdCwgaW50IGNoYW5uZWxDb3VudCkgeworICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJGaWxlU3ludGhlc2lzUmVxdWVzdC5zdGFydCgiICsgc2FtcGxlUmF0ZUluSHogKyAiLCIgKyBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgICAgICArICIsIiArIGNoYW5uZWxDb3VudCArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xlYW5VcCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGVTeW50aGVzaXNSZXF1ZXN0LnN0YXJ0KCkgY2FsbGVkIHR3aWNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2FtcGxlUmF0ZUluSHogPSBzYW1wbGVSYXRlSW5IejsKKyAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCA9IGF1ZGlvRm9ybWF0OworICAgICAgICAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShtRmlsZU5hbWUsICJydyIpOworICAgICAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIFdBViBoZWFkZXIKKyAgICAgICAgICAgICAgICBtRmlsZS53cml0ZShuZXcgYnl0ZVtXQVZfSEVBREVSX0xFTkdUSF0pOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIG9wZW4gIiArIG1GaWxlTmFtZSArICI6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgY2xlYW5VcCgpOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGF1ZGlvQXZhaWxhYmxlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlsZVN5bnRoZXNpc1JlcXVlc3QuYXVkaW9BdmFpbGFibGUoIiArIGJ1ZmZlciArICIsIiArIG9mZnNldAorICAgICAgICAgICAgICAgICAgICArICIsIiArIGxlbmd0aCArICIpIik7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmlsZSBub3Qgb3BlbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1GaWxlLndyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHdyaXRlIHRvICIgKyBtRmlsZU5hbWUgKyAiOiAiICsgZXgpOworICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkb25lKCkgeworICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJGaWxlU3ludGhlc2lzUmVxdWVzdC5kb25lKCkiKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmlsZSBub3Qgb3BlbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIFdBViBoZWFkZXIgYXQgc3RhcnQgb2YgZmlsZQorICAgICAgICAgICAgICAgIG1GaWxlLnNlZWsoMCk7CisgICAgICAgICAgICAgICAgaW50IGRhdGFMZW5ndGggPSAoaW50KSAobUZpbGUubGVuZ3RoKCkgLSBXQVZfSEVBREVSX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgbUZpbGUud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtYWtlV2F2SGVhZGVyKG1TYW1wbGVSYXRlSW5IeiwgbUF1ZGlvRm9ybWF0LCBtQ2hhbm5lbENvdW50LCBkYXRhTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgY2xvc2VGaWxlKCk7CisgICAgICAgICAgICAgICAgbURvbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHdyaXRlIHRvICIgKyBtRmlsZU5hbWUgKyAiOiAiICsgZXgpOworICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXJyb3IoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIkZpbGVTeW50aGVzaXNSZXF1ZXN0LmVycm9yKCkiKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBjbGVhblVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBsZXRlQXVkaW9BdmFpbGFibGUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgeworICAgICAgICAgICAgaWYgKG1TdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiUmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obUZpbGVOYW1lKTsKKyAgICAgICAgICAgIG91dC53cml0ZShtYWtlV2F2SGVhZGVyKHNhbXBsZVJhdGVJbkh6LCBhdWRpb0Zvcm1hdCwgY2hhbm5lbENvdW50LCBsZW5ndGgpKTsKKyAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB3cml0ZSB0byAiICsgbUZpbGVOYW1lICsgIjogIiArIGV4KTsKKyAgICAgICAgICAgIG1GaWxlTmFtZS5kZWxldGUoKTsKKyAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBjbG9zZSAiICsgbUZpbGVOYW1lICsgIjogIiArIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIG1ha2VXYXZIZWFkZXIoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBpbnQgZGF0YUxlbmd0aCkgeworICAgICAgICAvLyBUT0RPOiBpcyBBdWRpb0Zvcm1hdC5FTkNPRElOR19ERUZBVUxUIGFsd2F5cyB0aGUgc2FtZSBhcyBFTkNPRElOR19QQ01fMTZCSVQ/CisgICAgICAgIGludCBzYW1wbGVTaXplSW5CeXRlcyA9IChhdWRpb0Zvcm1hdCA9PSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fOEJJVCA/IDEgOiAyKTsKKyAgICAgICAgaW50IGJ5dGVSYXRlID0gc2FtcGxlUmF0ZUluSHogKiBzYW1wbGVTaXplSW5CeXRlcyAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgc2hvcnQgYmxvY2tBbGlnbiA9IChzaG9ydCkgKHNhbXBsZVNpemVJbkJ5dGVzICogY2hhbm5lbENvdW50KTsKKyAgICAgICAgc2hvcnQgYml0c1BlclNhbXBsZSA9IChzaG9ydCkgKHNhbXBsZVNpemVJbkJ5dGVzICogOCk7CisKKyAgICAgICAgYnl0ZVtdIGhlYWRlckJ1ZiA9IG5ldyBieXRlW1dBVl9IRUFERVJfTEVOR1RIXTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBoZWFkZXIgPSBCeXRlQnVmZmVyLndyYXAoaGVhZGVyQnVmKTsKKyAgICAgICAgaGVhZGVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKKworICAgICAgICBoZWFkZXIucHV0KG5ldyBieXRlW117ICdSJywgJ0knLCAnRicsICdGJyB9KTsKKyAgICAgICAgaGVhZGVyLnB1dEludChkYXRhTGVuZ3RoICsgV0FWX0hFQURFUl9MRU5HVEggLSA4KTsgIC8vIFJJRkYgY2h1bmsgc2l6ZQorICAgICAgICBoZWFkZXIucHV0KG5ldyBieXRlW117ICdXJywgJ0EnLCAnVicsICdFJyB9KTsKKyAgICAgICAgaGVhZGVyLnB1dChuZXcgYnl0ZVtdeyAnZicsICdtJywgJ3QnLCAnICcgfSk7CisgICAgICAgIGhlYWRlci5wdXRJbnQoMTYpOyAgLy8gc2l6ZSBvZiBmbXQgY2h1bmsKKyAgICAgICAgaGVhZGVyLnB1dFNob3J0KFdBVl9GT1JNQVRfUENNKTsKKyAgICAgICAgaGVhZGVyLnB1dFNob3J0KChzaG9ydCkgY2hhbm5lbENvdW50KTsKKyAgICAgICAgaGVhZGVyLnB1dEludChzYW1wbGVSYXRlSW5Ieik7CisgICAgICAgIGhlYWRlci5wdXRJbnQoYnl0ZVJhdGUpOworICAgICAgICBoZWFkZXIucHV0U2hvcnQoYmxvY2tBbGlnbik7CisgICAgICAgIGhlYWRlci5wdXRTaG9ydChiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgaGVhZGVyLnB1dChuZXcgYnl0ZVtdeyAnZCcsICdhJywgJ3QnLCAnYScgfSk7CisgICAgICAgIGhlYWRlci5wdXRJbnQoZGF0YUxlbmd0aCk7CisKKyAgICAgICAgcmV0dXJuIGhlYWRlckJ1ZjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvRmlsZVN5bnRoZXNpc1JlcXVlc3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvRmlsZVN5bnRoZXNpc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiZTJiZi4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL0ZpbGVTeW50aGVzaXNSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90Ci0gKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotICogdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCi0gKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKLSAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCi0gKiB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnNwZWVjaC50dHM7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotCi0vKioKLSAqIFNwZWVjaCBzeW50aGVzaXMgcmVxdWVzdCB0aGF0IHdyaXRlcyB0aGUgYXVkaW8gdG8gYSBXQVYgZmlsZS4KLSAqLwotY2xhc3MgRmlsZVN5bnRoZXNpc1JlcXVlc3QgZXh0ZW5kcyBTeW50aGVzaXNSZXF1ZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRmlsZVN5bnRoZXNpc1JlcXVlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FVRElPX0JVRkZFUl9TSVpFID0gODE5MjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQVZfSEVBREVSX0xFTkdUSCA9IDQ0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IFdBVl9GT1JNQVRfUENNID0gMHgwMDAxOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVN0YXRlTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgbUZpbGVOYW1lOwotICAgIHByaXZhdGUgaW50IG1TYW1wbGVSYXRlSW5IejsKLSAgICBwcml2YXRlIGludCBtQXVkaW9Gb3JtYXQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUNoYW5uZWxDb3VudDsKLSAgICBwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgbUZpbGU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TdG9wcGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lID0gZmFsc2U7Ci0KLSAgICBGaWxlU3ludGhlc2lzUmVxdWVzdChTdHJpbmcgdGV4dCwgQnVuZGxlIHBhcmFtcywgRmlsZSBmaWxlTmFtZSkgewotICAgICAgICBzdXBlcih0ZXh0LCBwYXJhbXMpOwotICAgICAgICBtRmlsZU5hbWUgPSBmaWxlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewotICAgICAgICAgICAgbVN0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgY2xlYW5VcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyB0aGUgbW9uaXRvciBvbiB7QGxpbmsgI21TdGF0ZUxvY2t9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjbGVhblVwKCkgewotICAgICAgICBjbG9zZUZpbGUoKTsKLSAgICAgICAgaWYgKG1GaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GaWxlTmFtZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11c3QgYmUgY2FsbGVkIHdoaWxlIGhvbGRpbmcgdGhlIG1vbml0b3Igb24ge0BsaW5rICNtU3RhdGVMb2NrfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VGaWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1GaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIG1GaWxlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBjbG9zZSAiICsgbUZpbGVOYW1lICsgIjogIiArIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4QnVmZmVyU2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIE1BWF9BVURJT19CVUZGRVJfU0laRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBib29sZWFuIGlzRG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Eb25lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc3RhcnQoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiRmlsZVN5bnRoZXNpc1JlcXVlc3Quc3RhcnQoIiArIHNhbXBsZVJhdGVJbkh6ICsgIiwiICsgYXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBjaGFubmVsQ291bnQgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewotICAgICAgICAgICAgaWYgKG1TdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiUmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWxlU3ludGhlc2lzUmVxdWVzdC5zdGFydCgpIGNhbGxlZCB0d2ljZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNhbXBsZVJhdGVJbkh6ID0gc2FtcGxlUmF0ZUluSHo7Ci0gICAgICAgICAgICBtQXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdDsKLSAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1GaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobUZpbGVOYW1lLCAicnciKTsKLSAgICAgICAgICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBXQVYgaGVhZGVyCi0gICAgICAgICAgICAgICAgbUZpbGUud3JpdGUobmV3IGJ5dGVbV0FWX0hFQURFUl9MRU5HVEhdKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBvcGVuICIgKyBtRmlsZU5hbWUgKyAiOiAiICsgZXgpOwotICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBhdWRpb0F2YWlsYWJsZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkZpbGVTeW50aGVzaXNSZXF1ZXN0LmF1ZGlvQXZhaWxhYmxlKCIgKyBidWZmZXIgKyAiLCIgKyBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBsZW5ndGggKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewotICAgICAgICAgICAgaWYgKG1TdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiUmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZpbGUgbm90IG9wZW4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtRmlsZS53cml0ZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB3cml0ZSB0byAiICsgbUZpbGVOYW1lICsgIjogIiArIGV4KTsKLSAgICAgICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZG9uZSgpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiRmlsZVN5bnRoZXNpc1JlcXVlc3QuZG9uZSgpIik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewotICAgICAgICAgICAgaWYgKG1TdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiUmVxdWVzdCBoYXMgYmVlbiBhYm9ydGVkLiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZpbGUgbm90IG9wZW4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBXcml0ZSBXQVYgaGVhZGVyIGF0IHN0YXJ0IG9mIGZpbGUKLSAgICAgICAgICAgICAgICBtRmlsZS5zZWVrKDApOwotICAgICAgICAgICAgICAgIGludCBkYXRhTGVuZ3RoID0gKGludCkgKG1GaWxlLmxlbmd0aCgpIC0gV0FWX0hFQURFUl9MRU5HVEgpOwotICAgICAgICAgICAgICAgIG1GaWxlLndyaXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVdhdkhlYWRlcihtU2FtcGxlUmF0ZUluSHosIG1BdWRpb0Zvcm1hdCwgbUNoYW5uZWxDb3VudCwgZGF0YUxlbmd0aCkpOwotICAgICAgICAgICAgICAgIGNsb3NlRmlsZSgpOwotICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byB3cml0ZSB0byAiICsgbUZpbGVOYW1lICsgIjogIiArIGV4KTsKLSAgICAgICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVycm9yKCkgewotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJGaWxlU3ludGhlc2lzUmVxdWVzdC5lcnJvcigpIik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewotICAgICAgICAgICAgY2xlYW5VcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBjb21wbGV0ZUF1ZGlvQXZhaWxhYmxlKGludCBzYW1wbGVSYXRlSW5IeiwgaW50IGF1ZGlvRm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0ZUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtU3RvcHBlZCkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1GaWxlTmFtZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGUobWFrZVdhdkhlYWRlcihzYW1wbGVSYXRlSW5IeiwgYXVkaW9Gb3JtYXQsIGNoYW5uZWxDb3VudCwgbGVuZ3RoKSk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gd3JpdGUgdG8gIiArIG1GaWxlTmFtZSArICI6ICIgKyBleCk7Ci0gICAgICAgICAgICBtRmlsZU5hbWUuZGVsZXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY2xvc2UgIiArIG1GaWxlTmFtZSArICI6ICIgKyBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJ5dGVbXSBtYWtlV2F2SGVhZGVyKGludCBzYW1wbGVSYXRlSW5IeiwgaW50IGF1ZGlvRm9ybWF0LCBpbnQgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgaW50IGRhdGFMZW5ndGgpIHsKLSAgICAgICAgLy8gVE9ETzogaXMgQXVkaW9Gb3JtYXQuRU5DT0RJTkdfREVGQVVMVCBhbHdheXMgdGhlIHNhbWUgYXMgRU5DT0RJTkdfUENNXzE2QklUPwotICAgICAgICBpbnQgc2FtcGxlU2l6ZUluQnl0ZXMgPSAoYXVkaW9Gb3JtYXQgPT0gQXVkaW9Gb3JtYXQuRU5DT0RJTkdfUENNXzhCSVQgPyAxIDogMik7Ci0gICAgICAgIGludCBieXRlUmF0ZSA9IHNhbXBsZVJhdGVJbkh6ICogc2FtcGxlU2l6ZUluQnl0ZXMgKiBjaGFubmVsQ291bnQ7Ci0gICAgICAgIHNob3J0IGJsb2NrQWxpZ24gPSAoc2hvcnQpIChzYW1wbGVTaXplSW5CeXRlcyAqIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgIHNob3J0IGJpdHNQZXJTYW1wbGUgPSAoc2hvcnQpIChzYW1wbGVTaXplSW5CeXRlcyAqIDgpOwotCi0gICAgICAgIGJ5dGVbXSBoZWFkZXJCdWYgPSBuZXcgYnl0ZVtXQVZfSEVBREVSX0xFTkdUSF07Ci0gICAgICAgIEJ5dGVCdWZmZXIgaGVhZGVyID0gQnl0ZUJ1ZmZlci53cmFwKGhlYWRlckJ1Zik7Ci0gICAgICAgIGhlYWRlci5vcmRlcihCeXRlT3JkZXIuTElUVExFX0VORElBTik7Ci0KLSAgICAgICAgaGVhZGVyLnB1dChuZXcgYnl0ZVtdeyAnUicsICdJJywgJ0YnLCAnRicgfSk7Ci0gICAgICAgIGhlYWRlci5wdXRJbnQoZGF0YUxlbmd0aCArIFdBVl9IRUFERVJfTEVOR1RIIC0gOCk7ICAvLyBSSUZGIGNodW5rIHNpemUKLSAgICAgICAgaGVhZGVyLnB1dChuZXcgYnl0ZVtdeyAnVycsICdBJywgJ1YnLCAnRScgfSk7Ci0gICAgICAgIGhlYWRlci5wdXQobmV3IGJ5dGVbXXsgJ2YnLCAnbScsICd0JywgJyAnIH0pOwotICAgICAgICBoZWFkZXIucHV0SW50KDE2KTsgIC8vIHNpemUgb2YgZm10IGNodW5rCi0gICAgICAgIGhlYWRlci5wdXRTaG9ydChXQVZfRk9STUFUX1BDTSk7Ci0gICAgICAgIGhlYWRlci5wdXRTaG9ydCgoc2hvcnQpIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgIGhlYWRlci5wdXRJbnQoc2FtcGxlUmF0ZUluSHopOwotICAgICAgICBoZWFkZXIucHV0SW50KGJ5dGVSYXRlKTsKLSAgICAgICAgaGVhZGVyLnB1dFNob3J0KGJsb2NrQWxpZ24pOwotICAgICAgICBoZWFkZXIucHV0U2hvcnQoYml0c1BlclNhbXBsZSk7Ci0gICAgICAgIGhlYWRlci5wdXQobmV3IGJ5dGVbXXsgJ2QnLCAnYScsICd0JywgJ2EnIH0pOwotICAgICAgICBoZWFkZXIucHV0SW50KGRhdGFMZW5ndGgpOwotCi0gICAgICAgIHJldHVybiBoZWFkZXJCdWY7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL01lc3NhZ2VQYXJhbXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvTWVzc2FnZVBhcmFtcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWI2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL01lc3NhZ2VQYXJhbXMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc3BlZWNoLnR0czsKKworaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2hTZXJ2aWNlLlV0dGVyYW5jZUNvbXBsZXRlZERpc3BhdGNoZXI7CisKK2Fic3RyYWN0IGNsYXNzIE1lc3NhZ2VQYXJhbXMgeworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TWU5USEVTSVMgPSAxOworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BVURJTyA9IDI7CisgICAgc3RhdGljIGZpbmFsIGludCBUWVBFX1NJTEVOQ0UgPSAzOworCisgICAgcHJpdmF0ZSBmaW5hbCBVdHRlcmFuY2VDb21wbGV0ZWREaXNwYXRjaGVyIG1EaXNwYXRjaGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DYWxsaW5nQXBwOworCisgICAgTWVzc2FnZVBhcmFtcyhVdHRlcmFuY2VDb21wbGV0ZWREaXNwYXRjaGVyIGRpc3BhdGNoZXIsIFN0cmluZyBjYWxsaW5nQXBwKSB7CisgICAgICAgIG1EaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsKKyAgICAgICAgbUNhbGxpbmdBcHAgPSBjYWxsaW5nQXBwOworICAgIH0KKworICAgIFV0dGVyYW5jZUNvbXBsZXRlZERpc3BhdGNoZXIgZ2V0RGlzcGF0Y2hlcigpIHsKKyAgICAgICAgcmV0dXJuIG1EaXNwYXRjaGVyOworICAgIH0KKworICAgIFN0cmluZyBnZXRDYWxsaW5nQXBwKCkgeworICAgICAgICByZXR1cm4gbUNhbGxpbmdBcHA7CisgICAgfQorCisgICAgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvUGxheWJhY2tTeW50aGVzaXNDYWxsYmFjay5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9QbGF5YmFja1N5bnRoZXNpc0NhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhYTFiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvUGxheWJhY2tTeW50aGVzaXNDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc3BlZWNoLnR0czsKKworaW1wb3J0IGFuZHJvaWQuc3BlZWNoLnR0cy5UZXh0VG9TcGVlY2hTZXJ2aWNlLlV0dGVyYW5jZUNvbXBsZXRlZERpc3BhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBTcGVlY2ggc3ludGhlc2lzIHJlcXVlc3QgdGhhdCBwbGF5cyB0aGUgYXVkaW8gYXMgaXQgaXMgcmVjZWl2ZWQuCisgKi8KK2NsYXNzIFBsYXliYWNrU3ludGhlc2lzQ2FsbGJhY2sgZXh0ZW5kcyBBYnN0cmFjdFN5bnRoZXNpc0NhbGxiYWNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGxheWJhY2tTeW50aGVzaXNSZXF1ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9BVURJT19CVUZGRVJfU0laRSA9IDgxOTI7CisKKyAgICAvKioKKyAgICAgKiBBdWRpbyBzdHJlYW0gdHlwZS4gTXVzdCBiZSBvbmUgb2YgdGhlIFNUUkVBTV8gY29udGFudHMgZGVmaW5lZCBpbgorICAgICAqIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0cmVhbVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBWb2x1bWUsIGluIHRoZSByYW5nZSBbMC4wZiwgMS4wZl0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisgICAgICoge0BsaW5rIFRleHRUb1NwZWVjaC5FbmdpbmUjREVGQVVMVF9WT0xVTUV9ICgxLjBmKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1Wb2x1bWU7CisKKyAgICAvKioKKyAgICAgKiBMZWZ0L3JpZ2h0IHBvc2l0aW9uIG9mIHRoZSBhdWRpbywgaW4gdGhlIHJhbmdlIFstMS4wZiwgMS4wZl0uCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIFRleHRUb1NwZWVjaC5FbmdpbmUjREVGQVVMVF9QQU59ICgwLjBmKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1QYW47CisKKyAgICAvKioKKyAgICAgKiBHdWFyZHMge0BsaW5rICNtQXVkaW9UcmFja0hhbmRsZXJ9LCB7QGxpbmsgI21Ub2tlbn0gYW5kIHtAbGluayAjbVN0b3BwZWR9LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1TdGF0ZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvLyBIYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCBhIHRocmVhZCB0aGF0IHBsYXlzIGJhY2sgYXVkaW8gcmVxdWVzdHMuCisgICAgcHJpdmF0ZSBmaW5hbCBBdWRpb1BsYXliYWNrSGFuZGxlciBtQXVkaW9UcmFja0hhbmRsZXI7CisgICAgLy8gQSByZXF1ZXN0ICJ0b2tlbiIsIHdoaWNoIHdpbGwgYmUgbm9uIG51bGwgYWZ0ZXIgc3RhcnQoKSBvcgorICAgIC8vIGNvbXBsZXRlQXVkaW9BdmFpbGFibGUoKSBoYXZlIGJlZW4gY2FsbGVkLgorICAgIHByaXZhdGUgU3ludGhlc2lzTWVzc2FnZVBhcmFtcyBtVG9rZW4gPSBudWxsOworICAgIC8vIFdoZXRoZXIgdGhpcyByZXF1ZXN0IGhhcyBiZWVuIHN0b3BwZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBrZWVwaW5nCisgICAgLy8gdHJhY2sgd2hldGhlciBzdG9wKCkgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSBzdGFydCgpLiBJbiBhbGwgb3RoZXIgY2FzZXMsCisgICAgLy8gYSBub24tbnVsbCB2YWx1ZSBvZiBtVG9rZW4gd2lsbCBwcm92aWRlIHRoZSBzYW1lIGluZm9ybWF0aW9uLgorICAgIHByaXZhdGUgYm9vbGVhbiBtU3RvcHBlZCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Eb25lID0gZmFsc2U7CisKKyAgICBwcml2YXRlIGZpbmFsIFV0dGVyYW5jZUNvbXBsZXRlZERpc3BhdGNoZXIgbURpc3BhdGNoZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUNhbGxpbmdBcHA7CisKKyAgICBQbGF5YmFja1N5bnRoZXNpc0NhbGxiYWNrKGludCBzdHJlYW1UeXBlLCBmbG9hdCB2b2x1bWUsIGZsb2F0IHBhbiwKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tIYW5kbGVyIGF1ZGlvVHJhY2tIYW5kbGVyLCBVdHRlcmFuY2VDb21wbGV0ZWREaXNwYXRjaGVyIGRpc3BhdGNoZXIsCisgICAgICAgICAgICBTdHJpbmcgY2FsbGluZ0FwcCkgeworICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgIG1Wb2x1bWUgPSB2b2x1bWU7CisgICAgICAgIG1QYW4gPSBwYW47CisgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlciA9IGF1ZGlvVHJhY2tIYW5kbGVyOworICAgICAgICBtRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7CisgICAgICAgIG1DYWxsaW5nQXBwID0gY2FsbGluZ0FwcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHN0b3AoKSB7CisgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgInN0b3AoKSIpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgeworICAgICAgICAgICAgaWYgKG1Ub2tlbiA9PSBudWxsIHx8IG1TdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3RvcCgpIGNhbGxlZCB0d2ljZSwgYmVmb3JlIHN0YXJ0KCksIG9yIGFmdGVyIGRvbmUoKSIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5zdG9wKG1Ub2tlbik7CisgICAgICAgICAgICBtVG9rZW4gPSBudWxsOworICAgICAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRNYXhCdWZmZXJTaXplKCkgeworICAgICAgICAvLyBUaGUgQXVkaW9UcmFjayBidWZmZXIgd2lsbCBiZSBhdCBsZWFzdCBNSU5fQVVESU9fQlVGRkVSX1NJWkUsIHNvIHRoYXQgc2hvdWxkIGFsd2F5cyBiZQorICAgICAgICAvLyBhIHNhZmUgYnVmZmVyIHNpemUgdG8gcGFzcyBpbi4KKyAgICAgICAgcmV0dXJuIE1JTl9BVURJT19CVUZGRVJfU0laRTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIGlzRG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIG1Eb25lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc3RhcnQoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RhcnQoIiArIHNhbXBsZVJhdGVJbkh6ICsgIiwiICsgYXVkaW9Gb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBjaGFubmVsQ291bnQgKyAiKSIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNoYW5uZWxDb25maWcgPSBBdWRpb1BsYXliYWNrSGFuZGxlci5nZXRDaGFubmVsQ29uZmlnKGNoYW5uZWxDb3VudCk7CisgICAgICAgIGlmIChjaGFubmVsQ29uZmlnID09IDApIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyA6IiArIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJzdG9wKCkgY2FsbGVkIGJlZm9yZSBzdGFydCgpLCByZXR1cm5pbmcuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMgcGFyYW1zID0gbmV3IFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBzYW1wbGVSYXRlSW5IeiwgYXVkaW9Gb3JtYXQsIGNoYW5uZWxDb3VudCwgbVZvbHVtZSwgbVBhbiwKKyAgICAgICAgICAgICAgICAgICAgbURpc3BhdGNoZXIsIG1DYWxsaW5nQXBwKTsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5lbnF1ZXVlU3ludGhlc2lzU3RhcnQocGFyYW1zKTsKKworICAgICAgICAgICAgbVRva2VuID0gcGFyYW1zOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5TVUNDRVNTOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBhdWRpb0F2YWlsYWJsZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGlmIChEQkcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImF1ZGlvQXZhaWxhYmxlKGJ5dGVbIiArIGJ1ZmZlci5sZW5ndGggKyAiXSwiCisgICAgICAgICAgICAgICAgICAgICsgb2Zmc2V0ICsgIiwiICsgbGVuZ3RoICsgIikiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuZ3RoID4gZ2V0TWF4QnVmZmVyU2l6ZSgpIHx8IGxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXIgaXMgdG9vIGxhcmdlIG9yIG9mIHplcm8gbGVuZ3RoICgiICsKKyAgICAgICAgICAgICAgICAgICAgKyBsZW5ndGggKyAiIGJ5dGVzKSIpOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobVRva2VuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTaWdoLCBhbm90aGVyIGNvcHkuCisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyQ29weSA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgb2Zmc2V0LCBidWZmZXJDb3B5LCAwLCBsZW5ndGgpOworICAgICAgICAgICAgbVRva2VuLmFkZEJ1ZmZlcihidWZmZXJDb3B5KTsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5lbnF1ZXVlU3ludGhlc2lzRGF0YUF2YWlsYWJsZShtVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5TVUNDRVNTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZG9uZSgpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZG9uZSgpIik7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7CisgICAgICAgICAgICBpZiAobURvbmUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEdXBsaWNhdGUgY2FsbCB0byBkb25lKCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRG9uZSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChtVG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5lbnF1ZXVlU3ludGhlc2lzRG9uZShtVG9rZW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlcnJvcigpIHsKKyAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiZXJyb3IoKSBbd2lsbCBjYWxsIHN0b3BdIik7CisgICAgICAgIHN0b3AoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBsZXRlQXVkaW9BdmFpbGFibGUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIGludCBjaGFubmVsQ29uZmlnID0gQXVkaW9QbGF5YmFja0hhbmRsZXIuZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsQ291bnQpOworICAgICAgICBpZiAoY2hhbm5lbENvbmZpZyA9PSAwKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgOiIgKyBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBieXRlc1BlckZyYW1lID0gQXVkaW9QbGF5YmFja0hhbmRsZXIuZ2V0Qnl0ZXNQZXJGcmFtZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIGlmIChieXRlc1BlckZyYW1lIDwgMCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IDoiICsgYXVkaW9Gb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgeworICAgICAgICAgICAgaWYgKG1TdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMgcGFyYW1zID0gbmV3IFN5bnRoZXNpc01lc3NhZ2VQYXJhbXMoCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBzYW1wbGVSYXRlSW5IeiwgYXVkaW9Gb3JtYXQsIGNoYW5uZWxDb3VudCwgbVZvbHVtZSwgbVBhbiwKKyAgICAgICAgICAgICAgICAgICAgbURpc3BhdGNoZXIsIG1DYWxsaW5nQXBwKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGRCdWZmZXIoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5lbnF1ZXVlU3ludGhlc2lzQ29tcGxldGVEYXRhQXZhaWxhYmxlKHBhcmFtcyk7CisgICAgICAgICAgICBtVG9rZW4gPSBwYXJhbXM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1BsYXliYWNrU3ludGhlc2lzUmVxdWVzdC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9QbGF5YmFja1N5bnRoZXNpc1JlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5OGI1NC4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1BsYXliYWNrU3ludGhlc2lzUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAotICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSAqIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAotICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCi0gKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgotICogdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgYW5kcm9pZC5zcGVlY2gudHRzOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogU3BlZWNoIHN5bnRoZXNpcyByZXF1ZXN0IHRoYXQgcGxheXMgdGhlIGF1ZGlvIGFzIGl0IGlzIHJlY2VpdmVkLgotICovCi1jbGFzcyBQbGF5YmFja1N5bnRoZXNpc1JlcXVlc3QgZXh0ZW5kcyBTeW50aGVzaXNSZXF1ZXN0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGxheWJhY2tTeW50aGVzaXNSZXF1ZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9BVURJT19CVUZGRVJfU0laRSA9IDgxOTI7Ci0KLSAgICAvKioKLSAgICAgKiBBdWRpbyBzdHJlYW0gdHlwZS4gTXVzdCBiZSBvbmUgb2YgdGhlIFNUUkVBTV8gY29udGFudHMgZGVmaW5lZCBpbgotICAgICAqIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVN0cmVhbVR5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBWb2x1bWUsIGluIHRoZSByYW5nZSBbMC4wZiwgMS4wZl0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICoge0BsaW5rIFRleHRUb1NwZWVjaC5FbmdpbmUjREVGQVVMVF9WT0xVTUV9ICgxLjBmKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1Wb2x1bWU7Ci0KLSAgICAvKioKLSAgICAgKiBMZWZ0L3JpZ2h0IHBvc2l0aW9uIG9mIHRoZSBhdWRpbywgaW4gdGhlIHJhbmdlIFstMS4wZiwgMS4wZl0uCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIFRleHRUb1NwZWVjaC5FbmdpbmUjREVGQVVMVF9QQU59ICgwLjBmKS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1QYW47Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtU3RhdGVMb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtQXVkaW9UcmFja0hhbmRsZXI7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBBdWRpb1RyYWNrIG1BdWRpb1RyYWNrID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0b3BwZWQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURvbmUgPSBmYWxzZTsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbVdyaXRlRXJyb3JPY2N1cmVkOwotCi0gICAgUGxheWJhY2tTeW50aGVzaXNSZXF1ZXN0KFN0cmluZyB0ZXh0LCBCdW5kbGUgcGFyYW1zLAotICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsIGZsb2F0IHZvbHVtZSwgZmxvYXQgcGFuLCBIYW5kbGVyIGF1ZGlvVHJhY2tIYW5kbGVyKSB7Ci0gICAgICAgIHN1cGVyKHRleHQsIHBhcmFtcyk7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKLSAgICAgICAgbVZvbHVtZSA9IHZvbHVtZTsKLSAgICAgICAgbVBhbiA9IHBhbjsKLSAgICAgICAgbUF1ZGlvVHJhY2tIYW5kbGVyID0gYXVkaW9UcmFja0hhbmRsZXI7Ci0gICAgICAgIG1Xcml0ZUVycm9yT2NjdXJlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAic3RvcCgpIik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRlTG9jaykgewotICAgICAgICAgICAgbVN0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgY2xlYW5VcCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQWx3YXlzIGd1YXJkZWQgYnkgbVN0YXRlTG9jay4KLSAgICBwcml2YXRlIHZvaWQgY2xlYW5VcCgpIHsKLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiY2xlYW5VcCgpIik7Ci0gICAgICAgIGlmIChtQXVkaW9UcmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjazsKLSAgICAgICAgbUF1ZGlvVHJhY2sgPSBudWxsOwotCi0gICAgICAgIC8vIENsZWFuIHVwIG9uIHRoZSBhdWRpb3RyYWNrIGhhbmRsZXIgdGhyZWFkLgotICAgICAgICAvLwotICAgICAgICAvLyBOT1RFOiBJdCBpc24ndCB2ZXJ5IGNsZWFyIHdoZXRoZXIgQXVkaW9UcmFjayBpcyB0aHJlYWQgc2FmZS4KLSAgICAgICAgLy8gSWYgaXQgaXMgd2UgY2FuIGNsZWFuIHVwIG9uIHRoZSBjdXJyZW50IChzeW50aGVzaXMpIHRocmVhZC4KLSAgICAgICAgbUF1ZGlvVHJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9UcmFjay5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2suc3RvcCgpOwotICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE1heEJ1ZmZlclNpemUoKSB7Ci0gICAgICAgIC8vIFRoZSBBdWRpb1RyYWNrIGJ1ZmZlciB3aWxsIGJlIGF0IGxlYXN0IE1JTl9BVURJT19CVUZGRVJfU0laRSwgc28gdGhhdCBzaG91bGQgYWx3YXlzIGJlCi0gICAgICAgIC8vIGEgc2FmZSBidWZmZXIgc2l6ZSB0byBwYXNzIGluLgotICAgICAgICByZXR1cm4gTUlOX0FVRElPX0JVRkZFUl9TSVpFOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gaXNEb25lKCkgewotICAgICAgICByZXR1cm4gbURvbmU7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogYWRkIGEgdGhyZWFkIHRoYXQgd3JpdGVzIHRvIHRoZSBBdWRpb1RyYWNrPwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc3RhcnQoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3RhcnQoIiArIHNhbXBsZVJhdGVJbkh6ICsgIiwiICsgYXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBjaGFubmVsQ291bnQgKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RhcnQoKSBjYWxsZWQgdHdpY2UiKTsKLSAgICAgICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUF1ZGlvVHJhY2sgPSBjcmVhdGVTdHJlYW1pbmdBdWRpb1RyYWNrKHNhbXBsZVJhdGVJbkh6LCBhdWRpb0Zvcm1hdCwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBWb2x1bWUoQXVkaW9UcmFjayBhdWRpb1RyYWNrLCBmbG9hdCB2b2x1bWUsIGZsb2F0IHBhbikgewotICAgICAgICBmbG9hdCB2b2wgPSBjbGlwKHZvbHVtZSwgMC4wZiwgMS4wZik7Ci0gICAgICAgIGZsb2F0IHBhbm5pbmcgPSBjbGlwKHBhbiwgLTEuMGYsIDEuMGYpOwotICAgICAgICBmbG9hdCB2b2xMZWZ0ID0gdm9sOwotICAgICAgICBmbG9hdCB2b2xSaWdodCA9IHZvbDsKLSAgICAgICAgaWYgKHBhbm5pbmcgPiAwLjBmKSB7Ci0gICAgICAgICAgICB2b2xMZWZ0ICo9ICgxLjBmIC0gcGFubmluZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFubmluZyA8IDAuMGYpIHsKLSAgICAgICAgICAgIHZvbFJpZ2h0ICo9ICgxLjBmICsgcGFubmluZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAidm9sTGVmdD0iICsgdm9sTGVmdCArICIsdm9sUmlnaHQ9IiArIHZvbFJpZ2h0KTsKLSAgICAgICAgaWYgKGF1ZGlvVHJhY2suc2V0U3RlcmVvVm9sdW1lKHZvbExlZnQsIHZvbFJpZ2h0KSAhPSBBdWRpb1RyYWNrLlNVQ0NFU1MpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzZXQgdm9sdW1lIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZsb2F0IGNsaXAoZmxvYXQgdmFsdWUsIGZsb2F0IG1pbiwgZmxvYXQgbWF4KSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA+IG1heCA/IG1heCA6ICh2YWx1ZSA8IG1pbiA/IG1pbiA6IHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGF1ZGlvQXZhaWxhYmxlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYXVkaW9BdmFpbGFibGUoYnl0ZVsiICsgYnVmZmVyLmxlbmd0aCArICJdLCIKLSAgICAgICAgICAgICAgICAgICAgKyBvZmZzZXQgKyAiLCIgKyBsZW5ndGggKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW5ndGggPiBnZXRNYXhCdWZmZXJTaXplKCkgfHwgbGVuZ3RoIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJ1ZmZlciBpcyB0b28gbGFyZ2Ugb3Igb2YgemVybyBsZW5ndGggKCIgKwotICAgICAgICAgICAgICAgICAgICArIGxlbmd0aCArICIgYnl0ZXMpIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVdyaXRlRXJyb3JPY2N1cmVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiRXJyb3Igd3JpdGluZyB0byBhdWRpbyB0cmFjaywgY291bnQgPCAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RvcHBlZCkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJhdWRpb0F2YWlsYWJsZSgpOiBOb3Qgc3RhcnRlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBtQXVkaW9UcmFjazsKLSAgICAgICAgICAgIC8vIFNpZ2gsIGFub3RoZXIgY29weS4KLSAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXJDb3B5ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBvZmZzZXQsIGJ1ZmZlckNvcHksIDAsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwbGF5U3RhdGUgPSBhdWRpb1RyYWNrLmdldFBsYXlTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGxheVN0YXRlID09IEF1ZGlvVHJhY2suUExBWVNUQVRFX1NUT1BQRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIkF1ZGlvVHJhY2sgc3RvcHBlZCwgcmVzdGFydGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9UcmFjay5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbG9vcCB1bnRpbCBhbGwgZGF0YSBpcyB3cml0dGVuPwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJBdWRpb1RyYWNrLndyaXRlKCkiKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gYXVkaW9UcmFjay53cml0ZShidWZmZXJDb3B5LCAwLCBidWZmZXJDb3B5Lmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBjaGFuZ2UgdmVyeSBzbGlnaHRseS4gRWFybGllciwgd2Ugd291bGQKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGFuIGVycm9yIGltbWVkaWF0ZWx5LCBOb3cgd2Ugd2lsbCByZXR1cm4gYW4gZXJyb3Igb24KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgQVBJIGNhbGwsIHVzdWFsbHkgZG9uZSggKSBvciBhbm90aGVyIGF1ZGlvQXZhaWxhYmxlKCApCi0gICAgICAgICAgICAgICAgICAgIC8vIGNhbGwuCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUVycm9yT2NjdXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5TVUNDRVNTOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBkb25lKCkgewotICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJkb25lKCkiKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVdyaXRlRXJyb3JPY2N1cmVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiRXJyb3Igd3JpdGluZyB0byBhdWRpbyB0cmFjaywgY291bnQgPCAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU3RvcHBlZCkgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIlJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJkb25lKCk6IE5vdCBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIGNsZWFuVXAoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZXJyb3IoKSB7Ci0gICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgImVycm9yKCkiKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7Ci0gICAgICAgICAgICBjbGVhblVwKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvbXBsZXRlQXVkaW9BdmFpbGFibGUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQsCi0gICAgICAgICAgICBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImNvbXBsZXRlQXVkaW9BdmFpbGFibGUoIiArIHNhbXBsZVJhdGVJbkh6ICsgIiwiICsgYXVkaW9Gb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCIgKyBjaGFubmVsQ291bnQgKyAiYnl0ZVsiICsgYnVmZmVyLmxlbmd0aCArICJdLCIKLSAgICAgICAgICAgICAgICAgICAgKyBvZmZzZXQgKyAiLCIgKyBsZW5ndGggKyAiKSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtU3RhdGVMb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJSZXF1ZXN0IGhhcyBiZWVuIGFib3J0ZWQuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQXVkaW9UcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAic3RhcnQoKSBjYWxsZWQgYmVmb3JlIGNvbXBsZXRlQXVkaW9BdmFpbGFibGUoKSIpOwotICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvbmZpZyA9IGdldENoYW5uZWxDb25maWcoY2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsQ29uZmlnIDwgMCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyA6IiArIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICAgICAgY2xlYW5VcCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYnl0ZXNQZXJGcmFtZSA9IGdldEJ5dGVzUGVyRnJhbWUoYXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgaWYgKGJ5dGVzUGVyRnJhbWUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IDoiICsgYXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKG1TdHJlYW1UeXBlLCBzYW1wbGVSYXRlSW5IeiwgY2hhbm5lbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsIGJ1ZmZlci5sZW5ndGgsIEF1ZGlvVHJhY2suTU9ERV9TVEFUSUMpOwotICAgICAgICAgICAgaWYgKG1BdWRpb1RyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLndyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIHNldHVwVm9sdW1lKG1BdWRpb1RyYWNrLCBtVm9sdW1lLCBtUGFuKTsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgYmxvY2tVbnRpbERvbmUobUF1ZGlvVHJhY2ssIGJ5dGVzUGVyRnJhbWUsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbURvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgIldyb3RlIGRhdGEgdG8gYXVkaW8gdHJhY2sgc3VjY2VzZnVsbHkgOiAiICsgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBsYXliYWNrIGVycm9yIiwgZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGNsZWFuVXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmxvY2tVbnRpbERvbmUoQXVkaW9UcmFjayBhdWRpb1RyYWNrLCBpbnQgYnl0ZXNQZXJGcmFtZSwgaW50IGxlbmd0aCkgewotICAgICAgICBpbnQgbGVuZ3RoSW5GcmFtZXMgPSBsZW5ndGggLyBieXRlc1BlckZyYW1lOwotICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gMDsKLSAgICAgICAgd2hpbGUgKChjdXJyZW50UG9zaXRpb24gPSBhdWRpb1RyYWNrLmdldFBsYXliYWNrSGVhZFBvc2l0aW9uKCkpIDwgbGVuZ3RoSW5GcmFtZXMpIHsKLSAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkVGltZU1zID0gKChsZW5ndGhJbkZyYW1lcyAtIGN1cnJlbnRQb3NpdGlvbikgKiAxMDAwKSAvCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2suZ2V0U2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiQWJvdXQgdG8gc2xlZXAgZm9yIDogIiArIGVzdGltYXRlZFRpbWVNcyArICIgbXMsIiArCi0gICAgICAgICAgICAgICAgICAgICIgUGxheWJhY2sgcG9zaXRpb24gOiAiICsgY3VycmVudFBvc2l0aW9uKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKGVzdGltYXRlZFRpbWVNcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Qnl0ZXNQZXJGcmFtZShpbnQgYXVkaW9Gb3JtYXQpIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEF1ZGlvRm9ybWF0LkVOQ09ESU5HX1BDTV84QklUKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfSBlbHNlIGlmIChhdWRpb0Zvcm1hdCA9PSBBdWRpb0Zvcm1hdC5FTkNPRElOR19QQ01fMTZCSVQpIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldENoYW5uZWxDb25maWcoaW50IGNoYW5uZWxDb3VudCkgewotICAgICAgICBpZiAoY2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiBBdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF9NT05POwotICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxDb3VudCA9PSAyKXsKLSAgICAgICAgICAgIHJldHVybiBBdWRpb0Zvcm1hdC5DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBdWRpb1RyYWNrIGNyZWF0ZVN0cmVhbWluZ0F1ZGlvVHJhY2soaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50KSB7Ci0gICAgICAgIGludCBjaGFubmVsQ29uZmlnID0gZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsQ291bnQpOwotCi0gICAgICAgIGlmIChjaGFubmVsQ29uZmlnIDwgMCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzIDogIiArIGNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtaW5CdWZmZXJTaXplSW5CeXRlcwotICAgICAgICAgICAgICAgID0gQXVkaW9UcmFjay5nZXRNaW5CdWZmZXJTaXplKHNhbXBsZVJhdGVJbkh6LCBjaGFubmVsQ29uZmlnLCBhdWRpb0Zvcm1hdCk7Ci0gICAgICAgIGludCBidWZmZXJTaXplSW5CeXRlcyA9IE1hdGgubWF4KE1JTl9BVURJT19CVUZGRVJfU0laRSwgbWluQnVmZmVyU2l6ZUluQnl0ZXMpOwotICAgICAgICBBdWRpb1RyYWNrIGF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjayhtU3RyZWFtVHlwZSwgc2FtcGxlUmF0ZUluSHosIGNoYW5uZWxDb25maWcsCi0gICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsIGJ1ZmZlclNpemVJbkJ5dGVzLCBBdWRpb1RyYWNrLk1PREVfU1RSRUFNKTsKLSAgICAgICAgaWYgKGF1ZGlvVHJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXVkaW9UcmFjay5nZXRTdGF0ZSgpICE9IEF1ZGlvVHJhY2suU1RBVEVfSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgIGF1ZGlvVHJhY2sucmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0dXBWb2x1bWUoYXVkaW9UcmFjaywgbVZvbHVtZSwgbVBhbik7Ci0gICAgICAgIHJldHVybiBhdWRpb1RyYWNrOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU2lsZW5jZU1lc3NhZ2VQYXJhbXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU2lsZW5jZU1lc3NhZ2VQYXJhbXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTRmZjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9TaWxlbmNlTWVzc2FnZVBhcmFtcy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zcGVlY2gudHRzOworCitpbXBvcnQgYW5kcm9pZC5vcy5Db25kaXRpb25WYXJpYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnNwZWVjaC50dHMuVGV4dFRvU3BlZWNoU2VydmljZS5VdHRlcmFuY2VDb21wbGV0ZWREaXNwYXRjaGVyOworCitjbGFzcyBTaWxlbmNlTWVzc2FnZVBhcmFtcyBleHRlbmRzIE1lc3NhZ2VQYXJhbXMgeworICAgIHByaXZhdGUgZmluYWwgQ29uZGl0aW9uVmFyaWFibGUgbUNvbmRWYXIgPSBuZXcgQ29uZGl0aW9uVmFyaWFibGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbVNpbGVuY2VEdXJhdGlvbk1zOworCisgICAgU2lsZW5jZU1lc3NhZ2VQYXJhbXMoVXR0ZXJhbmNlQ29tcGxldGVkRGlzcGF0Y2hlciBkaXNwYXRjaGVyLAorICAgICAgICAgICAgU3RyaW5nIGNhbGxpbmdBcHAsIGxvbmcgc2lsZW5jZUR1cmF0aW9uTXMpIHsKKyAgICAgICAgc3VwZXIoZGlzcGF0Y2hlciwgY2FsbGluZ0FwcCk7CisgICAgICAgIG1TaWxlbmNlRHVyYXRpb25NcyA9IHNpbGVuY2VEdXJhdGlvbk1zOworICAgIH0KKworICAgIGxvbmcgZ2V0U2lsZW5jZUR1cmF0aW9uTXMoKSB7CisgICAgICAgIHJldHVybiBtU2lsZW5jZUR1cmF0aW9uTXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUWVBFX1NJTEVOQ0U7CisgICAgfQorCisgICAgQ29uZGl0aW9uVmFyaWFibGUgZ2V0Q29uZGl0aW9uVmFyaWFibGUoKSB7CisgICAgICAgIHJldHVybiBtQ29uZFZhcjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU3ludGhlc2lzQ2FsbGJhY2suamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU3ludGhlc2lzQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjgwZTQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9TeW50aGVzaXNDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc3BlZWNoLnR0czsKKworLyoqCisgKiBBIGNhbGxiYWNrIHRvIHJldHVybiBzcGVlY2ggZGF0YSBzeW50aGVzaXplZCBieSBhIHRleHQgdG8gc3BlZWNoIGVuZ2luZS4KKyAqCisgKiBUaGUgZW5naW5lIGNhbiBwcm92aWRlIHN0cmVhbWluZyBhdWRpbyBieSBjYWxsaW5nCisgKiB7QGxpbmsgI3N0YXJ0fSwgdGhlbiB7QGxpbmsgI2F1ZGlvQXZhaWxhYmxlfSB1bnRpbCBhbGwgYXVkaW8gaGFzIGJlZW4gcHJvdmlkZWQsIHRoZW4gZmluYWxseQorICoge0BsaW5rICNkb25lfS4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgZW5naW5lIGNhbiBwcm92aWRlIGFsbCB0aGUgYXVkaW8gYXQgb25jZSwgYnkgdXNpbmcKKyAqIHtAbGluayAjY29tcGxldGVBdWRpb0F2YWlsYWJsZX0uCisgKgorICoge0BsaW5rICNlcnJvcn0gY2FuIGJlIGNhbGxlZCBhdCBhbnkgc3RhZ2UgaW4gdGhlIHN5bnRoZXNpcyBwcm9jZXNzIHRvCisgKiBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cmVkLCBidXQgaWYgdGhlIGNhbGwgaXMgbWFkZSBhZnRlciBhIGNhbGwKKyAqIHRvIHtAbGluayAjZG9uZX0gb3Ige0BsaW5rICNjb21wbGV0ZUF1ZGlvQXZhaWxhYmxlfSBpdCBtaWdodCBiZSBkaXNjYXJkZWQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3ludGhlc2lzQ2FsbGJhY2sgeworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIFRUUyBlbmdpbmUgY2FuIHBhc3MgaW4gYSBzaW5nbGUgY2FsbCBvZgorICAgICAqICAgICAgICAge0BsaW5rICNhdWRpb0F2YWlsYWJsZX0uIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8ge0BsaW5rICNjb21wbGV0ZUF1ZGlvQXZhaWxhYmxlfS4KKyAgICAgKiAgICAgICAgIENhbGxzIHRvIHtAbGluayAjYXVkaW9BdmFpbGFibGV9IHdpdGggZGF0YSBsZW5ndGhzIGxhcmdlciB0aGFuIHRoaXMKKyAgICAgKiAgICAgICAgIHZhbHVlIHdpbGwgbm90IHN1Y2NlZWQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhCdWZmZXJTaXplKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSBzaG91bGQgY2FsbCB0aGlzIHdoZW4gaXQgc3RhcnRzIHRvIHN5bnRoZXNpemUgYXVkaW8gZm9yIHRoaXMKKyAgICAgKiByZXF1ZXN0LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBzeW50aGVzaXMgdGhyZWFkLAorICAgICAqIHdoaWxlIGluIHtAbGluayBUZXh0VG9TcGVlY2hTZXJ2aWNlI29uU3ludGhlc2l6ZVRleHR9LgorICAgICAqCisgICAgICogQHBhcmFtIHNhbXBsZVJhdGVJbkh6IFNhbXBsZSByYXRlIGluIEhaIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uCisgICAgICogQHBhcmFtIGF1ZGlvRm9ybWF0IEF1ZGlvIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLiBNdXN0IGJlIG9uZSBvZgorICAgICAqICAgICAgICAgdGhlIEVOQ09ESU5HXyBjb25zdGFudHMgZGVmaW5lZCBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdH0uCisgICAgICogQHBhcmFtIGNoYW5uZWxDb3VudCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzLiBNdXN0IGJlIHtAY29kZSAxfSBvciB7QGNvZGUgMn0uCisgICAgICogQHJldHVybiB7QGxpbmsgVGV4dFRvU3BlZWNoI1NVQ0NFU1N9IG9yIHtAbGluayBUZXh0VG9TcGVlY2gjRVJST1J9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc3RhcnQoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsIGludCBjaGFubmVsQ291bnQpOworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZpY2Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBzeW50aGVzaXplZCBhdWRpbyBpcyByZWFkeSBmb3IgY29uc3VtcHRpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gdGhlIHN5bnRoZXNpcyB0aHJlYWQsCisgICAgICogd2hpbGUgaW4ge0BsaW5rIFRleHRUb1NwZWVjaFNlcnZpY2Ujb25TeW50aGVzaXplVGV4dH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBnZW5lcmF0ZWQgYXVkaW8gZGF0YS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgaG9sZCBvbiB0byB7QGNvZGUgYnVmZmVyfSwKKyAgICAgKiAgICAgICAgIHNvIHRoZSBjYWxsZXIgaXMgZnJlZSB0byBtb2RpZnkgaXQgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB7QGNvZGUgYnVmZmVyfSB3aGVyZSB0aGUgYXVkaW8gZGF0YSBzdGFydHMuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGF1ZGlvIGRhdGEgaW4ge0Bjb2RlIGJ1ZmZlcn0uIFRoaXMgbXVzdCBiZQorICAgICAqICAgICAgICAgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSByZXR1cm4gdmFsdWUgb2Yge0BsaW5rICNnZXRNYXhCdWZmZXJTaXplfS4KKyAgICAgKiBAcmV0dXJuIHtAbGluayBUZXh0VG9TcGVlY2gjU1VDQ0VTU30gb3Ige0BsaW5rIFRleHRUb1NwZWVjaCNFUlJPUn0uCisgICAgICovCisgICAgcHVibGljIGludCBhdWRpb0F2YWlsYWJsZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIFRoZSBzZXJ2aWNlIGNhbiBjYWxsIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdXNpbmcge0BsaW5rICNzdGFydH0sIHtAbGluayAjYXVkaW9BdmFpbGFibGV9CisgICAgICogYW5kIHtAbGluayAjZG9uZX0gaWYgYWxsIHRoZSBhdWRpbyBkYXRhIGlzIGF2YWlsYWJsZSBpbiBhIHNpbmdsZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZUluSHogU2FtcGxlIHJhdGUgaW4gSFogb2YgdGhlIGdlbmVyYXRlZCBhdWRpby4KKyAgICAgKiBAcGFyYW0gYXVkaW9Gb3JtYXQgQXVkaW8gZm9ybWF0IG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uIE11c3QgYmUgb25lIG9mCisgICAgICogICAgICAgICB0aGUgRU5DT0RJTkdfIGNvbnN0YW50cyBkZWZpbmVkIGluIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9ybWF0fS4KKyAgICAgKiBAcGFyYW0gY2hhbm5lbENvdW50IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMuIE11c3QgYmUge0Bjb2RlIDF9IG9yIHtAY29kZSAyfS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBnZW5lcmF0ZWQgYXVkaW8gZGF0YS4gVGhpcyBtZXRob2Qgd2lsbCBub3QgaG9sZCBvbiB0byB7QGNvZGUgYnVmZmVyfSwKKyAgICAgKiAgICAgICAgIHNvIHRoZSBjYWxsZXIgaXMgZnJlZSB0byBtb2RpZnkgaXQgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW50byB7QGNvZGUgYnVmZmVyfSB3aGVyZSB0aGUgYXVkaW8gZGF0YSBzdGFydHMuCisgICAgICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGF1ZGlvIGRhdGEgaW4ge0Bjb2RlIGJ1ZmZlcn0uCisgICAgICogQHJldHVybiB7QGxpbmsgVGV4dFRvU3BlZWNoI1NVQ0NFU1N9IG9yIHtAbGluayBUZXh0VG9TcGVlY2gjRVJST1J9LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGxldGVBdWRpb0F2YWlsYWJsZShpbnQgc2FtcGxlUmF0ZUluSHosIGludCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogVGhlIHNlcnZpY2Ugc2hvdWxkIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBhbGwgdGhlIHN5bnRoZXNpemVkIGF1ZGlvIGZvciBhIHJlcXVlc3QgaGFzCisgICAgICogYmVlbiBwYXNzZWQgdG8ge0BsaW5rICNhdWRpb0F2YWlsYWJsZX0uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gdGhlIHN5bnRoZXNpcyB0aHJlYWQsCisgICAgICogd2hpbGUgaW4ge0BsaW5rIFRleHRUb1NwZWVjaFNlcnZpY2Ujb25TeW50aGVzaXplVGV4dH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayBUZXh0VG9TcGVlY2gjU1VDQ0VTU30gb3Ige0BsaW5rIFRleHRUb1NwZWVjaCNFUlJPUn0uCisgICAgICovCisgICAgcHVibGljIGludCBkb25lKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2VydmljZSBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBpZiB0aGUgc3BlZWNoIHN5bnRoZXNpcyBmYWlscy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgc3ludGhlc2lzIHRocmVhZCwKKyAgICAgKiB3aGlsZSBpbiB7QGxpbmsgVGV4dFRvU3BlZWNoU2VydmljZSNvblN5bnRoZXNpemVUZXh0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlcnJvcigpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9TeW50aGVzaXNNZXNzYWdlUGFyYW1zLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1N5bnRoZXNpc01lc3NhZ2VQYXJhbXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWYzZDJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9TeW50aGVzaXNNZXNzYWdlUGFyYW1zLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNwZWVjaC50dHM7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2s7CitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaFNlcnZpY2UuVXR0ZXJhbmNlQ29tcGxldGVkRGlzcGF0Y2hlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworCisvKioKKyAqIFBhcmFtcyByZXF1aXJlZCB0byBwbGF5IGJhY2sgYSBzeW50aGVzaXMgcmVxdWVzdC4KKyAqLworZmluYWwgY2xhc3MgU3ludGhlc2lzTWVzc2FnZVBhcmFtcyBleHRlbmRzIE1lc3NhZ2VQYXJhbXMgeworICAgIGZpbmFsIGludCBtU3RyZWFtVHlwZTsKKyAgICBmaW5hbCBpbnQgbVNhbXBsZVJhdGVJbkh6OworICAgIGZpbmFsIGludCBtQXVkaW9Gb3JtYXQ7CisgICAgZmluYWwgaW50IG1DaGFubmVsQ291bnQ7CisgICAgZmluYWwgZmxvYXQgbVZvbHVtZTsKKyAgICBmaW5hbCBmbG9hdCBtUGFuOworCisgICAgcHVibGljIHZvbGF0aWxlIEF1ZGlvVHJhY2sgbUF1ZGlvVHJhY2s7CisKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8TGlzdEVudHJ5PiBtRGF0YUJ1ZmZlckxpc3QgPSBuZXcgTGlua2VkTGlzdDxMaXN0RW50cnk+KCk7CisKKyAgICBTeW50aGVzaXNNZXNzYWdlUGFyYW1zKGludCBzdHJlYW1UeXBlLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGludCBhdWRpb0Zvcm1hdCwgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgZmxvYXQgcGFuLCBVdHRlcmFuY2VDb21wbGV0ZWREaXNwYXRjaGVyIGRpc3BhdGNoZXIsCisgICAgICAgICAgICBTdHJpbmcgY2FsbGluZ0FwcCkgeworICAgICAgICBzdXBlcihkaXNwYXRjaGVyLCBjYWxsaW5nQXBwKTsKKworICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgIG1TYW1wbGVSYXRlSW5IeiA9IHNhbXBsZVJhdGU7CisgICAgICAgIG1BdWRpb0Zvcm1hdCA9IGF1ZGlvRm9ybWF0OworICAgICAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworICAgICAgICBtVm9sdW1lID0gdm9sdW1lOworICAgICAgICBtUGFuID0gcGFuOworCisgICAgICAgIC8vIGluaXRpYWxseSBudWxsLgorICAgICAgICBtQXVkaW9UcmFjayA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUWVBFX1NZTlRIRVNJUzsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBhZGRCdWZmZXIoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBtRGF0YUJ1ZmZlckxpc3QuYWRkKG5ldyBMaXN0RW50cnkoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCkpOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIGFkZEJ1ZmZlcihieXRlW10gYnVmZmVyKSB7CisgICAgICAgIG1EYXRhQnVmZmVyTGlzdC5hZGQobmV3IExpc3RFbnRyeShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKTsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgTGlzdEVudHJ5IGdldE5leHRCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBtRGF0YUJ1ZmZlckxpc3QucG9sbCgpOworICAgIH0KKworCisgICAgdm9pZCBzZXRBdWRpb1RyYWNrKEF1ZGlvVHJhY2sgYXVkaW9UcmFjaykgeworICAgICAgICBtQXVkaW9UcmFjayA9IGF1ZGlvVHJhY2s7CisgICAgfQorCisgICAgQXVkaW9UcmFjayBnZXRBdWRpb1RyYWNrKCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvVHJhY2s7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIExpc3RFbnRyeSB7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBtQnl0ZXM7CisgICAgICAgIGZpbmFsIGludCBtT2Zmc2V0OworICAgICAgICBmaW5hbCBpbnQgbUxlbmd0aDsKKworICAgICAgICBMaXN0RW50cnkoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgICAgICBtQnl0ZXMgPSBieXRlczsKKyAgICAgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1N5bnRoZXNpc1JlcXVlc3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU3ludGhlc2lzUmVxdWVzdC5qYXZhCmluZGV4IDU3YWUxMGQuLjYzOThkM2QgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU3ludGhlc2lzUmVxdWVzdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvU3ludGhlc2lzUmVxdWVzdC5qYXZhCkBAIC0xOCwxNyArMTgsMjIgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIAogLyoqCi0gKiBBIHJlcXVlc3QgZm9yIHNwZWVjaCBzeW50aGVzaXMgZ2l2ZW4gdG8gYSBUVFMgZW5naW5lIGZvciBwcm9jZXNzaW5nLgorICogQ29udGFpbnMgZGF0YSByZXF1aXJlZCBieSBlbmdpbmVzIHRvIHN5bnRoZXNpemUgc3BlZWNoLiBUaGlzIGRhdGEgaXMgOgorICogPHVsPgorICogICA8bGk+VGhlIHRleHQgdG8gc3ludGhlc2l6ZTwvbGk+CisgKiAgIDxsaT5UaGUgc3ludGhlc2lzIGxvY2FsZSwgcmVwcmVzZW50ZWQgYXMgYSBsYW5ndWFnZSwgY291bnRyeSBhbmQgYSB2YXJpYW50LgorICogICBUaGUgbGFuZ3VhZ2UgaXMgYW4gSVNPIDYzOS0zIGxldHRlciBsYW5ndWFnZSBjb2RlLCBhbmQgdGhlIGNvdW50cnkgaXMgYW4KKyAqICAgSVNPIDMxNjYgYWxwaGEgMyBjb2RlLiBUaGUgdmFyaWFudCBpcyBub3Qgc3BlY2lmaWVkLjwvbGk+CisgKiAgIDxsaT5UaGUgc3ludGhlc2lzIHNwZWVjaCByYXRlLCB3aXRoIDEwMCBiZWluZyB0aGUgbm9ybWFsLCBhbmQKKyAqICAgaGlnaGVyIHZhbHVlcyByZXByZXNlbnRpbmcgaGlnaGVyIHNwZWVjaCByYXRlcy48L2xpPgorICogICA8bGk+VGhlIHZvaWNlIHBpdGNoLCB3aXRoIDEwMCBiZWluZyB0aGUgZGVmYXVsdCBwaXRjaC48L2xpPgorICogPC91bD4KICAqCi0gKiBUaGUgZW5naW5lIGNhbiBwcm92aWRlIHN0cmVhbWluZyBhdWRpbyBieSBjYWxsaW5nCi0gKiB7QGxpbmsgI3N0YXJ0fSwgdGhlbiB7QGxpbmsgI2F1ZGlvQXZhaWxhYmxlfSB1bnRpbCBhbGwgYXVkaW8gaGFzIGJlZW4gcHJvdmlkZWQsIHRoZW4gZmluYWxseQotICoge0BsaW5rICNkb25lfS4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGUgZW5naW5lIGNhbiBwcm92aWRlIGFsbCB0aGUgYXVkaW8gYXQgb25jZSwgYnkgdXNpbmcKLSAqIHtAbGluayAjY29tcGxldGVBdWRpb0F2YWlsYWJsZX0uCisgKiBBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHNlbnQgdG8gdGhlIHRleHQgdG8gc3BlZWNoIHNlcnZpY2UgYXJlIHBhc3NlZCBpbgorICogdW5pbnRlcnByZXRlZCwgc2VlIHRoZSBAY29kZXtwYXJhbXN9IGFyZ3VtZW50IGluIHtAbGluayBUZXh0VG9TcGVlY2gjc3BlYWt9CisgKiBhbmQge0BsaW5rIFRleHRUb1NwZWVjaCNzeW50aGVzaXplVG9GaWxlfS4KICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN5bnRoZXNpc1JlcXVlc3QgewotCitwdWJsaWMgZmluYWwgY2xhc3MgU3ludGhlc2lzUmVxdWVzdCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVRleHQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbVBhcmFtczsKICAgICBwcml2YXRlIFN0cmluZyBtTGFuZ3VhZ2U7CkBAIC0zOSwzMyArNDQsMTEgQEAKIAogICAgIHB1YmxpYyBTeW50aGVzaXNSZXF1ZXN0KFN0cmluZyB0ZXh0LCBCdW5kbGUgcGFyYW1zKSB7CiAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgLy8gTWFrZXMgYSBjb3B5IG9mIHBhcmFtcy4KICAgICAgICAgbVBhcmFtcyA9IG5ldyBCdW5kbGUocGFyYW1zKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBsb2NhbGUgZm9yIHRoZSByZXF1ZXN0LgotICAgICAqLwotICAgIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgY291bnRyeSwgU3RyaW5nIHZhcmlhbnQpIHsKLSAgICAgICAgbUxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0gICAgICAgIG1Db3VudHJ5ID0gY291bnRyeTsKLSAgICAgICAgbVZhcmlhbnQgPSB2YXJpYW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHNwZWVjaCByYXRlLgotICAgICAqLwotICAgIHZvaWQgc2V0U3BlZWNoUmF0ZShpbnQgc3BlZWNoUmF0ZSkgewotICAgICAgICBtU3BlZWNoUmF0ZSA9IHNwZWVjaFJhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGl0Y2guCi0gICAgICovCi0gICAgdm9pZCBzZXRQaXRjaChpbnQgcGl0Y2gpIHsKLSAgICAgICAgbVBpdGNoID0gcGl0Y2g7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0cyB0aGUgdGV4dCB3aGljaCBzaG91bGQgYmUgc3ludGhlc2l6ZWQuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewpAQCAtMTE1LDg2ICs5OCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgdGhlIFRUUyBlbmdpbmUgY2FuIHBhc3MgaW4gYSBzaW5nbGUgY2FsbCBvZgotICAgICAqIHtAbGluayAjYXVkaW9BdmFpbGFibGV9LiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIHtAbGluayAjY29tcGxldGVBdWRpb0F2YWlsYWJsZX0uCisgICAgICogU2V0cyB0aGUgbG9jYWxlIGZvciB0aGUgcmVxdWVzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldE1heEJ1ZmZlclNpemUoKTsKKyAgICB2b2lkIHNldExhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGNvdW50cnksIFN0cmluZyB2YXJpYW50KSB7CisgICAgICAgIG1MYW5ndWFnZSA9IGxhbmd1YWdlOworICAgICAgICBtQ291bnRyeSA9IGNvdW50cnk7CisgICAgICAgIG1WYXJpYW50ID0gdmFyaWFudDsKKyAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3ludGhlc2lzIHJlcXVlc3QgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBTZXRzIHRoZSBzcGVlY2ggcmF0ZS4KICAgICAgKi8KLSAgICBhYnN0cmFjdCBib29sZWFuIGlzRG9uZSgpOworICAgIHZvaWQgc2V0U3BlZWNoUmF0ZShpbnQgc3BlZWNoUmF0ZSkgeworICAgICAgICBtU3BlZWNoUmF0ZSA9IHNwZWVjaFJhdGU7CisgICAgfQogCiAgICAgLyoqCi0gICAgICogQWJvcnRzIHRoZSBzcGVlY2ggcmVxdWVzdC4KLSAgICAgKgotICAgICAqIENhbiBiZSBjYWxsZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqIFNldHMgdGhlIHBpdGNoLgogICAgICAqLwotICAgIGFic3RyYWN0IHZvaWQgc3RvcCgpOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNlcnZpY2Ugc2hvdWxkIGNhbGwgdGhpcyB3aGVuIGl0IHN0YXJ0cyB0byBzeW50aGVzaXplIGF1ZGlvIGZvciB0aGlzCi0gICAgICogcmVxdWVzdC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgc3ludGhlc2lzIHRocmVhZCwKLSAgICAgKiB3aGlsZSBpbiB7QGxpbmsgVGV4dFRvU3BlZWNoU2VydmljZSNvblN5bnRoZXNpemVUZXh0fS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlSW5IeiBTYW1wbGUgcmF0ZSBpbiBIWiBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLgotICAgICAqIEBwYXJhbSBhdWRpb0Zvcm1hdCBBdWRpbyBmb3JtYXQgb2YgdGhlIGdlbmVyYXRlZCBhdWRpby4gTXVzdCBiZSBvbmUgb2YKLSAgICAgKiAgICAgICAgIHRoZSBFTkNPRElOR18gY29uc3RhbnRzIGRlZmluZWQgaW4ge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9Gb3JtYXR9LgotICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQgVGhlIG51bWJlciBvZiBjaGFubmVscy4gTXVzdCBiZSB7QGNvZGUgMX0gb3Ige0Bjb2RlIDJ9LgotICAgICAqIEByZXR1cm4ge0BsaW5rIFRleHRUb1NwZWVjaCNTVUNDRVNTfSBvciB7QGxpbmsgVGV4dFRvU3BlZWNoI0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXJ0KGludCBzYW1wbGVSYXRlSW5IeiwgaW50IGF1ZGlvRm9ybWF0LCBpbnQgY2hhbm5lbENvdW50KTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gc3ludGhlc2l6ZWQgYXVkaW8gaXMgcmVhZHkgZm9yIGNvbnN1bXB0aW9uLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBzeW50aGVzaXMgdGhyZWFkLAotICAgICAqIHdoaWxlIGluIHtAbGluayBUZXh0VG9TcGVlY2hTZXJ2aWNlI29uU3ludGhlc2l6ZVRleHR9LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1ZmZlciBUaGUgZ2VuZXJhdGVkIGF1ZGlvIGRhdGEuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGhvbGQgb24gdG8ge0Bjb2RlIGJ1ZmZlcn0sCi0gICAgICogICAgICAgICBzbyB0aGUgY2FsbGVyIGlzIGZyZWUgdG8gbW9kaWZ5IGl0IGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8ge0Bjb2RlIGJ1ZmZlcn0gd2hlcmUgdGhlIGF1ZGlvIGRhdGEgc3RhcnRzLgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyBvZiBhdWRpbyBkYXRhIGluIHtAY29kZSBidWZmZXJ9LiBUaGlzIG11c3QgYmUKLSAgICAgKiAgICAgICAgIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayAjZ2V0TWF4QnVmZmVyU2l6ZX0uCi0gICAgICogQHJldHVybiB7QGxpbmsgVGV4dFRvU3BlZWNoI1NVQ0NFU1N9IG9yIHtAbGluayBUZXh0VG9TcGVlY2gjRVJST1J9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgYXVkaW9BdmFpbGFibGUoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuIGFsbCB0aGUgc3ludGhlc2l6ZWQgYXVkaW8gZm9yIGEgcmVxdWVzdCBoYXMKLSAgICAgKiBiZWVuIHBhc3NlZCB0byB7QGxpbmsgI2F1ZGlvQXZhaWxhYmxlfS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiB0aGUgc3ludGhlc2lzIHRocmVhZCwKLSAgICAgKiB3aGlsZSBpbiB7QGxpbmsgVGV4dFRvU3BlZWNoU2VydmljZSNvblN5bnRoZXNpemVUZXh0fS4KLSAgICAgKgotICAgICAqIEByZXR1cm4ge0BsaW5rIFRleHRUb1NwZWVjaCNTVUNDRVNTfSBvciB7QGxpbmsgVGV4dFRvU3BlZWNoI0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGRvbmUoKTsKLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBzcGVlY2ggc3ludGhlc2lzIGZhaWxzLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBzeW50aGVzaXMgdGhyZWFkLAotICAgICAqIHdoaWxlIGluIHtAbGluayBUZXh0VG9TcGVlY2hTZXJ2aWNlI29uU3ludGhlc2l6ZVRleHR9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGVycm9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIHVzaW5nIHtAbGluayAjc3RhcnR9LCB7QGxpbmsgI2F1ZGlvQXZhaWxhYmxlfQotICAgICAqIGFuZCB7QGxpbmsgI2RvbmV9IGlmIGFsbCB0aGUgYXVkaW8gZGF0YSBpcyBhdmFpbGFibGUgaW4gYSBzaW5nbGUgYnVmZmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHNhbXBsZVJhdGVJbkh6IFNhbXBsZSByYXRlIGluIEhaIG9mIHRoZSBnZW5lcmF0ZWQgYXVkaW8uCi0gICAgICogQHBhcmFtIGF1ZGlvRm9ybWF0IEF1ZGlvIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIGF1ZGlvLiBNdXN0IGJlIG9uZSBvZgotICAgICAqICAgICAgICAgdGhlIEVOQ09ESU5HXyBjb25zdGFudHMgZGVmaW5lZCBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0Zvcm1hdH0uCi0gICAgICogQHBhcmFtIGNoYW5uZWxDb3VudCBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzLiBNdXN0IGJlIHtAY29kZSAxfSBvciB7QGNvZGUgMn0uCi0gICAgICogQHBhcmFtIGJ1ZmZlciBUaGUgZ2VuZXJhdGVkIGF1ZGlvIGRhdGEuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGhvbGQgb24gdG8ge0Bjb2RlIGJ1ZmZlcn0sCi0gICAgICogICAgICAgICBzbyB0aGUgY2FsbGVyIGlzIGZyZWUgdG8gbW9kaWZ5IGl0IGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCi0gICAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8ge0Bjb2RlIGJ1ZmZlcn0gd2hlcmUgdGhlIGF1ZGlvIGRhdGEgc3RhcnRzLgotICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyBvZiBhdWRpbyBkYXRhIGluIHtAY29kZSBidWZmZXJ9LgotICAgICAqIEByZXR1cm4ge0BsaW5rIFRleHRUb1NwZWVjaCNTVUNDRVNTfSBvciB7QGxpbmsgVGV4dFRvU3BlZWNoI0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGNvbXBsZXRlQXVkaW9BdmFpbGFibGUoaW50IHNhbXBsZVJhdGVJbkh6LCBpbnQgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LCBieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgdm9pZCBzZXRQaXRjaChpbnQgcGl0Y2gpIHsKKyAgICAgICAgbVBpdGNoID0gcGl0Y2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UZXh0VG9TcGVlY2guamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoLmphdmEKaW5kZXggNGIxOTQ2OS4uNDBlOTM1NSAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UZXh0VG9TcGVlY2guamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1RleHRUb1NwZWVjaC5qYXZhCkBAIC0yMiw5ICsyMiw2IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwpAQCAtMzQsOCArMzEsNiBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CkBAIC02NywxMiArNjIsMjIgQEAKICAgICAvKioKICAgICAgKiBRdWV1ZSBtb2RlIHdoZXJlIGFsbCBlbnRyaWVzIGluIHRoZSBwbGF5YmFjayBxdWV1ZSAobWVkaWEgdG8gYmUgcGxheWVkCiAgICAgICogYW5kIHRleHQgdG8gYmUgc3ludGhlc2l6ZWQpIGFyZSBkcm9wcGVkIGFuZCByZXBsYWNlZCBieSB0aGUgbmV3IGVudHJ5LgorICAgICAqIFF1ZXVlcyBhcmUgZmx1c2hlZCB3aXRoIHJlc3BlY3QgdG8gYSBnaXZlbiBjYWxsaW5nIGFwcC4gRW50cmllcyBpbiB0aGUgcXVldWUKKyAgICAgKiBmcm9tIG90aGVyIGNhbGxlZXMgYXJlIG5vdCBkaXNjYXJkZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVFVUVfRkxVU0ggPSAwOwogICAgIC8qKgogICAgICAqIFF1ZXVlIG1vZGUgd2hlcmUgdGhlIG5ldyBlbnRyeSBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwbGF5YmFjayBxdWV1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUVVRV9BREQgPSAxOworICAgIC8qKgorICAgICAqIFF1ZXVlIG1vZGUgd2hlcmUgdGhlIGVudGlyZSBwbGF5YmFjayBxdWV1ZSBpcyBwdXJnZWQuIFRoaXMgaXMgZGlmZmVyZW50CisgICAgICogZnJvbSB7QGxpbmsgI1FVRVVFX0ZMVVNIfSBpbiB0aGF0IGFsbCBlbnRyaWVzIGFyZSBwdXJnZWQsIG5vdCBqdXN0IGVudHJpZXMKKyAgICAgKiBmcm9tIGEgZ2l2ZW4gY2FsbGVyLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFFVRVVFX0RFU1RST1kgPSAyOwogCiAgICAgLyoqCiAgICAgICogRGVub3RlcyB0aGUgbGFuZ3VhZ2UgaXMgYXZhaWxhYmxlIGV4YWN0bHkgYXMgc3BlY2lmaWVkIGJ5IHRoZSBsb2NhbGUuCkBAIC0xNzQsMTAgKzE3OSwxNCBAQAogICAgICAgICAvKioKICAgICAgICAgICogUGFja2FnZSBuYW1lIG9mIHRoZSBkZWZhdWx0IFRUUyBlbmdpbmUuCiAgICAgICAgICAqCi0gICAgICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIGNvbWUgZnJvbSBhIHN5c3RlbSBwcm9wZXJ0eQotICAgICAgICAgKgogICAgICAgICAgKiBAaGlkZQorICAgICAgICAgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgaW4gdXNlLCB0aGUgZGVmYXVsdCBlbmdpbmUgaXMgZGV0ZXJtaW5lZCBieQorICAgICAgICAgKiAgICAgICAgIHRoZSBzb3J0IG9yZGVyIGRlZmluZWQgaW4ge0BsaW5rIEVuZ2luZUluZm9Db21wYXJhdG9yfS4gTm90ZSB0aGF0CisgICAgICAgICAqICAgICAgICAgdGhpcyBkb2Vzbid0ICJicmVhayIgYW55dGhpbmcgYmVjYXVzZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAorICAgICAgICAgKiAgICAgICAgIHRoZSBlbmdpbmUgc3BlY2lmaWVkIGJlbG93IGlzIGluc3RhbGxlZCBvbiBhIGdpdmVuIGJ1aWxkLCBsZXQKKyAgICAgICAgICogICAgICAgICBhbG9uZSBiZSB0aGUgZGVmYXVsdC4KICAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5HSU5FID0gImNvbS5zdm94LnBpY28iOwogCiAgICAgICAgIC8qKgpAQCAtNDI0LDYgKzQzMyw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBVcmk+IG1FYXJjb25zOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVXJpPiBtVXR0ZXJhbmNlczsKICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtUGFyYW1zID0gbmV3IEJ1bmRsZSgpOworICAgIHByaXZhdGUgZmluYWwgVHRzRW5naW5lcyBtRW5naW5lc0hlbHBlcjsKICAgICBwcml2YXRlIFN0cmluZyBtQ3VycmVudEVuZ2luZSA9IG51bGw7CiAKICAgICAvKioKQEAgLTQ1OSw2ICs0NjksNyBAQAogICAgICAgICBtRWFyY29ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVXJpPigpOwogICAgICAgICBtVXR0ZXJhbmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVXJpPigpOwogCisgICAgICAgIG1FbmdpbmVzSGVscGVyID0gbmV3IFR0c0VuZ2luZXMobUNvbnRleHQpOwogICAgICAgICBpbml0VHRzKCk7CiAgICAgfQogCkBAIC00ODcsMzEgKzQ5OCwzNSBAQAogICAgIHByaXZhdGUgaW50IGluaXRUdHMoKSB7CiAgICAgICAgIFN0cmluZyBkZWZhdWx0RW5naW5lID0gZ2V0RGVmYXVsdEVuZ2luZSgpOwogICAgICAgICBTdHJpbmcgZW5naW5lID0gZGVmYXVsdEVuZ2luZTsKLSAgICAgICAgaWYgKCFhcmVEZWZhdWx0c0VuZm9yY2VkKCkgJiYgIVRleHRVdGlscy5pc0VtcHR5KG1SZXF1ZXN0ZWRFbmdpbmUpCi0gICAgICAgICAgICAgICAgJiYgaXNFbmdpbmVFbmFibGVkKGVuZ2luZSkpIHsKKyAgICAgICAgaWYgKG1FbmdpbmVzSGVscGVyLmlzRW5naW5lSW5zdGFsbGVkKG1SZXF1ZXN0ZWRFbmdpbmUpKSB7CiAgICAgICAgICAgICBlbmdpbmUgPSBtUmVxdWVzdGVkRW5naW5lOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVHJ5IHJlcXVlc3RlZCBlbmdpbmUKICAgICAgICAgaWYgKGNvbm5lY3RUb0VuZ2luZShlbmdpbmUpKSB7CisgICAgICAgICAgICBtQ3VycmVudEVuZ2luZSA9IGVuZ2luZTsKICAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHVzZXIncyBkZWZhdWx0IGVuZ2luZSBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgYWxyZWFkeSB0ZXN0ZWQgb25lCiAgICAgICAgIGlmICghZW5naW5lLmVxdWFscyhkZWZhdWx0RW5naW5lKSkgewogICAgICAgICAgICAgaWYgKGNvbm5lY3RUb0VuZ2luZShkZWZhdWx0RW5naW5lKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50RW5naW5lID0gZW5naW5lOwogICAgICAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgZmluYWwgU3RyaW5nIGhpZ2hlc3RSYW5rZWQgPSBtRW5naW5lc0hlbHBlci5nZXRIaWdoZXN0UmFua2VkRW5naW5lTmFtZSgpOwogICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGhhcmRjb2RlZCBkZWZhdWx0IGlmIGRpZmZlcmVudCBmcm9tIHRoZSB0d28gYWJvdmUKLSAgICAgICAgaWYgKCFkZWZhdWx0RW5naW5lLmVxdWFscyhFbmdpbmUuREVGQVVMVF9FTkdJTkUpCi0gICAgICAgICAgICAgICAgJiYgIWVuZ2luZS5lcXVhbHMoRW5naW5lLkRFRkFVTFRfRU5HSU5FKSkgewotICAgICAgICAgICAgaWYgKGNvbm5lY3RUb0VuZ2luZShFbmdpbmUuREVGQVVMVF9FTkdJTkUpKSB7CisgICAgICAgIGlmICghZGVmYXVsdEVuZ2luZS5lcXVhbHMoaGlnaGVzdFJhbmtlZCkKKyAgICAgICAgICAgICAgICAmJiAhZW5naW5lLmVxdWFscyhoaWdoZXN0UmFua2VkKSkgeworICAgICAgICAgICAgaWYgKGNvbm5lY3RUb0VuZ2luZShoaWdoZXN0UmFua2VkKSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50RW5naW5lID0gZW5naW5lOwogICAgICAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgZGlzcGF0Y2hPbkluaXQoRVJST1IpOwogICAgICAgICByZXR1cm4gRVJST1I7CiAgICAgfQogCkBAIC01MjIsMTAgKzUzNyw5IEBACiAgICAgICAgIGJvb2xlYW4gYm91bmQgPSBtQ29udGV4dC5iaW5kU2VydmljZShpbnRlbnQsIGNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7CiAgICAgICAgIGlmICghYm91bmQpIHsKICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBiaW5kIHRvICIgKyBlbmdpbmUpOwotICAgICAgICAgICAgZGlzcGF0Y2hPbkluaXQoRVJST1IpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRFbmdpbmUgPSBlbmdpbmU7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNlc3NmdWxseSBib3VuZCB0byAiICsgZW5naW5lKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA0MCwxMyArMTA1NCwxNSBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIFRUUyBlbmdpbmUgdG8gdXNlLgogICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVGhpcyBkb2Vzbid0IGluZm9ybSBjYWxsZXJzIHdoZW4gdGhlIFRUUyBlbmdpbmUgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgaW5pdGlhbGl6ZWQuIHtAbGluayAjVGV4dFRvU3BlZWNoKENvbnRleHQsIE9uSW5pdExpc3RlbmVyLCBTdHJpbmcpfQorICAgICAqICAgICAgICBjYW4gYmUgdXNlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBlbmdpbmUgbmFtZS4KKyAgICAgKgogICAgICAqIEBwYXJhbSBlbmdpbmVQYWNrYWdlTmFtZSBUaGUgcGFja2FnZSBuYW1lIGZvciB0aGUgc3ludGhlc2lzIGVuZ2luZSAoZS5nLiAiY29tLnN2b3gucGljbyIpCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHtAbGluayAjRVJST1J9IG9yIHtAbGluayAjU1VDQ0VTU30uCiAgICAgICovCi0gICAgLy8gVE9ETzogYWRkIEBEZXByZWNhdGVke1RoaXMgbWV0aG9kIGRvZXMgbm90IHRlbGwgdGhlIGNhbGxlciB3aGVuIHRoZSBuZXcgZW5naW5lCi0gICAgLy8gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuIFlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IFRleHRUb1NwZWVjaCBvYmplY3Qgd2l0aCB0aGUgbmV3Ci0gICAgLy8gZW5naW5lIGluc3RlYWQufQorICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBzZXRFbmdpbmVCeVBhY2thZ2VOYW1lKFN0cmluZyBlbmdpbmVQYWNrYWdlTmFtZSkgewogICAgICAgICBtUmVxdWVzdGVkRW5naW5lID0gZW5naW5lUGFja2FnZU5hbWU7CiAgICAgICAgIHJldHVybiBpbml0VHRzKCk7CkBAIC0xMDU1LDcyICsxMDcxLDMyIEBACiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNwZWVjaCBzeW50aGVzaXMgZW5naW5lLgogICAgICAqCi0gICAgICogQHJldHVybiBQYWNrYWdlIG5hbWUgb2YgdGhlIFRUUyBlbmdpbmUgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuIGFzIHRoZWlyIGRlZmF1bHQuCisgICAgICogQHJldHVybiBQYWNrYWdlIG5hbWUgb2YgdGhlIFRUUyBlbmdpbmUgdGhhdCB0aGUgdXNlciBoYXMgY2hvc2VuCisgICAgICogICAgICAgIGFzIHRoZWlyIGRlZmF1bHQuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RW5naW5lKCkgewotICAgICAgICBTdHJpbmcgZW5naW5lID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVFRTX0RFRkFVTFRfU1lOVEgpOwotICAgICAgICByZXR1cm4gZW5naW5lICE9IG51bGwgPyBlbmdpbmUgOiBFbmdpbmUuREVGQVVMVF9FTkdJTkU7CisgICAgICAgIHJldHVybiBtRW5naW5lc0hlbHBlci5nZXREZWZhdWx0RW5naW5lKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVzZXIncyBzZXR0aW5ncyBzaG91bGQgb3ZlcnJpZGUgc2V0dGluZ3MgcmVxdWVzdGVkIGJ5IHRoZSBjYWxsaW5nCi0gICAgICogYXBwbGljYXRpb24uCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVzZXIncyBzZXR0aW5ncyBzaG91bGQgb3ZlcnJpZGUgc2V0dGluZ3MgcmVxdWVzdGVkCisgICAgICogYnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uIEFzIG9mIHRoZSBJY2UgY3JlYW0gc2FuZHdpY2ggcmVsZWFzZSwKKyAgICAgKiB1c2VyIHNldHRpbmdzIG5ldmVyIGZvcmNpYmx5IG92ZXJyaWRlIHRoZSBhcHAncyBzZXR0aW5ncy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBhcmVEZWZhdWx0c0VuZm9yY2VkKCkgewotICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVFRTX1VTRV9ERUZBVUxUUywgRW5naW5lLlVTRV9ERUZBVUxUUykgPT0gMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFbmdpbmVFbmFibGVkKFN0cmluZyBlbmdpbmUpIHsKLSAgICAgICAgaWYgKEVuZ2luZS5ERUZBVUxUX0VOR0lORS5lcXVhbHMoZW5naW5lKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgZW5hYmxlZCA6IGdldEVuYWJsZWRFbmdpbmVzKCkpIHsKLSAgICAgICAgICAgIGlmIChlbmdpbmUuZXF1YWxzKGVuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0RW5hYmxlZEVuZ2luZXMoKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5UVFNfRU5BQkxFRF9QTFVHSU5TKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHN0cikpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHIuc3BsaXQoIiAiKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXRzIGEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIFRUUyBlbmdpbmVzLgogICAgICAqCi0gICAgICogQHJldHVybiBBIGxpc3Qgb2YgZW5naW5lIGluZm8gb2JqZWN0cy4gVGhlIGxpc3QgY2FuIGJlIGVtcHR5LCBidXQgd2lsbCBuZXZlciBieSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBBIGxpc3Qgb2YgZW5naW5lIGluZm8gb2JqZWN0cy4gVGhlIGxpc3QgY2FuIGJlIGVtcHR5LCBidXQgbmV2ZXIge0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PEVuZ2luZUluZm8+IGdldEVuZ2luZXMoKSB7Ci0gICAgICAgIFBhY2thZ2VNYW5hZ2VyIHBtID0gbUNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoRW5naW5lLklOVEVOVF9BQ1RJT05fVFRTX1NFUlZJQ0UpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlSW5mb3MgPQotICAgICAgICAgICAgICAgIHBtLnF1ZXJ5SW50ZW50U2VydmljZXMoaW50ZW50LCBQYWNrYWdlTWFuYWdlci5NQVRDSF9ERUZBVUxUX09OTFkpOwotICAgICAgICBpZiAocmVzb2x2ZUluZm9zID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgTGlzdDxFbmdpbmVJbmZvPiBlbmdpbmVzID0gbmV3IEFycmF5TGlzdDxFbmdpbmVJbmZvPihyZXNvbHZlSW5mb3Muc2l6ZSgpKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IHJlc29sdmVJbmZvcykgewotICAgICAgICAgICAgU2VydmljZUluZm8gc2VydmljZSA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVuZ2luZUluZm8gZW5naW5lID0gbmV3IEVuZ2luZUluZm8oKTsKLSAgICAgICAgICAgICAgICAvLyBVc2luZyBqdXN0IHRoZSBwYWNrYWdlIG5hbWUgaXNuJ3QgZ3JlYXQsIHNpbmNlIGl0IGRpc2FsbG93cyBoYXZpbmcKLSAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBlbmdpbmVzIGluIHRoZSBzYW1lIHBhY2thZ2UsIGJ1dCB0aGF0J3Mgd2hhdCB0aGUgZXhpc3RpbmcgQVBJIGRvZXMuCi0gICAgICAgICAgICAgICAgZW5naW5lLm5hbWUgPSBzZXJ2aWNlLnBhY2thZ2VOYW1lOwotICAgICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBsYWJlbCA9IHNlcnZpY2UubG9hZExhYmVsKHBtKTsKLSAgICAgICAgICAgICAgICBlbmdpbmUubGFiZWwgPSBUZXh0VXRpbHMuaXNFbXB0eShsYWJlbCkgPyBlbmdpbmUubmFtZSA6IGxhYmVsLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgZW5naW5lLmljb24gPSBzZXJ2aWNlLmdldEljb25SZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGVuZ2luZXMuYWRkKGVuZ2luZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVuZ2luZXM7CisgICAgICAgIHJldHVybiBtRW5naW5lc0hlbHBlci5nZXRFbmdpbmVzKCk7CiAgICAgfQogCisKICAgICBwcml2YXRlIGNsYXNzIENvbm5lY3Rpb24gaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7CiAgICAgICAgIHByaXZhdGUgSVRleHRUb1NwZWVjaFNlcnZpY2UgbVNlcnZpY2U7CiAKQEAgLTExOTMsNiArMTE2OSwyMCBAQAogICAgICAgICAgKiBJY29uIGZvciB0aGUgZW5naW5lLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBpY29uOworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciB0aGlzIGVuZ2luZSBpcyBhIHBhcnQgb2YgdGhlIHN5c3RlbQorICAgICAgICAgKiBpbWFnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN5c3RlbTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwcmlvcml0eSB0aGUgZW5naW5lIGRlY2xhcmVzIGZvciB0aGUgdGhlIGludGVudCBmaWx0ZXIKKyAgICAgICAgICoge0Bjb2RlIGFuZHJvaWQuaW50ZW50LmFjdGlvbi5UVFNfU0VSVklDRX0KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgcHJpb3JpdHk7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0xMjAwLDQgKzExOTAsNSBAQAogICAgICAgICB9CiAKICAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3NwZWVjaC90dHMvVGV4dFRvU3BlZWNoU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UZXh0VG9TcGVlY2hTZXJ2aWNlLmphdmEKaW5kZXggNzE3ZGRlOC4uN2VhOTM3MyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UZXh0VG9TcGVlY2hTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UZXh0VG9TcGVlY2hTZXJ2aWNlLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkNvbmRpdGlvblZhcmlhYmxlOwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwpAQCAtNDAsOCArMzksMzQgQEAKIAogCiAvKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFRUUyBlbmdpbmUgaW1wbGVtZW50YXRpb25zLgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgVFRTIGVuZ2luZSBpbXBsZW1lbnRhdGlvbnMuIFRoZSBmb2xsb3dpbmcgbWV0aG9kcworICogbmVlZCB0byBiZSBpbXBsZW1lbnRlZC4KKyAqCisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgI29uSXNMYW5ndWFnZUF2YWlsYWJsZX08L2xpPgorICogICA8bGk+e0BsaW5rICNvbkxvYWRMYW5ndWFnZX08L2xpPgorICogICA8bGk+e0BsaW5rICNvbkdldExhbmd1YWdlfTwvbGk+CisgKiAgIDxsaT57QGxpbmsgI29uU3ludGhlc2l6ZVRleHR9PC9saT4KKyAqICAgPGxpPntAbGluayAjb25TdG9wfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIFRoZSBmaXJzdCB0aHJlZSBkZWFsIHByaW1hcmlseSB3aXRoIGxhbmd1YWdlIG1hbmFnZW1lbnQsIGFuZCBhcmUgdXNlZCB0bworICogcXVlcnkgdGhlIGVuZ2luZSBmb3IgaXQncyBzdXBwb3J0IGZvciBhIGdpdmVuIGxhbmd1YWdlIGFuZCBpbmRpY2F0ZSB0byBpdAorICogdGhhdCByZXF1ZXN0cyBpbiBhIGdpdmVuIGxhbmd1YWdlIGFyZSBpbW1pbmVudC4KKyAqCisgKiB7QGxpbmsgI29uU3ludGhlc2l6ZVRleHR9IGlzIGNlbnRyYWwgdG8gdGhlIGVuZ2luZSBpbXBsZW1lbnRhdGlvbi4gVGhlCisgKiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgc3ludGhlc2l6ZSB0ZXh0IGFzIHBlciB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGFuZAorICogcmV0dXJuIHN5bnRoZXNpemVkIGRhdGEgdmlhIHRoZSBzdXBwbGllZCBjYWxsYmFjay4gVGhpcyBjbGFzcyBhbmQgaXRzIGhlbHBlcnMKKyAqIHdpbGwgdGhlbiBjb25zdW1lIHRoYXQgZGF0YSwgd2hpY2ggbWlnaHQgbWVhbiBxdWV1ZWluZyBpdCBmb3IgcGxheWJhY2sgb3Igd3JpdGluZworICogaXQgdG8gYSBmaWxlIG9yIHNpbWlsYXIuIEFsbCBjYWxscyB0byB0aGlzIG1ldGhvZCB3aWxsIGJlIG9uIGEgc2luZ2xlCisgKiB0aHJlYWQsIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBzZXJ2aWNlLiBTeW50aGVzaXMKKyAqIG11c3QgYmUgc3luY2hyb25vdXMgd2hpY2ggbWVhbnMgdGhlIGVuZ2luZSBtdXN0IE5PVCBob2xkIG9uIHRoZSBjYWxsYmFjayBvciBjYWxsCisgKiBhbnkgbWV0aG9kcyBvbiBpdCBhZnRlciB0aGUgbWV0aG9kIHJldHVybnMKKyAqCisgKiB7QGxpbmsgI29uU3RvcH0gdGVsbHMgdGhlIGVuZ2luZSB0aGF0IGl0IHNob3VsZCBzdG9wIGFsbCBvbmdvaW5nIHN5bnRoZXNpcywgaWYKKyAqIGFueS4gQW55IHBlbmRpbmcgZGF0YSBmcm9tIHRoZSBjdXJyZW50IHN5bnRoZXNpcyB3aWxsIGJlIGRpc2NhcmRlZC4KICAqLworLy8gVE9ETzogQWRkIGEgbGluayB0byB0aGUgc2FtcGxlIFRUUyBlbmdpbmUgb25jZSBpdCdzIGRvbmUuCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGV4dFRvU3BlZWNoU2VydmljZSBleHRlbmRzIFNlcnZpY2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKQEAgLTUxLDEwICs3NiwxNSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5USF9USFJFQURfTkFNRSA9ICJTeW50aFRocmVhZCI7CiAKICAgICBwcml2YXRlIFN5bnRoSGFuZGxlciBtU3ludGhIYW5kbGVyOwotICAgIHByaXZhdGUgSGFuZGxlciBtQXVkaW9UcmFja0hhbmRsZXI7CisgICAgLy8gQSB0aHJlYWQgYW5kIGl0J3MgYXNzb2NpYXRlZCBoYW5kbGVyIGZvciBwbGF5aW5nIGJhY2sgYW55IGF1ZGlvCisgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgVFRTIGVuZ2luZS4gV2lsbCBoYW5kbGUgYWxsIHJlcXVlc3RzIGV4Y2VwdCBzeW50aGVzaXMKKyAgICAvLyB0byBmaWxlIHJlcXVlc3RzLCB3aGljaCBvY2N1ciBvbiB0aGUgc3ludGhlc2lzIHRocmVhZC4KKyAgICBwcml2YXRlIEF1ZGlvUGxheWJhY2tIYW5kbGVyIG1BdWRpb1BsYXliYWNrSGFuZGxlcjsKIAogICAgIHByaXZhdGUgQ2FsbGJhY2tNYXAgbUNhbGxiYWNrczsKIAorICAgIHByaXZhdGUgaW50IG1EZWZhdWx0QXZhaWxhYmlsaXR5ID0gVGV4dFRvU3BlZWNoLkxBTkdfTk9UX1NVUFBPUlRFRDsKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgewogICAgICAgICBpZiAoREJHKSBMb2cuZChUQUcsICJvbkNyZWF0ZSgpIik7CkBAIC02NCwxNCArOTQsMTQgQEAKICAgICAgICAgc3ludGhUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgbVN5bnRoSGFuZGxlciA9IG5ldyBTeW50aEhhbmRsZXIoc3ludGhUaHJlYWQuZ2V0TG9vcGVyKCkpOwogCi0gICAgICAgIEhhbmRsZXJUaHJlYWQgYXVkaW9UcmFja1RocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJUVFMuYXVkaW9UcmFja1RocmVhZCIpOwotICAgICAgICBhdWRpb1RyYWNrVGhyZWFkLnN0YXJ0KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlciA9IG5ldyBIYW5kbGVyKGF1ZGlvVHJhY2tUaHJlYWQuZ2V0TG9vcGVyKCkpOworICAgICAgICBtQXVkaW9QbGF5YmFja0hhbmRsZXIgPSBuZXcgQXVkaW9QbGF5YmFja0hhbmRsZXIoKTsKKyAgICAgICAgbUF1ZGlvUGxheWJhY2tIYW5kbGVyLnN0YXJ0KCk7CiAKICAgICAgICAgbUNhbGxiYWNrcyA9IG5ldyBDYWxsYmFja01hcCgpOwogCiAgICAgICAgIC8vIExvYWQgZGVmYXVsdCBsYW5ndWFnZQotICAgICAgICBvbkxvYWRMYW5ndWFnZShnZXREZWZhdWx0TGFuZ3VhZ2UoKSwgZ2V0RGVmYXVsdENvdW50cnkoKSwgZ2V0RGVmYXVsdFZhcmlhbnQoKSk7CisgICAgICAgIG1EZWZhdWx0QXZhaWxhYmlsaXR5ID0gb25Mb2FkTGFuZ3VhZ2UoZ2V0RGVmYXVsdExhbmd1YWdlKCksCisgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdENvdW50cnkoKSwgZ2V0RGVmYXVsdFZhcmlhbnQoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04MCw4ICsxMTAsOCBAQAogCiAgICAgICAgIC8vIFRlbGwgdGhlIHN5bnRoZXNpemVyIHRvIHN0b3AKICAgICAgICAgbVN5bnRoSGFuZGxlci5xdWl0KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrSGFuZGxlci5nZXRMb29wZXIoKS5xdWl0KCk7Ci0KKyAgICAgICAgLy8gVGVsbCB0aGUgYXVkaW8gcGxheWJhY2sgdGhyZWFkIHRvIHN0b3AuCisgICAgICAgIG1BdWRpb1BsYXliYWNrSGFuZGxlci5xdWl0KCk7CiAgICAgICAgIC8vIFVucmVnaXN0ZXIgYWxsIGNhbGxiYWNrcy4KICAgICAgICAgbUNhbGxiYWNrcy5raWxsKCk7CiAKQEAgLTE1NCwxNSArMTg0LDEyIEBACiAgICAgICoKICAgICAgKiBDYWxsZWQgb24gdGhlIHN5bnRoZXNpcyB0aHJlYWQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdCBUaGUgc3ludGhlc2lzIHJlcXVlc3QuIFRoZSBtZXRob2Qgc2hvdWxkIHVzZSB0aGUgbWV0aG9kcyBpbiB0aGUgcmVxdWVzdAotICAgICAqICAgICAgICAgb2JqZWN0IHRvIGNvbW11bmljYXRlIHRoZSByZXN1bHRzIG9mIHRoZSBzeW50aGVzaXMuCisgICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIHN5bnRoZXNpcyByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdGhlIHRoZSBlbmdpbmUgbXVzdCB1c2UgdG8gbWFrZSBkYXRhIGF2YWlsYWJsZSBmb3IKKyAgICAgKiAgICAgICAgIHBsYXliYWNrIG9yIGZvciB3cml0aW5nIHRvIGEgZmlsZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvblN5bnRoZXNpemVUZXh0KFN5bnRoZXNpc1JlcXVlc3QgcmVxdWVzdCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJlRGVmYXVsdHNFbmZvcmNlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlY3VyZVNldHRpbmdJbnQoU2V0dGluZ3MuU2VjdXJlLlRUU19VU0VfREVGQVVMVFMsCi0gICAgICAgICAgICAgICAgVGV4dFRvU3BlZWNoLkVuZ2luZS5VU0VfREVGQVVMVFMpID09IDE7Ci0gICAgfQorICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uU3ludGhlc2l6ZVRleHQoU3ludGhlc2lzUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgU3ludGhlc2lzQ2FsbGJhY2sgY2FsbGJhY2spOwogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0RGVmYXVsdFNwZWVjaFJhdGUoKSB7CiAgICAgICAgIHJldHVybiBnZXRTZWN1cmVTZXR0aW5nSW50KFNldHRpbmdzLlNlY3VyZS5UVFNfREVGQVVMVF9SQVRFLCBFbmdpbmUuREVGQVVMVF9SQVRFKTsKQEAgLTIzMywxMyArMjYwLDYgQEAKICAgICAgICAgICAgIHN1cGVyKGxvb3Blcik7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgZGlzcGF0Y2hVdHRlcmFuY2VDb21wbGV0ZWQoU3BlZWNoSXRlbSBpdGVtKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdXR0ZXJhbmNlSWQgPSBpdGVtLmdldFV0dGVyYW5jZUlkKCk7Ci0gICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHV0dGVyYW5jZUlkKSkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja3MuZGlzcGF0Y2hVdHRlcmFuY2VDb21wbGV0ZWQoaXRlbS5nZXRDYWxsaW5nQXBwKCksIHV0dGVyYW5jZUlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNwZWVjaEl0ZW0gZ2V0Q3VycmVudFNwZWVjaEl0ZW0oKSB7CiAgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnRTcGVlY2hJdGVtOwogICAgICAgICB9CkBAIC0yNzMsMjQgKzI5MywyOSBAQAogICAgICAgICAgICAgaWYgKCFzcGVlY2hJdGVtLmlzVmFsaWQoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPOiBUaGUgb2xkIGNvZGUgYWxzbyBzdXBwb3J0ZWQgdGhlIHVuZG9jdW1lbnRlZCBxdWV1ZU1vZGUgPT0gMiwKLSAgICAgICAgICAgIC8vIHdoaWNoIGNsZWFycyBvdXQgYWxsIHBlbmRpbmcgaXRlbXMgZnJvbSB0aGUgY2FsbGluZyBhcHAsIGFzIHdlbGwgYXMgYWxsCi0gICAgICAgICAgICAvLyBub24tZmlsZSBpdGVtcyBmcm9tIG90aGVyIGFwcHMuCisKICAgICAgICAgICAgIGlmIChxdWV1ZU1vZGUgPT0gVGV4dFRvU3BlZWNoLlFVRVVFX0ZMVVNIKSB7CiAgICAgICAgICAgICAgICAgc3RvcChzcGVlY2hJdGVtLmdldENhbGxpbmdBcHAoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlTW9kZSA9PSBUZXh0VG9TcGVlY2guUVVFVUVfREVTVFJPWSkgeworICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIGN1cnJlbnQgc3BlZWNoIGl0ZW0uCisgICAgICAgICAgICAgICAgc3RvcChzcGVlY2hJdGVtLmdldENhbGxpbmdBcHAoKSk7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBvdGhlciBpdGVtcyBmcm9tIHRoZSBxdWV1ZS4KKyAgICAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIHBlbmRpbmcgcGxheWJhY2sgYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja0hhbmRsZXIucmVtb3ZlQWxsSXRlbXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudFNwZWVjaEl0ZW0oc3BlZWNoSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGVlY2hJdGVtLnBsYXkoKSA9PSBUZXh0VG9TcGVlY2guU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hVdHRlcmFuY2VDb21wbGV0ZWQoc3BlZWNoSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3BlZWNoSXRlbS5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRTcGVlY2hJdGVtKG51bGwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKHRoaXMsIHJ1bm5hYmxlKTsKICAgICAgICAgICAgIC8vIFRoZSBvYmogaXMgdXNlZCB0byByZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBnaXZlbiBhcHAgaW4gc3RvcChTdHJpbmcpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHN0cmluZyBpcyBpbnRlcm5lZCwgc28gdGhlID09IGNvbXBhcmlzb24gd29ya3MuCiAgICAgICAgICAgICBtc2cub2JqID0gc3BlZWNoSXRlbS5nZXRDYWxsaW5nQXBwKCk7CiAgICAgICAgICAgICBpZiAoc2VuZE1lc3NhZ2UobXNnKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKQEAgLTMxMCwxOSArMzM1LDI4IEBACiAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY2FsbGluZ0FwcCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZW1vdmVDYWxsYmFja3NBbmRNZXNzYWdlcyhjYWxsaW5nQXBwKTsKICAgICAgICAgICAgIFNwZWVjaEl0ZW0gY3VycmVudCA9IHNldEN1cnJlbnRTcGVlY2hJdGVtKG51bGwpOwogICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBUZXh0VXRpbHMuZXF1YWxzKGNhbGxpbmdBcHAsIGN1cnJlbnQuZ2V0Q2FsbGluZ0FwcCgpKSkgewogICAgICAgICAgICAgICAgIGN1cnJlbnQuc3RvcCgpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGVucXVldWVkIGF1ZGlvIHRvby4KKyAgICAgICAgICAgIG1BdWRpb1BsYXliYWNrSGFuZGxlci5yZW1vdmVQbGF5YmFja0l0ZW1zKGNhbGxpbmdBcHApOworCiAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnRlcmZhY2UgVXR0ZXJhbmNlQ29tcGxldGVkRGlzcGF0Y2hlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoVXR0ZXJhbmNlQ29tcGxldGVkKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQW4gaXRlbSBpbiB0aGUgc3ludGggdGhyZWFkIHF1ZXVlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNwZWVjaEl0ZW0geworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgU3BlZWNoSXRlbSBpbXBsZW1lbnRzIFV0dGVyYW5jZUNvbXBsZXRlZERpc3BhdGNoZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ2FsbGluZ0FwcDsKICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEJ1bmRsZSBtUGFyYW1zOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTM3Nyw2ICs0MTEsMTMgQEAKICAgICAgICAgICAgIHN0b3BJbXBsKCk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFV0dGVyYW5jZUNvbXBsZXRlZCgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1dHRlcmFuY2VJZCA9IGdldFV0dGVyYW5jZUlkKCk7CisgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHV0dGVyYW5jZUlkKSkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MuZGlzcGF0Y2hVdHRlcmFuY2VDb21wbGV0ZWQoZ2V0Q2FsbGluZ0FwcCgpLCB1dHRlcmFuY2VJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBsYXlJbXBsKCk7CiAKICAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc3RvcEltcGwoKTsKQEAgLTQxMCwxMyArNDUxLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFN5bnRoZXNpc1NwZWVjaEl0ZW0gZXh0ZW5kcyBTcGVlY2hJdGVtIHsKKyAgICBjbGFzcyBTeW50aGVzaXNTcGVlY2hJdGVtIGV4dGVuZHMgU3BlZWNoSXRlbSB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1UZXh0OwotICAgICAgICBwcml2YXRlIFN5bnRoZXNpc1JlcXVlc3QgbVN5bnRoZXNpc1JlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3ludGhlc2lzUmVxdWVzdCBtU3ludGhlc2lzUmVxdWVzdDsKKyAgICAgICAgLy8gTm9uIG51bGwgYWZ0ZXIgc3ludGhlc2lzIGhhcyBzdGFydGVkLCBhbmQgYWxsIGFjY2Vzc2VzCisgICAgICAgIC8vIGd1YXJkZWQgYnkgJ3RoaXMnLgorICAgICAgICBwcml2YXRlIEFic3RyYWN0U3ludGhlc2lzQ2FsbGJhY2sgbVN5bnRoZXNpc0NhbGxiYWNrOwogCiAgICAgICAgIHB1YmxpYyBTeW50aGVzaXNTcGVlY2hJdGVtKFN0cmluZyBjYWxsaW5nQXBwLCBCdW5kbGUgcGFyYW1zLCBTdHJpbmcgdGV4dCkgewogICAgICAgICAgICAgc3VwZXIoY2FsbGluZ0FwcCwgcGFyYW1zKTsKICAgICAgICAgICAgIG1UZXh0ID0gdGV4dDsKKyAgICAgICAgICAgIG1TeW50aGVzaXNSZXF1ZXN0ID0gbmV3IFN5bnRoZXNpc1JlcXVlc3QobVRleHQsIG1QYXJhbXMpOworICAgICAgICAgICAgc2V0UmVxdWVzdFBhcmFtcyhtU3ludGhlc2lzUmVxdWVzdCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CkBAIC00MzgsMzkgKzQ4NCwzNCBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgaW50IHBsYXlJbXBsKCkgewotICAgICAgICAgICAgU3ludGhlc2lzUmVxdWVzdCBzeW50aGVzaXNSZXF1ZXN0OworICAgICAgICAgICAgQWJzdHJhY3RTeW50aGVzaXNDYWxsYmFjayBzeW50aGVzaXNDYWxsYmFjazsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1TeW50aGVzaXNSZXF1ZXN0ID0gY3JlYXRlU3ludGhlc2lzUmVxdWVzdCgpOwotICAgICAgICAgICAgICAgIHN5bnRoZXNpc1JlcXVlc3QgPSBtU3ludGhlc2lzUmVxdWVzdDsKKyAgICAgICAgICAgICAgICBtU3ludGhlc2lzQ2FsbGJhY2sgPSBjcmVhdGVTeW50aGVzaXNDYWxsYmFjaygpOworICAgICAgICAgICAgICAgIHN5bnRoZXNpc0NhbGxiYWNrID0gbVN5bnRoZXNpc0NhbGxiYWNrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0UmVxdWVzdFBhcmFtcyhzeW50aGVzaXNSZXF1ZXN0KTsKLSAgICAgICAgICAgIFRleHRUb1NwZWVjaFNlcnZpY2UudGhpcy5vblN5bnRoZXNpemVUZXh0KHN5bnRoZXNpc1JlcXVlc3QpOwotICAgICAgICAgICAgcmV0dXJuIHN5bnRoZXNpc1JlcXVlc3QuaXNEb25lKCkgPyBUZXh0VG9TcGVlY2guU1VDQ0VTUyA6IFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIFRleHRUb1NwZWVjaFNlcnZpY2UudGhpcy5vblN5bnRoZXNpemVUZXh0KG1TeW50aGVzaXNSZXF1ZXN0LCBzeW50aGVzaXNDYWxsYmFjayk7CisgICAgICAgICAgICByZXR1cm4gc3ludGhlc2lzQ2FsbGJhY2suaXNEb25lKCkgPyBUZXh0VG9TcGVlY2guU1VDQ0VTUyA6IFRleHRUb1NwZWVjaC5FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIHByb3RlY3RlZCBTeW50aGVzaXNSZXF1ZXN0IGNyZWF0ZVN5bnRoZXNpc1JlcXVlc3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrU3ludGhlc2lzUmVxdWVzdChtVGV4dCwgbVBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtVHlwZSgpLCBnZXRWb2x1bWUoKSwgZ2V0UGFuKCksIG1BdWRpb1RyYWNrSGFuZGxlcik7CisgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFN5bnRoZXNpc0NhbGxiYWNrIGNyZWF0ZVN5bnRoZXNpc0NhbGxiYWNrKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5YmFja1N5bnRoZXNpc0NhbGxiYWNrKGdldFN0cmVhbVR5cGUoKSwgZ2V0Vm9sdW1lKCksIGdldFBhbigpLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja0hhbmRsZXIsIHRoaXMsIGdldENhbGxpbmdBcHAoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgc2V0UmVxdWVzdFBhcmFtcyhTeW50aGVzaXNSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGlmIChhcmVEZWZhdWx0c0VuZm9yY2VkKCkpIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnNldExhbmd1YWdlKGdldERlZmF1bHRMYW5ndWFnZSgpLCBnZXREZWZhdWx0Q291bnRyeSgpLCBnZXREZWZhdWx0VmFyaWFudCgpKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFNwZWVjaFJhdGUoZ2V0RGVmYXVsdFNwZWVjaFJhdGUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0TGFuZ3VhZ2UoZ2V0TGFuZ3VhZ2UoKSwgZ2V0Q291bnRyeSgpLCBnZXRWYXJpYW50KCkpOwotICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0U3BlZWNoUmF0ZShnZXRTcGVlY2hSYXRlKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdC5zZXRMYW5ndWFnZShnZXRMYW5ndWFnZSgpLCBnZXRDb3VudHJ5KCksIGdldFZhcmlhbnQoKSk7CisgICAgICAgICAgICByZXF1ZXN0LnNldFNwZWVjaFJhdGUoZ2V0U3BlZWNoUmF0ZSgpKTsKKwogICAgICAgICAgICAgcmVxdWVzdC5zZXRQaXRjaChnZXRQaXRjaCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzdG9wSW1wbCgpIHsKLSAgICAgICAgICAgIFN5bnRoZXNpc1JlcXVlc3Qgc3ludGhlc2lzUmVxdWVzdDsKKyAgICAgICAgICAgIEFic3RyYWN0U3ludGhlc2lzQ2FsbGJhY2sgc3ludGhlc2lzQ2FsbGJhY2s7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBzeW50aGVzaXNSZXF1ZXN0ID0gbVN5bnRoZXNpc1JlcXVlc3Q7CisgICAgICAgICAgICAgICAgc3ludGhlc2lzQ2FsbGJhY2sgPSBtU3ludGhlc2lzQ2FsbGJhY2s7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW50aGVzaXNSZXF1ZXN0LnN0b3AoKTsKKyAgICAgICAgICAgIHN5bnRoZXNpc0NhbGxiYWNrLnN0b3AoKTsKICAgICAgICAgICAgIFRleHRUb1NwZWVjaFNlcnZpY2UudGhpcy5vblN0b3AoKTsKICAgICAgICAgfQogCkBAIC01MTksOCArNTYwLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFN5bnRoZXNpc1JlcXVlc3QgY3JlYXRlU3ludGhlc2lzUmVxdWVzdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVN5bnRoZXNpc1JlcXVlc3QoZ2V0VGV4dCgpLCBtUGFyYW1zLCBtRmlsZSk7CisgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFN5bnRoZXNpc0NhbGxiYWNrIGNyZWF0ZVN5bnRoZXNpc0NhbGxiYWNrKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlU3ludGhlc2lzQ2FsbGJhY2sobUZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgcGxheUltcGwoKSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gc3VwZXIucGxheUltcGwoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gVGV4dFRvU3BlZWNoLlNVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBkaXNwYXRjaFV0dGVyYW5jZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNTU0LDYgKzYwNCw3IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBBdWRpb1NwZWVjaEl0ZW0gZXh0ZW5kcyBTcGVlY2hJdGVtIHsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nTWVkaWFQbGF5ZXIgbVBsYXllcjsKKyAgICAgICAgcHJpdmF0ZSBBdWRpb01lc3NhZ2VQYXJhbXMgbVRva2VuOwogCiAgICAgICAgIHB1YmxpYyBBdWRpb1NwZWVjaEl0ZW0oU3RyaW5nIGNhbGxpbmdBcHAsIEJ1bmRsZSBwYXJhbXMsIFVyaSB1cmkpIHsKICAgICAgICAgICAgIHN1cGVyKGNhbGxpbmdBcHAsIHBhcmFtcyk7CkBAIC01NjcsMjMgKzYxOCwyNiBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgaW50IHBsYXlJbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuc3RhcnRBbmRXYWl0KCkgPyBUZXh0VG9TcGVlY2guU1VDQ0VTUyA6IFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIG1Ub2tlbiA9IG5ldyBBdWRpb01lc3NhZ2VQYXJhbXModGhpcywgZ2V0Q2FsbGluZ0FwcCgpLCBtUGxheWVyKTsKKyAgICAgICAgICAgIG1BdWRpb1BsYXliYWNrSGFuZGxlci5lbnF1ZXVlQXVkaW8obVRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guU1VDQ0VTUzsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzdG9wSW1wbCgpIHsKLSAgICAgICAgICAgIG1QbGF5ZXIuc3RvcCgpOworICAgICAgICAgICAgaWYgKG1Ub2tlbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tIYW5kbGVyLnN0b3AobVRva2VuKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgU2lsZW5jZVNwZWVjaEl0ZW0gZXh0ZW5kcyBTcGVlY2hJdGVtIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1EdXJhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb25WYXJpYWJsZSBtRG9uZTsKKyAgICAgICAgcHJpdmF0ZSBTaWxlbmNlTWVzc2FnZVBhcmFtcyBtVG9rZW47CiAKICAgICAgICAgcHVibGljIFNpbGVuY2VTcGVlY2hJdGVtKFN0cmluZyBjYWxsaW5nQXBwLCBCdW5kbGUgcGFyYW1zLCBsb25nIGR1cmF0aW9uKSB7CiAgICAgICAgICAgICBzdXBlcihjYWxsaW5nQXBwLCBwYXJhbXMpOwogICAgICAgICAgICAgbUR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgICAgICAgICBtRG9uZSA9IG5ldyBDb25kaXRpb25WYXJpYWJsZSgpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC01OTMsMTMgKzY0NywxNiBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgaW50IHBsYXlJbXBsKCkgewotICAgICAgICAgICAgYm9vbGVhbiBhYm9ydGVkID0gbURvbmUuYmxvY2sobUR1cmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBhYm9ydGVkID8gVGV4dFRvU3BlZWNoLkVSUk9SIDogVGV4dFRvU3BlZWNoLlNVQ0NFU1M7CisgICAgICAgICAgICBtVG9rZW4gPSBuZXcgU2lsZW5jZU1lc3NhZ2VQYXJhbXModGhpcywgZ2V0Q2FsbGluZ0FwcCgpLCBtRHVyYXRpb24pOworICAgICAgICAgICAgbUF1ZGlvUGxheWJhY2tIYW5kbGVyLmVucXVldWVTaWxlbmNlKG1Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLlNVQ0NFU1M7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3RvcEltcGwoKSB7Ci0gICAgICAgICAgICBtRG9uZS5vcGVuKCk7CisgICAgICAgICAgICBpZiAobVRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja0hhbmRsZXIuc3RvcChtVG9rZW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC02MTUsMjcgKzY3Miw0NiBAQAogICAgICAqIEJpbmRlciByZXR1cm5lZCBmcm9tIHtAY29kZSAjb25CaW5kKEludGVudCl9LiBUaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGNhbiBiZQogICAgICAqIGNhbGxlZCBjYWxsZWQgZnJvbSBzZXZlcmFsIGRpZmZlcmVudCB0aHJlYWRzLgogICAgICAqLworICAgIC8vIE5PVEU6IEFsbCBjYWxscyB0aGF0IGFyZSBwYXNzZWQgaW4gYSBjYWxsaW5nIGFwcCBhcmUgaW50ZXJuZWQgc28gdGhhdAorICAgIC8vIHRoZXkgY2FuIGJlIHVzZWQgYXMgbWVzc2FnZSBvYmplY3RzICh3aGljaCBhcmUgdGVzdGVkIGZvciBlcXVhbGl0eSB1c2luZyA9PSkuCiAgICAgcHJpdmF0ZSBmaW5hbCBJVGV4dFRvU3BlZWNoU2VydmljZS5TdHViIG1CaW5kZXIgPSBuZXcgSVRleHRUb1NwZWVjaFNlcnZpY2UuU3R1YigpIHsKIAogICAgICAgICBwdWJsaWMgaW50IHNwZWFrKFN0cmluZyBjYWxsaW5nQXBwLCBTdHJpbmcgdGV4dCwgaW50IHF1ZXVlTW9kZSwgQnVuZGxlIHBhcmFtcykgewotICAgICAgICAgICAgU3BlZWNoSXRlbSBpdGVtID0gbmV3IFN5bnRoZXNpc1NwZWVjaEl0ZW0oY2FsbGluZ0FwcCwgcGFyYW1zLCB0ZXh0KTsKKyAgICAgICAgICAgIGlmICghY2hlY2tOb25OdWxsKGNhbGxpbmdBcHAsIHRleHQsIHBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTcGVlY2hJdGVtIGl0ZW0gPSBuZXcgU3ludGhlc2lzU3BlZWNoSXRlbShpbnRlcm4oY2FsbGluZ0FwcCksIHBhcmFtcywgdGV4dCk7CiAgICAgICAgICAgICByZXR1cm4gbVN5bnRoSGFuZGxlci5lbnF1ZXVlU3BlZWNoSXRlbShxdWV1ZU1vZGUsIGl0ZW0pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBzeW50aGVzaXplVG9GaWxlKFN0cmluZyBjYWxsaW5nQXBwLCBTdHJpbmcgdGV4dCwgU3RyaW5nIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgIEJ1bmRsZSBwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmICghY2hlY2tOb25OdWxsKGNhbGxpbmdBcHAsIHRleHQsIGZpbGVuYW1lLCBwYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotICAgICAgICAgICAgU3BlZWNoSXRlbSBpdGVtID0gbmV3IFN5bnRoZXNpc1RvRmlsZVNwZWVjaEl0ZW0oY2FsbGluZ0FwcCwgcGFyYW1zLCB0ZXh0LCBmaWxlKTsKKyAgICAgICAgICAgIFNwZWVjaEl0ZW0gaXRlbSA9IG5ldyBTeW50aGVzaXNUb0ZpbGVTcGVlY2hJdGVtKGludGVybihjYWxsaW5nQXBwKSwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCB0ZXh0LCBmaWxlKTsKICAgICAgICAgICAgIHJldHVybiBtU3ludGhIYW5kbGVyLmVucXVldWVTcGVlY2hJdGVtKFRleHRUb1NwZWVjaC5RVUVVRV9BREQsIGl0ZW0pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBwbGF5QXVkaW8oU3RyaW5nIGNhbGxpbmdBcHAsIFVyaSBhdWRpb1VyaSwgaW50IHF1ZXVlTW9kZSwgQnVuZGxlIHBhcmFtcykgewotICAgICAgICAgICAgU3BlZWNoSXRlbSBpdGVtID0gbmV3IEF1ZGlvU3BlZWNoSXRlbShjYWxsaW5nQXBwLCBwYXJhbXMsIGF1ZGlvVXJpKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tOb25OdWxsKGNhbGxpbmdBcHAsIGF1ZGlvVXJpLCBwYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3BlZWNoSXRlbSBpdGVtID0gbmV3IEF1ZGlvU3BlZWNoSXRlbShpbnRlcm4oY2FsbGluZ0FwcCksIHBhcmFtcywgYXVkaW9VcmkpOwogICAgICAgICAgICAgcmV0dXJuIG1TeW50aEhhbmRsZXIuZW5xdWV1ZVNwZWVjaEl0ZW0ocXVldWVNb2RlLCBpdGVtKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgcGxheVNpbGVuY2UoU3RyaW5nIGNhbGxpbmdBcHAsIGxvbmcgZHVyYXRpb24sIGludCBxdWV1ZU1vZGUsIEJ1bmRsZSBwYXJhbXMpIHsKLSAgICAgICAgICAgIFNwZWVjaEl0ZW0gaXRlbSA9IG5ldyBTaWxlbmNlU3BlZWNoSXRlbShjYWxsaW5nQXBwLCBwYXJhbXMsIGR1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tOb25OdWxsKGNhbGxpbmdBcHAsIHBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTcGVlY2hJdGVtIGl0ZW0gPSBuZXcgU2lsZW5jZVNwZWVjaEl0ZW0oaW50ZXJuKGNhbGxpbmdBcHApLCBwYXJhbXMsIGR1cmF0aW9uKTsKICAgICAgICAgICAgIHJldHVybiBtU3ludGhIYW5kbGVyLmVucXVldWVTcGVlY2hJdGVtKHF1ZXVlTW9kZSwgaXRlbSk7CiAgICAgICAgIH0KIApAQCAtNjQ0LDI0ICs3MjAsNjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgc3RvcChTdHJpbmcgY2FsbGluZ0FwcCkgewotICAgICAgICAgICAgcmV0dXJuIG1TeW50aEhhbmRsZXIuc3RvcChjYWxsaW5nQXBwKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tOb25OdWxsKGNhbGxpbmdBcHApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRleHRUb1NwZWVjaC5FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG1TeW50aEhhbmRsZXIuc3RvcChpbnRlcm4oY2FsbGluZ0FwcCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldExhbmd1YWdlKCkgewogICAgICAgICAgICAgcmV0dXJuIG9uR2V0TGFuZ3VhZ2UoKTsKICAgICAgICAgfQogCisgICAgICAgIC8qCisgICAgICAgICAqIElmIGRlZmF1bHRzIGFyZSBlbmZvcmNlZCwgdGhlbiBubyBsYW5ndWFnZSBpcyAiYXZhaWxhYmxlIiBleGNlcHQKKyAgICAgICAgICogcGVyaGFwcyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBzZWxlY3RlZCBieSB0aGUgdXNlci4KKyAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgaXNMYW5ndWFnZUF2YWlsYWJsZShTdHJpbmcgbGFuZywgU3RyaW5nIGNvdW50cnksIFN0cmluZyB2YXJpYW50KSB7CisgICAgICAgICAgICBpZiAoIWNoZWNrTm9uTnVsbChsYW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXh0VG9TcGVlY2guRVJST1I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBvbklzTGFuZ3VhZ2VBdmFpbGFibGUobGFuZywgY291bnRyeSwgdmFyaWFudCk7CiAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBUaGVyZSBpcyBubyBwb2ludCBsb2FkaW5nIGEgbm9uIGRlZmF1bHQgbGFuZ3VhZ2UgaWYgZGVmYXVsdHMKKyAgICAgICAgICogYXJlIGVuZm9yY2VkLgorICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBsb2FkTGFuZ3VhZ2UoU3RyaW5nIGxhbmcsIFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgdmFyaWFudCkgeworICAgICAgICAgICAgaWYgKCFjaGVja05vbk51bGwobGFuZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGV4dFRvU3BlZWNoLkVSUk9SOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gb25Mb2FkTGFuZ3VhZ2UobGFuZywgY291bnRyeSwgdmFyaWFudCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhTdHJpbmcgcGFja2FnZU5hbWUsIElUZXh0VG9TcGVlY2hDYWxsYmFjayBjYikgeworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHBhc3NpbmcgaW4gYSBudWxsIGNhbGxiYWNrIGlzIGEgdmFsaWQgdXNlIGNhc2UuCisgICAgICAgICAgICBpZiAoIWNoZWNrTm9uTnVsbChwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1DYWxsYmFja3Muc2V0Q2FsbGJhY2socGFja2FnZU5hbWUsIGNiKTsKICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIGxhbmcsIFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgdmFyaWFudCkgeworICAgICAgICAgICAgcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKG5ldyBMb2NhbGUobGFuZywgY291bnRyeSwgdmFyaWFudCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaW50ZXJuKFN0cmluZyBpbikgeworICAgICAgICAgICAgLy8gVGhlIGlucHV0IHBhcmFtZXRlciB3aWxsIGJlIG5vbiBudWxsLgorICAgICAgICAgICAgcmV0dXJuIGluLmludGVybigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrTm9uTnVsbChPYmplY3QuLi4gYXJncykgeworICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBpZiAobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogICAgIH07CiAKICAgICBwcml2YXRlIGNsYXNzIENhbGxiYWNrTWFwIGV4dGVuZHMgUmVtb3RlQ2FsbGJhY2tMaXN0PElUZXh0VG9TcGVlY2hDYWxsYmFjaz4gewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UdHNFbmdpbmVzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9zcGVlY2gvdHRzL1R0c0VuZ2luZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDllMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvc3BlZWNoL3R0cy9UdHNFbmdpbmVzLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdAorICogdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVAorICogV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5zcGVlY2gudHRzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaC5FbmdpbmU7CitpbXBvcnQgYW5kcm9pZC5zcGVlY2gudHRzLlRleHRUb1NwZWVjaC5FbmdpbmVJbmZvOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBTdXBwb3J0IGNsYXNzIGZvciBxdWVyeWluZyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgZW5naW5lcworICogb24gdGhlIGRldmljZSBhbmQgZGVjaWRpbmcgd2hpY2ggb25lIHRvIHVzZSBldGMuCisgKgorICogQ29tbWVudHMgaW4gdGhpcyBjbGFzcyB0aGUgdXNlIHRoZSBzaG9ydGhhbmQgInN5c3RlbSBlbmdpbmVzIiBmb3IgZW5naW5lcyB0aGF0CisgKiBhcmUgYSBwYXJ0IG9mIHRoZSBzeXN0ZW0gaW1hZ2UuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFR0c0VuZ2luZXMgeworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHB1YmxpYyBUdHNFbmdpbmVzKENvbnRleHQgY3R4KSB7CisgICAgICAgIG1Db250ZXh0ID0gY3R4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgVFRTIGVuZ2luZS4gSWYgdGhlIHVzZXIgaGFzIHNldCBhIGRlZmF1bHQsIGFuZCB0aGUgZW5naW5lCisgICAgICogICAgICAgICBpcyBhdmFpbGFibGUgb24gdGhlIGRldmljZSwgdGhlIGRlZmF1bHQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwKKyAgICAgKiAgICAgICAgIHRoZSBoaWdoZXN0IHJhbmtlZCBlbmdpbmUgaXMgcmV0dXJuZWQgYXMgcGVyIHtAbGluayBFbmdpbmVJbmZvQ29tcGFyYXRvcn0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0RW5naW5lKCkgeworICAgICAgICBTdHJpbmcgZW5naW5lID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuVFRTX0RFRkFVTFRfU1lOVEgpOworICAgICAgICByZXR1cm4gaXNFbmdpbmVJbnN0YWxsZWQoZW5naW5lKSA/IGVuZ2luZSA6IGdldEhpZ2hlc3RSYW5rZWRFbmdpbmVOYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBoaWdoZXN0IHJhbmtlZCBzeXN0ZW0gZW5naW5lLCB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIG5vIFRUUyBlbmdpbmVzIHdlcmUgcHJlc2VudCBpbiB0aGUgc3lzdGVtIGltYWdlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGlnaGVzdFJhbmtlZEVuZ2luZU5hbWUoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8RW5naW5lSW5mbz4gZW5naW5lcyA9IGdldEVuZ2luZXMoKTsKKworICAgICAgICBpZiAoZW5naW5lcy5zaXplKCkgPiAwICYmIGVuZ2luZXMuZ2V0KDApLnN5c3RlbSkgeworICAgICAgICAgICAgcmV0dXJuIGVuZ2luZXMuZ2V0KDApLm5hbWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmdpbmUgaW5mbyBmb3IgYSBnaXZlbiBlbmdpbmUgbmFtZS4gTm90ZSB0aGF0IGVuZ2luZXMgYXJlCisgICAgICogaWRlbnRpZmllZCBieSB0aGVpciBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIEVuZ2luZUluZm8gZ2V0RW5naW5lSW5mbyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChFbmdpbmUuSU5URU5UX0FDVElPTl9UVFNfU0VSVklDRSk7CisgICAgICAgIGludGVudC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gcmVzb2x2ZUluZm9zID0gcG0ucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuTUFUQ0hfREVGQVVMVF9PTkxZKTsKKyAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBjdXJyZW50IEFQSSBhbGxvd3Mgb25seSBvbmUgZW5naW5lIHBlcgorICAgICAgICAvLyBwYWNrYWdlIG5hbWUuIFNpbmNlIHRoZSAiZW5naW5lIG5hbWUiIGlzIHRoZSBzYW1lIGFzCisgICAgICAgIC8vIHRoZSBwYWNrYWdlIG5hbWUuCisgICAgICAgIGlmIChyZXNvbHZlSW5mb3MgIT0gbnVsbCAmJiByZXNvbHZlSW5mb3Muc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFbmdpbmVJbmZvKHJlc29sdmVJbmZvcy5nZXQoMCksIHBtKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBsaXN0IG9mIGFsbCBpbnN0YWxsZWQgVFRTIGVuZ2luZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBlbmdpbmUgaW5mbyBvYmplY3RzLiBUaGUgbGlzdCBjYW4gYmUgZW1wdHksIGJ1dCBuZXZlciB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIExpc3Q8RW5naW5lSW5mbz4gZ2V0RW5naW5lcygpIHsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChFbmdpbmUuSU5URU5UX0FDVElPTl9UVFNfU0VSVklDRSk7CisgICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IHJlc29sdmVJbmZvcyA9CisgICAgICAgICAgICAgICAgcG0ucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLk1BVENIX0RFRkFVTFRfT05MWSk7CisgICAgICAgIGlmIChyZXNvbHZlSW5mb3MgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCisgICAgICAgIExpc3Q8RW5naW5lSW5mbz4gZW5naW5lcyA9IG5ldyBBcnJheUxpc3Q8RW5naW5lSW5mbz4ocmVzb2x2ZUluZm9zLnNpemUoKSk7CisKKyAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IHJlc29sdmVJbmZvcykgeworICAgICAgICAgICAgRW5naW5lSW5mbyBlbmdpbmUgPSBnZXRFbmdpbmVJbmZvKHJlc29sdmVJbmZvLCBwbSk7CisgICAgICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbmdpbmVzLmFkZChlbmdpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZW5naW5lcywgRW5naW5lSW5mb0NvbXBhcmF0b3IuSU5TVEFOQ0UpOworCisgICAgICAgIHJldHVybiBlbmdpbmVzOworICAgIH0KKworICAgIC8vIFRPRE86IFVzZWQgb25seSBieSB0aGUgc2V0dGluZ3MgYXBwLiBSZW1vdmUgb25jZQorICAgIC8vIHRoZSBzZXR0aW5ncyBVSSBjaGFuZ2UgaGFzIGJlZW4gZmluYWxpemVkLgorICAgIHB1YmxpYyBib29sZWFuIGlzRW5naW5lRW5hYmxlZChTdHJpbmcgZW5naW5lKSB7CisgICAgICAgIHJldHVybiBpc0VuZ2luZUluc3RhbGxlZChlbmdpbmUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUVuZ2luZShTZXJ2aWNlSW5mbyBpbmZvKSB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBhcHBJbmZvID0gaW5mby5hcHBsaWNhdGlvbkluZm87CisgICAgICAgIHJldHVybiBhcHBJbmZvICE9IG51bGwgJiYgKGFwcEluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pICE9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIGEgZ2l2ZW4gZW5naW5lIGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW5naW5lSW5zdGFsbGVkKFN0cmluZyBlbmdpbmUpIHsKKyAgICAgICAgaWYgKGVuZ2luZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2V0RW5naW5lSW5mbyhlbmdpbmUpICE9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBFbmdpbmVJbmZvIGdldEVuZ2luZUluZm8oUmVzb2x2ZUluZm8gcmVzb2x2ZSwgUGFja2FnZU1hbmFnZXIgcG0pIHsKKyAgICAgICAgU2VydmljZUluZm8gc2VydmljZSA9IHJlc29sdmUuc2VydmljZUluZm87CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVuZ2luZUluZm8gZW5naW5lID0gbmV3IEVuZ2luZUluZm8oKTsKKyAgICAgICAgICAgIC8vIFVzaW5nIGp1c3QgdGhlIHBhY2thZ2UgbmFtZSBpc24ndCBncmVhdCwgc2luY2UgaXQgZGlzYWxsb3dzIGhhdmluZworICAgICAgICAgICAgLy8gbXVsdGlwbGUgZW5naW5lcyBpbiB0aGUgc2FtZSBwYWNrYWdlLCBidXQgdGhhdCdzIHdoYXQgdGhlIGV4aXN0aW5nIEFQSSBkb2VzLgorICAgICAgICAgICAgZW5naW5lLm5hbWUgPSBzZXJ2aWNlLnBhY2thZ2VOYW1lOworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGxhYmVsID0gc2VydmljZS5sb2FkTGFiZWwocG0pOworICAgICAgICAgICAgZW5naW5lLmxhYmVsID0gVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpID8gZW5naW5lLm5hbWUgOiBsYWJlbC50b1N0cmluZygpOworICAgICAgICAgICAgZW5naW5lLmljb24gPSBzZXJ2aWNlLmdldEljb25SZXNvdXJjZSgpOworICAgICAgICAgICAgZW5naW5lLnByaW9yaXR5ID0gcmVzb2x2ZS5wcmlvcml0eTsKKyAgICAgICAgICAgIGVuZ2luZS5zeXN0ZW0gPSBpc1N5c3RlbUVuZ2luZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmdpbmVJbmZvQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8RW5naW5lSW5mbz4geworICAgICAgICBwcml2YXRlIEVuZ2luZUluZm9Db21wYXJhdG9yKCkgeyB9CisKKyAgICAgICAgc3RhdGljIEVuZ2luZUluZm9Db21wYXJhdG9yIElOU1RBTkNFID0gbmV3IEVuZ2luZUluZm9Db21wYXJhdG9yKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVuZ2luZXMgdGhhdCBhcmUgYSBwYXJ0IG9mIHRoZSBzeXN0ZW0gaW1hZ2UgYXJlIGFsd2F5cyBsZXNzZXIKKyAgICAgICAgICogdGhhbiB0aG9zZSB0aGF0IGFyZSBub3QuIFdpdGhpbiBzeXN0ZW0gZW5naW5lcyAvIG5vbiBzeXN0ZW0gZW5naW5lcworICAgICAgICAgKiB0aGUgZW5naW5lcyBhcmUgc29ydGVkIGluIG9yZGVyIG9mIHRoZWlyIGRlY2xhcmVkIHByaW9yaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShFbmdpbmVJbmZvIGxocywgRW5naW5lSW5mbyByaHMpIHsKKyAgICAgICAgICAgIGlmIChsaHMuc3lzdGVtICYmICFyaHMuc3lzdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfSBlbHNlIGlmIChyaHMuc3lzdGVtICYmICFsaHMuc3lzdGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVpdGhlciBib3RoIHN5c3RlbSBlbmdpbmVzLCBvciBib3RoIG5vbiBzeXN0ZW0KKyAgICAgICAgICAgICAgICAvLyBlbmdpbmVzLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gTm90ZSwgdGhpcyBpc24ndCBhIHR5cG8uIEhpZ2hlciBwcmlvcml0eSBudW1iZXJzIGltcGx5CisgICAgICAgICAgICAgICAgLy8gaGlnaGVyIHByaW9yaXR5LCBidXQgYXJlICJsb3dlciIgaW4gdGhlIHNvcnQgb3JkZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIHJocy5wcmlvcml0eSAtIGxocy5wcmlvcml0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdGV4dC9tZXRob2QvV29yZEl0ZXJhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Xb3JkSXRlcmF0b3IuamF2YQppbmRleCBiMjUwNDE0Li5hZjUyNGVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Xb3JkSXRlcmF0b3IuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC90ZXh0L21ldGhvZC9Xb3JkSXRlcmF0b3IuamF2YQpAQCAtMjEzLDcgKzIxMyw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tPZmZzZXRJc1ZhbGlkKGludCBvZmZzZXQpIHsKICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gbUN1cnJlbnQubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlZhbGlkIHJhbmdlIGlzIFswLCAiICsgbUN1cnJlbnQubGVuZ3RoKCkgKyAiXSI7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJJbnZhbGlkIG9mZnNldDogIiArIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICIuIFZhbGlkIHJhbmdlIGlzIFswLCAiICsgbUN1cnJlbnQubGVuZ3RoKCkgKyAiXSI7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9DYWxlbmRhclV0aWxzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NhbGVuZGFyVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiNDg5Ny4uMDAwMDAwMAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0NhbGVuZGFyVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnV0aWw7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhci5DYWxlbmRhckNhY2hlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOwotCi1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIEEgY2xhc3MgY29udGFpbmluZyB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byBDYWxlbmRhciBhcHBzLgotICoKLSAqIEBoaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxlbmRhclV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDYWxlbmRhclV0aWxzIjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgbWV0aG9kcyBzcGVjaWZpYyB0byByZWFkaW5nIGFuZCB3cml0aW5nIHRpbWUgem9uZQotICAgICAqIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVab25lVXRpbHMgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUSU1FWk9ORV9UWVBFX0FSR1MgPSB7IENhbGVuZGFyQ2FjaGUuVElNRVpPTkVfS0VZX1RZUEUgfTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVElNRVpPTkVfSU5TVEFOQ0VTX0FSR1MgPQotICAgICAgICAgICAgICAgIHsgQ2FsZW5kYXJDYWNoZS5USU1FWk9ORV9LRVlfSU5TVEFOQ0VTIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVpbGRlciBtU0IgPSBuZXcgU3RyaW5nQnVpbGRlcig1MCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIEZvcm1hdHRlciBtRiA9IG5ldyBGb3JtYXR0ZXIobVNCLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLSAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBtRmlyc3RUWlJlcXVlc3QgPSB0cnVlOwotICAgICAgICBwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIG1UWlF1ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gbVVzZUhvbWVUWiA9IGZhbHNlOwotICAgICAgICBwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBTdHJpbmcgbUhvbWVUWiA9IFRpbWUuZ2V0Q3VycmVudFRpbWV6b25lKCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaFNldDxSdW5uYWJsZT4gbVRaQ2FsbGJhY2tzID0gbmV3IEhhc2hTZXQ8UnVubmFibGU+KCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBtVG9rZW4gPSAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBBc3luY1RaSGFuZGxlciBtSGFuZGxlcjsKLQotICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgc2hhcmVkIHByZWZlcmVuY2VzIGZpbGUuIFRoaXMgbmFtZSBtdXN0IGJlIG1haW50YWluZWQgZm9yIGhpc3RvcmljYWwKLSAgICAgICAgLy8gcmVhc29ucywgYXMgaXQncyB3aGF0IFByZWZlcmVuY2VNYW5hZ2VyIGFzc2lnbmVkIHRoZSBmaXJzdCB0aW1lIHRoZSBmaWxlIHdhcyBjcmVhdGVkLgotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUHJlZnNOYW1lOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIHRoZSBrZXkgdXNlZCBmb3Igd3JpdGluZyB3aGV0aGVyIG9yIG5vdCBhIGhvbWUgdGltZSB6b25lIHNob3VsZAotICAgICAgICAgKiBiZSB1c2VkIGluIHRoZSBDYWxlbmRhciBhcHAgdG8gdGhlIENhbGVuZGFyIFByZWZlcmVuY2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0hPTUVfVFpfRU5BQkxFRCA9ICJwcmVmZXJlbmNlc19ob21lX3R6X2VuYWJsZWQiOwotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpcyB0aGUga2V5IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHRpbWUgem9uZSB0aGF0IHNob3VsZCBiZSB1c2VkIGlmCi0gICAgICAgICAqIGhvbWUgdGltZSB6b25lcyBhcmUgZW5hYmxlZCBmb3IgdGhlIENhbGVuZGFyIGFwcC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IT01FX1RaID0gInByZWZlcmVuY2VzX2hvbWVfdHoiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIGZvciBoYW5kbGluZyB0aGUgYXN5bmMgcXVlcmllcyBhbmQgdXBkYXRlcyBmb3IgdGhlCi0gICAgICAgICAqIHRpbWUgem9uZSBzZXR0aW5ncyBpbiBDYWxlbmRhci4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgY2xhc3MgQXN5bmNUWkhhbmRsZXIgZXh0ZW5kcyBBc3luY1F1ZXJ5SGFuZGxlciB7Ci0gICAgICAgICAgICBwdWJsaWMgQXN5bmNUWkhhbmRsZXIoQ29udGVudFJlc29sdmVyIGNyKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIoY3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UWkNhbGxiYWNrcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UWlF1ZXJ5SW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0VFpSZXF1ZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd3JpdGVQcmVmcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgdmFsdWVzIGluIHRoZSBkYgotICAgICAgICAgICAgICAgICAgICBpbnQga2V5Q29sdW1uID0gY3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhDYWxlbmRhckNhY2hlLktFWSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZUNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW5JbmRleE9yVGhyb3coQ2FsZW5kYXJDYWNoZS5WQUxVRSk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlKGN1cnNvci5tb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBjdXJzb3IuZ2V0U3RyaW5nKGtleUNvbHVtbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJzb3IuZ2V0U3RyaW5nKHZhbHVlQ29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKGtleSwgQ2FsZW5kYXJDYWNoZS5USU1FWk9ORV9LRVlfVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUhvbWVUWiA9ICFUZXh0VXRpbHMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIENhbGVuZGFyQ2FjaGUuVElNRVpPTkVfVFlQRV9BVVRPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlSG9tZVRaICE9IG1Vc2VIb21lVFopIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQcmVmcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VIb21lVFogPSB1c2VIb21lVFo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChUZXh0VXRpbHMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIENhbGVuZGFyQ2FjaGUuVElNRVpPTkVfS0VZX0lOU1RBTkNFU19QUkVWSU9VUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KHZhbHVlKSAmJiAhVGV4dFV0aWxzLmVxdWFscyhtSG9tZVRaLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQcmVmcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ib21lVFogPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZVByZWZzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFNoYXJlZFByZWZlcmVuY2VzKChDb250ZXh0KWNvb2tpZSwgbVByZWZzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgcHJlZnMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFNoYXJlZFByZWZlcmVuY2UocHJlZnMsIEtFWV9IT01FX1RaX0VOQUJMRUQsIG1Vc2VIb21lVFopOwotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hhcmVkUHJlZmVyZW5jZShwcmVmcywgS0VZX0hPTUVfVFosIG1Ib21lVFopOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVRaUXVlcnlJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUnVubmFibGUgY2FsbGJhY2sgOiBtVFpDYWxsYmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucnVuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVRaQ2FsbGJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRoZSBzaGFyZWQgcHJlZnMgZm9yIENhbGVuZGFyIGFyZSBzdG9yZWQKLSAgICAgICAgICogbXVzdCBiZSBwcm92aWRlZC4gQWxsIGFjdGl2aXRpZXMgd2l0aGluIGFuIGFwcCBzaG91bGQgcHJvdmlkZSB0aGUKLSAgICAgICAgICogc2FtZSBwcmVmZXJlbmNlcyBuYW1lIG9yIGJlaGF2aW9yIG1heSBiZWNvbWUgZXJyYXRpYy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHByZWZzTmFtZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRpbWVab25lVXRpbHMoU3RyaW5nIHByZWZzTmFtZSkgewotICAgICAgICAgICAgbVByZWZzTmFtZSA9IHByZWZzTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3JtYXRzIGEgZGF0ZSBvciBhIHRpbWUgcmFuZ2UgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBjb252ZW50aW9ucy4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhpcyBmb3JtYXRzIGEgZGF0ZS90aW1lIHJhbmdlIHVzaW5nIENhbGVuZGFyJ3MgdGltZSB6b25lIGFuZCB0aGUKLSAgICAgICAgICogbG9jYWwgY29udmVudGlvbnMgZm9yIHRoZSByZWdpb24gb2YgdGhlIGRldmljZS4KLSAgICAgICAgICoKLSAgICAgICAgICogSWYgdGhlIHtAbGluayBEYXRlVXRpbHMjRk9STUFUX1VUQ30gZmxhZyBpcyB1c2VkIGl0IHdpbGwgcGFzcyBpbgotICAgICAgICAgKiB0aGUgVVRDIHRpbWUgem9uZSBpbnN0ZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBpcyByZXF1aXJlZCBvbmx5IGlmIHRoZSB0aW1lIGlzIHNob3duCi0gICAgICAgICAqIEBwYXJhbSBzdGFydE1pbGxpcyB0aGUgc3RhcnQgdGltZSBpbiBVVEMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEBwYXJhbSBlbmRNaWxsaXMgdGhlIGVuZCB0aW1lIGluIFVUQyBtaWxsaXNlY29uZHMKLSAgICAgICAgICogQHBhcmFtIGZsYWdzIGEgYml0IG1hc2sgb2Ygb3B0aW9ucyBTZWUKLSAgICAgICAgICoge0BsaW5rIERhdGVVdGlscyNmb3JtYXREYXRlUmFuZ2UoQ29udGV4dCwgRm9ybWF0dGVyLCBsb25nLCBsb25nLCBpbnQsIFN0cmluZykgZm9ybWF0RGF0ZVJhbmdlfQotICAgICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZvcm1hdHRlZCBkYXRlL3RpbWUgcmFuZ2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdERhdGVSYW5nZShDb250ZXh0IGNvbnRleHQsIGxvbmcgc3RhcnRNaWxsaXMsCi0gICAgICAgICAgICAgICAgbG9uZyBlbmRNaWxsaXMsIGludCBmbGFncykgewotICAgICAgICAgICAgU3RyaW5nIGRhdGU7Ci0gICAgICAgICAgICBTdHJpbmcgdHo7Ci0gICAgICAgICAgICBpZiAoKGZsYWdzICYgRGF0ZVV0aWxzLkZPUk1BVF9VVEMpICE9IDApIHsKLSAgICAgICAgICAgICAgICB0eiA9IFRpbWUuVElNRVpPTkVfVVRDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0eiA9IGdldFRpbWVab25lKGNvbnRleHQsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtU0IpIHsKLSAgICAgICAgICAgICAgICBtU0Iuc2V0TGVuZ3RoKDApOwotICAgICAgICAgICAgICAgIGRhdGUgPSBEYXRlVXRpbHMuZm9ybWF0RGF0ZVJhbmdlKGNvbnRleHQsIG1GLCBzdGFydE1pbGxpcywgZW5kTWlsbGlzLCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIHR6KS50b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGVzIGEgbmV3IGhvbWUgdGltZSB6b25lIHRvIHRoZSBkYi4KLSAgICAgICAgICoKLSAgICAgICAgICogVXBkYXRlcyB0aGUgaG9tZSB0aW1lIHpvbmUgaW4gdGhlIGRiIGFzeW5jaHJvbm91c2x5IGFuZCB1cGRhdGVzCi0gICAgICAgICAqIHRoZSBsb2NhbCBjYWNoZS4gU2VuZGluZyBhIHRpbWUgem9uZSBvZgotICAgICAgICAgKiB7QGxpbmsgQ2FsZW5kYXJDYWNoZSNUSU1FWk9ORV9UWVBFX0FVVE99IHdpbGwgY2F1c2UgaXQgdG8gYmUgc2V0Ci0gICAgICAgICAqIHRvIHRoZSBkZXZpY2UncyB0aW1lIHpvbmUuIG51bGwgb3IgZW1wdHkgdHogd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGluZyBhY3Rpdml0eQotICAgICAgICAgKiBAcGFyYW0gdGltZVpvbmUgVGhlIHRpbWUgem9uZSB0byBzZXQgQ2FsZW5kYXIgdG8sIG9yCi0gICAgICAgICAqIHtAbGluayBDYWxlbmRhckNhY2hlI1RJTUVaT05FX1RZUEVfQVVUT30KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFRpbWVab25lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHRpbWVab25lKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGltZVpvbmUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVtcHR5IHRpbWUgem9uZSwgbm90aGluZyB0byBiZSBkb25lLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZVByZWZzID0gZmFsc2U7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UWkNhbGxiYWNrcykgewotICAgICAgICAgICAgICAgIGlmIChDYWxlbmRhckNhY2hlLlRJTUVaT05FX1RZUEVfQVVUTy5lcXVhbHModGltZVpvbmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVXNlSG9tZVRaKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQcmVmcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVVzZUhvbWVUWiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVVzZUhvbWVUWiB8fCAhVGV4dFV0aWxzLmVxdWFscyhtSG9tZVRaLCB0aW1lWm9uZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByZWZzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVXNlSG9tZVRaID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbUhvbWVUWiA9IHRpbWVab25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh1cGRhdGVQcmVmcykgewotICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBwcmVmcwotICAgICAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2hhcmVkUHJlZmVyZW5jZXMoY29udGV4dCwgbVByZWZzTmFtZSk7Ci0gICAgICAgICAgICAgICAgc2V0U2hhcmVkUHJlZmVyZW5jZShwcmVmcywgS0VZX0hPTUVfVFpfRU5BQkxFRCwgbVVzZUhvbWVUWik7Ci0gICAgICAgICAgICAgICAgc2V0U2hhcmVkUHJlZmVyZW5jZShwcmVmcywgS0VZX0hPTUVfVFosIG1Ib21lVFopOwotCi0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBkYgotICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5jYW5jZWxPcGVyYXRpb24obVRva2VuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBBc3luY1RaSGFuZGxlcihjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpKTsKLQotICAgICAgICAgICAgICAgIC8vIHNraXAgMCBzbyBxdWVyeSBjYW4gdXNlIGl0Ci0gICAgICAgICAgICAgICAgaWYgKCsrbVRva2VuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVRva2VuID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgdXNlIGhvbWUgdHogc2V0dGluZwotICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQ2FsZW5kYXJDYWNoZS5WQUxVRSwgbVVzZUhvbWVUWiA/IENhbGVuZGFyQ2FjaGUuVElNRVpPTkVfVFlQRV9IT01FCi0gICAgICAgICAgICAgICAgICAgICAgICA6IENhbGVuZGFyQ2FjaGUuVElNRVpPTkVfVFlQRV9BVVRPKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zdGFydFVwZGF0ZShtVG9rZW4sIG51bGwsIENhbGVuZGFyQ2FjaGUuVVJJLCB2YWx1ZXMsIENhbGVuZGFyQ2FjaGUuV0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUSU1FWk9ORV9UWVBFX0FSR1MpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgdXNpbmcgYSBob21lIHR6IHdyaXRlIGl0IHRvIHRoZSBkYgotICAgICAgICAgICAgICAgIGlmIChtVXNlSG9tZVRaKSB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzMiA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlczIucHV0KENhbGVuZGFyQ2FjaGUuVkFMVUUsIG1Ib21lVFopOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5zdGFydFVwZGF0ZShtVG9rZW4sIG51bGwsIENhbGVuZGFyQ2FjaGUuVVJJLCB2YWx1ZXMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGVuZGFyQ2FjaGUuV0hFUkUsIFRJTUVaT05FX0lOU1RBTkNFU19BUkdTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdGltZSB6b25lIHRoYXQgQ2FsZW5kYXIgc2hvdWxkIGJlIGRpc3BsYXllZCBpbgotICAgICAgICAgKgotICAgICAgICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUgem9uZSBmb3IgQ2FsZW5kYXIuIElmIHRoaXMKLSAgICAgICAgICogaXMgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIGl0IHdpbGwgaW5pdGlhdGUgYW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAqIHF1ZXJ5IHRvIHZlcmlmeSB0aGF0IHRoZSBkYXRhIGluIHByZWZlcmVuY2VzIGlzIGNvcnJlY3QuIFRoZSBjYWxsYmFjayBzdXBwbGllZAotICAgICAgICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoaXMgcXVlcnkgcmV0dXJucyBhIHZhbHVlIG90aGVyIHRoYW4gd2hhdCBpcyBzdG9yZWQgaW4KLSAgICAgICAgICogcHJlZmVyZW5jZXMgYW5kIHNob3VsZCBjYXVzZSB0aGUgY2FsbGluZyBhY3Rpdml0eSB0byByZWZyZXNoIGFueXRoaW5nIHRoYXQKLSAgICAgICAgICogZGVwZW5kcyBvbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGluZyBhY3Rpdml0eQotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHJ1bm5hYmxlIHRoYXQgc2hvdWxkIGV4ZWN1dGUgaWYgYSBxdWVyeSByZXR1cm5zIG5ldyB2YWx1ZXMKLSAgICAgICAgICogQHJldHVybiBUaGUgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgdGltZSB6b25lIENhbGVuZGFyIHNob3VsZCBkaXNwbGF5Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWVab25lKENvbnRleHQgY29udGV4dCwgUnVubmFibGUgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRaQ2FsbGJhY2tzKXsKLSAgICAgICAgICAgICAgICBpZiAobUZpcnN0VFpSZXF1ZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UWlF1ZXJ5SW5Qcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1GaXJzdFRaUmVxdWVzdCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2hhcmVkUHJlZmVyZW5jZXMoY29udGV4dCwgbVByZWZzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Vc2VIb21lVFogPSBwcmVmcy5nZXRCb29sZWFuKEtFWV9IT01FX1RaX0VOQUJMRUQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUhvbWVUWiA9IHByZWZzLmdldFN0cmluZyhLRVlfSE9NRV9UWiwgVGltZS5nZXRDdXJyZW50VGltZXpvbmUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgYXN5bmMgcXVlcnkgcmV0dXJucyBpdCBzaG91bGQgc3luY2hyb25pemUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbVRaQ2FsbGJhY2tzLCB1cGRhdGUgbVVzZUhvbWVUWiwgbUhvbWVUWiwgYW5kIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBwcmVmZXJlbmNlcywgc2V0IG1UWlF1ZXJ5SW5Qcm9ncmVzcyB0byBmYWxzZSwgYW5kIGNhbGwgYWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBydW5uYWJsZXMgaW4gbVRaQ2FsbGJhY2tzLgotICAgICAgICAgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgQXN5bmNUWkhhbmRsZXIoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc3RhcnRRdWVyeSgwLCBjb250ZXh0LCBDYWxlbmRhckNhY2hlLlVSSSwgQ2FsZW5kYXJDYWNoZS5QT0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVFpRdWVyeUluUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRaQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Vc2VIb21lVFogPyBtSG9tZVRaIDogVGltZS5nZXRDdXJyZW50VGltZXpvbmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3JjZXMgYSBxdWVyeSBvZiB0aGUgZGF0YWJhc2UgdG8gY2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHRpbWUgem9uZS4KLSAgICAgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGlmIGFub3RoZXIgYXBwIG1heSBoYXZlIG1vZGlmaWVkIHRoZSBkYi4gSWYgYQotICAgICAgICAgKiBxdWVyeSBpcyBhbHJlYWR5IGluIHByb2dyZXNzIHRoZSBjYWxsYmFjayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0Ci0gICAgICAgICAqIG9mIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgd2hlbiBpdCByZXR1cm5zLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FsbGluZyBhY3Rpdml0eQotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHJ1bm5hYmxlIHRoYXQgc2hvdWxkIGV4ZWN1dGUgaWYgYSBxdWVyeSByZXR1cm5zCi0gICAgICAgICAqICAgICAgICAgICAgbmV3IHZhbHVlcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgZm9yY2VEQlJlcXVlcnkoQ29udGV4dCBjb250ZXh0LCBSdW5uYWJsZSBjYWxsYmFjaykgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtVFpDYWxsYmFja3MpewotICAgICAgICAgICAgICAgIGlmIChtVFpRdWVyeUluUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRaQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUZpcnN0VFpSZXF1ZXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBnZXRUaW1lWm9uZShjb250ZXh0LCBjYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgaGVscGVyIG1ldGhvZCBmb3Igd3JpdGluZyBhIFN0cmluZyB2YWx1ZSB0byB0aGUgcHJlZmVyZW5jZXMKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCB3aXRoIGFjY2VzcyB0byB0aGUgY29ycmVjdCBwcmVmZXJlbmNlcwotICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBwcmVmZXJlbmNlIHRvIHdyaXRlIHRvCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaGFyZWRQcmVmZXJlbmNlKFNoYXJlZFByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLS8vICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTaGFyZWRQcmVmZXJlbmNlcyhjb250ZXh0KTsKLSAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBwcmVmcy5lZGl0KCk7Ci0gICAgICAgICAgICBlZGl0b3IucHV0U3RyaW5nKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZWRpdG9yLmFwcGx5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBoZWxwZXIgbWV0aG9kIGZvciB3cml0aW5nIGEgYm9vbGVhbiB2YWx1ZSB0byB0aGUgcHJlZmVyZW5jZXMKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dCB3aXRoIGFjY2VzcyB0byB0aGUgY29ycmVjdCBwcmVmZXJlbmNlcwotICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBwcmVmZXJlbmNlIHRvIHdyaXRlIHRvCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaGFyZWRQcmVmZXJlbmNlKFNoYXJlZFByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmcga2V5LCBib29sZWFuIHZhbHVlKSB7Ci0vLyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2hhcmVkUHJlZmVyZW5jZXMoY29udGV4dCwgcHJlZnNOYW1lKTsKLSAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBwcmVmcy5lZGl0KCk7Ci0gICAgICAgICAgICBlZGl0b3IucHV0Qm9vbGVhbihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGVkaXRvci5hcHBseSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIFJldHVybiBhIHByb3Blcmx5IGNvbmZpZ3VyZWQgU2hhcmVkUHJlZmVyZW5jZXMgaW5zdGFuY2UgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTaGFyZWRQcmVmZXJlbmNlcyBnZXRTaGFyZWRQcmVmZXJlbmNlcyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyBwcmVmc05hbWUpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldFNoYXJlZFByZWZlcmVuY2VzKHByZWZzTmFtZSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOwotICAgICAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzLmphdmEKaW5kZXggODAxOGZmOS4uZDU5NDU2NyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9EaXNwbGF5TWV0cmljcy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRGlzcGxheU1ldHJpY3MuamF2YQpAQCAtMzgsNiArMzgsMTUgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX01FRElVTSA9IDE2MDsKIAogICAgIC8qKgorICAgICAqIFN0YW5kYXJkIHF1YW50aXplZCBEUEkgZm9yIDcyMHAgVFYgc2NyZWVucy4gIEFwcGxpY2F0aW9ucyBzaG91bGQKKyAgICAgKiBnZW5lcmFsbHkgbm90IHdvcnJ5IGFib3V0IHRoaXMgZGVuc2l0eSwgaW5zdGVhZCB0YXJnZXRpbmcKKyAgICAgKiB7QGxpbmsgI0RFTlNJVFlfWEhJR0h9IGZvciAxMDgwcCBUViBzY3JlZW5zLiAgRm9yIHNpdHVhdGlvbnMgd2hlcmUKKyAgICAgKiBvdXRwdXQgaXMgbmVlZGVkIGZvciBhIDcyMHAgc2NyZWVuLCB0aGUgVUkgZWxlbWVudHMgY2FuIGJlIHNjYWxlZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBsYXRmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTlNJVFlfVFYgPSAyMTM7CisKKyAgICAvKioKICAgICAgKiBTdGFuZGFyZCBxdWFudGl6ZWQgRFBJIGZvciBoaWdoLWRlbnNpdHkgc2NyZWVucy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERU5TSVRZX0hJR0ggPSAyNDA7CkBAIC0xMDUsMTAgKzExNCwxOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBmbG9hdCB5ZHBpOwogCi0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIGludCByZWFsV2lkdGhQaXhlbHM7Ci0gICAgLyoqIEBoaWRlICovCi0gICAgcHVibGljIGludCByZWFsSGVpZ2h0UGl4ZWxzOworICAgIC8qKgorICAgICAqIFRoZSByZXBvcnRlZCBkaXNwbGF5IHdpZHRoIHByaW9yIHRvIGFueSBjb21wYXRpYmlsaXR5IG1vZGUgc2NhbGluZworICAgICAqIGJlaW5nIGFwcGxpZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVuc2NhbGVkV2lkdGhQaXhlbHM7CisgICAgLyoqCisgICAgICogVGhlIHJlcG9ydGVkIGRpc3BsYXkgaGVpZ2h0IHByaW9yIHRvIGFueSBjb21wYXRpYmlsaXR5IG1vZGUgc2NhbGluZworICAgICAqIGJlaW5nIGFwcGxpZWQuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHVuc2NhbGVkSGVpZ2h0UGl4ZWxzOwogCiAgICAgcHVibGljIERpc3BsYXlNZXRyaWNzKCkgewogICAgIH0KQEAgLTEyMSw4ICsxMzgsOCBAQAogICAgICAgICBzY2FsZWREZW5zaXR5ID0gby5zY2FsZWREZW5zaXR5OwogICAgICAgICB4ZHBpID0gby54ZHBpOwogICAgICAgICB5ZHBpID0gby55ZHBpOwotICAgICAgICByZWFsV2lkdGhQaXhlbHMgPSBvLnJlYWxXaWR0aFBpeGVsczsKLSAgICAgICAgcmVhbEhlaWdodFBpeGVscyA9IG8ucmVhbEhlaWdodFBpeGVsczsKKyAgICAgICAgdW5zY2FsZWRXaWR0aFBpeGVscyA9IG8udW5zY2FsZWRXaWR0aFBpeGVsczsKKyAgICAgICAgdW5zY2FsZWRIZWlnaHRQaXhlbHMgPSBvLnVuc2NhbGVkSGVpZ2h0UGl4ZWxzOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHRzKCkgewpAQCAtMTMzLDggKzE1MCw4IEBACiAgICAgICAgIHNjYWxlZERlbnNpdHkgPSBkZW5zaXR5OwogICAgICAgICB4ZHBpID0gREVOU0lUWV9ERVZJQ0U7CiAgICAgICAgIHlkcGkgPSBERU5TSVRZX0RFVklDRTsKLSAgICAgICAgcmVhbFdpZHRoUGl4ZWxzID0gMDsKLSAgICAgICAgcmVhbEhlaWdodFBpeGVscyA9IDA7CisgICAgICAgIHVuc2NhbGVkV2lkdGhQaXhlbHMgPSAwOworICAgICAgICB1bnNjYWxlZEhlaWdodFBpeGVscyA9IDA7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Zpbml0ZVBvb2wuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluaXRlUG9vbC5qYXZhCmluZGV4IDNlZjgyOTMuLmIzMGYyYmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluaXRlUG9vbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvRmluaXRlUG9vbC5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiAgKiBAaGlkZQogICovCiBjbGFzcyBGaW5pdGVQb29sPFQgZXh0ZW5kcyBQb29sYWJsZTxUPj4gaW1wbGVtZW50cyBQb29sPFQ+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJGaW5pdGVQb29sIjsKKwogICAgIC8qKgogICAgICAqIEZhY3RvcnkgdXNlZCB0byBjcmVhdGUgbmV3IHBvb2wgb2JqZWN0cwogICAgICAqLwpAQCAtNjksNiArNzEsNyBAQAogCiAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIGVsZW1lbnQuc2V0TmV4dFBvb2xhYmxlKG51bGwpOworICAgICAgICAgICAgZWxlbWVudC5zZXRQb29sZWQoZmFsc2UpOwogICAgICAgICAgICAgbU1hbmFnZXIub25BY3F1aXJlZChlbGVtZW50KTsgICAgICAgICAgICAKICAgICAgICAgfQogCkBAIC03NiwxMSArNzksMTYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKFQgZWxlbWVudCkgewotICAgICAgICBpZiAobUluZmluaXRlIHx8IG1Qb29sQ291bnQgPCBtTGltaXQpIHsKLSAgICAgICAgICAgIG1Qb29sQ291bnQrKzsKLSAgICAgICAgICAgIGVsZW1lbnQuc2V0TmV4dFBvb2xhYmxlKG1Sb290KTsKLSAgICAgICAgICAgIG1Sb290ID0gZWxlbWVudDsKKyAgICAgICAgaWYgKCFlbGVtZW50LmlzUG9vbGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChtSW5maW5pdGUgfHwgbVBvb2xDb3VudCA8IG1MaW1pdCkgeworICAgICAgICAgICAgICAgIG1Qb29sQ291bnQrKzsKKyAgICAgICAgICAgICAgICBlbGVtZW50LnNldE5leHRQb29sYWJsZShtUm9vdCk7CisgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRQb29sZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVJvb3QgPSBlbGVtZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1hbmFnZXIub25SZWxlYXNlZChlbGVtZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFbGVtZW50IGlzIGFscmVhZHkgaW4gcG9vbDogIiArIGVsZW1lbnQpOwogICAgICAgICB9Ci0gICAgICAgIG1NYW5hZ2VyLm9uUmVsZWFzZWQoZWxlbWVudCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GbG9hdFByb3BlcnR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0Zsb2F0UHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjdiM2NiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9GbG9hdFByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Qcm9wZXJ0eTsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYW5kcm9pZC51dGlsLlByb3BlcnR5fSB0byBiZSB1c2VkIHNwZWNpZmljYWxseSB3aXRoIGZpZWxkcyBvZiB0eXBlCisgKiA8Y29kZT5mbG9hdDwvY29kZT4uIFRoaXMgdHlwZS1zcGVjaWZpYyBzdWJjbGFzcyBlbmFibGVzIHBlcmZvcm1hbmNlIGJlbmVmaXQgYnkgYWxsb3dpbmcKKyAqIGNhbGxzIHRvIGEge0BsaW5rICNzZXQoT2JqZWN0LCBGbG9hdCkgc2V0KCl9IGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIHByaW1pdGl2ZQorICogPGNvZGU+ZmxvYXQ8L2NvZGU+IHR5cGUgYW5kIGF2b2lkcyBhdXRvYm94aW5nIGFuZCBvdGhlciBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiA8Y29kZT5GbG9hdDwvY29kZT4gY2xhc3MuCisgKgorICogQHBhcmFtIDxUPiBUaGUgY2xhc3Mgb24gd2hpY2ggdGhlIFByb3BlcnR5IGlzIGRlY2xhcmVkLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGbG9hdFByb3BlcnR5PFQ+IGV4dGVuZHMgUHJvcGVydHk8VCwgRmxvYXQ+IHsKKworICAgIHB1YmxpYyBGbG9hdFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKEZsb2F0LmNsYXNzLCBuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHR5cGUtc3BlY2lmaWMgb3ZlcnJpZGUgb2YgdGhlIHtAbGluayAjc2V0KE9iamVjdCwgRmxvYXQpfSB0aGF0IGlzIGZhc3RlciB3aGVuIGRlYWxpbmcKKyAgICAgKiB3aXRoIGZpZWxkcyBvZiB0eXBlIDxjb2RlPmZsb2F0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShUIG9iamVjdCwgZmxvYXQgdmFsdWUpOworCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgc2V0KFQgb2JqZWN0LCBGbG9hdCB2YWx1ZSkgeworICAgICAgICBzZXRWYWx1ZShvYmplY3QsIHZhbHVlKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ludFByb3BlcnR5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0ludFByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5ZDZiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvSW50UHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgYW5kcm9pZC51dGlsLlByb3BlcnR5OworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLnV0aWwuUHJvcGVydHl9IHRvIGJlIHVzZWQgc3BlY2lmaWNhbGx5IHdpdGggZmllbGRzIG9mIHR5cGUKKyAqIDxjb2RlPmludDwvY29kZT4uIFRoaXMgdHlwZS1zcGVjaWZpYyBzdWJjbGFzcyBlbmFibGVzIHBlcmZvcm1hbmNlIGJlbmVmaXQgYnkgYWxsb3dpbmcKKyAqIGNhbGxzIHRvIGEge0BsaW5rICNzZXQoT2JqZWN0LCBJbnRlZ2VyKSBzZXQoKX0gZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgcHJpbWl0aXZlCisgKiA8Y29kZT5pbnQ8L2NvZGU+IHR5cGUgYW5kIGF2b2lkcyBhdXRvYm94aW5nIGFuZCBvdGhlciBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSBjbGFzcyBvbiB3aGljaCB0aGUgUHJvcGVydHkgaXMgZGVjbGFyZWQuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEludFByb3BlcnR5PFQ+IGV4dGVuZHMgUHJvcGVydHk8VCwgSW50ZWdlcj4geworCisgICAgcHVibGljIEludFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKEludGVnZXIuY2xhc3MsIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdHlwZS1zcGVjaWZpYyBvdmVycmlkZSBvZiB0aGUge0BsaW5rICNzZXQoT2JqZWN0LCBJbnRlZ2VyKX0gdGhhdCBpcyBmYXN0ZXIgd2hlbiBkZWFsaW5nCisgICAgICogd2l0aCBmaWVsZHMgb2YgdHlwZSA8Y29kZT5pbnQ8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFZhbHVlKFQgb2JqZWN0LCBpbnQgdmFsdWUpOworCisgICAgQE92ZXJyaWRlCisgICAgZmluYWwgcHVibGljIHZvaWQgc2V0KFQgb2JqZWN0LCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgIHNldChvYmplY3QsIHZhbHVlLmludFZhbHVlKCkpOworICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Mb2NhbGVVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhOTMwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgbGliY29yZS5pY3UuSUNVOworCisvKioKKyAqIFZhcmlvdXMgdXRpbGl0aWVzIGZvciBMb2NhbGVzCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIExvY2FsZVV0aWwgeworCisgICAgcHJpdmF0ZSBMb2NhbGVVdGlsKCkgeyAvKiBjYW5ub3QgYmUgaW5zdGFudGlhdGVkICovIH0KKworICAgIC8qKgorICAgICAqIEBoaWRlIERvIG5vdCB1c2UuIEltcGxlbWVudGF0aW9uIG5vdCBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0xBWU9VVF9ESVJFQ1RJT05fVU5ERUZJTkVEX0RPX05PVF9VU0UgPSAtMTsKKworICAgIC8qKgorICAgICAqIEBoaWRlIERvIG5vdCB1c2UuIEltcGxlbWVudGF0aW9uIG5vdCBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUX0xBWU9VVF9ESVJFQ1RJT05fTFRSX0RPX05PVF9VU0UgPSAwOworCisgICAgLyoqCisgICAgICogQGhpZGUgRG8gbm90IHVzZS4gSW1wbGVtZW50YXRpb24gbm90IGZpbmlzaGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSA9IDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFVOREVSU0NPUkVfQ0hBUiA9ICdfJzsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBBUkFCX1NDUklQVF9TVUJUQUcgPSAiQXJhYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEhFQlJfU0NSSVBUX1NVQlRBRyA9ICJIZWJyIjsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGF5b3V0IGRpcmVjdGlvbiBmb3IgYSBnaXZlbiBMb2NhbGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbGUgdGhlIExvY2FsZSBmb3Igd2hpY2ggd2Ugd2FudCB0aGUgbGF5b3V0IGRpcmVjdGlvbi4gQ2FuIGJlIG51bGwuCisgICAgICogQHJldHVybiB0aGUgbGF5b3V0IGRpcmVjdGlvbi4gVGhpcyBtYXkgYmUgb25lIG9mOgorICAgICAqIHtAbGluayAjVEVYVF9MQVlPVVRfRElSRUNUSU9OX1VOREVGSU5FRF9ET19OT1RfVVNFfSBvcgorICAgICAqIHtAbGluayAjVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFfSBvcgorICAgICAqIHtAbGluayAjVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFfS4KKyAgICAgKgorICAgICAqIEJlIGNhcmVmdWw6IHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCB3aGVuIHZlcnRpY2FsIHNjcmlwdHMgd2lsbCBiZSBzdXBwb3J0ZWQKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIGlmIChsb2NhbGUgPT0gbnVsbCB8fCBsb2NhbGUuZXF1YWxzKExvY2FsZS5ST09UKSkgeworICAgICAgICAgICAgcmV0dXJuIFRFWFRfTEFZT1VUX0RJUkVDVElPTl9VTkRFRklORURfRE9fTk9UX1VTRTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBzY3JpcHRTdWJ0YWcgPSBJQ1UuZ2V0U2NyaXB0KElDVS5hZGRMaWtlbHlTdWJ0YWdzKGxvY2FsZS50b1N0cmluZygpKSk7CisgICAgICAgIGlmIChzY3JpcHRTdWJ0YWcgPT0gbnVsbCkgcmV0dXJuIGdldExheW91dERpcmVjdGlvbkZyb21GaXJzdENoYXIobG9jYWxlKTsKKworICAgICAgICBpZiAoc2NyaXB0U3VidGFnLmVxdWFsc0lnbm9yZUNhc2UoQVJBQl9TQ1JJUFRfU1VCVEFHKSB8fAorICAgICAgICAgICAgICAgIHNjcmlwdFN1YnRhZy5lcXVhbHNJZ25vcmVDYXNlKEhFQlJfU0NSSVBUX1NVQlRBRykpIHsKKyAgICAgICAgICAgIHJldHVybiBURVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWxsYmFjayBhbGdvcml0aG0gdG8gZGV0ZWN0IHRoZSBsb2NhbGUgZGlyZWN0aW9uLiBSZWx5IG9uIHRoZSBmaXN0IGNoYXIgb2YgdGhlCisgICAgICogbG9jYWxpemVkIGxvY2FsZSBuYW1lLiBUaGlzIHdpbGwgbm90IHdvcmsgaWYgdGhlIGxvY2FsaXplZCBsb2NhbGUgbmFtZSBpcyBpbiBFbmdsaXNoCisgICAgICogKHRoaXMgaXMgdGhlIGNhc2UgZm9yIElDVSA0LjQgYW5kICJVcmR1IiBzY3JpcHQpCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlCisgICAgICogQHJldHVybiB0aGUgbGF5b3V0IGRpcmVjdGlvbi4gVGhpcyBtYXkgYmUgb25lIG9mOgorICAgICAqIHtAbGluayAjVEVYVF9MQVlPVVRfRElSRUNUSU9OX1VOREVGSU5FRF9ET19OT1RfVVNFfSBvcgorICAgICAqIHtAbGluayAjVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFfSBvcgorICAgICAqIHtAbGluayAjVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFfS4KKyAgICAgKgorICAgICAqIEJlIGNhcmVmdWw6IHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gYmUgY2hhbmdlZCB3aGVuIHZlcnRpY2FsIHNjcmlwdHMgd2lsbCBiZSBzdXBwb3J0ZWQKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExheW91dERpcmVjdGlvbkZyb21GaXJzdENoYXIoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICBzd2l0Y2goQ2hhcmFjdGVyLmdldERpcmVjdGlvbmFsaXR5KGxvY2FsZS5nZXREaXNwbGF5TmFtZShsb2NhbGUpLmNoYXJBdCgwKSkpIHsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX0xFRlRfVE9fUklHSFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRTsKKyAgICAgICAgICAgIGNhc2UgQ2hhcmFjdGVyLkRJUkVDVElPTkFMSVRZX1JJR0hUX1RPX0xFRlQ6CisgICAgICAgICAgICBjYXNlIENoYXJhY3Rlci5ESVJFQ1RJT05BTElUWV9SSUdIVF9UT19MRUZUX0FSQUJJQzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVEVYVF9MQVlPVVRfRElSRUNUSU9OX1VOREVGSU5FRF9ET19OT1RfVVNFOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Mb2cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvTG9nLmphdmEKaW5kZXggMzg5MDNhYi4uMWMzNzA5ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Mb2cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL0xvZy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogCiAvKioKICAqIEFQSSBmb3Igc2VuZGluZyBsb2cgb3V0cHV0LgpAQCAtMzAyLDYgKzMwMywxNyBAQAogICAgICAgICBpZiAodHIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBpcyB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBsb2cgc3BldyB0aGF0IGFwcHMgZG8gaW4gdGhlIG5vbi1lcnJvcgorICAgICAgICAvLyBjb25kaXRpb24gb2YgdGhlIG5ldHdvcmsgYmVpbmcgdW5hdmFpbGFibGUuCisgICAgICAgIFRocm93YWJsZSB0ID0gdHI7CisgICAgICAgIHdoaWxlICh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgVW5rbm93bkhvc3RFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gdC5nZXRDYXVzZSgpOworICAgICAgICB9CisKICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CiAgICAgICAgIHRyLnByaW50U3RhY2tUcmFjZShwdyk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL05vU3VjaFByb3BlcnR5RXhjZXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL05vU3VjaFByb3BlcnR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzZjk4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvTm9TdWNoUHJvcGVydHlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCisvKioKKyAqIFRocm93biB3aGVuIGNvZGUgcmVxdWVzdHMgYSB7QGxpbmsgUHJvcGVydHl9IG9uIGEgY2xhc3MgdGhhdCBkb2VzCisgKiBub3QgZXhwb3NlIHRoZSBhcHByb3ByaWF0ZSBtZXRob2Qgb3IgZmllbGQuCisgKgorICogQHNlZSBQcm9wZXJ0eSNvZihqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5DbGFzcywgamF2YS5sYW5nLlN0cmluZykKKyAqLworcHVibGljIGNsYXNzIE5vU3VjaFByb3BlcnR5RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgTm9TdWNoUHJvcGVydHlFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1Bvb2xhYmxlLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1Bvb2xhYmxlLmphdmEKaW5kZXggZmQ5YmQ5Yi4uODdlMDUyOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Qb29sYWJsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUG9vbGFibGUuamF2YQpAQCAtMjIsNCArMjIsNiBAQAogcHVibGljIGludGVyZmFjZSBQb29sYWJsZTxUPiB7CiAgICAgdm9pZCBzZXROZXh0UG9vbGFibGUoVCBlbGVtZW50KTsKICAgICBUIGdldE5leHRQb29sYWJsZSgpOworICAgIGJvb2xlYW4gaXNQb29sZWQoKTsKKyAgICB2b2lkIHNldFBvb2xlZChib29sZWFuIGlzUG9vbGVkKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUHJvcGVydHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3V0aWwvUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDZkYjgwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9Qcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCisKKy8qKgorICogQSBwcm9wZXJ0eSBpcyBhbiBhYnN0cmFjdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIDxlbWI+bXV0YWJsZTwvZW0+IHZhbHVlIHRoYXQgaXMgaGVsZAorICogaW4gYSA8ZW0+aG9zdDwvZW0+IG9iamVjdC4gVGhlIFByb3BlcnR5J3Mge0BsaW5rICNzZXQoT2JqZWN0LCBPYmplY3QpfSBvciB7QGxpbmsgI2dldChPYmplY3QpfQorICogbWV0aG9kcyBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIHByaXZhdGUgZmllbGRzIG9mIHRoZSBob3N0IG9iamVjdCwgb3IgdmlhICJzZXR0ZXIiIGFuZAorICogImdldHRlciIgbWV0aG9kcyBvciBieSBzb21lIG90aGVyIG1lY2hhbmlzbSwgYXMgYXBwcm9wcmlhdGUuCisgKgorICogQHBhcmFtIDxUPiBUaGUgY2xhc3Mgb24gd2hpY2ggdGhlIHByb3BlcnR5IGlzIGRlY2xhcmVkLgorICogQHBhcmFtIDxWPiBUaGUgdHlwZSB0aGF0IHRoaXMgcHJvcGVydHkgcmVwcmVzZW50cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5PFQsIFY+IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Vj4gbVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIGNyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm9wZXJ0eSBnaXZlbiB0aGUgPGNvZGU+Y2xhc3M8L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPm5hbWU8L2NvZGU+IHBhcmFtZXRlcnMsIHdoZXJlIHRoZSA8Y29kZT4ibmFtZSI8L2NvZGU+IHBhcmFtZXRlciByZXByZXNlbnRzIGVpdGhlcjoKKyAgICAgKiA8dWw+CisgICAgICogICAgIDxsaT5hIHB1YmxpYyA8Y29kZT5nZXROYW1lKCk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgY2xhc3Mgd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLCBwbHVzIGFuCisgICAgICogICAgIG9wdGlvbmFsIHB1YmxpYyA8Y29kZT5zZXROYW1lKCk8L2NvZGU+IG1ldGhvZCB3aGljaCB0YWtlcyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUKKyAgICAgKiAgICAgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0TmFtZSgpPC9jb2RlPgorICAgICAqICAgICA8bGk+YSBwdWJsaWMgPGNvZGU+aXNOYW1lKCk8L2NvZGU+IG1ldGhvZCBvbiB0aGUgY2xhc3Mgd2hpY2ggdGFrZXMgbm8gYXJndW1lbnRzLCBwbHVzIGFuCisgICAgICogICAgIG9wdGlvbmFsIHB1YmxpYyA8Y29kZT5zZXROYW1lKCk8L2NvZGU+IG1ldGhvZCB3aGljaCB0YWtlcyBhIHZhbHVlIG9mIHRoZSBzYW1lIHR5cGUKKyAgICAgKiAgICAgcmV0dXJuZWQgYnkgPGNvZGU+aXNOYW1lKCk8L2NvZGU+CisgICAgICogICAgIDxsaT5hIHB1YmxpYyA8Y29kZT5uYW1lPC9jb2RlPiBmaWVsZCBvbiB0aGUgY2xhc3MKKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogPHA+SWYgZWl0aGVyIG9mIHRoZSBnZXQvaXMgbWV0aG9kIGFsdGVybmF0aXZlcyBpcyBmb3VuZCBvbiB0aGUgY2xhc3MsIGJ1dCBhbiBhcHByb3ByaWF0ZQorICAgICAqIDxjb2RlPnNldE5hbWUoKTwvY29kZT4gbWV0aG9kIGlzIG5vdCBmb3VuZCwgdGhlIDxjb2RlPlByb3BlcnR5PC9jb2RlPiB3aWxsIGJlCisgICAgICoge0BsaW5rICNpc1JlYWRPbmx5KCkgcmVhZE9ubHl9LiBDYWxsaW5nIHRoZSB7QGxpbmsgI3NldChPYmplY3QsIE9iamVjdCl9IG1ldGhvZCBvbiBzdWNoCisgICAgICogYSBwcm9wZXJ0eSBpcyBhbGxvd2VkLCBidXQgd2lsbCBoYXZlIG5vIGVmZmVjdC48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiBuZWl0aGVyIHRoZSBtZXRob2RzIG5vciB0aGUgZmllbGQgYXJlIGZvdW5kIG9uIHRoZSBjbGFzcyBhCisgICAgICoge0BsaW5rIE5vU3VjaFByb3BlcnR5RXhjZXB0aW9ufSBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQsIFY+IFByb3BlcnR5PFQsIFY+IG9mKENsYXNzPFQ+IGhvc3RUeXBlLCBDbGFzczxWPiB2YWx1ZVR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVmbGVjdGl2ZVByb3BlcnR5PFQsIFY+KGhvc3RUeXBlLCB2YWx1ZVR5cGUsIG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBpZGVudGlmeWluZyBuYW1lIGFuZCB7QGxpbmsgI2dldFR5cGUoKSB0eXBlfSBmb3IgdGhlIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0eShDbGFzczxWPiB0eXBlLCBTdHJpbmcgbmFtZSkgeworICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIG1UeXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayAjc2V0KE9iamVjdCwgT2JqZWN0KX0gbWV0aG9kIGRvZXMgbm90IHNldCB0aGUgdmFsdWUgb24gdGhlIHRhcmdldAorICAgICAqIG9iamVjdCAoaW4gd2hpY2ggY2FzZSB0aGUge0BsaW5rICNzZXQoT2JqZWN0LCBPYmplY3QpIHNldCgpfSBtZXRob2Qgc2hvdWxkIHRocm93IGEge0BsaW5rCisgICAgICogTm9TdWNoUHJvcGVydHlFeGNlcHRpb259IGV4Y2VwdGlvbikuIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUgUHJvcGVydHkgd3JhcHMgZnVuY3Rpb25hbGl0eSB0aGF0CisgICAgICogYWxsb3dzIHF1ZXJ5aW5nIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGJ1dCBub3Qgc2V0dGluZyBpdC4gRm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgI29mKENsYXNzLAorICAgICAqIENsYXNzLCBTdHJpbmcpfSBmYWN0b3J5IG1ldGhvZCBtYXkgcmV0dXJuIGEgUHJvcGVydHkgd2l0aCBuYW1lICJmb28iIGZvciBhbiBvYmplY3QgdGhhdCBoYXMKKyAgICAgKiBvbmx5IGEgPGNvZGU+Z2V0Rm9vKCk8L2NvZGU+IG9yIDxjb2RlPmlzRm9vKCk8L2NvZGU+IG1ldGhvZCwgYnV0IG5vIG1hdGNoaW5nCisgICAgICogPGNvZGU+c2V0Rm9vKCk8L2NvZGU+IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb24gPGNvZGU+b2JqZWN0PC9jb2RlPiB3aGljaCB0aGlzIHByb3BlcnR5IHJlcHJlc2VudHMuIElmIHRoZSBtZXRob2QgaXMgdW5hYmxlCisgICAgICogdG8gc2V0IHRoZSB2YWx1ZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCBpdCB3aWxsIHRocm93IGFuIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0KKyAgICAgKiBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KFQgb2JqZWN0LCBWIHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUHJvcGVydHkgIiArIGdldE5hbWUoKSArIiBpcyByZWFkLW9ubHkiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIHRoYXQgdGhpcyBwcm9wZXJ0eSByZXByZXNlbnRzIG9uIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBWIGdldChUIG9iamVjdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIGZvciB0aGlzIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgZm9yIHRoaXMgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIENsYXNzPFY+IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBtVHlwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC91dGlsL1JlZmxlY3RpdmVQcm9wZXJ0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9SZWZsZWN0aXZlUHJvcGVydHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMyMjQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdXRpbC9SZWZsZWN0aXZlUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEludGVybmFsIGNsYXNzIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBQcm9wZXJ0eSBmb3IgYSBnaXZlbiBjbGFzcy9uYW1lIHBhaXIsIGdpdmVuIHRoZQorICogc3BlY2lmaWNhdGlvbiBvZiB7QGxpbmsgUHJvcGVydHkjb2YoamF2YS5sYW5nLkNsYXNzLCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEubGFuZy5TdHJpbmcpfQorICovCitjbGFzcyBSZWZsZWN0aXZlUHJvcGVydHk8VCwgVj4gZXh0ZW5kcyBQcm9wZXJ0eTxULCBWPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0dFVCA9ICJnZXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfSVMgPSAiaXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfU0VUID0gInNldCI7CisgICAgcHJpdmF0ZSBNZXRob2QgbVNldHRlcjsKKyAgICBwcml2YXRlIE1ldGhvZCBtR2V0dGVyOworICAgIHByaXZhdGUgRmllbGQgbUZpZWxkOworCisgICAgLyoqCisgICAgICogRm9yIGdpdmVuIHByb3BlcnR5IG5hbWUgJ25hbWUnLCBsb29rIGZvciBnZXROYW1lL2lzTmFtZSBtZXRob2Qgb3IgJ25hbWUnIGZpZWxkLgorICAgICAqIEFsc28gbG9vayBmb3Igc2V0TmFtZSBtZXRob2QgKG9wdGlvbmFsIC0gY291bGQgYmUgcmVhZG9ubHkpLiBGYWlsaW5nIG1ldGhvZCBnZXR0ZXJzIGFuZAorICAgICAqIGZpZWxkIHJlc3VsdHMgaW4gdGhyb3dpbmcgTm9TdWNoUHJvcGVydHlFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlIb2xkZXIgVGhlIGNsYXNzIG9uIHdoaWNoIHRoZSBtZXRob2RzIG9yIGZpZWxkIGFyZSBmb3VuZAorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSwgd2hlcmUgdGhpcyBuYW1lIGlzIGNhcGl0YWxpemVkIGFuZCBhcHBlbmRlZCB0bworICAgICAqICJnZXQiIGFuZCAiaXMgdG8gc2VhcmNoIGZvciB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kcy4gSWYgdGhlIGdldC9pcyBtZXRob2RzIGFyZSBub3QgZm91bmQsCisgICAgICogdGhlIGNvbnN0cnVjdG9yIHdpbGwgc2VhcmNoIGZvciBhIGZpZWxkIHdpdGggdGhhdCBleGFjdCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBSZWZsZWN0aXZlUHJvcGVydHkoQ2xhc3M8VD4gcHJvcGVydHlIb2xkZXIsIENsYXNzPFY+IHZhbHVlVHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgIC8vIFRPRE86IGNhY2hlIHJlZmxlY3Rpb24gaW5mbyBmb3IgZWFjaCBuZXcgY2xhc3MvbmFtZSBwYWlyCisgICAgICAgIHN1cGVyKHZhbHVlVHlwZSwgbmFtZSk7CisgICAgICAgIGNoYXIgZmlyc3RMZXR0ZXIgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UobmFtZS5jaGFyQXQoMCkpOworICAgICAgICBTdHJpbmcgdGhlUmVzdCA9IG5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBTdHJpbmcgY2FwaXRhbGl6ZWROYW1lID0gZmlyc3RMZXR0ZXIgKyB0aGVSZXN0OworICAgICAgICBTdHJpbmcgZ2V0dGVyTmFtZSA9IFBSRUZJWF9HRVQgKyBjYXBpdGFsaXplZE5hbWU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtR2V0dGVyID0gcHJvcGVydHlIb2xkZXIuZ2V0TWV0aG9kKGdldHRlck5hbWUsIChDbGFzczw/PltdKW51bGwpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZ2V0TmFtZSgpIG5vdCBhdmFpbGFibGUgLSB0cnkgaXNOYW1lKCkgaW5zdGVhZAorICAgICAgICAgICAgZ2V0dGVyTmFtZSA9IFBSRUZJWF9JUyArIGNhcGl0YWxpemVkTmFtZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUdldHRlciA9IHByb3BlcnR5SG9sZGVyLmdldE1ldGhvZChnZXR0ZXJOYW1lLCAoQ2xhc3M8Pz5bXSludWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgIC8vIFRyeSBwdWJsaWMgZmllbGQgaW5zdGVhZAorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1GaWVsZCA9IHByb3BlcnR5SG9sZGVyLmdldEZpZWxkKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBDbGFzcyBmaWVsZFR5cGUgPSBtRmllbGQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXR5cGVzTWF0Y2godmFsdWVUeXBlLCBmaWVsZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoUHJvcGVydHlFeGNlcHRpb24oIlVuZGVybHlpbmcgdHlwZSAoIiArIGZpZWxkVHlwZSArICIpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBub3QgbWF0Y2ggUHJvcGVydHkgdHlwZSAoIiArIHZhbHVlVHlwZSArICIpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHdheSB0byBhY2Nlc3MgcHJvcGVydHkgLSB0aHJvdyBhcHByb3ByaWF0ZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaFByb3BlcnR5RXhjZXB0aW9uKCJObyBhY2Nlc3NvciBtZXRob2Qgb3IgZmllbGQgZm91bmQgZm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwcm9wZXJ0eSB3aXRoIG5hbWUgIiArIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDbGFzcyBnZXR0ZXJUeXBlID0gbUdldHRlci5nZXRSZXR1cm5UeXBlKCk7CisgICAgICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBvdXIgZ2V0dGVyIHR5cGUgbWF0Y2hlcyBvdXIgdmFsdWVUeXBlCisgICAgICAgIGlmICghdHlwZXNNYXRjaCh2YWx1ZVR5cGUsIGdldHRlclR5cGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoUHJvcGVydHlFeGNlcHRpb24oIlVuZGVybHlpbmcgdHlwZSAoIiArIGdldHRlclR5cGUgKyAiKSAiICsKKyAgICAgICAgICAgICAgICAgICAgImRvZXMgbm90IG1hdGNoIFByb3BlcnR5IHR5cGUgKCIgKyB2YWx1ZVR5cGUgKyAiKSIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzZXR0ZXJOYW1lID0gUFJFRklYX1NFVCArIGNhcGl0YWxpemVkTmFtZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TZXR0ZXIgPSBwcm9wZXJ0eUhvbGRlci5nZXRNZXRob2Qoc2V0dGVyTmFtZSwgZ2V0dGVyVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAvLyBPa2F5IHRvIG5vdCBoYXZlIGEgc2V0dGVyIC0ganVzdCBhIHJlYWRvbmx5IHByb3BlcnR5CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjaGVjayB3aGV0aGVyIHRoZSB0eXBlIG9mIHRoZSB1bmRlcmx5aW5nIGZpZWxkL21ldGhvZCBvbiB0aGUgdGFyZ2V0CisgICAgICogb2JqZWN0IG1hdGNoZXMgdGhlIHR5cGUgb2YgdGhlIFByb3BlcnR5LiBUaGUgZXh0cmEgY2hlY2tzIGZvciBwcmltaXRpdmUgdHlwZXMgYXJlIGJlY2F1c2UKKyAgICAgKiBnZW5lcmljcyB3aWxsIGZvcmNlIHRoZSBQcm9wZXJ0eSB0eXBlIHRvIGJlIGEgY2xhc3MsIHdoZXJlYXMgdGhlIHR5cGUgb2YgdGhlIHVuZGVybHlpbmcKKyAgICAgKiBtZXRob2QvZmllbGQgd2lsbCBwcm9iYWJseSBiZSBhIHByaW1pdGl2ZSB0eXBlIGluc3RlYWQuIEFjY2VwdCBmbG9hdCBhcyBtYXRjaGluZyBGbG9hdCwKKyAgICAgKiBldGMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHR5cGVzTWF0Y2goQ2xhc3M8Vj4gdmFsdWVUeXBlLCBDbGFzcyBnZXR0ZXJUeXBlKSB7CisgICAgICAgIGlmIChnZXR0ZXJUeXBlICE9IHZhbHVlVHlwZSkgeworICAgICAgICAgICAgaWYgKGdldHRlclR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoZ2V0dGVyVHlwZSA9PSBmbG9hdC5jbGFzcyAmJiB2YWx1ZVR5cGUgPT0gRmxvYXQuY2xhc3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0dGVyVHlwZSA9PSBpbnQuY2xhc3MgJiYgdmFsdWVUeXBlID09IEludGVnZXIuY2xhc3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0dGVyVHlwZSA9PSBib29sZWFuLmNsYXNzICYmIHZhbHVlVHlwZSA9PSBCb29sZWFuLmNsYXNzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGdldHRlclR5cGUgPT0gbG9uZy5jbGFzcyAmJiB2YWx1ZVR5cGUgPT0gTG9uZy5jbGFzcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChnZXR0ZXJUeXBlID09IGRvdWJsZS5jbGFzcyAmJiB2YWx1ZVR5cGUgPT0gRG91YmxlLmNsYXNzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGdldHRlclR5cGUgPT0gc2hvcnQuY2xhc3MgJiYgdmFsdWVUeXBlID09IFNob3J0LmNsYXNzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGdldHRlclR5cGUgPT0gYnl0ZS5jbGFzcyAmJiB2YWx1ZVR5cGUgPT0gQnl0ZS5jbGFzcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChnZXR0ZXJUeXBlID09IGNoYXIuY2xhc3MgJiYgdmFsdWVUeXBlID09IENoYXJhY3Rlci5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0KFQgb2JqZWN0LCBWIHZhbHVlKSB7CisgICAgICAgIGlmIChtU2V0dGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbVNldHRlci5pbnZva2Uob2JqZWN0LCB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobUZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUZpZWxkLnNldChvYmplY3QsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJQcm9wZXJ0eSAiICsgZ2V0TmFtZSgpICsiIGlzIHJlYWQtb25seSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgZ2V0KFQgb2JqZWN0KSB7CisgICAgICAgIGlmIChtR2V0dGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChWKSBtR2V0dGVyLmludm9rZShvYmplY3QsIChPYmplY3RbXSludWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtRmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFYpIG1GaWVsZC5nZXQob2JqZWN0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNob3VsZCBub3QgZ2V0IGhlcmU6IHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSBub24tbnVsbCBnZXR0ZXIgb3IgZmllbGQKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBubyBzZXR0ZXIgb3IgcHVibGljIGZpZWxkIHVuZGVybHlpbmcgdGhpcyBQcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgeworICAgICAgICByZXR1cm4gKG1TZXR0ZXIgPT0gbnVsbCAmJiBtRmllbGQgPT0gbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Db21wYXRpYmlsaXR5SW5mb0hvbGRlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9Db21wYXRpYmlsaXR5SW5mb0hvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOGQ2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0NvbXBhdGliaWxpdHlJbmZvSG9sZGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db21wYXRpYmlsaXR5SW5mbzsKKworLyoqIEBoaWRlICovCitwdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eUluZm9Ib2xkZXIgeworICAgIHByaXZhdGUgdm9sYXRpbGUgQ29tcGF0aWJpbGl0eUluZm8gbUNvbXBhdEluZm8gPSBDb21wYXRpYmlsaXR5SW5mby5ERUZBVUxUX0NPTVBBVElCSUxJVFlfSU5GTzsKKworICAgIHB1YmxpYyB2b2lkIHNldChDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRJbmZvKSB7CisgICAgICAgIGlmIChjb21wYXRJbmZvICE9IG51bGwgJiYgKGNvbXBhdEluZm8uaXNTY2FsaW5nUmVxdWlyZWQoKQorICAgICAgICAgICAgICAgIHx8ICFjb21wYXRJbmZvLnN1cHBvcnRzU2NyZWVuKCkpKSB7CisgICAgICAgICAgICBtQ29tcGF0SW5mbyA9IGNvbXBhdEluZm87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29tcGF0SW5mbyA9IENvbXBhdGliaWxpdHlJbmZvLkRFRkFVTFRfQ09NUEFUSUJJTElUWV9JTkZPOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIENvbXBhdGliaWxpdHlJbmZvIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db21wYXRJbmZvOworICAgIH0KKworICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyBnZXRJZk5lZWRlZCgpIHsKKyAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2kgPSBtQ29tcGF0SW5mbzsKKyAgICAgICAgaWYgKGNpID09IG51bGwgfHwgY2kgID09IENvbXBhdGliaWxpdHlJbmZvLkRFRkFVTFRfQ09NUEFUSUJJTElUWV9JTkZPKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2k7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9EaXNwbGF5LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXkuamF2YQppbmRleCBiNWQzNmQ5Li4zZmE4ZGZkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Rpc3BsYXkuamF2YQpAQCAtMjYsNiArMjYsOSBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCiBwdWJsaWMgY2xhc3MgRGlzcGxheSB7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGlzcGxheSI7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfQ09NUEFUID0gZmFsc2U7CisKICAgICAvKioKICAgICAgKiBTcGVjaWZ5IHRoZSBkZWZhdWx0IERpc3BsYXkKICAgICAgKi8KQEAgLTM4LDcgKzQxLDcgQEAKICAgICAgKiBEaXNwbGF5IGdpdmVzIHlvdSBhY2Nlc3MgdG8gc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgZGlzcGxheQogICAgICAqIGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLgogICAgICAqLwotICAgIERpc3BsYXkoaW50IGRpc3BsYXksIENvbXBhdGliaWxpdHlJbmZvIGNvbXBhdEluZm8pIHsKKyAgICBEaXNwbGF5KGludCBkaXNwbGF5LCBDb21wYXRpYmlsaXR5SW5mb0hvbGRlciBjb21wYXRJbmZvKSB7CiAgICAgICAgIC8vIGluaXRhbGl6ZSB0aGUgc3RhdGljcyB3aGVuIHRoaXMgY2xhc3MgaXMgZmlyc3QgaW5zdGFuc2lhdGVkLiBUaGlzIGlzCiAgICAgICAgIC8vIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBzdGF0aWMgYmxvY2sgYmVjYXVzZSBaeWdvdGUKICAgICAgICAgc3luY2hyb25pemVkIChzU3RhdGljSW5pdCkgewpAQCAtNDcsMTUgKzUwLDIwIEBACiAgICAgICAgICAgICAgICAgc0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoY29tcGF0SW5mbyAhPSBudWxsICYmIChjb21wYXRJbmZvLmlzU2NhbGluZ1JlcXVpcmVkKCkKLSAgICAgICAgICAgICAgICB8fCAhY29tcGF0SW5mby5zdXBwb3J0c1NjcmVlbigpKSkgewotICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvID0gY29tcGF0SW5mbzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mbyA9IG51bGw7Ci0gICAgICAgIH0KKyAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvID0gY29tcGF0SW5mbyAhPSBudWxsID8gY29tcGF0SW5mbyA6IG5ldyBDb21wYXRpYmlsaXR5SW5mb0hvbGRlcigpOwogICAgICAgICBtRGlzcGxheSA9IGRpc3BsYXk7CiAgICAgICAgIGluaXQoZGlzcGxheSk7CiAgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBhdGliaWxpdHlJbmZvKENvbXBhdGliaWxpdHlJbmZvIGNvbXBhdEluZm8pIHsKKyAgICAgICAgaWYgKGNvbXBhdEluZm8gIT0gbnVsbCAmJiAoY29tcGF0SW5mby5pc1NjYWxpbmdSZXF1aXJlZCgpCisgICAgICAgICAgICAgICAgfHwgIWNvbXBhdEluZm8uc3VwcG9ydHNTY3JlZW4oKSkpIHsKKyAgICAgICAgICAgIHNDb21wYXRpYmlsaXR5SW5mbyA9IGNvbXBhdEluZm87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzQ29tcGF0aWJpbGl0eUluZm8gPSBudWxsOworICAgICAgICB9CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgZGlzcGxheS4gIFRoaXMgaXMgY3VycmVudGx5IHVuZGVmaW5lZDsgZG8KQEAgLTgwLDI1ICs4OCwzOSBAQAogICAgICAqIGFkanVzdGVkIGZvciB5b3UgYmFzZWQgb24gdGhlIGN1cnJlbnQgcm90YXRpb24gb2YgdGhlIGRpc3BsYXkuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0U2l6ZShQb2ludCBvdXRTaXplKSB7CisgICAgICAgIGdldFNpemVJbnRlcm5hbChvdXRTaXplLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByYXcgc2l6ZSBvZiB0aGUgZGlzcGxheSwgaW4gcGl4ZWxzLiAgTm90ZSB0aGF0IHRoaXMKKyAgICAgKiBzaG91bGQgPGVtPm5vdDwvZW0+IGdlbmVyYWxseSBiZSB1c2VkIGZvciBjb21wdXRpbmcgbGF5b3V0cywgc2luY2UKKyAgICAgKiBhIGRldmljZSB3aWxsIHR5cGljYWxseSBoYXZlIHNjcmVlbiBkZWNvcmF0aW9uIChzdWNoIGFzIGEgc3RhdHVzIGJhcikKKyAgICAgKiBhbG9uZyB0aGUgZWRnZXMgb2YgdGhlIGRpc3BsYXkgdGhhdCByZWR1Y2UgdGhlIGFtb3VudCBvZiBhcHBsaWNhdGlvbgorICAgICAqIHNwYWNlIGF2YWlsYWJsZSBmcm9tIHRoZSByYXcgc2l6ZSByZXR1cm5lZCBoZXJlLiAgVGhpcyB2YWx1ZSBpcworICAgICAqIGFkanVzdGVkIGZvciB5b3UgYmFzZWQgb24gdGhlIGN1cnJlbnQgcm90YXRpb24gb2YgdGhlIGRpc3BsYXkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldFNpemVJbnRlcm5hbChQb2ludCBvdXRTaXplLCBib29sZWFuIGRvQ29tcGF0KSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBJV2luZG93TWFuYWdlciB3bSA9IGdldFdpbmRvd01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmICh3bSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgd20uZ2V0RGlzcGxheVNpemUob3V0U2l6ZSk7CisgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2k7CisgICAgICAgICAgICAgICAgaWYgKGRvQ29tcGF0ICYmIChjaT1tQ29tcGF0aWJpbGl0eUluZm8uZ2V0SWZOZWVkZWQoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UbXBNZXRyaWNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG1wTWV0cmljcy51bnNjYWxlZFdpZHRoUGl4ZWxzID0gb3V0U2l6ZS54OworICAgICAgICAgICAgICAgICAgICAgICAgbVRtcE1ldHJpY3MudW5zY2FsZWRIZWlnaHRQaXhlbHMgPSBvdXRTaXplLnk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVG1wTWV0cmljcy5kZW5zaXR5ID0gbURlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaS5hcHBseVRvRGlzcGxheU1ldHJpY3MobVRtcE1ldHJpY3MpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZS54ID0gbVRtcE1ldHJpY3Mud2lkdGhQaXhlbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRTaXplLnkgPSBtVG1wTWV0cmljcy5oZWlnaHRQaXhlbHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMganVzdCBmb3IgYm9vdC1zdHJhcHBpbmcsIGluaXRpYWxpemluZyB0aGUKICAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gcHJvY2VzcyBiZWZvcmUgdGhlIHdpbmRvdyBtYW5hZ2VyIGlzIHVwLgogICAgICAgICAgICAgICAgIG91dFNpemUueSA9IGdldFJlYWxIZWlnaHQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ29tcGF0aWJpbGl0eUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcE1ldHJpY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRtcE1ldHJpY3MucmVhbFdpZHRoUGl4ZWxzID0gb3V0U2l6ZS54OwotICAgICAgICAgICAgICAgICAgICBtVG1wTWV0cmljcy5yZWFsSGVpZ2h0UGl4ZWxzID0gb3V0U2l6ZS55OwotICAgICAgICAgICAgICAgICAgICBtVG1wTWV0cmljcy5kZW5zaXR5ID0gbURlbnNpdHk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mby5hcHBseVRvRGlzcGxheU1ldHJpY3MobVRtcE1ldHJpY3MpOwotICAgICAgICAgICAgICAgICAgICBvdXRTaXplLnggPSBtVG1wTWV0cmljcy53aWR0aFBpeGVsczsKLSAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZS55ID0gbVRtcE1ldHJpY3MuaGVpZ2h0UGl4ZWxzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChERUJVR19DT01QQVQgJiYgZG9Db21wYXQpIFNsb2cudihUQUcsICJSZXR1cm5pbmcgZGlzcGxheSBzaXplOiAiICsgb3V0U2l6ZSk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTbG9nLncoIkRpc3BsYXkiLCAiVW5hYmxlIHRvIGdldCBkaXNwbGF5IHNpemUiLCBlKTsKICAgICAgICAgfQpAQCAtMTA5LDcgKzEzMSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0UmVjdFNpemUoUmVjdCBvdXRTaXplKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFBvaW50KSB7Ci0gICAgICAgICAgICBnZXRTaXplKG1UbXBQb2ludCk7CisgICAgICAgICAgICBnZXRTaXplSW50ZXJuYWwobVRtcFBvaW50LCB0cnVlKTsKICAgICAgICAgICAgIG91dFNpemUuc2V0KDAsIDAsIG1UbXBQb2ludC54LCBtVG1wUG9pbnQueSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzcsNyArMTU5LDcgQEAKICAgICAgICAgc3luY2hyb25pemVkIChtVG1wUG9pbnQpIHsKICAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgICAgICBpZiAobm93ID4gKG1MYXN0R2V0VGltZSsyMCkpIHsKLSAgICAgICAgICAgICAgICBnZXRTaXplKG1UbXBQb2ludCk7CisgICAgICAgICAgICAgICAgZ2V0U2l6ZUludGVybmFsKG1UbXBQb2ludCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgbUxhc3RHZXRUaW1lID0gbm93OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1UbXBQb2ludC54OwpAQCAtMTUyLDcgKzE3NCw3IEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFBvaW50KSB7CiAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgaWYgKG5vdyA+IChtTGFzdEdldFRpbWUrMjApKSB7Ci0gICAgICAgICAgICAgICAgZ2V0U2l6ZShtVG1wUG9pbnQpOworICAgICAgICAgICAgICAgIGdldFNpemVJbnRlcm5hbChtVG1wUG9pbnQsIHRydWUpOwogICAgICAgICAgICAgICAgIG1MYXN0R2V0VGltZSA9IG5vdzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtVG1wUG9pbnQueTsKQEAgLTIxOCwxNSArMjQwLDE5IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZ2V0TWV0cmljcyhEaXNwbGF5TWV0cmljcyBvdXRNZXRyaWNzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVRtcFBvaW50KSB7Ci0gICAgICAgICAgICBnZXRTaXplKG1UbXBQb2ludCk7CisgICAgICAgICAgICBnZXRTaXplSW50ZXJuYWwobVRtcFBvaW50LCBmYWxzZSk7CiAgICAgICAgICAgICBvdXRNZXRyaWNzLndpZHRoUGl4ZWxzID0gbVRtcFBvaW50Lng7CiAgICAgICAgICAgICBvdXRNZXRyaWNzLmhlaWdodFBpeGVscyA9IG1UbXBQb2ludC55OwogICAgICAgICB9CiAgICAgICAgIGdldE5vblNpemVNZXRyaWNzKG91dE1ldHJpY3MpOwogCi0gICAgICAgIGlmIChtQ29tcGF0aWJpbGl0eUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbXBhdGliaWxpdHlJbmZvLmFwcGx5VG9EaXNwbGF5TWV0cmljcyhvdXRNZXRyaWNzKTsKKyAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2kgPSBtQ29tcGF0aWJpbGl0eUluZm8uZ2V0SWZOZWVkZWQoKTsKKyAgICAgICAgaWYgKGNpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNpLmFwcGx5VG9EaXNwbGF5TWV0cmljcyhvdXRNZXRyaWNzKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChERUJVR19DT01QQVQpIFNsb2cudihUQUcsICJSZXR1cm5pbmcgRGlzcGxheU1ldHJpY3M6ICIgKyBvdXRNZXRyaWNzLndpZHRoUGl4ZWxzCisgICAgICAgICAgICAgICAgKyAieCIgKyBvdXRNZXRyaWNzLmhlaWdodFBpeGVscyArICIgIiArIG91dE1ldHJpY3MuZGVuc2l0eSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDgsOCArMjc0LDggQEAKICAgICAgICAgb3V0TWV0cmljcy54ZHBpICAgICAgICAgPSBtRHBpWDsKICAgICAgICAgb3V0TWV0cmljcy55ZHBpICAgICAgICAgPSBtRHBpWTsKIAotICAgICAgICBvdXRNZXRyaWNzLnJlYWxXaWR0aFBpeGVscyAgPSBvdXRNZXRyaWNzLndpZHRoUGl4ZWxzOwotICAgICAgICBvdXRNZXRyaWNzLnJlYWxIZWlnaHRQaXhlbHMgPSBvdXRNZXRyaWNzLmhlaWdodFBpeGVsczsKKyAgICAgICAgb3V0TWV0cmljcy51bnNjYWxlZFdpZHRoUGl4ZWxzICA9IG91dE1ldHJpY3Mud2lkdGhQaXhlbHM7CisgICAgICAgIG91dE1ldHJpY3MudW5zY2FsZWRIZWlnaHRQaXhlbHMgPSBvdXRNZXRyaWNzLmhlaWdodFBpeGVsczsKICAgICB9CiAKICAgICBzdGF0aWMgSVdpbmRvd01hbmFnZXIgZ2V0V2luZG93TWFuYWdlcigpIHsKQEAgLTI3MCw3ICsyOTYsNyBAQAogICAgIAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgaW5pdChpbnQgZGlzcGxheSk7CiAKLSAgICBwcml2YXRlIGZpbmFsIENvbXBhdGliaWxpdHlJbmZvIG1Db21wYXRpYmlsaXR5SW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBhdGliaWxpdHlJbmZvSG9sZGVyIG1Db21wYXRpYmlsaXR5SW5mbzsKICAgICBwcml2YXRlIGZpbmFsIGludCAgIG1EaXNwbGF5OwogICAgIC8vIEZvbGxvd2luZyBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGZyb20gbmF0aXZlIGNvZGUKICAgICBwcml2YXRlIGludCAgICAgICAgIG1QaXhlbEZvcm1hdDsKQEAgLTI4NywxMSArMzEzLDEzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBJV2luZG93TWFuYWdlciBzV2luZG93TWFuYWdlcjsKIAorICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIENvbXBhdGliaWxpdHlJbmZvIHNDb21wYXRpYmlsaXR5SW5mbzsKKwogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBkaXNwbGF5IG9iamVjdCB3aGljaCB1c2VzIHRoZSBtZXRyaWMncyB3aWR0aC9oZWlnaHQgaW5zdGVhZC4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGlzcGxheSBjcmVhdGVDb21wYXRpYmxlRGlzcGxheShpbnQgZGlzcGxheUlkLCBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXQpIHsKKyAgICBwdWJsaWMgc3RhdGljIERpc3BsYXkgY3JlYXRlQ29tcGF0aWJsZURpc3BsYXkoaW50IGRpc3BsYXlJZCwgQ29tcGF0aWJpbGl0eUluZm9Ib2xkZXIgY29tcGF0KSB7CiAgICAgICAgIHJldHVybiBuZXcgRGlzcGxheShkaXNwbGF5SWQsIGNvbXBhdCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwQ2FudmFzLmphdmEKaW5kZXggMmI3OWE3Ni4uNTIxNmM0OSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBDYW52YXMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMENhbnZhcy5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0RjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuVGVtcG9yYXJ5QnVmZmVyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5HcmFwaGljc09wZXJhdGlvbnM7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZzsKQEAgLTE2Myw5ICsxNjQsMTAgQEAKICAgICBzdGF0aWMgbmF0aXZlIGludCBuQ3JlYXRlVGV4dHVyZUxheWVyKGludFtdIGxheWVySW5mbyk7CiAgICAgc3RhdGljIG5hdGl2ZSBpbnQgbkNyZWF0ZUxheWVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbGVhbiBpc09wYXF1ZSwgaW50W10gbGF5ZXJJbmZvKTsKICAgICBzdGF0aWMgbmF0aXZlIHZvaWQgblJlc2l6ZUxheWVyKGludCBsYXllcklkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludFtdIGxheWVySW5mbyk7Ci0gICAgc3RhdGljIG5hdGl2ZSB2b2lkIG5VcGRhdGVUZXh0dXJlTGF5ZXIoaW50IGxheWVySWQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN1cmZhY2UpOworICAgIHN0YXRpYyBuYXRpdmUgdm9pZCBuVXBkYXRlVGV4dHVyZUxheWVyKGludCBsYXllcklkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpOwogICAgIHN0YXRpYyBuYXRpdmUgdm9pZCBuRGVzdHJveUxheWVyKGludCBsYXllcklkKTsKICAgICBzdGF0aWMgbmF0aXZlIHZvaWQgbkRlc3Ryb3lMYXllckRlZmVycmVkKGludCBsYXllcklkKTsKKyAgICBzdGF0aWMgbmF0aXZlIGJvb2xlYW4gbkNvcHlMYXllcihpbnQgbGF5ZXJJZCwgaW50IGJpdG1hcCk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDYW52YXMgbWFuYWdlbWVudApAQCAtMjAxLDYgKzIwMywxNCBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5TZXRWaWV3cG9ydChpbnQgcmVuZGVyZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKICAgICAvKioKKyAgICAgKiBQcmVzZXJ2ZXMgdGhlIGJhY2sgYnVmZmVyIG9mIHRoZSBjdXJyZW50IHN1cmZhY2UgYWZ0ZXIgYSBidWZmZXIgc3dhcC4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIHNldHMgdGhlIEVHTF9TV0FQX0JFSEFWSU9SIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudAorICAgICAqIHN1cmZhY2UgdG8gRUdMX0JVRkZFUl9QUkVTRVJWRUQuIENhbGxpbmcgdGhpcyBtZXRob2QgcmVxdWlyZXMgYW4gRUdMCisgICAgICogY29uZmlnIHRoYXQgc3VwcG9ydHMgRUdMX1NXQVBfQkVIQVZJT1JfUFJFU0VSVkVEX0JJVC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN3YXAgYmVoYXZpb3Igd2FzIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkLAorICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIAogICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHByZXNlcnZlQmFja0J1ZmZlcigpIHsKQEAgLTIwOCw2ICsyMTgsMjEgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuUHJlc2VydmVCYWNrQnVmZmVyKCk7ICAgIAorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3VyZmFjZSBwcmVzZXJ2ZXMgaXRzIGJhY2sgYnVmZmVyCisgICAgICogYWZ0ZXIgYSBidWZmZXIgc3dhcC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIFRydWUsIGlmIHRoZSBzdXJmYWNlJ3MgRUdMX1NXQVBfQkVIQVZJT1IgaXMgRUdMX0JVRkZFUl9QUkVTRVJWRUQsCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgIAorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFja0J1ZmZlclByZXNlcnZlZCgpIHsKKyAgICAgICAgcmV0dXJuIG5Jc0JhY2tCdWZmZXJQcmVzZXJ2ZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgYm9vbGVhbiBuSXNCYWNrQnVmZmVyUHJlc2VydmVkKCk7ICAgIAogICAgIAogICAgIEBPdmVycmlkZQogICAgIHZvaWQgb25QcmVEcmF3KFJlY3QgZGlydHkpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwTGF5ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwTGF5ZXIuamF2YQppbmRleCBiYzE5MWE2Li42OWRmYzJiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMExheWVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBMYXllci5qYXZhCkBAIC0xNyw2ICsxNyw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CisKIC8qKgogICogQW4gT3BlbkdMIEVTIDIuMCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSGFyZHdhcmVMYXllcn0uCiAgKi8KQEAgLTQwLDcgKzQyLDEwIEBACiAgICAgICAgIHJldHVybiBtTGF5ZXI7CiAgICAgfQogCi0gICAgCisgICAgYm9vbGVhbiBjb3B5SW50byhCaXRtYXAgYml0bWFwKSB7CisgICAgICAgIHJldHVybiBHTEVTMjBDYW52YXMubkNvcHlMYXllcihtTGF5ZXIsIGJpdG1hcC5tTmF0aXZlQml0bWFwKTsKKyAgICB9ICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgdm9pZCBkZXN0cm95KCkgewogICAgICAgICBpZiAobUZpbmFsaXplciAhPSBudWxsKSBtRmluYWxpemVyLmRlc3Ryb3koKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwUmVjb3JkaW5nQ2FudmFzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMFJlY29yZGluZ0NhbnZhcy5qYXZhCmluZGV4IDI2MDMyODEuLmVjOTRmZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwUmVjb3JkaW5nQ2FudmFzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBSZWNvcmRpbmdDYW52YXMuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogCiAvKioKICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgR0wgY2FudmFzIHRoYXQgcmVjb3JkcyBkcmF3aW5nIG9wZXJhdGlvbnMuCkBAIC0zNyw3ICszNyw3IEBACiAgICAgLy8gVGhlc2UgbGlzdHMgZW5zdXJlIHRoYXQgYW55IEJpdG1hcHMgcmVjb3JkZWQgYnkgYSBEaXNwbGF5TGlzdCBhcmUga2VwdCBhbGl2ZSBhcyBsb25nCiAgICAgLy8gYXMgdGhlIERpc3BsYXlMaXN0IGlzIGFsaXZlLgogICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiTWlzbWF0Y2hlZFF1ZXJ5QW5kVXBkYXRlT2ZDb2xsZWN0aW9uIn0pCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PEJpdG1hcD4gbUJpdG1hcHMgPSBuZXcgSGFzaFNldDxCaXRtYXA+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Qml0bWFwPiBtQml0bWFwcyA9IG5ldyBBcnJheUxpc3Q8Qml0bWFwPig1KTsKIAogICAgIEdMRVMyMFJlY29yZGluZ0NhbnZhcyhib29sZWFuIHRyYW5zbHVjZW50KSB7CiAgICAgICAgIHN1cGVyKHRydWUsIHRyYW5zbHVjZW50KTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwVGV4dHVyZUxheWVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dMRVMyMFRleHR1cmVMYXllci5qYXZhCmluZGV4IGZjZjQyMWIuLjA2M2VlZTcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR0xFUzIwVGV4dHVyZUxheWVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HTEVTMjBUZXh0dXJlTGF5ZXIuamF2YQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICByZXR1cm4gbVN1cmZhY2U7CiAgICAgfQogCi0gICAgdm9pZCB1cGRhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3VyZmFjZSkgewotICAgICAgICBHTEVTMjBDYW52YXMublVwZGF0ZVRleHR1cmVMYXllcihtTGF5ZXIsIHdpZHRoLCBoZWlnaHQsIHN1cmZhY2UpOworICAgIHZvaWQgdXBkYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBHTEVTMjBDYW52YXMublVwZGF0ZVRleHR1cmVMYXllcihtTGF5ZXIsIHdpZHRoLCBoZWlnaHQsIG1TdXJmYWNlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dlc3R1cmVEZXRlY3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HZXN0dXJlRGV0ZWN0b3IuamF2YQppbmRleCAxY2NjNjZmLi5hNDk2YTllIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0dlc3R1cmVEZXRlY3Rvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR2VzdHVyZURldGVjdG9yLmphdmEKQEAgLTYxMCw2ICs2MTAsOCBAQAogICAgICAgICBtVmVsb2NpdHlUcmFja2VyID0gbnVsbDsKICAgICAgICAgbUlzRG91YmxlVGFwcGluZyA9IGZhbHNlOwogICAgICAgICBtU3RpbGxEb3duID0gZmFsc2U7CisgICAgICAgIG1BbHdheXNJblRhcFJlZ2lvbiA9IGZhbHNlOworICAgICAgICBtQWx3YXlzSW5CaWdnZXJUYXBSZWdpb24gPSBmYWxzZTsKICAgICAgICAgaWYgKG1JbkxvbmdQcmVzcykgewogICAgICAgICAgICAgbUluTG9uZ1ByZXNzID0gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvR3Jhdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HcmF2aXR5LmphdmEKaW5kZXggMTc2YzQ4Ny4uNjNmNWVjMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HcmF2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9HcmF2aXR5LmphdmEKQEAgLTgxLDggKzgxLDEwIEBACiAgICAgICogIGhvcml6b250YWwgYXhpcy4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElQX0hPUklaT05UQUwgPSBBWElTX0NMSVA8PEFYSVNfWF9TSElGVDsKIAotICAgIC8qKiBSYXcgYml0IGNvbnRyb2xsaW5nIHdoZXRoZXIgdGhlIGhvcml6b250YWwgZGlyZWN0aW9uIGlzIHJlbGF0aXZlIChiZWZvcmUvYWZ0ZXIpIG9yIG5vdC4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTiA9IDB4MDA4MDAwMDA7CisgICAgLyoqIFJhdyBiaXQgY29udHJvbGxpbmcgd2hldGhlciB0aGUgbGF5b3V0IGRpcmVjdGlvbiBpcyByZWxhdGl2ZSBvciBub3QgKFNUQVJUL0VORCBpbnN0ZWFkIG9mCisgICAgICogYWJzb2x1dGUgTEVGVC9SSUdIVCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJVkVfTEFZT1VUX0RJUkVDVElPTiA9IDB4MDA4MDAwMDA7CiAKICAgICAvKioKICAgICAgKiBCaW5hcnkgbWFzayB0byBnZXQgdGhlIGFic29sdXRlIGhvcml6b250YWwgZ3Jhdml0eSBvZiBhIGdyYXZpdHkuCkBAIC0xMDksMTYgKzExMSwxNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU1BMQVlfQ0xJUF9IT1JJWk9OVEFMID0gMHgwMTAwMDAwMDsKICAgICAKLSAgICAvKiogUHVzaCBvYmplY3QgdG8geC1heGlzIHBvc2l0aW9uIGJlZm9yZSBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkVGT1JFID0gUkVMQVRJVkVfSE9SSVpPTlRBTF9ESVJFQ1RJT04gfCBMRUZUOworICAgIC8qKiBQdXNoIG9iamVjdCB0byB4LWF4aXMgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVCA9IFJFTEFUSVZFX0xBWU9VVF9ESVJFQ1RJT04gfCBMRUZUOwogCi0gICAgLyoqIFB1c2ggb2JqZWN0IHRvIHgtYXhpcyBwb3NpdGlvbiBhZnRlciBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUZURVIgPSBSRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTiB8IFJJR0hUOworICAgIC8qKiBQdXNoIG9iamVjdCB0byB4LWF4aXMgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiBpdHMgY29udGFpbmVyLCBub3QgY2hhbmdpbmcgaXRzIHNpemUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EID0gUkVMQVRJVkVfTEFZT1VUX0RJUkVDVElPTiB8IFJJR0hUOwogCiAgICAgLyoqCiAgICAgICogQmluYXJ5IG1hc2sgZm9yIHRoZSBob3Jpem9udGFsIGdyYXZpdHkgYW5kIHNjcmlwdCBzcGVjaWZpYyBkaXJlY3Rpb24gYml0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLID0gQkVGT1JFIHwgQUZURVI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJVkVfSE9SSVpPTlRBTF9HUkFWSVRZX01BU0sgPSBTVEFSVCB8IEVORDsKIAogICAgIC8qKgogICAgICAqIEFwcGx5IGEgZ3Jhdml0eSBjb25zdGFudCB0byBhbiBvYmplY3QuIFRoaXMgc3VwcG9zZSB0aGF0IHRoZSBsYXlvdXQgZGlyZWN0aW9uIGlzIExUUi4KQEAgLTE0OSwxMyArMTUxLDEzIEBACiAgICAgICogICAgICAgICAgICAgICAgICB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBvYmplY3QuCiAgICAgICogQHBhcmFtIG91dFJlY3QgUmVjZWl2ZXMgdGhlIGNvbXB1dGVkIGZyYW1lIG9mIHRoZSBvYmplY3QgaW4gaXRzCiAgICAgICogICAgICAgICAgICAgICAgY29udGFpbmVyLgotICAgICAqIEBwYXJhbSBpc1J0bCBXaGV0aGVyIHRoZSBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4KKyAgICAgKiBAcGFyYW0gbGF5b3V0RGlyZWN0aW9uIFRoZSBsYXlvdXQgZGlyZWN0aW9uLgogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHkoaW50IGdyYXZpdHksIGludCB3LCBpbnQgaCwgUmVjdCBjb250YWluZXIsCi0gICAgICAgICAgICBSZWN0IG91dFJlY3QsIGJvb2xlYW4gaXNSdGwpIHsKLSAgICAgICAgaW50IGFic0dyYXZpdHkgPSBnZXRBYnNvbHV0ZUdyYXZpdHkoZ3Jhdml0eSwgaXNSdGwpOworICAgICAgICAgICAgUmVjdCBvdXRSZWN0LCBpbnQgbGF5b3V0RGlyZWN0aW9uKSB7CisgICAgICAgIGludCBhYnNHcmF2aXR5ID0gZ2V0QWJzb2x1dGVHcmF2aXR5KGdyYXZpdHksIGxheW91dERpcmVjdGlvbik7CiAgICAgICAgIGFwcGx5KGFic0dyYXZpdHksIHcsIGgsIGNvbnRhaW5lciwgMCwgMCwgb3V0UmVjdCk7CiAgICAgfQogCkBAIC0zNDIsMzcgKzM0NCwzMiBAQAogICAgIC8qKgogICAgICAqIDxwPkNvbnZlcnQgc2NyaXB0IHNwZWNpZmljIGdyYXZpdHkgdG8gYWJzb2x1dGUgaG9yaXpvbnRhbCB2YWx1ZS48L3A+CiAgICAgICoKLSAgICAgKiBpZiBob3Jpem9udGFsIGRpcmVjdGlvbiBpcyBMVFIsIHRoZW4gQkVGT1JFIHdpbGwgc2V0IExFRlQgYW5kIEFGVEVSIHdpbGwgc2V0IFJJR0hULgotICAgICAqIGlmIGhvcml6b250YWwgZGlyZWN0aW9uIGlzIFJUTCwgdGhlbiBCRUZPUkUgd2lsbCBzZXQgUklHSFQgYW5kIEFGVEVSIHdpbGwgc2V0IExFRlQuCisgICAgICogaWYgaG9yaXpvbnRhbCBkaXJlY3Rpb24gaXMgTFRSLCB0aGVuIFNUQVJUIHdpbGwgc2V0IExFRlQgYW5kIEVORCB3aWxsIHNldCBSSUdIVC4KKyAgICAgKiBpZiBob3Jpem9udGFsIGRpcmVjdGlvbiBpcyBSVEwsIHRoZW4gU1RBUlQgd2lsbCBzZXQgUklHSFQgYW5kIEVORCB3aWxsIHNldCBMRUZULgogICAgICAqCi0gICAgICogSWYgbm8gaG9yaXpvbnRhbCBkaXJlY3Rpb24gaXMgZm91bmQsIHRoZW4ganVzdCBhZGQgTEVGVCB0byB0aGUgZXhpc3RpbmcgZ3Jhdml0eQogICAgICAqCiAgICAgICogQHBhcmFtIGdyYXZpdHkgVGhlIGdyYXZpdHkgdG8gY29udmVydCB0byBhYnNvbHV0ZSAoaG9yaXpvbnRhbCkgdmFsdWVzLgotICAgICAqIEBwYXJhbSBpc1J0bCBXaGV0aGVyIHRoZSBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4KKyAgICAgKiBAcGFyYW0gbGF5b3V0RGlyZWN0aW9uIFRoZSBsYXlvdXQgZGlyZWN0aW9uLgogICAgICAqIEByZXR1cm4gZ3Jhdml0eSBjb252ZXJ0ZWQgdG8gYWJzb2x1dGUgKGhvcml6b250YWwpIHZhbHVlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRBYnNvbHV0ZUdyYXZpdHkoaW50IGdyYXZpdHksIGJvb2xlYW4gaXNSdGwpIHsKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRBYnNvbHV0ZUdyYXZpdHkoaW50IGdyYXZpdHksIGludCBsYXlvdXREaXJlY3Rpb24pIHsKICAgICAgICAgaW50IHJlc3VsdCA9IGdyYXZpdHk7Ci0gICAgICAgIC8vIFNldCBkZWZhdWx0IGdyYXZpdHksIGlmIG5vIGhvcml6b250YWwgZ3Jhdml0eSBpcyBzcGVjaWZpZWQKLSAgICAgICAgaWYgKChyZXN1bHQgJiBIT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgPT0gMCkgewotICAgICAgICAgICAgcmVzdWx0IHw9IEdyYXZpdHkuTEVGVDsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiBsYXlvdXQgaXMgc2NyaXB0IHNwZWNpZmljIGFuZCBncmF2aXR5IGlzIGhvcml6b250YWwgcmVsYXRpdmUgKEJFRk9SRSBvciBBRlRFUikKLSAgICAgICAgaWYgKChyZXN1bHQgJiBSRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTikgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoKHJlc3VsdCAmIEdyYXZpdHkuQkVGT1JFKSA9PSBHcmF2aXR5LkJFRk9SRSkgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgQkVGT1JFIGJpdAotICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+QkVGT1JFOwotICAgICAgICAgICAgICAgIGlmIChpc1J0bCkgeworICAgICAgICAvLyBJZiBsYXlvdXQgaXMgc2NyaXB0IHNwZWNpZmljIGFuZCBncmF2aXR5IGlzIGhvcml6b250YWwgcmVsYXRpdmUgKFNUQVJUIG9yIEVORCkKKyAgICAgICAgaWYgKChyZXN1bHQgJiBSRUxBVElWRV9MQVlPVVRfRElSRUNUSU9OKSA+IDApIHsKKyAgICAgICAgICAgIGlmICgocmVzdWx0ICYgR3Jhdml0eS5TVEFSVCkgPT0gR3Jhdml0eS5TVEFSVCkgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgU1RBUlQgYml0CisgICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5TVEFSVDsKKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0RGlyZWN0aW9uID09IFZpZXcuTEFZT1VUX0RJUkVDVElPTl9SVEwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBSSUdIVCBiaXQKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFJJR0hUOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgTEVGVCBiaXQKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IExFRlQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICgocmVzdWx0ICYgR3Jhdml0eS5BRlRFUikgPT0gR3Jhdml0eS5BRlRFUikgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgQUZURVIgYml0Ci0gICAgICAgICAgICAgICAgcmVzdWx0ICY9IH5BRlRFUjsKLSAgICAgICAgICAgICAgICBpZiAoaXNSdGwpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHJlc3VsdCAmIEdyYXZpdHkuRU5EKSA9PSBHcmF2aXR5LkVORCkgeworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgRU5EIGJpdAorICAgICAgICAgICAgICAgIHJlc3VsdCAmPSB+RU5EOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXREaXJlY3Rpb24gPT0gVmlldy5MQVlPVVRfRElSRUNUSU9OX1JUTCkgewogICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIExFRlQgYml0CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBMRUZUOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zODIsNyArMzc5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIERvbid0IG5lZWQgdGhlIHNjcmlwdCBzcGVjaWZpYyBiaXQgYW55IG1vcmUsIHNvIHJlbW92ZSBpdCBhcyB3ZSBhcmUgY29udmVydGluZyB0bwogICAgICAgICAgICAgLy8gYWJzb2x1dGUgdmFsdWVzIChMRUZUIG9yIFJJR0hUKQotICAgICAgICAgICAgcmVzdWx0ICY9IH5SRUxBVElWRV9IT1JJWk9OVEFMX0RJUkVDVElPTjsKKyAgICAgICAgICAgIHJlc3VsdCAmPSB+UkVMQVRJVkVfTEFZT1VUX0RJUkVDVElPTjsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSGFyZHdhcmVSZW5kZXJlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKaW5kZXggNjFhMjRhMC4uNWNlYjEyYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9IYXJkd2FyZVJlbmRlcmVyLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwpAQCAtMTkzLDcgKzE5NCw3IEBACiAgICAgICogCiAgICAgICogQHJldHVybiBBIHtAbGluayBTdXJmYWNlVGV4dHVyZX0KICAgICAgKi8KLSAgICBhYnN0cmFjdCBTdXJmYWNlVGV4dHVyZSBjcmVhdGVTdXJhY2VUZXh0dXJlKEhhcmR3YXJlTGF5ZXIgbGF5ZXIpOworICAgIGFic3RyYWN0IFN1cmZhY2VUZXh0dXJlIGNyZWF0ZVN1cmZhY2VUZXh0dXJlKEhhcmR3YXJlTGF5ZXIgbGF5ZXIpOwogCiAgICAgLyoqCiAgICAgICogVXBkYXRlcyB0aGUgc3BlY2lmaWVkIGxheWVyLgpAQCAtMjAxLDExICsyMDIsMTkgQEAKICAgICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGhhcmR3YXJlIGxheWVyIHRvIHVwZGF0ZQogICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgbGF5ZXIncyB3aWR0aAogICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGxheWVyJ3MgaGVpZ2h0Ci0gICAgICogQHBhcmFtIHN1cmZhY2UgVGhlIHN1cmZhY2UgdG8gdXBkYXRlCiAgICAgICovCi0gICAgYWJzdHJhY3Qgdm9pZCB1cGRhdGVUZXh0dXJlTGF5ZXIoSGFyZHdhcmVMYXllciBsYXllciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgU3VyZmFjZVRleHR1cmUgc3VyZmFjZSk7ICAgIAotICAgIAorICAgIGFic3RyYWN0IHZvaWQgdXBkYXRlVGV4dHVyZUxheWVyKEhhcmR3YXJlTGF5ZXIgbGF5ZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBsYXllciBpbnRvIHRoZSBzcGVjaWZpZWQgYml0bWFwLgorICAgICAqIAorICAgICAqIEBwYXJhbSBsYXllciBUaGUgaGFyZHdhcmUgbGF5ZXIgdG8gY29weQorICAgICAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byBjb3B5IHRoZSBsYXllciBpbnRvCisgICAgICogCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBjb3B5IHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBib29sZWFuIGNvcHlMYXllcihIYXJkd2FyZUxheWVyIGxheWVyLCBCaXRtYXAgYml0bWFwKTsgICAgCisKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplcyB0aGUgaGFyZHdhcmUgcmVuZGVyZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3VyZmFjZSBhbmQgc2V0dXAgdGhlCiAgICAgICogcmVuZGVyZXIgZm9yIGRyYXdpbmcsIGlmIG5lZWRlZC4gVGhpcyBpcyBpbnZva2VkIHdoZW4gdGhlIFZpZXdBbmNlc3RvciBoYXMKQEAgLTMxMSw2ICszMjAsNyBAQAogICAgICAgICBQYWludCBtRGVidWdQYWludDsKIAogICAgICAgICBib29sZWFuIG1EaXJ0eVJlZ2lvbnM7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbURpcnR5UmVnaW9uc1JlcXVlc3RlZDsKIAogICAgICAgICBmaW5hbCBpbnQgbUdsVmVyc2lvbjsKICAgICAgICAgZmluYWwgYm9vbGVhbiBtVHJhbnNsdWNlbnQ7CkBAIC0zMjUsNiArMzM1LDcgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkaXJ0eVByb3BlcnR5ID0gU3lzdGVtUHJvcGVydGllcy5nZXQoUkVOREVSX0RJUlRZX1JFR0lPTlNfUFJPUEVSVFksICJ0cnVlIik7CiAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKICAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbnMgPSBSRU5ERVJfRElSVFlfUkVHSU9OUyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShkaXJ0eVByb3BlcnR5KTsKKyAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbnNSZXF1ZXN0ZWQgPSBtRGlydHlSZWdpb25zOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC01NDUsMTEgKzU1NiwyMSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdXJmYWNlLk91dE9mUmVzb3VyY2VzRXhjZXB0aW9uKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRFR0xFcnJvclN0cmluZyhzRWdsLmVnbEdldEVycm9yKCkpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCisgICAgICAgICAgICAvLyBJZiBtRGlydHlSZWdpb25zIGlzIHNldCwgdGhpcyBtZWFucyB3ZSBoYXZlIGFuIEVHTCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAvLyB3aXRoIEVHTF9TV0FQX0JFSEFWSU9SX1BSRVNFUlZFRF9CSVQgc2V0CiAgICAgICAgICAgICBpZiAobURpcnR5UmVnaW9ucykgewogICAgICAgICAgICAgICAgIGlmICghR0xFUzIwQ2FudmFzLnByZXNlcnZlQmFja0J1ZmZlcigpKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJCYWNrYnVmZmVyIGNhbm5vdCBiZSBwcmVzZXJ2ZWQiKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1EaXJ0eVJlZ2lvbnNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBtRGlydHlSZWdpb25zIGlzIG5vdCBzZXQsIG91ciBFR0wgY29uZmlndXJhdGlvbiBkb2VzIG5vdAorICAgICAgICAgICAgICAgIC8vIGhhdmUgRUdMX1NXQVBfQkVIQVZJT1JfUFJFU0VSVkVEX0JJVDsgaG93ZXZlciwgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAvLyBzd2FwIGJlaGF2aW9yIG1pZ2h0IGJlIEVHTF9CVUZGRVJfUFJFU0VSVkVELCB3aGljaCBtZWFucyB3ZQorICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gc2V0IG1EaXJ0eVJlZ2lvbnMuIFdlIHRyeSB0byBkbyB0aGlzIG9ubHkgaWYgZGlydHkKKyAgICAgICAgICAgICAgICAvLyByZWdpb25zIHdlcmUgaW5pdGlhbGx5IHJlcXVlc3RlZCBhcyBwYXJ0IG9mIHRoZSBkZXZpY2UKKyAgICAgICAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIChzZWUgUkVOREVSX0RJUlRZX1JFR0lPTlMpCisgICAgICAgICAgICAgICAgbURpcnR5UmVnaW9ucyA9IEdMRVMyMENhbnZhcy5pc0JhY2tCdWZmZXJQcmVzZXJ2ZWQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHNFZ2xDb250ZXh0LmdldEdMKCk7CkBAIC03OTIsMTQgKzgxMywxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIFN1cmZhY2VUZXh0dXJlIGNyZWF0ZVN1cmFjZVRleHR1cmUoSGFyZHdhcmVMYXllciBsYXllcikgeworICAgICAgICBTdXJmYWNlVGV4dHVyZSBjcmVhdGVTdXJmYWNlVGV4dHVyZShIYXJkd2FyZUxheWVyIGxheWVyKSB7CiAgICAgICAgICAgICByZXR1cm4gKChHTEVTMjBUZXh0dXJlTGF5ZXIpIGxheWVyKS5nZXRTdXJmYWNlVGV4dHVyZSgpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHZvaWQgdXBkYXRlVGV4dHVyZUxheWVyKEhhcmR3YXJlTGF5ZXIgbGF5ZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICBTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7Ci0gICAgICAgICAgICAoKEdMRVMyMFRleHR1cmVMYXllcikgbGF5ZXIpLnVwZGF0ZSh3aWR0aCwgaGVpZ2h0LCBzdXJmYWNlLm1TdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIHZvaWQgdXBkYXRlVGV4dHVyZUxheWVyKEhhcmR3YXJlTGF5ZXIgbGF5ZXIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAgICAgKChHTEVTMjBUZXh0dXJlTGF5ZXIpIGxheWVyKS51cGRhdGUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBjb3B5TGF5ZXIoSGFyZHdhcmVMYXllciBsYXllciwgQml0bWFwIGJpdG1hcCkgeworICAgICAgICAgICAgcmV0dXJuICgoR0xFUzIwTGF5ZXIpIGxheWVyKS5jb3B5SW50byhiaXRtYXApOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdGljIEhhcmR3YXJlUmVuZGVyZXIgY3JlYXRlKGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd01hbmFnZXIuYWlkbCBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvd01hbmFnZXIuYWlkbAppbmRleCBhZGFmYjU5Li5hZDE3ZWRmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0lXaW5kb3dNYW5hZ2VyLmFpZGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93TWFuYWdlci5haWRsCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRDb250ZXh0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kQ2xpZW50OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db21wYXRpYmlsaXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKQEAgLTU5LDYgKzYwLDkgQEAKICAgICB2b2lkIHNldEZvcmNlZERpc3BsYXlTaXplKGludCBsb25nRGltZW4sIGludCBzaG9ydERpbWVuKTsKICAgICB2b2lkIGNsZWFyRm9yY2VkRGlzcGxheVNpemUoKTsKIAorICAgIC8vIElzIGRldmljZSBjb25maWd1cmVkIHdpdGggYSBoaWRlYWJsZSBzdGF0dXMgYmFyIG9yIGEgdGFibGV0IHN5c3RlbSBiYXI/CisgICAgYm9vbGVhbiBjYW5TdGF0dXNCYXJIaWRlKCk7CisKICAgICAvLyBUaGVzZSBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiBpbmplY3RpbmcgZXZlbnRzIHRvIHlvdXIgb3duIHdpbmRvdywKICAgICAvLyBvciBieSBob2xkaW5nIHRoZSBJTkpFQ1RfRVZFTlRTIHBlcm1pc3Npb24uICBUaGVzZSBtZXRob2RzIG1heSBibG9jawogICAgIC8vIHVudGlsIHBlbmRpbmcgaW5wdXQgZXZlbnRzIGFyZSBmaW5pc2hlZCBiZWluZyBkaXNwYXRjaGVkIGV2ZW4gd2hlbiAnc3luYycgaXMgZmFsc2UuCkBAIC04NSw3ICs4OSw3IEBACiAgICAgdm9pZCBvdmVycmlkZVBlbmRpbmdBcHBUcmFuc2l0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IGVudGVyQW5pbSwgaW50IGV4aXRBbmltKTsKICAgICB2b2lkIGV4ZWN1dGVBcHBUcmFuc2l0aW9uKCk7CiAgICAgdm9pZCBzZXRBcHBTdGFydGluZ1dpbmRvdyhJQmluZGVyIHRva2VuLCBTdHJpbmcgcGtnLCBpbnQgdGhlbWUsCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWwsIGludCBsYWJlbFJlcywKKyAgICAgICAgICAgIGluIENvbXBhdGliaWxpdHlJbmZvIGNvbXBhdEluZm8sIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwgaW50IGxhYmVsUmVzLAogICAgICAgICAgICAgaW50IGljb24sIGludCB3aW5kb3dGbGFncywgSUJpbmRlciB0cmFuc2ZlckZyb20sIGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpOwogICAgIHZvaWQgc2V0QXBwV2lsbEJlSGlkZGVuKElCaW5kZXIgdG9rZW4pOwogICAgIHZvaWQgc2V0QXBwVmlzaWJpbGl0eShJQmluZGVyIHRva2VuLCBib29sZWFuIHZpc2libGUpOwpAQCAtMjAxLDQgKzIwNSw5IEBACiAgICAgICogQ2FsbGVkIGJ5IHRoZSBzdGF0dXMgYmFyIHRvIG5vdGlmeSBWaWV3cyBvZiBjaGFuZ2VzIHRvIFN5c3RlbSBVSSB2aXNpYmxpdHkuCiAgICAgICovCiAgICAgdm9pZCBzdGF0dXNCYXJWaXNpYmlsaXR5Q2hhbmdlZChpbnQgdmlzaWJpbGl0eSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIHNldHRpbmdzIGFwcGxpY2F0aW9uIHRvIHRlbXBvcmFyaWx5IHNldCB0aGUgcG9pbnRlciBzcGVlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBvaW50ZXJTcGVlZChpbnQgc3BlZWQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9NZW51SXRlbS5qYXZhCmluZGV4IDc4MGM1MmUuLmRjNjgyNjQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvTWVudUl0ZW0uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L01lbnVJdGVtLmphdmEKQEAgLTUxLDYgKzUxLDEzIEBACiAgICAgICogaXQgYWxzbyBoYXMgYW4gaWNvbiBzcGVjaWZpZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fV0lUSF9URVhUID0gNDsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXRlbSdzIGFjdGlvbiB2aWV3IGNvbGxhcHNlcyB0byBhIG5vcm1hbCBtZW51IGl0ZW0uCisgICAgICogV2hlbiBleHBhbmRlZCwgdGhlIGFjdGlvbiB2aWV3IHRlbXBvcmFyaWx5IHRha2VzIG92ZXIKKyAgICAgKiBhIGxhcmdlciBzZWdtZW50IG9mIGl0cyBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVcgPSA4OwogICAgIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIG1lbnUgaXRlbSBpcwpAQCAtNzQsNiArODEsMzQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSBtZW51IGl0ZW0KKyAgICAgKiBtYXJrZWQgd2l0aCB7QGxpbmsgTWVudUl0ZW0jU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVd9IGlzCisgICAgICogZXhwYW5kZWQgb3IgY29sbGFwc2VkLgorICAgICAqCisgICAgICogQHNlZSBNZW51SXRlbSNleHBhbmRBY3Rpb25WaWV3KCkKKyAgICAgKiBAc2VlIE1lbnVJdGVtI2NvbGxhcHNlQWN0aW9uVmlldygpCisgICAgICogQHNlZSBNZW51SXRlbSNzZXRTaG93QXNBY3Rpb25GbGFncyhpbnQpCisgICAgICogQHNlZSBNZW51SXRlbSMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZW51IGl0ZW0gd2l0aCB7QGxpbmsgTWVudUl0ZW0jU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVd9CisgICAgICAgICAqIGlzIGV4cGFuZGVkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbSBJdGVtIHRoYXQgd2FzIGV4cGFuZGVkCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaXRlbSBzaG91bGQgZXhwYW5kLCBmYWxzZSBpZiBleHBhbnNpb24gc2hvdWxkIGJlIHN1cHByZXNzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbk1lbnVJdGVtQWN0aW9uRXhwYW5kKE1lbnVJdGVtIGl0ZW0pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lbnUgaXRlbSB3aXRoIHtAbGluayBNZW51SXRlbSNTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFV30KKyAgICAgICAgICogaXMgY29sbGFwc2VkLgorICAgICAgICAgKiBAcGFyYW0gaXRlbSBJdGVtIHRoYXQgd2FzIGNvbGxhcHNlZAorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGl0ZW0gc2hvdWxkIGNvbGxhcHNlLCBmYWxzZSBpZiBjb2xsYXBzaW5nIHNob3VsZCBiZSBzdXBwcmVzc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUFjdGlvbkNvbGxhcHNlKE1lbnVJdGVtIGl0ZW0pOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgaWRlbnRpZmllciBmb3IgdGhpcyBtZW51IGl0ZW0uICBUaGUgaWRlbnRpZmllciBjYW4gbm90CiAgICAgICogYmUgY2hhbmdlZCBhZnRlciB0aGUgbWVudSBpcyBjcmVhdGVkLgogICAgICAqCkBAIC00MjEsNiArNDU2LDI3IEBACiAgICAgcHVibGljIHZvaWQgc2V0U2hvd0FzQWN0aW9uKGludCBhY3Rpb25FbnVtKTsKIAogICAgIC8qKgorICAgICAqIFNldHMgaG93IHRoaXMgaXRlbSBzaG91bGQgZGlzcGxheSBpbiB0aGUgcHJlc2VuY2Ugb2YgYW4gQWN0aW9uIEJhci4KKyAgICAgKiBUaGUgcGFyYW1ldGVyIGFjdGlvbkVudW0gaXMgYSBmbGFnIHNldC4gT25lIG9mIHtAbGluayAjU0hPV19BU19BQ1RJT05fQUxXQVlTfSwKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0lGX1JPT019LCBvciB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX05FVkVSfSBzaG91bGQKKyAgICAgKiBiZSB1c2VkLCBhbmQgeW91IG1heSBvcHRpb25hbGx5IE9SIHRoZSB2YWx1ZSB3aXRoIHtAbGluayAjU0hPV19BU19BQ1RJT05fV0lUSF9URVhUfS4KKyAgICAgKiBTSE9XX0FTX0FDVElPTl9XSVRIX1RFWFQgcmVxdWVzdHMgdGhhdCB3aGVuIHRoZSBpdGVtIGlzIHNob3duIGFzIGFuIGFjdGlvbiwKKyAgICAgKiBpdCBzaG91bGQgYmUgc2hvd24gd2l0aCBhIHRleHQgbGFiZWwuCisgICAgICoKKyAgICAgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20ge0BsaW5rICNzZXRTaG93QXNBY3Rpb24oaW50KX0gb25seSBpbiB0aGF0IGl0CisgICAgICogcmV0dXJucyB0aGUgY3VycmVudCBNZW51SXRlbSBpbnN0YW5jZSBmb3IgY2FsbCBjaGFpbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb25FbnVtIEhvdyB0aGUgaXRlbSBzaG91bGQgZGlzcGxheS4gT25lIG9mCisgICAgICoge0BsaW5rICNTSE9XX0FTX0FDVElPTl9BTFdBWVN9LCB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0lGX1JPT019LCBvcgorICAgICAqIHtAbGluayAjU0hPV19BU19BQ1RJT05fTkVWRVJ9LiBTSE9XX0FTX0FDVElPTl9ORVZFUiBpcyB0aGUgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuQWN0aW9uQmFyCisgICAgICogQHNlZSAjc2V0QWN0aW9uVmlldyhWaWV3KQorICAgICAqIEByZXR1cm4gVGhpcyBNZW51SXRlbSBpbnN0YW5jZSBmb3IgY2FsbCBjaGFpbmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0U2hvd0FzQWN0aW9uRmxhZ3MoaW50IGFjdGlvbkVudW0pOworCisgICAgLyoqCiAgICAgICogU2V0IGFuIGFjdGlvbiB2aWV3IGZvciB0aGlzIG1lbnUgaXRlbS4gQW4gYWN0aW9uIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gcGxhY2UKICAgICAgKiBvZiBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtZW51IGl0ZW0gZWxlbWVudCBpbiB0aGUgVUkgd2hlbiB0aGlzIGl0ZW0gaXMgc2hvd24KICAgICAgKiBhcyBhbiBhY3Rpb24gd2l0aGluIGEgcGFyZW50LgpAQCAtNDUzLDQgKzUwOSw1MiBAQAogICAgICAqIEBzZWUgI3NldFNob3dBc0FjdGlvbihpbnQpCiAgICAgICovCiAgICAgcHVibGljIFZpZXcgZ2V0QWN0aW9uVmlldygpOworCisgICAgLyoqCisgICAgICogRXhwYW5kIHRoZSBhY3Rpb24gdmlldyBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZW51IGl0ZW0uCisgICAgICogVGhlIG1lbnUgaXRlbSBtdXN0IGhhdmUgYW4gYWN0aW9uIHZpZXcgc2V0LCBhcyB3ZWxsIGFzCisgICAgICogdGhlIHNob3dBc0FjdGlvbiBmbGFnIHtAbGluayAjU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVd9LgorICAgICAqIElmIGEgbGlzdGVuZXIgaGFzIGJlZW4gc2V0IHVzaW5nIHtAbGluayAjc2V0T25BY3Rpb25FeHBhbmRMaXN0ZW5lcihPbkFjdGlvbkV4cGFuZExpc3RlbmVyKX0KKyAgICAgKiBpdCB3aWxsIGhhdmUgaXRzIHtAbGluayBPbkFjdGlvbkV4cGFuZExpc3RlbmVyI29uTWVudUl0ZW1BY3Rpb25FeHBhbmQoTWVudUl0ZW0pfQorICAgICAqIG1ldGhvZCBpbnZva2VkLiBUaGUgbGlzdGVuZXIgbWF5IHJldHVybiBmYWxzZSBmcm9tIHRoaXMgbWV0aG9kIHRvIHByZXZlbnQgZXhwYW5kaW5nCisgICAgICogdGhlIGFjdGlvbiB2aWV3LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhY3Rpb24gdmlldyB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRBY3Rpb25WaWV3KCk7CisKKyAgICAvKioKKyAgICAgKiBDb2xsYXBzZSB0aGUgYWN0aW9uIHZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVudSBpdGVtLgorICAgICAqIFRoZSBtZW51IGl0ZW0gbXVzdCBoYXZlIGFuIGFjdGlvbiB2aWV3IHNldCwgYXMgd2VsbCBhcyB0aGUgc2hvd0FzQWN0aW9uIGZsYWcKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0NPTExBUFNFX0FDVElPTl9WSUVXfS4gSWYgYSBsaXN0ZW5lciBoYXMgYmVlbiBzZXQgdXNpbmcKKyAgICAgKiB7QGxpbmsgI3NldE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIoT25BY3Rpb25FeHBhbmRMaXN0ZW5lcil9IGl0IHdpbGwgaGF2ZSBpdHMKKyAgICAgKiB7QGxpbmsgT25BY3Rpb25FeHBhbmRMaXN0ZW5lciNvbk1lbnVJdGVtQWN0aW9uQ29sbGFwc2UoTWVudUl0ZW0pfSBtZXRob2QgaW52b2tlZC4KKyAgICAgKiBUaGUgbGlzdGVuZXIgbWF5IHJldHVybiBmYWxzZSBmcm9tIHRoaXMgbWV0aG9kIHRvIHByZXZlbnQgY29sbGFwc2luZyB0aGUgYWN0aW9uIHZpZXcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiB2aWV3IHdhcyBjb2xsYXBzZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZUFjdGlvblZpZXcoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1lbnUgaXRlbSdzIGFjdGlvbiB2aWV3IGhhcyBiZWVuIGV4cGFuZGVkLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpdGVtJ3MgYWN0aW9uIHZpZXcgaXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBzZWUgI2V4cGFuZEFjdGlvblZpZXcoKQorICAgICAqIEBzZWUgI2NvbGxhcHNlQWN0aW9uVmlldygpCisgICAgICogQHNlZSAjU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVcKKyAgICAgKiBAc2VlIE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGlvblZpZXdFeHBhbmRlZCgpOworCisgICAgLyoqCisgICAgICogU2V0IGFuIHtAbGluayBPbkFjdGlvbkV4cGFuZExpc3RlbmVyfSBvbiB0aGlzIG1lbnUgaXRlbSB0byBiZSBub3RpZmllZCB3aGVuCisgICAgICogdGhlIGFzc29jaWF0ZWQgYWN0aW9uIHZpZXcgaXMgZXhwYW5kZWQgb3IgY29sbGFwc2VkLiBUaGUgbWVudSBpdGVtIG11c3QKKyAgICAgKiBiZSBjb25maWd1cmVkIHRvIGV4cGFuZCBvciBjb2xsYXBzZSBpdHMgYWN0aW9uIHZpZXcgdXNpbmcgdGhlIGZsYWcKKyAgICAgKiB7QGxpbmsgI1NIT1dfQVNfQUNUSU9OX0NPTExBUFNFX0FDVElPTl9WSUVXfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBMaXN0ZW5lciB0aGF0IHdpbGwgcmVzcG9uZCB0byBleHBhbmQvY29sbGFwc2UgZXZlbnRzCisgICAgICogQHJldHVybiBUaGlzIG1lbnUgaXRlbSBpbnN0YW5jZSBmb3IgY2FsbCBjaGFpbmluZworICAgICAqLworICAgIHB1YmxpYyBNZW51SXRlbSBzZXRPbkFjdGlvbkV4cGFuZExpc3RlbmVyKE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgbGlzdGVuZXIpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU2NhbGVHZXN0dXJlRGV0ZWN0b3IuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU2NhbGVHZXN0dXJlRGV0ZWN0b3IuamF2YQppbmRleCA1ZTA3ZTFhLi41ZDJjMWE3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1NjYWxlR2VzdHVyZURldGVjdG9yLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TY2FsZUdlc3R1cmVEZXRlY3Rvci5qYXZhCkBAIC0zNDAsNiArMzQwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9jdXMgcG9pbnQgdG8gdGhlIHJlbWFpbmluZyBmaW5nZXIKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGV2ZW50LmZpbmRQb2ludGVySW5kZXgoYWN0aW9uSWQgPT0gbUFjdGl2ZUlkMCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVJZDEgOiBtQWN0aXZlSWQwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZEdlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgTW90aW9uRXZlbnQgc3RyZWFtIGRldGVjdGVkLiIsIG5ldyBUaHJvd2FibGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1HZXN0dXJlSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25TY2FsZUVuZCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlSWQwID0gZXZlbnQuZ2V0UG9pbnRlcklkKGluZGV4KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZTBNb3N0UmVjZW50ID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVGV4dHVyZVZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVGV4dHVyZVZpZXcuamF2YQppbmRleCA3NTVlY2Y1Li4wNDIxMjA1IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1RleHR1cmVWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9UZXh0dXJlVmlldy5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKQEAgLTU2LDE0ICs1Nyw3IEBACiAgKiAgICAgICAgICBzZXRDb250ZW50VmlldyhtVGV4dHVyZVZpZXcpOwogICogICAgICB9CiAgKgotICogICAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7Ci0gKiAgICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKLSAqCi0gKiAgICAgICAgICBtQ2FtZXJhLnN0b3BQcmV2aWV3KCk7Ci0gKiAgICAgICAgICBtQ2FtZXJhLnJlbGVhc2UoKTsKLSAqICAgICAgfQotICoKLSAqICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7CisgKiAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgKiAgICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhLm9wZW4oKTsKICAqCiAgKiAgICAgICAgICB0cnkgewpAQCAtNzcsNiArNzEsMTEgQEAKICAqICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICogICAgICAgICAgLy8gSWdub3JlZCwgQ2FtZXJhIGRvZXMgYWxsIHRoZSB3b3JrIGZvciB1cwogICogICAgICB9CisgKiAgICAgIAorICogICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKKyAqICAgICAgICAgIG1DYW1lcmEuc3RvcFByZXZpZXcoKTsKKyAqICAgICAgICAgIG1DYW1lcmEucmVsZWFzZSgpOworICogICAgICB9CiAgKiAgfQogICogPC9wcmU+CiAgKiAKQEAgLTkxLDYgKzkwLDggQEAKICAqIEBzZWUgU3VyZmFjZVRleHR1cmUKICAqLwogcHVibGljIGNsYXNzIFRleHR1cmVWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiVGV4dHVyZVZpZXciOworCiAgICAgcHJpdmF0ZSBIYXJkd2FyZUxheWVyIG1MYXllcjsKICAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIG1TdXJmYWNlOwogICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmVMaXN0ZW5lciBtTGlzdGVuZXI7CkBAIC0xNTAsMTEgKzE1MSwyNiBAQAogICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKIAogICAgICAgICBpZiAoIWlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpKSB7Ci0gICAgICAgICAgICBMb2cudygiVGV4dHVyZVZpZXciLCAiQSBUZXh0dXJlVmlldyBvciBhIHN1YmNsYXNzIGNhbiBvbmx5IGJlICIKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJBIFRleHR1cmVWaWV3IG9yIGEgc3ViY2xhc3MgY2FuIG9ubHkgYmUgIgogICAgICAgICAgICAgICAgICAgICArICJ1c2VkIHdpdGggaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGVuYWJsZWQuIik7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKKworICAgICAgICBpZiAoaXNIYXJkd2FyZUFjY2VsZXJhdGVkKCkgJiYgbUxheWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKG1TdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxheWVyLmRlc3Ryb3koKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIG1TdXJmYWNlID0gbnVsbDsKKyAgICAgICAgICAgIG1MYXllciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGUgbGF5ZXIgdHlwZSBvZiBhIFRleHR1cmVWaWV3IGlzIGlnbm9yZWQgc2luY2UgYSBUZXh0dXJlVmlldyBpcyBhbHdheXMKICAgICAgKiBjb25zaWRlcmVkIHRvIGFjdCBhcyBhIGhhcmR3YXJlIGxheWVyLiBUaGUgb3B0aW9uYWwgcGFpbnQgc3VwcGxpZWQgdG8gdGhpcwpAQCAtMjE2LDcgKzIzMiwxMCBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uU2l6ZUNoYW5nZWQoaW50IHcsIGludCBoLCBpbnQgb2xkdywgaW50IG9sZGgpIHsKICAgICAgICAgc3VwZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvbGR3LCBvbGRoKTsKICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG5TZXREZWZhdWx0QnVmZmVyU2l6ZShtU3VyZmFjZS5tU3VyZmFjZVRleHR1cmUsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIG5TZXREZWZhdWx0QnVmZmVyU2l6ZShtU3VyZmFjZSwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VyZmFjZVRleHR1cmVTaXplQ2hhbmdlZChtU3VyZmFjZSwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjgsOCArMjQ3LDggQEAKIAogICAgICAgICBpZiAobUxheWVyID09IG51bGwpIHsKICAgICAgICAgICAgIG1MYXllciA9IG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLmNyZWF0ZUhhcmR3YXJlTGF5ZXIoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlID0gbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuY3JlYXRlU3VyYWNlVGV4dHVyZShtTGF5ZXIpOwotICAgICAgICAgICAgblNldERlZmF1bHRCdWZmZXJTaXplKG1TdXJmYWNlLm1TdXJmYWNlVGV4dHVyZSwgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgbVN1cmZhY2UgPSBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5jcmVhdGVTdXJmYWNlVGV4dHVyZShtTGF5ZXIpOworICAgICAgICAgICAgblNldERlZmF1bHRCdWZmZXJTaXplKG1TdXJmYWNlLCBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSk7CiAKICAgICAgICAgICAgIG1VcGRhdGVMaXN0ZW5lciA9IG5ldyBTdXJmYWNlVGV4dHVyZS5PbkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0yNDIsNyArMjYxLDcgQEAKICAgICAgICAgICAgIG1TdXJmYWNlLnNldE9uRnJhbWVBdmFpbGFibGVMaXN0ZW5lcihtVXBkYXRlTGlzdGVuZXIpOwogCiAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZShtU3VyZmFjZSk7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUobVN1cmZhY2UsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzEsMTQgKzI5MCwxMDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLnVwZGF0ZVRleHR1cmVMYXllcihtTGF5ZXIsIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBtU3VyZmFjZSk7CisgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLnVwZGF0ZVRleHR1cmVMYXllcihtTGF5ZXIsIGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKIAogICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogPHA+UmV0dXJucyBhIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcH0gcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBvZiB0aGUgYXNzb2NpYXRlZCBzdXJmYWNlIHRleHR1cmUuIElmIHRoZSBzdXJmYWNlIHRleHR1cmUgaXMgbm90IGF2YWlsYWJsZSwKKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuPC9wPgorICAgICAqIAorICAgICAqIDxwPlRoZSBiaXRtYXAgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgdXNlcyB0aGUge0BsaW5rIEJpdG1hcC5Db25maWcjQVJHQl84ODg4fQorICAgICAqIHBpeGVsIGZvcm1hdCBhbmQgaXRzIGRpbWVuc2lvbnMgYXJlIHRoZSBzYW1lIGFzIHRoaXMgdmlldydzLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPkRvIG5vdDwvc3Ryb25nPiBpbnZva2UgdGhpcyBtZXRob2QgZnJvbSBhIGRyYXdpbmcgbWV0aG9kCisgICAgICogKHtAbGluayAjb25EcmF3KGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKX0gZm9yIGluc3RhbmNlKS48L3A+CisgICAgICogCisgICAgICogPHA+SWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgY29weSwgYW4gZW1wdHkgYml0bWFwIHdpbGwgYmUgcmV0dXJuZWQuPC9wPgorICAgICAqIAorICAgICAqIEByZXR1cm4gQSB2YWxpZCB7QGxpbmsgQml0bWFwLkNvbmZpZyNBUkdCXzg4ODh9IGJpdG1hcCwgb3IgbnVsbCBpZiB0aGUgc3VyZmFjZQorICAgICAqICAgICAgICAgdGV4dHVyZSBpcyBub3QgYXZhaWxhYmxlIG9yIHRoZSB3aWR0aCAmbHQ7PSAwIG9yIHRoZSBoZWlnaHQgJmx0Oz0gMAorICAgICAqIAorICAgICAqIEBzZWUgI2lzQXZhaWxhYmxlKCkgCisgICAgICogQHNlZSAjZ2V0Qml0bWFwKGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwKSAKKyAgICAgKiBAc2VlICNnZXRCaXRtYXAoaW50LCBpbnQpIAorICAgICAqLworICAgIHB1YmxpYyBCaXRtYXAgZ2V0Qml0bWFwKCkgeworICAgICAgICByZXR1cm4gZ2V0Qml0bWFwKGdldFdpZHRoKCksIGdldEhlaWdodCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5SZXR1cm5zIGEge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwfSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGVudAorICAgICAqIG9mIHRoZSBhc3NvY2lhdGVkIHN1cmZhY2UgdGV4dHVyZS4gSWYgdGhlIHN1cmZhY2UgdGV4dHVyZSBpcyBub3QgYXZhaWxhYmxlLAorICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC48L3A+CisgICAgICogCisgICAgICogPHA+VGhlIGJpdG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCB1c2VzIHRoZSB7QGxpbmsgQml0bWFwLkNvbmZpZyNBUkdCXzg4ODh9CisgICAgICogcGl4ZWwgZm9ybWF0LjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD48c3Ryb25nPkRvIG5vdDwvc3Ryb25nPiBpbnZva2UgdGhpcyBtZXRob2QgZnJvbSBhIGRyYXdpbmcgbWV0aG9kCisgICAgICogKHtAbGluayAjb25EcmF3KGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzKX0gZm9yIGluc3RhbmNlKS48L3A+CisgICAgICogCisgICAgICogPHA+SWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgY29weSwgYW4gZW1wdHkgYml0bWFwIHdpbGwgYmUgcmV0dXJuZWQuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIGJpdG1hcCB0byBjcmVhdGUKKyAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGJpdG1hcCB0byBjcmVhdGUKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIEEgdmFsaWQge0BsaW5rIEJpdG1hcC5Db25maWcjQVJHQl84ODg4fSBiaXRtYXAsIG9yIG51bGwgaWYgdGhlIHN1cmZhY2UKKyAgICAgKiAgICAgICAgIHRleHR1cmUgaXMgbm90IGF2YWlsYWJsZSBvciB3aWR0aCBpcyAmbHQ7PSAwIG9yIGhlaWdodCBpcyAmbHQ7PSAwCisgICAgICogCisgICAgICogQHNlZSAjaXNBdmFpbGFibGUoKSAKKyAgICAgKiBAc2VlICNnZXRCaXRtYXAoYW5kcm9pZC5ncmFwaGljcy5CaXRtYXApIAorICAgICAqIEBzZWUgI2dldEJpdG1hcCgpIAorICAgICAqLworICAgIHB1YmxpYyBCaXRtYXAgZ2V0Qml0bWFwKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBpZiAoaXNBdmFpbGFibGUoKSAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEJpdG1hcChCaXRtYXAuY3JlYXRlQml0bWFwKHdpZHRoLCBoZWlnaHQsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+Q29waWVzIHRoZSBjb250ZW50IG9mIHRoaXMgdmlldydzIHN1cmZhY2UgdGV4dHVyZSBpbnRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBiaXRtYXAuIElmIHRoZSBzdXJmYWNlIHRleHR1cmUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGNvcHkgaXMgbm90IGV4ZWN1dGVkLgorICAgICAqIFRoZSBjb250ZW50IG9mIHRoZSBzdXJmYWNlIHRleHR1cmUgd2lsbCBiZSBzY2FsZWQgdG8gZml0IGV4YWN0bHkgaW5zaWRlCisgICAgICogdGhlIHNwZWNpZmllZCBiaXRtYXAuPC9wPgorICAgICAqIAorICAgICAqIDxwPjxzdHJvbmc+RG8gbm90PC9zdHJvbmc+IGludm9rZSB0aGlzIG1ldGhvZCBmcm9tIGEgZHJhd2luZyBtZXRob2QKKyAgICAgKiAoe0BsaW5rICNvbkRyYXcoYW5kcm9pZC5ncmFwaGljcy5DYW52YXMpfSBmb3IgaW5zdGFuY2UpLjwvcD4KKyAgICAgKiAKKyAgICAgKiA8cD5JZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBiaXRtYXAgaXMgbGVmdCB1bmNoYW5nZWQuPC9wPgorICAgICAqIAorICAgICAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byBjb3B5IHRoZSBjb250ZW50IG9mIHRoZSBzdXJmYWNlIHRleHR1cmUgaW50bywKKyAgICAgKiAgICAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsLCBhbGwgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZAorICAgICAqIAorICAgICAqIEByZXR1cm4gVGhlIGJpdG1hcCBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIKKyAgICAgKiAKKyAgICAgKiBAc2VlICNpc0F2YWlsYWJsZSgpIAorICAgICAqIEBzZWUgI2dldEJpdG1hcChpbnQsIGludCkgIAorICAgICAqIEBzZWUgI2dldEJpdG1hcCgpIAorICAgICAqLworICAgIHB1YmxpYyBCaXRtYXAgZ2V0Qml0bWFwKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsICYmIGlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyLmNvcHlMYXllcihtTGF5ZXIsIGJpdG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHtAbGluayBTdXJmYWNlVGV4dHVyZX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgKiBUZXh0dXJlVmlldyBpcyBhdmFpbGFibGUgZm9yIHJlbmRlcmluZy4gV2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogdHJ1ZSwge0BsaW5rICNnZXRTdXJmYWNlVGV4dHVyZSgpfSByZXR1cm5zIGEgdmFsaWQgc3VyZmFjZSB0ZXh0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gbVN1cmZhY2UgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU3VyZmFjZVRleHR1cmV9IHVzZWQgYnkgdGhpcyB2aWV3LiBUaGlzIG1ldGhvZAotICAgICAqIG1heSByZXR1cm4gbnVsbCBpZiB0aGUgdmlldyBpcyBub3QgYXR0YWNoZWQgdG8gYSB3aW5kb3cuCisgICAgICogbWF5IHJldHVybiBudWxsIGlmIHRoZSB2aWV3IGlzIG5vdCBhdHRhY2hlZCB0byBhIHdpbmRvdyBvciBpZiB0aGUgc3VyZmFjZQorICAgICAqIHRleHR1cmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4KKyAgICAgKiAKKyAgICAgKiBAc2VlICNpc0F2YWlsYWJsZSgpIAogICAgICAqLwogICAgIHB1YmxpYyBTdXJmYWNlVGV4dHVyZSBnZXRTdXJmYWNlVGV4dHVyZSgpIHsKICAgICAgICAgcmV0dXJuIG1TdXJmYWNlOwpAQCAtMzE2LDggKzQyOCwxMCBAQAogICAgICAgICAgKiAKICAgICAgICAgICogQHBhcmFtIHN1cmZhY2UgVGhlIHN1cmZhY2UgcmV0dXJuZWQgYnkKICAgICAgICAgICogICAgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5UZXh0dXJlVmlldyNnZXRTdXJmYWNlVGV4dHVyZSgpfQorICAgICAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBzdXJmYWNlCisgICAgICAgICAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgc3VyZmFjZQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJbnZva2VkIHdoZW4gdGhlIHtAbGluayBTdXJmYWNlVGV4dHVyZX0ncyBidWZmZXJzIHNpemUgY2hhbmdlZC4KQEAgLTMyOCw3ICs0NDIsMTcgQEAKICAgICAgICAgICogQHBhcmFtIGhlaWdodCBUaGUgbmV3IGhlaWdodCBvZiB0aGUgc3VyZmFjZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHtAbGluayBTdXJmYWNlVGV4dHVyZX0gaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLgorICAgICAgICAgKiBBZnRlciB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBubyByZW5kZXJpbmcgc2hvdWxkIGhhcHBlbiBpbnNpZGUgdGhlIHN1cmZhY2UKKyAgICAgICAgICogdGV4dHVyZS4KKyAgICAgICAgICogCisgICAgICAgICAqIEBwYXJhbSBzdXJmYWNlIFRoZSBzdXJmYWNlIGFib3V0IHRvIGJlIGRlc3Ryb3llZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuU2V0RGVmYXVsdEJ1ZmZlclNpemUoaW50IHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5TZXREZWZhdWx0QnVmZmVyU2l6ZShTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwKKyAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WZWxvY2l0eVRyYWNrZXIuamF2YQppbmRleCBmY2NlZjJiLi41YTkxZDMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZlbG9jaXR5VHJhY2tlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmVsb2NpdHlUcmFja2VyLmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIAogICAgIHByaXZhdGUgaW50IG1QdHI7CiAgICAgcHJpdmF0ZSBWZWxvY2l0eVRyYWNrZXIgbU5leHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Bvb2xlZDsKIAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlSW5pdGlhbGl6ZSgpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZURpc3Bvc2UoaW50IHB0cik7CkBAIC05Myw2ICs5NCwyMCBAQAogICAgICAgICByZXR1cm4gbU5leHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Bvb2xlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jc1Bvb2xlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBvb2xlZChib29sZWFuIGlzUG9vbGVkKSB7CisgICAgICAgIG1Jc1Bvb2xlZCA9IGlzUG9vbGVkOworICAgIH0KKwogICAgIHByaXZhdGUgVmVsb2NpdHlUcmFja2VyKCkgewogICAgICAgICBtUHRyID0gbmF0aXZlSW5pdGlhbGl6ZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKaW5kZXggMDE3ZTVlMy4uNDZkZjg4YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEKQEAgLTE2LDYgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXc7CiAKK2ltcG9ydCBhbmRyb2lkLnV0aWwuRmxvYXRQcm9wZXJ0eTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9jYWxlVXRpbDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUHJvcGVydHk7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlByZWRpY2F0ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CkBAIC02MSw2ICs2NCw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudFNvdXJjZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKQEAgLTczLDYgKzc3LDcgQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogCkBAIC0zNDAsNyArMzQ1LDcgQEAKICAqIDIgcGl4ZWxzIHRvIHRoZSByaWdodCBvZiB0aGUgbGVmdCBlZGdlLiBQYWRkaW5nIGNhbiBiZSBzZXQgdXNpbmcgdGhlCiAgKiB7QGxpbmsgI3NldFBhZGRpbmcoaW50LCBpbnQsIGludCwgaW50KX0gbWV0aG9kIGFuZCBxdWVyaWVkIGJ5IGNhbGxpbmcKICAqIHtAbGluayAjZ2V0UGFkZGluZ0xlZnQoKX0sIHtAbGluayAjZ2V0UGFkZGluZ1RvcCgpfSwKLSAqIHtAbGluayAjZ2V0UGFkZGluZ1JpZ2h0KCl9IGFuZCB7QGxpbmsgI2dldFBhZGRpbmdCb3R0b20oKX0uCisgKiB7QGxpbmsgI2dldFBhZGRpbmdSaWdodCgpfSwge0BsaW5rICNnZXRQYWRkaW5nQm90dG9tKCl9LgogICogPC9wPgogICoKICAqIDxwPgpAQCAtNjAyLDYgKzYwNyw4IEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmdMZWZ0CiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmdSaWdodAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld19wYWRkaW5nVG9wCisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmdTdGFydAorICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld19wYWRkaW5nRW5kCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3NhdmVFbmFibGVkCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3JvdGF0aW9uCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3JvdGF0aW9uWApAQCAtOTUwLDQwICs5NTcsNTEgQEAKIAogICAgIC8qKgogICAgICAqIEhvcml6b250YWwgZGlyZWN0aW9uIG9mIHRoaXMgdmlldyBpcyBmcm9tIExlZnQgdG8gUmlnaHQuCi0gICAgICogVXNlIHdpdGgge0BsaW5rICNzZXRIb3Jpem9udGFsRGlyZWN0aW9ufS4KKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldExheW91dERpcmVjdGlvbn0uCiAgICAgICoge0BoaWRlfQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPUklaT05UQUxfRElSRUNUSU9OX0xUUiA9IDB4MDAwMDAwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RJUkVDVElPTl9MVFIgPSAweDAwMDAwMDAwOwogCiAgICAgLyoqCiAgICAgICogSG9yaXpvbnRhbCBkaXJlY3Rpb24gb2YgdGhpcyB2aWV3IGlzIGZyb20gUmlnaHQgdG8gTGVmdC4KLSAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldEhvcml6b250YWxEaXJlY3Rpb259LgorICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0TGF5b3V0RGlyZWN0aW9ufS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9ESVJFQ1RJT05fUlRMID0gMHg0MDAwMDAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRElSRUNUSU9OX1JUTCA9IDB4NDAwMDAwMDA7CiAKICAgICAvKioKICAgICAgKiBIb3Jpem9udGFsIGRpcmVjdGlvbiBvZiB0aGlzIHZpZXcgaXMgaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudC4KLSAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI3NldEhvcml6b250YWxEaXJlY3Rpb259LgorICAgICAqIFVzZSB3aXRoIHtAbGluayAjc2V0TGF5b3V0RGlyZWN0aW9ufS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVCA9IDB4ODAwMDAwMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RJUkVDVElPTl9JTkhFUklUID0gMHg4MDAwMDAwMDsKIAogICAgIC8qKgogICAgICAqIEhvcml6b250YWwgZGlyZWN0aW9uIG9mIHRoaXMgdmlldyBpcyBmcm9tIGRlZHVjZWQgZnJvbSB0aGUgZGVmYXVsdCBsYW5ndWFnZQotICAgICAqIHNjcmlwdCBmb3IgdGhlIGxvY2FsZS4gVXNlIHdpdGgge0BsaW5rICNzZXRIb3Jpem9udGFsRGlyZWN0aW9ufS4KKyAgICAgKiBzY3JpcHQgZm9yIHRoZSBsb2NhbGUuIFVzZSB3aXRoIHtAbGluayAjc2V0TGF5b3V0RGlyZWN0aW9ufS4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTF9ESVJFQ1RJT05fTE9DQUxFID0gMHhDMDAwMDAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRElSRUNUSU9OX0xPQ0FMRSA9IDB4QzAwMDAwMDA7CiAKICAgICAvKioKICAgICAgKiBNYXNrIGZvciB1c2Ugd2l0aCBzZXRGbGFncyBpbmRpY2F0aW5nIGJpdHMgdXNlZCBmb3IgaG9yaXpvbnRhbERpcmVjdGlvbi4KICAgICAgKiB7QGhpZGV9CiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIGludCBIT1JJWk9OVEFMX0RJUkVDVElPTl9NQVNLID0gMHhDMDAwMDAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IExBWU9VVF9ESVJFQ1RJT05fTUFTSyA9IDB4QzAwMDAwMDA7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBIT1JJWk9OVEFMX0RJUkVDVElPTl9GTEFHUyA9IHsgSE9SSVpPTlRBTF9ESVJFQ1RJT05fTFRSLAotICAgICAgICAgICAgSE9SSVpPTlRBTF9ESVJFQ1RJT05fUlRMLCBIT1JJWk9OVEFMX0RJUkVDVElPTl9JTkhFUklULCBIT1JJWk9OVEFMX0RJUkVDVElPTl9MT0NBTEV9OworICAgIC8qCisgICAgICogQXJyYXkgb2YgaG9yaXpvbnRhbCBkaXJlY3Rpb24gZmxhZ3MgZm9yIG1hcHBpbmcgYXR0cmlidXRlICJob3Jpem9udGFsRGlyZWN0aW9uIiB0byBjb3JyZWN0CisgICAgICogZmxhZyB2YWx1ZS4KKyAgICAgKiB7QGhpZGV9CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gTEFZT1VUX0RJUkVDVElPTl9GTEFHUyA9IHtMQVlPVVRfRElSRUNUSU9OX0xUUiwKKyAgICAgICAgTEFZT1VUX0RJUkVDVElPTl9SVEwsIExBWU9VVF9ESVJFQ1RJT05fSU5IRVJJVCwgTEFZT1VUX0RJUkVDVElPTl9MT0NBTEV9OworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBob3Jpem9udGFsRGlyZWN0aW9uLgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RJUkVDVElPTl9ERUZBVUxUID0gTEFZT1VUX0RJUkVDVElPTl9JTkhFUklUOwogCiAgICAgLyoqCiAgICAgICogVmlldyBmbGFnIGluZGljYXRpbmcgd2hldGhlciB7QGxpbmsgI2FkZEZvY3VzYWJsZXMoQXJyYXlMaXN0LCBpbnQsIGludCl9CkBAIC0xNDgxLDYgKzE0OTksMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1RhZ3NMb2NrID0gbmV3IE9iamVjdCgpOwogCiAgICAgLyoqCisgICAgICogVGhlIG5leHQgYXZhaWxhYmxlIGFjY2Vzc2lpYmxpdHkgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNOZXh0QWNjZXNzaWJpbGl0eVZpZXdJZDsKKworICAgIC8qKgogICAgICAqIFRoZSBhbmltYXRpb24gY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZpZXcuCiAgICAgICogQGhpZGUKICAgICAgKi8KQEAgLTE1MjIsNiArMTU0NSwxMSBAQAogICAgIGludCBtSUQgPSBOT19JRDsKIAogICAgIC8qKgorICAgICAqIFRoZSBzdGFibGUgSUQgb2YgdGhpcyB2aWV3IGZvciBhY2Nlc3NpYmlsaXR5IHBvcnBvc2VzLgorICAgICAqLworICAgIGludCBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IE5PX0lEOworCisgICAgLyoqCiAgICAgICogVGhlIHZpZXcncyB0YWcuCiAgICAgICoge0BoaWRlfQogICAgICAqCkBAIC0xNzA4LDExICsxNzM2LDIwIEBACiAgICAgc3RhdGljIGZpbmFsIGludCBEUkFHX0hPVkVSRUQgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMjsKIAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2aWV3IGlzIGRyYXduIGluIHJpZ2h0LXRvLWxlZnQgZGlyZWN0aW9uLgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2aWV3IGxheW91dCBkaXJlY3Rpb24gaGFzIGJlZW4gcmVzb2x2ZWQgYW5kIGRyYXduIHRvIHRoZQorICAgICAqIHJpZ2h0LXRvLWxlZnQgZGlyZWN0aW9uLgogICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFJFU09MVkVEX0xBWU9VVF9SVEwgICAgICAgICAgPSAweDAwMDAwMDA0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFZT1VUX0RJUkVDVElPTl9SRVNPTFZFRF9SVEwgPSAweDAwMDAwMDA0OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpZXcgbGF5b3V0IGRpcmVjdGlvbiBoYXMgYmVlbiByZXNvbHZlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEID0gMHgwMDAwMDAwODsKKwogCiAgICAgLyogRW5kIG9mIG1hc2tzIGZvciBtUHJpdmF0ZUZsYWdzMiAqLwogCkBAIC0yMTQ3LDYgKzIxODQsMzMgQEAKICAgICBpbnQgbVVzZXJQYWRkaW5nTGVmdDsKIAogICAgIC8qKgorICAgICAqIENhY2hlIHRoZSBwYWRkaW5nVG9wIHNldCBieSB0aGUgdXNlciB0byBhcHBlbmQgdG8gdGhlIHNjcm9sbGJhcidzIHNpemUuCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gInBhZGRpbmciKQorICAgIGludCBtVXNlclBhZGRpbmdUb3A7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBpZiB0aGUgdXNlciBwYWRkaW5nIGlzIHJlbGF0aXZlLgorICAgICAqCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gInBhZGRpbmciKQorICAgIGJvb2xlYW4gbVVzZXJQYWRkaW5nUmVsYXRpdmU7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZSB0aGUgcGFkZGluZ1N0YXJ0IHNldCBieSB0aGUgdXNlciB0byBhcHBlbmQgdG8gdGhlIHNjcm9sbGJhcidzIHNpemUuCisgICAgICoKKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAicGFkZGluZyIpCisgICAgaW50IG1Vc2VyUGFkZGluZ1N0YXJ0OworCisgICAgLyoqCisgICAgICogQ2FjaGUgdGhlIHBhZGRpbmdFbmQgc2V0IGJ5IHRoZSB1c2VyIHRvIGFwcGVuZCB0byB0aGUgc2Nyb2xsYmFyJ3Mgc2l6ZS4KKyAgICAgKgorICAgICAqLworICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJwYWRkaW5nIikKKyAgICBpbnQgbVVzZXJQYWRkaW5nRW5kOworCisgICAgLyoqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBpbnQgbU9sZFdpZHRoTWVhc3VyZVNwZWMgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKQEAgLTI0NDIsNyArMjUwNiw3IEBACiAgICAgcHVibGljIFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQgIT0gbnVsbCA/IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkgOiBudWxsOwotICAgICAgICBtVmlld0ZsYWdzID0gU09VTkRfRUZGRUNUU19FTkFCTEVEIHwgSEFQVElDX0ZFRURCQUNLX0VOQUJMRUQ7CisgICAgICAgIG1WaWV3RmxhZ3MgPSBTT1VORF9FRkZFQ1RTX0VOQUJMRUQgfCBIQVBUSUNfRkVFREJBQ0tfRU5BQkxFRCB8IExBWU9VVF9ESVJFQ1RJT05fSU5IRVJJVDsKICAgICAgICAgbVRvdWNoU2xvcCA9IFZpZXdDb25maWd1cmF0aW9uLmdldChjb250ZXh0KS5nZXRTY2FsZWRUb3VjaFNsb3AoKTsKICAgICAgICAgc2V0T3ZlclNjcm9sbE1vZGUoT1ZFUl9TQ1JPTExfSUZfQ09OVEVOVF9TQ1JPTExTKTsKICAgICB9CkBAIC0yNDk3LDYgKzI1NjEsOCBAQAogICAgICAgICBpbnQgdG9wUGFkZGluZyA9IC0xOwogICAgICAgICBpbnQgcmlnaHRQYWRkaW5nID0gLTE7CiAgICAgICAgIGludCBib3R0b21QYWRkaW5nID0gLTE7CisgICAgICAgIGludCBzdGFydFBhZGRpbmcgPSAtMTsKKyAgICAgICAgaW50IGVuZFBhZGRpbmcgPSAtMTsKIAogICAgICAgICBpbnQgcGFkZGluZyA9IC0xOwogCkBAIC0yNTQyLDYgKzI2MDgsMTIgQEAKICAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdfcGFkZGluZ0JvdHRvbToKICAgICAgICAgICAgICAgICAgICAgYm90dG9tUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGF0dHIsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3X3BhZGRpbmdTdGFydDoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRQYWRkaW5nID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoYXR0ciwgLTEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdfcGFkZGluZ0VuZDoKKyAgICAgICAgICAgICAgICAgICAgZW5kUGFkZGluZyA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKGF0dHIsIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5WaWV3X3Njcm9sbFg6CiAgICAgICAgICAgICAgICAgICAgIHggPSBhLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KGF0dHIsIDApOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI2NDAsMTMgKzI3MTIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdGbGFnTWFza3MgfD0gVklTSUJJTElUWV9NQVNLOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuVmlld19ob3Jpem9udGFsRGlyZWN0aW9uOgotICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IGEuZ2V0SW50KGF0dHIsIDApOwotICAgICAgICAgICAgICAgICAgaWYgKGxheW91dERpcmVjdGlvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgdmlld0ZsYWdWYWx1ZXMgfD0gSE9SSVpPTlRBTF9ESVJFQ1RJT05fRkxBR1NbbGF5b3V0RGlyZWN0aW9uXTsKLSAgICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ01hc2tzIHw9IEhPUklaT05UQUxfRElSRUNUSU9OX01BU0s7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdfbGF5b3V0RGlyZWN0aW9uOgorICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBhbnkgSE9SSVpPTlRBTF9ESVJFQ1RJT04gZmxhZyBhbHJlYWR5IHNldAorICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ1ZhbHVlcyAmPSB+TEFZT1VUX0RJUkVDVElPTl9NQVNLOworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIEhPUklaT05UQUxfRElSRUNUSU9OIGZsYWdzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gYS5nZXRJbnQoYXR0ciwgLTEpOworICAgICAgICAgICAgICAgICAgICBpZiAobGF5b3V0RGlyZWN0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWV3RmxhZ1ZhbHVlcyB8PSBMQVlPVVRfRElSRUNUSU9OX0ZMQUdTW2xheW91dERpcmVjdGlvbl07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdG8gZGVmYXVsdCAoTEFZT1VUX0RJUkVDVElPTl9JTkhFUklUKQorICAgICAgICAgICAgICAgICAgICAgICAgdmlld0ZsYWdWYWx1ZXMgfD0gTEFZT1VUX0RJUkVDVElPTl9ERUZBVUxUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZpZXdGbGFnTWFza3MgfD0gTEFZT1VUX0RJUkVDVElPTl9NQVNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdfZHJhd2luZ0NhY2hlUXVhbGl0eToKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhY2hlUXVhbGl0eSA9IGEuZ2V0SW50KGF0dHIsIDApOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVRdWFsaXR5ICE9IDApIHsKQEAgLTI3OTAsMTEgKzI4NjgsMTUgQEAKICAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKICAgICAgICAgfQogCisgICAgICAgIG1Vc2VyUGFkZGluZ1JlbGF0aXZlID0gKHN0YXJ0UGFkZGluZyA+PSAwIHx8IGVuZFBhZGRpbmcgPj0gMCk7CisKICAgICAgICAgaWYgKHBhZGRpbmcgPj0gMCkgewogICAgICAgICAgICAgbGVmdFBhZGRpbmcgPSBwYWRkaW5nOwogICAgICAgICAgICAgdG9wUGFkZGluZyA9IHBhZGRpbmc7CiAgICAgICAgICAgICByaWdodFBhZGRpbmcgPSBwYWRkaW5nOwogICAgICAgICAgICAgYm90dG9tUGFkZGluZyA9IHBhZGRpbmc7CisgICAgICAgICAgICBzdGFydFBhZGRpbmcgPSBwYWRkaW5nOworICAgICAgICAgICAgZW5kUGFkZGluZyA9IHBhZGRpbmc7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIHBhZGRpbmcgKGVpdGhlciB3aXRoIGFuZHJvaWQ6cGFkZGluZyBvcgpAQCAtMjgwNiw2ICsyODg4LDE1IEBACiAgICAgICAgICAgICAgICAgcmlnaHRQYWRkaW5nID49IDAgPyByaWdodFBhZGRpbmcgOiBtUGFkZGluZ1JpZ2h0LAogICAgICAgICAgICAgICAgIGJvdHRvbVBhZGRpbmcgPj0gMCA/IGJvdHRvbVBhZGRpbmcgOiBtUGFkZGluZ0JvdHRvbSk7CiAKKyAgICAgICAgLy8gQ2FjaGUgdXNlciBwYWRkaW5nIGFzIHdlIGNhbm5vdCBmdWxseSByZXNvbHZlIHBhZGRpbmcgaGVyZSAod2UgZG9udCBoYXZlIHlldCB0aGUgcmVzb2x2ZWQKKyAgICAgICAgLy8gbGF5b3V0IGRpcmVjdGlvbikuIFRob3NlIGNhY2hlZCB2YWx1ZXMgd2lsbCBiZSB1c2VkIGxhdGVyIGR1cmluZyBwYWRkaW5nIHJlc29sdXRpb24uCisgICAgICAgIG1Vc2VyUGFkZGluZ0xlZnQgPSBsZWZ0UGFkZGluZzsKKyAgICAgICAgbVVzZXJQYWRkaW5nUmlnaHQgPSByaWdodFBhZGRpbmc7CisgICAgICAgIG1Vc2VyUGFkZGluZ1N0YXJ0ID0gc3RhcnRQYWRkaW5nOworICAgICAgICBtVXNlclBhZGRpbmdFbmQgPSBlbmRQYWRkaW5nOworICAgICAgICBtVXNlclBhZGRpbmdUb3AgPSB0b3BQYWRkaW5nOworICAgICAgICBtVXNlclBhZGRpbmdCb3R0b20gPSBib3R0b21QYWRkaW5nOworCiAgICAgICAgIGlmICh2aWV3RmxhZ01hc2tzICE9IDApIHsKICAgICAgICAgICAgIHNldEZsYWdzKHZpZXdGbGFnVmFsdWVzLCB2aWV3RmxhZ01hc2tzKTsKICAgICAgICAgfQpAQCAtMzAyNyw3ICszMTE4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFJlLWFwcGx5IHVzZXIvYmFja2dyb3VuZCBwYWRkaW5nIHNvIHRoYXQgc2Nyb2xsYmFyKHMpIGdldCBhZGRlZAotICAgICAgICByZWNvbXB1dGVQYWRkaW5nKCk7CisgICAgICAgIHJlc29sdmVQYWRkaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDUyLDcgKzMxNDMsNyBAQAogICAgICAgICBpZiAobVZlcnRpY2FsU2Nyb2xsYmFyUG9zaXRpb24gIT0gcG9zaXRpb24pIHsKICAgICAgICAgICAgIG1WZXJ0aWNhbFNjcm9sbGJhclBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgICAgICAgICBjb21wdXRlT3BhcXVlRmxhZ3MoKTsKLSAgICAgICAgICAgIHJlY29tcHV0ZVBhZGRpbmcoKTsKKyAgICAgICAgICAgIHJlc29sdmVQYWRkaW5nKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM2MzIsNiArMzcyMyw3IEBACiAgICAgICogQHNlZSAjZGlzcGF0Y2hQb3B1bGF0ZUFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgb25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eUV2ZW50KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICBldmVudC5zZXRTb3VyY2UodGhpcyk7CiAgICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKGdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgZXZlbnQuc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7CkBAIC0zNjQ3LDYgKzM3MzksMTE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvfSByZXByZXNlbnRpbmcgdGhpcyB2aWV3IGZyb20gdGhlCisgICAgICogcG9pbnQgb2YgdmlldyBvZiBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogVGhpcyBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIG9idGFpbmluZyBhbiBhY2Nlc3NpYmlsaXR5IG5vZGUgaW5mbyBmcm9tIGEKKyAgICAgKiBwb29sIG9mIHJldXNhYmxlIGluc3RhbmNlcyBhbmQgY2FsbGluZworICAgICAqIHtAbGluayAjb25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eU5vZGVJbmZvKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyl9IG9uIHRoaXMgdmlldyB0bworICAgICAqIGluaXRpYWxpemUgdGhlIGZvcm1lci4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBUaGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciByZWN5Y2xpbmcgdGhlIG9idGFpbmVkIGluc3RhbmNlIGJ5IGNhbGxpbmcKKyAgICAgKiAgICAgICB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3JlY3ljbGUoKX0gdG8gbWluaW1pemUgb2JqZWN0IGNyZWF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIEEgcG9wdWxhdGVkIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99LgorICAgICAqCisgICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGNyZWF0ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbygpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8gPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8ub2J0YWluKHRoaXMpOworICAgICAgICBvbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oaW5mbyk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99IHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB2aWV3LgorICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHNldHM6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPntAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jc2V0UGFyZW50KFZpZXcpfSw8L2xpPgorICAgICAqICAgPGxpPntAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jc2V0Qm91bmRzSW5QYXJlbnQoUmVjdCl9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRCb3VuZHNJblNjcmVlbihSZWN0KX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldFBhY2thZ2VOYW1lKENoYXJTZXF1ZW5jZSl9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRDbGFzc05hbWUoQ2hhclNlcXVlbmNlKX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldENvbnRlbnREZXNjcmlwdGlvbihDaGFyU2VxdWVuY2UpfSw8L2xpPgorICAgICAqICAgPGxpPntAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jc2V0RW5hYmxlZChib29sZWFuKX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldENsaWNrYWJsZShib29sZWFuKX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldEZvY3VzYWJsZShib29sZWFuKX0sPC9saT4KKyAgICAgKiAgIDxsaT57QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvI3NldEZvY3VzZWQoYm9vbGVhbil9LDwvbGk+CisgICAgICogICA8bGk+e0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNzZXRMb25nQ2xpY2thYmxlKGJvb2xlYW4pfSw8L2xpPgorICAgICAqICAgPGxpPntAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jc2V0U2VsZWN0ZWQoYm9vbGVhbil9LDwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCwgY2FsbCB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24sCisgICAgICogYW5kIHNldCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBpbmZvIFRoZSBpbnN0YW5jZSB0byBpbml0aWFsaXplLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbykgeworICAgICAgICBSZWN0IGJvdW5kcyA9IG1BdHRhY2hJbmZvLm1UbXBJbnZhbFJlY3Q7CisgICAgICAgIGdldERyYXdpbmdSZWN0KGJvdW5kcyk7CisgICAgICAgIGluZm8uc2V0Qm91bmRzSW5QYXJlbnQoYm91bmRzKTsKKworICAgICAgICBpbnRbXSBsb2NhdGlvbk9uU2NyZWVuID0gbUF0dGFjaEluZm8ubUludmFsaWRhdGVDaGlsZExvY2F0aW9uOworICAgICAgICBnZXRMb2NhdGlvbk9uU2NyZWVuKGxvY2F0aW9uT25TY3JlZW4pOworICAgICAgICBib3VuZHMub2Zmc2V0KGxvY2F0aW9uT25TY3JlZW5bMF0sIGxvY2F0aW9uT25TY3JlZW5bMV0pOworICAgICAgICBpbmZvLnNldEJvdW5kc0luU2NyZWVuKGJvdW5kcyk7CisKKyAgICAgICAgVmlld1BhcmVudCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFZpZXcpIHsKKyAgICAgICAgICAgIFZpZXcgcGFyZW50VmlldyA9IChWaWV3KSBwYXJlbnQ7CisgICAgICAgICAgICBpbmZvLnNldFBhcmVudChwYXJlbnRWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIGluZm8uc2V0UGFja2FnZU5hbWUobUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGluZm8uc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW5mby5zZXRDb250ZW50RGVzY3JpcHRpb24oZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworCisgICAgICAgIGluZm8uc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7CisgICAgICAgIGluZm8uc2V0Q2xpY2thYmxlKGlzQ2xpY2thYmxlKCkpOworICAgICAgICBpbmZvLnNldEZvY3VzYWJsZShpc0ZvY3VzYWJsZSgpKTsKKyAgICAgICAgaW5mby5zZXRGb2N1c2VkKGlzRm9jdXNlZCgpKTsKKyAgICAgICAgaW5mby5zZXRTZWxlY3RlZChpc1NlbGVjdGVkKCkpOworICAgICAgICBpbmZvLnNldExvbmdDbGlja2FibGUoaXNMb25nQ2xpY2thYmxlKCkpOworCisgICAgICAgIC8vIFRPRE86IFRoZXNlIG1ha2Ugc2Vuc2Ugb25seSBpZiB3ZSBhcmUgaW4gYW4gQWRhcHRlclZpZXcgYnV0IGFsbAorICAgICAgICAvLyB2aWV3cyBjYW4gYmUgc2VsZWN0ZWQuIE1heWJlIGZyb20gYWNjZXNzaWlibGl0eSBwZXJzcGVjdGl2ZQorICAgICAgICAvLyB3ZSBzaG91bGQgcmVwb3J0IGFzIHNlbGVjdGFibGUgdmlldyBpbiBhbiBBZGFwdGVyVmlldy4KKyAgICAgICAgaW5mby5hZGRBY3Rpb24oQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9TRUxFQ1QpOworICAgICAgICBpbmZvLmFkZEFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX1NFTEVDVElPTik7CisKKyAgICAgICAgaWYgKGlzRm9jdXNhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0ZvY3VzZWQoKSkgeworICAgICAgICAgICAgICAgIGluZm8uYWRkQWN0aW9uKEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xFQVJfRk9DVVMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZvLmFkZEFjdGlvbihBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0ZPQ1VTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgdmlldyBvbiB0aGUgc2NyZWVuIGZvciBhY2Nlc3NpYmlsaXR5IHB1cnBvc2VzLgorICAgICAqIElmIHRoaXMge0BsaW5rIFZpZXd9IGlzIG5vdCBhdHRhY2hlZCB0byBhbnkgd2luZG93LCB7QHZhbHVlICNOT19JRH0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB2aWV3IGFjY2Vzc2liaWxpdHkgaWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzaWJpbGl0eVZpZXdJZCgpIHsKKyAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5Vmlld0lkID09IE5PX0lEKSB7CisgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IHNOZXh0QWNjZXNzaWJpbGl0eVZpZXdJZCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eVZpZXdJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgd2luZG93IGluIHdoaWNoIHRoaXMgVmlldyByZXNlaWRlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHdpbmRvdyBhY2Nlc3NpYmlsaXR5IGlkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFjY2Vzc2liaWxpdHlXaW5kb3dJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1BdHRhY2hJbmZvICE9IG51bGwgPyBtQXR0YWNoSW5mby5tQWNjZXNzaWJpbGl0eVdpbmRvd0lkIDogTk9fSUQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUge0BsaW5rIFZpZXd9IGRlc2NyaXB0aW9uLiBJdCBicmllZmx5IGRlc2NyaWJlcyB0aGUgdmlldyBhbmQgaXMKICAgICAgKiBwcmltYXJpbHkgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0LiBTZXQgdGhpcyBwcm9wZXJ0eSB0byBlbmFibGUKICAgICAgKiBiZXR0ZXIgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IGZvciB5b3VyIGFwcGxpY2F0aW9uLiBUaGlzIGlzIGVzcGVjaWFsbHkKQEAgLTQxMjEsMzggKzQzMjUsNzEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiBmb3IgdGhpcyB2aWV3LgorICAgICAqIFJldHVybnMgdGhlIGxheW91dCBkaXJlY3Rpb24gZm9yIHRoaXMgdmlldy4KICAgICAgKgotICAgICAqIEByZXR1cm4gT25lIG9mIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fTFRSfSwKLSAgICAgKiAgIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fUlRMfSwKLSAgICAgKiAgIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVH0gb3IKLSAgICAgKiAgIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fTE9DQUxFfS4KLSAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X2hvcml6b250YWxEaXJlY3Rpb24KKyAgICAgKiBAcmV0dXJuIE9uZSBvZiB7QGxpbmsgI0xBWU9VVF9ESVJFQ1RJT05fTFRSfSwKKyAgICAgKiAgIHtAbGluayAjTEFZT1VUX0RJUkVDVElPTl9SVEx9LAorICAgICAqICAge0BsaW5rICNMQVlPVVRfRElSRUNUSU9OX0lOSEVSSVR9IG9yCisgICAgICogICB7QGxpbmsgI0xBWU9VVF9ESVJFQ1RJT05fTE9DQUxFfS4KKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X2xheW91dERpcmVjdGlvbgorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KLSAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkobWFwcGluZyA9IHsKLSAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gSE9SSVpPTlRBTF9ESVJFQ1RJT05fTFRSLCAgICAgdG8gPSAiTFRSIiksCi0gICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEhPUklaT05UQUxfRElSRUNUSU9OX1JUTCwgICAgIHRvID0gIlJUTCIpLAotICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBIT1JJWk9OVEFMX0RJUkVDVElPTl9JTkhFUklULCB0byA9ICJJTkhFUklUIiksCi0gICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEhPUklaT05UQUxfRElSRUNUSU9OX0xPQ0FMRSwgIHRvID0gIkxPQ0FMRSIpCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gImxheW91dCIsIG1hcHBpbmcgPSB7CisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IExBWU9VVF9ESVJFQ1RJT05fTFRSLCAgICAgdG8gPSAiTFRSIiksCisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IExBWU9VVF9ESVJFQ1RJT05fUlRMLCAgICAgdG8gPSAiUlRMIiksCisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IExBWU9VVF9ESVJFQ1RJT05fSU5IRVJJVCwgdG8gPSAiSU5IRVJJVCIpLAorICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBMQVlPVVRfRElSRUNUSU9OX0xPQ0FMRSwgIHRvID0gIkxPQ0FMRSIpCiAgICAgfSkKLSAgICBwdWJsaWMgaW50IGdldEhvcml6b250YWxEaXJlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBtVmlld0ZsYWdzICYgSE9SSVpPTlRBTF9ESVJFQ1RJT05fTUFTSzsKKyAgICBwdWJsaWMgaW50IGdldExheW91dERpcmVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1WaWV3RmxhZ3MgJiBMQVlPVVRfRElSRUNUSU9OX01BU0s7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiBmb3IgdGhpcyB2aWV3LgorICAgICAqIFNldCB0aGUgbGF5b3V0IGRpcmVjdGlvbiBmb3IgdGhpcyB2aWV3LgogICAgICAqCi0gICAgICogQHBhcmFtIGhvcml6b250YWxEaXJlY3Rpb24gT25lIG9mIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fTFRSfSwKLSAgICAgKiAgIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fUlRMfSwKLSAgICAgKiAgIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fSU5IRVJJVH0gb3IKLSAgICAgKiAgIHtAbGluayAjSE9SSVpPTlRBTF9ESVJFQ1RJT05fTE9DQUxFfS4KLSAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X2hvcml6b250YWxEaXJlY3Rpb24KKyAgICAgKiBAcGFyYW0gbGF5b3V0RGlyZWN0aW9uIE9uZSBvZiB7QGxpbmsgI0xBWU9VVF9ESVJFQ1RJT05fTFRSfSwKKyAgICAgKiAgIHtAbGluayAjTEFZT1VUX0RJUkVDVElPTl9SVEx9LAorICAgICAqICAge0BsaW5rICNMQVlPVVRfRElSRUNUSU9OX0lOSEVSSVR9IG9yCisgICAgICogICB7QGxpbmsgI0xBWU9VVF9ESVJFQ1RJT05fTE9DQUxFfS4KKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X2xheW91dERpcmVjdGlvbgorICAgICAqCiAgICAgICogQGhpZGUKICAgICAgKi8KICAgICBAUmVtb3RhYmxlVmlld01ldGhvZAotICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxEaXJlY3Rpb24oaW50IGhvcml6b250YWxEaXJlY3Rpb24pIHsKLSAgICAgICAgc2V0RmxhZ3MoaG9yaXpvbnRhbERpcmVjdGlvbiwgSE9SSVpPTlRBTF9ESVJFQ1RJT05fTUFTSyk7CisgICAgcHVibGljIHZvaWQgc2V0TGF5b3V0RGlyZWN0aW9uKGludCBsYXlvdXREaXJlY3Rpb24pIHsKKyAgICAgICAgc2V0RmxhZ3MobGF5b3V0RGlyZWN0aW9uLCBMQVlPVVRfRElSRUNUSU9OX01BU0spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGxheW91dCBkaXJlY3Rpb24gZm9yIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rICNMQVlPVVRfRElSRUNUSU9OX1JUTH0gaWYgdGhlIGxheW91dCBkaXJlY3Rpb24gaXMgUlRMIG9yIHJldHVybnMKKyAgICAgKiB7QGxpbmsgI0xBWU9VVF9ESVJFQ1RJT05fTFRSfSBpZCB0aGUgbGF5b3V0IGRpcmVjdGlvbiBpcyBub3QgUlRMLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAVmlld0RlYnVnLkV4cG9ydGVkUHJvcGVydHkoY2F0ZWdvcnkgPSAibGF5b3V0IiwgbWFwcGluZyA9IHsKKyAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gTEFZT1VUX0RJUkVDVElPTl9MVFIsICAgICB0byA9ICJSRVNPTFZFRF9ESVJFQ1RJT05fTFRSIiksCisgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IExBWU9VVF9ESVJFQ1RJT05fUlRMLCAgICAgdG8gPSAiUkVTT0xWRURfRElSRUNUSU9OX1JUTCIpCisgICAgfSkKKyAgICBwdWJsaWMgaW50IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCkgeworICAgICAgICByZXNvbHZlTGF5b3V0RGlyZWN0aW9uSWZOZWVkZWQoKTsKKyAgICAgICAgcmV0dXJuICgobVByaXZhdGVGbGFnczIgJiBMQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEX1JUTCkgPT0gTEFZT1VUX0RJUkVDVElPTl9SRVNPTFZFRF9SVEwpID8KKyAgICAgICAgICAgICAgICBMQVlPVVRfRElSRUNUSU9OX1JUTCA6IExBWU9VVF9ESVJFQ1RJT05fTFRSOworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHZpZXcncyBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4gVGhpcyBpcyByZXNvbHZlZCBmcm9tCisgICAgICogbGF5b3V0IGF0dHJpYnV0ZSBhbmQvb3IgdGhlIGluaGVyaXRlZCB2YWx1ZSBmcm9tIHRoZSBwYXJlbnQuPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gImxheW91dCIpCisgICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoKSB7CisgICAgICAgIHJldHVybiAoZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSA9PSBMQVlPVVRfRElSRUNUSU9OX1JUTCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NTU0LDYgKzQ3OTEsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgVmlld3MgdGhhdCBjb250YWluIGdpdmVuIHRleHQuIFRoZSBjb250YWlubWVudCBpcyBjYXNlIGluc2Vuc2l0aXZlLgorICAgICAqIEFzIFZpZXcncyB0ZXh0IGlzIGNvbnNpZGVyZWQgYW55IHRleHQgY29udGVudCB0aGF0IFZpZXcgcmVuZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXRWaWV3cyBUaGUgb3V0cHV0IGxpc3Qgb2YgbWF0Y2hpbmcgVmlld3MuCisgICAgICogQHBhcmFtIHRleHQgVGhlIHRleHQgdG8gbWF0Y2ggYWdhaW5zdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaW5kVmlld3NXaXRoVGV4dChBcnJheUxpc3Q8Vmlldz4gb3V0Vmlld3MsIENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRmluZCBhbmQgcmV0dXJuIGFsbCB0b3VjaGFibGUgdmlld3MgdGhhdCBhcmUgZGVzY2VuZGFudHMgb2YgdGhpcyB2aWV3LAogICAgICAqIHBvc3NpYmx5IGluY2x1ZGluZyB0aGlzIHZpZXcgaWYgaXQgaXMgdG91Y2hhYmxlIGl0c2VsZi4KICAgICAgKgpAQCAtNDY2MCw4ICs0OTA3LDggQEAKIAogICAgICAgICAvLyBuZWVkIHRvIGJlIGZvY3VzYWJsZSBpbiB0b3VjaCBtb2RlIGlmIGluIHRvdWNoIG1vZGUKICAgICAgICAgaWYgKGlzSW5Ub3VjaE1vZGUoKSAmJgotICAgICAgICAgICAgICAgIChGT0NVU0FCTEVfSU5fVE9VQ0hfTU9ERSAhPSAobVZpZXdGbGFncyAmIEZPQ1VTQUJMRV9JTl9UT1VDSF9NT0RFKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIChGT0NVU0FCTEVfSU5fVE9VQ0hfTU9ERSAhPSAobVZpZXdGbGFncyAmIEZPQ1VTQUJMRV9JTl9UT1VDSF9NT0RFKSkpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG5lZWQgdG8gbm90IGhhdmUgYW55IHBhcmVudHMgYmxvY2tpbmcgdXMKQEAgLTU5MDEsNyArNjE0OCwxMSBAQAogICAgICAgICAvKiBDaGVjayBpZiB0aGUgVklTSUJMRSBiaXQgaGFzIGNoYW5nZWQgKi8KICAgICAgICAgaWYgKChjaGFuZ2VkICYgSU5WSVNJQkxFKSAhPSAwKSB7CiAgICAgICAgICAgICBuZWVkR2xvYmFsQXR0cmlidXRlc1VwZGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKHRydWUpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIHRoaXMgdmlldyBpcyBiZWNvbWluZyBpbnZpc2libGUsIHNldCB0aGUgRFJBV04gZmxhZyBzbyB0aGF0CisgICAgICAgICAgICAgKiB0aGUgbmV4dCBpbnZhbGlkYXRlKCkgd2lsbCBub3QgYmUgc2tpcHBlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbVByaXZhdGVGbGFncyB8PSBEUkFXTjsKIAogICAgICAgICAgICAgaWYgKCgobVZpZXdGbGFncyAmIFZJU0lCSUxJVFlfTUFTSykgPT0gSU5WSVNJQkxFKSAmJiBoYXNGb2N1cygpKSB7CiAgICAgICAgICAgICAgICAgLy8gcm9vdCB2aWV3IGJlY29taW5nIGludmlzaWJsZSBzaG91bGRuJ3QgY2xlYXIgZm9jdXMKQEAgLTU5NTgsNyArNjIwOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGNoYW5nZWQgJiBIT1JJWk9OVEFMX0RJUkVDVElPTl9NQVNLKSAhPSAwKSB7CisgICAgICAgIGlmICgoY2hhbmdlZCAmIExBWU9VVF9ESVJFQ1RJT05fTUFTSykgIT0gMCkgewogICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtODA3Myw3ICs4MzI0LDcgQEAKICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbFNjcm9sbEJhckVuYWJsZWQoKSAhPSBob3Jpem9udGFsU2Nyb2xsQmFyRW5hYmxlZCkgewogICAgICAgICAgICAgbVZpZXdGbGFncyBePSBTQ1JPTExCQVJTX0hPUklaT05UQUw7CiAgICAgICAgICAgICBjb21wdXRlT3BhcXVlRmxhZ3MoKTsKLSAgICAgICAgICAgIHJlY29tcHV0ZVBhZGRpbmcoKTsKKyAgICAgICAgICAgIHJlc29sdmVQYWRkaW5nKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgxMDMsNyArODM1NCw3IEBACiAgICAgICAgIGlmIChpc1ZlcnRpY2FsU2Nyb2xsQmFyRW5hYmxlZCgpICE9IHZlcnRpY2FsU2Nyb2xsQmFyRW5hYmxlZCkgewogICAgICAgICAgICAgbVZpZXdGbGFncyBePSBTQ1JPTExCQVJTX1ZFUlRJQ0FMOwogICAgICAgICAgICAgY29tcHV0ZU9wYXF1ZUZsYWdzKCk7Ci0gICAgICAgICAgICByZWNvbXB1dGVQYWRkaW5nKCk7CisgICAgICAgICAgICByZXNvbHZlUGFkZGluZygpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MTYyLDcgKzg0MTMsNyBAQAogICAgICAgICBpZiAoc3R5bGUgIT0gKG1WaWV3RmxhZ3MgJiBTQ1JPTExCQVJTX1NUWUxFX01BU0spKSB7CiAgICAgICAgICAgICBtVmlld0ZsYWdzID0gKG1WaWV3RmxhZ3MgJiB+U0NST0xMQkFSU19TVFlMRV9NQVNLKSB8IChzdHlsZSAmIFNDUk9MTEJBUlNfU1RZTEVfTUFTSyk7CiAgICAgICAgICAgICBjb21wdXRlT3BhcXVlRmxhZ3MoKTsKLSAgICAgICAgICAgIHJlY29tcHV0ZVBhZGRpbmcoKTsKKyAgICAgICAgICAgIHJlc29sdmVQYWRkaW5nKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgzMDMsNiArODU1NCw0MCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgdmlldyBjYW4gYmUgc2Nyb2xsZWQgaG9yaXpvbnRhbGx5IGluIGEgY2VydGFpbiBkaXJlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIE5lZ2F0aXZlIHRvIGNoZWNrIHNjcm9sbGluZyBsZWZ0LCBwb3NpdGl2ZSB0byBjaGVjayBzY3JvbGxpbmcgcmlnaHQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgdmlldyBjYW4gYmUgc2Nyb2xsZWQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24sIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5TY3JvbGxIb3Jpem9udGFsbHkoaW50IGRpcmVjdGlvbikgeworICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gY29tcHV0ZUhvcml6b250YWxTY3JvbGxPZmZzZXQoKTsKKyAgICAgICAgZmluYWwgaW50IHJhbmdlID0gY29tcHV0ZUhvcml6b250YWxTY3JvbGxSYW5nZSgpIC0gY29tcHV0ZUhvcml6b250YWxTY3JvbGxFeHRlbnQoKTsKKyAgICAgICAgaWYgKHJhbmdlID09IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldCA8IHJhbmdlIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoaXMgdmlldyBjYW4gYmUgc2Nyb2xsZWQgdmVydGljYWxseSBpbiBhIGNlcnRhaW4gZGlyZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRpcmVjdGlvbiBOZWdhdGl2ZSB0byBjaGVjayBzY3JvbGxpbmcgdXAsIHBvc2l0aXZlIHRvIGNoZWNrIHNjcm9sbGluZyBkb3duLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHZpZXcgY2FuIGJlIHNjcm9sbGVkIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuU2Nyb2xsVmVydGljYWxseShpbnQgZGlyZWN0aW9uKSB7CisgICAgICAgIGZpbmFsIGludCBvZmZzZXQgPSBjb21wdXRlVmVydGljYWxTY3JvbGxPZmZzZXQoKTsKKyAgICAgICAgZmluYWwgaW50IHJhbmdlID0gY29tcHV0ZVZlcnRpY2FsU2Nyb2xsUmFuZ2UoKSAtIGNvbXB1dGVWZXJ0aWNhbFNjcm9sbEV4dGVudCgpOworICAgICAgICBpZiAocmFuZ2UgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZGlyZWN0aW9uIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldCA+IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0IDwgcmFuZ2UgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogPHA+UmVxdWVzdCB0aGUgZHJhd2luZyBvZiB0aGUgaG9yaXpvbnRhbCBhbmQgdGhlIHZlcnRpY2FsIHNjcm9sbGJhci4gVGhlCiAgICAgICogc2Nyb2xsYmFycyBhcmUgcGFpbnRlZCBvbmx5IGlmIHRoZXkgaGF2ZSBiZWVuIGF3YWtlbmVkIGZpcnN0LjwvcD4KICAgICAgKgpAQCAtODUxMywyMyArODc5OCwxMTIgQEAKICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MgJj0gfkFXQUtFTl9TQ1JPTExfQkFSU19PTl9BVFRBQ0g7CiAgICAgICAgIH0KICAgICAgICAganVtcERyYXdhYmxlc1RvQ3VycmVudFN0YXRlKCk7CisgICAgICAgIHJlc2V0TGF5b3V0RGlyZWN0aW9uUmVzb2x1dGlvbigpOworICAgICAgICByZXNvbHZlTGF5b3V0RGlyZWN0aW9uSWZOZWVkZWQoKTsKKyAgICAgICAgcmVzb2x2ZVBhZGRpbmcoKTsKKyAgICAgICAgaWYgKGlzRm9jdXNlZCgpKSB7CisgICAgICAgICAgICBJbnB1dE1ldGhvZE1hbmFnZXIgaW1tID0gSW5wdXRNZXRob2RNYW5hZ2VyLnBlZWtJbnN0YW5jZSgpOworICAgICAgICAgICAgaW1tLmZvY3VzSW4odGhpcyk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLy8gV2UgYXJlIHN1cHBvc2luZyBoZXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rpb25hbGl0eSB3aWxsIGJlIHJlc29sdmVkIGJlZm9yZSBpdHMgY2hpbGRyZW4KLSAgICAgICAgLy8gVmlldyBob3Jpem9udGFsRGlyZWN0aW9uIHB1YmxpYyBhdHRyaWJ1dGUgcmVzb2x1dGlvbiB0byBhbiBpbnRlcm5hbCB2YXIuCi0gICAgICAgIC8vIFJlc29sdmluZyB0aGUgbGF5b3V0IGRpcmVjdGlvbi4gTFRSIGlzIHNldCBpbml0aWFsbHkuCi0gICAgICAgIG1Qcml2YXRlRmxhZ3MyICY9IH5SRVNPTFZFRF9MQVlPVVRfUlRMOwotICAgICAgICBzd2l0Y2ggKGdldEhvcml6b250YWxEaXJlY3Rpb24oKSkgewotICAgICAgICAgICAgY2FzZSBIT1JJWk9OVEFMX0RJUkVDVElPTl9JTkhFUklUOgorICAgIC8qKgorICAgICAqIFJlc29sdmUgYW5kIGNhY2hlIHRoZSBsYXlvdXQgZGlyZWN0aW9uLiBMVFIgaXMgc2V0IGluaXRpYWxseS4gVGhpcyBpcyBpbXBsaWNpdGx5IHN1cHBvc2luZworICAgICAqIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rpb25hbGl0eSBjYW4gYW5kIHdpbGwgYmUgcmVzb2x2ZWQgYmVmb3JlIGl0cyBjaGlsZHJlbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUxheW91dERpcmVjdGlvbklmTmVlZGVkKCkgeworICAgICAgICAvLyBEbyBub3QgcmVzb2x2ZSBpZiBpdCBpcyBub3QgbmVlZGVkCisgICAgICAgIGlmICgobVByaXZhdGVGbGFnczIgJiBMQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEKSA9PSBMQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEKSByZXR1cm47CisKKyAgICAgICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIGxheW91dCBkaXJlY3Rpb24gcmVzb2x1dGlvbgorICAgICAgICBtUHJpdmF0ZUZsYWdzMiAmPSB+TEFZT1VUX0RJUkVDVElPTl9SRVNPTFZFRF9SVEw7CisKKyAgICAgICAgLy8gU2V0IHJlc29sdmVkIGRlcGVuZGluZyBvbiBsYXlvdXQgZGlyZWN0aW9uCisgICAgICAgIHN3aXRjaCAoZ2V0TGF5b3V0RGlyZWN0aW9uKCkpIHsKKyAgICAgICAgICAgIGNhc2UgTEFZT1VUX0RJUkVDVElPTl9JTkhFUklUOgogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgcm9vdCB2aWV3LCBubyBuZWVkIHRvIGxvb2sgYXQgcGFyZW50J3MgbGF5b3V0IGRpci4KLSAgICAgICAgICAgICAgICBpZiAobVBhcmVudCAhPSBudWxsICYmIG1QYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgoVmlld0dyb3VwKSBtUGFyZW50KS5pc0xheW91dFJ0bCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MyIHw9IFJFU09MVkVEX0xBWU9VVF9SVEw7CisgICAgICAgICAgICAgICAgaWYgKG1QYXJlbnQgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmVudCBpbnN0YW5jZW9mIFZpZXdHcm91cCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChWaWV3R3JvdXApIG1QYXJlbnQpLmdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCkgPT0gTEFZT1VUX0RJUkVDVElPTl9SVEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFnczIgfD0gTEFZT1VUX0RJUkVDVElPTl9SRVNPTFZFRF9SVEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIT1JJWk9OVEFMX0RJUkVDVElPTl9SVEw6Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVGbGFnczIgfD0gUkVTT0xWRURfTEFZT1VUX1JUTDsKKyAgICAgICAgICAgIGNhc2UgTEFZT1VUX0RJUkVDVElPTl9SVEw6CisgICAgICAgICAgICAgICAgbVByaXZhdGVGbGFnczIgfD0gTEFZT1VUX0RJUkVDVElPTl9SRVNPTFZFRF9SVEw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExBWU9VVF9ESVJFQ1RJT05fTE9DQUxFOgorICAgICAgICAgICAgICAgIGlmKGlzTGF5b3V0RGlyZWN0aW9uUnRsKExvY2FsZS5nZXREZWZhdWx0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlRmxhZ3MyIHw9IExBWU9VVF9ESVJFQ1RJT05fUkVTT0xWRURfUlRMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbywgTFRSIGJ5IGRlZmF1bHQKICAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0byByZXNvbHZlZAorICAgICAgICBtUHJpdmF0ZUZsYWdzMiB8PSBMQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXNvbHZlUGFkZGluZygpIHsKKyAgICAgICAgLy8gSWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBhYnNvbHV0ZSBwYWRkaW5nIChlaXRoZXIgd2l0aCBhbmRyb2lkOnBhZGRpbmcgb3IKKyAgICAgICAgLy8gYW5kcm9pZDpwYWRkaW5nTGVmdC9Ub3AvUmlnaHQvQm90dG9tKSwgdXNlIHRoaXMgcGFkZGluZywgb3RoZXJ3aXNlCisgICAgICAgIC8vIHVzZSB0aGUgZGVmYXVsdCBwYWRkaW5nIG9yIHRoZSBwYWRkaW5nIGZyb20gdGhlIGJhY2tncm91bmQgZHJhd2FibGUKKyAgICAgICAgLy8gKHN0b3JlZCBhdCB0aGlzIHBvaW50IGluIG1QYWRkaW5nKikKKyAgICAgICAgc3dpdGNoIChnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpKSB7CisgICAgICAgICAgICBjYXNlIExBWU9VVF9ESVJFQ1RJT05fUlRMOgorICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHVzZXIgcGFkZGluZyBvdmVycmlkZSBSaWdodCB1c2VyIHBhZGRpbmcuIE90aGVyd2lzZSwgaWYgUmlnaHQgdXNlcgorICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgaXMgbm90IGRlZmluZWQsIHVzZSB0aGUgZGVmYXVsdCBSaWdodCBwYWRkaW5nLiBJZiBSaWdodCB1c2VyIHBhZGRpbmcKKyAgICAgICAgICAgICAgICAvLyBpcyBkZWZpbmVkLCBqdXN0IHVzZSBpdC4KKyAgICAgICAgICAgICAgICBpZiAobVVzZXJQYWRkaW5nU3RhcnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVXNlclBhZGRpbmdSaWdodCA9IG1Vc2VyUGFkZGluZ1N0YXJ0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZXJQYWRkaW5nUmlnaHQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1Vc2VyUGFkZGluZ1JpZ2h0ID0gbVBhZGRpbmdSaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1Vc2VyUGFkZGluZ0VuZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1Vc2VyUGFkZGluZ0xlZnQgPSBtVXNlclBhZGRpbmdFbmQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVXNlclBhZGRpbmdMZWZ0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtVXNlclBhZGRpbmdMZWZ0ID0gbVBhZGRpbmdMZWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEFZT1VUX0RJUkVDVElPTl9MVFI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHVzZXIgcGFkZGluZyBvdmVycmlkZSBMZWZ0IHVzZXIgcGFkZGluZy4gT3RoZXJ3aXNlLCBpZiBMZWZ0IHVzZXIKKyAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIGlzIG5vdCBkZWZpbmVkLCB1c2UgdGhlIGRlZmF1bHQgbGVmdCBwYWRkaW5nLiBJZiBMZWZ0IHVzZXIgcGFkZGluZworICAgICAgICAgICAgICAgIC8vIGlzIGRlZmluZWQsIGp1c3QgdXNlIGl0LgorICAgICAgICAgICAgICAgIGlmIChtVXNlclBhZGRpbmdTdGFydCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1Vc2VyUGFkZGluZ0xlZnQgPSBtVXNlclBhZGRpbmdTdGFydDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VyUGFkZGluZ0xlZnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1Vc2VyUGFkZGluZ0xlZnQgPSBtUGFkZGluZ0xlZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtVXNlclBhZGRpbmdFbmQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVXNlclBhZGRpbmdSaWdodCA9IG1Vc2VyUGFkZGluZ0VuZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VyUGFkZGluZ1JpZ2h0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtVXNlclBhZGRpbmdSaWdodCA9IG1QYWRkaW5nUmlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVBhZGRpbmdUb3AgPSAobVVzZXJQYWRkaW5nVG9wID49IDApID8gbVVzZXJQYWRkaW5nVG9wIDogbVBhZGRpbmdUb3A7CisgICAgICAgIG1Vc2VyUGFkZGluZ0JvdHRvbSA9IChtVXNlclBhZGRpbmdCb3R0b20gPj0gMCkgPyBtVXNlclBhZGRpbmdCb3R0b20gOiBtUGFkZGluZ0JvdHRvbTsKKworICAgICAgICByZWNvbXB1dGVQYWRkaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIHJlc29sdmVkIGxheW91dCBkaXJlY3Rpb24gYnkgY2xlYXJpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZworICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNldExheW91dERpcmVjdGlvblJlc29sdXRpb24oKSB7CisgICAgICAgIG1Qcml2YXRlRmxhZ3MyICY9IH5MQVlPVVRfRElSRUNUSU9OX1JFU09MVkVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGEgTG9jYWxlIGlzIGNvcnJlc3BvbmRpbmcgdG8gYSBSVEwgc2NyaXB0LgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZSBMb2NhbGUgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBMb2NhbGUgaXMgY29ycmVzcG9uZGluZyB0byBhIFJUTCBzY3JpcHQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xheW91dERpcmVjdGlvblJ0bChMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIHJldHVybiAoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UgPT0KKyAgICAgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MDI1LDcgKzkzOTksNyBAQAogICAgICAgICAgICAgICAgIG1Mb2NhbERpcnR5UmVjdC5zZXRFbXB0eSgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDYW52YXMgY3VycmVudENhbnZhcyA9IG1BdHRhY2hJbmZvLm1IYXJkd2FyZUNhbnZhczsKKyAgICAgICAgICAgIEhhcmR3YXJlQ2FudmFzIGN1cnJlbnRDYW52YXMgPSBtQXR0YWNoSW5mby5tSGFyZHdhcmVDYW52YXM7CiAgICAgICAgICAgICBmaW5hbCBIYXJkd2FyZUNhbnZhcyBjYW52YXMgPSBtSGFyZHdhcmVMYXllci5zdGFydChjdXJyZW50Q2FudmFzKTsKICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYXJkd2FyZUNhbnZhcyA9IGNhbnZhczsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xMDAxNywxNiArMTAzOTEsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIDxwPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIHZpZXcncyBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4gVGhpcyBpcyByZXNvbHZlZCBmcm9tCi0gICAgICogbGF5b3V0IGF0dHJpYnV0ZSBhbmQvb3IgdGhlIGluaGVyaXRlZCB2YWx1ZSBmcm9tIHRoZSBwYXJlbnQuPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBsYXlvdXQgaXMgcmlnaHQtdG8tbGVmdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xheW91dFJ0bCgpIHsKLSAgICAgICAgcmV0dXJuIChtUHJpdmF0ZUZsYWdzMiAmIFJFU09MVkVEX0xBWU9VVF9SVEwpID09IFJFU09MVkVEX0xBWU9VVF9SVEw7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQXNzaWduIGEgc2l6ZSBhbmQgcG9zaXRpb24gdG8gYSB2aWV3IGFuZCBhbGwgb2YgaXRzCiAgICAgICogZGVzY2VuZGFudHMKICAgICAgKgpAQCAtMTAyMzgsMTMgKzEwNjAyLDE1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAgLyoqCi0gICAgICogQ2hlY2sgaWYgYSBnaXZlbiBEcmF3YWJsZSBpcyBpbiBSVEwgbGF5b3V0IGRpcmVjdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3aG8gdGhlIHJlY2lwaWVudCBvZiB0aGUgYWN0aW9uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoRHJhd2FibGUgd2hvKSB7Ci0gICAgICAgIHJldHVybiAod2hvID09IG1CR0RyYXdhYmxlKSAmJiBpc0xheW91dFJ0bCgpOworICAgIC8qKgorICAgICogUmV0dXJuIHRoZSBsYXlvdXQgZGlyZWN0aW9uIG9mIGEgZ2l2ZW4gRHJhd2FibGUuCisgICAgKgorICAgICogQHBhcmFtIHdobyB0aGUgRHJhd2FibGUgdG8gcXVlcnkKKyAgICAqCisgICAgKiBAaGlkZQorICAgICovCisgICAgcHVibGljIGludCBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbihEcmF3YWJsZSB3aG8pIHsKKyAgICAgICAgcmV0dXJuICh3aG8gPT0gbUJHRHJhd2FibGUpID8gZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSA6IExBWU9VVF9ESVJFQ1RJT05fREVGQVVMVDsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNTAwLDcgKzEwODY2LDE0IEBACiAgICAgICAgICAgICAgICAgc1RocmVhZExvY2FsLnNldChwYWRkaW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkLmdldFBhZGRpbmcocGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICBzZXRQYWRkaW5nKHBhZGRpbmcubGVmdCwgcGFkZGluZy50b3AsIHBhZGRpbmcucmlnaHQsIHBhZGRpbmcuYm90dG9tKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGQuZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb25TZWxmKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMQVlPVVRfRElSRUNUSU9OX1JUTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZGRpbmcocGFkZGluZy5yaWdodCwgcGFkZGluZy50b3AsIHBhZGRpbmcubGVmdCwgcGFkZGluZy5ib3R0b20pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEFZT1VUX0RJUkVDVElPTl9MVFI6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYWRkaW5nKHBhZGRpbmcubGVmdCwgcGFkZGluZy50b3AsIHBhZGRpbmcucmlnaHQsIHBhZGRpbmcuYm90dG9tKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIG1pbmltdW0gc2l6ZXMgb2YgdGhlIG9sZCBEcmF3YWJsZSBhbmQgdGhlIG5ldy4gIElmIHRoZXJlIGlzbid0IGFuIG9sZCBvcgpAQCAtMTA1ODYsNiArMTA5NTksOCBAQAogICAgIHB1YmxpYyB2b2lkIHNldFBhZGRpbmcoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewogICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKIAorICAgICAgICBtVXNlclBhZGRpbmdSZWxhdGl2ZSA9IGZhbHNlOworCiAgICAgICAgIG1Vc2VyUGFkZGluZ0xlZnQgPSBsZWZ0OwogICAgICAgICBtVXNlclBhZGRpbmdSaWdodCA9IHJpZ2h0OwogICAgICAgICBtVXNlclBhZGRpbmdCb3R0b20gPSBib3R0b207CkBAIC0xMDU5NSwxMSArMTA5NzAsMTYgQEAKICAgICAgICAgLy8gQ29tbW9uIGNhc2UgaXMgdGhlcmUgYXJlIG5vIHNjcm9sbCBiYXJzLgogICAgICAgICBpZiAoKHZpZXdGbGFncyAmIChTQ1JPTExCQVJTX1ZFUlRJQ0FMfFNDUk9MTEJBUlNfSE9SSVpPTlRBTCkpICE9IDApIHsKICAgICAgICAgICAgIGlmICgodmlld0ZsYWdzICYgU0NST0xMQkFSU19WRVJUSUNBTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gRGV0ZXJtaW5lIHdoYXQgdG8gZG8gd2l0aCBTQ1JPTExCQVJfUE9TSVRJT05fREVGQVVMVCBiYXNlZCBvbiBSVEwgc2V0dGluZ3MuCiAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCA9ICh2aWV3RmxhZ3MgJiBTQ1JPTExCQVJTX0lOU0VUX01BU0spID09IDAKICAgICAgICAgICAgICAgICAgICAgICAgID8gMCA6IGdldFZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoKTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1WZXJ0aWNhbFNjcm9sbGJhclBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0NST0xMQkFSX1BPU0lUSU9OX0RFRkFVTFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSA9PSBMQVlPVVRfRElSRUNUSU9OX1JUTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBTQ1JPTExCQVJfUE9TSVRJT05fUklHSFQ6CiAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCArPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNjM3LDYgKzExMDE3LDM3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVsYXRpdmUgcGFkZGluZy4gVGhlIHZpZXcgbWF5IGFkZCBvbiB0aGUgc3BhY2UgcmVxdWlyZWQgdG8gZGlzcGxheQorICAgICAqIHRoZSBzY3JvbGxiYXJzLCBkZXBlbmRpbmcgb24gdGhlIHN0eWxlIGFuZCB2aXNpYmlsaXR5IG9mIHRoZSBzY3JvbGxiYXJzLgorICAgICAqIFNvIHRoZSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2dldFBhZGRpbmdTdGFydH0sIHtAbGluayAjZ2V0UGFkZGluZ1RvcH0sCisgICAgICoge0BsaW5rICNnZXRQYWRkaW5nRW5kfSBhbmQge0BsaW5rICNnZXRQYWRkaW5nQm90dG9tfSBtYXkgYmUgZGlmZmVyZW50CisgICAgICogZnJvbSB0aGUgdmFsdWVzIHNldCBpbiB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmcKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmdCb3R0b20KKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmdTdGFydAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdfcGFkZGluZ0VuZAorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1ZpZXdfcGFkZGluZ1RvcAorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgcGFkZGluZyBpbiBwaXhlbHMKKyAgICAgKiBAcGFyYW0gdG9wIHRoZSB0b3AgcGFkZGluZyBpbiBwaXhlbHMKKyAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgcGFkZGluZyBpbiBwaXhlbHMKKyAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gcGFkZGluZyBpbiBwaXhlbHMKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFkZGluZ1JlbGF0aXZlKGludCBzdGFydCwgaW50IHRvcCwgaW50IGVuZCwgaW50IGJvdHRvbSkgeworICAgICAgICBtVXNlclBhZGRpbmdSZWxhdGl2ZSA9IHRydWU7CisgICAgICAgIHN3aXRjaChnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpKSB7CisgICAgICAgICAgICBjYXNlIExBWU9VVF9ESVJFQ1RJT05fUlRMOgorICAgICAgICAgICAgICAgIHNldFBhZGRpbmcoZW5kLCB0b3AsIHN0YXJ0LCBib3R0b20pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQVlPVVRfRElSRUNUSU9OX0xUUjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2V0UGFkZGluZyhzdGFydCwgdG9wLCBlbmQsIGJvdHRvbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0b3AgcGFkZGluZyBvZiB0aGlzIHZpZXcuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSB0b3AgcGFkZGluZyBpbiBwaXhlbHMKQEAgLTEwNjY4LDYgKzExMDc5LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhcnQgcGFkZGluZyBvZiB0aGlzIHZpZXcuIElmIHRoZXJlIGFyZSBpbnNldCBhbmQgZW5hYmxlZAorICAgICAqIHNjcm9sbGJhcnMsIHRoaXMgdmFsdWUgbWF5IGluY2x1ZGUgdGhlIHNwYWNlIHJlcXVpcmVkIHRvIGRpc3BsYXkgdGhlCisgICAgICogc2Nyb2xsYmFycyBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgcGFkZGluZyBpbiBwaXhlbHMKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYWRkaW5nU3RhcnQoKSB7CisgICAgICAgIHJldHVybiAoZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSA9PSBMQVlPVVRfRElSRUNUSU9OX1JUTCkgPworICAgICAgICAgICAgICAgIG1QYWRkaW5nUmlnaHQgOiBtUGFkZGluZ0xlZnQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcmlnaHQgcGFkZGluZyBvZiB0aGlzIHZpZXcuIElmIHRoZXJlIGFyZSBpbnNldCBhbmQgZW5hYmxlZAogICAgICAqIHNjcm9sbGJhcnMsIHRoaXMgdmFsdWUgbWF5IGluY2x1ZGUgdGhlIHNwYWNlIHJlcXVpcmVkIHRvIGRpc3BsYXkgdGhlCiAgICAgICogc2Nyb2xsYmFycyBhcyB3ZWxsLgpAQCAtMTA2NzksNiArMTExMDQsMzQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbmQgcGFkZGluZyBvZiB0aGlzIHZpZXcuIElmIHRoZXJlIGFyZSBpbnNldCBhbmQgZW5hYmxlZAorICAgICAqIHNjcm9sbGJhcnMsIHRoaXMgdmFsdWUgbWF5IGluY2x1ZGUgdGhlIHNwYWNlIHJlcXVpcmVkIHRvIGRpc3BsYXkgdGhlCisgICAgICogc2Nyb2xsYmFycyBhcyB3ZWxsLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW5kIHBhZGRpbmcgaW4gcGl4ZWxzCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UGFkZGluZ0VuZCgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpID09IExBWU9VVF9ESVJFQ1RJT05fUlRMKSA/CisgICAgICAgICAgICAgICAgbVBhZGRpbmdMZWZ0IDogbVBhZGRpbmdSaWdodDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaWYgdGhlIHBhZGRpbmcgYXMgYmVlbiBzZXQgdGhydSByZWxhdGl2ZSB2YWx1ZXMKKyAgICAgKiB7QGxpbmsgI3NldFBhZGRpbmdSZWxhdGl2ZShpbnQsIGludCwgaW50LCBpbnQpfSBvciB0aHJ1CisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVmlld19wYWRkaW5nU3RhcnQgb3IKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNWaWV3X3BhZGRpbmdFbmQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFkZGluZyBpcyByZWxhdGl2ZSBvciBmYWxzZSBpZiBpdCBpcyBub3QuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUGFkZGluZ1JlbGF0aXZlKCkgeworICAgICAgICByZXR1cm4gbVVzZXJQYWRkaW5nUmVsYXRpdmU7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ2hhbmdlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoaXMgdmlldy4gQSB2aWV3IGNhbiBiZSBzZWxlY3RlZCBvciBub3QuCiAgICAgICogTm90ZSB0aGF0IHNlbGVjdGlvbiBpcyBub3QgdGhlIHNhbWUgYXMgZm9jdXMuIFZpZXdzIGFyZSB0eXBpY2FsbHkKICAgICAgKiBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBvZiBhbiBBZGFwdGVyVmlldyBsaWtlIExpc3RWaWV3IG9yIEdyaWRWaWV3OwpAQCAtMTE0NjQsNyArMTE5MTcsNyBAQAogCiAgICAgLyoqCiAgICAgICogVXRpbGl0eSB0byByZXR1cm4gYSBkZWZhdWx0IHNpemUuIFVzZXMgdGhlIHN1cHBsaWVkIHNpemUgaWYgdGhlCi0gICAgICogTWVhc3VyZVNwZWMgaW1wb3NlZCBubyBjb250cmFpbnRzLiBXaWxsIGdldCBsYXJnZXIgaWYgYWxsb3dlZAorICAgICAqIE1lYXN1cmVTcGVjIGltcG9zZWQgbm8gY29uc3RyYWludHMuIFdpbGwgZ2V0IGxhcmdlciBpZiBhbGxvd2VkCiAgICAgICogYnkgdGhlIE1lYXN1cmVTcGVjLgogICAgICAqCiAgICAgICogQHBhcmFtIHNpemUgRGVmYXVsdCBzaXplIGZvciB0aGlzIHZpZXcKQEAgLTExNDc0LDcgKzExOTI3LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0U2l6ZShpbnQgc2l6ZSwgaW50IG1lYXN1cmVTcGVjKSB7CiAgICAgICAgIGludCByZXN1bHQgPSBzaXplOwogICAgICAgICBpbnQgc3BlY01vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKG1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IHNwZWNTaXplID0gIE1lYXN1cmVTcGVjLmdldFNpemUobWVhc3VyZVNwZWMpOworICAgICAgICBpbnQgc3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKG1lYXN1cmVTcGVjKTsKIAogICAgICAgICBzd2l0Y2ggKHNwZWNNb2RlKSB7CiAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6CkBAIC0xMjI4Niw2ICsxMjczOSwxNjkgQEAKICAgICAgICAgcmV0dXJuIGdldFZlcnRpY2FsU2Nyb2xsRmFjdG9yKCk7CiAgICAgfQogCisgICAgLy8KKyAgICAvLyBQcm9wZXJ0aWVzCisgICAgLy8KKyAgICAvKioKKyAgICAgKiBBIFByb3BlcnR5IHdyYXBwZXIgYXJvdW5kIHRoZSA8Y29kZT5hbHBoYTwvY29kZT4gZnVuY3Rpb25hbGl0eSBoYW5kbGVkIGJ5IHRoZQorICAgICAqIHtAbGluayBWaWV3I3NldEFscGhhKGZsb2F0KX0gYW5kIHtAbGluayBWaWV3I2dldEFscGhhKCl9IG1ldGhvZHMuCisgICAgICovCisgICAgc3RhdGljIFByb3BlcnR5PFZpZXcsIEZsb2F0PiBBTFBIQSA9IG5ldyBGbG9hdFByb3BlcnR5PFZpZXc+KCJhbHBoYSIpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFZpZXcgb2JqZWN0LCBmbG9hdCB2YWx1ZSkgeworICAgICAgICAgICAgb2JqZWN0LnNldEFscGhhKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmxvYXQgZ2V0KFZpZXcgb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0LmdldEFscGhhKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBQcm9wZXJ0eSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+dHJhbnNsYXRpb25YPC9jb2RlPiBmdW5jdGlvbmFsaXR5IGhhbmRsZWQgYnkgdGhlCisgICAgICoge0BsaW5rIFZpZXcjc2V0VHJhbnNsYXRpb25YKGZsb2F0KX0gYW5kIHtAbGluayBWaWV3I2dldFRyYW5zbGF0aW9uWCgpfSBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHk8VmlldywgRmxvYXQ+IFRSQU5TTEFUSU9OX1ggPSBuZXcgRmxvYXRQcm9wZXJ0eTxWaWV3PigidHJhbnNsYXRpb25YIikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVmlldyBvYmplY3QsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgICAgICBvYmplY3Quc2V0VHJhbnNsYXRpb25YKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGbG9hdCBnZXQoVmlldyBvYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuZ2V0VHJhbnNsYXRpb25YKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBQcm9wZXJ0eSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+dHJhbnNsYXRpb25ZPC9jb2RlPiBmdW5jdGlvbmFsaXR5IGhhbmRsZWQgYnkgdGhlCisgICAgICoge0BsaW5rIFZpZXcjc2V0VHJhbnNsYXRpb25ZKGZsb2F0KX0gYW5kIHtAbGluayBWaWV3I2dldFRyYW5zbGF0aW9uWSgpfSBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHk8VmlldywgRmxvYXQ+IFRSQU5TTEFUSU9OX1kgPSBuZXcgRmxvYXRQcm9wZXJ0eTxWaWV3PigidHJhbnNsYXRpb25ZIikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVmlldyBvYmplY3QsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgICAgICBvYmplY3Quc2V0VHJhbnNsYXRpb25ZKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmxvYXQgZ2V0KFZpZXcgb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0LmdldFRyYW5zbGF0aW9uWSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEEgUHJvcGVydHkgd3JhcHBlciBhcm91bmQgdGhlIDxjb2RlPng8L2NvZGU+IGZ1bmN0aW9uYWxpdHkgaGFuZGxlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgVmlldyNzZXRYKGZsb2F0KX0gYW5kIHtAbGluayBWaWV3I2dldFgoKX0gbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5PFZpZXcsIEZsb2F0PiBYID0gbmV3IEZsb2F0UHJvcGVydHk8Vmlldz4oIngiKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShWaWV3IG9iamVjdCwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgICAgIG9iamVjdC5zZXRYKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmxvYXQgZ2V0KFZpZXcgb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0LmdldFgoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIFByb3BlcnR5IHdyYXBwZXIgYXJvdW5kIHRoZSA8Y29kZT55PC9jb2RlPiBmdW5jdGlvbmFsaXR5IGhhbmRsZWQgYnkgdGhlCisgICAgICoge0BsaW5rIFZpZXcjc2V0WShmbG9hdCl9IGFuZCB7QGxpbmsgVmlldyNnZXRZKCl9IG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eTxWaWV3LCBGbG9hdD4gWSA9IG5ldyBGbG9hdFByb3BlcnR5PFZpZXc+KCJ5IikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVmlldyBvYmplY3QsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgICAgICBvYmplY3Quc2V0WSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZsb2F0IGdldChWaWV3IG9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRZKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBQcm9wZXJ0eSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+cm90YXRpb248L2NvZGU+IGZ1bmN0aW9uYWxpdHkgaGFuZGxlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgVmlldyNzZXRSb3RhdGlvbihmbG9hdCl9IGFuZCB7QGxpbmsgVmlldyNnZXRSb3RhdGlvbigpfSBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHk8VmlldywgRmxvYXQ+IFJPVEFUSU9OID0gbmV3IEZsb2F0UHJvcGVydHk8Vmlldz4oInJvdGF0aW9uIikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVmlldyBvYmplY3QsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgICAgICBvYmplY3Quc2V0Um90YXRpb24odmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGbG9hdCBnZXQoVmlldyBvYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuZ2V0Um90YXRpb24oKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIFByb3BlcnR5IHdyYXBwZXIgYXJvdW5kIHRoZSA8Y29kZT5yb3RhdGlvblg8L2NvZGU+IGZ1bmN0aW9uYWxpdHkgaGFuZGxlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgVmlldyNzZXRSb3RhdGlvblgoZmxvYXQpfSBhbmQge0BsaW5rIFZpZXcjZ2V0Um90YXRpb25YKCl9IG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eTxWaWV3LCBGbG9hdD4gUk9UQVRJT05fWCA9IG5ldyBGbG9hdFByb3BlcnR5PFZpZXc+KCJyb3RhdGlvblgiKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShWaWV3IG9iamVjdCwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgICAgIG9iamVjdC5zZXRSb3RhdGlvblgodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGbG9hdCBnZXQoVmlldyBvYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuZ2V0Um90YXRpb25YKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBQcm9wZXJ0eSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+cm90YXRpb25ZPC9jb2RlPiBmdW5jdGlvbmFsaXR5IGhhbmRsZWQgYnkgdGhlCisgICAgICoge0BsaW5rIFZpZXcjc2V0Um90YXRpb25ZKGZsb2F0KX0gYW5kIHtAbGluayBWaWV3I2dldFJvdGF0aW9uWSgpfSBtZXRob2RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydHk8VmlldywgRmxvYXQ+IFJPVEFUSU9OX1kgPSBuZXcgRmxvYXRQcm9wZXJ0eTxWaWV3Pigicm90YXRpb25ZIikgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoVmlldyBvYmplY3QsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgICAgICBvYmplY3Quc2V0Um90YXRpb25ZKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmxvYXQgZ2V0KFZpZXcgb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0LmdldFJvdGF0aW9uWSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEEgUHJvcGVydHkgd3JhcHBlciBhcm91bmQgdGhlIDxjb2RlPnNjYWxlWDwvY29kZT4gZnVuY3Rpb25hbGl0eSBoYW5kbGVkIGJ5IHRoZQorICAgICAqIHtAbGluayBWaWV3I3NldFNjYWxlWChmbG9hdCl9IGFuZCB7QGxpbmsgVmlldyNnZXRTY2FsZVgoKX0gbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByb3BlcnR5PFZpZXcsIEZsb2F0PiBTQ0FMRV9YID0gbmV3IEZsb2F0UHJvcGVydHk8Vmlldz4oInNjYWxlWCIpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFZpZXcgb2JqZWN0LCBmbG9hdCB2YWx1ZSkgeworICAgICAgICAgICAgb2JqZWN0LnNldFNjYWxlWCh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZsb2F0IGdldChWaWV3IG9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5nZXRTY2FsZVgoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIFByb3BlcnR5IHdyYXBwZXIgYXJvdW5kIHRoZSA8Y29kZT5zY2FsZVk8L2NvZGU+IGZ1bmN0aW9uYWxpdHkgaGFuZGxlZCBieSB0aGUKKyAgICAgKiB7QGxpbmsgVmlldyNzZXRTY2FsZVkoZmxvYXQpfSBhbmQge0BsaW5rIFZpZXcjZ2V0U2NhbGVZKCl9IG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcm9wZXJ0eTxWaWV3LCBGbG9hdD4gU0NBTEVfWSA9IG5ldyBGbG9hdFByb3BlcnR5PFZpZXc+KCJzY2FsZVkiKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShWaWV3IG9iamVjdCwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgICAgIG9iamVjdC5zZXRTY2FsZVkodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGbG9hdCBnZXQoVmlldyBvYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuZ2V0U2NhbGVZKCk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgLyoqCiAgICAgICogQSBNZWFzdXJlU3BlYyBlbmNhcHN1bGF0ZXMgdGhlIGxheW91dCByZXF1aXJlbWVudHMgcGFzc2VkIGZyb20gcGFyZW50IHRvIGNoaWxkLgogICAgICAqIEVhY2ggTWVhc3VyZVNwZWMgcmVwcmVzZW50cyBhIHJlcXVpcmVtZW50IGZvciBlaXRoZXIgdGhlIHdpZHRoIG9yIHRoZSBoZWlnaHQuCkBAIC0xMjY5Nyw2ICsxMzMxMyw3IEBACiAgICAgICAgICAgICApOwogCiAgICAgICAgICAgICBwcml2YXRlIEludmFsaWRhdGVJbmZvIG1OZXh0OworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Bvb2xlZDsKIAogICAgICAgICAgICAgVmlldyB0YXJnZXQ7CiAKQEAgLTEyNzIwLDYgKzEzMzM3LDE0IEBACiAgICAgICAgICAgICB2b2lkIHJlbGVhc2UoKSB7CiAgICAgICAgICAgICAgICAgc1Bvb2wucmVsZWFzZSh0aGlzKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQb29sZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Jc1Bvb2xlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UG9vbGVkKGJvb2xlYW4gaXNQb29sZWQpIHsKKyAgICAgICAgICAgICAgICBtSXNQb29sZWQgPSBpc1Bvb2xlZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIElXaW5kb3dTZXNzaW9uIG1TZXNzaW9uOwpAQCAtMTI3MzAsNyArMTMzNTUsNyBAQAogCiAgICAgICAgIGZpbmFsIENhbGxiYWNrcyBtUm9vdENhbGxiYWNrczsKIAotICAgICAgICBDYW52YXMgbUhhcmR3YXJlQ2FudmFzOworICAgICAgICBIYXJkd2FyZUNhbnZhcyBtSGFyZHdhcmVDYW52YXM7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSB0b3AgdmlldyBvZiB0aGUgaGllcmFyY2h5LgpAQCAtMTI5MzAsNiArMTM1NTUsMTEgQEAKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1Gb2N1c2FibGVzVGVtcExpc3QgPSBuZXcgQXJyYXlMaXN0PFZpZXc+KDI0KTsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGlkIG9mIHRoZSB3aW5kb3cgZm9yIGFjY2Vzc2liaWxpdHkgcHVycG9zZXMuCisgICAgICAgICAqLworICAgICAgICBpbnQgbUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9IFZpZXcuTk9fSUQ7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgc2V0IG9mIGF0dGFjaG1lbnQgaW5mb3JtYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICAgICAqIGV2ZW50cyBoYW5kbGVyIGFuZCB0aHJlYWQuCiAgICAgICAgICAqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdBbmNlc3Rvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3QW5jZXN0b3IuamF2YQppbmRleCBiZDMzYTZhLi5hZmJlZGFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdBbmNlc3Rvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0FuY2VzdG9yLmphdmEKQEAgLTQ2LDIyICs0NiwzMyBAQAogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5FdmVudExvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sOworaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuUG9vbGFibGVNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Qb29sczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyLkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZURlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNjcm9sbGVyOworCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LlBvbGljeU1hbmFnZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVkaWNhdGU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5CYXNlU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZENhbGxiYWNrOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kU2Vzc2lvbjsKQEAgLTcxLDYgKzgyLDcgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBUaGUgdG9wIG9mIGEgdmlldyBoaWVyYXJjaHksIGltcGxlbWVudGluZyB0aGUgbmVlZGVkIHByb3RvY29sIGJldHdlZW4gVmlldwpAQCAtODQsNyArOTYsNiBAQAogICAgICAgICBWaWV3LkF0dGFjaEluZm8uQ2FsbGJhY2tzLCBIYXJkd2FyZVJlbmRlcmVyLkhhcmR3YXJlRHJhd0NhbGxiYWNrcyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWV3QW5jZXN0b3IiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX0ZQUyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9DQUxfTE9HViA9IGZhbHNlOwogICAgIC8qKiBAbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RSQVcgPSBmYWxzZSB8fCBMT0NBTF9MT0dWOwpAQCAtOTcsNiArMTA4LDEyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUdVUkFUSU9OID0gZmFsc2UgfHwgTE9DQUxfTE9HVjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdBVENIX1BPSU5URVIgPSBmYWxzZTsKIAorICAgIC8qKgorICAgICAqIFNldCB0aGlzIHN5c3RlbSBwcm9wZXJ0eSB0byB0cnVlIHRvIGZvcmNlIHRoZSB2aWV3IGhpZXJhcmNoeSB0byByZW5kZXIKKyAgICAgKiBhdCA2MCBIei4gVGhpcyBjYW4gYmUgdXNlZCB0byBtZWFzdXJlIHRoZSBwb3RlbnRpYWwgZnJhbWVyYXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9QUk9GSUxFX1JFTkRFUklORyA9ICJ2aWV3YW5jZXN0b3IucHJvZmlsZV9yZW5kZXJpbmciOyAgICAKKyAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIE1FQVNVUkVfTEFURU5DWSA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIExhdGVuY3lUaW1lciBsdDsKIApAQCAtMTE4LDggKzEzNSwxMyBAQAogICAgIAogICAgIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8Q29tcG9uZW50Q2FsbGJhY2tzPiBzQ29uZmlnQ2FsbGJhY2tzCiAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50Q2FsbGJhY2tzPigpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBzRHJhd1RpbWU7CisKKyAgICAvKioKKyAgICAgKiBEZWxheSBiZWZvcmUgZGlzcGF0Y2hpbmcgYW4gYWNjZXNzaWJpbGl0eSBldmVudCB0aGF0IHRoZSB3aW5kb3cKKyAgICAgKiBjb250ZW50IGhhcyBjaGFuZ2VkLiBUaGUgd2luZG93IGNvbnRlbnQgaXMgY29uc2lkZXJlZCBjaGFuZ2VkCisgICAgICogYWZ0ZXIgYSBsYXlvdXQgcGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNFTkRfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRF9ERUxBWV9NSUxMSVMgPSA1MDA7CiAKICAgICBsb25nIG1MYXN0VHJhY2tiYWxsVGltZSA9IDA7CiAgICAgZmluYWwgVHJhY2tiYWxsQXhpcyBtVHJhY2tiYWxsQXhpc1ggPSBuZXcgVHJhY2tiYWxsQXhpcygpOwpAQCAtMTU2LDYgKzE3OCw4IEBACiAgICAgLy8gc28gdGhlIHdpbmRvdyBzaG91bGQgbm8gbG9uZ2VyIGJlIGFjdGl2ZS4KICAgICBib29sZWFuIG1TdG9wcGVkID0gZmFsc2U7CiAgICAgCisgICAgYm9vbGVhbiBtTGFzdEluQ29tcGF0TW9kZSA9IGZhbHNlOworCiAgICAgU3VyZmFjZUhvbGRlci5DYWxsYmFjazIgbVN1cmZhY2VIb2xkZXJDYWxsYmFjazsKICAgICBCYXNlU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlcjsKICAgICBib29sZWFuIG1Jc0NyZWF0aW5nOwpAQCAtMjAzLDYgKzIyNyw4IEBACiAgICAgYm9vbGVhbiBtQWRkZWQ7CiAgICAgYm9vbGVhbiBtQWRkZWRUb3VjaE1vZGU7CiAKKyAgICBDb21wYXRpYmlsaXR5SW5mb0hvbGRlciBtQ29tcGF0aWJpbGl0eUluZm87CisKICAgICAvKnBhY2thZ2UqLyBpbnQgbUFkZE5lc3Rpbmc7CiAKICAgICAvLyBUaGVzZSBhcmUgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4KQEAgLTIxNSw3ICsyNDEsNyBAQAogCiAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBtTGFzdENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbVBlbmRpbmdDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKLSAgICAKKwogICAgIGNsYXNzIFJlc2l6ZWRJbmZvIHsKICAgICAgICAgUmVjdCBjb3ZlcmVkSW5zZXRzOwogICAgICAgICBSZWN0IHZpc2libGVJbnNldHM7CkBAIC0yNDIsMTIgKzI2OCwyNCBAQAogICAgIHZvbGF0aWxlIE9iamVjdCBtTG9jYWxEcmFnU3RhdGU7CiAgICAgZmluYWwgUG9pbnRGIG1EcmFnUG9pbnQgPSBuZXcgUG9pbnRGKCk7CiAgICAgZmluYWwgUG9pbnRGIG1MYXN0VG91Y2hQb2ludCA9IG5ldyBQb2ludEYoKTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gbVByb2ZpbGVSZW5kZXJpbmc7ICAgIAorICAgIHByaXZhdGUgVGhyZWFkIG1SZW5kZXJQcm9maWxlcjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbVJlbmRlclByb2ZpbGluZ0VuYWJsZWQ7CiAKICAgICAvKioKICAgICAgKiBzZWUge0BsaW5rICNwbGF5U291bmRFZmZlY3QoaW50KX0KICAgICAgKi8KICAgICBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKIAorICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKKworICAgIEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIgbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRydG9sbGVyOworCisgICAgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIgbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25NYW5hZ2VyOworCisgICAgU2VuZFdpbmRvd0NvbnRlbnRDaGFuZ2VkIG1TZW5kV2luZG93Q29udGVudENoYW5nZWQ7CisKICAgICBwcml2YXRlIGZpbmFsIGludCBtRGVuc2l0eTsKIAogICAgIC8qKgpAQCAtMjg1LDcgKzMyMyw3IEBACiAgICAgICAgIC8vIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBzdGF0aWMgYmxvY2sgYmVjYXVzZSBaeWdvdGUgZG9lcyBub3QKICAgICAgICAgLy8gYWxsb3cgdGhlIHNwYXduaW5nIG9mIHRocmVhZHMuCiAgICAgICAgIGdldFdpbmRvd1Nlc3Npb24oY29udGV4dC5nZXRNYWluTG9vcGVyKCkpOwotICAgICAgICAKKwogICAgICAgICBtVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKICAgICAgICAgbUxvY2F0aW9uID0gbmV3IFdpbmRvd0xlYWtlZChudWxsKTsKICAgICAgICAgbUxvY2F0aW9uLmZpbGxJblN0YWNrVHJhY2UoKTsKQEAgLTMwMiwxMCArMzQwLDE3IEBACiAgICAgICAgIG1QcmV2aW91c1RyYW5zcGFyZW50UmVnaW9uID0gbmV3IFJlZ2lvbigpOwogICAgICAgICBtRmlyc3QgPSB0cnVlOyAvLyB0cnVlIGZvciB0aGUgZmlyc3QgdGltZSB0aGUgdmlldyBpcyBhZGRlZAogICAgICAgICBtQWRkZWQgPSBmYWxzZTsKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0gQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uTWFuYWdlciA9CisgICAgICAgICAgICBuZXcgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFkZEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uTWFuYWdlcik7CiAgICAgICAgIG1BdHRhY2hJbmZvID0gbmV3IFZpZXcuQXR0YWNoSW5mbyhzV2luZG93U2Vzc2lvbiwgbVdpbmRvdywgdGhpcywgdGhpcyk7CiAgICAgICAgIG1WaWV3Q29uZmlndXJhdGlvbiA9IFZpZXdDb25maWd1cmF0aW9uLmdldChjb250ZXh0KTsKICAgICAgICAgbURlbnNpdHkgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkuZGVuc2l0eURwaTsKICAgICAgICAgbUZhbGxiYWNrRXZlbnRIYW5kbGVyID0gUG9saWN5TWFuYWdlci5tYWtlTmV3RmFsbGJhY2tFdmVudEhhbmRsZXIoY29udGV4dCk7CisgICAgICAgIG1Qcm9maWxlUmVuZGVyaW5nID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oCisgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5nZXQoUFJPUEVSVFlfUFJPRklMRV9SRU5ERVJJTkcsICJmYWxzZSIpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmlyc3REcmF3SGFuZGxlcihSdW5uYWJsZSBjYWxsYmFjaykgewpAQCAtMzc2LDggKzQyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUhhcmR3YXJlQWNjZWxlcmF0aW9uKGF0dHJzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbVZpZXcuZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNvbXBhdGliaWxpdHlJbmZvID0gcmVzb3VyY2VzLmdldENvbXBhdGliaWxpdHlJbmZvKCk7CisgICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0aWJpbGl0eUluZm8gPSBtQ29tcGF0aWJpbGl0eUluZm8uZ2V0KCk7CiAgICAgICAgICAgICAgICAgbVRyYW5zbGF0b3IgPSBjb21wYXRpYmlsaXR5SW5mby5nZXRUcmFuc2xhdG9yKCk7CiAKICAgICAgICAgICAgICAgICBpZiAobVRyYW5zbGF0b3IgIT0gbnVsbCkgewpAQCAtMzk0LDYgKzQzOCw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAoIWNvbXBhdGliaWxpdHlJbmZvLnN1cHBvcnRzU2NyZWVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19DT01QQVRJQkxFX1dJTkRPVzsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RJbkNvbXBhdE1vZGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1Tb2Z0SW5wdXRNb2RlID0gYXR0cnMuc29mdElucHV0TW9kZTsKQEAgLTQ5MCwxMCArNTM1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIElucHV0UXVldWUucmVnaXN0ZXJJbnB1dENoYW5uZWwobUlucHV0Q2hhbm5lbCwgbUlucHV0SGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXIubXlRdWV1ZSgpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgICB2aWV3LmFzc2lnblBhcmVudCh0aGlzKTsKICAgICAgICAgICAgICAgICBtQWRkZWRUb3VjaE1vZGUgPSAocmVzJldpbmRvd01hbmFnZXJJbXBsLkFERF9GTEFHX0lOX1RPVUNIX01PREUpICE9IDA7CiAgICAgICAgICAgICAgICAgbUFwcFZpc2libGUgPSAocmVzJldpbmRvd01hbmFnZXJJbXBsLkFERF9GTEFHX0FQUF9WSVNJQkxFKSAhPSAwOworCisgICAgICAgICAgICAgICAgaWYgKG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbk1hbmFnZXIuZW5zdXJlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTc2MCwxNSArODA5LDM1IEBACiAgICAgICAgICAgICBzdXJmYWNlQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICBwYXJhbXMgPSBscDsKICAgICAgICAgfQorICAgICAgICBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRpYmlsaXR5SW5mbyA9IG1Db21wYXRpYmlsaXR5SW5mby5nZXQoKTsKKyAgICAgICAgaWYgKGNvbXBhdGliaWxpdHlJbmZvLnN1cHBvcnRzU2NyZWVuKCkgPT0gbUxhc3RJbkNvbXBhdE1vZGUpIHsKKyAgICAgICAgICAgIHBhcmFtcyA9IGxwOworICAgICAgICAgICAgZnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CisgICAgICAgICAgICBtTGF5b3V0UmVxdWVzdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtTGFzdEluQ29tcGF0TW9kZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5mbGFncyAmPSB+V2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19DT01QQVRJQkxFX1dJTkRPVzsKKyAgICAgICAgICAgICAgICBtTGFzdEluQ29tcGF0TW9kZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuZmxhZ3MgfD0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19DT01QQVRJQkxFX1dJTkRPVzsKKyAgICAgICAgICAgICAgICBtTGFzdEluQ29tcGF0TW9kZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgUmVjdCBmcmFtZSA9IG1XaW5GcmFtZTsKICAgICAgICAgaWYgKG1GaXJzdCkgewogICAgICAgICAgICAgZnVsbFJlZHJhd05lZWRlZCA9IHRydWU7CiAgICAgICAgICAgICBtTGF5b3V0UmVxdWVzdGVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgRGlzcGxheU1ldHJpY3MgcGFja2FnZU1ldHJpY3MgPQotICAgICAgICAgICAgICAgIG1WaWV3LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICAgICAgZGVzaXJlZFdpbmRvd1dpZHRoID0gcGFja2FnZU1ldHJpY3Mud2lkdGhQaXhlbHM7Ci0gICAgICAgICAgICBkZXNpcmVkV2luZG93SGVpZ2h0ID0gcGFja2FnZU1ldHJpY3MuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgaWYgKGxwLnR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMKSB7CisgICAgICAgICAgICAgICAgLy8gTk9URSAtLSBzeXN0ZW0gY29kZSwgd29uJ3QgdHJ5IHRvIGRvIGNvbXBhdCBtb2RlLgorICAgICAgICAgICAgICAgIERpc3BsYXkgZGlzcCA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dXaWR0aCA9IGRpc3AuZ2V0UmVhbFdpZHRoKCk7CisgICAgICAgICAgICAgICAgZGVzaXJlZFdpbmRvd0hlaWdodCA9IGRpc3AuZ2V0UmVhbEhlaWdodCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBwYWNrYWdlTWV0cmljcyA9CisgICAgICAgICAgICAgICAgICAgIG1WaWV3LmdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dXaWR0aCA9IHBhY2thZ2VNZXRyaWNzLndpZHRoUGl4ZWxzOworICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dIZWlnaHQgPSBwYWNrYWdlTWV0cmljcy5oZWlnaHRQaXhlbHM7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEZvciB0aGUgdmVyeSBmaXJzdCB0aW1lLCB0ZWxsIHRoZSB2aWV3IGhpZXJhcmNoeSB0aGF0IGl0CiAgICAgICAgICAgICAvLyBpcyBhdHRhY2hlZCB0byB0aGUgd2luZG93LiAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIHN1cmZhY2UKQEAgLTkxMiw5ICs5ODEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxwLmhlaWdodCA9PSBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkgewogICAgICAgICAgICAgICAgICAgICB3aW5kb3dTaXplTWF5Q2hhbmdlID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBwYWNrYWdlTWV0cmljcyA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICAgICAgICAgICAgICBkZXNpcmVkV2luZG93V2lkdGggPSBwYWNrYWdlTWV0cmljcy53aWR0aFBpeGVsczsKLSAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFdpbmRvd0hlaWdodCA9IHBhY2thZ2VNZXRyaWNzLmhlaWdodFBpeGVsczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxwLnR5cGUgPT0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFIC0tIHN5c3RlbSBjb2RlLCB3b24ndCB0cnkgdG8gZG8gY29tcGF0IG1vZGUuCisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3AgPSBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdERpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRXaW5kb3dXaWR0aCA9IGRpc3AuZ2V0UmVhbFdpZHRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkV2luZG93SGVpZ2h0ID0gZGlzcC5nZXRSZWFsSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TWV0cmljcyBwYWNrYWdlTWV0cmljcyA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFdpbmRvd1dpZHRoID0gcGFja2FnZU1ldHJpY3Mud2lkdGhQaXhlbHM7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkV2luZG93SGVpZ2h0ID0gcGFja2FnZU1ldHJpY3MuaGVpZ2h0UGl4ZWxzOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xMzYwLDYgKzE0MzYsMTAgQEAKICAgICAgICAgaWYgKHRyaWdnZXJHbG9iYWxMYXlvdXRMaXN0ZW5lcikgewogICAgICAgICAgICAgYXR0YWNoSW5mby5tUmVjb21wdXRlR2xvYmFsQXR0cmlidXRlcyA9IGZhbHNlOwogICAgICAgICAgICAgYXR0YWNoSW5mby5tVHJlZU9ic2VydmVyLmRpc3BhdGNoT25HbG9iYWxMYXlvdXQoKTsKKworICAgICAgICAgICAgaWYgKEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKGhvc3QubUNvbnRleHQpLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcG9zdFNlbmRXaW5kb3dDb250ZW50Q2hhbmdlZENhbGxiYWNrKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY29tcHV0ZXNJbnRlcm5hbEluc2V0cykgewpAQCAtMTU1OCwxMSArMTYzOCw0NSBAQAogICAgICAqLwogICAgIHZvaWQgb3V0cHV0RGlzcGxheUxpc3QoVmlldyB2aWV3KSB7CiAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsICYmIG1BdHRhY2hJbmZvLm1IYXJkd2FyZUNhbnZhcyAhPSBudWxsKSB7Ci0KLSAgICAgICAgICAgIEhhcmR3YXJlQ2FudmFzIGNhbnZhcyA9IChIYXJkd2FyZUNhbnZhcykgbUF0dGFjaEluZm8ubUhhcmR3YXJlQ2FudmFzOwogICAgICAgICAgICAgRGlzcGxheUxpc3QgZGlzcGxheUxpc3QgPSB2aWV3LmdldERpc3BsYXlMaXN0KCk7CiAgICAgICAgICAgICBpZiAoZGlzcGxheUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhbnZhcy5vdXRwdXREaXNwbGF5TGlzdChkaXNwbGF5TGlzdCk7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlQ2FudmFzLm91dHB1dERpc3BsYXlMaXN0KGRpc3BsYXlMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgI1BST1BFUlRZX1BST0ZJTEVfUkVOREVSSU5HCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2ZpbGVSZW5kZXJpbmcoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIGlmIChtUHJvZmlsZVJlbmRlcmluZykgeworICAgICAgICAgICAgbVJlbmRlclByb2ZpbGluZ0VuYWJsZWQgPSBlbmFibGVkOworICAgICAgICAgICAgaWYgKG1SZW5kZXJQcm9maWxlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVJlbmRlclByb2ZpbGVyID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTdGFydGluZyBwcm9maWxpbmcgdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobVJlbmRlclByb2ZpbGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXJ0eS5zZXQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlVHJhdmVyc2FscygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgdXNlIHZzeW5jIHdoZW4gd2UgZ2V0IGFuIEFQSQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXhpdGluZyBwcm9maWxpbmcgdGhyZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sICJSZW5kZXJpbmcgUHJvZmlsZXIiKTsKKyAgICAgICAgICAgICAgICBtUmVuZGVyUHJvZmlsZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVJlbmRlclByb2ZpbGVyLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIG1SZW5kZXJQcm9maWxlciA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTgyLDcgKzE2OTYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBzY3JvbGxUb1JlY3RPckZvY3VzKG51bGwsIGZhbHNlKTsKIAogICAgICAgICBpZiAobUF0dGFjaEluZm8ubVZpZXdTY3JvbGxDaGFuZ2VkKSB7CkBAIC0xNzczLDE0ICsxODg3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3LmRpc3BhdGNoQ29uc2lzdGVuY3lDaGVjayhWaWV3RGVidWcuQ09OU0lTVEVOQ1lfRFJBV0lORyk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19GUFMgfHwgVmlld0RlYnVnLkRFQlVHX1NIT1dfRlBTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93ID0gKGludClTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzRHJhd1RpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVNob3dGUFMoY2FudmFzLCBub3cgLSBzRHJhd1RpbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc0RyYXdUaW1lID0gbm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19QUk9GSUxFX0RSQVdJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoNjAwMDAsIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gc3RhcnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTk5MCw2ICsyMDk2LDExIEBACiAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaERldGFjaGVkRnJvbVdpbmRvdygpOwogICAgICAgICB9CiAKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25NYW5hZ2VyLmVuc3VyZU5vQ29ubmVjdGlvbigpOworICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIucmVtb3ZlQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgcmVtb3ZlU2VuZFdpbmRvd0NvbnRlbnRDaGFuZ2VkQ2FsbGJhY2soKTsKKwogICAgICAgICBtVmlldyA9IG51bGw7CiAgICAgICAgIG1BdHRhY2hJbmZvLm1Sb290VmlldyA9IG51bGw7CiAgICAgICAgIG1BdHRhY2hJbmZvLm1TdXJmYWNlID0gbnVsbDsKQEAgLTIwMDYsNyArMjExNyw2IEBACiAgICAgICAgICAgICAgICAgSW5wdXRRdWV1ZS51bnJlZ2lzdGVySW5wdXRDaGFubmVsKG1JbnB1dENoYW5uZWwpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgc1dpbmRvd1Nlc3Npb24ucmVtb3ZlKG1XaW5kb3cpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtMjAyNSw2ICsyMTM1LDEzIEBACiAgICAgICAgICAgICAgICAgIkFwcGx5aW5nIG5ldyBjb25maWcgdG8gd2luZG93ICIKICAgICAgICAgICAgICAgICArIG1XaW5kb3dBdHRyaWJ1dGVzLmdldFRpdGxlKCkKICAgICAgICAgICAgICAgICArICI6ICIgKyBjb25maWcpOworCisgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNpID0gbUNvbXBhdGliaWxpdHlJbmZvLmdldElmTmVlZGVkKCk7CisgICAgICAgIGlmIChjaSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcpOworICAgICAgICAgICAgY2kuYXBwbHlUb0NvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgfQorCiAgICAgICAgIHN5bmNocm9uaXplZCAoc0NvbmZpZ0NhbGxiYWNrcykgewogICAgICAgICAgICAgZm9yIChpbnQgaT1zQ29uZmlnQ2FsbGJhY2tzLnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKICAgICAgICAgICAgICAgICBzQ29uZmlnQ2FsbGJhY2tzLmdldChpKS5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZyk7CkBAIC0yMDg0LDYgKzIyMDEsMTEgQEAKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQQVRDSF9EUkFHX0xPQ0FUSU9OX0VWRU5UID0gMTAxNjsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBESVNQQVRDSF9TWVNURU1fVUlfVklTSUJJTElUWSA9IDEwMTc7CiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRElTUEFUQ0hfR0VORVJJQ19NT1RJT04gPSAxMDE4OworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVQREFURV9DT05GSUdVUkFUSU9OID0gMTAxOTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBET19QRVJGT1JNX0FDQ0VTU0lCSUxJVFlfQUNUSU9OID0gMTAyMDsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBET19GSU5EX0FDQ0VTU0lCTElUWV9OT0RFX0lORk9fQllfQUNDRVNTSUJJTElUWV9JRCA9IDEwMjE7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1ZJRVdfSUQgPSAxMDIyOworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9WSUVXX1RFWFQgPSAxMDIzOwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewpAQCAtMjE4MSw2ICsyMzAzLDkgQEAKICAgICAgICAgICAgIGlmIChtQWRkZWQpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1dpbmRvd0ZvY3VzID0gbXNnLmFyZzEgIT0gMDsKICAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tSGFzV2luZG93Rm9jdXMgPSBoYXNXaW5kb3dGb2N1czsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBwcm9maWxlUmVuZGVyaW5nKGhhc1dpbmRvd0ZvY3VzKTsKKwogICAgICAgICAgICAgICAgIGlmIChoYXNXaW5kb3dGb2N1cykgewogICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluVG91Y2hNb2RlID0gbXNnLmFyZzIgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgZW5zdXJlVG91Y2hNb2RlTG9jYWxseShpblRvdWNoTW9kZSk7CkBAIC0yMjg0LDkgKzI0MDksNDAgQEAKICAgICAgICAgY2FzZSBESVNQQVRDSF9TWVNURU1fVUlfVklTSUJJTElUWTogewogICAgICAgICAgICAgaGFuZGxlRGlzcGF0Y2hTeXN0ZW1VaVZpc2liaWxpdHlDaGFuZ2VkKG1zZy5hcmcxKTsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBVUERBVEVfQ09ORklHVVJBVElPTjogeworICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcgPSAoQ29uZmlndXJhdGlvbiltc2cub2JqOworICAgICAgICAgICAgaWYgKGNvbmZpZy5pc090aGVyU2VxTmV3ZXIobUxhc3RDb25maWd1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1MYXN0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnLCBmYWxzZSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX0FDQ0VTU0lCSUxJVFlfSUQ6IHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWRVaVRocmVhZChtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIERPX1BFUkZPUk1fQUNDRVNTSUJJTElUWV9BQ1RJT046IHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgICAgIC5wZXJmcm9tQWNjZXNzaWJpbGl0eUFjdGlvblVpVGhyZWFkKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRE9fRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1ZJRVdfSUQ6IHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRVaVRocmVhZChtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9WSUVXX1RFWFQ6IHsKKyAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHRVaVRocmVhZChtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0SW5wdXRFdmVudChJbnB1dFF1ZXVlLkZpbmlzaGVkQ2FsbGJhY2sgZmluaXNoZWRDYWxsYmFjaykgewogICAgICAgICBpZiAobUZpbmlzaGVkQ2FsbGJhY2sgIT0gbnVsbCkgewogICAgICAgICAgICAgU2xvZy53KFRBRywgIlJlY2VpdmVkIGEgbmV3IGlucHV0IGV2ZW50IGZyb20gdGhlIGlucHV0IHF1ZXVlIGJ1dCB0aGVyZSBpcyAiCkBAIC0zMjA2LDYgKzMzNjIsMTcgQEAKICAgICAgICAgcmV0dXJuIG1BdWRpb01hbmFnZXI7CiAgICAgfQogCisgICAgcHVibGljIEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpIHsKKyAgICAgICAgaWYgKG1WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdldEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIiCisgICAgICAgICAgICAgICAgICAgICsgIiBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBtVmlldyIpOworICAgICAgICB9CisgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJ0b2xsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRydG9sbGVyID0gbmV3IEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRydG9sbGVyOworICAgIH0KKwogICAgIHByaXZhdGUgaW50IHJlbGF5b3V0V2luZG93KFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIHBhcmFtcywgaW50IHZpZXdWaXNpYmlsaXR5LAogICAgICAgICAgICAgYm9vbGVhbiBpbnNldHNQZW5kaW5nKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKIApAQCAtMzM0Miw2ICszNTA5LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoVVBEQVRFX0NPTkZJR1VSQVRJT04sIGNvbmZpZyk7CisgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGRlc3Ryb3lIYXJkd2FyZVJlbmRlcmVyKCkgewogICAgICAgICBpZiAobUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuZGVzdHJveSh0cnVlKTsKQEAgLTM1MDMsNyArMzY3NSw3IEBACiAgICAgICogc2VuZCBhbiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50fSB0byBhbm5vdW5jZSB0aGF0LgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZW5kQWNjZXNzaWJpbGl0eUV2ZW50cygpIHsKLSAgICAgICAgaWYgKCFBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtVmlldy5nZXRDb250ZXh0KCkpLmlzRW5hYmxlZCgpKSB7CisgICAgICAgIGlmICghbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgbVZpZXcuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dfU1RBVEVfQ0hBTkdFRCk7CkBAIC0zNTEzLDYgKzM2ODUsMjkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBvc3QgYSBjYWxsYmFjayB0byBzZW5kIGEKKyAgICAgKiB7QGxpbmsgQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRH0gZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvc3RTZW5kV2luZG93Q29udGVudENoYW5nZWRDYWxsYmFjaygpIHsKKyAgICAgICAgaWYgKG1TZW5kV2luZG93Q29udGVudENoYW5nZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNlbmRXaW5kb3dDb250ZW50Q2hhbmdlZCA9IG5ldyBTZW5kV2luZG93Q29udGVudENoYW5nZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbW92ZUNhbGxiYWNrcyhtU2VuZFdpbmRvd0NvbnRlbnRDaGFuZ2VkKTsKKyAgICAgICAgfQorICAgICAgICBwb3N0RGVsYXllZChtU2VuZFdpbmRvd0NvbnRlbnRDaGFuZ2VkLCBTRU5EX1dJTkRPV19DT05URU5UX0NIQU5HRURfREVMQVlfTUlMTElTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwb3N0ZWQgY2FsbGJhY2sgdG8gc2VuZCBhCisgICAgICoge0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUR9IGV2ZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZW1vdmVTZW5kV2luZG93Q29udGVudENoYW5nZWRDYWxsYmFjaygpIHsKKyAgICAgICAgaWYgKG1TZW5kV2luZG93Q29udGVudENoYW5nZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlQ2FsbGJhY2tzKG1TZW5kV2luZG93Q29udGVudENoYW5nZWQpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gc2hvd0NvbnRleHRNZW51Rm9yQ2hpbGQoVmlldyBvcmlnaW5hbFZpZXcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTM1MzEsNyArMzcyNiw3IEBACiAgICAgICAgIGlmIChtVmlldyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY2hpbGQubUNvbnRleHQpLnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOworICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMzU5NCwxOCArMzc4OSwxOCBAQAogICAgIHN0YXRpYyBjbGFzcyBJbnB1dE1ldGhvZENhbGxiYWNrIGV4dGVuZHMgSUlucHV0TWV0aG9kQ2FsbGJhY2suU3R1YiB7CiAgICAgICAgIHByaXZhdGUgV2Vha1JlZmVyZW5jZTxWaWV3QW5jZXN0b3I+IG1WaWV3QW5jZXN0b3I7CiAKLSAgICAgICAgcHVibGljIElucHV0TWV0aG9kQ2FsbGJhY2soVmlld0FuY2VzdG9yIHZpZXdSb290KSB7Ci0gICAgICAgICAgICBtVmlld0FuY2VzdG9yID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlld0FuY2VzdG9yPih2aWV3Um9vdCk7CisgICAgICAgIHB1YmxpYyBJbnB1dE1ldGhvZENhbGxiYWNrKFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IpIHsKKyAgICAgICAgICAgIG1WaWV3QW5jZXN0b3IgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3QW5jZXN0b3I+KHZpZXdBbmNlc3Rvcik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZEV2ZW50KGludCBzZXEsIGJvb2xlYW4gaGFuZGxlZCkgewotICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdSb290ID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hGaW5pc2hlZEV2ZW50KHNlcSwgaGFuZGxlZCk7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdBbmNlc3Rvci5kaXNwYXRjaEZpbmlzaGVkRXZlbnQoc2VxLCBoYW5kbGVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGVkKElJbnB1dE1ldGhvZFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGVkKElJbnB1dE1ldGhvZFNlc3Npb24gc2Vzc2lvbikgewogICAgICAgICAgICAgLy8gU3R1YiAtLSBub3QgZm9yIHVzZSBpbiB0aGUgY2xpZW50LgogICAgICAgICB9CiAgICAgfQpAQCAtMzYxMywzNiArMzgwOCwzNyBAQAogICAgIHN0YXRpYyBjbGFzcyBXIGV4dGVuZHMgSVdpbmRvdy5TdHViIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPFZpZXdBbmNlc3Rvcj4gbVZpZXdBbmNlc3RvcjsKIAotICAgICAgICBXKFZpZXdBbmNlc3RvciB2aWV3Um9vdCkgewotICAgICAgICAgICAgbVZpZXdBbmNlc3RvciA9IG5ldyBXZWFrUmVmZXJlbmNlPFZpZXdBbmNlc3Rvcj4odmlld1Jvb3QpOworICAgICAgICBXKFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IpIHsKKyAgICAgICAgICAgIG1WaWV3QW5jZXN0b3IgPSBuZXcgV2Vha1JlZmVyZW5jZTxWaWV3QW5jZXN0b3I+KHZpZXdBbmNlc3Rvcik7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCByZXNpemVkKGludCB3LCBpbnQgaCwgUmVjdCBjb3ZlcmVkSW5zZXRzLCBSZWN0IHZpc2libGVJbnNldHMsCiAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXBvcnREcmF3LCBDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdSb290ID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3Um9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlld1Jvb3QuZGlzcGF0Y2hSZXNpemVkKHcsIGgsIGNvdmVyZWRJbnNldHMsIHZpc2libGVJbnNldHMsIHJlcG9ydERyYXcsIG5ld0NvbmZpZyk7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdBbmNlc3Rvci5kaXNwYXRjaFJlc2l6ZWQodywgaCwgY292ZXJlZEluc2V0cywgdmlzaWJsZUluc2V0cywgcmVwb3J0RHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbmZpZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEFwcFZpc2liaWxpdHkoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld1Jvb3QgPSBtVmlld0FuY2VzdG9yLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaEFwcFZpc2liaWxpdHkodmlzaWJsZSk7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdBbmNlc3Rvci5kaXNwYXRjaEFwcFZpc2liaWxpdHkodmlzaWJsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld1Jvb3QgPSBtVmlld0FuY2VzdG9yLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3Um9vdC5kaXNwYXRjaEdldE5ld1N1cmZhY2UoKTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgd2luZG93Rm9jdXNDaGFuZ2VkKGJvb2xlYW4gaGFzRm9jdXMsIGJvb2xlYW4gaW5Ub3VjaE1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LndpbmRvd0ZvY3VzQ2hhbmdlZChoYXNGb2N1cywgaW5Ub3VjaE1vZGUpOworICAgICAgICAgICAgZmluYWwgVmlld0FuY2VzdG9yIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3QW5jZXN0b3Iud2luZG93Rm9jdXNDaGFuZ2VkKGhhc0ZvY3VzLCBpblRvdWNoTW9kZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzY2MCw5ICszODU2LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgcGFyYW1ldGVycywgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3V0KSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld1Jvb3QgPSBtVmlld0FuY2VzdG9yLmdldCgpOwotICAgICAgICAgICAgaWYgKHZpZXdSb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IHZpZXcgPSB2aWV3Um9vdC5tVmlldzsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gdmlld0FuY2VzdG9yLm1WaWV3OwogICAgICAgICAgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QKSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgewpAQCAtMzY5MSw5ICszODg3LDkgQEAKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcHVibGljIHZvaWQgY2xvc2VTeXN0ZW1EaWFsb2dzKFN0cmluZyByZWFzb24pIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoQ2xvc2VTeXN0ZW1EaWFsb2dzKHJlYXNvbik7CisgICAgICAgICAgICBmaW5hbCBWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdBbmNlc3Rvci5kaXNwYXRjaENsb3NlU3lzdGVtRGlhbG9ncyhyZWFzb24pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtMzcwNiw3ICszOTAyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hXYWxscGFwZXJDb21tYW5kKFN0cmluZyBhY3Rpb24sIGludCB4LCBpbnQgeSwKICAgICAgICAgICAgICAgICBpbnQgeiwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBzeW5jKSB7CiAgICAgICAgICAgICBpZiAoc3luYykgewpAQCAtMzcxOSwxNyArMzkxNSwxNiBAQAogCiAgICAgICAgIC8qIERyYWcvZHJvcCAqLwogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaERyYWdFdmVudChEcmFnRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoRHJhZ0V2ZW50KGV2ZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFN5c3RlbVVpVmlzaWJpbGl0eUNoYW5nZWQoaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3Um9vdCA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAodmlld1Jvb3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZpZXdSb290LmRpc3BhdGNoU3lzdGVtVWlWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKKyAgICAgICAgICAgIGZpbmFsIFZpZXdBbmNlc3RvciB2aWV3QW5jZXN0b3IgPSBtVmlld0FuY2VzdG9yLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXdBbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmlld0FuY2VzdG9yLmRpc3BhdGNoU3lzdGVtVWlWaXNpYmlsaXR5Q2hhbmdlZCh2aXNpYmlsaXR5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQwMzksNSArNDIzNCw0MDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIG5hdGl2ZVNob3dGUFMoQ2FudmFzIGNhbnZhcywgaW50IGR1cmF0aW9uTWlsbGlzKTsKKyAgICAvKioKKyAgICAgKiBDbGFzcyBmb3IgbWFuYWdpbmcgdGhlIGFjY2Vzc2liaWxpdHkgaW50ZXJhY3Rpb24gY29ubmVjdGlvbgorICAgICAqIGJhc2VkIG9uIHRoZSBnbG9iYWwgYWNjZXNzaWJpbGl0eSBzdGF0ZS4KKyAgICAgKi8KKyAgICBmaW5hbCBjbGFzcyBBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uTWFuYWdlcgorICAgICAgICAgICAgaW1wbGVtZW50cyBBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnN1cmVOb0Nvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGVuc3VyZUNvbm5lY3Rpb24oKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZ2lzdGVyZWQgPSBtQXR0YWNoSW5mby5tQWNjZXNzaWJpbGl0eVdpbmRvd0lkICE9IFZpZXcuTk9fSUQ7CisgICAgICAgICAgICBpZiAoIXJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tQWNjZXNzaWJpbGl0eVdpbmRvd0lkID0KKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFkZEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24obVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihWaWV3QW5jZXN0b3IudGhpcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5zdXJlTm9Db25uZWN0aW9uKCkgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWdpc3RlcmVkID0gbUF0dGFjaEluZm8ubUFjY2Vzc2liaWxpdHlXaW5kb3dJZCAhPSBWaWV3Lk5PX0lEOworICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBtQXR0YWNoSW5mby5tQWNjZXNzaWJpbGl0eVdpbmRvd0lkID0gVmlldy5OT19JRDsKKyAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIucmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihtV2luZG93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaXMgYW4gaW50ZXJmYWNlIHRoaXMgVmlld0FuY2VzdG9yIHByb3ZpZGVzIHRvIHRoZQorICAgICAqIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSB0byB0aGUgbGF0dGVyIGNhbiBpbnRlcmFjdCB3aXRoCisgICAgICogdGhlIHZpZXcgaGllcmFyY2h5IGluIHRoaXMgVmlld0FuY2VzdG9yLgorICAgICAqLworICAgIGZpbmFsIGNsYXNzIEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24KKyAgICAgICAgICAgIGV4dGVuZHMgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24uU3R1YiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxWaWV3QW5jZXN0b3I+IG1WaWV3QW5jZXN0b3I7CisKKyAgICAgICAgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihWaWV3QW5jZXN0b3Igdmlld0FuY2VzdG9yKSB7CisgICAgICAgICAgICBtVmlld0FuY2VzdG9yID0gbmV3IFdlYWtSZWZlcmVuY2U8Vmlld0FuY2VzdG9yPih2aWV3QW5jZXN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKGludCBhY2Nlc3NpYmlsaXR5SWQsCisgICAgICAgICAgICAgICAgaW50IGludGVyYWN0aW9uSWQsIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChtVmlld0FuY2VzdG9yLmdldCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBnZXRBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db250cm9sbGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZENsaWVudFRocmVhZChhY2Nlc3NpYmlsaXR5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbklkLCBjYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihpbnQgYWNjZXNzaWJpbGl0eUlkLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkLCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobVZpZXdBbmNlc3Rvci5nZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgICAgIC5wZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkNsaWVudFRocmVhZChhY2Nlc3NpYmlsaXR5SWQsIGFjdGlvbiwgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWQoaW50IHZpZXdJZCwKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKG1WaWV3QW5jZXN0b3IuZ2V0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdldEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbnRyb2xsZXIoKQorICAgICAgICAgICAgICAgICAgICAuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkQ2xpZW50VGhyZWFkKHZpZXdJZCwgaW50ZXJhY3Rpb25JZCwgY2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0KFN0cmluZyB0ZXh0LCBpbnQgYWNjZXNzaWJpbGl0eUlkLAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkLCBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAobVZpZXdBbmNlc3Rvci5nZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0QWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlcigpCisgICAgICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHRDbGllbnRUaHJlYWQodGV4dCwgYWNjZXNzaWJpbGl0eUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uSWQsIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzIGZvciBtYW5hZ2luZyBhY2Nlc3NpYmlsaXR5IGludGVyYWN0aW9ucyBpbml0aWF0ZWQgZnJvbSB0aGUgc3lzdGVtCisgICAgICogYW5kIHRhcmdldGluZyB0aGUgdmlldyBoaWVyYXJjaHkuIEEgKkNsaWVudFRocmVhZCBtZXRob2QgaXMgdG8gYmUKKyAgICAgKiBjYWxsZWQgZnJvbSB0aGUgaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0aGlzIFZpZXdBbmNlc3RvciBnaXZlcyB0aGUKKyAgICAgKiBzeXN0ZW0gdG8gdGFsayB0byBpdCBhbmQgYSBjb3JyZXNwb25kaW5nICpVaVRocmVhZCBtZXRob2QgdGhhdCBpcyBleGVjdXRlZAorICAgICAqIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICovCisgICAgZmluYWwgY2xhc3MgQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29udHJvbGxlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT09MX1NJWkUgPSA1OworCisgICAgICAgIHByaXZhdGUgRmluZEJ5QWNjZXNzaWJpbGl0eXRJZFByZWRpY2F0ZSBtRmluZEJ5QWNjZXNzaWJpbGl0eUlkUHJlZGljYXRlID0KKyAgICAgICAgICAgIG5ldyBGaW5kQnlBY2Nlc3NpYmlsaXR5dElkUHJlZGljYXRlKCk7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBtVGVtcEFjY2Vzc2liaWxpdHlOb2RlSW5mb0xpc3QgPQorICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+KCk7CisKKyAgICAgICAgLy8gUmV1c2FibGUgcG9vbGFibGUgYXJndW1lbnRzIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSB2aWV3IGhpZXJhcmNoeQorICAgICAgICAvLyB0byBmaXQgbW9yZSBhcmd1bWVudHMgdGhhbiBNZXNzYWdlIGFuZCB0byBhdm9pZCBzaGFyaW5nIG9iamVjdHMgYmV0d2VlbgorICAgICAgICAvLyB0d28gbWVzc2FnZXMgc2luY2Ugc2V2ZXJhbCB0aHJlYWRzIGNhbiBzZW5kIG1lc3NhZ2VzIGNvbmN1cnJlbnRseS4KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQb29sPFNvbWVBcmdzPiBtUG9vbCA9IFBvb2xzLnN5bmNocm9uaXplZFBvb2woUG9vbHMuZmluaXRlUG9vbCgKKyAgICAgICAgICAgICAgICBuZXcgUG9vbGFibGVNYW5hZ2VyPFNvbWVBcmdzPigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFNvbWVBcmdzIG5ld0luc3RhbmNlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTb21lQXJncygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BY3F1aXJlZChTb21lQXJncyBpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2VkKFNvbWVBcmdzIGluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIFBPT0xfU0laRSkKKyAgICAgICAgKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgU29tZUFyZ3MgaW1wbGVtZW50cyBQb29sYWJsZTxTb21lQXJncz4geworICAgICAgICAgICAgcHJpdmF0ZSBTb21lQXJncyBtTmV4dDsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNQb29sZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgYXJnMTsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgYXJnMjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYXJnaTE7CisgICAgICAgICAgICBwdWJsaWMgaW50IGFyZ2kyOworICAgICAgICAgICAgcHVibGljIGludCBhcmdpMzsKKworICAgICAgICAgICAgcHVibGljIFNvbWVBcmdzIGdldE5leHRQb29sYWJsZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbU5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUG9vbGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtSXNQb29sZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRQb29sYWJsZShTb21lQXJncyBhcmdzKSB7CisgICAgICAgICAgICAgICAgbU5leHQgPSBhcmdzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQb29sZWQoYm9vbGVhbiBpc1Bvb2xlZCkgeworICAgICAgICAgICAgICAgIG1Jc1Bvb2xlZCA9IGlzUG9vbGVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICAgICAgYXJnMSA9IG51bGw7CisgICAgICAgICAgICAgICAgYXJnMiA9IG51bGw7CisgICAgICAgICAgICAgICAgYXJnaTEgPSAwOworICAgICAgICAgICAgICAgIGFyZ2kyID0gMDsKKyAgICAgICAgICAgICAgICBhcmdpMyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWRDbGllbnRUaHJlYWQoaW50IGFjY2Vzc2liaWxpdHlJZCwKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCA9IERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9BQ0NFU1NJQklMSVRZX0lEOworICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gYWNjZXNzaWJpbGl0eUlkOworICAgICAgICAgICAgbWVzc2FnZS5hcmcyID0gaW50ZXJhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2Uub2JqID0gY2FsbGJhY2s7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeUFjY2Vzc2liaWxpdHlJZFVpVGhyZWFkKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgZmluYWwgaW50IGFjY2Vzc2liaWxpdHlJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpbnRlcmFjdGlvbklkID0gbWVzc2FnZS5hcmcyOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgKElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2spIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbmRCeUFjY2Vzc2liaWxpdHl0SWRQcmVkaWNhdGUgcHJlZGljYXRlID0gbUZpbmRCeUFjY2Vzc2liaWxpdHlJZFByZWRpY2F0ZTsKKyAgICAgICAgICAgICAgICBwcmVkaWNhdGUuaW5pdChhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgICAgIFZpZXcgcm9vdCA9IFZpZXdBbmNlc3Rvci50aGlzLm1WaWV3OworICAgICAgICAgICAgICAgIFZpZXcgdGFyZ2V0ID0gcm9vdC5maW5kVmlld0J5UHJlZGljYXRlKHByZWRpY2F0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5pc1Nob3duKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHRhcmdldC5jcmVhdGVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnNldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQoaW5mbywgaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAtIHRoZSBvdGhlciBzaWRlIHdpbGwgdGltZSBvdXQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRDbGllbnRUaHJlYWQoaW50IHZpZXdJZCwgaW50IGludGVyYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCA9IERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9WSUVXX0lEOworICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gdmlld0lkOworICAgICAgICAgICAgbWVzc2FnZS5hcmcyID0gaW50ZXJhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2Uub2JqID0gY2FsbGJhY2s7CisgICAgICAgICAgICBzZW5kTWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZFVpVGhyZWFkKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgZmluYWwgaW50IHZpZXdJZCA9IG1lc3NhZ2UuYXJnMTsKKyAgICAgICAgICAgIGZpbmFsIGludCBpbnRlcmFjdGlvbklkID0gbWVzc2FnZS5hcmcyOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgKElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2spIG1lc3NhZ2Uub2JqOworCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFZpZXcgcm9vdCA9IFZpZXdBbmNlc3Rvci50aGlzLm1WaWV3OworICAgICAgICAgICAgICAgIFZpZXcgdGFyZ2V0ID0gcm9vdC5maW5kVmlld0J5SWQodmlld0lkKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmlzU2hvd24oKSkgeworICAgICAgICAgICAgICAgICAgICBpbmZvID0gdGFyZ2V0LmNyZWF0ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb1Jlc3VsdChpbmZvLCBpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaWdub3JlIC0gdGhlIG90aGVyIHNpZGUgd2lsbCB0aW1lIG91dCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3VGV4dENsaWVudFRocmVhZChTdHJpbmcgdGV4dCwKKyAgICAgICAgICAgICAgICBpbnQgYWNjZXNzaWJpbGl0eVZpZXdJZCwgaW50IGludGVyYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCA9IERPX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9WSUVXX1RFWFQ7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gbVBvb2wuYWNxdWlyZSgpOworICAgICAgICAgICAgYXJncy5hcmcxID0gdGV4dDsKKyAgICAgICAgICAgIGFyZ3MuYXJnaTEgPSBhY2Nlc3NpYmlsaXR5Vmlld0lkOworICAgICAgICAgICAgYXJncy5hcmdpMiA9IGludGVyYWN0aW9uSWQ7CisgICAgICAgICAgICBhcmdzLmFyZzIgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1lc3NhZ2Uub2JqID0gYXJnczsKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0VWlUaHJlYWQoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gKFNvbWVBcmdzKSBtZXNzYWdlLm9iajsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gKFN0cmluZykgYXJncy5hcmcxOworICAgICAgICAgICAgZmluYWwgaW50IGFjY2Vzc2liaWxpdHlWaWV3SWQgPSBhcmdzLmFyZ2kxOworICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBhcmdzLmFyZ2kyOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgKElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2spIGFyZ3MuYXJnMjsKKyAgICAgICAgICAgIG1Qb29sLnJlbGVhc2UoYXJncyk7CisKKyAgICAgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBpbmZvcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxWaWV3PiBmb3VuZFZpZXdzID0gbUF0dGFjaEluZm8ubUZvY3VzYWJsZXNUZW1wTGlzdDsKKyAgICAgICAgICAgICAgICBmb3VuZFZpZXdzLmNsZWFyKCk7CisKKyAgICAgICAgICAgICAgICBWaWV3IHJvb3Q7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc2liaWxpdHlWaWV3SWQgIT0gVmlldy5OT19JRCkgeworICAgICAgICAgICAgICAgICAgICByb290ID0gZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZChhY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByb290ID0gVmlld0FuY2VzdG9yLnRoaXMubVZpZXc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJvb3QgPT0gbnVsbCB8fCAhcm9vdC5pc1Nob3duKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJvb3QuZmluZFZpZXdzV2l0aFRleHQoZm91bmRWaWV3cywgdGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kVmlld3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbmZvcyA9IG1UZW1wQWNjZXNzaWJpbGl0eU5vZGVJbmZvTGlzdDsKKyAgICAgICAgICAgICAgICBpbmZvcy5jbGVhcigpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHZpZXdDb3VudCA9IGZvdW5kVmlld3Muc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmlld0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgVmlldyBmb3VuZFZpZXcgPSBmb3VuZFZpZXdzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kVmlldy5pc1Nob3duKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9zLmFkZChmb3VuZFZpZXcuY3JlYXRlQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suc2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQoaW5mb3MsIGludGVyYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgLSB0aGUgb3RoZXIgc2lkZSB3aWxsIHRpbWUgb3V0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25DbGllbnRUaHJlYWQoaW50IGFjY2Vzc2liaWxpdHlJZCwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZS5vYnRhaW4oKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uud2hhdCA9IERPX1BFUkZPUk1fQUNDRVNTSUJJTElUWV9BQ1RJT047CisgICAgICAgICAgICBTb21lQXJncyBhcmdzID0gbVBvb2wuYWNxdWlyZSgpOworICAgICAgICAgICAgYXJncy5hcmdpMSA9IGFjY2Vzc2liaWxpdHlJZDsKKyAgICAgICAgICAgIGFyZ3MuYXJnaTIgPSBhY3Rpb247CisgICAgICAgICAgICBhcmdzLmFyZ2kzID0gaW50ZXJhY3Rpb25JZDsKKyAgICAgICAgICAgIGFyZ3MuYXJnMSA9IGNhbGxiYWNrOworICAgICAgICAgICAgbWVzc2FnZS5vYmogPSBhcmdzOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwZXJmcm9tQWNjZXNzaWJpbGl0eUFjdGlvblVpVGhyZWFkKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgU29tZUFyZ3MgYXJncyA9IChTb21lQXJncykgbWVzc2FnZS5vYmo7CisgICAgICAgICAgICBmaW5hbCBpbnQgYWNjZXNzaWJpbGl0eUlkID0gYXJncy5hcmdpMTsKKyAgICAgICAgICAgIGZpbmFsIGludCBhY3Rpb24gPSBhcmdzLmFyZ2kyOworICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBhcmdzLmFyZ2kzOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgKElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2spIGFyZ3MuYXJnMTsKKyAgICAgICAgICAgIG1Qb29sLnJlbGVhc2UoYXJncyk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VlZGVkID0gZmFsc2U7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9GT0NVUzogeworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gcGVyZm9ybUFjdGlvbkZvY3VzKGFjY2Vzc2liaWxpdHlJZCk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9DTEVBUl9GT0NVUzogeworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gcGVyZm9ybUFjdGlvbkNsZWFyRm9jdXMoYWNjZXNzaWJpbGl0eUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX1NFTEVDVDogeworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VlZGVkID0gcGVyZm9ybUFjdGlvblNlbGVjdChhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xFQVJfU0VMRUNUSU9OOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWQgPSBwZXJmb3JtQWN0aW9uQ2xlYXJTZWxlY3Rpb24oYWNjZXNzaWJpbGl0eUlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnNldFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0KHN1Y2NlZWRlZCwgaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAtIHRoZSBvdGhlciBzaWRlIHdpbGwgdGltZSBvdXQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGVyZm9ybUFjdGlvbkZvY3VzKGludCBhY2Nlc3NpYmlsaXR5SWQpIHsKKyAgICAgICAgICAgIFZpZXcgdGFyZ2V0ID0gZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZChhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gR2V0IG91dCBvZiB0b3VjaCBtb2RlIHNpbmNlIGFjY2Vzc2liaWxpdHkgd2FudHMgdG8gbW92ZSBmb2N1cyBhcm91bmQuCisgICAgICAgICAgICBlbnN1cmVUb3VjaE1vZGUoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5yZXF1ZXN0Rm9jdXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwZXJmb3JtQWN0aW9uQ2xlYXJGb2N1cyhpbnQgYWNjZXNzaWJpbGl0eUlkKSB7CisgICAgICAgICAgICBWaWV3IHRhcmdldCA9IGZpbmRWaWV3QnlBY2Nlc3NpYmlsaXR5SWQoYWNjZXNzaWJpbGl0eUlkKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzRm9jdXNlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFyZ2V0LmNsZWFyRm9jdXMoKTsKKyAgICAgICAgICAgIHJldHVybiAhdGFyZ2V0LmlzRm9jdXNlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1BY3Rpb25TZWxlY3QoaW50IGFjY2Vzc2liaWxpdHlJZCkgeworICAgICAgICAgICAgVmlldyB0YXJnZXQgPSBmaW5kVmlld0J5QWNjZXNzaWJpbGl0eUlkKGFjY2Vzc2liaWxpdHlJZCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGFyZ2V0LmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldC5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXQuaXNTZWxlY3RlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1BY3Rpb25DbGVhclNlbGVjdGlvbihpbnQgYWNjZXNzaWJpbGl0eUlkKSB7CisgICAgICAgICAgICBWaWV3IHRhcmdldCA9IGZpbmRWaWV3QnlBY2Nlc3NpYmlsaXR5SWQoYWNjZXNzaWJpbGl0eUlkKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdGFyZ2V0LmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldC5zZXRTZWxlY3RlZChmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gIXRhcmdldC5pc1NlbGVjdGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFZpZXcgZmluZFZpZXdCeUFjY2Vzc2liaWxpdHlJZChpbnQgYWNjZXNzaWJpbGl0eUlkKSB7CisgICAgICAgICAgICBWaWV3IHJvb3QgPSBWaWV3QW5jZXN0b3IudGhpcy5tVmlldzsKKyAgICAgICAgICAgIGlmIChyb290ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1GaW5kQnlBY2Nlc3NpYmlsaXR5SWRQcmVkaWNhdGUuaW5pdChhY2Nlc3NpYmlsaXR5SWQpOworICAgICAgICAgICAgVmlldyBmb3VuZFZpZXcgPSByb290LmZpbmRWaWV3QnlQcmVkaWNhdGUobUZpbmRCeUFjY2Vzc2liaWxpdHlJZFByZWRpY2F0ZSk7CisgICAgICAgICAgICByZXR1cm4gKGZvdW5kVmlldyAhPSBudWxsICYmIGZvdW5kVmlldy5pc1Nob3duKCkpID8gZm91bmRWaWV3IDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRmluZEJ5QWNjZXNzaWJpbGl0eXRJZFByZWRpY2F0ZSBpbXBsZW1lbnRzIFByZWRpY2F0ZTxWaWV3PiB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG1TZXJjaGVkSWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoaW50IHNlYXJjaGVkSWQpIHsKKyAgICAgICAgICAgICAgICBtU2VyY2hlZElkID0gc2VhcmNoZWRJZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoVmlldyB2aWV3KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2aWV3LmdldEFjY2Vzc2liaWxpdHlWaWV3SWQoKSA9PSBtU2VyY2hlZElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2VuZFdpbmRvd0NvbnRlbnRDaGFuZ2VkIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAobVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1WaWV3LnNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdDb25maWd1cmF0aW9uLmphdmEKaW5kZXggMzZiYjA0Ni4uNTkxOTE1MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Q29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMTEwLDcgKzExMCwyMSBAQAogICAgICAqIGRvdWJsZS10YXAuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPVUJMRV9UQVBfVElNRU9VVCA9IDMwMDsKLSAgICAKKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIG1heGltdW0gZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gYSB0b3VjaCBwYWQKKyAgICAgKiB0b3VjaCBhbmQgcmVsZWFzZSBmb3IgYSBnaXZlbiB0b3VjaCB0byBiZSBjb25zaWRlcmVkIGEgdGFwIChjbGljaykgYXMKKyAgICAgKiBvcHBvc2VkIHRvIGEgaG92ZXIgbW92ZW1lbnQgZ2VzdHVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSE9WRVJfVEFQX1RJTUVPVVQgPSAxNTA7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGluIHBpeGVscyB0aGF0IGEgdG91Y2ggcGFkIHRvdWNoIGNhbiBtb3ZlCisgICAgICogYmVmb3JlIGJlaW5nIHJlbGVhc2VkIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGEgdGFwIChjbGljaykgYXMgb3Bwb3NlZAorICAgICAqIHRvIGEgaG92ZXIgbW92ZW1lbnQgZ2VzdHVyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSE9WRVJfVEFQX1NMT1AgPSAyMDsKKwogICAgIC8qKgogICAgICAqIERlZmluZXMgdGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB3ZSB3YW50IHRvIGRpc3BsYXkgem9vbSBjb250cm9scyBpbiByZXNwb25zZSAKICAgICAgKiB0byBhIHVzZXIgcGFubmluZyB3aXRoaW4gYW4gYXBwbGljYXRpb24uCkBAIC0zNjksNyArMzgzLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUYXBUaW1lb3V0KCkgewogICAgICAgICByZXR1cm4gVEFQX1RJTUVPVVQ7CiAgICAgfQotICAgIAorCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0aGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHdlIHdpbGwgd2FpdCB0byBzZWUgaWYgYSB0b3VjaCBldmVudAogICAgICAqIGlzIGEganVtcCB0YXAuIElmIHRoZSB1c2VyIGRvZXMgbm90IG1vdmUgd2l0aGluIHRoaXMgaW50ZXJ2YWwsIGl0IGlzCkBAIC0zODcsNyArNDAxLDI3IEBACiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RG91YmxlVGFwVGltZW91dCgpIHsKICAgICAgICAgcmV0dXJuIERPVUJMRV9UQVBfVElNRU9VVDsKICAgICB9Ci0gICAgCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGEgdG91Y2ggcGFkCisgICAgICogdG91Y2ggYW5kIHJlbGVhc2UgZm9yIGEgZ2l2ZW4gdG91Y2ggdG8gYmUgY29uc2lkZXJlZCBhIHRhcCAoY2xpY2spIGFzCisgICAgICogb3Bwb3NlZCB0byBhIGhvdmVyIG1vdmVtZW50IGdlc3R1cmUuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRIb3ZlclRhcFRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBIT1ZFUl9UQVBfVElNRU9VVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIGRpc3RhbmNlIGluIHBpeGVscyB0aGF0IGEgdG91Y2ggcGFkIHRvdWNoIGNhbiBtb3ZlCisgICAgICogYmVmb3JlIGJlaW5nIHJlbGVhc2VkIGZvciBpdCB0byBiZSBjb25zaWRlcmVkIGEgdGFwIChjbGljaykgYXMgb3Bwb3NlZAorICAgICAqIHRvIGEgaG92ZXIgbW92ZW1lbnQgZ2VzdHVyZS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEhvdmVyVGFwU2xvcCgpIHsKKyAgICAgICAgcmV0dXJuIEhPVkVSX1RBUF9TTE9QOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gSW5zZXQgaW4gcGl4ZWxzIHRvIGxvb2sgZm9yIHRvdWNoYWJsZSBjb250ZW50IHdoZW4gdGhlIHVzZXIgdG91Y2hlcyB0aGUgZWRnZSBvZiB0aGUKICAgICAgKiAgICAgICAgIHNjcmVlbgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKaW5kZXggZjUwNGI5MC4uYTZiY2U3NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7CkBAIC03NzIsNiArNzczLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaW5kVmlld3NXaXRoVGV4dChBcnJheUxpc3Q8Vmlldz4gb3V0Vmlld3MsIENoYXJTZXF1ZW5jZSB0ZXh0KSB7CisgICAgICAgIGZpbmFsIGludCBjaGlsZHJlbkNvdW50ID0gbUNoaWxkcmVuQ291bnQ7CisgICAgICAgIGZpbmFsIFZpZXdbXSBjaGlsZHJlbiA9IG1DaGlsZHJlbjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZpZXcgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIGlmICgoY2hpbGQubVZpZXdGbGFncyAmIFZJU0lCSUxJVFlfTUFTSykgPT0gVklTSUJMRSkgeworICAgICAgICAgICAgICAgIGNoaWxkLmZpbmRWaWV3c1dpdGhUZXh0KG91dFZpZXdzLCB0ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KQEAgLTIwMDcsNiArMjAyMCwxNyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eU5vZGVJbmZvKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvKSB7CisgICAgICAgIHN1cGVyLm9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhpbmZvKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gbUNoaWxkcmVuQ291bnQ7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBWaWV3IGNoaWxkID0gbUNoaWxkcmVuW2ldOworICAgICAgICAgICAgaWYgKChjaGlsZC5tVmlld0ZsYWdzICYgVklTSUJJTElUWV9NQVNLKSA9PSBWSVNJQkxFKSB7CisgICAgICAgICAgICAgICAgaW5mby5hZGRDaGlsZChjaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdQcm9wZXJ0eUFuaW1hdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdQcm9wZXJ0eUFuaW1hdG9yLmphdmEKaW5kZXggOWVkZGYyMy4uYTNkZTI4NSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3UHJvcGVydHlBbmltYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Byb3BlcnR5QW5pbWF0b3IuamF2YQpAQCAtMzQ5LDcgKzM0OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbVBlbmRpbmdBbmltYXRpb25zLmNsZWFyKCk7Ci0gICAgICAgIG1WaWV3LmdldEhhbmRsZXIoKS5yZW1vdmVDYWxsYmFja3MobUFuaW1hdGlvblN0YXJ0ZXIpOworICAgICAgICBtVmlldy5yZW1vdmVDYWxsYmFja3MobUFuaW1hdGlvblN0YXJ0ZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzA1LDcgKzcwNSw3IEBACiAKICAgICAgICAgTmFtZVZhbHVlc0hvbGRlciBuYW1lVmFsdWVQYWlyID0gbmV3IE5hbWVWYWx1ZXNIb2xkZXIoY29uc3RhbnROYW1lLCBzdGFydFZhbHVlLCBieVZhbHVlKTsKICAgICAgICAgbVBlbmRpbmdBbmltYXRpb25zLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbVZpZXcuZ2V0SGFuZGxlcigpLnJlbW92ZUNhbGxiYWNrcyhtQW5pbWF0aW9uU3RhcnRlcik7CisgICAgICAgIG1WaWV3LnJlbW92ZUNhbGxiYWNrcyhtQW5pbWF0aW9uU3RhcnRlcik7CiAgICAgICAgIG1WaWV3LnBvc3QobUFuaW1hdGlvblN0YXJ0ZXIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKaW5kZXggNTIzNmE5ZS4uZTA3MDg1YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgYW5kcm9pZC52aWV3OwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQXBwbGljYXRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db21wYXRpYmlsaXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CkBAIC0yNSw2ICsyNiw3IEBACiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiAKIC8qKgpAQCAtNDYzLDExICs0NjUsMTYgQEAKICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSBuZXcgTG9jYWxXaW5kb3dNYW5hZ2VyKHdtLCBoYXJkd2FyZUFjY2VsZXJhdGVkKTsKICAgICB9CiAKKyAgICBzdGF0aWMgQ29tcGF0aWJpbGl0eUluZm9Ib2xkZXIgZ2V0Q29tcGF0SW5mbyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgQXBwbGljYXRpb24gYXBwID0gKEFwcGxpY2F0aW9uKWNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCk7CisgICAgICAgIHJldHVybiBhcHAgIT0gbnVsbCA/IGFwcC5tTG9hZGVkQXBrLm1Db21wYXRpYmlsaXR5SW5mbyA6IG5ldyBDb21wYXRpYmlsaXR5SW5mb0hvbGRlcigpOworICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgTG9jYWxXaW5kb3dNYW5hZ2VyIGV4dGVuZHMgV2luZG93TWFuYWdlckltcGwuQ29tcGF0TW9kZVdyYXBwZXIgewogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUhhcmR3YXJlQWNjZWxlcmF0ZWQ7CiAKICAgICAgICAgTG9jYWxXaW5kb3dNYW5hZ2VyKFdpbmRvd01hbmFnZXIgd20sIGJvb2xlYW4gaGFyZHdhcmVBY2NlbGVyYXRlZCkgewotICAgICAgICAgICAgc3VwZXIod20sIG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldENvbXBhdGliaWxpdHlJbmZvKCkpOworICAgICAgICAgICAgc3VwZXIod20sIGdldENvbXBhdEluZm8obUNvbnRleHQpKTsKICAgICAgICAgICAgIG1IYXJkd2FyZUFjY2VsZXJhdGVkID0gaGFyZHdhcmVBY2NlbGVyYXRlZDsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCmluZGV4IGExZGRkMDguLmQxYWQxMTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlci5qYXZhCkBAIC03Nyw4ICs3Nyw4IEBACiAgICAgICAgICAgICBpbXBsZW1lbnRzIFBhcmNlbGFibGUgewogICAgICAgICAvKioKICAgICAgICAgICogWCBwb3NpdGlvbiBmb3IgdGhpcyB3aW5kb3cuICBXaXRoIHRoZSBkZWZhdWx0IGdyYXZpdHkgaXQgaXMgaWdub3JlZC4KLSAgICAgICAgICogV2hlbiB1c2luZyB7QGxpbmsgR3Jhdml0eSNMRUZUfSBvciB7QGxpbmsgR3Jhdml0eSNCRUZPUkV9IG9yIHtAbGluayBHcmF2aXR5I1JJR0hUfSBvcgotICAgICAgICAgKiB7QGxpbmsgR3Jhdml0eSNBRlRFUn0gaXQgcHJvdmlkZXMgYW4gb2Zmc2V0IGZyb20gdGhlIGdpdmVuIGVkZ2UuCisgICAgICAgICAqIFdoZW4gdXNpbmcge0BsaW5rIEdyYXZpdHkjTEVGVH0gb3Ige0BsaW5rIEdyYXZpdHkjU1RBUlR9IG9yIHtAbGluayBHcmF2aXR5I1JJR0hUfSBvcgorICAgICAgICAgKiB7QGxpbmsgR3Jhdml0eSNFTkR9IGl0IHByb3ZpZGVzIGFuIG9mZnNldCBmcm9tIHRoZSBnaXZlbiBlZGdlLgogICAgICAgICAgKi8KICAgICAgICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5CiAgICAgICAgIHB1YmxpYyBpbnQgeDsKQEAgLTY4NSw3ICs2ODUsMTkgQEAKIAogICAgICAgICAvLyAtLS0tLSBISURERU4gRkxBR1MuCiAgICAgICAgIC8vIFRoZXNlIHN0YXJ0IGF0IHRoZSBoaWdoIGJpdCBhbmQgZ28gZG93bi4KLSAgICAgICAgCisKKyAgICAgICAgLyoqIFdpbmRvdyBmbGFnOiBFbmFibGUgdG91Y2hlcyB0byBzbGlkZSBvdXQgb2YgYSB3aW5kb3cgaW50byBuZWlnaGJvcmluZworICAgICAgICAgKiB3aW5kb3dzIGluIG1pZC1nZXN0dXJlIGluc3RlYWQgb2YgYmVpbmcgY2FwdHVyZWQgZm9yIHRoZSBkdXJhdGlvbiBvZgorICAgICAgICAgKiB0aGUgZ2VzdHVyZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBmbGFnIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIHRvdWNoIGZvY3VzIGZvciB0aGlzIHdpbmRvdyBvbmx5LgorICAgICAgICAgKiBUb3VjaGVzIGNhbiBzbGlkZSBvdXQgb2YgdGhlIHdpbmRvdyBidXQgdGhleSBjYW5ub3QgbmVjZXNzYXJpbHkgc2xpZGUKKyAgICAgICAgICogYmFjayBpbiAodW5sZXNzIHRoZSBvdGhlciB3aW5kb3cgd2l0aCB0b3VjaCBmb2N1cyBwZXJtaXRzIGl0KS4KKyAgICAgICAgICoKKyAgICAgICAgICoge0BoaWRlfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TTElQUEVSWSA9IDB4MDQwMDAwMDA7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEZsYWcgZm9yIGEgd2luZG93IGJlbG9uZ2luZyB0byBhbiBhY3Rpdml0eSB0aGF0IHJlc3BvbmRzIHRvIHtAbGluayBLZXlFdmVudCNLRVlDT0RFX01FTlV9CiAgICAgICAgICAqIGFuZCB0aGVyZWZvcmUgbmVlZHMgYSBNZW51IGtleS4gRm9yIGRldmljZXMgd2hlcmUgTWVudSBpcyBhIHBoeXNpY2FsIGJ1dHRvbiB0aGlzIGZsYWcgaXMKQEAgLTk5Miw2ICsxMDA0LDIzIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTeXN0ZW1VaUxpc3RlbmVyczsKIAorICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiB0aGlzIHdpbmRvdyBoYXMgZm9jdXMsIGRpc2FibGUgdG91Y2ggcGFkIHBvaW50ZXIgZ2VzdHVyZSBwcm9jZXNzaW5nLgorICAgICAgICAgKiBUaGUgd2luZG93IHdpbGwgcmVjZWl2ZSByYXcgcG9zaXRpb24gdXBkYXRlcyBmcm9tIHRoZSB0b3VjaCBwYWQgaW5zdGVhZAorICAgICAgICAgKiBvZiBwb2ludGVyIG1vdmVtZW50cyBhbmQgc3ludGhldGljIHRvdWNoIGV2ZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUX0ZFQVRVUkVfRElTQUJMRV9QT0lOVEVSX0dFU1RVUkVTID0gMHgwMDAwMDAwMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udHJvbCBzcGVjaWFsIGZlYXR1cmVzIG9mIHRoZSBpbnB1dCBzdWJzeXN0ZW0uCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI0lOUFVUX0ZFQVRVUkVfRElTQUJMRV9UT1VDSF9QQURfR0VTVFVSRVMKKyAgICAgICAgICogQGhpZGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgaW5wdXRGZWF0dXJlczsKKwogICAgICAgICBwdWJsaWMgTGF5b3V0UGFyYW1zKCkgewogICAgICAgICAgICAgc3VwZXIoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CiAgICAgICAgICAgICB0eXBlID0gVFlQRV9BUFBMSUNBVElPTjsKQEAgLTEwNzQsNiArMTEwMyw3IEBACiAgICAgICAgICAgICBvdXQud3JpdGVJbnQoc3lzdGVtVWlWaXNpYmlsaXR5KTsKICAgICAgICAgICAgIG91dC53cml0ZUludChzdWJ0cmVlU3lzdGVtVWlWaXNpYmlsaXR5KTsKICAgICAgICAgICAgIG91dC53cml0ZUludChoYXNTeXN0ZW1VaUxpc3RlbmVycyA/IDEgOiAwKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChpbnB1dEZlYXR1cmVzKTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8TGF5b3V0UGFyYW1zPiBDUkVBVE9SCkBAIC0xMTEyLDYgKzExNDIsNyBAQAogICAgICAgICAgICAgc3lzdGVtVWlWaXNpYmlsaXR5ID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgc3VidHJlZVN5c3RlbVVpVmlzaWJpbGl0eSA9IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGhhc1N5c3RlbVVpTGlzdGVuZXJzID0gaW4ucmVhZEludCgpICE9IDA7CisgICAgICAgICAgICBpbnB1dEZlYXR1cmVzID0gaW4ucmVhZEludCgpOwogICAgICAgICB9CiAgICAgCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiUG9pbnRsZXNzQml0d2lzZUV4cHJlc3Npb24ifSkKQEAgLTExMzMsNiArMTE2NCw4IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNZU1RFTV9VSV9WSVNJQklMSVRZX0NIQU5HRUQgPSAxPDwxMzsKICAgICAgICAgLyoqIHtAaGlkZX0gKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1lTVEVNX1VJX0xJU1RFTkVSX0NIQU5HRUQgPSAxPDwxNDsKKyAgICAgICAgLyoqIHtAaGlkZX0gKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5QVVRfRkVBVFVSRVNfQ0hBTkdFRCA9IDE8PDE1OwogICAgIAogICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIgdG8gYmFja3VwL3Jlc3RvcmUgcGFyYW1ldGVycyB1bmRlciBjb21wYXRpYmlsaXR5IG1vZGUuCiAgICAgICAgIHByaXZhdGUgaW50W10gbUNvbXBhdGliaWxpdHlQYXJhbXNCYWNrdXAgPSBudWxsOwpAQCAtMTI0NCw2ICsxMjc3LDExIEBACiAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBTWVNURU1fVUlfTElTVEVORVJfQ0hBTkdFRDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKGlucHV0RmVhdHVyZXMgIT0gby5pbnB1dEZlYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgaW5wdXRGZWF0dXJlcyA9IG8uaW5wdXRGZWF0dXJlczsKKyAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IElOUFVUX0ZFQVRVUkVTX0NIQU5HRUQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwogICAgICAgICB9CiAgICAgCkBAIC0xMzI4LDYgKzEzNjYsNyBAQAogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHN5c3VpbD0iKTsKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaGFzU3lzdGVtVWlMaXN0ZW5lcnMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgaWY9MHgiKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhpbnB1dEZlYXR1cmVzKSk7CiAgICAgICAgICAgICBzYi5hcHBlbmQoJ30nKTsKICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJJbXBsLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJJbXBsLmphdmEKaW5kZXggZDE4YWUwZS4uNTRlN2MwNCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dNYW5hZ2VySW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlckltcGwuamF2YQpAQCAtMTksMTAgKzE5LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQW5kcm9pZFJ1bnRpbWVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogCkBAIC04NywyOSArODksMzIgQEAKICAgICAgICAgICAgID0gbmV3IEhhc2hNYXA8Q29tcGF0aWJpbGl0eUluZm8sIFdpbmRvd01hbmFnZXI+KCk7CiAKICAgICBzdGF0aWMgY2xhc3MgQ29tcGF0TW9kZVdyYXBwZXIgaW1wbGVtZW50cyBXaW5kb3dNYW5hZ2VyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXaW5kb3dNYW5hZ2VyIG1XaW5kb3dNYW5hZ2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIFdpbmRvd01hbmFnZXJJbXBsIG1XaW5kb3dNYW5hZ2VyOwogICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXkgbURlZmF1bHREaXNwbGF5OworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBhdGliaWxpdHlJbmZvSG9sZGVyIG1Db21wYXRpYmlsaXR5SW5mbzsKIAotICAgICAgICBDb21wYXRNb2RlV3JhcHBlcihXaW5kb3dNYW5hZ2VyIHdtLCBDb21wYXRpYmlsaXR5SW5mbyBjaSkgewotICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIgPSB3bTsKKyAgICAgICAgQ29tcGF0TW9kZVdyYXBwZXIoV2luZG93TWFuYWdlciB3bSwgQ29tcGF0aWJpbGl0eUluZm9Ib2xkZXIgY2kpIHsKKyAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyID0gd20gaW5zdGFuY2VvZiBDb21wYXRNb2RlV3JhcHBlcgorICAgICAgICAgICAgICAgICAgICA/ICgoQ29tcGF0TW9kZVdyYXBwZXIpd20pLm1XaW5kb3dNYW5hZ2VyIDogKFdpbmRvd01hbmFnZXJJbXBsKXdtOwogCiAgICAgICAgICAgICAvLyBVc2UgdGhlIG9yaWdpbmFsIGRpc3BsYXkgaWYgdGhlcmUgaXMgbm8gY29tcGF0aWJpbGl0eSBtb2RlCiAgICAgICAgICAgICAvLyB0byBhcHBseSwgb3IgdGhlIHVuZGVybHlpbmcgd2luZG93IG1hbmFnZXIgaXMgYWxyZWFkeSBhCiAgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5IG1vZGUgd3JhcHBlci4gIChXZSBhc3N1bWUgdGhhdCBpZiBpdCBpcyBhCiAgICAgICAgICAgICAvLyB3cmFwcGVyLCBpdCBpcyBhcHBseWluZyB0aGUgc2FtZSBjb21wYXRpYmlsaXR5IG1vZGUuKQotICAgICAgICAgICAgaWYgKGNpID09IG51bGwgfHwgd20gaW5zdGFuY2VvZiBDb21wYXRNb2RlV3JhcHBlcgotICAgICAgICAgICAgICAgICAgICB8fCAoIWNpLmlzU2NhbGluZ1JlcXVpcmVkKCkgJiYgY2kuc3VwcG9ydHNTY3JlZW4oKSkpIHsKKyAgICAgICAgICAgIGlmIChjaSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbURlZmF1bHREaXNwbGF5ID0gbVdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy9tRGVmYXVsdERpc3BsYXkgPSBtV2luZG93TWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpOwogICAgICAgICAgICAgICAgIG1EZWZhdWx0RGlzcGxheSA9IERpc3BsYXkuY3JlYXRlQ29tcGF0aWJsZURpc3BsYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldERpc3BsYXlJZCgpLCBjaSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Db21wYXRpYmlsaXR5SW5mbyA9IGNpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFZpZXcoVmlldyB2aWV3LCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKLSAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmFkZFZpZXcodmlldywgcGFyYW1zKTsKKyAgICAgICAgICAgIG1XaW5kb3dNYW5hZ2VyLmFkZFZpZXcodmlldywgcGFyYW1zLCBtQ29tcGF0aWJpbGl0eUluZm8pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xNDUsOCArMTUwLDkgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFdpbmRvd01hbmFnZXIgZ2V0RGVmYXVsdChDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRJbmZvKSB7Ci0gICAgICAgIGlmIChjb21wYXRJbmZvID09IG51bGwgfHwgKCFjb21wYXRJbmZvLmlzU2NhbGluZ1JlcXVpcmVkKCkKLSAgICAgICAgICAgICAgICAmJiBjb21wYXRJbmZvLnN1cHBvcnRzU2NyZWVuKCkpKSB7CisgICAgICAgIENvbXBhdGliaWxpdHlJbmZvSG9sZGVyIGNpaCA9IG5ldyBDb21wYXRpYmlsaXR5SW5mb0hvbGRlcigpOworICAgICAgICBjaWguc2V0KGNvbXBhdEluZm8pOworICAgICAgICBpZiAoY2loLmdldElmTmVlZGVkKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHNXaW5kb3dNYW5hZ2VyOwogICAgICAgICB9CiAKQEAgLTE1OCwzNSArMTY0LDM2IEBACiAgICAgICAgICAgICAvLyBoYXZpbmcgdG8gbWFrZSB3cmFwcGVycy4KICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIgd20gPSBzQ29tcGF0V2luZG93TWFuYWdlcnMuZ2V0KGNvbXBhdEluZm8pOwogICAgICAgICAgICAgaWYgKHdtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3bSA9IG5ldyBDb21wYXRNb2RlV3JhcHBlcihzV2luZG93TWFuYWdlciwgY29tcGF0SW5mbyk7CisgICAgICAgICAgICAgICAgd20gPSBuZXcgQ29tcGF0TW9kZVdyYXBwZXIoc1dpbmRvd01hbmFnZXIsIGNpaCk7CiAgICAgICAgICAgICAgICAgc0NvbXBhdFdpbmRvd01hbmFnZXJzLnB1dChjb21wYXRJbmZvLCB3bSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gd207CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFdpbmRvd01hbmFnZXIgZ2V0RGVmYXVsdChDb21wYXRpYmlsaXR5SW5mb0hvbGRlciBjb21wYXRJbmZvKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcGF0TW9kZVdyYXBwZXIoc1dpbmRvd01hbmFnZXIsIGNvbXBhdEluZm8pOworICAgIH0KICAgICAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0hhcmR3YXJlQWNjZWxlcmF0ZWQoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcpCi0gICAgeworICAgIHB1YmxpYyB2b2lkIGFkZFZpZXcoVmlldyB2aWV3KSB7CiAgICAgICAgIGFkZFZpZXcodmlldywgbmV3IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zKAogICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9BUFBMSUNBVElPTiwgMCwgUGl4ZWxGb3JtYXQuT1BBUVVFKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zKQotICAgIHsKLSAgICAgICAgYWRkVmlldyh2aWV3LCBwYXJhbXMsIGZhbHNlKTsKKyAgICBwdWJsaWMgdm9pZCBhZGRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMpIHsKKyAgICAgICAgYWRkVmlldyh2aWV3LCBwYXJhbXMsIG51bGwsIGZhbHNlKTsKICAgICB9CiAgICAgCi0gICAgcHVibGljIHZvaWQgYWRkVmlld05lc3RpbmcoVmlldyB2aWV3LCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykKLSAgICB7Ci0gICAgICAgIGFkZFZpZXcodmlldywgcGFyYW1zLCBmYWxzZSk7CisgICAgcHVibGljIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zLCBDb21wYXRpYmlsaXR5SW5mb0hvbGRlciBjaWgpIHsKKyAgICAgICAgYWRkVmlldyh2aWV3LCBwYXJhbXMsIGNpaCwgZmFsc2UpOwogICAgIH0KICAgICAKLSAgICBwcml2YXRlIHZvaWQgYWRkVmlldyhWaWV3IHZpZXcsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zLCBib29sZWFuIG5lc3QpCi0gICAgeworICAgIHByaXZhdGUgdm9pZCBhZGRWaWV3KFZpZXcgdmlldywgVmlld0dyb3VwLkxheW91dFBhcmFtcyBwYXJhbXMsCisgICAgICAgICAgICBDb21wYXRpYmlsaXR5SW5mb0hvbGRlciBjaWgsIGJvb2xlYW4gbmVzdCkgewogICAgICAgICBpZiAoZmFsc2UpIExvZy52KCJXaW5kb3dNYW5hZ2VyIiwgImFkZFZpZXcgdmlldz0iICsgdmlldyk7CiAKICAgICAgICAgaWYgKCEocGFyYW1zIGluc3RhbmNlb2YgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMpKSB7CkBAIC0yMzYsNiArMjQzLDExIEBACiAgICAgICAgICAgICAKICAgICAgICAgICAgIHJvb3QgPSBuZXcgVmlld0FuY2VzdG9yKHZpZXcuZ2V0Q29udGV4dCgpKTsKICAgICAgICAgICAgIHJvb3QubUFkZE5lc3RpbmcgPSAxOworICAgICAgICAgICAgaWYgKGNpaCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9vdC5tQ29tcGF0aWJpbGl0eUluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm9Ib2xkZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm9vdC5tQ29tcGF0aWJpbGl0eUluZm8gPSBjaWg7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZpZXcuc2V0TGF5b3V0UGFyYW1zKHdwYXJhbXMpOwogICAgICAgICAgICAgCkBAIC0zMjUsOSArMzM3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gdmlldzsKICAgICAgICAgfQogCi0gICAgICAgIElucHV0TWV0aG9kTWFuYWdlciBpbW0gPSBJbnB1dE1ldGhvZE1hbmFnZXIuZ2V0SW5zdGFuY2Uodmlldy5nZXRDb250ZXh0KCkpOwotICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKLSAgICAgICAgICAgIGltbS53aW5kb3dEaXNtaXNzZWQobVZpZXdzW2luZGV4XS5nZXRXaW5kb3dUb2tlbigpKTsKKyAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5nZXRJbnN0YW5jZSh2aWV3LmdldENvbnRleHQoKSk7CisgICAgICAgICAgICBpZiAoaW1tICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbW0ud2luZG93RGlzbWlzc2VkKG1WaWV3c1tpbmRleF0uZ2V0V2luZG93VG9rZW4oKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcm9vdC5kaWUoZmFsc2UpOwogICAgICAgICBmaW5pc2hSZW1vdmVWaWV3TG9ja2VkKHZpZXcsIGluZGV4KTsKQEAgLTM1MSw5ICszNjUsMTEgQEAKICAgICAgICAgcmVtb3ZlSXRlbSh0bXBQYXJhbXMsIG1QYXJhbXMsIGluZGV4KTsKICAgICAgICAgbVBhcmFtcyA9IHRtcFBhcmFtczsKIAotICAgICAgICB2aWV3LmFzc2lnblBhcmVudChudWxsKTsKLSAgICAgICAgLy8gZnVuYyBkb2Vzbid0IGFsbG93IG51bGwuLi4gIGRvZXMgaXQgbWF0dGVyIGlmIHdlIGNsZWFyIHRoZW0/Ci0gICAgICAgIC8vdmlldy5zZXRMYXlvdXRQYXJhbXMobnVsbCk7CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZpZXcuYXNzaWduUGFyZW50KG51bGwpOworICAgICAgICAgICAgLy8gZnVuYyBkb2Vzbid0IGFsbG93IG51bGwuLi4gIGRvZXMgaXQgbWF0dGVyIGlmIHdlIGNsZWFyIHRoZW0/CisgICAgICAgICAgICAvL3ZpZXcuc2V0TGF5b3V0UGFyYW1zKG51bGwpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoSUJpbmRlciB0b2tlbiwgU3RyaW5nIHdobywgU3RyaW5nIHdoYXQpIHsKQEAgLTQwMSw2ICs0MTcsMTcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICBwdWJsaWMgdm9pZCByZXBvcnROZXdDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaW50IGNvdW50ID0gbVZpZXdzLmxlbmd0aDsKKyAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFZpZXdBbmNlc3RvciByb290ID0gbVJvb3RzW2ldOworICAgICAgICAgICAgICAgIHJvb3QucmVxdWVzdFVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBnZXRSb290Vmlld0xheW91dFBhcmFtZXRlcihWaWV3IHZpZXcpIHsKICAgICAgICAgVmlld1BhcmVudCB2cCA9IHZpZXcuZ2V0UGFyZW50KCk7CiAgICAgICAgIHdoaWxlICh2cCAhPSBudWxsICYmICEodnAgaW5zdGFuY2VvZiBWaWV3QW5jZXN0b3IpKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd01hbmFnZXJQb2xpY3kuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlclBvbGljeS5qYXZhCmluZGV4IDY0YjFhYzguLjhhMzBjN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlclBvbGljeS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93TWFuYWdlclBvbGljeS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQudmlldzsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CkBAIC00NjYsNiArNDY3LDEyIEBACiAgICAgcHVibGljIGludCBnZXRNYXhXYWxscGFwZXJMYXllcigpOwogICAgIAogICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwb2xpY3kgYWxsb3dzIHRoZSBzdGF0dXMgYmFyIHRvIGhpZGUuICBPdGhlcndpc2UsCisgICAgICogaXQgaXMgYSB0YWJsZXQtc3R5bGUgc3lzdGVtIGJhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdGF0dXNCYXJIaWRlKCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGRpc3BsYXkgd2lkdGggYXZhaWxhYmxlIGFmdGVyIGV4Y2x1ZGluZyBhbnkgc2NyZWVuCiAgICAgICogZGVjb3JhdGlvbnMgdGhhdCBjYW4gbmV2ZXIgYmUgcmVtb3ZlZC4gIFRoYXQgaXMsIHN5c3RlbSBiYXIgb3IKICAgICAgKiBidXR0b24gYmFyLgpAQCAtNTMzLDcgKzU0MCw3IEBACiAgICAgICogQHNlZSAjcmVtb3ZlU3RhcnRpbmdXaW5kb3cKICAgICAgKi8KICAgICBwdWJsaWMgVmlldyBhZGRTdGFydGluZ1dpbmRvdyhJQmluZGVyIGFwcFRva2VuLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgdGhlbWUsIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwKKyAgICAgICAgICAgIGludCB0aGVtZSwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbywgQ2hhclNlcXVlbmNlIG5vbkxvY2FsaXplZExhYmVsLAogICAgICAgICAgICAgaW50IGxhYmVsUmVzLCBpbnQgaWNvbiwgaW50IHdpbmRvd0ZsYWdzKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3dPcmllbnRhdGlvbkxpc3RlbmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd09yaWVudGF0aW9uTGlzdGVuZXIuamF2YQppbmRleCBkMTI4YjU3Li41ZDRmYmJlIDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd09yaWVudGF0aW9uTGlzdGVuZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvd09yaWVudGF0aW9uTGlzdGVuZXIuamF2YQpAQCAtMzIxLDE4ICszMjEsMTggQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgT1JJRU5UQVRJT05fQU5HTEVfQ09ORklERU5DRV9TQ0FMRSA9CiAgICAgICAgICAgICAgICAgY29uZmlkZW5jZVNjYWxlRnJvbURlbHRhKDMwKTsKIAotICAgICAgICAvLyBUcmFuc2l0aW9uIHRha2VzIDJ4IGxvbmdlciB3aGVuIHRpbHQgaXMgNDUgZGVncmVlcyBmcm9tIHZlcnRpY2FsLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBUSUxUX0FOR0xFX0NPTkZJREVOQ0VfU0NBTEUgPSBjb25maWRlbmNlU2NhbGVGcm9tRGVsdGEoNDUpOworICAgICAgICAvLyBUcmFuc2l0aW9uIHRha2VzIDJ4IGxvbmdlciB3aGVuIHRpbHQgaXMgNjAgZGVncmVlcyBmcm9tIHZlcnRpY2FsLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBUSUxUX0FOR0xFX0NPTkZJREVOQ0VfU0NBTEUgPSBjb25maWRlbmNlU2NhbGVGcm9tRGVsdGEoNjApOwogCi0gICAgICAgIC8vIFRyYW5zaXRpb24gdGFrZXMgMnggbG9uZ2VyIHdoZW4gYWNjZWxlcmF0aW9uIGlzIDAuMjUgR3MuCisgICAgICAgIC8vIFRyYW5zaXRpb24gdGFrZXMgMnggbG9uZ2VyIHdoZW4gYWNjZWxlcmF0aW9uIGlzIDAuNSBHcy4KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUFHTklUVURFX0NPTkZJREVOQ0VfU0NBTEUgPSBjb25maWRlbmNlU2NhbGVGcm9tRGVsdGEoCi0gICAgICAgICAgICAgICAgU2Vuc29yTWFuYWdlci5TVEFOREFSRF9HUkFWSVRZICogMC4yNWYpOworICAgICAgICAgICAgICAgIFNlbnNvck1hbmFnZXIuU1RBTkRBUkRfR1JBVklUWSAqIDAuNWYpOwogCiAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciB3aGljaCBhIG5ldyBvcmllbnRhdGlvbiBtdXN0IGJlIHN0YWJsZSBiZWZvcmUKICAgICAgICAgLy8gd2UgcGVyZm9ybSBhbiBvcmllbnRhdGlvbiBjaGFuZ2UgdW5kZXIgaWRlYWwgY29uZGl0aW9ucy4gIEl0IHdpbGwgdGFrZQogICAgICAgICAvLyBwcm9wb3J0aW9uYWxseSBsb25nZXIgdGhhbiB0aGlzIHRvIGVmZmVjdCBhbiBvcmllbnRhdGlvbiBjaGFuZ2Ugd2hlbgogICAgICAgICAvLyB0aGUgcHJvcG9zZWQgb3JpZW50YXRpb24gY29uZmlkZW5jZSBpcyBsb3cuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE9SSUVOVEFUSU9OX1NFVFRMRV9USU1FX01TID0gMjUwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBPUklFTlRBVElPTl9TRVRUTEVfVElNRV9NUyA9IDEwMDsKIAogICAgICAgICAvLyBUaGUgY29uZmlkZW5jZSB0aGF0IHdlIGhhdmUgYWJvdW50IGVmZmVjdGluZyBlYWNoIG9yaWVudGF0aW9uIGNoYW5nZS4KICAgICAgICAgLy8gV2hlbiBvbmUgb2YgdGhlc2UgdmFsdWVzIGV4Y2VlZHMgMS4wLCB3ZSBoYXZlIGRldGVybWluZWQgb3VyIG5ldyBvcmllbnRhdGlvbiEKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5RXZlbnQuamF2YQppbmRleCA1ZTE4ZjU1Li41ZWY3NzYzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlFdmVudC5qYXZhCkBAIC0xNiwxMSArMTYsMTMgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFjY2Vzc2liaWxpdHkgZXZlbnRzIHRoYXQgYXJlIHNlbnQgYnkgdGhlIHN5c3RlbSB3aGVuCkBAIC0xMjcsNyArMTI5LDcgQEAKICAqIDxwPgogICogPGI+VFJBTlNJVElPTiBUWVBFUzwvYj4gPGJyPgogICogPHA+Ci0gKiA8Yj5XaW5kb3cgc3RhdGUgY2hhbmdlZDwvYj4gLSByZXByZXNlbnRzIHRoZSBldmVudCBvZiBvcGVuaW5nL2Nsb3NpbmcgYQorICogPGI+V2luZG93IHN0YXRlIGNoYW5nZWQ8L2I+IC0gcmVwcmVzZW50cyB0aGUgZXZlbnQgb2Ygb3BlbmluZyBhCiAgKiB7QGxpbmsgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3d9LCB7QGxpbmsgYW5kcm9pZC52aWV3Lk1lbnV9LAogICoge0BsaW5rIGFuZHJvaWQuYXBwLkRpYWxvZ30sIGV0Yy4gPGJyPgogICogVHlwZToge0BsaW5rICNUWVBFX1dJTkRPV19TVEFURV9DSEFOR0VEfSA8YnI+CkBAIC0xMzcsNiArMTM5LDE2IEBACiAgKiB7QGxpbmsgI2dldEV2ZW50VGltZSgpfSwKICAqIHtAbGluayAjZ2V0VGV4dCgpfQogICogPHA+CisgKiA8Yj5XaW5kb3cgY29udGVudCBjaGFuZ2VkPC9iPiAtIHJlcHJlc2VudHMgdGhlIGV2ZW50IG9mIGNoYW5nZSBpbiB0aGUKKyAqIGNvbnRlbnQgb2YgYSB3aW5kb3cuIFRoaXMgY2hhbmdlIGNhbiBiZSBhZGRpbmcvcmVtb3ZpbmcgdmlldywgY2hhbmdpbmcKKyAqIGEgdmlldyBzaXplLCBldGMuPGJyPgorICogVHlwZToge0BsaW5rICNUWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUR9IDxicj4KKyAqIFByb3BlcnRpZXM6CisgKiB7QGxpbmsgI2dldENsYXNzTmFtZSgpfSwKKyAqIHtAbGluayAjZ2V0UGFja2FnZU5hbWUoKX0sCisgKiB7QGxpbmsgI2dldEV2ZW50VGltZSgpfSwKKyAqIHtAbGluayAjZ2V0VGV4dCgpfQorICogPHA+CiAgKiA8Yj5OT1RJRklDQVRJT04gVFlQRVM8L2I+IDxicj4KICAqIDxwPgogICogPGI+Tm90aWZpY2F0aW9uIHN0YXRlIGNoYW5nZWQ8L2I+IC0gcmVwcmVzZW50cyB0aGUgZXZlbnQgc2hvd2luZy9oaWRpbmcKQEAgLTE1OSw2ICsxNzEsNyBAQAogICogQHNlZSBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBBY2Nlc3NpYmlsaXR5RXZlbnQgZXh0ZW5kcyBBY2Nlc3NpYmlsaXR5UmVjb3JkIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogSW52YWxpZCBzZWxlY3Rpb24vZm9jdXMgcG9zaXRpb24uCkBAIC0yNDAsNiArMjUzLDExIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9UT1VDSF9FWFBMT1JBVElPTl9HRVNUVVJFX0VORCA9IDB4MDAwMDA0MDA7CiAKICAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRoZSBldmVudCBvZiBjaGFuZ2luZyB0aGUgY29udGVudCBvZiBhIHdpbmRvdy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQgPSAweDAwMDAwODAwOworCisgICAgLyoqCiAgICAgICogTWFzayBmb3Ige0BsaW5rIEFjY2Vzc2liaWxpdHlFdmVudH0gYWxsIHR5cGVzLgogICAgICAqCiAgICAgICogQHNlZSAjVFlQRV9WSUVXX0NMSUNLRUQKQEAgLTI1Niw3ICsyNzQsNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzUG9vbExvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50IHNQb29sOwogICAgIHByaXZhdGUgc3RhdGljIGludCBzUG9vbFNpemU7Ci0KICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlFdmVudCBtTmV4dDsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5Qb29sOwogCkBAIC0yNzAsNyArMjg3LDU0IEBACiAgICAgICogSGlkZSBjb25zdHJ1Y3RvciBmcm9tIGNsaWVudHMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5RXZlbnQoKSB7CisgICAgfQogCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhbiBldmVudCBmcm9tIGFub3RoZXIgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBpbml0aWFsaXplIGZyb20uCisgICAgICovCisgICAgdm9pZCBpbml0KEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCkgeworICAgICAgICBzdXBlci5pbml0KGV2ZW50KTsKKyAgICAgICAgbUV2ZW50VHlwZSA9IGV2ZW50Lm1FdmVudFR5cGU7CisgICAgICAgIG1FdmVudFRpbWUgPSBldmVudC5tRXZlbnRUaW1lOworICAgICAgICBtUGFja2FnZU5hbWUgPSBldmVudC5tUGFja2FnZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24oSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIHN1cGVyLnNldENvbm5lY3Rpb24oY29ubmVjdGlvbik7CisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVJlY29yZD4gcmVjb3JkcyA9IG1SZWNvcmRzOworICAgICAgICBmaW5hbCBpbnQgcmVjb3JkQ291bnQgPSByZWNvcmRzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWNvcmRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5UmVjb3JkIHJlY29yZCA9IHJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgcmVjb3JkLnNldENvbm5lY3Rpb24oY29ubmVjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGlmIHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlYWxlZCBXaGV0aGVyIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2VhbGVkKGJvb2xlYW4gc2VhbGVkKSB7CisgICAgICAgIHN1cGVyLnNldFNlYWxlZChzZWFsZWQpOworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlSZWNvcmQ+IHJlY29yZHMgPSBtUmVjb3JkczsKKyAgICAgICAgZmluYWwgaW50IHJlY29yZENvdW50ID0gcmVjb3Jkcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3JkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmQgPSByZWNvcmRzLmdldChpKTsKKyAgICAgICAgICAgIHJlY29yZC5zZXRTZWFsZWQoc2VhbGVkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjg2LDggKzM1MCwxMSBAQAogICAgICAqIEFwcGVuZHMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlSZWNvcmR9IHRvIHRoZSBlbmQgb2YgZXZlbnQgcmVjb3Jkcy4KICAgICAgKgogICAgICAqIEBwYXJhbSByZWNvcmQgVGhlIHJlY29yZCB0byBhcHBlbmQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhcHBlbmRSZWNvcmQoQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtUmVjb3Jkcy5hZGQocmVjb3JkKTsKICAgICB9CiAKQEAgLTMxNCw4ICszODEsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBldmVudCB0eXBlLgogICAgICAqCiAgICAgICogQHBhcmFtIGV2ZW50VHlwZSBUaGUgZXZlbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50VHlwZShpbnQgZXZlbnRUeXBlKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKICAgICB9CiAKQEAgLTMzMiw4ICs0MDIsMTEgQEAKICAgICAgKiBTZXRzIHRoZSB0aW1lIGluIHdoaWNoIHRoaXMgZXZlbnQgd2FzIHNlbnQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZXZlbnRUaW1lIFRoZSBldmVudCB0aW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RXZlbnRUaW1lKGxvbmcgZXZlbnRUaW1lKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUV2ZW50VGltZSA9IGV2ZW50VGltZTsKICAgICB9CiAKQEAgLTM1MCw4ICs0MjMsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIHNvdXJjZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgcGFja2FnZSBuYW1lLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFja2FnZU5hbWUoQ2hhclNlcXVlbmNlIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7CiAgICAgfQogCkBAIC0zNzAsNiArNDQ2LDI3IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgY2FjaGVkIGluc3RhbmNlIGlmIHN1Y2ggaXMgYXZhaWxhYmxlIG9yIGEgbmV3IG9uZSBpcworICAgICAqIGluc3RhbnRpYXRlZCB3aXRoIHR5cGUgcHJvcGVydHkgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IFRoZSBvdGhlciBldmVudC4KKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXNzaWJpbGl0eUV2ZW50IG9idGFpbihBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50Q2xvbmUgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIGV2ZW50Q2xvbmUuaW5pdChldmVudCk7CisKKyAgICAgICAgZmluYWwgaW50IHJlY29yZENvdW50ID0gZXZlbnQubVJlY29yZHMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlSZWNvcmQgcmVjb3JkID0gZXZlbnQubVJlY29yZHMuZ2V0KGkpOworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmRDbG9uZSA9IEFjY2Vzc2liaWxpdHlSZWNvcmQub2J0YWluKHJlY29yZCk7CisgICAgICAgICAgICBldmVudENsb25lLm1SZWNvcmRzLmFkZChyZWNvcmRDbG9uZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXZlbnRDbG9uZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY2FjaGVkIGluc3RhbmNlIGlmIHN1Y2ggaXMgYXZhaWxhYmxlIG9yIGEgbmV3IG9uZSBpcwogICAgICAqIGluc3RhbnRpYXRlZC4KICAgICAgKgogICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2UuCkBAIC00MTMsNiArNTEwLDggQEAKIAogICAgIC8qKgogICAgICAqIENsZWFycyB0aGUgc3RhdGUgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7CkBAIC00MzIsNiArNTMxLDExIEBACiAgICAgICogQHBhcmFtIHBhcmNlbCBBIHBhcmNlbCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGluaXRGcm9tUGFyY2VsKFBhcmNlbCBwYXJjZWwpIHsKKyAgICAgICAgaWYgKHBhcmNlbC5yZWFkSW50KCkgPT0gMSkgeworICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgIHBhcmNlbC5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHNldFNlYWxlZChwYXJjZWwucmVhZEludCgpID09IDEpOwogICAgICAgICBtRXZlbnRUeXBlID0gcGFyY2VsLnJlYWRJbnQoKTsKICAgICAgICAgbVBhY2thZ2VOYW1lID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIG1FdmVudFRpbWUgPSBwYXJjZWwucmVhZExvbmcoKTsKQEAgLTQ0Miw2ICs1NDYsOCBAQAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZENvdW50OyBpKyspIHsKICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlSZWNvcmQgcmVjb3JkID0gQWNjZXNzaWJpbGl0eVJlY29yZC5vYnRhaW4oKTsKICAgICAgICAgICAgIHJlYWRBY2Nlc3NpYmlsaXR5UmVjb3JkRnJvbVBhcmNlbChyZWNvcmQsIHBhcmNlbCk7CisgICAgICAgICAgICAvLyBEbyB0aGlzIHRvIHdyaXRlIHRoZSBjb25uZWN0aW9uIG9ubHkgb25jZS4KKyAgICAgICAgICAgIHJlY29yZC5zZXRDb25uZWN0aW9uKG1Db25uZWN0aW9uKTsKICAgICAgICAgICAgIG1SZWNvcmRzLmFkZChyZWNvcmQpOwogICAgICAgICB9CiAgICAgfQpAQCAtNDY1LDEyICs1NzEsMjIgQEAKICAgICAgICAgcmVjb3JkLm1CZWZvcmVUZXh0ID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIHJlY29yZC5tUGFyY2VsYWJsZURhdGEgPSBwYXJjZWwucmVhZFBhcmNlbGFibGUobnVsbCk7CiAgICAgICAgIHBhcmNlbC5yZWFkTGlzdChyZWNvcmQubVRleHQsIG51bGwpOworICAgICAgICByZWNvcmQubVNvdXJjZVdpbmRvd0lkID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgcmVjb3JkLm1Tb3VyY2VWaWV3SWQgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICByZWNvcmQubVNlYWxlZCA9IChwYXJjZWwucmVhZEludCgpID09IDEpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBwYXJjZWwsIGludCBmbGFncykgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDEpOworICAgICAgICAgICAgcGFyY2VsLndyaXRlU3Ryb25nQmluZGVyKG1Db25uZWN0aW9uLmFzQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHBhcmNlbC53cml0ZUludChpc1NlYWxlZCgpID8gMSA6IDApOwogICAgICAgICBwYXJjZWwud3JpdGVJbnQobUV2ZW50VHlwZSk7CiAgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1QYWNrYWdlTmFtZSwgcGFyY2VsLCAwKTsKICAgICAgICAgcGFyY2VsLndyaXRlTG9uZyhtRXZlbnRUaW1lKTsKQEAgLTUwNCw2ICs2MjAsOSBAQAogICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChyZWNvcmQubUJlZm9yZVRleHQsIHBhcmNlbCwgZmxhZ3MpOwogICAgICAgICBwYXJjZWwud3JpdGVQYXJjZWxhYmxlKHJlY29yZC5tUGFyY2VsYWJsZURhdGEsIGZsYWdzKTsKICAgICAgICAgcGFyY2VsLndyaXRlTGlzdChyZWNvcmQubVRleHQpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQocmVjb3JkLm1Tb3VyY2VXaW5kb3dJZCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChyZWNvcmQubVNvdXJjZVZpZXdJZCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChyZWNvcmQubVNlYWxlZCA/IDEgOiAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUxNiwyNSArNjM1LDgxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgRXZlbnRUeXBlOiAiICsgbUV2ZW50VHlwZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IEV2ZW50VGltZTogIiArIG1FdmVudFRpbWUpOwotICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBQYWNrYWdlTmFtZTogIiArIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgXG57XG4iKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgRXZlbnRUeXBlOiAiKS5hcHBlbmQoZXZlbnRUeXBlVG9TdHJpbmcobUV2ZW50VHlwZSkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBFdmVudFRpbWU6ICIpLmFwcGVuZChtRXZlbnRUaW1lKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgUGFja2FnZU5hbWU6ICIpLmFwcGVuZChtUGFja2FnZU5hbWUpOwogICAgICAgICBidWlsZGVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVJlY29yZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlSZWNvcmQgcmVjb3JkID0gbVJlY29yZHMuZ2V0KGkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAgUmVjb3JkICIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoaSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocmVjb3JkLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgc291cmNlV2luZG93SWQ6ICIpLmFwcGVuZChtU291cmNlV2luZG93SWQpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgc291cmNlVmlld0lkOiAiKS5hcHBlbmQobVNvdXJjZVZpZXdJZCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1SZWNvcmRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmQgPSBtUmVjb3Jkcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiAgUmVjb3JkICIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI6Iik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbIENsYXNzTmFtZTogIiArIHJlY29yZC5tQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBUZXh0OiAiICsgcmVjb3JkLm1UZXh0KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBDb250ZW50RGVzY3JpcHRpb246ICIgKyByZWNvcmQubUNvbnRlbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgSXRlbUNvdW50OiAiICsgcmVjb3JkLm1JdGVtQ291bnQpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IEN1cnJlbnRJdGVtSW5kZXg6ICIgKyByZWNvcmQubUN1cnJlbnRJdGVtSW5kZXgpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IElzRW5hYmxlZDogIiArIHJlY29yZC5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgSXNQYXNzd29yZDogIiArIHJlY29yZC5pc1Bhc3N3b3JkKCkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IElzQ2hlY2tlZDogIiArIHJlY29yZC5pc0NoZWNrZWQoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgSXNGdWxsU2NyZWVuOiAiICsgcmVjb3JkLmlzRnVsbFNjcmVlbigpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBCZWZvcmVUZXh0OiAiICsgcmVjb3JkLm1CZWZvcmVUZXh0KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBGcm9tSW5kZXg6ICIgKyByZWNvcmQubUZyb21JbmRleCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgQWRkZWRDb3VudDogIiArIHJlY29yZC5tQWRkZWRDb3VudCk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgUmVtb3ZlZENvdW50OiAiICsgcmVjb3JkLm1SZW1vdmVkQ291bnQpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IFBhcmNlbGFibGVEYXRhOiAiICsgcmVjb3JkLm1QYXJjZWxhYmxlRGF0YSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBdIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyByZWNvcmRDb3VudDogIikuYXBwZW5kKGdldEFkZGVkQ291bnQoKSk7CiAgICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIn1cbiIpOwogICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBldmVudCB0eXBlLiBGb3IgZXhhbXBsZSwKKyAgICAgKiB7QGxpbmsgI1RZUEVfVklFV19DTElDS0VEfSBpcyByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIFRZUEVfVklFV19DTElDS0VELgorICAgICAqCisgICAgICogQHBhcmFtIGZlZWRiYWNrVHlwZSBUaGUgZXZlbnQgdHlwZQorICAgICAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBldmVudFR5cGVUb1N0cmluZyhpbnQgZmVlZGJhY2tUeXBlKSB7CisgICAgICAgIHN3aXRjaCAoZmVlZGJhY2tUeXBlKSB7CisgICAgICAgICAgICBjYXNlIFRZUEVfVklFV19DTElDS0VEOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9WSUVXX0NMSUNLRUQiOworICAgICAgICAgICAgY2FzZSBUWVBFX1ZJRVdfTE9OR19DTElDS0VEOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9WSUVXX0xPTkdfQ0xJQ0tFRCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfVklFV19TRUxFQ1RFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRZUEVfVklFV19TRUxFQ1RFRCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfVklFV19GT0NVU0VEOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9WSUVXX0ZPQ1VTRUQiOworICAgICAgICAgICAgY2FzZSBUWVBFX1ZJRVdfVEVYVF9DSEFOR0VEOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9WSUVXX1RFWFRfQ0hBTkdFRCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1dJTkRPV19TVEFURV9DSEFOR0VEIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9WSUVXX0hPVkVSX0VOVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9WSUVXX0hPVkVSX0VOVEVSIjsKKyAgICAgICAgICAgIGNhc2UgVFlQRV9WSUVXX0hPVkVSX0VYSVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1ZJRVdfSE9WRVJfRVhJVCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfTk9USUZJQ0FUSU9OX1NUQVRFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEIjsgIAorICAgICAgICAgICAgY2FzZSBUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfU1RBUlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfU1RBUlQiOworICAgICAgICAgICAgY2FzZSBUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfRU5EOgorICAgICAgICAgICAgICAgIHJldHVybiAiVFlQRV9UT1VDSF9FWFBMT1JBVElPTl9HRVNUVVJFX0VORCI7CisgICAgICAgICAgICBjYXNlIFRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHNlZSBQYXJjZWxhYmxlLkNyZWF0b3IKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxBY2Nlc3NpYmlsaXR5RXZlbnQ+IENSRUFUT1IgPQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQppbmRleCBkZDc3MTkzLi5lZWNlNjRhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXIuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogCiBwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5OwogCi1pbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CkBAIC0yOSw5ICsyOCwxMyBAQAogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CiAKIC8qKgogICogU3lzdGVtIGxldmVsIHNlcnZpY2UgdGhhdCBzZXJ2ZXMgYXMgYW4gZXZlbnQgZGlzcGF0Y2ggZm9yIHtAbGluayBBY2Nlc3NpYmlsaXR5RXZlbnR9cy4KQEAgLTYyLDYgKzY1LDIxIEBACiAKICAgICBib29sZWFuIG1Jc0VuYWJsZWQ7CiAKKyAgICBmaW5hbCBDb3B5T25Xcml0ZUFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbUFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVycyA9CisgICAgICAgIG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcj4oKTsKKworICAgIC8qKgorICAgICAqIExpc3RlbmVyIGZvciB0aGUgYWNjZXNzaWJpbGl0eSBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBiYWNrIG9uIGNoYW5nZSBpbiB0aGUgYWNjZXNzaWJpbGl0eSBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVuYWJsZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpOworICAgIH0KKwogICAgIGZpbmFsIElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudC5TdHViIG1DbGllbnQgPSBuZXcgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50LlN0dWIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CiAgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKERPX1NFVF9FTkFCTEVELCBlbmFibGVkID8gMSA6IDAsIDApLnNlbmRUb1RhcmdldCgpOwpAQCAtNzgsOSArOTYsOCBAQAogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKICAgICAgICAgICAgICAgICBjYXNlIERPX1NFVF9FTkFCTEVEIDoKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtSGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlzRW5hYmxlZCA9IChtZXNzYWdlLmFyZzEgPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0VuYWJsZWQgPSAobWVzc2FnZS5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBzZXRBY2Nlc3NpYmlsaXR5U3RhdGUoaXNFbmFibGVkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiVW5rbm93biBtZXNzYWdlIHR5cGU6ICIgKyBtZXNzYWdlLndoYXQpOwpAQCAtMTE3LDcgKzEzNCw4IEBACiAgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbUlzRW5hYmxlZCA9IG1TZXJ2aWNlLmFkZENsaWVudChtQ2xpZW50KTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFbmFibGVkID0gbVNlcnZpY2UuYWRkQ2xpZW50KG1DbGllbnQpOworICAgICAgICAgICAgc2V0QWNjZXNzaWJpbGl0eVN0YXRlKGlzRW5hYmxlZCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSBpcyBkZWFkIiwgcmUpOwogICAgICAgICB9CkBAIC0yMDEsMTEgKzIxOSwzMCBAQAogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBTZXJ2aWNlSW5mb31zIG9mIHRoZSBpbnN0YWxsZWQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcy4KICAgICAgKgogICAgICAqIEByZXR1cm4gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgd2l0aCB7QGxpbmsgU2VydmljZUluZm99cy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpfQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIExpc3Q8U2VydmljZUluZm8+IGdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHsKLSAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gc2VydmljZXMgPSBudWxsOworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gaW5mb3MgPSBnZXRJbnN0YWxsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKTsKKyAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gc2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VJbmZvPigpOworICAgICAgICBmaW5hbCBpbnQgaW5mb0NvdW50ID0gaW5mb3Muc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZm9Db3VudDsgaSsrKSB7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IGluZm9zLmdldChpKTsKKyAgICAgICAgICAgIHNlcnZpY2VzLmFkZChpbmZvLmdldFJlc29sdmVJbmZvKCkuc2VydmljZUluZm8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHNlcnZpY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfXMgb2YgdGhlIGluc3RhbGxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzLgorICAgICAqCisgICAgICogQHJldHVybiBBbiB1bm1vZGlmaWFibGUgbGlzdCB3aXRoIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHsKKyAgICAgICAgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IHNlcnZpY2VzID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlcnZpY2VzID0gbVNlcnZpY2UuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisgICAgICAgICAgICBzZXJ2aWNlcyA9IG1TZXJ2aWNlLmdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOwogICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgIkluc3RhbGxlZCBBY2Nlc3NpYmlsaXR5U2VydmljZXMgIiArIHNlcnZpY2VzKTsKICAgICAgICAgICAgIH0KQEAgLTIxNiwyMCArMjUzLDE0IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIFNlcnZpY2VJbmZvfXMgb2YgdGhlIGVuYWJsZWQgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlcworICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99cyBvZiB0aGUgZW5hYmxlZCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzCiAgICAgICogZm9yIGEgZ2l2ZW4gZmVlZGJhY2sgdHlwZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBmZWVkYmFja1R5cGUgVGhlIHR5cGUgb2YgZmVlZGJhY2suCi0gICAgICogQHJldHVybiBBbiB1bm1vZGlmaWFibGUgbGlzdCB3aXRoIHtAbGluayBTZXJ2aWNlSW5mb31zLgotICAgICAqCi0gICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfQVVESUJMRQotICAgICAqIEBzZWUgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX0hBUFRJQwotICAgICAqIEBzZWUgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX1NQT0tFTgotICAgICAqIEBzZWUgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX1ZJU1VBTAotICAgICAqIEBzZWUgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX0dFTkVSSUMKKyAgICAgKiBAcGFyYW0gZmVlZGJhY2tUeXBlIFRoZSBmZWVkYmFjayB0eXBlIChjYW4gYmUgYml0d2lzZSBvciBvZiBtdWx0aXBsZSB0eXBlcykuCisgICAgICogQHJldHVybiBBbiB1bm1vZGlmaWFibGUgbGlzdCB3aXRoIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm99cy4KICAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdChpbnQgZmVlZGJhY2tUeXBlKSB7Ci0gICAgICAgIExpc3Q8U2VydmljZUluZm8+IHNlcnZpY2VzID0gbnVsbDsKKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEVuYWJsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoaW50IGZlZWRiYWNrVHlwZSkgeworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gc2VydmljZXMgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc2VydmljZXMgPSBtU2VydmljZS5nZXRFbmFibGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KGZlZWRiYWNrVHlwZSk7CiAgICAgICAgICAgICBpZiAoREVCVUcpIHsKQEAgLTI0MCw0ICsyNzEsODEgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChzZXJ2aWNlcyk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGFuIHtAbGluayBBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIGxpc3RlbmVyLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcigKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYW4ge0BsaW5rIEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIuCisgICAgICogQHJldHVybiBUcnVlIGlmIHN1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXIoCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVuYWJsZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXNFbmFibGVkIFRoZSBhY2Nlc3NpYmlsaXR5IHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRBY2Nlc3NpYmlsaXR5U3RhdGUoYm9vbGVhbiBpc0VuYWJsZWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSGFuZGxlcikgeworICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCAhPSBtSXNFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgbUlzRW5hYmxlZCA9IGlzRW5hYmxlZDsKKyAgICAgICAgICAgICAgICBub3RpZnlBY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUgcmVnaXN0ZXJlZCB7QGxpbmsgQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJ9cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlZCgpIHsKKyAgICAgICAgZmluYWwgaW50IGxpc3RlbmVyQ291bnQgPSBtQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5U3RhdGVDaGFuZ2VMaXN0ZW5lcnMuZ2V0KGkpLm9uQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlZChtSXNFbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gYWNjZXNzaWJpbGl0eSBpbnRlcmFjdGlvbiBjb25uZWN0aW9uIGludGVyZmFjZSBmb3IgYSBnaXZlbiB3aW5kb3cuCisgICAgICogQHBhcmFtIHdpbmRvd1Rva2VuIFRoZSB3aW5kb3cgdG9rZW4gdG8gd2hpY2ggYSBjb25uZWN0aW9uIGlzIGFkZGVkLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGFkZEFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24oSVdpbmRvdyB3aW5kb3dUb2tlbiwKKyAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5hZGRBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uKHdpbmRvd1Rva2VuLCBjb25uZWN0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiRXJyb3Igd2hpbGUgYWRkaW5nIGFuIGFjY2Vzc2liaWxpdHkgaW50ZXJhY3Rpb24gY29ubmVjdGlvbi4gIiwgcmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWaWV3Lk5PX0lEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZWQgYW4gYWNjZXNzaWJpbGl0eSBpbnRlcmFjdGlvbiBjb25uZWN0aW9uIGludGVyZmFjZSBmb3IgYSBnaXZlbiB3aW5kb3cuCisgICAgICogQHBhcmFtIHdpbmRvd1Rva2VuIFRoZSB3aW5kb3cgdG9rZW4gdG8gd2hpY2ggYSBjb25uZWN0aW9uIGlzIHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24oSVdpbmRvdyB3aW5kb3dUb2tlbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVNlcnZpY2UucmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbih3aW5kb3dUb2tlbik7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJlbW92aW5nIGFuIGFjY2Vzc2liaWxpdHkgaW50ZXJhY3Rpb24gY29ubmVjdGlvbi4gIiwgcmUpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mby5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTc1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVJbmZvLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5OworCitwYXJjZWxhYmxlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGVmMzhhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mby5qYXZhCkBAIC0wLDAgKzEsMTA1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHk7CisKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLklBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBvZiB0aGUgc2NyZWVuIGNvbnRlbnQuIEZyb20gdGhlIHBvaW50IG9mCisgKiB2aWV3IG9mIGFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSB0aGUgc2NyZWVuIGNvbnRlbnQgaXMgcHJlc2VudGVkIGFzIHRyZWUKKyAqIG9mIGFjY2Vzc2liaWxpdHkgbm9kZXMuCisgKgorICogVE9ETyhzdmVydG9zbGF2Z2Fub3YpOiBVcGRhdGUgdGhlIGRvY3VtZW50YXRpb24sIGFkZCBzYW1wbGUsIGFuZCBkZXNjcmliZQorICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2VjdXJpdHkgcG9saWN5LgorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICAvLyBBY3Rpb25zLgorCisgICAgLyoqCisgICAgICogQWN0aW9uIHRoYXQgZm9jdXNlcyB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fRk9DVVMgPSAgMHgwMDAwMDAwMTsKKworICAgIC8qKgorICAgICAqIEFjdGlvbiB0aGF0IHVuZm9jdXNlcyB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fQ0xFQVJfRk9DVVMgPSAgMHgwMDAwMDAwMjsKKworICAgIC8qKgorICAgICAqIEFjdGlvbiB0aGF0IHNlbGVjdHMgdGhlIG5vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1NFTEVDVCA9ICAweDAwMDAwMDA0OworCisgICAgLyoqCisgICAgICogQWN0aW9uIHRoYXQgdW5zZWxlY3RzIHRoZSBub2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9DTEVBUl9TRUxFQ1RJT04gPSAgMHgwMDAwMDAwODsKKworICAgIC8vIEJvb2xlYW4gYXR0cmlidXRlcy4KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9DSEVDS0FCTEUgPSAweDAwMDAwMDAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NIRUNLRUQgPSAweDAwMDAwMDAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZPQ1VTQUJMRSA9IDB4MDAwMDAwMDQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfRk9DVVNFRCA9IDB4MDAwMDAwMDg7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfU0VMRUNURUQgPSAweDAwMDAwMDEwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0NMSUNLQUJMRSA9IDB4MDAwMDAwMjA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVFlfTE9OR19DTElDS0FCTEUgPSAweDAwMDAwMDQwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0VOQUJMRUQgPSAweDAwMDAwMDgwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX1BBU1NXT1JEID0gMHgwMDAwMDEwMDsKKworICAgIC8vIFJlYWRhYmxlIHJlcHJlc2VudGF0aW9ucyAtIGxhemlseSBpbml0aWFsaXplZC4KKyAgICBwcml2YXRlIHN0YXRpYyBTcGFyc2VBcnJheTxTdHJpbmc+IHNBY3Rpb25TeW1ib2xpY05hbWVzOworCisgICAgLy8gSG91c2VrZWVwaW5nLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFID0gNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNQb29sTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gc1Bvb2w7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNQb29sU2l6ZTsKKyAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBtTmV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzSW5Qb29sOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2VhbGVkOworCisgICAgLy8gRGF0YS4KKyAgICBwcml2YXRlIGludCBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IFZpZXcuTk9fSUQ7CisgICAgcHJpdmF0ZSBpbnQgbUFjY2Vzc2liaWxpdHlXaW5kb3dJZCA9IFZpZXcuTk9fSUQ7CisgICAgcHJpdmF0ZSBpbnQgbVBhcmVudEFjY2Vzc2liaWxpdHlWaWV3SWQgPSBWaWV3Lk5PX0lEOworICAgIHByaXZhdGUgaW50IG1Cb29sZWFuUHJvcGVydGllczsKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbUJvdW5kc0luUGFyZW50ID0gbmV3IFJlY3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIFJlY3QgbUJvdW5kc0luU2NyZWVuID0gbmV3IFJlY3QoKTsKKworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1QYWNrYWdlTmFtZTsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtQ2xhc3NOYW1lOworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1UZXh0OworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIG1Db250ZW50RGVzY3JpcHRpb247CisKKyAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUludEFycmF5IG1DaGlsZEFjY2Vzc2liaWxpdHlJZHMgPSBuZXcgU3BhcnNlSW50QXJyYXkoKTsKKyAgICBwcml2YXRlIGludCBtQWN0aW9uczsKKworICAgIHByaXZhdGUgSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbiBtQ29ubmVjdGlvbjsKKworICAgIC8qKgorICAgICAqIEhpZGUgY29uc3RydWN0b3IgZnJvbSBjbGllbnRzLgorICAgICAqLworICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCkgeworICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBUaGUgaW5mbyBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlKFZpZXcgc291cmNlKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbUFjY2Vzc2liaWxpdHlWaWV3SWQgPSBzb3VyY2UuZ2V0QWNjZXNzaWJpbGl0eVZpZXdJZCgpOworICAgICAgICBtQWNjZXNzaWJpbGl0eVdpbmRvd0lkID0gc291cmNlLmdldEFjY2Vzc2liaWxpdHlXaW5kb3dJZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGlkIG9mIHRoZSB3aW5kb3cgZnJvbSB3aGljaCB0aGUgaW5mbyBjb21lcyBmcm9tLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgd2luZG93IGlkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0V2luZG93SWQoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzaWJpbGl0eVdpbmRvd0lkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIGNvdW50LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG1DaGlsZEFjY2Vzc2liaWxpdHlJZHMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hpbGQgYXQgZ2l2ZW4gaW5kZXguCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvIGJ5CisgICAgICogICAgIGNhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNyZWN5Y2xlKCl9IHRvIGF2b2lkIGNyZWF0aW5nCisgICAgICogICAgIG9mIG11bHRpcGxlIGluc3RhbmNlcy4KKyAgICAgKiAgIDwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGNoaWxkIGluZGV4LgorICAgICAqIEByZXR1cm4gVGhlIGNoaWxkIG5vZGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgb3V0c2lkZSBvZiBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0Q2hpbGQoaW50IGluZGV4KSB7CisgICAgICAgIGVuZm9yY2VTZWFsZWQoKTsKKyAgICAgICAgZmluYWwgaW50IGNoaWxkQWNjZXNzaWJpbGl0eVZpZXdJZCA9IG1DaGlsZEFjY2Vzc2liaWxpdHlJZHMuZ2V0KGluZGV4KTsKKyAgICAgICAgaWYgKCFjYW5QZXJmb3JtUmVxdWVzdE92ZXJDb25uZWN0aW9uKGNoaWxkQWNjZXNzaWJpbGl0eVZpZXdJZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKG1BY2Nlc3NpYmlsaXR5V2luZG93SWQsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkQWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgIC8qIGlnbm9yZSovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGNoaWxkLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKFZpZXcgY2hpbGQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRBY2Nlc3NpYmlsaXR5Vmlld0lkID0gY2hpbGQuZ2V0QWNjZXNzaWJpbGl0eVZpZXdJZCgpOworICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBtQ2hpbGRBY2Nlc3NpYmlsaXR5SWRzLnNpemUoKTsKKyAgICAgICAgbUNoaWxkQWNjZXNzaWJpbGl0eUlkcy5wdXQoaW5kZXgsIGNoaWxkQWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBiaXQgbWFzayBvZiB3aXRoIGFjdGlvbnMuCisgICAgICoKKyAgICAgKiBAc2VlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNBQ1RJT05fRk9DVVMKKyAgICAgKiBAc2VlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNBQ1RJT05fQ0xFQVJfRk9DVVMKKyAgICAgKiBAc2VlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNBQ1RJT05fU0VMRUNUCisgICAgICogQHNlZSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8jQUNUSU9OX0NMRUFSX1NFTEVDVElPTgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWN0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gYWN0aW9uIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgbm9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEFjdGlvbihpbnQgYWN0aW9uKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbUFjdGlvbnMgfD0gYWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGFuIGFjdGlvbiBvbiB0aGUgbm9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IEFuIGFjdGlvbiBjYW4gYmUgcGVyZm9ybWVkIG9ubHkgaWYgdGhlIHJlcXVlc3QgaXMgbWFkZQorICAgICAqICAgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiB0byBwZXJmb3JtLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgYWN0aW9uIHdhcyBwZXJmb3JtZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgb3V0c2lkZSBvZiBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQWN0aW9uKGludCBhY3Rpb24pIHsKKyAgICAgICAgZW5mb3JjZVNlYWxlZCgpOworICAgICAgICBpZiAoIWNhblBlcmZvcm1SZXF1ZXN0T3ZlckNvbm5lY3Rpb24obUFjY2Vzc2liaWxpdHlWaWV3SWQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5wZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihtQWNjZXNzaWJpbGl0eVdpbmRvd0lkLAorICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCwgYWN0aW9uKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB7QGxpbmsgQWNjZXNzaWJpbGl0eU5vZGVJbmZvfXMgYnkgdGV4dC4gVGhlIG1hdGNoIGlzIGNhc2UKKyAgICAgKiBpbnNlbnNpdGl2ZSBjb250YWlubWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBzZWFyY2hlZCB0ZXh0LgorICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIG5vZGUgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGVuZm9yY2VTZWFsZWQoKTsKKyAgICAgICAgaWYgKCFjYW5QZXJmb3JtUmVxdWVzdE92ZXJDb25uZWN0aW9uKG1BY2Nlc3NpYmlsaXR5Vmlld0lkKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHQodGV4dCwgbUFjY2Vzc2liaWxpdHlXaW5kb3dJZCwKKyAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlWaWV3SWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuaXF1ZSBpZCBpZGVudGlmeWluZyB0aGlzIG5vZGUncyBwYXJlbnQuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvIGJ5CisgICAgICogICAgIGNhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNyZWN5Y2xlKCl9IHRvIGF2b2lkIGNyZWF0aW5nCisgICAgICogICAgIG9mIG11bHRpcGxlIGluc3RhbmNlcy4KKyAgICAgKiAgIDwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIFRoZSBub2RlJ3MgcGF0ZW50IGlkLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0UGFyZW50KCkgeworICAgICAgICBlbmZvcmNlU2VhbGVkKCk7CisgICAgICAgIGlmICghY2FuUGVyZm9ybVJlcXVlc3RPdmVyQ29ubmVjdGlvbihtQWNjZXNzaWJpbGl0eVZpZXdJZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKAorICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eVdpbmRvd0lkLCBtUGFyZW50QWNjZXNzaWJpbGl0eVZpZXdJZCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXJlbnQuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoVmlldyBwYXJlbnQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtUGFyZW50QWNjZXNzaWJpbGl0eVZpZXdJZCA9IHBhcmVudC5nZXRBY2Nlc3NpYmlsaXR5Vmlld0lkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbm9kZSBib3VuZHMgaW4gcGFyZW50IGNvb3JkaW5hdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG91dEJvdW5kcyBUaGUgb3V0cHV0IG5vZGUgYm91bmRzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGdldEJvdW5kc0luUGFyZW50KFJlY3Qgb3V0Qm91bmRzKSB7CisgICAgICAgIG91dEJvdW5kcy5zZXQobUJvdW5kc0luUGFyZW50LmxlZnQsIG1Cb3VuZHNJblBhcmVudC50b3AsCisgICAgICAgICAgICAgICAgbUJvdW5kc0luUGFyZW50LnJpZ2h0LCBtQm91bmRzSW5QYXJlbnQuYm90dG9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBub2RlIGJvdW5kcyBpbiBwYXJlbnQgY29vcmRpbmF0ZXMuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gYm91bmRzIFRoZSBub2RlIGJvdW5kcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvdW5kc0luUGFyZW50KFJlY3QgYm91bmRzKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbUJvdW5kc0luUGFyZW50LnNldChib3VuZHMubGVmdCwgYm91bmRzLnRvcCwgYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBub2RlIGJvdW5kcyBpbiBzY3JlZW4gY29vcmRpbmF0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0Qm91bmRzIFRoZSBvdXRwdXQgbm9kZSBib3VuZHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0Qm91bmRzSW5TY3JlZW4oUmVjdCBvdXRCb3VuZHMpIHsKKyAgICAgICAgb3V0Qm91bmRzLnNldChtQm91bmRzSW5TY3JlZW4ubGVmdCwgbUJvdW5kc0luU2NyZWVuLnRvcCwKKyAgICAgICAgICAgICAgICBtQm91bmRzSW5TY3JlZW4ucmlnaHQsIG1Cb3VuZHNJblNjcmVlbi5ib3R0b20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5vZGUgYm91bmRzIGluIHNjcmVlbiBjb29yZGluYXRlcy4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBib3VuZHMgVGhlIG5vZGUgYm91bmRzLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm91bmRzSW5TY3JlZW4oUmVjdCBib3VuZHMpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtQm91bmRzSW5TY3JlZW4uc2V0KGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgY2hlY2thYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGlzIGNoZWNrYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9DSEVDS0FCTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgY2hlY2thYmxlLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGNoZWNrYWJsZSBUcnVlIGlmIHRoZSBub2RlIGlzIGNoZWNrYWJsZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENoZWNrYWJsZShib29sZWFuIGNoZWNrYWJsZSkgeworICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ0hFQ0tBQkxFLCBjaGVja2FibGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgY2hlY2tlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBjaGVja2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9DSEVDS0VEKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGNoZWNrZWQuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gY2hlY2tlZCBUcnVlIGlmIHRoZSBub2RlIGlzIGNoZWNrZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ0hFQ0tFRCwgY2hlY2tlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBmb2N1c2FibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgZm9jdXNhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRm9jdXNhYmxlKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0ZPQ1VTQUJMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBmb2N1c2FibGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gZm9jdXNhYmxlIFRydWUgaWYgdGhlIG5vZGUgaXMgZm9jdXNhYmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9jdXNhYmxlKGJvb2xlYW4gZm9jdXNhYmxlKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9GT0NVU0FCTEUsIGZvY3VzYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBmb2N1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGlzIGZvY3VzZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c2VkKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0ZPQ1VTRUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgZm9jdXNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBmb2N1c2VkIFRydWUgaWYgdGhlIG5vZGUgaXMgZm9jdXNlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzZWQoYm9vbGVhbiBmb2N1c2VkKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9GT0NVU0VELCBmb2N1c2VkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIHNlbGVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBub2RlIGlzIHNlbGVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfU0VMRUNURUQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgc2VsZWN0ZWQuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWQgVHJ1ZSBpZiB0aGUgbm9kZSBpcyBzZWxlY3RlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGVkKGJvb2xlYW4gc2VsZWN0ZWQpIHsKKyAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX1NFTEVDVEVELCBzZWxlY3RlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBjbGlja2FibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgY2xpY2thYmxlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xpY2thYmxlKCkgeworICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0NMSUNLQUJMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBjbGlja2FibGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gY2xpY2thYmxlIFRydWUgaWYgdGhlIG5vZGUgaXMgY2xpY2thYmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xpY2thYmxlKGJvb2xlYW4gY2xpY2thYmxlKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9DTElDS0FCTEUsIGNsaWNrYWJsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBsb25nIGNsaWNrYWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBsb25nIGNsaWNrYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvbmdDbGlja2FibGUoKSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfTE9OR19DTElDS0FCTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgbG9uZyBjbGlja2FibGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gbG9uZ0NsaWNrYWJsZSBUcnVlIGlmIHRoZSBub2RlIGlzIGxvbmcgY2xpY2thYmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TG9uZ0NsaWNrYWJsZShib29sZWFuIGxvbmdDbGlja2FibGUpIHsKKyAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0xPTkdfQ0xJQ0tBQkxFLCBsb25nQ2xpY2thYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyBub2RlIGlzIGVuYWJsZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG5vZGUgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfRU5BQkxFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHRoaXMgbm9kZSBpcyBlbmFibGVkLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGVuYWJsZWQgVHJ1ZSBpZiB0aGUgbm9kZSBpcyBlbmFibGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0VOQUJMRUQsIGVuYWJsZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgYSBwYXNzd29yZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIHBhc3N3b3JkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfUEFTU1dPUkQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB0aGlzIG5vZGUgaXMgYSBwYXNzd29yZC4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBUcnVlIGlmIHRoZSBub2RlIGlzIGEgcGFzc3dvcmQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChib29sZWFuIHBhc3N3b3JkKSB7CisgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9QQVNTV09SRCwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBhY2thZ2UgdGhpcyBub2RlIGNvbWVzIGZyb20uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQYWNrYWdlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYWNrYWdlIHRoaXMgbm9kZSBjb21lcyBmcm9tLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlTmFtZShDaGFyU2VxdWVuY2UgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjbGFzcyB0aGlzIG5vZGUgY29tZXMgZnJvbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBtQ2xhc3NOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNsYXNzIHRoaXMgbm9kZSBjb21lcyBmcm9tLgorICAgICAqIDxwPgorICAgICAqICAgTm90ZTogQ2Fubm90IGJlIGNhbGxlZCBmcm9tIGFuIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlfS4KKyAgICAgKiAgIFRoaXMgY2xhc3MgaXMgbWFkZSBpbW11dGFibGUgYmVmb3JlIGJlaW5nIGRlbGl2ZXJlZCB0byBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBUaGUgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShDaGFyU2VxdWVuY2UgY2xhc3NOYW1lKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbUNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0ZXh0IG9mIHRoaXMgbm9kZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHRleHQuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gbVRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGV4dCBvZiB0aGlzIG5vZGUuCisgICAgICogPHA+CisgICAgICogICBOb3RlOiBDYW5ub3QgYmUgY2FsbGVkIGZyb20gYW4ge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2V9LgorICAgICAqICAgVGhpcyBjbGFzcyBpcyBtYWRlIGltbXV0YWJsZSBiZWZvcmUgYmVpbmcgZGVsaXZlcmVkIHRvIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBtVGV4dCA9IHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBvZiB0aGlzIG5vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGRlc2NyaXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbUNvbnRlbnREZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIG9mIHRoaXMgbm9kZS4KKyAgICAgKiA8cD4KKyAgICAgKiAgIE5vdGU6IENhbm5vdCBiZSBjYWxsZWQgZnJvbSBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0uCisgICAgICogICBUaGlzIGNsYXNzIGlzIG1hZGUgaW1tdXRhYmxlIGJlZm9yZSBiZWluZyBkZWxpdmVyZWQgdG8gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBjb250ZW50RGVzY3JpcHRpb24gVGhlIGNvbnRlbnQgZGVzY3JpcHRpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGVzY3JpcHRpb24oQ2hhclNlcXVlbmNlIGNvbnRlbnREZXNjcmlwdGlvbikgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CisgICAgICAgIG1Db250ZW50RGVzY3JpcHRpb24gPSBjb250ZW50RGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBib29sZWFuIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhblByb3BlcnR5KGludCBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gKG1Cb29sZWFuUHJvcGVydGllcyAmIHByb3BlcnR5KSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBib29sZWFuIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEJvb2xlYW5Qcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIG1Cb29sZWFuUHJvcGVydGllcyB8PSBwcm9wZXJ0eTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Cb29sZWFuUHJvcGVydGllcyAmPSB+cHJvcGVydHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBjb25uZWN0aW9uIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiBUaGUgY2xpZW50IHRva2VuLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDb25uZWN0aW9uKElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CisgICAgICAgIG1Db25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGlmIHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlYWxlZCBXaGV0aGVyIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VhbGVkKGJvb2xlYW4gc2VhbGVkKSB7CisgICAgICAgIG1TZWFsZWQgPSBzZWFsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBpZiB0aGlzIGluc3RhbmNlIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciBpcyBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2VhbGVkKCkgeworICAgICAgICByZXR1cm4gbVNlYWxlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmZvcmNlcyB0aGF0IHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhpcyBpbnN0YW5jZSBpcyBub3Qgc2VhbGVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBlbmZvcmNlU2VhbGVkKCkgeworICAgICAgICBpZiAoIWlzU2VhbGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBwZXJmb3JtIHRoaXMgIgorICAgICAgICAgICAgICAgICAgICArICJhY3Rpb24gb24gYSBub3Qgc2VhbGVkIGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5mb3JjZXMgdGhhdCB0aGlzIGluc3RhbmNlIGlzIG5vdCBzZWFsZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIGluc3RhbmNlIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZW5mb3JjZU5vdFNlYWxlZCgpIHsKKyAgICAgICAgaWYgKGlzU2VhbGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBwZXJmb3JtIHRoaXMgIgorICAgICAgICAgICAgICAgICAgICArICJhY3Rpb24gb24gYW4gc2VhbGVkIGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNhY2hlZCBpbnN0YW5jZSBpZiBzdWNoIGlzIGF2YWlsYWJsZSBvdGhlcndpc2UgYSBuZXcgb25lCisgICAgICogYW5kIHNldHMgdGhlIHNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRTb3VyY2UoVmlldykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBvYnRhaW4oVmlldyBzb3VyY2UpIHsKKyAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8gPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8ub2J0YWluKCk7CisgICAgICAgIGluZm8uc2V0U291cmNlKHNvdXJjZSk7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjYWNoZWQgaW5zdGFuY2UgaWYgc3VjaCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIGEgbmV3IG9uZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gb2J0YWluKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNQb29sTG9jaykgeworICAgICAgICAgICAgaWYgKHNQb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbyA9IHNQb29sOworICAgICAgICAgICAgICAgIHNQb29sID0gc1Bvb2wubU5leHQ7CisgICAgICAgICAgICAgICAgc1Bvb2xTaXplLS07CisgICAgICAgICAgICAgICAgaW5mby5tTmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgaW5mby5tSXNJblBvb2wgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzaWJpbGl0eU5vZGVJbmZvKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2UgYmFjayB0byBiZSByZXVzZWQuCisgICAgICogPHA+CisgICAgICogPGI+Tm90ZTogWW91IG11c3Qgbm90IHRvdWNoIHRoZSBvYmplY3QgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLjwvYj4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoZSBpbmZvIGlzIGFscmVhZHkgcmVjeWNsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVjeWNsZSgpIHsKKyAgICAgICAgaWYgKG1Jc0luUG9vbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW5mbyBhbHJlYWR5IHJlY3ljbGVkISIpOworICAgICAgICB9CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoc1Bvb2xMb2NrKSB7CisgICAgICAgICAgICBpZiAoc1Bvb2xTaXplIDw9IE1BWF9QT09MX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBtTmV4dCA9IHNQb29sOworICAgICAgICAgICAgICAgIHNQb29sID0gdGhpczsKKyAgICAgICAgICAgICAgICBtSXNJblBvb2wgPSB0cnVlOworICAgICAgICAgICAgICAgIHNQb29sU2l6ZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqICAgPGI+Tm90ZTogQWZ0ZXIgdGhlIGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gYSBwYXJjZWwgaXQgaXMgcmVjeWNsZWQuCisgICAgICogICAgICBZb3UgbXVzdCBub3QgdG91Y2ggdGhlIG9iamVjdCBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uPC9iPgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBwYXJjZWwsIGludCBmbGFncykgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KDEpOworICAgICAgICAgICAgcGFyY2VsLndyaXRlU3Ryb25nQmluZGVyKG1Db25uZWN0aW9uLmFzQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHBhcmNlbC53cml0ZUludChpc1NlYWxlZCgpID8gMSA6IDApOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUFjY2Vzc2liaWxpdHlWaWV3SWQpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUFjY2Vzc2liaWxpdHlXaW5kb3dJZCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtUGFyZW50QWNjZXNzaWJpbGl0eVZpZXdJZCk7CisKKyAgICAgICAgU3BhcnNlSW50QXJyYXkgY2hpbGRJZHMgPSBtQ2hpbGRBY2Nlc3NpYmlsaXR5SWRzOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRJZHNTaXplID0gY2hpbGRJZHMuc2l6ZSgpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQoY2hpbGRJZHNTaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZElkc1NpemU7IGkrKykgeworICAgICAgICAgICAgcGFyY2VsLndyaXRlSW50KGNoaWxkSWRzLnZhbHVlQXQoaSkpOworICAgICAgICB9CisKKyAgICAgICAgcGFyY2VsLndyaXRlSW50KG1Cb3VuZHNJblBhcmVudC50b3ApOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUJvdW5kc0luUGFyZW50LmJvdHRvbSk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtQm91bmRzSW5QYXJlbnQubGVmdCk7CisgICAgICAgIHBhcmNlbC53cml0ZUludChtQm91bmRzSW5QYXJlbnQucmlnaHQpOworCisgICAgICAgIHBhcmNlbC53cml0ZUludChtQm91bmRzSW5TY3JlZW4udG9wKTsKKyAgICAgICAgcGFyY2VsLndyaXRlSW50KG1Cb3VuZHNJblNjcmVlbi5ib3R0b20pOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUJvdW5kc0luU2NyZWVuLmxlZnQpOworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUJvdW5kc0luU2NyZWVuLnJpZ2h0KTsKKworICAgICAgICBwYXJjZWwud3JpdGVJbnQobUFjdGlvbnMpOworCisgICAgICAgIHBhcmNlbC53cml0ZUludChtQm9vbGVhblByb3BlcnRpZXMpOworCisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1QYWNrYWdlTmFtZSwgcGFyY2VsLCBmbGFncyk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1DbGFzc05hbWUsIHBhcmNlbCwgZmxhZ3MpOworICAgICAgICBUZXh0VXRpbHMud3JpdGVUb1BhcmNlbChtVGV4dCwgcGFyY2VsLCBmbGFncyk7CisgICAgICAgIFRleHRVdGlscy53cml0ZVRvUGFyY2VsKG1Db250ZW50RGVzY3JpcHRpb24sIHBhcmNlbCwgZmxhZ3MpOworCisgICAgICAgIC8vIFNpbmNlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBmZXRjaGVkIHZpYSBzeW5jaHJvbm91cyBpLmUuIGJsb2NraW5nCisgICAgICAgIC8vIGNhbGxzIGluIElQQ3MgYW5kIHdlIGFsd2F5cyByZWN5Y2xlIGFzIHNvb24gYXMgdGhlIGluc3RhbmNlIGlzIG1hcnNoYWxlZC4KKyAgICAgICAgcmVjeWNsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIHtAbGluayBQYXJjZWx9LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmNlbCBBIHBhcmNlbCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0RnJvbVBhcmNlbChQYXJjZWwgcGFyY2VsKSB7CisgICAgICAgIGlmIChwYXJjZWwucmVhZEludCgpID09IDEpIHsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uID0gSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbi5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBwYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgfQorICAgICAgICBtU2VhbGVkID0gKHBhcmNlbC5yZWFkSW50KCkgID09IDEpOworICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1BY2Nlc3NpYmlsaXR5V2luZG93SWQgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtUGFyZW50QWNjZXNzaWJpbGl0eVZpZXdJZCA9IHBhcmNlbC5yZWFkSW50KCk7CisKKyAgICAgICAgU3BhcnNlSW50QXJyYXkgY2hpbGRJZHMgPSBtQ2hpbGRBY2Nlc3NpYmlsaXR5SWRzOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRyZW5TaXplID0gcGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblNpemU7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkSWQgPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICAgICAgY2hpbGRJZHMucHV0KGksIGNoaWxkSWQpOworICAgICAgICB9CisKKyAgICAgICAgbUJvdW5kc0luUGFyZW50LnRvcCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1Cb3VuZHNJblBhcmVudC5ib3R0b20gPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtQm91bmRzSW5QYXJlbnQubGVmdCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1Cb3VuZHNJblBhcmVudC5yaWdodCA9IHBhcmNlbC5yZWFkSW50KCk7CisKKyAgICAgICAgbUJvdW5kc0luU2NyZWVuLnRvcCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1Cb3VuZHNJblNjcmVlbi5ib3R0b20gPSBwYXJjZWwucmVhZEludCgpOworICAgICAgICBtQm91bmRzSW5TY3JlZW4ubGVmdCA9IHBhcmNlbC5yZWFkSW50KCk7CisgICAgICAgIG1Cb3VuZHNJblNjcmVlbi5yaWdodCA9IHBhcmNlbC5yZWFkSW50KCk7CisKKyAgICAgICAgbUFjdGlvbnMgPSBwYXJjZWwucmVhZEludCgpOworCisgICAgICAgIG1Cb29sZWFuUHJvcGVydGllcyA9IHBhcmNlbC5yZWFkSW50KCk7CisKKyAgICAgICAgbVBhY2thZ2VOYW1lID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIG1DbGFzc05hbWUgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbVRleHQgPSBUZXh0VXRpbHMuQ0hBUl9TRVFVRU5DRV9DUkVBVE9SLmNyZWF0ZUZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgbUNvbnRlbnREZXNjcmlwdGlvbiA9IFRleHRVdGlscy5DSEFSX1NFUVVFTkNFX0NSRUFUT1IuY3JlYXRlRnJvbVBhcmNlbChwYXJjZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgc3RhdGUgb2YgdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1TZWFsZWQgPSBmYWxzZTsKKyAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICBtQWNjZXNzaWJpbGl0eVZpZXdJZCA9IFZpZXcuTk9fSUQ7CisgICAgICAgIG1QYXJlbnRBY2Nlc3NpYmlsaXR5Vmlld0lkID0gVmlldy5OT19JRDsKKyAgICAgICAgbUNoaWxkQWNjZXNzaWJpbGl0eUlkcy5jbGVhcigpOworICAgICAgICBtQm91bmRzSW5QYXJlbnQuc2V0KDAsIDAsIDAsIDApOworICAgICAgICBtQm91bmRzSW5TY3JlZW4uc2V0KDAsIDAsIDAsIDApOworICAgICAgICBtQm9vbGVhblByb3BlcnRpZXMgPSAwOworICAgICAgICBtUGFja2FnZU5hbWUgPSBudWxsOworICAgICAgICBtQ2xhc3NOYW1lID0gbnVsbDsKKyAgICAgICAgbVRleHQgPSBudWxsOworICAgICAgICBtQ29udGVudERlc2NyaXB0aW9uID0gbnVsbDsKKyAgICAgICAgbUFjdGlvbnMgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGh1bWFuIHJlYWRhYmxlIGFjdGlvbiBzeW1ib2xpYyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIHN5bWJvbGljIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFjdGlvblN5bWJvbGljTmFtZShpbnQgYWN0aW9uKSB7CisgICAgICAgIFNwYXJzZUFycmF5PFN0cmluZz4gYWN0aW9uU3ltYm9saWNOYW1lcyA9IHNBY3Rpb25TeW1ib2xpY05hbWVzOworICAgICAgICBpZiAoYWN0aW9uU3ltYm9saWNOYW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICBhY3Rpb25TeW1ib2xpY05hbWVzID0gc0FjdGlvblN5bWJvbGljTmFtZXMgPSBuZXcgU3BhcnNlQXJyYXk8U3RyaW5nPigpOworICAgICAgICAgICAgYWN0aW9uU3ltYm9saWNOYW1lcy5wdXQoQUNUSU9OX0ZPQ1VTLCAiQUNUSU9OX0ZPQ1VTIik7CisgICAgICAgICAgICBhY3Rpb25TeW1ib2xpY05hbWVzLnB1dChBQ1RJT05fQ0xFQVJfRk9DVVMsICJBQ1RJT05fVU5GT0NVUyIpOworICAgICAgICAgICAgYWN0aW9uU3ltYm9saWNOYW1lcy5wdXQoQUNUSU9OX1NFTEVDVCwgIkFDVElPTl9TRUxFQ1QiKTsKKyAgICAgICAgICAgIGFjdGlvblN5bWJvbGljTmFtZXMucHV0KEFDVElPTl9DTEVBUl9TRUxFQ1RJT04sICJBQ1RJT05fVU5TRUxFQ1QiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0aW9uU3ltYm9saWNOYW1lcy5nZXQoYWN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuUGVyZm9ybVJlcXVlc3RPdmVyQ29ubmVjdGlvbihpbnQgYWNjZXNzaWJpbGl0eVZpZXdJZCkgeworICAgICAgICByZXR1cm4gKG1BY2Nlc3NpYmlsaXR5V2luZG93SWQgIT0gVmlldy5OT19JRAorICAgICAgICAgICAgICAgICYmIGFjY2Vzc2liaWxpdHlWaWV3SWQgIT0gVmlldy5OT19JRAorICAgICAgICAgICAgICAgICYmIG1Db25uZWN0aW9uICE9IG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmICh0aGlzID09IG9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqZWN0LmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gb3RoZXIgPSAoQWNjZXNzaWJpbGl0eU5vZGVJbmZvKSBvYmplY3Q7CisgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eVZpZXdJZCAhPSBvdGhlci5tQWNjZXNzaWJpbGl0eVZpZXdJZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eVdpbmRvd0lkICE9IG90aGVyLm1BY2Nlc3NpYmlsaXR5V2luZG93SWQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbUFjY2Vzc2liaWxpdHlWaWV3SWQ7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbUFjY2Vzc2liaWxpdHlXaW5kb3dJZDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKKworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGFjY2Vzc2liaWxpdHlJZDogIiArIG1BY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IHBhcmVudEFjY2Vzc2liaWxpdHlJZDogIiArIG1QYXJlbnRBY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgICAgIFNwYXJzZUludEFycmF5IGNoaWxkSWRzID0gbUNoaWxkQWNjZXNzaWJpbGl0eUlkczsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGNoaWxkQWNjZXNzaWJpbGl0eUlkczogWyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGNvdW50ID0gY2hpbGRJZHMuc2l6ZSgpOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGNoaWxkSWRzLnZhbHVlQXQoaSkpOworICAgICAgICAgICAgICAgIGlmIChpIDwgY291bnQgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOworICAgICAgICB9CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgYm91bmRzSW5QYXJlbnQ6ICIgKyBtQm91bmRzSW5QYXJlbnQpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBib3VuZHNJblNjcmVlbjogIiArIG1Cb3VuZHNJblNjcmVlbik7CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgcGFja2FnZU5hbWU6ICIpLmFwcGVuZChtUGFja2FnZU5hbWUpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBjbGFzc05hbWU6ICIpLmFwcGVuZChtQ2xhc3NOYW1lKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgdGV4dDogIikuYXBwZW5kKG1UZXh0KTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgY29udGVudERlc2NyaXB0aW9uOiAiKS5hcHBlbmQobUNvbnRlbnREZXNjcmlwdGlvbik7CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgY2hlY2thYmxlOiAiKS5hcHBlbmQoaXNDaGVja2FibGUoKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGNoZWNrZWQ6ICIpLmFwcGVuZChpc0NoZWNrZWQoKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGZvY3VzYWJsZTogIikuYXBwZW5kKGlzRm9jdXNhYmxlKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBmb2N1c2VkOiAiKS5hcHBlbmQoaXNGb2N1c2VkKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBzZWxlY3RlZDogIikuYXBwZW5kKGlzU2VsZWN0ZWQoKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI7IGNsaWNrYWJsZTogIikuYXBwZW5kKGlzQ2xpY2thYmxlKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBsb25nQ2xpY2thYmxlOiAiKS5hcHBlbmQoaXNMb25nQ2xpY2thYmxlKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBlbmFibGVkOiAiKS5hcHBlbmQoaXNFbmFibGVkKCkpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiOyBwYXNzd29yZDogIikuYXBwZW5kKGlzUGFzc3dvcmQoKSk7CisKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIjsgWyIpOworCisgICAgICAgIGZvciAoaW50IGFjdGlvbkJpdHMgPSBtQWN0aW9uczsgYWN0aW9uQml0cyAhPSAwOykgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IDEgPDwgSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoYWN0aW9uQml0cyk7CisgICAgICAgICAgICBhY3Rpb25CaXRzICY9IH5hY3Rpb247CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRBY3Rpb25TeW1ib2xpY05hbWUoYWN0aW9uKSk7CisgICAgICAgICAgICBpZiAoYWN0aW9uQml0cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWlsZGVyLmFwcGVuZCgiXSIpOworCisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBQYXJjZWxhYmxlLkNyZWF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IENSRUFUT1IgPQorICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+KCkgeworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIHBhcmNlbCkgeworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8gPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8ub2J0YWluKCk7CisgICAgICAgICAgICBpbmZvLmluaXRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm9bXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm9bc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZWNvcmQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVjb3JkLmphdmEKaW5kZXggNzgxOWIxNy4uOWM0OTVlMjEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVjb3JkLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZWNvcmQuamF2YQpAQCAtMTYsNyArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMzgsMzYgKzQxLDEyNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUWV9QQVNTV09SRCA9IDB4MDAwMDAwMDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRZX0ZVTExfU0NSRUVOID0gMHgwMDAwMDA4MDsKIAorICAgIC8vIEhvdXNla2VlcGluZwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUE9PTF9TSVpFID0gMTA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNQb29sTG9jayA9IG5ldyBPYmplY3QoKTsKICAgICBwcml2YXRlIHN0YXRpYyBBY2Nlc3NpYmlsaXR5UmVjb3JkIHNQb29sOwogICAgIHByaXZhdGUgc3RhdGljIGludCBzUG9vbFNpemU7Ci0KICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlSZWNvcmQgbU5leHQ7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0luUG9vbDsKIAotICAgIHByb3RlY3RlZCBpbnQgbUJvb2xlYW5Qcm9wZXJ0aWVzOwotICAgIHByb3RlY3RlZCBpbnQgbUN1cnJlbnRJdGVtSW5kZXg7Ci0gICAgcHJvdGVjdGVkIGludCBtSXRlbUNvdW50OwotICAgIHByb3RlY3RlZCBpbnQgbUZyb21JbmRleDsKLSAgICBwcm90ZWN0ZWQgaW50IG1BZGRlZENvdW50OwotICAgIHByb3RlY3RlZCBpbnQgbVJlbW92ZWRDb3VudDsKKyAgICBib29sZWFuIG1TZWFsZWQ7CisgICAgaW50IG1Cb29sZWFuUHJvcGVydGllczsKKyAgICBpbnQgbUN1cnJlbnRJdGVtSW5kZXg7CisgICAgaW50IG1JdGVtQ291bnQ7CisgICAgaW50IG1Gcm9tSW5kZXg7CisgICAgaW50IG1BZGRlZENvdW50OworICAgIGludCBtUmVtb3ZlZENvdW50OworICAgIGludCBtU291cmNlVmlld0lkID0gVmlldy5OT19JRDsKKyAgICBpbnQgbVNvdXJjZVdpbmRvd0lkID0gVmlldy5OT19JRDsKIAotICAgIHByb3RlY3RlZCBDaGFyU2VxdWVuY2UgbUNsYXNzTmFtZTsKLSAgICBwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIG1Db250ZW50RGVzY3JpcHRpb247Ci0gICAgcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSBtQmVmb3JlVGV4dDsKLSAgICBwcm90ZWN0ZWQgUGFyY2VsYWJsZSBtUGFyY2VsYWJsZURhdGE7CisgICAgQ2hhclNlcXVlbmNlIG1DbGFzc05hbWU7CisgICAgQ2hhclNlcXVlbmNlIG1Db250ZW50RGVzY3JpcHRpb247CisgICAgQ2hhclNlcXVlbmNlIG1CZWZvcmVUZXh0OworICAgIFBhcmNlbGFibGUgbVBhcmNlbGFibGVEYXRhOwogCi0gICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8Q2hhclNlcXVlbmNlPiBtVGV4dCA9IG5ldyBBcnJheUxpc3Q8Q2hhclNlcXVlbmNlPigpOworICAgIGZpbmFsIExpc3Q8Q2hhclNlcXVlbmNlPiBtVGV4dCA9IG5ldyBBcnJheUxpc3Q8Q2hhclNlcXVlbmNlPigpOworICAgIElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gbUNvbm5lY3Rpb247CiAKICAgICAvKgogICAgICAqIEhpZGUgY29uc3RydWN0b3IuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEFjY2Vzc2liaWxpdHlSZWNvcmQoKSB7CisgICAgQWNjZXNzaWJpbGl0eVJlY29yZCgpIHsKIAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhpcyByZWNvcmQgZnJvbSBhbm90aGVyIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNvcmQgVGhlIHRvIGluaXRpYWxpemUgZnJvbS4KKyAgICAgKi8KKyAgICB2b2lkIGluaXQoQWNjZXNzaWJpbGl0eVJlY29yZCByZWNvcmQpIHsKKyAgICAgICAgbVNlYWxlZCA9IHJlY29yZC5tU2VhbGVkOworICAgICAgICBtQm9vbGVhblByb3BlcnRpZXMgPSByZWNvcmQubUJvb2xlYW5Qcm9wZXJ0aWVzOworICAgICAgICBtQ3VycmVudEl0ZW1JbmRleCA9IHJlY29yZC5tQ3VycmVudEl0ZW1JbmRleDsKKyAgICAgICAgbUl0ZW1Db3VudCA9IHJlY29yZC5tSXRlbUNvdW50OworICAgICAgICBtRnJvbUluZGV4ID0gcmVjb3JkLm1Gcm9tSW5kZXg7CisgICAgICAgIG1BZGRlZENvdW50ID0gcmVjb3JkLm1BZGRlZENvdW50OworICAgICAgICBtUmVtb3ZlZENvdW50ID0gcmVjb3JkLm1SZW1vdmVkQ291bnQ7CisgICAgICAgIG1DbGFzc05hbWUgPSByZWNvcmQubUNsYXNzTmFtZTsKKyAgICAgICAgbUNvbnRlbnREZXNjcmlwdGlvbiA9IHJlY29yZC5tQ29udGVudERlc2NyaXB0aW9uOworICAgICAgICBtQmVmb3JlVGV4dCA9IHJlY29yZC5tQmVmb3JlVGV4dDsKKyAgICAgICAgbVBhcmNlbGFibGVEYXRhID0gcmVjb3JkLm1QYXJjZWxhYmxlRGF0YTsKKyAgICAgICAgbVRleHQuYWRkQWxsKHJlY29yZC5tVGV4dCk7CisgICAgICAgIG1Tb3VyY2VXaW5kb3dJZCA9IHJlY29yZC5tU291cmNlV2luZG93SWQ7CisgICAgICAgIG1Tb3VyY2VWaWV3SWQgPSByZWNvcmQubVNvdXJjZVZpZXdJZDsKKyAgICAgICAgbUNvbm5lY3Rpb24gPSByZWNvcmQubUNvbm5lY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZXZlbnQgc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlKFZpZXcgc291cmNlKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU291cmNlV2luZG93SWQgPSBzb3VyY2UuZ2V0QWNjZXNzaWJpbGl0eVdpbmRvd0lkKCk7CisgICAgICAgICAgICBtU291cmNlVmlld0lkID0gc291cmNlLmdldEFjY2Vzc2liaWxpdHlWaWV3SWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Tb3VyY2VXaW5kb3dJZCA9IFZpZXcuTk9fSUQ7CisgICAgICAgICAgICBtU291cmNlVmlld0lkID0gVmlldy5OT19JRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBBY2Nlc3NpYmlsaXR5Tm9kZUluZm99IG9mIHRoZSBldmVudCBzb3VyY2UuCisgICAgICogPHA+CisgICAgICogICA8c3Ryb25nPgorICAgICAqICAgICBJdCBpcyBhIGNsaWVudCByZXNwb25zaWJpbGl0eSB0byByZWN5Y2xlIHRoZSByZWNlaXZlZCBpbmZvIGJ5CisgICAgICogICAgIGNhbGxpbmcge0BsaW5rIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyNyZWN5Y2xlKCl9IHRvIGF2b2lkIGNyZWF0aW5nCisgICAgICogICAgIG9mIG11bHRpcGxlIGluc3RhbmNlcy4KKyAgICAgKiAgIDwvc3Ryb25nPgorICAgICAqIDwvcD4KKyAgICAgKiBAcmV0dXJuIFRoZSBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0U291cmNlKCkgeworICAgICAgICBlbmZvcmNlU2VhbGVkKCk7CisgICAgICAgIGlmIChtU291cmNlV2luZG93SWQgPT0gVmlldy5OT19JRCB8fCBtU291cmNlVmlld0lkID09IFZpZXcuTk9fSUQgfHwgbUNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWQobVNvdXJjZVdpbmRvd0lkLAorICAgICAgICAgICAgICAgICAgICBtU291cmNlVmlld0lkKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgLyogaWdub3JlICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29ubmVjdGlvbiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gVGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb24oSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGlkIG9mIHRoZSB3aW5kb3cgZnJvbSB3aGljaCB0aGUgZXZlbnQgY29tZXMgZnJvbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHdpbmRvdyBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFdpbmRvd0lkKCkgeworICAgICAgICByZXR1cm4gbVNvdXJjZVdpbmRvd0lkOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgaWYgdGhlIHNvdXJjZSBpcyBjaGVja2VkLgogICAgICAqCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB2aWV3IGlzIGNoZWNrZWQsIGZhbHNlIG90aGVyd2lzZS4KQEAgLTgwLDggKzE3NCwxMSBAQAogICAgICAqIFNldHMgaWYgdGhlIHNvdXJjZSBpcyBjaGVja2VkLgogICAgICAqCiAgICAgICogQHBhcmFtIGlzQ2hlY2tlZCBUcnVlIGlmIHRoZSB2aWV3IGlzIGNoZWNrZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfQ0hFQ0tFRCwgaXNDaGVja2VkKTsKICAgICB9CiAKQEAgLTk4LDggKzE5NSwxMSBAQAogICAgICAqIFNldHMgaWYgdGhlIHNvdXJjZSBpcyBlbmFibGVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGlzRW5hYmxlZCBUcnVlIGlmIHRoZSB2aWV3IGlzIGVuYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBpc0VuYWJsZWQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfRU5BQkxFRCwgaXNFbmFibGVkKTsKICAgICB9CiAKQEAgLTExNiwyMSArMjE2LDE1IEBACiAgICAgICogU2V0cyBpZiB0aGUgc291cmNlIGlzIGEgcGFzc3dvcmQgZmllbGQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaXNQYXNzd29yZCBUcnVlIGlmIHRoZSB2aWV3IGlzIGEgcGFzc3dvcmQgZmllbGQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKGJvb2xlYW4gaXNQYXNzd29yZCkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CiAgICAgICAgIHNldEJvb2xlYW5Qcm9wZXJ0eShQUk9QRVJUWV9QQVNTV09SRCwgaXNQYXNzd29yZCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0cyBpZiB0aGUgc291cmNlIGlzIHRha2luZyB0aGUgZW50aXJlIHNjcmVlbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpc0Z1bGxTY3JlZW4gVHJ1ZSBpZiB0aGUgc291cmNlIGlzIGZ1bGwgc2NyZWVuLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlbihib29sZWFuIGlzRnVsbFNjcmVlbikgewotICAgICAgICBzZXRCb29sZWFuUHJvcGVydHkoUFJPUEVSVFlfRlVMTF9TQ1JFRU4sIGlzRnVsbFNjcmVlbik7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0cyBpZiB0aGUgc291cmNlIGlzIHRha2luZyB0aGUgZW50aXJlIHNjcmVlbi4KICAgICAgKgogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc291cmNlIGlzIGZ1bGwgc2NyZWVuLCBmYWxzZSBvdGhlcndpc2UuCkBAIC0xNDAsNiArMjM0LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyBpZiB0aGUgc291cmNlIGlzIHRha2luZyB0aGUgZW50aXJlIHNjcmVlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0Z1bGxTY3JlZW4gVHJ1ZSBpZiB0aGUgc291cmNlIGlzIGZ1bGwgc2NyZWVuLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuKGJvb2xlYW4gaXNGdWxsU2NyZWVuKSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKKyAgICAgICAgc2V0Qm9vbGVhblByb3BlcnR5KFBST1BFUlRZX0ZVTExfU0NSRUVOLCBpc0Z1bGxTY3JlZW4pOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSB2aXNpdGVkLgogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGl0ZW1zLgpAQCAtMTUyLDggKzI1OCwxMSBAQAogICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSB2aXNpdGVkLgogICAgICAqCiAgICAgICogQHBhcmFtIGl0ZW1Db3VudCBUaGUgbnVtYmVyIG9mIGl0ZW1zLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SXRlbUNvdW50KGludCBpdGVtQ291bnQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtSXRlbUNvdW50ID0gaXRlbUNvdW50OwogICAgIH0KIApAQCAtMTcwLDggKzI3OSwxMSBAQAogICAgICAqIFNldHMgdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgaW4gdGhlIGxpc3Qgb2YgaXRlbXMgdGhhdCBjYW4gYmUgdmlzaXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBjdXJyZW50SXRlbUluZGV4IFRoZSBjdXJyZW50IGl0ZW0gaW5kZXguCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50SXRlbUluZGV4KGludCBjdXJyZW50SXRlbUluZGV4KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbUN1cnJlbnRJdGVtSW5kZXggPSBjdXJyZW50SXRlbUluZGV4OwogICAgIH0KIApAQCAtMTg4LDggKzMwMCwxMSBAQAogICAgICAqIFNldHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGNoYW5nZWQgc2VxdWVuY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZnJvbUluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnJvbUluZGV4KGludCBmcm9tSW5kZXgpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtRnJvbUluZGV4ID0gZnJvbUluZGV4OwogICAgIH0KIApAQCAtMjA2LDggKzMyMSwxMSBAQAogICAgICAqIFNldHMgdGhlIG51bWJlciBvZiBhZGRlZCBjaGFyYWN0ZXJzLgogICAgICAqCiAgICAgICogQHBhcmFtIGFkZGVkQ291bnQgVGhlIG51bWJlciBvZiBhZGRlZCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QWRkZWRDb3VudChpbnQgYWRkZWRDb3VudCkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CiAgICAgICAgIG1BZGRlZENvdW50ID0gYWRkZWRDb3VudDsKICAgICB9CiAKQEAgLTIyNCw4ICszNDIsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcmVtb3ZlZCBjaGFyYWN0ZXJzLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlbW92ZWRDb3VudCBUaGUgbnVtYmVyIG9mIHJlbW92ZWQgY2hhcmFjdGVycy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlbW92ZWRDb3VudChpbnQgcmVtb3ZlZENvdW50KSB7CisgICAgICAgIGVuZm9yY2VOb3RTZWFsZWQoKTsKICAgICAgICAgbVJlbW92ZWRDb3VudCA9IHJlbW92ZWRDb3VudDsKICAgICB9CiAKQEAgLTI0Miw4ICszNjMsMTEgQEAKICAgICAgKiBTZXRzIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzb3VyY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBsYXNzIG5hbWUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiBjYWxsZWQgZnJvbSBhbiBBY2Nlc3NpYmlsaXR5U2VydmljZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoQ2hhclNlcXVlbmNlIGNsYXNzTmFtZSkgeworICAgICAgICBlbmZvcmNlTm90U2VhbGVkKCk7CiAgICAgICAgIG1DbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICAgfQogCkBAIC0yNzAsOCArMzk0LDExIEBACiAgICAgICogU2V0cyB0aGUgdGV4dCBiZWZvcmUgYSBjaGFuZ2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYmVmb3JlVGV4dCBUaGUgdGV4dCBiZWZvcmUgdGhlIGNoYW5nZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEJlZm9yZVRleHQoQ2hhclNlcXVlbmNlIGJlZm9yZVRleHQpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtQmVmb3JlVGV4dCA9IGJlZm9yZVRleHQ7CiAgICAgfQogCkBAIC0yODgsOCArNDE1LDExIEBACiAgICAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZW50RGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgY2FsbGVkIGZyb20gYW4gQWNjZXNzaWJpbGl0eVNlcnZpY2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudERlc2NyaXB0aW9uKENoYXJTZXF1ZW5jZSBjb250ZW50RGVzY3JpcHRpb24pIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtQ29udGVudERlc2NyaXB0aW9uID0gY29udGVudERlc2NyaXB0aW9uOwogICAgIH0KIApAQCAtMzA2LDE4ICs0MzYsNjUgQEAKICAgICAgKiBTZXRzIHRoZSB7QGxpbmsgUGFyY2VsYWJsZX0gZGF0YSBvZiB0aGUgZXZlbnQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFyY2VsYWJsZURhdGEgVGhlIHBhcmNlbGFibGUgZGF0YS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIGNhbGxlZCBmcm9tIGFuIEFjY2Vzc2liaWxpdHlTZXJ2aWNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhcmNlbGFibGVEYXRhKFBhcmNlbGFibGUgcGFyY2VsYWJsZURhdGEpIHsKKyAgICAgICAgZW5mb3JjZU5vdFNlYWxlZCgpOwogICAgICAgICBtUGFyY2VsYWJsZURhdGEgPSBwYXJjZWxhYmxlRGF0YTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXRzIGlmIHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHNlYWxlZCBXaGV0aGVyIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VhbGVkKGJvb2xlYW4gc2VhbGVkKSB7CisgICAgICAgIG1TZWFsZWQgPSBzZWFsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBpZiB0aGlzIGluc3RhbmNlIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2hldGhlciBpcyBzZWFsZWQuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NlYWxlZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TZWFsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5mb3JjZXMgdGhhdCB0aGlzIGluc3RhbmNlIGlzIHNlYWxlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoaXMgaW5zdGFuY2UgaXMgbm90IHNlYWxlZC4KKyAgICAgKi8KKyAgICB2b2lkIGVuZm9yY2VTZWFsZWQoKSB7CisgICAgICAgIGlmICghaXNTZWFsZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHBlcmZvcm0gdGhpcyAiCisgICAgICAgICAgICAgICAgICAgICsgImFjdGlvbiBvbiBhIG5vdCBzZWFsZWQgaW5zdGFuY2UuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmZvcmNlcyB0aGF0IHRoaXMgaW5zdGFuY2UgaXMgbm90IHNlYWxlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIElmIHRoaXMgaW5zdGFuY2UgaXMgc2VhbGVkLgorICAgICAqLworICAgIHZvaWQgZW5mb3JjZU5vdFNlYWxlZCgpIHsKKyAgICAgICAgaWYgKGlzU2VhbGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBwZXJmb3JtIHRoaXMgIgorICAgICAgICAgICAgICAgICAgICArICJhY3Rpb24gb24gYW4gc2VhbGVkIGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBib29sZWFuIHByb3BlcnR5LgogICAgICAqCiAgICAgICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eS4KICAgICAgKiBAcmV0dXJuIFRoZSB2YWx1ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuUHJvcGVydHkoaW50IHByb3BlcnR5KSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShpbnQgcHJvcGVydHkpIHsKICAgICAgICAgcmV0dXJuIChtQm9vbGVhblByb3BlcnRpZXMgJiBwcm9wZXJ0eSkgPT0gcHJvcGVydHk7CiAgICAgfQogCkBAIC0zMzcsNiArNTE0LDE5IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgY2FjaGVkIGluc3RhbmNlIGlmIHN1Y2ggaXMgYXZhaWxhYmxlIG9yIGEgbmV3IG9uZSBpcworICAgICAqIGluc3RhbnRpYXRlZC4gVGhlIGluc3RhbmNlIGlzIGluaXRpYWxpemVkIHdpdGggZGF0YSBmcm9tIHRoZQorICAgICAqIGdpdmVuIHJlY29yZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NpYmlsaXR5UmVjb3JkIG9idGFpbihBY2Nlc3NpYmlsaXR5UmVjb3JkIHJlY29yZCkgeworICAgICAgIEFjY2Vzc2liaWxpdHlSZWNvcmQgY2xvbmUgPSBBY2Nlc3NpYmlsaXR5UmVjb3JkLm9idGFpbigpOworICAgICAgIGNsb25lLmluaXQocmVjb3JkKTsKKyAgICAgICByZXR1cm4gY2xvbmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNhY2hlZCBpbnN0YW5jZSBpZiBzdWNoIGlzIGF2YWlsYWJsZSBvciBhIG5ldyBvbmUgaXMKICAgICAgKiBpbnN0YW50aWF0ZWQuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlLgpAQCAtMzgwLDcgKzU3MCw4IEBACiAgICAgLyoqCiAgICAgICogQ2xlYXJzIHRoZSBzdGF0ZSBvZiB0aGlzIGluc3RhbmNlLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsZWFyKCkgeworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1TZWFsZWQgPSBmYWxzZTsKICAgICAgICAgbUJvb2xlYW5Qcm9wZXJ0aWVzID0gMDsKICAgICAgICAgbUN1cnJlbnRJdGVtSW5kZXggPSBJTlZBTElEX1BPU0lUSU9OOwogICAgICAgICBtSXRlbUNvdW50ID0gMDsKQEAgLTM5Miw2ICs1ODMsOCBAQAogICAgICAgICBtQmVmb3JlVGV4dCA9IG51bGw7CiAgICAgICAgIG1QYXJjZWxhYmxlRGF0YSA9IG51bGw7CiAgICAgICAgIG1UZXh0LmNsZWFyKCk7CisgICAgICAgIG1Tb3VyY2VWaWV3SWQgPSBWaWV3Lk5PX0lEOworICAgICAgICBtU291cmNlV2luZG93SWQgPSBWaWV3Lk5PX0lEOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUxODZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uLmFpZGwKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHk7CisKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjazsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZQorICogYW5kIHRoZSBWaWV3Um9vdCBpbiBhIGdpdmVuIHdpbmRvdy4KKyAqCisgKiBAaGlkZQorICovCitvbmV3YXkgaW50ZXJmYWNlIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIHsKKworICAgIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKGludCBhY2Nlc3NpYmlsaXR5Vmlld0lkLCBpbnQgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICB2b2lkIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZChpbnQgaWQsIGludCBpbnRlcmFjdGlvbklkLAorICAgICAgICBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIHZvaWQgZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0KFN0cmluZyB0ZXh0LCBpbnQgYWNjZXNzaWJpbGl0eVZpZXdJZCwKKyAgICAgICAgaW50IGludGVyYWN0aW9uSWQsIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spOworCisgICAgdm9pZCBwZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihpbnQgYWNjZXNzaWJpbGl0eUlkLCBpbnQgYWN0aW9uLCBpbnQgaW50ZXJhY3Rpb25JZCwKKyAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjayk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjay5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzVlOGRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eTsKKworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBDYWxsYmFjayBmb3Igc3BlY2lmeWluZyB0aGUgcmVzdWx0IGZvciBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCBtYWRlCisgKiB2aWEgY2FsbGluZyBhIG1ldGhvZCBvbiBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrLgorICoKKyAqIEBoaWRlCisgKi8KK29uZXdheSBpbnRlcmZhY2UgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjayB7CisKKyAgICB2b2lkIHNldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQoaW4gQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8sIGludCBpbnRlcmFjdGlvbklkKTsKKworICAgIHZvaWQgc2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQoaW4gTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGluZm9zLAorICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCk7CisKKyAgICB2b2lkIHNldFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0KGJvb2xlYW4gc3VjY2VlZGVkLCBpbnQgaW50ZXJhY3Rpb25JZCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFpZGwKaW5kZXggYWFhYWUzMi4uYjE0ZjAyYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0lBY2Nlc3NpYmlsaXR5TWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9JQWNjZXNzaWJpbGl0eU1hbmFnZXIuYWlkbApAQCAtMTcsOSArMTcsMTQgQEAKIAogcGFja2FnZSBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eTsKIAoraW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworaW1wb3J0IGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLklFdmVudExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvdzsKIAogLyoqCiAgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSBjYWxsZWQgYnkKQEAgLTMzLDkgKzM4LDE2IEBACiAKICAgICBib29sZWFuIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoaW4gQWNjZXNzaWJpbGl0eUV2ZW50IHVpRXZlbnQpOwogCi0gICAgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisgICAgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpOwogCi0gICAgTGlzdDxTZXJ2aWNlSW5mbz4gZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdChpbnQgZmVlZGJhY2tUeXBlKTsKKyAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdChpbnQgZmVlZGJhY2tUeXBlKTsKIAogICAgIHZvaWQgaW50ZXJydXB0KCk7CisKKyAgICBpbnQgYWRkQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuLAorICAgICAgICBpbiBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKKworICAgIHZvaWQgcmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuKTsKKworICAgIElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gcmVnaXN0ZXJFdmVudExpc3RlbmVyKElFdmVudExpc3RlbmVyIGNsaWVudCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZEluZm8uamF2YQppbmRleCAxZjc0NDFkLi40ZWM0ZmY5IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kSW5mby5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RJbmZvLmphdmEKQEAgLTIzLDkgKzIzLDkgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKQEAgLTM4LDYgKzM4LDggQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYW4gaW5wdXQgbWV0aG9kLgpAQCAtNzcsMTMgKzc5LDI4IEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IGluIHdoaWNoIHdlIGFyZSBwYXJzaW5nIHRoZSBpbnB1dCBtZXRob2QuCiAgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFJlc29sdmVJbmZvIHJldHVybmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlciBhYm91dAogICAgICAqIHRoaXMgaW5wdXQgbWV0aG9kJ3MgY29tcG9uZW50LgogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dE1ldGhvZEluZm8oQ29udGV4dCBjb250ZXh0LCBSZXNvbHZlSW5mbyBzZXJ2aWNlKQogICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBzZXJ2aWNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBDb250ZXh0IGluIHdoaWNoIHdlIGFyZSBwYXJzaW5nIHRoZSBpbnB1dCBtZXRob2QuCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIFJlc29sdmVJbmZvIHJldHVybmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlciBhYm91dAorICAgICAqIHRoaXMgaW5wdXQgbWV0aG9kJ3MgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBhZGRpdGlvbmFsU3VidHlwZXMgYWRkaXRpb25hbCBzdWJ0eXBlcyBiZWluZyBhZGRlZCB0byB0aGlzIElucHV0TWV0aG9kSW5mbworICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIElucHV0TWV0aG9kSW5mbyhDb250ZXh0IGNvbnRleHQsIFJlc29sdmVJbmZvIHNlcnZpY2UsCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PElucHV0TWV0aG9kU3VidHlwZT4+IGFkZGl0aW9uYWxTdWJ0eXBlc01hcCkKKyAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIG1TZXJ2aWNlID0gc2VydmljZTsKICAgICAgICAgU2VydmljZUluZm8gc2kgPSBzZXJ2aWNlLnNlcnZpY2VJbmZvOwogICAgICAgICBtSWQgPSBuZXcgQ29tcG9uZW50TmFtZShzaS5wYWNrYWdlTmFtZSwgc2kubmFtZSkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKQEAgLTE0NSw3ICsxNjIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0U3RyaW5nKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlTW9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5JbnB1dE1ldGhvZF9TdWJ0eXBlX2ltZVN1YnR5cGVFeHRyYVZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pbWVTdWJ0eXBlRXh0cmFWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nZXRCb29sZWFuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuSW5wdXRNZXRob2RfU3VidHlwZV9pc0F1eGlsaWFyeSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTUsNiArMTc0LDE3IEBACiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxTdWJ0eXBlc01hcCAhPSBudWxsICYmIGFkZGl0aW9uYWxTdWJ0eXBlc01hcC5jb250YWluc0tleShtSWQpKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PElucHV0TWV0aG9kU3VidHlwZT4gYWRkaXRpb25hbFN1YnR5cGVzID0gYWRkaXRpb25hbFN1YnR5cGVzTWFwLmdldChtSWQpOworICAgICAgICAgICAgZmluYWwgaW50IE4gPSBhZGRpdGlvbmFsU3VidHlwZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSA9IGFkZGl0aW9uYWxTdWJ0eXBlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFtU3VidHlwZXMuY29udGFpbnMoc3VidHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN1YnR5cGVzLmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgbVNldHRpbmdzQWN0aXZpdHlOYW1lID0gc2V0dGluZ3NBY3Rpdml0eUNvbXBvbmVudDsKICAgICAgICAgbUlzRGVmYXVsdFJlc0lkID0gaXNEZWZhdWx0UmVzSWQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RNYW5hZ2VyLmphdmEKaW5kZXggZWE2NmQ2Ny4uNDdmNWU0YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZE1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kTWFuYWdlci5qYXZhCkBAIC0xMDI0LDEzICsxMDI0LDEzIEBACiAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJTVEFSVCBJTlBVVDogIiArIHZpZXcgKyAiIGljPSIKICAgICAgICAgICAgICAgICAgICAgICAgICsgaWMgKyAiIHRiYT0iICsgdGJhICsgIiBpbml0aWFsPSIgKyBpbml0aWFsKTsKICAgICAgICAgICAgICAgICBJbnB1dEJpbmRSZXN1bHQgcmVzID0gbVNlcnZpY2Uuc3RhcnRJbnB1dChtQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVkQ29udGV4dCwgdGJhLCBpbml0aWFsLCBtQ3VyTWV0aG9kID09IG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVkQ29udGV4dCwgdGJhLCBpbml0aWFsLCB0cnVlKTsKICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlN0YXJ0aW5nIGlucHV0OiBCaW5kIHJlc3VsdD0iICsgcmVzKTsKICAgICAgICAgICAgICAgICBpZiAocmVzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5pZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQmluZFNlcXVlbmNlID0gcmVzLnNlcXVlbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgbUN1ck1ldGhvZCA9IHJlcy5tZXRob2Q7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUN1ck1ldGhvZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoZXJlIGlzIG5vIGlucHV0IG1ldGhvZCBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFCT1JUIGlucHV0OiBubyBpbnB1dCBtZXRob2QhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTU4LDYgKzE1NTgsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNldCBhZGRpdGlvbmFsIGlucHV0IG1ldGhvZCBzdWJ0eXBlcy4KKyAgICAgKiBAcGFyYW0gaW1lVG9rZW4gU3VwcGxpZXMgdGhlIGlkZW50aWZ5aW5nIHRva2VuIGdpdmVuIHRvIGFuIGlucHV0IG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gc3VidHlwZXMgc3VidHlwZXMgd2lsbCBiZSBhZGRlZCBhcyBhZGRpdGlvbmFsIHN1YnR5cGVzIG9mIHRoZSBjdXJyZW50IGlucHV0IG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFkZGl0aW9uYWwgaW5wdXQgbWV0aG9kIHN1YnR5cGVzIGFyZSBzdWNjZXNzZnVsbHkgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gc2V0QWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZXMoCisgICAgICAgICAgICBJQmluZGVyIGltZVRva2VuLCBJbnB1dE1ldGhvZFN1YnR5cGVbXSBzdWJ0eXBlcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1IKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmljZS5zZXRBZGRpdGlvbmFsSW5wdXRNZXRob2RTdWJ0eXBlcyhpbWVUb2tlbiwgc3VidHlwZXMpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJTUUgZGllZDogIiArIG1DdXJJZCwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIElucHV0TWV0aG9kU3VidHlwZSBnZXRMYXN0SW5wdXRNZXRob2RTdWJ0eXBlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1IKSB7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvaW5wdXRtZXRob2QvSW5wdXRNZXRob2RTdWJ0eXBlLmphdmEKaW5kZXggZGUzOGZiZS4uOWQ4NGMzZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9pbnB1dG1ldGhvZC9JbnB1dE1ldGhvZFN1YnR5cGUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L2lucHV0bWV0aG9kL0lucHV0TWV0aG9kU3VidHlwZS5qYXZhCkBAIC0xNyw4ICsxNywxMCBAQAogcGFja2FnZSBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2Q7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTI2LDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzcGVjaWZ5IG1ldGEgaW5mb3JtYXRpb24gb2YgYSBzdWJ0eXBlIGNvbnRhaW5lZCBpbiBhbiBpbnB1dCBtZXRob2QuCkBAIC01MiwxMCArNTUsMTEgQEAKICAgICAgKiBAcGFyYW0gbmFtZUlkIFRoZSBuYW1lIG9mIHRoZSBzdWJ0eXBlCiAgICAgICogQHBhcmFtIGljb25JZCBUaGUgaWNvbiBvZiB0aGUgc3VidHlwZQogICAgICAqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBzdXBwb3J0ZWQgYnkgdGhlIHN1YnR5cGUKLSAgICAgKiBAcGFyYW0gbW9kZUlkIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQorICAgICAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHN1cHBvcnRlZCBieSB0aGUgc3VidHlwZQogICAgICAqIEBwYXJhbSBleHRyYVZhbHVlIFRoZSBleHRyYSB2YWx1ZSBvZiB0aGUgc3VidHlwZQogICAgICAqLwotICAgIElucHV0TWV0aG9kU3VidHlwZShpbnQgbmFtZUlkLCBpbnQgaWNvbklkLCBTdHJpbmcgbG9jYWxlLCBTdHJpbmcgbW9kZSwgU3RyaW5nIGV4dHJhVmFsdWUpIHsKKyAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlKAorICAgICAgICAgICAgaW50IG5hbWVJZCwgaW50IGljb25JZCwgU3RyaW5nIGxvY2FsZSwgU3RyaW5nIG1vZGUsIFN0cmluZyBleHRyYVZhbHVlKSB7CiAgICAgICAgIHRoaXMobmFtZUlkLCBpY29uSWQsIGxvY2FsZSwgbW9kZSwgZXh0cmFWYWx1ZSwgZmFsc2UpOwogICAgIH0KIApAQCAtNjQsMTkgKzY4LDIwIEBACiAgICAgICogQHBhcmFtIG5hbWVJZCBUaGUgbmFtZSBvZiB0aGUgc3VidHlwZQogICAgICAqIEBwYXJhbSBpY29uSWQgVGhlIGljb24gb2YgdGhlIHN1YnR5cGUKICAgICAgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3VwcG9ydGVkIGJ5IHRoZSBzdWJ0eXBlCi0gICAgICogQHBhcmFtIG1vZGVJZCBUaGUgbW9kZSBzdXBwb3J0ZWQgYnkgdGhlIHN1YnR5cGUKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbW9kZSBzdXBwb3J0ZWQgYnkgdGhlIHN1YnR5cGUKICAgICAgKiBAcGFyYW0gZXh0cmFWYWx1ZSBUaGUgZXh0cmEgdmFsdWUgb2YgdGhlIHN1YnR5cGUKICAgICAgKiBAcGFyYW0gaXNBdXhpbGlhcnkgdHJ1ZSB3aGVuIHRoaXMgc3VidHlwZSBpcyBvbmUgc2hvdCBzdWJ0eXBlLgogICAgICAqLwotICAgIElucHV0TWV0aG9kU3VidHlwZShpbnQgbmFtZUlkLCBpbnQgaWNvbklkLCBTdHJpbmcgbG9jYWxlLCBTdHJpbmcgbW9kZSwgU3RyaW5nIGV4dHJhVmFsdWUsCisgICAgcHVibGljIElucHV0TWV0aG9kU3VidHlwZShpbnQgbmFtZUlkLCBpbnQgaWNvbklkLCBTdHJpbmcgbG9jYWxlLCBTdHJpbmcgbW9kZSwgU3RyaW5nIGV4dHJhVmFsdWUsCiAgICAgICAgICAgICBib29sZWFuIGlzQXV4aWxpYXJ5KSB7CiAgICAgICAgIG1TdWJ0eXBlTmFtZVJlc0lkID0gbmFtZUlkOwogICAgICAgICBtU3VidHlwZUljb25SZXNJZCA9IGljb25JZDsKICAgICAgICAgbVN1YnR5cGVMb2NhbGUgPSBsb2NhbGUgIT0gbnVsbCA/IGxvY2FsZSA6ICIiOwogICAgICAgICBtU3VidHlwZU1vZGUgPSBtb2RlICE9IG51bGwgPyBtb2RlIDogIiI7CiAgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IGV4dHJhVmFsdWUgIT0gbnVsbCA/IGV4dHJhVmFsdWUgOiAiIjsKLSAgICAgICAgbVN1YnR5cGVIYXNoQ29kZSA9IGhhc2hDb2RlSW50ZXJuYWwobVN1YnR5cGVMb2NhbGUsIG1TdWJ0eXBlTW9kZSwgbVN1YnR5cGVFeHRyYVZhbHVlKTsKICAgICAgICAgbUlzQXV4aWxpYXJ5ID0gaXNBdXhpbGlhcnk7CisgICAgICAgIG1TdWJ0eXBlSGFzaENvZGUgPSBoYXNoQ29kZUludGVybmFsKG1TdWJ0eXBlTG9jYWxlLCBtU3VidHlwZU1vZGUsIG1TdWJ0eXBlRXh0cmFWYWx1ZSwKKyAgICAgICAgICAgICAgICBtSXNBdXhpbGlhcnkpOwogICAgIH0KIAogICAgIElucHV0TWV0aG9kU3VidHlwZShQYXJjZWwgc291cmNlKSB7CkBAIC04OSw4ICs5NCw5IEBACiAgICAgICAgIG1TdWJ0eXBlTW9kZSA9IHMgIT0gbnVsbCA/IHMgOiAiIjsKICAgICAgICAgcyA9IHNvdXJjZS5yZWFkU3RyaW5nKCk7CiAgICAgICAgIG1TdWJ0eXBlRXh0cmFWYWx1ZSA9IHMgIT0gbnVsbCA/IHMgOiAiIjsKLSAgICAgICAgbVN1YnR5cGVIYXNoQ29kZSA9IGhhc2hDb2RlSW50ZXJuYWwobVN1YnR5cGVMb2NhbGUsIG1TdWJ0eXBlTW9kZSwgbVN1YnR5cGVFeHRyYVZhbHVlKTsKICAgICAgICAgbUlzQXV4aWxpYXJ5ID0gKHNvdXJjZS5yZWFkSW50KCkgPT0gMSk7CisgICAgICAgIG1TdWJ0eXBlSGFzaENvZGUgPSBoYXNoQ29kZUludGVybmFsKG1TdWJ0eXBlTG9jYWxlLCBtU3VidHlwZU1vZGUsIG1TdWJ0eXBlRXh0cmFWYWx1ZSwKKyAgICAgICAgICAgICAgICBtSXNBdXhpbGlhcnkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM3LDYgKzE0MywzMiBAQAogICAgICAgICByZXR1cm4gbUlzQXV4aWxpYXJ5OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2lsbCBiZSB1c2VkIGZvciBnZXR0aW5nIExvY2FsZSBhbmQgUGFja2FnZU1hbmFnZXIuCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIElNRQorICAgICAqIEBwYXJhbSBhcHBJbmZvIFRoZSBhcHBsaWNhdGlvbiBpbmZvIG9mIHRoZSBJTUUKKyAgICAgKiBAcmV0dXJuIGEgZGlzcGxheSBuYW1lIGZvciB0aGlzIHN1YnR5cGUuIFRoZSBzdHJpbmcgcmVzb3VyY2Ugb2YgdGhlIGxhYmVsIChtU3VidHlwZU5hbWVSZXNJZCkKKyAgICAgKiBjYW4gaGF2ZSBvbmx5IG9uZSAlcyBpbiBpdC4gSWYgdGhlcmUgaXMsIHRoZSAlcyBwYXJ0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbG9jYWxlJ3MKKyAgICAgKiBkaXNwbGF5IG5hbWUgYnkgdGhlIGZvcm1hdHRlci4gSWYgdGhlcmUgaXMgbm90LCB0aGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgc3RyaW5nCisgICAgICogc3BlY2lmaWVkIGJ5IG1TdWJ0eXBlTmFtZVJlc0lkLiBJZiBtU3VidHlwZU5hbWVSZXNJZCBpcyBub3Qgc3BlY2lmaWVkICg9PSAwKSwgaXQncyB1cCB0byB0aGUKKyAgICAgKiBmcmFtZXdvcmsgdG8gZ2VuZXJhdGUgYW4gYXBwcm9wcmlhdGUgZGlzcGxheSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGlzcGxheU5hbWUoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFN0cmluZyBwYWNrYWdlTmFtZSwgQXBwbGljYXRpb25JbmZvIGFwcEluZm8pIHsKKyAgICAgICAgZmluYWwgTG9jYWxlIGxvY2FsZSA9IGNvbnN0cnVjdExvY2FsZUZyb21TdHJpbmcobVN1YnR5cGVMb2NhbGUpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxlU3RyID0gbG9jYWxlICE9IG51bGwgPyBsb2NhbGUuZ2V0RGlzcGxheU5hbWUoKSA6IG1TdWJ0eXBlTG9jYWxlOworICAgICAgICBpZiAobVN1YnR5cGVOYW1lUmVzSWQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGxvY2FsZVN0cjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgc3VidHlwZU5hbWUgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0VGV4dCgKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgbVN1YnR5cGVOYW1lUmVzSWQsIGFwcEluZm8pLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoc3VidHlwZU5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChzdWJ0eXBlTmFtZSwgbG9jYWxlU3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhbGVTdHI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEV4dHJhVmFsdWVIYXNoTWFwKCkgewogICAgICAgICBpZiAobUV4dHJhVmFsdWVIYXNoTWFwQ2FjaGUgPT0gbnVsbCkgewogICAgICAgICAgICAgbUV4dHJhVmFsdWVIYXNoTWFwQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKQEAgLTE5MSw3ICsyMjMsOCBAQAogICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmdldE1vZGUoKS5lcXVhbHMoZ2V0TW9kZSgpKSkKICAgICAgICAgICAgICAgICAmJiAoc3VidHlwZS5nZXRJY29uUmVzSWQoKSA9PSBnZXRJY29uUmVzSWQoKSkKICAgICAgICAgICAgICAgICAmJiAoc3VidHlwZS5nZXRMb2NhbGUoKS5lcXVhbHMoZ2V0TG9jYWxlKCkpKQotICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmdldEV4dHJhVmFsdWUoKS5lcXVhbHMoZ2V0RXh0cmFWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgJiYgKHN1YnR5cGUuZ2V0RXh0cmFWYWx1ZSgpLmVxdWFscyhnZXRFeHRyYVZhbHVlKCkpKQorICAgICAgICAgICAgICAgICYmIChzdWJ0eXBlLmlzQXV4aWxpYXJ5KCkgPT0gaXNBdXhpbGlhcnkoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTIyNCw4ICsyNTcsMjUgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaENvZGVJbnRlcm5hbChTdHJpbmcgbG9jYWxlLCBTdHJpbmcgbW9kZSwgU3RyaW5nIGV4dHJhVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5oYXNoQ29kZShuZXcgT2JqZWN0W10ge2xvY2FsZSwgbW9kZSwgZXh0cmFWYWx1ZX0pOworICAgIHByaXZhdGUgc3RhdGljIExvY2FsZSBjb25zdHJ1Y3RMb2NhbGVGcm9tU3RyaW5nKFN0cmluZyBsb2NhbGVTdHIpIHsKKyAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGxvY2FsZVN0cikpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nW10gbG9jYWxlUGFyYW1zID0gbG9jYWxlU3RyLnNwbGl0KCJfIiwgMyk7CisgICAgICAgIC8vIFRoZSBsZW5ndGggb2YgbG9jYWxlU3RyIGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiBhIDEgPD0gdmFsdWUgPD0gMworICAgICAgICAvLyBiZWNhdXNlIGxvY2FsZVN0ciBpcyBub3QgZW1wdHkuCisgICAgICAgIGlmIChsb2NhbGVQYXJhbXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxlKGxvY2FsZVBhcmFtc1swXSk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlUGFyYW1zLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsZShsb2NhbGVQYXJhbXNbMF0sIGxvY2FsZVBhcmFtc1sxXSk7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWxlUGFyYW1zLmxlbmd0aCA9PSAzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsZShsb2NhbGVQYXJhbXNbMF0sIGxvY2FsZVBhcmFtc1sxXSwgbG9jYWxlUGFyYW1zWzJdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaGFzaENvZGVJbnRlcm5hbChTdHJpbmcgbG9jYWxlLCBTdHJpbmcgbW9kZSwgU3RyaW5nIGV4dHJhVmFsdWUsCisgICAgICAgICAgICBib29sZWFuIGlzQXV4aWxpYXJ5KSB7CisgICAgICAgIHJldHVybiBBcnJheXMuaGFzaENvZGUobmV3IE9iamVjdFtdIHtsb2NhbGUsIG1vZGUsIGV4dHJhVmFsdWUsIGlzQXV4aWxpYXJ5fSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQnJvd3NlckZyYW1lLmphdmEKaW5kZXggOWYyZmQxMi4uMmY0Nzc0ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0Jyb3dzZXJGcmFtZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Ccm93c2VyRnJhbWUuamF2YQpAQCAtNDQsNiArNDQsOSBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0czsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMTE0MSw3ICsxMTQ0LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgSk5JIHdoZW4gdGhlIG5hdGl2ZSBIVFRQKFMpIHN0YWNrIGdldHMgYW4gaW52YWxpZCBjZXJ0IGNoYWluLgorICAgICAqIENhbGxlZCBieSBKTkkgd2hlbiB0aGUgbmF0aXZlIEhUVFBTIHN0YWNrIGdldHMgYW4gaW52YWxpZCBjZXJ0IGNoYWluLgogICAgICAqCiAgICAgICogV2UgZGVsZWdhdGUgdGhlIHJlcXVlc3QgdG8gQ2FsbGJhY2tQcm94eSwgYW5kIHJvdXRlIGl0cyByZXNwb25zZSB0bwogICAgICAqIHtAbGluayAjbmF0aXZlU3NsQ2VydEVycm9yUHJvY2VlZChpbnQpfSBvcgpAQCAtMTE4Miw2ICsxMTg1LDMyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IEpOSSB3aGVuIHRoZSBuYXRpdmUgSFRUUFMgc3RhY2sgZ2V0cyBhIGNsaWVudAorICAgICAqIGNlcnRpZmljYXRlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBXZSBkZWxlZ2F0ZSB0aGUgcmVxdWVzdCB0byBDYWxsYmFja1Byb3h5LCBhbmQgcm91dGUgaXRzIHJlc3BvbnNlIHRvCisgICAgICoge0BsaW5rICNuYXRpdmVTc2xDbGllbnRDZXJ0KGludCwgWDUwOUNlcnRpZmljYXRlKX0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RDbGllbnRDZXJ0KGludCBoYW5kbGUsIGJ5dGVbXSBob3N0X2FuZF9wb3J0X2J5dGVzKSB7CisgICAgICAgIFN0cmluZyBob3N0X2FuZF9wb3J0ID0gbmV3IFN0cmluZyhob3N0X2FuZF9wb3J0X2J5dGVzLCBDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgIFNzbENsaWVudENlcnRMb29rdXBUYWJsZSB0YWJsZSA9IFNzbENsaWVudENlcnRMb29rdXBUYWJsZS5nZXRJbnN0YW5jZSgpOworICAgICAgICBpZiAodGFibGUuSXNBbGxvd2VkKGhvc3RfYW5kX3BvcnQpKSB7CisgICAgICAgICAgICAvLyBwcmV2aW91c2x5IGFsbG93ZWQKKyAgICAgICAgICAgIG5hdGl2ZVNzbENsaWVudENlcnQoaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5Qcml2YXRlS2V5KGhvc3RfYW5kX3BvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5DZXJ0aWZpY2F0ZUNoYWluKGhvc3RfYW5kX3BvcnQpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWJsZS5Jc0RlbmllZChob3N0X2FuZF9wb3J0KSkgeworICAgICAgICAgICAgLy8gcHJldmlvdXNseSBkZW5pZWQKKyAgICAgICAgICAgIG5hdGl2ZVNzbENsaWVudENlcnQoaGFuZGxlLCBudWxsLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgaWdub3JlZCBvciBuZXcKKyAgICAgICAgICAgIG1DYWxsYmFja1Byb3h5Lm9uUmVjZWl2ZWRDbGllbnRDZXJ0UmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsaWVudENlcnRSZXF1ZXN0SGFuZGxlcih0aGlzLCBoYW5kbGUsIGhvc3RfYW5kX3BvcnQsIHRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgaG9zdF9hbmRfcG9ydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgSk5JIHdoZW4gdGhlIG5hdGl2ZSBIVFRQIHN0YWNrIG5lZWRzIHRvIGRvd25sb2FkIGEgZmlsZS4KICAgICAgKgogICAgICAqIFdlIGRlbGVnYXRlIHRoZSByZXF1ZXN0IHRvIENhbGxiYWNrUHJveHksIHdoaWNoIG93bnMgdGhlIGN1cnJlbnQgYXBwJ3MKQEAgLTEzNjYsNCArMTM5NSw4IEBACiAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNzbENlcnRFcnJvclByb2NlZWQoaW50IGhhbmRsZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVTc2xDZXJ0RXJyb3JDYW5jZWwoaW50IGhhbmRsZSwgaW50IGNlcnRfZXJyb3IpOworCisgICAgbmF0aXZlIHZvaWQgbmF0aXZlU3NsQ2xpZW50Q2VydChpbnQgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIHBrY3M4RW5jb2RlZFByaXZhdGVLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW11bXSBhc24xRGVyRW5jb2RlZENlcnRpZmljYXRlQ2hhaW4pOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9DYWxsYmFja1Byb3h5LmphdmEKaW5kZXggMjNmZDEyZC4uZjdkNTVmNiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NhbGxiYWNrUHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2FsbGJhY2tQcm94eS5qYXZhCkBAIC0xMTgsNiArMTE4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUX0lOU1RBTExBQkxFX1dFQkFQUCAgICAgICAgICAgICAgPSAxMzg7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVElGWV9TRUFSQ0hCT1hfTElTVEVORVJTICAgICAgICAgID0gMTM5OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVVRPX0xPR0lOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE0MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX0NFUlRfUkVRVUVTVCAgICAgICAgICAgICAgICAgPSAxNDE7CiAKICAgICAvLyBNZXNzYWdlIHRyaWdnZXJlZCBieSB0aGUgY2xpZW50IHRvIHJlc3VtZSBleGVjdXRpb24KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USUZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyMDA7CkBAIC0yNzMsNyArMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVdlYlZpZXdDbGllbnQub25QYWdlRmluaXNoZWQobVdlYlZpZXcsIGZpbmlzaGVkVXJsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgIGNhc2UgUkVDRUlWRURfSUNPTjoKICAgICAgICAgICAgICAgICBpZiAobVdlYkNocm9tZUNsaWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1XZWJDaHJvbWVDbGllbnQub25SZWNlaXZlZEljb24obVdlYlZpZXcsIChCaXRtYXApIG1zZy5vYmopOwpAQCAtMzQwLDcgKzM0MSw3IEBACiAKICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SOgogICAgICAgICAgICAgICAgIGlmIChtV2ViVmlld0NsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IAorICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgKEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KSBtc2cub2JqOwogICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NsaWVudC5vblJlY2VpdmVkU3NsRXJyb3IobVdlYlZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNzbEVycm9ySGFuZGxlcikgbWFwLmdldCgiaGFuZGxlciIpLApAQCAtMzQ4LDYgKzM0OSwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICAgICAgY2FzZSBDTElFTlRfQ0VSVF9SRVFVRVNUOgorICAgICAgICAgICAgICAgIGlmIChtV2ViVmlld0NsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4pIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q2xpZW50Lm9uUmVjZWl2ZWRDbGllbnRDZXJ0UmVxdWVzdChtV2ViVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ2xpZW50Q2VydFJlcXVlc3RIYW5kbGVyKSBtYXAuZ2V0KCJoYW5kbGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgbWFwLmdldCgiaG9zdF9hbmRfcG9ydCIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgUFJPR1JFU1M6CiAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgdG8gZW5zdXJlIG1MYXRlc3RQcm9ncmVzcyBpcyBub3QgbW9kaWZpZWQgYWZ0ZXIKICAgICAgICAgICAgICAgICAvLyBzZXRQcm9ncmVzcyBpcyBjYWxsZWQgYW5kIGJlZm9yZSBtUHJvZ3Jlc3NVcGRhdGVQZW5kaW5nIGlzCkBAIC01NDMsMTQgKzU1NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIobUNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShnZXRKc0RpYWxvZ1RpdGxlKHVybCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXNzYWdlKG1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5vaywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQb3NpdGl2ZUJ1dHRvbihSLnN0cmluZy5vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aGljaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNvbmZpcm0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROZWdhdGl2ZUJ1dHRvbihSLnN0cmluZy5jYW5jZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuY2FuY2VsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWxvZ0ludGVyZmFjZSBkaWFsb2csCkBAIC05MDQsNyArOTE1LDcgQEAKICAgICAgICAgaWYgKFBFUkZfUFJPQkUpIHsKICAgICAgICAgICAgIC8vIHVuLWNvbW1lbnQgdGhpcyBpZiBQRVJGX1BST0JFIGlzIHRydWUKIC8vICAgICAgICAgICAgTG9vcGVyLm15UXVldWUoKS5zZXRXYWl0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICBMb2cuZCgiV2ViQ29yZSIsICJXZWJDb3JlIHRocmVhZCB1c2VkICIgKyAKKyAgICAgICAgICAgIExvZy5kKCJXZWJDb3JlIiwgIldlYkNvcmUgdGhyZWFkIHVzZWQgIiArCiAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW1DbG9jay5jdXJyZW50VGhyZWFkVGltZU1pbGxpcygpIC0gbVdlYkNvcmVUaHJlYWRUaW1lKQogICAgICAgICAgICAgICAgICAgICArICIgbXMgYW5kIGlkbGVkICIgKyBtV2ViQ29yZUlkbGVUaW1lICsgIiBtcyIpOwogICAgICAgICAgICAgTmV0d29yay5nZXRJbnN0YW5jZShtQ29udGV4dCkuc3RvcFRpbWluZygpOwpAQCAtOTM0LDcgKzk0NSw3IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25Gb3JtUmVzdWJtaXNzaW9uKE1lc3NhZ2UgZG9udFJlc2VuZCwgCisgICAgcHVibGljIHZvaWQgb25Gb3JtUmVzdWJtaXNzaW9uKE1lc3NhZ2UgZG9udFJlc2VuZCwKICAgICAgICAgICAgIE1lc3NhZ2UgcmVzZW5kKSB7CiAgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCiAgICAgICAgIC8vIGJlZW4gc2V0LgpAQCAtOTk4LDcgKzEwMDksNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShTU0xfRVJST1IpOwotICAgICAgICAvLywgaGFuZGxlcik7CiAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgIG1hcC5wdXQoImhhbmRsZXIiLCBoYW5kbGVyKTsKICAgICAgICAgbWFwLnB1dCgiZXJyb3IiLCBlcnJvcik7CkBAIC0xMDA2LDYgKzEwMTYsMjMgQEAKICAgICAgICAgc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmVkQ2xpZW50Q2VydFJlcXVlc3QoQ2xpZW50Q2VydFJlcXVlc3RIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBob3N0X2FuZF9wb3J0KSB7CisgICAgICAgIC8vIERvIGFuIHVuc3luY2hyb25pemVkIHF1aWNrIGNoZWNrIHRvIGF2b2lkIHBvc3RpbmcgaWYgbm8gY2FsbGJhY2sgaGFzCisgICAgICAgIC8vIGJlZW4gc2V0LgorICAgICAgICBpZiAobVdlYlZpZXdDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgaGFuZGxlci5jYW5jZWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoQ0xJRU5UX0NFUlRfUkVRVUVTVCk7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIG1hcC5wdXQoImhhbmRsZXIiLCBoYW5kbGVyKTsKKyAgICAgICAgbWFwLnB1dCgiaG9zdF9hbmRfcG9ydCIsIGhvc3RfYW5kX3BvcnQpOworICAgICAgICBtc2cub2JqID0gbWFwOworICAgICAgICBzZW5kTWVzc2FnZShtc2cpOworICAgIH0KKyAgICAvKioKICAgICAgKiBAaGlkZSAtIGhpZGUgdGhpcyBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgcGFyYW1ldGVyIG9mIHR5cGUgU3NsQ2VydGlmaWNhdGUsCiAgICAgICogd2hpY2ggaXMgbG9jYXRlZCBpbiBhIGhpZGRlbiBwYWNrYWdlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NsaWVudENlcnRSZXF1ZXN0SGFuZGxlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0NsaWVudENlcnRSZXF1ZXN0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzFlN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvQ2xpZW50Q2VydFJlcXVlc3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhcm1vbnkueG5ldC5wcm92aWRlci5qc3NlLk5hdGl2ZUNyeXB0bzsKKworLyoqCisgKiBDbGllbnRDZXJ0UmVxdWVzdEhhbmRsZXI6IGNsYXNzIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBjbGllbnQKKyAqIGNlcnRpZmljYXRlIHJlcXVlc3RzLiAgVGhpcyBjbGFzcyBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8KKyAqIEJyb3dzZXJDYWxsYmFjay5kaXNwbGF5Q2xpZW50Q2VydFJlcXVlc3REaWFsb2cgYW5kIGlzIG1lYW50IHRvCisgKiByZWNlaXZlIHRoZSB1c2VyJ3MgcmVzcG9uc2UuCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsaWVudENlcnRSZXF1ZXN0SGFuZGxlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEJyb3dzZXJGcmFtZSBtQnJvd3NlckZyYW1lOworICAgIHByaXZhdGUgZmluYWwgaW50IG1IYW5kbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUhvc3RBbmRQb3J0OworICAgIHByaXZhdGUgZmluYWwgU3NsQ2xpZW50Q2VydExvb2t1cFRhYmxlIG1UYWJsZTsKKyAgICBDbGllbnRDZXJ0UmVxdWVzdEhhbmRsZXIoQnJvd3NlckZyYW1lIGJyb3dzZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RfYW5kX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbENsaWVudENlcnRMb29rdXBUYWJsZSB0YWJsZSkgeworICAgICAgICBtQnJvd3NlckZyYW1lID0gYnJvd3NlckZyYW1lOworICAgICAgICBtSGFuZGxlID0gaGFuZGxlOworICAgICAgICBtSG9zdEFuZFBvcnQgPSBob3N0X2FuZF9wb3J0OworICAgICAgICBtVGFibGUgPSB0YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZWVkIHdpdGggdGhlIHNwZWNpZmllZCBwcml2YXRlIGtleSBhbmQgY2xpZW50IGNlcnRpZmljYXRlIGNoYWluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoUHJpdmF0ZUtleSBwcml2YXRlS2V5LCBYNTA5Q2VydGlmaWNhdGVbXSBjaGFpbikgeworICAgICAgICBieXRlW10gcHJpdmF0ZUtleUJ5dGVzID0gcHJpdmF0ZUtleS5nZXRFbmNvZGVkKCk7CisgICAgICAgIGJ5dGVbXVtdIGNoYWluQnl0ZXM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaGFpbkJ5dGVzID0gTmF0aXZlQ3J5cHRvLmVuY29kZUNlcnRpZmljYXRlcyhjaGFpbik7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbUJyb3dzZXJGcmFtZS5uYXRpdmVTc2xDbGllbnRDZXJ0KG1IYW5kbGUsIG51bGwsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1UYWJsZS5BbGxvdyhtSG9zdEFuZFBvcnQsIHByaXZhdGVLZXlCeXRlcywgY2hhaW5CeXRlcyk7CisgICAgICAgIG1Ccm93c2VyRnJhbWUubmF0aXZlU3NsQ2xpZW50Q2VydChtSGFuZGxlLCBwcml2YXRlS2V5Qnl0ZXMsIGNoYWluQnl0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElnb3JlIHRoZSByZXF1ZXN0IGZvciBub3csIHRoZSB1c2VyIG1heSBiZSBwcm9tcHRlZCBhZ2Fpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpZ25vcmUoKSB7CisgICAgICAgIG1Ccm93c2VyRnJhbWUubmF0aXZlU3NsQ2xpZW50Q2VydChtSGFuZGxlLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgdGhpcyByZXF1ZXN0LCByZW1lbWJlciB0aGUgdXNlcnMgbmVnYXRpdmUgY2hvaWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgbVRhYmxlLkRlbnkobUhvc3RBbmRQb3J0KTsKKyAgICAgICAgbUJyb3dzZXJGcmFtZS5uYXRpdmVTc2xDbGllbnRDZXJ0KG1IYW5kbGUsIG51bGwsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvRnVsbFNjcmVlbi5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9GdWxsU2NyZWVuLmphdmEKaW5kZXggMTAwNGI1Zi4uNGNhZTlkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9GdWxsU2NyZWVuLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9GdWxsU2NyZWVuLmphdmEKQEAgLTE5OSw2ICsxOTksOSBAQAogICAgICAgICBtVmlkZW9TdXJmYWNlVmlldy5nZXRIb2xkZXIoKS5zZXRGaXhlZFNpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZnVsbFNjcmVlbkV4aXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIChtTGF5b3V0ID09IG51bGwpOworICAgIH0KIAogICAgIHByaXZhdGUgZmluYWwgV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjayBtQ2FsbGJhY2sgPQogICAgICAgICBuZXcgV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjaygpIHsKQEAgLTI1MCwxOCArMjUzLDE5IEBACiAgICAgICAgIG1MYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwogCiAgICAgICAgIFdlYkNocm9tZUNsaWVudCBjbGllbnQgPSB3ZWJWaWV3LmdldFdlYkNocm9tZUNsaWVudCgpOwotICAgICAgICBjbGllbnQub25TaG93Q3VzdG9tVmlldyhtTGF5b3V0LCBtQ2FsbGJhY2spOwotICAgICAgICAvLyBQbHVnaW5zIGxpa2UgRmxhc2ggd2lsbCBkcmF3IG92ZXIgdGhlIHZpZGVvIHNvIGhpZGUKLSAgICAgICAgLy8gdGhlbSB3aGlsZSB3ZSdyZSBwbGF5aW5nLgotICAgICAgICBpZiAod2ViVmlldy5nZXRWaWV3TWFuYWdlcigpICE9IG51bGwpCi0gICAgICAgICAgICB3ZWJWaWV3LmdldFZpZXdNYW5hZ2VyKCkuaGlkZUFsbCgpOworICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsaWVudC5vblNob3dDdXN0b21WaWV3KG1MYXlvdXQsIG1DYWxsYmFjayk7CisgICAgICAgICAgICAvLyBQbHVnaW5zIGxpa2UgRmxhc2ggd2lsbCBkcmF3IG92ZXIgdGhlIHZpZGVvIHNvIGhpZGUKKyAgICAgICAgICAgIC8vIHRoZW0gd2hpbGUgd2UncmUgcGxheWluZy4KKyAgICAgICAgICAgIGlmICh3ZWJWaWV3LmdldFZpZXdNYW5hZ2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB3ZWJWaWV3LmdldFZpZXdNYW5hZ2VyKCkuaGlkZUFsbCgpOwogCi0gICAgICAgIG1Qcm9ncmVzc1ZpZXcgPSBjbGllbnQuZ2V0VmlkZW9Mb2FkaW5nUHJvZ3Jlc3NWaWV3KCk7Ci0gICAgICAgIGlmIChtUHJvZ3Jlc3NWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MYXlvdXQuYWRkVmlldyhtUHJvZ3Jlc3NWaWV3LCBsYXlvdXRQYXJhbXMpOwotICAgICAgICAgICAgbVByb2dyZXNzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtUHJvZ3Jlc3NWaWV3ID0gY2xpZW50LmdldFZpZGVvTG9hZGluZ1Byb2dyZXNzVmlldygpOworICAgICAgICAgICAgaWYgKG1Qcm9ncmVzc1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1MYXlvdXQuYWRkVmlldyhtUHJvZ3Jlc3NWaWV3LCBsYXlvdXRQYXJhbXMpOworICAgICAgICAgICAgICAgIG1Qcm9ncmVzc1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKioKQEAgLTMxNSwxMCArMzE5LDEyIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hQcm9ncmVzc1ZpZXcoYm9vbGVhbiBwbGF5ZXJCdWZmZXJpbmcpIHsKLSAgICAgICAgaWYgKHBsYXllckJ1ZmZlcmluZykgewotICAgICAgICAgICAgbVByb2dyZXNzVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUHJvZ3Jlc3NWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgaWYgKG1Qcm9ncmVzc1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBsYXllckJ1ZmZlcmluZykgeworICAgICAgICAgICAgICAgIG1Qcm9ncmVzc1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9JbmxpbmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvSW5saW5lLmphdmEKaW5kZXggMjU5MjFiYy4uZWYxOTA2YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9JbmxpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb0lubGluZS5qYXZhCkBAIC0xMiwxMCArMTIsMTUgQEAKICAqLwogcHVibGljIGNsYXNzIEhUTUw1VmlkZW9JbmxpbmUgZXh0ZW5kcyBIVE1MNVZpZGVvVmlld3sKIAotICAgIC8vIER1ZSB0byB0aGUgZmFjdCB0aGF0IFN1cmZhY2VUZXh0dXJlIGNvbnN1bWUgYSBsb3Qgb2YgbWVtb3J5LCB3ZSBtYWtlIGl0Ci0gICAgLy8gYXMgc3RhdGljLiBtX3RleHR1cmVOYW1lcyBpcyB0aGUgdGV4dHVyZSBib3VuZCB3aXRoIHRoaXMgU3VyZmFjZVRleHR1cmUuCisgICAgLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGRlY29kZXIgY29uc3VtZSBhIGxvdCBvZiBtZW1vcnksIHdlIG1ha2UgdGhlCisgICAgLy8gc3VyZmFjZSB0ZXh0dXJlIGFzIHNpbmdsZXRvbi4gQnV0IHRoZSBHTCB0ZXh0dXJlIChtX3RleHR1cmVOYW1lcykKKyAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cmZhY2UgdGV4dHVyZSBjYW4gYmUgdXNlZCBmb3Igc2hvd2luZyB0aGUgc2NyZWVuCisgICAgLy8gc2hvdCB3aGVuIHBhdXNlZCwgc28gdGhleSBhcmUgbm90IHNpbmdsZXRvbi4KICAgICBwcml2YXRlIHN0YXRpYyBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmUgPSBudWxsOwotICAgIHByaXZhdGUgc3RhdGljIGludFtdIG1UZXh0dXJlTmFtZXM7CisgICAgcHJpdmF0ZSBpbnRbXSBtVGV4dHVyZU5hbWVzOworICAgIC8vIEV2ZXJ5IHRpbWUgd2hlbiB0aGUgVmlkZW9MYXllciBJZCBjaGFuZ2UsIHdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlCisgICAgLy8gU3VyZmFjZVRleHR1cmUgaW4gb3JkZXIgdG8gZGVsZXRlIHRoZSBvbGQgdmlkZW8ncyBkZWNvZGVyIG1lbW9yeS4KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbVZpZGVvTGF5ZXJVc2luZ1N1cmZhY2VUZXh0dXJlID0gLTE7CiAKICAgICAvLyBWaWRlbyBjb250cm9sIEZVTkNUSU9OUzoKICAgICBAT3ZlcnJpZGUKQEAgLTI4LDExICszMywxMiBAQAogICAgIEhUTUw1VmlkZW9JbmxpbmUoaW50IHZpZGVvTGF5ZXJJZCwgaW50IHBvc2l0aW9uLAogICAgICAgICAgICAgYm9vbGVhbiBhdXRvU3RhcnQpIHsKICAgICAgICAgaW5pdCh2aWRlb0xheWVySWQsIHBvc2l0aW9uLCBhdXRvU3RhcnQpOworICAgICAgICBtVGV4dHVyZU5hbWVzID0gbnVsbDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkZWNpZGVEaXNwbGF5TW9kZSgpIHsKLSAgICAgICAgbVBsYXllci5zZXRUZXh0dXJlKGdldFN1cmZhY2VUZXh0dXJlSW5zdGFuY2UoKSk7CisgICAgICAgIG1QbGF5ZXIuc2V0VGV4dHVyZShnZXRTdXJmYWNlVGV4dHVyZShnZXRWaWRlb0xheWVySWQoKSkpOwogICAgIH0KIAogICAgIC8vIE5vcm1hbGx5IGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBzZXRWaWRlb1VSSS4gQnV0IGZvciBmdWxsIHNjcmVlbiwKQEAgLTUyLDMxICs1OCwzOCBAQAogICAgIC8vIElubGluZSBWaWRlbyBzcGVjaWZpYyBGVU5DVElPTlM6CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VyZmFjZVRleHR1cmUgZ2V0U3VyZmFjZVRleHR1cmUoKSB7CisgICAgcHVibGljIFN1cmZhY2VUZXh0dXJlIGdldFN1cmZhY2VUZXh0dXJlKGludCB2aWRlb0xheWVySWQpIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBzdXJmYWNlIHRleHR1cmUuCisgICAgICAgIGlmICh2aWRlb0xheWVySWQgIT0gbVZpZGVvTGF5ZXJVc2luZ1N1cmZhY2VUZXh0dXJlCisgICAgICAgICAgICB8fCBtU3VyZmFjZVRleHR1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1UZXh0dXJlTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UZXh0dXJlTmFtZXMgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIEdMRVMyMC5nbEdlblRleHR1cmVzKDEsIG1UZXh0dXJlTmFtZXMsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IFN1cmZhY2VUZXh0dXJlKG1UZXh0dXJlTmFtZXNbMF0pOworICAgICAgICB9CisgICAgICAgIG1WaWRlb0xheWVyVXNpbmdTdXJmYWNlVGV4dHVyZSA9IHZpZGVvTGF5ZXJJZDsKICAgICAgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXJmYWNlVGV4dHVyZURlbGV0ZWQoKSB7CisgICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlID09IG51bGwpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVN1cmZhY2VUZXh0dXJlKCkgewogICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOworICAgICAgICBtVmlkZW9MYXllclVzaW5nU3VyZmFjZVRleHR1cmUgPSAtMTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFN1cmZhY2VUZXh0dXJlIGlzIGEgc2luZ2xldG9uIGhlcmUgLCB0b28KLSAgICBwcml2YXRlIFN1cmZhY2VUZXh0dXJlIGdldFN1cmZhY2VUZXh0dXJlSW5zdGFuY2UoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgc3VyZmFjZSB0ZXh0dXJlLgotICAgICAgICBpZiAobVN1cmZhY2VUZXh0dXJlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1UZXh0dXJlTmFtZXMgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgR0xFUzIwLmdsR2VuVGV4dHVyZXMoMSwgbVRleHR1cmVOYW1lcywgMCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBuZXcgU3VyZmFjZVRleHR1cmUobVRleHR1cmVOYW1lc1swXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFRleHR1cmVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVRleHR1cmVOYW1lc1swXTsKKyAgICAgICAgaWYgKG1UZXh0dXJlTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1UZXh0dXJlTmFtZXNbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKFN1cmZhY2VUZXh0dXJlLk9uRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb1ZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlldy5qYXZhCmluZGV4IGMwNTQ5OGEuLjU5ODNhNDQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlldy5qYXZhCkBAIC0yODcsNyArMjg3LDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHB1YmxpYyBTdXJmYWNlVGV4dHVyZSBnZXRTdXJmYWNlVGV4dHVyZSgpIHsKKyAgICBwdWJsaWMgU3VyZmFjZVRleHR1cmUgZ2V0U3VyZmFjZVRleHR1cmUoaW50IHZpZGVvTGF5ZXJJZCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTMxNSw0ICszMTUsMTQgQEAKICAgICAgICAgLy8gT25seSB1c2VkIGluIEhUTUw1VmlkZW9GdWxsU2NyZWVuCiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gc3VyZmFjZVRleHR1cmVEZWxldGVkKCkgeworICAgICAgICAvLyBPbmx5IG1lYW5pbmdmdWwgZm9yIEhUTUw1VmlkZW9JbmxpbmUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGZ1bGxTY3JlZW5FeGl0ZWQoKSB7CisgICAgICAgIC8vIE9ubHkgbWVhbmluZ2Z1bCBmb3IgSFRNTDVWaWRlb0Z1bGxTY3JlZW4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9WaWV3UHJveHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9IVE1MNVZpZGVvVmlld1Byb3h5LmphdmEKaW5kZXggN2Q4NjY5Yi4uZDAyMzdiNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L0hUTUw1VmlkZW9WaWV3UHJveHkuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvSFRNTDVWaWRlb1ZpZXdQcm94eS5qYXZhCkBAIC0xMDYsMTIgKzEwNiwxNCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QmFzZUxheWVyKGludCBsYXllcikgewogICAgICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyBmb3IgZnVsbCBzY3JlZW4gbW9kZS4KICAgICAgICAgICAgIGlmIChtSFRNTDVWaWRlb1ZpZXcgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAhbUhUTUw1VmlkZW9WaWV3LmlzRnVsbFNjcmVlbk1vZGUoKSkgeworICAgICAgICAgICAgICAgICYmICFtSFRNTDVWaWRlb1ZpZXcuaXNGdWxsU2NyZWVuTW9kZSgpCisgICAgICAgICAgICAgICAgJiYgIW1IVE1MNVZpZGVvVmlldy5zdXJmYWNlVGV4dHVyZURlbGV0ZWQoKSkgewogICAgICAgICAgICAgICAgIG1CYXNlTGF5ZXIgPSBsYXllcjsKLSAgICAgICAgICAgICAgICBTdXJmYWNlVGV4dHVyZSBzdXJmVGV4dHVyZSA9IG1IVE1MNVZpZGVvVmlldy5nZXRTdXJmYWNlVGV4dHVyZSgpOwotICAgICAgICAgICAgICAgIGludCB0ZXh0dXJlTmFtZSA9IG1IVE1MNVZpZGVvVmlldy5nZXRUZXh0dXJlTmFtZSgpOwogCiAgICAgICAgICAgICAgICAgaW50IGN1cnJlbnRWaWRlb0xheWVySWQgPSBtSFRNTDVWaWRlb1ZpZXcuZ2V0VmlkZW9MYXllcklkKCk7CisgICAgICAgICAgICAgICAgU3VyZmFjZVRleHR1cmUgc3VyZlRleHR1cmUgPSBtSFRNTDVWaWRlb1ZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoY3VycmVudFZpZGVvTGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgaW50IHRleHR1cmVOYW1lID0gbUhUTUw1VmlkZW9WaWV3LmdldFRleHR1cmVOYW1lKCk7CisKICAgICAgICAgICAgICAgICBpZiAobGF5ZXIgIT0gMCAmJiBzdXJmVGV4dHVyZSAhPSBudWxsICYmIGN1cnJlbnRWaWRlb0xheWVySWQgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXllclN0YXRlID0gbUhUTUw1VmlkZW9WaWV3LmdldEN1cnJlbnRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAobUhUTUw1VmlkZW9WaWV3LmdldFBsYXllckJ1ZmZlcmluZygpKQpAQCAtMTcxLDE0ICsxNzMsMTIgQEAKICAgICAgICAgICAgIGJvb2xlYW4gYmFja0Zyb21GdWxsU2NyZWVuTW9kZSA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKG1IVE1MNVZpZGVvVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY3VycmVudFZpZGVvTGF5ZXJJZCA9IG1IVE1MNVZpZGVvVmlldy5nZXRWaWRlb0xheWVySWQoKTsKLSAgICAgICAgICAgICAgICBpZiAobUhUTUw1VmlkZW9WaWV3IGluc3RhbmNlb2YgSFRNTDVWaWRlb0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgYmFja0Zyb21GdWxsU2NyZWVuTW9kZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJhY2tGcm9tRnVsbFNjcmVlbk1vZGUgPSBtSFRNTDVWaWRlb1ZpZXcuZnVsbFNjcmVlbkV4aXRlZCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYmFja0Zyb21GdWxsU2NyZWVuTW9kZQotICAgICAgICAgICAgICAgIHx8ICBjdXJyZW50VmlkZW9MYXllcklkICE9IHZpZGVvTGF5ZXJJZAotICAgICAgICAgICAgICAgIHx8IG1IVE1MNVZpZGVvVmlldy5nZXRTdXJmYWNlVGV4dHVyZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB8fCBjdXJyZW50VmlkZW9MYXllcklkICE9IHZpZGVvTGF5ZXJJZAorICAgICAgICAgICAgICAgIHx8IG1IVE1MNVZpZGVvVmlldy5zdXJmYWNlVGV4dHVyZURlbGV0ZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIEhlcmUsIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHN3aXRjaGluZyB0byBhIG5ldyB2aWRlbywKICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgaW5zaWRlIGEgV2ViVmlldyBvciBhY3Jvc3MgV2ViVmlld3MKICAgICAgICAgICAgICAgICAvLyBGb3Igc3dpdGNoaW5nIHZpZGVvcyB3aXRoaW4gYSBXZWJWaWV3IG9yIGFjcm9zcyB0aGUgV2ViVmlldywKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5GdWxsU2NyZWVuSG9sZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvUGx1Z2luRnVsbFNjcmVlbkhvbGRlci5qYXZhCmluZGV4IGFlMzI2ZDUuLjQyYmE3YzkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9QbHVnaW5GdWxsU2NyZWVuSG9sZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1BsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIuamF2YQpAQCAtMjQsMzQgKzI0LDQ0IEBACiAgKi8KIHBhY2thZ2UgYW5kcm9pZC53ZWJraXQ7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKIAotY2xhc3MgUGx1Z2luRnVsbFNjcmVlbkhvbGRlciBleHRlbmRzIERpYWxvZyB7CitjbGFzcyBQbHVnaW5GdWxsU2NyZWVuSG9sZGVyIHsKIAogICAgIHByaXZhdGUgZmluYWwgV2ViVmlldyBtV2ViVmlldzsKICAgICBwcml2YXRlIGZpbmFsIGludCBtTnBwOworICAgIHByaXZhdGUgZmluYWwgaW50IG1PcmllbnRhdGlvbjsKKworICAgIC8vIFRoZSBjb250YWluZXIgZm9yIHRoZSBwbHVnaW4gdmlldworICAgIHByaXZhdGUgc3RhdGljIEN1c3RvbUZyYW1lTGF5b3V0IG1MYXlvdXQ7CisKICAgICBwcml2YXRlIFZpZXcgbUNvbnRlbnRWaWV3OwogCi0gICAgUGx1Z2luRnVsbFNjcmVlbkhvbGRlcihXZWJWaWV3IHdlYlZpZXcsIGludCBucHApIHsKLSAgICAgICAgc3VwZXIod2ViVmlldy5nZXRDb250ZXh0KCksIGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9Ob1RpdGxlQmFyX0Z1bGxzY3JlZW4pOworICAgIFBsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIoV2ViVmlldyB3ZWJWaWV3LCBpbnQgb3JpZW50YXRpb24sIGludCBucHApIHsKICAgICAgICAgbVdlYlZpZXcgPSB3ZWJWaWV3OwogICAgICAgICBtTnBwID0gbnBwOworICAgICAgICBtT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50VmlldyhWaWV3IGNvbnRlbnRWaWV3KSB7Ci0gICAgICAgIC8vIGFzIHdlIGFyZSBzaGFyaW5nIHRoZSBWaWV3IGJldHdlZW4gZnVsbCBzY3JlZW4gYW5kCi0gICAgICAgIC8vIGVtYmVkZGVkIG1vZGUsIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZQotICAgICAgICAvLyBBYnNvbHV0ZUxheW91dC5MYXlvdXRQYXJhbXMgc2V0IGJ5IGVtYmVkZGVkIG1vZGUgdG8KLSAgICAgICAgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcyBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBkaWFsb2cKLSAgICAgICAgY29udGVudFZpZXcuc2V0TGF5b3V0UGFyYW1zKG5ldyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zKAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgRnJhbWVMYXlvdXQgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHBsdWdpbidzIHZpZXcKKyAgICAgICAgbUxheW91dCA9IG5ldyBDdXN0b21GcmFtZUxheW91dChtV2ViVmlldy5nZXRDb250ZXh0KCkpOworICAgICAgICBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMgbGF5b3V0UGFyYW1zID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmF2aXR5LkNFTlRFUik7CisKKyAgICAgICAgbUxheW91dC5hZGRWaWV3KGNvbnRlbnRWaWV3LCBsYXlvdXRQYXJhbXMpOworICAgICAgICBtTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKwogICAgICAgICAvLyBmaXhlZCBzaXplIGlzIG9ubHkgdXNlZCBlaXRoZXIgZHVyaW5nIHBpbmNoIHpvb20gb3Igc3VyZmFjZSBpcyB0b28KICAgICAgICAgLy8gYmlnLiBNYWtlIHN1cmUgaXQgaXMgbm90IGZpeGVkIHNpemUgYmVmb3JlIHNldHRpbmcgaXQgdG8gdGhlIGZ1bGwKICAgICAgICAgLy8gc2NyZWVuIGNvbnRlbnQgdmlldy4gVGhlIFN1cmZhY2VWaWV3IHdpbGwgYmUgc2V0IHRvIHRoZSBjb3JyZWN0IG1vZGUKQEAgLTYyLDU5ICs3Miw3OSBAQAogICAgICAgICAgICAgICAgIHNWaWV3LmdldEhvbGRlcigpLnNldFNpemVGcm9tTGF5b3V0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0Q29udGVudFZpZXcoY29udGVudFZpZXcpOworCiAgICAgICAgIG1Db250ZW50VmlldyA9IGNvbnRlbnRWaWV3OwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQmFja1ByZXNzZWQoKSB7Ci0gICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdlYlZpZXcuSElERV9GVUxMU0NSRUVOKQotICAgICAgICAgICAgICAgIC5zZW5kVG9UYXJnZXQoKTsKKyAgICBwdWJsaWMgdm9pZCBzaG93KCkgeworICAgICAgICAvLyBPdGhlciBwbHVnaW5zIG1heSBhdHRlbXB0IHRvIGRyYXcgc28gaGlkZSB0aGVtIHdoaWxlIHdlJ3JlIGFjdGl2ZS4KKyAgICAgICAgaWYgKG1XZWJWaWV3LmdldFZpZXdNYW5hZ2VyKCkgIT0gbnVsbCkKKyAgICAgICAgICAgIG1XZWJWaWV3LmdldFZpZXdNYW5hZ2VyKCkuaGlkZUFsbCgpOworCisgICAgICAgIFdlYkNocm9tZUNsaWVudCBjbGllbnQgPSBtV2ViVmlldy5nZXRXZWJDaHJvbWVDbGllbnQoKTsKKyAgICAgICAgY2xpZW50Lm9uU2hvd0N1c3RvbVZpZXcobUxheW91dCwgbU9yaWVudGF0aW9uLCBtQ2FsbGJhY2spOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOworICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7CisgICAgICAgIFdlYkNocm9tZUNsaWVudCBjbGllbnQgPSBtV2ViVmlldy5nZXRXZWJDaHJvbWVDbGllbnQoKTsKKyAgICAgICAgY2xpZW50Lm9uSGlkZUN1c3RvbVZpZXcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEN1c3RvbUZyYW1lTGF5b3V0IGV4dGVuZHMgRnJhbWVMYXlvdXQgeworCisgICAgICAgIEN1c3RvbUZyYW1lTGF5b3V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CiAgICAgICAgIH0KLSAgICAgICAgbVdlYlZpZXcub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGFyZSB0aGUgaGFuZGxlcgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKSkgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmlzU3lzdGVtKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgICAgICAgICAvLyBhbHdheXMgcmV0dXJuIHRydWUgYXMgd2UgYXJlIHRoZSBoYW5kbGVyCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBtV2ViVmlldy5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKLSAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGFyZSB0aGUgaGFuZGxlcgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGRvbid0IHdhbnQgdGhlIGV2ZW50IHRvIHByb3BhZ2F0ZSBhbnkgZnVydGhlcgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG1XZWJWaWV3Lm9uVHJhY2tiYWxsRXZlbnQoZXZlbnQpOwotICAgICAgICAvLyBhbHdheXMgcmV0dXJuIHRydWUgYXMgd2UgYXJlIHRoZSBoYW5kbGVyCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIC8vIG1hbnVhbGx5IHJlbW92ZSB0aGUgY29udGVudFZpZXcncyBwYXJlbnQgc2luY2UgdGhlIGRpYWxvZyBkb2VzIG5vdAotICAgICAgICBpZiAobUNvbnRlbnRWaWV3ICE9IG51bGwgJiYgbUNvbnRlbnRWaWV3LmdldFBhcmVudCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFZpZXdHcm91cCB2ZyA9IChWaWV3R3JvdXApIG1Db250ZW50Vmlldy5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHZnLnJlbW92ZVZpZXcobUNvbnRlbnRWaWV3KTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uS2V5VXAoaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBpZiAoZXZlbnQuaXNTeXN0ZW0oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1XZWJWaWV3Lm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOworICAgICAgICAgICAgLy8gYWx3YXlzIHJldHVybiB0cnVlIGFzIHdlIGFyZSB0aGUgaGFuZGxlcgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgbVdlYlZpZXcuZ2V0V2ViVmlld0NvcmUoKS5zZW5kTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5FdmVudEh1Yi5ISURFX0ZVTExTQ1JFRU4sIG1OcHAsIDApOwotICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAvLyBhbHdheXMgcmV0dXJuIHRydWUgYXMgd2UgZG9uJ3Qgd2FudCB0aGUgZXZlbnQgdG8gcHJvcGFnYXRlIGFueSBmdXJ0aGVyCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50KE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBtV2ViVmlldy5vblRyYWNrYmFsbEV2ZW50KGV2ZW50KTsKKyAgICAgICAgICAgIC8vIGFsd2F5cyByZXR1cm4gdHJ1ZSBhcyB3ZSBhcmUgdGhlIGhhbmRsZXIKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgZmluYWwgV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjayBtQ2FsbGJhY2sgPQorICAgICAgICBuZXcgV2ViQ2hyb21lQ2xpZW50LkN1c3RvbVZpZXdDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tVmlld0hpZGRlbigpIHsKKworICAgICAgICAgICAgICAgIG1XZWJWaWV3Lm1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdlYlZpZXcuSElERV9GVUxMU0NSRUVOKQorICAgICAgICAgICAgICAgICAgICAuc2VuZFRvVGFyZ2V0KCk7CisKKyAgICAgICAgICAgICAgICBtV2ViVmlldy5nZXRXZWJWaWV3Q29yZSgpLnNlbmRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuRXZlbnRIdWIuSElERV9GVUxMU0NSRUVOLCBtTnBwLCAwKTsKKworICAgICAgICAgICAgICAgIG1MYXlvdXQucmVtb3ZlVmlldyhtQ29udGVudFZpZXcpOworICAgICAgICAgICAgICAgIG1MYXlvdXQgPSBudWxsOworCisgICAgICAgICAgICAgICAgLy8gUmUgZW5hYmxlIHBsdWdpbiB2aWV3cy4KKyAgICAgICAgICAgICAgICBtV2ViVmlldy5nZXRWaWV3TWFuYWdlcigpLnNob3dBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Tc2xDZXJ0TG9va3VwVGFibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Tc2xDZXJ0TG9va3VwVGFibGUuamF2YQppbmRleCBhYmY2MTJlLi5mYWZmMTEwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvU3NsQ2VydExvb2t1cFRhYmxlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1NzbENlcnRMb29rdXBUYWJsZS5qYXZhCkBAIC0xOSwxMSArMTksMTEgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5odHRwLlNzbEVycm9yOwogCi0vKgorLyoqCiAgKiBBIHNpbXBsZSBjbGFzcyB0byBzdG9yZSB0aGUgd3JvbmcgY2VydGlmaWNhdGVzIHRoYXQgdXNlciBpcyBhd2FyZSBidXQKICAqIGNob3NlIHRvIHByb2NlZWQuCiAgKi8KLWNsYXNzIFNzbENlcnRMb29rdXBUYWJsZSB7CitmaW5hbCBjbGFzcyBTc2xDZXJ0TG9va3VwVGFibGUgewogICAgIHByaXZhdGUgc3RhdGljIFNzbENlcnRMb29rdXBUYWJsZSBzVGFibGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgdGFibGU7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Tc2xDbGllbnRDZXJ0TG9va3VwVGFibGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9Tc2xDbGllbnRDZXJ0TG9va3VwVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBkZWJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1NzbENsaWVudENlcnRMb29rdXBUYWJsZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgc2ltcGxlIGNsYXNzIHRvIHN0b3JlIGNsaWVudCBjZXJ0aWZpY2F0ZXMgdGhhdCB1c2VyIGhhcyBjaG9zZW4uCisgKi8KK2ZpbmFsIGNsYXNzIFNzbENsaWVudENlcnRMb29rdXBUYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3NsQ2xpZW50Q2VydExvb2t1cFRhYmxlIHNUYWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIGJ5dGVbXT4gcHJpdmF0ZUtleXM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBieXRlW11bXT4gY2VydGlmaWNhdGVDaGFpbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBkZW5pZWQ7CisKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBTc2xDbGllbnRDZXJ0TG9va3VwVGFibGUgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChzVGFibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgc1RhYmxlID0gbmV3IFNzbENsaWVudENlcnRMb29rdXBUYWJsZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzVGFibGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTc2xDbGllbnRDZXJ0TG9va3VwVGFibGUoKSB7CisgICAgICAgIHByaXZhdGVLZXlzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBieXRlW10+KCk7CisgICAgICAgIGNlcnRpZmljYXRlQ2hhaW5zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBieXRlW11bXT4oKTsKKyAgICAgICAgZGVuaWVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIEFsbG93KFN0cmluZyBob3N0X2FuZF9wb3J0LCBieXRlW10gcHJpdmF0ZUtleSwgYnl0ZVtdW10gY2hhaW4pIHsKKyAgICAgICAgcHJpdmF0ZUtleXMucHV0KGhvc3RfYW5kX3BvcnQsIHByaXZhdGVLZXkpOworICAgICAgICBjZXJ0aWZpY2F0ZUNoYWlucy5wdXQoaG9zdF9hbmRfcG9ydCwgY2hhaW4pOworICAgICAgICBkZW5pZWQucmVtb3ZlKGhvc3RfYW5kX3BvcnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIERlbnkoU3RyaW5nIGhvc3RfYW5kX3BvcnQpIHsKKyAgICAgICAgcHJpdmF0ZUtleXMucmVtb3ZlKGhvc3RfYW5kX3BvcnQpOworICAgICAgICBjZXJ0aWZpY2F0ZUNoYWlucy5yZW1vdmUoaG9zdF9hbmRfcG9ydCk7CisgICAgICAgIGRlbmllZC5hZGQoaG9zdF9hbmRfcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gSXNBbGxvd2VkKFN0cmluZyBob3N0X2FuZF9wb3J0KSB7CisgICAgICAgIHJldHVybiBwcml2YXRlS2V5cy5jb250YWluc0tleShob3N0X2FuZF9wb3J0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBJc0RlbmllZChTdHJpbmcgaG9zdF9hbmRfcG9ydCkgeworICAgICAgICByZXR1cm4gZGVuaWVkLmNvbnRhaW5zKGhvc3RfYW5kX3BvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gUHJpdmF0ZUtleShTdHJpbmcgaG9zdF9hbmRfcG9ydCkgeworICAgICAgICByZXR1cm4gcHJpdmF0ZUtleXMuZ2V0KGhvc3RfYW5kX3BvcnQpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW11bXSBDZXJ0aWZpY2F0ZUNoYWluKFN0cmluZyBob3N0X2FuZF9wb3J0KSB7CisgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZUNoYWlucy5nZXQoaG9zdF9hbmRfcG9ydCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1ZpZXdTdGF0ZVNlcmlhbGl6ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9WaWV3U3RhdGVTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjNzZmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9WaWV3U3RhdGVTZXJpYWxpemVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQud2Via2l0OworCitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbjsKK2ltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJWaWV3Q29yZS5EcmF3RGF0YTsKKworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogQGhpZGUKKyAqLworY2xhc3MgVmlld1N0YXRlU2VyaWFsaXplciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV09SS0lOR19TVFJFQU1fU1RPUkFHRSA9IDE2ICogMTAyNDsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTiA9IDE7CisKKyAgICBzdGF0aWMgYm9vbGVhbiBzZXJpYWxpemVWaWV3U3RhdGUoT3V0cHV0U3RyZWFtIHN0cmVhbSwgV2ViVmlldyB3ZWIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgIGRvcy53cml0ZUludChWRVJTSU9OKTsKKyAgICAgICAgZG9zLndyaXRlSW50KHdlYi5nZXRDb250ZW50V2lkdGgoKSk7CisgICAgICAgIGRvcy53cml0ZUludCh3ZWIuZ2V0Q29udGVudEhlaWdodCgpKTsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZVNlcmlhbGl6ZVZpZXdTdGF0ZSh3ZWIuZ2V0QmFzZUxheWVyKCksIGRvcywKKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVtXT1JLSU5HX1NUUkVBTV9TVE9SQUdFXSk7CisgICAgfQorCisgICAgc3RhdGljIERyYXdEYXRhIGRlc2VyaWFsaXplVmlld1N0YXRlKElucHV0U3RyZWFtIHN0cmVhbSwgV2ViVmlldyB3ZWIpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGlzID0gbmV3IERhdGFJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICBpbnQgdmVyc2lvbiA9IGRpcy5yZWFkSW50KCk7CisgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5leHBlY3RlZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvbnRlbnRXaWR0aCA9IGRpcy5yZWFkSW50KCk7CisgICAgICAgIGludCBjb250ZW50SGVpZ2h0ID0gZGlzLnJlYWRJbnQoKTsKKyAgICAgICAgaW50IGJhc2VMYXllciA9IG5hdGl2ZURlc2VyaWFsaXplVmlld1N0YXRlKGRpcywKKyAgICAgICAgICAgICAgICBuZXcgYnl0ZVtXT1JLSU5HX1NUUkVBTV9TVE9SQUdFXSk7CisKKyAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9IG5ldyBXZWJWaWV3Q29yZS5EcmF3RGF0YSgpOworICAgICAgICBkcmF3Lm1WaWV3U3RhdGUgPSBuZXcgV2ViVmlld0NvcmUuVmlld1N0YXRlKCk7CisgICAgICAgIGludCB2aWV3V2lkdGggPSB3ZWIuZ2V0Vmlld1dpZHRoKCk7CisgICAgICAgIGludCB2aWV3SGVpZ2h0ID0gd2ViLmdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIHdlYi5nZXRUaXRsZUhlaWdodCgpOworICAgICAgICBkcmF3Lm1WaWV3U2l6ZSA9IG5ldyBQb2ludCh2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOworICAgICAgICBkcmF3Lm1Db250ZW50U2l6ZSA9IG5ldyBQb2ludChjb250ZW50V2lkdGgsIGNvbnRlbnRIZWlnaHQpOworICAgICAgICBkcmF3Lm1WaWV3U3RhdGUubURlZmF1bHRTY2FsZSA9IHdlYi5nZXREZWZhdWx0Wm9vbVNjYWxlKCk7CisgICAgICAgIGRyYXcubUJhc2VMYXllciA9IGJhc2VMYXllcjsKKyAgICAgICAgZHJhdy5tSW52YWxSZWdpb24gPSBuZXcgUmVnaW9uKDAsIDAsIGNvbnRlbnRXaWR0aCwgY29udGVudEhlaWdodCk7CisgICAgICAgIHJldHVybiBkcmF3OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVNlcmlhbGl6ZVZpZXdTdGF0ZShpbnQgYmFzZUxheWVyLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSwgYnl0ZVtdIHN0b3JhZ2UpOworCisgICAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEJhc2VMYXllcgorICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlRGVzZXJpYWxpemVWaWV3U3RhdGUoCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0sIGJ5dGVbXSBzdG9yYWdlKTsKKworICAgIHByaXZhdGUgVmlld1N0YXRlU2VyaWFsaXplcigpIHt9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViQ2hyb21lQ2xpZW50LmphdmEKaW5kZXggNzU1MzY2Yy4uYWU0MGRlZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYkNocm9tZUNsaWVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJDaHJvbWVDbGllbnQuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2Via2l0OwogCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwpAQCAtNzcsNiArNzgsMTggQEAKIAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHRoZSBjdXJyZW50IHBhZ2Ugd291bGQKKyAgICAgKiBsaWtlIHRvIHNob3cgYSBjdXN0b20gVmlldyBpbiBhIHBhcnRpY3VsYXIgb3JpZW50YXRpb24uCisgICAgICogQHBhcmFtIHZpZXcgaXMgdGhlIFZpZXcgb2JqZWN0IHRvIGJlIHNob3duLgorICAgICAqIEBwYXJhbSByZXF1ZXN0ZWRPcmllbnRhdGlvbiBBbiBvcmllbnRhdGlvbiBjb25zdGFudCBhcyB1c2VkIGluCisgICAgICoge0BsaW5rIEFjdGl2aXR5SW5mbyNzY3JlZW5PcmllbnRhdGlvbiBBY3Rpdml0eUluZm8uc2NyZWVuT3JpZW50YXRpb259LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBpcyB0aGUgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBpZiBhbmQgd2hlbiB0aGUgdmlldworICAgICAqIGlzIGRpc21pc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblNob3dDdXN0b21WaWV3KFZpZXcgdmlldywgaW50IHJlcXVlc3RlZE9yaWVudGF0aW9uLAorICAgICAgICAgICAgQ3VzdG9tVmlld0NhbGxiYWNrIGNhbGxiYWNrKSB7fTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCB0aGUgY3VycmVudCBwYWdlIHdvdWxkCiAgICAgICogbGlrZSB0byBoaWRlIGl0cyBjdXN0b20gdmlldy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBvbkhpZGVDdXN0b21WaWV3KCkge30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJTZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKaW5kZXggNjZmY2MyNy4uNzYxMDA3ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlNldHRpbmdzLmphdmEKQEAgLTU5LDYgKzU5LDcgQEAKICAgICAgKiBOT1JNQUwgaXMgMTAwJQogICAgICAqIExBUkdFUiBpcyAxNTAlCiAgICAgICogTEFSR0VTVCBpcyAyMDAlCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXZWJTZXR0aW5ncyNzZXRUZXh0Wm9vbShpbnQpfSBhbmQge0BsaW5rIFdlYlNldHRpbmdzI2dldFRleHRab29tKCl9IGluc3RlYWQuCiAgICAgICovCiAgICAgcHVibGljIGVudW0gVGV4dFNpemUgewogICAgICAgICBTTUFMTEVTVCg1MCksCkBAIC0xNTgsNyArMTU5LDcgQEAKICAgICAvLyBrbm93IHdoYXQgdGhleSBhcmUuCiAgICAgcHJpdmF0ZSBMYXlvdXRBbGdvcml0aG0gbUxheW91dEFsZ29yaXRobSA9IExheW91dEFsZ29yaXRobS5OQVJST1dfQ09MVU1OUzsKICAgICBwcml2YXRlIENvbnRleHQgICAgICAgICBtQ29udGV4dDsKLSAgICBwcml2YXRlIFRleHRTaXplICAgICAgICBtVGV4dFNpemUgPSBUZXh0U2l6ZS5OT1JNQUw7CisgICAgcHJpdmF0ZSBpbnQgICAgICAgICAgICAgbVRleHRTaXplID0gMTAwOwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgIG1TdGFuZGFyZEZvbnRGYW1pbHkgPSAic2Fucy1zZXJpZiI7CiAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgbUZpeGVkRm9udEZhbWlseSA9ICJtb25vc3BhY2UiOwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgICAgIG1TYW5zU2VyaWZGb250RmFtaWx5ID0gInNhbnMtc2VyaWYiOwpAQCAtNzA5LDI2ICs3MTAsNjEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIHRleHQgc2l6ZSBvZiB0aGUgcGFnZS4KLSAgICAgKiBAcGFyYW0gdCBBIFRleHRTaXplIHZhbHVlIGZvciBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIHRleHQuCi0gICAgICogQHNlZSBXZWJTZXR0aW5ncy5UZXh0U2l6ZQorICAgICAqIFNldCB0aGUgdGV4dCB6b29tIG9mIHRoZSBwYWdlIGluIHBlcmNlbnQuIERlZmF1bHQgaXMgMTAwLgorICAgICAqIEBwYXJhbSB0ZXh0Wm9vbSBBIHBlcmNlbnQgdmFsdWUgZm9yIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgdGV4dC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VGV4dFNpemUoVGV4dFNpemUgdCkgewotICAgICAgICBpZiAoV2ViVmlldy5tTG9nRXZlbnQgJiYgbVRleHRTaXplICE9IHQgKSB7Ci0gICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5CUk9XU0VSX1RFWFRfU0laRV9DSEFOR0UsCi0gICAgICAgICAgICAgICAgICAgIG1UZXh0U2l6ZS52YWx1ZSwgdC52YWx1ZSk7CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRleHRab29tKGludCB0ZXh0Wm9vbSkgeworICAgICAgICBpZiAobVRleHRTaXplICE9IHRleHRab29tKSB7CisgICAgICAgICAgICBpZiAoV2ViVmlldy5tTG9nRXZlbnQpIHsKKyAgICAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KEV2ZW50TG9nVGFncy5CUk9XU0VSX1RFWFRfU0laRV9DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGV4dFNpemUsIHRleHRab29tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1UZXh0U2l6ZSA9IHRleHRab29tOworICAgICAgICAgICAgcG9zdFN5bmMoKTsKICAgICAgICAgfQotICAgICAgICBtVGV4dFNpemUgPSB0OwotICAgICAgICBwb3N0U3luYygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgdGV4dCBzaXplIG9mIHRoZSBwYWdlLgorICAgICAqIEdldCB0aGUgdGV4dCB6b29tIG9mIHRoZSBwYWdlIGluIHBlcmNlbnQuCisgICAgICogQHJldHVybiBBIHBlcmNlbnQgdmFsdWUgZGVzY3JpYmluZyB0aGUgdGV4dCB6b29tLgorICAgICAqIEBzZWUgc2V0VGV4dFNpemVab29tCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0VGV4dFpvb20oKSB7CisgICAgICAgIHJldHVybiBtVGV4dFNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0ZXh0IHNpemUgb2YgdGhlIHBhZ2UuCisgICAgICogQHBhcmFtIHQgQSBUZXh0U2l6ZSB2YWx1ZSBmb3IgaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIHRoZSB0ZXh0LgorICAgICAqIEBzZWUgV2ViU2V0dGluZ3MuVGV4dFNpemUKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRUZXh0Wm9vbShpbnQpfSBpbnN0ZWFkCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRleHRTaXplKFRleHRTaXplIHQpIHsKKyAgICAgICAgc2V0VGV4dFpvb20odC52YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0ZXh0IHNpemUgb2YgdGhlIHBhZ2UuIElmIHRoZSB0ZXh0IHNpemUgd2FzIHByZXZpb3VzbHkgc3BlY2lmaWVkCisgICAgICogaW4gcGVyY2VudCB1c2luZyB7QGxpbmsgI3NldFRleHRab29tKGludCl9LCB0aGlzIHdpbGwgcmV0dXJuCisgICAgICogdGhlIGNsb3Nlc3QgbWF0Y2hpbmcge0BsaW5rIFRleHRTaXplfS4KICAgICAgKiBAcmV0dXJuIEEgVGV4dFNpemUgZW51bSB2YWx1ZSBkZXNjcmliaW5nIHRoZSB0ZXh0IHNpemUuCiAgICAgICogQHNlZSBXZWJTZXR0aW5ncy5UZXh0U2l6ZQorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFRleHRab29tKCl9IGluc3RlYWQKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFRleHRTaXplIGdldFRleHRTaXplKCkgewotICAgICAgICByZXR1cm4gbVRleHRTaXplOworICAgICAgICBUZXh0U2l6ZSBjbG9zZXN0U2l6ZSA9IG51bGw7CisgICAgICAgIGludCBzbWFsbGVzdERlbHRhID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIGZvciAoVGV4dFNpemUgc2l6ZSA6IFRleHRTaXplLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSBNYXRoLmFicyhtVGV4dFNpemUgLSBzaXplLnZhbHVlKTsKKyAgICAgICAgICAgIGlmIChkZWx0YSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVsdGEgPCBzbWFsbGVzdERlbHRhKSB7CisgICAgICAgICAgICAgICAgc21hbGxlc3REZWx0YSA9IGRlbHRhOworICAgICAgICAgICAgICAgIGNsb3Nlc3RTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xvc2VzdFNpemUgIT0gbnVsbCA/IGNsb3Nlc3RTaXplIDogVGV4dFNpemUuTk9STUFMOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIzNCw3ICsxMjcwLDcgQEAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQbHVnaW5zRW5hYmxlZChib29sZWFuIGZsYWcpIHsKLSAgICAgICAgc2V0UGx1Z2luU3RhdGUoUGx1Z2luU3RhdGUuT04pOworICAgICAgICBzZXRQbHVnaW5TdGF0ZShmbGFnID8gUGx1Z2luU3RhdGUuT04gOiBQbHVnaW5TdGF0ZS5PRkYpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3LmphdmEKaW5kZXggM2MyYzhmNi4uYzU2ZTZkYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlldy5qYXZhCkBAIC00NCw3ICs0NCw2IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWdpb247Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQubmV0LlByb3h5OwpAQCAtODQsNiArODMsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dENvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLndlYmtpdC5XZWJUZXh0Vmlldy5BdXRvQ29tcGxldGVBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkRyYXdEYXRhOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLkV2ZW50SHViOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoRXZlbnREYXRhOwogaW1wb3J0IGFuZHJvaWQud2Via2l0LldlYlZpZXdDb3JlLlRvdWNoSGlnaGxpZ2h0RGF0YTsKQEAgLTk4LDEwICs5OCwxNSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk92ZXJTY3JvbGxlcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKIAoraW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0xMTMsOCArMTE4LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KIC8qKgogICogPHA+QSBWaWV3IHRoYXQgZGlzcGxheXMgd2ViIHBhZ2VzLiBUaGlzIGNsYXNzIGlzIHRoZSBiYXNpcyB1cG9uIHdoaWNoIHlvdQogICogY2FuIHJvbGwgeW91ciBvd24gd2ViIGJyb3dzZXIgb3Igc2ltcGx5IGRpc3BsYXkgc29tZSBvbmxpbmUgY29udGVudCB3aXRoaW4geW91ciBBY3Rpdml0eS4KQEAgLTE2OSw3ICsxNzIsNyBAQAogICoKICAqIC8vIE9SLCB5b3UgY2FuIGFsc28gbG9hZCBmcm9tIGFuIEhUTUwgc3RyaW5nOgogICogU3RyaW5nIHN1bW1hcnkgPSAiJmx0O2h0bWw+Jmx0O2JvZHk+WW91IHNjb3JlZCAmbHQ7Yj4xOTImbHQ7L2I+IHBvaW50cy4mbHQ7L2JvZHk+Jmx0Oy9odG1sPiI7Ci0gKiB3ZWJ2aWV3LmxvYWREYXRhKHN1bW1hcnksICJ0ZXh0L2h0bWwiLCAidXRmLTgiKTsKKyAqIHdlYnZpZXcubG9hZERhdGEoc3VtbWFyeSwgInRleHQvaHRtbCIsIG51bGwpOwogICogLy8gLi4uIGFsdGhvdWdoIG5vdGUgdGhhdCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIG9uIHdoYXQgdGhpcyBIVE1MIGNhbiBkby4KICAqIC8vIFNlZSB0aGUgSmF2YURvY3MgZm9yIHtAbGluayAjbG9hZERhdGEoU3RyaW5nLFN0cmluZyxTdHJpbmcpIGxvYWREYXRhKCl9IGFuZCB7QGxpbmsKICAqICNsb2FkRGF0YVdpdGhCYXNlVVJMKFN0cmluZyxTdHJpbmcsU3RyaW5nLFN0cmluZyxTdHJpbmcpIGxvYWREYXRhV2l0aEJhc2VVUkwoKX0gZm9yIG1vcmUgaW5mby4KQEAgLTQxOSw2ICs0MjIsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgaW50IG1MYXN0VG91Y2hYOwogICAgIHByaXZhdGUgaW50IG1MYXN0VG91Y2hZOworICAgIHByaXZhdGUgaW50IG1TdGFydFRvdWNoWDsKKyAgICBwcml2YXRlIGludCBtU3RhcnRUb3VjaFk7CisgICAgcHJpdmF0ZSBmbG9hdCBtQXZlcmFnZUFuZ2xlOwogCiAgICAgLyoqCiAgICAgICogVGltZSBvZiB0aGUgbGFzdCB0b3VjaCBldmVudC4KQEAgLTYxNiw2ICs2MjIsOSBAQAogICAgIC8vIFNldEJhc2VMYXllciB0aW1lIGFuZCB0byBwYXVzZSB3aGVuIFdlYlZpZXcgcGF1c2VkLgogICAgIHByaXZhdGUgSFRNTDVWaWRlb1ZpZXdQcm94eSBtSFRNTDVWaWRlb1ZpZXdQcm94eTsKIAorICAgIC8vIElmIHdlIGFyZSB1c2luZyBhIHNldCBwaWN0dXJlLCBkb24ndCBzZW5kIHZpZXcgdXBkYXRlcyB0byB3ZWJraXQKKyAgICBwcml2YXRlIGJvb2xlYW4gbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzID0gZmFsc2U7CisKICAgICAvKgogICAgICAqIFByaXZhdGUgbWVzc2FnZSBpZHMKICAgICAgKi8KQEAgLTExODMsNyArMTE5Miw2IEBACiAgICAgICAgIGZpbmFsIFZpZXdDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBWaWV3Q29uZmlndXJhdGlvbi5nZXQoZ2V0Q29udGV4dCgpKTsKICAgICAgICAgaW50IHNsb3AgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZFRvdWNoU2xvcCgpOwogICAgICAgICBtVG91Y2hTbG9wU3F1YXJlID0gc2xvcCAqIHNsb3A7Ci0gICAgICAgIG1NaW5Mb2NrU25hcFJldmVyc2VEaXN0YW5jZSA9IHNsb3A7CiAgICAgICAgIHNsb3AgPSBjb25maWd1cmF0aW9uLmdldFNjYWxlZERvdWJsZVRhcFNsb3AoKTsKICAgICAgICAgbURvdWJsZVRhcFNsb3BTcXVhcmUgPSBzbG9wICogc2xvcDsKICAgICAgICAgZmluYWwgZmxvYXQgZGVuc2l0eSA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CkBAIC0xMzg3LDYgKzEzOTUsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFZpc2libGVUaXRsZUhlaWdodCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIGdldFZpc2libGVUaXRsZUhlaWdodEltcGwoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRWaXNpYmxlVGl0bGVIZWlnaHRJbXBsKCkgewogICAgICAgICAvLyBuZWVkIHRvIHJlc3RyaWN0IG1TY3JvbGxZIGR1ZSB0byBvdmVyIHNjcm9sbAogICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0VGl0bGVIZWlnaHQoKSAtIE1hdGgubWF4KDAsIG1TY3JvbGxZKSwgMCk7CiAgICAgfQpAQCAtMTM5NywxMCArMTQwOSwxMCBAQAogICAgICAqIE5vdGU6IHRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIFdlYkNvcmVUaHJlYWQuCiAgICAgICovCiAgICAgLyogcGFja2FnZSAqLyBpbnQgZ2V0Vmlld0hlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSAtIGdldFZpc2libGVUaXRsZUhlaWdodCgpOworICAgICAgICByZXR1cm4gZ2V0Vmlld0hlaWdodFdpdGhUaXRsZSgpIC0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0SW1wbCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgaW50IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSB7CisgICAgaW50IGdldFZpZXdIZWlnaHRXaXRoVGl0bGUoKSB7CiAgICAgICAgIGludCBoZWlnaHQgPSBnZXRIZWlnaHQoKTsKICAgICAgICAgaWYgKGlzSG9yaXpvbnRhbFNjcm9sbEJhckVuYWJsZWQoKSAmJiAhbU92ZXJsYXlIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CiAgICAgICAgICAgICBoZWlnaHQgLT0gZ2V0SG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOwpAQCAtMTc4Niw2ICsxNzk4LDUzIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIHZpZXcgZGF0YSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhlIG91dHB1dCBpcyBoaWdobHkKKyAgICAgKiB2ZXJzaW9uIHNwZWNpZmljLCBhbmQgbWF5IG5vdCBiZSBhYmxlIHRvIGJlIGxvYWRlZCBieSBuZXdlciB2ZXJzaW9ucworICAgICAqIG9mIFdlYlZpZXcuCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUge0BsaW5rIE91dHB1dFN0cmVhbX0gdG8gc2F2ZSB0bworICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzYXZlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHNhdmVWaWV3U3RhdGUoT3V0cHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFZpZXdTdGF0ZVNlcmlhbGl6ZXIuc2VyaWFsaXplVmlld1N0YXRlKHN0cmVhbSwgdGhpcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkZhaWxlZCB0byBzYXZlVmlld1N0YXRlIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIHRoZSB2aWV3IGRhdGEgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiBTZWUKKyAgICAgKiB7QGxpbmsgI3NhdmVWaWV3U3RhdGUoT3V0cHV0U3RyZWFtKX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICogQHBhcmFtIHN0cmVhbSBUaGUge0BsaW5rIElucHV0U3RyZWFtfSB0byBsb2FkIGZyb20KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgbG9hZGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbG9hZFZpZXdTdGF0ZShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Mb2FkZWRQaWN0dXJlID0gVmlld1N0YXRlU2VyaWFsaXplci5kZXNlcmlhbGl6ZVZpZXdTdGF0ZShzdHJlYW0sIHRoaXMpOworICAgICAgICAgICAgbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzID0gdHJ1ZTsKKyAgICAgICAgICAgIHNldE5ld1BpY3R1cmUobUxvYWRlZFBpY3R1cmUsIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR1RBRywgIkZhaWxlZCB0byBsb2FkVmlld1N0YXRlIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgdmlldyBzdGF0ZSBzZXQgd2l0aCB7QGxpbmsgI2xvYWRWaWV3U3RhdGUoSW5wdXRTdHJlYW0pfS4KKyAgICAgKiBUaGlzIFdlYlZpZXcgd2lsbCB0aGVuIHN3aXRjaCB0byBzaG93aW5nIHRoZSBjb250ZW50IGZyb20gd2Via2l0CisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclZpZXdTdGF0ZSgpIHsKKyAgICAgICAgbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzID0gZmFsc2U7CisgICAgICAgIG1Mb2FkZWRQaWN0dXJlID0gbnVsbDsKKyAgICAgICAgaW52YWxpZGF0ZSgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoaXMgV2ViVmlldyBmcm9tIHRoZSBnaXZlbiBtYXAgdXNlZCBpbgogICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3RvcmVJbnN0YW5jZVN0YXRlfS4gVGhpcyBtZXRob2Qgc2hvdWxkCiAgICAgICogYmUgY2FsbGVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBXZWJWaWV3IGJlZm9yZSB1c2luZyB0aGUgb2JqZWN0LiBJZgpAQCAtMTkxMiwxNCArMTk3MSwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgdGhlIGdpdmVuIGRhdGEgaW50byB0aGUgV2ViVmlldy4gVGhpcyB3aWxsIGxvYWQgdGhlIGRhdGEgaW50bwotICAgICAqIFdlYlZpZXcgdXNpbmcgdGhlIGRhdGE6IHNjaGVtZS4gQ29udGVudCBsb2FkZWQgdGhyb3VnaCB0aGlzIG1lY2hhbmlzbQotICAgICAqIGRvZXMgbm90IGhhdmUgdGhlIGFiaWxpdHkgdG8gbG9hZCBjb250ZW50IGZyb20gdGhlIG5ldHdvcmsuCi0gICAgICogQHBhcmFtIGRhdGEgQSBTdHJpbmcgb2YgZGF0YSBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcuIFRoZSBkYXRlIG11c3QKLSAgICAgKiBiZSBVUkktZXNjYXBlZCAtLSAnIycsICclJywgJ1wnLCAnPycgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5ICUyMywgJTI1LAotICAgICAqICUyNywgJTNmIHJlc3BlY3RpdmVseS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIE1JTUVUeXBlIG9mIHRoZSBkYXRhLiBpLmUuIHRleHQvaHRtbCwgaW1hZ2UvanBlZwotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGhlIGRhdGEuIGkuZS4gdXRmLTgsIGJhc2U2NAorICAgICAqIExvYWQgdGhlIGdpdmVuIGRhdGEgaW50byB0aGUgV2ViVmlldyB1c2luZyBhICdkYXRhJyBzY2hlbWUgVVJMLiBDb250ZW50CisgICAgICogbG9hZGVkIGluIHRoaXMgd2F5IGRvZXMgbm90IGhhdmUgdGhlIGFiaWxpdHkgdG8gbG9hZCBjb250ZW50IGZyb20gdGhlCisgICAgICogbmV0d29yay4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlciBpcyAnYmFzZTY0JywgdGhlbiB0aGUgZGF0YSBtdXN0CisgICAgICogYmUgZW5jb2RlZCBhcyBiYXNlNjQuIE90aGVyd2lzZSwgdGhlIGRhdGEgbXVzdCB1c2UgQVNDSUkgZW5jb2RpbmcgZm9yCisgICAgICogb2N0ZXRzIGluc2lkZSB0aGUgcmFuZ2Ugb2Ygc2FmZSBVUkwgY2hhcmFjdGVycyBhbmQgdXNlIHRoZSBzdGFuZGFyZCAleHgKKyAgICAgKiBoZXggZW5jb2Rpbmcgb2YgVVJMcyBmb3Igb2N0ZXRzIG91dHNpZGUgdGhhdCByYW5nZS4KKyAgICAgKiBAcGFyYW0gZGF0YSBBIFN0cmluZyBvZiBkYXRhIGluIHRoZSBnaXZlbiBlbmNvZGluZy4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIE1JTUVUeXBlIG9mIHRoZSBkYXRhLCBlLmcuICd0ZXh0L2h0bWwnLgorICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGhlIGRhdGEuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9hZERhdGEoU3RyaW5nIGRhdGEsIFN0cmluZyBtaW1lVHlwZSwgU3RyaW5nIGVuY29kaW5nKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CkBAIC0xOTI3LDcgKzE5ODksMTQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbG9hZERhdGFJbXBsKFN0cmluZyBkYXRhLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBlbmNvZGluZykgewotICAgICAgICBsb2FkVXJsSW1wbCgiZGF0YToiICsgbWltZVR5cGUgKyAiOyIgKyBlbmNvZGluZyArICIsIiArIGRhdGEpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGRhdGFVcmwgPSBuZXcgU3RyaW5nQnVpbGRlcigiZGF0YToiKTsKKyAgICAgICAgZGF0YVVybC5hcHBlbmQobWltZVR5cGUpOworICAgICAgICBpZiAoImJhc2U2NCIuZXF1YWxzKGVuY29kaW5nKSkgeworICAgICAgICAgICAgZGF0YVVybC5hcHBlbmQoIjtiYXNlNjQiKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhVXJsLmFwcGVuZCgiLCIpOworICAgICAgICBkYXRhVXJsLmFwcGVuZChkYXRhKTsKKyAgICAgICAgbG9hZFVybEltcGwoZGF0YVVybC50b1N0cmluZygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5MzYsMTMgKzIwMDUsOSBAQAogICAgICAqIHRoYXQgaXMgbG9hZGVkIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuIEFzIHN1Y2gsIGl0IGlzIHVzZWQgdG8gcmVzb2x2ZSBhbnkKICAgICAgKiByZWxhdGl2ZSBVUkxzLiBUaGUgaGlzdG9yeVVybCBpcyB1c2VkIGZvciB0aGUgaGlzdG9yeSBlbnRyeS4KICAgICAgKiA8cD4KLSAgICAgKiBOb3RlIGZvciBwb3N0IDEuMC4gRHVlIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIFdlYktpdCwgdGhlIGFjY2VzcyB0byBhc3NldAotICAgICAqIGZpbGVzIHRocm91Z2ggImZpbGU6Ly8vYW5kcm9pZF9hc3NldC8iIGZvciB0aGUgc3ViIHJlc291cmNlcyBpcyBtb3JlCi0gICAgICogcmVzdHJpY3RlZC4gSWYgeW91IHByb3ZpZGUgbnVsbCBvciBlbXB0eSBzdHJpbmcgYXMgYmFzZVVybCwgeW91IHdvbid0IGJlCi0gICAgICogYWJsZSB0byBhY2Nlc3MgYXNzZXQgZmlsZXMuIElmIHRoZSBiYXNlVXJsIGlzIGFueXRoaW5nIG90aGVyIHRoYW4KLSAgICAgKiBodHRwKHMpL2Z0cChzKS9hYm91dC9qYXZhc2NyaXB0IGFzIHNjaGVtZSwgeW91IGNhbiBhY2Nlc3MgYXNzZXQgZmlsZXMgZm9yCi0gICAgICogc3ViIHJlc291cmNlcy4KLSAgICAgKgorICAgICAqIE5vdGUgdGhhdCBjb250ZW50IHNwZWNpZmllZCBpbiB0aGlzIHdheSBjYW4gYWNjZXNzIGxvY2FsIGRldmljZSBmaWxlcworICAgICAqICh2aWEgJ2ZpbGUnIHNjaGVtZSBVUkxzKSBvbmx5IGlmIGJhc2VVcmwgc3BlY2lmaWVzIGEgc2NoZW1lIG90aGVyIHRoYW4KKyAgICAgKiAnaHR0cCcsICdodHRwcycsICdmdHAnLCAnZnRwcycsICdhYm91dCcgb3IgJ2phdmFzY3JpcHQnLgogICAgICAqIEBwYXJhbSBiYXNlVXJsIFVybCB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGhzIHdpdGgsIGlmIG51bGwgZGVmYXVsdHMgdG8KICAgICAgKiAgICAgICAgICAgICJhYm91dDpibGFuayIKICAgICAgKiBAcGFyYW0gZGF0YSBBIFN0cmluZyBvZiBkYXRhIGluIHRoZSBnaXZlbiBlbmNvZGluZy4KQEAgLTI2NjQsMTAgKzI3MjksMTIgQEAKICAgICAgICAgY2FsY091ckNvbnRlbnRWaXNpYmxlUmVjdChyZWN0KTsKICAgICAgICAgLy8gUmVjdC5lcXVhbHMoKSBjaGVja3MgZm9yIG51bGwgaW5wdXQuCiAgICAgICAgIGlmICghcmVjdC5lcXVhbHMobUxhc3RWaXNpYmxlUmVjdFNlbnQpKSB7Ci0gICAgICAgICAgICBQb2ludCBwb3MgPSBuZXcgUG9pbnQocmVjdC5sZWZ0LCByZWN0LnRvcCk7Ci0gICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoRXZlbnRIdWIuU0VUX1NDUk9MTF9PRkZTRVQpOwotICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9TQ1JPTExfT0ZGU0VULAotICAgICAgICAgICAgICAgICAgICBuYXRpdmVNb3ZlR2VuZXJhdGlvbigpLCBtU2VuZFNjcm9sbEV2ZW50ID8gMSA6IDAsIHBvcyk7CisgICAgICAgICAgICBpZiAoIW1CbG9ja1dlYmtpdFZpZXdNZXNzYWdlcykgeworICAgICAgICAgICAgICAgIFBvaW50IHBvcyA9IG5ldyBQb2ludChyZWN0LmxlZnQsIHJlY3QudG9wKTsKKyAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUucmVtb3ZlTWVzc2FnZXMoRXZlbnRIdWIuU0VUX1NDUk9MTF9PRkZTRVQpOworICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfU0NST0xMX09GRlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZU1vdmVHZW5lcmF0aW9uKCksIG1TZW5kU2Nyb2xsRXZlbnQgPyAxIDogMCwgcG9zKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VmlzaWJsZVJlY3RTZW50ID0gcmVjdDsKICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhTV0lUQ0hfVE9fTE9OR1BSRVNTKTsKICAgICAgICAgfQpAQCAtMjY4Miw3ICsyNzQ5LDkgQEAKICAgICAgICAgICAgIC8vIFRPRE86IHRoZSBnbG9iYWwgb2Zmc2V0IGlzIG9ubHkgdXNlZCBieSB3aW5kb3dSZWN0KCkKICAgICAgICAgICAgIC8vIGluIENocm9tZUNsaWVudEFuZHJvaWQgOyBvdGhlciBjbGllbnRzIHN1Y2ggYXMgdG91Y2gKICAgICAgICAgICAgIC8vIGFuZCBtb3VzZSBldmVudHMgY291bGQgcmV0dXJuIHZpZXcgKyBzY3JlZW4gcmVsYXRpdmUgcG9pbnRzLgotICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9HTE9CQUxfQk9VTkRTLCBnbG9iYWxSZWN0KTsKKyAgICAgICAgICAgIGlmICghbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzKSB7CisgICAgICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLlNFVF9HTE9CQUxfQk9VTkRTLCBnbG9iYWxSZWN0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0R2xvYmFsUmVjdCA9IGdsb2JhbFJlY3Q7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlY3Q7CkBAIC0yNzAzLDcgKzI3NzIsNyBAQAogICAgICAgICAvLyB0aGUgdmlzaWJsZSBoZWlnaHQgYmFjayBpbiB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IGlmIHRoZSB0aXRsZQogICAgICAgICAvLyBiYXIgaXMgcGFydGlhbGx5IHZpc2libGUsIHRoZSBwYXJ0IG9mIHRoZSB2aXNpYmxlIHJlY3Qgd2hpY2ggaXMKICAgICAgICAgLy8gZGlzcGxheWluZyBvdXIgY29udGVudCBpcyBkaXNwbGFjZWQgYnkgdGhhdCBhbW91bnQuCi0gICAgICAgIHIudG9wID0gdmlld1RvQ29udGVudFkoci50b3AgKyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSk7CisgICAgICAgIHIudG9wID0gdmlld1RvQ29udGVudFkoci50b3AgKyBnZXRWaXNpYmxlVGl0bGVIZWlnaHRJbXBsKCkpOwogICAgICAgICByLnJpZ2h0ID0gdmlld1RvQ29udGVudFgoci5yaWdodCk7CiAgICAgICAgIHIuYm90dG9tID0gdmlld1RvQ29udGVudFkoci5ib3R0b20pOwogICAgIH0KQEAgLTI3MjAsNyArMjc4OSw3IEBACiAgICAgICAgIC8vIHRoZSB2aXNpYmxlIGhlaWdodCBiYWNrIGluIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgaWYgdGhlIHRpdGxlCiAgICAgICAgIC8vIGJhciBpcyBwYXJ0aWFsbHkgdmlzaWJsZSwgdGhlIHBhcnQgb2YgdGhlIHZpc2libGUgcmVjdCB3aGljaCBpcwogICAgICAgICAvLyBkaXNwbGF5aW5nIG91ciBjb250ZW50IGlzIGRpc3BsYWNlZCBieSB0aGF0IGFtb3VudC4KLSAgICAgICAgci50b3AgPSB2aWV3VG9Db250ZW50WWYocmkudG9wICsgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkpOworICAgICAgICByLnRvcCA9IHZpZXdUb0NvbnRlbnRZZihyaS50b3AgKyBnZXRWaXNpYmxlVGl0bGVIZWlnaHRJbXBsKCkpOwogICAgICAgICByLnJpZ2h0ID0gdmlld1RvQ29udGVudFhmKHJpLnJpZ2h0KTsKICAgICAgICAgci5ib3R0b20gPSB2aWV3VG9Db250ZW50WWYocmkuYm90dG9tKTsKICAgICB9CkBAIC0yNzQ3LDYgKzI4MTYsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBuZXcgdmFsdWVzIHdlcmUgc2VudAogICAgICAqLwogICAgIGJvb2xlYW4gc2VuZFZpZXdTaXplWm9vbShib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGlmIChtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKG1ab29tTWFuYWdlci5pc1ByZXZlbnRpbmdXZWJraXRVcGRhdGVzKCkpIHJldHVybiBmYWxzZTsKIAogICAgICAgICBpbnQgdmlld1dpZHRoID0gZ2V0Vmlld1dpZHRoKCk7CkBAIC0yODY4LDcgKzI5MzgsNyBAQAogICAgICAgICBpZiAobVNjcm9sbFkgPCAwKSB7CiAgICAgICAgICAgICB0IC09IG1TY3JvbGxZOwogICAgICAgICB9Ci0gICAgICAgIHNjcm9sbEJhci5zZXRCb3VuZHMobCwgdCArIGdldFZpc2libGVUaXRsZUhlaWdodCgpLCByLCBiKTsKKyAgICAgICAgc2Nyb2xsQmFyLnNldEJvdW5kcyhsLCB0ICsgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0SW1wbCgpLCByLCBiKTsKICAgICAgICAgc2Nyb2xsQmFyLmRyYXcoY2FudmFzKTsKICAgICB9CiAKQEAgLTI5OTIsNiArMzA2MiwxMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQYWdlQmFja2dyb3VuZENvbG9yKCkgeworICAgICAgICByZXR1cm4gbmF0aXZlR2V0QmFja2dyb3VuZENvbG9yKCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUGF1c2UgYWxsIGxheW91dCwgcGFyc2luZywgYW5kIEphdmFTY3JpcHQgdGltZXJzIGZvciBhbGwgd2Vidmlld3MuIFRoaXMKICAgICAgKiBpcyBhIGdsb2JhbCByZXF1ZXN0cywgbm90IHJlc3RyaWN0ZWQgdG8ganVzdCB0aGlzIHdlYnZpZXcuIFRoaXMgY2FuIGJlCiAgICAgICogdXNlZnVsIGlmIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiBwYXVzZWQuCkBAIC0zMzU5LDkgKzM0MzYsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYWJvcnRBbmltYXRpb24oKTsKICAgICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoUkVTVU1FX1dFQkNPUkVfUFJJT1JJVFkpOwotICAgICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU2VsZWN0aW5nVGV4dCkgewotICAgICAgICAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CisgICAgICAgICAgICAgICAgaWYgKCFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lUHJpb3JpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2VsZWN0aW5nVGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUucmVzdW1lVXBkYXRlUGljdHVyZShtV2ViVmlld0NvcmUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChvbGRYICE9IG1TY3JvbGxYIHx8IG9sZFkgIT0gbVNjcm9sbFkpIHsKICAgICAgICAgICAgICAgICAgICAgc2VuZE91clZpc2libGVSZWN0KCk7CkBAIC00MTkyLDYgKzQyNzEsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludCBnZXRCYXNlTGF5ZXIoKSB7CisgICAgICAgIHJldHVybiBuYXRpdmVHZXRCYXNlTGF5ZXIoKTsKKyAgICB9CisKICAgICBwcml2YXRlIHZvaWQgb25ab29tQW5pbWF0aW9uU3RhcnQoKSB7CiAgICAgICAgIC8vIElmIGl0IGlzIGluIHBhc3N3b3JkIG1vZGUsIHR1cm4gaXQgb2ZmIHNvIGl0IGRvZXMgbm90IGRyYXcgbWlzcGxhY2VkLgogICAgICAgICBpZiAoaW5FZGl0aW5nTW9kZSgpICYmIG5hdGl2ZUZvY3VzQ2FuZGlkYXRlSXNQYXNzd29yZCgpKSB7CkBAIC00MjE1LDcgKzQyOTgsNyBAQAogICAgIH0KIAogICAgIHZvaWQgb25GaXhlZExlbmd0aFpvb21BbmltYXRpb25FbmQoKSB7Ci0gICAgICAgIGlmICghbVNlbGVjdGluZ1RleHQpIHsKKyAgICAgICAgaWYgKCFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMgJiYgIW1TZWxlY3RpbmdUZXh0KSB7CiAgICAgICAgICAgICBXZWJWaWV3Q29yZS5yZXN1bWVVcGRhdGVQaWN0dXJlKG1XZWJWaWV3Q29yZSk7CiAgICAgICAgIH0KICAgICAgICAgb25ab29tQW5pbWF0aW9uRW5kKCk7CkBAIC00MzE2LDcgKzQzOTksNyBAQAogICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIHByb2JsZW0gd2l0aCBsYXllcnMuCiAgICAgICAgICAgICBpbnQgY29udGVudCA9IG5hdGl2ZURyYXcoY2FudmFzLCBjb2xvciwgZXh0cmFzLCBmYWxzZSk7CiAgICAgICAgICAgICBjYW52YXMuc2V0RHJhd0ZpbHRlcihudWxsKTsKLSAgICAgICAgICAgIGlmIChjb250ZW50ICE9IDApIHsKKyAgICAgICAgICAgIGlmICghbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzICYmIGNvbnRlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TUExJVF9QSUNUVVJFX1NFVCwgY29udGVudCwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ3MjAsNiArNDgwMyw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbktleU11bHRpcGxlKGludCBrZXlDb2RlLCBpbnQgcmVwZWF0Q291bnQsIEtleUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgICAgICAvLyBzZW5kIGNvbXBsZXggY2hhcmFjdGVycyB0byB3ZWJraXQgZm9yIHVzZSBieSBKUyBhbmQgcGx1Z2lucwogICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1VOS05PV04gJiYgZXZlbnQuZ2V0Q2hhcmFjdGVycygpICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIHBhc3MgdGhlIGtleSB0byBET00KQEAgLTQ3NDQsNiArNDgzMCw5IEBACiAgICAgICAgICAgICAgICAgICAgICsgImtleUNvZGU9IiArIGtleUNvZGUKICAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgZXZlbnQgKyAiLCB1bmljb2RlPSIgKyBldmVudC5nZXRVbmljb2RlQ2hhcigpKTsKICAgICAgICAgfQorICAgICAgICBpZiAobUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAogICAgICAgICAvLyBkb24ndCBpbXBsZW1lbnQgYWNjZWxlcmF0b3Iga2V5cyBoZXJlOyBkZWZlciB0byBob3N0IGFwcGxpY2F0aW9uCiAgICAgICAgIGlmIChldmVudC5pc0N0cmxQcmVzc2VkKCkpIHsKQEAgLTQ5NDcsNiArNTAzNiw5IEBACiAgICAgICAgICAgICBMb2cudihMT0dUQUcsICJrZXlVcCBhdCAiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKICAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgZXZlbnQgKyAiLCB1bmljb2RlPSIgKyBldmVudC5nZXRVbmljb2RlQ2hhcigpKTsKICAgICAgICAgfQorICAgICAgICBpZiAobUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTUwOTgsNyArNTE5MCw3IEBACiAgICAgICAgICAgICBSZWN0IHJlY3QgPSBuYXRpdmVDdXJzb3JOb2RlQm91bmRzKCk7CiAgICAgICAgICAgICBtU2VsZWN0WCA9IGNvbnRlbnRUb1ZpZXdYKHJlY3QubGVmdCk7CiAgICAgICAgICAgICBtU2VsZWN0WSA9IGNvbnRlbnRUb1ZpZXdZKHJlY3QudG9wKTsKLSAgICAgICAgfSBlbHNlIGlmIChtTGFzdFRvdWNoWSA+IGdldFZpc2libGVUaXRsZUhlaWdodCgpKSB7CisgICAgICAgIH0gZWxzZSBpZiAobUxhc3RUb3VjaFkgPiBnZXRWaXNpYmxlVGl0bGVIZWlnaHRJbXBsKCkpIHsKICAgICAgICAgICAgIG1TZWxlY3RYID0gbVNjcm9sbFggKyBtTGFzdFRvdWNoWDsKICAgICAgICAgICAgIG1TZWxlY3RZID0gbVNjcm9sbFkgKyBtTGFzdFRvdWNoWTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTU0MTYsNyArNTUwOCw3IEBACiAgICAgICAgICAgICBpbnQgcm9vdFZpZXdIZWlnaHQgPSByb290Vmlldy5nZXRIZWlnaHQoKTsKICAgICAgICAgICAgIG1WaWV3UmVjdFZpZXdwb3J0LnNldChtR0xSZWN0Vmlld3BvcnQpOwogICAgICAgICAgICAgaW50IHNhdmVkV2ViVmlld0JvdHRvbSA9IG1HTFJlY3RWaWV3cG9ydC5ib3R0b207Ci0gICAgICAgICAgICBtR0xSZWN0Vmlld3BvcnQuYm90dG9tID0gcm9vdFZpZXdIZWlnaHQgLSBtR0xSZWN0Vmlld3BvcnQudG9wIC0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCk7CisgICAgICAgICAgICBtR0xSZWN0Vmlld3BvcnQuYm90dG9tID0gcm9vdFZpZXdIZWlnaHQgLSBtR0xSZWN0Vmlld3BvcnQudG9wIC0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0SW1wbCgpOwogICAgICAgICAgICAgbUdMUmVjdFZpZXdwb3J0LnRvcCA9IHJvb3RWaWV3SGVpZ2h0IC0gc2F2ZWRXZWJWaWV3Qm90dG9tOwogICAgICAgICAgICAgbUdMVmlld3BvcnRFbXB0eSA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewpAQCAtNTQ1OCw2ICs1NTUwLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBtWm9vbU1hbmFnZXIub25TaXplQ2hhbmdlZCh3LCBoLCBvdywgb2gpOworCisgICAgICAgIGlmIChtTG9hZGVkUGljdHVyZSAhPSBudWxsICYmIG1EZWxheVNldFBpY3R1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gU2l6ZSBjaGFuZ2VzIG5vcm1hbGx5IHJlc3VsdCBpbiBhIG5ldyBwaWN0dXJlCisgICAgICAgICAgICAvLyBSZS1zZXQgdGhlIGxvYWRlZCBwaWN0dXJlIHRvIHNpbXVsYXRlIHRoYXQKKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGRvIG5vdCB1cGRhdGUgdGhlIGJhc2UgbGF5ZXIgYXMgdGhhdCBoYXNuJ3QgY2hhbmdlZAorICAgICAgICAgICAgc2V0TmV3UGljdHVyZShtTG9hZGVkUGljdHVyZSwgZmFsc2UpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC01NDY2LDcgKzU1NjUsNyBAQAogICAgICAgICBpZiAoIW1Jbk92ZXJTY3JvbGxNb2RlKSB7CiAgICAgICAgICAgICBzZW5kT3VyVmlzaWJsZVJlY3QoKTsKICAgICAgICAgICAgIC8vIHVwZGF0ZSBXZWJLaXQgaWYgdmlzaWJsZSB0aXRsZSBiYXIgaGVpZ2h0IGNoYW5nZWQuIFRoZSBsb2dpYyBpcyBzYW1lCi0gICAgICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHQuCisgICAgICAgICAgICAvLyBhcyBnZXRWaXNpYmxlVGl0bGVIZWlnaHRJbXBsLgogICAgICAgICAgICAgaW50IHRpdGxlSGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsKICAgICAgICAgICAgIGlmIChNYXRoLm1heCh0aXRsZUhlaWdodCAtIHQsIDApICE9IE1hdGgubWF4KHRpdGxlSGVpZ2h0IC0gb2xkdCwgMCkpIHsKICAgICAgICAgICAgICAgICBzZW5kVmlld1NpemVab29tKGZhbHNlKTsKQEAgLTU1MDksMTUgKzU2MDgsMzEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEhlcmUgYXJlIHRoZSBzbmFwIGFsaWduIGxvZ2ljOgotICAgIC8vIDEuIElmIGl0IHN0YXJ0cyBuZWFybHkgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHksIHNuYXAgYWxpZ247Ci0gICAgLy8gMi4gSWYgdGhlcmUgaXMgYSBkcmFtaXRpYyBkaXJlY3Rpb24gY2hhbmdlLCBsZXQgaXQgZ287Ci0gICAgLy8gMy4gSWYgdGhlcmUgaXMgYSBzYW1lIGRpcmVjdGlvbiBiYWNrIGFuZCBmb3J0aCwgbG9jayBpdC4KLQotICAgIC8vIGFkanVzdGFibGUgcGFyYW1ldGVycwotICAgIHByaXZhdGUgaW50IG1NaW5Mb2NrU25hcFJldmVyc2VEaXN0YW5jZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfU0xPUEVfRk9SX0RJQUcgPSAxLjVmOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fQlJFQUtfU05BUF9DUk9TU19ESVNUQU5DRSA9IDgwOworICAgIC8qCisgICAgICogSGVyZSBpcyB0aGUgc25hcCBhbGlnbiBsb2dpYzoKKyAgICAgKiAxLiBJZiBpdCBzdGFydHMgbmVhcmx5IGhvcml6b250YWxseSBvciB2ZXJ0aWNhbGx5LCBzbmFwIGFsaWduOworICAgICAqIDIuIElmIHRoZXJlIGlzIGEgZHJhbWl0aWMgZGlyZWN0aW9uIGNoYW5nZSwgbGV0IGl0IGdvOworICAgICAqCisgICAgICogQWRqdXN0YWJsZSBwYXJhbWV0ZXJzLiBBbmdsZSBpcyB0aGUgcmFkaWFucyBvbiBhIHVuaXQgY2lyY2xlLCBsaW1pdGVkCisgICAgICogdG8gcXVhZHJhbnQgMS4gVmFsdWVzIHJhbmdlIGZyb20gMGYgKGhvcml6b250YWwpIHRvIFBJLzIgKHZlcnRpY2FsKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhTTE9QRV9UT19TVEFSVF9TTkFQID0gLjI1ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBIU0xPUEVfVE9fQlJFQUtfU05BUCA9IC40ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBWU0xPUEVfVE9fU1RBUlRfU05BUCA9IDEuMjVmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFZTTE9QRV9UT19CUkVBS19TTkFQID0gLjk1ZjsKKyAgICAvKgorICAgICAqICBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gaW5mbHVlbmNlIHRoZSBhdmVyYWdlIGFuZ2xlIHdoZW4gZW50ZXJpbmcKKyAgICAgKiAgc25hcCBtb2RlLiBJZiBpcyBpcyB0aGUgZmlyc3QgbW92ZW1lbnQgZW50ZXJpbmcgc25hcCwgd2Ugc2V0IHRoZSBhdmVyYWdlCisgICAgICogIHRvIHRoZSBhcHByb3ByaWF0ZSBpZGVhbC4gSWYgdGhlIHVzZXIgaXMgZW50ZXJpbmcgaW50byBzbmFwIGFmdGVyIHRoZQorICAgICAqICBmaXJzdCBtb3ZlbWVudCwgdGhlbiB3ZSBhdmVyYWdlIHRoZSBhdmVyYWdlIGFuZ2xlIHdpdGggdGhlc2UgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEFOR0xFX1ZFUlQgPSAyZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBBTkdMRV9IT1JJWiA9IDBmOworICAgIC8qCisgICAgICogIFRoZSBtb2RpZmllZCBtb3ZpbmcgYXZlcmFnZSB3ZWlnaHQuCisgICAgICogIEZvcm11bGE6IE1BVlt0XT1NQVZbdC0xXSArIChQW3RdLU1BVlt0LTFdKS9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTU1BX1dFSUdIVF9OID0gNTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBoaXRGb2N1c2VkUGx1Z2luKGludCBjb250ZW50WCwgaW50IGNvbnRlbnRZKSB7CiAgICAgICAgIGlmIChEZWJ1Z0ZsYWdzLldFQl9WSUVXKSB7CkBAIC01NTMxLDEwICs1NjQ2LDEyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEZvcndhcmRUb3VjaEV2ZW50KCkgewotICAgICAgICByZXR1cm4gbUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbCB8fCAobUZvcndhcmRUb3VjaEV2ZW50cworICAgICAgICBpZiAobUZ1bGxTY3JlZW5Ib2xkZXIgIT0gbnVsbCkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG1Gb3J3YXJkVG91Y2hFdmVudHMKICAgICAgICAgICAgICAgICAmJiAhbVNlbGVjdGluZ1RleHQKICAgICAgICAgICAgICAgICAmJiBtUHJldmVudERlZmF1bHQgIT0gUFJFVkVOVF9ERUZBVUxUX0lHTk9SRQotICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfTk8pOworICAgICAgICAgICAgICAgICYmIG1QcmV2ZW50RGVmYXVsdCAhPSBQUkVWRU5UX0RFRkFVTFRfTk87CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGluRnVsbFNjcmVlbk1vZGUoKSB7CkBAIC01NTQzLDcgKzU2NjAsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGRpc21pc3NGdWxsU2NyZWVuTW9kZSgpIHsKICAgICAgICAgaWYgKGluRnVsbFNjcmVlbk1vZGUoKSkgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuZGlzbWlzcygpOworICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuaGlkZSgpOwogICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIgPSBudWxsOwogICAgICAgICB9CiAgICAgfQpAQCAtNTYyMSw2ICs1NzM4LDEyIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIHByaXZhdGUgZmxvYXQgY2FsY3VsYXRlRHJhZ0FuZ2xlKGludCBkeCwgaW50IGR5KSB7CisgICAgICAgIGR4ID0gTWF0aC5hYnMoZHgpOworICAgICAgICBkeSA9IE1hdGguYWJzKGR5KTsKKyAgICAgICAgcmV0dXJuIChmbG9hdCkgTWF0aC5hdGFuMihkeSwgZHgpOworICAgIH0KKwogICAgIC8qCiAgICAgICogQ29tbW9uIGNvZGUgZm9yIHNpbmdsZSB0b3VjaCBhbmQgbXVsdGktdG91Y2guCiAgICAgICogKHgsIHkpIGRlbm90ZXMgY3VycmVudCBmb2N1cyBwb2ludCwgd2hpY2ggaXMgdGhlIHRvdWNoIHBvaW50IGZvciBzaW5nbGUgdG91Y2gKQEAgLTU2NjUsMjUgKzU3ODgsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1pdCB0aGUgc2hvcnQgcHJlc3MgYWN0aW9uIGZvciB0aGUgcHJldmlvdXMgdGFwCiAgICAgICAgICAgICAgICAgICAgICAgICBkb1Nob3J0UHJlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9JTklUX01PREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaFByb2Nlc3MgPSAoIWluRnVsbFNjcmVlbk1vZGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRm9yd2FyZFRvdWNoRXZlbnRzKSA/IGhpdEZvY3VzZWRQbHVnaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRYLCBjb250ZW50WSkgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFpbkZ1bGxTY3JlZW5Nb2RlKCkgJiYgbUZvcndhcmRUb3VjaEV2ZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBoaXRGb2N1c2VkUGx1Z2luKGNvbnRlbnRYLCBjb250ZW50WSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRoZSBub3JtYWwgY2FzZQogICAgICAgICAgICAgICAgICAgICBtVG91Y2hNb2RlID0gVE9VQ0hfSU5JVF9NT0RFOwotICAgICAgICAgICAgICAgICAgICBtRGVmZXJUb3VjaFByb2Nlc3MgPSAoIWluRnVsbFNjcmVlbk1vZGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Gb3J3YXJkVG91Y2hFdmVudHMpID8gaGl0Rm9jdXNlZFBsdWdpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50WCwgY29udGVudFkpIDogZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5VUERBVEVfRlJBTUVfQ0FDSEVfSUZfTE9BRElORyk7CisgICAgICAgICAgICAgICAgICAgIG1EZWZlclRvdWNoUHJvY2VzcyA9ICFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWluRnVsbFNjcmVlbk1vZGUoKSAmJiBtRm9yd2FyZFRvdWNoRXZlbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaGl0Rm9jdXNlZFBsdWdpbihjb250ZW50WCwgY29udGVudFkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuVVBEQVRFX0ZSQU1FX0NBQ0hFX0lGX0xPQURJTkcpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRTZXR0aW5ncygpLnN1cHBvcnRUb3VjaE9ubHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVG91Y2hIaWdobGlnaHREYXRhIGRhdGEgPSBuZXcgVG91Y2hIaWdobGlnaHREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1YID0gY29udGVudFg7CiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1ZID0gY29udGVudFk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1TbG9wID0gdmlld1RvQ29udGVudERpbWVuc2lvbihtTmF2U2xvcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2VEZWxheWVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEh1Yi5HRVRfVE9VQ0hfSElHSExJR0hUX1JFQ1RTLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3Q29uZmlndXJhdGlvbi5nZXRUYXBUaW1lb3V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2VEZWxheWVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIdWIuR0VUX1RPVUNIX0hJR0hMSUdIVF9SRUNUUywgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdDb25maWd1cmF0aW9uLmdldFRhcFRpbWVvdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfVE9VQ0hfSElHSExJR0hUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFNldHRpbmdzKCkuZ2V0TmF2RHVtcCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEhpZ2hsaWdodFggPSAoaW50KSB4ICsgbVNjcm9sbFg7CkBAIC01NzE5LDcgKzU4NDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSVRDSF9UT19MT05HUFJFU1MsIExPTkdfUFJFU1NfVElNRU9VVCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkgfHwgbURlZmVyVG91Y2hQcm9jZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBQUkVWRU5UX0RFRkFVTFRfWUVTOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Gb3J3YXJkVG91Y2hFdmVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzICYmIG1Gb3J3YXJkVG91Y2hFdmVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2ZW50RGVmYXVsdCA9IFBSRVZFTlRfREVGQVVMVF9NQVlCRV9ZRVM7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmVudERlZmF1bHQgPSBQUkVWRU5UX0RFRkFVTFRfTk87CkBAIC01ODYwLDE2ICs1OTg5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1ab29tTWFuYWdlci5zdXBwb3J0c1BhbkR1cmluZ1pvb20oKSBpcyB0cnVlLgogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvciA9CiAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLmdldE11bHRpVG91Y2hHZXN0dXJlRGV0ZWN0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VBbmdsZSA9IGNhbGN1bGF0ZURyYWdBbmdsZShkZWx0YVgsIGRlbHRhWSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRlY3RvciA9PSBudWxsIHx8ICFkZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQgc3RhcnRzIG5lYXJseSBob3Jpem9udGFsIG9yIHZlcnRpY2FsLCBlbmZvcmNlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXggPSBNYXRoLmFicyhkZWx0YVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF5ID0gTWF0aC5hYnMoZGVsdGFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChheCA+IE1BWF9TTE9QRV9GT1JfRElBRyAqIGF5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF2ZXJhZ2VBbmdsZSA8IEhTTE9QRV9UT19TVEFSVF9TTkFQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9YOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbmFwUG9zaXRpdmUgPSBkZWx0YVggPiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChheSA+IE1BWF9TTE9QRV9GT1JfRElBRyAqIGF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VBbmdsZSA9IEFOR0xFX0hPUklaOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQXZlcmFnZUFuZ2xlID4gVlNMT1BFX1RPX1NUQVJUX1NOQVApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU25hcFNjcm9sbE1vZGUgPSBTTkFQX1k7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNuYXBQb3NpdGl2ZSA9IGRlbHRhWSA+IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VBbmdsZSA9IEFOR0xFX1ZFUlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNTg4OSwzNSArNjAxOSwzMSBAQAogICAgICAgICAgICAgICAgIGlmIChkZWx0YVggPT0gMCAmJiBkZWx0YVkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBrZWVwU2Nyb2xsQmFyc1Zpc2libGUgPSBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNuYXBTY3JvbGxNb2RlID09IFNOQVBfWCB8fCBtU25hcFNjcm9sbE1vZGUgPT0gU05BUF9ZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXggPSBNYXRoLmFicyhkZWx0YVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF5ID0gTWF0aC5hYnMoZGVsdGFZKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VBbmdsZSArPQorICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGN1bGF0ZURyYWdBbmdsZShkZWx0YVgsIGRlbHRhWSkgLSBtQXZlcmFnZUFuZ2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgLyBNTUFfV0VJR0hUX047CisgICAgICAgICAgICAgICAgICAgIGlmIChtU25hcFNjcm9sbE1vZGUgIT0gU05BUF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNuYXBTY3JvbGxNb2RlID09IFNOQVBfWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhZGljYWwgY2hhbmdlIG1lYW5zIGdldHRpbmcgb3V0IG9mIHNuYXAgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXZlcmFnZUFuZ2xlIDwgVlNMT1BFX1RPX0JSRUFLX1NOQVApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU25hcFNjcm9sbE1vZGUgPT0gU05BUF9YKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFkaWNhbCBjaGFuZ2UgbWVhbnMgZ2V0dGluZyBvdXQgb2Ygc25hcCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF5ID4gTUFYX1NMT1BFX0ZPUl9ESUFHICogYXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF5ID4gTUlOX0JSRUFLX1NOQVBfQ1JPU1NfRElTVEFOQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF2ZXJhZ2VBbmdsZSA+IEhTTE9QRV9UT19CUkVBS19TTkFQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbmFwU2Nyb2xsTW9kZSA9IFNOQVBfTk9ORTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBkaXJlY3Rpb24gbWVhbnMgbG9jayBpbiB0aGUgc25hcCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4ID4gTUFYX1NMT1BFX0ZPUl9ESUFHICogYXkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU25hcFBvc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlbHRhWCA8IC1tTWluTG9ja1NuYXBSZXZlcnNlRGlzdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVsdGFYID4gbU1pbkxvY2tTbmFwUmV2ZXJzZURpc3RhbmNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU25hcFNjcm9sbE1vZGUgfD0gU05BUF9MT0NLOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFkaWNhbCBjaGFuZ2UgbWVhbnMgZ2V0dGluZyBvdXQgb2Ygc25hcCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF4ID4gTUFYX1NMT1BFX0ZPUl9ESUFHICogYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF4ID4gTUlOX0JSRUFLX1NOQVBfQ1JPU1NfRElTVEFOQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGRpcmVjdGlvbiBtZWFucyBsb2NrIGluIHRoZSBzbmFwIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXkgPiBNQVhfU0xPUEVfRk9SX0RJQUcgKiBheCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TbmFwUG9zaXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVsdGFZIDwgLW1NaW5Mb2NrU25hcFJldmVyc2VEaXN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWx0YVkgPiBtTWluTG9ja1NuYXBSZXZlcnNlRGlzdGFuY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbmFwU2Nyb2xsTW9kZSB8PSBTTkFQX0xPQ0s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdmVyYWdlQW5nbGUgPCBIU0xPUEVfVE9fU1RBUlRfU05BUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TbmFwU2Nyb2xsTW9kZSA9IFNOQVBfWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU25hcFBvc2l0aXZlID0gZGVsdGFYID4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZlcmFnZUFuZ2xlID0gKG1BdmVyYWdlQW5nbGUgKyBBTkdMRV9IT1JJWikgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQXZlcmFnZUFuZ2xlID4gVlNMT1BFX1RPX1NUQVJUX1NOQVApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU25hcFNjcm9sbE1vZGUgPSBTTkFQX1k7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNuYXBQb3NpdGl2ZSA9IGRlbHRhWSA+IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2ZXJhZ2VBbmdsZSA9IChtQXZlcmFnZUFuZ2xlICsgQU5HTEVfVkVSVCkgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU25hcFNjcm9sbE1vZGUgIT0gU05BUF9OT05FKSB7CkBAIC01OTI3LDEzICs2MDUzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hYID0geDsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OwogICAgICAgICAgICAgICAgICAgICBpZiAoKGRlbHRhWCB8IGRlbHRhWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFggPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhWSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaFkgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbUhlbGRNb3Rpb25sZXNzID0gTU9USU9OTEVTU19GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKQEAgLTYyNDMsOCArNjM2NSw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgc3RhcnRUb3VjaChmbG9hdCB4LCBmbG9hdCB5LCBsb25nIGV2ZW50VGltZSkgewogICAgICAgICAvLyBSZW1lbWJlciB3aGVyZSB0aGUgbW90aW9uIGV2ZW50IHN0YXJ0ZWQKLSAgICAgICAgbUxhc3RUb3VjaFggPSBNYXRoLnJvdW5kKHgpOwotICAgICAgICBtTGFzdFRvdWNoWSA9IE1hdGgucm91bmQoeSk7CisgICAgICAgIG1TdGFydFRvdWNoWCA9IG1MYXN0VG91Y2hYID0gTWF0aC5yb3VuZCh4KTsKKyAgICAgICAgbVN0YXJ0VG91Y2hZID0gbUxhc3RUb3VjaFkgPSBNYXRoLnJvdW5kKHkpOwogICAgICAgICBtTGFzdFRvdWNoVGltZSA9IGV2ZW50VGltZTsKICAgICAgICAgbVZlbG9jaXR5VHJhY2tlciA9IFZlbG9jaXR5VHJhY2tlci5vYnRhaW4oKTsKICAgICAgICAgbVNuYXBTY3JvbGxNb2RlID0gU05BUF9OT05FOwpAQCAtNjM4MCw3ICs2NTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGhzY3JvbGwgIT0gMCB8fCB2c2Nyb2xsICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2ZGVsdGEgPSAoaW50KSAodnNjcm9sbCAqIGdldFZlcnRpY2FsU2Nyb2xsRmFjdG9yKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhkZWx0YSA9IChpbnQpIChoc2Nyb2xsICogZ2V0SG9yaXpvbnRhbFNjcm9sbEZhY3RvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaW5TY3JvbGxCeShoZGVsdGEsIHZkZWx0YSwgdHJ1ZSwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaW5TY3JvbGxCeShoZGVsdGEsIHZkZWx0YSwgZmFsc2UsIDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY0MjIsNiArNjU0NCw5IEBACiAgICAgLy8gYXJyb3cga2V5IGV2ZW50cywgbm90IHRyYWNrYmFsbCBldmVudHMsIGZyb20gb25lIGNoaWxkIHRvIHRoZSBuZXh0CiAgICAgcHJpdmF0ZSBib29sZWFuIG1NYXBUcmFja2JhbGxUb0Fycm93S2V5cyA9IHRydWU7CiAKKyAgICBwcml2YXRlIERyYXdEYXRhIG1EZWxheVNldFBpY3R1cmU7CisgICAgcHJpdmF0ZSBEcmF3RGF0YSBtTG9hZGVkUGljdHVyZTsKKwogICAgIHB1YmxpYyB2b2lkIHNldE1hcFRyYWNrYmFsbFRvQXJyb3dLZXlzKGJvb2xlYW4gc2V0TWFwKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1NYXBUcmFja2JhbGxUb0Fycm93S2V5cyA9IHNldE1hcDsKQEAgLTY3NTUsMTEgKzY4ODAsNiBAQAogICAgICAgICAgICAgICAgIHZ4ID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAodHJ1ZSAvKiBFTUcgcmVsZWFzZTogbWFrZSBvdXIgZmxpbmcgbW9yZSBsaWtlIE1hcHMnICovKSB7Ci0gICAgICAgICAgICAvLyBtYXBzIGN1dHMgdGhlaXIgdmVsb2NpdHkgaW4gaGFsZgotICAgICAgICAgICAgdnggPSB2eCAqIDMgLyA0OwotICAgICAgICAgICAgdnkgPSB2eSAqIDMgLyA0OwotICAgICAgICB9CiAgICAgICAgIGlmICgobWF4WCA9PSAwICYmIHZ5ID09IDApIHx8IChtYXhZID09IDAgJiYgdnggPT0gMCkpIHsKICAgICAgICAgICAgIFdlYlZpZXdDb3JlLnJlc3VtZVByaW9yaXR5KCk7CiAgICAgICAgICAgICBpZiAoIW1TZWxlY3RpbmdUZXh0KSB7CkBAIC03MTk5LDcgKzczMTksNiBAQAogICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZEhlaWdodCA+IGhlaWdodFNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHRTaXplOwogICAgICAgICAgICAgICAgICAgICBtSGVpZ2h0Q2FuTWVhc3VyZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVhc3VyZWRIZWlnaHQgPCBoZWlnaHRTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0IHw9IE1FQVNVUkVEX1NUQVRFX1RPT19TTUFMTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC03ODMxLDYgKzc5NTAsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBhZnRlciBXZWJWaWV3J3MgZGVzdHJveSgpIGlzIGNhbGxlZCwgc2tpcCBoYW5kbGluZyBtZXNzYWdlcy4KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUJsb2NrV2Via2l0Vmlld01lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICYmIG1zZy53aGF0ICE9IFdFQkNPUkVfSU5JVElBTElaRURfTVNHX0lEKSB7CisgICAgICAgICAgICAgICAgLy8gQmxvY2tpbmcgbWVzc2FnZXMgZnJvbSB3ZWJraXQKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CiAgICAgICAgICAgICAgICAgY2FzZSBSRU1FTUJFUl9QQVNTV09SRDogewogICAgICAgICAgICAgICAgICAgICBtRGF0YWJhc2Uuc2V0VXNlcm5hbWVQYXNzd29yZCgKQEAgLTc5NjYsNjYgKzgwOTAsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgTkVXX1BJQ1RVUkVfTVNHX0lEOiB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmb3IgbmV3IGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2ViVmlld0NvcmUuRHJhd0RhdGEgZHJhdyA9IChXZWJWaWV3Q29yZS5EcmF3RGF0YSkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgV2ViVmlld0NvcmUuVmlld1N0YXRlIHZpZXdTdGF0ZSA9IGRyYXcubVZpZXdTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0ID0gdmlld1N0YXRlICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNldEJhc2VMYXllcihkcmF3Lm1CYXNlTGF5ZXIsIGRyYXcubUludmFsUmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNldHRpbmdzKCkuZ2V0U2hvd1Zpc3VhbEluZGljYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQb2ludCB2aWV3U2l6ZSA9IGRyYXcubVZpZXdTaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxhc3Qgc2VudCBkYXRhIGhlcmUgc2luY2UgZGVhbGluZyB3aXRoIG5ldyBwYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RXaWR0aFNlbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21NYW5hZ2VyLm9uRmlyc3RMYXlvdXQoZHJhdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3SGlzdG9yeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZW5kIHRoZSBzY3JvbGwgZXZlbnQgZm9yIHRoaXMgcGFydGljdWxhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCBtZXNzYWdlLiAgTm90ZSB0aGF0IGEgc2Nyb2xsIGV2ZW50IG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0aWxsIGJlIGZpcmVkIGlmIHRoZSB1c2VyIHNjcm9sbHMgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgY2FuIGJlIGhhbmRsZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnRTY3JvbGxUbyh2aWV3U3RhdGUubVNjcm9sbFgsIHZpZXdTdGF0ZS5tU2Nyb2xsWSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcyB3ZSBhcmUgb24gYSBuZXcgcGFnZSwgcmVtb3ZlIHRoZSBXZWJUZXh0Vmlldy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5lY2Vzc2FyeSBmb3IgcGFnZSBsb2FkcyBkcml2ZW4gYnkgd2Via2l0LCBhbmQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIHdoZW4gdGhlIHVzZXIgd2FzIG9uIGEgcGFzc3dvcmQgZmllbGQsIHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFdlYlRleHRWaWV3IHdhcyB2aXNpYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGV4dEVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBXZSB1cGRhdGUgdGhlIGxheW91dCAoaS5lLiByZXF1ZXN0IGEgbGF5b3V0IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHZpZXcgc3lzdGVtKSBpZiB0aGUgbGFzdCB2aWV3IHNpemUgdGhhdCB3ZSBzZW50IHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlYkNvcmUgbWF0Y2hlcyB0aGUgdmlldyBzaXplIG9mIHRoZSBwaWN0dXJlIHdlIGp1c3QKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVjZWl2ZWQgaW4gdGhlIGZpeGVkIGRpbWVuc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB1cGRhdGVMYXlvdXQgPSB2aWV3U2l6ZS54ID09IG1MYXN0V2lkdGhTZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdmlld1NpemUueSA9PSBtTGFzdEhlaWdodFNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNlbmQgc2Nyb2xsIGV2ZW50IGZvciBwaWN0dXJlIGNvbWluZyBmcm9tIHdlYmtpdCwKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIG5ldyBwaWN0dXJlIG1heSBjYXVzZSBhIHNjcm9sbCBldmVudCB0byBvdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2F2ZWQgaGlzdG9yeSBzY3JvbGwgcG9zaXRpb24uCi0gICAgICAgICAgICAgICAgICAgIG1TZW5kU2Nyb2xsRXZlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkTmV3Q29udGVudFNpemUoZHJhdy5tQ29udGVudFNpemUueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3Lm1Db250ZW50U2l6ZS55LCB1cGRhdGVMYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICBtU2VuZFNjcm9sbEV2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlY3QgYiA9IGRyYXcubUludmFsUmVnaW9uLmdldEJvdW5kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoTE9HVEFHLCAiTkVXX1BJQ1RVUkVfTVNHX0lEIHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sZWZ0KyIsIitiLnRvcCsiLCIrYi5yaWdodCsiLCIrYi5ib3R0b20rIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ29udGVudFJlY3QoZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlTGlzdGVuZXIub25OZXdQaWN0dXJlKFdlYlZpZXcudGhpcywgY2FwdHVyZVBpY3R1cmUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHpvb20gaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIG5ldyBwaWN0dXJlCi0gICAgICAgICAgICAgICAgICAgIG1ab29tTWFuYWdlci5vbk5ld1BpY3R1cmUoZHJhdyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXcubUZvY3VzU2l6ZUNoYW5nZWQgJiYgaW5FZGl0aW5nTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRm9jdXNTaXplQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWV3TWFuYWdlci5wb3N0UmVhZHlUb0RyYXdBbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzZXROZXdQaWN0dXJlKGRyYXcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBXRUJDT1JFX0lOSVRJQUxJWkVEX01TR19JRDoKQEAgLTgwMzQsNiArODA5OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyb3dzZXJGcmFtZS5EUkFXQUJMRURJUiwgbUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICBBc3NldE1hbmFnZXIgYW0gPSBtQ29udGV4dC5nZXRBc3NldHMoKTsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlQ3JlYXRlKG1zZy5hcmcxLCBkcmF3YWJsZURpciwgYW0pOworICAgICAgICAgICAgICAgICAgICBpZiAobURlbGF5U2V0UGljdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXdQaWN0dXJlKG1EZWxheVNldFBpY3R1cmUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlbGF5U2V0UGljdHVyZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVEVYVEZJRUxEX1RFWFRfTVNHX0lEOgogICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgdGV4dGZpZWxkIGlzIGN1cnJlbnRseSBmb2N1c2VkCkBAIC04MTk4LDE2ICs4MjY3LDE1IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIFNIT1dfRlVMTFNDUkVFTjogewogICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSAoVmlldykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5wcCA9IG1zZy5hcmcxOworICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24gPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5wcCA9IG1zZy5hcmcyOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZ1bGxTY3JlZW5Nb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KExPR1RBRywgIlNob3VsZCBub3QgaGF2ZSBhbm90aGVyIGZ1bGwgc2NyZWVuLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc0Z1bGxTY3JlZW5Nb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIgPSBuZXcgUGx1Z2luRnVsbFNjcmVlbkhvbGRlcihXZWJWaWV3LnRoaXMsIG5wcCk7CisgICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuSG9sZGVyID0gbmV3IFBsdWdpbkZ1bGxTY3JlZW5Ib2xkZXIoV2ViVmlldy50aGlzLCBvcmllbnRhdGlvbiwgbnBwKTsKICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuc2V0Q29udGVudFZpZXcodmlldyk7Ci0gICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuSG9sZGVyLnNldENhbmNlbGFibGUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkhvbGRlci5zZXRDYW5jZWxlZE9uVG91Y2hPdXRzaWRlKGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5Ib2xkZXIuc2hvdygpOwogCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODI2Nyw3ICs4MzM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWF0aC5taW4obWF4SGVpZ2h0LCB5ICsgdmlld0hlaWdodCkgLSB2aWV3SGVpZ2h0KSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHZpc2libGUgdGl0bGUgaGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gc2Nyb2xsaW5nIHNpbmNlIHkgaXMgYW4gYWJzb2x1dGUgdmlldyBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgeSA9IE1hdGgubWF4KDAsIHkgLSBnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBNYXRoLm1heCgwLCB5IC0gZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0SW1wbCgpKTsKICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG8oeCwgeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04MzQ1LDYgKzg0MTMsODAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHZvaWQgc2V0TmV3UGljdHVyZShmaW5hbCBXZWJWaWV3Q29yZS5EcmF3RGF0YSBkcmF3LCBib29sZWFuIHVwZGF0ZUJhc2VMYXllcikgeworICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHsKKyAgICAgICAgICAgIGlmIChtRGVsYXlTZXRQaWN0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUcmllZCB0byBzZXROZXdQaWN0dXJlIHdpdGgiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYSBkZWxheSBwaWN0dXJlIGFscmVhZHkgc2V0ISAobWVtb3J5IGxlYWspIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOb3QgaW5pdGlhbGl6ZWQgeWV0LCBkZWxheSBzZXQKKyAgICAgICAgICAgIG1EZWxheVNldFBpY3R1cmUgPSBkcmF3OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFdlYlZpZXdDb3JlLlZpZXdTdGF0ZSB2aWV3U3RhdGUgPSBkcmF3Lm1WaWV3U3RhdGU7CisgICAgICAgIGJvb2xlYW4gaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCA9IHZpZXdTdGF0ZSAhPSBudWxsOworICAgICAgICBpZiAodXBkYXRlQmFzZUxheWVyKSB7CisgICAgICAgICAgICBzZXRCYXNlTGF5ZXIoZHJhdy5tQmFzZUxheWVyLCBkcmF3Lm1JbnZhbFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2V0dGluZ3MoKS5nZXRTaG93VmlzdWFsSW5kaWNhdG9yKCksCisgICAgICAgICAgICAgICAgICAgIGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBvaW50IHZpZXdTaXplID0gZHJhdy5tVmlld1NpemU7CisgICAgICAgIGlmIChpc1BpY3R1cmVBZnRlckZpcnN0TGF5b3V0KSB7CisgICAgICAgICAgICAvLyBSZXNldCB0aGUgbGFzdCBzZW50IGRhdGEgaGVyZSBzaW5jZSBkZWFsaW5nIHdpdGggbmV3IHBhZ2UuCisgICAgICAgICAgICBtTGFzdFdpZHRoU2VudCA9IDA7CisgICAgICAgICAgICBtWm9vbU1hbmFnZXIub25GaXJzdExheW91dChkcmF3KTsKKyAgICAgICAgICAgIGlmICghbURyYXdIaXN0b3J5KSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90IHNlbmQgdGhlIHNjcm9sbCBldmVudCBmb3IgdGhpcyBwYXJ0aWN1bGFyCisgICAgICAgICAgICAgICAgLy8gc2Nyb2xsIG1lc3NhZ2UuICBOb3RlIHRoYXQgYSBzY3JvbGwgZXZlbnQgbWF5CisgICAgICAgICAgICAgICAgLy8gc3RpbGwgYmUgZmlyZWQgaWYgdGhlIHVzZXIgc2Nyb2xscyBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBjYW4gYmUgaGFuZGxlZC4KKyAgICAgICAgICAgICAgICBtU2VuZFNjcm9sbEV2ZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2V0Q29udGVudFNjcm9sbFRvKHZpZXdTdGF0ZS5tU2Nyb2xsWCwgdmlld1N0YXRlLm1TY3JvbGxZKTsKKyAgICAgICAgICAgICAgICBtU2VuZFNjcm9sbEV2ZW50ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIC8vIEFzIHdlIGFyZSBvbiBhIG5ldyBwYWdlLCByZW1vdmUgdGhlIFdlYlRleHRWaWV3LiBUaGlzCisgICAgICAgICAgICAgICAgLy8gaXMgbmVjZXNzYXJ5IGZvciBwYWdlIGxvYWRzIGRyaXZlbiBieSB3ZWJraXQsIGFuZCBpbgorICAgICAgICAgICAgICAgIC8vIHBhcnRpY3VsYXIgd2hlbiB0aGUgdXNlciB3YXMgb24gYSBwYXNzd29yZCBmaWVsZCwgc28KKyAgICAgICAgICAgICAgICAvLyB0aGUgV2ViVGV4dFZpZXcgd2FzIHZpc2libGUuCisgICAgICAgICAgICAgICAgY2xlYXJUZXh0RW50cnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgbGF5b3V0IChpLmUuIHJlcXVlc3QgYSBsYXlvdXQgZnJvbSB0aGUKKyAgICAgICAgLy8gdmlldyBzeXN0ZW0pIGlmIHRoZSBsYXN0IHZpZXcgc2l6ZSB0aGF0IHdlIHNlbnQgdG8KKyAgICAgICAgLy8gV2ViQ29yZSBtYXRjaGVzIHRoZSB2aWV3IHNpemUgb2YgdGhlIHBpY3R1cmUgd2UganVzdAorICAgICAgICAvLyByZWNlaXZlZCBpbiB0aGUgZml4ZWQgZGltZW5zaW9uLgorICAgICAgICBmaW5hbCBib29sZWFuIHVwZGF0ZUxheW91dCA9IHZpZXdTaXplLnggPT0gbUxhc3RXaWR0aFNlbnQKKyAgICAgICAgICAgICAgICAmJiB2aWV3U2l6ZS55ID09IG1MYXN0SGVpZ2h0U2VudDsKKyAgICAgICAgLy8gRG9uJ3Qgc2VuZCBzY3JvbGwgZXZlbnQgZm9yIHBpY3R1cmUgY29taW5nIGZyb20gd2Via2l0LAorICAgICAgICAvLyBzaW5jZSB0aGUgbmV3IHBpY3R1cmUgbWF5IGNhdXNlIGEgc2Nyb2xsIGV2ZW50IHRvIG92ZXJyaWRlCisgICAgICAgIC8vIHRoZSBzYXZlZCBoaXN0b3J5IHNjcm9sbCBwb3NpdGlvbi4KKyAgICAgICAgbVNlbmRTY3JvbGxFdmVudCA9IGZhbHNlOworICAgICAgICByZWNvcmROZXdDb250ZW50U2l6ZShkcmF3Lm1Db250ZW50U2l6ZS54LAorICAgICAgICAgICAgICAgIGRyYXcubUNvbnRlbnRTaXplLnksIHVwZGF0ZUxheW91dCk7CisgICAgICAgIG1TZW5kU2Nyb2xsRXZlbnQgPSB0cnVlOworICAgICAgICBpZiAoRGVidWdGbGFncy5XRUJfVklFVykgeworICAgICAgICAgICAgUmVjdCBiID0gZHJhdy5tSW52YWxSZWdpb24uZ2V0Qm91bmRzKCk7CisgICAgICAgICAgICBMb2cudihMT0dUQUcsICJORVdfUElDVFVSRV9NU0dfSUQgeyIgKworICAgICAgICAgICAgICAgICAgICBiLmxlZnQrIiwiK2IudG9wKyIsIitiLnJpZ2h0KyIsIitiLmJvdHRvbSsifSIpOworICAgICAgICB9CisgICAgICAgIGludmFsaWRhdGVDb250ZW50UmVjdChkcmF3Lm1JbnZhbFJlZ2lvbi5nZXRCb3VuZHMoKSk7CisKKyAgICAgICAgaWYgKG1QaWN0dXJlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBpY3R1cmVMaXN0ZW5lci5vbk5ld1BpY3R1cmUoV2ViVmlldy50aGlzLCBjYXB0dXJlUGljdHVyZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBpbmZvcm1hdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHBpY3R1cmUKKyAgICAgICAgbVpvb21NYW5hZ2VyLm9uTmV3UGljdHVyZShkcmF3KTsKKworICAgICAgICBpZiAoZHJhdy5tRm9jdXNTaXplQ2hhbmdlZCAmJiBpbkVkaXRpbmdNb2RlKCkpIHsKKyAgICAgICAgICAgIG1Gb2N1c1NpemVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQaWN0dXJlQWZ0ZXJGaXJzdExheW91dCkgeworICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLnBvc3RSZWFkeVRvRHJhd0FsbCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVXNlZCB3aGVuIHJlY2VpdmluZyBtZXNzYWdlcyBmb3IgUkVRVUVTVF9LRVlCT0FSRF9XSVRIX1NFTEVDVElPTl9NU0dfSUQKICAgICAgKiBhbmQgVVBEQVRFX1RFWFRfU0VMRUNUSU9OX01TR19JRC4gIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9mIFdlYlRleHRWaWV3LgpAQCAtODkwOSw4ICs5MDUxLDkgQEAKICAgICAvKioKICAgICAgKiAgVXBkYXRlIG91ciBjYWNoZSB3aXRoIHVwZGF0ZWRUZXh0LgogICAgICAqICBAcGFyYW0gdXBkYXRlZFRleHQgIFRoZSBuZXcgdGV4dCB0byBwdXQgaW4gb3VyIGNhY2hlLgorICAgICAqICBAaGlkZQogICAgICAqLwotICAgIC8qIHBhY2thZ2UgKi8gdm9pZCB1cGRhdGVDYWNoZWRUZXh0ZmllbGQoU3RyaW5nIHVwZGF0ZWRUZXh0KSB7CisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGVkVGV4dGZpZWxkKFN0cmluZyB1cGRhdGVkVGV4dCkgewogICAgICAgICAvLyBBbHNvIHBsYWNlIG91ciBnZW5lcmF0aW9uIG51bWJlciBzbyB0aGF0IHdoZW4gd2UgbG9vayBhdCB0aGUgY2FjaGUKICAgICAgICAgLy8gd2UgcmVjb2duaXplIHRoYXQgaXQgaXMgdXAgdG8gZGF0ZS4KICAgICAgICAgbmF0aXZlVXBkYXRlQ2FjaGVkVGV4dGZpZWxkKHVwZGF0ZWRUZXh0LCBtVGV4dEdlbmVyYXRpb24pOwpAQCAtOTA0Nyw2ICs5MTkwLDcgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkICAgICBuYXRpdmVTZXRIZWlnaHRDYW5NZWFzdXJlKGJvb2xlYW4gbWVhc3VyZSk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlU2V0QmFzZUxheWVyKGludCBsYXllciwgUmVnaW9uIGludmFsUmVnaW9uLAogICAgICAgICAgICAgYm9vbGVhbiBzaG93VmlzdWFsSW5kaWNhdG9yLCBib29sZWFuIGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpOworICAgIHByaXZhdGUgbmF0aXZlIGludCAgICAgIG5hdGl2ZUdldEJhc2VMYXllcigpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVNob3dDdXJzb3JUaW1lZCgpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgICAgIG5hdGl2ZVJlcGxhY2VCYXNlQ29udGVudChpbnQgY29udGVudCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCAgICAgbmF0aXZlQ29weUJhc2VDb250ZW50VG9QaWN0dXJlKFBpY3R1cmUgcGljdCk7CkBAIC05MDc5LDQgKzkyMjMsNSBAQAogICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbGF5ZXIgaXMgc3VjY2Vzc2Z1bGx5IHNjcm9sbGVkLgogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gIG5hdGl2ZVNjcm9sbExheWVyKGludCBsYXllciwgaW50IG5ld1gsIGludCBuZXdZKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgICAgICBuYXRpdmVHZXRCYWNrZ3JvdW5kQ29sb3IoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xpZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NsaWVudC5qYXZhCmluZGV4IDY1MDI2YTUuLmQzYmUyYmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xpZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGllbnQuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogICAgICAqIHByb3BlciBoYW5kbGVyIGZvciB0aGUgdXJsLiBJZiBXZWJWaWV3Q2xpZW50IGlzIHByb3ZpZGVkLCByZXR1cm4gdHJ1ZQogICAgICAqIG1lYW5zIHRoZSBob3N0IGFwcGxpY2F0aW9uIGhhbmRsZXMgdGhlIHVybCwgd2hpbGUgcmV0dXJuIGZhbHNlIG1lYW5zIHRoZQogICAgICAqIGN1cnJlbnQgV2ViVmlldyBoYW5kbGVzIHRoZSB1cmwuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gdmlldyBUaGUgV2ViVmlldyB0aGF0IGlzIGluaXRpYXRpbmcgdGhlIGNhbGxiYWNrLgogICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCB0byBiZSBsb2FkZWQuCiAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBob3N0IGFwcGxpY2F0aW9uIHdhbnRzIHRvIGxlYXZlIHRoZSBjdXJyZW50IFdlYlZpZXcKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgKiBmcmFtZXNldHMgd2lsbCBjYWxsIG9uUGFnZVN0YXJ0ZWQgb25lIHRpbWUgZm9yIHRoZSBtYWluIGZyYW1lLiBUaGlzIGFsc28KICAgICAgKiBtZWFucyB0aGF0IG9uUGFnZVN0YXJ0ZWQgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnRzIG9mIGFuCiAgICAgICogZW1iZWRkZWQgZnJhbWUgY2hhbmdlcywgaS5lLiBjbGlja2luZyBhIGxpbmsgd2hvc2UgdGFyZ2V0IGlzIGFuIGlmcmFtZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB2aWV3IFRoZSBXZWJWaWV3IHRoYXQgaXMgaW5pdGlhdGluZyB0aGUgY2FsbGJhY2suCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIHRvIGJlIGxvYWRlZC4KICAgICAgKiBAcGFyYW0gZmF2aWNvbiBUaGUgZmF2aWNvbiBmb3IgdGhpcyBwYWdlIGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZQpAQCAtNjAsNyArNjAsNyBAQAogICAgICAqIGlzIGNhbGxlZCBvbmx5IGZvciBtYWluIGZyYW1lLiBXaGVuIG9uUGFnZUZpbmlzaGVkKCkgaXMgY2FsbGVkLCB0aGUKICAgICAgKiByZW5kZXJpbmcgcGljdHVyZSBtYXkgbm90IGJlIHVwZGF0ZWQgeWV0LiBUbyBnZXQgdGhlIG5vdGlmaWNhdGlvbiBmb3IgdGhlCiAgICAgICogbmV3IFBpY3R1cmUsIHVzZSB7QGxpbmsgV2ViVmlldy5QaWN0dXJlTGlzdGVuZXIjb25OZXdQaWN0dXJlfS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB2aWV3IFRoZSBXZWJWaWV3IHRoYXQgaXMgaW5pdGlhdGluZyB0aGUgY2FsbGJhY2suCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIG9mIHRoZSBwYWdlLgogICAgICAqLwpAQCAtNzAsNyArNzAsNyBAQAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHRoZSBXZWJWaWV3IHdpbGwgbG9hZCB0aGUgcmVzb3VyY2UKICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIHVybC4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB2aWV3IFRoZSBXZWJWaWV3IHRoYXQgaXMgaW5pdGlhdGluZyB0aGUgY2FsbGJhY2suCiAgICAgICogQHBhcmFtIHVybCBUaGUgdXJsIG9mIHRoZSByZXNvdXJjZSB0aGUgV2ViVmlldyB3aWxsIGxvYWQuCiAgICAgICovCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgKiBIVFRQIHJlZGlyZWN0cy4gQXMgdGhlIGhvc3QgYXBwbGljYXRpb24gaWYgaXQgd291bGQgbGlrZSB0byBjb250aW51ZQogICAgICAqIHRyeWluZyB0byBsb2FkIHRoZSByZXNvdXJjZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gc2VuZCB0aGUgY2FuY2VsCiAgICAgICogbWVzc2FnZS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSB2aWV3IFRoZSBXZWJWaWV3IHRoYXQgaXMgaW5pdGlhdGluZyB0aGUgY2FsbGJhY2suCiAgICAgICogQHBhcmFtIGNhbmNlbE1zZyBUaGUgbWVzc2FnZSB0byBzZW5kIGlmIHRoZSBob3N0IHdhbnRzIHRvIGNhbmNlbAogICAgICAqIEBwYXJhbSBjb250aW51ZU1zZyBUaGUgbWVzc2FnZSB0byBzZW5kIGlmIHRoZSBob3N0IHdhbnRzIHRvIGNvbnRpbnVlCkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgKiBBcyB0aGUgaG9zdCBhcHBsaWNhdGlvbiBpZiB0aGUgYnJvd3NlciBzaG91bGQgcmVzZW5kIGRhdGEgYXMgdGhlCiAgICAgICogcmVxdWVzdGVkIHBhZ2Ugd2FzIGEgcmVzdWx0IG9mIGEgUE9TVC4gVGhlIGRlZmF1bHQgaXMgdG8gbm90IHJlc2VuZCB0aGUKICAgICAgKiBkYXRhLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXcgVGhlIFdlYlZpZXcgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBjYWxsYmFjay4KICAgICAgKiBAcGFyYW0gZG9udFJlc2VuZCBUaGUgbWVzc2FnZSB0byBzZW5kIGlmIHRoZSBicm93c2VyIHNob3VsZCBub3QgcmVzZW5kCiAgICAgICogQHBhcmFtIHJlc2VuZCBUaGUgbWVzc2FnZSB0byBzZW5kIGlmIHRoZSBicm93c2VyIHNob3VsZCByZXNlbmQgZGF0YQpAQCAtMTc2LDcgKzE3Niw3IEBACiAKICAgICAvKioKICAgICAgKiBOb3RpZnkgdGhlIGhvc3QgYXBwbGljYXRpb24gdG8gdXBkYXRlIGl0cyB2aXNpdGVkIGxpbmtzIGRhdGFiYXNlLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXcgVGhlIFdlYlZpZXcgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBjYWxsYmFjay4KICAgICAgKiBAcGFyYW0gdXJsIFRoZSB1cmwgYmVpbmcgdmlzaXRlZC4KICAgICAgKiBAcGFyYW0gaXNSZWxvYWQgVHJ1ZSBpZiB0aGlzIHVybCBpcyBiZWluZyByZWxvYWRlZC4KQEAgLTE4NiwxMiArMTg2LDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTm90aWZ5IHRoZSBob3N0IGFwcGxpY2F0aW9uIHRvIGhhbmRsZSBhIHNzbCBjZXJ0aWZpY2F0ZSBlcnJvciByZXF1ZXN0CisgICAgICogTm90aWZ5IHRoZSBob3N0IGFwcGxpY2F0aW9uIHRvIGhhbmRsZSBhIFNTTCBjZXJ0aWZpY2F0ZSBlcnJvciByZXF1ZXN0CiAgICAgICogKGRpc3BsYXkgdGhlIGVycm9yIHRvIHRoZSB1c2VyIGFuZCBhc2sgd2hldGhlciB0byBwcm9jZWVkIG9yIG5vdCkuIFRoZQogICAgICAqIGhvc3QgYXBwbGljYXRpb24gaGFzIHRvIGNhbGwgZWl0aGVyIGhhbmRsZXIuY2FuY2VsKCkgb3IgaGFuZGxlci5wcm9jZWVkKCkKICAgICAgKiBhcyB0aGUgY29ubmVjdGlvbiBpcyBzdXNwZW5kZWQgYW5kIHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZS4gVGhlIGRlZmF1bHQKICAgICAgKiBiZWhhdmlvciBpcyB0byBjYW5jZWwgdGhlIGxvYWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gdmlldyBUaGUgV2ViVmlldyB0aGF0IGlzIGluaXRpYXRpbmcgdGhlIGNhbGxiYWNrLgogICAgICAqIEBwYXJhbSBoYW5kbGVyIEFuIFNzbEVycm9ySGFuZGxlciBvYmplY3QgdGhhdCB3aWxsIGhhbmRsZSB0aGUgdXNlcidzCiAgICAgICogICAgICAgICAgICByZXNwb25zZS4KQEAgLTIwMyw5ICsyMDMsMjkgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGhvc3QgYXBwbGljYXRpb24gdG8gaGFuZGxlIGEgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZQorICAgICAqIHJlcXVlc3QgKGRpc3BsYXkgdGhlIHJlcXVlc3QgdG8gdGhlIHVzZXIgYW5kIGFzayB3aGV0aGVyIHRvCisgICAgICogcHJvY2VlZCB3aXRoIGEgY2xpZW50IGNlcnRpZmljYXRlIG9yIG5vdCkuIFRoZSBob3N0IGFwcGxpY2F0aW9uCisgICAgICogaGFzIHRvIGNhbGwgZWl0aGVyIGhhbmRsZXIuY2FuY2VsKCkgb3IgaGFuZGxlci5wcm9jZWVkKCkgYXMgdGhlCisgICAgICogY29ubmVjdGlvbiBpcyBzdXNwZW5kZWQgYW5kIHdhaXRpbmcgZm9yIHRoZSByZXNwb25zZS4gVGhlCisgICAgICogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjYW5jZWwsIHJldHVybmluZyBubyBjbGllbnQgY2VydGlmaWNhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgV2ViVmlldyB0aGF0IGlzIGluaXRpYXRpbmcgdGhlIGNhbGxiYWNrLgorICAgICAqIEBwYXJhbSBoYW5kbGVyIEFuIENsaWVudENlcnRSZXF1ZXN0SGFuZGxlciBvYmplY3QgdGhhdCB3aWxsCisgICAgICogICAgICAgICAgICBoYW5kbGUgdGhlIHVzZXIncyByZXNwb25zZS4KKyAgICAgKiBAcGFyYW0gaG9zdF9hbmRfcG9ydCBUaGUgaG9zdCBhbmQgcG9ydCBvZiB0aGUgcmVxdWVzdGluZyBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZWRDbGllbnRDZXJ0UmVxdWVzdChXZWJWaWV3IHZpZXcsCisgICAgICAgICAgICBDbGllbnRDZXJ0UmVxdWVzdEhhbmRsZXIgaGFuZGxlciwgU3RyaW5nIGhvc3RfYW5kX3BvcnQpIHsKKyAgICAgICAgaGFuZGxlci5jYW5jZWwoKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBOb3RpZnkgdGhlIGhvc3QgYXBwbGljYXRpb24gdG8gaGFuZGxlIGFuIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QuIFRoZQogICAgICAqIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2FuY2VsIHRoZSByZXF1ZXN0LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXcgVGhlIFdlYlZpZXcgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBjYWxsYmFjay4KICAgICAgKiBAcGFyYW0gaGFuZGxlciBUaGUgSHR0cEF1dGhIYW5kbGVyIHRoYXQgd2lsbCBoYW5kbGUgdGhlIHVzZXIncyByZXNwb25zZS4KICAgICAgKiBAcGFyYW0gaG9zdCBUaGUgaG9zdCByZXF1aXJpbmcgYXV0aGVudGljYXRpb24uCkBAIC0yMjMsNyArMjQzLDcgQEAKICAgICAgKiB0cnVlLCBXZWJWaWV3IHdpbGwgbm90IGhhbmRsZSB0aGUga2V5IGV2ZW50LiBJZiByZXR1cm4gZmFsc2UsIFdlYlZpZXcKICAgICAgKiB3aWxsIGFsd2F5cyBoYW5kbGUgdGhlIGtleSBldmVudCwgc28gbm9uZSBvZiB0aGUgc3VwZXIgaW4gdGhlIHZpZXcgY2hhaW4KICAgICAgKiB3aWxsIHNlZSB0aGUga2V5IGV2ZW50LiBUaGUgZGVmYXVsdCBiZWhhdmlvciByZXR1cm5zIGZhbHNlLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXcgVGhlIFdlYlZpZXcgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBjYWxsYmFjay4KICAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGtleSBldmVudC4KICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGhvc3QgYXBwbGljYXRpb24gd2FudHMgdG8gaGFuZGxlIHRoZSBrZXkgZXZlbnQKQEAgLTIzOSw3ICsyNTksNyBAQAogICAgICAqIG9yIGlmIHNob3VsZE92ZXJyaWRlS2V5RXZlbnQgcmV0dXJucyB0cnVlLiBUaGlzIGlzIGNhbGxlZCBhc3luY2hyb25vdXNseQogICAgICAqIGZyb20gd2hlcmUgdGhlIGtleSBpcyBkaXNwYXRjaGVkLiBJdCBnaXZlcyB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbiBjaGFuY2UKICAgICAgKiB0byBoYW5kbGUgdGhlIHVuaGFuZGxlZCBrZXkgZXZlbnRzLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHZpZXcgVGhlIFdlYlZpZXcgdGhhdCBpcyBpbml0aWF0aW5nIHRoZSBjYWxsYmFjay4KICAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGtleSBldmVudC4KICAgICAgKi8KQEAgLTI0OSw3ICsyNjksNyBAQAogICAgIC8qKgogICAgICAqIE5vdGlmeSB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHRoZSBzY2FsZSBhcHBsaWVkIHRvIHRoZSBXZWJWaWV3IGhhcwogICAgICAqIGNoYW5nZWQuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0gdmlldyBoZSBXZWJWaWV3IHRoYXQgaXMgaW5pdGlhdGluZyB0aGUgY2FsbGJhY2suCiAgICAgICogQHBhcmFtIG9sZFNjYWxlIFRoZSBvbGQgc2NhbGUgZmFjdG9yCiAgICAgICogQHBhcmFtIG5ld1NjYWxlIFRoZSBuZXcgc2NhbGUgZmFjdG9yCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvV2ViVmlld0NvcmUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCmluZGV4IDEzYTk3OTMuLjA2YTYxYmQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q29yZS5qYXZhCkBAIC0xMTQxLDE2ICsxMTQxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VVcmwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IGJhc2VVcmwuaW5kZXhPZignOicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiAxLjAsIHtAbGluawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2ViVmlldyNsb2FkRGF0YVdpdGhCYXNlVVJMfSBjYW4gYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsb2NhbCBhc3NldCBmaWxlcyBhcyBsb25nIGFzIHRoZSBkYXRhIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB2YWxpZC4gSW4gdGhlIG5ldyBXZWJLaXQsIHRoZSByZXN0cmljdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgdGlnaHRlbmVkLiBUbyBiZSBjb21wYXRpYmxlIHdpdGggMS4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2UgYXV0b21hdGljYWxseSBhZGQgdGhlIHNjaGVtZSBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VVcmwgZm9yIGxvY2FsIGFjY2VzcyBhcyBsb25nIGFzIGl0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBub3QgaHR0cChzKS9mdHAocykvYWJvdXQvamF2YXNjcmlwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiAxLjAsIFdlYlZpZXcubG9hZERhdGFXaXRoQmFzZVVSTCgpIGNvdWxkIGFjY2VzcyBsb2NhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXQgZmlsZXMgdXNpbmcgJ2ZpbGUnIHNjaGVtZSBVUkxzIGFzIGxvbmcgYXMgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkLiBMYXRlciB2ZXJzaW9ucyBvZiBXZWJLaXQgaGF2ZSB0aWdodGVuZWQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0cmljdGlvbiBhcm91bmQgd2hlbiBwYWdlcyBjYW4gYWNjZXNzIHN1Y2ggbG9jYWwgVVJMcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCAxLjAsIHdlIHJlZ2lzdGVyIHRoZSBzY2hlbWUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiYXNlVXJsIHRvIGJlIGNvbnNpZGVyZWQgbG9jYWwsIGFzIGxvbmcgYXMgaXQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwKHMpL2Z0cChzKS9hYm91dC9qYXZhc2NyaXB0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IGJhc2VVcmwuc3Vic3RyaW5nKDAsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzY2hlbWUuc3RhcnRzV2l0aCgiaHR0cCIpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzY2hlbWUuc3RhcnRzV2l0aCgiZnRwIikgJiYKQEAgLTE5MDMsNyArMTkwMCw3IEBACiAgICAgICAgICAgICAgICAgd2lkdGggPSBtVmlld3BvcnRXaWR0aDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRm9yIG1vYmlsZSB3ZWIgc2l0ZS4KLSAgICAgICAgICAgICAgICB3aWR0aCA9IHZpZXdXaWR0aDsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IE1hdGgucm91bmQobVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkgLyBtV2ViVmlldy5nZXREZWZhdWx0Wm9vbVNjYWxlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiB3aWR0aDsKQEAgLTI2MjMsMTQgKzI2MjAsMTUgQEAKIAogICAgIC8vIGNhbGxlZCBieSBKTkkuIFBsdWdpbldpZGdldCBmdW5jdGlvbiB0byBsYXVuY2ggYSBmdWxsLXNjcmVlbiB2aWV3IHVzaW5nIGEKICAgICAvLyBWaWV3IG9iamVjdCBwcm92aWRlZCBieSB0aGUgcGx1Z2luIGNsYXNzLgotICAgIHByaXZhdGUgdm9pZCBzaG93RnVsbFNjcmVlblBsdWdpbihWaWV3TWFuYWdlci5DaGlsZFZpZXcgY2hpbGRWaWV3LCBpbnQgbnBwKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNob3dGdWxsU2NyZWVuUGx1Z2luKFZpZXdNYW5hZ2VyLkNoaWxkVmlldyBjaGlsZFZpZXcsIGludCBvcmllbnRhdGlvbiwgaW50IG5wcCkgewogICAgICAgICBpZiAobVdlYlZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbVdlYlZpZXcubVByaXZhdGVIYW5kbGVyLm9idGFpbk1lc3NhZ2UoV2ViVmlldy5TSE9XX0ZVTExTQ1JFRU4pOwogICAgICAgICBtZXNzYWdlLm9iaiA9IGNoaWxkVmlldy5tVmlldzsKLSAgICAgICAgbWVzc2FnZS5hcmcxID0gbnBwOworICAgICAgICBtZXNzYWdlLmFyZzEgPSBvcmllbnRhdGlvbjsKKyAgICAgICAgbWVzc2FnZS5hcmcyID0gbnBwOwogICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1pvb21NYW5hZ2VyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQppbmRleCBlNDFkZDFjLi44ODM2NTZiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93ZWJraXQvWm9vbU1hbmFnZXIuamF2YQpAQCAtNjM0LDggKzYzNCwxNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbmV3VGV4dFdyYXBTY2FsZSA9IG1BY3R1YWxTY2FsZTsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGZpcnN0VGltZVJlZmxvdyA9ICFleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobUFjdHVhbFNjYWxlLCBtVGV4dFdyYXBTY2FsZSk7CisgICAgICAgIGlmIChmaXJzdFRpbWVSZWZsb3cgfHwgbUluWm9vbU92ZXJ2aWV3KSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIGZpcnN0IHRpbWUgcmVmbG93IG9yIGluIHpvb20gb3ZlcnZpZXcgbW9kZSwgbGV0IHJlZmxvdyBhbmQgem9vbQorICAgICAgICAgICAgLy8gaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IG5ld1RleHRXcmFwU2NhbGU7CisgICAgICAgIH0KICAgICAgICAgaWYgKHNldHRpbmdzLmlzTmFycm93Q29sdW1uTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAmJiBleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIG5ld1RleHRXcmFwU2NhbGUpKSB7CisgICAgICAgICAgICAgICAgJiYgZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG1UZXh0V3JhcFNjYWxlLCBuZXdUZXh0V3JhcFNjYWxlKQorICAgICAgICAgICAgICAgICYmICFmaXJzdFRpbWVSZWZsb3cKKyAgICAgICAgICAgICAgICAmJiAhbUluWm9vbU92ZXJ2aWV3KSB7CisgICAgICAgICAgICAvLyBSZWZsb3cgb25seS4KICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gbmV3VGV4dFdyYXBTY2FsZTsKICAgICAgICAgICAgIHJlZnJlc2hab29tU2NhbGUodHJ1ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoIW1Jblpvb21PdmVydmlldyAmJiB3aWxsU2NhbGVUcmlnZ2VyWm9vbShnZXRab29tT3ZlcnZpZXdTY2FsZSgpKSkgewpAQCAtOTA2LDcgKzkxNSw3IEBACiAgICAgICAgIC8vIHNjYWxlQWxsKCksIHdlIG5lZWQgdG8gcG9zdCBhIFJ1bm5hYmxlIHRvIGVuc3VyZSByZXF1ZXN0TGF5b3V0KCkuCiAgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgb25seSB1cGRhdGUgdGhlIHRleHQgd3JhcCBzY2FsZSBpZiB0aGUgd2lkdGggY2hhbmdlZC4KICAgICAgICAgbVdlYlZpZXcucG9zdChuZXcgUG9zdFNjYWxlKHcgIT0gb3cgJiYKLSAgICAgICAgICAgICFtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZUZpeGVkVmlld3BvcnQoKSwgbUluWm9vbU92ZXJ2aWV3KSk7CisgICAgICAgICAgICAhbVdlYlZpZXcuZ2V0U2V0dGluZ3MoKS5nZXRVc2VGaXhlZFZpZXdwb3J0KCksIG1Jblpvb21PdmVydmlldywgdyA8IG93KSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBQb3N0U2NhbGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CkBAIC05MTUsMTAgKzkyNCwxNCBAQAogICAgICAgICAvLyBpdCBjb3VsZCBiZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHRpbWUgdGhpcyBjYWxsYmFjayBpcyBpbml0aWF0ZWQgYW5kCiAgICAgICAgIC8vIHRoZSB0aW1lIGl0J3MgYWN0dWFsbHkgcnVuLgogICAgICAgICBmaW5hbCBib29sZWFuIG1Jblpvb21PdmVydmlld0JlZm9yZVNpemVDaGFuZ2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gbUluUG9ydHJhaXRNb2RlOwogCi0gICAgICAgIHB1YmxpYyBQb3N0U2NhbGUoYm9vbGVhbiB1cGRhdGVUZXh0V3JhcCwgYm9vbGVhbiBpblpvb21PdmVydmlldykgeworICAgICAgICBwdWJsaWMgUG9zdFNjYWxlKGJvb2xlYW4gdXBkYXRlVGV4dFdyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpblpvb21PdmVydmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluUG9ydHJhaXRNb2RlKSB7CiAgICAgICAgICAgICBtVXBkYXRlVGV4dFdyYXAgPSB1cGRhdGVUZXh0V3JhcDsKICAgICAgICAgICAgIG1Jblpvb21PdmVydmlld0JlZm9yZVNpemVDaGFuZ2UgPSBpblpvb21PdmVydmlldzsKKyAgICAgICAgICAgIG1JblBvcnRyYWl0TW9kZSA9IGluUG9ydHJhaXRNb2RlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewpAQCAtOTI3LDEwICs5NDAsMTAgQEAKICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBvdmVyIHRvIHdlYmtpdC4KICAgICAgICAgICAgICAgICAvLyBLZWVwIG92ZXJ2aWV3IG1vZGUgdW5jaGFuZ2VkIHdoZW4gcm90YXRpbmcuCiAgICAgICAgICAgICAgICAgZmxvYXQgbmV3U2NhbGUgPSBtQWN0dWFsU2NhbGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1XZWJWaWV3LmdldFNldHRpbmdzKCkuZ2V0VXNlV2lkZVZpZXdQb3J0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgem9vbU92ZXJ2aWV3U2NhbGUgPSBnZXRab29tT3ZlcnZpZXdTY2FsZSgpOwotICAgICAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IChtSW5ab29tT3ZlcnZpZXdCZWZvcmVTaXplQ2hhbmdlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICB6b29tT3ZlcnZpZXdTY2FsZSA6IE1hdGgubWF4KG1BY3R1YWxTY2FsZSwgem9vbU92ZXJ2aWV3U2NhbGUpOworICAgICAgICAgICAgICAgIGlmIChtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZVdpZGVWaWV3UG9ydCgpICYmCisgICAgICAgICAgICAgICAgICAgIG1JblBvcnRyYWl0TW9kZSAmJgorICAgICAgICAgICAgICAgICAgICBtSW5ab29tT3ZlcnZpZXdCZWZvcmVTaXplQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2V0Wm9vbVNjYWxlKG5ld1NjYWxlLCBtVXBkYXRlVGV4dFdyYXAsIHRydWUpOwogICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgem9vbSBidXR0b25zIGFzIHRoZSBzY2FsZSBjYW4gYmUgY2hhbmdlZApAQCAtOTc4LDE2ICs5OTEsMTYgQEAKICAgICAgICAgICAgIHNldHRpbmdzLmdldFVzZUZpeGVkVmlld3BvcnQoKSAmJgogICAgICAgICAgICAgKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IG1Jblpvb21PdmVydmlldykpIHsKICAgICAgICAgICAgIC8vIEtlZXAgbW9iaWxlIHNpdGUncyB0ZXh0IHdyYXAgc2NhbGUgdW5jaGFuZ2VkLiAgRm9yIG1vYmlsZSBzaXRlcywKLSAgICAgICAgICAgIC8vIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaXMgdGhlIHNhbWUgYXMgem9vbSBvdmVydmlldyBzY2FsZSwgd2hpY2ggaXMgMS4wZi4KLSAgICAgICAgICAgIGlmIChleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIDEuMGYpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChuZXdab29tT3ZlcnZpZXdTY2FsZSwgMS4wZikpIHsKKyAgICAgICAgICAgIC8vIHRoZSB0ZXh0IHdyYXAgc2NhbGUgaXMgdGhlIHNhbWUgYXMgem9vbSBvdmVydmlldyBzY2FsZS4KKyAgICAgICAgICAgIGlmIChleGNlZWRzTWluU2NhbGVJbmNyZW1lbnQobVRleHRXcmFwU2NhbGUsIG1EZWZhdWx0U2NhbGUpIHx8CisgICAgICAgICAgICAgICAgICAgIGV4Y2VlZHNNaW5TY2FsZUluY3JlbWVudChuZXdab29tT3ZlcnZpZXdTY2FsZSwgbURlZmF1bHRTY2FsZSkpIHsKICAgICAgICAgICAgICAgICBtVGV4dFdyYXBTY2FsZSA9IGdldFJlYWRpbmdMZXZlbFNjYWxlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1UZXh0V3JhcFNjYWxlID0gbmV3Wm9vbU92ZXJ2aWV3U2NhbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCkgeworICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCB8fCBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgewogICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IG5ld1pvb21PdmVydmlld1NjYWxlOwogICAgICAgICAgICAgbU1heFpvb21TY2FsZSA9IE1hdGgubWF4KG1NYXhab29tU2NhbGUsIG1NaW5ab29tU2NhbGUpOwogICAgICAgICB9CkBAIC0xMDAwLDEwICsxMDEzLDExIEBACiAgICAgICAgIC8vIE1ha2Ugc3VyZSBtb2JpbGUgc2l0ZXMgYXJlIGNvcnJlY3RseSBoYW5kbGVkIHNpbmNlIG1vYmlsZSBzaXRlIHdpbGwKICAgICAgICAgLy8gY2hhbmdlIGNvbnRlbnQgd2lkdGggYWZ0ZXIgcm90YXRpbmcuCiAgICAgICAgIGJvb2xlYW4gbW9iaWxlU2l0ZUluT3ZlcnZpZXcgPSBtSW5ab29tT3ZlcnZpZXcgJiYKLSAgICAgICAgICAgICAgICAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG5ld1pvb21PdmVydmlld1NjYWxlLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAhZXhjZWVkc01pblNjYWxlSW5jcmVtZW50KG5ld1pvb21PdmVydmlld1NjYWxlLCBtRGVmYXVsdFNjYWxlKTsKICAgICAgICAgaWYgKCFtV2ViVmlldy5kcmF3SGlzdG9yeSgpICYmCi0gICAgICAgICAgICAgICAgKG1Jbml0aWFsWm9vbU92ZXJ2aWV3IHx8IHNjYWxlTGVzc1RoYW5PdmVydmlldyB8fCBtb2JpbGVTaXRlSW5PdmVydmlldykgJiYKLSAgICAgICAgICAgICAgICBzY2FsZUhhc0RpZmYgJiYgem9vbU92ZXJ2aWV3V2lkdGhDaGFuZ2VkKSB7CisgICAgICAgICAgICAoKHNjYWxlTGVzc1RoYW5PdmVydmlldyAmJiBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSl8fAorICAgICAgICAgICAgICAgICgobUluaXRpYWxab29tT3ZlcnZpZXcgfHwgbW9iaWxlU2l0ZUluT3ZlcnZpZXcpICYmCisgICAgICAgICAgICAgICAgICAgIHNjYWxlSGFzRGlmZiAmJiB6b29tT3ZlcnZpZXdXaWR0aENoYW5nZWQpKSkgewogICAgICAgICAgICAgbUluaXRpYWxab29tT3ZlcnZpZXcgPSBmYWxzZTsKICAgICAgICAgICAgIHNldFpvb21TY2FsZShuZXdab29tT3ZlcnZpZXdTY2FsZSwgIXdpbGxTY2FsZVRyaWdnZXJab29tKG1UZXh0V3JhcFNjYWxlKSAmJgogICAgICAgICAgICAgICAgICFtV2ViVmlldy5nZXRTZXR0aW5ncygpLmdldFVzZUZpeGVkVmlld3BvcnQoKSk7CkBAIC0xMDU3LDcgKzEwNzEsOCBAQAogICAgICAgICB1cGRhdGVab29tUmFuZ2Uodmlld1N0YXRlLCB2aWV3U2l6ZS54LCBkcmF3RGF0YS5tTWluUHJlZldpZHRoKTsKICAgICAgICAgc2V0dXBab29tT3ZlcnZpZXdXaWR0aChkcmF3RGF0YSwgbVdlYlZpZXcuZ2V0Vmlld1dpZHRoKCkpOwogICAgICAgICBmaW5hbCBmbG9hdCBvdmVydmlld1NjYWxlID0gZ2V0Wm9vbU92ZXJ2aWV3U2NhbGUoKTsKLSAgICAgICAgaWYgKCFtTWluWm9vbVNjYWxlRml4ZWQpIHsKKyAgICAgICAgV2ViU2V0dGluZ3Mgc2V0dGluZ3MgPSBtV2ViVmlldy5nZXRTZXR0aW5ncygpOworICAgICAgICBpZiAoIW1NaW5ab29tU2NhbGVGaXhlZCB8fCBzZXR0aW5ncy5nZXRVc2VXaWRlVmlld1BvcnQoKSkgewogICAgICAgICAgICAgbU1pblpvb21TY2FsZSA9IChtSW5pdGlhbFNjYWxlID4gMCkgPwogICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihtSW5pdGlhbFNjYWxlLCBvdmVydmlld1NjYWxlKSA6IG92ZXJ2aWV3U2NhbGU7CiAgICAgICAgICAgICBtTWF4Wm9vbVNjYWxlID0gTWF0aC5tYXgobU1heFpvb21TY2FsZSwgbU1pblpvb21TY2FsZSk7CkBAIC0xMDY1LDggKzEwODAsNiBAQAogCiAgICAgICAgIGlmICghbVdlYlZpZXcuZHJhd0hpc3RvcnkoKSkgewogICAgICAgICAgICAgZmxvYXQgc2NhbGU7Ci0gICAgICAgICAgICBXZWJTZXR0aW5ncyBzZXR0aW5ncyA9IG1XZWJWaWV3LmdldFNldHRpbmdzKCk7Ci0KICAgICAgICAgICAgIGlmIChtSW5pdGlhbFNjYWxlID4gMCkgewogICAgICAgICAgICAgICAgIHNjYWxlID0gbUluaXRpYWxTY2FsZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlld1N0YXRlLm1WaWV3U2NhbGUgPiAwKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWJzTGlzdFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCmluZGV4IDY4MGJiN2QuLjNmZTgxNDkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BYnNMaXN0Vmlldy5qYXZhCkBAIC01NSw3ICs1NSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQmFzZUlucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRDb25uZWN0aW9uOwpAQCAtNDY2MSw2ICs0NjYwLDcgQEAKICAgICAgICAgc2VsZWN0ZWRQb3MgPSBsb29rRm9yU2VsZWN0YWJsZVBvc2l0aW9uKHNlbGVjdGVkUG9zLCBkb3duKTsKICAgICAgICAgaWYgKHNlbGVjdGVkUG9zID49IGZpcnN0UG9zaXRpb24gJiYgc2VsZWN0ZWRQb3MgPD0gZ2V0TGFzdFZpc2libGVQb3NpdGlvbigpKSB7CiAgICAgICAgICAgICBtTGF5b3V0TW9kZSA9IExBWU9VVF9TUEVDSUZJQzsKKyAgICAgICAgICAgIHVwZGF0ZVNlbGVjdG9yU3RhdGUoKTsKICAgICAgICAgICAgIHNldFNlbGVjdGlvbkludChzZWxlY3RlZFBvcyk7CiAgICAgICAgICAgICBpbnZva2VPbkl0ZW1TY3JvbGxMaXN0ZW5lcigpOwogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FkYXB0ZXJWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQppbmRleCBjNGQwNWU5Li43NTVkNGUwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQWRhcHRlclZpZXcuamF2YQpAQCAtOTA0LDggKzkwNCwxMCBAQAogICAgIHB1YmxpYyBib29sZWFuIG9uUmVxdWVzdFNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoVmlldyBjaGlsZCwgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIC8vIEFkZCBhIHJlY29yZCBmb3Igb3Vyc2VsdmVzIGFzIHdlbGwuCiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCByZWNvcmQgPSBBY2Nlc3NpYmlsaXR5RXZlbnQub2J0YWluKCk7CisgICAgICAgIHJlY29yZC5zZXRTb3VyY2UodGhpcyk7CiAgICAgICAgIC8vIFNldCB0aGUgY2xhc3Mgc2luY2UgaXQgaXMgbm90IHBvcHVsYXRlZCBpbiAjZGlzcGF0Y2hQb3B1bGF0ZUFjY2Vzc2liaWxpdHlFdmVudAogICAgICAgICByZWNvcmQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgY2hpbGQub25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eUV2ZW50KHJlY29yZCk7CiAgICAgICAgIGNoaWxkLmRpc3BhdGNoUG9wdWxhdGVBY2Nlc3NpYmlsaXR5RXZlbnQocmVjb3JkKTsKICAgICAgICAgZXZlbnQuYXBwZW5kUmVjb3JkKHJlY29yZCk7CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FwcFNlY3VyaXR5UGVybWlzc2lvbnMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9BcHBTZWN1cml0eVBlcm1pc3Npb25zLmphdmEKaW5kZXggZDNhYTQyZi4uOTg4NzYwZCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0FwcFNlY3VyaXR5UGVybWlzc2lvbnMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQXBwU2VjdXJpdHlQZXJtaXNzaW9ucy5qYXZhCkBAIC0yMTgsMTUgKzIxOCwxNCBAQAogICAgICAgICBtU2hvd01vcmUuc2V0Q2xpY2thYmxlKHRydWUpOwogICAgICAgICBtU2hvd01vcmUuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwogICAgICAgICBtU2hvd01vcmUuc2V0Rm9jdXNhYmxlKHRydWUpOwotICAgICAgICBtU2hvd01vcmUuc2V0QmFja2dyb3VuZFJlc291cmNlKGFuZHJvaWQuUi5kcmF3YWJsZS5saXN0X3NlbGVjdG9yX2JhY2tncm91bmQpOwogCiAgICAgICAgIC8vIFBpY2sgdXAgZnJvbSBmcmFtZXdvcmsgcmVzb3VyY2VzIGluc3RlYWQuCiAgICAgICAgIG1EZWZhdWx0R3JwTGFiZWwgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuZGVmYXVsdF9wZXJtaXNzaW9uX2dyb3VwKTsKICAgICAgICAgbVBlcm1Gb3JtYXQgPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcucGVybWlzc2lvbnNfZm9ybWF0KTsKICAgICAgICAgbU5vcm1hbEljb24gPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3RleHRfZG90KTsKICAgICAgICAgbURhbmdlcm91c0ljb24gPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2J1bGxldF9rZXlfcGVybWlzc2lvbik7Ci0gICAgICAgIG1TaG93TWF4SWNvbiA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZXhwYW5kZXJfaWNfbWF4aW1pemVkKTsKLSAgICAgICAgbVNob3dNaW5JY29uID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5leHBhbmRlcl9pY19taW5pbWl6ZWQpOworICAgICAgICBtU2hvd01heEljb24gPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmV4cGFuZGVyX2Nsb3NlX2hvbG9fZGFyayk7CisgICAgICAgIG1TaG93TWluSWNvbiA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERyYXdhYmxlKFIuZHJhd2FibGUuZXhwYW5kZXJfb3Blbl9ob2xvX2RhcmspOwogICAgICAgICAKICAgICAgICAgLy8gU2V0IHBlcm1pc3Npb25zIHZpZXcKICAgICAgICAgc2V0UGVybWlzc2lvbnMobVBlcm1zTGlzdCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ29tcG91bmRCdXR0b24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbi5qYXZhCmluZGV4IGE3MzAwMTguLjI0MTBlYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Db21wb3VuZEJ1dHRvbi5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvOwogCiAvKioKICAqIDxwPgpAQCAtMjE0LDYgKzIxNSwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gaW5mbykgeworICAgICAgICBzdXBlci5vbkluaXRpYWxpemVBY2Nlc3NpYmlsaXR5Tm9kZUluZm8oaW5mbyk7CisgICAgICAgIGluZm8uc2V0Q2hlY2tlZChtQ2hlY2tlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GYXN0U2Nyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9GYXN0U2Nyb2xsZXIuamF2YQppbmRleCBmYjU3Y2UwLi4wMGViZTBkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRmFzdFNjcm9sbGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0Zhc3RTY3JvbGxlci5qYXZhCkBAIC00NjgsNyArNDY4LDkgQEAKICAgICAgICAgICAgICAgICBtTGlzdEFkYXB0ZXIgPSAoQmFzZUFkYXB0ZXIpIGFkYXB0ZXI7CiAgICAgICAgICAgICAgICAgbVNlY3Rpb25JbmRleGVyID0gKFNlY3Rpb25JbmRleGVyKSBhZGFwdGVyOwogICAgICAgICAgICAgICAgIG1TZWN0aW9ucyA9IG1TZWN0aW9uSW5kZXhlci5nZXRTZWN0aW9ucygpOwotICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChtU2VjdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtU2VjdGlvbnMgPSBuZXcgU3RyaW5nW10geyAiICIgfTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1MaXN0QWRhcHRlciA9IChCYXNlQWRhcHRlcikgYWRhcHRlcjsKICAgICAgICAgICAgICAgICBtU2VjdGlvbnMgPSBuZXcgU3RyaW5nW10geyAiICIgfTsKQEAgLTYwOSw3ICs2MTEsNyBAQAogICAgICAgICBmaW5hbCBpbnQgc2VjdGlvbiA9IG1TZWN0aW9uSW5kZXhlci5nZXRTZWN0aW9uRm9yUG9zaXRpb24oZmlyc3RWaXNpYmxlSXRlbSk7CiAgICAgICAgIGZpbmFsIGludCBzZWN0aW9uUG9zID0gbVNlY3Rpb25JbmRleGVyLmdldFBvc2l0aW9uRm9yU2VjdGlvbihzZWN0aW9uKTsKICAgICAgICAgZmluYWwgaW50IG5leHRTZWN0aW9uUG9zID0gbVNlY3Rpb25JbmRleGVyLmdldFBvc2l0aW9uRm9yU2VjdGlvbihzZWN0aW9uICsgMSk7Ci0gICAgICAgIGZpbmFsIGludCBzZWN0aW9uQ291bnQgPSBtU2VjdGlvbkluZGV4ZXIuZ2V0U2VjdGlvbnMoKS5sZW5ndGg7CisgICAgICAgIGZpbmFsIGludCBzZWN0aW9uQ291bnQgPSBtU2VjdGlvbnMubGVuZ3RoOwogICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb25zSW5TZWN0aW9uID0gbmV4dFNlY3Rpb25Qb3MgLSBzZWN0aW9uUG9zOwogCiAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtTGlzdC5nZXRDaGlsZEF0KDApOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ZyYW1lTGF5b3V0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQppbmRleCAyYTEzOThkLi41ZWJhMWEwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvRnJhbWVMYXlvdXQuamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKQEAgLTIzLDE0ICsyNSwxMiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVnaW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KIAogLyoqCiAgKiBGcmFtZUxheW91dCBpcyBkZXNpZ25lZCB0byBibG9jayBvdXQgYW4gYXJlYSBvbiB0aGUgc2NyZWVuIHRvIGRpc3BsYXkKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERlc2NyaWJlcyBob3cgdGhlIGZvcmVncm91bmQgaXMgcG9zaXRpb25lZC4gRGVmYXVsdHMgdG8gQkVGT1JFIGFuZCBUT1AuCisgICAgICogRGVzY3JpYmVzIGhvdyB0aGUgZm9yZWdyb3VuZCBpcyBwb3NpdGlvbmVkLiBEZWZhdWx0cyB0byBTVEFSVCBhbmQgVE9QLgogICAgICAqCiAgICAgICogQHBhcmFtIGZvcmVncm91bmRHcmF2aXR5IFNlZSB7QGxpbmsgYW5kcm9pZC52aWV3LkdyYXZpdHl9CiAgICAgICoKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRHcmF2aXR5KGludCBmb3JlZ3JvdW5kR3Jhdml0eSkgewogICAgICAgICBpZiAobUZvcmVncm91bmRHcmF2aXR5ICE9IGZvcmVncm91bmRHcmF2aXR5KSB7CiAgICAgICAgICAgICBpZiAoKGZvcmVncm91bmRHcmF2aXR5ICYgR3Jhdml0eS5SRUxBVElWRV9IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvcmVncm91bmRHcmF2aXR5IHw9IEdyYXZpdHkuQkVGT1JFOworICAgICAgICAgICAgICAgIGZvcmVncm91bmRHcmF2aXR5IHw9IEdyYXZpdHkuU1RBUlQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoZm9yZWdyb3VuZEdyYXZpdHkgJiBHcmF2aXR5LlZFUlRJQ0FMX0dSQVZJVFlfTUFTSykgPT0gMCkgewpAQCAtMzY0LDEwICszNjQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgZ3Jhdml0eSA9IERFRkFVTFRfQ0hJTERfR1JBVklUWTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaG9yaXpvbnRhbEdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShncmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkoZ3Jhdml0eSwgbGF5b3V0RGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVydGljYWxHcmF2aXR5ID0gZ3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLOwogCi0gICAgICAgICAgICAgICAgc3dpdGNoIChob3Jpem9udGFsR3Jhdml0eSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuTEVGVDoKICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGVmdCA9IHBhcmVudExlZnQgKyBscC5sZWZ0TWFyZ2luOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MzUsOCArNDM2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGZCb3VuZHMuc2V0KG1QYWRkaW5nTGVmdCwgbVBhZGRpbmdUb3AsIHcgLSBtUGFkZGluZ1JpZ2h0LCBoIC0gbVBhZGRpbmdCb3R0b20pOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpOwogICAgICAgICAgICAgICAgIEdyYXZpdHkuYXBwbHkobUZvcmVncm91bmRHcmF2aXR5LCBmb3JlZ3JvdW5kLmdldEludHJpbnNpY1dpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kLmdldEludHJpbnNpY0hlaWdodCgpLCBzZWxmQm91bmRzLCBvdmVybGF5Qm91bmRzLCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmQuZ2V0SW50cmluc2ljSGVpZ2h0KCksIHNlbGZCb3VuZHMsIG92ZXJsYXlCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXREaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgIGZvcmVncm91bmQuc2V0Qm91bmRzKG92ZXJsYXlCb3VuZHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZExheW91dC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRMYXlvdXQuamF2YQppbmRleCA0ODg5MTAxLi40NmU0Mzk4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZExheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9HcmlkTGF5b3V0LmphdmEKQEAgLTQ2LDExICs0NiwxMSBAQAogICogPHA+CiAgKiBUaGUgZ3JpZCBpcyBjb21wb3NlZCBvZiBhIHNldCBvZiBpbmZpbml0ZWx5IHRoaW4gbGluZXMgdGhhdCBzZXBhcmF0ZSB0aGUKICAqIHZpZXdpbmcgYXJlYSBpbnRvIDxlbT5jZWxsczwvZW0+LiBUaHJvdWdob3V0IHRoZSBBUEksIGdyaWQgbGluZXMgYXJlIHJlZmVyZW5jZWQKLSAqIGJ5IGdyaWQgPGVtPmluZGljZXM8L2VtPi4gQSBncmlkIHRoYXQgaGFzIDxjb2RlPk48L2NvZGU+IGNvbHVtbnMKLSAqIGhhcyA8Y29kZT5OICsgMTwvY29kZT4gZ3JpZCBpbmRpY2VzIHRoYXQgcnVuIGZyb20gPGNvZGU+MDwvY29kZT4KLSAqIHRocm91Z2ggPGNvZGU+TjwvY29kZT4gaW5jbHVzaXZlLiBSZWdhcmRsZXNzIG9mIGhvdyBHcmlkTGF5b3V0IGlzCi0gKiBjb25maWd1cmVkLCBncmlkIGluZGV4IDxjb2RlPjA8L2NvZGU+IGlzIGZpeGVkIHRvIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlCi0gKiBjb250YWluZXIgYW5kIGdyaWQgaW5kZXggPGNvZGU+TjwvY29kZT4gaXMgZml4ZWQgdG8gaXRzIHRyYWlsaW5nIGVkZ2UKKyAqIGJ5IGdyaWQgPGVtPmluZGljZXM8L2VtPi4gQSBncmlkIHdpdGgge0Bjb2RlIE59IGNvbHVtbnMKKyAqIGhhcyB7QGNvZGUgTiArIDF9IGdyaWQgaW5kaWNlcyB0aGF0IHJ1biBmcm9tIHtAY29kZSAwfQorICogdGhyb3VnaCB7QGNvZGUgTn0gaW5jbHVzaXZlLiBSZWdhcmRsZXNzIG9mIGhvdyBHcmlkTGF5b3V0IGlzCisgKiBjb25maWd1cmVkLCBncmlkIGluZGV4IHtAY29kZSAwfSBpcyBmaXhlZCB0byB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZQorICogY29udGFpbmVyIGFuZCBncmlkIGluZGV4IHtAY29kZSBOfSBpcyBmaXhlZCB0byBpdHMgdHJhaWxpbmcgZWRnZQogICogKGFmdGVyIHBhZGRpbmcgaXMgdGFrZW4gaW50byBhY2NvdW50KS4KICAqCiAgKiA8aDQ+Um93IGFuZCBDb2x1bW4gR3JvdXBzPC9oND4KQEAgLTExNiwxNyArMTE2LDYxIEBACiAgICAgICogVGhlIGhvcml6b250YWwgb3JpZW50YXRpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSE9SSVpPTlRBTCA9IExpbmVhckxheW91dC5IT1JJWk9OVEFMOworCiAgICAgLyoqCiAgICAgICogVGhlIHZlcnRpY2FsIG9yaWVudGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlRJQ0FMID0gTGluZWFyTGF5b3V0LlZFUlRJQ0FMOwogCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICAgKiBGaWVsZHMgY2FuIHVzZSB0aGlzIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgdGhlaXIgdmFsdWVzCisgICAgICogaGF2ZSBub3QgeWV0IGJlZW4gc2V0LiBTaW1pbGFybHksIG1ldGhvZHMgY2FuIHJldHVybiB0aGlzIHZhbHVlCisgICAgICogdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyBzdWl0YWJsZSB2YWx1ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNhbiByZXR1cm4uCisgICAgICogVGhlIHZhbHVlIHVzZWQgZm9yIHRoZSBjb25zdGFudCAoY3VycmVudGx5IHtAbGluayBJbnRlZ2VyI01JTl9WQUxVRX0pIGlzCisgICAgICogaW50ZW5kZWQgdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gdmFsaWQgdmFsdWVzIHdob3NlIHNpZ24gbWF5IG5vdCBiZSBrbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORUQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RhbnQgaXMgYW4ge0BsaW5rICNzZXRBbGlnbm1lbnRNb2RlKGludCkgYWxpZ25tZW50TW9kZX0uCisgICAgICogV2hlbiB0aGUge0Bjb2RlIGFsaWdubWVudE1vZGV9IGlzIHNldCB0byB7QGxpbmsgI0FMSUdOX0JPVU5EU30sIGFsaWdubWVudAorICAgICAqIGlzIG1hZGUgYmV0d2VlbiB0aGUgZWRnZXMgb2YgZWFjaCBjb21wb25lbnQncyByYXcKKyAgICAgKiB2aWV3IGJvdW5kYXJ5OiBpLmUuIHRoZSBhcmVhIGRlbGltaXRlZCBieSB0aGUgY29tcG9uZW50J3M6CisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2dldFRvcCgpIHRvcH0sCisgICAgICoge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I2dldExlZnQoKSBsZWZ0fSwKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0Qm90dG9tKCkgYm90dG9tfSBhbmQKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0UmlnaHQoKSByaWdodH0gcHJvcGVydGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiB7QGNvZGUgR3JpZExheW91dH0gaXMgaW4ge0BsaW5rICNBTElHTl9CT1VORFN9IG1vZGUsCisgICAgICogY2hpbGRyZW4gdGhhdCBiZWxvbmcgdG8gYSByb3cgZ3JvdXAgdGhhdCB1c2VzIHtAbGluayAjVE9QfSBhbGlnbm1lbnQgd2lsbAorICAgICAqIGFsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgd2hlbiB0aGVpciB7QGxpbmsgYW5kcm9pZC52aWV3LlZpZXcjZ2V0VG9wKCl9CisgICAgICogbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEFsaWdubWVudE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOX0JPVU5EUyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0YW50IGlzIGFuIHtAbGluayAjc2V0QWxpZ25tZW50TW9kZShpbnQpIGFsaWdubWVudE1vZGV9LgorICAgICAqIFdoZW4gdGhlIHtAY29kZSBhbGlnbm1lbnRNb2RlfSBpcyBzZXQgdG8ge0BsaW5rICNBTElHTl9NQVJHSU5TfSwKKyAgICAgKiB0aGUgYm91bmRzIG9mIGVhY2ggdmlldyBhcmUgZXh0ZW5kZWQgb3V0d2FyZHMsIGFjY29yZGluZworICAgICAqIHRvIHRoZWlyIG1hcmdpbnMsIGJlZm9yZSB0aGUgZWRnZXMgb2YgdGhlIHJlc3VsdGluZyByZWN0YW5nbGUgYXJlIGFsaWduZWQuCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHdoZW4ge0Bjb2RlIEdyaWRMYXlvdXR9IGlzIGluIHtAbGluayAjQUxJR05fTUFSR0lOU30gbW9kZSwKKyAgICAgKiB0aGUgcXVhbnRpdHkge0Bjb2RlIHRvcCAtIGxheW91dFBhcmFtcy50b3BNYXJnaW59IGlzIHRoZSBzYW1lIGZvciBhbGwgY2hpbGRyZW4gdGhhdAorICAgICAqIGJlbG9uZyB0byBhIHJvdyBncm91cCB0aGF0IHVzZXMge0BsaW5rICNUT1B9IGFsaWdubWVudC4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEFsaWdubWVudE1vZGUoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMSUdOX01BUkdJTlMgPSAxOworCiAgICAgLy8gTWlzYyBjb25zdGFudHMKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBHcmlkTGF5b3V0LmNsYXNzLmdldE5hbWUoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRCA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhaW50IEdSSURfUEFJTlQgPSBuZXcgUGFpbnQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBQYWludCBHUklEX1BBSU5UOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBHT0xERU5fUkFUSU8gPSAoMSArIE1hdGguc3FydCg1KSkgLyAyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU4gPSAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUkYgPSAxOwpAQCAtMTM4LDYgKzE4Miw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09VTlQgPSBVTkRFRklORUQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1VTRV9ERUZBVUxUX01BUkdJTlMgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfT1JERVJfUFJFU0VSVkVEID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQUxJR05NRU5UX01PREUgPSBBTElHTl9NQVJHSU5TOworICAgIC8vIHRvZG8gcmVtb3ZlIHRoaXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05UQUlORVJfTUFSR0lOID0gMjA7CiAKICAgICAvLyBUeXBlZEFycmF5IGluZGljZXMKIApAQCAtMTQ1LDkgKzE5MiwxOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dfQ09VTlQgPSBzdHlsZWFibGUuR3JpZExheW91dF9yb3dDb3VudDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gc3R5bGVhYmxlLkdyaWRMYXlvdXRfY29sdW1uQ291bnQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVTRV9ERUZBVUxUX01BUkdJTlMgPSBzdHlsZWFibGUuR3JpZExheW91dF91c2VEZWZhdWx0TWFyZ2luczsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUxJR05NRU5UX01PREUgPSBzdHlsZWFibGUuR3JpZExheW91dF9hbGlnbm1lbnRNb2RlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST1dfT1JERVJfUFJFU0VSVkVEID0gc3R5bGVhYmxlLkdyaWRMYXlvdXRfcm93T3JkZXJQcmVzZXJ2ZWQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9PUkRFUl9QUkVTRVJWRUQgPSBzdHlsZWFibGUuR3JpZExheW91dF9jb2x1bW5PcmRlclByZXNlcnZlZDsKIAorICAgIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbgorCisgICAgc3RhdGljIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBHUklEX1BBSU5UID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBHUklEX1BBSU5ULnNldENvbG9yKENvbG9yLmFyZ2IoNTAsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIEluc3RhbmNlIHZhcmlhYmxlcwogCiAgICAgcHJpdmF0ZSBmaW5hbCBBeGlzIG1Ib3Jpem9udGFsQXhpcyA9IG5ldyBBeGlzKHRydWUpOwpAQCAtMTU1LDkgKzIxMiwxMCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBtTGF5b3V0UGFyYW1zVmFsaWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGludCBtT3JpZW50YXRpb24gPSBERUZBVUxUX09SSUVOVEFUSU9OOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVXNlRGVmYXVsdE1hcmdpbnMgPSBERUZBVUxUX1VTRV9ERUZBVUxUX01BUkdJTlM7CisgICAgcHJpdmF0ZSBpbnQgbUFsaWdubWVudE1vZGUgPSBERUZBVUxUX0FMSUdOTUVOVF9NT0RFOwogICAgIHByaXZhdGUgaW50IG1EZWZhdWx0R3Jhdml0eSA9IEdyYXZpdHkuTk9fR1JBVklUWTsKLSAgICBib29sZWFuIG1heGltaXppbmcgPSBmYWxzZTsKLSAgICBib29sZWFuIGFjY29tbW9kYXRlQm90aE1pbkFuZE1heCA9IGZhbHNlOworCisgICAgLyogcGFja2FnZSAqLyBib29sZWFuIGFjY29tbW9kYXRlQm90aE1pbkFuZE1heCA9IGZhbHNlOwogCiAgICAgLy8gQ29uc3RydWN0b3JzCiAKQEAgLTE2NSwxMCArMjIzLDcgQEAKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgcHVibGljIEdyaWRMYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKLSAgICAgICAgfQorICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIDApOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc2LDYgKzIzMSw5IEBACiAgICAgICovCiAgICAgcHVibGljIEdyaWRMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewogICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGUpOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKKyAgICAgICAgfQogICAgICAgICBwcm9jZXNzQXR0cmlidXRlcyhjb250ZXh0LCBhdHRycyk7CiAgICAgfQogCkBAIC0xODMsMTcgKzI0MSwxNyBAQAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBwdWJsaWMgR3JpZExheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIHByb2Nlc3NBdHRyaWJ1dGVzKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NBdHRyaWJ1dGVzKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgc3R5bGVhYmxlLkdyaWRMYXlvdXQpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0Um93Q291bnQoYS5nZXRJbnRlZ2VyKFJPV19DT1VOVCwgREVGQVVMVF9DT1VOVCkpOwotICAgICAgICAgICAgc2V0Q29sdW1uQ291bnQoYS5nZXRJbnRlZ2VyKENPTFVNTl9DT1VOVCwgREVGQVVMVF9DT1VOVCkpOwotICAgICAgICAgICAgbU9yaWVudGF0aW9uID0gYS5nZXRJbnRlZ2VyKE9SSUVOVEFUSU9OLCBERUZBVUxUX09SSUVOVEFUSU9OKTsKKyAgICAgICAgICAgIHNldFJvd0NvdW50KGEuZ2V0SW50KFJPV19DT1VOVCwgREVGQVVMVF9DT1VOVCkpOworICAgICAgICAgICAgc2V0Q29sdW1uQ291bnQoYS5nZXRJbnQoQ09MVU1OX0NPVU5ULCBERUZBVUxUX0NPVU5UKSk7CisgICAgICAgICAgICBtT3JpZW50YXRpb24gPSBhLmdldEludChPUklFTlRBVElPTiwgREVGQVVMVF9PUklFTlRBVElPTik7CiAgICAgICAgICAgICBtVXNlRGVmYXVsdE1hcmdpbnMgPSBhLmdldEJvb2xlYW4oVVNFX0RFRkFVTFRfTUFSR0lOUywgREVGQVVMVF9VU0VfREVGQVVMVF9NQVJHSU5TKTsKKyAgICAgICAgICAgIG1BbGlnbm1lbnRNb2RlID0gYS5nZXRJbnQoQUxJR05NRU5UX01PREUsIERFRkFVTFRfQUxJR05NRU5UX01PREUpOwogICAgICAgICAgICAgc2V0Um93T3JkZXJQcmVzZXJ2ZWQoYS5nZXRCb29sZWFuKFJPV19PUkRFUl9QUkVTRVJWRUQsIERFRkFVTFRfT1JERVJfUFJFU0VSVkVEKSk7CiAgICAgICAgICAgICBzZXRDb2x1bW5PcmRlclByZXNlcnZlZChhLmdldEJvb2xlYW4oQ09MVU1OX09SREVSX1BSRVNFUlZFRCwgREVGQVVMVF9PUkRFUl9QUkVTRVJWRUQpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTIwNiw4ICsyNjQsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3JpZW50YXRpb24uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIGVpdGhlciB7QGxpbmsgI0hPUklaT05UQUx9IG9yIHtAbGluayAjVkVSVElDQUx9LiBUaGUgZGVmYXVsdAotICAgICAqIGlzIHtAbGluayAjSE9SSVpPTlRBTH0uCisgICAgICogQHJldHVybiBlaXRoZXIge0BsaW5rICNIT1JJWk9OVEFMfSBvciB7QGxpbmsgI1ZFUlRJQ0FMfQogICAgICAqCiAgICAgICogQHNlZSAjc2V0T3JpZW50YXRpb24oaW50KQogICAgICAqCkBAIC0yMjEsOCArMjc4LDEwIEBACiAgICAgICogVGhlIG9yaWVudGF0aW9uIHByb3BlcnR5IGRvZXMgbm90IGFmZmVjdCBsYXlvdXQuIE9yaWVudGF0aW9uIGlzIHVzZWQKICAgICAgKiBvbmx5IHRvIGdlbmVyYXRlIGRlZmF1bHQgcm93L2NvbHVtbiBpbmRpY2VzIHdoZW4gdGhleSBhcmUgbm90IHNwZWNpZmllZAogICAgICAqIGJ5IGEgY29tcG9uZW50J3MgbGF5b3V0IHBhcmFtZXRlcnMuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyB7QGxpbmsgI0hPUklaT05UQUx9LgogICAgICAqCi0gICAgICogQHBhcmFtIG9yaWVudGF0aW9uIHRoZSBvcmllbnRhdGlvbiwgZWl0aGVyIHtAbGluayAjSE9SSVpPTlRBTH0gb3Ige0BsaW5rICNWRVJUSUNBTH0uCisgICAgICogQHBhcmFtIG9yaWVudGF0aW9uIGVpdGhlciB7QGxpbmsgI0hPUklaT05UQUx9IG9yIHtAbGluayAjVkVSVElDQUx9CiAgICAgICoKICAgICAgKiBAc2VlICNnZXRPcmllbnRhdGlvbigpCiAgICAgICoKQEAgLTI1Niw3ICszMTUsNyBAQAogICAgICAqIG9ubHkgdG8gZ2VuZXJhdGUgZGVmYXVsdCByb3cvY29sdW1uIGluZGljZXMgd2hlbiB0aGV5IGFyZSBub3Qgc3BlY2lmaWVkCiAgICAgICogYnkgYSBjb21wb25lbnQncyBsYXlvdXQgcGFyYW1ldGVycy4KICAgICAgKgotICAgICAqIEBwYXJhbSByb3dDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MuCisgICAgICogQHBhcmFtIHJvd0NvdW50IHRoZSBudW1iZXIgb2Ygcm93cwogICAgICAqCiAgICAgICogQHNlZSAjZ2V0Um93Q291bnQoKQogICAgICAqIEBzZWUgTGF5b3V0UGFyYW1zI3Jvd0dyb3VwCkBAIC0zMDMsNyArMzYyLDcgQEAKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgR3JpZExheW91dCB3aWxsIGFsbG9jYXRlIGRlZmF1bHQgbWFyZ2lucyB3aGVuIG5vCiAgICAgICogY29ycmVzcG9uZGluZyBsYXlvdXQgcGFyYW1ldGVycyBhcmUgZGVmaW5lZC4KICAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBkZWZhdWx0IG1hcmdpbnMgc2hvdWxkIGJlIGFsbG9jYXRlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBkZWZhdWx0IG1hcmdpbnMgc2hvdWxkIGJlIGFsbG9jYXRlZAogICAgICAqCiAgICAgICogQHNlZSAjc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbikKICAgICAgKgpAQCAtMzE0LDE2ICszNzMsMjMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXaGVuIHRydWUsIEdyaWRMYXlvdXQgYWxsb2NhdGVzIGRlZmF1bHQgbWFyZ2lucyBhcm91bmQgY2hpbGRyZW4KKyAgICAgKiBXaGVuIHtAY29kZSB0cnVlfSwgR3JpZExheW91dCBhbGxvY2F0ZXMgZGVmYXVsdCBtYXJnaW5zIGFyb3VuZCBjaGlsZHJlbgogICAgICAqIGJhc2VkIG9uIHRoZSBjaGlsZCdzIHZpc3VhbCBjaGFyYWN0ZXJpc3RpY3MuIEVhY2ggb2YgdGhlCiAgICAgICogbWFyZ2lucyBzbyBkZWZpbmVkIG1heSBiZSBpbmRlcGVuZGVudGx5IG92ZXJyaWRkZW4gYnkgYW4gYXNzaWdubWVudAogICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBsYXlvdXQgcGFyYW1ldGVyLgogICAgICAqIDxwPgotICAgICAqIFdoZW4gZmFsc2UsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFsbCBtYXJnaW5zIGlzIHplcm8uCisgICAgICogV2hlbiB7QGNvZGUgZmFsc2V9LCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhbGwgbWFyZ2lucyBpcyB6ZXJvLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gc2V0dGluZyB0byB7QGNvZGUgdHJ1ZX0sIGNvbnNpZGVyIHNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZQorICAgICAqIHtAbGluayAjc2V0QWxpZ25tZW50TW9kZShpbnQpIGFsaWdubWVudE1vZGV9CisgICAgICogcHJvcGVydHkgdG8ge0BsaW5rICNBTElHTl9CT1VORFN9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMge0Bjb2RlIGZhbHNlfS4KICAgICAgKgotICAgICAqIEBwYXJhbSB1c2VEZWZhdWx0TWFyZ2lucyB1c2UgdHJ1ZSB0byBtYWtlIEdyaWRMYXlvdXQgYWxsb2NhdGUgZGVmYXVsdCBtYXJnaW5zCisgICAgICogQHBhcmFtIHVzZURlZmF1bHRNYXJnaW5zIHVzZSB7QGNvZGUgdHJ1ZX0gdG8gbWFrZSBHcmlkTGF5b3V0IGFsbG9jYXRlIGRlZmF1bHQgbWFyZ2lucwogICAgICAqCiAgICAgICogQHNlZSAjZ2V0VXNlRGVmYXVsdE1hcmdpbnMoKQorICAgICAqIEBzZWUgI3NldEFsaWdubWVudE1vZGUoaW50KQogICAgICAqCiAgICAgICogQHNlZSBNYXJnaW5MYXlvdXRQYXJhbXMjbGVmdE1hcmdpbgogICAgICAqIEBzZWUgTWFyZ2luTGF5b3V0UGFyYW1zI3RvcE1hcmdpbgpAQCAtMzM0LDEzICs0MDAsNTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0TWFyZ2lucyhib29sZWFuIHVzZURlZmF1bHRNYXJnaW5zKSB7CiAgICAgICAgIG1Vc2VEZWZhdWx0TWFyZ2lucyA9IHVzZURlZmF1bHRNYXJnaW5zOworICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWxpZ25tZW50IG1vZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhbGlnbm1lbnQgbW9kZTsgZWl0aGVyIHtAbGluayAjQUxJR05fQk9VTkRTfSBvciB7QGxpbmsgI0FMSUdOX01BUkdJTlN9CisgICAgICoKKyAgICAgKiBAc2VlICNBTElHTl9CT1VORFMKKyAgICAgKiBAc2VlICNBTElHTl9NQVJHSU5TCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRBbGlnbm1lbnRNb2RlKGludCkKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI0dyaWRMYXlvdXRfYWxpZ25tZW50TW9kZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWxpZ25tZW50TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGlnbm1lbnRNb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGFsaWdubWVudCBtb2RlIHRvIGJlIHVzZWQgZm9yIGFsbCBvZiB0aGUgYWxpZ25tZW50cyBiZXR3ZWVuIHRoZQorICAgICAqIGNoaWxkcmVuIG9mIHRoaXMgY29udGFpbmVyLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMge0BsaW5rICNBTElHTl9NQVJHSU5TfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGlnbm1lbnRNb2RlIGVpdGhlciB7QGxpbmsgI0FMSUdOX0JPVU5EU30gb3Ige0BsaW5rICNBTElHTl9NQVJHSU5TfQorICAgICAqCisgICAgICogQHNlZSAjQUxJR05fQk9VTkRTCisgICAgICogQHNlZSAjQUxJR05fTUFSR0lOUworICAgICAqCisgICAgICogQHNlZSAjZ2V0QWxpZ25tZW50TW9kZSgpCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNHcmlkTGF5b3V0X2FsaWdubWVudE1vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbGlnbm1lbnRNb2RlKGludCBhbGlnbm1lbnRNb2RlKSB7CisgICAgICAgIG1BbGlnbm1lbnRNb2RlID0gYWxpZ25tZW50TW9kZTsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3Qgcm93IGJvdW5kYXJpZXMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgZ3JpZCBpbmRpY2VzLgogICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHJvdyBib3VuZGFyaWVzIG11c3QgYXBwZWFyIGluIHRoZSBvcmRlciBvZiB0aGVpciBpbmRpY2VzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogICAgICAgICBUaGUgZGVmYXVsdCBpcyBmYWxzZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiByb3cgYm91bmRhcmllcyBtdXN0IGFwcGVhciBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgaW5kaWNlcywKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCiAgICAgICoKICAgICAgKiBAc2VlICNzZXRSb3dPcmRlclByZXNlcnZlZChib29sZWFuKQogICAgICAqCkBAIC0zNTEsMjUgKzQ1NCwyNSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBkZWZhdWx0IHN0YXRlLCBHcmlkTGF5b3V0CisgICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHtAY29kZSBmYWxzZX0sIHRoZSBkZWZhdWx0IHN0YXRlLCBHcmlkTGF5b3V0CiAgICAgICogaXMgYXQgbGliZXJ0eSB0byBjaG9vc2UgYW4gb3JkZXIgdGhhdCBiZXR0ZXIgc3VpdHMgdGhlIGhlaWdodHMgb2YgaXRzIGNoaWxkcmVuLgotICAgICAgIDxwPgotICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgR3JpZExheW91dCBpcyBmb3JjZWQgdG8gcGxhY2Ugcm93IGJvdW5kYXJpZXMKLSAgICAgKiAodGhlIHtAbGluayBJbnRlcnZhbCNtaW4gbWlufSBhbmQge0BsaW5rIEludGVydmFsI21heCBtYXh9IHZhbHVlcyBvZgotICAgICAqIGEge0BsaW5rIExheW91dFBhcmFtcyNyb3dHcm91cCByb3dHcm91cH0ncyB7QGxpbmsgR3JvdXAjc3BhbiBzcGFufSkKLSAgICAgKiBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlciBpbiB0aGUgdmlldy4KKyAgICAgPHA+CisgICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHtAY29kZSB0cnVlfSwgR3JpZExheW91dCBpcyBmb3JjZWQgdG8gcGxhY2UgdGhlIHJvdyBib3VuZGFyaWVzCisgICAgICogc28gdGhhdCB0aGVpciBhc3NvY2lhdGVkIGdyaWQgaW5kaWNlcyBhcmUgaW4gYXNjZW5kaW5nIG9yZGVyIGluIHRoZSB2aWV3LgogICAgICAqIDxwPgogICAgICAqIEdyaWRMYXlvdXQgaW1wbGVtZW50cyB0aGlzIHNwZWNpZmljYXRpb24gYnkgY3JlYXRpbmcgb3JkZXJpbmcgY29uc3RyYWludHMgYmV0d2VlbgogICAgICAqIHRoZSB2YXJpYWJsZXMgdGhhdCByZXByZXNlbnQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgcm93IGJvdW5kYXJpZXMuCiAgICAgICoKLSAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIGNvbnN0cmFpbnRzIGFyZSBhZGRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlCi0gICAgICogaW5kaWNlczogaS5lLiBiZXR3ZWVuIHJvdyBib3VuZGFyaWVzOiA8Y29kZT5bMC4uMV0sIFsxLi4yXSwgWzMuLjRdLC4uLjwvY29kZT4gZXRjLgorICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB7QGNvZGUgdHJ1ZX0sIGNvbnN0cmFpbnRzIGFyZSBhZGRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlCisgICAgICogaW5kaWNlczogaS5lLiBiZXR3ZWVuIHJvdyBib3VuZGFyaWVzOiB7QGNvZGUgWzAuLjFdLCBbMS4uMl0sIFsyLi4zXSwuLi59IGV0Yy4KICAgICAgKgotICAgICAqIFdoZW4gdGhlIHByb3BlcnR5IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSBwbGFjZWQKKyAgICAgKiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyB7QGNvZGUgZmFsc2V9LCB0aGUgb3JkZXJpbmcgY29uc3RyYWludHMgYXJlIHBsYWNlZAogICAgICAqIG9ubHkgYmV0d2VlbiBib3VuZGFyaWVzIHRoYXQgc2VwYXJhdGUgb3Bwb3NpbmcgZWRnZXMgb2YgdGhlIGxheW91dCdzIGNoaWxkcmVuLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvd09yZGVyUHJlc2VydmVkIHVzZSB0cnVlIHRvIGZvcmNlIEdyaWRMYXlvdXQgdG8gcmVzcGVjdCB0aGUgb3JkZXIKLSAgICAgKiAgICAgICAgb2Ygcm93IGJvdW5kYXJpZXMuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyB7QGNvZGUgZmFsc2V9LgorCisgICAgICogQHBhcmFtIHJvd09yZGVyUHJlc2VydmVkIHtAY29kZSB0cnVlfSB0byBmb3JjZSBHcmlkTGF5b3V0IHRvIHJlc3BlY3QgdGhlIG9yZGVyCisgICAgICogICAgICAgIG9mIHJvdyBib3VuZGFyaWVzCiAgICAgICoKICAgICAgKiBAc2VlICNpc1Jvd09yZGVyUHJlc2VydmVkKCkKICAgICAgKgpAQCAtMzc3LDEzICs0ODAsMTUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSb3dPcmRlclByZXNlcnZlZChib29sZWFuIHJvd09yZGVyUHJlc2VydmVkKSB7CiAgICAgICAgIG1WZXJ0aWNhbEF4aXMuc2V0T3JkZXJQcmVzZXJ2ZWQocm93T3JkZXJQcmVzZXJ2ZWQpOworICAgICAgICBpbnZhbGlkYXRlU3RydWN0dXJlKCk7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IGNvbHVtbiBib3VuZGFyaWVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIGdyaWQgaW5kaWNlcy4KICAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjb2x1bW4gYm91bmRhcmllcyBtdXN0IGFwcGVhciBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgaW5kaWNlcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY29sdW1uIGJvdW5kYXJpZXMgbXVzdCBhcHBlYXIgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIGluZGljZXMsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqCiAgICAgICogQHNlZSAjc2V0Q29sdW1uT3JkZXJQcmVzZXJ2ZWQoYm9vbGVhbikKICAgICAgKgpAQCAtMzk0LDI0ICs0OTksMjQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgZGVmYXVsdCBzdGF0ZSwgR3JpZExheW91dAorICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB7QGNvZGUgZmFsc2V9LCB0aGUgZGVmYXVsdCBzdGF0ZSwgR3JpZExheW91dAogICAgICAqIGlzIGF0IGxpYmVydHkgdG8gY2hvb3NlIGFuIG9yZGVyIHRoYXQgYmV0dGVyIHN1aXRzIHRoZSB3aWR0aHMgb2YgaXRzIGNoaWxkcmVuLgotICAgICAgIDxwPgotICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgR3JpZExheW91dCBpcyBmb3JjZWQgdG8gcGxhY2UgY29sdW1uIGJvdW5kYXJpZXMKLSAgICAgKiAodGhlIHtAbGluayBJbnRlcnZhbCNtaW4gbWlufSBhbmQge0BsaW5rIEludGVydmFsI21heCBtYXh9IHZhbHVlcyBvZgotICAgICAqIGEge0BsaW5rIExheW91dFBhcmFtcyNjb2x1bW5Hcm91cCBjb2x1bW5Hcm91cH0ncyB7QGxpbmsgR3JvdXAjc3BhbiBzcGFufSkKLSAgICAgKiBzbyB0aGF0IHRoZXkgYXBwZWFyIGluIGFzY2VuZGluZyBvcmRlciBpbiB0aGUgdmlldy4KKyAgICAgPHA+CisgICAgICogV2hlbiB0aGlzIHByb3BlcnR5IGlzIHtAY29kZSB0cnVlfSwgR3JpZExheW91dCBpcyBmb3JjZWQgdG8gcGxhY2UgdGhlIGNvbHVtbiBib3VuZGFyaWVzCisgICAgICogc28gdGhhdCB0aGVpciBhc3NvY2lhdGVkIGdyaWQgaW5kaWNlcyBhcmUgaW4gYXNjZW5kaW5nIG9yZGVyIGluIHRoZSB2aWV3LgogICAgICAqIDxwPgogICAgICAqIEdyaWRMYXlvdXQgaW1wbGVtZW50cyB0aGlzIHNwZWNpZmljYXRpb24gYnkgY3JlYXRpbmcgb3JkZXJpbmcgY29uc3RyYWludHMgYmV0d2VlbgogICAgICAqIHRoZSB2YXJpYWJsZXMgdGhhdCByZXByZXNlbnQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgY29sdW1uIGJvdW5kYXJpZXMuCiAgICAgICoKLSAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIGNvbnN0cmFpbnRzIGFyZSBhZGRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlCi0gICAgICogaW5kaWNlczogaS5lLiBiZXR3ZWVuIGNvbHVtbiBib3VuZGFyaWVzOiA8Y29kZT5bMC4uMV0sIFsxLi4yXSwgWzMuLjRdLC4uLjwvY29kZT4gZXRjLgorICAgICAqIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyB7QGNvZGUgdHJ1ZX0sIGNvbnN0cmFpbnRzIGFyZSBhZGRlZCBmb3IgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlCisgICAgICogaW5kaWNlczogaS5lLiBiZXR3ZWVuIGNvbHVtbiBib3VuZGFyaWVzOiB7QGNvZGUgWzAuLjFdLCBbMS4uMl0sIFsyLi4zXSwuLi59IGV0Yy4KICAgICAgKgotICAgICAqIFdoZW4gdGhlIHByb3BlcnR5IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnRzIGFyZSBwbGFjZWQKKyAgICAgKiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyB7QGNvZGUgZmFsc2V9LCB0aGUgb3JkZXJpbmcgY29uc3RyYWludHMgYXJlIHBsYWNlZAogICAgICAqIG9ubHkgYmV0d2VlbiBib3VuZGFyaWVzIHRoYXQgc2VwYXJhdGUgb3Bwb3NpbmcgZWRnZXMgb2YgdGhlIGxheW91dCdzIGNoaWxkcmVuLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMge0Bjb2RlIGZhbHNlfS4KICAgICAgKgotICAgICAqIEBwYXJhbSBjb2x1bW5PcmRlclByZXNlcnZlZCB1c2UgdHJ1ZSB0byBmb3JjZSBHcmlkTGF5b3V0IHRvIHJlc3BlY3QgdGhlIG9yZGVyCisgICAgICogQHBhcmFtIGNvbHVtbk9yZGVyUHJlc2VydmVkIHVzZSB7QGNvZGUgdHJ1ZX0gdG8gZm9yY2UgR3JpZExheW91dCB0byByZXNwZWN0IHRoZSBvcmRlcgogICAgICAqICAgICAgICBvZiBjb2x1bW4gYm91bmRhcmllcy4KICAgICAgKgogICAgICAqIEBzZWUgI2lzQ29sdW1uT3JkZXJQcmVzZXJ2ZWQoKQpAQCAtNDIwLDEzICs1MjUsMTkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5PcmRlclByZXNlcnZlZChib29sZWFuIGNvbHVtbk9yZGVyUHJlc2VydmVkKSB7CiAgICAgICAgIG1Ib3Jpem9udGFsQXhpcy5zZXRPcmRlclByZXNlcnZlZChjb2x1bW5PcmRlclByZXNlcnZlZCk7CisgICAgICAgIGludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKGludCBpLCBpbnQgaikgewotICAgICAgICByZXR1cm4gaSA8IGogPyAtMSA6IGkgPiBqID8gMSA6IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1heDIoaW50W10gYSwgaW50IHZhbHVlSWZFbXB0eSkgeworICAgICAgICBpbnQgcmVzdWx0ID0gdmFsdWVJZkVtcHR5OworICAgICAgICBmb3IgKGludCBpID0gMCwgTiA9IGEubGVuZ3RoOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIGFbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN1bShpbnRbXSBhKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN1bShmbG9hdFtdIGEpIHsKICAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBsZW5ndGggPSBhLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICByZXN1bHQgKz0gYVtpXTsKQEAgLTQ0MCwxMyArNTUxLDEyIEBACiAgICAgICAgIC8vIGdhcHMgYXJlIGluIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBnb2xkZW4gcmF0aW8uCiAgICAgICAgIC8vIFRvIGVmZmVjdCB0aGlzIHdpdGggZXF1YWwgbWFyZ2lucyBhdCBlYWNoIGVkZ2UsIHNldCBlYWNoIG9mIHRoZQogICAgICAgICAvLyBmb3VyIG1hcmdpbiB2YWx1ZXMgdG8gaGFsZiB0aGlzIGFtb3VudC4KLSAgICAgICAgYy5tZWFzdXJlKDAsIDApOwogICAgICAgICByZXR1cm4gKGludCkgKGMuZ2V0TWVhc3VyZWRIZWlnaHQoKSAvIEdPTERFTl9SQVRJTyAvIDIpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldERlZmF1bHRNYXJnaW4oVmlldyBjLCBib29sZWFuIGlzQXRFZGdlLCBib29sZWFuIGxlYWRpbmcsIGJvb2xlYW4gaG9yaXpvbnRhbCkgewotICAgICAgICAvLyB0b2RvIHJlbW92ZSAyMCAtIHVzZSBwYWRkaW5nIGhlcmU/Ci0gICAgICAgIHJldHVybiBpc0F0RWRnZSA/IDIwIDogZ2V0RGVmYXVsdE1hcmdpbihjLCBsZWFkaW5nLCBob3Jpem9udGFsKTsKKyAgICAgICAgLy8gdG9kbyByZW1vdmUgREVGQVVMVF9DT05UQUlORVJfTUFSR0lOLiBVc2UgcGFkZGluZz8gU2VlayBhZHZpY2Ugb24gVGhlbWVzL1N0eWxlcywgZXRjLgorICAgICAgICByZXR1cm4gaXNBdEVkZ2UgPyBERUZBVUxUX0NPTlRBSU5FUl9NQVJHSU4gOiBnZXREZWZhdWx0TWFyZ2luKGMsIGxlYWRpbmcsIGhvcml6b250YWwpOwogICAgIH0KIAogICAgIHByaXZhdGUgaW50IGdldERlZmF1bHRNYXJnaW5WYWx1ZShWaWV3IGMsIExheW91dFBhcmFtcyBwLCBib29sZWFuIGxlYWRpbmcsIGJvb2xlYW4gaG9yaXpvbnRhbCkgewpAQCAtNDU2LDcgKzU2Niw3IEBACiAgICAgICAgIEdyb3VwIGdyb3VwID0gaG9yaXpvbnRhbCA/IHAuY29sdW1uR3JvdXAgOiBwLnJvd0dyb3VwOwogICAgICAgICBBeGlzIGF4aXMgPSBob3Jpem9udGFsID8gbUhvcml6b250YWxBeGlzIDogbVZlcnRpY2FsQXhpczsKICAgICAgICAgSW50ZXJ2YWwgc3BhbiA9IGdyb3VwLnNwYW47Ci0gICAgICAgIGJvb2xlYW4gaXNBdEVkZ2UgPSBsZWFkaW5nID8gc3Bhbi5taW4gPT0gMCA6IHNwYW4ubWF4ID09IGF4aXMuZ2V0Q291bnQoKTsKKyAgICAgICAgYm9vbGVhbiBpc0F0RWRnZSA9IGxlYWRpbmcgPyAoc3Bhbi5taW4gPT0gMCkgOiAoc3Bhbi5tYXggPT0gYXhpcy5nZXRDb3VudCgpKTsKIAogICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdE1hcmdpbihjLCBpc0F0RWRnZSwgbGVhZGluZywgaG9yaXpvbnRhbCk7CiAgICAgfQpAQCAtNDY0LDg5ICs1NzQsOTggQEAKICAgICBwcml2YXRlIGludCBnZXRNYXJnaW4oVmlldyB2aWV3LCBib29sZWFuIGxlYWRpbmcsIGJvb2xlYW4gaG9yaXpvbnRhbCkgewogICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBnZXRMYXlvdXRQYXJhbXModmlldyk7CiAgICAgICAgIGludCBtYXJnaW4gPSBob3Jpem9udGFsID8KLSAgICAgICAgICAgICAgICBsZWFkaW5nID8gbHAubGVmdE1hcmdpbiA6IGxwLnJpZ2h0TWFyZ2luIDoKLSAgICAgICAgICAgICAgICBsZWFkaW5nID8gbHAudG9wTWFyZ2luIDogbHAuYm90dG9tTWFyZ2luOworICAgICAgICAgICAgICAgIChsZWFkaW5nID8gbHAubGVmdE1hcmdpbiA6IGxwLnJpZ2h0TWFyZ2luKSA6CisgICAgICAgICAgICAgICAgKGxlYWRpbmcgPyBscC50b3BNYXJnaW4gOiBscC5ib3R0b21NYXJnaW4pOwogICAgICAgICByZXR1cm4gbWFyZ2luID09IFVOREVGSU5FRCA/IGdldERlZmF1bHRNYXJnaW5WYWx1ZSh2aWV3LCBscCwgbGVhZGluZywgaG9yaXpvbnRhbCkgOiBtYXJnaW47CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VuZGVmaW5lZChJbnRlcnZhbCBzcGFuKSB7Ci0gICAgICAgIHJldHVybiBzcGFuLm1pbiA9PSBVTkRFRklORUQgfHwgc3Bhbi5tYXggPT0gVU5ERUZJTkVEOworICAgIHByaXZhdGUgc3RhdGljIGludCB2YWx1ZUlmRGVmaW5lZChpbnQgdmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBVTkRFRklORUQpID8gdmFsdWUgOiBkZWZhdWx0VmFsdWU7CiAgICAgfQogCisgICAgLy8gaW5zdGFsbCBkZWZhdWx0IGluZGljZXMgZm9yIGNlbGxzIHRoYXQgZG9uJ3QgZGVmaW5lIHRoZW0KICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVMYXlvdXRQYXJhbXMoKSB7Ci0gICAgICAgIC8vIGluc3RhbGwgZGVmYXVsdCBpbmRpY2VzIGZvciBjZWxscyBpZiAqbm9uZSogYXJlIGRlZmluZWQKLSAgICAgICAgaWYgKG1Ib3Jpem9udGFsQXhpcy5tYXhJbmRleDEoKSA9PSBVTkRFRklORUQgfHwgbVZlcnRpY2FsQXhpcy5tYXhJbmRleDEoKSA9PSBVTkRFRklORUQpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaG9yaXpvbnRhbCA9IG1PcmllbnRhdGlvbiA9PSBIT1JJWk9OVEFMOwotICAgICAgICAgICAgaW50IGNvdW50ID0gaG9yaXpvbnRhbCA/IG1Ib3Jpem9udGFsQXhpcy5jb3VudCA6IG1WZXJ0aWNhbEF4aXMuY291bnQ7Ci0gICAgICAgICAgICBpZiAoY291bnQgPT0gVU5ERUZJTkVEKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB4ID0gMDsKLSAgICAgICAgICAgIGludCB5ID0gMDsKLSAgICAgICAgICAgIGludCBtYXhTaXplID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZ2V0Q2hpbGRDb3VudCgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gZ2V0TGF5b3V0UGFyYW1zMShnZXRDaGlsZEF0KGkpKTsKKyAgICAgICAgbmV3IE9iamVjdCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbWF4U2l6ZSA9IDA7CiAKLSAgICAgICAgICAgICAgICBJbnRlcnZhbCBoU3BhbiA9IGxwLmNvbHVtbkdyb3VwLnNwYW47Ci0gICAgICAgICAgICAgICAgaW50IGNlbGxXaWR0aCA9IGhTcGFuLnNpemUoKTsKLQotICAgICAgICAgICAgICAgIEludGVydmFsIHZTcGFuID0gbHAucm93R3JvdXAuc3BhbjsKLSAgICAgICAgICAgICAgICBpbnQgY2VsbEhlaWdodCA9IHZTcGFuLnNpemUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ICsgY2VsbFdpZHRoID4gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeSArPSBtYXhTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IHZhbHVlSWZEZWZpbmVkMihpbnQgdmFsdWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHkgKyBjZWxsSGVpZ2h0ID4gY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBtYXhTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBob3Jpem9udGFsID0gKG1PcmllbnRhdGlvbiA9PSBIT1JJWk9OVEFMKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXhpcyA9IGhvcml6b250YWwgPyBtSG9yaXpvbnRhbEF4aXMuY291bnQgOiBtVmVydGljYWxBeGlzLmNvdW50OworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHZhbHVlSWZEZWZpbmVkKGF4aXMsIEludGVnZXIuTUFYX1ZBTFVFKTsKKworICAgICAgICAgICAgICAgIGludCByb3cgPSAwOworICAgICAgICAgICAgICAgIGludCBjb2wgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBOID0gZ2V0Q2hpbGRDb3VudCgpOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IGdldExheW91dFBhcmFtczEoZ2V0Q2hpbGRBdChpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgR3JvdXAgY29sR3JvdXAgPSBscC5jb2x1bW5Hcm91cDsKKyAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWwgY29scyA9IGNvbEdyb3VwLnNwYW47CisgICAgICAgICAgICAgICAgICAgIGludCBjb2xTcGFuID0gY29scy5zaXplKCk7CisKKyAgICAgICAgICAgICAgICAgICAgR3JvdXAgcm93R3JvdXAgPSBscC5yb3dHcm91cDsKKyAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWwgcm93cyA9IHJvd0dyb3VwLnNwYW47CisgICAgICAgICAgICAgICAgICAgIGludCByb3dTcGFuID0gcm93cy5zaXplKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IHZhbHVlSWZEZWZpbmVkMihyb3dzLm1pbiwgcm93KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0NvbCA9IHZhbHVlSWZEZWZpbmVkKGNvbHMubWluLCAoY29sICsgY29sU3BhbiA+IGNvdW50KSA/IDAgOiBjb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0NvbCA8IGNvbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyArPSBtYXhTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gbmV3Q29sOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IG1heChtYXhTaXplLCByb3dTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IHZhbHVlSWZEZWZpbmVkMihjb2xzLm1pbiwgY29sKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld1JvdyA9IHZhbHVlSWZEZWZpbmVkKHJvd3MubWluLCAocm93ICsgcm93U3BhbiA+IGNvdW50KSA/IDAgOiByb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1JvdyA8IHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCArPSBtYXhTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gbmV3Um93OworICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IG1heChtYXhTaXplLCBjb2xTcGFuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxwLnNldENvbHVtbkdyb3VwU3BhbihuZXcgSW50ZXJ2YWwoY29sLCBjb2wgKyBjb2xTcGFuKSk7CisgICAgICAgICAgICAgICAgICAgIGxwLnNldFJvd0dyb3VwU3BhbihuZXcgSW50ZXJ2YWwocm93LCByb3cgKyByb3dTcGFuKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhvcml6b250YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGNvbCArIGNvbFNwYW47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSByb3cgKyByb3dTcGFuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxwLnNldEhvcml6b250YWxHcm91cFNwYW4obmV3IEludGVydmFsKHgsIHggKyBjZWxsV2lkdGgpKTsKLSAgICAgICAgICAgICAgICBscC5zZXRWZXJ0aWNhbEdyb3VwU3BhbihuZXcgSW50ZXJ2YWwoeSwgeSArIGNlbGxIZWlnaHQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChob3Jpem9udGFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHggPSB4ICsgY2VsbFdpZHRoOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHkgPSB5ICsgY2VsbEhlaWdodDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWF4U2l6ZSA9IG1heChtYXhTaXplLCBob3Jpem9udGFsID8gY2VsbEhlaWdodCA6IGNlbGxXaWR0aCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgQXQgbGVhc3Qgb25lIHJvdyBhbmQgb25lIGNvbHVtbiBpbmRleCBoYXZlIGJlZW4gZGVmaW5lZC4KLSAgICAgICAgICAgIEFzc3VtZSBtaXNzaW5nIHJvdy9jb2xzIGFyZSBpbiBlcnJvciBhbmQgc2V0IHRoZW0gdG8gemVybyBzbyB0aGF0Ci0gICAgICAgICAgICB0aGV5IHdpbGwgZGlzcGxheSB0b3AvbGVmdCBhbmQgdGhlIGRldmVsb3BlciBjYW4gYWRkIHRoZSByaWdodCBpbmRpY2VzLgotICAgICAgICAgICAgV2l0aG91dCB0aGlzIFVOREVGSU5FRCB3b3VsZCBjYXVzZSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBnZXRDaGlsZENvdW50KCk7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBnZXRMYXlvdXRQYXJhbXMxKGdldENoaWxkQXQoaSkpOwotICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChscC5jb2x1bW5Hcm91cC5zcGFuKSkgewotICAgICAgICAgICAgICAgICAgICBscC5zZXRIb3Jpem9udGFsR3JvdXBTcGFuKExheW91dFBhcmFtcy5ERUZBVUxUX1NQQU4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQobHAucm93R3JvdXAuc3BhbikpIHsKLSAgICAgICAgICAgICAgICAgICAgbHAuc2V0VmVydGljYWxHcm91cFNwYW4oTGF5b3V0UGFyYW1zLkRFRkFVTFRfU1BBTik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGludmFsaWRhdGVTdHJ1Y3R1cmUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaW52YWxpZGF0ZVN0cnVjdHVyZSgpIHsKICAgICAgICAgbUxheW91dFBhcmFtc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgIG1Ib3Jpem9udGFsQXhpcy5pbnZhbGlkYXRlU3RydWN0dXJlKCk7CiAgICAgICAgIG1WZXJ0aWNhbEF4aXMuaW52YWxpZGF0ZVN0cnVjdHVyZSgpOwotCiAgICAgICAgIC8vIFRoaXMgY2FuIGVuZCB1cCBiZWluZyBkb25lIHR3aWNlLiBCdXQgYmV0dGVyIHRoYXQgdGhhbiBub3QgYXQgYWxsLgogICAgICAgICBpbnZhbGlkYXRlVmFsdWVzKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVWYWx1ZXMoKSB7Ci0gICAgICAgIG1Ib3Jpem9udGFsQXhpcy5pbnZhbGlkYXRlVmFsdWVzKCk7Ci0gICAgICAgIG1WZXJ0aWNhbEF4aXMuaW52YWxpZGF0ZVZhbHVlcygpOworICAgICAgICAvLyBOZWVkIG51bGwgY2hlY2sgYmVjYXVzZSByZXF1ZXN0TGF5b3V0KCkgaXMgY2FsbGVkIGluIFZpZXcncyBpbml0aWFsaXplciwKKyAgICAgICAgLy8gYmVmb3JlIHdlIGFyZSBzZXQgdXAuCisgICAgICAgIGlmIChtSG9yaXpvbnRhbEF4aXMgIT0gbnVsbCAmJiBtVmVydGljYWxBeGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ib3Jpem9udGFsQXhpcy5pbnZhbGlkYXRlVmFsdWVzKCk7CisgICAgICAgICAgICBtVmVydGljYWxBeGlzLmludmFsaWRhdGVWYWx1ZXMoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgTGF5b3V0UGFyYW1zIGdldExheW91dFBhcmFtczEoVmlldyBjKSB7CkBAIC02MDUsMTAgKzcyNCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgewotICAgICAgICBHUklEX1BBSU5ULnNldENvbG9yKENvbG9yLmFyZ2IoNTAsIDI1NSwgMjU1LCAyNTUpKTsKLSAgICB9Ci0KICAgICAvLyBBZGQvcmVtb3ZlCiAKICAgICBAT3ZlcnJpZGUKQEAgLTY0NSw2MCArNzYwLDYxIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoU3BlYywgaW50IGhlaWdodFNwZWMpIHsKLSAgICAgICAgaW52YWxpZGF0ZVZhbHVlcygpOwotICAgICAgICAvLyBpbnQgd2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoU3BlYyk7Ci0gICAgICAgIC8vIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoU3BlYyk7Ci0gICAgICAgIC8vIGludCBoZWlnaHQgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodFNwZWMpOwotICAgICAgICAvLyBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0U3BlYyk7CisgICAgICAgIG1lYXN1cmVDaGlsZHJlbih3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwogCi0gICAgICAgIC8vIHRvZG8gLSBoYW5kbGUgd2lkdGhTcGVjIGFuZCBoZWlnaHRTcGVjIHByb3Blcmx5CisgICAgICAgIGludCBjb21wdXRlZFdpZHRoID0gZ2V0UGFkZGluZ0xlZnQoKSArIG1Ib3Jpem9udGFsQXhpcy5nZXRNaW4oKSArIGdldFBhZGRpbmdSaWdodCgpOworICAgICAgICBpbnQgY29tcHV0ZWRIZWlnaHQgPSBnZXRQYWRkaW5nVG9wKCkgKyBtVmVydGljYWxBeGlzLmdldE1pbigpICsgZ2V0UGFkZGluZ0JvdHRvbSgpOwogCi0gICAgICAgIGludCBjb21wdXRlZFdpZHRoID0gZ2V0UGFkZGluZ0xlZnQoKSArIG1Ib3Jpem9udGFsQXhpcy5nZXRQcmVmKCkgKyBnZXRQYWRkaW5nUmlnaHQoKTsKLSAgICAgICAgaW50IGNvbXB1dGVkSGVpZ2h0ID0gZ2V0UGFkZGluZ1RvcCgpICsgbVZlcnRpY2FsQXhpcy5nZXRQcmVmKCkgKyBnZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIGludCBtZWFzdXJlZFdpZHRoID0gTWF0aC5tYXgoY29tcHV0ZWRXaWR0aCwgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoKCkpOworICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQgPSBNYXRoLm1heChjb21wdXRlZEhlaWdodCwgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodCgpKTsKIAogICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbigKLSAgICAgICAgICAgICAgICByZXNvbHZlU2l6ZUFuZFN0YXRlKGNvbXB1dGVkV2lkdGgsIHdpZHRoU3BlYywgMCksCi0gICAgICAgICAgICAgICAgcmVzb2x2ZVNpemVBbmRTdGF0ZShjb21wdXRlZEhlaWdodCwgaGVpZ2h0U3BlYywgMCkpOworICAgICAgICAgICAgICAgIHJlc29sdmVTaXplQW5kU3RhdGUobWVhc3VyZWRXaWR0aCwgd2lkdGhTcGVjLCAwKSwKKyAgICAgICAgICAgICAgICByZXNvbHZlU2l6ZUFuZFN0YXRlKG1lYXN1cmVkSGVpZ2h0LCBoZWlnaHRTcGVjLCAwKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgcHJvdGVjdChpbnQgYWxpZ25tZW50KSB7Ci0gICAgICAgIHJldHVybiBhbGlnbm1lbnQgPT0gVU5ERUZJTkVEID8gMCA6IGFsaWdubWVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbihBeGlzIHN0YXRlLCBpbnQgaW5kZXgsIGJvb2xlYW4gbGVhZGluZykgewotICAgICAgICBpbnQgbWFyZ2luID0gbGVhZGluZyA/IHN0YXRlLmxlYWRpbmdNYXJnaW5zW2luZGV4XSA6IC1zdGF0ZS50cmFpbGluZ01hcmdpbnNbaW5kZXhdOwotICAgICAgICByZXR1cm4gc3RhdGUubG9jYXRpb25zW2luZGV4XSArIG1hcmdpbjsKKyAgICAgICAgcmV0dXJuIChhbGlnbm1lbnQgPT0gVU5ERUZJTkVEKSA/IDAgOiBhbGlnbm1lbnQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0TWVhc3VyZW1lbnQoVmlldyBjLCBib29sZWFuIGhvcml6b250YWwsIGludCBtZWFzdXJlbWVudFR5cGUpIHsKLSAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgYy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgLy8gRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhlIHNpemUuCi0gICAgICAgIC8vIElmIHNvLCByZXR1cm4gdGhlIHNwZWNpZmllZCBzaXplLgotICAgICAgICBpbnQgc2l6ZSA9IGhvcml6b250YWwgPyBscC53aWR0aCA6IGxwLmhlaWdodDsKLSAgICAgICAgaWYgKHNpemUgPj0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhvcml6b250YWwgPyBjLmdldE1lYXN1cmVkV2lkdGgoKSA6IGMuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKyAgICB9CiAKLSAgICAgICAgLy8gbWVhc3VyZUNoaWxkKGMsIDAsIDApOwotICAgICAgICBjLm1lYXN1cmUoMCwgMCk7Ly8gdG9kbyB3b3JrIG91dCBjb3JyZWN0IG9yZGVyIG9mIGV2ZW50cyBmb3IgbWVhc3VyZW1lbnQgY2FsbHMKLSAgICAgICAgaW50IHJlc3VsdCA9IGhvcml6b250YWwgPyBjLmdldE1lYXN1cmVkV2lkdGgoKSA6IGMuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICBmbG9hdCB3ZWlnaHQgPSBob3Jpem9udGFsID8gbHAuY29sdW1uV2VpZ2h0IDogbHAucm93V2VpZ2h0OwotICAgICAgICBBeGlzIGF4aXMgPSBob3Jpem9udGFsID8gbUhvcml6b250YWxBeGlzIDogbVZlcnRpY2FsQXhpczsKLSAgICAgICAgaWYgKHdlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgYXhpcy5wcmVmU2l6ZU9mV2VpZ2h0ZWRDb21wb25lbnQ7CisgICAgcHJpdmF0ZSBpbnQgZ2V0TWVhc3VyZW1lbnRJbmNsdWRpbmdNYXJnaW4oVmlldyBjLCBib29sZWFuIGhvcml6b250YWwsIGludCBtZWFzdXJlbWVudFR5cGUpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGdldE1lYXN1cmVtZW50KGMsIGhvcml6b250YWwsIG1lYXN1cmVtZW50VHlwZSk7CisgICAgICAgIGlmIChtQWxpZ25tZW50TW9kZSA9PSBBTElHTl9NQVJHSU5TKSB7CisgICAgICAgICAgICBpbnQgbGVhZGluZ01hcmdpbiA9IGdldE1hcmdpbihjLCB0cnVlLCBob3Jpem9udGFsKTsKKyAgICAgICAgICAgIGludCB0cmFpbGluZ01hcmdpbiA9IGdldE1hcmdpbihjLCBmYWxzZSwgaG9yaXpvbnRhbCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgbGVhZGluZ01hcmdpbiArIHRyYWlsaW5nTWFyZ2luOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVxdWVzdExheW91dCgpIHsKKyAgICAgICAgc3VwZXIucmVxdWVzdExheW91dCgpOworICAgICAgICBpbnZhbGlkYXRlVmFsdWVzKCk7CisgICAgfQorCiAgICAgLy8gTGF5b3V0IGNvbnRhaW5lcgogCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICBpbnZhbGlkYXRlVmFsdWVzKCk7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIC8qCisgICAgIFRoZSBsYXlvdXQgb3BlcmF0aW9uIGlzIGltcGxlbWVudGVkIGJ5IGRlbGVnYXRpbmcgdGhlIGhlYXZ5IGxpZnRpbmcgdG8gdGhlCisgICAgIHRvIHRoZSBtSG9yaXpvbnRhbEF4aXMgYW5kIG1WZXJ0aWNhbEF4aXMgaW5zdGFuY2VzIG9mIHRoZSBpbnRlcm5hbCBBeGlzIGNsYXNzLgorICAgICBUb2dldGhlciB0aGV5IGNvbXB1dGUgdGhlIGxvY2F0aW9ucyBvZiB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgbGluZXMgb2YKKyAgICAgdGhlIGdyaWQgKHJlc3BlY3RpdmVseSEpLgogCi0gICAgICAgIGludCB0YXJnZXRXaWR0aCA9IHIgLSBsOwotICAgICAgICBpbnQgdGFyZ2V0SGVpZ2h0ID0gYiAtIHQ7CisgICAgIFRoaXMgbWV0aG9kIGlzIHRoZW4gbGVmdCB3aXRoIHRoZSBzaW1wbGVyIHRhc2sgb2YgYXBwbHlpbmcgbWFyZ2lucywgZ3Jhdml0eQorICAgICBhbmQgc2l6aW5nIHRvIGVhY2ggY2hpbGQgdmlldyBhbmQgdGhlbiBwbGFjaW5nIGl0IGluIGl0cyBjZWxsLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICBpbnQgdGFyZ2V0V2lkdGggPSByaWdodCAtIGxlZnQ7CisgICAgICAgIGludCB0YXJnZXRIZWlnaHQgPSBib3R0b20gLSB0b3A7CiAKICAgICAgICAgaW50IHBhZGRpbmdMZWZ0ID0gZ2V0UGFkZGluZ0xlZnQoKTsKICAgICAgICAgaW50IHBhZGRpbmdUb3AgPSBnZXRQYWRkaW5nVG9wKCk7CkBAIC03MTAsMzYgKzgyNiw2OCBAQAogCiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZ2V0Q2hpbGRDb3VudCgpOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBWaWV3IHZpZXcgPSBnZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGNvbnN0cmFpbnRzID0gZ2V0TGF5b3V0UGFyYW1zKHZpZXcpOwotICAgICAgICAgICAgSW50ZXJ2YWwgaFJhbmdlID0gY29uc3RyYWludHMuY29sdW1uR3JvdXAuc3BhbjsKLSAgICAgICAgICAgIEludGVydmFsIHZSYW5nZSA9IGNvbnN0cmFpbnRzLnJvd0dyb3VwLnNwYW47CisgICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBnZXRMYXlvdXRQYXJhbXModmlldyk7CisgICAgICAgICAgICBHcm91cCBjb2x1bW5Hcm91cCA9IGxwLmNvbHVtbkdyb3VwOworICAgICAgICAgICAgR3JvdXAgcm93R3JvdXAgPSBscC5yb3dHcm91cDsKIAotICAgICAgICAgICAgaW50IHgxID0gZ2V0TG9jYXRpb25JbmNsdWRpbmdNYXJnaW4obUhvcml6b250YWxBeGlzLCBoUmFuZ2UubWluLCB0cnVlKTsKLSAgICAgICAgICAgIGludCB5MSA9IGdldExvY2F0aW9uSW5jbHVkaW5nTWFyZ2luKG1WZXJ0aWNhbEF4aXMsIHZSYW5nZS5taW4sIHRydWUpOworICAgICAgICAgICAgSW50ZXJ2YWwgY29sU3BhbiA9IGNvbHVtbkdyb3VwLnNwYW47CisgICAgICAgICAgICBJbnRlcnZhbCByb3dTcGFuID0gcm93R3JvdXAuc3BhbjsKIAotICAgICAgICAgICAgaW50IHgyID0gZ2V0TG9jYXRpb25JbmNsdWRpbmdNYXJnaW4obUhvcml6b250YWxBeGlzLCBoUmFuZ2UubWF4LCBmYWxzZSk7Ci0gICAgICAgICAgICBpbnQgeTIgPSBnZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbihtVmVydGljYWxBeGlzLCB2UmFuZ2UubWF4LCBmYWxzZSk7CisgICAgICAgICAgICBpbnQgeDEgPSBtSG9yaXpvbnRhbEF4aXMuZ2V0TG9jYXRpb25JbmNsdWRpbmdNYXJnaW4odmlldywgdHJ1ZSwgY29sU3Bhbi5taW4pOworICAgICAgICAgICAgaW50IHkxID0gbVZlcnRpY2FsQXhpcy5nZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbih2aWV3LCB0cnVlLCByb3dTcGFuLm1pbik7CisKKyAgICAgICAgICAgIGludCB4MiA9IG1Ib3Jpem9udGFsQXhpcy5nZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbih2aWV3LCBmYWxzZSwgY29sU3Bhbi5tYXgpOworICAgICAgICAgICAgaW50IHkyID0gbVZlcnRpY2FsQXhpcy5nZXRMb2NhdGlvbkluY2x1ZGluZ01hcmdpbih2aWV3LCBmYWxzZSwgcm93U3Bhbi5tYXgpOwogCiAgICAgICAgICAgICBpbnQgY2VsbFdpZHRoID0geDIgLSB4MTsKICAgICAgICAgICAgIGludCBjZWxsSGVpZ2h0ID0geTIgLSB5MTsKIAotICAgICAgICAgICAgQm91bmRzIG1pbk1heFggPSBtSG9yaXpvbnRhbEF4aXMuZ2V0R3JvdXBCb3VuZHMoKS5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIEJvdW5kcyBtaW5NYXhZID0gbVZlcnRpY2FsQXhpcy5nZXRHcm91cEJvdW5kcygpLmdldFZhbHVlKGkpOwotCiAgICAgICAgICAgICBpbnQgcFdpZHRoID0gZ2V0TWVhc3VyZW1lbnQodmlldywgdHJ1ZSwgUFJGKTsKICAgICAgICAgICAgIGludCBwSGVpZ2h0ID0gZ2V0TWVhc3VyZW1lbnQodmlldywgZmFsc2UsIFBSRik7CiAKLSAgICAgICAgICAgIEFsaWdubWVudCBoQWxpZ25tZW50ID0gY29uc3RyYWludHMuY29sdW1uR3JvdXAuYWxpZ25tZW50OwotICAgICAgICAgICAgQWxpZ25tZW50IHZBbGlnbm1lbnQgPSBjb25zdHJhaW50cy5yb3dHcm91cC5hbGlnbm1lbnQ7CisgICAgICAgICAgICBBbGlnbm1lbnQgaEFsaWduID0gY29sdW1uR3JvdXAuYWxpZ25tZW50OworICAgICAgICAgICAgQWxpZ25tZW50IHZBbGlnbiA9IHJvd0dyb3VwLmFsaWdubWVudDsKIAotICAgICAgICAgICAgaW50IGRkeCA9IHByb3RlY3QoaEFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZShudWxsLCBjZWxsV2lkdGggLSBtaW5NYXhYLnNpemUoKSkpOwotICAgICAgICAgICAgaW50IGRkeSA9IHByb3RlY3QodkFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZShudWxsLCBjZWxsSGVpZ2h0IC0gbWluTWF4WS5zaXplKCkpKTsKKyAgICAgICAgICAgIGludCBkeCwgZHk7CiAKLSAgICAgICAgICAgIGludCBkeCA9IGRkeCArIC1taW5NYXhYLmJlbG93IC0gaEFsaWdubWVudC5nZXRBbGlnbm1lbnRWYWx1ZSh2aWV3LCBwV2lkdGgpOwotICAgICAgICAgICAgaW50IGR5ID0gZGR5ICsgLW1pbk1heFkuYmVsb3cgLSB2QWxpZ25tZW50LmdldEFsaWdubWVudFZhbHVlKHZpZXcsIHBIZWlnaHQpOworICAgICAgICAgICAgQm91bmRzIGNvbEJvdW5kcyA9IG1Ib3Jpem9udGFsQXhpcy5nZXRHcm91cEJvdW5kcygpLmdldFZhbHVlKGkpOworICAgICAgICAgICAgQm91bmRzIHJvd0JvdW5kcyA9IG1WZXJ0aWNhbEF4aXMuZ2V0R3JvdXBCb3VuZHMoKS5nZXRWYWx1ZShpKTsKIAotICAgICAgICAgICAgaW50IHdpZHRoID0gaEFsaWdubWVudC5nZXRTaXplSW5DZWxsKHZpZXcsIHBXaWR0aCwgY2VsbFdpZHRoKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSB2QWxpZ25tZW50LmdldFNpemVJbkNlbGwodmlldywgcEhlaWdodCwgY2VsbEhlaWdodCk7CisgICAgICAgICAgICAvLyBHcmF2aXR5IG9mZnNldHM6IHRoZSBsb2NhdGlvbiBvZiB0aGUgYWxpZ25tZW50IGdyb3VwIHJlbGF0aXZlIHRvIGl0cyBjZWxsIGdyb3VwLgorICAgICAgICAgICAgaW50IHR5cGUgPSBQUkY7CisgICAgICAgICAgICBpbnQgYzJheCA9IHByb3RlY3QoaEFsaWduLmdldEFsaWdubWVudFZhbHVlKG51bGwsIGNlbGxXaWR0aCAtIGNvbEJvdW5kcy5zaXplKCksIHR5cGUpKTsKKyAgICAgICAgICAgIGludCBjMmF5ID0gcHJvdGVjdCh2QWxpZ24uZ2V0QWxpZ25tZW50VmFsdWUobnVsbCwgY2VsbEhlaWdodCAtIHJvd0JvdW5kcy5zaXplKCksIHR5cGUpKTsKKworICAgICAgICAgICAgaWYgKG1BbGlnbm1lbnRNb2RlID09IEFMSUdOX01BUkdJTlMpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbiA9IGdldE1hcmdpbih2aWV3LCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luID0gZ2V0TWFyZ2luKHZpZXcsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4gPSBnZXRNYXJnaW4odmlldywgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgIGludCBib3R0b21NYXJnaW4gPSBnZXRNYXJnaW4odmlldywgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgIC8vIFNhbWUgY2FsY3VsYXRpb24gYXMgZ2V0TWVhc3VyZW1lbnRJbmNsdWRpbmdNYXJnaW4oKQorICAgICAgICAgICAgICAgIGludCBtV2lkdGggPSBsZWZ0TWFyZ2luICsgcFdpZHRoICsgcmlnaHRNYXJnaW47CisgICAgICAgICAgICAgICAgaW50IG1IZWlnaHQgPSB0b3BNYXJnaW4gKyBwSGVpZ2h0ICsgYm90dG9tTWFyZ2luOworCisgICAgICAgICAgICAgICAgLy8gQWxpZ25tZW50IG9mZnNldHM6IHRoZSBsb2NhdGlvbiBvZiB0aGUgdmlldyByZWxhdGl2ZSB0byBpdHMgYWxpZ25tZW50IGdyb3VwLgorICAgICAgICAgICAgICAgIGludCBhMnZ4ID0gY29sQm91bmRzLmJlZm9yZSAtIGhBbGlnbi5nZXRBbGlnbm1lbnRWYWx1ZSh2aWV3LCBtV2lkdGgsIHR5cGUpOworICAgICAgICAgICAgICAgIGludCBhMnZ5ID0gcm93Qm91bmRzLmJlZm9yZSAtIHZBbGlnbi5nZXRBbGlnbm1lbnRWYWx1ZSh2aWV3LCBtSGVpZ2h0LCB0eXBlKTsKKworICAgICAgICAgICAgICAgIGR4ID0gYzJheCArIGEydnggKyBsZWZ0TWFyZ2luOworICAgICAgICAgICAgICAgIGR5ID0gYzJheSArIGEydnkgKyB0b3BNYXJnaW47CisKKyAgICAgICAgICAgICAgICBjZWxsV2lkdGggLT0gbGVmdE1hcmdpbiArIHJpZ2h0TWFyZ2luOworICAgICAgICAgICAgICAgIGNlbGxIZWlnaHQgLT0gdG9wTWFyZ2luICsgYm90dG9tTWFyZ2luOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBBbGlnbm1lbnQgb2Zmc2V0czogdGhlIGxvY2F0aW9uIG9mIHRoZSB2aWV3IHJlbGF0aXZlIHRvIGl0cyBhbGlnbm1lbnQgZ3JvdXAuCisgICAgICAgICAgICAgICAgaW50IGEydnggPSBjb2xCb3VuZHMuYmVmb3JlIC0gaEFsaWduLmdldEFsaWdubWVudFZhbHVlKHZpZXcsIHBXaWR0aCwgdHlwZSk7CisgICAgICAgICAgICAgICAgaW50IGEydnkgPSByb3dCb3VuZHMuYmVmb3JlIC0gdkFsaWduLmdldEFsaWdubWVudFZhbHVlKHZpZXcsIHBIZWlnaHQsIHR5cGUpOworCisgICAgICAgICAgICAgICAgZHggPSBjMmF4ICsgYTJ2eDsKKyAgICAgICAgICAgICAgICBkeSA9IGMyYXkgKyBhMnZ5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgd2lkdGggPSBoQWxpZ24uZ2V0U2l6ZUluQ2VsbCh2aWV3LCBwV2lkdGgsIGNlbGxXaWR0aCwgdHlwZSk7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gdkFsaWduLmdldFNpemVJbkNlbGwodmlldywgcEhlaWdodCwgY2VsbEhlaWdodCwgdHlwZSk7CiAKICAgICAgICAgICAgIGludCBjeCA9IHBhZGRpbmdMZWZ0ICsgeDEgKyBkeDsKICAgICAgICAgICAgIGludCBjeSA9IHBhZGRpbmdUb3AgKyB5MSArIGR5OwpAQCAtNzQ5LDkgKzg5NywxNCBAQAogCiAgICAgLy8gSW5uZXIgY2xhc3NlcwogCisgICAgLyoKKyAgICAgVGhpcyBpbnRlcm5hbCBjbGFzcyBob3VzZXMgdGhlIGFsZ29yaXRobSBmb3IgY29tcHV0aW5nIHRoZSBsb2NhdGlvbnMgb2YgZ3JpZCBsaW5lczsKKyAgICAgYWxvbmcgZWl0aGVyIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGF4aXMuIEEgR3JpZExheW91dCB1c2VzIHR3byBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyAtCisgICAgIGRpc3Rpbmd1aXNoZWQgYnkgdGhlICJob3Jpem9udGFsIiBmbGFnIHdoaWNoIGlzIHRydWUgZm9yIHRoZSBob3Jpem9udGFsIGF4aXMgYW5kIGZhbHNlCisgICAgIGZvciB0aGUgdmVydGljYWwgb25lLgorICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgQXhpcyB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fVkFMVUUgPSAtMTAwMDAwMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9WQUxVRSA9IDEwMDAwMDA7CiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOVklTSVRFRCA9IDA7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQRU5ESU5HID0gMTsKQEAgLTc2NiwzMiArOTE5LDM1IEBACiAgICAgICAgIFBhY2tlZE1hcDxHcm91cCwgQm91bmRzPiBncm91cEJvdW5kczsKICAgICAgICAgcHVibGljIGJvb2xlYW4gZ3JvdXBCb3VuZHNWYWxpZCA9IGZhbHNlOwogCi0gICAgICAgIFBhY2tlZE1hcDxJbnRlcnZhbCwgSW50PiBzcGFuU2l6ZXM7CisgICAgICAgIFBhY2tlZE1hcDxJbnRlcnZhbCwgTXV0YWJsZUludD4gc3BhblNpemVzOwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzcGFuU2l6ZXNWYWxpZCA9IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyBpbnRbXSBsb2NhdGlvbnM7Ci0KICAgICAgICAgcHVibGljIGludFtdIGxlYWRpbmdNYXJnaW5zOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBsZWFkaW5nTWFyZ2luc1ZhbGlkID0gZmFsc2U7CisKICAgICAgICAgcHVibGljIGludFtdIHRyYWlsaW5nTWFyZ2luczsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdHJhaWxpbmdNYXJnaW5zVmFsaWQgPSBmYWxzZTsKIAogICAgICAgICBwdWJsaWMgQXJjW10gYXJjczsKICAgICAgICAgcHVibGljIGJvb2xlYW4gYXJjc1ZhbGlkID0gZmFsc2U7CiAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1PcmRlclByZXNlcnZlZCA9IERFRkFVTFRfT1JERVJfUFJFU0VSVkVEOworICAgICAgICBwdWJsaWMgaW50W10gbWluaW1hOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtaW5pbWFWYWxpZCA9IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyBpbnQgcHJlZlNpemVPZldlaWdodGVkQ29tcG9uZW50OworICAgICAgICBwdWJsaWMgZmxvYXRbXSB3ZWlnaHRzOworICAgICAgICBwdWJsaWMgaW50W10gbG9jYXRpb25zOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtT3JkZXJQcmVzZXJ2ZWQgPSBERUZBVUxUX09SREVSX1BSRVNFUlZFRDsKIAogICAgICAgICBwcml2YXRlIEF4aXMoYm9vbGVhbiBob3Jpem9udGFsKSB7CiAgICAgICAgICAgICB0aGlzLmhvcml6b250YWwgPSBob3Jpem9udGFsOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnQgbWF4SW5kZXgoYm9vbGVhbiBpbnRlcm5hbCkgeworICAgICAgICBwcml2YXRlIGludCBtYXhJbmRleCgpIHsKICAgICAgICAgICAgIC8vIG5vdGUgdGhlIG51bWJlciBJbnRlZ2VyLk1JTl9WQUxVRSArIDEgY29tZXMgdXAgaW4gdW5kZWZpbmVkIGNlbGxzCiAgICAgICAgICAgICBpbnQgY291bnQgPSAtMTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZ2V0Q2hpbGRDb3VudCgpOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IGludGVybmFsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldExheW91dFBhcmFtczEoZ2V0Q2hpbGRBdChpKSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF5b3V0UGFyYW1zKGdldENoaWxkQXQoaSkpOworICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPSBnZXRMYXlvdXRQYXJhbXMoZ2V0Q2hpbGRBdChpKSk7CiAgICAgICAgICAgICAgICAgR3JvdXAgZyA9IGhvcml6b250YWwgPyBwYXJhbXMuY29sdW1uR3JvdXAgOiBwYXJhbXMucm93R3JvdXA7CiAgICAgICAgICAgICAgICAgY291bnQgPSBtYXgoY291bnQsIGcuc3Bhbi5taW4pOwogICAgICAgICAgICAgICAgIGNvdW50ID0gbWF4KGNvdW50LCBnLnNwYW4ubWF4KTsKQEAgLTc5OSwxMyArOTU1LDkgQEAKICAgICAgICAgICAgIHJldHVybiBjb3VudCA9PSAtMSA/IFVOREVGSU5FRCA6IGNvdW50OwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnQgbWF4SW5kZXgxKCkgewotICAgICAgICAgICAgcmV0dXJuIG1heEluZGV4KHRydWUpOwotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIGlmICghY291bnRXYXNFeHBsaWNpdHlTZXQgJiYgIWNvdW50VmFsaWQpIHsKLSAgICAgICAgICAgICAgICBjb3VudCA9IG1heCgwLCBtYXhJbmRleChmYWxzZSkpOyAvLyBpZiB0aGVyZSBhcmUgbm8gY2VsbHMsIHRoZSBjb3VudCBpcyB6ZXJvCisgICAgICAgICAgICBpZiAoIWNvdW50VmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IG1heCgwLCBtYXhJbmRleCgpKTsgLy8gaWYgdGhlcmUgYXJlIG5vIGNlbGxzLCB0aGUgY291bnQgaXMgemVybwogICAgICAgICAgICAgICAgIGNvdW50VmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGNvdW50OwpAQCAtODQ0LDE3ICs5OTYsMTcgQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBCb3VuZHMudmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZ3JvdXBCb3VuZHMudmFsdWVzW2ldLnJlc2V0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGdldENoaWxkQ291bnQoKTsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIE4gPSBnZXRDaGlsZENvdW50KCk7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICBWaWV3IGMgPSBnZXRDaGlsZEF0KGkpOwogICAgICAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IGdldExheW91dFBhcmFtcyhjKTsKICAgICAgICAgICAgICAgICBHcm91cCBnID0gaG9yaXpvbnRhbCA/IGxwLmNvbHVtbkdyb3VwIDogbHAucm93R3JvdXA7CiAKICAgICAgICAgICAgICAgICBCb3VuZHMgYm91bmRzID0gZ3JvdXBCb3VuZHMuZ2V0VmFsdWUoaSk7Ci0gICAgICAgICAgICAgICAgaW50IGRpbSA9IGdldE1lYXN1cmVtZW50KGMsIGhvcml6b250YWwsIFBSRik7CisKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGdldE1lYXN1cmVtZW50SW5jbHVkaW5nTWFyZ2luKGMsIGhvcml6b250YWwsIFBSRik7CiAgICAgICAgICAgICAgICAgLy8gdG9kbyB0ZXN0IHRoaXMgd29ya3MgY29ycmVjdGx5IHdoZW4gdGhlIHJldHVybmVkIHZhbHVlIGlzIFVOREVGSU5FRAotICAgICAgICAgICAgICAgIGludCBiZWxvdyA9IGcuYWxpZ25tZW50LmdldEFsaWdubWVudFZhbHVlKGMsIGRpbSk7Ci0gICAgICAgICAgICAgICAgaW50IGFib3ZlID0gZGltIC0gYmVsb3c7Ci0gICAgICAgICAgICAgICAgYm91bmRzLmluY2x1ZGUoLWJlbG93LCBhYm92ZSk7CisgICAgICAgICAgICAgICAgaW50IGJlZm9yZSA9IGcuYWxpZ25tZW50LmdldEFsaWdubWVudFZhbHVlKGMsIHNpemUsIFBSRik7CisgICAgICAgICAgICAgICAgYm91bmRzLmluY2x1ZGUoYmVmb3JlLCBzaXplIC0gYmVmb3JlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC04NzAsMzYgKzEwMjIsMzYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEFkZCB2YWx1ZXMgY29tcHV0ZWQgYnkgYWxpZ25tZW50IC0gdGFraW5nIHRoZSBtYXggb2YgYWxsIGFsaWdubWVudHMgaW4gZWFjaCBzcGFuCi0gICAgICAgIHByaXZhdGUgUGFja2VkTWFwPEludGVydmFsLCBJbnQ+IGNyZWF0ZVNwYW5TaXplcygpIHsKKyAgICAgICAgcHJpdmF0ZSBQYWNrZWRNYXA8SW50ZXJ2YWwsIE11dGFibGVJbnQ+IGNyZWF0ZVNwYW5TaXplcygpIHsKICAgICAgICAgICAgIFBhY2tlZE1hcDxHcm91cCwgQm91bmRzPiBncm91cEJvdW5kcyA9IGdldEdyb3VwQm91bmRzKCk7CiAgICAgICAgICAgICBpbnQgTiA9IGdyb3VwQm91bmRzLmtleXMubGVuZ3RoOwogICAgICAgICAgICAgSW50ZXJ2YWxbXSBzcGFucyA9IG5ldyBJbnRlcnZhbFtOXTsKLSAgICAgICAgICAgIEludFtdIHZhbHVlcyA9IG5ldyBJbnRbTl07CisgICAgICAgICAgICBNdXRhYmxlSW50W10gdmFsdWVzID0gbmV3IE11dGFibGVJbnRbTl07CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIEludGVydmFsIGtleSA9IGdyb3VwQm91bmRzLmtleXNbaV0uc3BhbjsKIAogICAgICAgICAgICAgICAgIHNwYW5zW2ldID0ga2V5OwotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBJbnQoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgTXV0YWJsZUludCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBQYWNrZWRNYXA8SW50ZXJ2YWwsIEludD4oc3BhbnMsIHZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhY2tlZE1hcDxJbnRlcnZhbCwgTXV0YWJsZUludD4oc3BhbnMsIHZhbHVlcyk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZVNwYW5TaXplcygpIHsKLSAgICAgICAgICAgIEludFtdIHNwYW5zID0gc3BhblNpemVzLnZhbHVlczsKKyAgICAgICAgICAgIE11dGFibGVJbnRbXSBzcGFucyA9IHNwYW5TaXplcy52YWx1ZXM7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3BhbnNbaV0ucmVzZXQoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQm91bmRzW10gYm91bmRzID0gZ2V0R3JvdXBCb3VuZHMoKS52YWx1ZXM7ICAvLyB1cyBnZXQgdG8gdHJpZ2dlciBhIHJlLWV2YWx1YXRpb24KKyAgICAgICAgICAgIEJvdW5kc1tdIGJvdW5kcyA9IGdldEdyb3VwQm91bmRzKCkudmFsdWVzOyAgLy8gdXNlIGdldHRlciB0byB0cmlnZ2VyIGEgcmUtZXZhbHVhdGlvbgogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3VuZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBib3VuZHNbaV0uc2l6ZSgpOwogCi0gICAgICAgICAgICAgICAgSW50IHZhbHVlSG9sZGVyID0gc3BhblNpemVzLmdldFZhbHVlKGkpOworICAgICAgICAgICAgICAgIE11dGFibGVJbnQgdmFsdWVIb2xkZXIgPSBzcGFuU2l6ZXMuZ2V0VmFsdWUoaSk7CiAgICAgICAgICAgICAgICAgdmFsdWVIb2xkZXIudmFsdWUgPSBtYXgodmFsdWVIb2xkZXIudmFsdWUsIHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgUGFja2VkTWFwPEludGVydmFsLCBJbnQ+IGdldFNwYW5TaXplcygpIHsKKyAgICAgICAgcHJpdmF0ZSBQYWNrZWRNYXA8SW50ZXJ2YWwsIE11dGFibGVJbnQ+IGdldFNwYW5TaXplcygpIHsKICAgICAgICAgICAgIGlmIChzcGFuU2l6ZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNwYW5TaXplcyA9IGNyZWF0ZVNwYW5TaXplcygpOwogICAgICAgICAgICAgfQpAQCAtOTEwLDkgKzEwNjIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNwYW5TaXplczsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbmNsdWRlKExpc3Q8QXJjPiBhcmNzLCBJbnRlcnZhbCBrZXksIEludCBzaXplLCBib29sZWFuIG1heGltaXppbmcpIHsKLSAgICAgICAgICAgIGtleSA9IG1heGltaXppbmcgPyBrZXkuaW52ZXJzZSgpIDoga2V5OwotICAgICAgICAgICAgc2l6ZSA9IG1heGltaXppbmcgPyBzaXplLm5lZygpIDogc2l6ZTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGluY2x1ZGUoTGlzdDxBcmM+IGFyY3MsIEludGVydmFsIGtleSwgTXV0YWJsZUludCBzaXplKSB7CiAgICAgICAgICAgICAvLyB0aGlzIGJpdCBiZWxvdyBzaG91bGQgcmVhbGx5IGJlIGNvbXB1dGVkIG91dHNpZGUgaGVyZSAtCiAgICAgICAgICAgICAvLyBpdHMganVzdCB0byBzdG9wIGRlZmF1bHQgKGNvbD4wKSBjb25zdHJhaW50cyBvYmxpdGVyYXRpbmcgdmFsaWQgZW50cmllcwogICAgICAgICAgICAgZm9yIChBcmMgYXJjIDogYXJjcykgewpAQCAtOTI0LDIyICsxMDc0LDIyIEBACiAgICAgICAgICAgICBhcmNzLmFkZChuZXcgQXJjKGtleSwgc2l6ZSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluY2x1ZGUyKExpc3Q8QXJjPiBhcmNzLCBJbnRlcnZhbCBzcGFuLCBJbnQgbWluLCBJbnQgbWF4LAotICAgICAgICAgICAgICAgIGJvb2xlYW4gYm90aCwgYm9vbGVhbiBtYXhpbWl6aW5nKSB7Ci0gICAgICAgICAgICBpbmNsdWRlKGFyY3MsIHNwYW4sIG1pbiwgbWF4aW1pemluZyk7CisgICAgICAgIHByaXZhdGUgdm9pZCBpbmNsdWRlMihMaXN0PEFyYz4gYXJjcywgSW50ZXJ2YWwgc3BhbiwgTXV0YWJsZUludCBtaW4sIE11dGFibGVJbnQgbWF4LAorICAgICAgICAgICAgICAgIGJvb2xlYW4gYm90aCkgeworICAgICAgICAgICAgaW5jbHVkZShhcmNzLCBzcGFuLCBtaW4pOwogICAgICAgICAgICAgaWYgKGJvdGgpIHsKLSAgICAgICAgICAgICAgICBpbmNsdWRlKGFyY3MsIHNwYW4uaW52ZXJzZSgpLCBtYXgubmVnKCksIG1heGltaXppbmcpOworICAgICAgICAgICAgICAgIC8vIHRvZG8KKy8vICAgICAgICAgICAgICAgIGluY2x1ZGUoYXJjcywgc3Bhbi5pbnZlcnNlKCksIG1heC5uZWcoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgaW5jbHVkZTIoTGlzdDxBcmM+IGFyY3MsIEludGVydmFsIHNwYW4sIGludCBtaW4sIGludCBtYXgsCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBib3RoLCBib29sZWFuIG1heGltaXppbmcpIHsKLSAgICAgICAgICAgIGluY2x1ZGUyKGFyY3MsIHNwYW4sIG5ldyBJbnQobWluKSwgbmV3IEludChtYXgpLCBib3RoLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGluY2x1ZGUyKExpc3Q8QXJjPiBhcmNzLCBJbnRlcnZhbCBzcGFuLCBpbnQgbWluLCBpbnQgbWF4LCBib29sZWFuIGJvdGgpIHsKKyAgICAgICAgICAgIGluY2x1ZGUyKGFyY3MsIHNwYW4sIG5ldyBNdXRhYmxlSW50KG1pbiksIG5ldyBNdXRhYmxlSW50KG1heCksIGJvdGgpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gR3JvdXAgYXJjcyBieSB0aGVpciBmaXJzdCBpbmRleCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFycmF5cy4KKyAgICAgICAgLy8gR3JvdXAgYXJjcyBieSB0aGVpciBmaXJzdCB2ZXJ0ZXgsIHJldHVybmluZyBhbiBhcnJheSBvZiBhcnJheXMuCiAgICAgICAgIC8vIFRoaXMgaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgYXJjcy4KLSAgICAgICAgcHJpdmF0ZSBBcmNbXVtdIGluZGV4KEFyY1tdIGFyY3MpIHsKKyAgICAgICAgcHJpdmF0ZSBBcmNbXVtdIGdyb3VwQXJjc0J5Rmlyc3RWZXJ0ZXgoQXJjW10gYXJjcykgewogICAgICAgICAgICAgaW50IE4gPSBnZXRDb3VudCgpICsgMTsvLyB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzCiAgICAgICAgICAgICBBcmNbXVtdIHJlc3VsdCA9IG5ldyBBcmNbTl1bXTsKICAgICAgICAgICAgIGludFtdIHNpemVzID0gbmV3IGludFtOXTsKQEAgLTk1OSwxOCArMTEwOSwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHRvZG8gZG8gd2UgYWx3YXlzIGFkZCBmaXJzdCBlbGVtZW50PwotICAgICAgICBwcml2YXRlIEFyY1tdIHNvcnQoZmluYWwgQXJjW10gYXJjcywgaW50IHN0YXJ0KSB7CisgICAgICAgIHByaXZhdGUgQXJjW10gdG9wb2xvZ2ljYWxTb3J0KGZpbmFsIEFyY1tdIGFyY3MsIGludCBzdGFydCkgeworICAgICAgICAvLyB0b2RvIGVuc3VyZSB0aGUgPHN0YXJ0PiB2ZXJ0ZXggaXMgYWRkZWQgaW4gZWRnZSBjYXNlcwogICAgICAgICAgICAgZmluYWwgTGlzdDxBcmM+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8QXJjPigpOwogICAgICAgICAgICAgbmV3IE9iamVjdCgpIHsKLSAgICAgICAgICAgICAgICBBcmNbXVtdIGluZGV4ID0gaW5kZXgoYXJjcyk7CisgICAgICAgICAgICAgICAgQXJjW11bXSBhcmNzQnlGaXJzdFZlcnRleCA9IGdyb3VwQXJjc0J5Rmlyc3RWZXJ0ZXgoYXJjcyk7CiAgICAgICAgICAgICAgICAgaW50W10gdmlzaXRlZCA9IG5ldyBpbnRbZ2V0Q291bnQoKSArIDFdOwogCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBjb21wbGV0ZXNDeWNsZShpbnQgbG9jKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IHZpc2l0ZWRbbG9jXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFVOVklTSVRFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRlZFtsb2NdID0gUEVORElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQXJjIGFyYyA6IGluZGV4W2xvY10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQXJjIGFyYyA6IGFyY3NCeUZpcnN0VmVydGV4W2xvY10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gYXJjLnNwYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlY3Vyc2l2ZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlc0N5Y2xlKHNwYW4ubWF4KSkgewpAQCAtMTAwNiw3ICsxMTU2LDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyB0b2RvIHVuaWZ5IHdpdGggZmluZFVzZWQgYWJvdmUKKyAgICAgICAgLy8gdG9kbyB1bmlmeSB3aXRoIGZpbmRVc2VkIGFib3ZlLiBCb3RoIHJvdXRpbmVzIGFuYWx5emUgd2hpY2ggcm93cy9jb2x1bW5zIGFyZSBlbXB0eS4KICAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEludGVydmFsPiBnZXRTcGFjZXJzKCkgewogICAgICAgICAgICAgTGlzdDxJbnRlcnZhbD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJbnRlcnZhbD4oKTsKICAgICAgICAgICAgIGludCBOID0gZ2V0Q291bnQoKSArIDE7CkBAIC0xMDM4LDE2ICsxMTg4LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBBcmNbXSBjcmVhdGVBcmNzKGJvb2xlYW4gbWF4aW1pemluZykgeworICAgICAgICBwcml2YXRlIEFyY1tdIGNyZWF0ZUFyY3MoKSB7CiAgICAgICAgICAgICBMaXN0PEFyYz4gc3BhblRvU2l6ZSA9IG5ldyBBcnJheUxpc3Q8QXJjPigpOwogCiAgICAgICAgICAgICAvLyBBZGQgYWxsIHRoZSBwcmVmZXJyZWQgZWxlbWVudHMgdGhhdCB3ZXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSB1c2VyLgotICAgICAgICAgICAgUGFja2VkTWFwPEludGVydmFsLCBJbnQ+IHNwYW5TaXplcyA9IGdldFNwYW5TaXplcygpOworICAgICAgICAgICAgUGFja2VkTWFwPEludGVydmFsLCBNdXRhYmxlSW50PiBzcGFuU2l6ZXMgPSBnZXRTcGFuU2l6ZXMoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BhblNpemVzLmtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICBJbnRlcnZhbCBrZXkgPSBzcGFuU2l6ZXMua2V5c1tpXTsKLSAgICAgICAgICAgICAgICBJbnQgdmFsdWUgPSBzcGFuU2l6ZXMudmFsdWVzW2ldOworICAgICAgICAgICAgICAgIE11dGFibGVJbnQgdmFsdWUgPSBzcGFuU2l6ZXMudmFsdWVzW2ldOwogICAgICAgICAgICAgICAgIC8vIHRvZG8gcmVtb3ZlIHZhbHVlIGR1cGxpY2F0ZQotICAgICAgICAgICAgICAgIGluY2x1ZGUyKHNwYW5Ub1NpemUsIGtleSwgdmFsdWUsIHZhbHVlLCBhY2NvbW1vZGF0ZUJvdGhNaW5BbmRNYXgsIG1heGltaXppbmcpOworICAgICAgICAgICAgICAgIGluY2x1ZGUyKHNwYW5Ub1NpemUsIGtleSwgdmFsdWUsIHZhbHVlLCBhY2NvbW1vZGF0ZUJvdGhNaW5BbmRNYXgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBGaW5kIHJlZHVuZGFudCByb3dzL2NvbHMgYW5kIGdsdWUgdGhlbSB0b2dldGhlciB3aXRoIDAtbGVuZ3RoIGFyY3MgdG8gbGluayB0aGUgdHJlZQpAQCAtMTA1NSw4ICsxMjA1LDggQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q291bnQoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKCF1c2VkW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgIEludGVydmFsIHNwYW4gPSBuZXcgSW50ZXJ2YWwoaSwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlKHNwYW5Ub1NpemUsIHNwYW4sIG5ldyBJbnQoMCksIG1heGltaXppbmcpOwotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlKHNwYW5Ub1NpemUsIHNwYW4uaW52ZXJzZSgpLCBuZXcgSW50KDApLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZShzcGFuVG9TaXplLCBzcGFuLCBuZXcgTXV0YWJsZUludCgwKSk7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUoc3BhblRvU2l6ZSwgc3Bhbi5pbnZlcnNlKCksIG5ldyBNdXRhYmxlSW50KDApKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTEwNjQsMjEgKzEyMTQsMjEgQEAKICAgICAgICAgICAgICAgICAvLyBBZGQgcHJlZmVycmVkIGdhcHMKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldENvdW50KCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAodXNlZFtpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTIoc3BhblRvU2l6ZSwgbmV3IEludGVydmFsKGksIGkgKyAxKSwgMCwgMCwgZmFsc2UsIG1heGltaXppbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTIoc3BhblRvU2l6ZSwgbmV3IEludGVydmFsKGksIGkgKyAxKSwgMCwgMCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmb3IgKEludGVydmFsIGdhcCA6IGdldFNwYWNlcnMoKSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlMihzcGFuVG9TaXplLCBnYXAsIDAsIDAsIGZhbHNlLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTIoc3BhblRvU2l6ZSwgZ2FwLCAwLCAwLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQXJjW10gYXJjcyA9IHNwYW5Ub1NpemUudG9BcnJheShuZXcgQXJjW3NwYW5Ub1NpemUuc2l6ZSgpXSk7Ci0gICAgICAgICAgICByZXR1cm4gc29ydChhcmNzLCBtYXhpbWl6aW5nID8gZ2V0Q291bnQoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHRvcG9sb2dpY2FsU29ydChhcmNzLCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBBcmNbXSBnZXRBcmNzKGJvb2xlYW4gbWF4aW1pemluZykgeworICAgICAgICBwdWJsaWMgQXJjW10gZ2V0QXJjcygpIHsKICAgICAgICAgICAgIGlmIChhcmNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmNzID0gY3JlYXRlQXJjcyhtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICBhcmNzID0gY3JlYXRlQXJjcygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFhcmNzVmFsaWQpIHsKICAgICAgICAgICAgICAgICBnZXRTcGFuU2l6ZXMoKTsKQEAgLTEwODcsMjEgKzEyMzcsNTQgQEAKICAgICAgICAgICAgIHJldHVybiBhcmNzOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlbGF4KGludFtdIGxvY2F0aW9ucywgQXJjIGVudHJ5LCBib29sZWFuIG1heGltaXppbmcpIHsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlbGF4KGludFtdIGxvY2F0aW9ucywgQXJjIGVudHJ5KSB7CiAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gZW50cnkuc3BhbjsKICAgICAgICAgICAgIGludCB1ID0gc3Bhbi5taW47CiAgICAgICAgICAgICBpbnQgdiA9IHNwYW4ubWF4OwogICAgICAgICAgICAgaW50IHZhbHVlID0gZW50cnkudmFsdWUudmFsdWU7CiAgICAgICAgICAgICBpbnQgY2FuZGlkYXRlID0gbG9jYXRpb25zW3VdICsgdmFsdWU7Ci0gICAgICAgICAgICBpZiAobWF4aW1pemluZyA/IGNhbmRpZGF0ZSA8IGxvY2F0aW9uc1t2XSA6IGNhbmRpZGF0ZSA+IGxvY2F0aW9uc1t2XSkgeworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA+IGxvY2F0aW9uc1t2XSkgewogICAgICAgICAgICAgICAgIGxvY2F0aW9uc1t2XSA9IGNhbmRpZGF0ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEJlbGxtYW4tRm9yZCB2YXJpYW50Ci0gICAgICAgIHByaXZhdGUgaW50W10gc29sdmUoQXJjW10gYXJjcywgaW50W10gbG9jYXRpb25zLCBib29sZWFuIG1heGltaXppbmcpIHsKKyAgICAgICAgLyoKKyAgICAgICAgQmVsbG1hbi1Gb3JkIHZhcmlhbnQgLSBtb2RpZmllZCB0byByZWR1Y2UgdHlwaWNhbCBydW5uaW5nIHRpbWUgZnJvbSBPKE5eMikgdG8gTyhOKQorCisgICAgICAgIEdyaWRMYXlvdXQgY29udmVydHMgaXRzIHJlcXVpcmVtZW50cyBpbnRvIGEgc3lzdGVtIG9mIGxpbmVhciBjb25zdHJhaW50cyBvZiB0aGUKKyAgICAgICAgZm9ybToKKworICAgICAgICB4W2ldIC0geFtqXSA8IGFba10KKworICAgICAgICBXaGVyZSB0aGUgeFtpXSBhcmUgdmFyaWFibGVzIGFuZCB0aGUgYVtrXSBhcmUgY29uc3RhbnRzLgorCisgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgdmFyaWFibGVzIHdlcmUgaW5zdGVhZCBsYWJlbGVkIHgsIHksIHogd2UgbWlnaHQgaGF2ZToKKworICAgICAgICAgICAgeCAtIHkgPCAxNworICAgICAgICAgICAgeSAtIHogPCAyMworICAgICAgICAgICAgeiAtIHggPCA0MgorCisgICAgICAgIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIExpbmVhciBQcm9ncmFtbWluZyBwcm9ibGVtIHRoYXQgaXMsIGluIHR1cm4sCisgICAgICAgIGVxdWl2YWxlbnQgdG8gdGhlIHNpbmdsZS1zb3VyY2Ugc2hvcnRlc3QgcGF0aHMgcHJvYmxlbSBvbiBhIGRpZ3JhcGgsIGZvcgorICAgICAgICB3aGljaCB0aGUgTyhuXjIpIEJlbGxtYW4tRm9yZCBhbGdvcml0aG0gdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBnZW5lcmFsIHNvbHV0aW9uLgorCisgICAgICAgIE90aGVyIGFsZ29yaXRobXMgYXJlIGZhc3RlciBpbiB0aGUgY2FzZSB3aGVyZSBubyBhcmNzIGhhdmUgbmVnYXRpdmUgd2VpZ2h0cworICAgICAgICBidXQgYWxsb3dpbmcgbmVnYXRpdmUgd2VpZ2h0cyB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgYXMgYWNjb21tb2RhdGluZyBtYXhpbXVtCisgICAgICAgIHNpemUgcmVxdWlyZW1lbnRzIGFzIHdlbGwgYXMgbWluaW11bSBvbmVzLgorCisgICAgICAgIEJlbGxtYW4tRm9yZCB3b3JrcyBieSBpdGVyYXRpdmVseSAncmVsYXhpbmcnIGNvbnN0cmFpbnRzIG92ZXIgYWxsIG5vZGVzIChhbiBPKE4pCisgICAgICAgIHByb2Nlc3MpIGFuZCBwZXJmb3JtaW5nIHRoaXMgc3RlcCBOIHRpbWVzLiBQcm9vZiBvZiBjb3JyZWN0bmVzcyBoaW5nZXMgb24gdGhlCisgICAgICAgIGZhY3QgdGhhdCB0aGVyZSBjYW4gYmUgbm8gbmVnYXRpdmUgd2VpZ2h0IGNoYWlucyBvZiBsZW5ndGggPiBOIC0gdW5sZXNzIGEKKyAgICAgICAgJ25lZ2F0aXZlIHdlaWdodCBsb29wJyBleGlzdHMuIFRoZSBhbGdvcml0aG0gY2F0Y2hlcyB0aGlzIGNhc2UgaW4gYSBmaW5hbAorICAgICAgICBjaGVja2luZyBwaGFzZSB0aGF0IHJlcG9ydHMgZmFpbHVyZS4KKworICAgICAgICBCeSB0b3BvbG9naWNhbGx5IHNvcnRpbmcgdGhlIG5vZGVzIGFuZCBjaGVja2luZyB0aGlzIGNvbmRpdGlvbiBhdCBlYWNoIHN0ZXAKKyAgICAgICAgdHlwaWNhbCBsYXlvdXQgcHJvYmxlbXMgY29tcGxldGUgYWZ0ZXIgdGhlIGZpcnN0IGl0ZXJhdGlvbiBhbmQgdGhlIGFsZ29yaXRobQorICAgICAgICBjb21wbGV0ZXMgaW4gTyhOKSBzdGVwcyB3aXRoIHZlcnkgbG93IGNvbnN0YW50cy4KKyAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBzb2x2ZShBcmNbXSBhcmNzLCBpbnRbXSBsb2NhdGlvbnMpIHsKICAgICAgICAgICAgIGludCBOID0gZ2V0Q291bnQoKSArIDE7IC8vIFRoZSBudW1iZXIgb2YgdmVydGljZXMgaXMgdGhlIG51bWJlciBvZiBjb2x1bW5zL3Jvd3MgKyAxLgogCiAgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKQEAgLTExMDksMTEgKzEyOTIsMTEgQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwLCBsZW5ndGggPSBhcmNzLmxlbmd0aDsgaiA8IGxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjaGFuZ2VkIHwgcmVsYXgobG9jYXRpb25zLCBhcmNzW2pdLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQgfCByZWxheChsb2NhdGlvbnMsIGFyY3Nbal0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZWQpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJdGVyYXRpb24gIiArIChtYXhpbWl6aW5nID8gIihtYXgpIiA6ICIobWluKSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkl0ZXJhdGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb21wbGV0ZWQgYWZ0ZXIgIiArICgxICsgaSkgKyAiIHN0ZXBzIG91dCBvZiAiICsgTik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTI1LDExOSArMTMwOCwxNjAgQEAKICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIGludFtdIGluaXQoaW50IGRlZmF1bHRWYWx1ZSwgaW50IG1pbiwgaW50IG1heCkgewotICAgICAgICAgICAgaW50IE4gPSBnZXRDb3VudCgpICsgMTsgLy8gVGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMvcm93cyArIDEuCi0gICAgICAgICAgICBpbnRbXSBsb2NhdGlvbnMgPSBuZXcgaW50W05dOwotICAgICAgICAgICAgQXJyYXlzLmZpbGwobG9jYXRpb25zLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgbG9jYXRpb25zWzBdID0gbWluOwotICAgICAgICAgICAgbG9jYXRpb25zW04gLSAxXSA9IG1heDsKLSAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludFtdIGNvbXB1dGVNYXJnaW5zKGJvb2xlYW4gbGVhZGluZykgewotICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gbmV3IGludFtnZXRDb3VudCgpICsgMV07CisgICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTWFyZ2lucyhib29sZWFuIGxlYWRpbmcpIHsKKyAgICAgICAgICAgIGludFtdIG1hcmdpbnMgPSBsZWFkaW5nID8gbGVhZGluZ01hcmdpbnMgOiB0cmFpbGluZ01hcmdpbnM7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgc2l6ZSA9IGdldENoaWxkQ291bnQoKTsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgICAgIFZpZXcgYyA9IGdldENoaWxkQXQoaSk7CiAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gZ2V0TGF5b3V0UGFyYW1zKGMpOwogICAgICAgICAgICAgICAgIEdyb3VwIGcgPSBob3Jpem9udGFsID8gbHAuY29sdW1uR3JvdXAgOiBscC5yb3dHcm91cDsKICAgICAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gZy5zcGFuOwogICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGxlYWRpbmcgPyBzcGFuLm1pbiA6IHNwYW4ubWF4OwotICAgICAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBtYXgocmVzdWx0W2luZGV4XSwgZ2V0TWFyZ2luKGMsIGxlYWRpbmcsIGhvcml6b250YWwpKTsKKyAgICAgICAgICAgICAgICBtYXJnaW5zW2luZGV4XSA9IG1heChtYXJnaW5zW2luZGV4XSwgZ2V0TWFyZ2luKGMsIGxlYWRpbmcsIGhvcml6b250YWwpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBoYXMgc2lkZSBlZmZlY3RzCi0gICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTG9jYXRpb25zKGludFtdIGxvY2F0aW9ucywgYm9vbGVhbiBtYXhpbWl6aW5nKSB7Ci0gICAgICAgICAgICBsZWFkaW5nTWFyZ2lucyA9IGNvbXB1dGVNYXJnaW5zKHRydWUpOwotICAgICAgICAgICAgdHJhaWxpbmdNYXJnaW5zID0gY29tcHV0ZU1hcmdpbnMoZmFsc2UpOworICAgICAgICBwcml2YXRlIGludFtdIGdldExlYWRpbmdNYXJnaW5zKCkgeworICAgICAgICAgICAgaWYgKGxlYWRpbmdNYXJnaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsZWFkaW5nTWFyZ2lucyA9IG5ldyBpbnRbZ2V0Q291bnQoKSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsZWFkaW5nTWFyZ2luc1ZhbGlkKSB7CisgICAgICAgICAgICAgICAgY29tcHV0ZU1hcmdpbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgbGVhZGluZ01hcmdpbnNWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVhZGluZ01hcmdpbnM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgc29sdmUoZ2V0QXJjcyhtYXhpbWl6aW5nKSwgbG9jYXRpb25zLCBtYXhpbWl6aW5nKTsKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBnZXRUcmFpbGluZ01hcmdpbnMoKSB7CisgICAgICAgICAgICBpZiAodHJhaWxpbmdNYXJnaW5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cmFpbGluZ01hcmdpbnMgPSBuZXcgaW50W2dldENvdW50KCkgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJhaWxpbmdNYXJnaW5zVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlTWFyZ2lucyhmYWxzZSk7CisgICAgICAgICAgICAgICAgdHJhaWxpbmdNYXJnaW5zVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRyYWlsaW5nTWFyZ2luczsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBBZGQgbWFyZ2lucworICAgICAgICBwcml2YXRlIHZvaWQgYWRkTWFyZ2lucygpIHsKKyAgICAgICAgICAgIGludFtdIGxlYWRpbmdNYXJnaW5zID0gZ2V0TGVhZGluZ01hcmdpbnMoKTsKKyAgICAgICAgICAgIGludFtdIHRyYWlsaW5nTWFyZ2lucyA9IGdldFRyYWlsaW5nTWFyZ2lucygpOworCiAgICAgICAgICAgICBpbnQgZGVsdGEgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBOID0gZ2V0Q291bnQoKTsgaSA8IE47IGkrKykgewogICAgICAgICAgICAgICAgIGludCBtYXJnaW5zID0gbGVhZGluZ01hcmdpbnNbaV0gKyB0cmFpbGluZ01hcmdpbnNbaSArIDFdOwogICAgICAgICAgICAgICAgIGRlbHRhICs9IG1hcmdpbnM7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb25zW2kgKyAxXSArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICBtaW5pbWFbaSArIDFdICs9IGRlbHRhOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZShpbnRbXSBsb2NhdGlvbnMpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnNbbG9jYXRpb25zLmxlbmd0aCAtIDFdIC0gbG9jYXRpb25zWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBnZXRMaW1pdChib29sZWFuIGxvd2VyQm91bmQsIGJvb2xlYW4gbWF4aW1pemluZykgewotICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSA9IG1heGltaXppbmcgPyBNQVhfVkFMVUUgOiBNSU5fVkFMVUU7Ci0gICAgICAgICAgICBpZiAobG93ZXJCb3VuZCkgewotICAgICAgICAgICAgICAgIC8vIGFzIGxvbmcgYXMgaXQgYXZvaWRzIG92ZXJmbG93LCB0aGUgdXBwZXIgYm91bmQgY2FuIGJlIGFueXRoaW5nIChpbmNsdWRpbmcgemVybykKLSAgICAgICAgICAgICAgICBpbnRbXSByZXN1bHQgPSBpbml0KGRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlLCAxMDAwKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlTG9jYXRpb25zKHJlc3VsdCwgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICAgICAgaW50IGRlbHRhID0gcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSAtPSBkZWx0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0TG9jYXRpb25JbmNsdWRpbmdNYXJnaW4oVmlldyB2aWV3LCBib29sZWFuIGxlYWRpbmcsIGludCBpbmRleCkgeworICAgICAgICAgICAgaW50IGxvY2F0aW9uID0gbG9jYXRpb25zW2luZGV4XTsKKyAgICAgICAgICAgIGludCBtYXJnaW47CisgICAgICAgICAgICBpZiAobUFsaWdubWVudE1vZGUgIT0gQUxJR05fTUFSR0lOUykgeworICAgICAgICAgICAgICAgIG1hcmdpbiA9IChsZWFkaW5nID8gbGVhZGluZ01hcmdpbnMgOiB0cmFpbGluZ01hcmdpbnMpW2luZGV4XTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50W10gcmVzdWx0ID0gaW5pdChkZWZhdWx0VmFsdWUsIDAsIGRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZUxvY2F0aW9ucyhyZXN1bHQsIG1heGltaXppbmcpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgbWFyZ2luID0gMDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZWFkaW5nID8gKGxvY2F0aW9uICsgbWFyZ2luKSA6IChsb2NhdGlvbiAtIG1hcmdpbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY29tcHV0ZU1pbmltYShpbnRbXSBhKSB7CisgICAgICAgICAgICBBcnJheXMuZmlsbChhLCBNSU5fVkFMVUUpOworICAgICAgICAgICAgYVswXSA9IDA7CisgICAgICAgICAgICBzb2x2ZShnZXRBcmNzKCksIGEpOworICAgICAgICAgICAgaWYgKG1BbGlnbm1lbnRNb2RlICE9IEFMSUdOX01BUkdJTlMpIHsKKyAgICAgICAgICAgICAgICBhZGRNYXJnaW5zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludFtdIGdldE1pbmltYSgpIHsKKyAgICAgICAgICAgIGlmIChtaW5pbWEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBOID0gZ2V0Q291bnQoKSArIDE7CisgICAgICAgICAgICAgICAgbWluaW1hID0gbmV3IGludFtOXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbWluaW1hVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlTWluaW1hKG1pbmltYSk7CisgICAgICAgICAgICAgICAgbWluaW1hVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1pbmltYTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjb21wdXRlV2VpZ2h0cygpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBOID0gZ2V0Q2hpbGRDb3VudCgpOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gZ2V0TGF5b3V0UGFyYW1zKGdldENoaWxkQXQoaSkpOworICAgICAgICAgICAgICAgIEdyb3VwIGcgPSBob3Jpem9udGFsID8gbHAuY29sdW1uR3JvdXAgOiBscC5yb3dHcm91cDsKKyAgICAgICAgICAgICAgICBJbnRlcnZhbCBzcGFuID0gZy5zcGFuOworICAgICAgICAgICAgICAgIGludCBwZW51bHRpbWF0ZUluZGV4ID0gc3Bhbi5tYXggLSAxOworICAgICAgICAgICAgICAgIHdlaWdodHNbcGVudWx0aW1hdGVJbmRleF0gKz0gaG9yaXpvbnRhbCA/IGxwLmNvbHVtbldlaWdodCA6IGxwLnJvd1dlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmxvYXRbXSBnZXRXZWlnaHRzKCkgeworICAgICAgICAgICAgaWYgKHdlaWdodHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBOID0gZ2V0Q291bnQoKTsKKyAgICAgICAgICAgICAgICB3ZWlnaHRzID0gbmV3IGZsb2F0W05dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tcHV0ZVdlaWdodHMoKTsKKyAgICAgICAgICAgIHJldHVybiB3ZWlnaHRzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnRbXSBnZXRMb2NhdGlvbnMoKSB7CisgICAgICAgICAgICBpZiAobG9jYXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgTiA9IGdldENvdW50KCkgKyAxOworICAgICAgICAgICAgICAgIGxvY2F0aW9ucyA9IG5ldyBpbnRbTl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRXh0ZXJuYWwgZW50cnkgcG9pbnRzCiAKKyAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZShpbnRbXSBsb2NhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXgyKGxvY2F0aW9ucywgMCkgLSBsb2NhdGlvbnNbMF07CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIGludCBnZXRNaW4oKSB7Ci0gICAgICAgICAgICBpbnRbXSBtaW5zID0gZ2V0TGltaXQobWF4aW1pemluZywgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZShtaW5zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldFByZWYoKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWNjb21tb2RhdGVCb3RoTWluQW5kTWF4ID8gZ2V0TWF4KCkgOiBnZXRNaW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGdldE1heCgpIHsKLSAgICAgICAgICAgIGludFtdIG1heHMgPSBnZXRMaW1pdCghbWF4aW1pemluZywgbWF4aW1pemluZyk7Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZShtYXhzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHRvdGFsTWFyZ2luU2l6ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdW0obGVhZGluZ01hcmdpbnMpICsgc3VtKHRyYWlsaW5nTWFyZ2lucyk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZShnZXRNaW5pbWEoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgbGF5b3V0KGludCB0YXJnZXRTaXplKSB7Ci0gICAgICAgICAgICBpbnQgTiA9IGdldENvdW50KCkgKyAxOwotICAgICAgICAgICAgaW50IG1pbiA9IGdldE1pbigpOwotICAgICAgICAgICAgaW50IG1heCA9IGdldE1heCgpOworICAgICAgICAgICAgaW50W10gbWlucyA9IGdldE1pbmltYSgpOwogCi0gICAgICAgICAgICBpbnQgY2xpcHBlZFRhcmdldFNpemUgPSBtYXgobWluKG1heCwgdGFyZ2V0U2l6ZSksIG1pbik7IC8vIGNvbmZpbmUgc2l6ZSB0byB2YWxpZCByYW5nZQorICAgICAgICAgICAgaW50IHRvdGFsRGVsdGEgPSBtYXgoMCwgdGFyZ2V0U2l6ZSAtIHNpemUobWlucykpOyAvLyBjb25maW5lIHRvIGV4cGFuc2lvbgogCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb21wdXRpbmcgc2l6ZXMgZm9yIHRhcmdldCAiICsgY2xpcHBlZFRhcmdldFNpemUgKyAiIGZvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChob3Jpem9udGFsID8gImNvbCIgOiAicm93IikgKyAicyBmcm9tOiAiICsgYXJjcyk7CisgICAgICAgICAgICBmbG9hdFtdIHdlaWdodHMgPSBnZXRXZWlnaHRzKCk7CisgICAgICAgICAgICBmbG9hdCB0b3RhbFdlaWdodCA9IHN1bSh3ZWlnaHRzKTsKKworICAgICAgICAgICAgaWYgKHRvdGFsV2VpZ2h0ID09IDBmICYmIHdlaWdodHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHdlaWdodHNbd2VpZ2h0cy5sZW5ndGggLSAxXSA9IDE7CisgICAgICAgICAgICAgICAgdG90YWxXZWlnaHQgPSAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGRlbHRhID0gY2xpcHBlZFRhcmdldFNpemUgLSBtaW47Ci0gICAgICAgICAgICBwcmVmU2l6ZU9mV2VpZ2h0ZWRDb21wb25lbnQgPSBkZWx0YTsKLSAgICAgICAgICAgIGludmFsaWRhdGVWYWx1ZXMoKTsKLSAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUgPSBtYXhpbWl6aW5nID8gTUFYX1ZBTFVFIDogTUlOX1ZBTFVFOwotICAgICAgICAgICAgbG9jYXRpb25zID0gaW5pdChkZWZhdWx0VmFsdWUsIDAsIGNsaXBwZWRUYXJnZXRTaXplIC0gdG90YWxNYXJnaW5TaXplKCkpOwotICAgICAgICAgICAgY29tcHV0ZUxvY2F0aW9ucyhsb2NhdGlvbnMsIG1heGltaXppbmcpOwotICAgICAgICAgICAgcHJlZlNpemVPZldlaWdodGVkQ29tcG9uZW50ID0gMDsKIAotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibG9jYXRpb25zID0gIiArIEFycmF5cy50b1N0cmluZyhsb2NhdGlvbnMpKTsKLSAgICAgICAgICAgICAgICBpbnRbXSBjb21wdXRlZFNpemVzID0gbmV3IGludFtOIC0gMV07Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOIC0gMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkU2l6ZXNbaV0gPSBsb2NhdGlvbnNbaSArIDFdIC0gbG9jYXRpb25zW2ldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzaXplcyA9ICIgKyBBcnJheXMudG9TdHJpbmcoY29tcHV0ZWRTaXplcykpOworICAgICAgICAgICAgaW50W10gbG9jYXRpb25zID0gZ2V0TG9jYXRpb25zKCk7CisgICAgICAgICAgICBpbnQgY3VtdWxhdGl2ZURlbHRhID0gMDsKKworICAgICAgICAgICAgLy8gbm90ZSB8d2VpZ2h0c3wgPSB8bG9jYXRpb25zfCAtIDEKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2VpZ2h0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IHdlaWdodHNbaV07CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gKGludCkgKHRvdGFsRGVsdGEgKiB3ZWlnaHQgLyB0b3RhbFdlaWdodCk7CisgICAgICAgICAgICAgICAgY3VtdWxhdGl2ZURlbHRhICs9IGRlbHRhOworICAgICAgICAgICAgICAgIGxvY2F0aW9uc1tpICsgMV0gPSBtaW5zW2kgKyAxXSArIGN1bXVsYXRpdmVEZWx0YTsKKworICAgICAgICAgICAgICAgIHRvdGFsRGVsdGEgLT0gZGVsdGE7CisgICAgICAgICAgICAgICAgdG90YWxXZWlnaHQgLT0gd2VpZ2h0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVTdHJ1Y3R1cmUoKSB7CiAgICAgICAgICAgICBjb3VudFZhbGlkID0gZmFsc2U7CisKICAgICAgICAgICAgIGdyb3VwQm91bmRzID0gbnVsbDsKICAgICAgICAgICAgIHNwYW5TaXplcyA9IG51bGw7CisgICAgICAgICAgICBsZWFkaW5nTWFyZ2lucyA9IG51bGw7CisgICAgICAgICAgICB0cmFpbGluZ01hcmdpbnMgPSBudWxsOworICAgICAgICAgICAgYXJjcyA9IG51bGw7CisgICAgICAgICAgICBtaW5pbWEgPSBudWxsOworICAgICAgICAgICAgd2VpZ2h0cyA9IG51bGw7CisgICAgICAgICAgICBsb2NhdGlvbnMgPSBudWxsOwogCiAgICAgICAgICAgICBpbnZhbGlkYXRlVmFsdWVzKCk7CiAgICAgICAgIH0KQEAgLTEyNDYsNiArMTQ3MCw5IEBACiAgICAgICAgICAgICBncm91cEJvdW5kc1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICBzcGFuU2l6ZXNWYWxpZCA9IGZhbHNlOwogICAgICAgICAgICAgYXJjc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICBsZWFkaW5nTWFyZ2luc1ZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICB0cmFpbGluZ01hcmdpbnNWYWxpZCA9IGZhbHNlOworICAgICAgICAgICAgbWluaW1hVmFsaWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI1OSw4ICsxNDg2LDggQEAKICAgICAgKiB7QGxpbmsgR3JvdXAgR3JvdXBzfSBhcmUgaW1tdXRhYmxlIHN0cnVjdHVyZXMgYW5kIG1heSBiZSBzaGFyZWQgYmV0d2VlbiB0aGUgbGF5b3V0CiAgICAgICogcGFyYW1ldGVycyBvZiBkaWZmZXJlbnQgY2hpbGRyZW4uCiAgICAgICogPHA+Ci0gICAgICogVGhlIHtAbGluayBHcm91cCNzcGFuIHNwYW59IGZpZWxkcyBvZiB0aGUgcm93IGFuZCBjb2x1bW4gZ3JvdXBzIHRvZ2V0aGVyIHNwZWNpZnkKLSAgICAgKiB0aGUgZm91ciBncmlkIGluZGljZXMgdGhhdCBkZWxpbWl0IHRoZSBjZWxscyBvZiB0aGlzIGNlbGwgZ3JvdXAuCisgICAgICogVGhlIHJvdyBhbmQgY29sdW1uIGdyb3VwcyBjb250YWluIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBpbmRpY2VzIGFsb25nIGVhY2ggYXhpcworICAgICAqIGFuZCB0b2dldGhlciBzcGVjaWZ5IHRoZSBmb3VyIGdyaWQgaW5kaWNlcyB0aGF0IGRlbGltaXQgdGhlIGNlbGxzIG9mIHRoaXMgY2VsbCBncm91cC4KICAgICAgKiA8cD4KICAgICAgKiBUaGUge0BsaW5rIEdyb3VwI2FsaWdubWVudCBhbGlnbm1lbnR9IGZpZWxkcyBvZiB0aGUgcm93IGFuZCBjb2x1bW4gZ3JvdXBzIHRvZ2V0aGVyIHNwZWNpZnkKICAgICAgKiBib3RoIGFzcGVjdHMgb2YgYWxpZ25tZW50IHdpdGhpbiB0aGUgY2VsbCBncm91cC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgY2hpbGQncwpAQCAtMTI3NywyNiArMTUwNCwyNiBAQAogICAgICAqICAgICA8bGk+e0BsaW5rICNoZWlnaHR9ID0ge0BsaW5rICNXUkFQX0NPTlRFTlR9PC9saT4KICAgICAgKiAgICAgPGxpPntAbGluayAjdG9wTWFyZ2lufSA9IDAgd2hlbgogICAgICAqICAgICAgICAgIHtAbGluayBHcmlkTGF5b3V0I3NldFVzZURlZmF1bHRNYXJnaW5zKGJvb2xlYW4pIHVzZURlZmF1bHRNYXJnaW5zfSBpcwotICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPjsgb3RoZXJ3aXNlIHtAbGluayBJbnRlZ2VyI01JTl9WQUxVRX0sIHRvCisgICAgICogICAgICAgICAge0Bjb2RlIGZhbHNlfTsgb3RoZXJ3aXNlIHtAbGluayAjVU5ERUZJTkVEfSwgdG8KICAgICAgKiAgICAgICAgICBpbmRpY2F0ZSB0aGF0IGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgY29tcHV0ZWQgb24gZGVtYW5kLiA8L2xpPgogICAgICAqICAgICA8bGk+e0BsaW5rICNsZWZ0TWFyZ2lufSA9IDAgd2hlbgogICAgICAqICAgICAgICAgIHtAbGluayBHcmlkTGF5b3V0I3NldFVzZURlZmF1bHRNYXJnaW5zKGJvb2xlYW4pIHVzZURlZmF1bHRNYXJnaW5zfSBpcwotICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPjsgb3RoZXJ3aXNlIHtAbGluayBJbnRlZ2VyI01JTl9WQUxVRX0sIHRvCisgICAgICogICAgICAgICAge0Bjb2RlIGZhbHNlfTsgb3RoZXJ3aXNlIHtAbGluayAjVU5ERUZJTkVEfSwgdG8KICAgICAgKiAgICAgICAgICBpbmRpY2F0ZSB0aGF0IGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgY29tcHV0ZWQgb24gZGVtYW5kLiA8L2xpPgogICAgICAqICAgICA8bGk+e0BsaW5rICNib3R0b21NYXJnaW59ID0gMCB3aGVuCiAgICAgICogICAgICAgICAge0BsaW5rIEdyaWRMYXlvdXQjc2V0VXNlRGVmYXVsdE1hcmdpbnMoYm9vbGVhbikgdXNlRGVmYXVsdE1hcmdpbnN9IGlzCi0gICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+OyBvdGhlcndpc2Uge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfSwgdG8KKyAgICAgKiAgICAgICAgICB7QGNvZGUgZmFsc2V9OyBvdGhlcndpc2Uge0BsaW5rICNVTkRFRklORUR9LCB0bwogICAgICAqICAgICAgICAgIGluZGljYXRlIHRoYXQgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBjb21wdXRlZCBvbiBkZW1hbmQuIDwvbGk+CiAgICAgICogICAgIDxsaT57QGxpbmsgI3JpZ2h0TWFyZ2lufSA9IDAgd2hlbgogICAgICAqICAgICAgICAgIHtAbGluayBHcmlkTGF5b3V0I3NldFVzZURlZmF1bHRNYXJnaW5zKGJvb2xlYW4pIHVzZURlZmF1bHRNYXJnaW5zfSBpcwotICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPjsgb3RoZXJ3aXNlIHtAbGluayBJbnRlZ2VyI01JTl9WQUxVRX0sIHRvCisgICAgICogICAgICAgICAge0Bjb2RlIGZhbHNlfTsgb3RoZXJ3aXNlIHtAbGluayAjVU5ERUZJTkVEfSwgdG8KICAgICAgKiAgICAgICAgICBpbmRpY2F0ZSB0aGF0IGEgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgY29tcHV0ZWQgb24gZGVtYW5kLiA8L2xpPgotICAgICAqICAgICA8bGk+e0BsaW5rICNyb3dHcm91cH08Y29kZT4uc3BhbjwvY29kZT4gPSA8Y29kZT5bMCwgMV08L2NvZGU+IDwvbGk+Ci0gICAgICogICAgIDxsaT57QGxpbmsgI3Jvd0dyb3VwfTxjb2RlPi5hbGlnbm1lbnQ8L2NvZGU+ID0ge0BsaW5rICNCQVNFTElORX0gPC9saT4KLSAgICAgKiAgICAgPGxpPntAbGluayAjY29sdW1uR3JvdXB9PGNvZGU+LnNwYW48L2NvZGU+ID0gPGNvZGU+WzAsIDFdPC9jb2RlPiA8L2xpPgotICAgICAqICAgICA8bGk+e0BsaW5rICNjb2x1bW5Hcm91cH08Y29kZT4uYWxpZ25tZW50PC9jb2RlPiA9IHtAbGluayAjTEVGVH0gPC9saT4KLSAgICAgKiAgICAgPGxpPntAbGluayAjcm93V2VpZ2h0fSA9IDxjb2RlPjBmPC9jb2RlPiA8L2xpPgotICAgICAqICAgICA8bGk+e0BsaW5rICNjb2x1bW5XZWlnaHR9ID0gPGNvZGU+MGY8L2NvZGU+IDwvbGk+CisgICAgICogICAgIDxsaT57QGxpbmsgI3Jvd0dyb3VwfXtAY29kZSAuc3Bhbn0gPSB7QGNvZGUgWzAsIDFdfSA8L2xpPgorICAgICAqICAgICA8bGk+e0BsaW5rICNyb3dHcm91cH17QGNvZGUgLmFsaWdubWVudH0gPSB7QGxpbmsgI0JBU0VMSU5FfSA8L2xpPgorICAgICAqICAgICA8bGk+e0BsaW5rICNjb2x1bW5Hcm91cH17QGNvZGUgLnNwYW59ID0ge0Bjb2RlIFswLCAxXX0gPC9saT4KKyAgICAgKiAgICAgPGxpPntAbGluayAjY29sdW1uR3JvdXB9e0Bjb2RlIC5hbGlnbm1lbnR9ID0ge0BsaW5rICNMRUZUfSA8L2xpPgorICAgICAqICAgICA8bGk+e0BsaW5rICNyb3dXZWlnaHR9ID0ge0Bjb2RlIDBmfSA8L2xpPgorICAgICAqICAgICA8bGk+e0BsaW5rICNjb2x1bW5XZWlnaHR9ID0ge0Bjb2RlIDBmfSA8L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNHcmlkTGF5b3V0X0xheW91dF9sYXlvdXRfcm93CkBAIC0xMzE2LDIxICsxNTQzLDIyIEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BUkdJTiA9IFVOREVGSU5FRDsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUk9XID0gVU5ERUZJTkVEOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT0xVTU4gPSBVTkRFRklORUQ7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludGVydmFsIERFRkFVTFRfU1BBTiA9IG5ldyBJbnRlcnZhbCgwLCAxKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZXJ2YWwgREVGQVVMVF9TUEFOID0gbmV3IEludGVydmFsKFVOREVGSU5FRCwgVU5ERUZJTkVEICsgMSk7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NQQU5fU0laRSA9IERFRkFVTFRfU1BBTi5zaXplKCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFsaWdubWVudCBERUZBVUxUX0hPUklaT05UQUxfQUxJR05NRU5UID0gTEVGVDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50IERFRkFVTFRfVkVSVENJQUxfQUxHSUdOTUVOVCA9IEJBU0VMSU5FOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcm91cCBERUZBVUxUX0hPUklaT05UQUxfR1JPVVAgPQotICAgICAgICAgICAgICAgIG5ldyBHcm91cChERUZBVUxUX1NQQU4sIERFRkFVTFRfSE9SSVpPTlRBTF9BTElHTk1FTlQpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcm91cCBERUZBVUxUX1ZFUlRJQ0FMX0dST1VQID0KLSAgICAgICAgICAgICAgICBuZXcgR3JvdXAoREVGQVVMVF9TUEFOLCBERUZBVUxUX1ZFUlRDSUFMX0FMR0lHTk1FTlQpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XRUlHSFQgPSAwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBbGlnbm1lbnQgREVGQVVMVF9DT0xVTU5fQUxJR05NRU5UID0gTEVGVDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50IERFRkFVTFRfUk9XX0FMSUdOTUVOVCA9IEJBU0VMSU5FOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHcm91cCBERUZBVUxUX0NPTFVNTl9HUk9VUCA9CisgICAgICAgICAgICAgICAgbmV3IEdyb3VwKERFRkFVTFRfU1BBTiwgREVGQVVMVF9DT0xVTU5fQUxJR05NRU5UKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3JvdXAgREVGQVVMVF9ST1dfR1JPVVAgPQorICAgICAgICAgICAgICAgIG5ldyBHcm91cChERUZBVUxUX1NQQU4sIERFRkFVTFRfUk9XX0FMSUdOTUVOVCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dFSUdIVF8wID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0VJR0hUXzEgPSAxOwogCiAgICAgICAgIC8vIE1pc2MKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IENPTlRBSU5FUl9CT1VORFMgPSBuZXcgUmVjdCgwLCAwLCAyLCAyKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50W10gSE9SSVpPTlRBTF9BTElHTk1FTlRTID0geyBMRUZULCBDRU5URVIsIFJJR0hUIH07Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFsaWdubWVudFtdIFZFUlRJQ0FMX0FMSUdOTUVOVFMgPSB7IFRPUCwgQ0VOVEVSLCBCT1RUT00gfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50W10gQ09MVU1OX0FMSUdOTUVOVFMgPSB7IExFRlQsIENFTlRFUiwgUklHSFQgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50W10gUk9XX0FMSUdOTUVOVFMgPSB7IFRPUCwgQ0VOVEVSLCBCT1RUT00gfTsKIAogICAgICAgICAvLyBUeXBlZEFycmF5IGluZGljZXMKIApAQCAtMTM5NywxNCArMTYyNSwxNCBAQAogICAgICAgICBwdWJsaWMgTGF5b3V0UGFyYW1zKEdyb3VwIHJvd0dyb3VwLCBHcm91cCBjb2x1bW5Hcm91cCkgewogICAgICAgICAgICAgdGhpcyhERUZBVUxUX1dJRFRILCBERUZBVUxUX0hFSUdIVCwKICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVJHSU4sIERFRkFVTFRfTUFSR0lOLCBERUZBVUxUX01BUkdJTiwgREVGQVVMVF9NQVJHSU4sCi0gICAgICAgICAgICAgICAgICAgIHJvd0dyb3VwLCBjb2x1bW5Hcm91cCwgREVGQVVMVF9XRUlHSFQsIERFRkFVTFRfV0VJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgcm93R3JvdXAsIGNvbHVtbkdyb3VwLCBERUZBVUxUX1dFSUdIVF8wLCBERUZBVUxUX1dFSUdIVF8wKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IExheW91dFBhcmFtcyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFzIGRlZmluZWQgaW4ge0BsaW5rIExheW91dFBhcmFtc30uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgTGF5b3V0UGFyYW1zKCkgewotICAgICAgICAgICAgdGhpcyhERUZBVUxUX0hPUklaT05UQUxfR1JPVVAsIERFRkFVTFRfVkVSVElDQUxfR1JPVVApOworICAgICAgICAgICAgdGhpcyhERUZBVUxUX1JPV19HUk9VUCwgREVGQVVMVF9DT0xVTU5fR1JPVVApOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ29weWluZyBjb25zdHJ1Y3RvcnMKQEAgLTE0OTUsNTcgKzE3MjMsNjIgQEAKIAogICAgICAgICAvLyBHcmF2aXR5LiBGb3IgY29udmVyc2lvbiBmcm9tIHRoZSBzdGF0aWMgdGhlIGludGVnZXJzIGRlZmluZWQgaW4gdGhlIEdyYXZpdHkgY2xhc3MsCiAgICAgICAgIC8vIHVzZSBHcmF2aXR5LmFwcGx5KCkgdG8gYXBwbHkgZ3Jhdml0eSB0byBhIHZpZXcgb2YgemVybyBzaXplIGFuZCBzZWUgd2hlcmUgaXQgZW5kcyB1cC4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQWxpZ25tZW50IGdldEhvcml6b250YWxBbGlnbm1lbnQoaW50IGdyYXZpdHksIGludCB3aWR0aCkgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBBbGlnbm1lbnQgZ2V0Q29sdW1uQWxpZ25tZW50KGludCBncmF2aXR5LCBpbnQgd2lkdGgpIHsKICAgICAgICAgICAgIFJlY3QgciA9IG5ldyBSZWN0KDAsIDAsIDAsIDApOwogICAgICAgICAgICAgR3Jhdml0eS5hcHBseShncmF2aXR5LCAwLCAwLCBDT05UQUlORVJfQk9VTkRTLCByKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBmaWxsID0gd2lkdGggPT0gTUFUQ0hfUEFSRU5UOwotICAgICAgICAgICAgQWxpZ25tZW50IGRlZmF1bHRBbGlnbm1lbnQgPSBmaWxsID8gRklMTCA6IERFRkFVTFRfSE9SSVpPTlRBTF9BTElHTk1FTlQ7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QWxpZ25tZW50KEhPUklaT05UQUxfQUxJR05NRU5UUywgRklMTCwgci5sZWZ0LCByLnJpZ2h0LAorICAgICAgICAgICAgYm9vbGVhbiBmaWxsID0gKHdpZHRoID09IE1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICBBbGlnbm1lbnQgZGVmYXVsdEFsaWdubWVudCA9IGZpbGwgPyBGSUxMIDogREVGQVVMVF9DT0xVTU5fQUxJR05NRU5UOworICAgICAgICAgICAgcmV0dXJuIGdldEFsaWdubWVudChDT0xVTU5fQUxJR05NRU5UUywgRklMTCwgci5sZWZ0LCByLnJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAhZGVmaW5lc0hvcml6b250YWwoZ3Jhdml0eSksIGRlZmF1bHRBbGlnbm1lbnQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQWxpZ25tZW50IGdldFZlcnRpY2FsQWxpZ25tZW50KGludCBncmF2aXR5LCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEFsaWdubWVudCBnZXRSb3dBbGlnbm1lbnQoaW50IGdyYXZpdHksIGludCBoZWlnaHQpIHsKICAgICAgICAgICAgIFJlY3QgciA9IG5ldyBSZWN0KDAsIDAsIDAsIDApOwogICAgICAgICAgICAgR3Jhdml0eS5hcHBseShncmF2aXR5LCAwLCAwLCBDT05UQUlORVJfQk9VTkRTLCByKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBmaWxsID0gaGVpZ2h0ID09IE1BVENIX1BBUkVOVDsKLSAgICAgICAgICAgIEFsaWdubWVudCBkZWZhdWx0QWxpZ25tZW50ID0gZmlsbCA/IEZJTEwgOiBERUZBVUxUX1ZFUlRDSUFMX0FMR0lHTk1FTlQ7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QWxpZ25tZW50KFZFUlRJQ0FMX0FMSUdOTUVOVFMsIEZJTEwsIHIudG9wLCByLmJvdHRvbSwKKyAgICAgICAgICAgIGJvb2xlYW4gZmlsbCA9IChoZWlnaHQgPT0gTUFUQ0hfUEFSRU5UKTsKKyAgICAgICAgICAgIEFsaWdubWVudCBkZWZhdWx0QWxpZ25tZW50ID0gZmlsbCA/IEZJTEwgOiBERUZBVUxUX1JPV19BTElHTk1FTlQ7CisgICAgICAgICAgICByZXR1cm4gZ2V0QWxpZ25tZW50KFJPV19BTElHTk1FTlRTLCBGSUxMLCByLnRvcCwgci5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICFkZWZpbmVzVmVydGljYWwoZ3Jhdml0eSksIGRlZmF1bHRBbGlnbm1lbnQpOwogICAgICAgICB9CiAKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RGVmYXVsdFdlaWdodChpbnQgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIChzaXplID09IE1BVENIX1BBUkVOVCkgPyBERUZBVUxUX1dFSUdIVF8xIDogREVGQVVMVF9XRUlHSFRfMDsKKyAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmYXVsdEdyYXZpdHkpIHsKICAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgc3R5bGVhYmxlLkdyaWRMYXlvdXRfTGF5b3V0KTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50IGdyYXZpdHkgPSBhLmdldEludGVnZXIoR1JBVklUWSwgZGVmYXVsdEdyYXZpdHkpOworICAgICAgICAgICAgICAgIGludCBncmF2aXR5ID0gYS5nZXRJbnQoR1JBVklUWSwgZGVmYXVsdEdyYXZpdHkpOwogCi0gICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IGEuZ2V0SW50ZWdlcihDT0xVTU4sIERFRkFVTFRfQ09MVU1OKTsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBhLmdldEludGVnZXIoQ09MVU1OX1NQQU4sIERFRkFVTFRfU1BBTl9TSVpFKTsKLSAgICAgICAgICAgICAgICBJbnRlcnZhbCBjb2xTcGFuID0gbmV3IEludGVydmFsKGNvbHVtbiwgY29sdW1uICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uR3JvdXAgPSBuZXcgR3JvdXAoY29sU3BhbiwgZ2V0SG9yaXpvbnRhbEFsaWdubWVudChncmF2aXR5LCB3aWR0aCkpOwotICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uV2VpZ2h0ID0gYS5nZXRGbG9hdChDT0xVTU5fV0VJR0hULCBERUZBVUxUX1dFSUdIVCk7CisgICAgICAgICAgICAgICAgaW50IGNvbHVtbiA9IGEuZ2V0SW50KENPTFVNTiwgREVGQVVMVF9DT0xVTU4pOworICAgICAgICAgICAgICAgIGludCBjb2x1bW5TcGFuID0gYS5nZXRJbnQoQ09MVU1OX1NQQU4sIERFRkFVTFRfU1BBTl9TSVpFKTsKKyAgICAgICAgICAgICAgICBJbnRlcnZhbCBoU3BhbiA9IG5ldyBJbnRlcnZhbChjb2x1bW4sIGNvbHVtbiArIGNvbHVtblNwYW4pOworICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uR3JvdXAgPSBuZXcgR3JvdXAoaFNwYW4sIGdldENvbHVtbkFsaWdubWVudChncmF2aXR5LCB3aWR0aCkpOworICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uV2VpZ2h0ID0gYS5nZXRGbG9hdChDT0xVTU5fV0VJR0hULCBnZXREZWZhdWx0V2VpZ2h0KHdpZHRoKSk7CiAKLSAgICAgICAgICAgICAgICBpbnQgcm93ID0gYS5nZXRJbnRlZ2VyKFJPVywgREVGQVVMVF9ST1cpOwotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBhLmdldEludGVnZXIoUk9XX1NQQU4sIERFRkFVTFRfU1BBTl9TSVpFKTsKLSAgICAgICAgICAgICAgICBJbnRlcnZhbCByb3dTcGFuID0gbmV3IEludGVydmFsKHJvdywgcm93ICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB0aGlzLnJvd0dyb3VwID0gbmV3IEdyb3VwKHJvd1NwYW4sIGdldFZlcnRpY2FsQWxpZ25tZW50KGdyYXZpdHksIGhlaWdodCkpOwotICAgICAgICAgICAgICAgIHRoaXMucm93V2VpZ2h0ID0gYS5nZXRGbG9hdChST1dfV0VJR0hULCBERUZBVUxUX1dFSUdIVCk7CisgICAgICAgICAgICAgICAgaW50IHJvdyA9IGEuZ2V0SW50KFJPVywgREVGQVVMVF9ST1cpOworICAgICAgICAgICAgICAgIGludCByb3dTcGFuID0gYS5nZXRJbnQoUk9XX1NQQU4sIERFRkFVTFRfU1BBTl9TSVpFKTsKKyAgICAgICAgICAgICAgICBJbnRlcnZhbCB2U3BhbiA9IG5ldyBJbnRlcnZhbChyb3csIHJvdyArIHJvd1NwYW4pOworICAgICAgICAgICAgICAgIHRoaXMucm93R3JvdXAgPSBuZXcgR3JvdXAodlNwYW4sIGdldFJvd0FsaWdubWVudChncmF2aXR5LCBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICB0aGlzLnJvd1dlaWdodCA9IGEuZ2V0RmxvYXQoUk9XX1dFSUdIVCwgZ2V0RGVmYXVsdFdlaWdodChoZWlnaHQpKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogRGVzY3JpYmVzIGhvdyB0aGUgY2hpbGQgdmlld3MgYXJlIHBvc2l0aW9uZWQuIERlZmF1bHQgaXMgPGNvZGU+TEVGVCB8IEJBU0VMSU5FPC9jb2RlPi4KKyAgICAgICAgICogRGVzY3JpYmVzIGhvdyB0aGUgY2hpbGQgdmlld3MgYXJlIHBvc2l0aW9uZWQuIERlZmF1bHQgaXMge0Bjb2RlIExFRlQgfCBCQVNFTElORX0uCisgICAgICAgICAqIFNlZSB7QGxpbmsgYW5kcm9pZC52aWV3LkdyYXZpdHl9LgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZ3Jhdml0eSB0aGUgbmV3IGdyYXZpdHkuIFNlZSB7QGxpbmsgYW5kcm9pZC52aWV3LkdyYXZpdHl9LgorICAgICAgICAgKiBAcGFyYW0gZ3Jhdml0eSB0aGUgbmV3IGdyYXZpdHkgdmFsdWUKICAgICAgICAgICoKICAgICAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjR3JpZExheW91dF9MYXlvdXRfbGF5b3V0X2dyYXZpdHkKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEdyYXZpdHkoaW50IGdyYXZpdHkpIHsKLSAgICAgICAgICAgIGNvbHVtbkdyb3VwID0gY29sdW1uR3JvdXAuY29weVdyaXRlQWxpZ25tZW50KGdldEhvcml6b250YWxBbGlnbm1lbnQoZ3Jhdml0eSwgd2lkdGgpKTsKLSAgICAgICAgICAgIHJvd0dyb3VwID0gcm93R3JvdXAuY29weVdyaXRlQWxpZ25tZW50KGdldFZlcnRpY2FsQWxpZ25tZW50KGdyYXZpdHksIGhlaWdodCkpOworICAgICAgICAgICAgY29sdW1uR3JvdXAgPSBjb2x1bW5Hcm91cC5jb3B5V3JpdGVBbGlnbm1lbnQoZ2V0Q29sdW1uQWxpZ25tZW50KGdyYXZpdHksIHdpZHRoKSk7CisgICAgICAgICAgICByb3dHcm91cCA9IHJvd0dyb3VwLmNvcHlXcml0ZUFsaWdubWVudChnZXRSb3dBbGlnbm1lbnQoZ3Jhdml0eSwgaGVpZ2h0KSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTE1NTQsMjEgKzE3ODcsMjUgQEAKICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gYXR0cmlidXRlcy5nZXRMYXlvdXREaW1lbnNpb24oaGVpZ2h0QXR0ciwgREVGQVVMVF9IRUlHSFQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFZlcnRpY2FsR3JvdXBTcGFuKEludGVydmFsIHNwYW4pIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFJvd0dyb3VwU3BhbihJbnRlcnZhbCBzcGFuKSB7CiAgICAgICAgICAgICByb3dHcm91cCA9IHJvd0dyb3VwLmNvcHlXcml0ZVNwYW4oc3Bhbik7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgc2V0SG9yaXpvbnRhbEdyb3VwU3BhbihJbnRlcnZhbCBzcGFuKSB7CisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRDb2x1bW5Hcm91cFNwYW4oSW50ZXJ2YWwgc3BhbikgewogICAgICAgICAgICAgY29sdW1uR3JvdXAgPSBjb2x1bW5Hcm91cC5jb3B5V3JpdGVTcGFuKHNwYW4pOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoKKyAgICBJbiBwbGFjZSBvZiBhIEhhc2hNYXAgZnJvbSBzcGFuIHRvIEludCwgdXNlIGFuIGFycmF5IG9mIGtleS92YWx1ZSBwYWlycyAtIHN0b3JlZCBpbiBBcmNzLgorICAgIEFkZCB0aGUgbXV0YWJsZXMgY29tcGxldGVzQ3ljbGUgZmxhZyB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyIGhhc2ggdGFibGUgZm9yIGRldGVjdGluZyBjeWNsZXMuCisgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJjIHsKICAgICAgICAgcHVibGljIGZpbmFsIEludGVydmFsIHNwYW47Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBJbnQgdmFsdWU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBNdXRhYmxlSW50IHZhbHVlOwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb21wbGV0ZXNDeWNsZTsKIAotICAgICAgICBwdWJsaWMgQXJjKEludGVydmFsIHNwYW4sIEludCB2YWx1ZSkgeworICAgICAgICBwdWJsaWMgQXJjKEludGVydmFsIHNwYW4sIE11dGFibGVJbnQgdmFsdWUpIHsKICAgICAgICAgICAgIHRoaXMuc3BhbiA9IHNwYW47CiAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgIH0KQEAgLTE1ODEsMjcgKzE4MTgsMzYgQEAKIAogICAgIC8vIEEgbXV0YWJsZSBJbnRlZ2VyIC0gdXNlZCB0byBhdm9pZCBoZWFwIGFsbG9jYXRpb24gZHVyaW5nIHRoZSBsYXlvdXQgb3BlcmF0aW9uCiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnQgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE11dGFibGVJbnQgewogICAgICAgICBwdWJsaWMgaW50IHZhbHVlOwogCi0gICAgICAgIHByaXZhdGUgSW50KCkgeworICAgICAgICBwcml2YXRlIE11dGFibGVJbnQoKSB7CiAgICAgICAgICAgICByZXNldCgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBJbnQoaW50IHZhbHVlKSB7CisgICAgICAgIHByaXZhdGUgTXV0YWJsZUludChpbnQgdmFsdWUpIHsKICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCByZXNldCgpIHsKICAgICAgICAgICAgIHZhbHVlID0gSW50ZWdlci5NSU5fVkFMVUU7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEludCBuZWcoKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9CiAgICAgfQogCisgICAgLyoKKyAgICBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgaW4gcGxhY2Ugb2YgYSBNYXAgd2hlcmUgd2UgaGF2ZSBhbiBpbmRleCB0aGF0IHJlZmVycyB0byB0aGUgb3JkZXIKKyAgICBpbiB3aGljaCBlYWNoIGtleS92YWx1ZSBwYWlycyB3ZXJlIGFkZGVkIHRvIHRoZSBtYXAuIEluIHRoaXMgY2FzZSB3ZSBzdG9yZSBrZXlzIGFuZCB2YWx1ZXMKKyAgICBpbiBhcnJheXMgb2YgYSBsZW5ndGggdGhhdCBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBrZXlzLiBXZSBhbHNvIG1haW50YWluIGFuCisgICAgYXJyYXkgb2YgaW5kZXhlcyBmcm9tIGluc2VydGlvbiBvcmRlciB0byB0aGUgY29tcGFjdGVkIGFycmF5cyBvZiBrZXlzIGFuZCB2YWx1ZXMuCisKKyAgICBOb3RlIHRoYXQgYmVoYXZpb3IgZGlmZmVycyBmcm9tIHRoYXQgb2YgYSBMaW5rZWRIYXNoTWFwIGluIHRoYXQgcmVwZWF0ZWQgZW50cmllcworICAgICpkbyogZ2V0IGFkZGVkIG11bHRpcGxlcyB0aW1lcy4gU28gdGhlIGxlbmd0aCBvZiBpbmRleCBpcyBlcXVhbHMgdG8gdGhlIG51bWJlciBvZgorICAgIGl0ZW1zIGFkZGVkLgorCisgICAgVGhpcyBpcyB1c2VmdWwgaW4gdGhlIEdyaWRMYXlvdXQgY2xhc3Mgd2hlcmUgd2UgY2FuIHJlbHkgb24gdGhlIG9yZGVyIG9mIGNoaWxkcmVuIG5vdAorICAgIGNoYW5naW5nIGR1cmluZyBsYXlvdXQgLSB0byB1c2UgaW50ZWdlci1iYXNlZCBsb29rdXAgZm9yIG91ciBpbnRlcm5hbCBzdHJ1Y3R1cmVzCisgICAgcmF0aGVyIHRoYW4gdXNpbmcgKGFuZCBzdG9yaW5nKSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNYXA8S2V5LCA/Pi4KKyAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZSA9ICJ1bmNoZWNrZWQiKQogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhY2tlZE1hcDxLLCBWPiB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnRbXSBpbmRleDsKQEAgLTE2MTEsOCArMTg1Nyw4IEBACiAgICAgICAgIHByaXZhdGUgUGFja2VkTWFwKEtbXSBrZXlzLCBWW10gdmFsdWVzKSB7CiAgICAgICAgICAgICB0aGlzLmluZGV4ID0gY3JlYXRlSW5kZXgoa2V5cyk7CiAKLSAgICAgICAgICAgIHRoaXMua2V5cyA9IGluZGV4KGtleXMsIGluZGV4KTsKLSAgICAgICAgICAgIHRoaXMudmFsdWVzID0gaW5kZXgodmFsdWVzLCBpbmRleCk7CisgICAgICAgICAgICB0aGlzLmtleXMgPSBjb21wYWN0KGtleXMsIGluZGV4KTsKKyAgICAgICAgICAgIHRoaXMudmFsdWVzID0gY29tcGFjdCh2YWx1ZXMsIGluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgSyBnZXRLZXkoaW50IGkpIHsKQEAgLTE2NDAsNTkgKzE4ODYsNjAgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4KGludFtdIGEsIGludCB2YWx1ZUlmRW1wdHkpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSB2YWx1ZUlmRW1wdHk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbGVuZ3RoID0gYS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1hdGgubWF4KHJlc3VsdCwgYVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgPEs+IEtbXSBpbmRleChLW10ga2V5cywgaW50W10gaW5kZXgpIHsKLSAgICAgICAgICAgIGludCBzaXplID0ga2V5cy5sZW5ndGg7Ci0gICAgICAgICAgICBDbGFzczw/PiBjb21wb25lbnRUeXBlID0ga2V5cy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLSAgICAgICAgICAgIEtbXSByZXN1bHQgPSAoS1tdKSBBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBtYXgoaW5kZXgsIC0xKSArIDEpOworICAgICAgICAvKgorICAgICAgICBDcmVhdGUgYSBjb21wYWN0IGFycmF5IG9mIGtleXMgb3IgdmFsdWVzIHVzaW5nIHRoZSBzdXBwbGllZCBpbmRleC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIDxLPiBLW10gY29tcGFjdChLW10gYSwgaW50W10gaW5kZXgpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gYS5sZW5ndGg7CisgICAgICAgICAgICBDbGFzczw/PiBjb21wb25lbnRUeXBlID0gYS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgIEtbXSByZXN1bHQgPSAoS1tdKSBBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBtYXgyKGluZGV4LCAtMSkgKyAxKTsKIAogICAgICAgICAgICAgLy8gdGhpcyBvdmVyd3JpdGUgZHVwbGljYXRlcywgcmV0YWluaW5nIHRoZSBsYXN0IGVxdWl2YWxlbnQgZW50cnkKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4W2ldXSA9IGtleXNbaV07CisgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4W2ldXSA9IGFbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQm91bmRzIHsKLSAgICAgICAgcHVibGljIGludCBiZWxvdzsKLSAgICAgICAgcHVibGljIGludCBhYm92ZTsKKyAgICAvKgorICAgIEZvciBlYWNoIEdyb3VwICh3aXRoIGEgZ2l2ZW4gYWxpZ25tZW50KSB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQKKyAgICBiZWZvcmUgdGhlIGFsaWdubWVudCBwb2ludCBhbmQgdGhlIGFtb3VudCBvZiBzcGFjZSByZXF1aXJlZCBhZnRlciBpdC4gT25lIHNpZGUgb2YgdGhpcworICAgIGNhbGN1bGF0aW9uIGlzIGFsd2F5cyAwIGZvciBMRUFESU5HIGFuZCBUUkFJTElORyBhbGlnbm1lbnRzIGJ1dCB3ZSBkb24ndCBtYWtlIHVzZSBvZiB0aGlzLgorICAgIEZvciBDRU5URVIgYW5kIEJBU0VMSU5FIGFsaWdubWVudHMgYm90aCBzaWRlcyBhcmUgbmVlZGVkIGFuZCBpbiB0aGUgQkFTRUxJTkUgY2FzZSBubworICAgIHNpbXBsZSBvcHRpbWlzYXRpb25zIGFyZSBwb3NzaWJsZS4KIAotICAgICAgICBwcml2YXRlIEJvdW5kcyhpbnQgYmVsb3csIGludCBhYm92ZSkgewotICAgICAgICAgICAgdGhpcy5iZWxvdyA9IGJlbG93OwotICAgICAgICAgICAgdGhpcy5hYm92ZSA9IGFib3ZlOwotICAgICAgICB9CisgICAgVGhlIGdlbmVyYWwgYWxnb3JpdGhtIHRoZXJlZm9yZSBpcyB0byBjcmVhdGUgYSBNYXAgKGFjdHVhbGx5IGEgUGFja2VkTWFwKSBmcm9tCisgICAgR3JvdXAgdG8gQm91bmRzIGFuZCB0byBsb29wIHRocm91Z2ggYWxsIFZpZXdzIGluIHRoZSBncm91cCB0YWtpbmcgdGhlIG1heGltdW0KKyAgICBvZiB0aGUgdmFsdWVzIGZvciBlYWNoIFZpZXcuCisgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCb3VuZHMgeworICAgICAgICBwdWJsaWMgaW50IGJlZm9yZTsKKyAgICAgICAgcHVibGljIGludCBhZnRlcjsKIAogICAgICAgICBwcml2YXRlIEJvdW5kcygpIHsKICAgICAgICAgICAgIHJlc2V0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBiZWxvdyA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgICAgICAgYWJvdmUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICAgICAgICAgIGJlZm9yZSA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgICAgICAgICAgYWZ0ZXIgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBpbmNsdWRlKGludCBiZWxvdywgaW50IGFib3ZlKSB7Ci0gICAgICAgICAgICB0aGlzLmJlbG93ID0gbWluKHRoaXMuYmVsb3csIGJlbG93KTsKLSAgICAgICAgICAgIHRoaXMuYWJvdmUgPSBtYXgodGhpcy5hYm92ZSwgYWJvdmUpOworICAgICAgICBwcml2YXRlIHZvaWQgaW5jbHVkZShpbnQgYmVmb3JlLCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYmVmb3JlID0gbWF4KHRoaXMuYmVmb3JlLCBiZWZvcmUpOworICAgICAgICAgICAgdGhpcy5hZnRlciA9IG1heCh0aGlzLmFmdGVyLCBhZnRlcik7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIGludCBzaXplKCkgewotICAgICAgICAgICAgcmV0dXJuIGFib3ZlIC0gYmVsb3c7CisgICAgICAgICAgICByZXR1cm4gYmVmb3JlICsgYWZ0ZXI7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiAiQm91bmRzeyIgKwotICAgICAgICAgICAgICAgICAgICAiYmVsb3c9IiArIGJlbG93ICsKLSAgICAgICAgICAgICAgICAgICAgIiwgYWJvdmU9IiArIGFib3ZlICsKKyAgICAgICAgICAgICAgICAgICAgImJlZm9yZT0iICsgYmVmb3JlICsKKyAgICAgICAgICAgICAgICAgICAgIiwgYWZ0ZXI9IiArIGFmdGVyICsKICAgICAgICAgICAgICAgICAgICAgJ30nOwogICAgICAgICB9CiAgICAgfQpAQCAtMTcwNSwyNCArMTk1MiwyNSBAQAogICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgSW50ZXJ2YWxzIHdoaWNoIGhhdmUgdGhlIHNhbWUKICAgICAgKiB7QGxpbmsgI21pbn0gYW5kIHtAbGluayAjbWF4fSB2YWx1ZXMuCiAgICAgICogPHA+Ci0gICAgICogSW50ZXJ2YWxzIGFyZSBvZnRlbiB3cml0dGVuIGFzIDxjb2RlPlttaW4sIG1heF08L2NvZGU+IGFuZCByZXByZXNlbnQgdGhlIHNldCBvZiB2YWx1ZXMKLSAgICAgKiA8ZW0+eDwvZW0+IHN1Y2ggdGhhdCA8ZW0+bWluIDw9IHggPCBtYXg8L2VtPi4KKyAgICAgKiBJbnRlcnZhbHMgYXJlIG9mdGVuIHdyaXR0ZW4gYXMge0Bjb2RlIFttaW4sIG1heF19IGFuZCByZXByZXNlbnQgdGhlIHNldCBvZiB2YWx1ZXMKKyAgICAgKiB7QGNvZGUgeH0gc3VjaCB0aGF0IHtAY29kZSBtaW4gPD0geCA8IG1heH0uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcnZhbCB7CisgICAgLyogcGFja2FnZSAqLyBzdGF0aWMgY2xhc3MgSW50ZXJ2YWwgewogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG1pbmltdW0gdmFsdWUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1pbjsKKwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG1heGltdW0gdmFsdWUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1heDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGEgbmV3IEludGVydmFsLCA8Y29kZT5pbnRlcnZhbDwvY29kZT4sIHdoZXJlOgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSW50ZXJ2YWwsIHtAY29kZSBpbnRlcnZhbH0sIHdoZXJlOgogICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqICAgICA8bGk+IDxjb2RlPmludGVydmFsLm1pbiA9IG1pbjwvY29kZT4gPC9saT4KLSAgICAgICAgICogICAgIDxsaT4gPGNvZGU+aW50ZXJ2YWwubWF4ID0gbWF4PC9jb2RlPiA8L2xpPgorICAgICAgICAgKiAgICAgPGxpPiB7QGNvZGUgaW50ZXJ2YWwubWluID0gbWlufSA8L2xpPgorICAgICAgICAgKiAgICAgPGxpPiB7QGNvZGUgaW50ZXJ2YWwubWF4ID0gbWF4fSA8L2xpPgogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbHVlLgpAQCAtMTc0MiwxMyArMTk5MCwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUge0BsaW5rICNnZXRDbGFzcyBjbGFzc30sIHtAbGluayAjbWlufSBhbmQge0BsaW5rICNtYXh9IHByb3BlcnRpZXMKLSAgICAgICAgICogb2YgdGhpcyBJbnRlcnZhbCBhbmQgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhcmUgcGFpcndpc2UgZXF1YWw7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAbGluayAjZ2V0Q2xhc3MgY2xhc3N9LAorICAgICAgICAgKiB7QGxpbmsgI21pbn0gYW5kIHtAbGluayAjbWF4fSBwcm9wZXJ0aWVzIG9mIHRoaXMgSW50ZXJ2YWwgYW5kIHRoZQorICAgICAgICAgKiBzdXBwbGllZCBwYXJhbWV0ZXIgYXJlIHBhaXJ3aXNlIGVxdWFsOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgaW50ZXJ2YWwgd2l0aC4KKyAgICAgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgaW50ZXJ2YWwgd2l0aAogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCi0gICAgICAgICAqICAgICAgICAge0Bjb2RlIEludGVydmFsfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIEludGVydmFsfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CkBAIC0xNzg5LDE4ICsyMDM4LDE3IEBACiAgICAgICogY2VsbHMuCiAgICAgICogPHA+CiAgICAgICogR3JvdXBzIGFyZSBpbW11dGFibGUgYW5kIHNvIG1heSBiZSBzaGFyZWQgYmV0d2VlbiB2aWV3cyB3aXRoIHRoZSBzYW1lCi0gICAgICogPGNvZGU+c3BhbjwvY29kZT4gYW5kIDxjb2RlPmFsaWdubWVudDwvY29kZT4uCisgICAgICoge0Bjb2RlIHNwYW59IGFuZCB7QGNvZGUgYWxpZ25tZW50fS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwIHsKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB7QGxpbmsgSW50ZXJ2YWwjbWluIG1pbn0gYW5kIHtAbGluayBJbnRlcnZhbCNtYXggbWF4fSB2YWx1ZXMgb2YKLSAgICAgICAgICogYSBzcGFuIHNwZWNpZnkgdGhlIGdyaWQgaW5kaWNlcyBvZiB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgZWRnZXMgb2YKLSAgICAgICAgICogdGhlIGNlbGwgZ3JvdXAuCisgICAgICAgICAqIFRoZSBncmlkIGluZGljZXMgb2YgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVkZ2VzIG9mIHRoaXMgY2VsbCBncm91cCBmb3IgdGhlCisgICAgICAgICAqIGFwcHJvcHJpYXRlIGF4aXMuCiAgICAgICAgICAqIDxwPgogICAgICAgICAgKiBTZWUge0BsaW5rIEdyaWRMYXlvdXR9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb252ZW50aW9ucyB1c2VkIGJ5IEdyaWRMYXlvdXQKICAgICAgICAgICogZm9yIGdyaWQgaW5kaWNlcy4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBmaW5hbCBJbnRlcnZhbCBzcGFuOworICAgICAgICAvKiBwYWNrYWdlICovIGZpbmFsIEludGVydmFsIHNwYW47CiAgICAgICAgIC8qKgogICAgICAgICAgKiBTcGVjaWZpZXMgaG93IGNlbGxzIHNob3VsZCBiZSBhbGlnbmVkIGluIHRoaXMgZ3JvdXAuCiAgICAgICAgICAqIEZvciByb3cgZ3JvdXBzLCB0aGlzIHNwZWNpZmllcyB0aGUgdmVydGljYWwgYWxpZ25tZW50LgpAQCAtMTgwOSw0NyArMjA1Nyw0NyBAQAogICAgICAgICBwdWJsaWMgZmluYWwgQWxpZ25tZW50IGFsaWdubWVudDsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGEgbmV3IEdyb3VwLCA8Y29kZT5ncm91cDwvY29kZT4sIHdoZXJlOgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgR3JvdXAsIHtAY29kZSBncm91cH0sIHdoZXJlOgogICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqICAgICA8bGk+IDxjb2RlPmdyb3VwLnNwYW4gPSBzcGFuPC9jb2RlPiA8L2xpPgotICAgICAgICAgKiAgICAgPGxpPiA8Y29kZT5ncm91cC5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ8L2NvZGU+IDwvbGk+CisgICAgICAgICAqICAgICA8bGk+IHtAY29kZSBncm91cC5zcGFuID0gc3Bhbn0gPC9saT4KKyAgICAgICAgICogICAgIDxsaT4ge0Bjb2RlIGdyb3VwLmFsaWdubWVudCA9IGFsaWdubWVudH0gPC9saT4KICAgICAgICAgICogPC91bD4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNwYW4gICAgICB0aGUgc3Bhbi4KLSAgICAgICAgICogQHBhcmFtIGFsaWdubWVudCB0aGUgYWxpZ25tZW50LgorICAgICAgICAgKiBAcGFyYW0gc3BhbiAgICAgIHRoZSBzcGFuCisgICAgICAgICAqIEBwYXJhbSBhbGlnbm1lbnQgdGhlIGFsaWdubWVudAogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEdyb3VwKEludGVydmFsIHNwYW4sIEFsaWdubWVudCBhbGlnbm1lbnQpIHsKKyAgICAgICAgLyogcGFja2FnZSAqLyBHcm91cChJbnRlcnZhbCBzcGFuLCBBbGlnbm1lbnQgYWxpZ25tZW50KSB7CiAgICAgICAgICAgICB0aGlzLnNwYW4gPSBzcGFuOwogICAgICAgICAgICAgdGhpcy5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGEgbmV3IEdyb3VwLCA8Y29kZT5ncm91cDwvY29kZT4sIHdoZXJlOgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgR3JvdXAsIHtAY29kZSBncm91cH0sIHdoZXJlOgogICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqICAgICA8bGk+IDxjb2RlPmdyb3VwLnNwYW4gPSBbbWluLCBtYXhdPC9jb2RlPiA8L2xpPgotICAgICAgICAgKiAgICAgPGxpPiA8Y29kZT5ncm91cC5hbGlnbm1lbnQgPSBhbGlnbm1lbnQ8L2NvZGU+IDwvbGk+CisgICAgICAgICAqICAgICA8bGk+IHtAY29kZSBncm91cC5zcGFuID0gW3N0YXJ0LCBzdGFydCArIHNpemVdfSA8L2xpPgorICAgICAgICAgKiAgICAgPGxpPiB7QGNvZGUgZ3JvdXAuYWxpZ25tZW50ID0gYWxpZ25tZW50fSA8L2xpPgogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWluICAgICAgIHRoZSBtaW5pbXVtLgotICAgICAgICAgKiBAcGFyYW0gbWF4ICAgICAgIHRoZSBtYXhpbXVtLgotICAgICAgICAgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQuCisgICAgICAgICAqIEBwYXJhbSBzdGFydCAgICAgdGhlIHN0YXJ0CisgICAgICAgICAqIEBwYXJhbSBzaXplICAgICAgdGhlIHNpemUKKyAgICAgICAgICogQHBhcmFtIGFsaWdubWVudCB0aGUgYWxpZ25tZW50CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgR3JvdXAoaW50IG1pbiwgaW50IG1heCwgQWxpZ25tZW50IGFsaWdubWVudCkgewotICAgICAgICAgICAgdGhpcyhuZXcgSW50ZXJ2YWwobWluLCBtYXgpLCBhbGlnbm1lbnQpOworICAgICAgICBwdWJsaWMgR3JvdXAoaW50IHN0YXJ0LCBpbnQgc2l6ZSwgQWxpZ25tZW50IGFsaWdubWVudCkgeworICAgICAgICAgICAgdGhpcyhuZXcgSW50ZXJ2YWwoc3RhcnQsIHN0YXJ0ICsgc2l6ZSksIGFsaWdubWVudCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0IGEgbmV3IEdyb3VwLCA8Y29kZT5ncm91cDwvY29kZT4sIHdoZXJlOgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgR3JvdXAsIHtAY29kZSBncm91cH0sIHdoZXJlOgogICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqICAgICA8bGk+IDxjb2RlPmdyb3VwLnNwYW4gPSBbbWluLCBtaW4gKyAxXTwvY29kZT4gPC9saT4KLSAgICAgICAgICogICAgIDxsaT4gPGNvZGU+Z3JvdXAuYWxpZ25tZW50ID0gYWxpZ25tZW50PC9jb2RlPiA8L2xpPgorICAgICAgICAgKiAgICAgPGxpPiB7QGNvZGUgZ3JvdXAuc3BhbiA9IFtzdGFydCwgc3RhcnQgKyAxXX0gPC9saT4KKyAgICAgICAgICogICAgIDxsaT4ge0Bjb2RlIGdyb3VwLmFsaWdubWVudCA9IGFsaWdubWVudH0gPC9saT4KICAgICAgICAgICogPC91bD4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIG1pbiAgICAgICB0aGUgbWluaW11bS4KLSAgICAgICAgICogQHBhcmFtIGFsaWdubWVudCB0aGUgYWxpZ25tZW50LgorICAgICAgICAgKiBAcGFyYW0gc3RhcnQgICAgIHRoZSBzdGFydCBpbmRleAorICAgICAgICAgKiBAcGFyYW0gYWxpZ25tZW50IHRoZSBhbGlnbm1lbnQKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBHcm91cChpbnQgbWluLCBBbGlnbm1lbnQgYWxpZ25tZW50KSB7Ci0gICAgICAgICAgICB0aGlzKG1pbiwgbWluICsgMSwgYWxpZ25tZW50KTsKKyAgICAgICAgcHVibGljIEdyb3VwKGludCBzdGFydCwgQWxpZ25tZW50IGFsaWdubWVudCkgeworICAgICAgICAgICAgdGhpcyhzdGFydCwgMSwgYWxpZ25tZW50KTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgR3JvdXAgY29weVdyaXRlU3BhbihJbnRlcnZhbCBzcGFuKSB7CkBAIC0xODYxLDEzICsyMTA5LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB7QGxpbmsgI2dldENsYXNzIGNsYXNzfSwge0BsaW5rICNhbGlnbm1lbnR9IGFuZCB7QGxpbmsgI3NwYW59Ci0gICAgICAgICAqIHByb3BlcnRpZXMgb2YgdGhpcyBHcm91cCBhbmQgdGhlIHN1cHBsaWVkIHBhcmFtZXRlciBhcmUgcGFpcndpc2UgZXF1YWw7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAbGluayAjZ2V0Q2xhc3MgY2xhc3N9LCB7QGxpbmsgI2FsaWdubWVudH0gYW5kIHtAY29kZSBzcGFufQorICAgICAgICAgKiBwcm9wZXJ0aWVzIG9mIHRoaXMgR3JvdXAgYW5kIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXIgYXJlIHBhaXJ3aXNlIGVxdWFsLAorICAgICAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgZ3JvdXAgd2l0aC4KKyAgICAgICAgICogQHBhcmFtIHRoYXQgdGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgZ3JvdXAgd2l0aAogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzCi0gICAgICAgICAqICAgICAgICAge0Bjb2RlIEdyb3VwfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIEdyb3VwfTsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKQEAgLTE4OTgsOSArMjE0Nyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBBbGlnbm1lbnRzCi0KLQogICAgIC8qKgogICAgICAqIEFsaWdubWVudHMgc3BlY2lmeSB3aGVyZSBhIHZpZXcgc2hvdWxkIGJlIHBsYWNlZCB3aXRoaW4gYSBjZWxsIGdyb3VwIGFuZAogICAgICAqIHdoYXQgc2l6ZSBpdCBzaG91bGQgYmUuCkBAIC0xOTEwLDU3ICsyMTU2LDYxIEBACiAgICAgICoge0BsaW5rIEdyb3VwI2FsaWdubWVudCBhbGlnbm1lbnR9LiBPdmVyYWxsIHBsYWNlbWVudCBvZiB0aGUgdmlldyBpbiB0aGUgY2VsbAogICAgICAqIGdyb3VwIGlzIHNwZWNpZmllZCBieSB0aGUgdHdvIGFsaWdubWVudHMgd2hpY2ggYWN0IGFsb25nIGVhY2ggYXhpcyBpbmRlcGVuZGVudGx5LgogICAgICAqIDxwPgotICAgICAqIEFuIEFsaWdubWVudCBpbXBsZW1lbnRhdGlvbiBtdXN0IGRlZmluZSB0aGUge0BsaW5rICNnZXRBbGlnbm1lbnRWYWx1ZShWaWV3LCBpbnQpfQorICAgICAqIEFuIEFsaWdubWVudCBpbXBsZW1lbnRhdGlvbiBtdXN0IGRlZmluZSB7QGxpbmsgI2dldEFsaWdubWVudFZhbHVlKFZpZXcsIGludCwgaW50KX0sCiAgICAgICogdG8gcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgdGhlIHR5cGUgb2YgYWxpZ25tZW50IGJlaW5nIGRlZmluZWQuCiAgICAgICogVGhlIGVuY2xvc2luZyBhbGdvcml0aG1zIHBvc2l0aW9uIHRoZSBjaGlsZHJlbgotICAgICAqIHNvIHRoYXQgdGhlIHZhbHVlcyByZXR1cm5lZCBmcm9tIHRoZSBhbGlnbm1lbnQKKyAgICAgKiBzbyB0aGF0IHRoZSBsb2NhdGlvbnMgZGVmaW5lZCBieSB0aGUgYWxpZ25tZW50IHZhbHVlcwogICAgICAqIGFyZSB0aGUgc2FtZSBmb3IgYWxsIG9mIHRoZSB2aWV3cyBpbiBhIGdyb3VwLgogICAgICAqIDxwPgogICAgICAqICBUaGUgR3JpZExheW91dCBjbGFzcyBkZWZpbmVzIHRoZSBtb3N0IGNvbW1vbiBhbGlnbm1lbnRzIHVzZWQgaW4gZ2VuZXJhbCBsYXlvdXQ6CiAgICAgICoge0BsaW5rICNUT1B9LCB7QGxpbmsgI0xFRlR9LCB7QGxpbmsgI0JPVFRPTX0sIHtAbGluayAjUklHSFR9LCB7QGxpbmsgI0NFTlRFUn0sIHtAbGluawogICAgICAqICNCQVNFTElORX0gYW5kIHtAbGluayAjRklMTH0uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQWxpZ25tZW50IHsKKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFsaWdubWVudCB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZXR1cm5zIGFuIGFsaWdubWVudCB2YWx1ZS4gSW4gdGhlIGNhc2Ugb2YgdmVydGljYWwgYWxpZ25tZW50cyB0aGUgdmFsdWUKICAgICAgICAgICogcmV0dXJuZWQgc2hvdWxkIGluZGljYXRlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0b3Agb2YgdGhlIHZpZXcgdG8gdGhlCiAgICAgICAgICAqIGFsaWdubWVudCBsb2NhdGlvbi4KICAgICAgICAgICogRm9yIGhvcml6b250YWwgYWxpZ25tZW50cyBtZWFzdXJlbWVudCBpcyBtYWRlIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgY29tcG9uZW50LgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdmlldyAgICAgdGhlIHZpZXcgdG8gd2hpY2ggdGhpcyBhbGlnbm1lbnQgc2hvdWxkIGJlIGFwcGxpZWQuCi0gICAgICAgICAqIEBwYXJhbSB2aWV3U2l6ZSB0aGUgbWVhc3VyZWQgc2l6ZSBvZiB0aGUgdmlldy4KLSAgICAgICAgICogQHJldHVybiB0aGUgYWxpZ25tZW50IHZhbHVlLgorICAgICAgICAgKiBAcGFyYW0gdmlldyAgICAgICAgICAgICAgdGhlIHZpZXcgdG8gd2hpY2ggdGhpcyBhbGlnbm1lbnQgc2hvdWxkIGJlIGFwcGxpZWQKKyAgICAgICAgICogQHBhcmFtIHZpZXdTaXplICAgICAgICAgIHRoZSBtZWFzdXJlZCBzaXplIG9mIHRoZSB2aWV3CisgICAgICAgICAqIEBwYXJhbSBtZWFzdXJlbWVudFR5cGUgICBUaGlzIHBhcmFtZXRlciBpcyBjdXJyZW50bHkgdW51c2VkIGFzIEdyaWRMYXlvdXQgb25seSBzdXBwb3J0cworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHR5cGUgb2YgbWVhc3VyZW1lbnQ6IHtAbGluayBWaWV3I21lYXN1cmUoaW50LCBpbnQpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgIHRoZSBhbGlnbm1lbnQgdmFsdWUKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWxpZ25tZW50VmFsdWUoVmlldyB2aWV3LCBpbnQgdmlld1NpemUpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEFsaWdubWVudFZhbHVlKFZpZXcgdmlldywgaW50IHZpZXdTaXplLCBpbnQgbWVhc3VyZW1lbnRUeXBlKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdmlldyBzcGVjaWZpZWQgYnkgdGhpcyBhbGlnbm1lbnQuCiAgICAgICAgICAqIEluIHRoZSBjYXNlIG9mIHZlcnRpY2FsIGFsaWdubWVudHMgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIGhlaWdodDsgZm9yCiAgICAgICAgICAqIGhvcml6b250YWwgYWxpZ25tZW50cyB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSB3aWR0aC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMge0Bjb2RlIHZpZXdTaXplfS4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZpZXcgICAgIHRoZSB2aWV3IHRvIHdoaWNoIHRoaXMgYWxpZ25tZW50IHNob3VsZCBiZSBhcHBsaWVkLgotICAgICAgICAgKiBAcGFyYW0gdmlld1NpemUgdGhlIG1lYXN1cmVkIHNpemUgb2YgdGhlIHZpZXcuCi0gICAgICAgICAqIEBwYXJhbSBjZWxsU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgY2VsbCBpbnRvIHdoaWNoIHRoaXMgdmlldyB3aWxsIGJlIHBsYWNlZC4KLSAgICAgICAgICogQHJldHVybiB0aGUgYWxpZ25lZCBzaXplLgorICAgICAgICAgKiBAcGFyYW0gdmlldyAgICAgICAgICAgICAgdGhlIHZpZXcgdG8gd2hpY2ggdGhpcyBhbGlnbm1lbnQgc2hvdWxkIGJlIGFwcGxpZWQKKyAgICAgICAgICogQHBhcmFtIHZpZXdTaXplICAgICAgICAgIHRoZSBtZWFzdXJlZCBzaXplIG9mIHRoZSB2aWV3CisgICAgICAgICAqIEBwYXJhbSBjZWxsU2l6ZSAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY2VsbCBpbnRvIHdoaWNoIHRoaXMgdmlldyB3aWxsIGJlIHBsYWNlZAorICAgICAgICAgKiBAcGFyYW0gbWVhc3VyZW1lbnRUeXBlICAgVGhpcyBwYXJhbWV0ZXIgaXMgY3VycmVudGx5IHVudXNlZCBhcyBHcmlkTGF5b3V0IG9ubHkgc3VwcG9ydHMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSB0eXBlIG9mIG1lYXN1cmVtZW50OiB7QGxpbmsgVmlldyNtZWFzdXJlKGludCwgaW50KX0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gICAgICAgICAgICAgICAgICB0aGUgYWxpZ25lZCBzaXplCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFNpemVJbkNlbGwoVmlldyB2aWV3LCBpbnQgdmlld1NpemUsIGludCBjZWxsU2l6ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbGlnbm1lbnQgaW1wbGVtZW50cyBBbGlnbm1lbnQgewotICAgICAgICBwdWJsaWMgaW50IGdldFNpemVJbkNlbGwoVmlldyB2aWV3LCBpbnQgdmlld1NpemUsIGludCBjZWxsU2l6ZSkgeworICAgICAgICBwdWJsaWMgaW50IGdldFNpemVJbkNlbGwoVmlldyB2aWV3LCBpbnQgdmlld1NpemUsIGludCBjZWxsU2l6ZSwgaW50IG1lYXN1cmVtZW50VHlwZSkgewogICAgICAgICAgICAgcmV0dXJuIHZpZXdTaXplOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50IExFQURJTkcgPSBuZXcgQWJzdHJhY3RBbGlnbm1lbnQoKSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QWxpZ25tZW50VmFsdWUoVmlldyB2aWV3LCBpbnQgdmlld1NpemUpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBbGlnbm1lbnQgTEVBRElORyA9IG5ldyBBbGlnbm1lbnQoKSB7CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWxpZ25tZW50VmFsdWUoVmlldyB2aWV3LCBpbnQgdmlld1NpemUsIGludCBtZWFzdXJlbWVudFR5cGUpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKICAgICB9OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50IFRSQUlMSU5HID0gbmV3IEFic3RyYWN0QWxpZ25tZW50KCkgewotICAgICAgICBwdWJsaWMgaW50IGdldEFsaWdubWVudFZhbHVlKFZpZXcgdmlldywgaW50IHZpZXdTaXplKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxpZ25tZW50IFRSQUlMSU5HID0gbmV3IEFsaWdubWVudCgpIHsKKyAgICAgICAgcHVibGljIGludCBnZXRBbGlnbm1lbnRWYWx1ZShWaWV3IHZpZXcsIGludCB2aWV3U2l6ZSwgaW50IG1lYXN1cmVtZW50VHlwZSkgewogICAgICAgICAgICAgcmV0dXJuIHZpZXdTaXplOwogICAgICAgICB9CiAgICAgfTsKQEAgLTE5OTQsOCArMjI0NCw4IEBACiAgICAgICogVGhpcyBjb25zdGFudCBtYXkgYmUgdXNlZCBpbiBib3RoIHtAbGluayBMYXlvdXRQYXJhbXMjcm93R3JvdXAgcm93R3JvdXBzfSBhbmQge0BsaW5rCiAgICAgICogTGF5b3V0UGFyYW1zI2NvbHVtbkdyb3VwIGNvbHVtbkdyb3Vwc30uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbGlnbm1lbnQgQ0VOVEVSID0gbmV3IEFic3RyYWN0QWxpZ25tZW50KCkgewotICAgICAgICBwdWJsaWMgaW50IGdldEFsaWdubWVudFZhbHVlKFZpZXcgdmlldywgaW50IHZpZXdTaXplKSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbGlnbm1lbnQgQ0VOVEVSID0gbmV3IEFsaWdubWVudCgpIHsKKyAgICAgICAgcHVibGljIGludCBnZXRBbGlnbm1lbnRWYWx1ZShWaWV3IHZpZXcsIGludCB2aWV3U2l6ZSwgaW50IG1lYXN1cmVtZW50VHlwZSkgewogICAgICAgICAgICAgcmV0dXJuIHZpZXdTaXplID4+IDE7CiAgICAgICAgIH0KICAgICB9OwpAQCAtMjAwNywxNCArMjI1NywxNyBAQAogICAgICAqCiAgICAgICogQHNlZSBWaWV3I2dldEJhc2VsaW5lKCkKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFsaWdubWVudCBCQVNFTElORSA9IG5ldyBBYnN0cmFjdEFsaWdubWVudCgpIHsKLSAgICAgICAgcHVibGljIGludCBnZXRBbGlnbm1lbnRWYWx1ZShWaWV3IHZpZXcsIGludCB2aWV3U2l6ZSkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxpZ25tZW50IEJBU0VMSU5FID0gbmV3IEFsaWdubWVudCgpIHsKKyAgICAgICAgcHVibGljIGludCBnZXRBbGlnbm1lbnRWYWx1ZShWaWV3IHZpZXcsIGludCB2aWV3U2l6ZSwgaW50IG1lYXN1cmVtZW50VHlwZSkgewogICAgICAgICAgICAgaWYgKHZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBVTkRFRklORUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB0b2RvIGRvIHdlIG5lZWQgdG8gY2FsbCBtZWFzdXJlIGZpcnN0PwogICAgICAgICAgICAgaW50IGJhc2VsaW5lID0gdmlldy5nZXRCYXNlbGluZSgpOwotICAgICAgICAgICAgcmV0dXJuIGJhc2VsaW5lID09IC0xID8gVU5ERUZJTkVEIDogYmFzZWxpbmU7CisgICAgICAgICAgICBpZiAoYmFzZWxpbmUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5ERUZJTkVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZWxpbmU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgIH07CkBAIC0yMDI1LDEyICsyMjc4LDEzIEBACiAgICAgICoge0BsaW5rIExheW91dFBhcmFtcyNjb2x1bW5Hcm91cCBjb2x1bW5Hcm91cHN9LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxpZ25tZW50IEZJTEwgPSBuZXcgQWxpZ25tZW50KCkgewotICAgICAgICBwdWJsaWMgaW50IGdldEFsaWdubWVudFZhbHVlKFZpZXcgdmlldywgaW50IHZpZXdTaXplKSB7CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWxpZ25tZW50VmFsdWUoVmlldyB2aWV3LCBpbnQgdmlld1NpemUsIGludCBtZWFzdXJlbWVudFR5cGUpIHsKICAgICAgICAgICAgIHJldHVybiBVTkRFRklORUQ7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgaW50IGdldFNpemVJbkNlbGwoVmlldyB2aWV3LCBpbnQgdmlld1NpemUsIGludCBjZWxsU2l6ZSkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRTaXplSW5DZWxsKFZpZXcgdmlldywgaW50IHZpZXdTaXplLCBpbnQgY2VsbFNpemUsIGludCBtZWFzdXJlbWVudFR5cGUpIHsKICAgICAgICAgICAgIHJldHVybiBjZWxsU2l6ZTsKICAgICAgICAgfQogICAgIH07Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0dyaWRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQppbmRleCA3MzJjZWRjLi41ZDQwNmRlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvR3JpZFZpZXcuamF2YQpAQCAtMTQwOCw3ICsxNDA4LDggQEAKICAgICAgICAgaW50IGNoaWxkTGVmdDsKICAgICAgICAgZmluYWwgaW50IGNoaWxkVG9wID0gZmxvdyA/IHkgOiB5IC0gaDsKIAotICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkobUdyYXZpdHksaXNMYXlvdXRSdGwoKSk7CisgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkobUdyYXZpdHksIGxheW91dERpcmVjdGlvbik7CiAgICAgICAgIHN3aXRjaCAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgewogICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkxFRlQ6CiAgICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gY2hpbGRyZW5MZWZ0OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ltYWdlVmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0ltYWdlVmlldy5qYXZhCmluZGV4IDRiODcwZWMuLjE2MWI0MDQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9JbWFnZVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvSW1hZ2VWaWV3LmphdmEKQEAgLTE4Niw5ICsxODYsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoRHJhd2FibGUgZHIpIHsKLSAgICAgICAgcmV0dXJuIChkciA9PSBtRHJhd2FibGUpID8gaXNMYXlvdXRSdGwoKSA6IHN1cGVyLmlzTGF5b3V0UnRsKGRyKTsKKyAgICBwdWJsaWMgaW50IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKERyYXdhYmxlIGRyKSB7CisgICAgICAgIHJldHVybiAoZHIgPT0gbURyYXdhYmxlKSA/CisgICAgICAgICAgICAgICAgZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSA6IHN1cGVyLmdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKGRyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaW5lYXJMYXlvdXQuamF2YQppbmRleCA4ZDQ0OWUwLi5lM2JjOTQ2IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGluZWFyTGF5b3V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpbmVhckxheW91dC5qYXZhCkBAIC0xMDMsMjMgKzEwMywzOSBAQAogICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJtZWFzdXJlbWVudCIpCiAgICAgcHJpdmF0ZSBpbnQgbU9yaWVudGF0aW9uOwogCi0gICAgQFZpZXdEZWJ1Zy5FeHBvcnRlZFByb3BlcnR5KGNhdGVnb3J5ID0gIm1lYXN1cmVtZW50IiwgbWFwcGluZyA9IHsKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9ICAtMSwgICAgICAgICAgICAgICAgICAgICAgIHRvID0gIk5PTkUiKSwKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEdyYXZpdHkuTk9fR1JBVklUWSwgICAgICAgIHRvID0gIk5PTkUiKSwKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEdyYXZpdHkuVE9QLCAgICAgICAgICAgICAgIHRvID0gIlRPUCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5CT1RUT00sICAgICAgICAgICAgdG8gPSAiQk9UVE9NIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkxFRlQsICAgICAgICAgICAgICB0byA9ICJMRUZUIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LlJJR0hULCAgICAgICAgICAgICB0byA9ICJSSUdIVCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5CRUZPUkUsICAgICAgICAgICAgdG8gPSAiQkVGT1JFIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkFGVEVSLCAgICAgICAgICAgICB0byA9ICJBRlRFUiIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUwsICAgdG8gPSAiQ0VOVEVSX1ZFUlRJQ0FMIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkZJTExfVkVSVElDQUwsICAgICB0byA9ICJGSUxMX1ZFUlRJQ0FMIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCB0byA9ICJDRU5URVJfSE9SSVpPTlRBTCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5GSUxMX0hPUklaT05UQUwsICAgdG8gPSAiRklMTF9IT1JJWk9OVEFMIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkNFTlRFUiwgICAgICAgICAgICB0byA9ICJDRU5URVIiKSwKLSAgICAgICAgICAgIEBWaWV3RGVidWcuSW50VG9TdHJpbmcoZnJvbSA9IEdyYXZpdHkuRklMTCwgICAgICAgICAgICAgIHRvID0gIkZJTEwiKQorICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJtZWFzdXJlbWVudCIsIGZsYWdNYXBwaW5nID0geworICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IC0xLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IC0xLCBuYW1lID0gIk5PTkUiKSwKKyAgICAgICAgICAgIEBWaWV3RGVidWcuRmxhZ1RvU3RyaW5nKG1hc2sgPSBHcmF2aXR5Lk5PX0dSQVZJVFksCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5OT19HUkFWSVRZLG5hbWUgPSAiTk9ORSIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuVE9QLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuVE9QLCBuYW1lID0gIlRPUCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuQk9UVE9NLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuQk9UVE9NLCBuYW1lID0gIkJPVFRPTSIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuTEVGVCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkxFRlQsIG5hbWUgPSAiTEVGVCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuUklHSFQsCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5SSUdIVCwgbmFtZSA9ICJSSUdIVCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuU1RBUlQsCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5TVEFSVCwgbmFtZSA9ICJTVEFSVCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuRU5ELAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuRU5ELCBuYW1lID0gIkVORCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLCBuYW1lID0gIkNFTlRFUl9WRVJUSUNBTCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuRklMTF9WRVJUSUNBTCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkZJTExfVkVSVElDQUwsIG5hbWUgPSAiRklMTF9WRVJUSUNBTCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwsCisgICAgICAgICAgICAgICAgZXF1YWxzID0gR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCwgbmFtZSA9ICJDRU5URVJfSE9SSVpPTlRBTCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMLCBuYW1lID0gIkZJTExfSE9SSVpPTlRBTCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuQ0VOVEVSLAorICAgICAgICAgICAgICAgIGVxdWFscyA9IEdyYXZpdHkuQ0VOVEVSLCBuYW1lID0gIkNFTlRFUiIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuRklMTCwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LkZJTEwsIG5hbWUgPSAiRklMTCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5GbGFnVG9TdHJpbmcobWFzayA9IEdyYXZpdHkuUkVMQVRJVkVfTEFZT1VUX0RJUkVDVElPTiwKKyAgICAgICAgICAgICAgICBlcXVhbHMgPSBHcmF2aXR5LlJFTEFUSVZFX0xBWU9VVF9ESVJFQ1RJT04sIG5hbWUgPSAiUkVMQVRJVkUiKQogICAgICAgICB9KQotICAgIHByaXZhdGUgaW50IG1HcmF2aXR5ID0gR3Jhdml0eS5CRUZPUkUgfCBHcmF2aXR5LlRPUDsKKyAgICBwcml2YXRlIGludCBtR3Jhdml0eSA9IEdyYXZpdHkuU1RBUlQgfCBHcmF2aXR5LlRPUDsKIAogICAgIEBWaWV3RGVidWcuRXhwb3J0ZWRQcm9wZXJ0eShjYXRlZ29yeSA9ICJtZWFzdXJlbWVudCIpCiAgICAgcHJpdmF0ZSBpbnQgbVRvdGFsTGVuZ3RoOwpAQCAtMTQzMCw4ICsxNDQ2LDkgQEAKICAgICAgICAgICAgICAgICBpZiAoZ3Jhdml0eSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgZ3Jhdml0eSA9IG1pbm9yR3Jhdml0eTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KGdyYXZpdHksIGlzTGF5b3V0UnRsKCkpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZ3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkoZ3Jhdml0eSwgbGF5b3V0RGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMOgogICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFkZGluZ0xlZnQgKyAoKGNoaWxkU3BhY2UgLSBjaGlsZFdpZHRoKSAvIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwpAQCAtMTQ5Myw3ICsxNTEwLDggQEAKICAgICAgICAgZmluYWwgaW50W10gbWF4QXNjZW50ID0gbU1heEFzY2VudDsKICAgICAgICAgZmluYWwgaW50W10gbWF4RGVzY2VudCA9IG1NYXhEZXNjZW50OwogCi0gICAgICAgIHN3aXRjaCAoR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkobWFqb3JHcmF2aXR5LCBpc0xheW91dFJ0bCgpKSkgeworICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKTsKKyAgICAgICAgc3dpdGNoIChHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShtYWpvckdyYXZpdHksIGxheW91dERpcmVjdGlvbikpIHsKICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5SSUdIVDoKICAgICAgICAgICAgICAgICAvLyBtVG90YWxMZW5ndGggY29udGFpbnMgdGhlIHBhZGRpbmcgYWxyZWFkeQogICAgICAgICAgICAgICAgIGNoaWxkTGVmdCA9IG1QYWRkaW5nTGVmdCArIG1SaWdodCAtIG1MZWZ0IC0gbVRvdGFsTGVuZ3RoOwpAQCAtMTYzMyw3ICsxNjUxLDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRHcmF2aXR5KGludCBncmF2aXR5KSB7CiAgICAgICAgIGlmIChtR3Jhdml0eSAhPSBncmF2aXR5KSB7CiAgICAgICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LlJFTEFUSVZFX0hPUklaT05UQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZ3Jhdml0eSB8PSBHcmF2aXR5LkJFRk9SRTsKKyAgICAgICAgICAgICAgICBncmF2aXR5IHw9IEdyYXZpdHkuU1RBUlQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoZ3Jhdml0eSAmIEdyYXZpdHkuVkVSVElDQUxfR1JBVklUWV9NQVNLKSA9PSAwKSB7CkBAIC0xNzI2LDggKzE3NDQsOCBAQAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5CT1RUT00sICAgICAgICAgICAgdG8gPSAiQk9UVE9NIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkxFRlQsICAgICAgICAgICAgICB0byA9ICJMRUZUIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LlJJR0hULCAgICAgICAgICAgICB0byA9ICJSSUdIVCIpLAotICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5CRUZPUkUsICAgICAgICAgICAgdG8gPSAiQkVGT1JFIiksCi0gICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkFGVEVSLCAgICAgICAgICAgICB0byA9ICJBRlRFUiIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5TVEFSVCwgICAgICAgICAgICB0byA9ICJTVEFSVCIpLAorICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5FTkQsICAgICAgICAgICAgIHRvID0gIkVORCIpLAogICAgICAgICAgICAgQFZpZXdEZWJ1Zy5JbnRUb1N0cmluZyhmcm9tID0gR3Jhdml0eS5DRU5URVJfVkVSVElDQUwsICAgdG8gPSAiQ0VOVEVSX1ZFUlRJQ0FMIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkZJTExfVkVSVElDQUwsICAgICB0byA9ICJGSUxMX1ZFUlRJQ0FMIiksCiAgICAgICAgICAgICBAVmlld0RlYnVnLkludFRvU3RyaW5nKGZyb20gPSBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCB0byA9ICJDRU5URVJfSE9SSVpPTlRBTCIpLApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1Byb2dyZXNzQmFyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQppbmRleCBlZDkxMTRhLi5iMmMzMDUxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUHJvZ3Jlc3NCYXIuamF2YQpAQCAtOTE1LDEwICs5MTUsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBoaWRlCisgICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNMYXlvdXRSdGwoRHJhd2FibGUgd2hvKSB7CisgICAgcHVibGljIGludCBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbihEcmF3YWJsZSB3aG8pIHsKICAgICAgICAgcmV0dXJuICh3aG8gPT0gbVByb2dyZXNzRHJhd2FibGUgfHwgd2hvID09IG1JbmRldGVybWluYXRlRHJhd2FibGUpID8KLSAgICAgICAgICAgIGlzTGF5b3V0UnRsKCkgOiBzdXBlci5pc0xheW91dFJ0bCh3aG8pOworICAgICAgICAgICAgZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSA6IHN1cGVyLmdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKHdobyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVsYXRpdmVMYXlvdXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCmluZGV4IGFjZDg1MzkuLmE1Y2Y2MmUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZWxhdGl2ZUxheW91dC5qYXZhCkBAIC0xNiw2ICsxNiwxNSBAQAogCiBwYWNrYWdlIGFuZHJvaWQud2lkZ2V0OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKQEAgLTMyLDE0ICs0MSw2IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVtb3RlVmlld3MuUmVtb3RlVmlldzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudXRpbC5Mb2cuZDsKIApAQCAtMjIyLDcgKzIyMyw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0R3Jhdml0eShpbnQgZ3Jhdml0eSkgewogICAgICAgICBpZiAobUdyYXZpdHkgIT0gZ3Jhdml0eSkgewogICAgICAgICAgICAgaWYgKChncmF2aXR5ICYgR3Jhdml0eS5SRUxBVElWRV9IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgPT0gMCkgewotICAgICAgICAgICAgICAgIGdyYXZpdHkgfD0gR3Jhdml0eS5CRUZPUkU7CisgICAgICAgICAgICAgICAgZ3Jhdml0eSB8PSBHcmF2aXR5LlNUQVJUOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LlZFUlRJQ0FMX0dSQVZJVFlfTUFTSykgPT0gMCkgewpAQCAtNDk0LDggKzQ5NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAtIG1QYWRkaW5nQm90dG9tKTsKIAogICAgICAgICAgICAgZmluYWwgUmVjdCBjb250ZW50Qm91bmRzID0gbUNvbnRlbnRCb3VuZHM7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKTsKICAgICAgICAgICAgIEdyYXZpdHkuYXBwbHkobUdyYXZpdHksIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wLCBzZWxmQm91bmRzLCBjb250ZW50Qm91bmRzLAotICAgICAgICAgICAgICAgICAgICBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0RGlyZWN0aW9uKTsKIAogICAgICAgICAgICAgZmluYWwgaW50IGhvcml6b250YWxPZmZzZXQgPSBjb250ZW50Qm91bmRzLmxlZnQgLSBsZWZ0OwogICAgICAgICAgICAgZmluYWwgaW50IHZlcnRpY2FsT2Zmc2V0ID0gY29udGVudEJvdW5kcy50b3AgLSB0b3A7CkBAIC0xNDQwLDYgKzE0NDIsNyBAQAogICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgcHJpdmF0ZSBOb2RlIG1OZXh0OworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1Bvb2xlZDsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dFBvb2xhYmxlKE5vZGUgZWxlbWVudCkgewogICAgICAgICAgICAgICAgIG1OZXh0ID0gZWxlbWVudDsKQEAgLTE0NDksNiArMTQ1MiwxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtTmV4dDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQb29sZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Jc1Bvb2xlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UG9vbGVkKGJvb2xlYW4gaXNQb29sZWQpIHsKKyAgICAgICAgICAgICAgICBtSXNQb29sZWQgPSBpc1Bvb2xlZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3RhdGljIE5vZGUgYWNxdWlyZShWaWV3IHZpZXcpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBOb2RlIG5vZGUgPSBzUG9vbC5hY3F1aXJlKCk7CiAgICAgICAgICAgICAgICAgbm9kZS52aWV3ID0gdmlldzsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9SZW1vdGVWaWV3c0FkYXB0ZXIuamF2YQppbmRleCA0MGIwYTljLi40YzQ3ZDM3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvUmVtb3RlVmlld3NBZGFwdGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1JlbW90ZVZpZXdzQWRhcHRlci5qYXZhCkBAIC03MTEsNiArNzExLDE3IEBACiAgICAgICAgIHJlcXVlc3RCaW5kU2VydmljZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobVdvcmtlclRocmVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVdvcmtlclRocmVhZC5xdWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGxvYWROZXh0SW5kZXhJbkJhY2tncm91bmQoKSB7CiAgICAgICAgIG1Xb3JrZXJRdWV1ZS5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TZWFyY2hWaWV3LmphdmEKaW5kZXggOTkzM2Q2OC4uNTg2ZWNlOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NlYXJjaFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU2VhcmNoVmlldy5qYXZhCkBAIC05Myw2ICs5Myw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG1DbGVhcmluZ0ZvY3VzOwogICAgIHByaXZhdGUgaW50IG1NYXhXaWR0aDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVZvaWNlQnV0dG9uRW5hYmxlZDsKKyAgICBwcml2YXRlIENoYXJTZXF1ZW5jZSBtVXNlclF1ZXJ5OwogCiAgICAgcHJpdmF0ZSBTZWFyY2hhYmxlSW5mbyBtU2VhcmNoYWJsZTsKICAgICBwcml2YXRlIEJ1bmRsZSBtQXBwU2VhcmNoRGF0YTsKQEAgLTM3Miw2ICszNzMsNyBAQAogICAgICAgICBtUXVlcnlUZXh0Vmlldy5zZXRUZXh0KHF1ZXJ5KTsKICAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKICAgICAgICAgICAgIG1RdWVyeVRleHRWaWV3LnNldFNlbGVjdGlvbihxdWVyeS5sZW5ndGgoKSk7CisgICAgICAgICAgICBtVXNlclF1ZXJ5ID0gcXVlcnk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB0aGUgcXVlcnkgaXMgbm90IGVtcHR5IGFuZCBzdWJtaXQgaXMgcmVxdWVzdGVkLCBzdWJtaXQgdGhlIHF1ZXJ5CkBAIC04ODUsNiArODg3LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBuZXdUZXh0KSB7CiAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbVF1ZXJ5VGV4dFZpZXcuZ2V0VGV4dCgpOworICAgICAgICBtVXNlclF1ZXJ5ID0gdGV4dDsKICAgICAgICAgYm9vbGVhbiBoYXNUZXh0ID0gIVRleHRVdGlscy5pc0VtcHR5KHRleHQpOwogICAgICAgICBpZiAoaXNTdWJtaXRCdXR0b25FbmFibGVkKCkpIHsKICAgICAgICAgICAgIHVwZGF0ZVN1Ym1pdEJ1dHRvbihoYXNUZXh0KTsKQEAgLTExMjQsNyArMTEyNyw3IEBACiAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKICAgICAgICAgICAgIGludGVudC5zZXREYXRhKGRhdGEpOwogICAgICAgICB9Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShTZWFyY2hNYW5hZ2VyLlVTRVJfUVVFUlksIHF1ZXJ5KTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFNlYXJjaE1hbmFnZXIuVVNFUl9RVUVSWSwgbVVzZXJRdWVyeSk7CiAgICAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoU2VhcmNoTWFuYWdlci5RVUVSWSwgcXVlcnkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3BhY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGFjZS5qYXZhCmluZGV4IGQ5OGI5MzcuLmQ3YjJlYzIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGFjZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGFjZS5qYXZhCkBAIC03Miw0ICs3MiwzNSBAQAogICAgIHB1YmxpYyB2b2lkIHNldExheW91dFBhcmFtcyhWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHBhcmFtcykgewogICAgICAgICBzdXBlci5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRvOiB7QGxpbmsgVmlldyNnZXREZWZhdWx0U2l6ZShpbnQsIGludCl9CisgICAgICogSWYgbW9kZSBpcyBBVF9NT1NULCByZXR1cm4gdGhlIGNoaWxkIHNpemUgaW5zdGVhZCBvZiB0aGUgcGFyZW50IHNpemUKKyAgICAgKiAodW5sZXNzIGl0IGlzIHRvbyBiaWcpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXREZWZhdWx0U2l6ZTIoaW50IHNpemUsIGludCBtZWFzdXJlU3BlYykgeworICAgICAgICBpbnQgcmVzdWx0ID0gc2l6ZTsKKyAgICAgICAgaW50IHNwZWNNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShtZWFzdXJlU3BlYyk7CisgICAgICAgIGludCBzcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUobWVhc3VyZVNwZWMpOworCisgICAgICAgIHN3aXRjaCAoc3BlY01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBNYXRoLm1pbihzaXplLCBzcGVjU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3BlY1NpemU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgeworICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbigKKyAgICAgICAgICAgICAgICBnZXREZWZhdWx0U2l6ZTIoZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoKCksIHdpZHRoTWVhc3VyZVNwZWMpLAorICAgICAgICAgICAgICAgIGdldERlZmF1bHRTaXplMihnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0KCksIGhlaWdodE1lYXN1cmVTcGVjKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N3aXRjaC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N3aXRjaC5qYXZhCmluZGV4IGNkNGI3MzIuLmI3NTY1ZjMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Td2l0Y2guamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3dpdGNoLmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIAogcGFja2FnZSBhbmRyb2lkLndpZGdldDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbG9yU3RhdGVMaXN0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwpAQCAtMzcsNiArMzUsOCBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5WZWxvY2l0eVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdDb25maWd1cmF0aW9uOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKwogLyoqCiAgKiBBIFN3aXRjaCBpcyBhIHR3by1zdGF0ZSB0b2dnbGUgc3dpdGNoIHdpZGdldCB0aGF0IGNhbiBzZWxlY3QgYmV0d2VlbiB0d28KICAqIG9wdGlvbnMuIFRoZSB1c2VyIG1heSBkcmFnIHRoZSAidGh1bWIiIGJhY2sgYW5kIGZvcnRoIHRvIGNob29zZSB0aGUgc2VsZWN0ZWQgb3B0aW9uLApAQCAtODQsNiArODQsNyBAQAogICAgIHByaXZhdGUgTGF5b3V0IG1PbkxheW91dDsKICAgICBwcml2YXRlIExheW91dCBtT2ZmTGF5b3V0OwogCisgICAgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpCiAgICAgcHJpdmF0ZSBmaW5hbCBSZWN0IG1UZW1wUmVjdCA9IG5ldyBSZWN0KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKQEAgLTM4Niw3ICszODcsNyBAQAogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewogICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHggPSBldi5nZXRYKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgeSA9IGV2LmdldFkoKTsKLSAgICAgICAgICAgICAgICBpZiAoaGl0VGh1bWIoeCwgeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKCkgJiYgaGl0VGh1bWIoeCwgeSkpIHsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoTW9kZSA9IFRPVUNIX01PREVfRE9XTjsKICAgICAgICAgICAgICAgICAgICAgbVRvdWNoWCA9IHg7CiAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaFkgPSB5OwpAQCAtNDU5LDcgKzQ2MCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHN0b3BEcmFnKE1vdGlvbkV2ZW50IGV2KSB7CiAgICAgICAgIG1Ub3VjaE1vZGUgPSBUT1VDSF9NT0RFX0lETEU7Ci0gICAgICAgIGJvb2xlYW4gY29tbWl0Q2hhbmdlID0gZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQOworICAgICAgICAvLyBVcCBhbmQgbm90IGNhbmNlbGVkLCBhbHNvIGNoZWNrcyB0aGUgc3dpdGNoIGhhcyBub3QgYmVlbiBkaXNhYmxlZCBkdXJpbmcgdGhlIGRyYWcKKyAgICAgICAgYm9vbGVhbiBjb21taXRDaGFuZ2UgPSBldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgaXNFbmFibGVkKCk7CiAKICAgICAgICAgY2FuY2VsU3VwZXJUb3VjaChldik7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJXaWRnZXQuamF2YQppbmRleCAxZmUxZjc5Li4zZDFkZWRjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGFiV2lkZ2V0LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYldpZGdldC5qYXZhCkBAIC01MTQsNiArNTE0LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWxsVmlld3MoKSB7CisgICAgICAgIHN1cGVyLnJlbW92ZUFsbFZpZXdzKCk7CisgICAgICAgIG1TZWxlY3RlZFRhYiA9IC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRVbmNoZWNrZWQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIC8vIHRoaXMgY2xhc3MgZmlyZXMgZXZlbnRzIG9ubHkgd2hlbiB0YWJzIGFyZSBmb2N1c2VkIG9yIHNlbGVjdGVkCiAgICAgICAgIGlmIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0ZPQ1VTRUQgJiYgaXNGb2N1c2VkKCkpIHsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UYWJsZVJvdy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlUm93LmphdmEKaW5kZXggNWYyMGM4NS4uM2ZkNDYzMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlUm93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RhYmxlUm93LmphdmEKQEAgLTIyNCw3ICsyMjQsOCBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwogICAgICAgICAgICAgICAgIGxwLm1PZmZzZXRbTGF5b3V0UGFyYW1zLkxPQ0FUSU9OX05FWFRdID0gY29sdW1uV2lkdGggLSBjaGlsZFdpZHRoOwogCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KGdyYXZpdHksIGlzTGF5b3V0UnRsKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBhYnNvbHV0ZUdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShncmF2aXR5LCBsYXlvdXREaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuTEVGVDoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IG9mZnNldCBvbiBYIGF4aXMKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9UZXh0Vmlldy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKaW5kZXggYTczYTZjZi4uMDJjMmI4ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEKQEAgLTExMyw2ICsxMTMsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQmFzZUlucHV0Q29ubmVjdGlvbjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuQ29tcGxldGlvbkluZm87CkBAIC0yMDk0LDcgKzIwOTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEdyYXZpdHkoaW50IGdyYXZpdHkpIHsKICAgICAgICAgaWYgKChncmF2aXR5ICYgR3Jhdml0eS5SRUxBVElWRV9IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgPT0gMCkgewotICAgICAgICAgICAgZ3Jhdml0eSB8PSBHcmF2aXR5LkJFRk9SRTsKKyAgICAgICAgICAgIGdyYXZpdHkgfD0gR3Jhdml0eS5TVEFSVDsKICAgICAgICAgfQogICAgICAgICBpZiAoKGdyYXZpdHkgJiBHcmF2aXR5LlZFUlRJQ0FMX0dSQVZJVFlfTUFTSykgPT0gMCkgewogICAgICAgICAgICAgZ3Jhdml0eSB8PSBHcmF2aXR5LlRPUDsKQEAgLTI1NjUsNiArMjU2Niw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNwLnJlbW92ZVNwYW4oY3cpOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIC8vIGhpZGVDb250cm9sbGVycyB3b3VsZCBkbyBpdCwgYnV0IGl0IGdldHMgY2FsbGVkIGFmdGVyIHRoaXMgbWV0aG9kIG9uIHJvdGF0aW9uCisgICAgICAgICAgICAgICAgc3AucmVtb3ZlU3BhbihtU3VnZ2VzdGlvblJhbmdlU3Bhbik7CisKICAgICAgICAgICAgICAgICBzcy50ZXh0ID0gc3A7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNzLnRleHQgPSBtVGV4dC50b1N0cmluZygpOwpAQCAtNDE0MSwxNSArNDE0NSwyMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xheW91dFJ0bChEcmF3YWJsZSB3aG8pIHsKLSAgICAgICAgaWYgKHdobyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZpbmFsIFRleHRWaWV3LkRyYXdhYmxlcyBkcmF3YWJsZXMgPSBtRHJhd2FibGVzOwotICAgICAgICBpZiAod2hvID09IGRyYXdhYmxlcy5tRHJhd2FibGVMZWZ0IHx8IHdobyA9PSBkcmF3YWJsZXMubURyYXdhYmxlUmlnaHQgfHwKLSAgICAgICAgICAgIHdobyA9PSBkcmF3YWJsZXMubURyYXdhYmxlVG9wIHx8IHdobyA9PSBkcmF3YWJsZXMubURyYXdhYmxlQm90dG9tKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNMYXlvdXRSdGwoKTsKKyAgICBwdWJsaWMgaW50IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKERyYXdhYmxlIHdobykgeworICAgICAgICBpZiAod2hvID09IG51bGwpIHJldHVybiBWaWV3LkxBWU9VVF9ESVJFQ1RJT05fTFRSOworICAgICAgICBpZiAobURyYXdhYmxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBEcmF3YWJsZXMgZHJhd2FibGVzID0gbURyYXdhYmxlczsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gZHJhd2FibGVzLm1EcmF3YWJsZUxlZnQgfHwgd2hvID09IGRyYXdhYmxlcy5tRHJhd2FibGVSaWdodCB8fAorICAgICAgICAgICAgICAgIHdobyA9PSBkcmF3YWJsZXMubURyYXdhYmxlVG9wIHx8IHdobyA9PSBkcmF3YWJsZXMubURyYXdhYmxlQm90dG9tKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmlzTGF5b3V0UnRsKHdobyk7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXNvbHZlZExheW91dERpcmVjdGlvbih3aG8pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNDM5MSw3ICs0NDAwLDggQEAKICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoY29tcG91bmRQYWRkaW5nTGVmdCwgZXh0ZW5kZWRQYWRkaW5nVG9wICsgdm9mZnNldFRleHQpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBpc0xheW91dFJ0bCgpKTsKKyAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCk7CisgICAgICAgIGZpbmFsIGludCBhYnNvbHV0ZUdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShtR3Jhdml0eSwgbGF5b3V0RGlyZWN0aW9uKTsKICAgICAgICAgaWYgKG1FbGxpcHNpemUgPT0gVGV4dFV0aWxzLlRydW5jYXRlQXQuTUFSUVVFRSkgewogICAgICAgICAgICAgaWYgKCFtU2luZ2xlTGluZSAmJiBnZXRMaW5lQ291bnQoKSA9PSAxICYmIGNhbk1hcnF1ZWUoKSAmJgogICAgICAgICAgICAgICAgICAgICAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgIT0gR3Jhdml0eS5MRUZUKSB7CkBAIC01NTM5LDggKzU1NDksMTAgQEAKICAgICAgICAgICAgIGhpbnRXaWR0aCA9IDA7CiAgICAgICAgIH0KIAorICAgICAgICBmaW5hbCBpbnQgbGF5b3V0RGlyZWN0aW9uID0gZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKTsKKyAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBsYXlvdXREaXJlY3Rpb24pOworCiAgICAgICAgIExheW91dC5BbGlnbm1lbnQgYWxpZ25tZW50OwotICAgICAgICBmaW5hbCBpbnQgYWJzb2x1dGVHcmF2aXR5ID0gR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkobUdyYXZpdHksIGlzTGF5b3V0UnRsKCkpOwogICAgICAgICBzd2l0Y2ggKGFic29sdXRlR3Jhdml0eSAmIEdyYXZpdHkuSE9SSVpPTlRBTF9HUkFWSVRZX01BU0spIHsKICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTDoKICAgICAgICAgICAgICAgICBhbGlnbm1lbnQgPSBMYXlvdXQuQWxpZ25tZW50LkFMSUdOX0NFTlRFUjsKQEAgLTc1NzYsNyArNzU4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjBmOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0TGluZUNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhYnNvbHV0ZUdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShtR3Jhdml0eSwgaXNMYXlvdXRSdGwoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBsYXlvdXREaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuTEVGVDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjBmOwpAQCAtNzYwMCw3ICs3NjEzLDggQEAKICAgICAgICAgICAgICAgICBmaW5hbCBNYXJxdWVlIG1hcnF1ZWUgPSBtTWFycXVlZTsKICAgICAgICAgICAgICAgICByZXR1cm4gKG1hcnF1ZWUubU1heEZhZGVTY3JvbGwgLSBtYXJxdWVlLm1TY3JvbGwpIC8gZ2V0SG9yaXpvbnRhbEZhZGluZ0VkZ2VMZW5ndGgoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0TGluZUNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhYnNvbHV0ZUdyYXZpdHkgPSBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShtR3Jhdml0eSwgaXNMYXlvdXRSdGwoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGFic29sdXRlR3Jhdml0eSA9IEdyYXZpdHkuZ2V0QWJzb2x1dGVHcmF2aXR5KG1HcmF2aXR5LCBsYXlvdXREaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoYWJzb2x1dGVHcmF2aXR5ICYgR3Jhdml0eS5IT1JJWk9OVEFMX0dSQVZJVFlfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEdyYXZpdHkuTEVGVDoKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0ZXh0V2lkdGggPSAobVJpZ2h0IC0gbUxlZnQpIC0gZ2V0Q29tcG91bmRQYWRkaW5nTGVmdCgpIC0KQEAgLTc2NDIsNyArNzY1NiwxOCBAQAogICAgIHByb3RlY3RlZCBpbnQgY29tcHV0ZVZlcnRpY2FsU2Nyb2xsRXh0ZW50KCkgewogICAgICAgICByZXR1cm4gZ2V0SGVpZ2h0KCkgLSBnZXRDb21wb3VuZFBhZGRpbmdUb3AoKSAtIGdldENvbXBvdW5kUGFkZGluZ0JvdHRvbSgpOwogICAgIH0KLSAgICAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbmRWaWV3c1dpdGhUZXh0KEFycmF5TGlzdDxWaWV3PiBvdXRWaWV3cywgQ2hhclNlcXVlbmNlIHRleHQpIHsKKyAgICAgICAgQ2hhclNlcXVlbmNlIHRoaXNUZXh0ID0gZ2V0VGV4dCgpOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkodGhpc1RleHQpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXNUZXh0LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyh0ZXh0KSkgeworICAgICAgICAgICAgb3V0Vmlld3MuYWRkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIGVudW0gQnVmZmVyVHlwZSB7CiAgICAgICAgIE5PUk1BTCwgU1BBTk5BQkxFLCBFRElUQUJMRSwKICAgICB9CkBAIC03ODk0LDYgKzc5MTksMTcgQEAKICAgICAgICAgZXZlbnQuc2V0UGFzc3dvcmQoaXNQYXNzd29yZCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25Jbml0aWFsaXplQWNjZXNzaWJpbGl0eU5vZGVJbmZvKEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvKSB7CisgICAgICAgIHN1cGVyLm9uSW5pdGlhbGl6ZUFjY2Vzc2liaWxpdHlOb2RlSW5mbyhpbmZvKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGlzUGFzc3dvcmQgPSBoYXNQYXNzd29yZFRyYW5zZm9ybWF0aW9uTWV0aG9kKCk7CisgICAgICAgIGlmICghaXNQYXNzd29yZCkgeworICAgICAgICAgICAgaW5mby5zZXRUZXh0KGdldFRleHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaW5mby5zZXRQYXNzd29yZChpc1Bhc3N3b3JkKTsKKyAgICB9CisKICAgICB2b2lkIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnRUeXBlVmlld1RleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBiZWZvcmVUZXh0LAogICAgICAgICAgICAgaW50IGZyb21JbmRleCwgaW50IHJlbW92ZWRDb3VudCwgaW50IGFkZGVkQ291bnQpIHsKICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0KQEAgLTg1MzgsMTEgKzg1NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZ2luYWxUZXh0ID0gbVRleHQuc3ViU2VxdWVuY2Uoc3BhblN0YXJ0LCBzcGFuRW5kKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAoKEVkaXRhYmxlKSBtVGV4dCkucmVwbGFjZShzcGFuU3RhcnQsIHNwYW5FbmQsIHN1Z2dlc3Rpb24pOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIFN3YXAgdGV4dCBjb250ZW50IGJldHdlZW4gYWN0dWFsIHRleHQgYW5kIFN1Z2dlc3Rpb24gc3BhbgotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25JbmZvLnN1Z2dlc3Rpb25TcGFuLmdldFN1Z2dlc3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zW3N1Z2dlc3Rpb25JbmZvLnN1Z2dlc3Rpb25JbmRleF0gPSBvcmlnaW5hbFRleHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IHNvdXJjZSBJTUUgb2YgdGhlIHN1Z2dlc3Rpb24gcGljaworICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgc291cmNlIElNRSBvZiB0aGUgc3VnZ2VzdGlvbiBwaWNrLiBEbyB0aGlzIGJlZm9yZSBzd2FwaW5nIHRleHRzLgogICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25JbmZvLnN1Z2dlc3Rpb25TcGFuLmdldE5vdGlmaWNhdGlvblRhcmdldENsYXNzTmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IElucHV0TWV0aG9kTWFuYWdlci5wZWVrSW5zdGFuY2UoKTsKQEAgLTg1NTAsNiArODU4MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWdnZXN0aW9uSW5mby5zdWdnZXN0aW9uSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgLy8gU3dhcCB0ZXh0IGNvbnRlbnQgYmV0d2VlbiBhY3R1YWwgdGV4dCBhbmQgU3VnZ2VzdGlvbiBzcGFuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbkluZm8uc3VnZ2VzdGlvblNwYW4uZ2V0U3VnZ2VzdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNbc3VnZ2VzdGlvbkluZm8uc3VnZ2VzdGlvbkluZGV4XSA9IG9yaWdpbmFsVGV4dDsKKwogICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIFN1Z2dlc3Rpb25TcGFucwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IHN1Z2dlc3Rpb24ubGVuZ3RoKCkgLSAoc3BhbkVuZCAtIHNwYW5TdGFydCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTg3MTAsMTAgKzg3NDYsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gY3VycmVudFdvcmRTZWxlY3RlZCA9IHNlbGVjdEN1cnJlbnRXb3JkKCk7Ci0gICAgICAgIGlmICghY3VycmVudFdvcmRTZWxlY3RlZCkgewotICAgICAgICAgICAgLy8gTm8gd29yZCBmb3VuZCB1bmRlciBjdXJzb3Igb3IgdGV4dCBzZWxlY3Rpb24gbm90IHBlcm1pdHRlZC4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFoYXNTZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgLy8gVGhlcmUgbWF5IGFscmVhZHkgYmUgYSBzZWxlY3Rpb24gb24gZGV2aWNlIHJvdGF0aW9uCisgICAgICAgICAgICBib29sZWFuIGN1cnJlbnRXb3JkU2VsZWN0ZWQgPSBzZWxlY3RDdXJyZW50V29yZCgpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50V29yZFNlbGVjdGVkKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gd29yZCBmb3VuZCB1bmRlciBjdXJzb3Igb3IgdGV4dCBzZWxlY3Rpb24gbm90IHBlcm1pdHRlZC4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBBY3Rpb25Nb2RlLkNhbGxiYWNrIGFjdGlvbk1vZGVDYWxsYmFjayA9IG5ldyBTZWxlY3Rpb25BY3Rpb25Nb2RlQ2FsbGJhY2soKTsKQEAgLTg3ODUsMTAgKzg4MjQsMjIgQEAKICAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CiAgICAgICAgICAgICBUeXBlZEFycmF5IHN0eWxlZEF0dHJpYnV0ZXMgPSBtQ29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKFIuc3R5bGVhYmxlLlRoZW1lKTsKIAotICAgICAgICAgICAgbW9kZS5zZXRUaXRsZShtQ29udGV4dC5nZXRTdHJpbmcoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudGV4dFNlbGVjdGlvbkNBQlRpdGxlKSk7CisgICAgICAgICAgICBib29sZWFuIGFsbG93VGV4dCA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuYWxsb3dfYWN0aW9uX21lbnVfaXRlbV90ZXh0X3dpdGhfaWNvbik7CisKKyAgICAgICAgICAgIG1vZGUuc2V0VGl0bGUoYWxsb3dUZXh0ID8gCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy50ZXh0U2VsZWN0aW9uQ0FCVGl0bGUpIDogbnVsbCk7CiAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKG51bGwpOwogCisgICAgICAgICAgICBpbnQgc2VsZWN0QWxsSWNvbklkID0gMDsgLy8gTm8gaWNvbiBieSBkZWZhdWx0CisgICAgICAgICAgICBpZiAoIWFsbG93VGV4dCkgeworICAgICAgICAgICAgICAgIC8vIFByb3ZpZGUgYW4gaWNvbiwgdGV4dCB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQgb24gc21hbGxlciBzY3JlZW5zLgorICAgICAgICAgICAgICAgIHNlbGVjdEFsbEljb25JZCA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0UmVzb3VyY2VJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLlRoZW1lX2FjdGlvbk1vZGVTZWxlY3RBbGxEcmF3YWJsZSwgMCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1lbnUuYWRkKDAsIElEX1NFTEVDVF9BTEwsIDAsIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnNlbGVjdEFsbCkuCisgICAgICAgICAgICAgICAgICAgIHNldEljb24oc2VsZWN0QWxsSWNvbklkKS4KICAgICAgICAgICAgICAgICAgICAgc2V0QWxwaGFiZXRpY1Nob3J0Y3V0KCdhJykuCiAgICAgICAgICAgICAgICAgICAgIHNldFNob3dBc0FjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9BTFdBWVMgfCBNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9XSVRIX1RFWFQpOwpAQCAtOTAxNyw2ICs5MDY4LDggQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbnRhaW5lclBvc2l0aW9uWCwgbUNvbnRhaW5lclBvc2l0aW9uWTsKICAgICAgICAgLy8gVmlzaWJsZSBvciBub3QgKHNjcm9sbGVkIG9mZiBzY3JlZW4pLCB3aGV0aGVyIG9yIG5vdCB0aGlzIGhhbmRsZSBzaG91bGQgYmUgdmlzaWJsZQogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWN0aXZlID0gZmFsc2U7CisgICAgICAgIC8vIFVzZWQgdG8gZGV0ZWN0IHRoYXQgc2V0RnJhbWUgd2FzIGNhbGxlZAorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRzVXBkYXRlID0gdHJ1ZTsKIAogICAgICAgICBwdWJsaWMgSGFuZGxlVmlldygpIHsKICAgICAgICAgICAgIHN1cGVyKFRleHRWaWV3LnRoaXMubUNvbnRleHQpOwpAQCAtOTAzNCw2ICs5MDg3LDE1IEBACiAgICAgICAgICAgICBtSWRlYWxWZXJ0aWNhbE9mZnNldCA9IDAuN2YgKiBoYW5kbGVIZWlnaHQ7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2V0RnJhbWUoaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgeworICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gc3VwZXIuc2V0RnJhbWUobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgICAgIC8vIG9uUHJlRHJhdyBpcyBjYWxsZWQgZm9yIFBob25lV2luZG93IGJlZm9yZSB0aGUgbGF5b3V0IG9mIHRoaXMgdmlldyBpcworICAgICAgICAgICAgLy8gcGVyZm9ybWVkLiBNYWtlIHN1cmUgdG8gdXBkYXRlIHBvc2l0aW9uLCBldmVuIGlmIGNvbnRhaW5lciBkaWRuJ3QgbW92ZS4KKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSBtTmVlZHNVcGRhdGUgID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICB9CisKICAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdERyYXdhYmxlKCk7CiAKICAgICAgICAgLy8gVG91Y2gtdXAgZmlsdGVyOiBudW1iZXIgb2YgcHJldmlvdXMgcG9zaXRpb25zIHJlbWVtYmVyZWQKQEAgLTkxNjMsNiArOTIyNSwxMyBAQAogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KTsKIAogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3NpdGlvbkF0Q3Vyc29yT2Zmc2V0KGludCBvZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIEEgSGFuZGxlVmlldyByZWxpZXMgb24gdGhlIGxheW91dCwgd2hpY2ggbWF5IGJlIG51bGxlZCBieSBleHRlcm5hbCBtZXRob2RzLgorICAgICAgICAgICAgaWYgKG1MYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFdpbGwgdXBkYXRlIGNvbnRyb2xsZXJzJyBzdGF0ZSwgaGlkaW5nIHRoZW0gYW5kIHN0b3BwaW5nIHNlbGVjdGlvbiBtb2RlIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHByZXBhcmVDdXJzb3JDb250cm9sbGVycygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYWRkUG9zaXRpb25Ub1RvdWNoVXBGaWx0ZXIob2Zmc2V0KTsKICAgICAgICAgICAgIGZpbmFsIGludCBsaW5lID0gbUxheW91dC5nZXRMaW5lRm9yT2Zmc2V0KG9mZnNldCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgbGluZUJvdHRvbSA9IG1MYXlvdXQuZ2V0TGluZUJvdHRvbShsaW5lKTsKQEAgLTkxNzUsNyArOTI0NCw3IEBACiAgICAgICAgICAgICBtUG9zaXRpb25ZICs9IHZpZXdwb3J0VG9Db250ZW50VmVydGljYWxPZmZzZXQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCkgeworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JDb250YWluZXJQb3NpdGlvbkNoYW5nZSgpIHsKICAgICAgICAgICAgIHBvc2l0aW9uQXRDdXJzb3JPZmZzZXQoZ2V0Q3VycmVudEN1cnNvck9mZnNldCgpKTsKIAogICAgICAgICAgICAgZmluYWwgaW50IHByZXZpb3VzQ29udGFpbmVyUG9zaXRpb25YID0gbUNvbnRhaW5lclBvc2l0aW9uWDsKQEAgLTkxODUsMTIgKzkyNTQsMTMgQEAKICAgICAgICAgICAgIG1Db250YWluZXJQb3NpdGlvblggPSBtVGVtcENvb3Jkc1swXSArIG1Qb3NpdGlvblg7CiAgICAgICAgICAgICBtQ29udGFpbmVyUG9zaXRpb25ZID0gbVRlbXBDb29yZHNbMV0gKyBtUG9zaXRpb25ZOwogCi0gICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzQ29udGFpbmVyUG9zaXRpb25YICE9IG1Db250YWluZXJQb3NpdGlvblggfHwKLSAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNDb250YWluZXJQb3NpdGlvblkgIT0gbUNvbnRhaW5lclBvc2l0aW9uWSk7CisgICAgICAgICAgICBtTmVlZHNVcGRhdGUgfD0gcHJldmlvdXNDb250YWluZXJQb3NpdGlvblggIT0gbUNvbnRhaW5lclBvc2l0aW9uWDsKKyAgICAgICAgICAgIG1OZWVkc1VwZGF0ZSB8PSBwcmV2aW91c0NvbnRhaW5lclBvc2l0aW9uWSAhPSBtQ29udGFpbmVyUG9zaXRpb25ZOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gb25QcmVEcmF3KCkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uKCkpIHsKKyAgICAgICAgICAgIGNoZWNrRm9yQ29udGFpbmVyUG9zaXRpb25DaGFuZ2UoKTsKKyAgICAgICAgICAgIGlmIChtTmVlZHNVcGRhdGUpIHsKICAgICAgICAgICAgICAgICBpZiAobUlzRHJhZ2dpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1UZW1wQ29vcmRzWzBdICE9IG1MYXN0UGFyZW50WCB8fCBtVGVtcENvb3Jkc1sxXSAhPSBtTGFzdFBhcmVudFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaFRvV2luZG93T2Zmc2V0WCArPSBtVGVtcENvb3Jkc1swXSAtIG1MYXN0UGFyZW50WDsKQEAgLTkyMTQsNiArOTI4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU5lZWRzVXBkYXRlID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtOTI5NCw3ICs5MzY1LDYgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQ0VOVF9DVVRfQ09QWV9EVVJBVElPTiA9IDE1ICogMTAwMDsgLy8gc2Vjb25kcwogCiAgICAgICAgIC8vIFVzZWQgdG8gZGV0ZWN0IHRhcHMgb24gdGhlIGluc2VydGlvbiBoYW5kbGUsIHdoaWNoIHdpbGwgYWZmZWN0IHRoZSBQYXN0ZVBvcHVwV2luZG93Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtVG91Y2hUaW1lcjsKICAgICAgICAgcHJpdmF0ZSBmbG9hdCBtRG93blBvc2l0aW9uWCwgbURvd25Qb3NpdGlvblk7CiAgICAgICAgIHByaXZhdGUgUGFzdGVQb3B1cFdpbmRvdyBtUGFzdGVQb3B1cFdpbmRvdzsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBtSGlkZXI7CkBAIC05MzY4LDIyICs5NDM4LDE4IEBACiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKICAgICAgICAgICAgICAgICAgICAgbURvd25Qb3NpdGlvblggPSBldi5nZXRSYXdYKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Eb3duUG9zaXRpb25ZID0gZXYuZ2V0UmF3WSgpOwotICAgICAgICAgICAgICAgICAgICBtVG91Y2hUaW1lciA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgotICAgICAgICAgICAgICAgICAgICBsb25nIGRlbGF5ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtVG91Y2hUaW1lcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5IDwgVmlld0NvbmZpZ3VyYXRpb24uZ2V0VGFwVGltZW91dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBkZWx0YVggPSBtRG93blBvc2l0aW9uWCAtIGV2LmdldFJhd1goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRlbHRhWSA9IG1Eb3duUG9zaXRpb25ZIC0gZXYuZ2V0UmF3WSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgZGlzdGFuY2VTcXVhcmVkID0gZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlU3F1YXJlZCA8IG1TcXVhcmVkVG91Y2hTbG9wRGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBhc3RlUG9wdXBXaW5kb3cgIT0gbnVsbCAmJiBtUGFzdGVQb3B1cFdpbmRvdy5pc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXBwaW5nIG9uIHRoZSBoYW5kbGUgZGlzbWlzc2VzIHRoZSBkaXNwbGF5ZWQgcGFzdGUgdmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhc3RlUG9wdXBXaW5kb3cuaGlkZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3coMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBkZWx0YVggPSBtRG93blBvc2l0aW9uWCAtIGV2LmdldFJhd1goKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgZGVsdGFZID0gbURvd25Qb3NpdGlvblkgLSBldi5nZXRSYXdZKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGRpc3RhbmNlU3F1YXJlZCA9IGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlU3F1YXJlZCA8IG1TcXVhcmVkVG91Y2hTbG9wRGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGFzdGVQb3B1cFdpbmRvdyAhPSBudWxsICYmIG1QYXN0ZVBvcHVwV2luZG93LmlzU2hvd2luZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFwcGluZyBvbiB0aGUgaGFuZGxlIGRpc21pc3NlcyB0aGUgZGlzcGxheWVkIHBhc3RlIHZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhc3RlUG9wdXBXaW5kb3cuaGlkZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGhpZGVEZWxheWVkKCk7CkBAIC05OTg2LDcgKzEwMDUyLDcgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbVNlbGVjdEFsbE9uRm9jdXMgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgbUdyYXZpdHkgPSBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuTEVGVDsKKyAgICBwcml2YXRlIGludCAgICAgICAgICAgICAgICAgICAgIG1HcmF2aXR5ID0gR3Jhdml0eS5UT1AgfCBHcmF2aXR5LlNUQVJUOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgbUhvcml6b250YWxseVNjcm9sbGluZzsKIAogICAgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1dG9MaW5rTWFzazsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWN0aW9uQmFySW1wbC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEKaW5kZXggNmNmZWI4Ny4uOGQ1ZGY2ZiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BY3Rpb25CYXJJbXBsLmphdmEKQEAgLTE1Niw5ICsxNTYsNyBAQAogICAgICAgICBtQ29udGV4dERpc3BsYXlNb2RlID0gbUFjdGlvblZpZXcuaXNTcGxpdEFjdGlvbkJhcigpID8KICAgICAgICAgICAgICAgICBDT05URVhUX0RJU1BMQVlfU1BMSVQgOiBDT05URVhUX0RJU1BMQVlfTk9STUFMOwogCi0gICAgICAgIFR5cGVkQXJyYXkgYSA9IG1Db250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMobnVsbCwgUi5zdHlsZWFibGUuQWN0aW9uQmFyKTsKLSAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaGVpZ2h0LCAwKTsKLSAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gbUFjdGlvblZpZXcuZ2V0Q29udGVudEhlaWdodCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKQEAgLTE3OSw5ICsxNzcsNyBAQAogICAgICAgICBtQWN0aW9uVmlldy5zZXRDb2xsYXBzYWJsZSghbUhhc0VtYmVkZGVkVGFicyAmJgogICAgICAgICAgICAgICAgIGdldE5hdmlnYXRpb25Nb2RlKCkgPT0gTkFWSUdBVElPTl9NT0RFX1RBQlMpOwogCi0gICAgICAgIFR5cGVkQXJyYXkgYSA9IG1Db250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMobnVsbCwgUi5zdHlsZWFibGUuQWN0aW9uQmFyKTsKLSAgICAgICAgbUNvbnRlbnRIZWlnaHQgPSBhLmdldExheW91dERpbWVuc2lvbihSLnN0eWxlYWJsZS5BY3Rpb25CYXJfaGVpZ2h0LCAwKTsKLSAgICAgICAgYS5yZWN5Y2xlKCk7CisgICAgICAgIG1Db250ZW50SGVpZ2h0ID0gbUFjdGlvblZpZXcuZ2V0Q29udGVudEhlaWdodCgpOwogCiAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQgPSBtQ29udGVudEhlaWdodDsKQEAgLTM2MiwxMyArMzU4LDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ29udGV4dFZpZXcua2lsbE1vZGUoKTsKLSAgICAgICAgQWN0aW9uTW9kZSBtb2RlID0gbmV3IEFjdGlvbk1vZGVJbXBsKGNhbGxiYWNrKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrLm9uQ3JlYXRlQWN0aW9uTW9kZShtb2RlLCBtb2RlLmdldE1lbnUoKSkpIHsKKyAgICAgICAgQWN0aW9uTW9kZUltcGwgbW9kZSA9IG5ldyBBY3Rpb25Nb2RlSW1wbChjYWxsYmFjayk7CisgICAgICAgIGlmIChtb2RlLmRpc3BhdGNoT25DcmVhdGUoKSkgewogICAgICAgICAgICAgbVdhc0hpZGRlbkJlZm9yZU1vZGUgPSAhaXNTaG93aW5nKCk7CiAgICAgICAgICAgICBtb2RlLmludmFsaWRhdGUoKTsKICAgICAgICAgICAgIG1Db250ZXh0Vmlldy5pbml0Rm9yTW9kZShtb2RlKTsKICAgICAgICAgICAgIGFuaW1hdGVUb01vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobVNwbGl0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVNwbGl0VmlldyAhPSBudWxsICYmIG1Db250ZXh0RGlzcGxheU1vZGUgPT0gQ09OVEVYVF9ESVNQTEFZX1NQTElUKSB7CiAgICAgICAgICAgICAgICAgLy8gVE9ETyBhbmltYXRlIHRoaXMKICAgICAgICAgICAgICAgICBtU3BsaXRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKICAgICAgICAgICAgIH0KQEAgLTUyNiw3ICs1MjIsNyBAQAogICAgICAgICAgICAgICAgIG1Db250YWluZXJWaWV3LnNldFRyYW5zbGF0aW9uWSgtbUNvbnRhaW5lclZpZXcuZ2V0SGVpZ2h0KCkpOwogICAgICAgICAgICAgICAgIGIud2l0aChPYmplY3RBbmltYXRvci5vZkZsb2F0KG1Db250YWluZXJWaWV3LCAidHJhbnNsYXRpb25ZIiwgMCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TcGxpdFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1TcGxpdFZpZXcgIT0gbnVsbCAmJiBtQ29udGV4dERpc3BsYXlNb2RlID09IENPTlRFWFRfRElTUExBWV9TUExJVCkgewogICAgICAgICAgICAgICAgIG1TcGxpdFZpZXcuc2V0QWxwaGEoMCk7CiAgICAgICAgICAgICAgICAgYi53aXRoKE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobVNwbGl0VmlldywgImFscGhhIiwgMSkpOwogICAgICAgICAgICAgfQpAQCAtNTYwLDcgKzU1Niw3IEBACiAgICAgICAgICAgICAgICAgYi53aXRoKE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobUNvbnRhaW5lclZpZXcsICJ0cmFuc2xhdGlvblkiLAogICAgICAgICAgICAgICAgICAgICAgICAgLW1Db250YWluZXJWaWV3LmdldEhlaWdodCgpKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNwbGl0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobVNwbGl0VmlldyAhPSBudWxsICYmIG1TcGxpdFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewogICAgICAgICAgICAgICAgIG1TcGxpdFZpZXcuc2V0QWxwaGEoMSk7CiAgICAgICAgICAgICAgICAgYi53aXRoKE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobVNwbGl0VmlldywgImFscGhhIiwgMCkpOwogICAgICAgICAgICAgfQpAQCAtNjMzLDggKzYyOSwyMCBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFjay5vblByZXBhcmVBY3Rpb25Nb2RlKHRoaXMsIG1NZW51KSkgewotICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggY29udGVudCBpbiBib3RoIGNvbnRleHQgdmlld3MKKyAgICAgICAgICAgIG1NZW51LnN0b3BEaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25QcmVwYXJlQWN0aW9uTW9kZSh0aGlzLCBtTWVudSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG1NZW51LnN0YXJ0RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoT25DcmVhdGUoKSB7CisgICAgICAgICAgICBtTWVudS5zdG9wRGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1DYWxsYmFjay5vbkNyZWF0ZUFjdGlvbk1vZGUodGhpcywgbU1lbnUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtTWVudS5zdGFydERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9hcHAvQWxlcnRDb250cm9sbGVyLmphdmEKaW5kZXggNzFhN2E1Mi4uOGQ2Y2FhMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL2FwcC9BbGVydENvbnRyb2xsZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvYXBwL0FsZXJ0Q29udHJvbGxlci5qYXZhCkBAIC01NzUsOSArNTc1LDEzIEBACiAgICAgICAgIHBhcmFtcy53ZWlnaHQgPSAwLjVmOwogICAgICAgICBidXR0b24uc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7CiAgICAgICAgIFZpZXcgbGVmdFNwYWNlciA9IG1XaW5kb3cuZmluZFZpZXdCeUlkKFIuaWQubGVmdFNwYWNlcik7Ci0gICAgICAgIGxlZnRTcGFjZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBpZiAobGVmdFNwYWNlciAhPSBudWxsKSB7CisgICAgICAgICAgICBsZWZ0U3BhY2VyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQogICAgICAgICBWaWV3IHJpZ2h0U3BhY2VyID0gbVdpbmRvdy5maW5kVmlld0J5SWQoUi5pZC5yaWdodFNwYWNlcik7Ci0gICAgICAgIHJpZ2h0U3BhY2VyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgaWYgKHJpZ2h0U3BhY2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJpZ2h0U3BhY2VyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kKExpbmVhckxheW91dCB0b3BQYW5lbCwgTGluZWFyTGF5b3V0IGNvbnRlbnRQYW5lbCwKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9uZXQvVnBuQ29uZmlnLmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvbmV0L1ZwbkNvbmZpZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTY4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvbmV0L1ZwbkNvbmZpZy5haWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLm5ldDsKKworcGFyY2VsYWJsZSBWcG5Db25maWc7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvbmV0L1ZwbkNvbmZpZy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL25ldC9WcG5Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNiZTViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL25ldC9WcG5Db25maWcuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwubmV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworCisvKioKKyAqIEEgc2ltcGxlIGNvbnRhaW5lciB1c2VkIHRvIGNhcnJ5IGluZm9ybWF0aW9uIGluIFZwbkJ1aWxkZXIsIFZwbkRpYWxvZ3MsCisgKiBhbmQgY29tLmFuZHJvaWQuc2VydmVyLmNvbm5lY3Rpdml0eS5WcG4uIEludGVybmFsIHVzZSBvbmx5LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBWcG5Db25maWcgaW1wbGVtZW50cyBQYXJjZWxhYmxlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9WUE5fUkVWT0tFRCA9ICJhbmRyb2lkLm5ldC52cG4uYWN0aW9uLlJFVk9LRUQiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuZm9yY2VDYWxsaW5nUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgaWYgKCEiY29tLmFuZHJvaWQudnBuZGlhbG9ncyIuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJVbmF1dGhvcml6ZWQgQ2FsbGVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEludGVudCBnZXRJbnRlbnRGb3JDb25maXJtYXRpb24oKSB7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnZwbmRpYWxvZ3MiLCAiY29tLmFuZHJvaWQudnBuZGlhbG9ncy5Db25maXJtRGlhbG9nIik7CisgICAgICAgIHJldHVybiBpbnRlbnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQZW5kaW5nSW50ZW50IGdldEludGVudEZvck5vdGlmaWNhdGlvbihDb250ZXh0IGNvbnRleHQsIFZwbkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnN0YXJ0VGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC52cG5kaWFsb2dzIiwgImNvbS5hbmRyb2lkLnZwbmRpYWxvZ3MuTWFuYWdlRGlhbG9nIik7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgiY29uZmlnIiwgY29uZmlnKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTk9fSElTVE9SWSB8CisgICAgICAgICAgICAgICAgSW50ZW50LkZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFMpOworICAgICAgICByZXR1cm4gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShjb250ZXh0LCAwLCBpbnRlbnQsIFBlbmRpbmdJbnRlbnQuRkxBR19DQU5DRUxfQ1VSUkVOVCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBwYWNrYWdlTmFtZTsKKyAgICBwdWJsaWMgU3RyaW5nIHNlc3Npb25OYW1lOworICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJmYWNlTmFtZTsKKyAgICBwdWJsaWMgU3RyaW5nIGNvbmZpZ3VyZUFjdGl2aXR5OworICAgIHB1YmxpYyBpbnQgbXR1ID0gLTE7CisgICAgcHVibGljIFN0cmluZyBhZGRyZXNzZXM7CisgICAgcHVibGljIFN0cmluZyByb3V0ZXM7CisgICAgcHVibGljIFN0cmluZyBkbnNTZXJ2ZXJzOworICAgIHB1YmxpYyBsb25nIHN0YXJ0VGltZSA9IC0xOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBvdXQsIGludCBmbGFncykgeworICAgICAgICBvdXQud3JpdGVTdHJpbmcocGFja2FnZU5hbWUpOworICAgICAgICBvdXQud3JpdGVTdHJpbmcoc2Vzc2lvbk5hbWUpOworICAgICAgICBvdXQud3JpdGVTdHJpbmcoaW50ZXJmYWNlTmFtZSk7CisgICAgICAgIG91dC53cml0ZVN0cmluZyhjb25maWd1cmVBY3Rpdml0eSk7CisgICAgICAgIG91dC53cml0ZUludChtdHUpOworICAgICAgICBvdXQud3JpdGVTdHJpbmcoYWRkcmVzc2VzKTsKKyAgICAgICAgb3V0LndyaXRlU3RyaW5nKHJvdXRlcyk7CisgICAgICAgIG91dC53cml0ZVN0cmluZyhkbnNTZXJ2ZXJzKTsKKyAgICAgICAgb3V0LndyaXRlTG9uZyhzdGFydFRpbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGFyY2VsYWJsZS5DcmVhdG9yPFZwbkNvbmZpZz4gQ1JFQVRPUiA9CisgICAgICAgICAgICBuZXcgUGFyY2VsYWJsZS5DcmVhdG9yPFZwbkNvbmZpZz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVnBuQ29uZmlnIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICBWcG5Db25maWcgY29uZmlnID0gbmV3IFZwbkNvbmZpZygpOworICAgICAgICAgICAgY29uZmlnLnBhY2thZ2VOYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgY29uZmlnLnNlc3Npb25OYW1lID0gaW4ucmVhZFN0cmluZygpOworICAgICAgICAgICAgY29uZmlnLmludGVyZmFjZU5hbWUgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBjb25maWcuY29uZmlndXJlQWN0aXZpdHkgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBjb25maWcubXR1ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgY29uZmlnLmFkZHJlc3NlcyA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGNvbmZpZy5yb3V0ZXMgPSBpbi5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBjb25maWcuZG5zU2VydmVycyA9IGluLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIGNvbmZpZy5zdGFydFRpbWUgPSBpbi5yZWFkTG9uZygpOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVnBuQ29uZmlnW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVnBuQ29uZmlnW3NpemVdOworICAgICAgICB9CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9XcmFwcGVySW5pdC5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1dyYXBwZXJJbml0LmphdmEKaW5kZXggMThkNmNhYS4uODYwYTA4YyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1dyYXBwZXJJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1dyYXBwZXJJbml0LmphdmEKQEAgLTU0LDYgKzU0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUZWxsIHRoZSBaeWdvdGUgd2hhdCBvdXIgYWN0dWFsIFBJRCBpcyAoc2luY2UgaXQgb25seSBrbm93cyBhYm91dCB0aGUKKyAgICAgICAgICAgIC8vIHdyYXBwZXIgdGhhdCBpdCBkaXJlY3RseSBmb3JrZWQpLgogICAgICAgICAgICAgaW50IGZkTnVtID0gSW50ZWdlci5wYXJzZUludChhcmdzWzBdLCAxMCk7CiAgICAgICAgICAgICBpZiAoZmROdW0gIT0gMCkgewogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC02Nyw2ICs2OSwxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gTWltaWMgWnlnb3RlIHByZWxvYWRpbmcuCisgICAgICAgICAgICBaeWdvdGVJbml0LnByZWxvYWQoKTsKKworICAgICAgICAgICAgLy8gTGF1bmNoIHRoZSBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgIFN0cmluZ1tdIHJ1bnRpbWVBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcmdzLCAxLCBydW50aW1lQXJncywgMCwgcnVudGltZUFyZ3MubGVuZ3RoKTsKICAgICAgICAgICAgIFJ1bnRpbWVJbml0LndyYXBwZXJJbml0KHJ1bnRpbWVBcmdzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCmluZGV4IDE1N2MwYmYuLmI0YTdlNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQpAQCAtMjI4LDYgKzIyOCwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgc3RhdGljIHZvaWQgcHJlbG9hZCgpIHsKKyAgICAgICAgcHJlbG9hZENsYXNzZXMoKTsKKyAgICAgICAgcHJlbG9hZFJlc291cmNlcygpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIFp5Z290ZSBwcm9jZXNzIGluaXRpYWxpemF0aW9uLiBMb2FkcyBhbmQgaW5pdGlhbGl6ZXMKICAgICAgKiBjb21tb25seSB1c2VkIGNsYXNzZXMuCkBAIC01MDksOCArNTE0LDcgQEAKICAgICAgICAgICAgIHJlZ2lzdGVyWnlnb3RlU29ja2V0KCk7CiAgICAgICAgICAgICBFdmVudExvZy53cml0ZUV2ZW50KExPR19CT09UX1BST0dSRVNTX1BSRUxPQURfU1RBUlQsCiAgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwotICAgICAgICAgICAgcHJlbG9hZENsYXNzZXMoKTsKLSAgICAgICAgICAgIHByZWxvYWRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHByZWxvYWQoKTsKICAgICAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoTE9HX0JPT1RfUFJPR1JFU1NfUFJFTE9BRF9FTkQsCiAgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3Mvc3RvcmFnZS9FeHRlcm5hbFN0b3JhZ2VGb3JtYXR0ZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9zdG9yYWdlL0V4dGVybmFsU3RvcmFnZUZvcm1hdHRlci5qYXZhCmluZGV4IDk2NTAyMmUuLjQ3NzNjZTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9zdG9yYWdlL0V4dGVybmFsU3RvcmFnZUZvcm1hdHRlci5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9zdG9yYWdlL0V4dGVybmFsU3RvcmFnZUZvcm1hdHRlci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLklNb3VudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VFdmVudExpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVZvbHVtZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwpAQCAtMzIsNiArMzMsOSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfQUxXQVlTX1JFU0VUID0gImFsd2F5c19yZXNldCI7CiAKKyAgICAvLyBJZiBub24tbnVsbCwgdGhlIHZvbHVtZSB0byBmb3JtYXQuIE90aGVyd2lzZSwgd2lsbCB1c2UgdGhlIGRlZmF1bHQgZXh0ZXJuYWwgc3RvcmFnZSBkaXJlY3RvcnkKKyAgICBwcml2YXRlIFN0b3JhZ2VWb2x1bWUgbVN0b3JhZ2VWb2x1bWU7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudE5hbWUgQ09NUE9ORU5UX05BTUUKICAgICAgICAgICAgID0gbmV3IENvbXBvbmVudE5hbWUoImFuZHJvaWQiLCBFeHRlcm5hbFN0b3JhZ2VGb3JtYXR0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKIApAQCAtODAsNiArODQsOCBAQAogICAgICAgICAgICAgbUFsd2F5c1Jlc2V0ID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIG1TdG9yYWdlVm9sdW1lID0gaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShTdG9yYWdlVm9sdW1lLkVYVFJBX1NUT1JBR0VfVk9MVU1FKTsKKwogICAgICAgICBpZiAobVByb2dyZXNzRGlhbG9nID09IG51bGwpIHsKICAgICAgICAgICAgIG1Qcm9ncmVzc0RpYWxvZyA9IG5ldyBQcm9ncmVzc0RpYWxvZyh0aGlzKTsKICAgICAgICAgICAgIG1Qcm9ncmVzc0RpYWxvZy5zZXRJbmRldGVybWluYXRlKHRydWUpOwpAQCAtMTE1LDcgKzEyMSw5IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DYW5jZWwoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgewogICAgICAgICBJTW91bnRTZXJ2aWNlIG1vdW50U2VydmljZSA9IGdldE1vdW50U2VydmljZSgpOwotICAgICAgICBTdHJpbmcgZXh0U3RvcmFnZVBhdGggPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgZXh0U3RvcmFnZVBhdGggPSBtU3RvcmFnZVZvbHVtZSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpIDoKKyAgICAgICAgICAgICAgICBtU3RvcmFnZVZvbHVtZS5nZXRQYXRoKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtb3VudFNlcnZpY2UubW91bnRWb2x1bWUoZXh0U3RvcmFnZVBhdGgpOwogICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpAQCAtMTMzLDEyICsxNDEsMTYgQEAKICAgICB9CiAKICAgICB2b2lkIHVwZGF0ZVByb2dyZXNzU3RhdGUoKSB7Ci0gICAgICAgIFN0cmluZyBzdGF0dXMgPSBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZSgpOworICAgICAgICBTdHJpbmcgc3RhdHVzID0gbVN0b3JhZ2VWb2x1bWUgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlU3RhdGUoKSA6CisgICAgICAgICAgICAgICAgbVN0b3JhZ2VNYW5hZ2VyLmdldFZvbHVtZVN0YXRlKG1TdG9yYWdlVm9sdW1lLmdldFBhdGgoKSk7CiAgICAgICAgIGlmIChFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVELmVxdWFscyhzdGF0dXMpCiAgICAgICAgICAgICAgICAgfHwgRW52aXJvbm1lbnQuTUVESUFfTU9VTlRFRF9SRUFEX09OTFkuZXF1YWxzKHN0YXR1cykpIHsKICAgICAgICAgICAgIHVwZGF0ZVByb2dyZXNzRGlhbG9nKFIuc3RyaW5nLnByb2dyZXNzX3VubW91bnRpbmcpOwogICAgICAgICAgICAgSU1vdW50U2VydmljZSBtb3VudFNlcnZpY2UgPSBnZXRNb3VudFNlcnZpY2UoKTsKLSAgICAgICAgICAgIFN0cmluZyBleHRTdG9yYWdlUGF0aCA9IEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXh0U3RvcmFnZVBhdGggPSBtU3RvcmFnZVZvbHVtZSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkudG9TdHJpbmcoKSA6CisgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlVm9sdW1lLmdldFBhdGgoKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbW91bnRTZXJ2aWNlLnVubW91bnRWb2x1bWUoZXh0U3RvcmFnZVBhdGgsIHRydWUpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKQEAgLTE0OSw5ICsxNjEsMTIgQEAKICAgICAgICAgICAgICAgICB8fCBFbnZpcm9ubWVudC5NRURJQV9VTk1PVU5UQUJMRS5lcXVhbHMoc3RhdHVzKSkgewogICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NEaWFsb2coUi5zdHJpbmcucHJvZ3Jlc3NfZXJhc2luZyk7CiAgICAgICAgICAgICBmaW5hbCBJTW91bnRTZXJ2aWNlIG1vdW50U2VydmljZSA9IGdldE1vdW50U2VydmljZSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4dFN0b3JhZ2VQYXRoID0gRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHRTdG9yYWdlUGF0aCA9IG1TdG9yYWdlVm9sdW1lID09IG51bGwgPworICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKS50b1N0cmluZygpIDoKKyAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VWb2x1bWUuZ2V0UGF0aCgpOwogICAgICAgICAgICAgaWYgKG1vdW50U2VydmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTE4NSw3ICsyMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfS5zdGFydCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cudygiTWVkaWFGb3JtYXQiLCAiVW5hYmxlIHRvIGxvY2F0ZSBJTW91bnRTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIGxvY2F0ZSBJTW91bnRTZXJ2aWNlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoRW52aXJvbm1lbnQuTUVESUFfQkFEX1JFTU9WQUwuZXF1YWxzKHN0YXR1cykpIHsKICAgICAgICAgICAgIGZhaWwoUi5zdHJpbmcubWVkaWFfYmFkX3JlbW92YWwpOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3NlcnZpY2Uvd2FsbHBhcGVyL0ltYWdlV2FsbHBhcGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc2VydmljZS93YWxscGFwZXIvSW1hZ2VXYWxscGFwZXIuamF2YQppbmRleCA4NTA5NWNmLi40NWYzYmMxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc2VydmljZS93YWxscGFwZXIvSW1hZ2VXYWxscGFwZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc2VydmljZS93YWxscGFwZXIvSW1hZ2VXYWxscGFwZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlZ2lvbi5PcDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXJUaHJlYWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwpAQCAtNDYsMTkgKzQ3LDIwIEBACiAKICAgICBXYWxscGFwZXJNYW5hZ2VyIG1XYWxscGFwZXJNYW5hZ2VyOwogICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtVGhyZWFkOworICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOwogICAgICAgICBtV2FsbHBhcGVyTWFuYWdlciA9IChXYWxscGFwZXJNYW5hZ2VyKSBnZXRTeXN0ZW1TZXJ2aWNlKFdBTExQQVBFUl9TRVJWSUNFKTsKICAgICAgICAgTG9vcGVyIGxvb3BlciA9IFdpbmRvd01hbmFnZXJQb2xpY3lUaHJlYWQuZ2V0TG9vcGVyKCk7Ci0gICAgICAgIGlmIChsb29wZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0Q2FsbGJhY2tMb29wZXIobG9vcGVyKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxvb3BlciA9PSBudWxsKSB7CiAgICAgICAgICAgICBtVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIldhbGxwYXBlciIsIFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0ZPUkVHUk9VTkQpOwogICAgICAgICAgICAgbVRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgc2V0Q2FsbGJhY2tMb29wZXIobVRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgICAgICAgICBsb29wZXIgPSBtVGhyZWFkLmdldExvb3BlcigpOwogICAgICAgICB9CisgICAgICAgIHNldENhbGxiYWNrTG9vcGVyKGxvb3Blcik7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobG9vcGVyKTsKICAgICB9CiAKICAgICBwdWJsaWMgRW5naW5lIG9uQ3JlYXRlRW5naW5lKCkgewpAQCAtOTYsMTAgKzk4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlV2FsbHBhcGVyTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgIGRyYXdGcmFtZUxvY2tlZCgpOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB3ZSBhcmUgdGhlIG9ubHkgb25lIHVzaW5nIHRoZSB3YWxscGFwZXIgaW4gdGhpcwotICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MsIGFuZCBmb3JjZSBhIEdDIG5vdyB0byByZWxlYXNlIHRoZSBvbGQgd2FsbHBhcGVyLgotICAgICAgICAgICAgICAgIFN5c3RlbS5nYygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExMiw3ICsxMTAsNyBAQAogICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc3VyZmFjZUhvbGRlcik7CiAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcihJbnRlbnQuQUNUSU9OX1dBTExQQVBFUl9DSEFOR0VEKTsKICAgICAgICAgICAgIG1SZWNlaXZlciA9IG5ldyBXYWxscGFwZXJPYnNlcnZlcigpOwotICAgICAgICAgICAgcmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgICAgICByZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlciwgZmlsdGVyLCBudWxsLCBtSGFuZGxlcik7CiAKICAgICAgICAgICAgIHVwZGF0ZVN1cmZhY2VTaXplKHN1cmZhY2VIb2xkZXIpOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXIuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCmluZGV4IDdkMjE0ODkuLmMxMWZjMTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0Jhci5haWRsCkBAIC0zMSw5ICszMSwxMCBAQAogICAgIHZvaWQgYW5pbWF0ZUV4cGFuZCgpOwogICAgIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKCk7CiAgICAgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKTsKLSAgICB2b2lkIHNldE1lbnVLZXlWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7CisgICAgdm9pZCB0b3BBcHBXaW5kb3dDaGFuZ2VkKGJvb2xlYW4gbWVudVZpc2libGUpOwogICAgIHZvaWQgc2V0SW1lV2luZG93U3RhdHVzKGluIElCaW5kZXIgdG9rZW4sIGludCB2aXMsIGludCBiYWNrRGlzcG9zaXRpb24pOwogICAgIHZvaWQgc2V0SGFyZEtleWJvYXJkU3RhdHVzKGJvb2xlYW4gYXZhaWxhYmxlLCBib29sZWFuIGVuYWJsZWQpOwogICAgIHZvaWQgdXNlckFjdGl2aXR5KCk7CisgICAgdm9pZCB0b2dnbGVSZWNlbnRBcHBzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbCBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9zdGF0dXNiYXIvSVN0YXR1c0JhclNlcnZpY2UuYWlkbAppbmRleCBiZmM3MTdiLi5hOWU1MDU3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvc3RhdHVzYmFyL0lTdGF0dXNCYXJTZXJ2aWNlLmFpZGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3N0YXR1c2Jhci9JU3RhdHVzQmFyU2VydmljZS5haWRsCkBAIC0xMyw3ICsxMyw3IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLSAKKwogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXI7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5zdGF0dXNiYXIuSVN0YXR1c0JhcjsKQEAgLTMwLDcgKzMwLDcgQEAKICAgICB2b2lkIHNldEljb24oU3RyaW5nIHNsb3QsIFN0cmluZyBpY29uUGFja2FnZSwgaW50IGljb25JZCwgaW50IGljb25MZXZlbCk7CiAgICAgdm9pZCBzZXRJY29uVmlzaWJpbGl0eShTdHJpbmcgc2xvdCwgYm9vbGVhbiB2aXNpYmxlKTsKICAgICB2b2lkIHJlbW92ZUljb24oU3RyaW5nIHNsb3QpOwotICAgIHZvaWQgc2V0TWVudUtleVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKTsKKyAgICB2b2lkIHRvcEFwcFdpbmRvd0NoYW5nZWQoYm9vbGVhbiBtZW51VmlzaWJsZSk7CiAgICAgdm9pZCBzZXRJbWVXaW5kb3dTdGF0dXMoaW4gSUJpbmRlciB0b2tlbiwgaW50IHZpcywgaW50IGJhY2tEaXNwb3NpdGlvbik7CiAKICAgICAvLyAtLS0tIE1ldGhvZHMgYmVsb3cgYXJlIGZvciB1c2UgYnkgdGhlIHN0YXR1cyBiYXIgcG9saWN5IHNlcnZpY2VzIC0tLS0KQEAgLTQ3LDQgKzQ3LDUgQEAKICAgICB2b2lkIHNldFN5c3RlbVVpVmlzaWJpbGl0eShpbnQgdmlzKTsKICAgICB2b2lkIHNldEhhcmRLZXlib2FyZEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKICAgICB2b2lkIHVzZXJBY3Rpdml0eSgpOworICAgIHZvaWQgdG9nZ2xlUmVjZW50QXBwcygpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGFuemlUb1Bpbnlpbi5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGFuemlUb1Bpbnlpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTRhZGFhLi4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL0hhbnppVG9QaW55aW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBBbiBvYmplY3QgdG8gY29udmVydCBDaGluZXNlIGNoYXJhY3RlciB0byBpdHMgY29ycmVzcG9uZGluZyBwaW55aW4gc3RyaW5nLgotICogRm9yIGNoYXJhY3RlcnMgd2l0aCBtdWx0aXBsZSBwb3NzaWJsZSBwaW55aW4gc3RyaW5nLCBvbmx5IG9uZSBpcyBzZWxlY3RlZAotICogYWNjb3JkaW5nIHRvIGNvbGxhdG9yLiBQb2x5cGhvbmUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLgotICogVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCB0byBhY2hpZXZlIHRoZSBiZXN0IHJ1bnRpbWUgcGVyZm9ybWFuY2UgYW5kIG1pbmltdW0KLSAqIHJ1bnRpbWUgcmVzb3VyY2VzIHdpdGggdG9sZXJhYmxlIHNhY3JpZmljZSBvZiBhY2N1cmFjeS4gVGhpcyBpbXBsZW1lbnRhdGlvbgotICogaGlnaGx5IGRlcGVuZHMgb24gemhfQ04gSUNVIGNvbGxhdGlvbiBkYXRhIGFuZCBtdXN0IGJlIGFsd2F5cyBzeW5jaHJvbml6ZWQgd2l0aAotICogSUNVLgotICovCi1wdWJsaWMgY2xhc3MgSGFuemlUb1BpbnlpbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJIYW56aVRvUGlueWluIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBVTklIQU5TID0gewotICAgICAgICAgICAgJ1x1NTQxNicsICdcdTU0Y2UnLCAnXHU1Yjg5JywgJ1x1ODBhZScsICdcdTUxZjknLCAnXHU1MTZiJywgJ1x1NjNiMCcsICdcdTYyNzMnLAotICAgICAgICAgICAgJ1x1OTBhNicsICdcdTUyZjknLCAnXHU5NjQyJywgJ1x1NTk1NCcsICdcdTRmM2InLCAnXHU3NjgwJywgJ1x1NzgyZCcsICdcdTcwNmMnLAotICAgICAgICAgICAgJ1x1NjE4YicsICdcdTZjNDMnLCAnXHU1MWFiJywgJ1x1NzY3NicsICdcdTVjZWMnLCAnXHU1NjkzJywgJ1x1NTA3MicsICdcdTUzYzInLAotICAgICAgICAgICAgJ1x1NGVkMycsICdcdTY0YTEnLCAnXHU1MThhJywgJ1x1NWQ3ZScsICdcdTU2NGMnLCAnXHU2MjYwJywgJ1x1NjJjNicsICdcdThmYmYnLAotICAgICAgICAgICAgJ1x1NGYyNScsICdcdTYyODQnLCAnXHU4ZjY2JywgJ1x1NjJiYicsICdcdTk2MzcnLCAnXHU1NDAzJywgJ1x1NTE0NScsICdcdTYyYmQnLAotICAgICAgICAgICAgJ1x1NTFmYScsICdcdTY0MGInLCAnXHU1ZGRiJywgJ1x1NTIwNScsICdcdTU0MzknLCAnXHU2NWZlJywgJ1x1OGUxNCcsICdcdTU0NzInLAotICAgICAgICAgICAgJ1x1NGVjZScsICdcdTUxZDEnLCAnXHU3Yzk3JywgJ1x1NmM0NicsICdcdTVkMTQnLCAnXHU5MGE4JywgJ1x1NjQxMycsICdcdTU0OTEnLAotICAgICAgICAgICAgJ1x1NTQ0NicsICdcdTRlMzknLCAnXHU1ZjUzJywgJ1x1NTIwMCcsICdcdTYwNzQnLCAnXHU2MjY1JywgJ1x1NzA2ZicsICdcdTRlZmUnLAotICAgICAgICAgICAgJ1x1NTVmMicsICdcdTY1NDEnLCAnXHU1MjAxJywgJ1x1NzIzOScsICdcdTRlMDEnLCAnXHU0ZTFmJywgJ1x1NGUxYycsICdcdTU0M2EnLAotICAgICAgICAgICAgJ1x1NTI2MicsICdcdTgwMTEnLCAnXHU1Nzk2JywgJ1x1NTQyOCcsICdcdTU5MWEnLCAnXHU1OWI4JywgJ1x1NTk0MCcsICdcdTk3YTUnLAotICAgICAgICAgICAgJ1x1ODAwYycsICdcdTUzZDEnLCAnXHU1ZTA2JywgJ1x1NTMxYScsICdcdTk4ZGUnLCAnXHU1MjA2JywgJ1x1NGUzMCcsICdcdTg5ODUnLAotICAgICAgICAgICAgJ1x1NGVjZicsICdcdTU3YmEnLCAnXHU3ZDExJywgJ1x1NTkyYicsICdcdTczMjQnLCAnXHU2NWVlJywgJ1x1NGY4NScsICdcdTVlNzInLAotICAgICAgICAgICAgJ1x1NTE4OCcsICdcdTc2OGInLCAnXHU2MjA4JywgJ1x1N2VkOScsICdcdTY4MzknLCAnXHU2M2VmJywgJ1x1NTViYycsICdcdTU1ZjAnLAotICAgICAgICAgICAgJ1x1NWRlNScsICdcdTUyZmUnLCAnXHU0ZjMwJywgJ1x1OWUzOScsICdcdTRlNTYnLCAnXHU1MTczJywgJ1x1NTE0OScsICdcdTVmNTInLAotICAgICAgICAgICAgJ1x1NGUyOCcsICdcdThiMzQnLCAnXHU1NDU5JywgJ1x1NTk4ZScsICdcdTU0OGQnLCAnXHU0ZjQ0JywgJ1x1NTkyZicsICdcdTgzMjAnLAotICAgICAgICAgICAgJ1x1OGJjMycsICdcdTllZDInLCAnXHU2MmViJywgJ1x1NGVhOCcsICdcdTUzZmYnLCAnXHU5ZjQxJywgJ1x1NGU0ZScsICdcdTgyYjEnLAotICAgICAgICAgICAgJ1x1NjAwMCcsICdcdTZiMjInLCAnXHU1ZGRmJywgJ1x1NzA3MCcsICdcdTY2MGYnLCAnXHU1NDE5JywgJ1x1NGUwYycsICdcdTUyYTAnLAotICAgICAgICAgICAgJ1x1NjIwYicsICdcdTZjNWYnLCAnXHU4MjdkJywgJ1x1OTYzNicsICdcdTVkZmUnLCAnXHU1NzU1JywgJ1x1NTE4MicsICdcdTRlMjknLAotICAgICAgICAgICAgJ1x1NTFlNScsICdcdTU5ZTInLCAnXHU1NjU4JywgJ1x1NTE5YicsICdcdTU0OTQnLCAnXHU1ZjAwJywgJ1x1OTM4ZScsICdcdTVmZmMnLAotICAgICAgICAgICAgJ1x1NWMzYicsICdcdTUzM2MnLCAnXHU4MDhlJywgJ1x1NTJhNScsICdcdTdhN2EnLCAnXHU2MmEwJywgJ1x1NjI1ZCcsICdcdTU5MzgnLAotICAgICAgICAgICAgJ1x1ODRhZicsICdcdTViYmQnLCAnXHU1MzIxJywgJ1x1NGU4ZicsICdcdTU3NjQnLCAnXHU2MjY5JywgJ1x1NjJjOScsICdcdTRmODYnLAotICAgICAgICAgICAgJ1x1NTE3MCcsICdcdTU1NzcnLCAnXHU2MzVlJywgJ1x1NGVjMicsICdcdTk2ZjcnLCAnXHU4MTM3JywgJ1x1NjhmMScsICdcdTY5NWUnLAotICAgICAgICAgICAgJ1x1NTUwZScsICdcdTRmZTknLCAnXHU1YWZlJywgJ1x1ODI2ZicsICdcdThlN2QnLCAnXHU1N2QzJywgJ1x1NTNiOCcsICdcdTYyY2UnLAotICAgICAgICAgICAgJ1x1NmU5YycsICdcdTlmOTknLCAnXHU1YTA0JywgJ1x1NTY1YycsICdcdTViNmEnLCAnXHU2MmExJywgJ1x1OTgzMScsICdcdTU5ODgnLAotICAgICAgICAgICAgJ1x1NTdjYicsICdcdTk4OWYnLCAnXHU3MjY0JywgJ1x1NzMyYicsICdcdTU0NDUnLCAnXHU5NWU4JywgJ1x1NmMxMycsICdcdTU0YWEnLAotICAgICAgICAgICAgJ1x1NWI4MCcsICdcdTU1YjUnLCAnXHU0ZTVjJywgJ1x1NmMxMScsICdcdTU0MGQnLCAnXHU4YzJjJywgJ1x1NjQ3OCcsICdcdTcyNWYnLAotICAgICAgICAgICAgJ1x1NmJjZCcsICdcdTYyY2YnLCAnXHU4MTQ5JywgJ1x1NTZlMScsICdcdTU2ZDQnLCAnXHU1YjZjJywgJ1x1OGJiNycsICdcdTVhMWUnLAotICAgICAgICAgICAgJ1x1NWFlOScsICdcdTgwZmQnLCAnXHU5MmIwJywgJ1x1NjJjOCcsICdcdTVhMTgnLCAnXHU5ZTFmJywgJ1x1NjM0ZicsICdcdTU2ZGMnLAotICAgICAgICAgICAgJ1x1NWI4MScsICdcdTU5OWUnLCAnXHU1MTljJywgJ1x1N2ZiYScsICdcdTU5NzQnLCAnXHU1OTdiJywgJ1x1OWVjMScsICdcdTkwY2QnLAotICAgICAgICAgICAgJ1x1NTY2MicsICdcdThiYjQnLCAnXHU1OTkxJywgJ1x1NjJjZCcsICdcdTc3MDUnLCAnXHU2Yzc4JywgJ1x1NjI5YicsICdcdTU0NzgnLAotICAgICAgICAgICAgJ1x1NTViNycsICdcdTUzMDknLCAnXHU0ZTc2JywgJ1x1NzI0NycsICdcdTUyN2QnLCAnXHU2YzE1JywgJ1x1NTlkOCcsICdcdTRlNTInLAotICAgICAgICAgICAgJ1x1OTQ4YicsICdcdTUyNTYnLCAnXHU0ZWM2JywgJ1x1NGUwMycsICdcdTYzOTAnLCAnXHU1MzQzJywgJ1x1NTQ1YicsICdcdTYwODQnLAotICAgICAgICAgICAgJ1x1NTIwNycsICdcdTRlYjInLCAnXHU5NzUxJywgJ1x1NWI4NicsICdcdTc0ZDcnLCAnXHU1MzNhJywgJ1x1NWNkMScsICdcdTcwOTQnLAotICAgICAgICAgICAgJ1x1NTkwYicsICdcdTU0NjUnLCAnXHU3YTYzJywgJ1x1ODM1YicsICdcdTYwZjknLCAnXHU0ZWJhJywgJ1x1NjI1NCcsICdcdTY1ZTUnLAotICAgICAgICAgICAgJ1x1NjIwZScsICdcdTUzYjknLCAnXHU5MDlhJywgJ1x1NTgyNycsICdcdTY4NzUnLCAnXHU5NWYwJywgJ1x1NjMzYycsICdcdTRlZTgnLAotICAgICAgICAgICAgJ1x1NmJlMicsICdcdTRlMDknLCAnXHU2ODUyJywgJ1x1NjNiYicsICdcdTgyNzInLCAnXHU2OGVlJywgJ1x1NTBlNycsICdcdTY3NDAnLAotICAgICAgICAgICAgJ1x1N2I1YicsICdcdTVjNzEnLCAnXHU0ZjI0JywgJ1x1NWYzMCcsICdcdTU5NjInLCAnXHU3NTMzJywgJ1x1NTM0NycsICdcdTVjMzgnLAotICAgICAgICAgICAgJ1x1NTNjZScsICdcdTRlNjYnLCAnXHU1MjM3JywgJ1x1ODg3MCcsICdcdTk1ZTknLCAnXHU1M2NjJywgJ1x1OGMwMScsICdcdTU0MmUnLAotICAgICAgICAgICAgJ1x1OGJmNCcsICdcdTUzYjYnLCAnXHU1ZmVhJywgJ1x1NTFjMScsICdcdTgyY2YnLCAnXHU3MmZiJywgJ1x1NTkwYScsICdcdTViNTknLAotICAgICAgICAgICAgJ1x1NTUwNicsICdcdTRlZDYnLCAnXHU1YjYxJywgJ1x1NTc0ZCcsICdcdTZjNjQnLCAnXHU1OTMyJywgJ1x1NWZkMScsICdcdTgxYWYnLAotICAgICAgICAgICAgJ1x1NTI1NCcsICdcdTU5MjknLCAnXHU2NWViJywgJ1x1NjAxNycsICdcdTUzODUnLCAnXHU3MGI1JywgJ1x1NTA3NycsICdcdTUxZjgnLAotICAgICAgICAgICAgJ1x1NmU0ZCcsICdcdTYzYTgnLCAnXHU1NDFlJywgJ1x1OGJhYycsICdcdTUyYjgnLCAnXHU2YjZhJywgJ1x1NWYyZicsICdcdTVjMjMnLAotICAgICAgICAgICAgJ1x1NTM3MScsICdcdTY2MzcnLCAnXHU3ZmMxJywgJ1x1NjMxZCcsICdcdTRlNGMnLCAnXHU1OTE1JywgJ1x1NTQ3NycsICdcdTRlZDknLAotICAgICAgICAgICAgJ1x1NGU2MScsICdcdTcwNzEnLCAnXHU0ZTliJywgJ1x1NWZjMycsICdcdTUxNzQnLCAnXHU1MWY2JywgJ1x1NGYxMScsICdcdTYyMGMnLAotICAgICAgICAgICAgJ1x1NTQwNScsICdcdTc1YjYnLCAnXHU3MDI1JywgJ1x1NGUyYicsICdcdTU0YmQnLCAnXHU1OTJlJywgJ1x1NWU3YScsICdcdTUwM2InLAotICAgICAgICAgICAgJ1x1NGUwMCcsICdcdTRlNWEnLCAnXHU1ZTk0JywgJ1x1NTUzNycsICdcdTRmNjMnLCAnXHU0ZjE4JywgJ1x1N2VhMScsICdcdTU2ZTYnLAotICAgICAgICAgICAgJ1x1NjZmMCcsICdcdTg0ODAnLCAnXHU1ZTAwJywgJ1x1NzA3ZCcsICdcdTUxNDInLCAnXHU3MjQyJywgJ1x1NTBhZScsICdcdTU1NmInLAotICAgICAgICAgICAgJ1x1OWM2MScsICdcdTYwMGUnLCAnXHU2NmZkJywgJ1x1NTQxMicsICdcdTYzNWEnLCAnXHU2Y2JlJywgJ1x1NWYyMCcsICdcdTRmNGInLAotICAgICAgICAgICAgJ1x1ODcwNycsICdcdThkMWUnLCAnXHU5ZWVlJywgJ1x1NGU0YicsICdcdTRlMmQnLCAnXHU1ZGRlJywgJ1x1NjczMScsICdcdTYyOTMnLAotICAgICAgICAgICAgJ1x1NjJmZCcsICdcdTRlMTMnLCAnXHU1OTg2JywgJ1x1OTZiOScsICdcdTViOTInLCAnXHU1MzUzJywgJ1x1NGVkNCcsICdcdTViOTcnLAotICAgICAgICAgICAgJ1x1OTBiOScsICdcdTc5ZGYnLCAnXHU1Mjk3JywgJ1x1NTVmYScsICdcdTVjMGEnLCAnXHU2NjI4JywKLSAgICAgICAgfTsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW11bXSBQSU5ZSU5TID0gewotICAgICAgICAgICAgezY1LCAwMCwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2NSwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY1LCA3OCwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2NSwgNzgsIDcxLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY1LCA3OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2NiwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs2NiwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2NiwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA2OSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs2NiwgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2NiwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA3MywgNjUsIDc4LCAwMCwgMDAsIH0sIHs2NiwgNzMsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA3MywgNjksIDAwLCAwMCwgMDAsIH0sIHs2NiwgNzMsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs2NiwgNzksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY2LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2NywgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs2NywgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2NywgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2NywgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2NywgNzIsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgNjUsIDczLCAwMCwgMDAsIH0sIHs2NywgNzIsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgNjUsIDc4LCA3MSwgMDAsIH0sIHs2NywgNzIsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgNjksIDAwLCAwMCwgMDAsIH0sIHs2NywgNzIsIDY5LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgNjksIDc4LCA3MSwgMDAsIH0sIHs2NywgNzIsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgNzksIDc4LCA3MSwgMDAsIH0sIHs2NywgNzIsIDc5LCA4NSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgODUsIDAwLCAwMCwgMDAsIH0sIHs2NywgNzIsIDg1LCA2NSwgNzMsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgODUsIDY1LCA3OCwgMDAsIH0sIHs2NywgNzIsIDg1LCA2NSwgNzgsIDcxLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgODUsIDczLCAwMCwgMDAsIH0sIHs2NywgNzIsIDg1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3MiwgODUsIDc5LCAwMCwgMDAsIH0sIHs2NywgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2NywgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2NywgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA4NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs2NywgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY3LCA4NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs2OCwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs2OCwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2OCwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2OCwgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2OCwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA3MywgNjUsIDAwLCAwMCwgMDAsIH0sIHs2OCwgNzMsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA3MywgNjUsIDc5LCAwMCwgMDAsIH0sIHs2OCwgNzMsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs2OCwgNzMsIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs2OCwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2OCwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA4NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs2OCwgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY4LCA4NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs2OSwgMDAsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY5LCA3OCwgMDAsIDAwLCAwMCwgMDAsIH0sIHs2OSwgNzgsIDcxLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezY5LCA4MiwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3MCwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcwLCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3MCwgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcwLCA2OSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3MCwgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcwLCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3MCwgNzMsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcwLCA3OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3MCwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcwLCA3OSwgODUsIDAwLCAwMCwgMDAsIH0sIHs3MCwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA4NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3MSwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3MSwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3MSwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3MSwgNjksIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA2OSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3MSwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA3MywgNjksIDAwLCAwMCwgMDAsIH0sIHs3MSwgNjksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3MSwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3MSwgODUsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA4NSwgNjUsIDczLCAwMCwgMDAsIH0sIHs3MSwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA4NSwgNjUsIDc4LCA3MSwgMDAsIH0sIHs3MSwgODUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3MSwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcxLCA4NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs3MiwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3MiwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3MiwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3MiwgNjksIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA2OSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3MiwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3MiwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3MiwgODUsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA4NSwgNjUsIDczLCAwMCwgMDAsIH0sIHs3MiwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA4NSwgNjUsIDc4LCA3MSwgMDAsIH0sIHs3MiwgODUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezcyLCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3MiwgODUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NCwgNzMsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA3MywgNjUsIDc4LCAwMCwgMDAsIH0sIHs3NCwgNzMsIDY1LCA3OCwgNzEsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA3MywgNjUsIDc5LCAwMCwgMDAsIH0sIHs3NCwgNzMsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA3MywgNzgsIDAwLCAwMCwgMDAsIH0sIHs3NCwgNzMsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA3MywgNzksIDc4LCA3MSwgMDAsIH0sIHs3NCwgNzMsIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NCwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc0LCA4NSwgNjksIDAwLCAwMCwgMDAsIH0sIHs3NCwgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA2NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NSwgNjUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3NSwgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA2NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs3NSwgNjksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA2OSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3NSwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3NSwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NSwgODUsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA4NSwgNjUsIDczLCAwMCwgMDAsIH0sIHs3NSwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA4NSwgNjUsIDc4LCA3MSwgMDAsIH0sIHs3NSwgODUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc1LCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3NSwgODUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA2NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NiwgNjUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3NiwgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA2NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs3NiwgNjksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA2OSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3NiwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs3NiwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NiwgNzMsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3MywgNjUsIDc4LCAwMCwgMDAsIH0sIHs3NiwgNzMsIDY1LCA3OCwgNzEsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3MywgNjUsIDc5LCAwMCwgMDAsIH0sIHs3NiwgNzMsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3MywgNzgsIDAwLCAwMCwgMDAsIH0sIHs3NiwgNzMsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3MywgODUsIDAwLCAwMCwgMDAsIH0sIHs3NiwgNzksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA3OSwgODUsIDAwLCAwMCwgMDAsIH0sIHs3NiwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA4NSwgNjUsIDc4LCAwMCwgMDAsIH0sIHs3NiwgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc2LCA4NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs3NywgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3NywgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3NywgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA2OSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3NywgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3NywgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA3MywgNjUsIDc4LCAwMCwgMDAsIH0sIHs3NywgNzMsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA3MywgNjksIDAwLCAwMCwgMDAsIH0sIHs3NywgNzMsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs3NywgNzMsIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA3OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3NywgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc3LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3OCwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs3OCwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3OCwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3OCwgNjksIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA2OSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3OCwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs3OCwgNzMsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA3MywgNjUsIDc4LCA3MSwgMDAsIH0sIHs3OCwgNzMsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA3MywgNjksIDAwLCAwMCwgMDAsIH0sIHs3OCwgNzMsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs3OCwgNzMsIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs3OCwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3OCwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc4LCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs3OCwgODUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezc5LCAwMCwgMDAsIDAwLCAwMCwgMDAsIH0sIHs3OSwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA2NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MCwgNjUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4MCwgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA2NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs4MCwgNjksIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA2OSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4MCwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MCwgNzMsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA3MywgNjUsIDc5LCAwMCwgMDAsIH0sIHs4MCwgNzMsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA3MywgNzgsIDAwLCAwMCwgMDAsIH0sIHs4MCwgNzMsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA3OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MCwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgwLCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MSwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA3MywgNjUsIDAwLCAwMCwgMDAsIH0sIHs4MSwgNzMsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA3MywgNjUsIDc4LCA3MSwgMDAsIH0sIHs4MSwgNzMsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA3MywgNjksIDAwLCAwMCwgMDAsIH0sIHs4MSwgNzMsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MSwgNzMsIDc5LCA3OCwgNzEsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA3MywgODUsIDAwLCAwMCwgMDAsIH0sIHs4MSwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA4NSwgNjUsIDc4LCAwMCwgMDAsIH0sIHs4MSwgODUsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgxLCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4MiwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MiwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MiwgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MiwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MiwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MiwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA4NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs4MiwgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgyLCA4NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs4MywgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs4MywgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MywgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MywgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MywgNzIsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgNjUsIDczLCAwMCwgMDAsIH0sIHs4MywgNzIsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgNjUsIDc4LCA3MSwgMDAsIH0sIHs4MywgNzIsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgNjksIDAwLCAwMCwgMDAsIH0sIHs4MywgNzIsIDY5LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgNjksIDc4LCA3MSwgMDAsIH0sIHs4MywgNzIsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgNzksIDg1LCAwMCwgMDAsIH0sIHs4MywgNzIsIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgODUsIDY1LCAwMCwgMDAsIH0sIHs4MywgNzIsIDg1LCA2NSwgNzMsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgODUsIDY1LCA3OCwgMDAsIH0sIHs4MywgNzIsIDg1LCA2NSwgNzgsIDcxLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgODUsIDczLCAwMCwgMDAsIH0sIHs4MywgNzIsIDg1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3MiwgODUsIDc5LCAwMCwgMDAsIH0sIHs4MywgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4MywgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4MywgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA4NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs4MywgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezgzLCA4NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs4NCwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA2NSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs4NCwgNjUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA2NSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4NCwgNjUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA2OSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4NCwgNjksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs4NCwgNzMsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA3MywgNjUsIDc5LCAwMCwgMDAsIH0sIHs4NCwgNzMsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs4NCwgNzksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA3OSwgODUsIDAwLCAwMCwgMDAsIH0sIHs4NCwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA4NSwgNjUsIDc4LCAwMCwgMDAsIH0sIHs4NCwgODUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg0LCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4NCwgODUsIDc5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg3LCA2NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4NywgNjUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg3LCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4NywgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg3LCA2OSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs4NywgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg3LCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4NywgNzksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg3LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4OCwgNzMsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA3MywgNjUsIDAwLCAwMCwgMDAsIH0sIHs4OCwgNzMsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA3MywgNjUsIDc4LCA3MSwgMDAsIH0sIHs4OCwgNzMsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA3MywgNjksIDAwLCAwMCwgMDAsIH0sIHs4OCwgNzMsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs4OCwgNzMsIDc5LCA3OCwgNzEsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA3MywgODUsIDAwLCAwMCwgMDAsIH0sIHs4OCwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA4NSwgNjUsIDc4LCAwMCwgMDAsIH0sIHs4OCwgODUsIDY5LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg4LCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4OSwgNjUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs4OSwgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA2NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs4OSwgNjksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs4OSwgNzMsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA3MywgNzgsIDcxLCAwMCwgMDAsIH0sIHs4OSwgNzksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA3OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs4OSwgNzksIDg1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA4NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs4OSwgODUsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezg5LCA4NSwgNjksIDAwLCAwMCwgMDAsIH0sIHs4OSwgODUsIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA2NSwgMDAsIDAwLCAwMCwgMDAsIH0sIHs5MCwgNjUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA2NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs5MCwgNjUsIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA2NSwgNzksIDAwLCAwMCwgMDAsIH0sIHs5MCwgNjksIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA2OSwgNzMsIDAwLCAwMCwgMDAsIH0sIHs5MCwgNjksIDc4LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA2OSwgNzgsIDcxLCAwMCwgMDAsIH0sIHs5MCwgNzIsIDY1LCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgNjUsIDczLCAwMCwgMDAsIH0sIHs5MCwgNzIsIDY1LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgNjUsIDc4LCA3MSwgMDAsIH0sIHs5MCwgNzIsIDY1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgNjksIDAwLCAwMCwgMDAsIH0sIHs5MCwgNzIsIDY5LCA3OCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgNjksIDc4LCA3MSwgMDAsIH0sIHs5MCwgNzIsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgNzksIDc4LCA3MSwgMDAsIH0sIHs5MCwgNzIsIDc5LCA4NSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgODUsIDAwLCAwMCwgMDAsIH0sIHs5MCwgNzIsIDg1LCA2NSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgODUsIDY1LCA3MywgMDAsIH0sIHs5MCwgNzIsIDg1LCA2NSwgNzgsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgODUsIDY1LCA3OCwgNzEsIH0sIHs5MCwgNzIsIDg1LCA3MywgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MiwgODUsIDc4LCAwMCwgMDAsIH0sIHs5MCwgNzIsIDg1LCA3OSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3MywgMDAsIDAwLCAwMCwgMDAsIH0sIHs5MCwgNzksIDc4LCA3MSwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA3OSwgODUsIDAwLCAwMCwgMDAsIH0sIHs5MCwgODUsIDAwLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA4NSwgNjUsIDc4LCAwMCwgMDAsIH0sIHs5MCwgODUsIDczLCAwMCwgMDAsIDAwLCB9LAotICAgICAgICAgICAgezkwLCA4NSwgNzgsIDAwLCAwMCwgMDAsIH0sIHs5MCwgODUsIDc5LCAwMCwgMDAsIDAwLCB9LAotCi0gICAgICAgIH07Ci0KLSAgICAvKiogRmlyc3QgYW5kIGxhc3QgQ2hpbmVzZSBjaGFyYWN0ZXIgd2l0aCBrbm93biBQaW55aW4gYWNjb3JkaW5nIHRvIHpoIGNvbGxhdGlvbiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9QSU5ZSU5fVU5JSEFOID0gICJcdTU0MTYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1BJTllJTl9VTklIQU4gPSAgIlx1NTQ5NyI7Ci0gICAgLyoqIFRoZSBmaXJzdCBDaGluZXNlIGNoYXJhY3RlciBpbiBVbmljb2RlIGJsb2NrICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSVJTVF9VTklIQU4gPSAnXHUzNDAwJzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBDT0xMQVRPUiA9IENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5DSElOQSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBIYW56aVRvUGlueWluIHNJbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUhhc0NoaW5hQ29sbGF0b3I7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlcGFyYXRvciBiZXR3ZWVuIHRhcmdldCBzdHJpbmcgZm9yIGVhY2ggc291cmNlIGNoYXIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICIgIjsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVRJTiA9IDE7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBJTllJTiA9IDI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAzOwotCi0gICAgICAgIHB1YmxpYyBUb2tlbigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUb2tlbihpbnQgdHlwZSwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwotICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFR5cGUgb2YgdGhpcyB0b2tlbiwgQVNDSUksIFBJTllJTiBvciBVTktOT1dOLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCB0eXBlOwotICAgICAgICAvKioKLSAgICAgICAgICogT3JpZ2luYWwgc3RyaW5nIGJlZm9yZSB0cmFuc2xhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgc291cmNlOwotICAgICAgICAvKioKLSAgICAgICAgICogVHJhbnNsYXRlZCBzdHJpbmcgb2Ygc291cmNlLiBGb3IgSGFuLCB0YXJnZXQgaXMgY29ycmVzcG9uZGluZyBQaW55aW4uCi0gICAgICAgICAqIE90aGVyd2lzZSB0YXJnZXQgaXMgb3JpZ2luYWwgc3RyaW5nIGluIHNvdXJjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBIYW56aVRvUGlueWluKGJvb2xlYW4gaGFzQ2hpbmFDb2xsYXRvcikgewotICAgICAgICBtSGFzQ2hpbmFDb2xsYXRvciA9IGhhc0NoaW5hQ29sbGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBIYW56aVRvUGlueWluIGdldEluc3RhbmNlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQoSGFuemlUb1Bpbnlpbi5jbGFzcykgewotICAgICAgICAgICAgaWYgKHNJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNJbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHpoX0NOIGNvbGxhdGlvbiBkYXRhIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgZmluYWwgTG9jYWxlIGxvY2FsZVtdID0gQ29sbGF0b3IuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGUubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobG9jYWxlW2ldLmVxdWFscyhMb2NhbGUuQ0hJTkEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBIYW56aVRvUGlueWluKHRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc0luc3RhbmNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgIlRoZXJlIGlzIG5vIENoaW5lc2UgY29sbGF0b3IsIEhhbnppVG9QaW55aW4gaXMgZGlzYWJsZWQiKTsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBIYW56aVRvUGlueWluKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBzSW5zdGFuY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRva2VuIGdldFRva2VuKGNoYXIgY2hhcmFjdGVyKSB7Ci0gICAgICAgIFRva2VuIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBsZXR0ZXIgPSBDaGFyYWN0ZXIudG9TdHJpbmcoY2hhcmFjdGVyKTsKLSAgICAgICAgdG9rZW4uc291cmNlID0gbGV0dGVyOwotICAgICAgICBpbnQgb2Zmc2V0ID0gLTE7Ci0gICAgICAgIGludCBjbXA7Ci0gICAgICAgIGlmIChjaGFyYWN0ZXIgPCAyNTYpIHsKLSAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5MQVRJTjsKLSAgICAgICAgICAgIHRva2VuLnRhcmdldCA9IGxldHRlcjsKLSAgICAgICAgICAgIHJldHVybiB0b2tlbjsKLSAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPCBGSVJTVF9VTklIQU4pIHsKLSAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5VTktOT1dOOwotICAgICAgICAgICAgdG9rZW4udGFyZ2V0ID0gbGV0dGVyOwotICAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY21wID0gQ09MTEFUT1IuY29tcGFyZShsZXR0ZXIsIEZJUlNUX1BJTllJTl9VTklIQU4pOwotICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKLSAgICAgICAgICAgICAgICB0b2tlbi50eXBlID0gVG9rZW4uVU5LTk9XTjsKLSAgICAgICAgICAgICAgICB0b2tlbi50YXJnZXQgPSBsZXR0ZXI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewotICAgICAgICAgICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5QSU5ZSU47Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21wID0gQ09MTEFUT1IuY29tcGFyZShsZXR0ZXIsIExBU1RfUElOWUlOX1VOSUhBTik7Ci0gICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLlVOS05PV047Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuLnRhcmdldCA9IGxldHRlcjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW4udHlwZSA9IFRva2VuLlBJTllJTjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gVU5JSEFOUy5sZW5ndGggLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRva2VuLnR5cGUgPSBUb2tlbi5QSU5ZSU47Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKSB7Ci0gICAgICAgICAgICBpbnQgYmVnaW4gPSAwOwotICAgICAgICAgICAgaW50IGVuZCA9IFVOSUhBTlMubGVuZ3RoIC0gMTsKLSAgICAgICAgICAgIHdoaWxlIChiZWdpbiA8PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSAoYmVnaW4gKyBlbmQpIC8gMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdW5paGFuID0gQ2hhcmFjdGVyLnRvU3RyaW5nKFVOSUhBTlNbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgY21wID0gQ09MTEFUT1IuY29tcGFyZShsZXR0ZXIsIHVuaWhhbik7Ci0gICAgICAgICAgICAgICAgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY21wID4gMCkgewotICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IG9mZnNldCArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gb2Zmc2V0IC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNtcCA8IDApIHsKLSAgICAgICAgICAgIG9mZnNldC0tOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcGlueWluID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBQSU5ZSU5TW29mZnNldF0ubGVuZ3RoICYmIFBJTllJTlNbb2Zmc2V0XVtqXSAhPSAwOyBqKyspIHsKLSAgICAgICAgICAgIHBpbnlpbi5hcHBlbmQoKGNoYXIpUElOWUlOU1tvZmZzZXRdW2pdKTsKLSAgICAgICAgfQotICAgICAgICB0b2tlbi50YXJnZXQgPSBwaW55aW4udG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnQgdGhlIGlucHV0IHRvIGEgYXJyYXkgb2YgdG9rZW5zLiBUaGUgc2VxdWVuY2Ugb2YgQVNDSUkgb3IgVW5rbm93bgotICAgICAqIGNoYXJhY3RlcnMgd2l0aG91dCBzcGFjZSB3aWxsIGJlIHB1dCBpbnRvIGEgVG9rZW4sIE9uZSBIYW56aSBjaGFyYWN0ZXIgCi0gICAgICogd2hpY2ggaGFzIHBpbnlpbiB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBUb2tlbi4KLSAgICAgKiBJZiB0aGVzZSBpcyBubyBDaGluYSBjb2xsYXRvciwgdGhlIGVtcHR5IHRva2VuIGFycmF5IGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUxpc3Q8VG9rZW4+IGdldChmaW5hbCBTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgQXJyYXlMaXN0PFRva2VuPiB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0PFRva2VuPigpOwotICAgICAgICBpZiAoIW1IYXNDaGluYUNvbGxhdG9yIHx8IFRleHRVdGlscy5pc0VtcHR5KGlucHV0KSkgewotICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IHRva2Vucy4KLSAgICAgICAgICAgIHJldHVybiB0b2tlbnM7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBpbnQgdG9rZW5UeXBlID0gVG9rZW4uTEFUSU47Ci0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGlucHV0LCBjcmVhdGUgYSBuZXcgdG9rZW4gd2hlbgotICAgICAgICAvLyBhLiBUb2tlbiB0eXBlIGNoYW5nZWQKLSAgICAgICAgLy8gYi4gR2V0IHRoZSBQaW55aW4gb2YgY3VycmVudCBjaGFyYXRlci4KLSAgICAgICAgLy8gYy4gY3VycmVudCBjaGFyYWN0ZXIgaXMgc3BhY2UuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgY2hhciBjaGFyYWN0ZXIgPSBpbnB1dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hhcmFjdGVyID09ICcgJykgewotICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW4oc2IsIHRva2VucywgdG9rZW5UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA8IDI1NikgewotICAgICAgICAgICAgICAgIGlmICh0b2tlblR5cGUgIT0gVG9rZW4uTEFUSU4gJiYgc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRva2VuKHNiLCB0b2tlbnMsIHRva2VuVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRva2VuVHlwZSA9IFRva2VuLkxBVElOOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaGFyYWN0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPCBGSVJTVF9VTklIQU4pIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW5UeXBlICE9IFRva2VuLlVOS05PV04gJiYgc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFRva2VuKHNiLCB0b2tlbnMsIHRva2VuVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRva2VuVHlwZSA9IFRva2VuLlVOS05PV047Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoYXJhY3Rlcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFRva2VuIHQgPSBnZXRUb2tlbihjaGFyYWN0ZXIpOwotICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT0gVG9rZW4uUElOWUlOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRva2VuKHNiLCB0b2tlbnMsIHRva2VuVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdG9rZW5zLmFkZCh0KTsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gVG9rZW4uUElOWUlOOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblR5cGUgIT0gdC50eXBlICYmIHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9rZW4oc2IsIHRva2VucywgdG9rZW5UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0b2tlblR5cGUgPSB0LnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaGFyYWN0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBhZGRUb2tlbihzYiwgdG9rZW5zLCB0b2tlblR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b2tlbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRva2VuKGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IsIGZpbmFsIEFycmF5TGlzdDxUb2tlbj4gdG9rZW5zLAotICAgICAgICAgICAgZmluYWwgaW50IHRva2VuVHlwZSkgewotICAgICAgICBTdHJpbmcgc3RyID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgdG9rZW5zLmFkZChuZXcgVG9rZW4odG9rZW5UeXBlLCBzdHIsIHN0cikpOwotICAgICAgICBzYi5zZXRMZW5ndGgoMCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9PYmplY3RzLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9PYmplY3RzLmphdmEKaW5kZXggNTk4YTA3OS4uMjY2NDE4MiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvT2JqZWN0cy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL09iamVjdHMuamF2YQpAQCAtMTYsMzQgKzE2LDQ3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIC8qKgogICogT2JqZWN0IHV0aWxpdHkgbWV0aG9kcy4KICAqLwogcHVibGljIGNsYXNzIE9iamVjdHMgewogCiAgICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGUgZ2l2ZW4gb2JqZWN0IGlzbid0IHtAY29kZSBudWxsfS4KKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIHBvc3NpYmx5LW51bGwgb2JqZWN0cyBhcmUgZXF1YWwuIFJldHVybnM6CiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBnaXZlbiBvYmplY3QKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBvYmplY3QgaXMgbnVsbAorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0Bjb2RlIHRydWV9IGlmIHtAY29kZSBhfSBhbmQge0Bjb2RlIGJ9IGFyZSBib3RoIG51bGwuCisgICAgICogPGxpPntAY29kZSB0cnVlfSBpZiB7QGNvZGUgYX0gYW5kIHtAY29kZSBifSBhcmUgYm90aCBub24tbnVsbCBhbmQgdGhleSBhcmUKKyAgICAgKiAgICAgZXF1YWwgYWNjb3JkaW5nIHRvIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9LgorICAgICAqIDxsaT57QGNvZGUgZmFsc2V9IGluIGFsbCBvdGhlciBzaXR1YXRpb25zLgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGFzc3VtZXMgdGhhdCBhbnkgbm9uLW51bGwgb2JqZWN0cyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBjb25mb3JtCisgICAgICogdG8gdGhlIHtAY29kZSBlcXVhbHMoKX0gY29udHJhY3QuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBub25OdWxsKFQgdCkgewotICAgICAgICBpZiAodCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdDsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWwoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgIHJldHVybiBhID09IGIgfHwgKGEgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGUgZ2l2ZW4gb2JqZWN0IGlzbid0IHtAY29kZSBudWxsfS4KKyAgICAgKiBHZW5lcmF0ZXMgYSBoYXNoIGNvZGUgZm9yIG11bHRpcGxlIHZhbHVlcy4gVGhlIGhhc2ggY29kZSBpcyBnZW5lcmF0ZWQgYnkKKyAgICAgKiBjYWxsaW5nIHtAbGluayBBcnJheXMjaGFzaENvZGUoT2JqZWN0W10pfS4KICAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGdpdmVuIG9iamVjdAotICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIG9iamVjdCBpcyBudWxsCisgICAgICogPHA+VGhpcyBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCl9LiBGb3IgZXhhbXBsZSwKKyAgICAgKiBpbiBhbiBvYmplY3QgdGhhdCBoYXMgdGhyZWUgcHJvcGVydGllcywge0Bjb2RlIHh9LCB7QGNvZGUgeX0sIGFuZAorICAgICAqIHtAY29kZSB6fSwgb25lIGNvdWxkIHdyaXRlOgorICAgICAqIDxwcmU+CisgICAgICogcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgKiAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKGdldFgoKSwgZ2V0WSgpLCBnZXRaKCkpOworICAgICAqIH08L3ByZT4KKyAgICAgKgorICAgICAqIDxiPldhcm5pbmc8L2I+OiBXaGVuIGEgc2luZ2xlIG9iamVjdCBpcyBzdXBwbGllZCwgdGhlIHJldHVybmVkIGhhc2ggY29kZQorICAgICAqIGRvZXMgbm90IGVxdWFsIHRoZSBoYXNoIGNvZGUgb2YgdGhhdCBvYmplY3QuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gVCBub25OdWxsKFQgdCwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0OworICAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKE9iamVjdC4uLiBvYmplY3RzKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuaGFzaENvZGUob2JqZWN0cyk7CiAgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVjb25kaXRpb25zLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9QcmVjb25kaXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzYTljMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC91dGlsL1ByZWNvbmRpdGlvbnMuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsOworCisvKioKKyAqIFNpbXBsZSBzdGF0aWMgbWV0aG9kcyB0byBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHlvdXIgb3duIG1ldGhvZHMgdG8gdmVyaWZ5CisgKiBjb3JyZWN0IGFyZ3VtZW50cyBhbmQgc3RhdGUuCisgKi8KK3B1YmxpYyBjbGFzcyBQcmVjb25kaXRpb25zIHsKKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCBhbiBvYmplY3QgcmVmZXJlbmNlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgY2FsbGluZworICAgICAqIG1ldGhvZCBpcyBub3QgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZlcmVuY2UgYW4gb2JqZWN0IHJlZmVyZW5jZQorICAgICAqIEByZXR1cm4gdGhlIG5vbi1udWxsIHJlZmVyZW5jZSB0aGF0IHdhcyB2YWxpZGF0ZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSByZWZlcmVuY2V9IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGNoZWNrTm90TnVsbChUIHJlZmVyZW5jZSkgeworICAgICAgICBpZiAocmVmZXJlbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IGFuIG9iamVjdCByZWZlcmVuY2UgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBjYWxsaW5nCisgICAgICogbWV0aG9kIGlzIG5vdCBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZSBhbiBvYmplY3QgcmVmZXJlbmNlCisgICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgdG8gdXNlIGlmIHRoZSBjaGVjayBmYWlsczsgd2lsbAorICAgICAqICAgICBiZSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdXNpbmcge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9CisgICAgICogQHJldHVybiB0aGUgbm9uLW51bGwgcmVmZXJlbmNlIHRoYXQgd2FzIHZhbGlkYXRlZAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIHJlZmVyZW5jZX0gaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgY2hlY2tOb3ROdWxsKFQgcmVmZXJlbmNlLCBPYmplY3QgZXJyb3JNZXNzYWdlKSB7CisgICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGVycm9yTWVzc2FnZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWZlcmVuY2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQppbmRleCBjNDFiMmNiLi5iOTk0OGZlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKQEAgLTE2LDggKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3OwogCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTI2LDggKzI0LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuRHJhZ0V2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OwogaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwogCiBwdWJsaWMgY2xhc3MgQmFzZUlXaW5kb3cgZXh0ZW5kcyBJV2luZG93LlN0dWIgewogICAgIHByaXZhdGUgSVdpbmRvd1Nlc3Npb24gbVNlc3Npb247CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RNYW5hZ2VyLmFpZGwgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9JSW5wdXRNZXRob2RNYW5hZ2VyLmFpZGwKaW5kZXggODAzOWZkYS4uODEyZjkyYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvSUlucHV0TWV0aG9kTWFuYWdlci5haWRsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0lJbnB1dE1ldGhvZE1hbmFnZXIuYWlkbApAQCAtNjgsNCArNjgsNSBAQAogICAgIGJvb2xlYW4gc2V0Q3VycmVudElucHV0TWV0aG9kU3VidHlwZShpbiBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSk7CiAgICAgYm9vbGVhbiBzd2l0Y2hUb0xhc3RJbnB1dE1ldGhvZChpbiBJQmluZGVyIHRva2VuKTsKICAgICBib29sZWFuIHNldElucHV0TWV0aG9kRW5hYmxlZChTdHJpbmcgaWQsIGJvb2xlYW4gZW5hYmxlZCk7CisgICAgYm9vbGVhbiBzZXRBZGRpdGlvbmFsSW5wdXRNZXRob2RTdWJ0eXBlcyhpbiBJQmluZGVyIHRva2VuLCBpbiBJbnB1dE1ldGhvZFN1YnR5cGVbXSBzdWJ0eXBlcyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtLmphdmEKaW5kZXggMGVmNDg2MS4uYTRiY2Y2MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW0uamF2YQpAQCAtMjM2LDQgKzIzNiwzMSBAQAogICAgIHB1YmxpYyBNZW51SXRlbSBzZXRBY3Rpb25WaWV3KGludCByZXNJZCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0U2hvd0FzQWN0aW9uRmxhZ3MoaW50IGFjdGlvbkVudW0pIHsKKyAgICAgICAgc2V0U2hvd0FzQWN0aW9uKGFjdGlvbkVudW0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VBY3Rpb25WaWV3KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25WaWV3RXhwYW5kZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVudUl0ZW0gc2V0T25BY3Rpb25FeHBhbmRMaXN0ZW5lcihPbkFjdGlvbkV4cGFuZExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gc2F2ZSB0aGUgbGlzdGVuZXI7IEFjdGlvbk1lbnVJdGVtIGRvZXMgbm90IHN1cHBvcnQgY29sbGFwc2luZyBpdGVtcy4KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQWN0aW9uTWVudUl0ZW1WaWV3LmphdmEKaW5kZXggYmVhY2Y3NS4uNDc5Nzg4ZCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51SXRlbVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVJdGVtVmlldy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CkBAIC0xMDMsNiArMTA0LDEyIEBACiAgICAgICAgIC8vIFRPRE8gU3VwcG9ydCBjaGVja2FibGUgYWN0aW9uIGl0ZW1zCiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRleHRCdXR0b25WaXNpYmlsaXR5KCkgeworICAgICAgICBib29sZWFuIHZpc2libGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkobVRleHRCdXR0b24uZ2V0VGV4dCgpKTsKKyAgICAgICAgdmlzaWJsZSA9IHZpc2libGUgJiYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwgfHwgbUl0ZW1EYXRhLnNob3dzVGV4dEFzQWN0aW9uKCkpOworICAgICAgICBtVGV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWSVNJQkxFIDogR09ORSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CiAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKGljb24pOwogICAgICAgICBpZiAoaWNvbiAhPSBudWxsKSB7CkBAIC0xMTEsOSArMTE4LDkgQEAKICAgICAgICAgICAgIG1JbWFnZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KEdPTkUpOwogICAgICAgICB9CiAKLSAgICAgICAgbVRleHRCdXR0b24uc2V0VmlzaWJpbGl0eShpY29uID09IG51bGwgfHwgbUl0ZW1EYXRhLnNob3dzVGV4dEFzQWN0aW9uKCkgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgIHVwZGF0ZVRleHRCdXR0b25WaXNpYmlsaXR5KCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGJvb2xlYW4gaGFzVGV4dCgpIHsKICAgICAgICAgcmV0dXJuIG1UZXh0QnV0dG9uLmdldFZpc2liaWxpdHkoKSAhPSBHT05FOwogICAgIH0KQEAgLTEyOCwxMCArMTM1LDkgQEAKICAgICAgICAgLy8gcG9wdWxhdGUgYWNjZXNzaWJpbGl0eSBkZXNjcmlwdGlvbiB3aXRoIHRpdGxlCiAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7CiAKLSAgICAgICAgaWYgKG1JbWFnZUJ1dHRvbi5nZXREcmF3YWJsZSgpID09IG51bGwgfHwgbUl0ZW1EYXRhLnNob3dzVGV4dEFzQWN0aW9uKCkpIHsKLSAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFRleHQobVRpdGxlKTsKLSAgICAgICAgICAgIG1UZXh0QnV0dG9uLnNldFZpc2liaWxpdHkoVklTSUJMRSk7Ci0gICAgICAgIH0KKyAgICAgICAgbVRleHRCdXR0b24uc2V0VGV4dChtVGl0bGUpOworCisgICAgICAgIHVwZGF0ZVRleHRCdXR0b25WaXNpYmlsaXR5KCk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gc2hvd3NJY29uKCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9BY3Rpb25NZW51UHJlc2VudGVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVQcmVzZW50ZXIuamF2YQppbmRleCAwMDUxZWMzLi45OGMyNzQ3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVQcmVzZW50ZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0FjdGlvbk1lbnVQcmVzZW50ZXIuamF2YQpAQCAtMzksMTAgKzM5LDEzIEBACiAKICAgICBwcml2YXRlIFZpZXcgbU92ZXJmbG93QnV0dG9uOwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZU92ZXJmbG93OworICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzZXJ2ZU92ZXJmbG93U2V0OwogICAgIHByaXZhdGUgaW50IG1XaWR0aExpbWl0OwogICAgIHByaXZhdGUgaW50IG1BY3Rpb25JdGVtV2lkdGhMaW1pdDsKICAgICBwcml2YXRlIGludCBtTWF4SXRlbXM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1NYXhJdGVtc1NldDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVN0cmljdFdpZHRoTGltaXQ7CisgICAgcHJpdmF0ZSBib29sZWFuIG1XaWR0aExpbWl0U2V0OwogCiAgICAgLy8gR3JvdXAgSURzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGFzIGFjdGlvbnMgLSB1c2VkIHRlbXBvcmFyaWx5LCBhbGxvY2F0ZWQgaGVyZSBmb3IgcmV1c2UuCiAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VCb29sZWFuQXJyYXkgbUFjdGlvbkJ1dHRvbkdyb3VwcyA9IG5ldyBTcGFyc2VCb29sZWFuQXJyYXkoKTsKQEAgLTY0LDE0ICs2NywyMSBAQAogICAgICAgICBzdXBlci5pbml0Rm9yTWVudShjb250ZXh0LCBtZW51KTsKIAogICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgZmluYWwgaW50IHNjcmVlbiA9IHJlcy5nZXRDb25maWd1cmF0aW9uKCkuc2NyZWVuTGF5b3V0OwotICAgICAgICAvLyBUT0RPIFVzZSB0aGUgbm8tYnV0dG9ucyBzcGVjaWZpZXIgaW5zdGVhZCBoZXJlCi0gICAgICAgIG1SZXNlcnZlT3ZlcmZsb3cgPSAoc2NyZWVuICYgQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9NQVNLKSA9PQotICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfWExBUkdFOwotICAgICAgICBtV2lkdGhMaW1pdCA9IHJlcy5nZXREaXNwbGF5TWV0cmljcygpLndpZHRoUGl4ZWxzIC8gMjsKKworICAgICAgICBpZiAoIW1SZXNlcnZlT3ZlcmZsb3dTZXQpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gVXNlIHRoZSBuby1idXR0b25zIHNwZWNpZmllciBpbnN0ZWFkIGhlcmUKKyAgICAgICAgICAgIG1SZXNlcnZlT3ZlcmZsb3cgPSByZXMuZ2V0Q29uZmlndXJhdGlvbigpCisgICAgICAgICAgICAgICAgICAgIC5pc0xheW91dFNpemVBdExlYXN0KENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTEFSR0UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtV2lkdGhMaW1pdFNldCkgeworICAgICAgICAgICAgbVdpZHRoTGltaXQgPSByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAvIDI7CisgICAgICAgIH0KIAogICAgICAgICAvLyBNZWFzdXJlIGZvciBpbml0aWFsIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgbU1heEl0ZW1zID0gcmVzLmdldEludGVnZXIoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pbnRlZ2VyLm1heF9hY3Rpb25fYnV0dG9ucyk7CisgICAgICAgIGlmICghbU1heEl0ZW1zU2V0KSB7CisgICAgICAgICAgICBtTWF4SXRlbXMgPSByZXMuZ2V0SW50ZWdlcihjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIubWF4X2FjdGlvbl9idXR0b25zKTsKKyAgICAgICAgfQogCiAgICAgICAgIGludCB3aWR0aCA9IG1XaWR0aExpbWl0OwogICAgICAgICBpZiAobVJlc2VydmVPdmVyZmxvdykgewpAQCAtOTIsMTUgKzEwMiwxOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFdpZHRoTGltaXQoaW50IHdpZHRoLCBib29sZWFuIHN0cmljdCkgewotICAgICAgICBpZiAobVJlc2VydmVPdmVyZmxvdykgewotICAgICAgICAgICAgd2lkdGggLT0gbU92ZXJmbG93QnV0dG9uLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgfQotICAgICAgICBtQWN0aW9uSXRlbVdpZHRoTGltaXQgPSB3aWR0aDsKKyAgICAgICAgbVdpZHRoTGltaXQgPSB3aWR0aDsKICAgICAgICAgbVN0cmljdFdpZHRoTGltaXQgPSBzdHJpY3Q7CisgICAgICAgIG1XaWR0aExpbWl0U2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNlcnZlT3ZlcmZsb3coYm9vbGVhbiByZXNlcnZlT3ZlcmZsb3cpIHsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvdyA9IHJlc2VydmVPdmVyZmxvdzsKKyAgICAgICAgbVJlc2VydmVPdmVyZmxvd1NldCA9IHRydWU7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0SXRlbUxpbWl0KGludCBpdGVtQ291bnQpIHsKICAgICAgICAgbU1heEl0ZW1zID0gaXRlbUNvdW50OworICAgICAgICBtTWF4SXRlbXNTZXQgPSB0cnVlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTEyLDggKzEyNiwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFZpZXcgZ2V0SXRlbVZpZXcoTWVudUl0ZW1JbXBsIGl0ZW0sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgZmluYWwgVmlldyBhY3Rpb25WaWV3ID0gaXRlbS5nZXRBY3Rpb25WaWV3KCk7Ci0gICAgICAgIHJldHVybiBhY3Rpb25WaWV3ICE9IG51bGwgPyBhY3Rpb25WaWV3IDogc3VwZXIuZ2V0SXRlbVZpZXcoaXRlbSwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgICAgIFZpZXcgYWN0aW9uVmlldyA9IGl0ZW0uZ2V0QWN0aW9uVmlldygpOworICAgICAgICBhY3Rpb25WaWV3ID0gYWN0aW9uVmlldyAhPSBudWxsICYmICFpdGVtLmhhc0NvbGxhcHNpYmxlQWN0aW9uVmlldygpID8KKyAgICAgICAgICAgICAgICBhY3Rpb25WaWV3IDogc3VwZXIuZ2V0SXRlbVZpZXcoaXRlbSwgY29udmVydFZpZXcsIHBhcmVudCk7CisgICAgICAgIGFjdGlvblZpZXcuc2V0VmlzaWJpbGl0eShpdGVtLmlzQWN0aW9uVmlld0V4cGFuZGVkKCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICByZXR1cm4gYWN0aW9uVmlldzsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTMwMyw3ICszMjAsNyBAQAogCiAgICAgICAgICAgICBpZiAoaXRlbS5yZXF1aXJlc0FjdGlvbkJ1dHRvbigpKSB7CiAgICAgICAgICAgICAgICAgVmlldyB2ID0gaXRlbS5nZXRBY3Rpb25WaWV3KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwgfHwgaXRlbS5oYXNDb2xsYXBzaWJsZUFjdGlvblZpZXcoKSkgewogICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0SXRlbVZpZXcoaXRlbSwgbVNjcmFwQWN0aW9uQnV0dG9uVmlldywgcGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JhcEFjdGlvbkJ1dHRvblZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbVNjcmFwQWN0aW9uQnV0dG9uVmlldyA9IHY7CkBAIC0zMjksNyArMzQ2LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChpc0FjdGlvbikgewogICAgICAgICAgICAgICAgICAgICBWaWV3IHYgPSBpdGVtLmdldEFjdGlvblZpZXcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IGl0ZW0uaGFzQ29sbGFwc2libGVBY3Rpb25WaWV3KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRJdGVtVmlldyhpdGVtLCBtU2NyYXBBY3Rpb25CdXR0b25WaWV3LCBwYXJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TY3JhcEFjdGlvbkJ1dHRvblZpZXcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TY3JhcEFjdGlvbkJ1dHRvblZpZXcgPSB2OwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9CYXNlTWVudVByZXNlbnRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9CYXNlTWVudVByZXNlbnRlci5qYXZhCmluZGV4IDE2ZjUxZmQuLmRkYmIwOGMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvQmFzZU1lbnVQcmVzZW50ZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0Jhc2VNZW51UHJlc2VudGVyLmphdmEKQEAgLTE5Miw0ICsxOTIsMTIgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBmbGFnQWN0aW9uSXRlbXMoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9JY29uTWVudUl0ZW1WaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51SXRlbVZpZXcuamF2YQppbmRleCBjMzM3YTVkLi5hNzQzY2ZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51SXRlbVZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0ljb25NZW51SXRlbVZpZXcuamF2YQpAQCAtMjgxLDggKzI4MSwxMCBAQAogICAgICAgICBSZWN0IHRtcFJlY3QgPSBtUG9zaXRpb25JY29uT3V0cHV0OwogICAgICAgICBnZXRMaW5lQm91bmRzKDAsIHRtcFJlY3QpOwogICAgICAgICBtUG9zaXRpb25JY29uQXZhaWxhYmxlLnNldCgwLCAwLCBnZXRXaWR0aCgpLCB0bXBSZWN0LnRvcCk7CisgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvbigpOwogICAgICAgICBHcmF2aXR5LmFwcGx5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMIHwgR3Jhdml0eS5MRUZULCBtSWNvbi5nZXRJbnRyaW5zaWNXaWR0aCgpLCBtSWNvbgotICAgICAgICAgICAgICAgIC5nZXRJbnRyaW5zaWNIZWlnaHQoKSwgbVBvc2l0aW9uSWNvbkF2YWlsYWJsZSwgbVBvc2l0aW9uSWNvbk91dHB1dCwgaXNMYXlvdXRSdGwoKSk7CisgICAgICAgICAgICAgICAgLmdldEludHJpbnNpY0hlaWdodCgpLCBtUG9zaXRpb25JY29uQXZhaWxhYmxlLCBtUG9zaXRpb25JY29uT3V0cHV0LAorICAgICAgICAgICAgICAgIGxheW91dERpcmVjdGlvbik7CiAgICAgICAgIG1JY29uLnNldEJvdW5kcyhtUG9zaXRpb25JY29uT3V0cHV0KTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTGlzdE1lbnVQcmVzZW50ZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTGlzdE1lbnVQcmVzZW50ZXIuamF2YQppbmRleCAyY2IyYTEwLi5jYzA5OTI3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L0xpc3RNZW51UHJlc2VudGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9MaXN0TWVudVByZXNlbnRlci5qYXZhCkBAIC0xNTksNiArMTU5LDE0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc2F2ZUhpZXJhcmNoeVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewogICAgICAgICBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPiB2aWV3U3RhdGVzID0gbmV3IFNwYXJzZUFycmF5PFBhcmNlbGFibGU+KCk7CiAgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgewpAQCAtMTY5LDcgKzE3Nyw5IEBACiAKICAgICBwdWJsaWMgdm9pZCByZXN0b3JlSGllcmFyY2h5U3RhdGUoQnVuZGxlIGluU3RhdGUpIHsKICAgICAgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gdmlld1N0YXRlcyA9IGluU3RhdGUuZ2V0U3BhcnNlUGFyY2VsYWJsZUFycmF5KFZJRVdTX1RBRyk7Ci0gICAgICAgICgoVmlldykgbU1lbnVWaWV3KS5yZXN0b3JlSGllcmFyY2h5U3RhdGUodmlld1N0YXRlcyk7CisgICAgICAgIGlmICh2aWV3U3RhdGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICgoVmlldykgbU1lbnVWaWV3KS5yZXN0b3JlSGllcmFyY2h5U3RhdGUodmlld1N0YXRlcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIE1lbnVBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51QnVpbGRlci5qYXZhCmluZGV4IGU5ZmNiMjMuLmZkZmE5NTQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUJ1aWxkZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVCdWlsZGVyLmphdmEKQEAgLTc0NCwxMSArNzQ0LDE0IEBACiAgICAgICAgIAogICAgICAgICBpZiAoaXRlbUltcGwgPT0gbnVsbCB8fCAhaXRlbUltcGwuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSAgICAgICAgCisgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIGJvb2xlYW4gaW52b2tlZCA9IGl0ZW1JbXBsLmludm9rZSgpOwogCi0gICAgICAgIGlmIChpdGVtLmhhc1N1Yk1lbnUoKSkgeworICAgICAgICBpZiAoaXRlbUltcGwuaGFzQ29sbGFwc2libGVBY3Rpb25WaWV3KCkpIHsKKyAgICAgICAgICAgIGludm9rZWQgfD0gaXRlbUltcGwuZXhwYW5kQWN0aW9uVmlldygpOworICAgICAgICAgICAgaWYgKGludm9rZWQpIGNsb3NlKHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaGFzU3ViTWVudSgpKSB7CiAgICAgICAgICAgICBjbG9zZShmYWxzZSk7CiAKICAgICAgICAgICAgIGludm9rZWQgfD0gZGlzcGF0Y2hTdWJNZW51U2VsZWN0ZWQoKFN1Yk1lbnVCdWlsZGVyKSBpdGVtLmdldFN1Yk1lbnUoKSk7CkBAIC0xMDgxLDQgKzEwODQsNDIgQEAKICAgICBib29sZWFuIGdldE9wdGlvbmFsSWNvbnNWaXNpYmxlKCkgewogICAgICAgICByZXR1cm4gbU9wdGlvbmFsSWNvbnNWaXNpYmxlOwogICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGV4cGFuZEl0ZW1BY3Rpb25WaWV3KE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIGlmIChtUHJlc2VudGVycy5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBib29sZWFuIGV4cGFuZGVkID0gZmFsc2U7CisKKyAgICAgICAgc3RvcERpc3BhdGNoaW5nSXRlbXNDaGFuZ2VkKCk7CisgICAgICAgIGZvciAoV2Vha1JlZmVyZW5jZTxNZW51UHJlc2VudGVyPiByZWYgOiBtUHJlc2VudGVycykgeworICAgICAgICAgICAgZmluYWwgTWVudVByZXNlbnRlciBwcmVzZW50ZXIgPSByZWYuZ2V0KCk7CisgICAgICAgICAgICBpZiAocHJlc2VudGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGVycy5yZW1vdmUocmVmKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV4cGFuZGVkID0gcHJlc2VudGVyLmV4cGFuZEl0ZW1BY3Rpb25WaWV3KHRoaXMsIGl0ZW0pKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXJ0RGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKworICAgICAgICByZXR1cm4gZXhwYW5kZWQ7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VJdGVtQWN0aW9uVmlldyhNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICBpZiAobVByZXNlbnRlcnMuaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgYm9vbGVhbiBjb2xsYXBzZWQgPSBmYWxzZTsKKworICAgICAgICBzdG9wRGlzcGF0Y2hpbmdJdGVtc0NoYW5nZWQoKTsKKyAgICAgICAgZm9yIChXZWFrUmVmZXJlbmNlPE1lbnVQcmVzZW50ZXI+IHJlZiA6IG1QcmVzZW50ZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBNZW51UHJlc2VudGVyIHByZXNlbnRlciA9IHJlZi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1QcmVzZW50ZXJzLnJlbW92ZShyZWYpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoY29sbGFwc2VkID0gcHJlc2VudGVyLmNvbGxhcHNlSXRlbUFjdGlvblZpZXcodGhpcywgaXRlbSkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhcnREaXNwYXRjaGluZ0l0ZW1zQ2hhbmdlZCgpOworCisgICAgICAgIHJldHVybiBjb2xsYXBzZWQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudUl0ZW1JbXBsLmphdmEKaW5kZXggYzZkMzg2ZC4uMWE2Y2M1NCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51SXRlbUltcGwuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVJdGVtSW1wbC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVWaWV3Lkl0ZW1WaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CkBAIC0yOCw2ICsyOSw3IEBACiBpbXBvcnQgYW5kcm9pZC52aWV3LlN1Yk1lbnU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdEZWJ1ZzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiAKIC8qKgogICogQGhpZGUKQEAgLTc3LDYgKzc5LDggQEAKICAgICBwcml2YXRlIGludCBtU2hvd0FzQWN0aW9uID0gU0hPV19BU19BQ1RJT05fTkVWRVI7CiAKICAgICBwcml2YXRlIFZpZXcgbUFjdGlvblZpZXc7CisgICAgcHJpdmF0ZSBPbkFjdGlvbkV4cGFuZExpc3RlbmVyIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyOworICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBY3Rpb25WaWV3RXhwYW5kZWQgPSBmYWxzZTsKIAogICAgIC8qKiBVc2VkIGZvciB0aGUgaWNvbiByZXNvdXJjZSBJRCBpZiB0aGlzIGl0ZW0gZG9lcyBub3QgaGF2ZSBhbiBpY29uICovCiAgICAgc3RhdGljIGZpbmFsIGludCBOT19JQ09OID0gMDsKQEAgLTU1MiwxMyArNTU2LDcwIEBACiAgICAgfQogCiAgICAgcHVibGljIE1lbnVJdGVtIHNldEFjdGlvblZpZXcoaW50IHJlc0lkKSB7Ci0gICAgICAgIExheW91dEluZmxhdGVyIGluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShtTWVudS5nZXRDb250ZXh0KCkpOwotICAgICAgICAvLyBUT0RPIC0gRml4IGZvciBwcm9wZXIgcGFyZW50LiBMYXppbHkgaW5mbGF0ZSBpbiB0aGUgcHJlc2VudGVyLgotICAgICAgICBzZXRBY3Rpb25WaWV3KGluZmxhdGVyLmluZmxhdGUocmVzSWQsIG51bGwpKTsKKyAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbU1lbnUuZ2V0Q29udGV4dCgpOworICAgICAgICBmaW5hbCBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisgICAgICAgIHNldEFjdGlvblZpZXcoaW5mbGF0ZXIuaW5mbGF0ZShyZXNJZCwgbmV3IExpbmVhckxheW91dChjb250ZXh0KSkpOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICBwdWJsaWMgVmlldyBnZXRBY3Rpb25WaWV3KCkgewogICAgICAgICByZXR1cm4gbUFjdGlvblZpZXc7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lbnVJdGVtIHNldFNob3dBc0FjdGlvbkZsYWdzKGludCBhY3Rpb25FbnVtKSB7CisgICAgICAgIHNldFNob3dBc0FjdGlvbihhY3Rpb25FbnVtKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kQWN0aW9uVmlldygpIHsKKyAgICAgICAgaWYgKChtU2hvd0FzQWN0aW9uICYgU0hPV19BU19BQ1RJT05fQ09MTEFQU0VfQUNUSU9OX1ZJRVcpID09IDAgfHwgbUFjdGlvblZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICBtT25BY3Rpb25FeHBhbmRMaXN0ZW5lci5vbk1lbnVJdGVtQWN0aW9uRXhwYW5kKHRoaXMpKSB7CisgICAgICAgICAgICByZXR1cm4gbU1lbnUuZXhwYW5kSXRlbUFjdGlvblZpZXcodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VBY3Rpb25WaWV3KCkgeworICAgICAgICBpZiAoKG1TaG93QXNBY3Rpb24gJiBTSE9XX0FTX0FDVElPTl9DT0xMQVBTRV9BQ1RJT05fVklFVykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChtQWN0aW9uVmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IGNvbGxhcHNlZCBpZiB3ZSBoYXZlIG5vIGFjdGlvbiB2aWV3LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9uQWN0aW9uRXhwYW5kTGlzdGVuZXIgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgIG1PbkFjdGlvbkV4cGFuZExpc3RlbmVyLm9uTWVudUl0ZW1BY3Rpb25Db2xsYXBzZSh0aGlzKSkgeworICAgICAgICAgICAgcmV0dXJuIG1NZW51LmNvbGxhcHNlSXRlbUFjdGlvblZpZXcodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lbnVJdGVtIHNldE9uQWN0aW9uRXhwYW5kTGlzdGVuZXIoT25BY3Rpb25FeHBhbmRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25BY3Rpb25FeHBhbmRMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb2xsYXBzaWJsZUFjdGlvblZpZXcoKSB7CisgICAgICAgIHJldHVybiAobVNob3dBc0FjdGlvbiAmIFNIT1dfQVNfQUNUSU9OX0NPTExBUFNFX0FDVElPTl9WSUVXKSAhPSAwICYmIG1BY3Rpb25WaWV3ICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWN0aW9uVmlld0V4cGFuZGVkKGJvb2xlYW4gaXNFeHBhbmRlZCkgeworICAgICAgICBtSXNBY3Rpb25WaWV3RXhwYW5kZWQgPSBpc0V4cGFuZGVkOworICAgICAgICBtTWVudS5vbkl0ZW1zQ2hhbmdlZChmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBY3Rpb25WaWV3RXhwYW5kZWQoKSB7CisgICAgICAgIHJldHVybiBtSXNBY3Rpb25WaWV3RXhwYW5kZWQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVBvcHVwSGVscGVyLmphdmEKaW5kZXggMzhjZWMyOS4uOGRiN2UzYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UG9wdXBIZWxwZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L01lbnVQb3B1cEhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudTsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwpAQCAtNzEsOCArNzIsOSBAQAogICAgICAgICBtTWVudSA9IG1lbnU7CiAgICAgICAgIG1PdmVyZmxvd09ubHkgPSBvdmVyZmxvd09ubHk7CiAKLSAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgbVBvcHVwTWF4V2lkdGggPSBtZXRyaWNzLndpZHRoUGl4ZWxzIC8gMjsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIG1Qb3B1cE1heFdpZHRoID0gTWF0aC5tYXgocmVzLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMgLyAyLAorICAgICAgICAgICAgICAgIHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5jb25maWdfcHJlZkRpYWxvZ1dpZHRoKSk7CiAKICAgICAgICAgbUFuY2hvclZpZXcgPSBhbmNob3JWaWV3OwogCkBAIC0yNTAsNiArMjUyLDE0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY29sbGFwc2VJdGVtQWN0aW9uVmlldyhNZW51QnVpbGRlciBtZW51LCBNZW51SXRlbUltcGwgaXRlbSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHJpdmF0ZSBjbGFzcyBNZW51QWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKICAgICAgICAgcHJpdmF0ZSBNZW51QnVpbGRlciBtQWRhcHRlck1lbnU7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvTWVudVByZXNlbnRlci5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UHJlc2VudGVyLmphdmEKaW5kZXggNWJhZjQxOS4uYmQ2NjQ0OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UHJlc2VudGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9NZW51UHJlc2VudGVyLmphdmEKQEAgLTEwNyw0ICsxMDcsMjIgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBwcmVzZW50ZXIgY2hhbmdlZCB0aGUgYWN0aW9uIHN0YXR1cyBvZiBhbnkgaXRlbXMuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gZmxhZ0FjdGlvbkl0ZW1zKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIG1lbnUgaXRlbSB3aXRoIGEgY29sbGFwc2FibGUgYWN0aW9uIHZpZXcgc2hvdWxkIGV4cGFuZCBpdHMgYWN0aW9uIHZpZXcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSBNZW51IGNvbnRhaW5pbmcgdGhlIGl0ZW0gdG8gYmUgZXhwYW5kZWQKKyAgICAgKiBAcGFyYW0gaXRlbSBJdGVtIHRvIGJlIGV4cGFuZGVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcHJlc2VudGVyIGV4cGFuZGVkIHRoZSBhY3Rpb24gdmlldywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4cGFuZEl0ZW1BY3Rpb25WaWV3KE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtSW1wbCBpdGVtKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIGEgbWVudSBpdGVtIHdpdGggYSBjb2xsYXBzYWJsZSBhY3Rpb24gdmlldyBzaG91bGQgY29sbGFwc2UgaXRzIGFjdGlvbiB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIG1lbnUgTWVudSBjb250YWluaW5nIHRoZSBpdGVtIHRvIGJlIGNvbGxhcHNlZAorICAgICAqIEBwYXJhbSBpdGVtIEl0ZW0gdG8gYmUgY29sbGFwc2VkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcHJlc2VudGVyIGNvbGxhcHNlZCB0aGUgYWN0aW9uIHZpZXcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZUl0ZW1BY3Rpb25WaWV3KE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtSW1wbCBpdGVtKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvU3ViTWVudUJ1aWxkZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L21lbnUvU3ViTWVudUJ1aWxkZXIuamF2YQppbmRleCA4MzQwNDFmLi5mYjFjZDVlIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9tZW51L1N1Yk1lbnVCdWlsZGVyLmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvbWVudS9TdWJNZW51QnVpbGRlci5qYXZhCkBAIC0xMTEsNCArMTExLDE0IEBACiAgICAgcHVibGljIFN1Yk1lbnUgc2V0SGVhZGVyVmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgcmV0dXJuIChTdWJNZW51KSBzdXBlci5zZXRIZWFkZXJWaWV3SW50KHZpZXcpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGV4cGFuZEl0ZW1BY3Rpb25WaWV3KE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50TWVudS5leHBhbmRJdGVtQWN0aW9uVmlldyhpdGVtKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZUl0ZW1BY3Rpb25WaWV3KE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgIHJldHVybiBtUGFyZW50TWVudS5jb2xsYXBzZUl0ZW1BY3Rpb25WaWV3KGl0ZW0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWJzQWN0aW9uQmFyVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BYnNBY3Rpb25CYXJWaWV3LmphdmEKaW5kZXggNzg4ODgzYi4uY2NiY2UzZSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BYnNBY3Rpb25CYXJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BYnNBY3Rpb25CYXJWaWV3LmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic0FjdGlvbkJhclZpZXcgZXh0ZW5kcyBWaWV3R3JvdXAgewogICAgIHByb3RlY3RlZCBBY3Rpb25NZW51VmlldyBtTWVudVZpZXc7Ci0gICAgcHJvdGVjdGVkIEFjdGlvbk1lbnVQcmVzZW50ZXIgbU1lbnVQcmVzZW50ZXI7CisgICAgcHJvdGVjdGVkIEFjdGlvbk1lbnVQcmVzZW50ZXIgbUFjdGlvbk1lbnVQcmVzZW50ZXI7CiAgICAgcHJvdGVjdGVkIEFjdGlvbkJhckNvbnRhaW5lciBtU3BsaXRWaWV3OwogCiAgICAgcHJvdGVjdGVkIEFuaW1hdG9yIG1WaXNpYmlsaXR5QW5pbTsKQEAgLTEwOCw4ICsxMDgsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIHNob3dPdmVyZmxvd01lbnUoKSB7Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lbnVQcmVzZW50ZXIuc2hvd092ZXJmbG93TWVudSgpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyLnNob3dPdmVyZmxvd01lbnUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTIzLDI2ICsxMjMsMjYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoaWRlT3ZlcmZsb3dNZW51KCkgewotICAgICAgICBpZiAobU1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZW51UHJlc2VudGVyLmhpZGVPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25NZW51UHJlc2VudGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTWVudVByZXNlbnRlci5oaWRlT3ZlcmZsb3dNZW51KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcmZsb3dNZW51U2hvd2luZygpIHsKLSAgICAgICAgaWYgKG1NZW51UHJlc2VudGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVudVByZXNlbnRlci5pc092ZXJmbG93TWVudVNob3dpbmcoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25NZW51UHJlc2VudGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTWVudVByZXNlbnRlci5pc092ZXJmbG93TWVudVNob3dpbmcoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd1Jlc2VydmVkKCkgewotICAgICAgICByZXR1cm4gbU1lbnVQcmVzZW50ZXIgIT0gbnVsbCAmJiBtTWVudVByZXNlbnRlci5pc092ZXJmbG93UmVzZXJ2ZWQoKTsKKyAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyICE9IG51bGwgJiYgbUFjdGlvbk1lbnVQcmVzZW50ZXIuaXNPdmVyZmxvd1Jlc2VydmVkKCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZGlzbWlzc1BvcHVwTWVudXMoKSB7Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVudVByZXNlbnRlci5kaXNtaXNzUG9wdXBNZW51cygpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbUFjdGlvbk1lbnVQcmVzZW50ZXIuZGlzbWlzc1BvcHVwTWVudXMoKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250YWluZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGFpbmVyLmphdmEKaW5kZXggMTcyNjM5MC4uZDcxMGNmYSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250YWluZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRhaW5lci5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0OwogCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwpAQCAtMzIsNiArMzMsNyBAQAogcHVibGljIGNsYXNzIEFjdGlvbkJhckNvbnRhaW5lciBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzVHJhbnNpdGlvbmluZzsKICAgICBwcml2YXRlIFZpZXcgbVRhYkNvbnRhaW5lcjsKKyAgICBwcml2YXRlIEFjdGlvbkJhclZpZXcgbUFjdGlvbkJhclZpZXc7CiAKICAgICBwdWJsaWMgQWN0aW9uQmFyQ29udGFpbmVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwpAQCAtNDYsNiArNDgsMTIgQEAKICAgICAgICAgYS5yZWN5Y2xlKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKyAgICAgICAgbUFjdGlvbkJhclZpZXcgPSAoQWN0aW9uQmFyVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuYWN0aW9uX2Jhcik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBhY3Rpb24gYmFyIGludG8gYSAidHJhbnNpdGlvbmluZyIgc3RhdGUuIFdoaWxlIHRyYW5zaXRpb25pbmcKICAgICAgKiB0aGUgYmFyIHdpbGwgYmxvY2sgZm9jdXMgYW5kIHRvdWNoIGZyb20gYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4gVGhpcwpAQCAtMTAxLDkgKzEwOSw4IEBACiAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtVGFiQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGlsZCA9PSBtVGFiQ29udGFpbmVyKSBjb250aW51ZTsKIAogICAgICAgICAgICAgZmluYWwgTGF5b3V0UGFyYW1zIGxwID0gKExheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7CiAgICAgICAgICAgICBub25UYWJIZWlnaHQgPSBNYXRoLm1heChub25UYWJIZWlnaHQsCkBAIC0xMjUsOCArMTMyLDIyIEBACiAgICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGwsIHQsIHIsIGIpOwogICAgICAgICBpZiAobVRhYkNvbnRhaW5lciAhPSBudWxsICYmIG1UYWJDb250YWluZXIuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBjb250YWluZXJIZWlnaHQgPSBnZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgbVRhYkNvbnRhaW5lci5sYXlvdXQobCwgY29udGFpbmVySGVpZ2h0IC0gbVRhYkNvbnRhaW5lci5nZXRNZWFzdXJlZEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICByLCBjb250YWluZXJIZWlnaHQpOworICAgICAgICAgICAgZmluYWwgaW50IHRhYkhlaWdodCA9IG1UYWJDb250YWluZXIuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKKworICAgICAgICAgICAgaWYgKChtQWN0aW9uQmFyVmlldy5nZXREaXNwbGF5T3B0aW9ucygpICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19IT01FKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IHNob3dpbmcgaG9tZSwgcHV0IHRhYnMgb24gdG9wLgorICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gbVRhYkNvbnRhaW5lcikgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQub2Zmc2V0VG9wQW5kQm90dG9tKHRhYkhlaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UYWJDb250YWluZXIubGF5b3V0KGwsIDAsIHIsIHRhYkhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UYWJDb250YWluZXIubGF5b3V0KGwsIGNvbnRhaW5lckhlaWdodCAtIHRhYkhlaWdodCwgciwgY29udGFpbmVySGVpZ2h0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyQ29udGV4dFZpZXcuamF2YQppbmRleCBjODIzMjNlLi5mYzQzOTk0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhckNvbnRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9BY3Rpb25CYXJDb250ZXh0Vmlldy5qYXZhCkBAIC0xNSwyNiArMTUsMjYgQEAKICAqLwogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQ7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51UHJlc2VudGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7Ci0KIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0OwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwogaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51UHJlc2VudGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CisKIC8qKgogICogQGhpZGUKICAqLwpAQCAtMTMwLDI2ICsxMzAsMjMgQEAKICAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IChMaW5lYXJMYXlvdXQpIGdldENoaWxkQXQoZ2V0Q2hpbGRDb3VudCgpIC0gMSk7CiAgICAgICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7CiAgICAgICAgICAgICBtU3VidGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl9zdWJ0aXRsZSk7Ci0gICAgICAgICAgICBpZiAobVRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKLSAgICAgICAgICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtVGl0bGVTdHlsZVJlcyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaXRsZVN0eWxlUmVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtVGl0bGVTdHlsZVJlcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKLSAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtU3VidGl0bGVTdHlsZVJlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIGlmIChtU3VidGl0bGVTdHlsZVJlcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVN1YnRpdGxlU3R5bGVSZXMpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1UaXRsZSk7Ci0gICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShtU3VidGl0bGUgIT0gbnVsbCA/IFZJU0lCTEUgOiBHT05FKTsKLSAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQuZ2V0UGFyZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQobVN1YnRpdGxlKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGhhc1RpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KG1UaXRsZSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkobVN1YnRpdGxlKTsKKyAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KGhhc1N1YnRpdGxlID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICBtVGl0bGVMYXlvdXQuc2V0VmlzaWJpbGl0eShoYXNUaXRsZSB8fCBoYXNTdWJ0aXRsZSA/IFZJU0lCTEUgOiBHT05FKTsKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dC5nZXRQYXJlbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBhZGRWaWV3KG1UaXRsZUxheW91dCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE3MCwyNCArMTY3LDI3IEBACiAgICAgICAgIH0pOwogCiAgICAgICAgIGZpbmFsIE1lbnVCdWlsZGVyIG1lbnUgPSAoTWVudUJ1aWxkZXIpIG1vZGUuZ2V0TWVudSgpOwotICAgICAgICBtTWVudVByZXNlbnRlciA9IG5ldyBBY3Rpb25NZW51UHJlc2VudGVyKCk7Ci0gICAgICAgIG1lbnUuYWRkTWVudVByZXNlbnRlcihtTWVudVByZXNlbnRlcik7Ci0gICAgICAgIG1NZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgbU1lbnVQcmVzZW50ZXIuZ2V0TWVudVZpZXcodGhpcyk7CisgICAgICAgIG1BY3Rpb25NZW51UHJlc2VudGVyID0gbmV3IEFjdGlvbk1lbnVQcmVzZW50ZXIoKTsKKyAgICAgICAgbUFjdGlvbk1lbnVQcmVzZW50ZXIuc2V0UmVzZXJ2ZU92ZXJmbG93KHRydWUpOwogCiAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBsYXlvdXRQYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCiAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1NZW51Vmlldy5zZXRMYXlvdXRQYXJhbXMobGF5b3V0UGFyYW1zKTsKICAgICAgICAgaWYgKG1TcGxpdFZpZXcgPT0gbnVsbCkgewotICAgICAgICAgICAgYWRkVmlldyhtTWVudVZpZXcpOworICAgICAgICAgICAgbWVudS5hZGRNZW51UHJlc2VudGVyKG1BY3Rpb25NZW51UHJlc2VudGVyKTsKKyAgICAgICAgICAgIG1NZW51VmlldyA9IChBY3Rpb25NZW51VmlldykgbUFjdGlvbk1lbnVQcmVzZW50ZXIuZ2V0TWVudVZpZXcodGhpcyk7CisgICAgICAgICAgICBhZGRWaWV3KG1NZW51VmlldywgbGF5b3V0UGFyYW1zKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEFsbG93IGZ1bGwgc2NyZWVuIHdpZHRoIGluIHNwbGl0IG1vZGUuCi0gICAgICAgICAgICBtTWVudVByZXNlbnRlci5zZXRXaWR0aExpbWl0KAorICAgICAgICAgICAgbUFjdGlvbk1lbnVQcmVzZW50ZXIuc2V0V2lkdGhMaW1pdCgKICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMsIHRydWUpOwogICAgICAgICAgICAgLy8gTm8gbGltaXQgdG8gdGhlIGl0ZW0gY291bnQ7IHVzZSB3aGF0ZXZlciB3aWxsIGZpdC4KLSAgICAgICAgICAgIG1NZW51UHJlc2VudGVyLnNldEl0ZW1MaW1pdChJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBtQWN0aW9uTWVudVByZXNlbnRlci5zZXRJdGVtTGltaXQoSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgICAgICAgLy8gU3BhbiB0aGUgd2hvbGUgd2lkdGgKICAgICAgICAgICAgIGxheW91dFBhcmFtcy53aWR0aCA9IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgICAgICBtU3BsaXRWaWV3LmFkZFZpZXcobU1lbnVWaWV3KTsKKyAgICAgICAgICAgIGxheW91dFBhcmFtcy5oZWlnaHQgPSBtQ29udGVudEhlaWdodDsKKyAgICAgICAgICAgIG1lbnUuYWRkTWVudVByZXNlbnRlcihtQWN0aW9uTWVudVByZXNlbnRlcik7CisgICAgICAgICAgICBtTWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIG1BY3Rpb25NZW51UHJlc2VudGVyLmdldE1lbnVWaWV3KHRoaXMpOworICAgICAgICAgICAgbVNwbGl0Vmlldy5hZGRWaWV3KG1NZW51VmlldywgbGF5b3V0UGFyYW1zKTsKICAgICAgICAgfQogCiAgICAgICAgIG1BbmltYXRlSW5PbkxheW91dCA9IHRydWU7CkBAIC0yMjgsMjMgKzIyOCwyNiBAQAogICAgICAgICBtQW5pbWF0ZUluT25MYXlvdXQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBzaG93T3ZlcmZsb3dNZW51KCkgewotICAgICAgICBpZiAobU1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZW51UHJlc2VudGVyLnNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25NZW51UHJlc2VudGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtQWN0aW9uTWVudVByZXNlbnRlci5zaG93T3ZlcmZsb3dNZW51KCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGhpZGVPdmVyZmxvd01lbnUoKSB7Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lbnVQcmVzZW50ZXIuaGlkZU92ZXJmbG93TWVudSgpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyLmhpZGVPdmVyZmxvd01lbnUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVyZmxvd01lbnVTaG93aW5nKCkgewotICAgICAgICBpZiAobU1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZW51UHJlc2VudGVyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworICAgICAgICBpZiAobUFjdGlvbk1lbnVQcmVzZW50ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1BY3Rpb25NZW51UHJlc2VudGVyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0FjdGlvbkJhclZpZXcuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCmluZGV4IGI3YWFjMTQuLmM0NzVlZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvQWN0aW9uQmFyVmlldy5qYXZhCkBAIC0yMSw3ICsyMSwxMCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51UHJlc2VudGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51VmlldzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudUJ1aWxkZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51Lk1lbnVJdGVtSW1wbDsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVByZXNlbnRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3Lm1lbnUuTWVudVZpZXc7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5tZW51LlN1Yk1lbnVCdWlsZGVyOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aW9uQmFyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGlvbkJhci5Pbk5hdmlnYXRpb25MaXN0ZW5lcjsKQEAgLTMzLDIxICszNiwyMiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuVHJ1bmNhdGVBdDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1BhcmVudDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkhvcml6b250YWxTY3JvbGxWaWV3OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7CkBAIC04NywxMiArOTEsMTMgQEAKICAgICBwcml2YXRlIERyYXdhYmxlIG1JY29uOwogICAgIHByaXZhdGUgRHJhd2FibGUgbUxvZ287CiAKLSAgICBwcml2YXRlIFZpZXcgbUhvbWVMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBWaWV3IG1Ib21lQXNVcFZpZXc7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUljb25WaWV3OworICAgIHByaXZhdGUgSG9tZVZpZXcgbUhvbWVMYXlvdXQ7CisgICAgcHJpdmF0ZSBIb21lVmlldyBtRXhwYW5kZWRIb21lTGF5b3V0OwogICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1UaXRsZUxheW91dDsKICAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7CiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OworICAgIHByaXZhdGUgVmlldyBtVGl0bGVVcFZpZXc7CisKICAgICBwcml2YXRlIFNwaW5uZXIgbVNwaW5uZXI7CiAgICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbUxpc3ROYXZMYXlvdXQ7CiAgICAgcHJpdmF0ZSBTY3JvbGxpbmdUYWJDb250YWluZXJWaWV3IG1UYWJTY3JvbGxWaWV3OwpAQCAtMTI0LDYgKzEyOSw5IEBACiAKICAgICBwcml2YXRlIFJ1bm5hYmxlIG1UYWJTZWxlY3RvcjsKIAorICAgIHByaXZhdGUgRXhwYW5kZWRBY3Rpb25WaWV3TWVudVByZXNlbnRlciBtRXhwYW5kZWRNZW51UHJlc2VudGVyOworICAgIFZpZXcgbUV4cGFuZGVkQWN0aW9uVmlldzsKKwogICAgIHByaXZhdGUgZmluYWwgQWRhcHRlclZpZXcuT25JdGVtU2VsZWN0ZWRMaXN0ZW5lciBtTmF2SXRlbVNlbGVjdGVkTGlzdGVuZXIgPQogICAgICAgICAgICAgbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXIoKSB7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVNlbGVjdGVkKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2aWV3LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKQEAgLTEzNiw3ICsxNDQsMjUgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtVGFiQ2xpY2tMaXN0ZW5lciA9IG51bGw7CisgICAgcHJpdmF0ZSBmaW5hbCBPbkNsaWNrTGlzdGVuZXIgbUV4cGFuZGVkQWN0aW9uVmlld1VwTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtSW1wbCBpdGVtID0gbUV4cGFuZGVkTWVudVByZXNlbnRlci5tQ3VycmVudEV4cGFuZGVkSXRlbTsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpdGVtLmNvbGxhcHNlQWN0aW9uVmlldygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgT25DbGlja0xpc3RlbmVyIG1VcENsaWNrTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgeworICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OworICAgICAgICAgICAgICAgIGFjdGl2aXR5Lm9uTWVudUl0ZW1TZWxlY3RlZChXaW5kb3cuRkVBVFVSRV9PUFRJT05TX1BBTkVMLCBtTG9nb05hdkl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKIAogICAgIHB1YmxpYyBBY3Rpb25CYXJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKQEAgLTE4NywxMCArMjEzLDExIEBACiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuQWN0aW9uQmFyX2hvbWVMYXlvdXQsCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5sYXlvdXQuYWN0aW9uX2Jhcl9ob21lKTsKIAotICAgICAgICBtSG9tZUxheW91dCA9IGluZmxhdGVyLmluZmxhdGUoaG9tZVJlc0lkLCB0aGlzLCBmYWxzZSk7CisgICAgICAgIG1Ib21lTGF5b3V0ID0gKEhvbWVWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGhvbWVSZXNJZCwgdGhpcywgZmFsc2UpOwogCi0gICAgICAgIG1Ib21lQXNVcFZpZXcgPSBtSG9tZUxheW91dC5maW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC51cCk7Ci0gICAgICAgIG1JY29uVmlldyA9IChJbWFnZVZpZXcpIG1Ib21lTGF5b3V0LmZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLmhvbWUpOworICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0ID0gKEhvbWVWaWV3KSBpbmZsYXRlci5pbmZsYXRlKGhvbWVSZXNJZCwgdGhpcywgZmFsc2UpOworICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0LnNldFVwKHRydWUpOworICAgICAgICBtRXhwYW5kZWRIb21lTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihtRXhwYW5kZWRBY3Rpb25WaWV3VXBMaXN0ZW5lcik7CiAgICAgICAgIAogICAgICAgICBtVGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfdGl0bGVUZXh0U3R5bGUsIDApOwogICAgICAgICBtU3VidGl0bGVTdHlsZVJlcyA9IGEuZ2V0UmVzb3VyY2VJZChSLnN0eWxlYWJsZS5BY3Rpb25CYXJfc3VidGl0bGVUZXh0U3R5bGUsIDApOwpAQCAtMjE1LDE1ICsyNDIsNyBAQAogICAgICAgICBhLnJlY3ljbGUoKTsKICAgICAgICAgCiAgICAgICAgIG1Mb2dvTmF2SXRlbSA9IG5ldyBBY3Rpb25NZW51SXRlbShjb250ZXh0LCAwLCBhbmRyb2lkLlIuaWQuaG9tZSwgMCwgMCwgbVRpdGxlKTsKLSAgICAgICAgbUhvbWVMYXlvdXQuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250ZXh0OwotICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eS5vbk1lbnVJdGVtU2VsZWN0ZWQoV2luZG93LkZFQVRVUkVfT1BUSU9OU19QQU5FTCwgbUxvZ29OYXZJdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBtSG9tZUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobVVwQ2xpY2tMaXN0ZW5lcik7CiAgICAgICAgIG1Ib21lTGF5b3V0LnNldENsaWNrYWJsZSh0cnVlKTsKICAgICAgICAgbUhvbWVMYXlvdXQuc2V0Rm9jdXNhYmxlKHRydWUpOwogICAgIH0KQEAgLTI1OCw2ICsyNzcsMTAgQEAKICAgICAgICAgcmVxdWVzdExheW91dCgpOwogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db250ZW50SGVpZ2h0OworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNldFNwbGl0QWN0aW9uQmFyKGJvb2xlYW4gc3BsaXRBY3Rpb25CYXIpIHsKICAgICAgICAgaWYgKG1TcGxpdEFjdGlvbkJhciAhPSBzcGxpdEFjdGlvbkJhcikgewogICAgICAgICAgICAgaWYgKG1NZW51VmlldyAhPSBudWxsKSB7CkBAIC0yODMsOSArMzA2LDEyIEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0RW1iZWRkZWRUYWJWaWV3KFNjcm9sbGluZ1RhYkNvbnRhaW5lclZpZXcgdGFicykgeworICAgICAgICBpZiAobVRhYlNjcm9sbFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlVmlldyhtVGFiU2Nyb2xsVmlldyk7CisgICAgICAgIH0KICAgICAgICAgbVRhYlNjcm9sbFZpZXcgPSB0YWJzOwogICAgICAgICBtSW5jbHVkZVRhYnMgPSB0YWJzICE9IG51bGw7Ci0gICAgICAgIGlmIChtSW5jbHVkZVRhYnMpIHsKKyAgICAgICAgaWYgKG1JbmNsdWRlVGFicyAmJiBtTmF2aWdhdGlvbk1vZGUgPT0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTKSB7CiAgICAgICAgICAgICBhZGRWaWV3KG1UYWJTY3JvbGxWaWV3KTsKICAgICAgICAgfQogICAgIH0KQEAgLTI5OCw3ICszMjQsOCBAQAogICAgICAgICBpZiAobWVudSA9PSBtT3B0aW9uc01lbnUpIHJldHVybjsKIAogICAgICAgICBpZiAobU9wdGlvbnNNZW51ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PcHRpb25zTWVudS5yZW1vdmVNZW51UHJlc2VudGVyKG1NZW51UHJlc2VudGVyKTsKKyAgICAgICAgICAgIG1PcHRpb25zTWVudS5yZW1vdmVNZW51UHJlc2VudGVyKG1BY3Rpb25NZW51UHJlc2VudGVyKTsKKyAgICAgICAgICAgIG1PcHRpb25zTWVudS5yZW1vdmVNZW51UHJlc2VudGVyKG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIpOwogICAgICAgICB9CiAKICAgICAgICAgTWVudUJ1aWxkZXIgYnVpbGRlciA9IChNZW51QnVpbGRlcikgbWVudTsKQEAgLTMwNiwyOSArMzMzLDM3IEBACiAgICAgICAgIGlmIChtTWVudVZpZXcgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVtb3ZlVmlldyhtTWVudVZpZXcpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtTWVudVByZXNlbnRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVudVByZXNlbnRlciA9IG5ldyBBY3Rpb25NZW51UHJlc2VudGVyKCk7Ci0gICAgICAgICAgICBtTWVudVByZXNlbnRlci5zZXRDYWxsYmFjayhjYik7CisgICAgICAgIGlmIChtQWN0aW9uTWVudVByZXNlbnRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBtQWN0aW9uTWVudVByZXNlbnRlciA9IG5ldyBBY3Rpb25NZW51UHJlc2VudGVyKCk7CisgICAgICAgICAgICBtQWN0aW9uTWVudVByZXNlbnRlci5zZXRDYWxsYmFjayhjYik7CisgICAgICAgICAgICBtRXhwYW5kZWRNZW51UHJlc2VudGVyID0gbmV3IEV4cGFuZGVkQWN0aW9uVmlld01lbnVQcmVzZW50ZXIoKTsKICAgICAgICAgfQotICAgICAgICBidWlsZGVyLmFkZE1lbnVQcmVzZW50ZXIobU1lbnVQcmVzZW50ZXIpOwogCi0gICAgICAgIGZpbmFsIEFjdGlvbk1lbnVWaWV3IG1lbnVWaWV3ID0gKEFjdGlvbk1lbnVWaWV3KSBtTWVudVByZXNlbnRlci5nZXRNZW51Vmlldyh0aGlzKTsKKyAgICAgICAgQWN0aW9uTWVudVZpZXcgbWVudVZpZXc7CiAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBsYXlvdXRQYXJhbXMgPSBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCiAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1lbnVWaWV3LnNldExheW91dFBhcmFtcyhsYXlvdXRQYXJhbXMpOwogICAgICAgICBpZiAoIW1TcGxpdEFjdGlvbkJhcikgewotICAgICAgICAgICAgYWRkVmlldyhtZW51Vmlldyk7CisgICAgICAgICAgICBidWlsZGVyLmFkZE1lbnVQcmVzZW50ZXIobUFjdGlvbk1lbnVQcmVzZW50ZXIpOworICAgICAgICAgICAgYnVpbGRlci5hZGRNZW51UHJlc2VudGVyKG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIpOworICAgICAgICAgICAgbWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIG1BY3Rpb25NZW51UHJlc2VudGVyLmdldE1lbnVWaWV3KHRoaXMpOworICAgICAgICAgICAgYWRkVmlldyhtZW51VmlldywgbGF5b3V0UGFyYW1zKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEFsbG93IGZ1bGwgc2NyZWVuIHdpZHRoIGluIHNwbGl0IG1vZGUuCi0gICAgICAgICAgICBtTWVudVByZXNlbnRlci5zZXRXaWR0aExpbWl0KAorICAgICAgICAgICAgbUFjdGlvbk1lbnVQcmVzZW50ZXIuc2V0V2lkdGhMaW1pdCgKICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldERpc3BsYXlNZXRyaWNzKCkud2lkdGhQaXhlbHMsIHRydWUpOwogICAgICAgICAgICAgLy8gTm8gbGltaXQgdG8gdGhlIGl0ZW0gY291bnQ7IHVzZSB3aGF0ZXZlciB3aWxsIGZpdC4KLSAgICAgICAgICAgIG1NZW51UHJlc2VudGVyLnNldEl0ZW1MaW1pdChJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBtQWN0aW9uTWVudVByZXNlbnRlci5zZXRJdGVtTGltaXQoSW50ZWdlci5NQVhfVkFMVUUpOwogICAgICAgICAgICAgLy8gU3BhbiB0aGUgd2hvbGUgd2lkdGgKICAgICAgICAgICAgIGxheW91dFBhcmFtcy53aWR0aCA9IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7CisgICAgICAgICAgICBidWlsZGVyLmFkZE1lbnVQcmVzZW50ZXIobUFjdGlvbk1lbnVQcmVzZW50ZXIpOworICAgICAgICAgICAgYnVpbGRlci5hZGRNZW51UHJlc2VudGVyKG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIpOworICAgICAgICAgICAgbWVudVZpZXcgPSAoQWN0aW9uTWVudVZpZXcpIG1BY3Rpb25NZW51UHJlc2VudGVyLmdldE1lbnVWaWV3KHRoaXMpOwogICAgICAgICAgICAgaWYgKG1TcGxpdFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TcGxpdFZpZXcuYWRkVmlldyhtZW51Vmlldyk7Ci0gICAgICAgICAgICB9IC8vIFdlJ2xsIGFkZCB0aGlzIGxhdGVyIGlmIHdlIG1pc3NlZCBpdCB0aGlzIHRpbWUuCisgICAgICAgICAgICAgICAgbVNwbGl0Vmlldy5hZGRWaWV3KG1lbnVWaWV3LCBsYXlvdXRQYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBhZGQgdGhpcyBsYXRlciBpZiB3ZSBtaXNzZWQgaXQgdGhpcyB0aW1lLgorICAgICAgICAgICAgICAgIG1lbnVWaWV3LnNldExheW91dFBhcmFtcyhsYXlvdXRQYXJhbXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1NZW51VmlldyA9IG1lbnVWaWV3OwogICAgIH0KQEAgLTQwNywxNyArNDQyLDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKGZsYWdzQ2hhbmdlZCAmIERJU1BMQVlfUkVMQVlPVVRfTUFTSykgIT0gMCkgewotICAgICAgICAgICAgZmluYWwgaW50IHZpcyA9IChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19IT01FKSAhPSAwID8gVklTSUJMRSA6IEdPTkU7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNob3dIb21lID0gKG9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0hPTUUpICE9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgdmlzID0gc2hvd0hvbWUgPyBWSVNJQkxFIDogR09ORTsKICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFZpc2liaWxpdHkodmlzKTsKIAogICAgICAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBBY3Rpb25CYXIuRElTUExBWV9IT01FX0FTX1VQKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1VwID0gKG9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9IT01FX0FTX1VQKSAhPSAwOwotICAgICAgICAgICAgICAgIG1Ib21lQXNVcFZpZXcuc2V0VmlzaWJpbGl0eShpc1VwID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFVwKChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfSE9NRV9BU19VUCkgIT0gMCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICgoZmxhZ3NDaGFuZ2VkICYgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR08pICE9IDApIHsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGxvZ29WaXMgPSBtTG9nbyAhPSBudWxsICYmIChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfVVNFX0xPR08pICE9IDA7Ci0gICAgICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUobG9nb1ZpcyA/IG1Mb2dvIDogbUljb24pOworICAgICAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldEljb24obG9nb1ZpcyA/IG1Mb2dvIDogbUljb24pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKGZsYWdzQ2hhbmdlZCAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDApIHsKQEAgLTQyOCw2ICs0NjMsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiAoZmxhZ3NDaGFuZ2VkICYKKyAgICAgICAgICAgICAgICAgICAgKEFjdGlvbkJhci5ESVNQTEFZX0hPTUVfQVNfVVAgfCBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0hPTUUpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBob21lQXNVcCA9IChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfSE9NRV9BU19VUCkgIT0gMDsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRpdGxlVXAgPSBob21lQXNVcCAmJiAhc2hvd0hvbWU7CisgICAgICAgICAgICAgICAgbVRpdGxlVXBWaWV3LnNldFZpc2liaWxpdHkodGl0bGVVcCA/IFZJU0lCTEUgOiBHT05FKTsKKyAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQuc2V0RW5hYmxlZCh0aXRsZVVwKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKChmbGFnc0NoYW5nZWQgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCAmJiBtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKChvcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19DVVNUT00pICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgYWRkVmlldyhtQ3VzdG9tTmF2Vmlldyk7CkBAIC00NTcsNyArNTAwLDcgQEAKICAgICAgICAgbUljb24gPSBpY29uOwogICAgICAgICBpZiAoaWNvbiAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTykgPT0gMCB8fCBtTG9nbyA9PSBudWxsKSkgewotICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUoaWNvbik7CisgICAgICAgICAgICBtSG9tZUxheW91dC5zZXRJY29uKGljb24pOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NjgsNyArNTExLDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRMb2dvKERyYXdhYmxlIGxvZ28pIHsKICAgICAgICAgbUxvZ28gPSBsb2dvOwogICAgICAgICBpZiAobG9nbyAhPSBudWxsICYmIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9VU0VfTE9HTykgIT0gMCkgewotICAgICAgICAgICAgbUljb25WaWV3LnNldEltYWdlRHJhd2FibGUobG9nbyk7CisgICAgICAgICAgICBtSG9tZUxheW91dC5zZXRJY29uKGxvZ28pOwogICAgICAgICB9CiAgICAgfQogCkBAIC00ODIsNyArNTI1LDcgQEAKICAgICBwcml2YXRlIGludCBnZXRQcmVmZXJyZWRJY29uRGVuc2l0eSgpIHsKICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOwogICAgICAgICBmaW5hbCBpbnQgYXZhaWxhYmxlSGVpZ2h0ID0gZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICBtSWNvblZpZXcuZ2V0UGFkZGluZ1RvcCgpIC0gbUljb25WaWV3LmdldFBhZGRpbmdCb3R0b20oKTsKKyAgICAgICAgICAgICAgICBtSG9tZUxheW91dC5nZXRWZXJ0aWNhbEljb25QYWRkaW5nKCk7CiAgICAgICAgIGludCBpY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoYW5kcm9pZC5SLmRpbWVuLmFwcF9pY29uX3NpemUpOwogCiAgICAgICAgIGlmIChpY29uU2l6ZSAqIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfTE9XID49IGF2YWlsYWJsZUhlaWdodCkgewpAQCAtNTAwLDcgKzU0Myw3IEBACiAgICAgICAgIGlmIChtb2RlICE9IG9sZE1vZGUpIHsKICAgICAgICAgICAgIHN3aXRjaCAob2xkTW9kZSkgewogICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1Q6Ci0gICAgICAgICAgICAgICAgaWYgKG1TcGlubmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3ROYXZMYXlvdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KG1MaXN0TmF2TGF5b3V0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02MDcsMjQgKzY1MCwzNSBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgaW5pdFRpdGxlKCkgewotICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVRpdGxlTGF5b3V0ID0gKExpbmVhckxheW91dCkgaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5hY3Rpb25fYmFyX3RpdGxlX2l0ZW0sIG51bGwpOwotICAgICAgICBtVGl0bGVWaWV3ID0gKFRleHRWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQuYWN0aW9uX2Jhcl90aXRsZSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKyAgICAgICAgaWYgKG1UaXRsZUxheW91dCA9PSBudWxsKSB7CisgICAgICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgICAgIG1UaXRsZUxheW91dCA9IChMaW5lYXJMYXlvdXQpIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuYWN0aW9uX2Jhcl90aXRsZV9pdGVtLCBudWxsKTsKKyAgICAgICAgICAgIG1UaXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3RpdGxlKTsKKyAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcgPSAoVGV4dFZpZXcpIG1UaXRsZUxheW91dC5maW5kVmlld0J5SWQoUi5pZC5hY3Rpb25fYmFyX3N1YnRpdGxlKTsKKyAgICAgICAgICAgIG1UaXRsZVVwVmlldyA9IChWaWV3KSBtVGl0bGVMYXlvdXQuZmluZFZpZXdCeUlkKFIuaWQudXApOwogCi0gICAgICAgIGlmIChtVGl0bGVTdHlsZVJlcyAhPSAwKSB7Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHRBcHBlYXJhbmNlKG1Db250ZXh0LCBtVGl0bGVTdHlsZVJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaXRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobVRpdGxlKTsKLSAgICAgICAgfQorICAgICAgICAgICAgbVRpdGxlTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihtVXBDbGlja0xpc3RlbmVyKTsKIAotICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgewotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0QXBwZWFyYW5jZShtQ29udGV4dCwgbVN1YnRpdGxlU3R5bGVSZXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KG1TdWJ0aXRsZSk7Ci0gICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVklTSUJMRSk7CisgICAgICAgICAgICBpZiAobVRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1UaXRsZVN0eWxlUmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChtVGl0bGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVN1YnRpdGxlU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dEFwcGVhcmFuY2UobUNvbnRleHQsIG1TdWJ0aXRsZVN0eWxlUmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3VidGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VGV4dChtU3VidGl0bGUpOworICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBob21lQXNVcCA9IChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9IT01FX0FTX1VQKSAhPSAwOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0aXRsZVVwID0gaG9tZUFzVXAgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfSE9NRSkgPT0gMDsKKyAgICAgICAgICAgIG1UaXRsZVVwVmlldy5zZXRWaXNpYmlsaXR5KHRpdGxlVXAgPyBWSVNJQkxFIDogR09ORSk7CisgICAgICAgICAgICBtVGl0bGVMYXlvdXQuc2V0RW5hYmxlZCh0aXRsZVVwKTsKICAgICAgICAgfQogCiAgICAgICAgIGFkZFZpZXcobVRpdGxlTGF5b3V0KTsKQEAgLTY4NSwxMCArNzM5LDEzIEBACiAgICAgICAgIGludCBsZWZ0T2ZDZW50ZXIgPSBhdmFpbGFibGVXaWR0aCAvIDI7CiAgICAgICAgIGludCByaWdodE9mQ2VudGVyID0gbGVmdE9mQ2VudGVyOwogCi0gICAgICAgIGlmIChtSG9tZUxheW91dC5nZXRWaXNpYmlsaXR5KCkgIT0gR09ORSkgewotICAgICAgICAgICAgbUhvbWVMYXlvdXQubWVhc3VyZShNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoYXZhaWxhYmxlV2lkdGgsIE1lYXN1cmVTcGVjLkFUX01PU1QpLAorICAgICAgICBWaWV3IGhvbWVMYXlvdXQgPSBtRXhwYW5kZWRBY3Rpb25WaWV3ICE9IG51bGwgPyBtRXhwYW5kZWRIb21lTGF5b3V0IDogbUhvbWVMYXlvdXQ7CisKKyAgICAgICAgaWYgKGhvbWVMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKKyAgICAgICAgICAgIGhvbWVMYXlvdXQubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOwotICAgICAgICAgICAgZmluYWwgaW50IGhvbWVXaWR0aCA9IG1Ib21lTGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBob21lV2lkdGggPSBob21lTGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKTsKICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBob21lV2lkdGgpOwogICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBob21lV2lkdGgpOwogICAgICAgICB9CkBAIC02OTksNDAgKzc1Niw0MiBAQAogICAgICAgICAgICAgcmlnaHRPZkNlbnRlciA9IE1hdGgubWF4KDAsIHJpZ2h0T2ZDZW50ZXIgLSBtTWVudVZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW4gc2hvd1RpdGxlID0gbVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbVRpdGxlTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FICYmCi0gICAgICAgICAgICAgICAgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDA7Ci0gICAgICAgIGlmIChzaG93VGl0bGUpIHsKLSAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gbWVhc3VyZUNoaWxkVmlldyhtVGl0bGVMYXlvdXQsIGF2YWlsYWJsZVdpZHRoLCBjaGlsZFNwZWNIZWlnaHQsIDApOwotICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gbVRpdGxlTGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHBhbmRlZEFjdGlvblZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiBzaG93VGl0bGUgPSBtVGl0bGVMYXlvdXQgIT0gbnVsbCAmJiBtVGl0bGVMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDA7CisgICAgICAgICAgICBpZiAoc2hvd1RpdGxlKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBtZWFzdXJlQ2hpbGRWaWV3KG1UaXRsZUxheW91dCwgYXZhaWxhYmxlV2lkdGgsIGNoaWxkU3BlY0hlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gbVRpdGxlTGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKLSAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1Q6Ci0gICAgICAgICAgICBpZiAobUxpc3ROYXZMYXlvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBpdGVtUGFkZGluZ1NpemUgPSBzaG93VGl0bGUgPyBtSXRlbVBhZGRpbmcgKiAyIDogbUl0ZW1QYWRkaW5nOwotICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBpdGVtUGFkZGluZ1NpemUpOwotICAgICAgICAgICAgICAgIGxlZnRPZkNlbnRlciA9IE1hdGgubWF4KDAsIGxlZnRPZkNlbnRlciAtIGl0ZW1QYWRkaW5nU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbUxpc3ROYXZMYXlvdXQubWVhc3VyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhhdmFpbGFibGVXaWR0aCwgTWVhc3VyZVNwZWMuQVRfTU9TVCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoaGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGxpc3ROYXZXaWR0aCA9IG1MaXN0TmF2TGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IE1hdGgubWF4KDAsIGF2YWlsYWJsZVdpZHRoIC0gbGlzdE5hdldpZHRoKTsKLSAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBsaXN0TmF2V2lkdGgpOworICAgICAgICAgICAgc3dpdGNoIChtTmF2aWdhdGlvbk1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfTElTVDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1MaXN0TmF2TGF5b3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpdGVtUGFkZGluZ1NpemUgPSBzaG93VGl0bGUgPyBtSXRlbVBhZGRpbmcgKiAyIDogbUl0ZW1QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGl0ZW1QYWRkaW5nU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBpdGVtUGFkZGluZ1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3ROYXZMYXlvdXQubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxpc3ROYXZXaWR0aCA9IG1MaXN0TmF2TGF5b3V0LmdldE1lYXN1cmVkV2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoID0gTWF0aC5tYXgoMCwgYXZhaWxhYmxlV2lkdGggLSBsaXN0TmF2V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gbGlzdE5hdldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpdGVtUGFkZGluZ1NpemUgPSBzaG93VGl0bGUgPyBtSXRlbVBhZGRpbmcgKiAyIDogbUl0ZW1QYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGl0ZW1QYWRkaW5nU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSBpdGVtUGFkZGluZ1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcubWVhc3VyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhYldpZHRoID0gbVRhYlNjcm9sbFZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIHRhYldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRPZkNlbnRlciA9IE1hdGgubWF4KDAsIGxlZnRPZkNlbnRlciAtIHRhYldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfVEFCUzoKLSAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGl0ZW1QYWRkaW5nU2l6ZSA9IHNob3dUaXRsZSA/IG1JdGVtUGFkZGluZyAqIDIgOiBtSXRlbVBhZGRpbmc7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIGl0ZW1QYWRkaW5nU2l6ZSk7Ci0gICAgICAgICAgICAgICAgbGVmdE9mQ2VudGVyID0gTWF0aC5tYXgoMCwgbGVmdE9mQ2VudGVyIC0gaXRlbVBhZGRpbmdTaXplKTsKLSAgICAgICAgICAgICAgICBtVGFiU2Nyb2xsVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGF2YWlsYWJsZVdpZHRoLCBNZWFzdXJlU3BlYy5BVF9NT1NUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFiV2lkdGggPSBtVGFiU2Nyb2xsVmlldy5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSBNYXRoLm1heCgwLCBhdmFpbGFibGVXaWR0aCAtIHRhYldpZHRoKTsKLSAgICAgICAgICAgICAgICBsZWZ0T2ZDZW50ZXIgPSBNYXRoLm1heCgwLCBsZWZ0T2ZDZW50ZXIgLSB0YWJXaWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtSW5kZXRlcm1pbmF0ZVByb2dyZXNzVmlldyAhPSBudWxsICYmCkBAIC03NDMsOCArODAyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJpZ2h0T2ZDZW50ZXIgLSBtSW5kZXRlcm1pbmF0ZVByb2dyZXNzVmlldy5nZXRNZWFzdXJlZFdpZHRoKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCAmJiBtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBMYXlvdXRQYXJhbXMgbHAgPSBnZW5lcmF0ZUxheW91dFBhcmFtcyhtQ3VzdG9tTmF2Vmlldy5nZXRMYXlvdXRQYXJhbXMoKSk7CisgICAgICAgIFZpZXcgY3VzdG9tVmlldyA9IG51bGw7CisgICAgICAgIGlmIChtRXhwYW5kZWRBY3Rpb25WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1c3RvbVZpZXcgPSBtRXhwYW5kZWRBY3Rpb25WaWV3OworICAgICAgICB9IGVsc2UgaWYgKChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX0NVU1RPTSkgIT0gMCAmJgorICAgICAgICAgICAgICAgIG1DdXN0b21OYXZWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1c3RvbVZpZXcgPSBtQ3VzdG9tTmF2VmlldzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExheW91dFBhcmFtcyBscCA9IGdlbmVyYXRlTGF5b3V0UGFyYW1zKGN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkpOwogICAgICAgICAgICAgZmluYWwgQWN0aW9uQmFyLkxheW91dFBhcmFtcyBhYmxwID0gbHAgaW5zdGFuY2VvZiBBY3Rpb25CYXIuTGF5b3V0UGFyYW1zID8KICAgICAgICAgICAgICAgICAgICAgKEFjdGlvbkJhci5MYXlvdXRQYXJhbXMpIGxwIDogbnVsbDsKIApAQCAtNzgxLDcgKzg0OCw3IEBACiAgICAgICAgICAgICAgICAgY3VzdG9tTmF2V2lkdGggPSBNYXRoLm1pbihsZWZ0T2ZDZW50ZXIsIHJpZ2h0T2ZDZW50ZXIpICogMjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcubWVhc3VyZSgKKyAgICAgICAgICAgIGN1c3RvbVZpZXcubWVhc3VyZSgKICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGN1c3RvbU5hdldpZHRoLCBjdXN0b21OYXZXaWR0aE1vZGUpLAogICAgICAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoY3VzdG9tTmF2SGVpZ2h0LCBjdXN0b21OYXZIZWlnaHRNb2RlKSk7CiAgICAgICAgIH0KQEAgLTgyMiwzMSArODg5LDM0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUhvbWVMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpICE9IEdPTkUpIHsKLSAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtSG9tZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvd1RpdGxlID0gbVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbVRpdGxlTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FICYmCi0gICAgICAgICAgICAgICAgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfVElUTEUpICE9IDA7Ci0gICAgICAgIGlmIChzaG93VGl0bGUpIHsKLSAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGl0bGVMYXlvdXQsIHgsIHksIGNvbnRlbnRIZWlnaHQpOworICAgICAgICBWaWV3IGhvbWVMYXlvdXQgPSBtRXhwYW5kZWRBY3Rpb25WaWV3ICE9IG51bGwgPyBtRXhwYW5kZWRIb21lTGF5b3V0IDogbUhvbWVMYXlvdXQ7CisgICAgICAgIGlmIChob21lTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FKSB7CisgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQoaG9tZUxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCk7CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgewotICAgICAgICBjYXNlIEFjdGlvbkJhci5OQVZJR0FUSU9OX01PREVfU1RBTkRBUkQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1Q6Ci0gICAgICAgICAgICBpZiAobUxpc3ROYXZMYXlvdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChzaG93VGl0bGUpIHggKz0gbUl0ZW1QYWRkaW5nOwotICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTGlzdE5hdkxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtSXRlbVBhZGRpbmc7CisgICAgICAgIGlmIChtRXhwYW5kZWRBY3Rpb25WaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2hvd1RpdGxlID0gbVRpdGxlTGF5b3V0ICE9IG51bGwgJiYgbVRpdGxlTGF5b3V0LmdldFZpc2liaWxpdHkoKSAhPSBHT05FICYmCisgICAgICAgICAgICAgICAgICAgIChtRGlzcGxheU9wdGlvbnMgJiBBY3Rpb25CYXIuRElTUExBWV9TSE9XX1RJVExFKSAhPSAwOworICAgICAgICAgICAgaWYgKHNob3dUaXRsZSkgeworICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGl0bGVMYXlvdXQsIHgsIHksIGNvbnRlbnRIZWlnaHQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTOgotICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2hvd1RpdGxlKSB4ICs9IG1JdGVtUGFkZGluZzsKLSAgICAgICAgICAgICAgICB4ICs9IHBvc2l0aW9uQ2hpbGQobVRhYlNjcm9sbFZpZXcsIHgsIHksIGNvbnRlbnRIZWlnaHQpICsgbUl0ZW1QYWRkaW5nOworCisgICAgICAgICAgICBzd2l0Y2ggKG1OYXZpZ2F0aW9uTW9kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9TVEFOREFSRDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChtTGlzdE5hdkxheW91dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd1RpdGxlKSB4ICs9IG1JdGVtUGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtTGlzdE5hdkxheW91dCwgeCwgeSwgY29udGVudEhlaWdodCkgKyBtSXRlbVBhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX1RBQlM6CisgICAgICAgICAgICAgICAgICAgIGlmIChtVGFiU2Nyb2xsVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd1RpdGxlKSB4ICs9IG1JdGVtUGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChtVGFiU2Nyb2xsVmlldywgeCwgeSwgY29udGVudEhlaWdodCkgKyBtSXRlbVBhZGRpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGludCBtZW51TGVmdCA9IHIgLSBsIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7CkBAIC04NjEsMTMgKzkzMSwyMCBAQAogICAgICAgICAgICAgbWVudUxlZnQgLT0gbUluZGV0ZXJtaW5hdGVQcm9ncmVzc1ZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfQ1VTVE9NKSAhPSAwKSB7Ci0gICAgICAgICAgICBMYXlvdXRQYXJhbXMgbHAgPSBtQ3VzdG9tTmF2Vmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgVmlldyBjdXN0b21WaWV3ID0gbnVsbDsKKyAgICAgICAgaWYgKG1FeHBhbmRlZEFjdGlvblZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgY3VzdG9tVmlldyA9IG1FeHBhbmRlZEFjdGlvblZpZXc7CisgICAgICAgIH0gZWxzZSBpZiAoKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfQ1VTVE9NKSAhPSAwICYmCisgICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgY3VzdG9tVmlldyA9IG1DdXN0b21OYXZWaWV3OworICAgICAgICB9CisgICAgICAgIGlmIChjdXN0b21WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExheW91dFBhcmFtcyBscCA9IGN1c3RvbVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7CiAgICAgICAgICAgICBmaW5hbCBBY3Rpb25CYXIuTGF5b3V0UGFyYW1zIGFibHAgPSBscCBpbnN0YW5jZW9mIEFjdGlvbkJhci5MYXlvdXRQYXJhbXMgPwogICAgICAgICAgICAgICAgICAgICAoQWN0aW9uQmFyLkxheW91dFBhcmFtcykgbHAgOiBudWxsOwogCiAgICAgICAgICAgICBmaW5hbCBpbnQgZ3Jhdml0eSA9IGFibHAgIT0gbnVsbCA/IGFibHAuZ3Jhdml0eSA6IERFRkFVTFRfQ1VTVE9NX0dSQVZJVFk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbmF2V2lkdGggPSBtQ3VzdG9tTmF2Vmlldy5nZXRNZWFzdXJlZFdpZHRoKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbmF2V2lkdGggPSBjdXN0b21WaWV3LmdldE1lYXN1cmVkV2lkdGgoKTsKIAogICAgICAgICAgICAgaW50IHRvcE1hcmdpbiA9IDA7CiAgICAgICAgICAgICBpbnQgYm90dG9tTWFyZ2luID0gMDsKQEAgLTkwNywxNyArOTg0LDE3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTDoKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBhZGRlZFRvcCA9IG1Ub3AgKyBnZXRQYWRkaW5nVG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwYWRkZWRCb3R0b20gPSBtQm90dG9tIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotICAgICAgICAgICAgICAgICAgICB5cG9zID0gKChwYWRkZWRCb3R0b20gLSBwYWRkZWRUb3ApIC0gbUN1c3RvbU5hdlZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgLyAyOworICAgICAgICAgICAgICAgICAgICB5cG9zID0gKChwYWRkZWRCb3R0b20gLSBwYWRkZWRUb3ApIC0gY3VzdG9tVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5UT1A6CiAgICAgICAgICAgICAgICAgICAgIHlwb3MgPSBnZXRQYWRkaW5nVG9wKCkgKyB0b3BNYXJnaW47CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgR3Jhdml0eS5CT1RUT006Ci0gICAgICAgICAgICAgICAgICAgIHlwb3MgPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKSAtIG1DdXN0b21OYXZWaWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkKKyAgICAgICAgICAgICAgICAgICAgeXBvcyA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpIC0gY3VzdG9tVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBib3R0b21NYXJnaW47CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgeCArPSBwb3NpdGlvbkNoaWxkKG1DdXN0b21OYXZWaWV3LCB4cG9zLCB5cG9zLCBjb250ZW50SGVpZ2h0KTsKKyAgICAgICAgICAgIHggKz0gcG9zaXRpb25DaGlsZChjdXN0b21WaWV3LCB4cG9zLCB5cG9zLCBjb250ZW50SGVpZ2h0KTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtUHJvZ3Jlc3NWaWV3ICE9IG51bGwpIHsKQEAgLTkyOCw5ICsxMDA1LDgzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcyBscCkgeworICAgICAgICBpZiAobHAgPT0gbnVsbCkgeworICAgICAgICAgICAgbHAgPSBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpIHsKKyAgICAgICAgUGFyY2VsYWJsZSBzdXBlclN0YXRlID0gc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgICAgICBTYXZlZFN0YXRlIHN0YXRlID0gbmV3IFNhdmVkU3RhdGUoc3VwZXJTdGF0ZSk7CisKKyAgICAgICAgaWYgKG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIgIT0gbnVsbCAmJiBtRXhwYW5kZWRNZW51UHJlc2VudGVyLm1DdXJyZW50RXhwYW5kZWRJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXRlLmV4cGFuZGVkTWVudUl0ZW1JZCA9IG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIubUN1cnJlbnRFeHBhbmRlZEl0ZW0uZ2V0SXRlbUlkKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZS5pc092ZXJmbG93T3BlbiA9IGlzT3ZlcmZsb3dNZW51U2hvd2luZygpOworCisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKFBhcmNlbGFibGUgcCkgeworICAgICAgICBTYXZlZFN0YXRlIHN0YXRlID0gKFNhdmVkU3RhdGUpIHA7CisKKyAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShzdGF0ZS5nZXRTdXBlclN0YXRlKCkpOworCisgICAgICAgIGlmIChzdGF0ZS5leHBhbmRlZE1lbnVJdGVtSWQgIT0gMCAmJgorICAgICAgICAgICAgICAgIG1FeHBhbmRlZE1lbnVQcmVzZW50ZXIgIT0gbnVsbCAmJiBtT3B0aW9uc01lbnUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTWVudUl0ZW0gaXRlbSA9IG1PcHRpb25zTWVudS5maW5kSXRlbShzdGF0ZS5leHBhbmRlZE1lbnVJdGVtSWQpOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGl0ZW0uZXhwYW5kQWN0aW9uVmlldygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlLmlzT3ZlcmZsb3dPcGVuKSB7CisgICAgICAgICAgICBwb3N0U2hvd092ZXJmbG93TWVudSgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgZXh0ZW5kcyBCYXNlU2F2ZWRTdGF0ZSB7CisgICAgICAgIGludCBleHBhbmRlZE1lbnVJdGVtSWQ7CisgICAgICAgIGJvb2xlYW4gaXNPdmVyZmxvd09wZW47CisKKyAgICAgICAgU2F2ZWRTdGF0ZShQYXJjZWxhYmxlIHN1cGVyU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKHN1cGVyU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTYXZlZFN0YXRlKFBhcmNlbCBpbikgeworICAgICAgICAgICAgc3VwZXIoaW4pOworICAgICAgICAgICAgZXhwYW5kZWRNZW51SXRlbUlkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaXNPdmVyZmxvd09wZW4gPSBpbi5yZWFkSW50KCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCBvdXQsIGludCBmbGFncykgeworICAgICAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChvdXQsIGZsYWdzKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChleHBhbmRlZE1lbnVJdGVtSWQpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KGlzT3ZlcmZsb3dPcGVuID8gMSA6IDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJjZWxhYmxlLkNyZWF0b3I8U2F2ZWRTdGF0ZT4gQ1JFQVRPUiA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmNlbGFibGUuQ3JlYXRvcjxTYXZlZFN0YXRlPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTYXZlZFN0YXRlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXZlZFN0YXRlKGluKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFNhdmVkU3RhdGVbXSBuZXdBcnJheShpbnQgc2l6ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2F2ZWRTdGF0ZVtzaXplXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIb21lVmlldyBleHRlbmRzIEZyYW1lTGF5b3V0IHsKICAgICAgICAgcHJpdmF0ZSBWaWV3IG1VcFZpZXc7Ci0gICAgICAgIHByaXZhdGUgVmlldyBtSWNvblZpZXc7CisgICAgICAgIHByaXZhdGUgSW1hZ2VWaWV3IG1JY29uVmlldzsKIAogICAgICAgICBwdWJsaWMgSG9tZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwpAQCAtOTQwLDEyICsxMDkxLDI0IEBACiAgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcChib29sZWFuIGlzVXApIHsKKyAgICAgICAgICAgIG1VcFZpZXcuc2V0VmlzaWJpbGl0eShpc1VwID8gVklTSUJMRSA6IEdPTkUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SWNvbihEcmF3YWJsZSBpY29uKSB7CisgICAgICAgICAgICBtSWNvblZpZXcuc2V0SW1hZ2VEcmF3YWJsZShpY29uKTsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkZpbmlzaEluZmxhdGUoKSB7CiAgICAgICAgICAgICBtVXBWaWV3ID0gZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQudXApOwogICAgICAgICAgICAgbUljb25WaWV3ID0gKEltYWdlVmlldykgZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuaG9tZSk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgaW50IGdldFZlcnRpY2FsSWNvblBhZGRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbUljb25WaWV3LmdldFBhZGRpbmdUb3AoKSArIG1JY29uVmlldy5nZXRQYWRkaW5nQm90dG9tKCk7CisgICAgICAgIH0KKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKICAgICAgICAgICAgIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zKG1VcFZpZXcsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKQEAgLTk4Myw0ICsxMTQ2LDExNSBAQAogICAgICAgICAgICAgbUljb25WaWV3LmxheW91dChpY29uTGVmdCwgaWNvblRvcCwgaWNvbkxlZnQgKyBpY29uV2lkdGgsIGljb25Ub3AgKyBpY29uSGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRXhwYW5kZWRBY3Rpb25WaWV3TWVudVByZXNlbnRlciBpbXBsZW1lbnRzIE1lbnVQcmVzZW50ZXIgeworICAgICAgICBNZW51QnVpbGRlciBtTWVudTsKKyAgICAgICAgTWVudUl0ZW1JbXBsIG1DdXJyZW50RXhwYW5kZWRJdGVtOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0Rm9yTWVudShDb250ZXh0IGNvbnRleHQsIE1lbnVCdWlsZGVyIG1lbnUpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBleHBhbmRlZCBhY3Rpb24gdmlldyB3aGVuIG1lbnVzIGNoYW5nZS4KKyAgICAgICAgICAgIG1FeHBhbmRlZEFjdGlvblZpZXcgPSBudWxsOworICAgICAgICAgICAgaWYgKG1DdXJyZW50RXhwYW5kZWRJdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEV4cGFuZGVkSXRlbS5jb2xsYXBzZUFjdGlvblZpZXcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW51ID0gbWVudTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVudVZpZXcgZ2V0TWVudVZpZXcoVmlld0dyb3VwIHJvb3QpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZU1lbnVWaWV3KGJvb2xlYW4gY2xlYXJlZCkgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleHBhbmRlZCBpdGVtIHdlIGhhdmUgaXMgc3RpbGwgdGhlcmUuCisgICAgICAgICAgICBpZiAobUN1cnJlbnRFeHBhbmRlZEl0ZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtTWVudS5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lbnVJdGVtIGl0ZW0gPSBtTWVudS5nZXRJdGVtKGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBtQ3VycmVudEV4cGFuZGVkSXRlbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpdGVtIHdlIGhhZCBleHBhbmRlZCBkaXNhcHBlYXJlZC4gQ29sbGFwc2UuCisgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlSXRlbUFjdGlvblZpZXcobU1lbnUsIG1DdXJyZW50RXhwYW5kZWRJdGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblN1Yk1lbnVTZWxlY3RlZChTdWJNZW51QnVpbGRlciBzdWJNZW51KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZU1lbnUoTWVudUJ1aWxkZXIgbWVudSwgYm9vbGVhbiBhbGxNZW51c0FyZUNsb3NpbmcpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBmbGFnQWN0aW9uSXRlbXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXhwYW5kSXRlbUFjdGlvblZpZXcoTWVudUJ1aWxkZXIgbWVudSwgTWVudUl0ZW1JbXBsIGl0ZW0pIHsKKyAgICAgICAgICAgIG1FeHBhbmRlZEFjdGlvblZpZXcgPSBpdGVtLmdldEFjdGlvblZpZXcoKTsKKyAgICAgICAgICAgIG1FeHBhbmRlZEhvbWVMYXlvdXQuc2V0SWNvbihpdGVtLmdldEljb24oKSk7CisgICAgICAgICAgICBtQ3VycmVudEV4cGFuZGVkSXRlbSA9IGl0ZW07CisgICAgICAgICAgICBpZiAobUV4cGFuZGVkQWN0aW9uVmlldy5nZXRQYXJlbnQoKSAhPSBBY3Rpb25CYXJWaWV3LnRoaXMpIHsKKyAgICAgICAgICAgICAgICBhZGRWaWV3KG1FeHBhbmRlZEFjdGlvblZpZXcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1FeHBhbmRlZEhvbWVMYXlvdXQuZ2V0UGFyZW50KCkgIT0gQWN0aW9uQmFyVmlldy50aGlzKSB7CisgICAgICAgICAgICAgICAgYWRkVmlldyhtRXhwYW5kZWRIb21lTGF5b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ib21lTGF5b3V0LnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICBpZiAobVRpdGxlTGF5b3V0ICE9IG51bGwpIG1UaXRsZUxheW91dC5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICAgICAgaWYgKG1UYWJTY3JvbGxWaWV3ICE9IG51bGwpIG1UYWJTY3JvbGxWaWV3LnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICBpZiAobVNwaW5uZXIgIT0gbnVsbCkgbVNwaW5uZXIuc2V0VmlzaWJpbGl0eShHT05FKTsKKyAgICAgICAgICAgIGlmIChtQ3VzdG9tTmF2VmlldyAhPSBudWxsKSBtQ3VzdG9tTmF2Vmlldy5zZXRWaXNpYmlsaXR5KEdPTkUpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgaXRlbS5zZXRBY3Rpb25WaWV3RXhwYW5kZWQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2xsYXBzZUl0ZW1BY3Rpb25WaWV3KE1lbnVCdWlsZGVyIG1lbnUsIE1lbnVJdGVtSW1wbCBpdGVtKSB7CisgICAgICAgICAgICByZW1vdmVWaWV3KG1FeHBhbmRlZEFjdGlvblZpZXcpOworICAgICAgICAgICAgcmVtb3ZlVmlldyhtRXhwYW5kZWRIb21lTGF5b3V0KTsKKyAgICAgICAgICAgIGlmICgobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19IT01FKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUhvbWVMYXlvdXQuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobURpc3BsYXlPcHRpb25zICYgQWN0aW9uQmFyLkRJU1BMQVlfU0hPV19USVRMRSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtVGl0bGVMYXlvdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbml0VGl0bGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVGl0bGVMYXlvdXQuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRhYlNjcm9sbFZpZXcgIT0gbnVsbCAmJiBtTmF2aWdhdGlvbk1vZGUgPT0gQWN0aW9uQmFyLk5BVklHQVRJT05fTU9ERV9UQUJTKSB7CisgICAgICAgICAgICAgICAgbVRhYlNjcm9sbFZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3Bpbm5lciAhPSBudWxsICYmIG1OYXZpZ2F0aW9uTW9kZSA9PSBBY3Rpb25CYXIuTkFWSUdBVElPTl9NT0RFX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBtU3Bpbm5lci5zZXRWaXNpYmlsaXR5KFZJU0lCTEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1DdXN0b21OYXZWaWV3ICE9IG51bGwgJiYgKG1EaXNwbGF5T3B0aW9ucyAmIEFjdGlvbkJhci5ESVNQTEFZX1NIT1dfQ1VTVE9NKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUN1c3RvbU5hdlZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1FeHBhbmRlZEFjdGlvblZpZXcgPSBudWxsOworICAgICAgICAgICAgbUV4cGFuZGVkSG9tZUxheW91dC5zZXRJY29uKG51bGwpOworICAgICAgICAgICAgbUN1cnJlbnRFeHBhbmRlZEl0ZW0gPSBudWxsOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICAgICAgaXRlbS5zZXRBY3Rpb25WaWV3RXhwYW5kZWQoZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpYWxvZ1RpdGxlLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpYWxvZ1RpdGxlLmphdmEKaW5kZXggMTI1ZDJjNS4uY2QxNjVkYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWFsb2dUaXRsZS5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlhbG9nVGl0bGUuamF2YQpAQCAtNTQsMTUgKzU0LDE5IEBACiAgICAgICAgICAgICAgICAgaWYgKGVsbGlwc2lzQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNldFNpbmdsZUxpbmUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgVHlwZWRBcnJheSBhID0gbUNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGUuVGV4dEFwcGVhcmFuY2VfTWVkaXVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5zdHlsZWFibGUuVGV4dEFwcGVhcmFuY2UpOworICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5IGEgPSBtQ29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5UZXh0QXBwZWFyYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuYXR0ci50ZXh0QXBwZWFyYW5jZU1lZGl1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLlIuc3R5bGUuVGV4dEFwcGVhcmFuY2VfTWVkaXVtKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRleHRTaXplID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5UZXh0QXBwZWFyYW5jZV90ZXh0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoMjAgKiBnZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRleHRDb2xvciA9IGEuZ2V0Q29sb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0eWxlYWJsZS5UZXh0QXBwZWFyYW5jZV90ZXh0Q29sb3IsIDB4ZmZmZmZmZmYpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHRleHRTaXplIGlzIGFscmVhZHkgZXhwcmVzc2VkIGluIHBpeGVscwogICAgICAgICAgICAgICAgICAgICBzZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9QWCwgdGV4dFNpemUpOworICAgICAgICAgICAgICAgICAgICBzZXRUZXh0Q29sb3IodGV4dENvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgc2V0TWF4TGluZXMoMik7CiAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7ICAgICAgCiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvRGlnaXRhbENsb2NrLmphdmEKaW5kZXggMDg4NWI2ZS4uYWMwZGMzNSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9EaWdpdGFsQ2xvY2suamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0RpZ2l0YWxDbG9jay5qYXZhCkBAIC05NiwxMyArOTYsMTMgQEAKICAgICB9OwogCiAgICAgc3RhdGljIGNsYXNzIEFtUG0gewotICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1BbVBtOworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1BbVBtVGV4dFZpZXc7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG1BbVN0cmluZywgbVBtU3RyaW5nOwogCiAgICAgICAgIEFtUG0oVmlldyBwYXJlbnQsIFR5cGVmYWNlIHRmKSB7Ci0gICAgICAgICAgICBtQW1QbSA9IChUZXh0VmlldykgcGFyZW50LmZpbmRWaWV3QnlJZChSLmlkLmFtX3BtKTsKLSAgICAgICAgICAgIGlmICh0ZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUFtUG0uc2V0VHlwZWZhY2UodGYpOworICAgICAgICAgICAgbUFtUG1UZXh0VmlldyA9IChUZXh0VmlldykgcGFyZW50LmZpbmRWaWV3QnlJZChSLmlkLmFtX3BtKTsKKyAgICAgICAgICAgIGlmIChtQW1QbVRleHRWaWV3ICE9IG51bGwgJiYgdGYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BbVBtVGV4dFZpZXcuc2V0VHlwZWZhY2UodGYpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmdbXSBhbXBtID0gbmV3IERhdGVGb3JtYXRTeW1ib2xzKCkuZ2V0QW1QbVN0cmluZ3MoKTsKQEAgLTExMSwxMSArMTExLDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHNldFNob3dBbVBtKGJvb2xlYW4gc2hvdykgewotICAgICAgICAgICAgbUFtUG0uc2V0VmlzaWJpbGl0eShzaG93ID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICAgICAgICAgIGlmIChtQW1QbVRleHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQW1QbVRleHRWaWV3LnNldFZpc2liaWxpdHkoc2hvdyA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHNldElzTW9ybmluZyhib29sZWFuIGlzTW9ybmluZykgewotICAgICAgICAgICAgbUFtUG0uc2V0VGV4dChpc01vcm5pbmcgPyBtQW1TdHJpbmcgOiBtUG1TdHJpbmcpOworICAgICAgICAgICAgaWYgKG1BbVBtVGV4dFZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1BbVBtVGV4dFZpZXcuc2V0VGV4dChpc01vcm5pbmcgPyBtQW1TdHJpbmcgOiBtUG1TdHJpbmcpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVXRpbHMuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCmluZGV4IDBkYzA0MjIuLmQwMzRlYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5VdGlscy5qYXZhCkBAIC0zMCwxMCArMzAsMTMgQEAKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwogaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5JTW91bnRTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIGltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC00Nyw3ICs1MCw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiAKIC8qKgotICogVXRpbGl0aWVzIGZvciB0aGUgbG9jayBwYXR0ZW4gYW5kIGl0cyBzZXR0aW5ncy4KKyAqIFV0aWxpdGllcyBmb3IgdGhlIGxvY2sgcGF0dGVybiBhbmQgaXRzIHNldHRpbmdzLgogICovCiBwdWJsaWMgY2xhc3MgTG9ja1BhdHRlcm5VdGlscyB7CiAKQEAgLTM5NiwxMiArMzk5LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByYWYuY2xvc2UoKTsKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIgZHBtID0gZ2V0RGV2aWNlUG9saWN5TWFuYWdlcigpOworICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGtleVN0b3JlLnBhc3N3b3JkKHBhdHRlcm5Ub1N0cmluZyhwYXR0ZXJuKSk7CiAgICAgICAgICAgICAgICAgc2V0Qm9vbGVhbihQQVRURVJOX0VWRVJfQ0hPU0VOX0tFWSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgc2V0TG9uZyhQQVNTV09SRF9UWVBFX0tFWSwgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORyk7CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1NPTUVUSElORywgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSwgMCwgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChrZXlTdG9yZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U3RvcmUucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHBtLnNldEFjdGl2ZVBhc3N3b3JkU3RhdGUoRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICB9CkBAIC00ODQsMTAgKzQ5MiwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmFmLmNsb3NlKCk7CiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyIGRwbSA9IGdldERldmljZVBvbGljeU1hbmFnZXIoKTsKKyAgICAgICAgICAgIEtleVN0b3JlIGtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoKTsKICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBlbmNyeXB0aW9uIHBhc3N3b3JkLgogICAgICAgICAgICAgICAgIHVwZGF0ZUVuY3J5cHRpb25QYXNzd29yZChwYXNzd29yZCk7CiAKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGtleXN0b3JlIHBhc3N3b3JkCisgICAgICAgICAgICAgICAga2V5U3RvcmUucGFzc3dvcmQocGFzc3dvcmQpOworCiAgICAgICAgICAgICAgICAgaW50IGNvbXB1dGVkUXVhbGl0eSA9IGNvbXB1dGVQYXNzd29yZFF1YWxpdHkocGFzc3dvcmQpOwogICAgICAgICAgICAgICAgIHNldExvbmcoUEFTU1dPUkRfVFlQRV9LRVksIE1hdGgubWF4KHF1YWxpdHksIGNvbXB1dGVkUXVhbGl0eSkpOwogICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFF1YWxpdHkgIT0gRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKSB7CkBAIC01NDAsNiArNTUyLDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNldFN0cmluZyhQQVNTV09SRF9ISVNUT1JZX0tFWSwgcGFzc3dvcmRIaXN0b3J5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uYWxseSByZXNldCB0aGUga2V5c3RvcmUgaWYgZW1wdHkuIElmCisgICAgICAgICAgICAgICAgLy8gbm9uLWVtcHR5LCB3ZSBhcmUganVzdCBzd2l0Y2hpbmcga2V5IGd1YXJkIHR5cGUKKyAgICAgICAgICAgICAgICBpZiAoa2V5U3RvcmUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGtleVN0b3JlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRwbS5zZXRBY3RpdmVQYXNzd29yZFN0YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVELCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKICAgICAgICAgICAgIH0KQEAgLTY0Niw3ICs2NjMsNyBAQAogICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgZ2VzdHVyZSBwYXR0ZXJuLgogICAgICAqIEByZXR1cm4gdGhlIGhhc2ggb2YgdGhlIHBhdHRlcm4gaW4gYSBieXRlIGFycmF5LgogICAgICAqLwotICAgICBwdWJsaWMgYnl0ZVtdIHBhc3N3b3JkVG9IYXNoKFN0cmluZyBwYXNzd29yZCkgeworICAgIHB1YmxpYyBieXRlW10gcGFzc3dvcmRUb0hhc2goU3RyaW5nIHBhc3N3b3JkKSB7CiAgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQpAQCAtNzc1LDYgKzc5MiwxNiBAQAogICAgICAgICBzZXRCb29sZWFuKExPQ0tPVVRfUEVSTUFORU5UX0tFWSwgbG9ja2VkKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtZXJnZW5jeUNhbGxDYXBhYmxlKCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX3ZvaWNlX2NhcGFibGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHVrVW5sb2NrU2NyZWVuRW5hYmxlKCkgeworICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmJvb2wuY29uZmlnX2VuYWJsZV9wdWtfdW5sb2NrX3NjcmVlbik7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBBIGZvcm1hdHRlZCBzdHJpbmcgb2YgdGhlIG5leHQgYWxhcm0gKGZvciBzaG93aW5nIG9uIHRoZSBsb2NrIHNjcmVlbiksCiAgICAgICogICBvciBudWxsIGlmIHRoZXJlIGlzIG5vIG5leHQgYWxhcm0uCkBAIC04MjcsMTEgKzg1NCwyMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHRleHQgb24gdGhlIGVtZXJnZW5jeSBidXR0b24gdG8gaW5kaWNhdGUgd2hhdCBhY3Rpb24gd2lsbCBiZSB0YWtlbi4KKyAgICAgKiBTZXRzIHRoZSBlbWVyZ2VuY3kgYnV0dG9uIHZpc2liaWxpdHkgYmFzZWQgb24gaXNFbWVyZ2VuY3lDYWxsQ2FwYWJsZSgpLgorICAgICAqCisgICAgICogSWYgdGhlIGVtZXJnZW5jeSBidXR0b24gaXMgdmlzaWJsZSwgc2V0cyB0aGUgdGV4dCBvbiB0aGUgZW1lcmdlbmN5IGJ1dHRvbgorICAgICAqIHRvIGluZGljYXRlIHdoYXQgYWN0aW9uIHdpbGwgYmUgdGFrZW4uCisgICAgICoKICAgICAgKiBJZiB0aGVyZSdzIGN1cnJlbnRseSBhIGNhbGwgaW4gcHJvZ3Jlc3MsIHRoZSBidXR0b24gd2lsbCB0YWtlIHRoZW0gdG8gdGhlIGNhbGwKICAgICAgKiBAcGFyYW0gYnV0dG9uIHRoZSBidXR0b24gdG8gdXBkYXRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKEJ1dHRvbiBidXR0b24pIHsKKyAgICAgICAgaWYgKGlzRW1lcmdlbmN5Q2FsbENhcGFibGUoKSkgeworICAgICAgICAgICAgYnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKwogICAgICAgICBpbnQgbmV3U3RhdGUgPSBUZWxlcGhvbnlNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRDYWxsU3RhdGUoKTsKICAgICAgICAgaW50IHRleHRJZDsKICAgICAgICAgaWYgKG5ld1N0YXRlID09IFRlbGVwaG9ueU1hbmFnZXIuQ0FMTF9TVEFURV9PRkZIT09LKSB7CkBAIC04NDgsNiArODg2LDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmlzaWJpbGl0eSBvZiBlbWVyZ2VuY3kgY2FsbCBwcm9tcHQgYmFzZWQgb24gZW1lcmdlbmN5IGNhcGFibGUKKyAgICAgKiBAcGFyYW0gZW1lcmdlbmN5VGV4dCB0aGUgZW1lcmdlbmN5IGNhbGwgdGV4dCB0byBiZSB1cGRhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlRW1lcmdlbmN5Q2FsbFRleHQoVGV4dFZpZXcgZW1lcmdlbmN5VGV4dCkgeworICAgICAgICBpZiAoaXNFbWVyZ2VuY3lDYWxsQ2FwYWJsZSgpKSB7CisgICAgICAgICAgICBlbWVyZ2VuY3lUZXh0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVtZXJnZW5jeVRleHQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmVzdW1lcyBhIGNhbGwgaW4gcHJvZ3Jlc3MuIFR5cGljYWxseSBsYXVuY2hlZCBmcm9tIHRoZSBFbWVyZ2VuY3lDYWxsIGJ1dHRvbgogICAgICAqIG9uIHZhcmlvdXMgbG9ja3NjcmVlbnMuCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L0xvY2tQYXR0ZXJuVmlldy5qYXZhCmluZGV4IGJlZTgxMTIuLmNiYjExMGEgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvTG9ja1BhdHRlcm5WaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9Mb2NrUGF0dGVyblZpZXcuamF2YQpAQCAtMTMxLDYgKzEzMSw3IEBACiAKICAgICBwcml2YXRlIGludCBtQXNwZWN0OwogICAgIHByaXZhdGUgZmluYWwgTWF0cml4IG1BcnJvd01hdHJpeCA9IG5ldyBNYXRyaXgoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hdHJpeCBtQ2lyY2xlTWF0cml4ID0gbmV3IE1hdHJpeCgpOwogCiAgICAgLyoqCiAgICAgICogUmVwcmVzZW50cyBhIGNlbGwgaW4gdGhlIDMgWCAzIG1hdHJpeCBvZiB0aGUgdW5sb2NrIHBhdHRlcm4gdmlldy4KQEAgLTI4MSw5ICsyODIsMTQgQEAKICAgICAgICAgbUJpdG1hcEFycm93R3JlZW5VcCA9IGdldEJpdG1hcEZvcihSLmRyYXdhYmxlLmluZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXApOwogICAgICAgICBtQml0bWFwQXJyb3dSZWRVcCA9IGdldEJpdG1hcEZvcihSLmRyYXdhYmxlLmluZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwKTsKIAotICAgICAgICAvLyB3ZSBhc3N1bWUgYWxsIGJpdG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplCi0gICAgICAgIG1CaXRtYXBXaWR0aCA9IG1CaXRtYXBCdG5EZWZhdWx0LmdldFdpZHRoKCk7Ci0gICAgICAgIG1CaXRtYXBIZWlnaHQgPSBtQml0bWFwQnRuRGVmYXVsdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgLy8gYml0bWFwcyBoYXZlIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IGJpdG1hcCBpbiB0aGlzIGdyb3VwCisgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXBzW10gPSB7IG1CaXRtYXBCdG5EZWZhdWx0LCBtQml0bWFwQnRuVG91Y2hlZCwgbUJpdG1hcENpcmNsZURlZmF1bHQsCisgICAgICAgICAgICAgICAgbUJpdG1hcENpcmNsZUdyZWVuLCBtQml0bWFwQ2lyY2xlUmVkIH07CisKKyAgICAgICAgZm9yIChCaXRtYXAgYml0bWFwIDogYml0bWFwcykgeworICAgICAgICAgICAgbUJpdG1hcFdpZHRoID0gTWF0aC5tYXgobUJpdG1hcFdpZHRoLCBiaXRtYXAuZ2V0V2lkdGgoKSk7CisgICAgICAgICAgICBtQml0bWFwSGVpZ2h0ID0gTWF0aC5tYXgobUJpdG1hcEhlaWdodCwgYml0bWFwLmdldEhlaWdodCgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGFsbG93IHZpYnJhdGlvbiBwYXR0ZXJuIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgICAgbVZpYmVQYXR0ZXJuID0gbG9hZFZpYnJhdGVQYXR0ZXJuKGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3ZpcnR1YWxLZXlWaWJlUGF0dGVybik7CkBAIC00NTgsMzEgKzQ2NCw0MCBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBzcGVjU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHNwZWNpZmllZCBzaXplLCBpZiBub24temVybworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNwZWNTaXplICE9IDAgPyBzcGVjU2l6ZSA6IGRlc2lyZWQ7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpIHsKKyAgICAgICAgLy8gVmlldyBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gMyBzaWRlLWJ5LXNpZGUgdGFyZ2V0IGJpdG1hcHMKKyAgICAgICAgcmV0dXJuIDMgKiBtQml0bWFwV2lkdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRTdWdnZXN0ZWRNaW5pbXVtSGVpZ2h0KCkgeworICAgICAgICAvLyBWaWV3IHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiAzIHNpZGUtYnktc2lkZSB0YXJnZXQgYml0bWFwcworICAgICAgICByZXR1cm4gMyAqIG1CaXRtYXBXaWR0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBmaW5hbCBpbnQgbWluaW11bVdpZHRoID0gMyAqIG1CaXRtYXBDaXJjbGVEZWZhdWx0LmdldFdpZHRoKCk7Ci0gICAgICAgIGZpbmFsIGludCBtaW5pbXVtSGVpZ2h0ID0gMyAqIG1CaXRtYXBDaXJjbGVEZWZhdWx0LmdldEhlaWdodCgpOworICAgICAgICBmaW5hbCBpbnQgbWluaW11bVdpZHRoID0gZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoKCk7CisgICAgICAgIGZpbmFsIGludCBtaW5pbXVtSGVpZ2h0ID0gZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodCgpOwogICAgICAgICBpbnQgdmlld1dpZHRoID0gcmVzb2x2ZU1lYXN1cmVkKHdpZHRoTWVhc3VyZVNwZWMsIG1pbmltdW1XaWR0aCk7CiAgICAgICAgIGludCB2aWV3SGVpZ2h0ID0gcmVzb2x2ZU1lYXN1cmVkKGhlaWdodE1lYXN1cmVTcGVjLCBtaW5pbXVtSGVpZ2h0KTsKIAotICAgICAgICBpbnQgcmVxdWVzdGVkV2lkdGggPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgcmVxdWVzdGVkSGVpZ2h0ID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7CiAgICAgICAgIHN3aXRjaCAobUFzcGVjdCkgewogICAgICAgICAgICAgY2FzZSBBU1BFQ1RfU1FVQVJFOgotICAgICAgICAgICAgICAgIHZpZXdXaWR0aCA9IHZpZXdIZWlnaHQgPSBNYXRoLm1pbihyZXF1ZXN0ZWRXaWR0aCwgcmVxdWVzdGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB2aWV3V2lkdGggPSB2aWV3SGVpZ2h0ID0gTWF0aC5taW4odmlld1dpZHRoLCB2aWV3SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVNQRUNUX0xPQ0tfV0lEVEg6Ci0gICAgICAgICAgICAgICAgdmlld1dpZHRoID0gcmVxdWVzdGVkV2lkdGg7Ci0gICAgICAgICAgICAgICAgdmlld0hlaWdodCA9IE1hdGgubWluKHJlcXVlc3RlZFdpZHRoLCByZXF1ZXN0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgIHZpZXdIZWlnaHQgPSBNYXRoLm1pbih2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBU1BFQ1RfTE9DS19IRUlHSFQ6Ci0gICAgICAgICAgICAgICAgdmlld1dpZHRoID0gTWF0aC5taW4ocmVxdWVzdGVkV2lkdGgsIHJlcXVlc3RlZEhlaWdodCk7Ci0gICAgICAgICAgICAgICAgdmlld0hlaWdodCA9IHJlcXVlc3RlZEhlaWdodDsKKyAgICAgICAgICAgICAgICB2aWV3V2lkdGggPSBNYXRoLm1pbih2aWV3V2lkdGgsIHZpZXdIZWlnaHQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIC8vIExvZy52KFRBRywgIkxvY2tQYXR0ZXJuVmlldyBkaW1lbnNpb25zOiAiICsgdmlld1dpZHRoICsgIngiICsgdmlld0hlaWdodCk7CkBAIC02MDMsMTc4ICs2MTgsMjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgbW90aW9uRXZlbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKCFtSW5wdXRFbmFibGVkIHx8ICFpc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgZmxvYXQgeCA9IG1vdGlvbkV2ZW50LmdldFgoKTsKLSAgICAgICAgZmluYWwgZmxvYXQgeSA9IG1vdGlvbkV2ZW50LmdldFkoKTsKLSAgICAgICAgQ2VsbCBoaXRDZWxsOwotICAgICAgICBzd2l0Y2gobW90aW9uRXZlbnQuZ2V0QWN0aW9uKCkpIHsKKyAgICAgICAgc3dpdGNoKGV2ZW50LmdldEFjdGlvbigpKSB7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOgotICAgICAgICAgICAgICAgIHJlc2V0UGF0dGVybigpOwotICAgICAgICAgICAgICAgIGhpdENlbGwgPSBkZXRlY3RBbmRBZGRIaXQoeCwgeSk7Ci0gICAgICAgICAgICAgICAgaWYgKGhpdENlbGwgIT0gbnVsbCAmJiBtT25QYXR0ZXJuTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGF0dGVybkluUHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtUGF0dGVybkRpc3BsYXlNb2RlID0gRGlzcGxheU1vZGUuQ29ycmVjdDsKLSAgICAgICAgICAgICAgICAgICAgbU9uUGF0dGVybkxpc3RlbmVyLm9uUGF0dGVyblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtT25QYXR0ZXJuTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGF0dGVybkluUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbU9uUGF0dGVybkxpc3RlbmVyLm9uUGF0dGVybkNsZWFyZWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhpdENlbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBzdGFydFggPSBnZXRDZW50ZXJYRm9yQ29sdW1uKGhpdENlbGwuY29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgc3RhcnRZID0gZ2V0Q2VudGVyWUZvclJvdyhoaXRDZWxsLnJvdyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgd2lkdGhPZmZzZXQgPSBtU3F1YXJlV2lkdGggLyAyZjsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgaGVpZ2h0T2Zmc2V0ID0gbVNxdWFyZUhlaWdodCAvIDJmOwotCi0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKGludCkgKHN0YXJ0WCAtIHdpZHRoT2Zmc2V0KSwgKGludCkgKHN0YXJ0WSAtIGhlaWdodE9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHN0YXJ0WCArIHdpZHRoT2Zmc2V0KSwgKGludCkgKHN0YXJ0WSArIGhlaWdodE9mZnNldCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSW5Qcm9ncmVzc1ggPSB4OwotICAgICAgICAgICAgICAgIG1JblByb2dyZXNzWSA9IHk7Ci0gICAgICAgICAgICAgICAgaWYgKFBST0ZJTEVfRFJBV0lORykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1EcmF3aW5nUHJvZmlsaW5nU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuc3RhcnRNZXRob2RUcmFjaW5nKCJMb2NrUGF0dGVybkRyYXdpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nUHJvZmlsaW5nU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaGFuZGxlQWN0aW9uRG93bihldmVudCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKLSAgICAgICAgICAgICAgICAvLyByZXBvcnQgcGF0dGVybiBkZXRlY3RlZAotICAgICAgICAgICAgICAgIGlmICghbVBhdHRlcm4uaXNFbXB0eSgpICYmIG1PblBhdHRlcm5MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXR0ZXJuSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtT25QYXR0ZXJuTGlzdGVuZXIub25QYXR0ZXJuRGV0ZWN0ZWQobVBhdHRlcm4pOwotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChQUk9GSUxFX0RSQVdJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1EcmF3aW5nUHJvZmlsaW5nU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcuc3RvcE1ldGhvZFRyYWNpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3aW5nUHJvZmlsaW5nU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZUFjdGlvblVwKGV2ZW50KTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHBhdHRlcm5TaXplUHJlSGl0RGV0ZWN0ID0gbVBhdHRlcm4uc2l6ZSgpOwotICAgICAgICAgICAgICAgIGhpdENlbGwgPSBkZXRlY3RBbmRBZGRIaXQoeCwgeSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHBhdHRlcm5TaXplID0gbVBhdHRlcm4uc2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChoaXRDZWxsICE9IG51bGwgJiYgKG1PblBhdHRlcm5MaXN0ZW5lciAhPSBudWxsKSAmJiAocGF0dGVyblNpemUgPT0gMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBhdHRlcm5JblByb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbU9uUGF0dGVybkxpc3RlbmVyLm9uUGF0dGVyblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG5vdGUgY3VycmVudCB4IGFuZCB5IGZvciBydWJiZXIgYmFuZGluZyBvZiBpbiBwcm9ncmVzcwotICAgICAgICAgICAgICAgIC8vIHBhdHRlcm5zCi0gICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgZHggPSBNYXRoLmFicyh4IC0gbUluUHJvZ3Jlc3NYKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBkeSA9IE1hdGguYWJzKHkgLSBtSW5Qcm9ncmVzc1kpOwotICAgICAgICAgICAgICAgIGlmIChkeCArIGR5ID4gbVNxdWFyZVdpZHRoICogMC4wMWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgb2xkWCA9IG1JblByb2dyZXNzWDsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgb2xkWSA9IG1JblByb2dyZXNzWTsKLQotICAgICAgICAgICAgICAgICAgICBtSW5Qcm9ncmVzc1ggPSB4OwotICAgICAgICAgICAgICAgICAgICBtSW5Qcm9ncmVzc1kgPSB5OwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtUGF0dGVybkluUHJvZ3Jlc3MgJiYgcGF0dGVyblNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8Q2VsbD4gcGF0dGVybiA9IG1QYXR0ZXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcmFkaXVzID0gbVNxdWFyZVdpZHRoICogbURpYW1ldGVyRmFjdG9yICogMC41ZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2VsbCBsYXN0Q2VsbCA9IHBhdHRlcm4uZ2V0KHBhdHRlcm5TaXplIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN0YXJ0WCA9IGdldENlbnRlclhGb3JDb2x1bW4obGFzdENlbGwuY29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN0YXJ0WSA9IGdldENlbnRlcllGb3JSb3cobGFzdENlbGwucm93KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWN0IGludmFsaWRhdGVSZWN0ID0gbUludmFsaWRhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFggPCB4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHN0YXJ0WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSB4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gc3RhcnRYOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRZIDwgeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IHN0YXJ0WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSB5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IHN0YXJ0WTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBiZXR3ZWVuIHRoZSBwYXR0ZXJuJ3MgbGFzdCBjZWxsIGFuZCB0aGUgY3VycmVudCBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3Quc2V0KChpbnQpIChsZWZ0IC0gcmFkaXVzKSwgKGludCkgKHRvcCAtIHJhZGl1cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIChyaWdodCArIHJhZGl1cyksIChpbnQpIChib3R0b20gKyByYWRpdXMpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0WCA8IG9sZFgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3RhcnRYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gb2xkWDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9sZFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBzdGFydFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFkgPCBvbGRZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gc3RhcnRZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IG9sZFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IG9sZFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gc3RhcnRZOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIGJldHdlZW4gdGhlIHBhdHRlcm4ncyBsYXN0IGNlbGwgYW5kIHRoZSBwcmV2aW91cyBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3QudW5pb24oKGludCkgKGxlZnQgLSByYWRpdXMpLCAoaW50KSAodG9wIC0gcmFkaXVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHJpZ2h0ICsgcmFkaXVzKSwgKGludCkgKGJvdHRvbSArIHJhZGl1cykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIGJldHdlZW4gdGhlIHBhdHRlcm4ncyBuZXcgY2VsbCBhbmQgdGhlIHBhdHRlcm4ncyBwcmV2aW91cyBjZWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGl0Q2VsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gZ2V0Q2VudGVyWEZvckNvbHVtbihoaXRDZWxsLmNvbHVtbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRZID0gZ2V0Q2VudGVyWUZvclJvdyhoaXRDZWxsLnJvdyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0dGVyblNpemUgPj0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocmUtdXNpbmcgaGl0Y2VsbCBmb3Igb2xkIGNlbGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdENlbGwgPSBwYXR0ZXJuLmdldChwYXR0ZXJuU2l6ZSAtIDEgLSAocGF0dGVyblNpemUgLSBwYXR0ZXJuU2l6ZVByZUhpdERldGVjdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRYID0gZ2V0Q2VudGVyWEZvckNvbHVtbihoaXRDZWxsLmNvbHVtbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFkgPSBnZXRDZW50ZXJZRm9yUm93KGhpdENlbGwucm93KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRYIDwgb2xkWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHN0YXJ0WDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gb2xkWDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBvbGRYOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBzdGFydFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRZIDwgb2xkWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gc3RhcnRZOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tID0gb2xkWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IG9sZFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSBzdGFydFk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQgPSBzdGFydFg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IGJvdHRvbSA9IHN0YXJ0WTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCB3aWR0aE9mZnNldCA9IG1TcXVhcmVXaWR0aCAvIDJmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGhlaWdodE9mZnNldCA9IG1TcXVhcmVIZWlnaHQgLyAyZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0LnNldCgoaW50KSAobGVmdCAtIHdpZHRoT2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpICh0b3AgLSBoZWlnaHRPZmZzZXQpLCAoaW50KSAocmlnaHQgKyB3aWR0aE9mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoYm90dG9tICsgaGVpZ2h0T2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoaW52YWxpZGF0ZVJlY3QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZUFjdGlvbk1vdmUoZXZlbnQpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOgogICAgICAgICAgICAgICAgIHJlc2V0UGF0dGVybigpOwpAQCAtNzkzLDYgKzY1MCwxODEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBY3Rpb25Nb3ZlKE1vdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIEhhbmRsZSBhbGwgcmVjZW50IG1vdGlvbiBldmVudHMgc28gd2UgZG9uJ3Qgc2tpcCBhbnkgY2VsbHMgZXZlbiB3aGVuIHRoZSBkZXZpY2UKKyAgICAgICAgLy8gaXMgYnVzeS4uLgorICAgICAgICBmaW5hbCBpbnQgaGlzdG9yeVNpemUgPSBldmVudC5nZXRIaXN0b3J5U2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhpc3RvcnlTaXplICsgMTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCB4ID0gaSA8IGhpc3RvcnlTaXplID8gZXZlbnQuZ2V0SGlzdG9yaWNhbFgoaSkgOiBldmVudC5nZXRYKCk7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCB5ID0gaSA8IGhpc3RvcnlTaXplID8gZXZlbnQuZ2V0SGlzdG9yaWNhbFkoaSkgOiBldmVudC5nZXRZKCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcGF0dGVyblNpemVQcmVIaXREZXRlY3QgPSBtUGF0dGVybi5zaXplKCk7CisgICAgICAgICAgICBDZWxsIGhpdENlbGwgPSBkZXRlY3RBbmRBZGRIaXQoeCwgeSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcGF0dGVyblNpemUgPSBtUGF0dGVybi5zaXplKCk7CisgICAgICAgICAgICBpZiAoaGl0Q2VsbCAhPSBudWxsICYmIChtT25QYXR0ZXJuTGlzdGVuZXIgIT0gbnVsbCkgJiYgKHBhdHRlcm5TaXplID09IDEpKSB7CisgICAgICAgICAgICAgICAgbVBhdHRlcm5JblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtT25QYXR0ZXJuTGlzdGVuZXIub25QYXR0ZXJuU3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdGUgY3VycmVudCB4IGFuZCB5IGZvciBydWJiZXIgYmFuZGluZyBvZiBpbiBwcm9ncmVzcyBwYXR0ZXJucworICAgICAgICAgICAgZmluYWwgZmxvYXQgZHggPSBNYXRoLmFicyh4IC0gbUluUHJvZ3Jlc3NYKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGR5ID0gTWF0aC5hYnMoeSAtIG1JblByb2dyZXNzWSk7CisgICAgICAgICAgICBpZiAoZHggKyBkeSA+IG1TcXVhcmVXaWR0aCAqIDAuMDFmKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgb2xkWCA9IG1JblByb2dyZXNzWDsKKyAgICAgICAgICAgICAgICBmbG9hdCBvbGRZID0gbUluUHJvZ3Jlc3NZOworCisgICAgICAgICAgICAgICAgbUluUHJvZ3Jlc3NYID0geDsKKyAgICAgICAgICAgICAgICBtSW5Qcm9ncmVzc1kgPSB5OworCisgICAgICAgICAgICAgICAgaWYgKG1QYXR0ZXJuSW5Qcm9ncmVzcyAmJiBwYXR0ZXJuU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PENlbGw+IHBhdHRlcm4gPSBtUGF0dGVybjsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcmFkaXVzID0gbVNxdWFyZVdpZHRoICogbURpYW1ldGVyRmFjdG9yICogMC41ZjsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDZWxsIGxhc3RDZWxsID0gcGF0dGVybi5nZXQocGF0dGVyblNpemUgLSAxKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdGFydFggPSBnZXRDZW50ZXJYRm9yQ29sdW1uKGxhc3RDZWxsLmNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN0YXJ0WSA9IGdldENlbnRlcllGb3JSb3cobGFzdENlbGwucm93KTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZWZ0OworICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3A7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0OworICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b207CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVjdCBpbnZhbGlkYXRlUmVjdCA9IG1JbnZhbGlkYXRlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFggPCB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3RhcnRYOworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB4OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHN0YXJ0WDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFkgPCB5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBzdGFydFk7CisgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSB5OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IHN0YXJ0WTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgYmV0d2VlbiB0aGUgcGF0dGVybidzIGxhc3QgY2VsbCBhbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJlY3Quc2V0KChpbnQpIChsZWZ0IC0gcmFkaXVzKSwgKGludCkgKHRvcCAtIHJhZGl1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHJpZ2h0ICsgcmFkaXVzKSwgKGludCkgKGJvdHRvbSArIHJhZGl1cykpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFggPCBvbGRYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gc3RhcnRYOworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBvbGRYOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9sZFg7CisgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IHN0YXJ0WDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFkgPCBvbGRZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBzdGFydFk7CisgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSBvbGRZOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gb2xkWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IHN0YXJ0WTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgYmV0d2VlbiB0aGUgcGF0dGVybidzIGxhc3QgY2VsbCBhbmQgdGhlIHByZXZpb3VzIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0LnVuaW9uKChpbnQpIChsZWZ0IC0gcmFkaXVzKSwgKGludCkgKHRvcCAtIHJhZGl1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHJpZ2h0ICsgcmFkaXVzKSwgKGludCkgKGJvdHRvbSArIHJhZGl1cykpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWRhdGUgYmV0d2VlbiB0aGUgcGF0dGVybidzIG5ldyBjZWxsIGFuZCB0aGUgcGF0dGVybidzIHByZXZpb3VzIGNlbGwKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhpdENlbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gZ2V0Q2VudGVyWEZvckNvbHVtbihoaXRDZWxsLmNvbHVtbik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFkgPSBnZXRDZW50ZXJZRm9yUm93KGhpdENlbGwucm93KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm5TaXplID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAocmUtdXNpbmcgaGl0Y2VsbCBmb3Igb2xkIGNlbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl0Q2VsbCA9IHBhdHRlcm4uZ2V0KHBhdHRlcm5TaXplIC0gMSAtIChwYXR0ZXJuU2l6ZSAtIHBhdHRlcm5TaXplUHJlSGl0RGV0ZWN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkWCA9IGdldENlbnRlclhGb3JDb2x1bW4oaGl0Q2VsbC5jb2x1bW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFkgPSBnZXRDZW50ZXJZRm9yUm93KGhpdENlbGwucm93KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFggPCBvbGRYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBzdGFydFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gb2xkWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gb2xkWDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBzdGFydFg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0WSA8IG9sZFkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gc3RhcnRZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gPSBvbGRZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCA9IG9sZFk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSA9IHN0YXJ0WTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodCA9IHN0YXJ0WDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSBib3R0b20gPSBzdGFydFk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHdpZHRoT2Zmc2V0ID0gbVNxdWFyZVdpZHRoIC8gMmY7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBmbG9hdCBoZWlnaHRPZmZzZXQgPSBtU3F1YXJlSGVpZ2h0IC8gMmY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVSZWN0LnNldCgoaW50KSAobGVmdCAtIHdpZHRoT2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKHRvcCAtIGhlaWdodE9mZnNldCksIChpbnQpIChyaWdodCArIHdpZHRoT2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKGJvdHRvbSArIGhlaWdodE9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZShpbnZhbGlkYXRlUmVjdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBY3Rpb25VcChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAvLyByZXBvcnQgcGF0dGVybiBkZXRlY3RlZAorICAgICAgICBpZiAoIW1QYXR0ZXJuLmlzRW1wdHkoKSAmJiBtT25QYXR0ZXJuTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBhdHRlcm5JblByb2dyZXNzID0gZmFsc2U7CisgICAgICAgICAgICBtT25QYXR0ZXJuTGlzdGVuZXIub25QYXR0ZXJuRGV0ZWN0ZWQobVBhdHRlcm4pOworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChQUk9GSUxFX0RSQVdJTkcpIHsKKyAgICAgICAgICAgIGlmIChtRHJhd2luZ1Byb2ZpbGluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBEZWJ1Zy5zdG9wTWV0aG9kVHJhY2luZygpOworICAgICAgICAgICAgICAgIG1EcmF3aW5nUHJvZmlsaW5nU3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUFjdGlvbkRvd24oTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgcmVzZXRQYXR0ZXJuKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHggPSBldmVudC5nZXRYKCk7CisgICAgICAgIGZpbmFsIGZsb2F0IHkgPSBldmVudC5nZXRZKCk7CisgICAgICAgIGZpbmFsIENlbGwgaGl0Q2VsbCA9IGRldGVjdEFuZEFkZEhpdCh4LCB5KTsKKyAgICAgICAgaWYgKGhpdENlbGwgIT0gbnVsbCAmJiBtT25QYXR0ZXJuTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbVBhdHRlcm5JblByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1QYXR0ZXJuRGlzcGxheU1vZGUgPSBEaXNwbGF5TW9kZS5Db3JyZWN0OworICAgICAgICAgICAgbU9uUGF0dGVybkxpc3RlbmVyLm9uUGF0dGVyblN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSBpZiAobU9uUGF0dGVybkxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QYXR0ZXJuSW5Qcm9ncmVzcyA9IGZhbHNlOworICAgICAgICAgICAgbU9uUGF0dGVybkxpc3RlbmVyLm9uUGF0dGVybkNsZWFyZWQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGl0Q2VsbCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBmbG9hdCBzdGFydFggPSBnZXRDZW50ZXJYRm9yQ29sdW1uKGhpdENlbGwuY29sdW1uKTsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHN0YXJ0WSA9IGdldENlbnRlcllGb3JSb3coaGl0Q2VsbC5yb3cpOworCisgICAgICAgICAgICBmaW5hbCBmbG9hdCB3aWR0aE9mZnNldCA9IG1TcXVhcmVXaWR0aCAvIDJmOworICAgICAgICAgICAgZmluYWwgZmxvYXQgaGVpZ2h0T2Zmc2V0ID0gbVNxdWFyZUhlaWdodCAvIDJmOworCisgICAgICAgICAgICBpbnZhbGlkYXRlKChpbnQpIChzdGFydFggLSB3aWR0aE9mZnNldCksIChpbnQpIChzdGFydFkgLSBoZWlnaHRPZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoc3RhcnRYICsgd2lkdGhPZmZzZXQpLCAoaW50KSAoc3RhcnRZICsgaGVpZ2h0T2Zmc2V0KSk7CisgICAgICAgIH0KKyAgICAgICAgbUluUHJvZ3Jlc3NYID0geDsKKyAgICAgICAgbUluUHJvZ3Jlc3NZID0geTsKKyAgICAgICAgaWYgKFBST0ZJTEVfRFJBV0lORykgeworICAgICAgICAgICAgaWYgKCFtRHJhd2luZ1Byb2ZpbGluZ1N0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBEZWJ1Zy5zdGFydE1ldGhvZFRyYWNpbmcoIkxvY2tQYXR0ZXJuRHJhd2luZyIpOworICAgICAgICAgICAgICAgIG1EcmF3aW5nUHJvZmlsaW5nU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGZsb2F0IGdldENlbnRlclhGb3JDb2x1bW4oaW50IGNvbHVtbikgewogICAgICAgICByZXR1cm4gbVBhZGRpbmdMZWZ0ICsgY29sdW1uICogbVNxdWFyZVdpZHRoICsgbVNxdWFyZVdpZHRoIC8gMmY7CiAgICAgfQpAQCAtOTQ3LDggKzk3OSw4IEBACiAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBhcnJvdyBpbWFnZSBpcyBkcmF3biBhdCAxMjowMCB3aXRoIGl0J3MgdG9wIGVkZ2UKICAgICAgICAgLy8gY29pbmNpZGVudCB3aXRoIHRoZSBjaXJjbGUgYml0bWFwJ3MgdG9wIGVkZ2UuCiAgICAgICAgIEJpdG1hcCBhcnJvdyA9IGdyZWVuID8gbUJpdG1hcEFycm93R3JlZW5VcCA6IG1CaXRtYXBBcnJvd1JlZFVwOwotICAgICAgICBmaW5hbCBpbnQgY2VsbFdpZHRoID0gbUJpdG1hcENpcmNsZURlZmF1bHQuZ2V0V2lkdGgoKTsKLSAgICAgICAgZmluYWwgaW50IGNlbGxIZWlnaHQgPSBtQml0bWFwQ2lyY2xlRGVmYXVsdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgZmluYWwgaW50IGNlbGxXaWR0aCA9IG1CaXRtYXBXaWR0aDsKKyAgICAgICAgZmluYWwgaW50IGNlbGxIZWlnaHQgPSBtQml0bWFwSGVpZ2h0OwogCiAgICAgICAgIC8vIHRoZSB1cCBhcnJvdyBiaXRtYXAgaXMgYXQgMTI6MDAsIHNvIGZpbmQgdGhlIHJvdGF0aW9uIGZyb20geCBheGlzIGFuZCBhZGQgOTAgZGVncmVlcy4KICAgICAgICAgZmluYWwgZmxvYXQgdGhldGEgPSAoZmxvYXQpIE1hdGguYXRhbjIoCkBAIC05NTYsNyArOTg4LDEyIEBACiAgICAgICAgIGZpbmFsIGZsb2F0IGFuZ2xlID0gKGZsb2F0KSBNYXRoLnRvRGVncmVlcyh0aGV0YSkgKyA5MC4wZjsKIAogICAgICAgICAvLyBjb21wb3NlIG1hdHJpeAorICAgICAgICBmbG9hdCBzeCA9IE1hdGgubWluKG1TcXVhcmVXaWR0aCAvIG1CaXRtYXBXaWR0aCwgMS4wZik7CisgICAgICAgIGZsb2F0IHN5ID0gTWF0aC5taW4obVNxdWFyZUhlaWdodCAvIG1CaXRtYXBIZWlnaHQsIDEuMGYpOwogICAgICAgICBtQXJyb3dNYXRyaXguc2V0VHJhbnNsYXRlKGxlZnRYICsgb2Zmc2V0WCwgdG9wWSArIG9mZnNldFkpOyAvLyB0cmFuc2Zvcm0gdG8gY2VsbCBwb3NpdGlvbgorICAgICAgICBtQXJyb3dNYXRyaXgucHJlVHJhbnNsYXRlKG1CaXRtYXBXaWR0aC8yLCBtQml0bWFwSGVpZ2h0LzIpOworICAgICAgICBtQXJyb3dNYXRyaXgucHJlU2NhbGUoc3gsIHN5KTsKKyAgICAgICAgbUFycm93TWF0cml4LnByZVRyYW5zbGF0ZSgtbUJpdG1hcFdpZHRoLzIsIC1tQml0bWFwSGVpZ2h0LzIpOwogICAgICAgICBtQXJyb3dNYXRyaXgucHJlUm90YXRlKGFuZ2xlLCBjZWxsV2lkdGggLyAyLjBmLCBjZWxsSGVpZ2h0IC8gMi4wZik7ICAvLyByb3RhdGUgYWJvdXQgY2VsbCBjZW50ZXIKICAgICAgICAgbUFycm93TWF0cml4LnByZVRyYW5zbGF0ZSgoY2VsbFdpZHRoIC0gYXJyb3cuZ2V0V2lkdGgoKSkgLyAyLjBmLCAwLjBmKTsgLy8gdHJhbnNsYXRlIHRvIDEyOjAwIHBvcwogICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChhcnJvdywgbUFycm93TWF0cml4LCBtUGFpbnQpOwpAQCAtMTAwMiw4ICsxMDM5LDE3IEBACiAgICAgICAgIGludCBvZmZzZXRYID0gKGludCkgKChzcXVhcmVXaWR0aCAtIHdpZHRoKSAvIDJmKTsKICAgICAgICAgaW50IG9mZnNldFkgPSAoaW50KSAoKHNxdWFyZUhlaWdodCAtIGhlaWdodCkgLyAyZik7CiAKLSAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAob3V0ZXJDaXJjbGUsIGxlZnRYICsgb2Zmc2V0WCwgdG9wWSArIG9mZnNldFksIG1QYWludCk7Ci0gICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGlubmVyQ2lyY2xlLCBsZWZ0WCArIG9mZnNldFgsIHRvcFkgKyBvZmZzZXRZLCBtUGFpbnQpOworICAgICAgICAvLyBBbGxvdyBjaXJjbGVzIHRvIHNocmluayBpZiB0aGUgdmlldyBpcyB0b28gc21hbGwgdG8gaG9sZCB0aGVtLgorICAgICAgICBmbG9hdCBzeCA9IE1hdGgubWluKG1TcXVhcmVXaWR0aCAvIG1CaXRtYXBXaWR0aCwgMS4wZik7CisgICAgICAgIGZsb2F0IHN5ID0gTWF0aC5taW4obVNxdWFyZUhlaWdodCAvIG1CaXRtYXBIZWlnaHQsIDEuMGYpOworCisgICAgICAgIG1DaXJjbGVNYXRyaXguc2V0VHJhbnNsYXRlKGxlZnRYICsgb2Zmc2V0WCwgdG9wWSArIG9mZnNldFkpOworICAgICAgICBtQ2lyY2xlTWF0cml4LnByZVRyYW5zbGF0ZShtQml0bWFwV2lkdGgvMiwgbUJpdG1hcEhlaWdodC8yKTsKKyAgICAgICAgbUNpcmNsZU1hdHJpeC5wcmVTY2FsZShzeCwgc3kpOworICAgICAgICBtQ2lyY2xlTWF0cml4LnByZVRyYW5zbGF0ZSgtbUJpdG1hcFdpZHRoLzIsIC1tQml0bWFwSGVpZ2h0LzIpOworCisgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG91dGVyQ2lyY2xlLCBtQ2lyY2xlTWF0cml4LCBtUGFpbnQpOworICAgICAgICBjYW52YXMuZHJhd0JpdG1hcChpbm5lckNpcmNsZSwgbUNpcmNsZU1hdHJpeCwgbVBhaW50KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvU2Nyb2xsaW5nVGFiQ29udGFpbmVyVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TY3JvbGxpbmdUYWJDb250YWluZXJWaWV3LmphdmEKaW5kZXggYzdkMzdmMi4uNWI0ZDdhYiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TY3JvbGxpbmdUYWJDb250YWluZXJWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9TY3JvbGxpbmdUYWJDb250YWluZXJWaWV3LmphdmEKQEAgLTIzNiw4ICsyMzYsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KHRleHQpOwogICAgICAgICAgICAgICAgICAgICBtVGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRleHRWaWV3ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbVRleHRWaWV3LnNldFZpc2liaWxpdHkoR09ORSk7CisgICAgICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KG51bGwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9tdWx0aXdhdmV2aWV3L0Vhc2UuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvbXVsdGl3YXZldmlldy9FYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y5MGM0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvbXVsdGl3YXZldmlldy9FYXNlLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5tdWx0aXdhdmV2aWV3OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVGltZUludGVycG9sYXRvcjsKKworY2xhc3MgRWFzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRE9NQUlOID0gMS4wZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBEVVJBVElPTiA9IDEuMGY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU1RBUlQgPSAwLjBmOworCisgICAgc3RhdGljIGNsYXNzIExpbmVhciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBlYXNlTm9uZSA9IG5ldyBUaW1lSW50ZXJwb2xhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEN1YmljIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VJbiA9IG5ldyBUaW1lSW50ZXJwb2xhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9NQUlOKihpbnB1dC89RFVSQVRJT04pKmlucHV0KmlucHV0ICsgU1RBUlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBlYXNlT3V0ID0gbmV3IFRpbWVJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0SW50ZXJwb2xhdGlvbihmbG9hdCBpbnB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBET01BSU4qKChpbnB1dD1pbnB1dC9EVVJBVElPTi0xKSppbnB1dCppbnB1dCArIDEpICsgU1RBUlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBlYXNlSW5PdXQgPSBuZXcgVGltZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoaW5wdXQvPURVUkFUSU9OLzIpIDwgMS4wZikgPworICAgICAgICAgICAgICAgICAgICAgICAgKERPTUFJTi8yKmlucHV0KmlucHV0KmlucHV0ICsgU1RBUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRE9NQUlOLzIqKChpbnB1dC09MikqaW5wdXQqaW5wdXQgKyAyKSArIFNUQVJUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUXVhZCB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBlYXNlSW4gPSBuZXcgVGltZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uIChmbG9hdCBpbnB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBET01BSU4qKGlucHV0Lz1EVVJBVElPTikqaW5wdXQgKyBTVEFSVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VPdXQgPSBuZXcgVGltZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1ET01BSU4gKihpbnB1dC89RFVSQVRJT04pKihpbnB1dC0yKSArIFNUQVJUOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRpbWVJbnRlcnBvbGF0b3IgZWFzZUluT3V0ID0gbmV3IFRpbWVJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0SW50ZXJwb2xhdGlvbihmbG9hdCBpbnB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKGlucHV0Lz1EVVJBVElPTi8yKSA8IDEpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIChET01BSU4vMippbnB1dCppbnB1dCArIFNUQVJUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKC1ET01BSU4vMiAqICgoLS1pbnB1dCkqKGlucHV0LTIpIC0gMSkgKyBTVEFSVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFF1YXJ0IHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VJbiA9IG5ldyBUaW1lSW50ZXJwb2xhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9NQUlOKihpbnB1dC89RFVSQVRJT04pKmlucHV0KmlucHV0KmlucHV0ICsgU1RBUlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBlYXNlT3V0ID0gbmV3IFRpbWVJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0SW50ZXJwb2xhdGlvbihmbG9hdCBpbnB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRE9NQUlOICogKChpbnB1dD1pbnB1dC9EVVJBVElPTi0xKSppbnB1dCppbnB1dCppbnB1dCAtIDEpICsgU1RBUlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGltZUludGVycG9sYXRvciBlYXNlSW5PdXQgPSBuZXcgVGltZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoaW5wdXQvPURVUkFUSU9OLzIpIDwgMSkgPworICAgICAgICAgICAgICAgICAgICAgICAgKERPTUFJTi8yKmlucHV0KmlucHV0KmlucHV0KmlucHV0ICsgU1RBUlQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoLURPTUFJTi8yICogKChpbnB1dC09MikqaW5wdXQqaW5wdXQqaW5wdXQgLSAyKSArIFNUQVJUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUXVpbnQgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRpbWVJbnRlcnBvbGF0b3IgZWFzZUluID0gbmV3IFRpbWVJbnRlcnBvbGF0b3IoKSB7CisgICAgICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0SW50ZXJwb2xhdGlvbihmbG9hdCBpbnB1dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBET01BSU4qKGlucHV0Lz1EVVJBVElPTikqaW5wdXQqaW5wdXQqaW5wdXQqaW5wdXQgKyBTVEFSVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VPdXQgPSBuZXcgVGltZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERPTUFJTiooKGlucHV0PWlucHV0L0RVUkFUSU9OLTEpKmlucHV0KmlucHV0KmlucHV0KmlucHV0ICsgMSkgKyBTVEFSVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VJbk91dCA9IG5ldyBUaW1lSW50ZXJwb2xhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChpbnB1dC89RFVSQVRJT04vMikgPCAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAoRE9NQUlOLzIqaW5wdXQqaW5wdXQqaW5wdXQqaW5wdXQqaW5wdXQgKyBTVEFSVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChET01BSU4vMiooKGlucHV0LT0yKSppbnB1dCppbnB1dCppbnB1dCppbnB1dCArIDIpICsgU1RBUlQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTaW5lIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VJbiA9IG5ldyBUaW1lSW50ZXJwb2xhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLURPTUFJTiAqIChmbG9hdCkgTWF0aC5jb3MoaW5wdXQvRFVSQVRJT04gKiAoTWF0aC5QSS8yKSkgKyBET01BSU4gKyBTVEFSVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VPdXQgPSBuZXcgVGltZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRJbnRlcnBvbGF0aW9uKGZsb2F0IGlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERPTUFJTiAqIChmbG9hdCkgTWF0aC5zaW4oaW5wdXQvRFVSQVRJT04gKiAoTWF0aC5QSS8yKSkgKyBTVEFSVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lSW50ZXJwb2xhdG9yIGVhc2VJbk91dCA9IG5ldyBUaW1lSW50ZXJwb2xhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGZsb2F0IGdldEludGVycG9sYXRpb24oZmxvYXQgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLURPTUFJTi8yICogKChmbG9hdClNYXRoLmNvcyhNYXRoLlBJKmlucHV0L0RVUkFUSU9OKSAtIDEuMGYpICsgU1RBUlQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L211bHRpd2F2ZXZpZXcvTXVsdGlXYXZlVmlldy5qYXZhIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9tdWx0aXdhdmV2aWV3L011bHRpV2F2ZVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTk4ODI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3dpZGdldC9tdWx0aXdhdmV2aWV3L011bHRpV2F2ZVZpZXcuamF2YQpAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lm11bHRpd2F2ZXZpZXc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5UaW1lSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3RGOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKKworLyoqCisgKiBBIHNwZWNpYWwgd2lkZ2V0IGNvbnRhaW5pbmcgYSBjZW50ZXIgYW5kIG91dGVyIHJpbmcuIE1vdmluZyB0aGUgY2VudGVyIHJpbmcgdG8gdGhlIG91dGVyIHJpbmcKKyAqIGNhdXNlcyBhbiBldmVudCB0aGF0IGNhbiBiZSBjYXVnaHQgYnkgaW1wbGVtZW50aW5nIE9uVHJpZ2dlckxpc3RlbmVyLgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlXYXZlVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBBbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk11bHRpV2F2ZVZpZXciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKworICAgIC8vIFdhdmUgc3RhdGUgbWFjaGluZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRklSU1RfVE9VQ0ggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UUkFDS0lORyA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NOQVAgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GSU5JU0ggPSA0OworCisgICAgLy8gQW5pbWF0aW9uIHByb3BlcnRpZXMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU05BUF9NQVJHSU5fREVGQVVMVCA9IDIwLjBmOyAvLyBkaXN0YW5jZSB0byByaW5nIGJlZm9yZSB3ZSBzbmFwIHRvIGl0CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uVHJpZ2dlckxpc3RlbmVyIHsKKyAgICAgICAgaW50IE5PX0hBTkRMRSA9IDA7CisgICAgICAgIGludCBDRU5URVJfSEFORExFID0gMTsKKyAgICAgICAgcHVibGljIHZvaWQgb25HcmFiYmVkKFZpZXcgdiwgaW50IGhhbmRsZSk7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZWQoVmlldyB2LCBpbnQgaGFuZGxlKTsKKyAgICAgICAgcHVibGljIHZvaWQgb25UcmlnZ2VyKFZpZXcgdiwgaW50IHRhcmdldCk7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uR3JhYmJlZFN0YXRlQ2hhbmdlKFZpZXcgdiwgaW50IGhhbmRsZSk7CisgICAgfQorCisgICAgLy8gVHVuZS1hYmxlIHBhcmFtZXRlcnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hFVlJPTl9JTkNSRU1FTlRBTF9ERUxBWSA9IDUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSEVWUk9OX0FOSU1BVElPTl9EVVJBVElPTiA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVFVSTl9UT19IT01FX0RVUkFUSU9OID0gMTUwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBISURFX0FOSU1BVElPTl9ERUxBWSA9IDUwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSElERV9BTklNQVRJT05fRFVSQUNUSU9OID0gMjAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPV19BTklNQVRJT05fRFVSQVRJT04gPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSE9XX0FOSU1BVElPTl9ERUxBWSA9IDA7CisgICAgcHJpdmF0ZSBUaW1lSW50ZXJwb2xhdG9yIG1DaGV2cm9uQW5pbWF0aW9uSW50ZXJwb2xhdG9yID0gRWFzZS5RdWludC5lYXNlT3V0OworCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VGFyZ2V0RHJhd2FibGU+IG1UYXJnZXREcmF3YWJsZXMgPSBuZXcgQXJyYXlMaXN0PFRhcmdldERyYXdhYmxlPigpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFRhcmdldERyYXdhYmxlPiBtQ2hldnJvbkRyYXdhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VGFyZ2V0RHJhd2FibGU+KCk7CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8VHdlZW5lcj4gbUNoZXZyb25BbmltYXRpb25zID0gbmV3IEFycmF5TGlzdDxUd2VlbmVyPigpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFR3ZWVuZXI+IG1UYXJnZXRBbmltYXRpb25zID0gbmV3IEFycmF5TGlzdDxUd2VlbmVyPigpOworICAgIHByaXZhdGUgVHdlZW5lciBtSGFuZGxlQW5pbWF0aW9uOworICAgIHByaXZhdGUgT25UcmlnZ2VyTGlzdGVuZXIgbU9uVHJpZ2dlckxpc3RlbmVyOworICAgIHByaXZhdGUgVGFyZ2V0RHJhd2FibGUgbUhhbmRsZURyYXdhYmxlOworICAgIHByaXZhdGUgVGFyZ2V0RHJhd2FibGUgbU91dGVyUmluZzsKKyAgICBwcml2YXRlIFZpYnJhdG9yIG1WaWJyYXRvcjsKKworICAgIHByaXZhdGUgaW50IG1GZWVkYmFja0NvdW50ID0gMzsKKyAgICBwcml2YXRlIGludCBtVmlicmF0aW9uRHVyYXRpb24gPSAwOworICAgIHByaXZhdGUgaW50IG1HcmFiYmVkU3RhdGU7CisgICAgcHJpdmF0ZSBpbnQgbUFjdGl2ZVRhcmdldCA9IC0xOworICAgIHByaXZhdGUgZmxvYXQgbVRhcFJhZGl1czsKKyAgICBwcml2YXRlIGZsb2F0IG1XYXZlQ2VudGVyWDsKKyAgICBwcml2YXRlIGZsb2F0IG1XYXZlQ2VudGVyWTsKKyAgICBwcml2YXRlIGZsb2F0IG1WZXJ0aWNhbE9mZnNldDsKKyAgICBwcml2YXRlIGZsb2F0IG1Ib3Jpem9udGFsT2Zmc2V0OworICAgIHByaXZhdGUgZmxvYXQgbU91dGVyUmFkaXVzID0gMC4wZjsKKyAgICBwcml2YXRlIGZsb2F0IG1IaXRSYWRpdXMgPSAwLjBmOworICAgIHByaXZhdGUgZmxvYXQgbVNuYXBNYXJnaW4gPSAwLjBmOworICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ2dpbmc7CisKKyAgICBwcml2YXRlIEFuaW1hdG9yTGlzdGVuZXIgbVJlc2V0TGlzdGVuZXIgPSBuZXcgQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRvciBhbmltYXRpb24pIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIHN3aXRjaFRvU3RhdGUoU1RBVEVfSURMRSwgbVdhdmVDZW50ZXJYLCBtV2F2ZUNlbnRlclkpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uQ2FuY2VsKEFuaW1hdG9yIGFuaW1hdGlvbikgeyB9CisgICAgfTsKKworICAgIHB1YmxpYyBNdWx0aVdhdmVWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBNdWx0aVdhdmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKyAgICAgICAgUmVzb3VyY2VzIHJlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisKKyAgICAgICAgVHlwZWRBcnJheSBhID0gY29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLCBSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3KTsKKyAgICAgICAgbU91dGVyUmFkaXVzID0gYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuTXVsdGlXYXZlVmlld19vdXRlclJhZGl1cywgbU91dGVyUmFkaXVzKTsKKyAgICAgICAgbUhvcml6b250YWxPZmZzZXQgPSBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3X2hvcml6b250YWxPZmZzZXQsCisgICAgICAgICAgICAgICAgbUhvcml6b250YWxPZmZzZXQpOworICAgICAgICBtVmVydGljYWxPZmZzZXQgPSBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3X3ZlcnRpY2FsT2Zmc2V0LAorICAgICAgICAgICAgICAgIG1WZXJ0aWNhbE9mZnNldCk7CisgICAgICAgIG1IaXRSYWRpdXMgPSBhLmdldERpbWVuc2lvbihSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3X2hpdFJhZGl1cywgbUhpdFJhZGl1cyk7CisgICAgICAgIG1TbmFwTWFyZ2luID0gYS5nZXREaW1lbnNpb24oUi5zdHlsZWFibGUuTXVsdGlXYXZlVmlld19zbmFwTWFyZ2luLCBtU25hcE1hcmdpbik7CisgICAgICAgIG1WaWJyYXRpb25EdXJhdGlvbiA9IGEuZ2V0SW50KFIuc3R5bGVhYmxlLk11bHRpV2F2ZVZpZXdfdmlicmF0aW9uRHVyYXRpb24sCisgICAgICAgICAgICAgICAgbVZpYnJhdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgbUZlZWRiYWNrQ291bnQgPSBhLmdldEludChSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3X2ZlZWRiYWNrQ291bnQsCisgICAgICAgICAgICAgICAgbUZlZWRiYWNrQ291bnQpOworICAgICAgICBtSGFuZGxlRHJhd2FibGUgPSBuZXcgVGFyZ2V0RHJhd2FibGUocmVzLAorICAgICAgICAgICAgICAgIGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuTXVsdGlXYXZlVmlld19oYW5kbGVEcmF3YWJsZSkpOworICAgICAgICBtVGFwUmFkaXVzID0gbUhhbmRsZURyYXdhYmxlLmdldFdpZHRoKCkvMjsKKyAgICAgICAgbU91dGVyUmluZyA9IG5ldyBUYXJnZXREcmF3YWJsZShyZXMsIGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuTXVsdGlXYXZlVmlld193YXZlRHJhd2FibGUpKTsKKworICAgICAgICAvLyBSZWFkIGNoZXZyb24gYW5pbWF0aW9uIGRyYXdhYmxlcworICAgICAgICBEcmF3YWJsZSBsZWZ0Q2hldnJvbiA9IGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuTXVsdGlXYXZlVmlld19sZWZ0Q2hldnJvbkRyYXdhYmxlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRmVlZGJhY2tDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtQ2hldnJvbkRyYXdhYmxlcy5hZGQoCisgICAgICAgICAgICAgICAgICAgIGxlZnRDaGV2cm9uICE9IG51bGwgPyBuZXcgVGFyZ2V0RHJhd2FibGUocmVzLCBsZWZ0Q2hldnJvbikgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBEcmF3YWJsZSByaWdodENoZXZyb24gPSBhLmdldERyYXdhYmxlKFIuc3R5bGVhYmxlLk11bHRpV2F2ZVZpZXdfcmlnaHRDaGV2cm9uRHJhd2FibGUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1GZWVkYmFja0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1DaGV2cm9uRHJhd2FibGVzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgcmlnaHRDaGV2cm9uICE9IG51bGwgPyBuZXcgVGFyZ2V0RHJhd2FibGUocmVzLCByaWdodENoZXZyb24pIDogbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgRHJhd2FibGUgdG9wQ2hldnJvbiA9IGEuZ2V0RHJhd2FibGUoUi5zdHlsZWFibGUuTXVsdGlXYXZlVmlld190b3BDaGV2cm9uRHJhd2FibGUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1GZWVkYmFja0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIG1DaGV2cm9uRHJhd2FibGVzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgdG9wQ2hldnJvbiAhPSBudWxsID8gbmV3IFRhcmdldERyYXdhYmxlKHJlcywgdG9wQ2hldnJvbikgOiBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBEcmF3YWJsZSBib3R0b21DaGV2cm9uID0gYS5nZXREcmF3YWJsZShSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3X2JvdHRvbUNoZXZyb25EcmF3YWJsZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUZlZWRiYWNrQ291bnQ7IGkrKykgeworICAgICAgICAgICAgbUNoZXZyb25EcmF3YWJsZXMuYWRkKAorICAgICAgICAgICAgICAgICAgICBib3R0b21DaGV2cm9uICE9IG51bGwgPyBuZXcgVGFyZ2V0RHJhd2FibGUocmVzLCBib3R0b21DaGV2cm9uKSA6IG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVhZCBhcnJheSBvZiB0YXJnZXQgZHJhd2FibGVzCisgICAgICAgIFR5cGVkVmFsdWUgb3V0VmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOworICAgICAgICBpZiAoYS5nZXRWYWx1ZShSLnN0eWxlYWJsZS5NdWx0aVdhdmVWaWV3X3RhcmdldERyYXdhYmxlcywgb3V0VmFsdWUpKSB7CisgICAgICAgICAgICBzZXRUYXJnZXRSZXNvdXJjZXMob3V0VmFsdWUucmVzb3VyY2VJZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1UYXJnZXREcmF3YWJsZXMgPT0gbnVsbCB8fCBtVGFyZ2V0RHJhd2FibGVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIHRhcmdldCBkcmF3YWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgc2V0VmlicmF0ZUVuYWJsZWQobVZpYnJhdGlvbkR1cmF0aW9uID4gMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXAoKSB7CisgICAgICAgIExvZy52KFRBRywgIk91dGVyIFJhZGl1cyA9ICIgKyBtT3V0ZXJSYWRpdXMpOworICAgICAgICBMb2cudihUQUcsICJIaXRSYWRpdXMgPSAiICsgbUhpdFJhZGl1cyk7CisgICAgICAgIExvZy52KFRBRywgIlNuYXBNYXJnaW4gPSAiICsgbVNuYXBNYXJnaW4pOworICAgICAgICBMb2cudihUQUcsICJGZWVkYmFja0NvdW50ID0gIiArIG1GZWVkYmFja0NvdW50KTsKKyAgICAgICAgTG9nLnYoVEFHLCAiVmlicmF0aW9uRHVyYXRpb24gPSAiICsgbVZpYnJhdGlvbkR1cmF0aW9uKTsKKyAgICAgICAgTG9nLnYoVEFHLCAiVGFwUmFkaXVzID0gIiArIG1UYXBSYWRpdXMpOworICAgICAgICBMb2cudihUQUcsICJXYXZlQ2VudGVyWCA9ICIgKyBtV2F2ZUNlbnRlclgpOworICAgICAgICBMb2cudihUQUcsICJXYXZlQ2VudGVyWSA9ICIgKyBtV2F2ZUNlbnRlclkpOworICAgICAgICBMb2cudihUQUcsICJIb3Jpem9udGFsT2Zmc2V0ID0gIiArIG1Ib3Jpem9udGFsT2Zmc2V0KTsKKyAgICAgICAgTG9nLnYoVEFHLCAiVmVydGljYWxPZmZzZXQgPSAiICsgbVZlcnRpY2FsT2Zmc2V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpIHsKKyAgICAgICAgLy8gVmlldyBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIGJhY2tncm91bmQgKyB0YXJnZXQgZHJhd2FibGUgb24gZWl0aGVyIGVkZ2UKKyAgICAgICAgcmV0dXJuIG1PdXRlclJpbmcuZ2V0V2lkdGgoKQorICAgICAgICAgICAgICAgICsgKG1UYXJnZXREcmF3YWJsZXMuc2l6ZSgpID4gMCA/IChtVGFyZ2V0RHJhd2FibGVzLmdldCgwKS5nZXRXaWR0aCgpKSA6IDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodCgpIHsKKyAgICAgICAgLy8gVmlldyBzaG91bGQgYmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHVubG9jayByaW5nICsgdGFyZ2V0IGRyYXdhYmxlIG9uIGVpdGhlciBlZGdlCisgICAgICAgIHJldHVybiBtT3V0ZXJSaW5nLmdldEhlaWdodCgpCisgICAgICAgICAgICAgICAgKyAobVRhcmdldERyYXdhYmxlcy5zaXplKCkgPiAwID8gKG1UYXJnZXREcmF3YWJsZXMuZ2V0KDApLmdldEhlaWdodCgpKSA6IDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzd2l0Y2hUb1N0YXRlKGludCBzdGF0ZSwgZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0lETEU6CisgICAgICAgICAgICAgICAgZGVhY3RpdmF0ZVRhcmdldHMoKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlRHJhd2FibGUuc2V0U3RhdGUoVGFyZ2V0RHJhd2FibGUuU1RBVEVfSU5BQ1RJVkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVRFX0ZJUlNUX1RPVUNIOgorICAgICAgICAgICAgICAgIHN0b3BIYW5kbGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgICAgICBkZWFjdGl2YXRlVGFyZ2V0cygpOworICAgICAgICAgICAgICAgIHNob3dUYXJnZXRzKCk7CisgICAgICAgICAgICAgICAgbUhhbmRsZURyYXdhYmxlLnNldFN0YXRlKFRhcmdldERyYXdhYmxlLlNUQVRFX0FDVElWRSk7CisgICAgICAgICAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLkNFTlRFUl9IQU5ETEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVRFX1RSQUNLSU5HOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVRFX1NOQVA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRklOSVNIOgorICAgICAgICAgICAgICAgIGRvRmluaXNoKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbmltYXRpb24gdXNlZCB0byBhdHRyYWN0IHVzZXIncyBhdHRlbnRpb24gdG8gdGhlIHRhcmdldCBidXR0b24uCisgICAgICogQXNzdW1lcyBtQ2hldnJvbkRyYXdhYmxlcyBpcyBhbiBhIGxpc3Qgd2l0aCBhbiBldmVuIG51bWJlciBvZiBjaGV2cm9ucyBmaWxsZWQgd2l0aCBsZWZ0CisgICAgICogZm9sbG93ZWQgYnkgcmlnaHQgY2hldnJvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q2hldnJvbkFuaW1hdGlvbigpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgciA9IG1IYW5kbGVEcmF3YWJsZS5nZXRXaWR0aCgpIC8gMjsKKyAgICAgICAgZmluYWwgZmxvYXQgZnJvbVtdW10gPSB7CisgICAgICAgICAgICAgICAge21XYXZlQ2VudGVyWCAtIHIsIG1XYXZlQ2VudGVyWX0sICAvLyBsZWZ0CisgICAgICAgICAgICAgICAge21XYXZlQ2VudGVyWCArIHIsIG1XYXZlQ2VudGVyWX0sICAvLyByaWdodAorICAgICAgICAgICAgICAgIHttV2F2ZUNlbnRlclgsIG1XYXZlQ2VudGVyWSAtIHJ9LCAgLy8gdG9wCisgICAgICAgICAgICAgICAge21XYXZlQ2VudGVyWCwgbVdhdmVDZW50ZXJZICsgcn0gfTsgLy8gYm90dG9tCisgICAgICAgIGZpbmFsIGZsb2F0IHRvW11bXSA9IHsKKyAgICAgICAgICAgICAgICB7bVdhdmVDZW50ZXJYIC0gbU91dGVyUmFkaXVzLCBtV2F2ZUNlbnRlcll9LCAgLy8gbGVmdAorICAgICAgICAgICAgICAgIHttV2F2ZUNlbnRlclggKyBtT3V0ZXJSYWRpdXMsIG1XYXZlQ2VudGVyWX0sICAvLyByaWdodAorICAgICAgICAgICAgICAgIHttV2F2ZUNlbnRlclgsIG1XYXZlQ2VudGVyWSAtIG1PdXRlclJhZGl1c30sICAvLyB0b3AKKyAgICAgICAgICAgICAgICB7bVdhdmVDZW50ZXJYLCBtV2F2ZUNlbnRlclkgKyBtT3V0ZXJSYWRpdXN9IH07IC8vIGJvdHRvbQorCisgICAgICAgIG1DaGV2cm9uQW5pbWF0aW9ucy5jbGVhcigpOworICAgICAgICBmb3IgKGludCBkaXJlY3Rpb24gPSAwOyBkaXJlY3Rpb24gPCA0OyBkaXJlY3Rpb24rKykgeworICAgICAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IG1GZWVkYmFja0NvdW50OyBjb3VudCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGRlbGF5ID0gY291bnQgKiBDSEVWUk9OX0lOQ1JFTUVOVEFMX0RFTEFZOworICAgICAgICAgICAgICAgIGZpbmFsIFRhcmdldERyYXdhYmxlIGljb24gPSBtQ2hldnJvbkRyYXdhYmxlcy5nZXQoZGlyZWN0aW9uKm1GZWVkYmFja0NvdW50ICsgY291bnQpOworICAgICAgICAgICAgICAgIGlmIChpY29uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DaGV2cm9uQW5pbWF0aW9ucy5hZGQoVHdlZW5lci50byhpY29uLCBDSEVWUk9OX0FOSU1BVElPTl9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlYXNlIiwgbUNoZXZyb25BbmltYXRpb25JbnRlcnBvbGF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVsYXkiLCBkZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ4IiwgbmV3IGZsb2F0W10geyBmcm9tW2RpcmVjdGlvbl1bMF0sIHRvW2RpcmVjdGlvbl1bMF0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5IiwgbmV3IGZsb2F0W10geyBmcm9tW2RpcmVjdGlvbl1bMV0sIHRvW2RpcmVjdGlvbl1bMV0gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbHBoYSIsIG5ldyBmbG9hdFtdIHsxLjBmLCAwLjBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJvblVwZGF0ZSIsIHRoaXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wQ2hldnJvbkFuaW1hdGlvbigpIHsKKyAgICAgICAgZm9yIChUd2VlbmVyIGFuaW0gOiBtQ2hldnJvbkFuaW1hdGlvbnMpIHsKKyAgICAgICAgICAgIGFuaW0uYW5pbWF0b3IuZW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgbUNoZXZyb25BbmltYXRpb25zLmNsZWFyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BIYW5kbGVBbmltYXRpb24oKSB7CisgICAgICAgIGlmIChtSGFuZGxlQW5pbWF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1IYW5kbGVBbmltYXRpb24uYW5pbWF0b3IuZW5kKCk7CisgICAgICAgICAgICBtSGFuZGxlQW5pbWF0aW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWFjdGl2YXRlVGFyZ2V0cygpIHsKKyAgICAgICAgZm9yIChUYXJnZXREcmF3YWJsZSB0YXJnZXQgOiBtVGFyZ2V0RHJhd2FibGVzKSB7CisgICAgICAgICAgICB0YXJnZXQuc2V0U3RhdGUoVGFyZ2V0RHJhd2FibGUuU1RBVEVfSU5BQ1RJVkUpOworICAgICAgICB9CisgICAgICAgIG1BY3RpdmVUYXJnZXQgPSAtMTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGVHbG9iYWxSZWdpb24oVGFyZ2V0RHJhd2FibGUgZHJhd2FibGUpIHsKKyAgICAgICAgaW50IHdpZHRoID0gZHJhd2FibGUuZ2V0V2lkdGgoKTsKKyAgICAgICAgaW50IGhlaWdodCA9IGRyYXdhYmxlLmdldEhlaWdodCgpOworICAgICAgICBSZWN0RiBjaGlsZEJvdW5kcyA9IG5ldyBSZWN0RigwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgY2hpbGRCb3VuZHMub2Zmc2V0KGRyYXdhYmxlLmdldFgoKSAtIHdpZHRoLzIsIGRyYXdhYmxlLmdldFkoKSAtIGhlaWdodC8yKTsKKyAgICAgICAgVmlldyB2aWV3ID0gdGhpczsKKyAgICAgICAgd2hpbGUgKHZpZXcuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiB2aWV3LmdldFBhcmVudCgpIGluc3RhbmNlb2YgVmlldykgeworICAgICAgICAgICAgdmlldyA9IChWaWV3KSB2aWV3LmdldFBhcmVudCgpOworICAgICAgICAgICAgdmlldy5nZXRNYXRyaXgoKS5tYXBSZWN0KGNoaWxkQm91bmRzKTsKKyAgICAgICAgICAgIHZpZXcuaW52YWxpZGF0ZSgoaW50KSBNYXRoLmZsb29yKGNoaWxkQm91bmRzLmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSBNYXRoLmZsb29yKGNoaWxkQm91bmRzLnRvcCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChjaGlsZEJvdW5kcy5yaWdodCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpIE1hdGguY2VpbChjaGlsZEJvdW5kcy5ib3R0b20pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoZXMgYSB0cmlnZ2VyIGV2ZW50IHRvIGxpc3RlbmVyLiBJZ25vcmVkIGlmIGEgbGlzdGVuZXIgaXMgbm90IHNldC4KKyAgICAgKiBAcGFyYW0gd2hpY2hIYW5kbGUgdGhlIGhhbmRsZSB0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc3BhdGNoVHJpZ2dlckV2ZW50KGludCB3aGljaEhhbmRsZSkgeworICAgICAgICB2aWJyYXRlKCk7CisgICAgICAgIGlmIChtT25UcmlnZ2VyTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbU9uVHJpZ2dlckxpc3RlbmVyLm9uVHJpZ2dlcih0aGlzLCB3aGljaEhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9GaW5pc2goKSB7CisgICAgICAgIC8vIEluZm9ybSBsaXN0ZW5lciBvZiBhbnkgYWN0aXZlIHRhcmdldHMuICBUeXBpY2FsbHkgb25seSBvbmUgd2lsbCBiZSBhY3RpdmUuCisgICAgICAgIGZpbmFsIGludCBhY3RpdmVUYXJnZXQgPSBtQWN0aXZlVGFyZ2V0OworICAgICAgICBib29sZWFuIHRhcmdldEhpdCA9ICBhY3RpdmVUYXJnZXQgIT0gLTE7CisgICAgICAgIGlmICh0YXJnZXRIaXQpIHsKKyAgICAgICAgICAgIExvZy52KFRBRywgIkZpbmlzaCB3aXRoIHRhcmdldCBoaXQgPSAiICsgdGFyZ2V0SGl0KTsKKyAgICAgICAgICAgIGRpc3BhdGNoVHJpZ2dlckV2ZW50KG1BY3RpdmVUYXJnZXQpOworICAgICAgICB9CisKKyAgICAgICAgc2V0R3JhYmJlZFN0YXRlKE9uVHJpZ2dlckxpc3RlbmVyLk5PX0hBTkRMRSk7CisKKyAgICAgICAgLy8gQW5pbWF0ZSBmaW5nZXIgb3V0bGluZSBiYWNrIHRvIGhvbWUgcG9zaXRpb24KKyAgICAgICAgbUhhbmRsZURyYXdhYmxlLnNldEFscGhhKHRhcmdldEhpdCA/IDAuMGYgOiAxLjBmKTsKKyAgICAgICAgbUhhbmRsZUFuaW1hdGlvbiA9IFR3ZWVuZXIudG8obUhhbmRsZURyYXdhYmxlLCBSRVRVUk5fVE9fSE9NRV9EVVJBVElPTiwKKyAgICAgICAgICAgICAgICAiZWFzZSIsIEVhc2UuUXVhcnQuZWFzZU91dCwKKyAgICAgICAgICAgICAgICAiZGVsYXkiLCB0YXJnZXRIaXQgPyBISURFX0FOSU1BVElPTl9ERUxBWSA6IDAsCisgICAgICAgICAgICAgICAgImFscGhhIiwgMS4wZiwKKyAgICAgICAgICAgICAgICAieCIsIG1XYXZlQ2VudGVyWCwKKyAgICAgICAgICAgICAgICAieSIsIG1XYXZlQ2VudGVyWSwKKyAgICAgICAgICAgICAgICAib25VcGRhdGUiLCB0aGlzLAorICAgICAgICAgICAgICAgICJvbkNvbXBsZXRlIiwgbVJlc2V0TGlzdGVuZXIpOworCisgICAgICAgIC8vIEhpZGUgdW5zZWxlY3RlZCB0YXJnZXRzCisgICAgICAgIGhpZGVUYXJnZXRzKHRydWUpOworCisgICAgICAgIC8vIEhpZ2hsaWdodCB0aGUgc2VsZWN0ZWQgb25lCisgICAgICAgIGlmICh0YXJnZXRIaXQpIHsKKyAgICAgICAgICAgIG1UYXJnZXREcmF3YWJsZXMuZ2V0KGFjdGl2ZVRhcmdldCkuc2V0U3RhdGUoVGFyZ2V0RHJhd2FibGUuU1RBVEVfQUNUSVZFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoaWRlVGFyZ2V0cyhib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgaWYgKG1UYXJnZXRBbmltYXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHN0b3BUYXJnZXRBbmltYXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFRhcmdldERyYXdhYmxlIHRhcmdldCA6IG1UYXJnZXREcmF3YWJsZXMpIHsKKyAgICAgICAgICAgIHRhcmdldC5zZXRTdGF0ZShUYXJnZXREcmF3YWJsZS5TVEFURV9JTkFDVElWRSk7CisgICAgICAgICAgICBtVGFyZ2V0QW5pbWF0aW9ucy5hZGQoVHdlZW5lci50byh0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgIGFuaW1hdGUgPyBISURFX0FOSU1BVElPTl9EVVJBQ1RJT04gOiAwLAorICAgICAgICAgICAgICAgICAgICAiYWxwaGEiLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAiZGVsYXkiLCBISURFX0FOSU1BVElPTl9ERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgIm9uVXBkYXRlIiwgdGhpcykpOworICAgICAgICB9CisgICAgICAgIG1UYXJnZXRBbmltYXRpb25zLmFkZChUd2VlbmVyLnRvKG1PdXRlclJpbmcsCisgICAgICAgICAgICAgICAgYW5pbWF0ZSA/IEhJREVfQU5JTUFUSU9OX0RVUkFDVElPTiA6IDAsCisgICAgICAgICAgICAgICAgImFscGhhIiwgMC4wZiwKKyAgICAgICAgICAgICAgICAiZGVsYXkiLCBISURFX0FOSU1BVElPTl9ERUxBWSwKKyAgICAgICAgICAgICAgICAib25VcGRhdGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dUYXJnZXRzKCkgeworICAgICAgICBpZiAobVRhcmdldEFuaW1hdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc3RvcFRhcmdldEFuaW1hdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZvciAoVGFyZ2V0RHJhd2FibGUgdGFyZ2V0IDogbVRhcmdldERyYXdhYmxlcykgeworICAgICAgICAgICAgdGFyZ2V0LnNldFN0YXRlKFRhcmdldERyYXdhYmxlLlNUQVRFX0lOQUNUSVZFKTsKKyAgICAgICAgICAgIG1UYXJnZXRBbmltYXRpb25zLmFkZChUd2VlbmVyLnRvKHRhcmdldCwgU0hPV19BTklNQVRJT05fRFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICJhbHBoYSIsIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICJkZWxheSIsIFNIT1dfQU5JTUFUSU9OX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAib25VcGRhdGUiLCB0aGlzKSk7CisgICAgICAgIH0KKyAgICAgICAgbVRhcmdldEFuaW1hdGlvbnMuYWRkKFR3ZWVuZXIudG8obU91dGVyUmluZywgU0hPV19BTklNQVRJT05fRFVSQVRJT04sCisgICAgICAgICAgICAgICAgImFscGhhIiwgMS4wZiwKKyAgICAgICAgICAgICAgICAiZGVsYXkiLCBTSE9XX0FOSU1BVElPTl9ERUxBWSwKKyAgICAgICAgICAgICAgICAib25VcGRhdGUiLCB0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BUYXJnZXRBbmltYXRpb24oKSB7CisgICAgICAgIGZvciAoVHdlZW5lciBhbmltIDogbVRhcmdldEFuaW1hdGlvbnMpIHsKKyAgICAgICAgICAgIGFuaW0uYW5pbWF0b3IuZW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgbVRhcmdldEFuaW1hdGlvbnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlicmF0ZSgpIHsKKyAgICAgICAgaWYgKG1WaWJyYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVmlicmF0b3IudmlicmF0ZShtVmlicmF0aW9uRHVyYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYW4gYXJyYXkgb2YgZHJhd2FibGVzIGZyb20gdGhlIGdpdmVuIHJlc291cmNlSWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VJZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldFJlc291cmNlcyhpbnQgcmVzb3VyY2VJZCkgeworICAgICAgICBSZXNvdXJjZXMgcmVzID0gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpOworICAgICAgICBUeXBlZEFycmF5IGFycmF5ID0gcmVzLm9idGFpblR5cGVkQXJyYXkocmVzb3VyY2VJZCk7CisgICAgICAgIGludCBjb3VudCA9IGFycmF5Lmxlbmd0aCgpOworICAgICAgICBBcnJheUxpc3Q8VGFyZ2V0RHJhd2FibGU+IHRhcmdldERyYXdhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VGFyZ2V0RHJhd2FibGU+KGNvdW50KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IGFycmF5LmdldERyYXdhYmxlKGkpOworICAgICAgICAgICAgdGFyZ2V0RHJhd2FibGVzLmFkZChuZXcgVGFyZ2V0RHJhd2FibGUocmVzLCBkcmF3YWJsZSkpOworICAgICAgICB9CisgICAgICAgIG1UYXJnZXREcmF3YWJsZXMgPSB0YXJnZXREcmF3YWJsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIG9yIGRpc2FibGUgdmlicmF0ZSBvbiB0b3VjaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmFibGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlicmF0ZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CisgICAgICAgIGlmIChlbmFibGVkICYmIG1WaWJyYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtVmlicmF0b3IgPSAoVmlicmF0b3IpIGdldENvbnRleHQoKS5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuVklCUkFUT1JfU0VSVklDRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVmlicmF0b3IgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGNoZXZyb24gYW5pbWF0aW9uLiBFeGFtcGxlIHVzZSBjYXNlOiBzaG93IGNoZXZyb24gYW5pbWF0aW9uIHdoZW5ldmVyIHRoZSBwaG9uZSByaW5ncworICAgICAqIG9yIHRoZSB1c2VyIHRvdWNoZXMgdGhlIHNjcmVlbi4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBpbmcoKSB7CisgICAgICAgIHN0b3BDaGV2cm9uQW5pbWF0aW9uKCk7CisgICAgICAgIHN0YXJ0Q2hldnJvbkFuaW1hdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgd2lkZ2V0IHRvIGRlZmF1bHQgc3RhdGUgYW5kIGNhbmNlbHMgYWxsIGFuaW1hdGlvbi4gSWYgYW5pbWF0ZSBpcyAndHJ1ZScsIHdpbGwKKyAgICAgKiBhbmltYXRlIG9iamVjdHMgaW50byBwbGFjZS4gT3RoZXJ3aXNlLCBvYmplY3RzIHdpbGwgc25hcCBiYWNrIHRvIHBsYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGFuaW1hdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldChib29sZWFuIGFuaW1hdGUpIHsKKyAgICAgICAgc3RvcENoZXZyb25BbmltYXRpb24oKTsKKyAgICAgICAgc3RvcEhhbmRsZUFuaW1hdGlvbigpOworICAgICAgICBzdG9wVGFyZ2V0QW5pbWF0aW9uKCk7CisgICAgICAgIGhpZGVDaGV2cm9ucygpOworICAgICAgICBoaWRlVGFyZ2V0cyhhbmltYXRlKTsKKyAgICAgICAgbUhhbmRsZURyYXdhYmxlLnNldFgobVdhdmVDZW50ZXJYKTsKKyAgICAgICAgbUhhbmRsZURyYXdhYmxlLnNldFkobVdhdmVDZW50ZXJZKTsKKyAgICAgICAgbUhhbmRsZURyYXdhYmxlLnNldFN0YXRlKFRhcmdldERyYXdhYmxlLlNUQVRFX0lOQUNUSVZFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2ZW50LmdldEFjdGlvbigpOworCisgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOworICAgICAgICBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpOworICAgICAgICBmbG9hdCB5ID0gZXZlbnQuZ2V0WSgpOworICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjoKKyAgICAgICAgICAgICAgICBoYW5kbGVEb3duKHgsIHkpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFOgorICAgICAgICAgICAgICAgIGhhbmRsZU1vdmUoeCwgeSk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOgorICAgICAgICAgICAgICAgIGhhbmRsZVVwKHgsIHkpOworICAgICAgICAgICAgICAgIGhhbmRsZU1vdmUoeCwgeSk7CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgICAgICBoYW5kbGVNb3ZlKHgsIHkpOworICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZWQgPyB0cnVlIDogc3VwZXIub25Ub3VjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbW92ZUhhbmRsZVRvKGZsb2F0IHgsIGZsb2F0IHksIGJvb2xlYW4gYW5pbWF0ZSkgeworICAgICAgICAvLyBUT0RPOiBhbmltYXRlIHRoZSBoYW5kbGUgYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUvcG9zaXRpb24KKyAgICAgICAgbUhhbmRsZURyYXdhYmxlLnNldFgoeCk7CisgICAgICAgIG1IYW5kbGVEcmF3YWJsZS5zZXRZKHkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEb3duKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgZmluYWwgZmxvYXQgZHggPSB4IC0gbVdhdmVDZW50ZXJYOworICAgICAgICBmaW5hbCBmbG9hdCBkeSA9IHkgLSBtV2F2ZUNlbnRlclk7CisgICAgICAgIGlmIChkaXN0MihkeCxkeSkgPD0gc3F1YXJlKG1UYXBSYWRpdXMpKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIioqIEhhbmRsZSBISVQiKTsKKyAgICAgICAgICAgIHN3aXRjaFRvU3RhdGUoU1RBVEVfRklSU1RfVE9VQ0gsIHgsIHkpOworICAgICAgICAgICAgbW92ZUhhbmRsZVRvKHgsIHksIGZhbHNlKTsKKyAgICAgICAgICAgIG1EcmFnZ2luZyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRHJhZ2dpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHN0b3BUYXJnZXRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIHBpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVVcChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGlmIChERUJVRyAmJiBtRHJhZ2dpbmcpIExvZy52KFRBRywgIioqIEhhbmRsZSBSRUxFQVNFIik7CisgICAgICAgIHN3aXRjaFRvU3RhdGUoU1RBVEVfRklOSVNILCB4LCB5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTW92ZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIGlmICghbURyYWdnaW5nKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmbG9hdCB0eCA9IHggLSBtV2F2ZUNlbnRlclg7CisgICAgICAgIGZsb2F0IHR5ID0geSAtIG1XYXZlQ2VudGVyWTsKKyAgICAgICAgZmxvYXQgdG91Y2hSYWRpdXMgPSAoZmxvYXQpIE1hdGguc3FydChkaXN0Mih0eCwgdHkpKTsKKyAgICAgICAgZmluYWwgZmxvYXQgc2NhbGUgPSB0b3VjaFJhZGl1cyA+IG1PdXRlclJhZGl1cyA/IG1PdXRlclJhZGl1cyAvIHRvdWNoUmFkaXVzIDogMS4wZjsKKyAgICAgICAgZmxvYXQgbGltaXRYID0gbVdhdmVDZW50ZXJYICsgdHggKiBzY2FsZTsKKyAgICAgICAgZmxvYXQgbGltaXRZID0gbVdhdmVDZW50ZXJZICsgdHkgKiBzY2FsZTsKKworICAgICAgICBpbnQgYWN0aXZlVGFyZ2V0ID0gLTE7CisgICAgICAgIGJvb2xlYW4gc2luZ2xlVGFyZ2V0ID0gbVRhcmdldERyYXdhYmxlcy5zaXplKCkgPT0gMTsKKyAgICAgICAgaWYgKHNpbmdsZVRhcmdldCkgeworICAgICAgICAgICAgLy8gU25hcCB0byBvdXRlciByaW5nIGlmIHRoZXJlJ3Mgb25seSBvbmUgdGFyZ2V0CisgICAgICAgICAgICBmbG9hdCBzbmFwUmFkaXVzID0gbU91dGVyUmFkaXVzIC0gbVNuYXBNYXJnaW47CisgICAgICAgICAgICBpZiAodG91Y2hSYWRpdXMgPiBzbmFwUmFkaXVzKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlVGFyZ2V0ID0gMDsKKyAgICAgICAgICAgICAgICB4ID0gbGltaXRYOworICAgICAgICAgICAgICAgIHkgPSBsaW1pdFk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0LCBzbmFwIHRvIHRoZSBjbG9zZXN0IG9uZSBsZXNzIHRoYW4gaGl0UmFkaXVzIGF3YXkuCisgICAgICAgICAgICBmbG9hdCBiZXN0ID0gRmxvYXQuTUFYX1ZBTFVFOworICAgICAgICAgICAgZmluYWwgZmxvYXQgaGl0UmFkaXVzMiA9IG1IaXRSYWRpdXMgKiBtSGl0UmFkaXVzOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVGFyZ2V0RHJhd2FibGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gU25hcCB0byB0aGUgZmlyc3QgdGFyZ2V0IGluIHJhbmdlCisgICAgICAgICAgICAgICAgVGFyZ2V0RHJhd2FibGUgdGFyZ2V0ID0gbVRhcmdldERyYXdhYmxlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZHggPSBsaW1pdFggLSB0YXJnZXQuZ2V0WCgpOworICAgICAgICAgICAgICAgIGZsb2F0IGR5ID0gbGltaXRZIC0gdGFyZ2V0LmdldFkoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBkaXN0MiA9IGR4KmR4ICsgZHkqZHk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pc1ZhbGlkKCkgJiYgZGlzdDIgPCBoaXRSYWRpdXMyICYmIGRpc3QyIDwgYmVzdCkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUYXJnZXQgPSBpOworICAgICAgICAgICAgICAgICAgICBiZXN0ID0gZGlzdDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeCA9IGxpbWl0WDsKKyAgICAgICAgICAgIHkgPSBsaW1pdFk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2ZVRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgc3dpdGNoVG9TdGF0ZShTVEFURV9TTkFQLCB4LHkpOworICAgICAgICAgICAgZmxvYXQgbmV3WCA9IHNpbmdsZVRhcmdldCA/IGxpbWl0WCA6IG1UYXJnZXREcmF3YWJsZXMuZ2V0KGFjdGl2ZVRhcmdldCkuZ2V0WCgpOworICAgICAgICAgICAgZmxvYXQgbmV3WSA9IHNpbmdsZVRhcmdldCA/IGxpbWl0WSA6IG1UYXJnZXREcmF3YWJsZXMuZ2V0KGFjdGl2ZVRhcmdldCkuZ2V0WSgpOworICAgICAgICAgICAgbW92ZUhhbmRsZVRvKG5ld1gsIG5ld1ksIGZhbHNlKTsKKyAgICAgICAgICAgIFRhcmdldERyYXdhYmxlIGN1cnJlbnRUYXJnZXQgPSBtVGFyZ2V0RHJhd2FibGVzLmdldChhY3RpdmVUYXJnZXQpOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUYXJnZXQuaGFzU3RhdGUoVGFyZ2V0RHJhd2FibGUuU1RBVEVfRk9DVVNFRCkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50VGFyZ2V0LnNldFN0YXRlKFRhcmdldERyYXdhYmxlLlNUQVRFX0ZPQ1VTRUQpOworICAgICAgICAgICAgICAgIG1IYW5kbGVEcmF3YWJsZS5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaFRvU3RhdGUoU1RBVEVfVFJBQ0tJTkcsIHgsIHkpOworICAgICAgICAgICAgbW92ZUhhbmRsZVRvKHgsIHksIGZhbHNlKTsKKyAgICAgICAgICAgIG1IYW5kbGVEcmF3YWJsZS5zZXRBbHBoYSgxLjBmKTsKKyAgICAgICAgfQorICAgICAgICAvLyBEcmF3IGhhbmRsZSBvdXRzaWRlIHBhcmVudCdzIGJvdW5kcworICAgICAgICBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKG1IYW5kbGVEcmF3YWJsZSk7CisKKyAgICAgICAgaWYgKG1BY3RpdmVUYXJnZXQgIT0gYWN0aXZlVGFyZ2V0ICYmIGFjdGl2ZVRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICB9CisgICAgICAgIG1BY3RpdmVUYXJnZXQgPSBhY3RpdmVUYXJnZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCBncmFiYmVkIHN0YXRlLCBhbmQgZGlzcGF0Y2hlcyBhIGdyYWJiZWQgc3RhdGUgY2hhbmdlCisgICAgICogZXZlbnQgdG8gb3VyIGxpc3RlbmVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRHcmFiYmVkU3RhdGUoaW50IG5ld1N0YXRlKSB7CisgICAgICAgIGlmIChuZXdTdGF0ZSAhPSBtR3JhYmJlZFN0YXRlKSB7CisgICAgICAgICAgICBpZiAobmV3U3RhdGUgIT0gT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKSB7CisgICAgICAgICAgICAgICAgdmlicmF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUdyYWJiZWRTdGF0ZSA9IG5ld1N0YXRlOworICAgICAgICAgICAgaWYgKG1PblRyaWdnZXJMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU9uVHJpZ2dlckxpc3RlbmVyLm9uR3JhYmJlZFN0YXRlQ2hhbmdlKHRoaXMsIG1HcmFiYmVkU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDsKKyAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGJvdHRvbSAtIHRvcDsKKworICAgICAgICBtV2F2ZUNlbnRlclggPSBtSG9yaXpvbnRhbE9mZnNldCArIE1hdGgubWF4KHdpZHRoLCBtT3V0ZXJSaW5nLmdldFdpZHRoKCkgKSAvIDI7CisgICAgICAgIG1XYXZlQ2VudGVyWSA9IG1WZXJ0aWNhbE9mZnNldCArIE1hdGgubWF4KGhlaWdodCwgbU91dGVyUmluZy5nZXRIZWlnaHQoKSkgLyAyOworICAgICAgICBtb3ZlSGFuZGxlVG8obVdhdmVDZW50ZXJYLCBtV2F2ZUNlbnRlclksIGZhbHNlKTsKKyAgICAgICAgbU91dGVyUmluZy5zZXRYKG1XYXZlQ2VudGVyWCk7CisgICAgICAgIG1PdXRlclJpbmcuc2V0WShNYXRoLm1heChtV2F2ZUNlbnRlclksIG1XYXZlQ2VudGVyWSkpOworICAgICAgICBtT3V0ZXJSaW5nLnNldEFscGhhKDAuMGYpOworICAgICAgICBpZiAobU91dGVyUmFkaXVzID09IDAuMGYpIHsKKyAgICAgICAgICAgIG1PdXRlclJhZGl1cyA9IDAuNWYqKGZsb2F0KSBNYXRoLnNxcnQoZGlzdDIobVdhdmVDZW50ZXJYLCBtV2F2ZUNlbnRlclkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUhpdFJhZGl1cyA9PSAwLjBmKSB7CisgICAgICAgICAgICAvLyBVc2UgdGhlIHJhZGl1cyBvZiBpbnNjcmliZWQgY2lyY2xlIG9mIHRoZSBmaXJzdCB0YXJnZXQuCisgICAgICAgICAgICBtSGl0UmFkaXVzID0gbVRhcmdldERyYXdhYmxlcy5nZXQoMCkuZ2V0V2lkdGgoKSAvIDIuMGY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TbmFwTWFyZ2luID09IDAuMGYpIHsKKyAgICAgICAgICAgIG1TbmFwTWFyZ2luID0gVHlwZWRWYWx1ZS5hcHBseURpbWVuc2lvbihUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9ESVAsCisgICAgICAgICAgICAgICAgICAgIFNOQVBfTUFSR0lOX0RFRkFVTFQsIGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UYXJnZXREcmF3YWJsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFRhcmdldERyYXdhYmxlIHRhcmdldEljb24gPSBtVGFyZ2V0RHJhd2FibGVzLmdldChpKTsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IC0yLjBmICogTWF0aC5QSSAqIGkgLyBtVGFyZ2V0RHJhd2FibGVzLnNpemUoKTsKKyAgICAgICAgICAgIGZsb2F0IHhQb3NpdGlvbiA9IG1XYXZlQ2VudGVyWCArIG1PdXRlclJhZGl1cyAqIChmbG9hdCkgTWF0aC5jb3MoYW5nbGUpOworICAgICAgICAgICAgZmxvYXQgeVBvc2l0aW9uID0gbVdhdmVDZW50ZXJZICsgbU91dGVyUmFkaXVzICogKGZsb2F0KSBNYXRoLnNpbihhbmdsZSk7CisgICAgICAgICAgICB0YXJnZXRJY29uLnNldFgoeFBvc2l0aW9uKTsKKyAgICAgICAgICAgIHRhcmdldEljb24uc2V0WSh5UG9zaXRpb24pOworICAgICAgICAgICAgdGFyZ2V0SWNvbi5zZXRBbHBoYSgwLjBmKTsKKyAgICAgICAgfQorICAgICAgICBoaWRlQ2hldnJvbnMoKTsKKyAgICAgICAgaGlkZVRhcmdldHMoZmFsc2UpOworICAgICAgICBpZiAoREVCVUcpIGR1bXAoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGlkZUNoZXZyb25zKCkgeworICAgICAgICBmb3IgKFRhcmdldERyYXdhYmxlIGNoZXZyb24gOiBtQ2hldnJvbkRyYXdhYmxlcykgeworICAgICAgICAgICAgaWYgKGNoZXZyb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoZXZyb24uc2V0QWxwaGEoMC4wZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgeworICAgICAgICBtT3V0ZXJSaW5nLmRyYXcoY2FudmFzKTsKKyAgICAgICAgZm9yIChUYXJnZXREcmF3YWJsZSB0YXJnZXQgOiBtVGFyZ2V0RHJhd2FibGVzKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoVGFyZ2V0RHJhd2FibGUgdGFyZ2V0IDogbUNoZXZyb25EcmF3YWJsZXMpIHsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRhcmdldC5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUhhbmRsZURyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPblRyaWdnZXJMaXN0ZW5lcihPblRyaWdnZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtT25UcmlnZ2VyTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICBpbnZhbGlkYXRlR2xvYmFsUmVnaW9uKG1IYW5kbGVEcmF3YWJsZSk7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IHNxdWFyZShmbG9hdCBkKSB7CisgICAgICAgIHJldHVybiBkICogZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZsb2F0IGRpc3QyKGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgICAgICByZXR1cm4gZHgqZHggKyBkeSpkeTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L211bHRpd2F2ZXZpZXcvVGFyZ2V0RHJhd2FibGUuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvbXVsdGl3YXZldmlldy9UYXJnZXREcmF3YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYmFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L211bHRpd2F2ZXZpZXcvVGFyZ2V0RHJhd2FibGUuamF2YQpAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lm11bHRpd2F2ZXZpZXc7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TdGF0ZUxpc3REcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVGFyZ2V0RHJhd2FibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVGFyZ2V0RHJhd2FibGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gU1RBVEVfQUNUSVZFID0KKyAgICAgICAgICAgIHsgYW5kcm9pZC5SLmF0dHIuc3RhdGVfZW5hYmxlZCwgYW5kcm9pZC5SLmF0dHIuc3RhdGVfYWN0aXZlIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBTVEFURV9JTkFDVElWRSA9CisgICAgICAgICAgICB7IGFuZHJvaWQuUi5hdHRyLnN0YXRlX2VuYWJsZWQsIC1hbmRyb2lkLlIuYXR0ci5zdGF0ZV9hY3RpdmUgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFNUQVRFX0ZPQ1VTRUQgPQorICAgICAgICAgICAgeyBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9lbmFibGVkLCBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9mb2N1c2VkIH07CisKKyAgICBwcml2YXRlIGZsb2F0IG1UcmFuc2xhdGlvblggPSAwLjBmOworICAgIHByaXZhdGUgZmxvYXQgbVRyYW5zbGF0aW9uWSA9IDAuMGY7CisgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVYID0gMS4wZjsKKyAgICBwcml2YXRlIGZsb2F0IG1TY2FsZVkgPSAxLjBmOworICAgIHByaXZhdGUgZmxvYXQgbUFscGhhID0gMS4wZjsKKyAgICBwcml2YXRlIERyYXdhYmxlIG1EcmF3YWJsZTsKKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGNsYXNzIERyYXdhYmxlV2l0aEFscGhhIGV4dGVuZHMgRHJhd2FibGUgeworICAgICAgICBwcml2YXRlIGZsb2F0IG1BbHBoYSA9IDEuMGY7CisgICAgICAgIHByaXZhdGUgRHJhd2FibGUgbVJlYWxEcmF3YWJsZTsKKyAgICAgICAgcHVibGljIERyYXdhYmxlV2l0aEFscGhhKERyYXdhYmxlIHJlYWxEcmF3YWJsZSkgeworICAgICAgICAgICAgbVJlYWxEcmF3YWJsZSA9IHJlYWxEcmF3YWJsZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBoYSkgeworICAgICAgICAgICAgbUFscGhhID0gYWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGZsb2F0IGdldEFscGhhKCkgeworICAgICAgICAgICAgcmV0dXJuIG1BbHBoYTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIG1SZWFsRHJhd2FibGUuc2V0QWxwaGEoKGludCkgTWF0aC5yb3VuZChtQWxwaGEgKiAyNTVmKSk7CisgICAgICAgICAgICBtUmVhbERyYXdhYmxlLmRyYXcoY2FudmFzKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWxwaGEoaW50IGFscGhhKSB7CisgICAgICAgICAgICBtUmVhbERyYXdhYmxlLnNldEFscGhhKGFscGhhKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29sb3JGaWx0ZXIoQ29sb3JGaWx0ZXIgY2YpIHsKKyAgICAgICAgICAgIG1SZWFsRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoY2YpOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldE9wYWNpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbVJlYWxEcmF3YWJsZS5nZXRPcGFjaXR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVGFyZ2V0RHJhd2FibGUoUmVzb3VyY2VzIHJlcywgaW50IHJlc0lkKSB7CisgICAgICAgIHRoaXMocmVzLCByZXNJZCA9PSAwID8gbnVsbCA6IHJlcy5nZXREcmF3YWJsZShyZXNJZCkpOworICAgIH0KKworICAgIHB1YmxpYyBUYXJnZXREcmF3YWJsZShSZXNvdXJjZXMgcmVzLCBEcmF3YWJsZSBkcmF3YWJsZSkgeworICAgICAgICAvLyBNdXRhdGUgdGhlIGRyYXdhYmxlIHNvIHdlIGNhbiBhbmltYXRlIHNoYXJlZCBkcmF3YWJsZSBwcm9wZXJ0aWVzLgorICAgICAgICBtRHJhd2FibGUgPSBkcmF3YWJsZSAhPSBudWxsID8gZHJhd2FibGUubXV0YXRlKCkgOiBudWxsOworICAgICAgICByZXNpemVEcmF3YWJsZXMoKTsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfSU5BQ1RJVkUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKGludCBbXSBzdGF0ZSkgeworICAgICAgICBpZiAobURyYXdhYmxlIGluc3RhbmNlb2YgU3RhdGVMaXN0RHJhd2FibGUpIHsKKyAgICAgICAgICAgIFN0YXRlTGlzdERyYXdhYmxlIGQgPSAoU3RhdGVMaXN0RHJhd2FibGUpIG1EcmF3YWJsZTsKKyAgICAgICAgICAgIGQuc2V0U3RhdGUoc3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzU3RhdGUoaW50IFtdIHN0YXRlKSB7CisgICAgICAgIGlmIChtRHJhd2FibGUgaW5zdGFuY2VvZiBTdGF0ZUxpc3REcmF3YWJsZSkgeworICAgICAgICAgICAgU3RhdGVMaXN0RHJhd2FibGUgZCA9IChTdGF0ZUxpc3REcmF3YWJsZSkgbURyYXdhYmxlOworICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBkb2Vzbid0IHNlZW0gdG8gd29yaworICAgICAgICAgICAgcmV0dXJuIGQuZ2V0U3RhdGVEcmF3YWJsZUluZGV4KHN0YXRlKSAhPSAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBkcmF3YWJsZSBpcyBhIFN0YXRlTGlzdERyYXdhYmxlIGFuZCBpcyBpbiB0aGUgZm9jdXNlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgaWYgKG1EcmF3YWJsZSBpbnN0YW5jZW9mIFN0YXRlTGlzdERyYXdhYmxlKSB7CisgICAgICAgICAgICBTdGF0ZUxpc3REcmF3YWJsZSBkID0gKFN0YXRlTGlzdERyYXdhYmxlKSBtRHJhd2FibGU7CisgICAgICAgICAgICBpbnRbXSBzdGF0ZXMgPSBkLmdldFN0YXRlKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZXNbaV0gPT0gYW5kcm9pZC5SLmF0dHIuc3RhdGVfZm9jdXNlZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhcmdldCBpcyBlbmFibGVkLiBUeXBpY2FsbHkgYW4gZW5hYmxlZCB0YXJnZXQgY29udGFpbnMgYSB2YWxpZAorICAgICAqIGRyYXdhYmxlIGluIGEgdmFsaWQgc3RhdGUuIEN1cnJlbnRseSBhbGwgdGFyZ2V0cyB3aXRoIHZhbGlkIGRyYXdhYmxlcyBhcmUgdmFsaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1EcmF3YWJsZSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIGRyYXdhYmxlcyBpbiBhIFN0YXRlTGlzdERyYXdhYmxlIGFsbCB0aGUgc2FtZSBkaW1lbnNpb25zLgorICAgICAqIElmIG5vdCBhIFN0YXRlTGlzdERyYXdhYmxlLCB0aGVuIGp1c3RzIHNldHMgdGhlIGJvdW5kcyB0byB0aGUgaW50cmluc2ljIHNpemUgb2YgdGhlCisgICAgICogZHJhd2FibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc2l6ZURyYXdhYmxlcygpIHsKKyAgICAgICAgaWYgKG1EcmF3YWJsZSBpbnN0YW5jZW9mIFN0YXRlTGlzdERyYXdhYmxlKSB7CisgICAgICAgICAgICBTdGF0ZUxpc3REcmF3YWJsZSBkID0gKFN0YXRlTGlzdERyYXdhYmxlKSBtRHJhd2FibGU7CisgICAgICAgICAgICBpbnQgbWF4V2lkdGggPSAwOworICAgICAgICAgICAgaW50IG1heEhlaWdodCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGQuZ2V0U3RhdGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBjaGlsZERyYXdhYmxlID0gZC5nZXRTdGF0ZURyYXdhYmxlKGkpOworICAgICAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGNoaWxkRHJhd2FibGUuZ2V0SW50cmluc2ljV2lkdGgoKSk7CisgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBjaGlsZERyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExvZy52KFRBRywgInVuaW9uIG9mIGNoaWxkRHJhd2FibGUgcmVjdHMgIiArIGQgKyAiIHRvOiAiICsgbWF4V2lkdGggKyAieCIgKyBtYXhIZWlnaHQpOworICAgICAgICAgICAgZC5zZXRCb3VuZHMoMCwgMCwgbWF4V2lkdGgsIG1heEhlaWdodCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGQuZ2V0U3RhdGVDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBEcmF3YWJsZSBjaGlsZERyYXdhYmxlID0gZC5nZXRTdGF0ZURyYXdhYmxlKGkpOworICAgICAgICAgICAgICAgIExvZy52KFRBRywgInNpemluZyBkcmF3YWJsZSAiICsgY2hpbGREcmF3YWJsZSArICIgdG86ICIgKyBtYXhXaWR0aCArICJ4IiArIG1heEhlaWdodCk7CisgICAgICAgICAgICAgICAgY2hpbGREcmF3YWJsZS5zZXRCb3VuZHMoMCwgMCwgbWF4V2lkdGgsIG1heEhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobURyYXdhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EcmF3YWJsZS5zZXRCb3VuZHMoMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgbURyYXdhYmxlLmdldEludHJpbnNpY1dpZHRoKCksIG1EcmF3YWJsZS5nZXRJbnRyaW5zaWNIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHgpIHsKKyAgICAgICAgbVRyYW5zbGF0aW9uWCA9IHg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0WShmbG9hdCB5KSB7CisgICAgICAgIG1UcmFuc2xhdGlvblkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjYWxlWChmbG9hdCB4KSB7CisgICAgICAgIG1TY2FsZVggPSB4OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNjYWxlWShmbG9hdCB5KSB7CisgICAgICAgIG1TY2FsZVkgPSB5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFscGhhKGZsb2F0IGFscGhhKSB7CisgICAgICAgIG1BbHBoYSA9IGFscGhhOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICByZXR1cm4gbVRyYW5zbGF0aW9uWDsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0WSgpIHsKKyAgICAgICAgcmV0dXJuIG1UcmFuc2xhdGlvblk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWCgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVg7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldFNjYWxlWSgpIHsKKyAgICAgICAgcmV0dXJuIG1TY2FsZVk7CisgICAgfQorCisgICAgcHVibGljIGZsb2F0IGdldEFscGhhKCkgeworICAgICAgICByZXR1cm4gbUFscGhhOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7CisgICAgICAgIHJldHVybiBtRHJhd2FibGUgIT0gbnVsbCA/IG1EcmF3YWJsZS5nZXRJbnRyaW5zaWNXaWR0aCgpIDogMDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKKyAgICAgICAgcmV0dXJuIG1EcmF3YWJsZSAhPSBudWxsID8gbURyYXdhYmxlLmdldEludHJpbnNpY0hlaWdodCgpIDogMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgaWYgKG1EcmF3YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY2FudmFzLnNhdmUoQ2FudmFzLk1BVFJJWF9TQVZFX0ZMQUcpOworICAgICAgICBjYW52YXMudHJhbnNsYXRlKG1UcmFuc2xhdGlvblgsIG1UcmFuc2xhdGlvblkpOworICAgICAgICBjYW52YXMuc2NhbGUobVNjYWxlWCwgbVNjYWxlWSk7CisgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLTAuNWYgKiBnZXRXaWR0aCgpLCAtMC41ZiAqIGdldEhlaWdodCgpKTsKKyAgICAgICAgbURyYXdhYmxlLnNldEFscGhhKChpbnQpIE1hdGgucm91bmQobUFscGhhICogMjU1ZikpOworICAgICAgICBtRHJhd2FibGUuZHJhdyhjYW52YXMpOworICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC93aWRnZXQvbXVsdGl3YXZldmlldy9Ud2VlbmVyLmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L211bHRpd2F2ZXZpZXcvVHdlZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZmYwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvd2lkZ2V0L211bHRpd2F2ZXZpZXcvVHdlZW5lci5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQubXVsdGl3YXZldmlldzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5VmFsdWVzSG9sZGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlRpbWVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyOworCitjbGFzcyBUd2VlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlR3ZWVuZXIiOworCisgICAgcHJpdmF0ZSBPYmplY3Qgb2JqZWN0OworICAgIE9iamVjdEFuaW1hdG9yIGFuaW1hdG9yOworICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8T2JqZWN0LCBUd2VlbmVyPiBzVHdlZW5zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBUd2VlbmVyPigpOworCisgICAgcHVibGljIFR3ZWVuZXIoT2JqZWN0IG9iaiwgT2JqZWN0QW5pbWF0b3IgYW5pbSkgeworICAgICAgICBvYmplY3QgPSBvYmo7CisgICAgICAgIGFuaW1hdG9yID0gYW5pbTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFR3ZWVuZXIgdG8oT2JqZWN0IG9iamVjdCwgbG9uZyBkdXJhdGlvbiwgT2JqZWN0Li4uIHZhcnMpIHsKKyAgICAgICAgbG9uZyBkZWxheSA9IDA7CisgICAgICAgIEFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIgPSBudWxsOworICAgICAgICBBbmltYXRvckxpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgVGltZUludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBudWxsOworCisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhcmd1bWVudHMgYW5kIGRpc2NvdmVyIHByb3BlcnRpZXMgdG8gYW5pbWF0ZQorICAgICAgICBBcnJheUxpc3Q8UHJvcGVydHlWYWx1ZXNIb2xkZXI+IHByb3BzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlc0hvbGRlcj4odmFycy5sZW5ndGgvMik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFycy5sZW5ndGg7IGkrPTIpIHsKKyAgICAgICAgICAgIGlmICghKHZhcnNbaV0gaW5zdGFuY2VvZiBTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiS2V5IG11c3QgYmUgYSBzdHJpbmc6ICIgKyB2YXJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSB2YXJzW2ldOworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdmFyc1tpKzFdOworICAgICAgICAgICAgaWYgKCJzaW11bHRhbmVvdXNUd2VlbiIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICB9IGVsc2UgaWYgKCJlYXNlIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgIGludGVycG9sYXRvciA9IChUaW1lSW50ZXJwb2xhdG9yKSB2YWx1ZTsgLy8gVE9ETzogbXVsdGlwbGUgaW50ZXJwb2xhdG9ycz8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIm9uVXBkYXRlIi5lcXVhbHMoa2V5KSB8fCAib25VcGRhdGVMaXN0ZW5lciIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVMaXN0ZW5lciA9IChBbmltYXRvclVwZGF0ZUxpc3RlbmVyKSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIm9uQ29tcGxldGUiLmVxdWFscyhrZXkpIHx8ICJvbkNvbXBsZXRlTGlzdGVuZXIiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSAoQW5pbWF0b3JMaXN0ZW5lcikgdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZWxheSIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICBkZWxheSA9ICgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJzeW5jV2l0aCIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgZmxvYXRbXSkgeworICAgICAgICAgICAgICAgIHByb3BzLmFkZChQcm9wZXJ0eVZhbHVlc0hvbGRlci5vZkZsb2F0KGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXRbXSl2YWx1ZSlbMF0sICgoZmxvYXRbXSl2YWx1ZSlbMV0pKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBmbG9hdFZhbHVlID0gKChOdW1iZXIpdmFsdWUpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBwcm9wcy5hZGQoUHJvcGVydHlWYWx1ZXNIb2xkZXIub2ZGbG9hdChrZXksIGZsb2F0VmFsdWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgYXJndW1lbnQgZm9yIGtleSBcIiIgKyBrZXkgKyAiXCIgd2l0aCB2YWx1ZSAiICsgdmFsdWUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZS11c2UgZXhpc3RpbmcgdHdlZW4sIGlmIHByZXNlbnQKKyAgICAgICAgVHdlZW5lciB0d2VlbiA9IHNUd2VlbnMuZ2V0KG9iamVjdCk7CisgICAgICAgIGlmICh0d2VlbiA9PSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3RBbmltYXRvciBhbmltID0gT2JqZWN0QW5pbWF0b3Iub2ZQcm9wZXJ0eVZhbHVlc0hvbGRlcihvYmplY3QsCisgICAgICAgICAgICAgICAgICAgIHByb3BzLnRvQXJyYXkobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW3Byb3BzLnNpemUoKV0pKTsKKyAgICAgICAgICAgIHR3ZWVuID0gbmV3IFR3ZWVuZXIob2JqZWN0LCBhbmltKTsKKyAgICAgICAgICAgIHNUd2VlbnMucHV0KG9iamVjdCwgdHdlZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHdlZW4uYW5pbWF0b3IuY2FuY2VsKCk7CisgICAgICAgICAgICByZXBsYWNlKHByb3BzLCBvYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludGVycG9sYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICB0d2Vlbi5hbmltYXRvci5zZXRJbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSBhbmltYXRpb24gd2l0aCBwcm9wZXJ0aWVzIGRpc2NvdmVyZWQgaW4gbG9vcCBhYm92ZQorICAgICAgICB0d2Vlbi5hbmltYXRvci5zZXRTdGFydERlbGF5KGRlbGF5KTsKKyAgICAgICAgdHdlZW4uYW5pbWF0b3Iuc2V0RHVyYXRpb24oZHVyYXRpb24pOworICAgICAgICBpZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdHdlZW4uYW5pbWF0b3IucmVtb3ZlQWxsVXBkYXRlTGlzdGVuZXJzKCk7IC8vIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZQorICAgICAgICAgICAgdHdlZW4uYW5pbWF0b3IuYWRkVXBkYXRlTGlzdGVuZXIodXBkYXRlTGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0d2Vlbi5hbmltYXRvci5yZW1vdmVBbGxMaXN0ZW5lcnMoKTsgLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lLgorICAgICAgICAgICAgdHdlZW4uYW5pbWF0b3IuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICB9CisgICAgICAgIHR3ZWVuLmFuaW1hdG9yLnN0YXJ0KCk7CisKKyAgICAgICAgcmV0dXJuIHR3ZWVuOworICAgIH0KKworICAgIFR3ZWVuZXIgZnJvbShPYmplY3Qgb2JqZWN0LCBsb25nIGR1cmF0aW9uLCBPYmplY3QuLi4gdmFycykgeworICAgICAgICAvLyBUT0RPOiAgZm9yIHYgb2YgdmFycworICAgICAgICAvLyAgICAgICAgICAgIHRvVmFyc1t2XSA9IG9iamVjdFt2XQorICAgICAgICAvLyAgICAgICAgICAgIG9iamVjdFt2XSA9IHZhcnNbdl0KKyAgICAgICAgcmV0dXJuIFR3ZWVuZXIudG8ob2JqZWN0LCBkdXJhdGlvbiwgdmFycyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVwbGFjZShBcnJheUxpc3Q8UHJvcGVydHlWYWx1ZXNIb2xkZXI+IHByb3BzLCBPYmplY3QuLi4gYXJncykgeworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBraWxsb2JqZWN0IDogYXJncykgeworICAgICAgICAgICAgVHdlZW5lciB0d2VlbiA9IHNUd2VlbnMuZ2V0KGtpbGxvYmplY3QpOworICAgICAgICAgICAgaWYgKHR3ZWVuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoa2lsbG9iamVjdCA9PSB0d2Vlbi5vYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgdHdlZW4uYW5pbWF0b3IuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0d2Vlbi5hbmltYXRvci5zZXRWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnRvQXJyYXkobmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyW3Byb3BzLnNpemUoKV0pKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNUd2VlbnMucmVtb3ZlKHR3ZWVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FuZHJvaWQubWsgYi9jb3JlL2puaS9BbmRyb2lkLm1rCmluZGV4IDIyMzAwOGMuLjdiMDg4MmYgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FuZHJvaWQubWsKKysrIGIvY29yZS9qbmkvQW5kcm9pZC5tawpAQCAtNDgsNyArNDgsNiBAQAogCWFuZHJvaWRfdmlld19EaXNwbGF5LmNwcCBcCiAJYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwIFwKIAlhbmRyb2lkX3ZpZXdfVGV4dHVyZVZpZXcuY3BwIFwKLQlhbmRyb2lkX3ZpZXdfVmlld0FuY2VzdG9yLmNwcCBcCiAJYW5kcm9pZF92aWV3X0lucHV0Q2hhbm5lbC5jcHAgXAogCWFuZHJvaWRfdmlld19JbnB1dFF1ZXVlLmNwcCBcCiAJYW5kcm9pZF92aWV3X0tleUV2ZW50LmNwcCBcCkBAIC0xMDUsNiArMTA0LDcgQEAKIAlhbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaEltcGwuY3BwIFwKIAlhbmRyb2lkL2dyYXBoaWNzL05pbmVQYXRjaFBlZWtlci5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUGFpbnQuY3BwIFwKKwlhbmRyb2lkL2dyYXBoaWNzL1BhcmNlbFN1cmZhY2VUZXh0dXJlLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9QYXRoLmNwcCBcCiAJYW5kcm9pZC9ncmFwaGljcy9QYXRoTWVhc3VyZS5jcHAgXAogCWFuZHJvaWQvZ3JhcGhpY3MvUGF0aEVmZmVjdC5jcHAgXApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCmluZGV4IGU2MTA2NDAuLjIxYjBhNDJjIDEwMDY0NAotLS0gYS9jb3JlL2puaS9BbmRyb2lkUnVudGltZS5jcHAKKysrIGIvY29yZS9qbmkvQW5kcm9pZFJ1bnRpbWUuY3BwCkBAIC0xMDUsNiArMTA1LDcgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19EcmF3RmlsdGVyKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19NYXRyaXgoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BhaW50KEpOSUVudiogZW52KTsKK2V4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QYXJjZWxTdXJmYWNlVGV4dHVyZShKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGF0aChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGF0aE1lYXN1cmUoSk5JRW52KiBlbnYpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BpY3R1cmUoSk5JRW52Kik7CkBAIC0xMTksNyArMTIwLDYgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhcyhKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19TdXJmYWNlKEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1RleHR1cmVWaWV3KEpOSUVudiogZW52KTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdBbmNlc3RvcihKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfQ3Vyc29yV2luZG93KEpOSUVudiogZW52KTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9kYXRhYmFzZV9TUUxpdGVDb21waWxlZFNxbChKTklFbnYqIGVudik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2FuZHJvaWRfZGF0YWJhc2VfU1FMaXRlRGF0YWJhc2UoSk5JRW52KiBlbnYpOwpAQCAtMTEyMSw3ICsxMTIxLDYgQEAKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1N1cmZhY2UpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF92aWV3X1RleHR1cmVWaWV3KSwKLSAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfdmlld19WaWV3QW5jZXN0b3IpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbCksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX29wZW5nbF9qbmlfR0xFUzEwKSwKQEAgLTExNDQsNiArMTE0Myw3IEBACiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX01vdmllKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfTmluZVBhdGNoKSwKICAgICBSRUdfSk5JKHJlZ2lzdGVyX2FuZHJvaWRfZ3JhcGhpY3NfUGFpbnQpLAorICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QYXJjZWxTdXJmYWNlVGV4dHVyZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BhdGgpLAogICAgIFJFR19KTkkocmVnaXN0ZXJfYW5kcm9pZF9ncmFwaGljc19QYXRoTWVhc3VyZSksCiAgICAgUkVHX0pOSShyZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BhdGhFZmZlY3QpLApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuY3BwCmluZGV4IDRhMDkyMzIuLjk0MmFhOGEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5jcHAKQEAgLTc1NSwzMiArNzU1LDQ2IEBACiAgICAgICAgICAgICBqZmxvYXQgeCwgamZsb2F0IHksIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKIAogICAgICAgICBqaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUoCi0gICAgICAgICAgICAgICAgcGFpbnQsIHRleHRBcnJheSwgc3RhcnQsIGNvdW50LCBlbmQsIGZsYWdzKTsKKyAgICAgICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlOworI2lmIFVTRV9URVhUX0xBWU9VVF9DQUNIRQorICAgICAgICB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUocGFpbnQsIHRleHRBcnJheSwgc3RhcnQsIGNvdW50LCBlbmQsIGZsYWdzKTsKICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgIExPR0UoIkNhbm5vdCBnZXQgVGV4dExheW91dENhY2hlIHZhbHVlIik7CiAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICB9CisjZWxzZQorICAgICAgICB2YWx1ZSA9IG5ldyBUZXh0TGF5b3V0Q2FjaGVWYWx1ZSgpOworICAgICAgICB2YWx1ZS0+Y29tcHV0ZVZhbHVlcyhwYWludCwgdGV4dEFycmF5LCBzdGFydCwgY291bnQsIGVuZCwgZmxhZ3MpOworI2VuZGlmCisKICNpZiBERUJVR19HTFlQSFMKICAgICAgICAgbG9nR2x5cGhzKHZhbHVlKTsKICNlbmRpZgotICAgICAgICBkb0RyYXdHbHlwaHMoY2FudmFzLCB2YWx1ZS0+Z2V0R2x5cGhzKCksIDAsIHZhbHVlLT5nZXRHbHlwaHNDb3VudCgpLAotICAgICAgICAgICAgICAgIHgsIHksIGZsYWdzLCBwYWludCk7CisKKyAgICBkb0RyYXdHbHlwaHMoY2FudmFzLCB2YWx1ZS0+Z2V0R2x5cGhzKCksIDAsIHZhbHVlLT5nZXRHbHlwaHNDb3VudCgpLAorICAgICAgICAgICAgeCwgeSwgZmxhZ3MsIHBhaW50KTsKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBkcmF3VGV4dFdpdGhHbHlwaHMoU2tDYW52YXMqIGNhbnZhcywgY29uc3QgamNoYXIqIHRleHRBcnJheSwKICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgY29udGV4dENvdW50LAogICAgICAgICAgICAgamZsb2F0IHgsIGpmbG9hdCB5LCBpbnQgZmxhZ3MsIFNrUGFpbnQqIHBhaW50KSB7CiAKLSAgICAgICAgc3A8VGV4dExheW91dENhY2hlVmFsdWU+IHZhbHVlID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZSgKLSAgICAgICAgICAgICAgICBwYWludCwgdGV4dEFycmF5LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MpOworICAgICAgICBzcDxUZXh0TGF5b3V0Q2FjaGVWYWx1ZT4gdmFsdWU7CisjaWYgVVNFX1RFWFRfTEFZT1VUX0NBQ0hFCisgICAgICAgIHZhbHVlID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZShwYWludCwgdGV4dEFycmF5LCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZmxhZ3MpOwogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICAgICAgTE9HRSgiQ2Fubm90IGdldCBUZXh0TGF5b3V0Q2FjaGUgdmFsdWUiKTsKICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHZhbHVlID0gbmV3IFRleHRMYXlvdXRDYWNoZVZhbHVlKCk7CisgICAgICAgIHZhbHVlLT5jb21wdXRlVmFsdWVzKHBhaW50LCB0ZXh0QXJyYXksIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncyk7CisjZW5kaWYKKwogI2lmIERFQlVHX0dMWVBIUwogICAgICAgICBsb2dHbHlwaHModmFsdWUpOwogI2VuZGlmCisKICAgICAgICAgZG9EcmF3R2x5cGhzKGNhbnZhcywgdmFsdWUtPmdldEdseXBocygpLCAwLCB2YWx1ZS0+Z2V0R2x5cGhzQ291bnQoKSwKICAgICAgICAgICAgICAgICB4LCB5LCBmbGFncywgcGFpbnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFyY2VsU3VyZmFjZVRleHR1cmUuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9QYXJjZWxTdXJmYWNlVGV4dHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5NjZlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvUGFyY2VsU3VyZmFjZVRleHR1cmUuY3BwCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJQYXJjZWxTdXJmYWNlVGV4dHVyZSIKKworI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfZ3JhcGhpY3NfU3VyZmFjZVRleHR1cmUuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSAiYW5kcm9pZF91dGlsX0JpbmRlci5oIgorI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGNoYXIqIGNvbnN0IGtQYXJjZWxTdXJmYWNlVGV4dHVyZUNsYXNzUGF0aE5hbWUgPQorICAgICJhbmRyb2lkL2dyYXBoaWNzL1BhcmNlbFN1cmZhY2VUZXh0dXJlIjsKKworc3RydWN0IGZpZWxkc190IHsKKyAgICBqZmllbGRJRCBpU3VyZmFjZVRleHR1cmU7Cit9Oworc3RhdGljIGZpZWxkc190IGZpZWxkczsKKworI2RlZmluZSBBTkRST0lEX0dSQVBISUNTX0lTVVJGQUNFVEVYVFVSRV9KTklfSUQgIm1JU3VyZmFjZVRleHR1cmUiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUGFyY2VsU3VyZmFjZVRleHR1cmVfc2V0SVN1cmZhY2VUZXh0dXJlKAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBpU3VyZmFjZVRleHR1cmUpCit7CisgICAgSVN1cmZhY2VUZXh0dXJlKiBjb25zdCBwID0KKyAgICAgICAgICAgIChJU3VyZmFjZVRleHR1cmUqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRzLmlTdXJmYWNlVGV4dHVyZSk7CisgICAgaWYgKGlTdXJmYWNlVGV4dHVyZS5nZXQoKSkgeworICAgICAgICBpU3VyZmFjZVRleHR1cmUtPmluY1N0cm9uZyh0aGl6KTsKKyAgICB9CisgICAgaWYgKHApIHsKKyAgICAgICAgcC0+ZGVjU3Ryb25nKHRoaXopOworICAgIH0KKyAgICBlbnYtPlNldEludEZpZWxkKHRoaXosIGZpZWxkcy5pU3VyZmFjZVRleHR1cmUsIChpbnQpaVN1cmZhY2VUZXh0dXJlLmdldCgpKTsKK30KKworc3A8SVN1cmZhY2VUZXh0dXJlPiBQYXJjZWxTdXJmYWNlVGV4dHVyZV9nZXRJU3VyZmFjZVRleHR1cmUoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBpU3VyZmFjZVRleHR1cmUoCisgICAgICAgIChJU3VyZmFjZVRleHR1cmUqKWVudi0+R2V0SW50RmllbGQodGhpeiwgZmllbGRzLmlTdXJmYWNlVGV4dHVyZSkpOworICAgIHJldHVybiBpU3VyZmFjZVRleHR1cmU7Cit9CisKK3NwPEFOYXRpdmVXaW5kb3c+IGFuZHJvaWRfUGFyY2VsU3VyZmFjZVRleHR1cmVfZ2V0TmF0aXZlV2luZG93KAorICAgICAgICBKTklFbnYqIGVudiwgam9iamVjdCB0aGl6KQoreworICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gaVN1cmZhY2VUZXh0dXJlKAorICAgICAgICAgICAgUGFyY2VsU3VyZmFjZVRleHR1cmVfZ2V0SVN1cmZhY2VUZXh0dXJlKGVudiwgdGhpeikpOworICAgIHNwPFN1cmZhY2VUZXh0dXJlQ2xpZW50PiBzdXJmYWNlVGV4dHVyZUNsaWVudChpU3VyZmFjZVRleHR1cmUgIT0gTlVMTCA/CisgICAgICAgICAgICBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoaVN1cmZhY2VUZXh0dXJlKSA6IE5VTEwpOworICAgIHJldHVybiBzdXJmYWNlVGV4dHVyZUNsaWVudDsKK30KKworYm9vbCBhbmRyb2lkX1BhcmNlbFN1cmZhY2VUZXh0dXJlX2lzSW5zdGFuY2VPZihKTklFbnYqIGVudiwgam9iamVjdCB0aGl6KQoreworICAgIGpjbGFzcyBwYXJjZWxTdXJmYWNlVGV4dHVyZUNsYXNzID0gZW52LT5GaW5kQ2xhc3MoCisgICAgICAgICAgICBrUGFyY2VsU3VyZmFjZVRleHR1cmVDbGFzc1BhdGhOYW1lKTsKKyAgICByZXR1cm4gZW52LT5Jc0luc3RhbmNlT2YodGhpeiwgcGFyY2VsU3VyZmFjZVRleHR1cmVDbGFzcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUGFyY2VsU3VyZmFjZVRleHR1cmVfY2xhc3NJbml0KEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopCit7CisgICAgZmllbGRzLmlTdXJmYWNlVGV4dHVyZSA9CisgICAgICAgICAgICBlbnYtPkdldEZpZWxkSUQoY2xhenosIEFORFJPSURfR1JBUEhJQ1NfSVNVUkZBQ0VURVhUVVJFX0pOSV9JRCwgIkkiKTsKKyAgICBpZiAoZmllbGRzLmlTdXJmYWNlVGV4dHVyZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImNhbid0IGZpbmQgYW5kcm9pZC9ncmFwaGljcy9QYXJjZWxTdXJmYWNlVGV4dHVyZS4lcyIsCisgICAgICAgICAgICAgQU5EUk9JRF9HUkFQSElDU19JU1VSRkFDRVRFWFRVUkVfSk5JX0lEKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFBhcmNlbFN1cmZhY2VUZXh0dXJlX2luaXQoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeiwgam9iamVjdCBqU3VyZmFjZVRleHR1cmUpCit7CisgICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBpU3VyZmFjZVRleHR1cmUoCisgICAgICAgICAgICBTdXJmYWNlVGV4dHVyZV9nZXRTdXJmYWNlVGV4dHVyZShlbnYsIGpTdXJmYWNlVGV4dHVyZSkpOworICAgIFBhcmNlbFN1cmZhY2VUZXh0dXJlX3NldElTdXJmYWNlVGV4dHVyZShlbnYsIHRoaXosIGlTdXJmYWNlVGV4dHVyZSk7Cit9CisKK3N0YXRpYyB2b2lkIFBhcmNlbFN1cmZhY2VUZXh0dXJlX2ZpbmFsaXplKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgUGFyY2VsU3VyZmFjZVRleHR1cmVfc2V0SVN1cmZhY2VUZXh0dXJlKGVudiwgdGhpeiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIFBhcmNlbFN1cmZhY2VUZXh0dXJlX3dyaXRlVG9QYXJjZWwoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgalBhcmNlbCwgamludCBmbGFncykKK3sKKyAgICBQYXJjZWwqIHBhcmNlbCA9IHBhcmNlbEZvckphdmFPYmplY3QoZW52LCBqUGFyY2VsKTsKKyAgICBzcDxJU3VyZmFjZVRleHR1cmU+IGlTdXJmYWNlVGV4dHVyZSgKKyAgICAgICAgICAgIFBhcmNlbFN1cmZhY2VUZXh0dXJlX2dldElTdXJmYWNlVGV4dHVyZShlbnYsIHRoaXopKTsKKyAgICBzcDxJQmluZGVyPiBiKGlTdXJmYWNlVGV4dHVyZS0+YXNCaW5kZXIoKSk7CisgICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKK30KKworc3RhdGljIHZvaWQgUGFyY2VsU3VyZmFjZVRleHR1cmVfcmVhZEZyb21QYXJjZWwoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QgalBhcmNlbCkKK3sKKyAgICBQYXJjZWwqIHBhcmNlbCA9IHBhcmNlbEZvckphdmFPYmplY3QoZW52LCBqUGFyY2VsKTsKKyAgICBzcDxJU3VyZmFjZVRleHR1cmU+IGlTdXJmYWNlVGV4dHVyZSgKKyAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElTdXJmYWNlVGV4dHVyZT4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpKTsKKyAgICBQYXJjZWxTdXJmYWNlVGV4dHVyZV9zZXRJU3VyZmFjZVRleHR1cmUoZW52LCB0aGl6LCBpU3VyZmFjZVRleHR1cmUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ1BhcmNlbFN1cmZhY2VUZXh0dXJlTWV0aG9kc1tdID0geworICAgIHsibmF0aXZlQ2xhc3NJbml0IiwgIigpViIsICAgKHZvaWQqKVBhcmNlbFN1cmZhY2VUZXh0dXJlX2NsYXNzSW5pdCB9LAorICAgIHsibmF0aXZlSW5pdCIsICIoTGFuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmU7KVYiLAorICAgICAgKHZvaWQgKilQYXJjZWxTdXJmYWNlVGV4dHVyZV9pbml0IH0sCisgICAgeyAibmF0aXZlRmluYWxpemUiLCAiKClWIiwgKHZvaWQgKilQYXJjZWxTdXJmYWNlVGV4dHVyZV9maW5hbGl6ZSB9LAorICAgIHsgIm5hdGl2ZVdyaXRlVG9QYXJjZWwiLCAiKExhbmRyb2lkL29zL1BhcmNlbDtJKVYiLAorICAgICAgKHZvaWQgKilQYXJjZWxTdXJmYWNlVGV4dHVyZV93cml0ZVRvUGFyY2VsIH0sCisgICAgeyAibmF0aXZlUmVhZEZyb21QYXJjZWwiLCAiKExhbmRyb2lkL29zL1BhcmNlbDspViIsCisgICAgICAodm9pZCAqKVBhcmNlbFN1cmZhY2VUZXh0dXJlX3JlYWRGcm9tUGFyY2VsIH0sCit9OworCisKK2ludCByZWdpc3Rlcl9hbmRyb2lkX2dyYXBoaWNzX1BhcmNlbFN1cmZhY2VUZXh0dXJlKEpOSUVudiogZW52KQoreworICAgIGludCBlcnIgPSAwOworICAgIGVyciA9IEFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoZW52LCBrUGFyY2VsU3VyZmFjZVRleHR1cmVDbGFzc1BhdGhOYW1lLAorICAgICAgICAgICAgZ1BhcmNlbFN1cmZhY2VUZXh0dXJlTWV0aG9kcywgTkVMRU0oZ1BhcmNlbFN1cmZhY2VUZXh0dXJlTWV0aG9kcykpOworICAgIHJldHVybiBlcnI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TdXJmYWNlVGV4dHVyZS5jcHAKaW5kZXggMmY3MDE5MC4uMGQyOGNiMSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TdXJmYWNlVGV4dHVyZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9TdXJmYWNlVGV4dHVyZS5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IE91dE9mUmVzb3VyY2VzRXhjZXB0aW9uID0KICAgICAiYW5kcm9pZC9ncmFwaGljcy9TdXJmYWNlVGV4dHVyZSRPdXRPZlJlc291cmNlc0V4Y2VwdGlvbiI7Citjb25zdCBjaGFyKiBjb25zdCBrU3VyZmFjZVRleHR1cmVDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUiOwogCiBzdHJ1Y3QgZmllbGRzX3QgewogICAgIGpmaWVsZElEICBzdXJmYWNlVGV4dHVyZTsKQEAgLTc0LDYgKzc1LDEyIEBACiAgICAgcmV0dXJuIHN1cmZhY2VUZXh0dXJlQ2xpZW50OwogfQogCitib29sIGFuZHJvaWRfU3VyZmFjZVRleHR1cmVfaXNJbnN0YW5jZU9mKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgamNsYXNzIHN1cmZhY2VUZXh0dXJlQ2xhc3MgPSBlbnYtPkZpbmRDbGFzcyhrU3VyZmFjZVRleHR1cmVDbGFzc1BhdGhOYW1lKTsKKyAgICByZXR1cm4gZW52LT5Jc0luc3RhbmNlT2YodGhpeiwgc3VyZmFjZVRleHR1cmVDbGFzcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgSk5JU3VyZmFjZVRleHR1cmVDb250ZXh0IDogcHVibGljIFN1cmZhY2VUZXh0dXJlOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyCkBAIC04NCw2ICs5MSw4IEBACiAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKTsKIAogcHJpdmF0ZToKKyAgICBzdGF0aWMgSk5JRW52KiBnZXRKTklFbnYoKTsKKwogICAgIGpvYmplY3QgbVdlYWtUaGl6OwogICAgIGpjbGFzcyBtQ2xheno7CiB9OwpAQCAtOTQsMTcgKzEwMywzNyBAQAogICAgIG1DbGF6eigoamNsYXNzKWVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KSkKIHt9CiAKK0pOSUVudiogSk5JU3VyZmFjZVRleHR1cmVDb250ZXh0OjpnZXRKTklFbnYoKSB7CisgICAgSk5JRW52KiBlbnY7CisgICAgSmF2YVZNQXR0YWNoQXJncyBhcmdzID0ge0pOSV9WRVJTSU9OXzFfNCwgTlVMTCwgTlVMTH07CisgICAgSmF2YVZNKiB2bSA9IEFuZHJvaWRSdW50aW1lOjpnZXRKYXZhVk0oKTsKKyAgICBpbnQgcmVzdWx0ID0gdm0tPkF0dGFjaEN1cnJlbnRUaHJlYWQoJmVudiwgKHZvaWQqKSAmYXJncyk7CisgICAgaWYgKHJlc3VsdCAhPSBKTklfT0spIHsKKyAgICAgICAgTE9HRSgidGhyZWFkIGF0dGFjaCBmYWlsZWQ6ICUjeCIsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52OworfQorCiBKTklTdXJmYWNlVGV4dHVyZUNvbnRleHQ6On5KTklTdXJmYWNlVGV4dHVyZUNvbnRleHQoKQogewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1XZWFrVGhpeik7Ci0gICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUNsYXp6KTsKKyAgICBKTklFbnYqIGVudiA9IGdldEpOSUVudigpOworICAgIGlmIChlbnYgIT0gTlVMTCkgeworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtV2Vha1RoaXopOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQ2xhenopOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImxlYWtpbmcgSk5JIG9iamVjdCByZWZlcmVuY2VzIik7CisgICAgfQogfQogCiB2b2lkIEpOSVN1cmZhY2VUZXh0dXJlQ29udGV4dDo6b25GcmFtZUF2YWlsYWJsZSgpCiB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgZW52LT5DYWxsU3RhdGljVm9pZE1ldGhvZChtQ2xhenosIGZpZWxkcy5wb3N0RXZlbnQsIG1XZWFrVGhpeik7CisgICAgSk5JRW52ICplbnYgPSBnZXRKTklFbnYoKTsKKyAgICBpZiAoZW52ICE9IE5VTEwpIHsKKyAgICAgICAgZW52LT5DYWxsU3RhdGljVm9pZE1ldGhvZChtQ2xhenosIGZpZWxkcy5wb3N0RXZlbnQsIG1XZWFrVGhpeik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygib25GcmFtZUF2YWlsYWJsZSBldmVudCB3aWxsIG5vdCBwb3N0ZWQiKTsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEyMyw3ICsxNTIsNiBAQAogICAgIGlmIChmaWVsZHMucG9zdEV2ZW50ID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiY2FuJ3QgZmluZCBhbmRyb2lkL2dyYXBoaWNzL1N1cmZhY2VUZXh0dXJlLnBvc3RFdmVudEZyb21OYXRpdmUiKTsKICAgICB9Ci0KIH0KIAogc3RhdGljIHZvaWQgU3VyZmFjZVRleHR1cmVfaW5pdChKTklFbnYqIGVudiwgam9iamVjdCB0aGl6LCBqaW50IHRleE5hbWUsCkBAIC0xNTYsNiArMTg0LDEzIEBACiAgICAgU3VyZmFjZVRleHR1cmVfc2V0U3VyZmFjZVRleHR1cmUoZW52LCB0aGl6LCAwKTsKIH0KIAorc3RhdGljIHZvaWQgU3VyZmFjZVRleHR1cmVfc2V0RGVmYXVsdEJ1ZmZlclNpemUoCisgICAgICAgIEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXosIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQoreworICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlVGV4dHVyZShTdXJmYWNlVGV4dHVyZV9nZXRTdXJmYWNlVGV4dHVyZShlbnYsIHRoaXopKTsKKyAgICBzdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7Cit9CisKIHN0YXRpYyB2b2lkIFN1cmZhY2VUZXh0dXJlX3VwZGF0ZVRleEltYWdlKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopCiB7CiAgICAgc3A8U3VyZmFjZVRleHR1cmU+IHN1cmZhY2VUZXh0dXJlKFN1cmZhY2VUZXh0dXJlX2dldFN1cmZhY2VUZXh0dXJlKGVudiwgdGhpeikpOwpAQCAtMTc5LDEyICsyMTQsMTEgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jb25zdCBjaGFyKiBjb25zdCBrU3VyZmFjZVRleHR1cmVDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUiOwotCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTdXJmYWNlVGV4dHVyZU1ldGhvZHNbXSA9IHsKICAgICB7Im5hdGl2ZUNsYXNzSW5pdCIsICAgICAgICAgICIoKVYiLCAgICh2b2lkKilTdXJmYWNlVGV4dHVyZV9jbGFzc0luaXQgfSwKICAgICB7Im5hdGl2ZUluaXQiLCAgICAgICAgICAgICAgICIoSUxqYXZhL2xhbmcvT2JqZWN0OylWIiwgKHZvaWQqKVN1cmZhY2VUZXh0dXJlX2luaXQgfSwKICAgICB7Im5hdGl2ZUZpbmFsaXplIiwgICAgICAgICAgICIoKVYiLCAgICh2b2lkKilTdXJmYWNlVGV4dHVyZV9maW5hbGl6ZSB9LAorICAgIHsibmF0aXZlU2V0RGVmYXVsdEJ1ZmZlclNpemUiLCAiKElJKVYiLCAodm9pZCopU3VyZmFjZVRleHR1cmVfc2V0RGVmYXVsdEJ1ZmZlclNpemUgfSwKICAgICB7Im5hdGl2ZVVwZGF0ZVRleEltYWdlIiwgICAgICIoKVYiLCAgICh2b2lkKilTdXJmYWNlVGV4dHVyZV91cGRhdGVUZXhJbWFnZSB9LAogICAgIHsibmF0aXZlR2V0VHJhbnNmb3JtTWF0cml4IiwgIihbRilWIiwgKHZvaWQqKVN1cmZhY2VUZXh0dXJlX2dldFRyYW5zZm9ybU1hdHJpeCB9LAogICAgIHsibmF0aXZlR2V0VGltZXN0YW1wIiwgICAgICAgIigpSiIsICAgKHZvaWQqKVN1cmZhY2VUZXh0dXJlX2dldFRpbWVzdGFtcCB9CmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwIGIvY29yZS9qbmkvYW5kcm9pZC9ncmFwaGljcy9UZXh0TGF5b3V0LmNwcAppbmRleCA0NmU2YzJiLi43ZTg5YTM3IDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkL2dyYXBoaWNzL1RleHRMYXlvdXQuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWQvZ3JhcGhpY3MvVGV4dExheW91dC5jcHAKQEAgLTI1NCwyMSArMjU0LDIxIEBACiB2b2lkIFRleHRMYXlvdXQ6OmdldFRleHRSdW5BZHZhbmNlcyhTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLCBqaW50IHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBjb3VudCwgamludCBjb250ZXh0Q291bnQsIGppbnQgZGlyRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZmxvYXQqIHJlc3VsdEFkdmFuY2VzLCBqZmxvYXQmIHJlc3VsdFRvdGFsQWR2YW5jZSkgeworICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZTsKICNpZiBVU0VfVEVYVF9MQVlPVVRfQ0FDSEUKICAgICAvLyBSZXR1cm4gYWR2YW5jZXMgZnJvbSB0aGUgY2FjaGUuIENvbXB1dGUgdGhlbSBpZiBuZWVkZWQKLSAgICBzcDxUZXh0TGF5b3V0Q2FjaGVWYWx1ZT4gbGF5b3V0ID0gZ1RleHRMYXlvdXRDYWNoZS5nZXRWYWx1ZSgKKyAgICB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUoCiAgICAgICAgICAgICBwYWludCwgY2hhcnMsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBkaXJGbGFncyk7Ci0gICAgaWYgKGxheW91dCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChyZXN1bHRBZHZhbmNlcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtZW1jcHkocmVzdWx0QWR2YW5jZXMsIGxheW91dC0+Z2V0QWR2YW5jZXMoKSwgbGF5b3V0LT5nZXRBZHZhbmNlc0NvdW50KCkgKiBzaXplb2YoamZsb2F0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0VG90YWxBZHZhbmNlID0gbGF5b3V0LT5nZXRUb3RhbEFkdmFuY2UoKTsKLSAgICB9CiAjZWxzZQotICAgIC8vIENvbXB1dGUgYWR2YW5jZXMgYW5kIHJldHVybiB0aGVtCi0gICAgVGV4dExheW91dENhY2hlVmFsdWU6OmNvbXB1dGVWYWx1ZXNXaXRoSGFyZmJ1enoocGFpbnQsIGNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwKLSAgICAgICAgICAgIGRpckZsYWdzLCByZXN1bHRBZHZhbmNlcywgJnJlc3VsdFRvdGFsQWR2YW5jZSwgTlVMTCwgTlVMTCApOworICAgIHZhbHVlID0gbmV3IFRleHRMYXlvdXRDYWNoZVZhbHVlKCk7CisgICAgdmFsdWUtPmNvbXB1dGVWYWx1ZXMocGFpbnQsIGNoYXJzLCBzdGFydCwgY291bnQsIGNvbnRleHRDb3VudCwgZGlyRmxhZ3MpOwogI2VuZGlmCisgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHJlc3VsdEFkdmFuY2VzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbWNweShyZXN1bHRBZHZhbmNlcywgdmFsdWUtPmdldEFkdmFuY2VzKCksIHZhbHVlLT5nZXRBZHZhbmNlc0NvdW50KCkgKiBzaXplb2YoamZsb2F0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0VG90YWxBZHZhbmNlID0gdmFsdWUtPmdldFRvdGFsQWR2YW5jZSgpOworICAgIH0KIH0KIAogdm9pZCBUZXh0TGF5b3V0OjpnZXRUZXh0UnVuQWR2YW5jZXNIQihTa1BhaW50KiBwYWludCwgY29uc3QgamNoYXIqIGNoYXJzLCBqaW50IHN0YXJ0LApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9hcHBfYmFja3VwX0Z1bGxCYWNrdXAuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9hcHBfYmFja3VwX0Z1bGxCYWNrdXAuY3BwCmluZGV4IGVjZmU1ZmYuLmIzNmZhM2UgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfYXBwX2JhY2t1cF9GdWxsQmFja3VwLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX2FwcF9iYWNrdXBfRnVsbEJhY2t1cC5jcHAKQEAgLTczLDYgKzczLDggQEAKIHN0YXRpYyBpbnQgYmFja3VwVG9UYXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpzdHJpbmcgcGFja2FnZU5hbWVPYmosCiAgICAgICAgIGpzdHJpbmcgZG9tYWluT2JqLCBqc3RyaW5nIGxpbmtkb21haW4sCiAgICAgICAgIGpzdHJpbmcgcm9vdHBhdGhPYmosIGpzdHJpbmcgcGF0aE9iaiwgam9iamVjdCBkYXRhT3V0cHV0T2JqKSB7CisgICAgaW50IHJldDsKKwogICAgIC8vIEV4dHJhY3QgdGhlIHZhcmlvdXMgc3RyaW5ncywgYWxsb3dpbmcgZm9yIG51bGwgb2JqZWN0IHBvaW50ZXJzCiAgICAgY29uc3QgY2hhciogcGFja2FnZW5hbWVjaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocGFja2FnZU5hbWVPYmosIE5VTEwpOwogICAgIGNvbnN0IGNoYXIqIHJvb3RjaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocm9vdHBhdGhPYmosIE5VTEwpOwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF9tZWRpYV9BdWRpb1N5c3RlbS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvU3lzdGVtLmNwcAppbmRleCAyNDZjMGU1Li4wYzUxMDFmIDEwMDY0NAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvU3lzdGVtLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX21lZGlhX0F1ZGlvU3lzdGVtLmNwcApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX25mY19OZGVmTWVzc2FnZS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX25mY19OZGVmTWVzc2FnZS5jcHAKaW5kZXggZDliNjRhYS4uNDEwOTljYiAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9uZmNfTmRlZk1lc3NhZ2UuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfbmZjX05kZWZNZXNzYWdlLmNwcApAQCAtMTAyLDYgKzEwMiwxOSBAQAogICAgICAgICB9CiAgICAgICAgIFRSQUNFKCJwaEZyaU5mY19OZGVmUmVjb3JkX1BhcnNlKCkgcmV0dXJuZWQgMHglMDR4Iiwgc3RhdHVzKTsKIAorICAgICAgICAvLyBXZSBkb24ndCBleGFjdGx5IGtub3cgd2hhdCAqaXMqIGEgdmFsaWQgbGVuZ3RoLCBidXQgYSBzaW1wbGUKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGhlYWRlcgorICAgICAgICAvLyBwbHVzIGFsbCBmaWVsZHMgZG9lcyBub3QgZXhjZWVkIHJhd19tc2dfc2l6ZS4gVGhlIG1pbiBsZW5ndGgKKyAgICAgICAgLy8gb2YgdGhlIGhlYWRlciBpcyAzIGJ5dGVzOiBUTkYsIFR5cGUgTGVuZ3RoLCBQYXlsb2FkIExlbmd0aAorICAgICAgICAvLyAoSUQgbGVuZ3RoIGZpZWxkIGlzIG9wdGlvbmFsISkKKyAgICAgICAgdWludDY0X3QgaW5kaWNhdGVkTXNnTGVuZ3RoID0gMyArIHJlY29yZC5UeXBlTGVuZ3RoICsgcmVjb3JkLklkTGVuZ3RoICsKKyAgICAgICAgICAgICAgICAodWludDY0X3QpcmVjb3JkLlBheWxvYWRMZW5ndGg7CisgICAgICAgIGlmIChpbmRpY2F0ZWRNc2dMZW5ndGggPgorICAgICAgICAgICAgICAgICh1aW50NjRfdClyYXdfbXNnX3NpemUpIHsKKyAgICAgICAgICAgIExPR0UoInBoRnJpX05kZWZSZWNvcmRfUGFyc2U6IGludmFsaWQgbGVuZ3RoIGZpZWxkIik7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCiAgICAgICAgIHR5cGUgPSBlLT5OZXdCeXRlQXJyYXkocmVjb3JkLlR5cGVMZW5ndGgpOwogICAgICAgICBpZiAodHlwZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBMT0dEKCJORkNfU2V0IFJlY29yZCBUeXBlIEVycm9yXG4iKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfc2VydmVyX0JsdWV0b290aFNlcnZpY2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAKaW5kZXggNWM2OTU4YS4uYWM3NTYzNCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF9zZXJ2ZXJfQmx1ZXRvb3RoU2VydmljZS5jcHAKQEAgLTI1MCwxNSArMjUwLDE1IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgc3RvcERpc2NvdmVyeU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKLSAgICBMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CitzdGF0aWMgamJvb2xlYW4gc3RvcERpc2NvdmVyeU5hdGl2ZShKTklFbnYgKmVudiwgam9iamVjdCBvYmplY3QpIHsKKyAgICBMT0dWKF9fRlVOQ1RJT05fXyk7CiAjaWZkZWYgSEFWRV9CTFVFVE9PVEgKICAgICBEQnVzTWVzc2FnZSAqbXNnID0gTlVMTDsKICAgICBEQnVzTWVzc2FnZSAqcmVwbHkgPSBOVUxMOwogICAgIERCdXNFcnJvciBlcnI7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBqc3RyaW5nIHJldDsKICAgICBuYXRpdmVfZGF0YV90ICpuYXQ7CisgICAgamJvb2xlYW4gcmV0ID0gSk5JX0ZBTFNFOwogCiAgICAgZGJ1c19lcnJvcl9pbml0KCZlcnIpOwogCkBAIC0yODgsMTEgKzI4OCwxNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HX0FORF9GUkVFX0RCVVNfRVJST1JfV0lUSF9NU0coJmVyciwgbXNnKTsKICAgICAgICAgfQorICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCisgICAgcmV0ID0gSk5JX1RSVUU7CiBkb25lOgogICAgIGlmIChtc2cpIGRidXNfbWVzc2FnZV91bnJlZihtc2cpOwogICAgIGlmIChyZXBseSkgZGJ1c19tZXNzYWdlX3VucmVmKHJlcGx5KTsKKyAgICByZXR1cm4gcmV0OworI2Vsc2UKKyAgICByZXR1cm4gSk5JX0ZBTFNFOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9Qcm9jZXNzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9Qcm9jZXNzLmNwcAppbmRleCBlNWMyODQ4OS4uMDk2MGIyNSAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF91dGlsX1Byb2Nlc3MuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdXRpbF9Qcm9jZXNzLmNwcApAQCAtMzgsMTggKzM4LDcgQEAKICNpbmNsdWRlIDxncnAuaD4KICNpbmNsdWRlIDxwd2QuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogZGVza3RvcCBMaW51eCBuZWVkcyBhIGxpdHRsZSBoZWxwIHdpdGggZ2V0dGlkKCkgKi8KLSNpZiBkZWZpbmVkKEhBVkVfR0VUVElEKSAmJiAhZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0jZGVmaW5lIF9fS0VSTkVMX18KLSMgaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaWZkZWYgX3N5c2NhbGwwCi1fc3lzY2FsbDAocGlkX3QsZ2V0dGlkKQotI2Vsc2UKLXBpZF90IGdldHRpZCgpIHsgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpO30KLSNlbmRpZgotI3VuZGVmIF9fS0VSTkVMX18KLSNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjZGVmaW5lIFBPTElDWV9ERUJVRyAwCiAjZGVmaW5lIEdVQVJEX1RIUkVBRF9QUklPUklUWSAwCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzLmNwcCBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCmluZGV4IGU1MzljZDIuLmUzMDFlNDQgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfdmlld19HTEVTMjBDYW52YXMuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NKTkkuaCIKICNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvSk5JSGVscC5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1N1cmZhY2VUZXh0dXJlLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVzb3VyY2VUeXBlcy5oPgogCiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+CkBAIC00Miw3ICs0Myw3IEBACiAjaW5jbHVkZSA8U2tpYUNvbG9yRmlsdGVyLmg+CiAjaW5jbHVkZSA8UmVjdC5oPgogCi0jaW5jbHVkZSAiVGV4dExheW91dC5oIgorI2luY2x1ZGUgPFRleHRMYXlvdXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC05MSwxMSArOTIsMjkgQEAKICAgICBlZ2xTdXJmYWNlQXR0cmliKGRpc3BsYXksIHN1cmZhY2UsIEVHTF9TV0FQX0JFSEFWSU9SLCBFR0xfQlVGRkVSX1BSRVNFUlZFRCk7CiAKICAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOwotICAgIFJFTkRFUkVSX0xPR0QoIkNvdWxkIG5vdCBlbmFibGUgYnVmZmVyIHByZXNlcnZlZCBzd2FwIGJlaGF2aW9yICgleCkiLCBlcnJvcik7CisgICAgaWYgKGVycm9yICE9IEVHTF9TVUNDRVNTKSB7CisgICAgICAgIFJFTkRFUkVSX0xPR0QoIkNvdWxkIG5vdCBlbmFibGUgYnVmZmVyIHByZXNlcnZlZCBzd2FwIGJlaGF2aW9yICgleCkiLCBlcnJvcik7CisgICAgfQogCiAgICAgcmV0dXJuIGVycm9yID09IEVHTF9TVUNDRVNTOwogfQogCitzdGF0aWMgamJvb2xlYW4gYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19pc0JhY2tCdWZmZXJQcmVzZXJ2ZWQoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopIHsKKyAgICBFR0xEaXNwbGF5IGRpc3BsYXkgPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpOworICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKyAgICBFR0xpbnQgdmFsdWU7CisKKyAgICBlZ2xHZXRFcnJvcigpOworICAgIGVnbFF1ZXJ5U3VyZmFjZShkaXNwbGF5LCBzdXJmYWNlLCBFR0xfU1dBUF9CRUhBVklPUiwgJnZhbHVlKTsKKworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgaWYgKGVycm9yICE9IEVHTF9TVUNDRVNTKSB7CisgICAgICAgIFJFTkRFUkVSX0xPR0QoIkNvdWxkIG5vdCBxdWVyeSBidWZmZXIgcHJlc2VydmVkIHN3YXAgYmVoYXZpb3IgKCV4KSIsIGVycm9yKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3IgPT0gRUdMX1NVQ0NFU1MgJiYgdmFsdWUgPT0gRUdMX0JVRkZFUl9QUkVTRVJWRUQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIENvbnN0cnVjdG9ycwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDE5LDE5ICs0MzgsMjUgQEAKIAogc3RhdGljIHZvaWQgcmVuZGVyVGV4dChPcGVuR0xSZW5kZXJlciogcmVuZGVyZXIsIGNvbnN0IGpjaGFyKiB0ZXh0LCBpbnQgY291bnQsCiAgICAgICAgIGpmbG9hdCB4LCBqZmxvYXQgeSwgaW50IGZsYWdzLCBTa1BhaW50KiBwYWludCkgewotI2lmIDAgLy8gVE9ETzogcmVwbGFjZSAiMCIgYnkgIlJUTF9VU0VfSEFSRkJVWloiIHdoZW4gcmVuZGVyZXItPmRyYXdHbHlwaHMoKSBpcyBpbXBsZW1lbnRlZAotICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUoCi0gICAgICAgICAgICBwYWludCwgdGV4dCwgMCwgY291bnQsIGNvdW50LCBmbGFncyk7CisjaWYgUlRMX1VTRV9IQVJGQlVaWgorICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZTsKKyNpZiBVU0VfVEVYVF9MQVlPVVRfQ0FDSEUKKyAgICB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUocGFpbnQsIHRleHQsIDAsIGNvdW50LCBjb3VudCwgZmxhZ3MpOwogICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIkNhbm5vdCBnZXQgVGV4dExheW91dENhY2hlIHZhbHVlIik7CiAgICAgICAgIHJldHVybiA7CiAgICAgfQorI2Vsc2UKKyAgICB2YWx1ZSA9IG5ldyBUZXh0TGF5b3V0Q2FjaGVWYWx1ZSgpOworICAgIHZhbHVlLT5jb21wdXRlVmFsdWVzKHBhaW50LCB0ZXh0LCAwLCBjb3VudCwgY291bnQsIGZsYWdzKTsKKyNlbmRpZgogI2lmIERFQlVHX0dMWVBIUwogICAgIGxvZ0dseXBocyh2YWx1ZSk7CiAjZW5kaWYKICAgICBjb25zdCBqY2hhciogZ2x5cGhBcnJheSA9IHZhbHVlLT5nZXRHbHlwaHMoKTsKICAgICBpbnQgZ2x5cGhDb3VudCA9IHZhbHVlLT5nZXRHbHlwaHNDb3VudCgpOwotICAgIHJlbmRlcmVyLT5kcmF3R2x5cGhzKChjb25zdCBjaGFyKikgZ2x5cGhBcnJheSwgMCwgZ2x5cGhDb3VudCA8PCAxLCB4LCB5LCBwYWludCk7CisgICAgaW50IGJ5dGVzQ291bnQgPSBnbHlwaENvdW50ICogc2l6ZW9mKGpjaGFyKTsKKyAgICByZW5kZXJlci0+ZHJhd1RleHQoKGNvbnN0IGNoYXIqKSBnbHlwaEFycmF5LCBieXRlc0NvdW50LCBnbHlwaENvdW50LCB4LCB5LCBwYWludCk7CiAjZWxzZQogICAgIGNvbnN0IGpjaGFyICp3b3JrVGV4dDsKICAgICBqY2hhciogYnVmZmVyID0gTlVMTDsKQEAgLTQ0NiwxOSArNDcxLDI1IEBACiBzdGF0aWMgdm9pZCByZW5kZXJUZXh0UnVuKE9wZW5HTFJlbmRlcmVyKiByZW5kZXJlciwgY29uc3QgamNoYXIqIHRleHQsCiAgICAgICAgIGppbnQgc3RhcnQsIGppbnQgY291bnQsIGppbnQgY29udGV4dENvdW50LCBqZmxvYXQgeCwgamZsb2F0IHksCiAgICAgICAgIGludCBmbGFncywgU2tQYWludCogcGFpbnQpIHsKLSNpZiAwIC8vIFRPRE86IHJlcGxhY2UgIjAiIGJ5ICJSVExfVVNFX0hBUkZCVVpaIiB3aGVuIHJlbmRlcmVyLT5kcmF3R2x5cGhzKCkgaXMgaW1wbGVtZW50ZWQKLSAgICBzcDxUZXh0TGF5b3V0Q2FjaGVWYWx1ZT4gdmFsdWUgPSBnVGV4dExheW91dENhY2hlLmdldFZhbHVlKAotICAgICAgICAgICAgcGFpbnQsIHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncyk7CisjaWYgUlRMX1VTRV9IQVJGQlVaWgorICAgIHNwPFRleHRMYXlvdXRDYWNoZVZhbHVlPiB2YWx1ZTsKKyNpZiBVU0VfVEVYVF9MQVlPVVRfQ0FDSEUKKyAgICB2YWx1ZSA9IGdUZXh0TGF5b3V0Q2FjaGUuZ2V0VmFsdWUocGFpbnQsIHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncyk7CiAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgTE9HRSgiQ2Fubm90IGdldCBUZXh0TGF5b3V0Q2FjaGUgdmFsdWUiKTsKICAgICAgICAgcmV0dXJuIDsKICAgICB9CisjZWxzZQorICAgIHZhbHVlID0gbmV3IFRleHRMYXlvdXRDYWNoZVZhbHVlKCk7CisgICAgdmFsdWUtPmNvbXB1dGVWYWx1ZXMocGFpbnQsIHRleHQsIHN0YXJ0LCBjb3VudCwgY29udGV4dENvdW50LCBmbGFncyk7CisjZW5kaWYKICNpZiBERUJVR19HTFlQSFMKICAgICBsb2dHbHlwaHModmFsdWUpOwogI2VuZGlmCiAgICAgY29uc3QgamNoYXIqIGdseXBoQXJyYXkgPSB2YWx1ZS0+Z2V0R2x5cGhzKCk7CiAgICAgaW50IGdseXBoQ291bnQgPSB2YWx1ZS0+Z2V0R2x5cGhzQ291bnQoKTsKLSAgICByZW5kZXJlci0+ZHJhd0dseXBocygoY29uc3QgY2hhciopIGdseXBoQXJyYXksIDAsIGdseXBoQ291bnQgPDwgMSwgeCwgeSwgcGFpbnQpOworICAgIGludCBieXRlc0NvdW50ID0gZ2x5cGhDb3VudCAqIHNpemVvZihqY2hhcik7CisgICAgcmVuZGVyZXItPmRyYXdUZXh0KChjb25zdCBjaGFyKikgZ2x5cGhBcnJheSwgYnl0ZXNDb3VudCwgZ2x5cGhDb3VudCwgeCwgeSwgcGFpbnQpOwogI2Vsc2UKICAgICB1aW50OF90IHJ0bCA9IGZsYWdzICYgMHgxOwogICAgIGlmIChydGwpIHsKQEAgLTYxNCwxMSArNjQ1LDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfdXBkYXRlVGV4dHVyZUxheWVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAotICAgICAgICBMYXllciogbGF5ZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0LCBTdXJmYWNlVGV4dHVyZSogc3VyZmFjZSkgeworICAgICAgICBMYXllciogbGF5ZXIsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0LCBqb2JqZWN0IHN1cmZhY2UpIHsKICAgICBmbG9hdCB0cmFuc2Zvcm1bMTZdOwotICAgIHN1cmZhY2UtPnVwZGF0ZVRleEltYWdlKCk7Ci0gICAgc3VyZmFjZS0+Z2V0VHJhbnNmb3JtTWF0cml4KHRyYW5zZm9ybSk7Ci0gICAgR0xlbnVtIHJlbmRlclRhcmdldCA9IHN1cmZhY2UtPmdldEN1cnJlbnRUZXh0dXJlVGFyZ2V0KCk7CisgICAgc3A8U3VyZmFjZVRleHR1cmU+IHN1cmZhY2VUZXh0dXJlKFN1cmZhY2VUZXh0dXJlX2dldFN1cmZhY2VUZXh0dXJlKGVudiwgc3VyZmFjZSkpOworCisgICAgc3VyZmFjZVRleHR1cmUtPnVwZGF0ZVRleEltYWdlKCk7CisgICAgc3VyZmFjZVRleHR1cmUtPmdldFRyYW5zZm9ybU1hdHJpeCh0cmFuc2Zvcm0pOworICAgIEdMZW51bSByZW5kZXJUYXJnZXQgPSBzdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudFRleHR1cmVUYXJnZXQoKTsKIAogICAgIExheWVyUmVuZGVyZXI6OnVwZGF0ZVRleHR1cmVMYXllcihsYXllciwgd2lkdGgsIGhlaWdodCwgcmVuZGVyVGFyZ2V0LCB0cmFuc2Zvcm0pOwogfQpAQCAtNjM3LDYgKzY3MCwxMSBAQAogICAgIHJlbmRlcmVyLT5kcmF3TGF5ZXIobGF5ZXIsIHgsIHksIHBhaW50KTsKIH0KIAorc3RhdGljIGpib29sZWFuIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfY29weUxheWVyKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LAorICAgICAgICBMYXllciogbGF5ZXIsIFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICByZXR1cm4gTGF5ZXJSZW5kZXJlcjo6Y29weUxheWVyKGxheWVyLCBiaXRtYXApOworfQorCiAjZW5kaWYgLy8gVVNFX09QRU5HTF9SRU5ERVJFUgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NzQsNyArNzEyLDggQEAKICAgICB7ICJuSXNBdmFpbGFibGUiLCAgICAgICAiKClaIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQXZhaWxhYmxlIH0sCiAKICNpZmRlZiBVU0VfT1BFTkdMX1JFTkRFUkVSCi0gICAgeyAiblByZXNlcnZlQmFja0J1ZmZlciIsICIoKVoiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19wcmVzZXJ2ZUJhY2tCdWZmZXIgfSwKKyAgICB7ICJuSXNCYWNrQnVmZmVyUHJlc2VydmVkIiwgIigpWiIsICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2lzQmFja0J1ZmZlclByZXNlcnZlZCB9LAorICAgIHsgIm5QcmVzZXJ2ZUJhY2tCdWZmZXIiLCAgICAiKClaIiwgICAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcHJlc2VydmVCYWNrQnVmZmVyIH0sCiAKICAgICB7ICJuQ3JlYXRlUmVuZGVyZXIiLCAgICAiKClJIiwgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVJlbmRlcmVyIH0sCiAgICAgeyAibkRlc3Ryb3lSZW5kZXJlciIsICAgIihJKVYiLCAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95UmVuZGVyZXIgfSwKQEAgLTc1NywxMCArNzk2LDEyIEBACiAgICAgeyAibkNyZWF0ZUxheWVyIiwgICAgICAgICAgICAiKElJWltJKUkiLCAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jcmVhdGVMYXllciB9LAogICAgIHsgIm5SZXNpemVMYXllciIsICAgICAgICAgICAgIihJSUlbSSlWIiAsICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfcmVzaXplTGF5ZXIgfSwKICAgICB7ICJuQ3JlYXRlVGV4dHVyZUxheWVyIiwgICAgICIoW0kpSSIsICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX2NyZWF0ZVRleHR1cmVMYXllciB9LAotICAgIHsgIm5VcGRhdGVUZXh0dXJlTGF5ZXIiLCAgICAgIihJSUlJKVYiLCAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfdXBkYXRlVGV4dHVyZUxheWVyIH0sCisgICAgeyAiblVwZGF0ZVRleHR1cmVMYXllciIsICAgICAiKElJSUxhbmRyb2lkL2dyYXBoaWNzL1N1cmZhY2VUZXh0dXJlOylWIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfR0xFUzIwQ2FudmFzX3VwZGF0ZVRleHR1cmVMYXllciB9LAogICAgIHsgIm5EZXN0cm95TGF5ZXIiLCAgICAgICAgICAgIihJKVYiLCAgICAgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZGVzdHJveUxheWVyIH0sCiAgICAgeyAibkRlc3Ryb3lMYXllckRlZmVycmVkIiwgICAiKEkpViIsICAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19kZXN0cm95TGF5ZXJEZWZlcnJlZCB9LAogICAgIHsgIm5EcmF3TGF5ZXIiLCAgICAgICAgICAgICAgIihJSUZGSSlWIiwgICAodm9pZCopIGFuZHJvaWRfdmlld19HTEVTMjBDYW52YXNfZHJhd0xheWVyIH0sCisgICAgeyAibkNvcHlMYXllciIsICAgICAgICAgICAgICAiKElJKVoiLCAgICAgICh2b2lkKikgYW5kcm9pZF92aWV3X0dMRVMyMENhbnZhc19jb3B5TGF5ZXIgfSwKIAogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1N1cmZhY2UuY3BwCmluZGV4IGVjOGI2ZTAuLjcwYzJmN2IgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19TdXJmYWNlLmNwcAorKysgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5jcHAKQEAgLTU1LDYgKzU1LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBPdXRPZlJlc291cmNlc0V4Y2VwdGlvbiA9CiAgICAgImFuZHJvaWQvdmlldy9TdXJmYWNlJE91dE9mUmVzb3VyY2VzRXhjZXB0aW9uIjsKIAorY29uc3QgY2hhciogY29uc3Qga1N1cmZhY2VTZXNzaW9uQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvU3VyZmFjZVNlc3Npb24iOworY29uc3QgY2hhciogY29uc3Qga1N1cmZhY2VDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9TdXJmYWNlIjsKKwogc3RydWN0IHNzb190IHsKICAgICBqZmllbGRJRCBjbGllbnQ7CiB9OwpAQCAtMTgxLDYgKzE4NCwxMSBAQAogICAgIHJldHVybiBnZXRTdXJmYWNlKGVudiwgY2xhenopOwogfQogCitib29sIGFuZHJvaWRfU3VyZmFjZV9pc0luc3RhbmNlT2YoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKSB7CisgICAgamNsYXNzIHN1cmZhY2VDbGFzcyA9IGVudi0+RmluZENsYXNzKGtTdXJmYWNlQ2xhc3NQYXRoTmFtZSk7CisgICAgcmV0dXJuIGVudi0+SXNJbnN0YW5jZU9mKG9iaiwgc3VyZmFjZUNsYXNzKTsKK30KKwogc3RhdGljIHZvaWQgc2V0U3VyZmFjZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpCiB7CiAgICAgU3VyZmFjZSogY29uc3QgcCA9IChTdXJmYWNlKillbnYtPkdldEludEZpZWxkKGNsYXp6LCBzby5zdXJmYWNlKTsKQEAgLTc1OSw4ICs3NjcsNiBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jb25zdCBjaGFyKiBjb25zdCBrU3VyZmFjZVNlc3Npb25DbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9TdXJmYWNlU2Vzc2lvbiI7Ci1jb25zdCBjaGFyKiBjb25zdCBrU3VyZmFjZUNsYXNzUGF0aE5hbWUgPSAiYW5kcm9pZC92aWV3L1N1cmZhY2UiOwogc3RhdGljIHZvaWQgbmF0aXZlQ2xhc3NJbml0KEpOSUVudiogZW52LCBqY2xhc3MgY2xhenopOwogCiBzdGF0aWMgSk5JTmF0aXZlTWV0aG9kIGdTdXJmYWNlU2Vzc2lvbk1ldGhvZHNbXSA9IHsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19UZXh0dXJlVmlldy5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVGV4dHVyZVZpZXcuY3BwCmluZGV4IGM1ZDg2YzguLmIwNDZiMjMgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL2FuZHJvaWRfdmlld19UZXh0dXJlVmlldy5jcHAKKysrIGIvY29yZS9qbmkvYW5kcm9pZF92aWV3X1RleHR1cmVWaWV3LmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgImpuaS5oIgogI2luY2x1ZGUgPG5hdGl2ZWhlbHBlci9KTklIZWxwLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfZ3JhcGhpY3NfU3VyZmFjZVRleHR1cmUuaD4KIAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZS5oPgogCkBAIC0yNywxMCArMjgsMTAgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQgYW5kcm9pZF92aWV3X1RleHR1cmVWaWV3X3NldERlZmF1bHRCdWZmZXJTaXplKEpOSUVudiogZW52LCBqb2JqZWN0LAotICAgIGppbnQgc3VyZmFjZVRleHR1cmUsIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7CisgICAgam9iamVjdCBzdXJmYWNlLCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkgewogCi0gICAgc3A8U3VyZmFjZVRleHR1cmU+IHN1cmZhY2UgPSByZWludGVycHJldF9jYXN0PFN1cmZhY2VUZXh0dXJlKj4oc3VyZmFjZVRleHR1cmUpOwotICAgIHN1cmZhY2UtPnNldERlZmF1bHRCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlVGV4dHVyZShTdXJmYWNlVGV4dHVyZV9nZXRTdXJmYWNlVGV4dHVyZShlbnYsIHN1cmZhY2UpKTsKKyAgICBzdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQwLDcgKzQxLDggQEAKIGNvbnN0IGNoYXIqIGNvbnN0IGtDbGFzc1BhdGhOYW1lID0gImFuZHJvaWQvdmlldy9UZXh0dXJlVmlldyI7CiAKIHN0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKLSAgICB7ICAgIm5TZXREZWZhdWx0QnVmZmVyU2l6ZSIsICIoSUlJKVYiLCAodm9pZCopIGFuZHJvaWRfdmlld19UZXh0dXJlVmlld19zZXREZWZhdWx0QnVmZmVyU2l6ZSB9CisgICAgeyAgICJuU2V0RGVmYXVsdEJ1ZmZlclNpemUiLCAiKExhbmRyb2lkL2dyYXBoaWNzL1N1cmZhY2VUZXh0dXJlO0lJKVYiLAorICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3ZpZXdfVGV4dHVyZVZpZXdfc2V0RGVmYXVsdEJ1ZmZlclNpemUgfQogfTsKIAogaW50IHJlZ2lzdGVyX2FuZHJvaWRfdmlld19UZXh0dXJlVmlldyhKTklFbnYqIGVudikgewpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvYW5kcm9pZF92aWV3X1ZpZXdBbmNlc3Rvci5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld0FuY2VzdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMTEyNC4uMDAwMDAwMAotLS0gYS9jb3JlL2puaS9hbmRyb2lkX3ZpZXdfVmlld0FuY2VzdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxjb3JlL1NrQ2FudmFzLmg+Ci0jaW5jbHVkZSA8Y29yZS9Ta0RldmljZS5oPgotI2luY2x1ZGUgPGNvcmUvU2tQYWludC5oPgotI2luY2x1ZGUgPHV0aWxzL1NrR0xDYW52YXMuaD4KLSNpbmNsdWRlICJHcmFwaGljc0pOSS5oIgotCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSA8bmF0aXZlaGVscGVyL0pOSUhlbHAuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgaW50IGdQcmV2RHVyOwotCi1zdGF0aWMgdm9pZCBhbmRyb2lkX3ZpZXdfVmlld0FuY2VzdG9yX3Nob3dGUFMoSk5JRW52KiBlbnYsIGpvYmplY3QsIGpvYmplY3QgamNhbnZhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgZHVyKSB7Ci0gICAgTlBFX0NIRUNLX1JFVFVSTl9WT0lEKGVudiwgamNhbnZhcyk7Ci0gICAgU2tDYW52YXMqIGNhbnZhcyA9IEdyYXBoaWNzSk5JOjpnZXROYXRpdmVDYW52YXMoZW52LCBqY2FudmFzKTsKLSAgICBjb25zdCBTa0JpdG1hcCYgYm0gPSBjYW52YXMtPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpOwotICAgIGludCBoZWlnaHQgPSBibS5oZWlnaHQoKTsKLSAgICBTa1NjYWxhciBib3QgPSBTa0ludFRvU2NhbGFyKGhlaWdodCk7Ci0KLSAgICBpZiAoaGVpZ2h0IDwgMjAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTa01hdHJpeCBtOwotICAgIFNrUmVjdCAgIHI7Ci0gICAgU2tQYWludCAgcDsKLSAgICBjaGFyICAgIHN0cls0XTsKLQotICAgIGR1ciA9IChnUHJldkR1ciArIGR1cikgPj4gMTsKLSAgICBnUHJldkR1ciA9IGR1cjsKLQotICAgIGR1ciA9IDEwMDAgLyBkdXI7Ci0gICAgc3RyWzNdID0gKGNoYXIpKCcwJyArIGR1ciAlIDEwKTsgZHVyIC89IDEwOwotICAgIHN0clsyXSA9IChjaGFyKSgnMCcgKyBkdXIgJSAxMCk7IGR1ciAvPSAxMDsKLSAgICBzdHJbMV0gPSAoY2hhcikoJzAnICsgZHVyICUgMTApOyBkdXIgLz0gMTA7Ci0gICAgc3RyWzBdID0gKGNoYXIpKCcwJyArIGR1ciAlIDEwKTsKLQotICAgIG0ucmVzZXQoKTsKLSAgICByLnNldCgwLCBib3QtU2tJbnRUb1NjYWxhcigxMCksIFNrSW50VG9TY2FsYXIoMjYpLCBib3QpOwotICAgIHAuc2V0QW50aUFsaWFzKHRydWUpOwotICAgIHAuc2V0VGV4dFNpemUoU2tJbnRUb1NjYWxhcigxMCkpOwotCi0gICAgY2FudmFzLT5zYXZlKCk7Ci0gICAgY2FudmFzLT5zZXRNYXRyaXgobSk7Ci0gICAgY2FudmFzLT5jbGlwUmVjdChyLCBTa1JlZ2lvbjo6a1JlcGxhY2VfT3ApOwotICAgIHAuc2V0Q29sb3IoU0tfQ29sb3JXSElURSk7Ci0gICAgY2FudmFzLT5kcmF3UGFpbnQocCk7Ci0gICAgcC5zZXRDb2xvcihTS19Db2xvckJMQUNLKTsKLSAgICBjYW52YXMtPmRyYXdUZXh0KHN0ciwgNCwgU2tJbnRUb1NjYWxhcigxKSwgYm90IC0gU0tfU2NhbGFyMSwgcCk7Ci0gICAgY2FudmFzLT5yZXN0b3JlKCk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBjaGFyKiBjb25zdCBrQ2xhc3NQYXRoTmFtZSA9ICJhbmRyb2lkL3ZpZXcvVmlld0FuY2VzdG9yIjsKLQotc3RhdGljIEpOSU5hdGl2ZU1ldGhvZCBnTWV0aG9kc1tdID0gewotICAgIHsgICAibmF0aXZlU2hvd0ZQUyIsICIoTGFuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzO0kpViIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfdmlld19WaWV3QW5jZXN0b3Jfc2hvd0ZQUyB9Ci19OwotCi1pbnQgcmVnaXN0ZXJfYW5kcm9pZF92aWV3X1ZpZXdBbmNlc3RvcihKTklFbnYqIGVudikgewotICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwKLSAgICAgICAgICAgIGtDbGFzc1BhdGhOYW1lLCBnTWV0aG9kcywgTkVMRU0oZ01ldGhvZHMpKTsKLX0KLQotfTsKLQpkaWZmIC0tZ2l0IGEvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwuY3BwIGIvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwuY3BwCmluZGV4IGY3Nzc1MjcuLjAyOTc0ZjlhIDEwMDY0NAotLS0gYS9jb3JlL2puaS9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfRUdMSW1wbC5jcHAKKysrIGIvY29yZS9qbmkvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0VHTEltcGwuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1N1cmZhY2VUZXh0dXJlLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiAjaW5jbHVkZSA8RUdML2VnbC5oPgpAQCAtMzIzLDcgKzMyNCw3IEBACiB9CiAKIHN0YXRpYyBqaW50IGpuaV9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlVGV4dHVyZShKTklFbnYgKl9lbnYsIGpvYmplY3QgX3RoaXMsIGpvYmplY3QgZGlzcGxheSwKLSAgICAgICAgam9iamVjdCBjb25maWcsIGppbnQgbmF0aXZlX3dpbmRvdywgamludEFycmF5IGF0dHJpYl9saXN0KSB7CisgICAgICAgIGpvYmplY3QgY29uZmlnLCBqb2JqZWN0IG5hdGl2ZV93aW5kb3csIGppbnRBcnJheSBhdHRyaWJfbGlzdCkgewogICAgIGlmIChkaXNwbGF5ID09IE5VTEwgfHwgY29uZmlnID09IE5VTEwKICAgICAgICAgfHwgIXZhbGlkQXR0cmliTGlzdChfZW52LCBhdHRyaWJfbGlzdCkpIHsKICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oX2VudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLCBOVUxMKTsKQEAgLTMzOSw3ICszNDAsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgCi0gICAgc3A8U3VyZmFjZVRleHR1cmU+IHN1cmZhY2VUZXh0dXJlID0gcmVpbnRlcnByZXRfY2FzdDxTdXJmYWNlVGV4dHVyZSo+KG5hdGl2ZV93aW5kb3cpOworICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdXJmYWNlVGV4dHVyZShTdXJmYWNlVGV4dHVyZV9nZXRTdXJmYWNlVGV4dHVyZShfZW52LCBuYXRpdmVfd2luZG93KSk7CiAKICAgICB3aW5kb3cgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQoc3VyZmFjZVRleHR1cmUpOwogICAgIGlmICh3aW5kb3cgPT0gTlVMTCkKQEAgLTU0MCw3ICs1NDEsNyBAQAogeyJfZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UiLCIoIiBESVNQTEFZIENPTkZJRyAiW0kpSSIsICh2b2lkKilqbmlfZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgfSwKIHsiX2VnbENyZWF0ZVBpeG1hcFN1cmZhY2UiLCAiKCIgU1VSRkFDRSBESVNQTEFZIENPTkZJRyBPQkpFQ1QgIltJKVYiLCAodm9pZCopam5pX2VnbENyZWF0ZVBpeG1hcFN1cmZhY2UgfSwKIHsiX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2UiLCAiKCIgRElTUExBWSBDT05GSUcgT0JKRUNUICJbSSlJIiwgKHZvaWQqKWpuaV9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIH0sCi17Il9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlVGV4dHVyZSIsICIoIiBESVNQTEFZIENPTkZJRyAiSVtJKUkiLCAodm9pZCopam5pX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2VUZXh0dXJlIH0sCit7Il9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlVGV4dHVyZSIsICIoIiBESVNQTEFZIENPTkZJRyBPQkpFQ1QgIltJKUkiLCAodm9pZCopam5pX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2VUZXh0dXJlIH0sCiB7ImVnbERlc3Ryb3lDb250ZXh0IiwgICAgICAiKCIgRElTUExBWSBDT05URVhUICIpWiIsICh2b2lkKilqbmlfZWdsRGVzdHJveUNvbnRleHQgfSwKIHsiZWdsRGVzdHJveVN1cmZhY2UiLCAgICAgICIoIiBESVNQTEFZIFNVUkZBQ0UgIilaIiwgKHZvaWQqKWpuaV9lZ2xEZXN0cm95U3VyZmFjZSB9LAogeyJlZ2xNYWtlQ3VycmVudCIsICAgICAgICAgIigiIERJU1BMQVkgU1VSRkFDRSBTVVJGQUNFIENPTlRFWFQiKVoiLCAodm9pZCopam5pX2VnbE1ha2VDdXJyZW50IH0sCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS9yZXMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA0MTk1NzhjLi40NzkwMmE4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL2NvcmUvcmVzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTkxLDYgKzkxLDggQEAKICAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudXNiLmFjdGlvbi5VU0JfREVWSUNFX0FUVEFDSEVEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS51c2IuYWN0aW9uLlVTQl9ERVZJQ0VfREVUQUNIRUQiIC8+CiAKKyAgICA8cHJvdGVjdGVkLWJyb2FkY2FzdCBhbmRyb2lkOm5hbWU9ImFuZHJvaWQubmV0LnZwbi5hY3Rpb24uUkVWT0tFRCIgLz4KKwogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5uZmMuYWN0aW9uLkxMQ1BfTElOS19TVEFURV9DSEFOR0VEIiAvPgogICAgIDxwcm90ZWN0ZWQtYnJvYWRjYXN0IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQubmZjX2V4dHJhcy5hY3Rpb24uUkZfRklFTERfT05fREVURUNURUQiIC8+CiAgICAgPHByb3RlY3RlZC1icm9hZGNhc3QgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC5uZmNfZXh0cmFzLmFjdGlvbi5SRl9GSUVMRF9PRkZfREVURUNURUQiIC8+CkBAIC0xNTksNiArMTYxLDE1IEBACiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9yZWNlaXZlTW1zIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3JlY2VpdmVNbXMiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWNlaXZlIGVtZXJnZW5jeSBjZWxsIGJyb2FkY2FzdCBtZXNzYWdlcywKKyAgICAgICAgIHRvIHJlY29yZCBvciBkaXNwbGF5IHRoZW0gdG8gdGhlIHVzZXIuIFJlc2VydmVkIGZvciBzeXN0ZW0gYXBwcy4KKyAgICAgICAgIEBoaWRlIFBlbmRpbmcgQVBJIGNvdW5jaWwgYXBwcm92YWwgLS0+CisgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVDRUlWRV9FTUVSR0VOQ1lfQlJPQURDQVNUIgorICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb25Hcm91cD0iYW5kcm9pZC5wZXJtaXNzaW9uLWdyb3VwLk1FU1NBR0VTIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9yZWNlaXZlRW1lcmdlbmN5QnJvYWRjYXN0IgorICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3JlY2VpdmVFbWVyZ2VuY3lCcm9hZGNhc3QiIC8+CisKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIFNNUyBtZXNzYWdlcy4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9TTVMiCiAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuTUVTU0FHRVMiCkBAIC0yMDgsNiArMjE5LDIyIEBACiAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl93cml0ZUNvbnRhY3RzIgogICAgICAgICBhbmRyb2lkOmRlc2NyaXB0aW9uPSJAc3RyaW5nL3Blcm1kZXNjX3dyaXRlQ29udGFjdHMiIC8+CiAKKworICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIHVzZXIncyBwZXJzb25hbCBwcm9maWxlIGRhdGEuIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfUFJPRklMRSIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0iZGFuZ2Vyb3VzIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcmVhZFByb2ZpbGUiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcmVhZFByb2ZpbGUiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byB3cml0ZSAoYnV0IG5vdCByZWFkKSB0aGUgdXNlcidzCisgICAgICAgICBwZXJzb25hbCBwcm9maWxlIGRhdGEuIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1BST0ZJTEUiCisgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbkdyb3VwPSJhbmRyb2lkLnBlcm1pc3Npb24tZ3JvdXAuUEVSU09OQUxfSU5GTyIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9ImRhbmdlcm91cyIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX3dyaXRlUHJvZmlsZSIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY193cml0ZVByb2ZpbGUiIC8+CisKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgY2FsZW5kYXIgZGF0YS4gLS0+CiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9DQUxFTkRBUiIKICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgpAQCAtNjc3LDYgKzcwNCwxNCBAQAogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfZHVtcCIKICAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19kdW1wIiAvPgogCisgICAgPCEtLSBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmV0cmlldmUgdGhlIGNvbnRlbnQgb2YgdGhlIGFjdGl2ZSB3aW5kb3cKKyAgICAgICAgIEFuIGFjdGl2ZSB3aW5kb3cgaXMgdGhlIHdpbmRvdyB0aGF0IGhhcyBmaXJlZCBhbiBhY2Nlc3NpYmlsaXR5IGV2ZW50LiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRVRSSUVWRV9XSU5ET1dfQ09OVEVOVCIKKyAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uR3JvdXA9ImFuZHJvaWQucGVybWlzc2lvbi1ncm91cC5QRVJTT05BTF9JTkZPIgorICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcGVybWxhYl9yZXRyaWV2ZV93aW5kb3dfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19yZXRyaWV2ZV93aW5kb3dfY29udGVudCIgLz4KKwogICAgIDwhLS0gQWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIG9wZW4gd2luZG93cyB1c2luZyB0aGUgdHlwZQogICAgICAgICAge0BsaW5rIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyNUWVBFX1NZU1RFTV9BTEVSVH0sCiAgICAgICAgICBzaG93biBvbiB0b3Agb2YgYWxsIG90aGVyIGFwcGxpY2F0aW9ucy4gIFZlcnkgZmV3IGFwcGxpY2F0aW9ucwpAQCAtMTA5OCw2ICsxMTMzLDEzIEBACiAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2Nfc2V0T3JpZW50YXRpb24iCiAgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CiAKKyAgICA8IS0tIEFsbG93cyBsb3ctbGV2ZWwgYWNjZXNzIHRvIHNldHRpbmcgdGhlIHBvaW50ZXIgc3BlZWQuCisgICAgICAgICBOb3QgZm9yIHVzZSBieSBub3JtYWwgYXBwbGljYXRpb25zLiAtLT4KKyAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5TRVRfUE9JTlRFUl9TUEVFRCIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX3NldFBvaW50ZXJTcGVlZCIKKyAgICAgICAgYW5kcm9pZDpkZXNjcmlwdGlvbj0iQHN0cmluZy9wZXJtZGVzY19zZXRQb2ludGVyU3BlZWQiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKICAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBpbnN0YWxsIHBhY2thZ2VzLiAtLT4KICAgICA8cGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlNUQUxMX1BBQ0tBR0VTIgogICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfaW5zdGFsbFBhY2thZ2VzIgpAQCAtMTMzNyw2ICsxMzc5LDE5IEBACiAgICAgPHBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ1JZUFRfS0VFUEVSIgogICAgICAgICBhbmRyb2lkOnByb3RlY3Rpb25MZXZlbD0ic2lnbmF0dXJlT3JTeXN0ZW0iIC8+CiAKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIGhpc3RvcmljYWwgbmV0d29yayB1c2FnZSBmb3IKKyAgICAgICAgIHNwZWNpZmljIG5ldHdvcmtzIGFuZCBhcHBsaWNhdGlvbnMuIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfTkVUV09SS19VU0FHRV9ISVNUT1JZIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Blcm1sYWJfcmVhZE5ldHdvcmtVc2FnZUhpc3RvcnkiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfcmVhZE5ldHdvcmtVc2FnZUhpc3RvcnkiCisgICAgICAgIGFuZHJvaWQ6cHJvdGVjdGlvbkxldmVsPSJzaWduYXR1cmUiIC8+CisKKyAgICA8IS0tIEFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBtYW5hZ2UgbmV0d29yayBwb2xpY2llcyAoc3VjaCBhcyB3YXJuaW5nIGFuZCBkaXNhYmxlCisgICAgICAgICBsaW1pdHMpIGFuZCB0byBkZWZpbmUgYXBwbGljYXRpb24tc3BlY2lmaWMgcnVsZXMuIEBoaWRlIC0tPgorICAgIDxwZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9ORVRXT1JLX1BPTElDWSIKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9wZXJtbGFiX21hbmFnZU5ldHdvcmtQb2xpY3kiCisgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvcGVybWRlc2NfbWFuYWdlTmV0d29ya1BvbGljeSIKKyAgICAgICAgYW5kcm9pZDpwcm90ZWN0aW9uTGV2ZWw9InNpZ25hdHVyZSIgLz4KIAogICAgIDwhLS0gQzJETSBwZXJtaXNzaW9uLiAKICAgICAgICAgIEBoaWRlIFVzZWQgaW50ZXJuYWxseS4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQyN2NmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja19kZWZhdWx0X2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQyN2NmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19ib3R0b21faG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKaW5kZXggMzJjMmM5Ny4uNTIyNWE4MSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IGYxY2JhMDYuLjJlN2U5NzMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19ib3R0b21faG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfYm90dG9tX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sb19kYXJrLjkucG5nCmluZGV4IDA4YjE2M2EuLjQ1OTE2MjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19mdWxsX2hvbG9fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfZnVsbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19mdWxsX2hvbG9fbGlnaHQuOS5wbmcKaW5kZXggNzdlYzAxNy4uOWNmMTgyNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX2Z1bGxfaG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfZnVsbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKaW5kZXggMDI5ZjE4Ni4uYTQ3ZWY0MCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IGFiYWVhMmQuLjliNTBjNzMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvZGlhbG9nX3RvcF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZwppbmRleCBhY2JkN2NmLi5hMGQzNmRlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKaW5kZXggODk4MjM5Ni4uODA1Yjk1NjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja19pZGxlX2FsYXJtLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKaW5kZXggNmI0ZjY2ZC4uM2NhZGFmZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja19pZGxlX2FsYXJtLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2FjdGl2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9hY3RpdmUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODk5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9hY3RpdmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2ZvY3VzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfZm9jdXNlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiYThmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTk3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9kb3duLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9kb3duLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA4NDRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX2Rvd24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9sZWZ0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9sZWZ0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA4YWZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX2xlZnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9yaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fcmlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDg5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fcmlnaHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl91cC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fdXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmE4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9kZWNsaW5lX2FjdGl2YXRlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2Njc2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9hY3RpdmF0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9mb2N1c2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWRmYWNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDM5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDQ5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmN2FlOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwMmQzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fZm9yZ290cGFzc3dvcmRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9mb3Jnb3RwYXNzd29yZF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2JlMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9mb3Jnb3RwYXNzd29yZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9oYW5kbGVfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFhODdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9oYW5kbGVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5faGFuZGxlX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODNmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fbG9ja19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiZjYyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fbG9ja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX291dGVycmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX291dGVycmluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5NGJjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fb3V0ZXJyaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfYWN0aXZhdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U0OTgwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fc2lsZW50X2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYWZiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjUyN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9hY3RpdmF0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjAxYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fZm9jdXNlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRlNTU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTk5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9hY3RpdmF0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMWJkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfZm9jdXNkZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfZm9jdXNkZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiOGYwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9mb2N1c2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzNhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfYWN0aXZhdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzMzOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2xvY2tzY3JlZW5fdW5sb2NrX2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTMyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGI0NmMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTc5NDQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzQ5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9ncmVlbl91cF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjg2OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9ncmVlbl91cF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX3JlZF91cF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZGI4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX3JlZF91cF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0X2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzAxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW5faG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW5faG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxODAxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbl9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX3JlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIwYmFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX3JlZF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX2Fycm93LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfYXJyb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDE4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX2Fycm93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX2Fycm93X2ljb24ueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9hcnJvd19pY29uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU2NzZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9hcnJvd19pY29uLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cG9pbnRlci1pY29uIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmJpdG1hcD0iQGRyYXdhYmxlL3BvaW50ZXJfYXJyb3ciCisgICAgYW5kcm9pZDpob3RTcG90WD0iNiIKKyAgICBhbmRyb2lkOmhvdFNwb3RZPSI2IiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2FuY2hvci5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfYW5jaG9yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FjYTM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2FuY2hvci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2FuY2hvcl9pY29uLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9hbmNob3JfaWNvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMmI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9hbmNob3JfaWNvbi54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHBvaW50ZXItaWNvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpiaXRtYXA9IkBkcmF3YWJsZS9wb2ludGVyX3Nwb3RfYW5jaG9yIgorICAgIGFuZHJvaWQ6aG90U3BvdFg9IjMzIgorICAgIGFuZHJvaWQ6aG90U3BvdFk9IjMzIiAvPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2hvdmVyLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9ob3Zlci5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0MWFhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF9ob3Zlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2hvdmVyX2ljb24ueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X2hvdmVyX2ljb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjJhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfaG92ZXJfaWNvbi54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPHBvaW50ZXItaWNvbiB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpiaXRtYXA9IkBkcmF3YWJsZS9wb2ludGVyX3Nwb3RfaG92ZXIiCisgICAgYW5kcm9pZDpob3RTcG90WD0iMzMiCisgICAgYW5kcm9pZDpob3RTcG90WT0iMzMiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfdG91Y2gucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X3RvdWNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGE0MmExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvcG9pbnRlcl9zcG90X3RvdWNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfdG91Y2hfaWNvbi54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS9wb2ludGVyX3Nwb3RfdG91Y2hfaWNvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmZmVlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3BvaW50ZXJfc3BvdF90b3VjaF9pY29uLnhtbApAQCAtMCwwICsxLDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cG9pbnRlci1pY29uIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmJpdG1hcD0iQGRyYXdhYmxlL3BvaW50ZXJfc3BvdF90b3VjaCIKKyAgICBhbmRyb2lkOmhvdFNwb3RYPSIyNCIKKyAgICBhbmRyb2lkOmhvdFNwb3RZPSIyNCIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWhkcGkvdG9hc3RfZnJhbWUuOS5wbmcKaW5kZXggMDhiMTYzYS4uOTc2OWJiYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCmluZGV4IDdmODMwYmMuLjk3NjliYmI3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtaGRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1oZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLWxhcmdlLW5vZHBpL2RlZmF1bHRfd2FsbHBhcGVyLmpwZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYXJnZS1ub2RwaS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3Y2RiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1sYXJnZS1ub2RwaS9kZWZhdWx0X3dhbGxwYXBlci5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NvZGVfbG9ja19kZWZhdWx0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdC5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA0NWNjMjBkLi5mNTI0MzE3Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NvZGVfbG9ja19kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMTI3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdF9ob2xvLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY29kZV9sb2NrX3RvdWNoZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkLnBuZwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDQ1Y2MyMGQuLjVjZDQzNmMKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9idG5fY29kZV9sb2NrX3RvdWNoZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDExMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvYnRuX2NvZGVfbG9ja190b3VjaGVkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKaW5kZXggY2M2NjgwNC4uYTBiZDRlMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2JvdHRvbV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IGJjNzM0YzguLjEyYWJjZDIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19ib3R0b21faG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfYm90dG9tX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2Z1bGxfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2Z1bGxfaG9sb19kYXJrLjkucG5nCmluZGV4IDg2MDNlOTMuLmFkYjgxMDQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG9fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2Z1bGxfaG9sb19saWdodC45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19mdWxsX2hvbG9fbGlnaHQuOS5wbmcKaW5kZXggNjVhMzE4Yy4uZDdjNmJiZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX2Z1bGxfaG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfZnVsbF9ob2xvX2xpZ2h0LjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sb19kYXJrLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKaW5kZXggZTM5YTQ3Mi4uNDJjZmM1MiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2RhcmsuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IDY4ZjllNTcuLjlhMDhlMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2RhcmsuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZwppbmRleCAzMmM0OWYyLi41ZDg2YjJhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fZGFyay45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKaW5kZXggNjBhYThjYi4uYWQyMmY1YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja19pZGxlX2FsYXJtLnBuZwppbmRleCA5N2FjMDIzLi5iNWQzZTA5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja19pZGxlX2NoYXJnaW5nLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA0MjEwZGIyLi4yMGQ2MzIwCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja19pZGxlX2NoYXJnaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2NrX2lkbGVfbG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2NrX2lkbGVfbG9jay5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAxMDYwZjVhLi4wMjA2YWVlCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tfaWRsZV9sb2NrLnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2NrX2lkbGVfbG9jay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3MmU0YWZhLi5iYjk2NzgyCi0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja19pZGxlX2xvd19iYXR0ZXJ5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9hY3RpdmUucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfYWN0aXZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQwM2MwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfYWN0aXZlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NmU4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2Fuc3dlcl9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVlYjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fZG93bi5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fZG93bi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNjZmQxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9kb3duLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fbGVmdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fbGVmdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlZjExMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9sZWZ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fcmlnaHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3JpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjcyM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3JpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fdXAucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3VwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWFjYTRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3VwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9hY3RpdmF0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYWFlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfZm9jdXNlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyYzg0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjAyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTc5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2Nzk1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlMDYzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fZm9yZ290cGFzc3dvcmRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX3ByZXNzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9mb3Jnb3RwYXNzd29yZF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9mb3Jnb3RwYXNzd29yZF9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9oYW5kbGVfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTAzNDRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9oYW5kbGVfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5faGFuZGxlX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzZjZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fbG9ja19ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZWI5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiMmY2YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fbG9ja19wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX291dGVycmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX291dGVycmluZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MWY3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fb3V0ZXJyaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfYWN0aXZhdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJmM2ZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fc2lsZW50X2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjg4Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl9zaWxlbnRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9hY3RpdmF0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjUyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fZm9jdXNlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1OWI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmNlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9hY3RpdmF0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmM1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3RleHRfZm9jdXNkZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3RleHRfZm9jdXNkZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlNzU4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9mb2N1c2RlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3RleHRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDczMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3RleHRfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfYWN0aXZhdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ3OTkzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfYWN0aXZhdGVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2xvY2tzY3JlZW5fdW5sb2NrX2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTE0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19mb2N1c2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI1NWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbG9ja3NjcmVlbl91bmxvY2tfbm9ybWFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2RhcmsucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19kYXJrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWVjMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19kYXJrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fbGlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGY1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCmluZGV4IDBiYzg2YzMuLjdkZGViYTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXBfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDIwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwLnBuZwppbmRleCAyYWI0NTQ3Li43MjAxZTU4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX3JlZF91cC5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXBfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0Y2IzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fcmVkX3VwX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0X2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyN2NkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0X2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbl9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbl9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg2MjRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWRfaG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDUxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RvYXN0X2ZyYW1lLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWUuOS5wbmcKaW5kZXggODYwM2U5My4uMDZjZmM3MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWUuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWVfaG9sby45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS1tZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcKaW5kZXggOTExZjg2ZC4uMDZjZmM3MCAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLW1kcGkvdG9hc3RfZnJhbWVfaG9sby45LnBuZworKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUtbWRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvZGlhbG9nX21pZGRsZV9ob2xvX2xpZ2h0LjkucG5nCmluZGV4IDU1YzYwYjguLmJkYjY4MjQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9kaWFsb2dfbWlkZGxlX2hvbG9fbGlnaHQuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2RpYWxvZ19taWRkbGVfaG9sb19saWdodC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2RpYWxvZ190b3BfaG9sb19saWdodC45LnBuZwppbmRleCBkMzNkMDMzLi5hYTg0MDFkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvZGlhbG9nX3RvcF9ob2xvX2xpZ2h0LjkucG5nCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9kaWFsb2dfdG9wX2hvbG9fbGlnaHQuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja19pZGxlX2FsYXJtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODIyYTkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2FjdGl2ZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfYWN0aXZlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWRmNjJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2FjdGl2ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2ZvY3VzZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDdlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfZm9jdXNlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX25vcm1hbC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ5ZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fYW5zd2VyX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9kb3duLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fZG93bi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY1NWQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fZG93bi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9sZWZ0LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fbGVmdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxNzNjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fbGVmdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9yaWdodC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3JpZ2h0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZkYTcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl9yaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl91cC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3VwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzc5NGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fY2hldnJvbl91cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9hY3RpdmF0ZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDRjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9kZWNsaW5lX2FjdGl2YXRlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfZm9jdXNlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4YTM3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfZm9jdXNlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZGVjbGluZV9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMmEwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9kZWNsaW5lX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9ub3JtYWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWY3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9lbWVyZ2VuY3ljYWxsX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9wcmVzc2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1ZTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZm9yZ290cGFzc3dvcmRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxNzJjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX25vcm1hbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fZm9yZ290cGFzc3dvcmRfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9mb3Jnb3RwYXNzd29yZF9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmM3NjIxNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2ZvcmdvdHBhc3N3b3JkX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDRhMzMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fbG9ja19ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX2xvY2tfcHJlc3NlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9sb2NrX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjRkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9sb2NrX3ByZXNzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX291dGVycmluZy5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9vdXRlcnJpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGIyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9vdXRlcnJpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fc2lsZW50X2FjdGl2YXRlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4MTIxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9hY3RpdmF0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9mb2N1c2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkzNDcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fc2lsZW50X2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fc2lsZW50X25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NpbGVudF9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fYWN0aXZhdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWRjNzBiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9hY3RpdmF0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fZm9jdXNlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9zb3VuZG9uX2ZvY3VzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ODVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl9zb3VuZG9uX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY1Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fc291bmRvbl9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM0NTcyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9hY3RpdmF0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfZm9jdXNkZS5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl90ZXh0X2ZvY3VzZGUucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYzhhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbG9ja3NjcmVlbl90ZXh0X2ZvY3VzZGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfbm9ybWFsLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3RleHRfbm9ybWFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY1ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fdGV4dF9ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19hY3RpdmF0ZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fdW5sb2NrX2FjdGl2YXRlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwYmU5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19hY3RpdmF0ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19mb2N1c2VkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19mb2N1c2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDY3YWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fdW5sb2NrX2ZvY3VzZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19ub3JtYWwucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2xvY2tzY3JlZW5fdW5sb2NrX25vcm1hbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1M2M2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19sb2Nrc2NyZWVuX3VubG9ja19ub3JtYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdF9ob2xvLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdF9ob2xvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThhMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9kZWZhdWx0X2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW5faG9sby5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuX2hvbG8ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OTFmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkX2hvbG8ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWRfaG9sby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5MWZiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkX2hvbG8ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS90b2FzdF9mcmFtZS45LnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS90b2FzdF9mcmFtZS45LnBuZwppbmRleCA5YzBmZjQ3Li5mN2RlYmVlIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGhkcGkvdG9hc3RfZnJhbWUuOS5wbmcKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL3RvYXN0X2ZyYW1lLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhoZHBpL3RvYXN0X2ZyYW1lX2hvbG8uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkZWJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14aGRwaS90b2FzdF9mcmFtZV9ob2xvLjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljZDQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExYWEwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfbG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvaWNfbG9ja19pZGxlX2xvY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2JhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvaWNfbG9ja19pZGxlX2xvY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzODNmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2J0bl9jb2RlX2xvY2tfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjYzIwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9idG5fY29kZV9sb2NrX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9idG5fY29kZV9sb2NrX3RvdWNoZWQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2J0bl9jb2RlX2xvY2tfdG91Y2hlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjYzIwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9idG5fY29kZV9sb2NrX3RvdWNoZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2ljX2xvY2tfaWRsZV9hbGFybS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhYzAyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfYWxhcm0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2ljX2xvY2tfaWRsZV9jaGFyZ2luZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxMGRiMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfY2hhcmdpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfbG9jay5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvaWNfbG9ja19pZGxlX2xvY2sucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjBmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvaWNfbG9ja19pZGxlX2xvY2sucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2ljX2xvY2tfaWRsZV9sb3dfYmF0dGVyeS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJlNGFmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pY19sb2NrX2lkbGVfbG93X2JhdHRlcnkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX2dyZWVuX3VwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM4NmMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfZHJhZ19kaXJlY3Rpb25fZ3JlZW5fdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX2RyYWdfZGlyZWN0aW9uX3JlZF91cC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjQ1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19kcmFnX2RpcmVjdGlvbl9yZWRfdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzJkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW4ucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9ncmVlbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2NjZjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjI3MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2MmViMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2RlZmF1bHQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuLnBuZyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX2dyZWVuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2UyMjBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlLXhsYXJnZS14aGRwaS9pbmRpY2F0b3JfY29kZV9sb2NrX3BvaW50X2FyZWFfZ3JlZW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS14bGFyZ2UteGhkcGkvaW5kaWNhdG9yX2NvZGVfbG9ja19wb2ludF9hcmVhX3JlZC5wbmcgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLXhoZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NmEzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUteGxhcmdlLXhoZHBpL2luZGljYXRvcl9jb2RlX2xvY2tfcG9pbnRfYXJlYV9yZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2Fuc3dlci54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9hbnN3ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MmZjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9hbnN3ZXIueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9hY3RpdmU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9hbnN3ZXJfbm9ybWFsIiAvPgorCisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2FjdGl2ZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fYW5zd2VyX2FjdGl2ZSIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2RlY2xpbmUueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fZGVjbGluZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMjhhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2RlY2xpbmUueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9hY3RpdmU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9kZWNsaW5lX25vcm1hbCIgLz4KKworICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9hY3RpdmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2RlY2xpbmVfYWN0aXZhdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5faGFuZGxlLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2hhbmRsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiNGE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2hhbmRsZS54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2FjdGl2ZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2hhbmRsZV9ub3JtYWwiIC8+CisKKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfYWN0aXZlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9oYW5kbGVfcHJlc3NlZCIgLz4KKworPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NlbmRfc21zLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NlbmRfc21zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTAzYTVjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fc2VuZF9zbXMueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9hY3RpdmU9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl90ZXh0X25vcm1hbCIgLz4KKworICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9hY3RpdmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3RleHRfYWN0aXZhdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fc2lsZW50LnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NpbGVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyMWViNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NpbGVudC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2FjdGl2ZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NpbGVudF9ub3JtYWwiIC8+CisKKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfYWN0aXZlPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2ZvY3VzZWQ9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9zaWxlbnRfYWN0aXZhdGVkIiAvPgorCis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fc291bmRvbi54bWwgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9zb3VuZG9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjMwNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fc291bmRvbi54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2FjdGl2ZT0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NvdW5kb25fbm9ybWFsIiAvPgorCisgICAgPGl0ZW0KKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOnN0YXRlX2FjdGl2ZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fc291bmRvbl9hY3RpdmF0ZWQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvaWNfbG9ja3NjcmVlbl91bmxvY2sueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fdW5sb2NrLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQ5YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2ljX2xvY2tzY3JlZW5fdW5sb2NrLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8aXRlbQorICAgICAgICBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfYWN0aXZlPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9mb2N1c2VkPSJmYWxzZSIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fdW5sb2NrX25vcm1hbCIgLz4KKworICAgIDxpdGVtCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzdGF0ZV9hY3RpdmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6c3RhdGVfZm9jdXNlZD0iZmFsc2UiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3VubG9ja19hY3RpdmF0ZWQiIC8+CisKKzwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfYnV0dG9uLnhtbCBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9idXR0b24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzZhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvZHJhd2FibGUvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfYnV0dG9uLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfbm9ybWFsIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fZW1lcmdlbmN5Y2FsbF9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2VtZXJnZW5jeWNhbGxfbm9ybWFsIiAvPgorPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9sb2Nrc2NyZWVuX2ZvcmdvdF9wYXNzd29yZF9idXR0b24ueG1sIGIvY29yZS9yZXMvcmVzL2RyYXdhYmxlL2xvY2tzY3JlZW5fZm9yZ290X3Bhc3N3b3JkX2J1dHRvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwODFiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy9kcmF3YWJsZS9sb2Nrc2NyZWVuX2ZvcmdvdF9wYXNzd29yZF9idXR0b24ueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fZm9yZ290cGFzc3dvcmRfbm9ybWFsIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfcHJlc3NlZD0idHJ1ZSIgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fZm9yZ290cGFzc3dvcmRfcHJlc3NlZCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9mb3Jnb3RwYXNzd29yZF9ub3JtYWwiIC8+Cis8L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbAppbmRleCAwYTQ4NWUyLi4zMDJlZTAxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbApAQCAtNTYsNyArNTYsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9Ijk4c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfY2xvY2tfZm9udF9zaXplIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9Ijk4c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfY2xvY2tfZm9udF9zaXplIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19mb3JlZ3JvdW5kIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAaWQvdGltZURpc3BsYXlCYWNrZ3JvdW5kIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbAppbmRleCAzNDZiMjFlLi41M2ZlOTAyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbApAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9Ijk4c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfY2xvY2tfZm9udF9zaXplIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9Ijk4c3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfY2xvY2tfZm9udF9zaXplIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19mb3JlZ3JvdW5kIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9jay54bWwKaW5kZXggYzljMTY5Mi4uNTQzNzQ3ZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sCkBAIC01OSw3ICs1OSw3IEBACiAgICAgICAgICAgICAvPgogCiAgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuV2F2ZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvd2F2ZV92aWV3IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91bmxvY2tfd2lkZ2V0IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQueG1sCmluZGV4IGZiYjk5ODMuLjM3YmI1MjIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwKQEAgLTQ0LDMxICs0NCwyMiBAQAogICAgIDwvUmVsYXRpdmVMYXlvdXQ+CiAKICAgICA8IS0tIHJpZ2h0IHNpZGUgLS0+Ci0gICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgotICAgICAgICAgICAgICAgID4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3N0YXR1czIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEyZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgotICAgICAgICAgICAgICAgIC8+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsfGNlbnRlcl92ZXJ0aWNhbCI+CiAKLSAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5XYXZlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC93YXZlX3ZpZXciCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zY3JlZW5Mb2NrZWQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgotICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiLz4KIAogICAgICAgICA8IS0tICJlbWVyZ2VuY3kgY2FsbHMgb25seSIgc2hvd24gd2hlbiBzaW0gaXMgbWlzc2luZyBvciBQVUtkIC0tPgogICAgICAgICA8VGV4dFZpZXcKQEAgLTc2LDI0ICs2NywzNSBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW1lcmdlbmN5X2NhbGxzX29ubHkiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIi8+CiAKLSAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gc2hvd24gd2hlbiBzaW0gaXMgUFVLZCBhbmQgdGFiX3NlbGVjdG9yIGlzCi0gICAgICAgICAgICAgaGlkZGVuIC0tPgorCisgICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuV2F2ZVZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdW5sb2NrX3dpZGdldCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiLz4KKworCisgICAgICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcyBoaWRkZW4gLS0+CiAgICAgICAgIDxCdXR0b24KICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEJ1dHRvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iODBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjgwZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIi8+CiAKLSAgICA8L0xpbmVhckxheW91dD4KKyAgICA8L1JlbGF0aXZlTGF5b3V0Pj4KKwogPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfbGFuZHNjYXBlLnhtbAppbmRleCBlM2Q3YTNmLi43YWM0MWI1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKQEAgLTU2LDEwICs1Niw4IEBACiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCiAgICAgICAgIC8+CiAKLSAgICAgICAgPCEtLSBmb290ZXIgLS0+Ci0KLSAgICAgICAgPCEtLSBvcHRpb24gMTogYSBzaW5nbGUgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgotICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJOb3JtYWwiCisgICAgICAgIDwhLS0gRW1lcmdlbmN5IGFuZCBmb3Jnb3QgcGF0dGVybiBidXR0b25zLiAtLT4KKyAgICAgICAgPExpbmVhckxheW91dAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sb2NrUGF0dGVybiIKQEAgLTY4LDQzICs2NiwyNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyOGRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjI4ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI4ZGlwIgotICAgICAgICAgICAgPgotICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxBbG9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yZ290UGF0dGVybkJ1dHRvbiIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICAgICAgPCEtLSBvcHRpb24gMjogYW4gZW1lcmdlbmN5IGNhbGwgYnV0dG9uLCBhbmQgYSAnZm9yZ290IHBhdHRlcm4/JyBidXR0b24gLS0+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJGb3Jnb3RQYXR0ZXJuIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2Zvb3Rlck5vcm1hbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL2xvY2tQYXR0ZXJuIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25SaWdodD0iQGlkL2xvY2tQYXR0ZXJuIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIyOGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjI4ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI4ZGlwIj4KLQotICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmdvdFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCiAgICAgICAgICAgICAvPgogCi0gICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRvZ2V0aGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEJ1dHRvbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgogICAgICAgICAgICAgLz4KIApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL2tleWd1YXJkX3NjcmVlbl91bmxvY2tfcG9ydHJhaXQueG1sCmluZGV4IGYzNTg5N2UuLjFmNjA1OGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKQEAgLTIzLDcgKzIzLDcgQEAKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAotICAgIDwhLS0gdG9wOiBzdGF0dXMgLS0+CisgICAgPCEtLSB0b3A6IHN0YXR1cyBhbmQgZW1lcmdlbmN5L2ZvcmdvdCBwYXR0ZXJuIGJ1dHRvbnMgLS0+CiAgICAgPExpbmVhckxheW91dAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKQEAgLTM2LDUzICszNiwzNyBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMzRkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyNjZkaXAiLz4KIAotICAgICAgICA8IS0tIGZvb3RlciAtLT4KLSAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgIDwhLS0gRW1lcmdlbmN5IGFuZCBmb3Jnb3QgcGF0dGVybiBidXR0b25zLiAtLT4KKyAgICAgICAgPExpbmVhckxheW91dAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTQwZGlwIgotICAgICAgICAgICAgPgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgogCi0gICAgICAgICAgICA8IS0tIG9wdGlvbiAxOiBhIHNpbmdsZSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+Ci0gICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJOb3JtYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3Jnb3RQYXR0ZXJuQnV0dG9uIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgotICAgICAgICAgICAgICAgID4KLSAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEFsb25lIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZm9yZ290X3BhdHRlcm5fYnV0dG9uX3RleHQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KIAotICAgICAgICAgICAgPCEtLSBvcHRpb24gMjogYW4gZW1lcmdlbmN5IGNhbGwgYnV0dG9uLCBhbmQgYSAnZm9yZ290IHBhdHRlcm4/JyBidXR0b24gLS0+Ci0gICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyRm9yZ290UGF0dGVybiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxCdXR0b24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCi0gICAgICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3Jnb3RQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsVG9nZXRoZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKwogICAgIDwvTGluZWFyTGF5b3V0PgogCiAgICAgPCEtLSByaWdodCBzaWRlOiBsb2NrIHBhdHRlcm4gLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF90aWNrZXIueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlci54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvcmVzL3Jlcy9sYXlvdXQteGxhcmdlL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X3RpY2tlci54bWwKcmVuYW1lIHRvIGNvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF90aWNrZXIueG1sCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF90aWNrZXJfbGFyZ2VfaWNvbi54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfdGlja2VyX2xhcmdlX2ljb24ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL3Jlcy9yZXMvbGF5b3V0LXhsYXJnZS9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF90aWNrZXJfbGFyZ2VfaWNvbi54bWwKcmVuYW1lIHRvIGNvcmUvcmVzL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF90aWNrZXJfbGFyZ2VfaWNvbi54bWwKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX2Jhcl90aXRsZV9pdGVtLnhtbAppbmRleCBkOGI3MjlkLi5lODAzYjI2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FjdGlvbl9iYXJfdGl0bGVfaXRlbS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fYmFyX3RpdGxlX2l0ZW0ueG1sCkBAIC0xNywxNyArMTcsMzIgQEAKIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzMmRpcCIgPgotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9iYXJfdGl0bGUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiIC8+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9zdWJ0aXRsZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkaXAiCisgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iZmFsc2UiPgorCisgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC91cCIKKyAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YW5kcm9pZDphdHRyL2hvbWVBc1VwSW5kaWNhdG9yIgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGxlZnQiCisgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fYmFyX3RpdGxlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIgLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2Jhcl9zdWJ0aXRsZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWN0aW9uX21lbnVfaXRlbV9sYXlvdXQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKaW5kZXggNWU4MjhmYS4uNDIwNmRjYiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hY3Rpb25fbWVudV9pdGVtX2xheW91dC54bWwKQEAgLTE5LDE5ICsxOSwyMCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKICAgICBhbmRyb2lkOmFkZFN0YXRlc0Zyb21DaGlsZHJlbj0idHJ1ZSIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZCIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxMmRpcCIKICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkaXAiCi0gICAgYW5kcm9pZDptaW5XaWR0aD0iNjRkaXAiCi0gICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hdHRyL2FjdGlvbkJhclNpemUiCi0gICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiPgorICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2FjdGlvbkJ1dHRvblN0eWxlIj4KICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9pbWFnZUJ1dHRvbiIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IkBkaW1lbi9hY3Rpb25fYmFyX2ljb25fdmVydGljYWxfcGFkZGluZyIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSJAZGltZW4vYWN0aW9uX2Jhcl9pY29uX3ZlcnRpY2FsX3BhZGRpbmciCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQGRpbWVuL2FjdGlvbl9iYXJfaWNvbl92ZXJ0aWNhbF9wYWRkaW5nIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRpcCIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdENlbnRlciIKICAgICAgICAgICAgICAgICAgYW5kcm9pZDphZGp1c3RWaWV3Qm91bmRzPSJ0cnVlIgogICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBudWxsIgpAQCAtNDUsNiArNDYsOSBAQAogICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2J1dHRvblN0eWxlU21hbGwiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2F0dHIvYWN0aW9uTWVudVRleHRDb2xvciIKICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQG51bGwiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjRkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0iZmFsc2UiIC8+CiA8L2NvbS5hbmRyb2lkLmludGVybmFsLnZpZXcubWVudS5BY3Rpb25NZW51SXRlbVZpZXc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FsZXJ0X2RpYWxvZ19ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nX2hvbG8ueG1sCmluZGV4IDhlZTkxY2EuLjIxODU0NjcgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nX2hvbG8ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYWxlcnRfZGlhbG9nX2hvbG8ueG1sCkBAIC0zMiwxMiArMzIsMTAgQEAKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgogICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVEaXZpZGVyVG9wIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRYWSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9zdHJvbmdfaG9sbyIgLz4KICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RlbXBsYXRlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKQEAgLTQ1LDE1ICs0MywxNiBAQAogICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGxlZnQiCiAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL2FsZXJ0X2RpYWxvZ190aXRsZV9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIzMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIzMmRpcCI+CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxNmRpcCI+CiAgICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iOGRpcCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQG51bGwiIC8+CiAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpYWxvZ1RpdGxlIGFuZHJvaWQ6aWQ9IkAraWQvYWxlcnRUaXRsZSIKLSAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAYW5kcm9pZDpjb2xvci9ob2xvX2JsdWUiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKQEAgLTYxLDEyICs2MCwxMCBAQAogICAgICAgICA8L0xpbmVhckxheW91dD4KICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlRGl2aWRlciIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCiAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfc3Ryb25nX2hvbG8iIC8+CiAgICAgICAgIDwhLS0gSWYgdGhlIGNsaWVudCB1c2VzIGEgY3VzdG9tVGl0bGUsIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4gLS0+CiAgICAgPC9MaW5lYXJMYXlvdXQ+CkBAIC03OSwxNyArNzYsMTUgQEAKICAgICAgICAgPFNjcm9sbFZpZXcgYW5kcm9pZDppZD0iQCtpZC9zY3JvbGxWaWV3IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjMyZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIzMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcFRvUGFkZGluZz0iZmFsc2UiPgogICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbWVzc2FnZSIKICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRpcCIgLz4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI4ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iOGRpcCIvPgogICAgICAgICA8L1Njcm9sbFZpZXc+CiAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKQEAgLTk5LDExICs5NCw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSI+CiAgICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvY3VzdG9tIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI4ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMzJkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMzJkaXAiIC8+CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KICAgICA8L0ZyYW1lTGF5b3V0PgogCiAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvblBhbmVsIgpAQCAtMTEzLDI3ICsxMDQsMjEgQEAKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCiAgICAgICAgIGFuZHJvaWQ6ZGl2aWRlcj0iP2FuZHJvaWQ6YXR0ci9kaXZpZGVySG9yaXpvbnRhbCIKICAgICAgICAgYW5kcm9pZDpzaG93RGl2aWRlcnM9ImJlZ2lubmluZyIKLSAgICAgICAgYW5kcm9pZDpkaXZpZGVyUGFkZGluZz0iMTZkaXAiPgorICAgICAgICBhbmRyb2lkOmRpdmlkZXJQYWRkaW5nPSIwZGlwIj4KICAgICAgICAgPExpbmVhckxheW91dAogICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyU3R5bGUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKICAgICAgICAgICAgIGFuZHJvaWQ6bWVhc3VyZVdpdGhMYXJnZXN0Q2hpbGQ9InRydWUiPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2xlZnRTcGFjZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjEiCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uMiIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIyIgogICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhckJ1dHRvblN0eWxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE0c3AiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9hbGVydF9kaWFsb2dfYnV0dG9uX2Jhcl9oZWlnaHQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CiAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uMyIKQEAgLTE0MiwyMiArMTI3LDE4IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjIiCiAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyQnV0dG9uU3R5bGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL2FsZXJ0X2RpYWxvZ19idXR0b25fYmFyX2hlaWdodCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLSAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9idXR0b24yIgorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjEiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjIiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IkBkaW1lbi9hbGVydF9kaWFsb2dfYnV0dG9uX2Jhcl9oZWlnaHQiCiAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyQnV0dG9uU3R5bGUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTRzcCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9yaWdodFNwYWNlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CiAgICAgICAgIDwvTGluZWFyTGF5b3V0PgogICAgICA8L0xpbmVhckxheW91dD4KIDwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9hbV9jb21wYXRfbW9kZV9kaWFsb2cueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hbV9jb21wYXRfbW9kZV9kaWFsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDM5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2FtX2NvbXBhdF9tb2RlX2RpYWxvZy54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNDBkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjQwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTVkcCIgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxNWRwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6YmFzZWxpbmVBbGlnbmVkPSJ0cnVlIj4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlIgorICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDxTd2l0Y2gKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbXBhdF9jaGVja2JveCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkcCIKKyAgICAgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZHAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZHAiIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgICAgICAgICAvPgorCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvYXNrX2NoZWNrYm94IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zY3JlZW5fY29tcGF0X21vZGVfc2hvdyIKKyAgICAgICAgICAgIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVhc2tfaGludCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQiIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvYXBwX3Blcm1zX3N1bW1hcnkueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9hcHBfcGVybXNfc3VtbWFyeS54bWwKaW5kZXggYmRiYmZjYi4uM2Y5OWRkZSAxMDA3NTUKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9hcHBfcGVybXNfc3VtbWFyeS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9hcHBfcGVybXNfc3VtbWFyeS54bWwKQEAgLTYwLDEwICs2MCwxMSBAQAogICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEyZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjEyZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmR1cGxpY2F0ZVBhcmVudFN0YXRlPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZCI+CiAKICAgICAgICAgICAgIDxUZXh0VmlldwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc2hvd19tb3JlX3RleHQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2RpYWxvZ19jdXN0b21fdGl0bGVfaG9sby54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2RpYWxvZ19jdXN0b21fdGl0bGVfaG9sby54bWwKaW5kZXggNzRiNjA3MC4uNTI2MTU1MyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9kaWFsb2dfY3VzdG9tX3RpdGxlX2hvbG8ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZGlhbG9nX2N1c3RvbV90aXRsZV9ob2xvLnhtbApAQCAtMjMsMTggKzIzLDE2IEBACiAgICAgYW5kcm9pZDpmaXRzU3lzdGVtV2luZG93cz0idHJ1ZSI+CiAgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RpdGxlX2NvbnRhaW5lciIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vYWxlcnRfZGlhbG9nX3RpdGxlX2hlaWdodCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgogICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IgogICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci93aW5kb3dUaXRsZUJhY2tncm91bmRTdHlsZSI+CiAgICAgPC9GcmFtZUxheW91dD4KICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVEaXZpZGVyIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRYWSIKICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZmlsbF9ob3Jpem9udGFsIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9zdHJvbmdfaG9sbyIgLz4KICAgICA8RnJhbWVMYXlvdXQKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2RpYWxvZ190aXRsZV9ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZGlhbG9nX3RpdGxlX2hvbG8ueG1sCmluZGV4IDUzNGRkOGQuLjQwMGVmNjAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZGlhbG9nX3RpdGxlX2hvbG8ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZGlhbG9nX3RpdGxlX2hvbG8ueG1sCkBAIC0yNiwxNyArMjYsMTUgQEAKICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGl0bGUiIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlU3R5bGUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNjBkaXAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjMyZGlwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMzJkaXAiCisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAYW5kcm9pZDpkaW1lbi9hbGVydF9kaWFsb2dfdGl0bGVfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgogICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxsZWZ0IiAvPgogICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC90aXRsZURpdmlkZXIiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgogICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJmaWxsX2hvcml6b250YWwiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9kaXZpZGVyX3N0cm9uZ19ob2xvIiAvPgogICAgIDxGcmFtZUxheW91dAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZGlhbG9nX3RpdGxlX2ljb25zX2hvbG8ueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9kaWFsb2dfdGl0bGVfaWNvbnNfaG9sby54bWwKaW5kZXggYTNjZDNhZi4uZjc4MGFiMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9kaWFsb2dfdGl0bGVfaWNvbnNfaG9sby54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9kaWFsb2dfdGl0bGVfaWNvbnNfaG9sby54bWwKQEAgLTI4LDE2ICsyOCwxNiBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI2MGRpcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMzJkaXAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIzMmRpcCI+CisgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAYW5kcm9pZDpkaW1lbi9hbGVydF9kaWFsb2dfdGl0bGVfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIj4KICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2xlZnRfaWNvbiIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiIC8+CiAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90aXRsZSIKLQkJc3R5bGU9Ij9hbmRyb2lkOmF0dHIvd2luZG93VGl0bGVTdHlsZSIKKyAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3dpbmRvd1RpdGxlU3R5bGUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIC8+CkBAIC01MCwxMSArNTAsOSBAQAogCiAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlRGl2aWRlciIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCiAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgogICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfc3Ryb25nX2hvbG8iIC8+CiAKICAgICA8RnJhbWVMYXlvdXQKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZ2xvYmFsX2FjdGlvbnNfaXRlbS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2dsb2JhbF9hY3Rpb25zX2l0ZW0ueG1sCmluZGV4IDY4ZmU5NjAuLjY3YjE2NDQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvZ2xvYmFsX2FjdGlvbnNfaXRlbS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9nbG9iYWxfYWN0aW9uc19pdGVtLnhtbApAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKIAotICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGxJbnZlcnNlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCiAgICAgICAgIC8+CiAKIApAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQGlkL3N0YXR1cyIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25XaXRoUGFyZW50SWZNaXNzaW5nPSJ0cnVlIgogICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgogICAgICAgICAvPgogCiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvaW5wdXRfbWV0aG9kX2V4dHJhY3Rfdmlldy54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2lucHV0X21ldGhvZF9leHRyYWN0X3ZpZXcueG1sCmluZGV4IDdkNTlkMDIuLjYwYmMyNGMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvaW5wdXRfbWV0aG9kX2V4dHJhY3Rfdmlldy54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9pbnB1dF9tZXRob2RfZXh0cmFjdF92aWV3LnhtbApAQCAtMTgsNyArMTgsNyBAQAogKi8KIC0tPgogCi08TGluZWFyTGF5b3V0Cis8YW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuRXh0cmFjdEVkaXRMYXlvdXQKICAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KICAgICAgICAgCkBAIC0zOCw4ICszOCw4IEBACiAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2lucHV0RXh0cmFjdEFjY2Vzc29yaWVzIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjhkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2tleWJvYXJkX2FjY2Vzc29yeV9iZ19sYW5kc2NhcGUiCiAgICAgICAgID4KICAgICAgICAgCkBAIC00OCw3ICs0OCwxNCBAQAogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCiAgICAgICAgICAgICAvPgorICAgICAgICA8YW5kcm9pZC5pbnB1dG1ldGhvZHNlcnZpY2UuRXh0cmFjdEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2lucHV0RXh0cmFjdEVkaXRCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJpbnZpc2libGUiCisgICAgICAgICAgICAvPgogICAgICAgICAgICAgCiAgICAgPC9GcmFtZUxheW91dD4KICAgICAKLTwvTGluZWFyTGF5b3V0PgorPC9hbmRyb2lkLmlucHV0bWV0aG9kc2VydmljZS5FeHRyYWN0RWRpdExheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3NpbV9wdWtfbGFuZHNjYXBlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3NpbV9wdWtfbGFuZHNjYXBlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNThmYjIzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fc2ltX3B1a19sYW5kc2NhcGUueG1sCkBAIC0wLDAgKzEsMTgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKioKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIikKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyayIKKyAgICAgICAgPgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3RvcERpc3BsYXlHcm91cCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KKworICAgICAgICA8IS0tIGhlYWRlciB0ZXh0ICgnRW50ZXIgUHVrIENvZGUnKSAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaGVhZGVyVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIi8+CisKKyAgICAgICAgPCEtLSBDYXJyaWVyIGluZm8gLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOWRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIi8+CisKKyAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCI+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZW50ZXJfcHVrIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2tleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3B1a19wcm9tcHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMwc3AiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTBkaXAiLz4KKyAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9lbnRlcl9waW4iCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcva2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX3Byb21wdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzBzcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMGRpcCIvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjBkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMGRpcCI+CisKKyAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjZkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNmRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2VkaXRfdGV4dCI+CisKKyAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc3BsYXlzIGRvdHMgYXMgdXNlciBlbnRlcnMgcHVrIC0tPgorICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3B1a0Rpc3BsYXkiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHVrRGVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfaW5wdXRfZGVsZXRlIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9Ii0zZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii0zZGlwIgorICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKworCisgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQiPgorCisgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5cyBkb3RzIGFzIHVzZXIgZW50ZXJzIG5ldyBwaW4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcGluRGlzcGxheSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZUludmVyc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0idGV4dFBhc3N3b3JkIgorICAgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9waW5EZWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19pbnB1dF9kZWxldGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iLTNkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iLTNkaXAiCisgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAYW5kcm9pZDpzdHJpbmcvb2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2VtZXJnZW5jeV9jYWxsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJIb3Jpem9udGFsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L1JlbGF0aXZlTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fc2ltX3B1a19wb3J0cmFpdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zaW1fcHVrX3BvcnRyYWl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTM5MmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fc2ltX3B1a19wb3J0cmFpdC54bWwKQEAgLTAsMCArMSwxODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmNvbG9yL2JhY2tncm91bmRfZGFyayIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIj4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC90b3BEaXNwbGF5R3JvdXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPCEtLSBoZWFkZXIgdGV4dCAoJ0VudGVyIFB1ayBDb2RlJykgLS0+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2hlYWRlclRleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIvPgorCisgICAgICAgIDwhLS0gQ2FycmllciBpbmZvIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjlkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIvPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiPgorICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2VudGVyX3B1ayIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wdWtfcHJvbXB0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMHNwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEwZGlwIi8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZW50ZXJfcGluIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2tleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wcm9tcHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMwc3AiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTBkaXAiLz4KKyAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIwZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjEwZGlwIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBkaXAiPgorCisgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI2ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjZkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9lZGl0X3RleHQiPgorCisgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5cyBkb3RzIGFzIHVzZXIgZW50ZXJzIHB1ayAtLT4KKyAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9wdWtEaXNwbGF5IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlSW52ZXJzZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJ0ZXh0UGFzc3dvcmQiCisgICAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3B1a0RlbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBhbmRyb2lkOmRyYXdhYmxlL2ljX2lucHV0X2RlbGV0ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSItM2RpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSItM2RpcCIKKyAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKworICAgICAgICAgICAgICAgICAgPExpbmVhckxheW91dAorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNmRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI2ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZWRpdF90ZXh0Ij4KKworICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzcGxheXMgZG90cyBhcyB1c2VyIGVudGVycyBuZXcgcGluIC0tPgorICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3BpbkRpc3BsYXkiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2VJbnZlcnNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9InRleHRQYXNzd29yZCIKKyAgICAgICAgICAgICAgICAgICAgICAvPgorCisgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGluRGVsIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfaW5wdXRfZGVsZXRlIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9Ii0zZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii0zZGlwIgorICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPGluY2x1ZGUKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9rZXlQYWQiCisgICAgICAgIGxheW91dD0iQGFuZHJvaWQ6bGF5b3V0L3R3ZWx2ZV9rZXlfZW50cnkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvdG9wRGlzcGxheUdyb3VwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZGlwIgorICAgIC8+CisKKyAgICA8IS0tIHNwYWNlciBiZWxvdyBrZXlwYWQgLS0+CisgICAgPFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXJCb3R0b20iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hYm92ZT0iQGlkL2VtZXJnZW5jeUNhbGwiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCisgICAgLz4KKworICAgIDwhLS0gVGhlIGVtZXJnZW5jeSBidXR0b24gc2hvdWxkIHRha2UgdGhlIHJlc3Qgb2YgdGhlIHNwYWNlIGFuZCBiZSBjZW50ZXJlZCB2ZXJ0aWNhbGx5IC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICAgICAgPCEtLSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAYW5kcm9pZDpkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQGFuZHJvaWQ6c3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX2xhbmQueG1sCmluZGV4IDI1OWEzYWYuLjhhMDJlMWYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19sYW5kLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfbGFuZC54bWwKQEAgLTEzMywxNiArMTMzLDQgQEAKICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKICAgICAgICAgLz4KIAotICAgIDxUZXh0VmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb3BlcnR5T2YiCi0gICAgICAgIGFuZHJvaWQ6bGluZVNwYWNpbmdFeHRyYT0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE3c3AiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCi0gICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9vd25lcl9pbmZvIgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIC8+CiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3N0YXR1c19wb3J0LnhtbAppbmRleCA2ODBjMDczLi4xZTg3ZmIzIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl9zdGF0dXNfcG9ydC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fc3RhdHVzX3BvcnQueG1sCkBAIC0xMzAsMTYgKzEzMCw0IEBACiAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCiAgICAgICAgIC8+CiAKLSAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9wZXJ0eU9mIgotICAgICAgICBhbmRyb2lkOmxpbmVTcGFjaW5nRXh0cmE9IjhkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjIwZGlwIgotICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxN3NwIgotICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9ImZhbHNlIgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9vd25lcl9pbmZvIgotICAgICAgICAvPgogPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sCmluZGV4IDVmZTM4ZDUuLjdhZTM1N2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2sueG1sCkBAIC0yMiwxMSArMjIsMTEgQEAKICAgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLiAgSXQgaXMgdGhlIHNhbWUgZm9yIGxhbmRzY2FwZQogICBhbmQgcG9ydHJhaXQuLS0+CiA8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnRhYnVubG9jaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC50YWJ1bmxvY2siCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCI+CisgICAgYW5kcm9pZDppZD0iQCtpZC9yb290IgorICAgIGFuZHJvaWQ6Y2xpcENoaWxkcmVuPSJmYWxzZSI+CiAKICAgICA8VGV4dFZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgpAQCAtMTYyLDEzICsxNjIsMjQgQEAKICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCiAgICAgICAgIC8+CiAKLSAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdUYWIKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90YWJfc2VsZWN0b3IiCisgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5tdWx0aXdhdmV2aWV3Lk11bHRpV2F2ZVZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC91bmxvY2tfd2lkZ2V0IgogICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMDBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjgwZGlwIgorCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0RHJhd2FibGVzPSJAYXJyYXkvbG9ja3NjcmVlbl90YXJnZXRzX3doZW5fc2lsZW50IgorICAgICAgICBhbmRyb2lkOmhhbmRsZURyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9oYW5kbGUiCisgICAgICAgIGFuZHJvaWQ6d2F2ZURyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9vdXRlcnJpbmciCisgICAgICAgIGFuZHJvaWQ6b3V0ZXJSYWRpdXM9IkAqYW5kcm9pZDpkaW1lbi9tdWx0aXdhdmV2aWV3X3RhcmdldF9wbGFjZW1lbnRfcmFkaXVzIgorICAgICAgICBhbmRyb2lkOnNuYXBNYXJnaW49IkAqYW5kcm9pZDpkaW1lbi9tdWx0aXdhdmV2aWV3X3NuYXBfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOmhpdFJhZGl1cz0iQCphbmRyb2lkOmRpbWVuL211bHRpd2F2ZXZpZXdfaGl0X3JhZGl1cyIKKyAgICAgICAgYW5kcm9pZDp2aWJyYXRpb25EdXJhdGlvbj0iMjAiCisgICAgICAgIGFuZHJvaWQ6cmlnaHRDaGV2cm9uRHJhd2FibGU9IkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX2NoZXZyb25fcmlnaHQiCisgICAgICAgIGFuZHJvaWQ6ZmVlZGJhY2tDb3VudD0iMyIKKyAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsT2Zmc2V0PSIwZGlwIgorICAgICAgICBhbmRyb2lkOnZlcnRpY2FsT2Zmc2V0PSI2MGRpcCIKICAgICAgICAgLz4KIAogICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3RhYl91bmxvY2tfbGFuZC54bWwKaW5kZXggM2MyYWQ5YS4uZDQ1Y2M4NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdGFiX3VubG9ja19sYW5kLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L2tleWd1YXJkX3NjcmVlbl90YWJfdW5sb2NrX2xhbmQueG1sCkBAIC0yMCwzMiArMjAsMTMwIEBACiA8IS0tIFRoaXMgaXMgdGhlIGdlbmVyYWwgbG9jayBzY3JlZW4gd2hpY2ggc2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgIHN0YXRlIG9mIHRoZSBkZXZpY2UsIGFzIHdlbGwgYXMgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBnZXQgcGFzdCBpdAogICBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UuLS0+Ci08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp0YWJ1bmxvY2s9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvY29tLmFuZHJvaWQudGFidW5sb2NrIgorPEdyaWRMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL3Jvb3QiPgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6cm93Q291bnQ9IjEwIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCIKKyAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiPgogCi0gICAgPCEtLSBsZWZ0IHNpZGUgLS0+Ci0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIyNGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCI+CisgICAgPCEtLSBDb2x1bW4gMCAtLT4KKyAgICA8U3BhY2UgYW5kcm9pZDpoZWlnaHQ9IjIwZGlwIi8+CiAKLSAgICAgICAgPFRleHRWaWV3CisgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2sgYW5kcm9pZDppZD0iQCtpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjU2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiPgorCisgICAgICAgPCEtLSBCZWNhdXNlIHdlIGNhbid0IGhhdmUgbXVsdGktdG9uZSBmb250cywgd2UgcmVuZGVyIHR3byBUZXh0Vmlld3MsIG9uZSBvbgorICAgICAgICB0b3Agb2YgdGhlIG90aGVyLiBIZW5jZSB0aGUgcmVkdW5kYW50IGxheW91dC4uLiAtLT4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGltZURpc3BsYXlCYWNrZ3JvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI3MnNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgorICAgICAgICAgICAgLz4KKworICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheUZvcmVncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9Ijcyc3AiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci9sb2Nrc2NyZWVuX2Nsb2NrX2ZvcmVncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKKyAgICAgICAgICAgIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXlCYWNrZ3JvdW5kIgorICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMnNwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL2xvY2tzY3JlZW5fY2xvY2tfYW1fcG0iCisgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCisgICAgICAgICAgICAvPgorCisgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZGF0ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImxlZnQiCisgICAgICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGFybV9zdGF0dXMiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImxlZnQiCisgICAgICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMxIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0IgorICAgICAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdCIKKyAgICAgICAgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NjcmVlbkxvY2tlZCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImxlZnQiCisgICAgICAgIC8+CisKKyAgICA8U3BhY2UgYW5kcm9pZDpoZWlnaHQ9IjIwZGlwIi8+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KKworICAgICAgICAgPFRleHRWaWV3CiAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGxlZnQiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgLz4KKyAgICAgICAgLz4KKworICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQGRyYXdhYmxlL2ljX2VtZXJnZW5jeSIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjgwZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAvPgogCiAgICAgICAgIDwhLS0gImVtZXJnZW5jeSBjYWxscyBvbmx5IiBzaG93biB3aGVuIHNpbSBpcyBtaXNzaW5nIG9yIFBVS2QgLS0+CiAgICAgICAgIDxUZXh0VmlldwpAQCAtNTcsMTMyICsxNTUsMzIgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbWVyZ2VuY3lfY2FsbHNfb25seSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgIC8+CisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CiAKLSAgICAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2sgYW5kcm9pZDppZD0iQCtpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9jYXJyaWVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1NmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRpcCIKLSAgICAgICAgICAgID4KKyAgICA8U3BhY2UgYW5kcm9pZDpoZWlnaHQ9IjIwZGlwIi8+CiAKLSAgICAgICAgICAgPCEtLSBCZWNhdXNlIHdlIGNhbid0IGhhdmUgbXVsdGktdG9uZSBmb250cywgd2UgcmVuZGVyIHR3byBUZXh0Vmlld3MsIG9uZSBvbgotICAgICAgICAgICAgdG9wIG9mIHRoZSBvdGhlci4gSGVuY2UgdGhlIHJlZHVuZGFudCBsYXlvdXQuLi4gLS0+Ci0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL2xvY2tzY3JlZW5fY2xvY2tfYmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICAvPgorICAgIDwhLS0gQ29sdW1uIDEgLS0+CisgICAgPFNwYWNlIGFuZHJvaWQ6d2lkdGg9IjIwZGlwIiBhbmRyb2lkOmxheW91dF9jb2x1bW5XZWlnaHQ9IjEiIGFuZHJvaWQ6bGF5b3V0X3Jvd1NwYW49IjEwIiAvPgogCi0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheUZvcmVncm91bmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNzJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL2xvY2tzY3JlZW5fY2xvY2tfZm9yZWdyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCi0gICAgICAgICAgICAgICAgLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci9sb2Nrc2NyZWVuX2Nsb2NrX2FtX3BtIgotICAgICAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgPCEtLSBUT0RPOiBSZWRvIGxheW91dCB3aGVuIHdlIHJlbGVhc2Ugb24gcGhvbmVzIC0tPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxhcm1fc3RhdHVzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZGF0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjI0ZGlwIgotICAgICAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvYWxhcm1fc3RhdHVzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgotICAgICAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvc3RhdHVzMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKLSAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NjcmVlbkxvY2tlZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvc3RhdHVzMiIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTJkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKLSAgICAgICAgICAgIC8+Ci0KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPCEtLSByaWdodCBzaWRlIC0tPgotICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuU2xpZGluZ1RhYgotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RhYl9zZWxlY3RvciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgPCEtLSBDb2x1bW4gMiAtLT4KKyAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0Lm11bHRpd2F2ZXZpZXcuTXVsdGlXYXZlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3VubG9ja193aWRnZXQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkaXAiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iODBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3Jvd1NwYW49IjEwIgorCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0RHJhd2FibGVzPSJAYXJyYXkvbG9ja3NjcmVlbl90YXJnZXRzX3doZW5fc2lsZW50IgorICAgICAgICBhbmRyb2lkOmhhbmRsZURyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9oYW5kbGUiCisgICAgICAgIGFuZHJvaWQ6d2F2ZURyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9vdXRlcnJpbmciCisgICAgICAgIGFuZHJvaWQ6b3V0ZXJSYWRpdXM9IkAqYW5kcm9pZDpkaW1lbi9tdWx0aXdhdmV2aWV3X3RhcmdldF9wbGFjZW1lbnRfcmFkaXVzIgorICAgICAgICBhbmRyb2lkOnNuYXBNYXJnaW49IkAqYW5kcm9pZDpkaW1lbi9tdWx0aXdhdmV2aWV3X3NuYXBfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOmhpdFJhZGl1cz0iQCphbmRyb2lkOmRpbWVuL211bHRpd2F2ZXZpZXdfaGl0X3JhZGl1cyIKKyAgICAgICAgYW5kcm9pZDp2aWJyYXRpb25EdXJhdGlvbj0iMjAiCisgICAgICAgIGFuZHJvaWQ6dG9wQ2hldnJvbkRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9jaGV2cm9uX3VwIgorICAgICAgICBhbmRyb2lkOmZlZWRiYWNrQ291bnQ9IjMiCisgICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbE9mZnNldD0iMGRpcCIKKyAgICAgICAgYW5kcm9pZDp2ZXJ0aWNhbE9mZnNldD0iMGRpcCIKICAgICAgICAgLz4KIAotICAgIDwhLS0gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIHNob3duIHdoZW4gc2ltIGlzIFBVS2QgYW5kIHRhYl9zZWxlY3RvciBpcwotICAgICAgICAgaGlkZGVuIC0tPgotICAgIDxCdXR0b24KLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQnV0dG9uIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4MGRpcCIKLSAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAvPgotCi08L0xpbmVhckxheW91dD4KKzwvR3JpZExheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19sYW5kc2NhcGUueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKaW5kZXggYzdiNzhjNC4uZDUyYmM1NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX2xhbmRzY2FwZS54bWwKQEAgLTIxLDE5OCArMjEsMTI0IEBACiAgICAgIHRoZSB1c2VyIGhvdyB0byB1bmxvY2sgdGhlaXIgZGV2aWNlLCBvciBtYWtlIGFuIGVtZXJnZW5jeSBjYWxsLiAgVGhpcwogICAgICBpcyB0aGUgcG9ydHJhaXQgbGF5b3V0LiAgLS0+CiAKLTxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudAotICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorPEdyaWRMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOnJvd0NvdW50PSI5Ij4KIAotICAgIDwhLS0gbGVmdCBzaWRlOiBpbnN0cnVjdGlvbnMgYW5kIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiAtLT4KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjI0ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgotICAgICAgICAgICAgPgorICAgIDwhLS0gQ29sdW1uIDA6IFRpbWUsIGRhdGUgYW5kIHN0YXR1cyAtLT4KKyAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0Ij4KIAotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxhcm1fc3RhdHVzIgorICAgICAgICA8IS0tIEJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZSBtdWx0aS10b25lIGZvbnRzLCB3ZSByZW5kZXIgdHdvIFRleHRWaWV3cywgb25lIG9uCisgICAgICAgIHRvcCBvZiB0aGUgb3RoZXIuIEhlbmNlIHRoZSByZWR1bmRhbnQgbGF5b3V0Li4uIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgotICAgICAgICAgICAgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE2ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhcnJpZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTdzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzMmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodHxib3R0b20iCi0gICAgICAgICAgICAvPgotCi0gICAgICAgIDxjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgotICAgICAgICAgICAgPgotCi0gICAgICAgICAgICA8IS0tIEJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZSBtdWx0aS10b25lIGZvbnRzLCB3ZSByZW5kZXIgdHdvIFRleHRWaWV3cywgb25lIG9uCi0gICAgICAgICAgICB0b3Agb2YgdGhlIG90aGVyLiBIZW5jZSB0aGUgcmVkdW5kYW50IGxheW91dC4uLiAtLT4KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI3MnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgotICAgICAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5Rm9yZWdyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI3MnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL2xvY2tzY3JlZW5fY2xvY2tfZm9yZWdyb3VuZCIKLSAgICAgICAgICAgICAgICAvPgotCi0KLQotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYW1fcG0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25CYXNlbGluZT0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci9sb2Nrc2NyZWVuX2Nsb2NrX2FtX3BtIgotICAgICAgICAgICAgICAgIC8+Ci0KLSAgICAgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL2tleWd1YXJkX3BhdHRlcm5fdW5sb2NrX2Nsb2NrX2ZvbnRfc2l6ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgogICAgICAgICAgICAgLz4KIAotICAgICAgICA8IS0tIHVzZWQgZm9yIGluc3RydWN0aW9ucyBzdWNoIGFzICJkcmF3IHBhdHRlcm4gdG8gdW5sb2NrIiwgdGhlIG5leHQgYWxhcm0sIGFuZCBjaGFyZ2luZwotICAgICAgICAgICAgIHN0YXR1cy4gIC0tPgotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheUZvcmVncm91bmQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgID4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzU2VwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE3c3AiCi0gICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTdzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8IS0tIGZpbGwgc3BhY2UgYmV0d2VlbiBoZWFkZXIgYW5kIGJ1dHRvbiBiZWxvdyAtLT4KLSAgICAgICAgPFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJub25lIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19jbG9ja19mb250X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjZkaXAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC90aW1lRGlzcGxheUJhY2tncm91bmQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19mb3JlZ3JvdW5kIgogICAgICAgICAgICAgLz4KIAotICAgICAgICA8IS0tIGZvb3RlciAtLT4KLSAgICAgICAgPEZyYW1lTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE2ZGlwIgotICAgICAgICAgICAgPgorICAgIDwvY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jaz4KIAotICAgICAgICAgICAgPCEtLSBvcHRpb24gMTogYSBzaW5nbGUgZW1lcmdlbmN5IGNhbGwgYnV0dG9uIC0tPgotICAgICAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvZm9vdGVyTm9ybWFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgotICAgICAgICAgICAgICAgID4KLSAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEFsb25lIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL2tleWd1YXJkX3BhdHRlcm5fdW5sb2NrX3N0YXR1c19saW5lX2ZvbnRfc2l6ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgIC8+CiAKLSAgICAgICAgICAgIDwhLS0gb3B0aW9uIDI6IGFuIGVtZXJnZW5jeSBjYWxsIGJ1dHRvbiwgYW5kIGEgJ2ZvcmdvdCBwYXR0ZXJuPycgYnV0dG9uIC0tPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3RlckZvcmdvdFBhdHRlcm4iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCi0gICAgICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mb3Jnb3RQYXR0ZXJuIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbFRvZ2V0aGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvRnJhbWVMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxhcm1fc3RhdHVzIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL2tleWd1YXJkX3BhdHRlcm5fdW5sb2NrX3N0YXR1c19saW5lX2ZvbnRfc2l6ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICAvPgogCi0gICAgPCEtLSByaWdodCBzaWRlOiBsb2NrIHBhdHRlcm4gLS0+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhdHVzMiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAvPgorCisgICAgPFNwYWNlIGFuZHJvaWQ6bGF5b3V0X3Jvd1dlaWdodD0iMSIgYW5kcm9pZDpsYXlvdXRfY29sdW1uV2VpZ2h0PSIxIiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIC8+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW1lcmdlbmN5Q2FsbEJ1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgIHN0eWxlPSJAKmFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL2tleWd1YXJkX3BhdHRlcm5fdW5sb2NrX3N0YXR1c19saW5lX2ZvbnRfc2l6ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAKmFuZHJvaWQ6ZHJhd2FibGUvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfYnV0dG9uIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iMGRpcCIKKyAgICAvPgorCisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmdvdFBhdHRlcm5CdXR0b24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0IgorICAgICAgICBzdHlsZT0iQCphbmRyb2lkOnN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQCphbmRyb2lkOnN0cmluZy9sb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0IgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlTGVmdD0iQCphbmRyb2lkOmRyYXdhYmxlL2xvY2tzY3JlZW5fZm9yZ290X3Bhc3N3b3JkX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjBkaXAiCisgICAgLz4KKworICAgIDwhLS0gQ29sdW1uIDE6IGxvY2sgcGF0dGVybiAtLT4KICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkxvY2tQYXR0ZXJuVmlldyBhbmRyb2lkOmlkPSJAK2lkL2xvY2tQYXR0ZXJuIgotICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCisgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgYW5kcm9pZDpsYXlvdXRfcm93U3Bhbj0iOSIvPgogCi08L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50PgorPC9HcmlkTGF5b3V0PgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKaW5kZXggMTVmMmFmYi4uNGZmYTM0MDUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQva2V5Z3VhcmRfc2NyZWVuX3VubG9ja19wb3J0cmFpdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9rZXlndWFyZF9zY3JlZW5fdW5sb2NrX3BvcnRyYWl0LnhtbApAQCAtMjAsMjEzICsyMCwxNDcgQEAKIDwhLS0gVGhpcyBpcyB0aGUgc2NyZWVuIHRoYXQgc2hvd3MgdGhlIDkgY2lyY2xlIHVubG9jayB3aWRnZXQgYW5kIGluc3RydWN0cwogICAgICB0aGUgdXNlciBob3cgdG8gdW5sb2NrIHRoZWlyIGRldmljZSwgb3IgbWFrZSBhbiBlbWVyZ2VuY3kgY2FsbC4gIFRoaXMKICAgICAgaXMgdGhlIHBvcnRyYWl0IGxheW91dC4gIC0tPgotPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5MaW5lYXJMYXlvdXRXaXRoRGVmYXVsdFRvdWNoUmVjZXBpZW50Cis8R3JpZExheW91dAogICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiPgogCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisKKyAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICA+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jYXJyaWVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iLTRkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0Ij4KKworICAgICAgICA8IS0tIEJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZSBtdWx0aS10b25lIGZvbnRzLCB3ZSByZW5kZXIgdHdvIFRleHRWaWV3cywgb25lIG9uCisgICAgICAgIHRvcCBvZiB0aGUgb3RoZXIuIEhlbmNlIHRoZSByZWR1bmRhbnQgbGF5b3V0Li4uIC0tPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCphbmRyb2lkOmlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAK2lkL3RpbWUiCiAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHR8Ym90dG9tIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAKmFuZHJvaWQ6ZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfY2xvY2tfZm9udF9zaXplIgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAKmFuZHJvaWQ6Y29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgogICAgICAgICAgICAgLz4KIAotICAgICAgICA8Y29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LkRpZ2l0YWxDbG9jayBhbmRyb2lkOmlkPSJAK2lkL3RpbWUiCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAKmFuZHJvaWQ6aWQvdGltZURpc3BsYXlGb3JlZ3JvdW5kIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjE1ZGlwIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjhkaXAiCi0gICAgICAgICAgICA+CisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkAqYW5kcm9pZDpkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19jbG9ja19mb250X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci9sb2Nrc2NyZWVuX2Nsb2NrX2ZvcmVncm91bmQiCisgICAgICAgICAgICAvPgogCi0gICAgICAgICAgICA8IS0tIEJlY2F1c2Ugd2UgY2FuJ3QgaGF2ZSBtdWx0aS10b25lIGZvbnRzLCB3ZSByZW5kZXIgdHdvIFRleHRWaWV3cywgb25lIG9uCi0gICAgICAgICAgICB0b3Agb2YgdGhlIG90aGVyLiBIZW5jZSB0aGUgcmVkdW5kYW50IGxheW91dC4uLiAtLT4KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI1NnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3IvbG9ja3NjcmVlbl9jbG9ja19iYWNrZ3JvdW5kIgotICAgICAgICAgICAgICAgIC8+CisgICAgPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuRGlnaXRhbENsb2NrPgogCi0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aW1lRGlzcGxheUZvcmVncm91bmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im5vbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iNTZzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNmRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL2xvY2tzY3JlZW5fY2xvY2tfZm9yZWdyb3VuZCIKLSAgICAgICAgICAgICAgICAvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hbV9wbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL3RpbWVEaXNwbGF5QmFja2dyb3VuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkJhc2VsaW5lPSJAaWQvdGltZURpc3BsYXlCYWNrZ3JvdW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibm9uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL2xvY2tzY3JlZW5fY2xvY2tfYW1fcG0iCi0gICAgICAgICAgICAgICAgLz4KLQotICAgICAgICA8L2NvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5EaWdpdGFsQ2xvY2s+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiPgogCiAgICAgICAgIDxUZXh0VmlldwogICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMjRkaXAiCiAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQCphbmRyb2lkOmRpbWVuL2tleWd1YXJkX3BhdHRlcm5fdW5sb2NrX3N0YXR1c19saW5lX2ZvbnRfc2l6ZSIKICAgICAgICAgICAgIC8+CiAKLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaXZpZGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iOGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZGlwIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBhbmRyb2lkOmRyYXdhYmxlL2RpdmlkZXJfaG9yaXpvbnRhbF9kYXJrIgotICAgICAgICAvPgotCi0gICAgPCEtLSB1c2VkIGZvciBpbnN0cnVjdGlvbnMgc3VjaCBhcyAiZHJhdyBwYXR0ZXJuIHRvIHVubG9jayIsIHRoZSBuZXh0IGFsYXJtLCBhbmQgY2hhcmdpbmcKLSAgICAgICAgIHN0YXR1cy4gIC0tPgotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTJkaXAiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKLSAgICAgICAgPgotICAgICAgICA8IS0tIFRPRE86IFJlZG8gbGF5b3V0IHdoZW4gd2UgcmVsZWFzZSBvbiBwaG9uZXMgLS0+CiAgICAgICAgIDxUZXh0VmlldwogICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGFybV9zdGF0dXMiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNmRpcCIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQCphbmRyb2lkOmRpbWVuL2tleWd1YXJkX3BhdHRlcm5fdW5sb2NrX3N0YXR1c19saW5lX2ZvbnRfc2l6ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgogICAgICAgICAgICAgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMThzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgotICAgICAgICAgICAgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c1NlcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjVkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iNWRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgotICAgICAgICAgICAgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjRkaXAiCi0gICAgICAgICAgICAvPgorCiAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1czEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAKmFuZHJvaWQ6ZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfc3RhdHVzX2xpbmVfZm9udF9zaXplIgorICAgICAgICBhbmRyb2lkOmRyYXdhYmxlUGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCisgICAgICAgIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGF0dXMyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkAqYW5kcm9pZDpkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgorICAgICAgICAvPgorCiAgICAgPGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblZpZXcKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9sb2NrUGF0dGVybiIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMmRpcCIKLSAgICAgICAgYW5kcm9pZDphc3BlY3Q9IkBzdHJpbmcvbG9ja19wYXR0ZXJuX3ZpZXdfYXNwZWN0IgotICAgICAgICAgLz4KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3Jvd1dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iOGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAvPgogCi0gICAgPCEtLSBmb290ZXIgLS0+Ci0gICAgPEZyYW1lTGF5b3V0CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FycmllciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAKmFuZHJvaWQ6ZGltZW4va2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfc3RhdHVzX2xpbmVfZm9udF9zaXplIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgIC8+CisKKyAgICA8IS0tIEZvb3RlcjogYW4gZW1lcmdlbmN5IGNhbGwgYnV0dG9uIGFuZCBhbiBpbml0aWFsbHkgaGlkZGVuICJGb3Jnb3QgcGF0dGVybiIgYnV0dG9uIC0tPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgID4KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIj4KIAotICAgICAgICA8IS0tIG9wdGlvbiAxOiBhIHNpbmdsZSBlbWVyZ2VuY3kgY2FsbCBidXR0b24gLS0+Ci0gICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL2Zvb3Rlck5vcm1hbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgID4KLSAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9lbWVyZ2VuY3lDYWxsQWxvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1dpZGdldC5CdXR0b24uVHJhbnNwYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZUxlZnQ9IkBkcmF3YWJsZS9pY19lbWVyZ2VuY3kiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjhkaXAiCi0gICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfY2FsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvbG9ja3NjcmVlbl9lbWVyZ2VuY3lfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjBkaXAiCisgICAgICAgIC8+CiAKLSAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmdvdFBhdHRlcm5CdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvV2lkZ2V0LkJ1dHRvbi5UcmFuc3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9rZXlndWFyZF9wYXR0ZXJuX3VubG9ja19zdGF0dXNfbGluZV9mb250X3NpemUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvbG9ja3NjcmVlbl9mb3Jnb3RfcGFzc3dvcmRfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjBkaXAiCisgICAgICAgIC8+CiAKLSAgICAgICAgPCEtLSBvcHRpb24gMjogYW4gZW1lcmdlbmN5IGNhbGwgYnV0dG9uLCBhbmQgYSAnZm9yZ290IHBhdHRlcm4/JyBidXR0b24gLS0+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9mb290ZXJGb3Jnb3RQYXR0ZXJuIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgPgotICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2VtZXJnZW5jeUNhbGxUb2dldGhlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjRkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI0ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjJkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2xvY2tzY3JlZW5fZW1lcmdlbmN5X2NhbGwiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVMZWZ0PSJAZHJhd2FibGUvaWNfZW1lcmdlbmN5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGVQYWRkaW5nPSI4ZGlwIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZm9yZ290UGF0dGVybiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjRkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI0ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjJkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjRkaXAiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9XaWRnZXQuQnV0dG9uLlRyYW5zcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIDwvTGluZWFyTGF5b3V0PgogCi0gICAgPC9GcmFtZUxheW91dD4KLQotPC9jb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTGluZWFyTGF5b3V0V2l0aERlZmF1bHRUb3VjaFJlY2VwaWVudD4KKzwvR3JpZExheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZS54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2UueG1sCmluZGV4IDFmOTIyNTIuLjQ0OGY4OWEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlLnhtbApAQCAtMjIsNyArMjIsOCBAQAogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI/YW5kcm9pZDphdHRyL3Njcm9sbGJhclNpemUiPgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI/YW5kcm9pZDphdHRyL3Njcm9sbGJhclNpemUiCisgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZCIgPgogCiAgICAgPEltYWdlVmlldwogICAgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaWNvbiIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV93aWRnZXRfc2Vla2Jhci54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2Vfd2lkZ2V0X3NlZWtiYXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Y2Y4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ByZWZlcmVuY2Vfd2lkZ2V0X3NlZWtiYXIueG1sCkBAIC0wLDAgKzEsODcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IGZvciBhIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkuIFRoZQorICAgICBQcmVmZXJlbmNlIGlzIGFibGUgdG8gcGxhY2UgYSBzcGVjaWZpYyB3aWRnZXQgZm9yIGl0cyBwYXJ0aWN1bGFyCisgICAgIHR5cGUgaW4gdGhlICJ3aWRnZXRfZnJhbWUiIGxheW91dC4gLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI/YW5kcm9pZDphdHRyL3Njcm9sbGJhclNpemUiPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IkBkaW1lbi9wcmVmZXJlbmNlX2ljb25fbWluV2lkdGgiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorICAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWluV2lkdGg9IjQ4ZHAiCisgICAgICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI2ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgorICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiIC8+CisKKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zdW1tYXJ5IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3RpdGxlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAYW5kcm9pZDppZC90aXRsZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvclNlY29uZGFyeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjQiIC8+CisKKyAgICAgICAgPCEtLSBQcmVmZXJlbmNlIHNob3VsZCBwbGFjZSBpdHMgYWN0dWFsIHByZWZlcmVuY2Ugd2lkZ2V0IGhlcmUuIC0tPgorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC93aWRnZXRfZnJhbWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGFuZHJvaWQ6aWQvc3VtbWFyeSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGFuZHJvaWQ6aWQvdGl0bGUiCisgICAgICAgICAgICBhbmRyb2lkOm1pbldpZHRoPSJAZGltZW4vcHJlZmVyZW5jZV93aWRnZXRfd2lkdGgiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiAvPgorCisgICAgICAgIDxTZWVrQmFyIGFuZHJvaWQ6aWQ9IkArYW5kcm9pZDppZC9zZWVrYmFyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBhbmRyb2lkOmlkL3N1bW1hcnkiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBhbmRyb2lkOmlkL3dpZGdldF9mcmFtZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiIC8+CisKKyAgICA8L1JlbGF0aXZlTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV93aWRnZXRfc3dpdGNoLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvcHJlZmVyZW5jZV93aWRnZXRfc3dpdGNoLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRlZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9wcmVmZXJlbmNlX3dpZGdldF9zd2l0Y2gueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gTGF5b3V0IHVzZWQgYnkgU3dpdGNoUHJlZmVyZW5jZSBmb3IgdGhlIHN3aXRjaCB3aWRnZXQgc3R5bGUuIFRoaXMgaXMgaW5mbGF0ZWQKKyAgICAgaW5zaWRlIGFuZHJvaWQuUi5sYXlvdXQucHJlZmVyZW5jZS4gLS0+Cis8U3dpdGNoIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2FuZHJvaWQ6aWQvc3dpdGNoV2lkZ2V0IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgIGFuZHJvaWQ6cGFkZGluZz0iMTZkaXAiCisgICAgYW5kcm9pZDpmb2N1c2FibGU9ImZhbHNlIgorICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJmYWxzZSIgLz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19ob2xvLnhtbAppbmRleCA3Yzk1NjkzLi4wNmE1ZDk2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfaG9sby54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX2hvbG8ueG1sCkBAIC0yNyw5ICsyNyw2IEBACiAgICAgYW5kcm9pZDppZD0iQCthbmRyb2lkOmlkL3NlbGVjdF9kaWFsb2dfbGlzdHZpZXciCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjVkaXAiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkaXAiCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjE2ZGlwIgogICAgIGFuZHJvaWQ6Y2FjaGVDb2xvckhpbnQ9IkBudWxsIgogICAgIGFuZHJvaWQ6ZGl2aWRlcj0iP2FuZHJvaWQ6YXR0ci9saXN0RGl2aWRlckFsZXJ0RGlhbG9nIgogICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0idmVydGljYWwiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfaXRlbV9ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtX2hvbG8ueG1sCmluZGV4IDM5NjA5MmUuLjBjNzAwY2YgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtX2hvbG8ueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19pdGVtX2hvbG8ueG1sCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIgogICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCiAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZV9ob2xvLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19tdWx0aWNob2ljZV9ob2xvLnhtbAppbmRleCA4MDI3MDM1Li42ODMxNTFjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfbXVsdGljaG9pY2VfaG9sby54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX211bHRpY2hvaWNlX2hvbG8ueG1sCkBAIC0xOCw3ICsxOCw3IEBACiAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvdGV4dDEiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIgogICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCiAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9Ij9hbmRyb2lkOmF0dHIvdGV4dENvbG9yQWxlcnREaWFsb2dMaXN0SXRlbSIKICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2VfaG9sby54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3NlbGVjdF9kaWFsb2dfc2luZ2xlY2hvaWNlX2hvbG8ueG1sCmluZGV4IGNhYjUxOWYuLjUyNzgyZDAgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc2VsZWN0X2RpYWxvZ19zaW5nbGVjaG9pY2VfaG9sby54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zZWxlY3RfZGlhbG9nX3NpbmdsZWNob2ljZV9ob2xvLnhtbApAQCAtMTgsNyArMTgsNyBAQAogICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RleHQxIgogICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHRTbWFsbCIKICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtIgogICAgIGFuZHJvaWQ6dGV4dENvbG9yPSI/YW5kcm9pZDphdHRyL3RleHRDb2xvckFsZXJ0RGlhbG9nTGlzdEl0ZW0iCiAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sIGIvY29yZS9yZXMvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50LnhtbAppbmRleCA2NzZjMzhiLi4wZGM2NzQxIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudC54bWwKQEAgLTEsNCArMSw1IEBACiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKICAgICA+CkBAIC04LDQxICs5LDkgQEAKICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvbm90aWZ5X3BhbmVsX25vdGlmaWNhdGlvbl9pY29uX2JnIgogICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIgogICAgICAgICAvPgotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKKyAgICA8aW5jbHVkZSBsYXlvdXQ9IkBsYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudF9sYXJnZV9pY29uIiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkcCIKLSAgICAgICAgPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCi0gICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii0zZHAiCi0gICAgICAgICAgICAvPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9Ii0yZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaW5mbyIKLSAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuSW5mbyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjhkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgogICAgICAgICAvPgogPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudF9sYXJnZV9pY29uLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9sYXRlc3RfZXZlbnRfY29udGVudF9sYXJnZV9pY29uLnhtbAppbmRleCBlYmRhYWEzLi5kOTM3MzkyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnRfbGFyZ2VfaWNvbi54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC9zdGF0dXNfYmFyX2xhdGVzdF9ldmVudF9jb250ZW50X2xhcmdlX2ljb24ueG1sCkBAIC0xLDUwICsxLDY1IEBACiA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50X2NvbnRlbnRfbGFyZ2VfaWNvbiIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI4ZHAiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjhkcCIKICAgICA+Ci0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTZkcCIKKyAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKKyAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIgorICAgICAgICAvPgorICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHQyIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iLTJkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSItMmRwIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgYW5kcm9pZDphbHBoYT0iMC43IgorICAgICAgICAvPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuNyIKICAgICAgICAgPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LlRpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCi0gICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209Ii0zZHAiCi0gICAgICAgICAgICAvPgogICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgogICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSItMmRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgogICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgogICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCiAgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9pbmZvIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuSW5mbyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOGRwIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOGRwIgorICAgICAgICAgICAgLz4KICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9pbmZvIgotICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5JbmZvIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNGRwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNGRwIgotICAgICAgICAvPgotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEzZGlwIgotICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIgotICAgICAgICAvPgogPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdm9sdW1lX2FkanVzdC54bWwgYi9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ZvbHVtZV9hZGp1c3QueG1sCmluZGV4IGIwY2EzZTguLjczMDMwMDMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdm9sdW1lX2FkanVzdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC92b2x1bWVfYWRqdXN0LnhtbApAQCAtMTUsMjIgKzE1LDIxIEBACiAtLT4KIAogPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCI+Ci0KKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDgwZHAiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgogICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iODBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iODBkcCIKICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAYW5kcm9pZDpkcmF3YWJsZS9kaWFsb2dfZnVsbF9ob2xvX2RhcmsiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCiAgICAgICAgID4KIAogICAgICAgICA8TGluZWFyTGF5b3V0CiAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NsaWRlcl9ncm91cCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCiAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgICAgID4KICAgICAgICAgICAgIDwhLS0gU2xpZGVycyBnbyBoZXJlIC0tPgpAQCAtNTYsOSArNTUsNiBAQAogICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmQiCiAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9xdWlja3NldHRpbmdzIgogICAgICAgICAgICAgLz4KLSAgICAgICAgCisKICAgICA8L0xpbmVhckxheW91dD4KLQotPC9GcmFtZUxheW91dD4KLQotCis8L0ZyYW1lTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdm9sdW1lX2FkanVzdF9pdGVtLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvdm9sdW1lX2FkanVzdF9pdGVtLnhtbAppbmRleCBlODQxZDg3Li5iZWI1MTFkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3ZvbHVtZV9hZGp1c3RfaXRlbS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC92b2x1bWVfYWRqdXN0X2l0ZW0ueG1sCkBAIC0xNSw3ICsxNSw3IEBACiAtLT4KIAogPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iODBkaXAiCiAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkaXAiCkBAIC0zNCw4ICszNCw5IEBACiAgICAgPFNlZWtCYXIKICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvc2Vla0JhclN0eWxlIgogICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlZWtiYXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxNmRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iOGRpcCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjhkaXAiIC8+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbAppbmRleCA3NjRlYzg1Li5jYWI0M2FjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKQEAgLTQxMiw2ICs0MTIsMTAgQEAKICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldE9yaWVudGF0aW9uICgzMzY1OTQ3NzE3MTYzODY2ODQ0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iTGFhdCBcJ24gcHJvZ3JhbSB0b2Ugb20gZGllIHNrZXJtIHRlIGVuaWdlIHR5ZCB0ZSBkcmFhaS4gQmVob29ydCB2aXIgZ2V3b25lIHByb2dyYW1tZSBub29pdCBub2RpZyB0ZSB3ZWVzIG5pZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzICg0MjU1NDY3MjU1NDg4NjUzODU0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJMYWF0IHByb2dyYW0gdG9lIG9tIHRlIHZlcnNvZWsgZGF0IGRpZSB2b29yc2llbmRlIG1hdGVyaWFhbCBhYW4gYWxsZSBhYW5ob3VkZW5kZSBwcm9zZXNzZSBnZXN0dXVyIHdvcmQuIjwvc3RyaW5nPgpAQCAtMTIzNSw2ICsxMjM5LDEyIEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsYXVuY2hfd2FybmluZ19vcmlnaW5hbCAoMTg4MTAyMDIzMDIxNjY4NjgzKSAtLT4KICAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzbXZfYXBwbGljYXRpb24gKDI5NTU4MzgwNDM2MTIzNjI4OCkgLS0+CiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzbXZfcHJvY2VzcyAoNTEyMDM5NzAxMjA0NzQ2MjQ0NikgLS0+CkBAIC0xNTQwLDQgKzE1NTAsNiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3RvcmFnZV91c2IgKDMwMTc5NTQwNTk1Mzg1MTcyNzgpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCmluZGV4IDliNjc3YzIuLmI5N2JjN2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApAQCAtMzk2LDYgKzM5NiwxMCBAQAogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0T3JpZW50YXRpb24gKDMzNjU5NDc3MTcxNjM4NjY4NDQpIC0tPgogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiLhibXhjI3hiaDhiKvhi40g4Ymg4Yib4YqV4Yqb4YuN4YidIOGIsOGLk+GJtSDhi6jhiJvhi6vhipXhiJvhiL3hiqjhiK3hiqjhiKrhi6vhiIjhiJjhiIjhi4jhjKUg4Yut4Y2I4YmF4Yuz4YiN4Y2i4YiI4YiY4Yuw4Ymg4YqbIOGJteGMjeGJoOGIq+GLjuGJvSDhiaDhjY3hjYHhiJ0g4Yqg4Yur4Yi14Y2I4YiN4YyN4Yid4Y2iIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyAoNDI1NTQ2NzI1NTQ4ODY1Mzg1NCkgLS0+CiAgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i4Ym14YyN4Ymg4Yir4YuO4Ym9IOGIiOGIgeGIieGInSDhibDhiqjhibPhibPhi60g4YiC4Yuw4Ym24Ym9IOGIjeGKqOGLjSDhi6jhiJrhi6vhiYDhiK3hiafhibjhi40g4Yiy4YyN4YqT4YiO4Ym94YqVIOGIiOGImOGMoOGLqOGJhSDhi63hjYjhiYXhi7PhiI3hjaIiPC9zdHJpbmc+CkBAIC0xMTU0LDYgKzExNTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuGJteGMjeGJoOGIqyDhibDhi5jhi4vhi43hiK/hiI0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g4Yql4Yuo4YiE4YuwIOGKkOGLjeGNoiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDhiaDhi4vhipPhipDhibUg4Yuo4Ymw4YqQ4Yiz4YuN4Y2iIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuGJteGMjeGJoOGIq+GLjSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+KDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPiDhiILhi7DhibUpIOGJoOGIq+GItSDhibDhipDhiLPhiLogU3RyaWN0TW9kZSDhjZbhiIrhiLLhipUg4Yut4Ymw4YiL4YiI4Y2L4YiN4Y2iIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i4YiC4Yuw4YmxIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDhiaDhiKvhiLUg4Ymw4YqQ4Yiz4Yi6IFN0cmljdE1vZGUg4Y2W4YiK4Yiy4YqVIOGLreGJsOGIi+GIiOGNi+GIjeGNoiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g4Yqg4YiC4Yu1Ijwvc3RyaW5nPgpAQCAtMTQyMyw0ICsxNDMzLDYgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHN0b3JhZ2VfdXNiICgzMDE3OTU0MDU5NTM4NTE3Mjc4KSAtLT4KICAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAppbmRleCA2Nzk1MzQ4Li44ZDVlY2I4IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLZhNmE2LPZhdin2K0g2YTZhNmF2KfZhNmDINio2KXYsdiz2KfZhCDYp9mE2KPZh9iv2KfZgSDYpdmE2Ykg2KPYrdivINmF2LTYsdmB2Yog2KfZhNis2YfYp9iyLiDZhNinINmK2KzYqCDYp9iz2KrYrtiv2KfZhdmHINi52YTZiSDYp9mE2KXYt9mE2KfZgiDZhNmE2KrYt9io2YrZgtin2Kog2KfZhNi52KfYr9mK2KkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLYqti62YrZitixINin2KrYrNin2Ycg2KfZhNi02KfYtNipIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i2YTZhNiz2YXYp9itINmE2KrYt9io2YrZgiDZhdinINio2KrYutmK2YrYsSDYqtiv2YjZitixINin2YTYtNin2LTYqSDZgdmKINij2Yog2YjZgtiqLiDZhNinINmK2KzYqCDYp9iz2KrYrtiv2KfZhdmHINi52YTZiSDYp9mE2KXYt9mE2KfZgiDZhNmE2KrYt9io2YrZgtin2Kog2KfZhNi52KfYr9mK2KkuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+Itil2LHYs9in2YQg2KXYtNin2LHYp9iqIExpbnV4INmE2YTYqti32KjZitmC2KfYqiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4i2YTZhNiz2YXYp9itINmE2YTYqti32KjZitmCINio2LfZhNioINil2LHYs9in2YQg2KfZhNil2LTYp9ix2Kkg2KfZhNmF2LLZiNmR2K/YqSDZhNis2YXZiti5INin2YTYudmF2YTZitin2Kog2KfZhNmF2LPYqtmF2LHYqS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLYqti02LrZitmEINin2YTYqti32KjZitmCINiv2KfYptmF2YvYpyI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+Itiq2YXYqiDYpdi52KfYr9ipINiq2YjYrNmK2Ycg2KfZhNiq2LfYqNmK2YIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g2YLZitivINin2YTYqti02LrZitmEINin2YTYotmGLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4i2KrZhSDYqti02LrZitmEIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g2YXZhiDYp9mE2KPYtdmELiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLYp9mG2KrZh9mDINin2YTYqti32KjZitmCIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKNin2YTYudmF2YTZitipIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg2LPZitin2LPYqS5TdHJpY3RNb2RlINin2YTZhdmB2LHZiNi22Kkg2LDYp9iq2YrZi9inLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Itin2YbYqtmH2YPYqiDYp9mE2LnZhdmE2YrYqSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g2LPZitin2LPYqSBTdHJpY3RNb2RlINin2YTZhdmB2LHZiNi22Kkg2LDYp9iq2YrZi9inLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g2YrYudmF2YQiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLZiNit2K/YqSDYp9mE2KrYrtiy2YrZhiDYp9mE2K/Yp9iu2YTZitipIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+Itio2LfYp9mC2KkgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiLZiNit2K/YqSDYqtiu2LLZitmGIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKaW5kZXggNDcxMDIyNi4uYjQzYjUwZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i0KDQsNC30YDQtdGI0LDQstCwINC90LAg0L/RgNC40YLQtdC20LDRgtC10LvRjyDQtNCwINC40LfQv9GA0LDRidCwINC90LDQvNC10YDQtdC90LjRjyDQtNC+INCw0LTQvNC40L3QuNGB0YLRgNCw0YLQvtGAINC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+LiDQndC+0YDQvNCw0LvQvdC40YLQtSDQv9GA0LjQu9C+0LbQtdC90LjRjyDQsdC4INGC0YDRj9Cx0LLQsNC70L4g0L3QuNC60L7Qs9CwINC00LAg0L3QtSDRgdC1INC90YPQttC00LDRj9GCINC+0YIg0YLQvtCy0LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLQv9GA0L7QvNGP0L3QsCDQvdCwINC+0YDQuNC10L3RgtCw0YbQuNGP0YLQsCDQvdCwINC10LrRgNCw0L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviDQtNCwINC/0YDQvtC80LXQvdGPINC+0YDQuNC10L3RgtCw0YbQuNGP0YLQsCDQvdCwINC10LrRgNCw0L3QsCDQv9C+INCy0YHRj9C60L4g0LLRgNC10LzQtS4g0J3QvtGA0LzQsNC70L3QuNGC0LUg0L/RgNC40LvQvtC20LXQvdC40Y8g0LHQuCDRgtGA0Y/QsdCy0LDQu9C+INC90LjQutC+0LPQsCDQtNCwINC90LUg0YHQtSDQvdGD0LbQtNCw0Y/RgiDQvtGCINGC0L7QstCwLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiLQuNC30L/RgNCw0YnQsNC90LUg0L3QsCDRgdC40LPQvdCw0LvQuCDQvtGCIExpbnV4INC00L4g0L/RgNC40LvQvtC20LXQvdC40Y/RgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLQoNCw0LfRgNC10YjQsNCy0LAg0L3QsCDQv9GA0LjQu9C+0LbQtdC90LjQtdGC0L4g0LTQsCDQv9C+0LTQsNC00LUg0LfQsNGP0LLQutCwINC/0YDQtdC00L7RgdGC0LDQstC10L3QuNGP0YIg0YHQuNCz0L3QsNC7INC00LAg0YHQtSDQuNC30L/RgNCw0YLQuCDQtNC+INCy0YHQuNGH0LrQuCDQv9C+0YHRgtC+0Y/QvdC90Lgg0L/RgNC+0YbQtdGB0LguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4i0LfQsNC00LDQstCw0L3QtSDQvdCwINC/0L7RgdGC0L7Rj9C90L3QviDQuNC30L/RitC70L3QtdC90LjQtSDQvdCwINC/0YDQuNC70L7QttC10L3QuNC10YLQviI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+ItCf0YDQuNC70L7QttC10L3QuNC10YLQviDRgdC1INC/0YDQtdC90LDRgdC+0YfQuCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDRgdC1INC40LfQv9GK0LvQvdGP0LLQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+ItCf0YrRgNCy0L7QvdCw0YfQsNC70L3QviDQsdC1INGB0YLQsNGA0YLQuNGA0LDQvdC+OiA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLQn9GA0LjQu9C+0LbQtdC90LjQtdGC0L4gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo0L/RgNC+0YbQtdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg0L3QsNGA0YPRiNC4INC/0YDQsNCy0LjQu9C+0YLQviDQt9CwINGB0YLRgNC40LrRgtC10L0g0YDQtdC20LjQvCwg0L3QsNC70L7QttC10L3QviDQvtGCINGB0LDQvNC+0YLQviDQvdC10LPQvi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLQn9GA0L7RhtC10YHRitGCIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDQvdCw0YDRg9GI0Lgg0L/RgNCw0LLQuNC70L7RgtC+INC30LAg0YHRgtGA0LjQutGC0LXQvSDRgNC10LbQuNC8LCDQvdCw0LvQvtC20LXQvdC+INC+0YIg0YHQsNC80LjRjyDQvdC10LPQvi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+INGB0LUg0LjQt9C/0YrQu9C90Y/QstCwIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4i0JLRitGC0YDQtdGI0L3QviDRhdGA0LDQvdC40LvQuNGJ0LUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qg0LrQsNGA0YLQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQiDRhdGA0LDQvdC40LvQuNGJ0LUiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sCmluZGV4IGUyYWVjNTYuLjI5NDdiOTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBlcm1ldCBhbCB0aXR1bGFyIGVudmlhciBpbnRlbmNpb25zIGEgdW4gYWRtaW5pc3RyYWRvciBkZWwgc2lzdGVtYS4gTm8gc1wnaGF1cmlhIGRlIG5lY2Vzc2l0YXIgbWFpIHBlciBhIGxlcyBhcGxpY2FjaW9ucyBub3JtYWxzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iY2FudmlhciBsXCdvcmllbnRhY2nDsyBkZSBsYSBwYW50YWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlBlcm1ldCBhIHVuYSBhcGxpY2FjacOzIGNhbnZpYXIgZWwgZ2lyIGRlIGxhIHBhbnRhbGxhIGVuIHF1YWxzZXZvbCBtb21lbnQuIE5vIHNcJ2hhdXJpYSBkZSBuZWNlc3NpdGFyIG1haSBwZXIgYSBsZXMgYXBsaWNhY2lvbnMgbm9ybWFscy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iZW52aWFyIHNlbnlhbHMgTGludXggYSBsZXMgYXBsaWNhY2lvbnMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBlcm1ldCBhIGxcJ2FwbGljYWNpw7Mgc29swrdsaWNpdGFyIHF1ZSBlbCBzZW55YWwgc3VibWluaXN0cmF0IHNcJ2VudmnDryBhIHRvdHMgZWxzIHByb2Nlc3NvcyBwZXJzaXN0ZW50cy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJmZXIgcXVlIGxcJ2FwbGljYWNpw7Mgc1wnZXhlY3V0aSBzZW1wcmUiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpY2FjacOzIHJlZGlyaWdpZGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc1wnZXN0w6AgZXhlY3V0YW50LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBlcyB2YSBpbmljaWFyIG9yaWdpbmFsbWVudC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTFwnYXBsaWNhY2nDsyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jw6lzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGEgaW5jb21wbGVydCBsYSBzZXZhIHBvbMOtdGljYSBhdXRvaW1wb3NhZGEgZGUgbW9kZSBlc3RyaWN0ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJFbCBwcm9jw6lzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSBpbmNvbXBsZXJ0IGxhIHNldmEgcG9sw610aWNhIGRlIG1vZGUgZXN0cmljdGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBzXCdlc3TDoCBleGVjdXRhbnQiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJFbW1hZ2F0emVtYXRnZSBpbnRlcm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iVGFyZ2V0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkVtbWFnYXR6ZW1hdGdlIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKaW5kZXggN2Y5MjQxMC4uOTJkZWFjYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iVW1vxb7FiHVqZSBkcsW+aXRlbGkgb3Byw6F2bsSbbsOtIG9kZXPDrWxhdCBpbmZvcm1hY2Ugc3Byw6F2Y2kgemHFmcOtemVuw60uIELEm8W+bsOpIGFwbGlrYWNlIGJ5IHRvdG8gb3Byw6F2bsSbbsOtIG5pa2R5IG5lbcSbbHkgcG/FvmFkb3ZhdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+InptxJtuYSBvcmllbnRhY2Ugb2JyYXpvdmt5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iVW1vxb7FiHVqZSBhcGxpa2FjaSBrZHlrb2xpIHptxJtuaXQgb3JpZW50YWNpIG9icmF6b3ZreS4gQsSbxb5uw6kgYXBsaWthY2UgYnkgdG90byBuYXN0YXZlbsOtIG5pa2R5IG5lbcSbbHkgdnl1xb7DrXZhdC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ib2Rlc2zDoW7DrSBzaWduw6Fsxa8gTGludXggYXBsaWthY8OtbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iVW1vxb7FiHVqZSBhcGxpa2FjaSB2ecW+w6FkYXQgemFzbMOhbsOtIHBvc2t5dG51dMOpaG8gc2lnbsOhbHUgdsWhZW0gdHJ2YWzDvW0gcHJvY2Vzxa9tLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+InRydmFsw6kgc3B1xaF0xJtuw60gYXBsaWthY2UiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpa2FjZSBwxZllc23Em3JvdsOhbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IkplIHNwdcWhdMSbbmEgYXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IlDFr3ZvZG7EmyBieWxhIHNwdcWhdMSbbmEgYXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgcG9ydcWhaWxhIHN2w6kgdmxhc3Ruw60gdnludWNlbsOpIHrDoXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHBvcnXFoWlsIHN2w6kgdmxhc3Ruw60gdnludWNlbsOpIHrDoXNhZHkgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+IkLEm8W+w60gYXBsaWthY2UgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJJbnRlcm7DrSDDumxvxb5pxaF0xJsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iS2FydGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiLDmmxvxb5pxaF0xJsgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAppbmRleCA3YjA1YTBlLi5hMzE0OWEyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJUaWxsYWRlciBicnVnZXJlbiBhdCBzZW5kZSBoZW5zaWd0ZXIgdGlsIGVuIGVuaGVkc2FkbWluaXN0cmF0b3IuIELDuHIgYWxkcmlnIHbDpnJlIG7DuGR2ZW5kaWd0IGZvciBhbG1pbmRlbGlnZSBwcm9ncmFtbWVyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ic2tpZnQgc2vDpnJtcmV0bmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlRpbGxhZGVyLCBhdCBldCBwcm9ncmFtIMOmbmRyZXIgcm90YXRpb25lbiBhZiBza8Omcm1lbiBuw6VyIHNvbSBoZWxzdC4gQsO4ciBhbGRyaWcgdsOmcmUgbsO4ZHZlbmRpZ3QgdGlsIG5vcm1hbGUgcHJvZ3JhbW1lci4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ic2VuZCBMaW51eC1zaWduYWxlciB0aWwgcHJvZ3JhbW1lciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iVGlsbGFkZXIsIGF0IHByb2dyYW1tZXQga2FuIGFubW9kZSBvbSwgYXQgZGV0IGxldmVyZWRlIHNpZ25hbCBzZW5kZXMgdGlsIGFsbGUgdmVkaG9sZGVuZGUgcHJvY2Vzc2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImxhZCBhbHRpZCBwcm9ncmFtbWV0IGvDuHJlIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iUHJvZ3JhbW1ldCBlciBvbWRpcmlnZXJldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBrw7hyZXIgbnUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGJsZXYgb3ByaW5kZWxpZ3Qgw6VibmV0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJQcm9ncmFtbWV0IDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhciBvdmVydHLDpWR0IHNpbiBlZ2VuIFN0cmljdE1vZGUtcG9saXRpay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXNzZW4gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhciBvdmVydHLDpWR0IHNpbiBlZ2VuIFN0cmljdE1vZGUtcG9saXRpay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVyIGkgZ2FuZyI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkludGVybnQgbGFnZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qta29ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQi1sYWdlciI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9kb25vdHRyYW5zbGF0ZS1jbGRyLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvZG9ub3R0cmFuc2xhdGUtY2xkci54bWwKaW5kZXggZmZmY2YyNi4uNmI0YmY1YyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9kb25vdHRyYW5zbGF0ZS1jbGRyLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL2Rvbm90dHJhbnNsYXRlLWNsZHIueG1sCkBAIC0zMSw3ICszMSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fZmVicnVhcnkiPkZlYi48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9tYXJjaCI+TcOkci48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9hcHJpbCI+QXByLjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX21heSI+TWFpLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX21heSI+TWFpPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJtb250aF9tZWRpdW1fanVuZSI+SnVuLjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibW9udGhfbWVkaXVtX2p1bHkiPkp1bC48L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im1vbnRoX21lZGl1bV9hdWd1c3QiPkF1Zy48L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sCmluZGV4IDM4YzhmNmMuLmI2YjZiZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IkVybcO2Z2xpY2h0IGRlbSBIYWx0ZXIsIEludGVudHMgYW4gZWluZW4gR2Vyw6R0ZWFkbWluaXN0cmF0b3IgenUgc2VuZGVuLiBTb2xsdGUgbmllIGbDvHIgbm9ybWFsZSBBbndlbmR1bmdlbiBiZW7DtnRpZ3Qgd2VyZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iQmlsZHNjaGlybWF1c3JpY2h0dW5nIMOkbmRlcm4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJFcm3DtmdsaWNodCBkZXIgQW53ZW5kdW5nLCBkaWUgQmlsZHNjaGlybWRyZWh1bmcgamVkZXJ6ZWl0IHp1IMOkbmRlcm4uIFNvbGx0ZSBuaWNodCBmw7xyIG5vcm1hbGUgQW53ZW5kdW5nZW4gYmVuw7Z0aWd0IHdlcmRlbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iTGludXgtU2lnbmFsZSBhbiBBbndlbmR1bmdlbiBzZW5kZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkVybcO2Z2xpY2h0IGRlciBBbndlbmR1bmcsIGRhcyBTZW5kZW4gZGVzIGdlbGllZmVydGVuIFNpZ25hbHMgYW4gYWxsZSBhbmhhbHRlbmRlbiBQcm96ZXNzZSB6dSBmb3JkZXJuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iQW53ZW5kdW5nZW4gcGVybWFuZW50IGF1c2bDvGhyZW4iPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBbndlbmR1bmcgdW1nZWxlaXRldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB3aXJkIGpldHp0IGF1c2dlZsO8aHJ0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB3dXJkZSB1cnNwcsO8bmdsaWNoIGdlc3RhcnRldC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iRGllIEFud2VuZHVuZyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChQcm96ZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGF0IGdlZ2VuIGlocmUgc2VsYnN0ZXJ6d3VuZ2VuZSBTdHJpY3RNb2RlLVJpY2h0bGluaWUgdmVyc3Rvw59lbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJEZXIgUHJvemVzcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGF0IGdlZ2VuIHNlaW5lIHNlbGJzdGVyend1bmdlbmUgU3RyaWN0TW9kZS1SaWNodGxpbmllIHZlcnN0b8OfZW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBsw6R1ZnQiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJJbnRlcm5lciBTcGVpY2hlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRC1LYXJ0ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQi1TcGVpY2hlciI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKaW5kZXggMDE3YmU5Yi4uYTVlMTNmMSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4izpXPgM65z4TPgc6tz4DOtc65IM+Dz4TOv869IM66zqzPhM6/z4fOvyDPhM63zr0gzrHPgM6/z4PPhM6/zrvOriDPg8+Ez4zPh8+Jzr0gz4POtSDOrc69zrHOvSDOtM65zrHPh861zrnPgc65z4PPhM6uIM+Dz4XPg866zrXPhc6uz4IuIM6UzrXOvSDOuM6xIM+Hz4HOtc65zrHPg8+EzrXOryDPgM6/z4TOrSDOs865zrEgzrrOsc69zr/Ovc65zrrOrc+CIM61z4bOsc+BzrzOv86zzq3Pgi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Is6xzrvOu86xzrPOriDPgM+Bzr/Pg86xzr3Osc+Ezr/Ou865z4POvM6/z40gzr/OuM+Mzr3Ot8+CIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xzrvOu86xzrPOriDPhM63z4Igz4DOtc+BzrnPg8+Ez4HOv8+Gzq7PgiDPhM63z4Igzr/OuM+Mzr3Ot8+CIM6/z4DOv865zrHOtM6uz4DOv8+EzrUgz4PPhM65zrPOvM6uLiDOlM61zr0gzrXOr869zrHOuSDOsc+AzrHPgc6xzq/PhM63z4TOvyDOs865zrEgzrrOsc69zr/Ovc65zrrOrc+CIM61z4bOsc+BzrzOv86zzq3Pgi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4izrHPgM6/z4PPhM6/zrvOriDPg863zrzOrM+Ez4nOvSBMaW51eCDPg861IM61z4bOsc+BzrzOv86zzq3PgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4izpXPgM65z4TPgc6tz4DOtc65IM+DzrUgzrzOuc6xIM61z4bOsc+BzrzOv86zzq4gz4TOt869IM6xz4DOv8+Dz4TOv867zq4gzrHOuc+Ezq7OvM6xz4TOv8+CIM6zzrnOsSDPhM63zr0gzrHPgM6/z4PPhM6/zrvOriDPhM6/z4Ugz4DOsc+BzrXPh8+MzrzOtc69zr/PhSDPg86uzrzOsc+Ezr/PgiDPg861IM+MzrvOtc+CIM+EzrnPgiDPhc+AzqzPgc+Hzr/Phc+DzrXPgiDOtM65zrHOtM65zrrOsc+Dzq/Otc+CLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Is63IM61z4bOsc+BzrzOv86zzq4gzr3OsSDOtc66z4TOtc67zrXOr8+EzrHOuSDPg8+Fzr3Otc+Hz47PgiI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+Is6Rzr3Osc66zrHPhM61z43OuM+Fzr3Pg863IM61z4bOsc+BzrzOv86zzq7PgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4izpcgzrXPhs6xz4HOvM6/zrPOriA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IM61zrrPhM61zrvOtc6vz4TOsc65IM+Ez47Pgc6xLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4izojOs865zr3OtSDOtc66zrrOr869zrfPg863IM+Az4HPjs+EzrEgz4TOt8+CIM61z4bOsc+BzrzOv86zzq7PgiA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLOlyDOtc+GzrHPgc68zr/Os86uIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKM60zrnOtc+BzrPOsc+Dzq/OsSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIM+AzrHPgc6xzrLOr86xz4POtSDPhM63zr0gzrHPhc+Ezr/Otc+AzrnOss6xzrvPjM68zrXOvc63IM+Azr/Ou865z4TOuc66zq4gU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLOlyDOtM65zrXPgc6zzrHPg86vzrEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IM+AzrHPgc6xzrLOr86xz4POtSDPhM63zr0gzrHPhc+Ezr/Otc+AzrnOss6xzrvPjM68zrXOvc63IM+Azr/Ou865z4TOuc66zq4gU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Is6XIM61z4bOsc+BzrzOv86zzq4gPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gzrXOus+EzrXOu861zq/PhM6xzrkiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLOlc+Dz4nPhM61z4HOuc66z4zPgiDPh8+Oz4HOv8+CIM6xz4DOv864zq7Ous61z4XPg863z4IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4izprOrM+Bz4TOsSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+Is6nz47Pgc6/z4IgzrHPgM6/zrjOrs66zrXPhc+DzrfPgiBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKaW5kZXggYWJmMThmMS4uZDVlZjk4YiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJBbGxvd3MgdGhlIGhvbGRlciB0byBzZW5kIGludGVudHMgdG8gYSBkZXZpY2UgYWRtaW5pc3RyYXRvci4gU2hvdWxkIG5ldmVyIGJlIG5lZWRlZCBmb3Igbm9ybWFsIGFwcGxpY2F0aW9ucy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+ImNoYW5nZSBzY3JlZW4gb3JpZW50YXRpb24iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gY2hhbmdlIHRoZSByb3RhdGlvbiBvZiB0aGUgc2NyZWVuIGF0IGFueSB0aW1lLiBTaG91bGQgbmV2ZXIgYmUgbmVlZGVkIGZvciBub3JtYWwgYXBwbGljYXRpb25zLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJzZW5kIExpbnV4IHNpZ25hbHMgdG8gYXBwbGljYXRpb25zIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJBbGxvd3MgYXBwbGljYXRpb24gdG8gcmVxdWVzdCB0aGF0IHRoZSBzdXBwbGllZCBzaWduYWwgYmUgc2VudCB0byBhbGwgcGVyc2lzdGVudCBwcm9jZXNzZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4ibWFrZSBhcHBsaWNhdGlvbiBhbHdheXMgcnVuIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBwbGljYXRpb24gcmVkaXJlY3RlZCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBpcyBub3cgcnVubmluZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gd2FzIG9yaWdpbmFsbHkgbGF1bmNoZWQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlRoZSBhcHBsaWNhdGlvbiA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGFzIHZpb2xhdGVkIGl0cyBzZWxmLWVuZm9yY2VkIFN0cmljdE1vZGUgcG9saWN5LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlRoZSBwcm9jZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYXMgdmlvbGF0ZWQgaXRzIHNlbGYtZW5mb3JjZWQgU3RyaWN0TW9kZSBwb2xpY3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBydW5uaW5nIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSW50ZXJuYWwgU3RvcmFnZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCBDYXJkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIHN0b3JhZ2UiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKaW5kZXggMTc4ZTA3Ni4uM2NiNjFlNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJQZXJtaXRlIHF1ZSBlbCBwcm9waWV0YXJpbyBlbnbDrWUgc3VzIGludGVudG9zIGEgdW4gYWRtaW5pc3RyYWRvciBkZSBkaXNwb3NpdGl2b3MuIE5vIHNlIG5lY2VzaXRhIHBhcmEgbGFzIGFwbGljYWNpb25lcyBub3JtYWxlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+ImNhbWJpYXIgbGEgb3JpZW50YWNpw7NuIGRlIGxhIHBhbnRhbGxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iQWRtaXRlIHVuYSBhcGxpY2FjacOzbiBxdWUgY2FtYmlhIGxhIHJvdGFjacOzbiBkZSBsYSBwYW50YWxsYSBlbiBjdWFscXVpZXIgbW9tZW50by4gU2UgZGViZSBldml0YXIgdXRpbGl6YXJsbyBlbiBhcGxpY2FjaW9uZXMgbm9ybWFsZXMuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ImVudmlhciBzZcOxYWxlcyBkZSBMaW51eCBhIGxhcyBhcGxpY2FjaW9uZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkFkbWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gc29saWNpdGUgZWwgZW52w61vIGRlIGxhIHNlw7FhbCBzdW1pbmlzdHJhZGEgYSB0b2RvcyBsb3MgcHJvY2Vzb3MgY29udGludW9zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImhhY2VyIHF1ZSBzaWVtcHJlIHNlIGVqZWN1dGUgbGEgYXBsaWNhY2nDs24iPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJTZSByZWRpcmlnacOzIGxhIGFwbGljYWNpw7NuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHNlIGVzdMOhIGVqZWN1dGFuZG8gYWhvcmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHNlIGluaWNpw7Mgb3JpZ2luYWxtZW50ZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iTGEgYXBsaWNhY2nDs24gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGhhIHZpb2xhZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2ltcHVlc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkVsIHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGhhIHZpb2xhZG8gc3UgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0b2ltcHVlc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZW4gZWplY3VjacOzbiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkFsbWFjZW5hbWllbnRvIGludGVybm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iVGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKaW5kZXggOTY4YTNiZS4uOWRiODBjYSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmFja3VwIiBtc2dpZD0iNDcwMDEzMDIyODY1NDUzOTIwIj4iY29udHJvbGFyIGxhcyBjb3BpYXMgZGUgc2VndXJpZGFkIHkgbGFzIHJlc3RhdXJhY2lvbmVzIGRlbCBzaXN0ZW1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmFja3VwIiBtc2dpZD0iNDgzNzQ5MzA2NTE1NDI1NjUyNSI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGNvbnRyb2xlIGVsIG1lY2FuaXNtbyBkZSBjb3BpYSBkZSBzZWd1cmlkYWQgeSByZXN0YXVyYWNpw7NuIGRlbCBzaXN0ZW1hLiBFc3RlIHBlcm1pc28gbm8gZXN0w6EgZGVzdGluYWRvIGEgYXBsaWNhY2lvbmVzIG5vcm1hbGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjU1NTcwNzEzMjU4MDQ0NjkxMDIiPiJjb25maXJtYXIgcmVzdGF1cmFjacOzbiBvIGNvcGlhIGRlIHNlZ3VyaWRhZCBjb21wbGV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI5MDA1MDE3NzU0MTc1ODk3OTU0Ij4iUGVybWl0ZSBxdWUgbGEgYXBsaWNhY2nDs24gaW5pY2llIGxhIGludGVyZmF6IGRlIHVzdWFyaW8gZGUgY29uZmlybWFjacOzbiBkZSBjb3BpYSBkZSBzZWd1cmlkYWQgY29tcGxldGEgKG5pbmd1bmEgYXBsaWNhY2nDs24gZGViZSB1dGlsaXphcmxhKS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iOTAwNTAxNzc1NDE3NTg5Nzk1NCI+IlBlcm1pdGUgcXVlIGxhIGFwbGljYWNpw7NuIGluaWNpZSBsYSBpbnRlcmZheiBkZSB1c3VhcmlvIGRlIGNvbmZpcm1hY2nDs24gZGUgY29waWEgZGUgc2VndXJpZGFkIGNvbXBsZXRhIChuaW5ndW5hIGFwbGljYWNpw7NuIGRlYmVyw61hIHV0aWxpemFybGEpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSIyMTQ4NTYzNjI4MTQwMTkzMjMxIj4ibW9zdHJhciB2ZW50YW5hcyBubyBhdXRvcml6YWRhcyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2ludGVybmFsU3lzdGVtV2luZG93IiBtc2dpZD0iNTg5NTA4MjI2ODI4NDk5ODQ2OSI+IlBlcm1pdGUgbGEgY3JlYWNpw7NuIGRlIHZlbnRhbmFzIGRlc3RpbmFkYXMgYWwgdXNvIHBvciBwYXJ0ZSBkZSBsYSBpbnRlcmZheiBkZSB1c3VhcmlvIGludGVybmEgZGVsIHNpc3RlbWEuIE5vIGVzdMOhIGRlc3RpbmFkbyBhbCB1c28gcG9yIHBhcnRlIGRlIGFwbGljYWNpb25lcyBub3JtYWxlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N5c3RlbUFsZXJ0V2luZG93IiBtc2dpZD0iMzM3MjMyMTk0Mjk0MTE2ODMyNCI+Im1vc3RyYXIgYWxlcnRhcyBkZSBuaXZlbCBkZWwgc2lzdGVtYSI8L3N0cmluZz4KQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJQZXJtaXRlIGVudmlhciBpbnRlbnRvcyBhIHVuIGFkbWluaXN0cmFkb3IgZGUgZGlzcG9zaXRpdm9zLiBFc3RlIHBlcm1pc28gbnVuY2EgZGViZXLDrWEgc2VyIG5lY2VzYXJpbyBwYXJhIGxhcyBhcGxpY2FjaW9uZXMgbm9ybWFsZXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJjYW1iaWFyIG9yaWVudGFjacOzbiBkZSBsYSBwYW50YWxsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlBlcm1pdGUgcXVlIHVuYSBhcGxpY2FjacOzbiBjYW1iaWUgbGEgcm90YWNpw7NuIGRlIGxhIHBhbnRhbGxhIGVuIGN1YWxxdWllciBtb21lbnRvLiBObyBkZWJlcsOtYSBzZXIgbmVjZXNhcmlvIG51bmNhIHBhcmEgbGFzIGFwbGljYWNpb25lcyBub3JtYWxlcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iZW52aWFyIHNlw7FhbGVzIExpbnV4IGEgYXBsaWNhY2lvbmVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJQZXJtaXRlIHF1ZSBsYSBhcGxpY2FjacOzbiBzb2xpY2l0ZSBxdWUgbGEgc2XDsWFsIHN1bWluaXN0cmFkYSBzZSBlbnbDrWUgYSB0b2RvcyBsb3MgcHJvY2Vzb3MgcGVyc2lzdGVudGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImhhY2VyIHF1ZSBsYSBhcGxpY2FjacOzbiBzZSBlamVjdXRlIHNpZW1wcmUiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpY2FjacOzbiByZWRpcmVjY2lvbmFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBzZSBlc3TDoSBlamVjdXRhbmRvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iSW5pY2lhbG1lbnRlLCBzZSBpbmljacOzIGxhIGFwbGljYWNpw7NuIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxhIGFwbGljYWNpw7NuIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBoYSBpbmZyaW5naWRvIHN1IHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG9hcGxpY2FibGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iRWwgcHJvY2VzbyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGEgaW5mcmluZ2lkbyBzdSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBhdXRvYXBsaWNhYmxlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gZW4gZWplY3VjacOzbiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkFsbWFjZW5hbWllbnRvIGludGVybm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iVGFyamV0YSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkFsbWFjZW5hbWllbnRvIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKaW5kZXggZGY3NDhjZC4uM2ZjYjIxZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i2KjZhyDZhtqv2YfYr9in2LHZhtiv2Ycg2KfYrNin2LLZhyDZhduMINiv2YfYryDZhdmB2KfYryDYsdinINio2Ycg24zaqSDYs9ix2b7Ysdiz2Kog2K/Ys9iq2q/Yp9mHINin2LHYs9in2YQg2qnZhtivLiDZh9ix2q/YsiDYqNix2KfbjCDYqNix2YbYp9mF2Ycg2YfYp9uMINmF2LnZhdmI2YTbjCDZhdmI2LHYryDZhtuM2KfYsiDZhtuM2LPYqi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Itiq2LrbjNuM2LEg2KzZh9iqINi12YHYrdmHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i2KjZhyDbjNqpINio2LHZhtin2YXZhyDaqdin2LHYqNix2K/bjCDYp9is2KfYstmHINmF24wg2K/Zh9ivINqG2LHYrti0INi12YHYrdmHINix2Kcg2K/YsSDZh9ixINiy2YXYp9mG24wg2KrYutuM24zYsSDYr9mH2K8uINmH2LHar9iyINio2LHYp9uMINio2LHZhtin2YXZhyDZh9in24wg2YXYudmF2YjZhNuMINmF2YjYsdivINmG24zYp9iyINmG24zYs9iqLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiLYp9ix2LPYp9mEINiz24zar9mG2KfZhCDZh9in24wgTGludXgg2KjYsdin24wg2KjYsdmG2KfZhdmHINmH2KciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+Itio2Ycg2KjYsdmG2KfZhdmHINqp2KfYsdio2LHYr9uMINin2KzYp9iy2Ycg2YXbjCDYr9mH2K8g2K/Ysdiu2YjYp9iz2Kog2qnZhtivINqp2Ycg2LPbjNqv2YbYp9mEINin2LHYp9im2Ycg2LTYr9mHINix2Kcg2KjZhyDYqtmF2KfZhSDZgdix2KfbjNmG2K/Zh9in24wg2KvYp9io2Kog2KfYsdiz2KfZhCDaqdmG2K8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4i2KjYsdmG2KfZhdmHINmH2YXbjNi02Ycg2KfYrNix2Kcg2LTZiNivIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i2KjYsdmG2KfZhdmHINmH2K/Yp9uM2Kog2YXYrNiv2K8g2LTYryI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDYp9qp2YbZiNmGINiv2LEg2K3Yp9mEINin2KzYsdinINin2LPYqi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g2KfYsiDYp9io2KrYr9inINix2KfZhyDYp9mG2K/Yp9iy24wg2LTYry4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i2KjYsdmG2KfZhdmHIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKNm+2LHYr9in2LLYtCA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pINiu2Lcg2YXYtNuMIFN0cmljdE1vZGUg2KfYrNix2KfbjCDYrtmI2K/aqdin2LEg2LHYpyDZhtmC2LYg2qnYsdiv2Ycg2KfYs9iqLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+ItmB2LHYotuM2YbYryA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g2K7YtyDZhdi024wgU3RyaWN0TW9kZSDYp9is2LHYp9uMINiu2YjYr9qp2KfYsSDYrtmI2K8g2LHYpyDZhtmC2LYg2qnYsdiv2Ycg2KfYs9iqLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g2K/YsSDYrdin2YQg2KfYrNix2KciPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLYrdin2YHYuNmHINiv2KfYrtmE24wiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4i2qnYp9ix2KogU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiLYrdin2YHYuNmHIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKaW5kZXggNmIwNjE5Ny4uNzBlNWZmNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iQW50YWEgc292ZWxsdWtzZW4gbMOkaGV0dMOkw6Qga3lzZWx5aXTDpCBsYWl0dGVlbiBqw6RyamVzdGVsbcOkbnZhbHZvamFsbGUuIEVpIHRhdmFsbGlzdGVuIHNvdmVsbHVrc2llbiBrw6R5dHTDtsO2bi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Im11dXRhIG7DpHl0w7ZuIHN1dW50YWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJBbnRhYSBzb3ZlbGx1a3NlbiB2YWlodGFhIG7DpHl0w7ZuIHN1dW50YWEgbWlsbG9pbiB0YWhhbnNhLiBFaSB0YXZhbGxpc3RlbiBzb3ZlbGx1a3NpZW4ga8OkeXR0w7bDtm4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ImzDpGhldHTDpMOkIHNvdmVsbHVrc2lpbiBMaW51eC1zaWduYWFsZWphIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJBbnRhYSBzb3ZlbGx1a3NlbiBweXl0w6TDpCwgZXR0w6Qgc2lnbmFhbGkgbMOkaGV0ZXTDpMOkbiBrYWlraWxsZSBraWludGVpbGxlIHByb3Nlc3NlaWxsZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJhc2V0YSBzb3ZlbGx1cyBvbGVtYWFuIGphdGt1dmFzdGkga8OkeW5uaXNzw6QiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJTb3ZlbGx1cyB1dWRlbGxlZW5vaGphc2kiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gb24gbnl0IGvDpHlubmlzc8OkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBrw6R5bm5pc3RldHRpaW4gYWx1biBwZXJpbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iU292ZWxsdXMgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvc2Vzc2kgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBvbiByaWtrb251dCBpdHNlIGvDpHl0dMO2w7ZuIG90dGFtYWFuc2EgU3RyaWN0TW9kZS1rw6R5dMOkbnTDtsOkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb3Nlc3NpIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBvbiByaWtrb251dCBpdHNlIGvDpHl0dMO2w7ZuIG90dGFtYWFuc2EgU3RyaWN0TW9kZS1rw6R5dMOkbnTDtsOkLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4ga8OkeW5uaXNzw6QiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJTaXPDpGluZW4gdGFsbGVubnVzdGlsYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRC1rb3J0dGkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0ItdGFsbGVubnVzdGlsYSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKaW5kZXggN2IyZjljMC4uYzYxOGVkZiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmFja3VwIiBtc2dpZD0iNDcwMDEzMDIyODY1NDUzOTIwIj4iY29udHLDtGxlciBsYSBzYXV2ZWdhcmRlIGV0IGxhIHJlc3RhdXJhdGlvbiBkdSBzeXN0w6htZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JhY2t1cCIgbXNnaWQ9IjQ4Mzc0OTMwNjUxNTQyNTY1MjUiPiJBdXRvcmlzZSBsXCdhcHBsaWNhdGlvbiDDoCBjb250csO0bGVyIGxlIG3DqWNhbmlzbWUgZGUgc2F1dmVnYXJkZSBldCBkZSByZXN0YXVyYXRpb24gZHUgc3lzdMOobWUuIE5lIHBhcyB1dGlsaXNlciBwb3VyIGxlcyBhcHBsaWNhdGlvbnMgc3RhbmRhcmQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iNTU1NzA3MTMyNTgwNDQ2OTEwMiI+ImNvbmZpcm1lciB1bmUgc2F1dmVnYXJkZSBjb21wbMOodGUgb3UgdW5lIHJlc3RhdXJhdGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI5MDA1MDE3NzU0MTc1ODk3OTU0Ij4iUGVybWV0IMOgIGxcJ2FwcGxpY2F0aW9uIGRlIGxhbmNlciBsXCdpbnRlcmZhY2UgdXRpbGlzYXRldXIgZGUgY29uZmlybWF0aW9uIGRlIGxhIHNhdXZlZ2FyZGUgY29tcGzDqHRlLiBTZXVsZXMgY2VydGFpbmVzIGFwcGxpY2F0aW9ucyBwZXV2ZW50IGLDqW7DqWZpY2llciBkZSBjZXR0ZSBwZXJtaXNzaW9uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI5MDA1MDE3NzU0MTc1ODk3OTU0Ij4iUGVybWV0IMOgIGxcJ2FwcGxpY2F0aW9uIGRlIGxhbmNlciBsXCdpbnRlcmZhY2UgZGUgY29uZmlybWF0aW9uIGRlIHNhdXZlZ2FyZGUgY29tcGzDqHRlLiBTZXVsZXMgY2VydGFpbmVzIGFwcGxpY2F0aW9ucyBwZXV2ZW50IGLDqW7DqWZpY2llciBkZSBjZXR0ZSBwZXJtaXNzaW9uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSIyMTQ4NTYzNjI4MTQwMTkzMjMxIj4iQWZmaWNoYWdlIGRlIGZlbsOqdHJlcyBub24gYXV0b3Jpc8OpZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19pbnRlcm5hbFN5c3RlbVdpbmRvdyIgbXNnaWQ9IjU4OTUwODIyNjgyODQ5OTg0NjkiPiJQZXJtZXQgZGUgY3LDqWVyIGRlcyBmZW7DqnRyZXMgY29uw6d1ZXMgcG91ciBsXCdpbnRlcmZhY2UgdXRpbGlzYXRldXIgZHUgc3lzdMOobWUgaW50ZXJuZS4gTGVzIGFwcGxpY2F0aW9ucyBub3JtYWxlcyBuXCd1dGlsaXNlbnQgcGFzIGNldHRlIGZvbmN0aW9ubmFsaXTDqS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3N5c3RlbUFsZXJ0V2luZG93IiBtc2dpZD0iMzM3MjMyMTk0Mjk0MTE2ODMyNCI+IkFmZmljaGFnZSBkXCdhbGVydGVzIHN5c3TDqG1lIjwvc3RyaW5nPgpAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBlcm1ldCDDoCBsXCdhcHBsaWNhdGlvbiBkXCdlbnZveWVyIGRlcyBpbnRlbnRpb25zIMOgIGxcJ2FkbWluaXN0cmF0ZXVyIGRlIGxcJ2FwcGFyZWlsLiBMZXMgYXBwbGljYXRpb25zIHN0YW5kYXJkIG5lIGRldnJhaWVudCBqYW1haXMgYXZvaXIgcmVjb3VycyDDoCBjZXR0ZSBmb25jdGlvbm5hbGl0w6kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJDaGFuZ2VtZW50IGRcJ29yaWVudGF0aW9uIGRlIGxcJ8OpY3JhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgbW9kaWZpZXIgbGEgcm90YXRpb24gZGUgbFwnw6ljcmFuIMOgIHRvdXQgbW9tZW50LiBMZXMgYXBwbGljYXRpb25zIG5vcm1hbGVzIG5lIGRldnJhaWVudCBqYW1haXMgYXZvaXIgcmVjb3VycyDDoCBjZXR0ZSBmb25jdGlvbm5hbGl0w6kuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+IkVudm9pIGRlIHNpZ25hdXggTGludXggYXV4IGFwcGxpY2F0aW9ucyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iUGVybWV0IMOgIHVuZSBhcHBsaWNhdGlvbiBkZSBkZW1hbmRlciBxdWUgbGUgc2lnbmFsIGZvdXJuaSBzb2l0IGVudm95w6kgw6AgdG91cyBsZXMgcHJvY2Vzc3VzIHBlcnNpc3RhbnRzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IkV4w6ljdXRpb24gZGUgbFwnYXBwbGljYXRpb24gZW4gY29udGludSI8L3N0cmluZz4KQEAgLTQ0OSw3ICs0NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9uZmMiIG1zZ2lkPSI0NDIzMzUxMjc0NzU3ODc2OTUzIj4iY29udHLDtGxlciBsYSBjb21tdW5pY2F0aW9uIGVuIGNoYW1wIHByb2NoZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX25mYyIgbXNnaWQ9IjkxNzE0MDE4NTE5NTQ0MDcyMjYiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRlIGNvbW11bmlxdWVyIGF2ZWMgZGVzIHRhZ3MsIGNhcnRlcyBldCBsZWN0ZXVycyBwcmVuYW50IGVuIGNoYXJnZSBsYSBjb21tdW5pY2F0aW9uIGVuIGNoYW1wIHByb2NoZSAoTkZDKS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3ZwbiIgbXNnaWQ9IjgzNDU4MDA1ODQ1MzIxNzUzMTIiPiJpbnRlcmNlcHRlciBldCBtb2RpZmllciBsXCdlbnNlbWJsZSBkdSB0cmFmaWMgcsOpc2VhdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3ZwbiIgbXNnaWQ9IjU2MTc4OTMwNzg5ODk5NDQyMTkiPiJQZXJtZXQgw6AgdW5lIGFwcGxpY2F0aW9uIGRcJ2ludGVyY2VwdGVyIGV0IGRcJ2luc3BlY3RlciBsXCdlbnNlbWJsZSBkdSB0cmFmaWMgcsOpc2VhdSwgcGFyIGV4ZW1wbGUgcG91ciDDqXRhYmxpciB1bmUgY29ubmV4aW9uIFZQTi4gRGVzIGFwcGxpY2F0aW9ucyBtYWx2ZWlsbGFudGVzIHNvbnQgc3VzY2VwdGlibGVzIGRlIHN1cnZlaWxsZXIsIHJlZGlyaWdlciBvdSBtb2RpZmllciBsZXMgcGFxdWV0cyByw6lzZWF1IMOgIHZvdHJlIGluc3UuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdnBuIiBtc2dpZD0iNTYxNzg5MzA3ODk4OTk0NDIxOSI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZFwnaW50ZXJjZXB0ZXIgZXQgZGUgY29udHLDtGxlciBsXCdlbnNlbWJsZSBkdSB0cmFmaWMgcsOpc2VhdSwgcGFyIGV4ZW1wbGUgcG91ciDDqXRhYmxpciB1bmUgY29ubmV4aW9uIFZQTi4gRGVzIGFwcGxpY2F0aW9ucyBtYWx2ZWlsbGFudGVzIHNvbnQgc3VzY2VwdGlibGVzIGRlIHN1cnZlaWxsZXIsIHJlZGlyaWdlciBvdSBtb2RpZmllciBsZXMgcGFxdWV0cyByw6lzZWF1IMOgIHZvdHJlIGluc3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI0OTc3NDA2MTY0MzExNTM1MDkyIj4iRMOpc2FjdGl2YXRpb24gZHUgdmVycm91aWxsYWdlIGRlcyB0b3VjaGVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGlzYWJsZUtleWd1YXJkIiBtc2dpZD0iMzE4OTc2MzQ3OTMyNjMwMjAxNyI+IlBlcm1ldCDDoCB1bmUgYXBwbGljYXRpb24gZGUgZMOpc2FjdGl2ZXIgbGUgdmVycm91aWxsYWdlIGRlcyB0b3VjaGVzIGV0IHRvdXRlIHPDqWN1cml0w6kgcGFyIG1vdCBkZSBwYXNzZS4gRXhlbXBsZcKgOiBWb3RyZSB0w6lsw6lwaG9uZSBkw6lzYWN0aXZlIGxlIHZlcnJvdWlsbGFnZSBkdSBjbGF2aWVyIGxvcnNxdWUgdm91cyByZWNldmV6IHVuIGFwcGVsLCBwdWlzIGxlIHLDqWFjdGl2ZSBsb3JzcXVlIHZvdXMgcmFjY3JvY2hlei4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4iTGVjdHVyZSBkZXMgcGFyYW3DqHRyZXMgZGUgc3luY2hyb25pc2F0aW9uIjwvc3RyaW5nPgpAQCAtNDkyLDggKzQ5Niw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX3NldEdsb2JhbFByb3h5IiBtc2dpZD0iNjM4NzQ5NzQ2NjY2MDE1NDkzMSI+IkluZGlxdWVyIGxlIHByb3h5IGdsb2JhbCDDoCB1dGlsaXNlciBwb3VyIGNlIG1vYmlsZSBsb3JzcXVlIGxlcyByw6hnbGVzIHNvbnQgYWN0aXbDqWVzLiBTZXVsIGxcJ2FkbWluaXN0cmF0ZXVyIHByaW5jaXBhbCBkdSBtb2JpbGUgcGV1dCBkw6lmaW5pciBsZSBwcm94eSBnbG9iYWwgdXRpbGlzw6kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5bGFiX2V4cGlyZVBhc3N3b3JkIiBtc2dpZD0iODg1Mjc5MTUxODQ3MjU0MDU2Ij4iRMOpZmluaXIgZXhwLiBtb3QgcGFzc2UgdmVyci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb2xpY3lkZXNjX2V4cGlyZVBhc3N3b3JkIiBtc2dpZD0iNDg0NDQzMDM1NDIyNDgyMjA3NCI+IkNvbnRyw7RsZXIgbGEgZnLDqXF1ZW5jZSBkZSBtb2RpZmljYXRpb24gZHUgbW90IGRlIHBhc3NlIGRlIHZlcnJvdWlsbGFnZSBkZSBsXCfDqWNyYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwb2xpY3lsYWJfZW5jcnlwdGVkU3RvcmFnZSIgbXNnaWQ9Ijg5MDEzMjYxOTk5MDkxMzI5MTUiPiJEw6lmaW5pciBjcnlwdGFnZSBkdSBzdG9ja2FnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBvbGljeWRlc2NfZW5jcnlwdGVkU3RvcmFnZSIgbXNnaWQ9IjI1MDQ5ODQ3MzI2MzE0NzkzOTkiPiJFeGlnZXIgcXVlIGxlcyBkb25uw6llcyBkXCdhcHBsaWNhdGlvbiBzdG9ja8OpZXMgc29pZW50IGNyeXB0w6llcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9lbmNyeXB0ZWRTdG9yYWdlIiBtc2dpZD0iODkwMTMyNjE5OTkwOTEzMjkxNSI+IkTDqWZpbmlyIGNoaWZmcmVtZW50IGR1IHN0b2NrYWdlIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19lbmNyeXB0ZWRTdG9yYWdlIiBtc2dpZD0iMjUwNDk4NDczMjYzMTQ3OTM5OSI+IkV4aWdlciBxdWUgbGVzIGRvbm7DqWVzIGRcJ2FwcGxpY2F0aW9uIHN0b2Nrw6llcyBzb2llbnQgY2hpZmZyw6llcyI8L3N0cmluZz4KICAgPHN0cmluZy1hcnJheSBuYW1lPSJwaG9uZVR5cGVzIj4KICAgICA8aXRlbSBtc2dpZD0iODkwMTA5ODMzNjY1ODcxMDM1OSI+IkRvbWljaWxlIjwvaXRlbT4KICAgICA8aXRlbSBtc2dpZD0iODY5OTIzNjUwNTI3MTM2NjE1Ij4iTW9iaWxlIjwvaXRlbT4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwcGxpY2F0aW9uIHJlZGlyaWfDqWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZXN0IG1haW50ZW5hbnQgbGFuY8OpZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IkFwcGxpY2F0aW9uIGxhbmPDqWUgaW5pdGlhbGVtZW50wqA6IDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkxcJ2FwcGxpY2F0aW9uIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3N1cyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGEgZW5mcmVpbnQgc2VzIHByb3ByZXMgcsOoZ2xlcyBkdSBtb2RlIHN0cmljdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJMZSBwcm9jZXNzdXMgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGEgZW5mcmVpbnQgc2VzIHByb3ByZXMgcsOoZ2xlcyBkdSBtb2RlIHN0cmljdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+wqBlbiBjb3VycyBkXCdleMOpY3V0aW9uIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iTcOpbW9pcmUgZGUgc3RvY2thZ2UgaW50ZXJuZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJDYXJ0ZSBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+Ik3DqW1vaXJlIGRlIHN0b2NrYWdlIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oNzIwZHAvZGltZW5zLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaDcyMGRwL2RpbWVucy54bWwKaW5kZXggYzA5Y2I1Yi4uMzdkZWU4ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oNzIwZHAvZGltZW5zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWg3MjBkcC9kaW1lbnMueG1sCkBAIC0xNyw4ICsxNyw2IEBACiAqLwogLS0+CiA8cmVzb3VyY2VzPgotICAgIDwhLS0gRGlhbG9nIHRpdGxlIGhlaWdodCAtLT4KLSAgICA8ZGltZW4gbmFtZT0iYWxlcnRfZGlhbG9nX3RpdGxlX2hlaWdodCI+NTRkaXA8L2RpbWVuPgogICAgIDwhLS0gRGlhbG9nIGJ1dHRvbiBiYXIgaGVpZ2h0IC0tPgogICAgIDxkaW1lbiBuYW1lPSJhbGVydF9kaWFsb2dfYnV0dG9uX2Jhcl9oZWlnaHQiPjU0ZGlwPC9kaW1lbj4KICAgICA8IS0tIFByZWZlcmVuY2UgZnJhZ21lbnQgcGFkZGluZywgYm90dG9tIC0tPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKaW5kZXggOWEzZWIwZS4uYjg3ZTk5ZSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCkBAIC0xOTAsNiArMTkwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlY2VpdmVTbXMiIG1zZ2lkPSI2Mjk4MjkyMzM1OTY1OTY2MTE3Ij4iQXBsaWthY2lqaSBvbW9ndcSHdWplIHByaW1hbmplIGkgb2JyYWR1IFNNUyBwb3J1a2EuIFpsb25hbWplcm5lIGFwbGlrYWNpamUgbW9ndSBwcmF0aXRpIHZhxaFlIHBvcnVrZSBpbGkgaWggaXpicmlzYXRpIHByaWplIG5lZ28gxaF0byBpaCB2aSB2aWRpdGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWNlaXZlTW1zIiBtc2dpZD0iODg5NDcwMDkxNjE4ODA4MzI4NyI+InByaW1hbmplIE1NUy1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVjZWl2ZU1tcyIgbXNnaWQ9IjQ1NjMzNDY4MzIwMDAxNzQzNzMiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgcHJpbWFuamUgaSBvYnJhZHUgTU1TIHBvcnVrYS4gWmxvbmFtamVybmUgYXBsaWthY2lqZSBtb2d1IHByYXRpdGkgdmHFoWUgcG9ydWtlIGlsaSBpaCBpemJyaXNhdGkgcHJpamUgbmVnbyDFoXRvIGloIHZpIHZpZGl0ZS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlY2VpdmVFbWVyZ2VuY3lCcm9hZGNhc3QiIG1zZ2lkPSIxODAzNDc3NjYwODQ2Mjg4MDg5Ij4icHJpbWFuamUgaGl0bmloIG9kYcWhaWxqYW5qYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlY2VpdmVFbWVyZ2VuY3lCcm9hZGNhc3QiIG1zZ2lkPSI3MTE4MzkzMzkzNzE2NTQ2MTMxIj4iT21vZ3XEh3VqZSBhcGxpa2FjaWppIHByaW1hbmplIGkgb2JyYWR1IHBvcnVrYSBoaXRuaWggb2RhxaFpbGphbmphLiBUYSBqZSBkb3p2b2xhIGRvc3R1cG5hIHNhbW8gYXBsaWthY2lqYW1hIHN1c3RhdmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZW5kU21zIiBtc2dpZD0iNTYwMDgzMDYxMjE0NzY3MTUyOSI+InNsYW5qZSBTTVMgcG9ydWthIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VuZFNtcyIgbXNnaWQ9IjE5NDY1NDAzNTE3NjM1MDIxMjAiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgc2xhbmplIFNNUyBwb3J1a2EuIFpsb25hbWplcm5lIGFwbGlrYWNpamUgbW9ndSBzdHZhcmF0aSB0cm/FoWtvdmUgc2xhbmplbSBwb3J1a2EgYmV6IHZhxaFlIHBvdHZyZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU21zIiBtc2dpZD0iNDA4NTMzMzcwODEyMjM3MjI1NiI+IsSNaXRhbmplIFNNUy1hIGlsaSBNTVMtYSI8L3N0cmluZz4KQEAgLTI0MCw3ICsyNDIsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmF0dGVyeVN0YXRzIiBtc2dpZD0iNTg0NzMxOTgyMzc3MjIzMDU2MCI+Ik9tb2d1xId1amUgaXptamVudSBwcmlrdXBsamVuZSBzdGF0aXN0aWtlIG8gYmF0ZXJpamkuIE5pamUgemEgdXBvdHJlYnUgbmEgdW9iacSNYWplbmltIGFwbGlrYWNpamFtYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JhY2t1cCIgbXNnaWQ9IjQ3MDAxMzAyMjg2NTQ1MzkyMCI+InNpZ3Vybm9zbmEga29waWphIGkgb3BvcmF2YWsgbmFkem9ybm9nIHN1c3RhdmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iYWNrdXAiIG1zZ2lkPSI0ODM3NDkzMDY1MTU0MjU2NTI1Ij4iQXBsaWthY2lqaSBvbW9ndcSHdWplIG5hZHpvciBuYWQgbWVoYW5pem1vbSBzdHZhcmFuamEgc2lndXJub3NuaWgga29waWphIGkgb3BvcmF2a2Egc3VzdGF2YS4gTmlqZSB6YSB1cG90cmVidSBuYSB1b2JpxI1hamVuaW0gYXBsaWthY2lqYW1hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjU1NTcwNzEzMjU4MDQ0NjkxMDIiPiJwb3R2cmRpdGkgcG90cHVudSBzaWd1cm5vc251IGtvcGlqdSBpbGkgdnJhdGl0aSByYWQiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI1NTU3MDcxMzI1ODA0NDY5MTAyIj4icG90dnJkaXRpIHBvc3R1cGFrIGl6cmFkZSBzaWd1cm5vc25lIGtvcGlqZSBpbGkgb2Jub3ZlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjkwMDUwMTc3NTQxNzU4OTc5NTQiPiJPbW9ndcSHdWplIGFwbGlrYWNpamkgcG9rcmV0YW5qZSBrb3Jpc25pxI1rb2cgc3XEjWVsamEgemEgcG90dnJkdSBwb3RwdW5lIHNpZ3Vybm9zbmUga29waWplLiBBcGxpa2FjaWplIG5lIGJpIHRyZWJhbGUgdXBvdHJlYmxqYXZhdGkgdHUgb3BjaWp1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSIyMTQ4NTYzNjI4MTQwMTkzMjMxIj4icHJpa2F6IG5lb3ZsYcWhdGVuaWggcHJvem9yYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2ludGVybmFsU3lzdGVtV2luZG93IiBtc2dpZD0iNTg5NTA4MjI2ODI4NDk5ODQ2OSI+Ik9tb2d1xId1amUgc3R2YXJhbmplIHByb3pvcmEga29qaW1hIGplIG5hbWplbmEgZGEgc2Uga29yaXN0ZSB1IGtvcmlzbmnEjWtvbSBzdcSNZWxqdSBpbnRlcm5vZyBzdXN0YXZhLiBOaWplIHphIHVwb3RyZWJ1IG5hIHVvYmnEjWFqZW5pbSBhcGxpa2FjaWphbWEuIjwvc3RyaW5nPgpAQCAtMjY1LDYgKzI2NywxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+Ik5vc2l0ZWxqdSBvbW9ndcSHdWplIHNsYW5qZSBuYW1qZXJhIGFkbWluaXN0cmF0b3J1IHVyZcSRYWphLiBOaWthZCBuZSBiaSB0cmViYWxvIGtvcmlzdGl0aSB6YSB1b2JpxI1hamVuZSBhcGxpa2FjaWplLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4icHJvbWplbmEgb3JpamVudGFjaWplIHphc2xvbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJBcGxpa2FjaWppIG9tb2d1xId1amUgcHJvbWplbnUgcm90YWNpamUgemFzbG9uYSB1IHN2YWtvbSB0cmVudXRrdS4gTmlrYWQgbmUgYmkgdHJlYmFsbyBrb3Jpc3RpdGkgemEgdW9iacSNYWplbmUgYXBsaWthY2lqZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ic2xhbmplIExpbnV4IHNpZ25hbGEgdSBhcGxpa2FjaWp1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJBcGxpa2FjaWphbWEgb21vZ3XEh3VqZSB0cmHFvmVuamUgemFodGpldmEgZGEgc2UgZG9iaXZlbmkgc2lnbmFsIHBvxaFhbGplIG5hIHN2ZSB0cmFqbmUgcG9zdHVwa2UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4idXZpamVrIHBva3JlbnV0YSBhcGxpa2FjaWphIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MiwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWthY2lqYSBwcmV1c21qZXJlbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gc2UgaXp2b2RpIHNhZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJBcGxpa2FjaWphIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gcG9rcmVudXRhIGplIHBydmEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGlrYWNpamEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgcHJla3LFoWlsYSBqZSBzdm9qZSB2bGFzdGl0byBwcmF2aWxvIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBwcmVrcsWhaW8gamUgc3ZvamUgdmxhc3RpdG8gcHJhdmlsbyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iSXp2b2RpIHNlIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUzLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iVW51dGFybmphIHBvaHJhbmEiPC9zdHJpbmc+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+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYW5kL2FycmF5cy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvYXJyYXlzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTEzMGJhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbGFuZC9hcnJheXMueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9jb2xvcnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXMgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgorCisgICAgPCEtLSBSZXNvdXJjZXMgZm9yIE11bHRpV2F2ZVZpZXcgaW4gTG9ja1NjcmVlbiAtLT4KKyAgICA8YXJyYXkgbmFtZT0iaWNfbG9ja3NjcmVlbl90YXJnZXRzX3doZW5fc2lsZW50Ij4KKyAgICAgICAgPGl0ZW0+QG51bGw8L2l0ZW0+IgorICAgICAgICA8aXRlbT5AZHJhd2FibGUvaWNfbG9ja3NjcmVlbl91bmxvY2s8L2l0ZW0+CisgICAgICAgIDxpdGVtPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbT5AZHJhd2FibGUvaWNfbG9ja3NjcmVlbl9zb3VuZG9uPC9pdGVtPgorICAgIDwvYXJyYXk+CisKKyAgICA8YXJyYXkgbmFtZT0iaWNfbG9ja3NjcmVlbl90YXJnZXRzX3doZW5fc291bmRvbiI+CisgICAgICAgIDxpdGVtPkBudWxsPC9pdGVtPiIKKyAgICAgICAgPGl0ZW0+QGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fdW5sb2NrPC9pdGVtPgorICAgICAgICA8aXRlbT5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+QGRyYXdhYmxlL2ljX2xvY2tzY3JlZW5fc2lsZW50PC9pdGVtPgorICAgIDwvYXJyYXk+CisKKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAppbmRleCBkYmFhZDEzLi5iOGNlOWI0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApAQCAtMzIsNCArMzIsNyBAQAogICAgIDwhLS0gRGVmYXVsdCBoZWlnaHQgb2YgYW4gYWN0aW9uIGJhci4gLS0+CiAgICAgPGRpbWVuIG5hbWU9ImFjdGlvbl9iYXJfZGVmYXVsdF9oZWlnaHQiPjQwZGlwPC9kaW1lbj4KIAorICAgIDwhLS0gU2l6ZSBvZiBjbG9jayBmb250IGluIExvY2tTY3JlZW4uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJrZXlndWFyZF9wYXR0ZXJuX3VubG9ja19jbG9ja19mb250X3NpemUiPjgwc3A8L2RpbWVuPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbGFyZ2UvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbGFyZ2UvY29uZmlnLnhtbAppbmRleCBjOTQyNTZlLi45MzI3MjAwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWxhcmdlL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sYXJnZS9jb25maWcueG1sCkBAIC0yMyw4ICsyMyw2IEBACiAgICAgPCEtLSBzZWUgY29tbWVudCBpbiB2YWx1ZXMvY29uZmlnLnhtbCAtLT4KICAgICA8ZGltZW4gbmFtZT0iY29uZmlnX3ByZWZEaWFsb2dXaWR0aCI+NDQwZHA8L2RpbWVuPgogCi0gICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNhbkhpZGUiPmZhbHNlPC9ib29sPgotCiAgICAgPCEtLSBzZWUgY29tbWVudCBpbiB2YWx1ZXMvY29uZmlnLnhtbCAtLT4KICAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbG9uZ1ByZXNzT25Qb3dlckJlaGF2aW9yIj4yPC9pbnRlZ2VyPgogCmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAppbmRleCBlM2JkZWE2Li5lYWI5MmM2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJMZWlkxb5pYSBzYXZpbmlua3VpIHNpxbNzdGkgdGlrc2x1cyDEr3JlbmdpbmlvIGFkbWluaXN0cmF0b3JpdWkuIE5ldHVyxJd0xbMgcmVpa8SXdGkgxK9wcmFzdG9zZSBwcm9ncmFtb3NlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ia2Vpc3RpIGVrcmFubyBwYWTEl3TEryI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IkxlaWTFvmlhIHByb2dyYW1haSBiZXQga3VyaXVvIG1ldHUga2Vpc3RpIGVrcmFubyBzdWtpbcSFLiBOZXR1csSXdMWzIHJlaWvEl3RpIMSvcHJhc3RvbXMgcHJvZ3JhbW9tcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4icHJvZ3JhbW9tcyBzacWzc3RpIOKAnkxpbnV44oCcIHNpZ25hbHVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJMZWlkxb5pYSBwcm9ncmFtYWkgcGF0ZWlrdGkgdcW+a2xhdXPEhSwga2FkIHRlaWtpYW1hcyBzaWduYWxhcyBixat0xbMgc2l1bsSNaWFtYXMgdmlzaWVtcyBudW9sYXRpbmlhbXMgcHJvY2VzYW1zLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Im51c3RhdHl0aSwga2FkIHByb2dyYW1hIGLFq3TFsyB2aXNhZGEgcGFsZWlzdGEiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcm9ncmFtYSBudWtyZWlwdGEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IuKAnjx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7igJwgZGFiYXIgdnlrZG9tYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IuKAnjx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz7igJwgYnV2byBpxaEgcHJhZMW+acWzIHBhbGVpc3RhLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJQcm9ncmFtYSDigJ48eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+4oCcIChwcm9jZXNhcyDigJ48eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz7igJwpIHBhxb5laWTElyBzYXZvIHZ5a2RvbcSFIOKAnlN0cmljdE1vZGXigJwgcG9saXRpa8SFLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IuKAnjx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPuKAnCBwcm9jZXNhcyBwYcW+ZWlkxJcgc2F2byB2eWtkb23EhSDigJ5TdHJpY3RNb2Rl4oCcIHBvbGl0aWvEhS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+IlZ5a2RvbWEg4oCePHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7igJwiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJWaWRpbsSXIGF0bWludGlzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNEIGtvcnRlbMSXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIGF0bWludGlzIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbAppbmRleCBkYjJiMWQzLi41YzU1MjVjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiLEu2F1aiDEq3BhxaFuaWVrYW0gc8WrdMSrdCBub2zFq2t1cyBpZXLEq2NlcyBhZG1pbmlzdHJhdG9yYW0uIE5la2FkIG5hdiBuZXBpZWNpZcWhYW1zIHBhcmFzdGFqxIFtIGxpZXRvanVtcHJvZ3JhbW3EgW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJtYWluxKt0IGVrcsSBbmEgb3JpZW50xIFjaWp1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4ixLthdWogbGlldG9qdW1wcm9ncmFtbWFpIGplYmt1csSBIGJyxKtkxKsgbWFpbsSrdCBla3LEgW5hIHBhZ3JpZcWhYW5hcyBpZXN0YXTEq2p1bXUuIFBhcmFzdGFqxIFtIGxpZXRvanVtcHJvZ3JhbW3EgW0gbmVrYWQgbmF2IG5lcGllY2llxaFhbWEuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+InPFq3TEq3QgTGludXggc2lnbsSBbHVzIHV6IGxpZXRvanVtcHJvZ3JhbW3EgW0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IsS7YXVqIGxpZXRvanVtcHJvZ3JhbW1haSBwaWVwcmFzxKt0LCBsYWkgcGllZ8SBZMSBdGFpcyBzaWduxIFscyB0aWt0dSBzxat0xKt0cyB1eiB2aXNpZW0gcGFzdMSBdsSrZ2FqaWVtIHByb2Nlc2llbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJsaWt0IGxpZXRvanVtcHJvZ3JhbW1haSB2aWVubcSTciBkYXJib3RpZXMiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJMaWV0b2p1bXByLiBpciBub3ZpcnrEq3RhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHRhZ2FkIGRhcmJvamFzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iU8SBa290bsSTamkgdGlrYSBwYWxhaXN0YSBsaWV0b2p1bXByb2dyYW1tYSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMaWV0b2p1bXByb2dyYW1tYSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaXIgcMSBcmvEgXB1c2kgc2F2dSBwYcWhaWV2aWVzdG8gU3RyaWN0TW9kZSBwb2xpdGlrdS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBpciBwxIFya8SBcGlzIHNhdnUgcGHFoWlldmllc3RvIFN0cmljdE1vZGUgcG9saXRpa3UuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiBkYXJib2phcyI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+Iklla8WhxJNqxIEgYXRtacWGYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRMKga2FydGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJVU0LCoGF0bWnFhmEiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCmluZGV4IDA5MjM0YmQuLjZiMGUxOGUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApAQCAtMjk3LDYgKzI5NywxMCBAQAogICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+InR1a2FyIG9yaWVudGFzaSBza3JpbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+Ik1lbWJvbGVoa2FuIGFwbGlrYXNpIHVudHVrIG1lbnVrYXIgcHV0YXJhbiBza3JpbiBwYWRhIGJpbGEtYmlsYSBtYXNhLiBUaWRhayBzZWhhcnVzbnlhIGRpcGVybHVrYW4gdW50dWsgYXBsaWthc2kgYmlhc2EuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ImhhbnRhciBpc3lhcmF0IExpbnV4IGtlcGFkYSBhcGxpa2FzaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iTWVtYmVuYXJrYW4gYXBsaWthc2kgbWVtaW50YSBpc3lhcmF0IHlhbmcgZGliZWthbGthbiBkaWhhbnRhciBrZXBhZGEgc2VtdWEgcHJvc2VzIGdpZ2loLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImJ1YXRrYW4gYXBsaWthc2kgc2VudGlhc2EgYmVyamFsYW4iPC9zdHJpbmc+CkBAIC0xMDQ2LDYgKzEwNTAsMTIgQEAKICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxhdW5jaF93YXJuaW5nX29yaWdpbmFsICgxODgxMDIwMjMwMjE2Njg2ODMpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNtdl9hcHBsaWNhdGlvbiAoMjk1NTgzODA0MzYxMjM2Mjg4KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNtdl9wcm9jZXNzICg1MTIwMzk3MDEyMDQ3NDYyNDQ2KSAtLT4KQEAgLTEzNTEsNCArMTM2MSw2IEBACiAgICAgPHNraXAgLz4KICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzdG9yYWdlX3VzYiAoMzAxNzk1NDA1OTUzODUxNzI3OCkgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKaW5kZXggYTY4NjdhYy4uMjQxMzY4NSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iVGlsbGF0ZXIgaW5uZWhhdmVyZW4gw6Ugc2VuZGUgaGVuc2lrdGVyIHRpbCBlbmhldHNhZG1pbmlzdHJhdG9yLiBCw7hyIGFsZHJpIHbDpnJlIG7DuGR2ZW5kaWcgZm9yIG5vcm1hbGUgcHJvZ3JhbW1lci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+InNudSBza2plcm1lbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IkxhciBhcHBsaWthc2pvbmVuIHJvdGVyZSBza2plcm1lbiBuw6VyIHNvbSBoZWxzdC4gVmFubGlnZSBhcHBsaWthc2pvbmVyIGLDuHIgYWxkcmkgdHJlbmdlIGRldHRlLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJzZW5kZSBMaW51eC1zaWduYWxlciB0aWwgYXBwbGlrYXNqb25lciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iTGFyIGFwcGxpa2Fzam9uZW4gc3DDuHJyZSBvbSBhdCBldCBnaXR0IHNpZ25hbCBibGlyIHNlbmR0IHRpbCBhbGxlIHZhcmlnZSBwcm9zZXNzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4iZm9yYmxpIGtqw7hyZW5kZSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW1tZXQgZXIgb21kaXJpZ2VydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBrasO4cmVyIG7DpS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gYmxlIG9wcHJpbm5lbGlnIHN0YXJ0ZXQuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW1tZXQgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvc2Vzc2VuIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGFyIGJydXR0IGRlIHNlbHZww6VsYWd0ZSBTdHJpY3RNb2RlLXJldG5pbmdzbGluamVuZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9zZXNzZW48eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gaGFyIGJydXR0IGRlIHNlbHZww6VsYWd0ZSBTdHJpY3RNb2RlLXJldG5pbmdzbGluamVuZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGtqw7hyZXIiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJJbnRlcm4gbGFncmluZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRC1rb3J0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCLWxhZ3JpbmciPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmluZGV4IGQwNzgwODEuLmRiYjdlOTggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlN0YWF0IGRlIGhvdWRlciB0b2UgaW50ZW50aWVzIHRlIHZlcnplbmRlbiBuYWFyIGVlbiBhcHBhcmFhdGJlaGVlcmRlci4gTm9vaXQgdmVyZWlzdCB2b29yIG5vcm1hbGUgdG9lcGFzc2luZ2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ic2NoZXJtc3RhbmQgd2lqemlnZW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJIaWVybWVlIGthbiBlZW4gYXBwIG9wIGVsayBnZXdlbnN0IG1vbWVudCBkZSBvcmnDq250YXRpZSB2YW4gaGV0IHNjaGVybSB3aWp6aWdlbi4gTm9vaXQgdmVyZWlzdCB2b29yIG5vcm1hbGUgYXBwcy4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4iTGludXgtc2lnbmFsZW4gdmVyemVuZGVuIG5hYXIgdG9lcGFzc2luZ2VuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJIaWVybWVlIGthbiBkZSBhcHAgZXJ2b29yIHpvcmdlbiBkYXQgaGV0IGdlbGV2ZXJkZSBzaWduYWFsIHdvcmR0IHZlcnpvbmRlbiBuYWFyIGFsbGUgcGVyc2lzdGVudGUgcHJvY2Vzc2VuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImFwcCBhbHRpamQgbGF0ZW4gdWl0dm9lcmVuIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBwIG9tZ2VsZWlkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGlzIG51IGFjdGllZi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gd2FzIGhldCBlZXJzdCBnZXN0YXJ0LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJEZSBhcHAgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGVlZnQgaGV0IHplbGYgYWZnZWR3b25nZW4gU3RyaWN0TW9kZS1iZWxlaWQgZ2VzY2hvbmRlbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJIZXQgcHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoZWVmdCBoZXQgemVsZiBhZmdlZHdvbmdlbiBTdHJpY3RNb2RlLWJlbGVpZCBnZXNjaG9uZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gd29yZHQgdWl0Z2V2b2VyZCI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkludGVybmUgb3BzbGFnIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IlNELWthYXJ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCLW9wc2xhZyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKaW5kZXggOGRkM2NjNy4uMzZkM2NkZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iWmV6d2FsYSBwb3NpYWRhY3pvd2kgbmEgd3lzecWCYW5pZSBpbmZvcm1hY2ppIG8gemFtaWFyYWNoIGRvIGFkbWluaXN0cmF0b3JhIHVyesSFZHplbmlhLiBPcGNqYSBuaWUgcG93aW5uYSBiecSHIG5pZ2R5IHBvdHJ6ZWJuYSB3IHByenlwYWRrdSB6d3lrxYJ5Y2ggYXBsaWthY2ppLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iem1pZW5pYW5pZSBvcmllbnRhY2ppIGVrcmFudSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlBvendhbGEgYXBsaWthY2ppIG5hIHptaWFuxJkgb3JpZW50YWNqaSBla3JhbnUgdyBkb3dvbG55bSBtb21lbmNpZS4gTmlnZHkgbmllIHBvd2lubm8gYnnEhyBwb3RyemVieSBzdG9zb3dhbmlhIHcgbm9ybWFsbnljaCBhcGxpa2FjamFjaC4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4id3lzecWCYW5pZSBzeWduYcWCw7N3IHN5c3RlbXUgTGludXggZG8gYXBsaWthY2ppIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJQb3p3YWxhIGFwbGlrYWNqb20gxbzEhWRhxIcsIGFieSBkb3N0YXJjemFueSBzeWduYcWCIGJ5xYIgd3lzecWCYW55IGRvIHdzenlzdGtpY2ggdHJ3YWrEhWN5Y2ggcHJvY2Vzw7N3LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+InNwcmF3aWFuaWUsIMW8ZSBhcGxpa2FjamEgamVzdCBjYcWCeSBjemFzIHVydWNob21pb25hIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWthY2phIHByemVraWVyb3dhbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IkFwbGlrYWNqYSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGplc3QgdXJ1Y2hvbWlvbmEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJBcGxpa2FjamEgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiB6b3N0YcWCYSBwaWVyd290bmllIHVydWNob21pb25hLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJBcGxpa2FjamEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgbmFydXN6ecWCYSB3eW11c3pvbmUgcHJ6ZXogc2llYmllIHphc2FkeSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlByb2NlcyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gbmFydXN6ecWCIHd5bXVzem9uZSBwcnpleiBzaWViaWUgemFzYWR5IFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiJEemlhxYJhIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iUGFtacSZxIcgd2V3bsSZdHJ6bmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iS2FydGEgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiJOb8WbbmlrIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAppbmRleCA5YWU3NGRkLi45Y2VjNGI2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBlcm1pdGUgYW8gdGl0dWxhciBlbnZpYXIgaW50ZW7Dp8O1ZXMgcGFyYSB1bSBhZG1pbmlzdHJhZG9yIGRvIGRpc3Bvc2l0aXZvLiBOdW5jYSBkZXZlcsOhIHNlciBuZWNlc3PDoXJpbyBwYXJhIGFwbGljYcOnw7VlcyBub3JtYWlzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ibXVkYXIgb3JpZW50YcOnw6NvIGRvIGVjcsOjIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iUGVybWl0ZSBhIHVtYSBhcGxpY2HDp8OjbyBtdWRhciBhIHJvdGHDp8OjbyBkbyBlY3LDoyBlbSBxdWFscXVlciBtb21lbnRvLiBOdW5jYSBkZXZlIHNlciBuZWNlc3PDoXJpbyBwYXJhIGFwbGljYcOnw7VlcyBub3JtYWlzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJlbnZpYXIgc2luYWlzIExpbnV4IHBhcmEgYXBsaWNhw6fDtWVzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJQZXJtaXRlIMOgIGFwbGljYcOnw6NvIHBlZGlyIHF1ZSBvIHNpbmFsIGZvcm5lY2lkbyBzZWphIGVudmlhZG8gYSB0b2RvcyBvcyBwcm9jZXNzb3MgcGVyc2lzdGVudGVzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImZhemVyIGNvbSBxdWUgYSBhcGxpY2HDp8OjbyBzZWphIHNlbXByZSBleGVjdXRhZGEiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJBcGxpY2HDp8OjbyByZWRpcmVjY2lvbmFkYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBlc3TDoSBhZ29yYSBhIHNlciBleGVjdXRhZG8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGZvaSBvcmlnaW5hbG1lbnRlIGluaWNpYWRvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJBIGFwbGljYcOnw6NvIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgdmlvbG91IGEgcG9sw610aWNhIFN0cmljdE1vZGUgYXV0by1pbXBvc3RhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Ik8gcHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHZpb2xvdSBhIHBvbMOtdGljYSBTdHJpY3RNb2RlIGF1dG8taW1wb3N0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVtIGV4ZWN1w6fDo28iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJBcm1hemVuYW1lbnRvIEludGVybm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iQ2FydMOjbyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkFybWF6ZW5hbWVudG8gVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAppbmRleCA1ZTM3MTUzLi41NzczN2M5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJQZXJtaXRlIHF1ZSBvIGRldGVudG9yIGVudmllIHRlbnRhdGl2YXMgYW8gYWRtaW5pc3RyYWRvciBkZSB1bSBkaXNwb3NpdGl2by4gTsOjbyDDqSBuZWNlc3PDoXJpbyBwYXJhIGFwbGljYXRpdm9zIG5vcm1haXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJhbHRlcmFyIG9yaWVudGHDp8OjbyBkYSB0ZWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iUGVybWl0ZSBxdWUgdW0gYXBsaWNhdGl2byBhbHRlcmUgYSByb3Rhw6fDo28gZGEgdGVsYSBhIHF1YWxxdWVyIG1vbWVudG8uIEFwbGljYXRpdm9zIG5vcm1haXMgbsOjbyBkZXZlbSBwcmVjaXNhciBkaXNzbyBlbSBtb21lbnRvIGFsZ3VtLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJlbnZpYXIgc2luYWlzIGRlIExpbnV4IHBhcmEgb3MgYXBsaWNhdGl2b3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBlcm1pdGUgcXVlIG8gYXBsaWNhdGl2byBzb2xpY2l0ZSBxdWUgbyBzaW5hbCBmb3JuZWNpZG8gc2VqYSBlbnZpYWRvIGEgdG9kb3Mgb3MgcHJvY2Vzc29zIHBlcnNpc3RlbnRlcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJleGVjdXRhciBzZW1wcmUgbyBhcGxpY2F0aXZvIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWNhdGl2byByZWRpcmVjaW9uYWRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IG7Do28gZXN0w6EgZW0gZXhlY3XDp8Ojby4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gZm9pIGluaWNpYWRvLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJPIGFwbGljYXRpdm8gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc28gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBpbXBvc3RhIGF1dG9tYXRpY2FtZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJPIHByb2Nlc3NvIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB2aW9sb3UgYSBwb2zDrXRpY2EgU3RyaWN0TW9kZSBpbXBvc3RhIGF1dG9tYXRpY2FtZW50ZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGVtIGV4ZWN1w6fDo28iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiJBcm1hemVuYW1lbnRvIGludGVybm8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iQ2FydMOjbyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkFybWF6ZW5hbWVudG8gVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ybS9zdHJpbmdzLnhtbAppbmRleCA0YmY5YzNlLi42MGY2MDQ5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJtL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm0vc3RyaW5ncy54bWwKQEAgLTI3NSw2ICsyNzUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJQZXJtZXR0YSBhbCBwb3NzZXNzdXIgZGEgdHJhbWV0dGVyIGludGVueml1bnMgYSBsXCdhZG1pbmlzdHJhdHVyIGRhbCBhcHBhcmF0IHBlcmlmZXJpYy4gQmV0ZyBwcmV2aXMgcGVyIGFwcGxpY2F6aXVucyBub3JtYWxhcy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+Im1pZGFyIGxcJ29yaWVudGF6aXVuIGRhbCB2aXN1ciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+IlBlcm1ldHRhIGEgbFwnYXBwbGljYXppdW4gZGEgbWlkYXIgZGEgdHV0IHRlbXAgbGEgb3JpZW50YXppdW4gZGFsIHZpc3VyLiBCZXRnIHByZXZpcyBwZXIgYXBwbGljYXppdW5zIG5vcm1hbGFzLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJ0cmFtZXR0ZXIgc2lnbmFscyBMaW51eCBhIGxhcyBhcHBsaWNheml1bnMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBlcm1ldHRhIGEgbFwnYXBwbGljYXppdW4gZGEgcHJldGVuZGVyIGNoXCdpbCBzaWduYWwgZnVybsOsIHZlZ25pYSB0cmFtZXNzIGEgdHV0IGlscyBwcm9jZXNzIHBlcnNpc3RlbnRzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ImV4ZXF1aXIgcGVybWFuZW50YW1haW4gYXBwbGljYXppdW5zIjwvc3RyaW5nPgpAQCAtODk5LDYgKzkwMywxMiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwgKDE4ODEwMjAyMzAyMTY2ODY4MykgLS0+CiAgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiJMXCdhcHBsaWNheml1biA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChwcm9jZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGEgdmlvbMOgIHNpYSBhdGduYSBkaXJlY3RpdmEgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJJbCBwcm9jZXNzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYSB2aW9sw6Agc2lhIGF0Z25hIGRpcmVjdGl2YSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7CoHZlZ24gZXhlcXVpZGEiPC9zdHJpbmc+CkBAIC0xMTQ3LDQgKzExNTcsNiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3RvcmFnZV91c2IgKDMwMTc5NTQwNTk1Mzg1MTcyNzgpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCmluZGV4IGM4OGYwNmQuLjE5NjE5MDMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IlBlcm1pdGUgcHJvcHJpZXRhcnVsdWkgc8SDIHRyaW1pdMSDIGludGVuxaNpaSBjxIN0cmUgdW4gYWRtaW5pc3RyYXRvciBhbCBkaXNwb3ppdGl2dWx1aS4gTnUgYXIgdHJlYnVpIHPEgyBmaWUgbmljaW9kYXTEgyBuZWNlc2FyxIMgcGVudHJ1IGFwbGljYcWjaWlsZSBvYmnFn251aXRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4ibW9kaWZpY2FyZSBvcmllbnRhcmUgZWNyYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJQZXJtaXRlIHVuZWkgYXBsaWNhxaNpaSBzxIMgbW9kaWZpY2Ugcm90YcWjaWEgZWNyYW51bHVpIMOubiBvcmljZSBtb21lbnQuIE51IGFyIHRyZWJ1aSBzxIMgZmllIG5pY2lvZGF0xIMgbmVjZXNhcsSDIHBlbnRydSBhcGxpY2HFo2lpbGUgb2JpxZ9udWl0ZS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4idHJpbWl0ZXJlIHNlbW5hbGUgTGludXggY8SDdHJlIGFwbGljYcWjaWkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IlBlcm1pdGUgYXBsaWNhxaNpZWkgc8SDIHNvbGljaXRlIHRyaW1pdGVyZWEgc2VtbmFsdWx1aSBmdXJuaXphdCBjxIN0cmUgdG9hdGUgcHJvY2VzZWxlIHBlcnNpc3RlbnRlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+InJ1bGFyZSDDrm50b3RkZWF1bmEgYSBhcGxpY2HFo2llaSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IkFwbGljYcWjaWUgcmVkaXJlY8WjaW9uYXTEgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBmdW5jxaNpb25lYXrEgyBhY3VtLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBhIGZvc3QgbGFuc2F0xIMgaW5pxaNpYWwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGljYcWjaWEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzdWwgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBhIMOubmPEg2xjYXQgcHJvcHJpYSBwb2xpdGljxIMgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJQcm9jZXN1bCA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4gYSDDrm5jxINsY2F0IHByb3ByaWEgcG9saXRpY8SDIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiJSdWxlYXrEgyA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IlN0b2NhcmUgaW50ZXJuxIMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iQ2FyZCBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkRzaXBveml0aXYgZGUgc3RvY2FyZSBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCmluZGV4IGU3ZDQyNjguLjgzZGMzMGYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQstC70LDQtNC10LvRjNGG0YMg0L7RgtC/0YDQsNCy0LvRj9GC0Ywg0YbQtdC70LXQstGL0LUg0LfQvdCw0YfQtdC90LjRjyDQsNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgNGDINGD0YHRgtGA0L7QudGB0YLQstCwLiDQndC40LrQvtCz0LTQsCDQvdC1INC40YHQv9C+0LvRjNC30YPQtdGC0YHRjyDQvtCx0YvRh9C90YvQvNC4INC/0YDQuNC70L7QttC10L3QuNGP0LzQuC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+ItC40LfQvNC10L3Rj9GC0Ywg0L7RgNC40LXQvdGC0LDRhtC40Y4g0Y3QutGA0LDQvdCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC40LfQvNC10L3Rj9GC0Ywg0L7RgNC40LXQvdGC0LDRhtC40Y4g0Y3QutGA0LDQvdCwINCyINC70Y7QsdC+0LUg0LLRgNC10LzRjy4g0J3QtSDRgtGA0LXQsdGD0LXRgtGB0Y8g0LTQu9GPINC+0LHRi9GH0L3Ri9GFINC/0YDQuNC70L7QttC10L3QuNC5LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiLQvtGC0L/RgNCw0LLQu9GP0YLRjCDQv9GA0LjQu9C+0LbQtdC90LjRj9C8INGB0LjQs9C90LDQu9GLIExpbnV4Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLQn9C+0LfQstC+0LvRj9C10YIg0L/RgNC40LvQvtC20LXQvdC40Y4g0L3QsNC/0YDQsNCy0LvRj9GC0Ywg0LfQsNC/0YDQvtGBINC90LAg0L/QtdGA0LXQtNCw0YfRgyDQv9GA0LXQtNC+0YHRgtCw0LLQu9C10L3QvdC+0LPQviDRgdC40LPQvdCw0LvQsCDQstGB0LXQvCDQv9C+0YHRgtC+0Y/QvdC90YvQvCDQv9GA0L7RhtC10YHRgdCw0LwuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4i0LfQsNC/0YPRgdC60LDRgtGMINC/0L7RgdGC0L7Rj9C90L3Rg9GOINGA0LDQsdC+0YLRgyDQv9GA0LjQu9C+0LbQtdC90LjRjyI8L3N0cmluZz4KQEAgLTQ0OSw3ICs0NTMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9uZmMiIG1zZ2lkPSI0NDIzMzUxMjc0NzU3ODc2OTUzIj4i0YPQv9GA0LDQstC70Y/RgtGMINGA0LDQtNC40L7RgdCy0Y/Qt9GM0Y4g0LHQu9C40LbQvdC10LPQviDQtNC10LnRgdGC0LLQuNGPIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbmZjIiBtc2dpZD0iOTE3MTQwMTg1MTk1NDQwNzIyNiI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQvtCx0LzQtdC90LjQstCw0YLRjNGB0Y8g0LTQsNC90L3Ri9C80Lgg0YEg0LzQtdGC0LrQsNC80LgsINC60LDRgNGC0LDQvNC4INC4INGB0YfQuNGC0YvQstCw0YLQtdC70Y/QvNC4INGH0LXRgNC10Lcg0YDQsNC00LjQvtGB0LLRj9C30Ywg0LHQu9C40LbQvdC10LPQviDQtNC10LnRgdGC0LLQuNGPIChORkMpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdnBuIiBtc2dpZD0iODM0NTgwMDU4NDUzMjE3NTMxMiI+ItC/0LXRgNC10YXQstCw0YLRi9Cy0LDRgtGMINC4INC40LfQvNC10L3Rj9GC0Ywg0YHQtdGC0LXQstC+0Lkg0YLRgNCw0YTQuNC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdnBuIiBtc2dpZD0iNTYxNzg5MzA3ODk4OTk0NDIxOSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQv9C10YDQtdGF0LLQsNGC0YvQstCw0YLRjCDQuCDQv9GA0L7QstC10YDRj9GC0Ywg0LLQtdGB0Ywg0YHQtdGC0LXQstC+0Lkg0YLRgNCw0YTQuNC6LCDQvdCw0L/RgNC40LzQtdGALCDRh9GC0L7QsdGLINGD0YHRgtCw0L3QvtCy0LjRgtGMINGB0L7QtdC00LjQvdC10L3QuNC1IFZQTi4g0JLRgNC10LTQvtC90L7RgdC90L7QtSDQn9CeINC80L7QttC10YIg0L7RgtGB0LvQtdC20LjQstCw0YLRjCwg0L/QtdGA0LXQvdCw0L/RgNCw0LLQu9GP0YLRjCDQuNC70Lgg0LjQt9C80LXQvdGP0YLRjCDRgdC10YLQtdCy0YvQtSDQv9Cw0LrQtdGC0Ysg0LHQtdC3INCy0LDRiNC10LPQviDQstC10LTQvtC80LAuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdnBuIiBtc2dpZD0iNTYxNzg5MzA3ODk4OTk0NDIxOSI+ItCf0L7Qt9Cy0L7Qu9GP0LXRgiDQv9GA0LjQu9C+0LbQtdC90LjRjiDQv9C10YDQtdGF0LLQsNGC0YvQstCw0YLRjCDQuCDQv9GA0L7QstC10YDRj9GC0Ywg0LLQtdGB0Ywg0YHQtdGC0LXQstC+0Lkg0YLRgNCw0YTQuNC6LCDQvdCw0L/RgNC40LzQtdGAINGH0YLQvtCx0Ysg0YPRgdGC0LDQvdC+0LLQuNGC0Ywg0YHQvtC10LTQuNC90LXQvdC40LUgVlBOLiDQktGA0LXQtNC+0L3QvtGB0L3QvtC1INCf0J4g0LzQvtC20LXRgiDQvtGC0YHQu9C10LbQuNCy0LDRgtGMLCDQv9C10YDQtdC90LDQv9GA0LDQstC70Y/RgtGMINC40LvQuCDQuNC30LzQtdC90Y/RgtGMINGB0LXRgtC10LLRi9C1INC/0LDQutC10YLRiyDQsdC10Lcg0LLQsNGI0LXQs9C+INCy0LXQtNC+0LzQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiLQvtGC0LrQu9GO0YfQsNGC0Ywg0LHQu9C+0LrQuNGA0L7QstC60YMg0LrQu9Cw0LLQuNCw0YLRg9GA0YsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSIzMTg5NzYzNDc5MzI2MzAyMDE3Ij4i0J/QvtC30LLQvtC70Y/QtdGCINC/0YDQuNC70L7QttC10L3QuNGOINC+0YLQutC70Y7Rh9C40YLRjCDQsdC70L7QutC40YDQvtCy0LrRgyDQutC70LDQstC40LDRgtGD0YDRiyDQuCDQtNGA0YPQs9C40LUg0YTRg9C90LrRhtC40Lgg0LfQsNGJ0LjRgtGLINC/0LDRgNC+0LvQtdC8LiDQn9GA0LjQvNC10YDQvtC8INC00L7Qv9GD0YHRgtC40LzQvtCz0L4g0LjRgdC/0L7Qu9GM0LfQvtCy0LDQvdC40Y8g0Y3RgtC+0Lkg0YTRg9C90LrRhtC40Lgg0Y/QstC70Y/QtdGC0YHRjyDQvtGC0LrQu9GO0YfQtdC90LjQtSDQsdC70L7QutC40YDQvtCy0LrQuCDQutC70LDQstC40LDRgtGD0YDRiyDQv9GA0Lgg0L/QvtC70YPRh9C10L3QuNC4INCy0YXQvtC00Y/RidC10LPQviDQstGL0LfQvtCy0LAg0Lgg0LLQutC70Y7Rh9C10L3QuNC1INCx0LvQvtC60LjRgNC+0LLQutC4INC/0L7RgdC70LUg0LfQsNCy0LXRgNGI0LXQvdC40Y8g0YDQsNC30LPQvtCy0L7RgNCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiLRgdGH0LjRgtGL0LLQsNGC0Ywg0L3QsNGB0YLRgNC+0LnQutC4INGB0LjQvdGF0YDQvtC90LjQt9Cw0YbQuNC4Ijwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4i0J/RgNC40LvQvtC20LXQvdC40LUg0L/QtdGA0LXQvdCw0L/RgNCw0LLQu9C10L3QviI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4i0J/RgNC40LvQvtC20LXQvdC40LUgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDQstGL0L/QvtC70L3Rj9C10YLRgdGPLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4i0JjQt9C90LDRh9Cw0LvRjNC90L4g0LHRi9C70L4g0LfQsNC/0YPRidC10L3QviDQv9GA0LjQu9C+0LbQtdC90LjQtSA8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+LiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLQn9GA0LjQu9C+0LbQtdC90LjQtSA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjQv9GA0L7RhtC10YHRgSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pINC90LDRgNGD0YjQuNC70L4g0YHQvtCx0YHRgtCy0LXQvdC90YPRjiDQv9C+0LvQuNGC0LjQutGDIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i0J/RgNC+0YbQtdGB0YEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+INC90LDRgNGD0YjQuNC7INGB0L7QsdGB0YLQstC10L3QvdGD0Y4g0L/QvtC70LjRgtC40LrRgyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4i0J/RgNC40LvQvtC20LXQvdC40LUgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4g0LfQsNC/0YPRidC10L3QviI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+ItCS0L3Rg9GC0YDQtdC90L3Rj9GPINC/0LDQvNGP0YLRjCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRC3QutCw0YDRgtCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCLdC90LDQutC+0L/QuNGC0LXQu9GMIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAppbmRleCAzMTFkYTk0Li4zNDM5ZjU5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJVbW/FvsWIdWplIGRyxb5pdGXEvm92aSBvZG9zaWVsYcWlIGluZm9ybcOhY2llIHNwcsOhdmNvdmkgemFyaWFkZW5pYS4gQmXFvm7DqSBhcGxpa8OhY2llIGJ5IHRvdG8gb3Byw6F2bmVuaWUgbmVtYWxpIG5pa2R5IHBvxb5hZG92YcWlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iem1lbmEgb3JpZW50w6FjaWUgb2JyYXpvdmt5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iVW1vxb7FiHVqZSBhcGxpa8OhY2lpIGtlZHlrb8S+dmVrIHptZW5pxaUgb3JpZW50w6FjaXUgb2JyYXpvdmt5LiBCZcW+bsOpIGFwbGlrw6FjaWUgYnkgdG90byBuYXN0YXZlbmllIG5lbWFsaSB2w7RiZWMgdnl1xb7DrXZhxaUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+Im9kb3NsYW5pZSBzaWduw6Fsb3Ygc3lzdMOpbXUgTGludXggYXBsaWvDoWNpw6FtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJVbW/FvsWIdWplIGFwbGlrw6FjaWkgdnnFvmlhZGHFpSB6YXNsYW5pZSBwb3NreXRudXTDqWhvIHNpZ27DoWx1IHbFoWV0a8O9bSB0cnZhbMO9bSBwcm9jZXNvbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiJ0cnZhbMOpIHNwdXN0ZW5pZSBhcGxpa8OhY2llIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iQXBsaWvDoWNpYSBib2xhIHByZXNtZXJvdi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IkplIHNwdXN0ZW7DoSBhcGxpa8OhY2lhIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJQw7R2b2RuZSBib2xhIHNwdXN0ZW7DoSBhcGxpa8OhY2lhIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IkFwbGlrw6FjaWEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgcG9ydcWhaWxhIHN2b2plIHZsYXN0bsOpIHZ5bsO6dGVuw6kgcHJhdmlkbMOhIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBwb3J1xaFpbCBzdm9qZSB2bGFzdG7DqSB2eW7DunRlbsOpIHByYXZpZGzDoSBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iU3B1c3RlbsOhIGFwbGlrw6FjaWE6IDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSW50ZXJuw70gdWtsYWRhY8OtIHByaWVzdG9yIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+IkthcnRhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVWtsYWRhY8OtIHByaWVzdG9yIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKaW5kZXggMmJhMzI0Mi4uY2Q0Y2QwNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4iRG92b2xqdWplIGxhc3RuaWt1LCBkYSBwb8WhbGplIG5hbWVyZSBza3JibmlrdSBuYXByYXZlLiBOaWtvbGkgc2UgbmUgdXBvcmFibGphIHphIG5hdmFkbmUgcHJvZ3JhbWUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiJzcHJlbWluamFuamUgdXNtZXJqZW5vc3RpIHphc2xvbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJEb3ZvbGp1amUsIGRhIHByb2dyYW0ga2FkYXIga29saSBzcHJlbWVuaSBzbWVyIHN1a2FuamEgemFzbG9uYS4gVGVnYSBuaWtvbGkgbmkgdHJlYmEgdXBvcmFiaXRpIHphIG5hdmFkbmUgcHJvZ3JhbWUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+InBvxaFpbGphbmplIHNpZ25hbG92IExpbnV4YSBwcm9ncmFtb20iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkRvdm9sanVqZSwgZGEgcHJvZ3JhbSB6YWh0ZXZhLCBkYSBqZSBwb3NyZWRvdmFuIHNpZ25hbCBwb3NsYW4gdnNlbSB0cmFqbmltIHByb2Nlc29tLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+Im5lcHJla2luamVubyBpenZhamFuamUgcHJvZ3JhbW92Ijwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iUHJldXNtZXJpdGV2IHByb2dyYW1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHNlIGl6dmFqYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IlBydm90bm8gamUgYmlsIHphZ25hbiBwcm9ncmFtIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW0gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikga3LFoWkgc3ZvaiBzYW1vaXp2ZWRsaml2aSBwcmF2aWxuaWsgbyBzdHJvZ2VtIG5hxI1pbnUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBrcsWhaSBzdm9qIHNhbW9penZlZGxqaXZpIHByYXZpbG5payBvIHN0cm9nZW0gbmHEjWludS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IHNlIGl6dmFqYSI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+Ik5vdHJhbmppIHBvbW5pbG5payI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJLYXJ0aWNhIFNEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iUG9tbmlsbmlrIFVTQiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKaW5kZXggOGQ4YjczZi4uNTkzMjliNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i0J7QvNC+0LPRg9Gb0LDQstCwINCy0LvQsNGB0L3QuNC60YMg0LTQsCDRiNCw0ZnQtSDRgdCy0L7RmNC1INC90LDQvNC10YDQtSDQsNC00LzQuNC90LjRgdGC0YDQsNGC0L7RgNGDINGD0YDQtdGS0LDRmNCwLiDQntCx0LjRh9C90LUg0LDQv9C70LjQutCw0YbQuNGY0LUg0L3QuNC60LDQtNCwINC90LUg0LHQuCDRgtGA0LXQsdCw0LvQviDQtNCwINGY0LUg0LrQvtGA0LjRgdGC0LUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjMzNjU5NDc3MTcxNjM4NjY4NDQiPiLQv9GA0L7QvNC10L3QsCDQv9C+0LvQvtC20LDRmNCwINC10LrRgNCw0L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+ItCe0LzQvtCz0YPRm9Cw0LLQsCDQtNCwINCw0L/Qu9C40LrQsNGG0LjRmNCwINGDINGB0LLQsNC60L7QvCDRgtGA0LXQvdGD0YLQutGDINC/0YDQvtC80LXQvdC4INGA0L7RgtCw0YbQuNGY0YMg0LXQutGA0LDQvdCwLiDQntCx0LjRh9C90LUg0LDQv9C70LjQutCw0YbQuNGY0LUg0L3QuNC60LDQtNCwINC90LUg0LHQuCDRgtGA0LXQsdCw0LvQviDQtNCwINGY0LUg0LrQvtGA0LjRgdGC0LUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ItGB0LvQsNGa0LUgTGludXgg0YHQuNCz0L3QsNC70LAg0LDQv9C70LjQutCw0YbQuNGY0LDQvNCwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLQntC80L7Qs9GD0ZvQsNCy0LAg0LTQsCDQsNC/0LvQuNC60LDRhtC40ZjQsCDQt9Cw0YXRgtC10LLQsCDQtNCwINC40YHQv9C+0YDRg9GH0LXQvdC4INGB0LjQs9C90LDQuyDQsdGD0LTQtSDQv9C+0YHQu9Cw0YIg0YHQstC40Lwg0YLRgNCw0ZjQvdC40Lwg0L/RgNC+0YbQtdGB0LjQvNCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+ItC+0LzQvtCz0YPRm9Cw0LLQsNGa0LUg0L3QtdC/0YDQtdC60LjQtNC90LUg0LDQutGC0LjQstC90L7RgdGC0Lgg0LDQv9C70LjQutCw0YbQuNGY0LUiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLQkNC/0LvQuNC60LDRhtC40ZjQsCDRmNC1INC/0YDQtdGD0YHQvNC10YDQtdC90LAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+ItCQ0L/Qu9C40LrQsNGG0LjRmNCwIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g0ZjQtSDRgdCw0LTQsCDQv9C+0LrRgNC10L3Rg9GC0LAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLQn9GA0LLQvtCx0LjRgtC90L4g0ZjQtSDQv9C+0LrRgNC10L3Rg9GC0LAg0LDQv9C70LjQutCw0YbQuNGY0LAgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i0JDQv9C70LjQutCw0YbQuNGY0LAgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo0L/RgNC+0YbQtdGBIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg0ZjQtSDQv9GA0LXQutGA0YjQuNC70LAg0YHQsNC80L7QvdCw0LzQtdGC0L3Rg9GC0LUgU3RyaWN0TW9kZSDRgdC80LXRgNC90LjRhtC1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+ItCf0YDQvtGG0LXRgSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g0ZjQtSDQv9GA0LXQutGA0YjQuNC+INGB0LDQvNC+0L3QsNC80LXRgtC90YPRgtC1IFN0cmljdE1vZGUg0YHQvNC10YDQvdC40YbQtS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+ItCQ0L/Qu9C40LrQsNGG0LjRmNCwIDx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+INGY0LUg0L/QvtC60YDQtdC90YPRgtCwIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4i0JjQvdGC0LXRgNC90LAg0LzQtdC80L7RgNC40ZjQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCDQutCw0YDRgtC40YbQsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQiDQvNC10LzQvtGA0LjRmNCwIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAppbmRleCBiMjc0MGEwLi5hMzM1MGU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJUaWxsw6V0ZXIgYXR0IGlubmVoYXZhcmVuIHNraWNrYXIgYXZzaWt0ZXIgdGlsbCBlbiBlbmhldHNhZG1pbmlzdHJhdMO2ci4gVmFubGlnYSBwcm9ncmFtIGJlaMO2dmVyIGFsZHJpZyBnw7ZyYSBkZXR0YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+IsOkbmRyYSBiaWxkc2vDpHJtZW5zIHJpa3RpbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJUaWxsw6V0ZXIgYXR0IGV0dCBwcm9ncmFtIG7DpHIgc29tIGhlbHN0IMOkbmRyYXIgc2vDpHJtZW5zIHJvdGVyaW5nLiBCZWjDtnZzIGludGUgZsO2ciB2YW5saWdhIHByb2dyYW0uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+InNraWNrYSBMaW51eC1zaWduYWxlciB0aWxsIGFwcGFyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJUaWxsw6V0ZXIgYXR0IHByb2dyYW1tZXQgYmVnw6RyIGF0dCBkZW4gYW5naXZuYSBzaWduYWxlbiBza2lja2FzIHRpbGwgYWxsYSBiZXN0w6RuZGlnYSBwcm9jZXNzZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4ic2UgdGlsbCBhdHQgcHJvZ3JhbW1ldCBhbGx0aWQga8O2cnMiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJQcm9ncmFtbWV0IG9tZGlyaWdlcmFkZXMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4ga8O2cnMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHN0YXJ0YWRlcyBmw7Zyc3QuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IlByb2dyYW1tZXQgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvY2Vzc2VuIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaGFyIGJydXRpdCBtb3Qgc2luIGVnZW4gU3RyaWN0TW9kZS1wb2xpY3kuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvY2Vzc2VuIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBoYXIgYnJ1dGl0IG1vdCBzaW4gZWdlbiBTdHJpY3RNb2RlLXBvbGljeS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGvDtnJzIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iSW50ZXJudCBsYWdyaW5nc3V0cnltbWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qta29ydCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IlVTQi1sYWdyaW5nIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAppbmRleCAwNDEzNjVlLi5mZjE5MDdhIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTM5Niw2ICszOTYsMTAgQEAKICAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldE9yaWVudGF0aW9uICgzMzY1OTQ3NzE3MTYzODY2ODQ0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iSHVydWh1c3UgcHJvZ3JhbXUga3ViYWRpbGlzaGEgdXp1bmd1a2FqaSB3YSBza3Jpbmkgd2FrYXRpIHdvd290ZS4gSGFpcGFzd2kga3VoaXRhamlrYSBrd2EgcHJvZ3JhbXUgemEga2F3YWlkYSB6YSBrb21weXV0YS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzICg0MjU1NDY3MjU1NDg4NjUzODU0KSAtLT4KICAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJIdXJ1aHVzdSBwcm9ncmFtdSBrdW9tYmEga3dhbWJhIG1hd2ltYmkgeWFsaXlvdG9sZXdhIHlhdHVtd2Uga3dhIG1pY2hha2F0byB5b3RlIGlzaXlva29tYS4iPC9zdHJpbmc+CkBAIC0xMTU0LDYgKzExNTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlByb2dyYW11IGltZWVsZWtlendhIHVweWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz5pbmFlbmRlc2hhIHNhc2EuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGlsaXppbmR1bGl3YSBtd2Fuem9uaS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iU2h1Z2h1bGkgeWEgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvZ3JhbXUgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSBpbWVlbmRhIGtpbnl1bWUgbmEgc2VyYSB5YWtlIHlhIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iU2h1Z2h1bGkgeWEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGltZWVuZGEga2lueXVtZSBuYSBrdWxhemltaXNoYSBzZXJhIHlha2UgeWEgU3RyaWN0TW9kZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGluYWVuZGVsZWEiPC9zdHJpbmc+CkBAIC0xNDIzLDQgKzE0MzMsNiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3RvcmFnZV91c2IgKDMwMTc5NTQwNTk1Mzg1MTcyNzgpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9jb25maWcueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbmZpZy54bWwKaW5kZXggNDlhY2UzNC4uZDZhMGNkZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbmZpZy54bWwKQEAgLTIwLDggKzIwLDYgQEAKIDwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAogICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+CiA8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8Ym9vbCBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSI+ZmFsc2U8L2Jvb2w+Ci0KICAgICA8IS0tIHNlZSBjb21tZW50IGluIHZhbHVlcy9jb25maWcueG1sIC0tPgogICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19sb25nUHJlc3NPblBvd2VyQmVoYXZpb3IiPjI8L2ludGVnZXI+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwYjZkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiAvL2RldmljZS9hcHBzL2NvbW1vbi9hc3NldHMvcmVzL2FueS9kaW1lbnMueG1sCisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij40OGRpcDwvZGltZW4+CisgICAgPCEtLSBXaWR0aCBhbmQgaGVpZ2h0IG9mIGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBpY29uIGluIHRoZSBzdGF0dXMgYmFyIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MzJkaXA8L2RpbWVuPgorICAgIDwhLS0gU2l6ZSBvZiB0aGUgZ2lhbnQgbnVtYmVyICh1bnJlYWQgY291bnQpIGluIHRoZSBub3RpZmljYXRpb25zIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2NvbnRlbnRfbnVtYmVyX3NpemUiPjQ4c3A8L2RpbWVuPgorCisgICAgPCEtLSBTaXplIG9mIGNsb2NrIGZvbnQgaW4gTG9ja1NjcmVlbi4gLS0+CisgICAgPGRpbWVuIG5hbWU9ImtleWd1YXJkX3BhdHRlcm5fdW5sb2NrX2Nsb2NrX2ZvbnRfc2l6ZSI+OThzcDwvZGltZW4+CisKKyAgICA8IS0tIFNpemUgb2Ygc3RhdHVzIGxpbmUgZm9udCBpbiBMb2NrU2NyZWVuLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ia2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfc3RhdHVzX2xpbmVfZm9udF9zaXplIj4xNHNwPC9kaW1lbj4KKworPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdzYwMGRwL3N0eWxlcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ1ZGIxMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3c2MDBkcC9zdHlsZXMueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UYWJXaWRnZXQiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvdGFiX2luZGljYXRvcl90ZXh0PC9pdGVtPgorICAgIDwvc3R5bGU+CisgICAgCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRhYldpZGdldCIgcGFyZW50PSJXaWRnZXQuVGFiV2lkZ2V0Ij4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0YWJTdHJpcExlZnQiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwUmlnaHQiPkBudWxsPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+bGVmdHxjZW50ZXJfdmVydGljYWw8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGFiTGF5b3V0Ij5AYW5kcm9pZDpsYXlvdXQvdGFiX2luZGljYXRvcl9ob2xvX2xhcmdlPC9pdGVtPgorICAgIDwvc3R5bGU+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKaW5kZXggZjA1NDA5Yy4uYmU5NThkYyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4Lic4Li54LmJ4LiW4Li34Lit4Liq4LmI4LiH4LmA4LiZ4Li34LmJ4Lit4Lir4Liy4LmE4Lib4Lii4Lix4LiH4LmC4Lib4Lij4LmB4LiB4Lij4Lih4LiE4Lin4Lia4LiE4Li44Lih4Lit4Li44Lib4LiB4Lij4LiT4LmMIOC5hOC4oeC5iOC4hOC4p+C4o+C4leC5ieC4reC4h+C5g+C4iuC5ieC4quC4s+C4q+C4o+C4seC4muC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC4l+C4seC5iOC4p+C5hOC4myI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4i4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LiB4Liy4Lij4Lin4Liy4LiH4LmB4LiZ4Lin4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i4Lit4LiZ4Li44LiN4Liy4LiV4LmD4Lir4LmJ4LmB4Lit4Lib4Lie4Lil4Li04LmA4LiE4LiK4Lix4LiZ4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LiB4Liy4Lij4Lir4Lih4Li44LiZ4Lir4LiZ4LmJ4Liy4LiI4Lit4LmE4LiU4LmJ4LiV4Lil4Lit4LiU4LmA4Lin4Lil4LiyIOC5hOC4oeC5iOC4hOC4p+C4o+C4leC5ieC4reC4h+C5g+C4iuC5ieC4quC4s+C4q+C4o+C4seC4muC5geC4reC4m+C4nuC4peC4tOC5gOC4hOC4iuC4seC4meC4l+C4seC5iOC4p+C5hOC4myI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiLguKrguYjguIfguKrguLHguI3guI3guLLguJMgTGludXgg4LmE4Lib4Lii4Lix4LiH4LmB4Lit4Lib4Lie4Lil4Li04LmA4LiE4LiK4Lix4LiZIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiLguK3guJnguLjguI3guLLguJXguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguKPguYnguK3guIfguILguK3guYPguKvguYnguKrguYjguIfguKrguLHguI3guI3guLLguJPguYHguIjguYnguIfguYTguJvguKLguLHguIfguIHguKPguLDguJrguKfguJnguIHguLLguKPguJfguLXguYjguKLguLHguIfguJfguLPguIfguLLguJnguK3guKLguLnguYjguJfguLHguYnguIfguKvguKHguJQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLguJfguLPguYPguKvguYnguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJnguJfguLPguIfguLLguJnguJXguKXguK3guJTguYDguKfguKXguLIiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLguYDguJvguKXguLXguYjguKLguJnguYDguKrguYnguJnguJfguLLguIfguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+Ijx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4g4LiB4Liz4Lil4Lix4LiH4LiX4Liz4LiH4Liy4LiZ4Lit4Lii4Li54LmI4LmD4LiZ4LiC4LiT4Liw4LiZ4Li14LmJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IOC5gOC4m+C4tOC4lOC5g+C4iuC5ieC5hOC4p+C5ieC5geC4peC5ieC4pyI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLguYHguK3guJvguJ7guKXguLTguYDguITguIrguLHguJkgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo4LiB4Lij4Liw4Lia4Lin4LiZ4LiB4Liy4LijIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg4Lil4Liw4LmA4Lih4Li04LiU4LiZ4LmC4Lii4Lia4Liy4LiiIFN0cmljdE1vZGUg4LiX4Li14LmI4Lia4Lix4LiH4LiE4Lix4Lia4LmD4LiK4LmJ4LiU4LmJ4Lin4Lii4LiV4Lix4Lin4LmA4Lit4LiHIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i4LiB4Lij4Liw4Lia4Lin4LiZ4LiB4Liy4LijIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDguKXguLDguYDguKHguLTguJTguJnguYLguKLguJrguLLguKIgU3RyaWN0TW9kZSDguJfguLXguYjguJrguLHguIfguITguLHguJrguYPguIrguYnguJTguYnguKfguKLguJXguLHguKfguYDguK3guIciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IOC4geC4s+C4peC4seC4h+C4l+C4s+C4h+C4suC4mSI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IuC4l+C4teC5iOC5gOC4geC5h+C4muC4guC5ieC4reC4oeC4ueC4peC4oOC4suC4ouC5g+C4mSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiLguIHguLLguKPguYzguJQgU0QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3VzYiIgbXNnaWQ9IjMwMTc5NTQwNTk1Mzg1MTcyNzgiPiLguJfguLXguYjguYDguIHguYfguJrguILguYnguK3guKHguLnguKUgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbAppbmRleCA3MmQzNjFiLi5iNjk0MmE0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJQaW5hcGF5YWdhbiBhbmcgaG9sZGVyIG5hIG1hZ3BhZGFsYSBuZyBtZ2EgaW50ZW5zeW9uIHNhIGFkbWluaXN0cmF0b3IgbmcgZGV2aWNlLiBIaW5kaSBrYWlsYW5tYW4gZGFwYXQga2FpbGFuZ2FuaW4gcGFyYSBzYSBtZ2Egbm9ybWFsIG5hIGFwcGxpY2F0aW9uLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iYmFndWhpbiBhbmcgb3JpZW50YXRpb24gbmcgc2NyZWVuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4iUGluYXBheWFnYW4gYW5nIGlzYW5nIGFwcGxpY2F0aW9uIG5hIGJhZ3VoaW4gYW5nIHBhZy1yb3RhdGUgbmcgc2NyZWVuIGFudW1hbmcgb3Jhcy4gSGluZGkga2FpbGFubWFuIGRhcGF0IGthaWxhbmdhbmluIHBhcmEgc2EgbWdhIG5vcm1hbCBuYSBhcHBsaWNhdGlvbi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRQb2ludGVyU3BlZWQgKDkxNzUzNzE2MTMzMjI1NjI5MzQpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2Nfc2V0UG9pbnRlclNwZWVkICgxMzc0MzYwMzg1MDMzNzk4NjQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSI0MjU1NDY3MjU1NDg4NjUzODU0Ij4ibWFncGFkYWxhIG5nIG1nYSBMaW51eCBzaWduYWwgc2EgbWdhIGFwcGxpY2F0aW9uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJQaW5hcGF5YWdhbiBhbmcgYXBwbGljYXRpb24gbmEgaGlsaW5naW5nIGlwYWRhbGEgYW5nIG5hLXN1cHBseSBuYSBzaWduYWwgc2EgbGFoYXQgbmcgbWdhIHBhdWxpdC11bGl0IG5hIHByb3Nlc28uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9wZXJzaXN0ZW50QWN0aXZpdHkiIG1zZ2lkPSI4NjU5NjUyMDQyNDAxMDg1ODYyIj4icGFsYWdpbmcgcGF0YWtidWhpbiBhbmcgbWdhIGFwcGxpY2F0aW9uIjwvc3RyaW5nPgpAQCAtODM2LDYgKzg0MCwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfdGl0bGUiIG1zZ2lkPSI4MzIzNzYxNjE2MDUyMTIxOTM2Ij4iTmktcmVkaXJlY3QgYXBwbGljYXRpb24iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+IlR1bWF0YWtibyBuYSBuZ2F5b24gYW5nIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiJPcmloaW5hbCBuYSBuYWx1bnNhZCBhbmcgPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iQW5nIGFwcGxpY2F0aW9uIG5hIDx4bGlmZjpnIGlkPSJBUFBMSUNBVElPTiI+JTEkczwveGxpZmY6Zz4gKHByb3Nlc29uZyA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIGF5IGx1bWFiYWcgc2Egc2FyaWxpIG5pdG9uZyBpcGluYXBhdHVwYWQgbmEgcGF0YWthcmFuZyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IkFuZyBwcm9zZXNvbmcgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IGF5IGx1bWFiYWcgc2Egc2FyaWxpIG5pdG9uZyBpcGluYXBhdHVwYWQgbmEgcGF0YWthcmFuZyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iVHVtYXRha2JvIGFuZyA8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IlBhbmxvb2IgbmEgU3RvcmFnZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCBDYXJkIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIHN0b3JhZ2UiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sCmluZGV4IDg2ODhkZDguLmU5N2Q4MzQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IkNpaGF6xLFuIHNhaGliaW5pbiBjaWhheiB5w7ZuZXRpY2lzaW5lIGFtYcOnIGfDtm5kZXJtZXNpbmUgaXppbiB2ZXJpci4gTm9ybWFsIHV5Z3VsYW1hbGFyZGEgaGnDp2JpciB6YW1hbiBnZXJlayBkdXl1bG1hbWFsxLFkxLFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4iZWtyYW4gecO2bsO8bsO8IGRlxJ9pxZ90aXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJVeWd1bGFtYWxhcsSxbiBla3JhbiB5w7Zuw7xuw7wgaXN0ZWRpa2xlcmkgemFtYW4gZGXEn2nFn3Rpcm1lc2luZSBpemluIHZlcmlyLiBOb3JtYWwgdXlndWxhbWFsYXJkYSBoacOnYmlyIHphbWFuIGdlcmVrbWVtZWxpZGlyLiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCAoOTE3NTM3MTYxMzMyMjU2MjkzNCkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY19zZXRQb2ludGVyU3BlZWQgKDEzNzQzNjAzODUwMzM3OTg2NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjQyNTU0NjcyNTU0ODg2NTM4NTQiPiJ1eWd1bGFtYWxhcmEgTGludXggc2lueWFsbGVyaSBnw7ZuZGVyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyIgbXNnaWQ9IjM1NjU1MzA0NjMyMTUwMTUyODkiPiJVeWd1bGFtYWxhcsSxbiwgc2HEn2xhbmFuIHNpbnlhbGluIHTDvG0ga2FsxLFjxLEgacWfbGVtbGVyZSBnw7ZuZGVyaWxtZXNpbmkgaXN0ZW1lc2luZSBpemluIHZlcmlyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+InV5Z3VsYW1hecSxIGhlciB6YW1hbiDDp2FsxLHFn3TEsXIiPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiJVeWd1bGFtYSB5w7ZubGVuZGlyaWxkaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiDFn2ltZGkgw6dhbMSxxZ/EsXlvci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19vcmlnaW5hbCIgbXNnaWQ9IjE4ODEwMjAyMzAyMTY2ODY4MyI+IsSwbGsgb2xhcmFrIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4gYmHFn2xhdMSxbGTEsS4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4iPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiB1eWd1bGFtYXPEsSAoPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+IGnFn2xlbWkpIGtlbmRpbGnEn2luZGVuIHV5Z3VsYWTEscSfxLEgU3RyaWN0TW9kZSBwb2xpdGlrYXPEsW7EsSBpaGxhbCBldHRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+Ijx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiBpxZ9sZW1pIGtlbmRpbGnEn2luZGVuIHV5Z3VsYWTEscSfxLEgU3RyaWN0TW9kZSBwb2xpdGlrYXPEsW7EsSBpaGxhbCBldHRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4gw6dhbMSxxZ/EsXlvciI8L3N0cmluZz4KQEAgLTEwNDEsNCArMTA1MSw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX2ludGVybmFsIiBtc2dpZD0iNzU1NjA1MDgwNTQ3NDExNTYxOCI+IkRhaGlsaSBEZXBvbGFtYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJTRCBLYXJ0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIGRlcG9sYW1hIGJpcmltaSI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKaW5kZXggN2NkOWNlMS4uMDdiMTFmNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sCkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i0JTQvtC30LLQvtC70Y/RlCDQstC70LDRgdC90LjQutGDINC90LDQtNGB0LjQu9Cw0YLQuCDRhtGW0LvRliDQsNC00LzRltC90ZbRgdGC0YDQsNGC0L7RgNGDINC/0YDQuNGB0YLRgNC+0Y4uINCd0ZbQutC+0LvQuCDQvdC1INC/0L7RgtGA0ZbQsdC90LjQuSDQtNC70Y8g0LfQstC40YfQsNC50L3QuNGFINC/0YDQvtCz0YDQsNC8LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4i0LfQvNGW0L3RjtCy0LDRgtC4INC+0YDRltGU0L3RgtCw0YbRltGOINC10LrRgNCw0L3QsCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+ItCU0L7Qt9Cy0L7Qu9GP0ZQg0L/RgNC+0LPRgNCw0LzRliDQsdGD0LTRjC3QutC+0LvQuCDQt9C80ZbQvdGO0LLQsNGC0Lgg0L7QsdC10YDRgtCw0L3QvdGPINC10LrRgNCw0L3QsC4g0J3RltC60L7Qu9C4INC90LUg0L/QvtGC0YDRltCx0L3QuNC5INC00LvRjyDQt9Cy0LjRh9Cw0LnQvdC40YUg0L/RgNC+0LPRgNCw0LwuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+ItC90LDQtNGB0LjQu9Cw0YLQuCDRgdC40LPQvdCw0LvQuCBMaW51eCDQv9GA0L7Qs9GA0LDQvNCw0LwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+ItCU0L7Qt9Cy0L7Qu9GP0ZQg0L/RgNC+0LPRgNCw0LzRliDQv9C+0LTQsNCy0LDRgtC4INC30LDQv9C40YIg0YnQvtC00L4g0L3QsNC00YHQuNC70LDQvdC90Y8g0L3QsNC00LDQvdC+0LPQviDRgdC40LPQvdCw0LvRgyDQstGB0ZbQvCDQv9C+0YHRgtGW0LnQvdC40Lwg0L/RgNC+0YbQtdGB0LDQvC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLQt9Cx0LXRgC4g0L/RgNC+0LPRgNCw0LzRgyDQt9Cw0LLQttC00Lgg0LfQsNC/0YPRiS4iPC9zdHJpbmc+CkBAIC04MzYsNiArODQwLDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ190aXRsZSIgbXNnaWQ9IjgzMjM3NjE2MTYwNTIxMjE5MzYiPiLQn9GA0L7Qs9GA0LDQvNGDINC/0LXRgNC10LDQtNGA0LXRgdC+0LLQsNC90L4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIiBtc2dpZD0iNjIwMjQ5ODk0OTk3MDI4MTQxMiI+ItCX0LDRgNCw0Lcg0L/RgNCw0YbRjtGUIDx4bGlmZjpnIGlkPSJBUFBfTkFNRSI+JTEkczwveGxpZmY6Zz4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiLQodC/0L7Rh9Cw0YLQutGDINCx0YPQu9C+INC30LDQv9GD0YnQtdC90L4gPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPi4iPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlICgzMjAyOTU1NjY3Njc1OTQ0NDk5KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zaG93ICg0MDEzODc4ODc2NDg2NjU1ODkyKSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9oaW50ICgyOTUzNzE2NTc0MTk4MDQ2NDg0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0ic212X2FwcGxpY2F0aW9uIiBtc2dpZD0iMjk1NTgzODA0MzYxMjM2Mjg4Ij4i0J/RgNC+0LPRgNCw0LzQsCA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICjQv9GA0L7RhtC10YEgPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+KSDQv9C+0YDRg9GI0LjQu9CwINGB0LLQvtGOINGB0LDQvNC+0LfQsNGB0YLQvtGB0L7QstC90YMg0L/QvtC70ZbRgtC40LrRgyBTdHJpY3RNb2RlLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+ItCf0YDQvtGG0LXRgSA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTEkczwveGxpZmY6Zz4g0L/QvtGA0YPRiNC40LIg0YHQstC+0Y4g0YHQsNC80L7Qt9Cw0YHRgtC+0YHQvtCy0L3RgyDQv9C+0LvRltGC0LjQutGDIFN0cmljdE1vZGUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiLQn9GA0LDRhtGO0ZQgPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz4iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLQktC90YPRgtGA0ZbRiNC90Y8g0L/QsNC84oCZ0Y/RgtGMIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9zZF9jYXJkIiBtc2dpZD0iODkyMTc3MTQ3ODYyOTgxMjM0MyI+ItCa0LDRgNGC0LrQsCBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+ItCd0L7RgdGW0LkgVVNCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGV4dHJhY3RfZWRpdF9tZW51X2J1dHRvbiAoMzAyMDYwMTg5MDU3MTYzOTA2KSAtLT4KKyAgICA8c2tpcCAvPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAppbmRleCBlYjRhZWUzLi5jZmI1M2FjIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwKQEAgLTI2NSw2ICsyNjUsMTAgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JpbmREZXZpY2VBZG1pbiIgbXNnaWQ9Ijg3MTQ0MjQzMzMwODIyMTY5NzkiPiJDaG8gcGjDqXAgY2jhu6cgbmjDom4gZ+G7rWkgY8OhYyDDvSDEkeG7i25oIMSR4bq/biBxdeG6o24gdHLhu4sgdmnDqm4gdGhp4bq/dCBi4buLLiBLaMO0bmcgY+G6p24gdGhp4bq/dCBjaG8gY8OhYyDhu6luZyBk4bulbmcgdGjDtG5nIHRoxrDhu51uZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iMzM2NTk0NzcxNzE2Mzg2Njg0NCI+InRoYXkgxJHhu5VpIGjGsOG7m25nIG3DoG4gaMOsbmgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRPcmllbnRhdGlvbiIgbXNnaWQ9IjYzMzU4MTQ0NjE2MTU4NTE4NjMiPiJDaG8gcGjDqXAg4bupbmcgZOG7pW5nIHRoYXkgxJHhu5VpIHZp4buHYyB4b2F5IG3DoG4gaMOsbmggYuG6pXQga+G7syBraGkgbsOgby4gS2jDtG5nIGPhuqduIHRoaeG6v3QgY2hvIGPDoWMg4bupbmcgZOG7pW5nIHRow7RuZyB0aMaw4budbmcuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+Imfhu61pIHTDrW4gaGnhu4d1IExpbnV4IMSR4bq/biDhu6luZyBk4bulbmciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IkNobyBwaMOpcCDhu6luZyBk4bulbmcgecOqdSBj4bqndSB0w61uIGhp4buHdSDEkcOjIGN1bmcgY+G6pXAgxJHGsOG7o2MgZ+G7rWkgxJHhur9uIHThuqV0IGPhuqMgY8OhYyBxdcOhIHRyw6xuaCBsacOqbiB04bulYy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BlcnNpc3RlbnRBY3Rpdml0eSIgbXNnaWQ9Ijg2NTk2NTIwNDI0MDEwODU4NjIiPiLEkeG6t3Qg4bupbmcgZOG7pW5nIGx1w7RuIGNo4bqheSI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuG7qG5nIGThu6VuZyDEkcOjIMSRxrDhu6NjIGNodXnhu4NuIGjGsOG7m25nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfcmVwbGFjZSIgbXNnaWQ9IjYyMDI0OTg5NDk5NzAyODE0MTIiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IGhp4buHbiDEkWFuZyBjaOG6oXkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IMSRxrDhu6NjIGto4bufaSBjaOG6oXkgdHLGsOG7m2MgdGnDqm4uIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IuG7qG5nIGThu6VuZyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+IChxdcOhIHRyw6xuaCA8eGxpZmY6ZyBpZD0iUFJPQ0VTUyI+JTIkczwveGxpZmY6Zz4pIMSRw6MgdmkgcGjhuqFtIGNow61uaCBzw6FjaCBTdHJpY3RNb2RlIHThu7EgdGhpIGjDoG5oIGPhu6dhIG3DrG5oLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9wcm9jZXNzIiBtc2dpZD0iNTEyMDM5NzAxMjA0NzQ2MjQ0NiI+IlF1w6EgdHLDrG5oIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDEkcOjIHZpIHBo4bqhbSBjaMOtbmggc8OhY2ggU3RyaWN0TW9kZSB04buxIHRoaSBow6BuaCBj4bunYSBtw6xuaC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IMSRYW5nIGhv4bqhdCDEkeG7mW5nIjwvc3RyaW5nPgpAQCAtMTA0MSw0ICsxMDUxLDYgQEAKICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfaW50ZXJuYWwiIG1zZ2lkPSI3NTU2MDUwODA1NDc0MTE1NjE4Ij4iQuG7mSBuaOG7myB0cm9uZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2Vfc2RfY2FyZCIgbXNnaWQ9Ijg5MjE3NzE0Nzg2Mjk4MTIzNDMiPiJUaOG6uyBTRCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIiBtc2dpZD0iMzAxNzk1NDA1OTUzODUxNzI3OCI+IkLhu5kgbMawdSB0cuG7ryBVU0IiPC9zdHJpbmc+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCmluZGV4IGI5MDZlMWEuLmMxNTc3MGQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2UvZGltZW5zLnhtbApAQCAtMTgsMTMgKzE4LDYgQEAKICovCiAtLT4KIDxyZXNvdXJjZXM+Ci0gICAgPCEtLSBIZWlnaHQgb2YgdGhlIHN0YXR1cyBiYXIgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaGVpZ2h0Ij40OGRpcDwvZGltZW4+Ci0gICAgPCEtLSBXaWR0aCBhbmQgaGVpZ2h0IG9mIGEgc2luZ2xlIG5vdGlmaWNhdGlvbiBpY29uIGluIHRoZSBzdGF0dXMgYmFyIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fc2l6ZSI+MzJkaXA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiB0aGUgZ2lhbnQgbnVtYmVyICh1bnJlYWQgY291bnQpIGluIHRoZSBub3RpZmljYXRpb25zIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2NvbnRlbnRfbnVtYmVyX3NpemUiPjQ4c3A8L2RpbWVuPgotCiAgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIGFscGhhIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9rZXlfaGVpZ2h0X2FscGhhIj43NWRpcDwvZGltZW4+CiAgICAgPCEtLSBEZWZhdWx0IGhlaWdodCBvZiBhIGtleSBpbiB0aGUgcGFzc3dvcmQga2V5Ym9hcmQgZm9yIG51bWVyaWMgLS0+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy14bGFyZ2Uvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxNWM5OC4uMDAwMDAwMAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXhsYXJnZS9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTdGF0dXMgQmFyIFN0eWxlcyAtLT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpY2tlciI+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuSWNvbiI+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jZmY5OTk5OTk8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkV2ZW50Q29udGVudC5UaXRsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4/YW5kcm9pZDphdHRyL3RleHRDb2xvclByaW1hcnk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5UYWJXaWRnZXQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGFuZHJvaWQ6Y29sb3IvdGFiX2luZGljYXRvcl90ZXh0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0gICAgCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRhYldpZGdldCIgcGFyZW50PSJXaWRnZXQuVGFiV2lkZ2V0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRhYldpZGdldDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0YWJTdHJpcExlZnQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwUmlnaHQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRhYlN0cmlwRW5hYmxlZCI+ZmFsc2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6ZGl2aWRlciI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+bGVmdHxjZW50ZXJfdmVydGljYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGFiTGF5b3V0Ij5AYW5kcm9pZDpsYXlvdXQvdGFiX2luZGljYXRvcl9ob2xvX2xhcmdlPC9pdGVtPgotICAgIDwvc3R5bGU+Ci08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAppbmRleCAxMzQ4NDVhLi5iNDViMzQ2IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApAQCAtMjY1LDYgKzI2NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYmluZERldmljZUFkbWluIiBtc2dpZD0iODcxNDQyNDMzMzA4MjIxNjk3OSI+IuWFgeiuuOaMgeacieWvueixoeWwhuaEj+WQkeWPkemAgeWIsOiuvuWkh+euoeeQhuWZqOOAguaZrumAmueahOW6lOeUqOeoi+W6j+S4gOW+i+aXoOmcgOatpOadg+mZkOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4i5pu05pS55bGP5bmV5pi+56S65pa55ZCRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i5YWB6K645bqU55So56iL5bqP6ZqP5pe25pu05pS55bGP5bmV55qE5peL6L2s5pa55ZCR44CC5pmu6YCa5bqU55So56iL5bqP5LuO5LiN6ZyA6KaB5L2/55So5q2k5p2D6ZmQ44CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+IuWQkeW6lOeUqOeoi+W6j+WPkemAgSBMaW51eCDkv6Hlj7ciPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IuWFgeiuuOW6lOeUqOeoi+W6j+ivt+axguWwhuaJgOaPkOS+m+eahOS/oeWPt+WPkemAgee7meaJgOacieaMgeS5hei/m+eoi+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IuiuqeW6lOeUqOeoi+W6j+Wni+e7iOi/kOihjCI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuW6lOeUqOeoi+W6j+W3sumHjeWumuWQkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuebruWJjeato+WcqOi/kOihjOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuW3suWQr+WKqOOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLlupTnlKjnqIvluo88eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+77yIPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUyJHM8L3hsaWZmOmc+IOi/m+eoi++8iei/neWPjeS6huiHquaIkeW8uuWItuaJp+ihjOeahOS4peagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4i6L+b56iLIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiDov53lj43kuoboh6rmiJHlvLrliLbmiafooYznmoTkuKXmoLzmqKHlvI8gKFN0cmljdE1vZGUpIOaUv+etluOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImhlYXZ5X3dlaWdodF9ub3RpZmljYXRpb24iIG1zZ2lkPSI5MDg3MDYzOTg1Nzc2NjI2MTY2Ij4iPHhsaWZmOmcgaWQ9IkFQUCI+JTEkczwveGxpZmY6Zz7mraPlnKjov5DooYwiPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLlhoXlrZjnqbrpl7QiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qg5Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIOWtmOWCqOWZqCI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAppbmRleCA3MDc1Njc3Li4zOTlhNWIwIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2JhY2t1cCIgbXNnaWQ9IjQ3MDAxMzAyMjg2NTQ1MzkyMCI+IuaOp+WItuezu+e1seWCmeS7veiIh+mChOWOnyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2JhY2t1cCIgbXNnaWQ9IjQ4Mzc0OTMwNjUxNTQyNTY1MjUiPiLlhYHoqLHmh4nnlKjnqIvlvI/mjqfliLbns7vntbHnmoTlgpnku73oiIfpgoTljp/mqZ/liLbjgILkuIDoiKzmh4nnlKjnqIvlvI/kuI3mh4nkvb/nlKjpgJnpoIXlip/og73jgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NvbmZpcm1fZnVsbF9iYWNrdXAiIG1zZ2lkPSI1NTU3MDcxMzI1ODA0NDY5MTAyIj4i56K66KqN5a6M5pW05YKZ5Lu95oiW6YKE5Y6f5L2c5qWtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY29uZmlybV9mdWxsX2JhY2t1cCIgbXNnaWQ9IjkwMDUwMTc3NTQxNzU4OTc5NTQiPiLlhYHoqLHmh4nnlKjnqIvlvI/llZ/li5XlrozmlbTlgpnku73norroqo3kvb/nlKjogIXnlYzpnaLvvIzku7vkvZXmh4nnlKjnqIvlvI/lnYfkuI3mh4nkvb/nlKjpgJnpoIXlip/og73jgIIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jb25maXJtX2Z1bGxfYmFja3VwIiBtc2dpZD0iOTAwNTAxNzc1NDE3NTg5Nzk1NCI+IuWFgeioseaHieeUqOeoi+W8j+WVn+WLleWujOaVtOWCmeS7veeiuuiqjeS9v+eUqOiAheS7i+mdou+8jOS7u+S9leaHieeUqOeoi+W8j+Wdh+S4jeaHieS9v+eUqOmAmemgheWKn+iDveOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSIyMTQ4NTYzNjI4MTQwMTkzMjMxIj4i6aGv56S65pyq5o6I5qyK6KaW56qXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfaW50ZXJuYWxTeXN0ZW1XaW5kb3ciIG1zZ2lkPSI1ODk1MDgyMjY4Mjg0OTk4NDY5Ij4i5YWB6Kix5YWn6YOo57O757Wx5L2/55So5LuL6Z2i5bu656uL6KaW56qX44CC5LiA6Iis5oeJ55So56iL5byP5LiN5pyD5L2/55So5q2k5Yqf6IO944CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zeXN0ZW1BbGVydFdpbmRvdyIgbXNnaWQ9IjMzNzIzMjE5NDI5NDExNjgzMjQiPiLpoa/npLrns7vntbHorabnpLoiPC9zdHJpbmc+CkBAIC0yNjUsNiArMjY1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19iaW5kRGV2aWNlQWRtaW4iIG1zZ2lkPSI4NzE0NDI0MzMzMDgyMjE2OTc5Ij4i5YWB6Kix5oeJ55So56iL5byP5bCH6Kq/55So6KuL5rGCIChpbnRlbnQpIOWCs+mAgeiHs+ijnee9rueuoeeQhuWToe+8m+S4gOiIrOaHieeUqOeoi+W8j+S4jemcgOS9v+eUqOatpOmBuOmgheOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSIzMzY1OTQ3NzE3MTYzODY2ODQ0Ij4i6K6K5pu06J6i5bmV6aGv56S65pa55ZCRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0T3JpZW50YXRpb24iIG1zZ2lkPSI2MzM1ODE0NDYxNjE1ODUxODYzIj4i5YWB6Kix5oeJ55So56iL5byP5Y+v6Zqo5pmC6K6K5pu06J6i5bmV5peL6L2J5pa55ZCR44CC5LiA6Iis5oeJ55So5LiN5oeJ5L2/55So6YCZ6aCF5Yqf6IO944CCIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iNDI1NTQ2NzI1NTQ4ODY1Mzg1NCI+IuWCs+mAgSBMaW51eCDoqIromZ/liLDmh4nnlKjnqIvlvI8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIiBtc2dpZD0iMzU2NTUzMDQ2MzIxNTAxNTI4OSI+IuWFgeioseaHieeUqOeoi+W8j+imgeaxguWwh+aUr+aPtOeahOioiuiZn+WCs+mAgeWIsOaJgOacieaMgee6jOeahOeoi+W6j+OAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcGVyc2lzdGVudEFjdGl2aXR5IiBtc2dpZD0iODY1OTY1MjA0MjQwMTA4NTg2MiI+IuioreWumuaHieeUqOeoi+W8j+aMgee6jOWft+ihjCI8L3N0cmluZz4KQEAgLTgzNiw2ICs4NDAsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IuaHieeUqOeoi+W8j+W3sumHjeaWsOWwjuWQkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4i44CMPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuOAjeePvuWcqOato+WcqOWft+ihjOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4i44CMPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPuOAjeWOn+WFiOW3suWVn+WLleOAgiI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2NhbGUgKDMyMDI5NTU2Njc2NzU5NDQ0OTkpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX3Nob3cgKDQwMTM4Nzg4NzY0ODY2NTU4OTIpIC0tPgorICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQgKDI5NTM3MTY1NzQxOTgwNDY0ODQpIC0tPgorICAgIDxza2lwIC8+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfYXBwbGljYXRpb24iIG1zZ2lkPSIyOTU1ODM4MDQzNjEyMzYyODgiPiLmh4nnlKjnqIvlvI8gPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAo6JmV55CG56iL5bqPIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikg5bey6YGV5Y+N5YW26Ieq6KGM5by35Yi25a+m5pa955qE5Zq05qC85qih5byPIChTdHJpY3RNb2RlKSDmlL/nrZbjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiLomZXnkIbnqIvluo8gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IOW3sumBleWPjeWFtuiHquihjOW8t+WItuWvpuaWveeahOWatOagvOaooeW8jyAoU3RyaWN0TW9kZSkg5pS/562W44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaGVhdnlfd2VpZ2h0X25vdGlmaWNhdGlvbiIgbXNnaWQ9IjkwODcwNjM5ODU3NzY2MjYxNjYiPiI8eGxpZmY6ZyBpZD0iQVBQIj4lMSRzPC94bGlmZjpnPiDln7fooYzkuK0iPC9zdHJpbmc+CkBAIC0xMDQxLDQgKzEwNTEsNiBAQAogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV9pbnRlcm5hbCIgbXNnaWQ9Ijc1NTYwNTA4MDU0NzQxMTU2MTgiPiLlhafpg6jlhLLlrZjnqbrplpMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdG9yYWdlX3NkX2NhcmQiIG1zZ2lkPSI4OTIxNzcxNDc4NjI5ODEyMzQzIj4iU0Qg5Y2hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RvcmFnZV91c2IiIG1zZ2lkPSIzMDE3OTU0MDU5NTM4NTE3Mjc4Ij4iVVNCIOWEsuWtmOijnee9riI8L3N0cmluZz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBleHRyYWN0X2VkaXRfbWVudV9idXR0b24gKDMwMjA2MDE4OTA1NzE2MzkwNikgLS0+CisgICAgPHNraXAgLz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKaW5kZXggOWZkYTM1MC4uNmYxNDdlNyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sCkBAIC0zOTYsNiArMzk2LDEwIEBACiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl9zZXRPcmllbnRhdGlvbiAoMzM2NTk0NzcxNzE2Mzg2Njg0NCkgLS0+CiAgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldE9yaWVudGF0aW9uIiBtc2dpZD0iNjMzNTgxNDQ2MTYxNTg1MTg2MyI+Ikl2dW1lbGEgdWhsZWxvIGxva3VzZWJlbnphIHVrdXNoaW50c2hhIHVrdWppa2VsZWxlemEga3dlc2lrcmluaSBuZ2Fub21hIGlzaXBoaSBpc2lraGF0aGkuIEF5aXNvemUgeWFkaW5nZWthIGl6aW5obGVsbyB6b2t1c2ViZW56YSBleml2YW1pbGUuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2V0UG9pbnRlclNwZWVkICg5MTc1MzcxNjEzMzIyNTYyOTM0KSAtLT4KKyAgICA8c2tpcCAvPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCAoMTM3NDM2MDM4NTAzMzc5ODY0KSAtLT4KKyAgICA8c2tpcCAvPgogICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfc2lnbmFsUGVyc2lzdGVudFByb2Nlc3NlcyAoNDI1NTQ2NzI1NTQ4ODY1Mzg1NCkgLS0+CiAgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NpZ25hbFBlcnNpc3RlbnRQcm9jZXNzZXMiIG1zZ2lkPSIzNTY1NTMwNDYzMjE1MDE1Mjg5Ij4iSXZ1bWVsYSB1aGxlbG8gbG9rdXNlYmVuemEgdWt1Y2VsYSB1a3V0aGkgaXNpZ2luYWxpIGVuaWtleml3ZSBpdGh1bnllbHdlIGt1em8gem9ua2UgaXppbnF1Ym8gZXppcGhpa2VsZWxheW8iPC9zdHJpbmc+CkBAIC0xMTU0LDYgKzExNTgsMTIgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3RpdGxlIiBtc2dpZD0iODMyMzc2MTYxNjA1MjEyMTkzNiI+IlVobGVsbyBsb2t1c2ViZW56YSBsdXFvbmRpc2l3ZSBmdXRoaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX3JlcGxhY2UiIG1zZ2lkPSI2MjAyNDk4OTQ5OTcwMjgxNDEyIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBpeWFzZWJlbnphLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIiBtc2dpZD0iMTg4MTAyMDIzMDIxNjY4NjgzIj4iPHhsaWZmOmcgaWQ9IkFQUF9OQU1FIj4lMSRzPC94bGlmZjpnPiBpcWFsaXNpd2UuIjwvc3RyaW5nPgorICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSAoMzIwMjk1NTY2NzY3NTk0NDQ5OSkgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfc2hvdyAoNDAxMzg3ODg3NjQ4NjY1NTg5MikgLS0+CisgICAgPHNraXAgLz4KKyAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBzY3JlZW5fY29tcGF0X21vZGVfaGludCAoMjk1MzcxNjU3NDE5ODA0NjQ4NCkgLS0+CisgICAgPHNraXAgLz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjI5NTU4MzgwNDM2MTIzNjI4OCI+IklucXVibyA8eGxpZmY6ZyBpZD0iQVBQTElDQVRJT04iPiUxJHM8L3hsaWZmOmc+ICh5b2hsZWxvIGxva3VzZWJlbnphIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgaXBodWxlIGlucXVib21nb21vIG96aXBob3FlbGVsYSB5b25hIFllbW9kaSBFYnVraGFsaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzbXZfcHJvY2VzcyIgbXNnaWQ9IjUxMjAzOTcwMTIwNDc0NjI0NDYiPiJJbnF1Ym8gPHhsaWZmOmcgaWQ9IlBST0NFU1MiPiUxJHM8L3hsaWZmOmc+IHllcGh1bGUgaW5xdWJvbWdvbW8geW9rdXppcGhvcWVsZWxhIFllbW9kaSBFYnVraGFsaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJoZWF2eV93ZWlnaHRfbm90aWZpY2F0aW9uIiBtc2dpZD0iOTA4NzA2Mzk4NTc3NjYyNjE2NiI+Ijx4bGlmZjpnIGlkPSJBUFAiPiUxJHM8L3hsaWZmOmc+IGl5YXNlYmVuemEiPC9zdHJpbmc+CkBAIC0xNDIzLDQgKzE0MzMsNiBAQAogICAgIDxza2lwIC8+CiAgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3Igc3RvcmFnZV91c2IgKDMwMTc5NTQwNTk1Mzg1MTcyNzgpIC0tPgogICAgIDxza2lwIC8+CisgICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZXh0cmFjdF9lZGl0X21lbnVfYnV0dG9uICgzMDIwNjAxODkwNTcxNjM5MDYpIC0tPgorICAgIDxza2lwIC8+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbAppbmRleCA4MTBjM2IyLi4wZjA0YTY3IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCkBAIC0zMzMsNCArMzMzLDE5IEBACiAgICAgICAgIDxpdGVtPuS4reaWhyAo57mB6auUKTwvaXRlbT4KICAgICA8L3N0cmluZy1hcnJheT4KIAorICAgIDwhLS0gUmVzb3VyY2VzIGZvciBNdWx0aVdhdmVWaWV3IGluIExvY2tTY3JlZW4gLS0+CisgICAgPGFycmF5IG5hbWU9ImxvY2tzY3JlZW5fdGFyZ2V0c193aGVuX3NpbGVudCI+CisgICAgICAgIDxpdGVtPkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3VubG9jazwvaXRlbT4KKyAgICAgICAgPGl0ZW0+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtPkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NvdW5kb248L2l0ZW0+CisgICAgICAgIDxpdGVtPkBudWxsPC9pdGVtPgorICAgIDwvYXJyYXk+CisKKyAgICA8YXJyYXkgbmFtZT0ibG9ja3NjcmVlbl90YXJnZXRzX3doZW5fc291bmRvbiI+CisgICAgICAgIDxpdGVtPkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3VubG9jazwvaXRlbT4KKyAgICAgICAgPGl0ZW0+QG51bGw8L2l0ZW0+CisgICAgICAgIDxpdGVtPkBkcmF3YWJsZS9pY19sb2Nrc2NyZWVuX3NpbGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+QG51bGw8L2l0ZW0+IgorICAgIDwvYXJyYXk+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCBiYmJjYTM3Li45ODlhZGJkIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtMjAyLDkgKzIwMiwxNCBAQAogCiAgICAgICAgIDwhLS0gVGhlIHByZWZlcnJlZCBsaXN0IGl0ZW0gaGVpZ2h0LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgotICAgICAgICA8IS0tIFRoZSBkcmF3YWJsZSBmb3IgdGhlIGxpc3QgZGl2aWRlci4gLS0+CisgICAgICAgIDwhLS0gQSBzbWFsbGVyLCBzbGVla2VyIGxpc3QgaXRlbSBoZWlnaHQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKyAgICAgICAgPCEtLSBBIGxhcmdlciwgbW9yZSByb2J1c3QgbGlzdCBpdGVtIGhlaWdodC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0TGFyZ2UiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgogICAgICAgICA8IS0tIFRoZSBsaXN0IGl0ZW0gaGVpZ2h0IGZvciBzZWFyY2ggcmVzdWx0cy4gQGhpZGUgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InNlYXJjaFJlc3VsdExpc3RJdGVtSGVpZ2h0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tIFRoZSBkcmF3YWJsZSBmb3IgdGhlIGxpc3QgZGl2aWRlci4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Imxpc3REaXZpZGVyIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KICAgICAgICAgPCEtLSBUaGUgbGlzdCBkaXZpZGVyIHVzZWQgaW4gYWxlcnQgZGlhbG9ncy4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Imxpc3REaXZpZGVyQWxlcnREaWFsb2ciIGZvcm1hdD0icmVmZXJlbmNlIiAvPgpAQCAtMzc0LDExICszNzksMTEgQEAKICAgICAgICAgICAgICBwb2ludGVyIHdpbGwgZ28gdW50aWwgdGhhdCBwb2ludGVycyBnbyB1cCB0aGVyZWJ5IGVuYWJsaW5nIHRvdWNoZXMKICAgICAgICAgICAgICB3aXRoIG11bHRpcGxlIHBvaW50ZXJzIHRvIGJlIHNwbGl0IGFjcm9zcyBtdWx0aXBsZSB3aW5kb3dzLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0id2luZG93RW5hYmxlU3BsaXRUb3VjaCIgZm9ybWF0PSJib29sZWFuIiAvPgotICAgICAgICAKKwogICAgICAgICA8IS0tIENvbnRyb2wgd2hldGhlciBhIGNvbnRhaW5lciBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSBpdHNlbGYgaWYKICAgICAgICAgICAgICB0aGUgdXNlciB0b3VjaGVzIG91dHNpZGUgb2YgaXQuICBUaGlzIG9ubHkgYXBwbGllcyB0byBhY3Rpdml0aWVzCiAgICAgICAgICAgICAgYW5kIGRpYWxvZ3MuCi0gICAgICAgICAgICAgCisKICAgICAgICAgICAgICA8cD5Ob3RlOiB0aGlzIGF0dHJpYnV0ZSB3aWxsIG9ubHkgYmUgcmVzcGVjdGVkIGZvciBhcHBsaWNhdGlvbnMKICAgICAgICAgICAgICB0aGF0IGFyZSB0YXJnZXRpbmcge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJ9CiAgICAgICAgICAgICAgb3IgbGF0ZXIuIC0tPgpAQCAtNTQ4LDcgKzU1Myw3IEBACiAgICAgICAgIDwhLS0gTnVtYmVyUGlja2VyIGlucHV0IHRleHQgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJudW1iZXJQaWNrZXJJbnB1dFRleHRTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKLSAgICAgICAgPCEtLSBUaGUgQ2FsbmRhclZpZXcgc3R5bGUuIC0tPgorICAgICAgICA8IS0tIFRoZSBDYWxlbmRhclZpZXcgc3R5bGUuIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJjYWxlbmRhclZpZXdTdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAKICAgICAgICAgPCEtLSBUaGUgVGltZVBpY2tlciBzdHlsZS4gLS0+CkBAIC02MTksNiArNjI0LDggQEAKICAgICAgICAgPGF0dHIgbmFtZT0iYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciB0aGUgUGFzdGUgYWN0aW9uIGJ1dHRvbiBpbiBDb250ZXh0dWFsIEFjdGlvbiBCYXIgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImFjdGlvbk1vZGVQYXN0ZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHRoZSBTZWxlY3QgYWxsIGFjdGlvbiBidXR0b24gaW4gQ29udGV4dHVhbCBBY3Rpb24gQmFyIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlU2VsZWN0QWxsRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3IgdGhlIFNoYXJlIGFjdGlvbiBidXR0b24gaW4gV2ViVmlldyBzZWxlY3Rpb24gYWN0aW9uIG1vZGVzIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJhY3Rpb25Nb2RlU2hhcmVEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CiAgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciB0aGUgRmluZCBhY3Rpb24gYnV0dG9uIGluIFdlYlZpZXcgc2VsZWN0aW9uIGFjdGlvbiBtb2RlcyAtLT4KQEAgLTY1Niw2ICs2NjMsOCBAQAogICAgICAgICA8YXR0ciBuYW1lPSJwcmVmZXJlbmNlTGF5b3V0Q2hpbGQiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogICAgICAgICA8IS0tIFByZWZlcmVuY2UgcGFuZWwgc3R5bGUgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InByZWZlcmVuY2VQYW5lbFN0eWxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKyAgICAgICAgPCEtLSBEZWZhdWx0IHN0eWxlIGZvciBzd2l0Y2ggcHJlZmVyZW5jZXMuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzd2l0Y2hQcmVmZXJlbmNlU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgogCiAgICAgICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICAgICAgPCEtLSBUZXh0IHNlbGVjdGlvbiBoYW5kbGUgc3R5bGVzIC0tPgpAQCAtMTEyOSw5ICsxMTM4LDkgQEAKICAgICAgICAgICAgICBlZGdlLCBhIHJpZ2h0IGdyYXZpdHkgd2lsbCBjbGlwIHRoZSBsZWZ0IGVkZ2UsIGFuZCBuZWl0aGVyIHdpbGwgY2xpcCBib3RoIGVkZ2VzLiAtLT4KICAgICAgICAgPGZsYWcgbmFtZT0iY2xpcF9ob3Jpem9udGFsIiB2YWx1ZT0iMHgwOCIgLz4KICAgICAgICAgPCEtLSBQdXNoIG9iamVjdCB0byB0aGUgYmVnaW5uaW5nIG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImJlZm9yZSIgdmFsdWU9IjB4MDA4MDAwMDMiIC8+CisgICAgICAgIDxmbGFnIG5hbWU9InN0YXJ0IiB2YWx1ZT0iMHgwMDgwMDAwMyIgLz4KICAgICAgICAgPCEtLSBQdXNoIG9iamVjdCB0byB0aGUgZW5kIG9mIGl0cyBjb250YWluZXIsIG5vdCBjaGFuZ2luZyBpdHMgc2l6ZS4gLS0+Ci0gICAgICAgIDxmbGFnIG5hbWU9ImFmdGVyIiB2YWx1ZT0iMHgwMDgwMDAwNSIgLz4KKyAgICAgICAgPGZsYWcgbmFtZT0iZW5kIiB2YWx1ZT0iMHgwMDgwMDAwNSIgLz4KICAgICA8L2F0dHI+CiAKICAgICA8IS0tIENvbnRyb2xzIHdoZXRoZXIgbGlua3Mgc3VjaCBhcyB1cmxzIGFuZCBlbWFpbCBhZGRyZXNzZXMgYXJlCkBAIC0xMTg5LDkgKzExOTgsOSBAQAogICAgICAgICAgICAgIGVkZ2UsIGEgcmlnaHQgZ3Jhdml0eSB3aWxsIGNsaXAgdGhlIGxlZnQgZWRnZSwgYW5kIG5laXRoZXIgd2lsbCBjbGlwIGJvdGggZWRnZXMuIC0tPgogICAgICAgICA8ZmxhZyBuYW1lPSJjbGlwX2hvcml6b250YWwiIHZhbHVlPSIweDA4IiAvPgogICAgICAgICA8IS0tIFB1c2ggb2JqZWN0IHRvIHRoZSBiZWdpbm5pbmcgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0iYmVmb3JlIiB2YWx1ZT0iMHgwMDgwMDAwMyIgLz4KKyAgICAgICAgPGZsYWcgbmFtZT0ic3RhcnQiIHZhbHVlPSIweDAwODAwMDAzIiAvPgogICAgICAgICA8IS0tIFB1c2ggb2JqZWN0IHRvIHRoZSBlbmQgb2YgaXRzIGNvbnRhaW5lciwgbm90IGNoYW5naW5nIGl0cyBzaXplLiAtLT4KLSAgICAgICAgPGZsYWcgbmFtZT0iYWZ0ZXIiIHZhbHVlPSIweDAwODAwMDA1IiAvPgorICAgICAgICA8ZmxhZyBuYW1lPSJlbmQiIHZhbHVlPSIweDAwODAwMDA1IiAvPgogICAgIDwvYXR0cj4KIAogICAgIDwhLS0gU3RhbmRhcmQgb3JpZW50YXRpb24gY29uc3RhbnQuIC0tPgpAQCAtMTIwMiw2ICsxMjExLDE2IEBACiAgICAgICAgIDxlbnVtIG5hbWU9InZlcnRpY2FsIiB2YWx1ZT0iMSIgLz4KICAgICA8L2F0dHI+CiAKKyAgICA8IS0tIEFsaWdubWVudCBjb25zdGFudHMuIC0tPgorICAgIDxhdHRyIG5hbWU9ImFsaWdubWVudE1vZGUiPgorICAgICAgICA8IS0tIEFsaWduIHRoZSBib3VuZHMgb2YgdGhlIGNoaWxkcmVuLgorICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQjQUxJR05fQk9VTkRTfS4gLS0+CisgICAgICAgIDxlbnVtIG5hbWU9ImFsaWduQm91bmRzIiB2YWx1ZT0iMCIgLz4KKyAgICAgICAgPCEtLSBBbGlnbiB0aGUgbWFyZ2lucyBvZiB0aGUgY2hpbGRyZW4uCisgICAgICAgIFNlZSB7QGxpbmsgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dCNBTElHTl9NQVJHSU5TfS4gLS0+CisgICAgICAgIDxlbnVtIG5hbWU9ImFsaWduTWFyZ2lucyIgdmFsdWU9IjEiIC8+CisgICAgPC9hdHRyPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIEtleSBDb2RlcyAgICAgICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0xNjQyLDYgKzE2NjEsMTAgQEAKICAgICAgICAgPGF0dHIgbmFtZT0icGFkZGluZ1JpZ2h0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KICAgICAgICAgPCEtLSBTZXRzIHRoZSBwYWRkaW5nLCBpbiBwaXhlbHMsIG9mIHRoZSBib3R0b20gZWRnZTsgc2VlIHtAbGluayBhbmRyb2lkLlIuYXR0ciNwYWRkaW5nfS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9InBhZGRpbmdCb3R0b20iIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgICAgICA8IS0tIFNldHMgdGhlIHBhZGRpbmcsIGluIHBpeGVscywgb2YgdGhlIHN0YXJ0IGVkZ2U7IHNlZSB7QGxpbmsgYW5kcm9pZC5SLmF0dHIjcGFkZGluZ30uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwYWRkaW5nU3RhcnQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgICAgICA8IS0tIFNldHMgdGhlIHBhZGRpbmcsIGluIHBpeGVscywgb2YgdGhlIGVuZCBlZGdlOyBzZWUge0BsaW5rIGFuZHJvaWQuUi5hdHRyI3BhZGRpbmd9LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0icGFkZGluZ0VuZCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CiAKICAgICAgICAgPCEtLSBCb29sZWFuIHRoYXQgY29udHJvbHMgd2hldGhlciBhIHZpZXcgY2FuIHRha2UgZm9jdXMuICBCeSBkZWZhdWx0IHRoZSB1c2VyIGNhbiBub3QKICAgICAgICAgICAgICBtb3ZlIGZvY3VzIHRvIGEgdmlldzsgYnkgc2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byB0cnVlIHRoZSB2aWV3IGlzCkBAIC0xOTEyLDcgKzE5MzUsNyBAQAogICAgICAgICAgICAgPCEtLSBQbGFjZSB0aGUgc2Nyb2xsIGJhciBvbiB0aGUgcmlnaHQuIC0tPgogICAgICAgICAgICAgPGVudW0gbmFtZT0icmlnaHQiIHZhbHVlPSIyIiAvPgogICAgICAgICA8L2F0dHI+Ci0gICAgICAgIAorCiAgICAgICAgIDwhLS0gU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGxheWVyIGJhY2tpbmcgdGhpcyB2aWV3LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub25lLgogICAgICAgICAgICAgIFJlZmVyIHRvIHtAbGluayBhbmRyb2lkLnZpZXcuVmlldyNzZXRMYXllclR5cGUoaW50LCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50KX0KICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4tLT4KQEAgLTE5MzAsMTEgKzE5NTMsMTEgQEAKICAgICAgICAgPC9hdHRyPgogCiAgICAgICAgIDwhLS0gRGVmaW5lcyB0aGUgZGlyZWN0aW9uIG9mIGxheW91dCBkcmF3aW5nLiBUaGlzIHR5cGljYWxseSBpcyBhc3NvY2lhdGVkIHdpdGggd3JpdGluZwotICAgICAgICAgICAgIGRpcmVjdGlvbiBvZiB0aGUgbGFuZ3VhZ2Ugc2NyaXB0IHVzZWQuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIExlZnQtdG8tUmlnaHQsCi0gICAgICAgICAgICAgUmlnaHQtdG8tTGVmdCwgTG9jYWxlIGFuZCBJbmhlcml0IGZyb20gcGFyZW50IHZpZXcuIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5oZXJpdCwKLSAgICAgICAgICAgICBMb2NhbGUgaXMgdXNlZC4gTG9jYWxlIGZhbGxzYmFjayB0byAnZW4tVVMnLiBMZWZ0LXRvLVJpZ2h0IGlzIHRoZSBkaXJlY3Rpb24gdXNlZCBpbgotICAgICAgICAgICAgICdlbi1VUycuIFRoZSBkZWZhdWx0IGZvciB0aGlzIGF0dHJpYnV0ZSBpcyAnaW5oZXJpdCcuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJob3Jpem9udGFsRGlyZWN0aW9uIj4KKyAgICAgICAgICAgICBkaXJlY3Rpb24gb2YgdGhlIGxhbmd1YWdlIHNjcmlwdCB1c2VkLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSAibHRyIiBmb3IgTGVmdC10by1SaWdodCwKKyAgICAgICAgICAgICAicnRsIiBmb3IgUmlnaHQtdG8tTGVmdCwgImxvY2FsZSIgYW5kICJpbmhlcml0IiBmcm9tIHBhcmVudCB2aWV3LiBJZiB0aGVyZSBpcyBub3RoaW5nCisgICAgICAgICAgICAgdG8gaW5oZXJpdCwgImxvY2FsZSIgaXMgdXNlZC4gImxvY2FsZSIgZmFsbHMgYmFjayB0byAiZW4tVVMiLiAibHRyIiBpcyB0aGUgZGlyZWN0aW9uCisgICAgICAgICAgICAgdXNlZCBpbiAiZW4tVVMiLiBUaGUgZGVmYXVsdCBmb3IgdGhpcyBhdHRyaWJ1dGUgaXMgImluaGVyaXQiLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0RGlyZWN0aW9uIj4KICAgICAgICAgICAgIDwhLS0gTGVmdC10by1SaWdodCAtLT4KICAgICAgICAgICAgIDxlbnVtIG5hbWU9Imx0ciIgdmFsdWU9IjAiIC8+CiAgICAgICAgICAgICA8IS0tIFJpZ2h0LXRvLUxlZnQgLS0+CkBAIC0yMTQ3LDYgKzIxNzAsODIgQEAKICAgICAgICAgPGF0dHIgbmFtZT0iaW1lU3VidHlwZUV4dHJhVmFsdWUiIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiAKKyAgICA8IS0tIFVzZSA8Y29kZT5hY2Nlc3NpYmlsaXR5LXNlcnZpY2U8L2NvZGU+IGFzIHRoZSByb290IHRhZyBvZiB0aGUgWE1MIHJlc291cmNlIHRoYXQKKyAgICAgICAgIGRlc2NyaWJlcyBhbiB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZX0gc2VydmljZSwKKyAgICAgICAgIHdoaWNoIGlzIHJlZmVyZW5jZWQgZnJvbSBpdHMKKyAgICAgICAgIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlI1NFUlZJQ0VfTUVUQV9EQVRBfQorICAgICAgICAgbWV0YS1kYXRhIGVudHJ5LiAtLT4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgorICAgICAgICA8IS0tIFRoZSBldmVudCB0eXBlcyB0aGlzIHNlcml2Y2Ugd291bGQgbGlrZSB0byByZWNlaXZlIGFzIHNwZWNpZmllZCBpbgorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnR9LiBUaGlzIHNldHRpbmcKKyAgICAgICAgICAgICBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lIGJ5IGNhbGxpbmcKKyAgICAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSNzZXRTZXJ2aWNlSW5mbyhhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyl9LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iYWNjZXNzaWJpbGl0eUV2ZW50VHlwZXMiPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19DTElDS0VEfSBldmVudHMuLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlVmlld0NsaWNrZWQiIHZhbHVlPSIweDAwMDAwMDAxIiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfVklFV19MT05HX0NMSUNLRUR9IGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlVmlld0xvbmdDbGlja2VkIiB2YWx1ZT0iMHgwMDAwMDAwMiIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfU0VMRUNURUR9IGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlVmlld1NlbGVjdGVkIiB2YWx1ZT0iMHgwMDAwMDAwNCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfRk9DVVNFRH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVWaWV3Rm9jdXNlZCIgdmFsdWU9IjB4MDAwMDAwMDgiIC8+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX1RFWFRfQ0hBTkdFRH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVWaWV3VGV4dENoYW5nZWQiIHZhbHVlPSIweDAwMDAwMDEwIiAvPgorICAgICAgICAgICAgPCEtLSBSZWNlaXZlcyB7QGxpbmsgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50I1RZUEVfV0lORE9XX1NUQVRFX0NIQU5HRUR9IGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlV2luZG93U3RhdGVDaGFuZ2VkIiB2YWx1ZT0iMHgwMDAwMDAyMCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX05PVElGSUNBVElPTl9TVEFURV9DSEFOR0VEfSBldmVudHMuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idHlwZU5vdGlmaWNhdGlvblN0YXRlQ2hhbmdlZCIgdmFsdWU9IjB4MDAwMDAwNDAiIC8+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9WSUVXX0hPVkVSX0VOVEVSfSBldmVudHMuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0idHlwZVZpZXdIb3ZlckVudGVyIiB2YWx1ZT0iMHgwMDAwMDA4MCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1ZJRVdfSE9WRVJfRVhJVH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVWaWV3SG92ZXJFeGl0IiB2YWx1ZT0iMHgwMDAwMDEwMCIgLz4KKyAgICAgICAgICAgIDwhLS0gUmVjZWl2ZXMge0BsaW5rIGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudCNUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfU1RBUlR9IGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlVG91Y2hFeHBsb3JhdGlvbkdlc3R1cmVTdGFydCIgdmFsdWU9IjB4MDAwMDAyMDAiIC8+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRV9UT1VDSF9FWFBMT1JBVElPTl9HRVNUVVJFX0VORH0gZXZlbnRzLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9InR5cGVUb3VjaEV4cGxvcmF0aW9uR2VzdHVyZUVuZCIgdmFsdWU9IjB4MDAwMDA0MDAiIC8+CisgICAgICAgICAgICA8IS0tIFJlY2VpdmVzIHtAbGluayBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQjVFlQRVNfQUxMX01BU0t9IGkuZS4gYWxsIGV2ZW50cy4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJ0eXBlQWxsTWFzayIgdmFsdWU9IjB4ZmZmZmZmZmYiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBDb21tYSBzZXBhcmF0ZWQgcGFja2FnZSBuYW1lcyBmcm9tIHdoaWNoIHRoaXMgc2VyaXZjZSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgZXZlbnRzIChsZWF2ZSBvdXQgZm9yIGFsbCBwYWNrYWdlcykuCisgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgYnkgY2FsbGluZworICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlI3NldFNlcnZpY2VJbmZvKGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKX0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJwYWNrYWdlTmFtZXMiIGZvcm1hdD0ic3RyaW5nIiAvPgorICAgICAgICA8IS0tIFRoZSBmZWVkYmFjayB0eXBlcyB0aGlzIHNlcml2Y2UgcHJvdmlkZXMgYXMgc3BlY2lmaWVkIGluCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvfS4gVGhpcyBzZXR0aW5nCisgICAgICAgICAgICAgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSBieSBjYWxsaW5nCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2Ujc2V0U2VydmljZUluZm8oYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pfS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFjY2Vzc2liaWxpdHlGZWVkYmFja1R5cGUiPgorICAgICAgICAgICAgPCEtLSBQcm92aWRlcyB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jRkVFREJBQ0tfU1BPS0VOfSBmZWVkYmFjay4gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJmZWVkYmFja1Nwb2tlbiIgdmFsdWU9IjB4MDAwMDAwMDEiIC8+CisgICAgICAgICAgICA8IS0tIFByb3ZpZGVzIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNGRUVEQkFDS19IQVBUSUN9IGZlZWRiYWNrLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImZlZWRiYWNrSGFwdGljIiB2YWx1ZT0iMHgwMDAwMDAwMiIgLz4KKyAgICAgICAgICAgIDwhLS0gUHJvdmlkZXMge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX0FVRElCTEV9IGZlZWRiYWNrLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImZlZWRiYWNrQXVkaWJsZSIgdmFsdWU9IjB4MDAwMDAwMDQiIC8+CisgICAgICAgICAgICA8IS0tIFByb3ZpZGVzIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyNGRUVEQkFDS19WSVNVQUx9IGZlZWRiYWNrLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImZlZWRiYWNrVmlzdWFsIiB2YWx1ZT0iMHgwMDAwMDAwOCIgLz4KKyAgICAgICAgICAgIDwhLS0gUHJvdmlkZXMge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvI0ZFRURCQUNLX0dFTkVSSUN9IGZlZWRiYWNrLiAtLT4KKyAgICAgICAgICAgIDxmbGFnIG5hbWU9ImZlZWRiYWNrR2VuZXJpYyIgdmFsdWU9IjB4MDAwMDAwMTAiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBUaGUgbWluaW1hbCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gdHdvIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFyZSBzZW50CisgICAgICAgICAgICAgdG8gdGhpcyBzZXJpdmNlLiBUaGlzIHNldHRpbmcgY2FuIGJlIGNoYW5nZWQgYXQgcnVudGltZSBieSBjYWxsaW5nCisgICAgICAgICAgICAge0BsaW5rIGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2Ujc2V0U2VydmljZUluZm8oYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pfS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im5vdGlmaWNhdGlvblRpbWVvdXQiIGZvcm1hdD0iaW50ZWdlciIgLz4KKyAgICAgICAgPCEtLSBBZGRpdGlvbmFsIGZsYWdzIGFzIHNwZWNpZmllZCBpbgorICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mb30uCisgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUgYnkgY2FsbGluZworICAgICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlI3NldFNlcnZpY2VJbmZvKGFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKX0uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhY2Nlc3NpYmlsaXR5RmxhZ3MiPgorICAgICAgICAgICAgPCEtLSBIYXMgZmxhZyB7QGxpbmsgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZUluZm8jREVGQVVMVH0gLS0+CisgICAgICAgICAgICA8ZmxhZyBuYW1lPSJmbGFnRGVmYXVsdCIgdmFsdWU9IjB4MDAwMDAwMDEiIC8+CisgICAgICAgIDwvYXR0cj4KKyAgICAgICAgPCEtLSBDb21wb25lbnQgbmFtZSBvZiBhbiBhY3Rpdml0eSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBtb2RpZnkKKyAgICAgICAgICAgICB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgc2VydmljZS4gVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzZXR0aW5nc0FjdGl2aXR5IiAvPgorICAgICAgICA8IS0tIEZsYWcgd2hldGhlciB0aGUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHdhbnRzIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgdGhlCisgICAgICAgICAgICAgZm9jdXNlZCB3aW5kb3cgY29udGVudC4gVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIGF0IHJ1bnRpbWUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJjYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gV2lkZ2V0IHBhY2thZ2UgY2xhc3MgYXR0cmlidXRlcyAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC0yNDQ0LDEwICsyNTQzLDEwIEBACiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iR3JpZExheW91dCI+CiAgICAgICAgIDwhLS0gVGhlIG9yaWVudGF0aW9uIHByb3BlcnR5IGlzIG5vdCB1c2VkIGR1cmluZyBsYXlvdXQuIEl0IGlzIG9ubHkgdXNlZCB0bwotICAgICAgICBhbGxvY2F0ZSByb3cgYW5kIGNvbHVtbiBwcmFtZXRlcnMgd2hlbiB0aGV5IGFyZSBub3Qgc3BlY2lmaWVkIGJ5IGl0cyBjaGlsZHJlbidzCisgICAgICAgIGFsbG9jYXRlIHJvdyBhbmQgY29sdW1uIHBhcmFtZXRlcnMgd2hlbiB0aGV5IGFyZSBub3Qgc3BlY2lmaWVkIGJ5IGl0cyBjaGlsZHJlbidzCiAgICAgICAgIGxheW91dCBwYXJhbXRlcnMuIEdyaWRMYXlvdXQgd29ya3MgbGlrZSBMaW5lYXJMYXlvdXQgaW4gdGhpcyBjYXNlOwogICAgICAgICBwdXR0aW5nIGFsbCB0aGUgY29tcG9uZW50cyBlaXRoZXIgaW4gYSBzaW5nbGUgcm93IG9yIGluIGEgc2luZ2xlIGNvbHVtbiAtCi0gICAgICAgIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhpcyBmbGFnLiBJbiB0aGUgaG9yb3ppbnRhbCBjYXNlLCBhIGNvbHVtbkNvdW50CisgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhpcyBmbGFnLiBJbiB0aGUgaG9yaXpvbnRhbCBjYXNlLCBhIGNvbHVtbkNvdW50CiAgICAgICAgIHByb3BlcnR5IG1heSBiZSBhZGRpdGlvbmFsbHkgc3VwcGxpZWQgdG8gZm9yY2UgbmV3IHJvd3MgdG8gYmUgY3JlYXRlZCB3aGVuIGEKICAgICAgICAgcm93IGlzIGZ1bGwuIFRoZSByb3dDb3VudCBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgc2ltaWxhcmx5IGluIHRoZSB2ZXJ0aWNhbCBjYXNlLgogICAgICAgICBUaGUgZGVmYXVsdCBpcyBob3Jpem9udGFsLiAtLT4KQEAgLTI0NjEsNiArMjU2MCwxMiBAQAogICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0I3NldFVzZURlZmF1bHRNYXJnaW5zKGJvb2xlYW4pfS4tLT4KICAgICAgICAgPGF0dHIgbmFtZT0idXNlRGVmYXVsdE1hcmdpbnMiIGZvcm1hdD0iYm9vbGVhbiIgLz4KKyAgICAgICAgPCEtLSBXaGVuIHNldCB0byBhbGlnbk1hcmdpbnMsIGNhdXNlcyBhbGlnbm1lbnQgdG8gdGFrZSBwbGFjZSBiZXR3ZWVuIHRoZSBvdXRlcgorICAgICAgICBib3VuZGFyeSBvZiBhIHZpZXcsIGFzIGRlZmluZWQgYnkgaXRzIG1hcmdpbnMuIFdoZW4gc2V0IHRvIGFsaWduQm91bmRzLAorICAgICAgICBjYXVzZXMgYWxpZ25tZW50IHRvIHRha2UgcGxhY2UgYmV0d2VlbiB0aGUgZWRnZXMgb2YgdGhlIHZpZXcuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIGFsaWduTWFyZ2lucy4KKyAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0I3NldEFsaWdubWVudE1vZGUoaW50KX0uLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImFsaWdubWVudE1vZGUiIC8+CiAgICAgICAgIDwhLS0gV2hlbiBzZXQgdG8gdHJ1ZSwgZm9yY2VzIHJvdyBib3VuZGFyaWVzIHRvIGFwcGVhciBpbiB0aGUgc2FtZSBvcmRlcgogICAgICAgICBhcyByb3cgaW5kaWNlcy4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuCkBAIC0zMTc4LDkgKzMyODMsOSBAQAogICAgICAgICA8IS0tIFRoZSByb3cgc3BhbjogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYm90dG9tIGFuZCB0b3AKICAgICAgICAgYm91bmRhcmllcyBkZWxpbWl0aW5nIHRoZSBncm91cCBvZiBjZWxscyBvY2N1cGllZCBieSB0aGlzIHZpZXcuCiAgICAgICAgIFRoZSBkZWZhdWx0IGlzIG9uZS4KLSAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0Lkdyb3VwI3NwYW59LiAtLT4KKyAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0Lkdyb3VwfS4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImxheW91dF9yb3dTcGFuIiBmb3JtYXQ9ImludGVnZXIiIG1pbj0iMSIgLz4KLSAgICAgICAgPCEtLSBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBwcm9wb3J0aW9uIG9mIGF2YWlsaWJsZSBzcGFjZSB0aGF0CisgICAgICAgIDwhLS0gQSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgcHJvcG9ydGlvbiBvZiBhdmFpbGFibGUgc3BhY2UgdGhhdAogICAgICAgICBzaG91bGQgYmUgdGFrZW4gYnkgdGhpcyBncm91cCBvZiBjZWxscy4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgemVyby4KICAgICAgICAgU2VlIHtAbGluayBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0LkxheW91dFBhcmFtcyNjb2x1bW5XZWlnaHR9LiAtLT4KQEAgLTMxOTEsOSArMzI5Niw5IEBACiAgICAgICAgIDwhLS0gVGhlIGNvbHVtbiBzcGFuOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByaWdodCBhbmQgbGVmdAogICAgICAgICBib3VuZGFyaWVzIGRlbGltaXRpbmcgdGhlIGdyb3VwIG9mIGNlbGxzIG9jY3VwaWVkIGJ5IHRoaXMgdmlldy4KICAgICAgICAgVGhlIGRlZmF1bHQgaXMgb25lLgotICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuR3JvdXAjc3Bhbn0uIC0tPgorICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuR3JvdXB9LiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ibGF5b3V0X2NvbHVtblNwYW4iIGZvcm1hdD0iaW50ZWdlciIgbWluPSIxIiAvPgotICAgICAgICA8IS0tIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIHByb3BvcnRpb24gb2YgYXZhaWxpYmxlIHNwYWNlIHRoYXQKKyAgICAgICAgPCEtLSBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSByZWxhdGl2ZSBwcm9wb3J0aW9uIG9mIGF2YWlsYWJsZSBzcGFjZSB0aGF0CiAgICAgICAgIHNob3VsZCBiZSB0YWtlbiBieSB0aGlzIGdyb3VwIG9mIGNlbGxzLgogICAgICAgICBUaGUgZGVmYXVsdCBpcyB6ZXJvLgogICAgICAgICBTZWUge0BsaW5rIGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQuTGF5b3V0UGFyYW1zI2NvbHVtbldlaWdodH0uLS0+CkBAIC00NDA0LDYgKzQ1MDksMTAgQEAKICAgICAgICAgICAgIDwhLS0gV2hlbiB0aGlzIGl0ZW0gaXMgc2hvd24gYXMgYW4gYWN0aW9uIGluIHRoZSBhY3Rpb24gYmFyLCBzaG93IGEgdGV4dAogICAgICAgICAgICAgICAgICBsYWJlbCB3aXRoIGl0IGV2ZW4gaWYgaXQgaGFzIGFuIGljb24gcmVwcmVzZW50YXRpb24uIC0tPgogICAgICAgICAgICAgPGZsYWcgbmFtZT0id2l0aFRleHQiIHZhbHVlPSI0IiAvPgorICAgICAgICAgICAgPCEtLSBUaGlzIGl0ZW0ncyBhY3Rpb24gdmlldyBjb2xsYXBzZXMgdG8gYSBub3JtYWwgbWVudQorICAgICAgICAgICAgICAgICBpdGVtLiBXaGVuIGV4cGFuZGVkLCB0aGUgYWN0aW9uIHZpZXcgdGFrZXMgb3ZlciBhCisgICAgICAgICAgICAgICAgIGxhcmdlciBzZWdtZW50IG9mIGl0cyBjb250YWluZXIuIC0tPgorICAgICAgICAgICAgPGZsYWcgbmFtZT0iY29sbGFwc2VBY3Rpb25WaWV3IiB2YWx1ZT0iOCIgLz4KICAgICAgICAgPC9hdHRyPgogCiAgICAgICAgIDwhLS0gQW4gb3B0aW9uYWwgbGF5b3V0IHRvIGJlIHVzZWQgYXMgYW4gYWN0aW9uIHZpZXcuCkBAIC00NzI2LDcgKzQ4MzUsNyBAQAogICAgICAgICA8IS0tIFRoZSB2aWV3IGlkIG9mIHRoZSBBcHBXaWRnZXQgc3VidmlldyB3aGljaCBzaG91bGQgYmUgYXV0by1hZHZhbmNlZC4KICAgICAgICAgICAgICBieSB0aGUgd2lkZ2V0J3MgaG9zdC4gLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9ImF1dG9BZHZhbmNlVmlld0lkIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgPCEtLSBPcHRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggaW5kaWNhdGVzIGlmIGFuZCBob3cgdGhpcyB3aWRnZXQgY2FuIGJlIAorICAgICAgICA8IS0tIE9wdGlvbmFsIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgaWYgYW5kIGhvdyB0aGlzIHdpZGdldCBjYW4gYmUKICAgICAgICAgICAgICByZXNpemVkLiAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0icmVzaXplTW9kZSIgZm9ybWF0PSJpbnRlZ2VyIj4KICAgICAgICAgICAgIDxmbGFnIG5hbWU9Im5vbmUiIHZhbHVlPSIweDAiIC8+CkBAIC00OTE5LDYgKzUwMjgsNTQgQEAKICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gTXVsdGlXYXZlVmlldyBjbGFzcyBhdHRyaWJ1dGVzIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKyAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTXVsdGlXYXZlVmlldyI+CisgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGFuIGFycmF5IHJlc291cmNlIHRoYXQgYmUgc2hvd24gYXMgdGFyZ2V0cyBhcm91bmQgYSBjaXJjbGUuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0YXJnZXREcmF3YWJsZXMiIGZvcm1hdD0icmVmZXJlbmNlIi8+CisKKyAgICAgICAgPCEtLSBTZXRzIGEgZHJhd2FibGUgYXMgdGhlIGRyYWcgY2VudGVyLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaGFuZGxlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciBjaGV2cm9uIGFuaW1hdGlvbiBvbiB0aGUgbGVmdC4gTWF5IGJlIG51bGwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJsZWZ0Q2hldnJvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3IgY2hldnJvbiBhbmltYXRpb24gb24gdGhlIHJpZ2h0LiBNYXkgYmUgbnVsbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InJpZ2h0Q2hldnJvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KKworICAgICAgICA8IS0tIERyYXdhYmxlIHRvIHVzZSBmb3IgY2hldnJvbiBhbmltYXRpb24gb24gdGhlIHRvcC4gTWF5IGJlIG51bGwuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ0b3BDaGV2cm9uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgorCisgICAgICAgIDwhLS0gRHJhd2FibGUgdG8gdXNlIGZvciBjaGV2cm9uIGFuaW1hdGlvbiBvbiB0aGUgYm90dG9tLiBNYXkgYmUgbnVsbC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImJvdHRvbUNoZXZyb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBEcmF3YWJsZSB0byB1c2UgZm9yIHdhdmUgcmlwcGxlIGFuaW1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9IndhdmVEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBPdXRlciByYWRpdXMgb2YgdGFyZ2V0IGNpcmNsZS4gSWNvbnMgd2lsbCBiZSBkcmF3biBvbiB0aGlzIGNpcmNsZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Im91dGVyUmFkaXVzIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tIFNpemUgb2YgdGFyZ2V0IHJhZGl1cy4gUG9pbnRzIHdpdGhpbiB0aGlzIGRpc3RhbmNlIG9mIHRhcmdldCBjZW50ZXIgaXMgYSAiaGl0Ii4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImhpdFJhZGl1cyIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisKKyAgICAgICAgPCEtLSBUYWN0aWxlIGZlZWRiYWNrIGR1cmF0aW9uIGZvciBhY3Rpb25zLiBTZXQgdG8gJzAnIGZvciBubyB2aWJyYXRpb24uIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJ2aWJyYXRpb25EdXJhdGlvbiIgZm9ybWF0PSJpbnRlZ2VyIi8+CisKKyAgICAgICAgPCEtLSBIb3cgY2xvc2Ugd2UgbmVlZCB0byBiZSBiZWZvcmUgc25hcHBpbmcgdG8gYSB0YXJnZXQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzbmFwTWFyZ2luIiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tIE51bWJlciBvZiB3YXZlcy9jaGV2cm9ucyB0byBzaG93IGluIGFuaW1hdGlvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9ImZlZWRiYWNrQ291bnQiIGZvcm1hdD0iaW50ZWdlciIgLz4KKworICAgICAgICA8IS0tIFVzZWQgdG8gc2hpZnQgY2VudGVyIG9mIHBhdHRlcm4gdmVydGljYWxseS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InZlcnRpY2FsT2Zmc2V0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KKworICAgICAgICA8IS0tIFVzZWQgdG8gc2hpZnQgY2VudGVyIG9mIHBhdHRlcm4gaG9yaXpvbnRhbGx5LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iaG9yaXpvbnRhbE9mZnNldCIgZm9ybWF0PSJkaW1lbnNpb24iIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8IS0tIExvY2tQYXR0ZXJuVmlldyBjbGFzcyBhdHRyaWJ1dGVzIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgICA8ZWF0LWNvbW1lbnQgLz4KQEAgLTUwNTUsNyArNTIxMiw3IEBACiAgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KIAogICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJTdG9yYWdlIj4KLSAgICAgICAgPCEtLSBwYXRoIHRvIG1vdW50IHBvaW50IGZvciB0aGUgc3RvcmFnZSAtLT4gCisgICAgICAgIDwhLS0gcGF0aCB0byBtb3VudCBwb2ludCBmb3IgdGhlIHN0b3JhZ2UgLS0+CiAgICAgICAgIDxhdHRyIG5hbWU9Im1vdW50UG9pbnQiIGZvcm1hdD0ic3RyaW5nIiAvPgogICAgICAgICA8IS0tIHVzZXIgdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RvcmFnZSAtLT4KICAgICAgICAgPGF0dHIgbmFtZT0ic3RvcmFnZURlc2NyaXB0aW9uIiBmb3JtYXQ9InN0cmluZyIgLz4KQEAgLTUwNjgsNiArNTIyNSwyOCBAQAogICAgICAgICA8IS0tIG51bWJlciBvZiBtZWdhYnl0ZXMgb2Ygc3RvcmFnZSBNVFAgc2hvdWxkIHJlc2VydmUgZm9yIGZyZWUgc3RvcmFnZQogICAgICAgICAgICAgICh1c2VkIGZvciBlbXVsYXRlZCBzdG9yYWdlIHRoYXQgaXMgc2hhcmVkIHdpdGggc3lzdGVtJ3MgZGF0YSBwYXJ0aXRpb24pIC0tPgogICAgICAgICA8YXR0ciBuYW1lPSJtdHBSZXNlcnZlIiBmb3JtYXQ9ImludGVnZXIiIC8+CisgICAgICAgIDwhLS0gdHJ1ZSBpZiB0aGUgc3RvcmFnZSBjYW4gYmUgc2hhcmVkIHZpYSBVU0IgbWFzcyBzdG9yYWdlIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJhbGxvd01hc3NTdG9yYWdlIiBmb3JtYXQ9ImJvb2xlYW4iIC8+CisgICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KKworICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJTd2l0Y2hQcmVmZXJlbmNlIj4KKyAgICAgICAgPCEtLSBUaGUgc3VtbWFyeSBmb3IgdGhlIFByZWZlcmVuY2UgaW4gYSBQcmVmZXJlbmNlQWN0aXZpdHkgc2NyZWVuIHdoZW4gdGhlCisgICAgICAgICAgICAgU3dpdGNoUHJlZmVyZW5jZSBpcyBjaGVja2VkLiBJZiBzZXBhcmF0ZSBvbi9vZmYgc3VtbWFyaWVzIGFyZSBub3QKKyAgICAgICAgICAgICBuZWVkZWQsIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCBpbnN0ZWFkLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0ic3VtbWFyeU9uIiAvPgorICAgICAgICA8IS0tIFRoZSBzdW1tYXJ5IGZvciB0aGUgUHJlZmVyZW5jZSBpbiBhIFByZWZlcmVuY2VBY3Rpdml0eSBzY3JlZW4gd2hlbiB0aGUKKyAgICAgICAgICAgICBTd2l0Y2hQcmVmZXJlbmNlIGlzIHVuY2hlY2tlZC4gSWYgc2VwYXJhdGUgb24vb2ZmIHN1bW1hcmllcyBhcmUgbm90CisgICAgICAgICAgICAgbmVlZGVkLCB0aGUgc3VtbWFyeSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgaW5zdGVhZC4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN1bW1hcnlPZmYiIC8+CisgICAgICAgIDwhLS0gVGhlIHRleHQgdXNlZCBvbiB0aGUgc3dpdGNoIGl0c2VsZiB3aGVuIGluIHRoZSAib24iIHN0YXRlLgorICAgICAgICAgICAgIFRoaXMgc2hvdWxkIGJlIGEgdmVyeSBTSE9SVCBzdHJpbmcsIGFzIGl0IGFwcGVhcnMgaW4gYSBzbWFsbCBzcGFjZS4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9InN3aXRjaFRleHRPbiIgZm9ybWF0PSJzdHJpbmciIC8+CisgICAgICAgIDwhLS0gVGhlIHRleHQgdXNlZCBvbiB0aGUgc3dpdGNoIGl0c2VsZiB3aGVuIGluIHRoZSAib2ZmIiBzdGF0ZS4KKyAgICAgICAgICAgICBUaGlzIHNob3VsZCBiZSBhIHZlcnkgU0hPUlQgc3RyaW5nLCBhcyBpdCBhcHBlYXJzIGluIGEgc21hbGwgc3BhY2UuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJzd2l0Y2hUZXh0T2ZmIiBmb3JtYXQ9InN0cmluZyIgLz4KKyAgICAgICAgPCEtLSBUaGUgc3RhdGUgKHRydWUgZm9yIG9uLCBvciBmYWxzZSBmb3Igb2ZmKSB0aGF0IGNhdXNlcyBkZXBlbmRlbnRzIHRvIGJlIGRpc2FibGVkLiBCeSBkZWZhdWx0LAorICAgICAgICAgICAgIGRlcGVuZGVudHMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIHRoaXMgaXMgdW5jaGVja2VkLCBzbyB0aGUgdmFsdWUgb2YgdGhpcyBwcmVmZXJlbmNlIGlzIGZhbHNlLiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iZGlzYWJsZURlcGVuZGVudHNTdGF0ZSIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgogCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnNfbWFuaWZlc3QueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKaW5kZXggNmI3YzJhNi4uZjc5NzRlOSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRyc19tYW5pZmVzdC54bWwKQEAgLTEwMTksNiArMTAxOSw0MSBAQAogICAgICAgICAgPHA+VGhpcyBhcHBlYXJzIGFzIGEgY2hpbGQgdGFnIG9mIHRoZQogICAgICAgICAge0BsaW5rICNBbmRyb2lkTWFuaWZlc3QgbWFuaWZlc3R9IHRhZy4gLS0+CiAgICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9IkFuZHJvaWRNYW5pZmVzdFN1cHBvcnRzU2NyZWVucyIgcGFyZW50PSJBbmRyb2lkTWFuaWZlc3QiPgorICAgICAgICA8IS0tIFN0YXJ0aW5nIHdpdGgge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJfTVIyfSwKKyAgICAgICAgICAgICB0aGlzIGlzIHRoZSBuZXcgd2F5IHRvIHNwZWNpZnkgdGhlIHNjcmVlbnMgYW4gYXBwbGljYXRpb24gaXMKKyAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGguICBUaGlzIGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgcmVxdWlyZWQgbWluaW11bQorICAgICAgICAgICAgICJzbWFsbGVzdCBzY3JlZW4gd2lkdGgiIChhcyBwZXIgdGhlIC1zd05OTmRwIHJlc291cmNlIGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIHJ1biBvbi4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgcGhvbmUKKyAgICAgICAgICAgICBzY3JlZW4gaXMgMzIwLCBhIDciIHRhYmxldCA2MDAsIGFuZCBhIDEwIiB0YWJsZXQgNzIwLiAgSWYgdGhlCisgICAgICAgICAgICAgc21hbGxlc3Qgc2NyZWVuIHdpZHRoIG9mIHRoZSBkZXZpY2UgaXMgYmVsb3cgdGhlIHZhbHVlIHN1cHBsaWVkIGhlcmUsCisgICAgICAgICAgICAgdGhlbiB0aGUgYXBwbGljYXRpb24gaXMgY29uc2lkZXJlZCBpbmNvbXBhdGlibGUgd2l0aCB0aGF0IGRldmljZS4KKyAgICAgICAgICAgICBJZiBub3Qgc3VwcGxpZWQsIHRoZW4gYW55IG9sZCBzbWFsbFNjcmVlbnMsIG5vcm1hbFNjcmVlbnMsIGxhcmdlU2NyZWVucywKKyAgICAgICAgICAgICBvciB4bGFyZ2VTY3JlZW5zIGF0dHJpYnV0ZXMgd2lsbCBiZSB1c2VkIGluc3RlYWQuIC0tPgorICAgICAgICA8YXR0ciBuYW1lPSJyZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIFN0YXJ0aW5nIHdpdGgge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJfTVIyfSwKKyAgICAgICAgICAgICB0aGlzIGlzIHRoZSBuZXcgd2F5IHRvIHNwZWNpZnkgdGhlIHNjcmVlbnMgYW4gYXBwbGljYXRpb24gaXMKKyAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGguICBUaGlzIGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgbWF4aW11bQorICAgICAgICAgICAgICJzbWFsbGVzdCBzY3JlZW4gd2lkdGgiIChhcyBwZXIgdGhlIC1zd05OTmRwIHJlc291cmNlIGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgZGVzaWduZWQgZm9yLiAgSWYgdGhpcyB2YWx1ZSBpcyBzbWFsbGVyIHRoYW4KKyAgICAgICAgICAgICB0aGUgInNtYWxsZXN0IHNjcmVlbiB3aWR0aCIgb2YgdGhlIGRldmljZSBpdCBpcyBydW5uaW5nIG9uLCB0aGUgdXNlcgorICAgICAgICAgICAgIHdpbGwgb2Ygb2ZmZXJlZCB0byBydW4gaXQgaW4gYSBjb21wYXRpYmlsaXR5IG1vZGUgdGhhdCBlbXVsYXRlcyBhCisgICAgICAgICAgICAgc21hbGxlciBzY3JlZW4uICBDdXJyZW50bHkgdGhlIGNvbXBhdGliaWxpdHkgbW9kZSBvbmx5IGVtdWxhdGVzCisgICAgICAgICAgICAgcGhvbmUgc2NyZWVucywgc28gaXQgd2lsbCBub3QgYmUgdXNlZCBpdCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZXMKKyAgICAgICAgICAgICBhIHJlcXVpcmVzU21hbGxlc3RXaWR0aERwIHRoYXQgaXMgbGFyZ2VyIHRoYW4gMzIwLiAgVHlwaWNhbCB2YWx1ZXMKKyAgICAgICAgICAgICB1c2VkIHdpdGggdGhpcyBhdHRyaWJ1dGUgYXJlIDMyMCBmb3IgYSBwaG9uZSBzY3JlZW4sIDYwMCBmb3IgYQorICAgICAgICAgICAgIDciIHRhYmxldCwgYW5kIDcyMCBmb3IgYSAxMCIgdGFibGV0LiAtLT4KKyAgICAgICAgPGF0dHIgbmFtZT0iY29tcGF0aWJsZVdpZHRoTGltaXREcCIgZm9ybWF0PSJpbnRlZ2VyIiAvPgorICAgICAgICA8IS0tIFN0YXJ0aW5nIHdpdGgge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNIT05FWUNPTUJfTVIyfSwKKyAgICAgICAgICAgICB0aGlzIGlzIHRoZSBuZXcgd2F5IHRvIHNwZWNpZnkgdGhlIHNjcmVlbnMgYW4gYXBwbGljYXRpb24gaXMKKyAgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGguICBUaGlzIGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgbWF4aW11bQorICAgICAgICAgICAgICJzbWFsbGVzdCBzY3JlZW4gd2lkdGgiIChhcyBwZXIgdGhlIC1zd05OTmRwIHJlc291cmNlIGNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgdGhhdCB0aGUgYXBwbGljYXRpb24gY2FuIHdvcmsgd2VsbCBvbi4gIElmIHRoaXMgdmFsdWUgaXMgc21hbGxlciB0aGFuCisgICAgICAgICAgICAgdGhlICJzbWFsbGVzdCBzY3JlZW4gd2lkdGgiIG9mIHRoZSBkZXZpY2UgaXQgaXMgcnVubmluZyBvbiwgdGhlCisgICAgICAgICAgICAgYXBwbGljYXRpb24gd2lsbCBiZSBmb3JjZWQgaW4gdG8gc2NyZWVuIGNvbXBhdGliaWxpdHkgbW9kZSB3aXRoCisgICAgICAgICAgICAgbm8gd2F5IGZvciB0aGUgdXNlciB0byB0dXJuIGl0IG9mZi4gIEN1cnJlbnRseSB0aGUgY29tcGF0aWJpbGl0eSBtb2RlCisgICAgICAgICAgICAgb25seSBlbXVsYXRlcyBwaG9uZSBzY3JlZW5zLCBzbyBldmVuIGlmIHRoaXMgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gMzIwCisgICAgICAgICAgICAgdGhlIHdpZHRoIHRoZSBhcHAgcnVucyBpbiB3aWxsIGJlIGEgMzIwIHBob25lIGRpbWVuc2lvbi4gLS0+CisgICAgICAgIDxhdHRyIG5hbWU9Imxhcmdlc3RXaWR0aExpbWl0RHAiIGZvcm1hdD0iaW50ZWdlciIgLz4KICAgICAgICAgPCEtLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYXBwbGljYXRpb24gc3VwcG9ydHMgc21hbGxlciBzY3JlZW4gZm9ybS1mYWN0b3JzLgogICAgICAgICAgICAgIEEgc21hbGwgc2NyZWVuIGlzIGRlZmluZWQgYXMgb25lIHdpdGggYSBzbWFsbGVyIGFzcGVjdCByYXRpbyB0aGFuCiAgICAgICAgICAgICAgdGhlIHRyYWRpdGlvbmFsIEhWR0Egc2NyZWVuOyB0aGF0IGlzLCBmb3IgYSBwb3J0cmFpdCBzY3JlZW4sIGxlc3MKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAppbmRleCA2NTI5ZmUxLi5lNzZjMGU1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCkBAIC0xNDgsNSArMTQ4LDE0IEBACiAKICAgICA8Y29sb3IgbmFtZT0iZ3JvdXBfYnV0dG9uX2RpYWxvZ19wcmVzc2VkX2hvbG9fbGlnaHQiPiNmZmZmZmZmZjwvY29sb3I+CiAgICAgPGNvbG9yIG5hbWU9Imdyb3VwX2J1dHRvbl9kaWFsb2dfZm9jdXNlZF9ob2xvX2xpZ2h0Ij4jNDY5OWNjMDA8L2NvbG9yPgorCisgICAgPCEtLSBHZW5lcmFsIHB1cnBvc2UgY29sb3JzIGZvciBIb2xvLXRoZW1lZCBlbGVtZW50cyAtLT4KKyAgICA8ZWF0LWNvbW1lbnQgLz4KKworICAgIDwhLS0gQSBIb2xvIHNoYWRlIG9mIGJsdWUgLS0+CisgICAgPGNvbG9yIG5hbWU9ImhvbG9fYmx1ZSI+I2ZmNjY5OWZmPC9jb2xvcj4KKyAgICA8IS0tIEEgSG9sbyBzaGFkZSBvZiBncmVlbiAtLT4KKyAgICA8Y29sb3IgbmFtZT0iaG9sb19ncmVlbiI+I2ZmOTljYzAwPC9jb2xvcj4KKwogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAppbmRleCBhZjA4ZDQ1Li41MmIwMGM2IDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9jb25maWcueG1sCkBAIC0yMCw4ICsyMCw2IEBACiA8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKICAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgogPHJlc291cmNlcyB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNhbkhpZGUiPnRydWU8L2Jvb2w+Ci0KICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuIERlZmluZXMgdGhlIHNsb3RzIGZvciB0aGUgcmlnaHQtaGFuZCBzaWRlIGljb25zLiAgVGhhdCBpcyB0byBzYXksIHRoZQogICAgICAgICAgaWNvbnMgaW4gdGhlIHN0YXR1cyBiYXIgdGhhdCBhcmUgbm90IG5vdGlmaWNhdGlvbnMuIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iY29uZmlnX3N0YXR1c0Jhckljb25zIj4KQEAgLTg0LDcgKzgyLDcgQEAKICAgICA8IS0tIFRoZSBtYXhpbXVtIHdpZHRoIHdlIHdvdWxkIHByZWZlciBkaWFsb2dzIHRvIGJlLiAgMCBpZiB0aGVyZSBpcyBubwogICAgICAgICAgbWF4aW11bSAobGV0IHRoZW0gZ3JvdyBhcyBsYXJnZSBhcyB0aGUgc2NyZWVuKS4gIEFjdHVhbCB2YWx1ZXMgYXJlCiAgICAgICAgICBzcGVjaWZpZWQgZm9yIC1sYXJnZSBhbmQgLXhsYXJnZSBjb25maWd1cmF0aW9ucy4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9ImNvbmZpZ19wcmVmRGlhbG9nV2lkdGgiPjBweDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9ImNvbmZpZ19wcmVmRGlhbG9nV2lkdGgiPjMyMGRwPC9kaW1lbj4KICAgICAKICAgICA8IS0tIFdoZXRoZXIgZGlhbG9ncyBzaG91bGQgY2xvc2UgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1c2VyIHRvdWNoZXMgb3V0c2lkZQogICAgICAgICAgb2YgdGhlbS4gIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBiZSBtb2RpZmllZC4gLS0+CkBAIC0xNTgsOSArMTU2LDEzIEBACiAKICAgICA8IS0tIFJlZ2V4IGFycmF5IG9mIGFsbG93YWJsZSB1cHN0cmVhbSBpZmFjZXMgZm9yIHRldGhlcmluZyAtIGZvciBleGFtcGxlIGlmIHlvdSB3YW50CiAgICAgICAgICB0ZXRoZXJpbmcgb24gYSBuZXcgaW50ZXJmYWNlIGNhbGxlZCAiZm9vMiIgYWRkIDxpdGVtPiJmb29cXGQiPC9pdGVtPiB0byB0aGUgYXJyYXkgLS0+CisgICAgPCEtLSBJbnRlcmZhY2VzIHdpbGwgYmUgcHJpb3JpdGl6ZWQgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBsaXN0ZWQgLS0+CiAgICAgPHN0cmluZy1hcnJheSB0cmFuc2xhdGFibGU9ImZhbHNlIiBuYW1lPSJjb25maWdfdGV0aGVyX3Vwc3RyZWFtX3JlZ2V4cyI+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKKyAgICA8IS0tIFJlZ2V4IG9mIHdpcmVkIGV0aGVybmV0IGlmYWNlcyAtLT4KKyAgICA8c3RyaW5nIHRyYW5zbGF0YWJsZT0iZmFsc2UiIG5hbWU9ImNvbmZpZ19ldGhlcm5ldF9pZmFjZV9yZWdleCI+ZXRoXFxkPC9zdHJpbmc+CisKICAgICA8IS0tIEJvb2xlYW4gaW5kaWNhdGluZyBpZiB3ZSByZXF1aXJlIHRoZSB1c2Ugb2YgRFVOIG9uIG1vYmlsZSBmb3IgdGV0aGVyaW5nLgogICAgICAgICAgTm90ZSB0aGF0IHRoaXMgZGVmYXVsdHMgdG8gZmFsc2Ugc28gdGhhdCBpZiB5b3UgbW92ZSB0byBhIGNhcnJpZXIgdGhhdAogICAgICAgICAgaGFzbid0IGNvbmZpZ3VyZWQgYW55dGhpbmcgdGV0aGVyaW5nIHdpbGwgc3RpbGwgd29yay4gIElmIHlvdSdkIHJhdGhlcgpAQCAtMzgwLDEyICszODIsMTggQEAKICAgICA8IS0tIERpYWJsZSBsb2Nrc2NyZWVuIHJvdGF0aW9uIGJ5IGRlZmF1bHQgLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZUxvY2tTY3JlZW5Sb3RhdGlvbiI+ZmFsc2U8L2Jvb2w+CiAKKyAgICA8IS0tIERpYWJsZSBwdWsgdW5sb2Nrc2NyZWVuIGJ5IGRlZmF1bHQuCisgICAgICAgICBJZiB1bmxvY2sgc2NyZWVuIGlzIGRpc2FibGVkLCB0aGUgcHVrIHNob3VsZCBiZSB1bmxvY2tlZCB0aHJvdWdoIEVtZXJnZW5jeSBEaWFsZXIgLS0+CisgICAgPGJvb2wgbmFtZT0iY29uZmlnX2VuYWJsZV9wdWtfdW5sb2NrX3NjcmVlbiI+ZmFsc2U8L2Jvb2w+CisKICAgICA8IS0tIENvbnRyb2wgdGhlIGJlaGF2aW9yIHdoZW4gdGhlIHVzZXIgbG9uZyBwcmVzc2VzIHRoZSBwb3dlciBidXR0b24uCiAgICAgICAgICAgICAwIC0gTm90aGluZwogICAgICAgICAgICAgMSAtIFJlY2VudCBhcHBzIGRpYWxvZwotICAgICAgICAgICAgMiAtIFJlY2VudCBhcHBzIGFjdGl2aXR5IGluIFN5c3RlbVVJCisgICAgICAgICAgICAyIC0gUmVjZW50IGFwcHMgdmlldyBpbiBTeXN0ZW1VSQorICAgICAgICAgVGhpcyBuZWVkcyB0byBtYXRjaCB0aGUgY29uc3RhbnRzIGluCisgICAgICAgICBwb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCiAgICAgLS0+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX2xvbmdQcmVzc09uSG9tZUJlaGF2aW9yIj4xPC9pbnRlZ2VyPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19sb25nUHJlc3NPbkhvbWVCZWhhdmlvciI+MjwvaW50ZWdlcj4KIAogICAgIDwhLS0gQXJyYXkgb2YgbGlnaHQgc2Vuc29yIExVWCB2YWx1ZXMgdG8gZGVmaW5lIG91ciBsZXZlbHMgZm9yIGF1dG8gYmFja2xpZ2h0IGJyaWdodG5lc3Mgc3VwcG9ydC4KICAgICAgICAgIFRoZSBOIGVudHJpZXMgb2YgdGhpcyBhcnJheSBkZWZpbmUgTiArIDEgem9uZXMgYXMgZm9sbG93czoKQEAgLTYyNCw0ICs2MzIsMjYgQEAKICAgICAgICAgIEV4YW1wbGUgMjogZGV2aWNlcyBzb2xkIGluIEluZGlhIHNob3VsZCBpbmNsdWRlIHRhYmxlcyA0IHRocm91Z2ggMTMKICAgICAgICAgIHRvIGVuYWJsZSB1c2Ugb2YgdGhlIG5ldyBSZWxlYXNlIDkgdGFibGVzIGZvciBJbmRpYyBsYW5ndWFnZXMuIC0tPgogICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9ImNvbmZpZ19zbXNfZW5hYmxlZF9sb2NraW5nX3NoaWZ0X3RhYmxlcyI+PC9pbnRlZ2VyLWFycmF5PgorCisgICAgPCEtLSBTZXQgdG8gdHJ1ZSBpZiB0aGUgUlNTSSBzaG91bGQgYWx3YXlzIGRpc3BsYXkgQ0RNQSBzaWduYWwgc3RyZW5ndGggZXZlbiBvbiBFVkRPIC0tPgorICAgIDxib29sIG5hbWU9ImNvbmZpZ19hbHdheXNVc2VDZG1hUnNzaSI+ZmFsc2U8L2Jvb2w+CisKKworICAgIDwhLS0gSWYgdGhpcyB2YWx1ZSBpcyB0cnVlLCBkdXBsaWNhdGUgU291cmNlL0Rlc3RpbmF0aW9uIHBvcnQgZmllbGRzCisgICAgICAgICBpbiBXRFAgaGVhZGVyIG9mIHNvbWUgY2FycmllcnMgT01BRE0gd2FwIHB1c2ggYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgIGV4OiBNU0dUWVBFLVRvdGFsU2VnbWVudHMtQ3VycmVudFNlZ21lbnQKKyAgICAgICAgICAgICAtU291cmNlUG9ydERlc3RQb3J0LVNvdXJjZVBvcnREZXN0UG9ydC1PTUFETSBQRFUKKyAgICAgICAgIElmIGZhbHNlLCBub3Qgc3VwcG9ydGVkLiAtLT4KKyAgICA8Ym9vbCBuYW1lPSJjb25maWdfZHVwbGljYXRlX3BvcnRfb21hZG1fd2FwcHVzaCI+ZmFsc2U8L2Jvb2w+CisKKyAgICA8IS0tIE1heGltdW0gbnVtZXJpY2FsIHZhbHVlIHRoYXQgd2lsbCBiZSBzaG93biBpbiBhIHN0YXR1cyBiYXIKKyAgICAgICAgIG5vdGlmaWNhdGlvbiBpY29uIG9yIGluIHRoZSBub3RpZmljYXRpb24gaXRzZWxmLiBXaWxsIGJlIHJlcGxhY2VkCisgICAgICAgICB3aXRoIEBzdHJpbmcvc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25faW5mb19vdmVyZmxvdyB3aGVuIHNob3duIGluIHRoZQorICAgICAgICAgVUkuIC0tPgorICAgIDxpbnRlZ2VyIG5hbWU9InN0YXR1c19iYXJfbm90aWZpY2F0aW9uX2luZm9fbWF4bnVtIj45OTk8L2ludGVnZXI+CisKKyAgICA8IS0tIFBhdGggdG8gYW4gSVNPIGltYWdlIHRvIGJlIHNoYXJlZCB3aXRoIHZpYSBVU0IgbWFzcyBzdG9yYWdlLgorICAgICAgICAgVGhpcyBpcyBpbnRlbmRlZCB0byBhbGxvdyBwYWNrYWdpbmcgZHJpdmVycyBvciB0b29scyBmb3IgaW5zdGFsbGF0aW9uIG9uIGEgUEMuIC0tPgorICAgIDxzdHJpbmcgdHJhbnNsYXRhYmxlPSJmYWxzZSIgbmFtZT0iY29uZmlnX2lzb0ltYWdlUGF0aCI+PC9zdHJpbmc+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmluZGV4IGY1ZGUxZDIuLjIwY2I4NTIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2RpbWVucy54bWwKQEAgLTMyLDEwICszMiwxNCBAQAogICAgIDxkaW1lbiBuYW1lPSJ0b2FzdF95X29mZnNldCI+NjRkaXA8L2RpbWVuPgogICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2hlaWdodCI+MjVkaXA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzdGF0dXMgYmFyIC0tPgorICAgIDwhLS0gSGVpZ2h0IG9mIHRoZSBzeXN0ZW0gYmFyIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzeXN0ZW1fYmFyX2hlaWdodCI+NDhkaXA8L2RpbWVuPgorICAgIDwhLS0gSGVpZ2h0IG9mIG5vdGlmaWNhdGlvbiBpY29ucyBpbiB0aGUgc3RhdHVzIGJhciAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3NpemUiPjI1ZGlwPC9kaW1lbj4KICAgICA8IS0tIFNpemUgb2YgdGhlIGdpYW50IG51bWJlciAodW5yZWFkIGNvdW50KSBpbiB0aGUgbm90aWZpY2F0aW9ucyAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9jb250ZW50X251bWJlcl9zaXplIj40OHNwPC9kaW1lbj4KKyAgICA8IS0tIEhlaWdodCBvZiBub3RpZmljYXRpb24gaWNvbnMgaW4gdGhlIHN5c3RlbSBiYXIgLS0+CisgICAgPGRpbWVuIG5hbWU9InN5c3RlbV9iYXJfaWNvbl9zaXplIj4zMmRpcDwvZGltZW4+CiAgICAgPCEtLSBNYXJnaW4gYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiB0byBpZ25vcmUgdG91Y2ggZXZlbnRzIGZvciBpbiB0aGUgd2luZG93c2hhZGUuIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2VkZ2VfaWdub3JlIj41ZHA8L2RpbWVuPgogICAgIDwhLS0gU2l6ZSBvZiB0aGUgZmFzdHNjcm9sbCBoaW50IGxldHRlciAtLT4KQEAgLTUzLDYgKzU3LDE1IEBACiAgICAgPCEtLSBEZWZhdWx0IGNvcnJlY3Rpb24gZm9yIHRoZSBzcGFjZSBrZXkgaW4gdGhlIHBhc3N3b3JkIGtleWJvYXJkIC0tPgogICAgIDxkaW1lbiBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9zcGFjZWJhcl92ZXJ0aWNhbF9jb3JyZWN0aW9uIj40ZGlwPC9kaW1lbj4KIAorICAgIDwhLS0gRGVmYXVsdCB0YXJnZXQgcGxhY2VtZW50IHJhZGl1cyBmb3IgTXVsdGlXYXZlVmlldyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ibXVsdGl3YXZldmlld190YXJnZXRfcGxhY2VtZW50X3JhZGl1cyI+MTM1ZGlwPC9kaW1lbj4KKworICAgIDwhLS0gRGVmYXVsdCBkaXN0YW5jZSBiZXlvbmQgd2hpY2ggTXVsdGlXYXZlVmlldyBzbmFwcyB0byB0aGUgdGFyZ2V0IHJhZGl1cyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ibXVsdGl3YXZldmlld19zbmFwX21hcmdpbiI+MjBkaXA8L2RpbWVuPgorCisgICAgPCEtLSBEZWZhdWx0IGRpc3RhbmNlIGZyb20gZWFjaCBzbmFwIHRhcmdldCB0aGF0IE11bHRpV2F2ZVZpZXcgY29uc2lkZXJzIGEgImhpdCIgLS0+CisgICAgPGRpbWVuIG5hbWU9Im11bHRpd2F2ZXZpZXdfaGl0X3JhZGl1cyI+NjBkaXA8L2RpbWVuPgorCiAgICAgPCEtLSBQcmVmZXJlbmNlIGFjdGl2aXR5IHNpZGUgbWFyZ2lucyAtLT4KICAgICA8ZGltZW4gbmFtZT0icHJlZmVyZW5jZV9zY3JlZW5fc2lkZV9tYXJnaW4iPjBkcDwvZGltZW4+CiAgICAgPCEtLSBQcmVmZXJlbmNlIGFjdGl2aXR5IHNpZGUgbWFyZ2lucyBuZWdhdGl2ZS0tPgpAQCAtOTgsNyArMTExLDcgQEAKICAgICA8ZGltZW4gbmFtZT0ic2VhcmNoX3ZpZXdfdGV4dF9taW5fd2lkdGgiPjE2MGRpcDwvZGltZW4+CiAKICAgICA8IS0tIERpYWxvZyB0aXRsZSBoZWlnaHQgLS0+Ci0gICAgPGRpbWVuIG5hbWU9ImFsZXJ0X2RpYWxvZ190aXRsZV9oZWlnaHQiPjQ4ZGlwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0iYWxlcnRfZGlhbG9nX3RpdGxlX2hlaWdodCI+NjRkaXA8L2RpbWVuPgogICAgIDwhLS0gRGlhbG9nIGJ1dHRvbiBiYXIgaGVpZ2h0IC0tPgogICAgIDxkaW1lbiBuYW1lPSJhbGVydF9kaWFsb2dfYnV0dG9uX2Jhcl9oZWlnaHQiPjQ4ZGlwPC9kaW1lbj4KIApAQCAtMTA2LDQgKzExOSwxNCBAQAogICAgIDxkaW1lbiBuYW1lPSJhY3Rpb25fYmFyX2RlZmF1bHRfaGVpZ2h0Ij40OGRpcDwvZGltZW4+CiAgICAgPCEtLSBWZXJ0aWNhbCBwYWRkaW5nIGFyb3VuZCBhY3Rpb24gYmFyIGljb25zLiAtLT4KICAgICA8ZGltZW4gbmFtZT0iYWN0aW9uX2Jhcl9pY29uX3ZlcnRpY2FsX3BhZGRpbmciPjRkaXA8L2RpbWVuPgorCisgICAgPCEtLSBTaXplIG9mIGNsb2NrIGZvbnQgaW4gTG9ja1NjcmVlbi4gLS0+CisgICAgPGRpbWVuIG5hbWU9ImtleWd1YXJkX3BhdHRlcm5fdW5sb2NrX2Nsb2NrX2ZvbnRfc2l6ZSI+ODBzcDwvZGltZW4+CisKKyAgICA8IS0tIFNpemUgb2Ygc3RhdHVzIGxpbmUgZm9udCBpbiBMb2NrU2NyZWVuLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ia2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfc3RhdHVzX2xpbmVfZm9udF9zaXplIj4xNHNwPC9kaW1lbj4KKworICAgIDwhLS0gU2l6ZSBvZiByaWdodCBtYXJnaW4gaW4gTG9ja1NjcmVlbiAtLT4KKyAgICA8ZGltZW4gbmFtZT0ia2V5Z3VhcmRfcGF0dGVybl91bmxvY2tfc3RhdHVzX2xpbmVfZm9udF9yaWdodF9tYXJnaW4iPjIwZGlwPC9kaW1lbj4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3B1YmxpYy54bWwKaW5kZXggNWY3MmRhNS4uNTgwYzIwNCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9wdWJsaWMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvcHVibGljLnhtbApAQCAtMTI4Miw2ICsxMjgyLDcgQEAKICAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gMTEgb2YgdGhlIHBsYXRmb3JtIChIb25leWNvbWIgLyAzLjApLgogICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgIDxlYXQtY29tbWVudCAvPgorCiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWxsQ29udGFjdHNOYW1lIiBpZD0iMHgwMTAxMDJjYyIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ3aW5kb3dBY3Rpb25CYXIiIGlkPSIweDAxMDEwMmNkIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjdGlvbkJhclN0eWxlIiBpZD0iMHgwMTAxMDJjZSIgLz4KQEAgLTE0NDIsNiArMTQ0Myw3IEBACiAgIDxwdWJsaWMgdHlwZT0iaW50ZXJwb2xhdG9yIiBuYW1lPSJhY2NlbGVyYXRlX3F1YWQiIGlkPSIweDAxMGMwMDAwIiAvPgogICA8IS0tIEFjY2VsZXJhdGlvbiBjdXJ2ZSBtYXRjaGluZyBhIHF1YWR0cmF0aWMgZWFzZSBpbiBmdW5jdGlvbi4gLS0+CiAgIDxwdWJsaWMgdHlwZT0iaW50ZXJwb2xhdG9yIiBuYW1lPSJkZWNlbGVyYXRlX3F1YWQiIGlkPSIweDAxMGMwMDAxIiAvPgorCiAgIDwhLS0gQWNjZWxlcmF0aW9uIGN1cnZlIG1hdGNoaW5nIGEgY3ViaWMgZWFzZSBvdXQgZnVuY3Rpb24uIC0tPgogICA8cHVibGljIHR5cGU9ImludGVycG9sYXRvciIgbmFtZT0iYWNjZWxlcmF0ZV9jdWJpYyIgaWQ9IjB4MDEwYzAwMDIiIC8+CiAgIDwhLS0gQWNjZWxlcmF0aW9uIGN1cnZlIG1hdGNoaW5nIGEgY3ViaWMgZWFzZSBpbiBmdW5jdGlvbi4gLS0+CkBAIC0xNjQzLDE0ICsxNjQ1LDY0IEBACiAgIDxwdWJsaWMgdHlwZT0ibWlwbWFwIiBuYW1lPSJzeW1fZGVmX2FwcF9pY29uIiBpZD0iMHgwMTBkMDAwMCIgLz4KIAogPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gMTIgb2YgdGhlIHBsYXRmb3JtIChIb25leWNvbWIgLyAzLjEpCisgICAgIFJlc291cmNlcyBhZGRlZCBpbiB2ZXJzaW9uIDEyIG9mIHRoZSBwbGF0Zm9ybSAoSG9uZXljb21iIE1SIDEgLyAzLjEpCiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgPGVhdC1jb21tZW50IC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGV4dEN1cnNvckRyYXdhYmxlIiBpZD0iMHgwMTAxMDM2MiIgLz4KLSAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJyZXNpemVNb2RlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InJlc2l6ZU1vZGUiIGlkPSIweDAxMDEwMzYzIiAvPgogCiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiAxMyBvZiB0aGUgcGxhdGZvcm0gKEljZSBDcmVhbSBTYW5kd2ljaCkKKyAgICAgUmVzb3VyY2VzIGFkZGVkIGluIHZlcnNpb24gMTMgb2YgdGhlIHBsYXRmb3JtIChIb25leWNvbWIgTVIgMiAvIDMuMikKKyAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICA8ZWF0LWNvbW1lbnQgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJyZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCIgaWQ9IjB4MDEwMTAzNjQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iY29tcGF0aWJsZVdpZHRoTGltaXREcCIgaWQ9IjB4MDEwMTAzNjUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGFyZ2VzdFdpZHRoTGltaXREcCIgaWQ9IjB4MDEwMTAzNjYiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sby5MaWdodC5Ob0FjdGlvbkJhciIgaWQ9IjB4MDEwMzAwZjAiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRoZW1lLkhvbG8uTGlnaHQuTm9BY3Rpb25CYXIuRnVsbHNjcmVlbiIgaWQ9IjB4MDEwMzAwZjEiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhci5UYWJWaWV3IiBpZD0iMHgwMTAzMDBmMiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhci5UYWJUZXh0IiBpZD0iMHgwMTAzMDBmMyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhci5UYWJCYXIiIGlkPSIweDAxMDMwMGY0IiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuSG9sby5BY3Rpb25CYXIuVGFiVmlldyIgaWQ9IjB4MDEwMzAwZjUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJhci5UYWJUZXh0IiBpZD0iMHgwMTAzMDBmNiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyLlRhYkJhciIgaWQ9IjB4MDEwMzAwZjciIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhci5UYWJWaWV3IiBpZD0iMHgwMTAzMDBmOCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyLlRhYlRleHQiIGlkPSIweDAxMDMwMGY5IiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXIuVGFiQmFyIiBpZD0iMHgwMTAzMDBmYSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sbyIgaWQ9IjB4MDEwMzAwZmIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uSW52ZXJzZSIgaWQ9IjB4MDEwMzAwZmMiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGFyZ2UiIGlkPSIweDAxMDMwMGZkIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxhcmdlLkludmVyc2UiIGlkPSIweDAxMDMwMGZlIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLk1lZGl1bSIgaWQ9IjB4MDEwMzAwZmYiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtLkludmVyc2UiIGlkPSIweDAxMDMwMTAwIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNtYWxsIiBpZD0iMHgwMTAzMDEwMSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5TbWFsbC5JbnZlcnNlIiBpZD0iMHgwMTAzMDEwMiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5TZWFyY2hSZXN1bHQuVGl0bGUiIGlkPSIweDAxMDMwMTAzIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLlNlYXJjaFJlc3VsdC5TdWJ0aXRsZSIgaWQ9IjB4MDEwMzAxMDQiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0IiBpZD0iMHgwMTAzMDEwNSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuQnV0dG9uIiBpZD0iMHgwMTAzMDEwNiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuSWNvbk1lbnUuSXRlbSIgaWQ9IjB4MDEwMzAxMDciIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRhYldpZGdldCIgaWQ9IjB4MDEwMzAxMDgiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlRleHRWaWV3IiBpZD0iMHgwMTAzMDEwOSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuVGV4dFZpZXcuUG9wdXBNZW51IiBpZD0iMHgwMTAzMDEwYSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuRHJvcERvd25IaW50IiBpZD0iMHgwMTAzMDEwYiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuRHJvcERvd25JdGVtIiBpZD0iMHgwMTAzMDEwYyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaWRnZXQuVGV4dFZpZXcuU3Bpbm5lckl0ZW0iIGlkPSIweDAxMDMwMTBkIiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5FZGl0VGV4dCIgaWQ9IjB4MDEwMzAxMGUiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudSIgaWQ9IjB4MDEwMzAxMGYiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudS5MYXJnZSIgaWQ9IjB4MDEwMzAxMTAiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LlBvcHVwTWVudS5TbWFsbCIgaWQ9IjB4MDEwMzAxMTEiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbkJhci5UaXRsZSIgaWQ9IjB4MDEwMzAxMTIiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbkJhci5TdWJ0aXRsZSIgaWQ9IjB4MDEwMzAxMTMiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uV2lkZ2V0LkFjdGlvbk1vZGUuVGl0bGUiIGlkPSIweDAxMDMwMTE0IiAvPgorICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLldpZGdldC5BY3Rpb25Nb2RlLlN1YnRpdGxlIiBpZD0iMHgwMTAzMDExNSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5XaW5kb3dUaXRsZSIgaWQ9IjB4MDEwMzAxMTYiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uRGlhbG9nV2luZG93VGl0bGUiIGlkPSIweDAxMDMwMTE3IiAvPgorCis8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICBSZXNvdXJjZXMgYWRkZWQgaW4gdmVyc2lvbiAxNCBvZiB0aGUgcGxhdGZvcm0gKEljZSBDcmVhbSBTYW5kd2ljaCkKICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICA8ZWF0LWNvbW1lbnQgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzdGF0ZV9ob3ZlcmVkIiAvPgpAQCAtMTY1OCw3ICsxNzEwLDEwIEBACiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3RhdGVfZHJhZ19ob3ZlcmVkIiAvPgogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN0b3BXaXRoVGFzayIgLz4KIAotICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ib2xvLkxpZ2h0Lk5vQWN0aW9uQmFyIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN3aXRjaFRleHRPbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzd2l0Y2hUZXh0T2ZmIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InN3aXRjaFByZWZlcmVuY2VTdHlsZSIgLz4KKwogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdWdnZXN0aW9uSGlnaGxpZ2h0IiAvPgogICA8cHVibGljIHR5cGU9InN0eWxlIiBuYW1lPSJUaGVtZS5Ib2xvLlNwbGl0QWN0aW9uQmFyV2hlbk5hcnJvdyIgLz4KICAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iVGhlbWUuSG9sby5MaWdodC5TcGxpdEFjdGlvbkJhcldoZW5OYXJyb3ciIC8+CkBAIC0xNjY3LDcgKzE3MjIsOCBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRleHRFZGl0U3VnZ2VzdGlvbnNCb3R0b21XaW5kb3dMYXlvdXQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idGV4dEVkaXRTdWdnZXN0aW9uc1RvcFdpbmRvd0xheW91dCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ0ZXh0RWRpdFN1Z2dlc3Rpb25JdGVtTGF5b3V0IiAvPgotICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Imhvcml6b250YWxEaXJlY3Rpb24iIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsYXlvdXREaXJlY3Rpb24iIC8+CiAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJmdWxsQmFja3VwQWdlbnQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ic3VnZ2VzdGlvbnNFbmFibGVkIiAvPgpAQCAtMTY3Nyw2ICsxNzMzLDcgQEAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2x1bW5Db3VudCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJjb2x1bW5PcmRlclByZXNlcnZlZCIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ1c2VEZWZhdWx0TWFyZ2lucyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhbGlnbm1lbnRNb2RlIiAvPgogCiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGF5b3V0X3JvdyIgLz4KICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsYXlvdXRfcm93U3BhbiIgLz4KQEAgLTE2ODQsNiArMTc0MSw0MSBAQAogICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImxheW91dF9yb3dXZWlnaHQiIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGF5b3V0X2NvbHVtblNwYW4iIC8+CiAgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0ibGF5b3V0X2NvbHVtbldlaWdodCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY3Rpb25Nb2RlU2VsZWN0QWxsRHJhd2FibGUiIC8+CiAKICAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJpc0F1eGlsaWFyeSIgLz4KKworICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImFjY2Vzc2liaWxpdHlFdmVudFR5cGVzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InBhY2thZ2VOYW1lcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJhY2Nlc3NpYmlsaXR5RmVlZGJhY2tUeXBlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im5vdGlmaWNhdGlvblRpbWVvdXQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iYWNjZXNzaWJpbGl0eUZsYWdzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImNhblJldHJpZXZlV2luZG93Q29udGVudCIgLz4KKworICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRhcmdldERyYXdhYmxlcyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJoYW5kbGVEcmF3YWJsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsZWZ0Q2hldnJvbkRyYXdhYmxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InJpZ2h0Q2hldnJvbkRyYXdhYmxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9InRvcENoZXZyb25EcmF3YWJsZSIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJib3R0b21DaGV2cm9uRHJhd2FibGUiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0id2F2ZURyYXdhYmxlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Im91dGVyUmFkaXVzIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImhpdFJhZGl1cyIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJ2aWJyYXRpb25EdXJhdGlvbiIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJzbmFwTWFyZ2luIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9ImZlZWRiYWNrQ291bnQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0idmVydGljYWxPZmZzZXQiIC8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0iaG9yaXpvbnRhbE9mZnNldCIgLz4KKyAgPHB1YmxpYyB0eXBlPSJhdHRyIiBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodExhcmdlIiAvPgorICA8cHVibGljIHR5cGU9ImF0dHIiIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0U21hbGwiIC8+CisKKyAgPHB1YmxpYyB0eXBlPSJzdHlsZSIgbmFtZT0iV2lkZ2V0LkhvbG8uQnV0dG9uLkJvcmRlcmxlc3MuU21hbGwiIC8+CisgIDxwdWJsaWMgdHlwZT0ic3R5bGUiIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5Cb3JkZXJsZXNzLlNtYWxsIiAvPgorCisgIDxwdWJsaWMgdHlwZT0iaW50ZWdlciIgbmFtZT0ic3RhdHVzX2Jhcl9ub3RpZmljYXRpb25faW5mb19tYXhudW0iIC8+CisgIDxwdWJsaWMgdHlwZT0ic3RyaW5nIiBuYW1lPSJzdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9pbmZvX292ZXJmbG93IiAvPgorCisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icGFkZGluZ1N0YXJ0Ii8+CisgIDxwdWJsaWMgdHlwZT0iYXR0ciIgbmFtZT0icGFkZGluZ0VuZCIvPgorCiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDgxNjU0NmIuLmI1ZjQwODQgMTAwNzU1Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtODcsNiArODcsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibWlzbWF0Y2hQaW4iPlRoZSBQSU5zIHlvdSBlbnRlcmVkIGRvIG5vdCBtYXRjaC48L3N0cmluZz4KICAgICA8IS0tIERpc3BsYXllZCB3aGVuIGEgU0lNIFBJTiBwYXNzd29yZCBpcyB0b28gbG9uZyBvciB0b28gc2hvcnQuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iaW52YWxpZFBpbiI+VHlwZSBhIFBJTiB0aGF0IGlzIDQgdG8gOCBudW1iZXJzLjwvc3RyaW5nPgorICAgIDwhLS0gRGlzcGxheWVkIHdoZW4gYSBTSU0gUFVLIHBhc3N3b3JkIGlzIHRvbyBzaG9ydC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJpbnZhbGlkUHVrIj5UeXBlIGEgUFVLIHRoYXQgaXMgOCBudW1iZXJzIG9yIGxvbmdlci48L3N0cmluZz4KICAgICA8IS0tIERpc3BsYXllZCB0byBwcm9tcHQgdGhlIHVzZXIgdG8gdHlwZSB0aGUgUFVLIHBhc3N3b3JkIHRvIHVubG9jawogICAgICAgICAgdGhlIFNJTSBjYXJkLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9Im5lZWRQdWsiPllvdXIgU0lNIGNhcmQgaXMgUFVLLWxvY2tlZC4gVHlwZSB0aGUgUFVLIGNvZGUgdG8gdW5sb2NrIGl0Ljwvc3RyaW5nPgpAQCAtMzM3LDEwICszMzksMTIgQEAKICAgICA8IS0tIHN0YXR1cyBtZXNzYWdlIGluIHBob25lIG9wdGlvbnMgZGlhbG9nIGZvciB3aGVuIGFpcnBsYW5lIG1vZGUgaXMgb2ZmIC0tPgogICAgIDxzdHJpbmcgbmFtZT0iZ2xvYmFsX2FjdGlvbnNfYWlycGxhbmVfbW9kZV9vZmZfc3RhdHVzIj5BaXJwbGFuZSBtb2RlIGlzIE9GRjwvc3RyaW5nPgogCi0gICAgPCEtLSBUZXh0IHRvIHVzZSB3aGVuIHRoZSBudW1iZXIgaW4gYSBub3RpZmljYXRpb24gaW5mbyBpcyB0b28gbGFyZ2UgKD4gMTAwKS4gIE1vc3QgbGlrZWx5IGRvZXMgbm90IG5lZWQKLSAgICB0byBiZSB0cmFuc2xhdGVkLiAgV2UgZG8gdGhpcyBzbywgZm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIGhhcyB0ZW5zIG9mIHRob3VzYW5kcyBvZiB1bnJlYWQKLSAgICBlbWFpbHMsIHRoZSB3aG9sZSBub3RpZmljYXRpb24gaXNuJ3QgdGFrZW4gb3ZlciBieSB0aGUgbnVtYmVyLiBbQ0hBUiBMSU1JVD01XSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfbm90aWZpY2F0aW9uX2luZm9fb3ZlcmZsb3ciPjEwMCs8L3N0cmluZz4KKyAgICA8IS0tIFRleHQgdG8gdXNlIHdoZW4gdGhlIG51bWJlciBpbiBhIG5vdGlmaWNhdGlvbiBpbmZvIGlzIHRvbyBsYXJnZQorICAgICAgICAgKGdyZWF0ZXIgdGhhbiBzdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9pbmZvX21heG51bSwgZGVmaW5lZCBpbgorICAgICAgICAgdmFsdWVzL2NvbmZpZy54bWwpIGFuZCBtdXN0IGJlIHRydW5jYXRlZC4gTWF5IG5lZWQgdG8gYmUgbG9jYWxpemVkCisgICAgICAgICBmb3IgbW9zdCBhcHByb3ByaWF0ZSB0ZXh0dWFsIGluZGljYXRvciBvZiAibW9yZSB0aGFuIFgiLgorICAgICAgICAgW0NIQVIgTElNSVQ9NF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9pbmZvX292ZXJmbG93Ij45OTkrPC9zdHJpbmc+CiAKICAgICA8IS0tIERpc3BsYXllZCB0byB0aGUgdXNlciB0byB0ZWxsIHRoZW0gdGhhdCB0aGV5IGhhdmUgc3RhcnRlZCB1cCB0aGUgcGhvbmUgaW4gInNhZmUgbW9kZSIgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJzYWZlTW9kZSI+U2FmZSBtb2RlPC9zdHJpbmc+CkBAIC00NTcsNiArNDYxLDEzIEBACiAgICAgICB5b3VyIG1lc3NhZ2VzIG9yIGRlbGV0ZSB0aGVtIHdpdGhvdXQgc2hvd2luZyB0aGVtIHRvIHlvdS48L3N0cmluZz4KIAogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWNlaXZlRW1lcmdlbmN5QnJvYWRjYXN0Ij5yZWNlaXZlIGVtZXJnZW5jeSBicm9hZGNhc3RzPC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWNlaXZlRW1lcmdlbmN5QnJvYWRjYXN0Ij5BbGxvd3MgYXBwbGljYXRpb24gdG8gcmVjZWl2ZQorICAgICAgYW5kIHByb2Nlc3MgZW1lcmdlbmN5IGJyb2FkY2FzdCBtZXNzYWdlcy4gVGhpcyBwZXJtaXNzaW9uIGlzIG9ubHkgYXZhaWxhYmxlCisgICAgICB0byBzeXN0ZW0gYXBwbGljYXRpb25zLjwvc3RyaW5nPgorCisgICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZW5kU21zIj5zZW5kIFNNUyBtZXNzYWdlczwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VuZFNtcyI+QWxsb3dzIGFwcGxpY2F0aW9uIHRvIHNlbmQgU01TCkBAIC01NjIsNiArNTczLDEzIEBACiAgICAgICAgIG5ldmVyIG5vcm1hbGx5IG5lZWQuPC9zdHJpbmc+CiAKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmV0cmlldmVfd2luZG93X2NvbnRlbnQiPnJldHJpZXZlIHNjcmVlbiBjb250ZW50PC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZXRyaWV2ZV93aW5kb3dfY29udGVudCI+QWxsb3dzIGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlCisgICAgICAgIHRoZSBjb250ZW50IG9mIHRoZSBhY3RpdmUgd2luZG93LiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIG1heSByZXRyaWV2ZQorICAgICAgICB0aGUgZW50aXJlIHdpbmRvdyBjb250ZW50IGFuZCBleGFtaW5lIGFsbCBpdHMgdGV4dCBleGNlcHQgcGFzc3dvcmRzLjwvc3RyaW5nPgorCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NodXRkb3duIj5wYXJ0aWFsIHNodXRkb3duPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zaHV0ZG93biI+UHV0cyB0aGUgYWN0aXZpdHkgbWFuYWdlciBpbnRvIGEgc2h1dGRvd24KQEAgLTcxMSw2ICs3MjksMTMgQEAKICAgICAgICAgdGhlIHJvdGF0aW9uIG9mIHRoZSBzY3JlZW4gYXQgYW55IHRpbWUuIFNob3VsZCBuZXZlciBiZSBuZWVkZWQgZm9yCiAgICAgICAgIG5vcm1hbCBhcHBsaWNhdGlvbnMuPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldFBvaW50ZXJTcGVlZCI+Y2hhbmdlIHBvaW50ZXIgc3BlZWQ8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldFBvaW50ZXJTcGVlZCI+QWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGNoYW5nZQorICAgICAgICB0aGUgbW91c2Ugb3IgdHJhY2twYWQgcG9pbnRlciBzcGVlZCBhdCBhbnkgdGltZS4gU2hvdWxkIG5ldmVyIGJlIG5lZWRlZCBmb3IKKyAgICAgICAgbm9ybWFsIGFwcGxpY2F0aW9ucy48L3N0cmluZz4KKwogICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zaWduYWxQZXJzaXN0ZW50UHJvY2Vzc2VzIj5zZW5kIExpbnV4IHNpZ25hbHMgdG8gYXBwbGljYXRpb25zPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CkBAIC04NzgsNiArOTAzLDIwIEBACiAgICAgICAgIGNvbnRhY3QgKGFkZHJlc3MpIGRhdGEgc3RvcmVkIG9uIHlvdXIgcGhvbmUuIE1hbGljaW91cwogICAgICAgICBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0aGlzIHRvIGVyYXNlIG9yIG1vZGlmeSB5b3VyIGNvbnRhY3QgZGF0YS48L3N0cmluZz4KIAorICAgIDwhLS0gVGl0bGUgb2YgdGhlIHJlYWQgcHJvZmlsZSBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRQcm9maWxlIj5yZWFkIHByb2ZpbGUgZGF0YTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgdGhlIHJlYWQgcHJvZmlsZSBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byByZWFkIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRQcm9maWxlIiBwcm9kdWN0PSJkZWZhdWx0Ij5BbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gcmVhZCBhbGwKKyAgICAgICAgb2YgeW91ciBwZXJzb25hbCBwcm9maWxlIGluZm9ybWF0aW9uLiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyB0byBpZGVudGlmeQorICAgICAgICB5b3UgYW5kIHNlbmQgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byBvdGhlciBwZW9wbGUuPC9zdHJpbmc+CisKKyAgICA8IS0tIFRpdGxlIG9mIHRoZSB3cml0ZSBwcm9maWxlIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIHdyaXRlIHRvIHRoZSB1c2VyJ3MgcGVyc29uYWwgcHJvZmlsZSBkYXRhLiBbQ0hBUiBMSU1JVD0zMF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlUHJvZmlsZSI+d3JpdGUgcHJvZmlsZSBkYXRhPC9zdHJpbmc+CisgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiB0aGUgd3JpdGUgcHJvZmlsZSBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGRlY2lkZSB3aGV0aGVyIHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byB3cml0ZSB0byB0aGUgdXNlcidzIHBlcnNvbmFsIHByb2ZpbGUgZGF0YS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZVByb2ZpbGUiIHByb2R1Y3Q9ImRlZmF1bHQiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBtb2RpZnkKKyAgICAgICAgeW91ciBwZXJzb25hbCBwcm9maWxlIGluZm9ybWF0aW9uLiBNYWxpY2lvdXMgYXBwbGljYXRpb25zIGNhbiB1c2UgdGhpcyB0byBlcmFzZSBvcgorICAgICAgICBtb2RpZnkgeW91ciBwcm9maWxlIGRhdGEuPC9zdHJpbmc+CisKICAgICA8IS0tIFRpdGxlIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZENhbGVuZGFyIj5yZWFkIGNhbGVuZGFyIGV2ZW50czwvc3RyaW5nPgogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgpAQCAtMTMxNiw3ICsxMzU1LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdnBuIj5pbnRlcmNlcHQgYW5kIG1vZGlmeSBhbGwgbmV0d29yayB0cmFmZmljPC9zdHJpbmc+CiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY192cG4iPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBpbnRlcmNlcHQgYW5kCi0gICAgICBpbnNwZWN0IGFsbCBuZXR3b3JrIHRyYWZmaWMsIGZvciBleGFtcGxlIHRvIGVzdGFibGlzaCBhIFZQTiBjb25uZWN0aW9uLgorICAgICAgaW5zcGVjdCBhbGwgbmV0d29yayB0cmFmZmljIHRvIGVzdGFibGlzaCBhIFZQTiBjb25uZWN0aW9uLgogICAgICAgTWFsaWNpb3VzIGFwcGxpY2F0aW9ucyBtYXkgbW9uaXRvciwgcmVkaXJlY3QsIG9yIG1vZGlmeSBuZXR3b3JrIHBhY2tldHMKICAgICAgIHdpdGhvdXQgeW91ciBrbm93bGVkZ2UuPC9zdHJpbmc+CiAKQEAgLTEzOTQsNiArMTQzMywxNiBAQAogICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXNlX3NpcCI+QWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUgU0lQIHNlcnZpY2UgdG8gbWFrZS9yZWNlaXZlIEludGVybmV0IGNhbGxzLjwvc3RyaW5nPgogCisgICAgPCEtLSBUaXRsZSBvZiBhbiBhcHBsaWNhdGlvbiBwZXJtaXNzaW9uLCBsaXN0ZWQgc28gdGhlIHVzZXIgY2FuIGNob29zZSB3aGV0aGVyIHRoZXkgd2FudCB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gZG8gdGhpcy4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWROZXR3b3JrVXNhZ2VIaXN0b3J5Ij5yZWFkIGhpc3RvcmljYWwgbmV0d29yayB1c2FnZTwvc3RyaW5nPgorICAgIDwhLS0gRGVzY3JpcHRpb24gb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZE5ldHdvcmtVc2FnZUhpc3RvcnkiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byByZWFkIGhpc3RvcmljYWwgbmV0d29yayB1c2FnZSBmb3Igc3BlY2lmaWMgbmV0d29ya3MgYW5kIGFwcGxpY2F0aW9ucy48L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgb2YgYW4gYXBwbGljYXRpb24gcGVybWlzc2lvbiwgbGlzdGVkIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugd2hldGhlciB0aGV5IHdhbnQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGRvIHRoaXMuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tYW5hZ2VOZXR3b3JrUG9saWN5Ij5tYW5hZ2UgbmV0d29yayBwb2xpY3k8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHBlcm1pc3Npb24sIGxpc3RlZCBzbyB0aGUgdXNlciBjYW4gY2hvb3NlIHdoZXRoZXIgdGhleSB3YW50IHRvIGFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBkbyB0aGlzLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21hbmFnZU5ldHdvcmtQb2xpY3kiPkFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBtYW5hZ2UgbmV0d29yayBwb2xpY2llcyBhbmQgZGVmaW5lIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJ1bGVzLjwvc3RyaW5nPgorCiAgICAgPCEtLSBQb2xpY3kgYWRtaW5pc3RyYXRpb24gLS0+CiAKICAgICA8IS0tIFRpdGxlIG9mIHBvbGljeSBhY2Nlc3MgdG8gbGltaXRpbmcgdGhlIHVzZXIncyBwYXNzd29yZCBjaG9pY2VzIC0tPgpAQCAtMTQ0Miw2ICsxNDkxLDEwIEBACiAgICAgPCEtLSBEZXNjcmlwdGlvbiBvZiBwb2xpY3kgYWNjZXNzIHRvIHJlcXVpcmUgZW5jcnlwdGVkIHN0b3JhZ2UgW0NIQVIgTElNSVQ9MTEwXS0tPgogICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19lbmNyeXB0ZWRTdG9yYWdlIj5SZXF1aXJlIHRoYXQgc3RvcmVkIGFwcGxpY2F0aW9uIGRhdGEgYmUgZW5jcnlwdGVkCiAgICAgICAgIDwvc3RyaW5nPgorICAgIDwhLS0gVGl0bGUgb2YgcG9saWN5IGFjY2VzcyB0byBkaXNhYmxlIGFsbCBkZXZpY2UgY2FtZXJhcyBbQ0hBUiBMSU1JVD0zMF0tLT4KKyAgICA8c3RyaW5nIG5hbWU9InBvbGljeWxhYl9kaXNhYmxlQ2FtZXJhIj5EaXNhYmxlIGNhbWVyYXM8L3N0cmluZz4KKyAgICA8IS0tIERlc2NyaXB0aW9uIG9mIHBvbGljeSBhY2Nlc3MgdG8gZGlzYWJsZSBhbGwgZGV2aWNlIGNhbWVyYXMgW0NIQVIgTElNSVQ9MTEwXS0tPgorICAgIDxzdHJpbmcgbmFtZT0icG9saWN5ZGVzY19kaXNhYmxlQ2FtZXJhIj5QcmV2ZW50IHVzZSBvZiBhbGwgZGV2aWNlIGNhbWVyYXM8L3N0cmluZz4KIAogICAgIDwhLS0gVGhlIG9yZGVyIG9mIHRoZXNlIGlzIGltcG9ydGFudCwgZG9uJ3QgcmVvcmRlciB3aXRob3V0IGNoYW5naW5nIENvbnRhY3RzLmphdmEgLS0+IDxza2lwIC8+CiAgICAgPCEtLSBQaG9uZSBudW1iZXIgdHlwZXMgZnJvbSBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzLiBUaGlzIGNvdWxkIGJlIHVzZWQgd2hlbiBhZGRpbmcgYSBuZXcgcGhvbmUgbnVtYmVyIGZvciBhIGNvbnRhY3QsIGZvciBleGFtcGxlLiAtLT4KQEAgLTE2NTcsNiArMTcxMCwxNSBAQAogICAgICAgICAgRGlzcGxheWVkIGluIG9uZSBsaW5lIGluIGEgbGFyZ2UgZm9udC4gIC0tPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcGluX2NvZGUiPkVudGVyIFBJTiBjb2RlPC9zdHJpbmc+CiAKKyAgICA8IS0tIEluc3RydWN0aW9ucyB0ZWxsaW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZWlyIFNJTSBQVUsgdG8gdW5sb2NrIHRoZSBrZXlndWFyZC4KKyAgICAgICAgIERpc3BsYXllZCBpbiBvbmUgbGluZSBpbiBhIGxhcmdlIGZvbnQuICAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3B1a19jb2RlIj5FbnRlciBQVUsgYW5kIG5ldyBQSU4gY29kZTwvc3RyaW5nPgorCisgICAgPCEtLSBQcm9tcHQgdG8gZW50ZXIgU0lNIFBVSyBpbiBFZGl0IFRleHQgQm94IGluIHVubG9jayBzY3JlZW4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJrZXlndWFyZF9wYXNzd29yZF9lbnRlcl9wdWtfcHJvbXB0Ij5QVUsgY29kZTwvc3RyaW5nPgorICAgIDwhLS0gUHJvbXB0IHRvIGVudGVyIE5ldyBTSU0gUElOIGluIEVkaXQgVGV4dCBCb3ggaW4gdW5sb2NrIHNjcmVlbiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3Bpbl9wcm9tcHQiPk5ldyBQaW4gQ29kZTwvc3RyaW5nPgorCiAgICAgPCEtLSBEaXNwbGF5ZWQgYXMgaGludCBpbiBwYXNzd29yZEVudHJ5IEVkaXRUZXh0IG9uIFBhc3N3b3JkVW5sb2NrU2NyZWVuIFtDSEFSIExJTUlUPTMwXS0tPgogICAgIDxzdHJpbmcgbmFtZT0ia2V5Z3VhcmRfcGFzc3dvcmRfZW50cnlfdG91Y2hfaGludCI+PGZvbnQgc2l6ZT0iMTciPlRvdWNoIHRvIGVudGVyIHBhc3N3b3JkPC9mb250Pjwvc3RyaW5nPgogCkBAIC0xNzI4LDYgKzE3OTAsMTEgQEAKICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCI+Tm8gU0lNIGNhcmQgaW4gcGhvbmUuPC9zdHJpbmc+CiAgICAgPCEtLSBTaG93biBpbiB0aGUgbG9jayBzY3JlZW4gdG8gYXNrIHRoZSB1c2VyIHRvIGluc2VydCBhIFNJTSBjYXJkLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1faW5zdHJ1Y3Rpb25zIj5QbGVhc2UgaW5zZXJ0IGEgU0lNIGNhcmQuPC9zdHJpbmc+CisgICAgPCEtLSBTaG93biBpbiB0aGUgbG9jayBzY3JlZW4gdG8gYXNrIHRoZSB1c2VyIHRvIGluc2VydCBhIFNJTSBjYXJkIHdoZW4gc2ltIGlzIG1pc3Npbmcgb3Igbm90IHJlYWRhYmxlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1faW5zdHJ1Y3Rpb25zX2xvbmciPlRoZSBTSU0gY2FyZCBpcyBtaXNzaW5nIG9yIG5vdCByZWFkYWJsZS4gUGxlYXNlIGluc2VydCBhIFNJTSBjYXJkLjwvc3RyaW5nPgorICAgIDwhLS0gU2hvd24gaW4gdGhlIGxvY2sgc2NyZWVuIHRvIGluZm9ybSB0aGUgdXNlciB0byBTSU0gY2FyZCBpcyBwZXJtYW5lbnRseSBkaXNhYmxlZC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3Blcm1hbmVudF9kaXNhYmxlZF9zaW1faW5zdHJ1Y3Rpb25zIj5Zb3VyIFNJTSBjYXJkIGlzIHBlcm1hbmVudGx5IGRpc2FibGVkLlxuCisgICAgUGxlYXNlIGNvbnRhY3QgeW91ciB3aXJlbGVzcyBzZXJ2aWNlIHByb3ZpZGVyIHRvIG9idGFpbiBhbm90aGVyIFNJTSBjYXJkLjwvc3RyaW5nPgogCiAgICAgPCEtLSBTaG93biBpbiB0aGUgbG9jayBzY3JlZW4gd2hlbiB0aGVyZSBpcyBlbWVyZ2VuY3kgY2FsbHMgb25seSBtb2RlLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImVtZXJnZW5jeV9jYWxsc19vbmx5IiBtc2dpZD0iMjQ4NTYwNDU5MTI3MjY2ODM3MCI+RW1lcmdlbmN5IGNhbGxzIG9ubHk8L3N0cmluZz4KQEAgLTE4NTIsNyArMTkxOSw3IEBACiAKICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgc3RyaW5nIC0tPgogICAgIDxzdHJpbmcgbmFtZT0id2ViX3VzZXJfYWdlbnQiIHRyYW5zbGF0YWJsZT0iZmFsc2UiPk1vemlsbGEvNS4wIChMaW51eDsgVTsgPHhsaWZmOmcgaWQ9IngiPkFuZHJvaWQgJXM8L3hsaWZmOmc+KQotICAgICAgICBBcHBsZVdlYktpdC81MzQuMjAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCA8eGxpZmY6ZyBpZD0ibW9iaWxlIj4lczwveGxpZmY6Zz5TYWZhcmkvNTM0LjIwPC9zdHJpbmc+CisgICAgICAgIEFwcGxlV2ViS2l0LzUzNC4zMCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIDx4bGlmZjpnIGlkPSJtb2JpbGUiPiVzPC94bGlmZjpnPlNhZmFyaS81MzQuMzA8L3N0cmluZz4KICAgICA8IS0tIERvIG5vdCB0cmFuc2xhdGUuICBXZWJWaWV3IFVzZXIgQWdlbnQgdGFyZ2V0ZWQgY29udGVudCAtLT4KICAgICA8c3RyaW5nIG5hbWU9IndlYl91c2VyX2FnZW50X3RhcmdldF9jb250ZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj4iTW9iaWxlICI8L3N0cmluZz4KIApAQCAtMjM2MCw2ICsyNDI3LDEyIEBACiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfd2FybmluZ19yZXBsYWNlIj48eGxpZmY6ZyBpZD0iYXBwX25hbWUiPiUxJHM8L3hsaWZmOmc+IGlzIG5vdyBydW5uaW5nLjwvc3RyaW5nPgogICAgIDwhLS0gW0NIQVIgTElNSVQ9NTBdIFRpdGxlIG9mIHRoZSBhbGVydCB3aGVuIGFwcGxpY2F0aW9uIGxhdW5jaGVzIG9uIHRvcCBvZiBhbm90aGVyLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImxhdW5jaF93YXJuaW5nX29yaWdpbmFsIj48eGxpZmY6ZyBpZD0iYXBwX25hbWUiPiUxJHM8L3hsaWZmOmc+IHdhcyBvcmlnaW5hbGx5IGxhdW5jaGVkLjwvc3RyaW5nPgorICAgIDwhLS0gW0NIQVIgTElNSVQ9NTBdIENvbXBhdCBtb2RlIGRpYWxvZzogY29tcGF0IG1vZGUgc3dpdGNoIGxhYmVsLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InNjcmVlbl9jb21wYXRfbW9kZV9zY2FsZSI+U2NhbGU8L3N0cmluZz4KKyAgICA8IS0tIFtDSEFSIExJTUlUPTUwXSBDb21wYXQgbW9kZSBkaWFsb2c6IGNvbXBhdCBtb2RlIHN3aXRjaCBsYWJlbC4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJzY3JlZW5fY29tcGF0X21vZGVfc2hvdyI+QWx3YXlzIHNob3c8L3N0cmluZz4KKyAgICA8IS0tIFtDSEFSIExJTUlUPTIwMF0gQ29tcGF0IG1vZGUgZGlhbG9nOiBoaW50IHRvIHJlLWVuYWJsZSBjb21wYXQgbW9kZSBkaWFsb2cuIC0tPgorICAgIDxzdHJpbmcgbmFtZT0ic2NyZWVuX2NvbXBhdF9tb2RlX2hpbnQiPlJlLWVuYWJsZSB0aGlzIHdpdGggU2V0dGluZ3MgJmd0OyBBcHBsaWNhdGlvbnMgJmd0OyBNYW5hZ2UgYXBwbGljYXRpb25zLjwvc3RyaW5nPgogCiAgICAgPCEtLSBUZXh0IG9mIHRoZSBhbGVydCB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGFuIGFwcGxpY2F0aW9uIGhhcyB2aW9sYXRlZCBTdHJpY3RNb2RlLiAtLT4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiI+VGhlIGFwcGxpY2F0aW9uIDx4bGlmZjpnIGlkPSJhcHBsaWNhdGlvbiI+JTEkczwveGxpZmY6Zz4KQEAgLTI1MzUsNiArMjYwOCwxMSBAQAogICAgIDwhLS0gVVNCX1NUT1JBR0VfRVJST1IgZGlhbG9nICBvayBidXR0b24tLT4KICAgICA8c3RyaW5nIG5hbWU9ImRsZ19vayI+T0s8L3N0cmluZz4KIAorICAgIDwhLS0gVVNCX1BSRUZFUkVOQ0VTOiBXaGVuIHRoZSB1c2VyIGNvbm5lY3RzIHRoZSBwaG9uZSB0byBhIGNvbXB1dGVyIHZpYSBVU0IsIHdlIHNob3cgYSBub3RpZmljYXRpb24gYXNraW5nIGlmIGhlIHdhbnRzIHRvIHNoYXJlIGZpbGVzIGFjcm9zcy4gIFRoaXMgaXMgdGhlIHRpdGxlIC0tPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3ByZWZlcmVuY2VzX25vdGlmaWNhdGlvbl90aXRsZSI+VVNCIGNvbm5lY3RlZDwvc3RyaW5nPgorICAgIDwhLS0gU2VlIFVTQl9QUkVGRVJFTkNFUy4gVGhpcyBpcyB0aGUgbWVzc2FnZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2JfcHJlZmVyZWNlX25vdGlmaWNhdGlvbl9tZXNzYWdlIj5TZWxlY3QgdG8gY29uZmlndXJlIFVTQiBmaWxlIHRyYW5zZmVyLjwvc3RyaW5nPgorCiAgICAgPCEtLSBFeHRlcm5hbCBtZWRpYSBmb3JtYXQgZGlhbG9nIHN0cmluZ3MgLS0+CiAgICAgPCEtLSBUaGlzIGlzIHRoZSBsYWJlbCBmb3IgdGhlIGFjdGl2aXR5LCBhbmQgc2hvdWxkIG5ldmVyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIuIC0tPgogICAgIDwhLS0gU2VlIEVYVE1FRElBX0ZPUk1BVC4gIEVYVE1FRElBX0ZPUk1BVF9ESUFMT0c6ICBBZnRlciB0aGUgdXNlciBzZWxlY3RzIHRoZSBub3RpZmljYXRpb24sIGEgZGlhbG9nIGlzIHNob3duIGFza2luZyBpZiBoZSB3YW50cyB0byBmb3JtYXQgdGhlIFNEIGNhcmQuICBUaGlzIGlzIHRoZSB0aXRsZS4gW0NIQVIgTElNSVQ9MjBdIC0tPgpAQCAtMjcwNSw2ICsyNzgzLDE1IEBACiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX3Bza192cG5fZGVzY3JpcHRpb24iPlByZS1zaGFyZWQga2V5IGJhc2VkIEwyVFAvSVBTZWMgVlBOPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsMnRwX2lwc2VjX2NydF92cG5fZGVzY3JpcHRpb24iPkNlcnRpZmljYXRlIGJhc2VkIEwyVFAvSVBTZWMgVlBOPC9zdHJpbmc+CiAKKyAgICA8IS0tIFRpY2tlciB0ZXh0IHRvIHNob3cgd2hlbiBWUE4gaXMgYWN0aXZlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InZwbl90aWNrZXIiPjx4bGlmZjpnIGlkPSJhcHAiIGV4YW1wbGU9IkZvb1ZQTiBjbGllbnQiPiVzPC94bGlmZjpnPiBpcyBhY3RpdmF0aW5nIFZQTi4uLjwvc3RyaW5nPgorICAgIDwhLS0gVGhlIHRpdGxlIG9mIHRoZSBub3RpZmljYXRpb24gd2hlbiBWUE4gaXMgYWN0aXZlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InZwbl90aXRsZSI+VlBOIGlzIGFjdGl2YXRlZCBieSA8eGxpZmY6ZyBpZD0iYXBwIiBleGFtcGxlPSJGb29WUE4gY2xpZW50Ij4lczwveGxpZmY6Zz48L3N0cmluZz4KKyAgICA8IS0tIFRoZSB0ZXh0IG9mIHRoZSBub3RpZmljYXRpb24gd2hlbiBWUE4gaXMgYWN0aXZlLiAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InZwbl90ZXh0Ij5UYXAgdG8gbWFuYWdlIHRoZSBuZXR3b3JrLjwvc3RyaW5nPgorICAgIDwhLS0gVGhlIHRleHQgb2YgdGhlIG5vdGlmaWNhdGlvbiB3aGVuIFZQTiBpcyBhY3RpdmUgd2l0aCBhIHNlc3Npb24gbmFtZS4gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ2cG5fdGV4dF9sb25nIj5Db25uZWN0ZWQgdG8gPHhsaWZmOmcgaWQ9InNlc3Npb24iIGV4YW1wbGU9Im9mZmljZSI+JXM8L3hsaWZmOmc+LiBUYXAgdG8gbWFuYWdlIHRoZSBuZXR3b3JrLjwvc3RyaW5nPgorCiAgICAgPCEtLSBMb2NhbGl6ZWQgc3RyaW5ncyBmb3IgV2ViVmlldyAtLT4KICAgICA8IS0tIExhYmVsIGZvciBidXR0b24gaW4gYSBXZWJWaWV3IHRoYXQgd2lsbCBvcGVuIGEgY2hvb3NlciB0byBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZCAtLT4KICAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIj5DaG9vc2UgZmlsZTwvc3RyaW5nPgpAQCAtMjg1NCw0ICsyOTQxLDIyIEBACiAKICAgICA8IS0tIFN0b3JhZ2UgZGVzY3JpcHRpb24gZm9yIFVTQiBzdG9yYWdlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KICAgICA8c3RyaW5nIG5hbWU9InN0b3JhZ2VfdXNiIj5VU0Igc3RvcmFnZTwvc3RyaW5nPgorCisgICAgPCEtLSBCdXR0b24gdGV4dCBmb3IgdGhlIGVkaXQgbWVudSBpbiBpbnB1dCBtZXRob2QgZXh0cmFjdCBtb2RlLiBbQ0hBUiBMSU1JVD0xNl0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJleHRyYWN0X2VkaXRfbWVudV9idXR0b24iPkVkaXQuLi48L3N0cmluZz4KKworICAgIDwhLS0gTm90aWZpY2F0aW9uIHRpdGxlIHdoZW4gZGF0YSB1c2FnZSBoYXMgZXhjZWVkZWQgd2FybmluZyB0aHJlc2hvbGQuIFtDSEFSIExJTUlUPTMyXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGFfdXNhZ2Vfd2FybmluZ190aXRsZSI+RGF0YSB1c2FnZSB3YXJuaW5nPC9zdHJpbmc+CisgICAgPCEtLSBOb3RpZmljYXRpb24gYm9keSB3aGVuIGRhdGEgdXNhZ2UgaGFzIGV4Y2VlZGVkIHdhcm5pbmcgdGhyZXNob2xkLiBbQ0hBUiBMSU1JVD0zMl0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkYXRhX3VzYWdlX3dhcm5pbmdfYm9keSI+dXNhZ2UgZXhjZWVkcyA8eGxpZmY6ZyBpZD0ic2l6ZSIgZXhhbXBsZT0iMy44R0IiPiVzPC94bGlmZjpnPjwvc3RyaW5nPgorCisgICAgPCEtLSBOb3RpZmljYXRpb24gdGl0bGUgd2hlbiAyRy0zRyBkYXRhIHVzYWdlIGhhcyBleGNlZWRlZCBsaW1pdCB0aHJlc2hvbGQsIGFuZCBoYXMgYmVlbiBkaXNhYmxlZC4gW0NIQVIgTElNSVQ9MzJdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0YV91c2FnZV8zZ19saW1pdF90aXRsZSI+MkctM0cgZGF0YSBkaXNhYmxlZDwvc3RyaW5nPgorICAgIDwhLS0gTm90aWZpY2F0aW9uIHRpdGxlIHdoZW4gNEcgZGF0YSB1c2FnZSBoYXMgZXhjZWVkZWQgbGltaXQgdGhyZXNob2xkLCBhbmQgaGFzIGJlZW4gZGlzYWJsZWQuIFtDSEFSIExJTUlUPTMyXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGFfdXNhZ2VfNGdfbGltaXRfdGl0bGUiPjRHIGRhdGEgZGlzYWJsZWQ8L3N0cmluZz4KKyAgICA8IS0tIE5vdGlmaWNhdGlvbiB0aXRsZSB3aGVuIG1vYmlsZSBkYXRhIHVzYWdlIGhhcyBleGNlZWRlZCBsaW1pdCB0aHJlc2hvbGQsIGFuZCBoYXMgYmVlbiBkaXNhYmxlZC4gW0NIQVIgTElNSVQ9MzJdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0YV91c2FnZV9tb2JpbGVfbGltaXRfdGl0bGUiPk1vYmlsZSBkYXRhIGRpc2FibGVkPC9zdHJpbmc+CisgICAgPCEtLSBOb3RpZmljYXRpb24gYm9keSB3aGVuIGRhdGEgdXNhZ2UgaGFzIGV4Y2VlZGVkIGxpbWl0IHRocmVzaG9sZCwgYW5kIGhhcyBiZWVuIGRpc2FibGVkLiBbQ0hBUiBMSU1JVD0zMl0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJkYXRhX3VzYWdlX2xpbWl0X2JvZHkiPnRhcCB0byBlbmFibGU8L3N0cmluZz4KKwogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggMDYzNTUyOC4uNzJhNTc5NyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMjI3LDE1ICsyMjcsMTUgQEAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkljb24iPgogICAgIDwvc3R5bGU+CiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+I2ZmOTk5OTk5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xM3NwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5FdmVudENvbnRlbnQuVGl0bGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNnNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KICAgICA8L3N0eWxlPgogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuRXZlbnRDb250ZW50LkluZm8iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTGFyZ2U8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj4jZmYyNzI3Mjc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjEzc3A8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TbWFsbC5DYWxlbmRhclZpZXdXZWVrRGF5VmlldyI+CkBAIC05MDMsNiArOTAzLDEyIEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2lkZ2V0TGF5b3V0Ij5AYW5kcm9pZDpsYXlvdXQvcHJlZmVyZW5jZV93aWRnZXRfY2hlY2tib3g8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAorICAgIDxzdHlsZSBuYW1lPSJQcmVmZXJlbmNlLlN3aXRjaFByZWZlcmVuY2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpZGdldExheW91dCI+QGFuZHJvaWQ6bGF5b3V0L3ByZWZlcmVuY2Vfd2lkZ2V0X3N3aXRjaDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzd2l0Y2hUZXh0T24iPkBhbmRyb2lkOnN0cmluZy9jYXBpdGFsX29uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnN3aXRjaFRleHRPZmYiPkBhbmRyb2lkOnN0cmluZy9jYXBpdGFsX29mZjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPHN0eWxlIG5hbWU9IlByZWZlcmVuY2UuUHJlZmVyZW5jZVNjcmVlbiI+CiAgICAgPC9zdHlsZT4KIApAQCAtOTQ3LDYgKzk1MywxMiBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpZGdldExheW91dCI+QGFuZHJvaWQ6bGF5b3V0L3ByZWZlcmVuY2Vfd2lkZ2V0X2NoZWNrYm94PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKKyAgICA8c3R5bGUgbmFtZT0iUHJlZmVyZW5jZS5Ib2xvLlN3aXRjaFByZWZlcmVuY2UiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpZGdldExheW91dCI+QGFuZHJvaWQ6bGF5b3V0L3ByZWZlcmVuY2Vfd2lkZ2V0X3N3aXRjaDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzd2l0Y2hUZXh0T24iPkBhbmRyb2lkOnN0cmluZy9jYXBpdGFsX29uPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnN3aXRjaFRleHRPZmYiPkBhbmRyb2lkOnN0cmluZy9jYXBpdGFsX29mZjwvaXRlbT4KKyAgICA8L3N0eWxlPgorCiAgICAgPHN0eWxlIG5hbWU9IlByZWZlcmVuY2UuSG9sby5QcmVmZXJlbmNlU2NyZWVuIj4KICAgICA8L3N0eWxlPgogCkBAIC0xMTA5LDYgKzExMjEsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4xNmRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjE2ZGlwPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm1pbldpZHRoIj42NGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiPj9hbmRyb2lkOmF0dHIvYWN0aW9uQmFyU2l6ZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CdXR0b24uT3ZlcmZsb3ciPgpAQCAtMTEyMCwxNyArMTEzMywxNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+P2FuZHJvaWQ6YXR0ci9hY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciPgorICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyLlRhYlZpZXciIHBhcmVudD0iV2lkZ2V0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AZHJhd2FibGUvbWluaXRhYl9sdDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+NGRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjRkaXA8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJCYXIiPgorICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuQWN0aW9uQmFyLlRhYkJhciIgcGFyZW50PSJXaWRnZXQiPgogICAgIDwvc3R5bGU+CiAKLSAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiVGV4dCI+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5BY3Rpb25CYXIuVGFiVGV4dCIgcGFyZW50PSJXaWRnZXQiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj5Ac3R5bGUvVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LlRleHRWaWV3LlBvcHVwTWVudTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPj9hbmRyb2lkOmF0dHIvdGV4dENvbG9yUHJpbWFyeUludmVyc2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CkBAIC0xMzA4LDcgKzEzMjEsOCBAQAogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuSG9sby5EaWFsb2dXaW5kb3dUaXRsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE4c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjIyc3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AYW5kcm9pZDpjb2xvci9ob2xvX2JsdWU8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkNhbGVuZGFyVmlld1dlZWtEYXlWaWV3IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLlNtYWxsLkNhbGVuZGFyVmlld1dlZWtEYXlWaWV3Ij4KQEAgLTE0MDYsNyArMTQyMCw4IEBACiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkRpYWxvZ1dpbmRvd1RpdGxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MjJzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPkBhbmRyb2lkOmNvbG9yL2hvbG9fYmx1ZTwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLkhvbG8uTGlnaHQuQ2FsZW5kYXJWaWV3V2Vla0RheVZpZXciIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuU21hbGwuQ2FsZW5kYXJWaWV3V2Vla0RheVZpZXciPgpAQCAtMTQzNSw2ICsxNDUwLDEyIEBACiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQnV0dG9uLkJvcmRlcmxlc3MiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij40ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkJ1dHRvbi5Cb3JkZXJsZXNzLlNtYWxsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkJ1dHRvbi5TbWFsbCI+CkBAIC0xNDc1LDYgKzE0OTYsNyBAQAogCiAgICAgPHN0eWxlIG5hbWU9IkhvbG8uQnV0dG9uQmFyLkFsZXJ0RGlhbG9nIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyUGFkZGluZyI+MGRwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uVGV4dFZpZXciIHBhcmVudD0iV2lkZ2V0LlRleHRWaWV3Ij4KQEAgLTE3NzAsNyArMTc5Miw2IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4xNmRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjE2ZGlwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm1pbkhlaWdodCI+NTZkaXA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5jZW50ZXI8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIApAQCAtMTc4NSwyMiArMTgwNiwyMiBAQAogICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5BY3Rpb25CdXR0b24uVGV4dEJ1dHRvbiIgcGFyZW50PSJXaWRnZXQuSG9sby5CdXR0b25CYXIuQnV0dG9uIj4KICAgICA8L3N0eWxlPgogCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVmlldyIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJWaWV3Ij4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyLlRhYlZpZXciIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJhci5UYWJWaWV3Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AZHJhd2FibGUvdGFiX2luZGljYXRvcl9ob2xvPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij4xNmRpcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjE2ZGlwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKLSAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uVGFiIiBwYXJlbnQ9IldpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVmlldyI+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLlRhYiIgcGFyZW50PSJXaWRnZXQuSG9sby5BY3Rpb25CYXIuVGFiVmlldyI+CiAgICAgPC9zdHlsZT4KIAotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYkJhciIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJCYXIiPgorICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5BY3Rpb25CYXIuVGFiQmFyIiBwYXJlbnQ9IldpZGdldC5BY3Rpb25CYXIuVGFiQmFyIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyIj4/YW5kcm9pZDphdHRyL2RpdmlkZXJWZXJ0aWNhbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzaG93RGl2aWRlcnMiPm1pZGRsZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyUGFkZGluZyI+OGRpcDwvaXRlbT4KICAgICA8L3N0eWxlPgogCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVGV4dCIgcGFyZW50PSJXaWRnZXQuQWN0aW9uQmFyVmlld19UYWJUZXh0Ij4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyLlRhYlRleHQiIHBhcmVudD0iV2lkZ2V0LkFjdGlvbkJhci5UYWJUZXh0Ij4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+QHN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uTWVkaXVtPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xOHNwPC9pdGVtPgpAQCAtMTg1Miw2ICsxODczLDEyIEBACiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQnV0dG9uLkJvcmRlcmxlc3MiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPj9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdMZWZ0Ij40ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NGRpcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5Cb3JkZXJsZXNzLlNtYWxsIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTRzcDwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkJ1dHRvbi5TbWFsbCI+CkBAIC0xODc5LDYgKzE5MDYsNyBAQAogCiAgICAgPHN0eWxlIG5hbWU9IkhvbG8uTGlnaHQuQnV0dG9uQmFyLkFsZXJ0RGlhbG9nIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpkaXZpZGVyUGFkZGluZyI+MGRwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iSG9sby5MaWdodC5TZWdtZW50ZWRCdXR0b24iIHBhcmVudD0iU2VnbWVudGVkQnV0dG9uIj4KQEAgLTIxMTksMTYgKzIxNDcsMTYgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvYWN0aW9uX21lbnVfb3ZlcmZsb3dfZGVzY3JpcHRpb248L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYlZpZXciIHBhcmVudD0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJWaWV3Ij4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyLlRhYlZpZXciIHBhcmVudD0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyLlRhYlZpZXciPgogICAgIDwvc3R5bGU+CiAKLSAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuVGFiIiBwYXJlbnQ9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhclZpZXdfVGFiVmlldyI+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LlRhYiIgcGFyZW50PSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXIuVGFiVmlldyI+CiAgICAgPC9zdHlsZT4KIAotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYkJhciIgcGFyZW50PSJXaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYkJhciI+CisgICAgPHN0eWxlIG5hbWU9IldpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhci5UYWJCYXIiIHBhcmVudD0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyLlRhYkJhciI+CiAgICAgPC9zdHlsZT4KIAotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYlRleHQiIHBhcmVudD0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJUZXh0Ij4KKyAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyLlRhYlRleHQiIHBhcmVudD0iV2lkZ2V0LkhvbG8uQWN0aW9uQmFyLlRhYlRleHQiPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uTW9kZSIgcGFyZW50PSJXaWRnZXQuSG9sby5BY3Rpb25Nb2RlIj4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAppbmRleCAwYTYxNGIyLi4yYWIyYzA0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCkBAIC05NSw3ICs5NSw5IEBACiAKICAgICAgICAgPCEtLSBMaXN0IGF0dHJpYnV0ZXMgLS0+CiAgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij42NGRpcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iZHJvcGRvd25MaXN0UHJlZmVycmVkSXRlbUhlaWdodCI+NjRkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0U21hbGwiPj9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9Imxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0TGFyZ2UiPj9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3Bkb3duTGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPj9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQ8L2l0ZW0+CiAKICAgICAgICAgPCEtLSBAaGlkZSAtLT4KICAgICAgICAgPGl0ZW0gbmFtZT0ic2VhcmNoUmVzdWx0TGlzdEl0ZW1IZWlnaHQiPjU4ZGlwPC9pdGVtPgpAQCAtMjQ3LDYgKzI0OSw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9InByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZUluZm9ybWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSW5mb3JtYXRpb248L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImNoZWNrQm94UHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkNoZWNrQm94UHJlZmVyZW5jZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ic3dpdGNoUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLlN3aXRjaFByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Inllc05vUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkRpYWxvZ1ByZWZlcmVuY2UuWWVzTm9QcmVmZXJlbmNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJkaWFsb2dQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iZWRpdFRleHRQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuRGlhbG9nUHJlZmVyZW5jZS5FZGl0VGV4dFByZWZlcmVuY2U8L2l0ZW0+CkBAIC0yNjcsMTIgKzI3MCwxMyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ3V0RHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY3V0X2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jb3B5X2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVBhc3RlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfcGFzdGVfaG9sb19kYXJrPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU2VsZWN0QWxsRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VsZWN0YWxsX2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNoYXJlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmVfaG9sb19kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlRmluZERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2ZpbmRfaG9sb19kYXJrPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlV2ViU2VhcmNoRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VhcmNoPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CYXJWaWV3X1RhYlZpZXc8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYkJhclN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJhclZpZXdfVGFiQmFyPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQmFyVmlld19UYWJUZXh0PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJTdHlsZSI+QHN0eWxlL1dpZGdldC5BY3Rpb25CYXIuVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQmFyLlRhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkFjdGlvbkJhci5UYWJUZXh0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uTW9kZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuQWN0aW9uQnV0dG9uLkNsb3NlTW9kZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5BY3Rpb25CYXI8L2l0ZW0+CkBAIC0zOTYsNiArNDAwLDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUN1dERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2N1dF9ob2xvX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ29weURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2NvcHlfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVBhc3RlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfcGFzdGVfaG9sb19saWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNlbGVjdEFsbERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlU2hhcmVEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zaGFyZV9ob2xvX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlRmluZERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2ZpbmRfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVdlYlNlYXJjaERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaF9ob2xvX2xpZ2h0PC9pdGVtPgpAQCAtNjg1LDcgKzY5MCw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6aW1lRXh0cmFjdEVudGVyQW5pbWF0aW9uIj5AYW5kcm9pZDphbmltL2lucHV0X21ldGhvZF9leHRyYWN0X2VudGVyPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmltZUV4dHJhY3RFeGl0QW5pbWF0aW9uIj5AYW5kcm9pZDphbmltL2lucHV0X21ldGhvZF9leHRyYWN0X2V4aXQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KLSAgICAKKwogICAgIDwhLS0gVGhlbWUgZm9yIHRoZSBzZWFyY2ggaW5wdXQgYmFyLiAtLT4KICAgICA8c3R5bGUgbmFtZT0iVGhlbWUuU2VhcmNoQmFyIiBwYXJlbnQ9IlRoZW1lLkhvbG8uTGlnaHQuUGFuZWwiPgogICAgICAgICA8aXRlbSBuYW1lPSJ3aW5kb3dDb250ZW50T3ZlcmxheSI+QG51bGw8L2l0ZW0+ICAgICAgICAKQEAgLTg1OCw3ICs4NjMsOSBAQAogCiAgICAgICAgIDwhLS0gTGlzdCBhdHRyaWJ1dGVzIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodCI+NjRkaXA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImRyb3Bkb3duTGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPjQ4ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIj40OGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFByZWZlcnJlZEl0ZW1IZWlnaHRMYXJnZSI+ODBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3Bkb3duTGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPj9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHRTbWFsbDwvaXRlbT4KIAogICAgICAgICA8IS0tIEBoaWRlIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CkBAIC0xMDAxLDYgKzEwMDgsNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSG9sbzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZUluZm9ybWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSG9sby5JbmZvcm1hdGlvbjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY2hlY2tCb3hQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSG9sby5DaGVja0JveFByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InN3aXRjaFByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5Ib2xvLlN3aXRjaFByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Inllc05vUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkhvbG8uRGlhbG9nUHJlZmVyZW5jZS5ZZXNOb1ByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImRpYWxvZ1ByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5Ib2xvLkRpYWxvZ1ByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0UHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkhvbG8uRGlhbG9nUHJlZmVyZW5jZS5FZGl0VGV4dFByZWZlcmVuY2U8L2l0ZW0+CkBAIC0xMDE3LDkgKzEwMjUsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25PdmVyZmxvd0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9jYWJfYmFja2dyb3VuZF9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9jYWJfaWNfY2xvc2VfaG9sbzwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXJWaWV3X1RhYlZpZXc8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYkJhclN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQmFyVmlld19UYWJCYXI8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYlRleHRTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkFjdGlvbkJhclZpZXdfVGFiVGV4dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXIuVGFiVmlldzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiQmFyU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXIuVGFiQmFyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CYXIuVGFiVGV4dDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uTW9kZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNsb3NlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5BY3Rpb25CdXR0b24uQ2xvc2VNb2RlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvV2lkZ2V0LkhvbG8uQWN0aW9uQmFyPC9pdGVtPgpAQCAtMTAyOSw2ICsxMDM3LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUN1dERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2N1dF9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDb3B5RHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfY29weV9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVQYXN0ZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3Bhc3RlX2hvbG9fZGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNlbGVjdEFsbERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlbGVjdGFsbF9ob2xvX2Rhcms8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTaGFyZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NoYXJlX2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUZpbmREcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9maW5kX2hvbG9fZGFyazwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVdlYlNlYXJjaERyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaF9ob2xvX2Rhcms8L2l0ZW0+CkBAIC0xMTQ1LDcgKzExNTQsOSBAQAogCiAgICAgICAgIDwhLS0gTGlzdCBhdHRyaWJ1dGVzIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodCI+NjRkaXA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImRyb3Bkb3duTGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPjQ4ZGlwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJsaXN0UHJlZmVycmVkSXRlbUhlaWdodFNtYWxsIj40OGRpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0ibGlzdFByZWZlcnJlZEl0ZW1IZWlnaHRMYXJnZSI+ODBkaXA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImRyb3Bkb3duTGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPj9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHRTbWFsbDwvaXRlbT4KIAogICAgICAgICA8IS0tIEBoaWRlIC0tPgogICAgICAgICA8aXRlbSBuYW1lPSJzZWFyY2hSZXN1bHRMaXN0SXRlbUhlaWdodCI+NThkaXA8L2l0ZW0+CkBAIC0xMjg4LDYgKzEyOTksNyBAQAogICAgICAgICA8aXRlbSBuYW1lPSJwcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSG9sbzwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0icHJlZmVyZW5jZUluZm9ybWF0aW9uU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSG9sby5JbmZvcm1hdGlvbjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iY2hlY2tCb3hQcmVmZXJlbmNlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1ByZWZlcmVuY2UuSG9sby5DaGVja0JveFByZWZlcmVuY2U8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9InN3aXRjaFByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5Ib2xvLlN3aXRjaFByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9Inllc05vUHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkhvbG8uRGlhbG9nUHJlZmVyZW5jZS5ZZXNOb1ByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImRpYWxvZ1ByZWZlcmVuY2VTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvUHJlZmVyZW5jZS5Ib2xvLkRpYWxvZ1ByZWZlcmVuY2U8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImVkaXRUZXh0UHJlZmVyZW5jZVN0eWxlIj5AYW5kcm9pZDpzdHlsZS9QcmVmZXJlbmNlLkhvbG8uRGlhbG9nUHJlZmVyZW5jZS5FZGl0VGV4dFByZWZlcmVuY2U8L2l0ZW0+CkBAIC0xMzA0LDkgKzEzMTYsOSBAQAogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25PdmVyZmxvd0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CdXR0b24uT3ZlcmZsb3c8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVCYWNrZ3JvdW5kIj5AYW5kcm9pZDpkcmF3YWJsZS9jYWJfYmFja2dyb3VuZF9ob2xvX2xpZ2h0PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25Nb2RlQ2xvc2VEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvY2FiX2ljX2Nsb3NlX2hvbG88L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYlN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyVmlld19UYWJWaWV3PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJCYXJTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhclZpZXdfVGFiQmFyPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhY3Rpb25CYXJUYWJUZXh0U3R5bGUiPkBzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5BY3Rpb25CYXJWaWV3X1RhYlRleHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYlN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyLlRhYlZpZXc8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbkJhclRhYkJhclN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyLlRhYkJhcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyVGFiVGV4dFN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQmFyLlRhYlRleHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTdHlsZSI+QHN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbk1vZGU8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDbG9zZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0LkhvbG8uTGlnaHQuQWN0aW9uQnV0dG9uLkNsb3NlTW9kZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uQmFyU3R5bGUiPkBhbmRyb2lkOnN0eWxlL1dpZGdldC5Ib2xvLkxpZ2h0LkFjdGlvbkJhcjwvaXRlbT4KQEAgLTEzMTYsNiArMTMyOCw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVDdXREcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jdXRfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUNvcHlEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9jb3B5X2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVQYXN0ZURyYXdhYmxlIj5AYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3Bhc3RlX2hvbG9fbGlnaHQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVTZWxlY3RBbGxEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zZWxlY3RhbGxfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZVNoYXJlRHJhd2FibGUiPkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmVfaG9sb19saWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYWN0aW9uTW9kZUZpbmREcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9maW5kX2hvbG9fbGlnaHQ8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFjdGlvbk1vZGVXZWJTZWFyY2hEcmF3YWJsZSI+QGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zZWFyY2hfaG9sb19saWdodDwvaXRlbT4KQEAgLTE0MDQsNiArMTQxNyw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij5AbnVsbDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9Ib2xvLkJ1dHRvbkJhci5BbGVydERpYWxvZzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm9yZGVybGVzc0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5CdXR0b24uQm9yZGVybGVzcy5TbWFsbDwvaXRlbT4KICAgICAgICAgCiAgICAgICAgIDxpdGVtIG5hbWU9InRleHRBcHBlYXJhbmNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZUludmVyc2UiPkBhbmRyb2lkOnN0eWxlL1RleHRBcHBlYXJhbmNlLkhvbG8uSW52ZXJzZTwvaXRlbT4KQEAgLTE0MTMsNyArMTQyNyw3IEBACiAgICAgICAgICBhIHJlZ3VsYXIgZGlhbG9nLiAtLT4KICAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5EaWFsb2cuTWluV2lkdGgiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd01pbldpZHRoTWFqb3IiPkBhbmRyb2lkOmRpbWVuL2RpYWxvZ19taW5fd2lkdGhfbWFqb3I8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93TWluV2lkdGhNaW5vciI+QGFuZHJvaWQ6ZGltZW4vZGlhbG9nX21pbl93aWR0aF9tYWpvcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dNaW5XaWR0aE1pbm9yIj5AYW5kcm9pZDpkaW1lbi9kaWFsb2dfbWluX3dpZHRoX21pbm9yPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8IS0tIFZhcmlhdGlvbiBvZiBUaGVtZS5Ib2xvLkRpYWxvZyB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSB0aXRsZSBiYXIuIC0tPgpAQCAtMTQyNiw3ICsxNDQwLDcgQEAKICAgICAgICAgIGEgcmVndWxhciBkaWFsb2cuIC0tPgogICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5Ib2xvLkRpYWxvZy5Ob0FjdGlvbkJhci5NaW5XaWR0aCI+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93TWluV2lkdGhNYWpvciI+QGFuZHJvaWQ6ZGltZW4vZGlhbG9nX21pbl93aWR0aF9tYWpvcjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dNaW5XaWR0aE1pbm9yIj5AYW5kcm9pZDpkaW1lbi9kaWFsb2dfbWluX3dpZHRoX21ham9yPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd01pbldpZHRoTWlub3IiPkBhbmRyb2lkOmRpbWVuL2RpYWxvZ19taW5fd2lkdGhfbWlub3I8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDwhLS0gVmFyaWF0aW9uIG9mIFRoZW1lLkhvbG8uRGlhbG9nIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIGZyYW1lIChvciBiYWNrZ3JvdW5kKS4KQEAgLTE0NTMsNyArMTQ2Nyw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd1RpdGxlU3R5bGUiPkBhbmRyb2lkOnN0eWxlL0RpYWxvZ1dpbmRvd1RpdGxlLkhvbG88L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9IndpbmRvd0NvbnRlbnRPdmVybGF5Ij5AbnVsbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dNaW5XaWR0aE1ham9yIj5AYW5kcm9pZDpkaW1lbi9kaWFsb2dfbWluX3dpZHRoX21ham9yPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd01pbldpZHRoTWlub3IiPkBhbmRyb2lkOmRpbWVuL2RpYWxvZ19taW5fd2lkdGhfbWFqb3I8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93TWluV2lkdGhNaW5vciI+QGFuZHJvaWQ6ZGltZW4vZGlhbG9nX21pbl93aWR0aF9taW5vcjwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPCEtLSBUaGVtZSBmb3IgYSB3aW5kb3cgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBlaXRoZXIgZnVsbC1zY3JlZW4gb24KQEAgLTE0OTIsNiArMTUwNiw3IEBACiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29sb3JCYWNrZ3JvdW5kQ2FjaGVIaW50Ij5AbnVsbDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJ1dHRvbkJhclN0eWxlIj5AYW5kcm9pZDpzdHlsZS9Ib2xvLkxpZ2h0LkJ1dHRvbkJhci5BbGVydERpYWxvZzwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYm9yZGVybGVzc0J1dHRvblN0eWxlIj5AYW5kcm9pZDpzdHlsZS9XaWRnZXQuSG9sby5MaWdodC5CdXR0b24uQm9yZGVybGVzcy5TbWFsbDwvaXRlbT4KIAogICAgICAgICA8aXRlbSBuYW1lPSJ0ZXh0QXBwZWFyYW5jZSI+QGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuSG9sby5MaWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0idGV4dEFwcGVhcmFuY2VJbnZlcnNlIj5AYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5Ib2xvLkxpZ2h0LkludmVyc2U8L2l0ZW0+CkBAIC0xNTAxLDcgKzE1MTYsNyBAQAogICAgICAgICAgYSByZWd1bGFyIGRpYWxvZy4gLS0+CiAgICAgPHN0eWxlIG5hbWU9IlRoZW1lLkhvbG8uTGlnaHQuRGlhbG9nLk1pbldpZHRoIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dNaW5XaWR0aE1ham9yIj5AYW5kcm9pZDpkaW1lbi9kaWFsb2dfbWluX3dpZHRoX21ham9yPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd01pbldpZHRoTWlub3IiPkBhbmRyb2lkOmRpbWVuL2RpYWxvZ19taW5fd2lkdGhfbWFqb3I8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93TWluV2lkdGhNaW5vciI+QGFuZHJvaWQ6ZGltZW4vZGlhbG9nX21pbl93aWR0aF9taW5vcjwvaXRlbT4KICAgICA8L3N0eWxlPgogCiAgICAgPCEtLSBWYXJpYXRpb24gb2YgVGhlbWUuSG9sby5MaWdodC5EaWFsb2cgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgdGl0bGUgYmFyLiAtLT4KQEAgLTE1MTQsNyArMTUyOSw3IEBACiAgICAgICAgICBhIHJlZ3VsYXIgZGlhbG9nLiAtLT4KICAgICA8c3R5bGUgbmFtZT0iVGhlbWUuSG9sby5MaWdodC5EaWFsb2cuTm9BY3Rpb25CYXIuTWluV2lkdGgiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd01pbldpZHRoTWFqb3IiPkBhbmRyb2lkOmRpbWVuL2RpYWxvZ19taW5fd2lkdGhfbWFqb3I8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93TWluV2lkdGhNaW5vciI+QGFuZHJvaWQ6ZGltZW4vZGlhbG9nX21pbl93aWR0aF9tYWpvcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dNaW5XaWR0aE1pbm9yIj5AYW5kcm9pZDpkaW1lbi9kaWFsb2dfbWluX3dpZHRoX21pbm9yPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8IS0tIFRoZW1lIGZvciBhIHdpbmRvdyB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGVpdGhlciBmdWxsLXNjcmVlbiBvbgpAQCAtMTU0MCw3ICsxNTU1LDcgQEAKICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93VGl0bGVTdHlsZSI+QGFuZHJvaWQ6c3R5bGUvRGlhbG9nV2luZG93VGl0bGUuSG9sby5MaWdodDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0id2luZG93Q29udGVudE92ZXJsYXkiPkBudWxsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd01pbldpZHRoTWFqb3IiPkBhbmRyb2lkOmRpbWVuL2RpYWxvZ19taW5fd2lkdGhfbWFqb3I8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93TWluV2lkdGhNaW5vciI+QGFuZHJvaWQ6ZGltZW4vZGlhbG9nX21pbl93aWR0aF9tYWpvcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dNaW5XaWR0aE1pbm9yIj5AYW5kcm9pZDpkaW1lbi9kaWFsb2dfbWluX3dpZHRoX21pbm9yPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8IS0tIERlZmF1bHQgaG9sb2dyYXBoaWMgKGRhcmspIGZvciB3aW5kb3dzIHRoYXQgd2FudCB0byBoYXZlIHRoZSB1c2VyJ3Mgc2VsZWN0ZWQKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvQW5kcm9pZC5tayBiL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTFkMThjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTcgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKyMgV2Ugb25seSB3YW50IHRoaXMgYXBrIGJ1aWxkIGZvciB0ZXN0cy4KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKKyMgSW5jbHVkZSBhbGwgdGVzdCBqYXZhIGZpbGVzLgorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwkkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEJsdWV0b290aFRlc3RzCitMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjE1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5ibHVldG9vdGgudGVzdHMiID4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkxVRVRPT1RIIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkxVRVRPT1RIX0FETUlOIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFVFRJTkdTIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfU0VDVVJFX1NFVFRJTkdTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uID4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKyAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVGVzdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQuYmx1ZXRvb3RoLnRlc3RzIgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQmx1ZXRvb3RoIFRlc3RzIiAvPgorCis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFJlYm9vdFN0cmVzc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFJlYm9vdFN0cmVzc1Rlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFJlYm9vdFN0cmVzc1Rlc3QuamF2YQpyZW5hbWUgdG8gY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoUmVib290U3RyZXNzVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkN2Q5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvYmx1ZXRvb3RodGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdENhc2U7CisKKy8qKgorICogU3RyZXNzIHRlc3Qgc3VpdGUgZm9yIEJsdWV0b290aCByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqCisgKiBJbmNsdWRlcyB0ZXN0cyBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIGJsdWV0b290aCwgZW5hYmxpbmcvZGlzYWJsaW5nIGRpc2NvdmVyYWJsZSBtb2RlLAorICogc3RhcnRpbmcvc3RvcHBpbmcgc2NhbnMsIGNvbm5lY3RpbmcvZGlzY29ubmVjdGluZyB0byBIRlAsIEEyRFAsIEhJRCwgUEFOIHByb2ZpbGVzLCBhbmQgdmVyaWZ5aW5nCisgKiB0aGF0IHJlbW90ZSBjb25uZWN0aW9ucy9kaXNjb25uZWN0aW9ucyBvY2N1ciBmb3IgdGhlIFBBTiBwcm9maWxlLgorICogPHA+CisgKiBUaGlzIHRlc3Qgc3VpdGUgdXNlcyB7QGxpbmsgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVGVzdFJ1bm5lcn0gdG8gZm9yIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUKKyAqIG51bWJlciBvZiBpdGVyYXRpb25zIGFuZCB0aGUgYWRkcmVzc2VzIG9mIHJlbW90ZSBCbHVldG9vdGggZGV2aWNlcy4KKyAqLworcHVibGljIGNsYXNzIEJsdWV0b290aFN0cmVzc1Rlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJCbHVldG9vdGhTdHJlc3NUZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZJTEUgPSAiQmx1ZXRvb3RoU3RyZXNzVGVzdE91dHB1dC50eHQiOworCisgICAgcHJpdmF0ZSBCbHVldG9vdGhUZXN0VXRpbHMgbVRlc3RVdGlsczsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICBtVGVzdFV0aWxzID0gbmV3IEJsdWV0b290aFRlc3RVdGlscyhjb250ZXh0LCBUQUcsIE9VVFBVVF9GSUxFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworCisgICAgICAgIG1UZXN0VXRpbHMuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBCbHVldG9vdGguCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZSgpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNFbmFibGVJdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiZW5hYmxlIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgcHV0dGluZyB0aGUgZGV2aWNlIGluIGFuZCB0YWtpbmcgdGhlIGRldmljZSBvdXQgb2YgZGlzY292ZXJhYmxlIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdERpc2NvdmVyYWJsZSgpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNEaXNjb3ZlcmFibGVJdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMudW5kaXNjb3ZlcmFibGUoYWRhcHRlcik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImRpc2NvdmVyYWJsZSBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY292ZXJhYmxlKGFkYXB0ZXIpOworICAgICAgICAgICAgbVRlc3RVdGlscy51bmRpc2NvdmVyYWJsZShhZGFwdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3Igc3RhcnRpbmcgYW5kIHN0b3BwaW5nIEJsdWV0b290aCBzY2Fucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NhbigpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNTY2FuSXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLnN0b3BTY2FuKGFkYXB0ZXIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJzY2FuIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5zdGFydFNjYW4oYWRhcHRlcik7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnN0b3BTY2FuKGFkYXB0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIHRoZSBQQU4gTkFQIHByb2ZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZVBhbigpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNFbmFibGVQYW5JdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInRlc3RFbmFibGVQYW4gaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiCisgICAgICAgICAgICAgICAgICAgICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZVBhbihhZGFwdGVyKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZVBhbihhZGFwdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgcGFpcmluZyBhbmQgdW5wYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlLgorICAgICAqIDxwPgorICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSBpbml0aWF0ZXMgcGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZSwgYW5kIHRoZW4gdW5wYWlycyB3aXRoCisgICAgICogdGhlIGRldmljZSBhZnRlciB0aGUgcGFpcmluZyBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFpcigpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNQYWlySXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInBhaXIgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKKyAgICAgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgYWNjZXB0aW5nIGEgcGFpcmluZyByZXF1ZXN0IGFuZCB1bnBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHdhaXRzIGZvciBhIHBhaXJpbmcgcmVxdWVzdCBmcm9tIGEgcmVtb3RlIGRldmljZS4gIEl0IGFjY2VwdHMKKyAgICAgKiB0aGUgcmVxdWVzdCBhbmQgdGhlbiB1bnBhaXJzIGFmdGVyIHRoZSBwYXJpbmcgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdFBhaXIoKSB7CisgICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zUGFpckl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiYWNjZXB0UGFpciBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuYWNjZXB0UGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAorICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHdpdGggYW4gQTJEUCBzb3VyY2UuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGFuIEEyRFAgc2luaywgYW5kIGluaXRpYXRlcyBjb25uZWN0aW9ucyBhbmQKKyAgICAgKiBkaXNjb25uZWN0aW9ucyB3aXRoIGFuIEEyRFAgc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0QTJkcCgpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0QTJkcEl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCwgbnVsbCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RBMmRwIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOworICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY29ubmVjdEEyZHAoZGV2aWNlPSVzKSIsIGRldmljZSkpOworICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEEyZHAoZGV2aWNlPSVzKSIsIGRldmljZSkpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmVzcyB0ZXN0IGZvciBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHRoZSBIRlAgd2l0aCBhIGhhbmRzIGZyZWUgZGV2aWNlLgorICAgICAqIDxwPgorICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSBwbGF5cyB0aGUgcm9sZSBvZiBhbiBIRlAgYXVkaW8gZ2F0ZXdheSwgYW5kIGluaXRpYXRlcworICAgICAqIGNvbm5lY3Rpb25zIGFuZCBkaXNjb25uZWN0aW9ucyB3aXRoIGEgaGFuZHMgZnJlZSBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RIZWFkc2V0KCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAorICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOworICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULCBudWxsKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEhlYWRzZXQgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25uZWN0SGVhZHNldChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyZXNzIHRlc3QgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3Rpbmcgd2l0aCBhIEhJRCBkZXZpY2UuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGEgSElEIGhvc3QsIGFuZCBpbml0aWF0ZXMgY29ubmVjdGlvbnMgYW5kCisgICAgICogZGlzY29ubmVjdGlvbnMgd2l0aCBhIEhJRCBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RJbnB1dCgpIHsKKyAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0SW5wdXRJdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSwgbnVsbCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RJbnB1dCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY29ubmVjdElucHV0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdElucHV0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJlc3MgdGVzdCBmb3IgY29ubmVjdGluZyBhbmQgZGlzY29ubmVjdGluZyB3aXRoIGEgUEFOIE5BUC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYSBQQU5VLCBhbmQgaW5pdGlhdGVzIGNvbm5lY3Rpb25zIGFuZAorICAgICAqIGRpc2Nvbm5lY3Rpb25zIHdpdGggYSBOQVAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RQYW4oKSB7CisgICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdFBhbkl0ZXJhdGlvbnM7CisgICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKKyAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdFBhbiBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdFBhbihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UGFuKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIH0KKworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyZXNzIHRlc3QgZm9yIHZlcmlmeWluZyBhIFBBTlUgY29ubmVjdGluZyBhbmQgZGlzY29ubmVjdGluZyB3aXRoIHRoZSBkZXZpY2UuCisgICAgICogPHA+CisgICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGEgTkFQIHdoaWNoIGEgcmVtb3RlIFBBTlUgY29ubmVjdHMgYW5kCisgICAgICogZGlzY29ubmVjdHMgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21pbmdQYW5Db25uZWN0aW9uKCkgeworICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RQYW5JdGVyYXRpb25zOworICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7CisgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlUGFuKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZVBhbihhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5hY2NlcHRQYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImluY29taW5nUGFuQ29ubmVjdGlvbiBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIKKyAgICAgICAgICAgICAgICAgICAgKyBpdGVyYXRpb25zKTsKKyAgICAgICAgICAgIG1UZXN0VXRpbHMuaW5jb21pbmdQYW5Db25uZWN0aW9uKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLmluY29taW5nUGFuRGlzY29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlUGFuKGFkYXB0ZXIpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyZXNzIHRlc3QgZm9yIHZlcmlmeWluZyB0aGF0IEF1ZGlvTWFuYWdlciBjYW4gb3BlbiBhbmQgY2xvc2UgU0NPIGNvbm5lY3Rpb25zLgorICAgICAqIDxwPgorICAgICAqIEluIHRoaXMgdGVzdCwgYSBIU1AgY29ubmVjdGlvbiBpcyBvcGVuZWQgd2l0aCBhbiBleHRlcm5hbCBoZWFkc2V0IGFuZCB0aGUgU0NPIGNvbm5lY3Rpb24gaXMKKyAgICAgKiByZXBlYXRpYmx5IG9wZW5lZCBhbmQgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFN0b3BTY28oKSB7CisgICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zU3RhcnRTdG9wU2NvSXRlcmF0aW9uczsKKyAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOworICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7CisgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKKyAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7CisgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAorICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOworICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULCBudWxsKTsKKyAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCwgbnVsbCk7CisgICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJzdGFydFN0b3BTY28gaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnN0YXJ0U2NvKGFkYXB0ZXIsIGRldmljZSk7CisgICAgICAgICAgICBtVGVzdFV0aWxzLnN0b3BTY28oYWRhcHRlciwgZGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG51bGwpOworICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOworICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTY5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyOworaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0U3VpdGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBJbnN0cnVtZW50YXRpb24gdGVzdCBydW5uZXIgZm9yIEJsdWV0b290aCB0ZXN0cy4KKyAqIDxwPgorICogVG8gcnVuOgorICogPHByZT4KKyAqIHtAY29kZQorICogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgXAorICogICAgIFstZSBlbmFibGVfaXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKKyAqICAgICBbLWUgZGlzY292ZXJhYmxlX2l0ZXJhdGlvbnMgPGl0ZXJhdGlvbnM+XSBcCisgKiAgICAgWy1lIHNjYW5faXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKKyAqICAgICBbLWUgZW5hYmxlX3Bhbl9pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAorICogICAgIFstZSBwYWlyX2l0ZXJhdGlvbnMgPGl0ZXJhdGlvbnM+XSBcCisgKiAgICAgWy1lIGNvbm5lY3RfYTJkcF9pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAorICogICAgIFstZSBjb25uZWN0X2hlYWRzZXRfaXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKKyAqICAgICBbLWUgY29ubmVjdF9pbnB1dF9pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAorICogICAgIFstZSBjb25uZWN0X3Bhbl9pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAorICogICAgIFstZSBzdGFydF9zdG9wX3Njb19pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAorICogICAgIFstZSBwYWlyX2FkZHJlc3MgPGFkZHJlc3M+XSBcCisgKiAgICAgWy1lIGhlYWRzZXRfYWRkcmVzcyA8YWRkcmVzcz5dIFwKKyAqICAgICBbLWUgYTJkcF9hZGRyZXNzIDxhZGRyZXNzPl0gXAorICogICAgIFstZSBpbnB1dF9hZGRyZXNzIDxhZGRyZXNzPl0gXAorICogICAgIFstZSBwYW5fYWRkcmVzcyA8YWRkcmVzcz5dIFwKKyAqICAgICBbLWUgcGFpcl9waW4gPHBpbj5dIFwKKyAqICAgICBbLWUgcGFpcl9wYXNza2V5IDxwYXNza2V5Pl0gXAorICogICAgIC13IGNvbS5hbmRyb2lkLmJsdWV0b290aC50ZXN0cy9hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXN0UnVubmVyCisgKiB9CisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIEJsdWV0b290aFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFRlc3RSdW5uZXIiOworCisgICAgcHVibGljIHN0YXRpYyBpbnQgc0VuYWJsZUl0ZXJhdGlvbnMgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc0Rpc2NvdmVyYWJsZUl0ZXJhdGlvbnMgPSAxMDAwOworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNTY2FuSXRlcmF0aW9ucyA9IDEwMDA7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc0VuYWJsZVBhbkl0ZXJhdGlvbnMgPSAxMDAwOworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNQYWlySXRlcmF0aW9ucyA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNDb25uZWN0QTJkcEl0ZXJhdGlvbnMgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RJbnB1dEl0ZXJhdGlvbnMgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RQYW5JdGVyYXRpb25zID0gMTAwOworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNTdGFydFN0b3BTY29JdGVyYXRpb25zID0gMTAwOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc0RldmljZUFkZHJlc3MgPSAiIjsKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBzRGV2aWNlUGFpclBpbiA9IHsnMScsICcyJywgJzMnLCAnNCd9OworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNEZXZpY2VQYWlyUGFzc2tleSA9IDEyMzQ1NjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7CisgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCbHVldG9vdGhTdHJlc3NUZXN0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHN1aXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBCbHVldG9vdGhUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGFyZ3VtZW50cykgeworICAgICAgICBTdHJpbmcgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZW5hYmxlX2l0ZXJhdGlvbnMiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNFbmFibGVJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZGlzY292ZXJhYmxlX2l0ZXJhdGlvbnMiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNEaXNjb3ZlcmFibGVJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygic2Nhbl9pdGVyYXRpb25zIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzU2Nhbkl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJlbmFibGVfcGFuX2l0ZXJhdGlvbnMiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNFbmFibGVQYW5JdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygicGFpcl9pdGVyYXRpb25zIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzUGFpckl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJjb25uZWN0X2EyZHBfaXRlcmF0aW9ucyIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc0Nvbm5lY3RBMmRwSXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfaGVhZHNldF9pdGVyYXRpb25zIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiY29ubmVjdF9pbnB1dF9pdGVyYXRpb25zIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzQ29ubmVjdElucHV0SXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfcGFuX2l0ZXJhdGlvbnMiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNDb25uZWN0UGFuSXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoInN0YXJ0X3N0b3Bfc2NvX2l0ZXJhdGlvbnMiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNTdGFydFN0b3BTY29JdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZGV2aWNlX2FkZHJlc3MiKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7CisgICAgICAgICAgICBzRGV2aWNlQWRkcmVzcyA9IHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImRldmljZV9wYWlyX3BpbiIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBwaW4gPSBCbHVldG9vdGhEZXZpY2UuY29udmVydFBpblRvQnl0ZXModmFsKTsKKyAgICAgICAgICAgIGlmIChwaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNEZXZpY2VQYWlyUGluID0gcGluOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZGV2aWNlX3BhaXJfcGFzc2tleSIpOworICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc0RldmljZVBhaXJQYXNza2V5ID0gSW50ZWdlci5wYXJzZUludCh2YWwpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJlbmFibGVfaXRlcmF0aW9ucz0lZCIsIHNFbmFibGVJdGVyYXRpb25zKSk7CisgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiZGlzY292ZXJhYmxlX2l0ZXJhdGlvbnM9JWQiLCBzRGlzY292ZXJhYmxlSXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoInNjYW5faXRlcmF0aW9ucz0lZCIsIHNTY2FuSXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoInBhaXJfaXRlcmF0aW9ucz0lZCIsIHNQYWlySXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImNvbm5lY3RfYTJkcF9pdGVyYXRpb25zPSVkIiwgc0Nvbm5lY3RBMmRwSXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImNvbm5lY3RfaGVhZHNldF9pdGVyYXRpb25zPSVkIiwgc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImNvbm5lY3RfaW5wdXRfaXRlcmF0aW9ucz0lZCIsIHNDb25uZWN0SW5wdXRJdGVyYXRpb25zKSk7CisgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiY29ubmVjdF9wYW5faXRlcmF0aW9ucz0lZCIsIHNDb25uZWN0UGFuSXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoInN0YXJ0X3N0b3Bfc2NvX2l0ZXJhdGlvbnM9JWQiLCBzU3RhcnRTdG9wU2NvSXRlcmF0aW9ucykpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImRldmljZV9hZGRyZXNzPSVzIiwgc0RldmljZUFkZHJlc3MpKTsKKyAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJkZXZpY2VfcGFpcl9waW49JXMiLCBuZXcgU3RyaW5nKHNEZXZpY2VQYWlyUGluKSkpOworICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImRldmljZV9wYWlyX3Bhc3NrZXk9JWQiLCBzRGV2aWNlUGFpclBhc3NrZXkpKTsKKworICAgICAgICAvLyBDYWxsIG9uQ3JlYXRlIGxhc3Qgc2luY2Ugd2Ugd2FudCB0byBzZXQgdGhlIHN0YXRpYyB2YXJpYWJsZXMgZmlyc3QuCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3VtZW50cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEgYi9jb3JlL3Rlc3RzL2JsdWV0b290aHRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU1Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9ibHVldG9vdGh0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQmx1ZXRvb3RoVGVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwxNDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKKworaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFBhbjsKK2ltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQcm9maWxlOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBCbHVldG9vdGhUZXN0VXRpbHMgZXh0ZW5kcyBBc3NlcnQgeworCisgICAgLyoqIFRpbWVvdXQgZm9yIGVuYWJsZS9kaXNhYmxlIGluIG1zLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfRElTQUJMRV9USU1FT1VUID0gMjAwMDA7CisgICAgLyoqIFRpbWVvdXQgZm9yIGRpc2NvdmVyYWJsZS91bmRpc2NvdmVyYWJsZSBpbiBtcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJBQkxFX1VORElTQ09WRVJBQkxFX1RJTUVPVVQgPSA1MDAwOworICAgIC8qKiBUaW1lb3V0IGZvciBzdGFydGluZy9zdG9wcGluZyBhIHNjYW4gaW4gbXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NUT1BfU0NBTl9USU1FT1VUID0gNTAwMDsKKyAgICAvKiogVGltZW91dCBmb3IgcGFpci91bnBhaXIgaW4gbXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBSVJfVU5QQUlSX1RJTUVPVVQgPSAyMDAwMDsKKyAgICAvKiogVGltZW91dCBmb3IgY29ubmVjdGluZy9kaXNjb25uZWN0aW5nIGEgcHJvZmlsZSBpbiBtcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCA9IDIwMDAwOworICAgIC8qKiBUaW1lb3V0IHRvIHN0YXJ0IG9yIHN0b3AgYSBTQ08gY2hhbm5lbCBpbiBtcy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRfU1RPUF9TQ09fVElNRU9VVCA9IDEwMDAwOworICAgIC8qKiBUaW1lb3V0IHRvIGNvbm5lY3QgYSBwcm9maWxlIHByb3h5IGluIG1zLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1BST1hZX1RJTUVPVVQgPSA1MDAwOworICAgIC8qKiBUaW1lIGJldHdlZW4gcG9sbHMgaW4gbXMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPTExfVElNRSA9IDEwMDsKKworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRmxhZ1JlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIGludCBtRXhwZWN0ZWRGbGFncyA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IG1GaXJlZEZsYWdzID0gMDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIG1Db21wbGV0ZWRUaW1lID0gLTE7CisKKyAgICAgICAgcHVibGljIEZsYWdSZWNlaXZlcihpbnQgZXhwZWN0ZWRGbGFncykgeworICAgICAgICAgICAgbUV4cGVjdGVkRmxhZ3MgPSBleHBlY3RlZEZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRGaXJlZEZsYWdzKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1GaXJlZEZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29tcGxldGVkVGltZSgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGxldGVkVGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHNldEZpcmVkRmxhZyhpbnQgZmxhZykgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgbUZpcmVkRmxhZ3MgfD0gZmxhZzsKKyAgICAgICAgICAgICAgICBpZiAoKG1GaXJlZEZsYWdzICYgbUV4cGVjdGVkRmxhZ3MpID09IG1FeHBlY3RlZEZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBCbHVldG9vdGhSZWNlaXZlciBleHRlbmRzIEZsYWdSZWNlaXZlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfU1RBUlRFRF9GTEFHID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSWV9GSU5JU0hFRF9GTEFHID0gMSA8PCAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NT0RFX05PTkVfRkxBRyA9IDEgPDwgMjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9DT05ORUNUQUJMRV9GTEFHID0gMSA8PCAzOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRV9GTEFHID0gMSA8PCA0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfT0ZGX0ZMQUcgPSAxIDw8IDU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9UVVJOSU5HX09OX0ZMQUcgPSAxIDw8IDY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9PTl9GTEFHID0gMSA8PCA3OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PRkZfRkxBRyA9IDEgPDwgODsKKworICAgICAgICBwdWJsaWMgQmx1ZXRvb3RoUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyKGV4cGVjdGVkRmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmIChCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9ESVNDT1ZFUllfU1RBUlRFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhESVNDT1ZFUllfU1RBUlRFRF9GTEFHKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX0ZJTklTSEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKERJU0NPVkVSWV9GSU5JU0hFRF9GTEFHKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU0NBTl9NT0RFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NDQU5fTU9ERSwgLTEpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIG1vZGUpOworICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX05PTkU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU0NBTl9NT0RFX05PTkVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTQ0FOX01PREVfQ09OTkVDVEFCTEVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRV9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgeworICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhBZGFwdGVyLkVYVFJBX1NUQVRFLCAtMSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgc3RhdGUpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9PRkZfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT046CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfVFVSTklOR19PTl9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfT05fRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBQYWlyUmVjZWl2ZXIgZXh0ZW5kcyBGbGFnUmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQk9OREVEX0ZMQUcgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQk9ORElOR19GTEFHID0gMSA8PCAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTk9ORV9GTEFHID0gMSA8PCAyOworCisgICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7CisgICAgICAgIHByaXZhdGUgaW50IG1QYXNza2V5OworICAgICAgICBwcml2YXRlIGJ5dGVbXSBtUGluOworCisgICAgICAgIHB1YmxpYyBQYWlyUmVjZWl2ZXIoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHBhc3NrZXksIGJ5dGVbXSBwaW4sIGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKKworICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKKyAgICAgICAgICAgIG1QYXNza2V5ID0gcGFzc2tleTsKKyAgICAgICAgICAgIG1QaW4gPSBwaW47CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEJsdWV0b290aERldmljZS5BQ1RJT05fUEFJUklOR19SRVFVRVNULmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgaW50IHZhcmllbnQgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoRGV2aWNlLkVYVFJBX1BBSVJJTkdfVkFSSUFOVCwgLTEpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIHZhcmllbnQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFyaWVudCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5QQUlSSU5HX1ZBUklBTlRfUElOOgorICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRQaW4obVBpbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BBU1NLRVk6CisgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLnNldFBhc3NrZXkobVBhc3NrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9QQVNTS0VZX0NPTkZJUk1BVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX0NPTlNFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlLnNldFBhaXJpbmdDb25maXJtYXRpb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX09PQl9DT05TRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRSZW1vdGVPdXRPZkJhbmREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aERldmljZS5BQ1RJT05fQk9ORF9TVEFURV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9CT05EX1NUQVRFLCAtMSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgc3RhdGUpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX05PTkVfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0JPTkRJTkdfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQk9OREVEX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyIGV4dGVuZHMgRmxhZ1JlY2VpdmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RFRF9GTEFHID0gMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RJTkdfRkxBRyA9IDEgPDwgMTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPTk5FQ1RFRF9GTEFHID0gMSA8PCAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVElOR19GTEFHID0gMSA8PCAzOworCisgICAgICAgIHByaXZhdGUgQmx1ZXRvb3RoRGV2aWNlIG1EZXZpY2U7CisgICAgICAgIHByaXZhdGUgaW50IG1Qcm9maWxlOworICAgICAgICBwcml2YXRlIFN0cmluZyBtQ29ubmVjdGlvbkFjdGlvbjsKKworICAgICAgICBwdWJsaWMgQ29ubmVjdFByb2ZpbGVSZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwgaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyKGV4cGVjdGVkRmxhZ3MpOworCisgICAgICAgICAgICBtRGV2aWNlID0gZGV2aWNlOworICAgICAgICAgICAgbVByb2ZpbGUgPSBwcm9maWxlOworCisgICAgICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVDoKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BY3Rpb24gPSBCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BY3Rpb24gPSBCbHVldG9vdGhQYW4uQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25BY3Rpb24gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbkFjdGlvbiAhPSBudWxsICYmIG1Db25uZWN0aW9uQWN0aW9uLmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtRGV2aWNlLmVxdWFscyhpbnRlbnQuZ2V0UGFyY2VsYWJsZUV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9ERVZJQ0UpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFByb2ZpbGUuRVhUUkFfU1RBVEUsIC0xKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKC0xLCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0RJU0NPTk5FQ1RFRF9GTEFHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9DT05ORUNUSU5HX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQ09OTkVDVEVEX0ZMQUcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RQYW5SZWNlaXZlciBleHRlbmRzIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgeworICAgICAgICBwcml2YXRlIGludCBtUm9sZTsKKworICAgICAgICBwdWJsaWMgQ29ubmVjdFBhblJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCByb2xlLCBpbnQgZXhwZWN0ZWRGbGFncykgeworICAgICAgICAgICAgc3VwZXIoZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLlBBTiwgZXhwZWN0ZWRGbGFncyk7CisKKyAgICAgICAgICAgIG1Sb2xlID0gcm9sZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAobVJvbGUgIT0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aFBhbi5FWFRSQV9MT0NBTF9ST0xFLCAtMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1cGVyLm9uUmVjZWl2ZShjb250ZXh0LCBpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBTdGFydFN0b3BTY29SZWNlaXZlciBleHRlbmRzIEZsYWdSZWNlaXZlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURURfRkxBRyA9IDE7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURURfRkxBRyA9IDEgPDwgMTsKKworICAgICAgICBwdWJsaWMgU3RhcnRTdG9wU2NvUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgICAgIHN1cGVyKGV4cGVjdGVkRmxhZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIGlmIChBdWRpb01hbmFnZXIuQUNUSU9OX1NDT19BVURJT19TVEFURV9VUERBVEVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXRlID0gaW50ZW50LmdldEludEV4dHJhKEF1ZGlvTWFuYWdlci5FWFRSQV9TQ09fQVVESU9fU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0VSUk9SKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKEF1ZGlvTWFuYWdlci5TQ09fQVVESU9fU1RBVEVfRVJST1IsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9DT05ORUNURURfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9ESVNDT05ORUNURURfRkxBRyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyIG1TZXJ2aWNlTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IEJsdWV0b290aFByb2ZpbGUuU2VydmljZUxpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKGludCBwcm9maWxlLCBCbHVldG9vdGhQcm9maWxlIHByb3h5KSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6CisgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcCA9IChCbHVldG9vdGhBMmRwKSBwcm94eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkc2V0ID0gKEJsdWV0b290aEhlYWRzZXQpIHByb3h5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQgPSAoQmx1ZXRvb3RoSW5wdXREZXZpY2UpIHByb3h5OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFuID0gKEJsdWV0b290aFBhbikgcHJveHk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKGludCBwcm9maWxlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6CisgICAgICAgICAgICAgICAgICAgICAgICBtQTJkcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYW4gPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgTGlzdDxCcm9hZGNhc3RSZWNlaXZlcj4gbVJlY2VpdmVycyA9IG5ldyBBcnJheUxpc3Q8QnJvYWRjYXN0UmVjZWl2ZXI+KCk7CisKKyAgICBwcml2YXRlIEJ1ZmZlcmVkV3JpdGVyIG1PdXRwdXRXcml0ZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgbVRhZzsKKyAgICBwcml2YXRlIFN0cmluZyBtT3V0cHV0RmlsZTsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIEJsdWV0b290aEEyZHAgbUEyZHAgPSBudWxsOworICAgIHByaXZhdGUgQmx1ZXRvb3RoSGVhZHNldCBtSGVhZHNldCA9IG51bGw7CisgICAgcHJpdmF0ZSBCbHVldG9vdGhJbnB1dERldmljZSBtSW5wdXQgPSBudWxsOworICAgIHByaXZhdGUgQmx1ZXRvb3RoUGFuIG1QYW4gPSBudWxsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHV0aWxpdHkgaW5zdGFuY2UgZm9yIHRlc3RpbmcgQmx1ZXRvb3RoLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgorICAgICAqIEBwYXJhbSB0YWcgVGhlIGxvZyB0YWcgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgorICAgICAqLworICAgIHB1YmxpYyBCbHVldG9vdGhUZXN0VXRpbHMoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdGFnKSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgdGFnLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdXRpbGl0eSBpbnN0YW5jZSBmb3IgdGVzdGluZyBCbHVldG9vdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgYXBwbGljYXRpb24gdXNpbmcgdGhlIHV0aWxpdHkuCisgICAgICogQHBhcmFtIHRhZyBUaGUgbG9nIHRhZyBvZiB0aGUgYXBwbGljYXRpb24gdXNpbmcgdGhlIHV0aWxpdHkuCisgICAgICogQHBhcmFtIG91dHB1dEZpbGUgVGhlIHBhdGggdG8gYW4gb3V0cHV0IGZpbGUgaWYgdGhlIHV0aWxpdHkgaXMgdG8gd3JpdGUgcmVzdWx0cyB0byBhCisgICAgICogICAgICAgIHNlcGFyYXRlIGZpbGUuCisgICAgICovCisgICAgcHVibGljIEJsdWV0b290aFRlc3RVdGlscyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0YWcsIFN0cmluZyBvdXRwdXRGaWxlKSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVRhZyA9IHRhZzsKKyAgICAgICAgbU91dHB1dEZpbGUgPSBvdXRwdXRGaWxlOworCisgICAgICAgIGlmIChtT3V0cHV0RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtT3V0cHV0V3JpdGVyID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbU91dHB1dFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihuZXcgRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudmlyb25tZW50LmdldEV4dGVybmFsU3RvcmFnZURpcmVjdG9yeSgpLCBtT3V0cHV0RmlsZSksIHRydWUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhtVGFnLCAiVGVzdCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIiwgZSk7CisgICAgICAgICAgICAgICAgbU91dHB1dFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHV0aWxpdHkgaW5zdGFuY2UgYW5kIHVucmVnaXN0ZXJzIGFueSBCcm9hZGNhc3RSZWNlaXZlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHdoaWxlICghbVJlY2VpdmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUmVjZWl2ZXJzLnJlbW92ZSgwKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU91dHB1dFdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhtVGFnLCAiVGVzdCBvdXRwdXQgZmlsZSBjb3VsZCBub3QgYmUgY2xvc2VkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGVzIEJsdWV0b290aCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IEJsdWV0b290aCB3YXMgdHVybmVkIG9uIGFuZCB0aGF0IHRoZSBjb3JyZWN0CisgICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuYWJsZShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaW50IG1hc2sgPSAoQmx1ZXRvb3RoUmVjZWl2ZXIuU1RBVEVfVFVSTklOR19PTl9GTEFHIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU1RBVEVfT05fRkxBRworICAgICAgICAgICAgICAgIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0ZMQUcpOworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7CisKKyAgICAgICAgaW50IHN0YXRlID0gYWRhcHRlci5nZXRTdGF0ZSgpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT046CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGOgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmVuYWJsZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5lbmFibGUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImVuYWJsZSgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgc3RhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgRU5BQkxFX0RJU0FCTEVfVElNRU9VVCkgeworICAgICAgICAgICAgc3RhdGUgPSBhZGFwdGVyLmdldFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTgorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJlbmFibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoImVuYWJsZSgpIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZW5hYmxlKCkgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIHN0YXRlLCBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OLCBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZXMgQmx1ZXRvb3RoIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgQmx1ZXRvb3RoIHdhcyB0dXJuZWQgb2ZmIGFuZCB0aGF0IHRoZSBjb3JyZWN0CisgICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2FibGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGludCBtYXNrID0gKEJsdWV0b290aFJlY2VpdmVyLlNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcgfCBCbHVldG9vdGhSZWNlaXZlci5TVEFURV9PRkZfRkxBRworICAgICAgICAgICAgICAgIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU0NBTl9NT0RFX05PTkVfRkxBRyk7CisgICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKKyAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRCbHVldG9vdGhSZWNlaXZlcihtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBhZGFwdGVyLmdldFN0YXRlKCk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY6CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT046CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5kaXNhYmxlKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX1RVUk5JTkdfT0ZGOgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNhYmxlKCkgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBzdGF0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBFTkFCTEVfRElTQUJMRV9USU1FT1VUKSB7CisgICAgICAgICAgICBzdGF0ZSA9IGFkYXB0ZXIuZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRgorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZSgpIGNvbXBsZXRlZCBpbiAlZCBtcyIsIChmaW5pc2ggLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dCgiZGlzYWJsZSgpIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZSgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYsIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHRoZSBsb2NhbCBkZXZpY2UgaW50byBkaXNjb3ZlcmFibGUgbW9kZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCBkZXZpY2UKKyAgICAgKiBpcyBpbiBkaXNjb3ZlcmFibGUgbW9kZSBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzY292ZXJhYmxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpbnQgbWFzayA9IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEVfRkxBRzsKKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoImRpc2NvdmVyYWJsZSgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNjYW5Nb2RlID0gYWRhcHRlci5nZXRTY2FuTW9kZSgpOworICAgICAgICBpZiAoc2Nhbk1vZGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOworCisgICAgICAgIGFzc2VydEVxdWFscyhCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRSwgc2Nhbk1vZGUpOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5zZXRTY2FuTW9kZShCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUpKTsKKworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IERJU0NPVkVSQUJMRV9VTkRJU0NPVkVSQUJMRV9USU1FT1VUKSB7CisgICAgICAgICAgICBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKKyAgICAgICAgICAgIGlmIChzY2FuTW9kZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJkaXNjb3ZlcmFibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJkaXNjb3ZlcmFibGUoKSB0aW1lb3V0OiBzY2FuTW9kZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4ICIKKyAgICAgICAgICAgICAgICArICIoZXhwZWN0ZWQgMHgleCkiLCBzY2FuTW9kZSwgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFLAorICAgICAgICAgICAgICAgIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHRoZSBsb2NhbCBkZXZpY2UgaW50byBjb25uZWN0YWJsZSBvbmx5IG1vZGUgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYWwKKyAgICAgKiBkZXZpY2UgaXMgaW4gaW4gY29ubmVjdGFibGUgbW9kZSBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5kaXNjb3ZlcmFibGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGludCBtYXNrID0gQmx1ZXRvb3RoUmVjZWl2ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0ZMQUc7CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKCJ1bmRpc2NvdmVyYWJsZSgpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNjYW5Nb2RlID0gYWRhcHRlci5nZXRTY2FuTW9kZSgpOworICAgICAgICBpZiAoc2Nhbk1vZGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSwgc2Nhbk1vZGUpOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5zZXRTY2FuTW9kZShCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRSkpOworCisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgRElTQ09WRVJBQkxFX1VORElTQ09WRVJBQkxFX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIHNjYW5Nb2RlID0gYWRhcHRlci5nZXRTY2FuTW9kZSgpOworICAgICAgICAgICAgaWYgKHNjYW5Nb2RlID09IEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFCisgICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgidW5kaXNjb3ZlcmFibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJ1bmRpc2NvdmVyYWJsZSgpIHRpbWVvdXQ6IHNjYW5Nb2RlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggIgorICAgICAgICAgICAgICAgICsgIihleHBlY3RlZCAweCV4KSIsIHNjYW5Nb2RlLCBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRSwgZmlyZWRGbGFncywKKyAgICAgICAgICAgICAgICBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIGEgc2NhbiBmb3IgcmVtb3RlIGRldmljZXMgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYWwgZGV2aWNlIGlzIHNjYW5uaW5nCisgICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2NhbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaW50IG1hc2sgPSBCbHVldG9vdGhSZWNlaXZlci5ESVNDT1ZFUllfU1RBUlRFRF9GTEFHOworCisgICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZmFpbCgic3RhcnRTY2FuKCkgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7CisKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuc3RhcnREaXNjb3ZlcnkoKSk7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPCBTVEFSVF9TVE9QX1NDQU5fVElNRU9VVCkgeworICAgICAgICAgICAgaWYgKGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpICYmICgocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykpIHsKKyAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJzdGFydFNjYW4oKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJzdGFydFNjYW4oKSB0aW1lb3V0OiBpc0Rpc2NvdmVyaW5nPSViLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCisgICAgICAgICAgICAgICAgYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCksIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBhIHNjYW4gZm9yIHJlbW90ZSBkZXZpY2VzIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsIGRldmljZSBpcyBub3Qgc2Nhbm5pbmcKKyAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcFNjYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGludCBtYXNrID0gQmx1ZXRvb3RoUmVjZWl2ZXIuRElTQ09WRVJZX0ZJTklTSEVEX0ZMQUc7CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKCJzdG9wU2NhbigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRGlzY292ZXJpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRCbHVldG9vdGhSZWNlaXZlcihtYXNrKTsKKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5jYW5jZWxEaXNjb3ZlcnkoKSk7CisKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPCBTVEFSVF9TVE9QX1NDQU5fVElNRU9VVCkgeworICAgICAgICAgICAgaWYgKCFhZGFwdGVyLmlzRGlzY292ZXJpbmcoKSAmJiAoKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spKSB7CisgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgic3RvcFNjYW4oKSBjb21wbGV0ZWQgaW4gJWQgbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKSAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJzdG9wU2NhbigpIHRpbWVvdXQ6IGlzRGlzY292ZXJpbmc9JWIsIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBhZGFwdGVyLmlzRGlzY292ZXJpbmcoKSwgZmlyZWRGbGFncywgbWFzaykpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlcyBQQU4gdGV0aGVyaW5nIG9uIHRoZSBsb2NhbCBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0ZXRoZXJpbmcgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuYWJsZVBhbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICAgICAgaWYgKG1QYW4gPT0gbnVsbCkgbVBhbiA9IChCbHVldG9vdGhQYW4pIGNvbm5lY3RQcm94eShhZGFwdGVyLCBCbHVldG9vdGhQcm9maWxlLlBBTik7CisgICAgICAgIGFzc2VydE5vdE51bGwobVBhbik7CisKKyAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBtUGFuLnNldEJsdWV0b290aFRldGhlcmluZyh0cnVlKTsKKyAgICAgICAgbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGFzc2VydFRydWUobVBhbi5pc1RldGhlcmluZ09uKCkpOworCisgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImVuYWJsZVBhbigpIGNvbXBsZXRlZCBpbiAlZCBtcyIsIChzdG9wIC0gc3RhcnQpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzYWJsZXMgUEFOIHRldGhlcmluZyBvbiB0aGUgbG9jYWwgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGV0aGVyaW5nIGlzCisgICAgICogZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlUGFuKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICBpZiAobVBhbiA9PSBudWxsKSBtUGFuID0gKEJsdWV0b290aFBhbikgY29ubmVjdFByb3h5KGFkYXB0ZXIsIEJsdWV0b290aFByb2ZpbGUuUEFOKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtUGFuKTsKKworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIG1QYW4uc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKGZhbHNlKTsKKyAgICAgICAgbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGFzc2VydEZhbHNlKG1QYW4uaXNUZXRoZXJpbmdPbigpKTsKKworICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJkaXNhYmxlUGFuKCkgY29tcGxldGVkIGluICVkIG1zIiwgKHN0b3AgLSBzdGFydCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWF0ZXMgYSBwYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGRldmljZXMgYXJlIHBhaXJlZAorICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwYXNza2V5IFRoZSBwYWlyaW5nIHBhc3NrZXkgaWYgcGFpcmluZyByZXF1aXJlcyBhIHBhc3NrZXkuIEFueSB2YWx1ZSBpZiBub3QuCisgICAgICogQHBhcmFtIHBpbiBUaGUgcGFpcmluZyBwaW4gaWYgcGFpcmluZyByZXF1aXJlcyBhIHBpbi4gQW55IHZhbHVlIGlmIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHBhc3NrZXksIGJ5dGVbXSBwaW4pIHsKKyAgICAgICAgcGFpck9yQWNjZXB0UGFpcihhZGFwdGVyLCBkZXZpY2UsIHBhc3NrZXksIHBpbiwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0cyBhIHBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGV2aWNlcyBhcmUgcGFpcmVkCisgICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICogQHBhcmFtIHBhc3NrZXkgVGhlIHBhaXJpbmcgcGFzc2tleSBpZiBwYWlyaW5nIHJlcXVpcmVzIGEgcGFzc2tleS4gQW55IHZhbHVlIGlmIG5vdC4KKyAgICAgKiBAcGFyYW0gcGluIFRoZSBwYWlyaW5nIHBpbiBpZiBwYWlyaW5nIHJlcXVpcmVzIGEgcGluLiBBbnkgdmFsdWUgaWYgbm90LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdFBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcGFzc2tleSwKKyAgICAgICAgICAgIGJ5dGVbXSBwaW4pIHsKKyAgICAgICAgcGFpck9yQWNjZXB0UGFpcihhZGFwdGVyLCBkZXZpY2UsIHBhc3NrZXksIHBpbiwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCBieSB7QGxpbmsgI3BhaXIoQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlLCBpbnQsIGJ5dGVbXSl9IGFuZAorICAgICAqIHtAbGluayAjYWNjZXB0UGFpcihCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UsIGludCwgYnl0ZVtdKX0gdG8gZWl0aGVyIHBhaXIgb3IgYWNjZXB0CisgICAgICogYSBwYWlyaW5nIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBwYXNza2V5IFRoZSBwYWlyaW5nIHBhc3NrZXkgaWYgcGFpcmluZyByZXF1aXJlcyBhIHBhc3NrZXkuIEFueSB2YWx1ZSBpZiBub3QuCisgICAgICogQHBhcmFtIHBpbiBUaGUgcGFpcmluZyBwaW4gaWYgcGFpcmluZyByZXF1aXJlcyBhIHBpbi4gQW55IHZhbHVlIGlmIG5vdC4KKyAgICAgKiBAcGFyYW0gc2hvdWxkUGFpciBXaGV0aGVyIHRvIHBhaXIgb3IgYWNjZXB0IHRoZSBwYWlyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwYWlyT3JBY2NlcHRQYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHBhc3NrZXksCisgICAgICAgICAgICBieXRlW10gcGluLCBib29sZWFuIHNob3VsZFBhaXIpIHsKKyAgICAgICAgaW50IG1hc2sgPSBQYWlyUmVjZWl2ZXIuU1RBVEVfQk9ORElOR19GTEFHIHwgUGFpclJlY2VpdmVyLlNUQVRFX0JPTkRFRF9GTEFHOworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lOworICAgICAgICBpZiAoc2hvdWxkUGFpcikgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInBhaXIoZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiYWNjZXB0UGFpcihkZXZpY2U9JXMpIiwgZGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBibHVldG9vdGggbm90IGVuYWJsZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBQYWlyUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRQYWlyUmVjZWl2ZXIoZGV2aWNlLCBwYXNza2V5LCBwaW4sIG1hc2spOworCisgICAgICAgIGludCBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgorICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZFBhaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UuY3JlYXRlQm9uZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRDoKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBQQUlSX1VOUEFJUl9USU1FT1VUKSB7CisgICAgICAgICAgICBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIGEgcGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZXZpY2VzIGFyZSB1bnBhaXJlZAorICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVucGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKKyAgICAgICAgaW50IG1hc2sgPSBQYWlyUmVjZWl2ZXIuU1RBVEVfTk9ORV9GTEFHOworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgidW5wYWlyKGRldmljZT0lcykiLCBkZXZpY2UpOworCisgICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBibHVldG9vdGggbm90IGVuYWJsZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBQYWlyUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRQYWlyUmVjZWl2ZXIoZGV2aWNlLCAwLCBudWxsLCBtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBkZXZpY2UuZ2V0Qm9uZFN0YXRlKCk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ESU5HOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkZXZpY2UucmVtb3ZlQm9uZCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgorICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFBBSVJfVU5QQUlSX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UuZ2V0Qm9uZFN0YXRlKCkgPT0gQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORQorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIGEgcHJvZmlsZSBmcm9tIHRoZSBsb2NhbCBkZXZpY2UgdG8gYSByZW1vdGUgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgICogcHJvZmlsZSBpcyBjb25uZWN0ZWQgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICogQHBhcmFtIHByb2ZpbGUgVGhlIHByb2ZpbGUgdG8gY29ubmVjdC4gT25lIG9mIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0EyRFB9LAorICAgICAqIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0hFQURTRVR9LCBvciB7QGxpbmsgQmx1ZXRvb3RoUHJvZmlsZSNJTlBVVF9ERVZJQ0V9LgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSB0byBwcmludGVkIGluIHRoZSBsb2dzLiAgSWYgbnVsbCwgd2lsbCBiZQorICAgICAqICJjb25uZWN0UHJvZmlsZShwcm9maWxlPSZsdDtwcm9maWxlJmd0OywgZGV2aWNlPSZsdDtkZXZpY2UmZ3Q7KSIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25uZWN0UHJvZmlsZShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwcm9maWxlLAorICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImNvbm5lY3RQcm9maWxlKHByb2ZpbGU9JWQsIGRldmljZT0lcykiLCBwcm9maWxlLCBkZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGludCBtYXNrID0gKENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfQ09OTkVDVElOR19GTEFHCisgICAgICAgICAgICAgICAgfCBDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHKTsKKyAgICAgICAgbG9uZyBzdGFydCA9IC0xOworCisgICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBibHVldG9vdGggbm90IGVuYWJsZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgZGV2aWNlIG5vdCBwYWlyZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBCbHVldG9vdGhQcm9maWxlIHByb3h5ID0gY29ubmVjdFByb3h5KGFkYXB0ZXIsIHByb2ZpbGUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHByb3h5KTsKKworICAgICAgICBDb25uZWN0UHJvZmlsZVJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Q29ubmVjdFByb2ZpbGVSZWNlaXZlcihkZXZpY2UsIHByb2ZpbGUsIG1hc2spOworCisgICAgICAgIGludCBzdGF0ZSA9IHByb3h5LmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuQTJEUCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCgoQmx1ZXRvb3RoQTJkcClwcm94eSkuY29ubmVjdChkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoKChCbHVldG9vdGhIZWFkc2V0KXByb3h5KS5jb25uZWN0KGRldmljZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCgoQmx1ZXRvb3RoSW5wdXREZXZpY2UpcHJveHkpLmNvbm5lY3QoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gcHJveHkuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQKKyAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKKyAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBzdGF0ZSwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0cyBhIHByb2ZpbGUgYmV0d2VlbiB0aGUgbG9jYWwgZGV2aWNlIGFuZCBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUKKyAgICAgKiB0aGF0IHRoZSBwcm9maWxlIGlzIGRpc2Nvbm5lY3RlZCBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKiBAcGFyYW0gcHJvZmlsZSBUaGUgcHJvZmlsZSB0byBkaXNjb25uZWN0LiBPbmUgb2Yge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjQTJEUH0sCisgICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSEVBRFNFVH0sIG9yIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0lOUFVUX0RFVklDRX0uCisgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIHByaW50ZWQgaW4gdGhlIGxvZ3MuICBJZiBudWxsLCB3aWxsIGJlCisgICAgICogImNvbm5lY3RQcm9maWxlKHByb2ZpbGU9Jmx0O3Byb2ZpbGUmZ3Q7LCBkZXZpY2U9Jmx0O2RldmljZSZndDspIgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RQcm9maWxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsCisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICBpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdFByb2ZpbGUocHJvZmlsZT0lZCwgZGV2aWNlPSVzKSIsIHByb2ZpbGUsIGRldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG1hc2sgPSAoQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNUSU5HX0ZMQUcKKyAgICAgICAgICAgICAgICB8IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcpOworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEJsdWV0b290aFByb2ZpbGUgcHJveHkgPSBjb25uZWN0UHJveHkoYWRhcHRlciwgcHJvZmlsZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOworCisgICAgICAgIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UHJvZmlsZVJlY2VpdmVyKGRldmljZSwgcHJvZmlsZSwgbWFzayk7CisKKyAgICAgICAgaW50IHN0YXRlID0gcHJveHkuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlID09IEJsdWV0b290aFByb2ZpbGUuQTJEUCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCgoQmx1ZXRvb3RoQTJkcClwcm94eSkuZGlzY29ubmVjdChkZXZpY2UpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoKChCbHVldG9vdGhIZWFkc2V0KXByb3h5KS5kaXNjb25uZWN0KGRldmljZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCgoQmx1ZXRvb3RoSW5wdXREZXZpY2UpcHJveHkpLmRpc2Nvbm5lY3QoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCkgeworICAgICAgICAgICAgc3RhdGUgPSBwcm94eS5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgeworICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOworICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAorICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBQQU5VIHRvIGEgcmVtb3RlIE5BUCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBQQU5VIGlzIGNvbm5lY3RlZCBhbmQgdGhhdAorICAgICAqIHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IGEgcmVtb3RlIFBBTlUgY29ubmVjdHMgdG8gdGhlIGxvY2FsIE5BUCBjb3JyZWN0bHkgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucworICAgICAqIHdlcmUgYnJvYWRjYXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCisgICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmNvbWluZ1BhbkNvbm5lY3Rpb24oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IGFuZAorICAgICAqIHtAbGluayAjaW5jb21pbmdQYW5Db25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IHRvIGVpdGhlciBjb25uZWN0IHRvIGEKKyAgICAgKiByZW1vdGUgTkFQIG9yIHZlcmlmeSB0aGF0IGEgcmVtb3RlIGRldmljZSBjb25uZWN0ZWQgdG8gdGhlIGxvY2FsIE5BUC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICogQHBhcmFtIGNvbm5lY3QgSWYgdGhlIG1ldGhvZCBzaG91bGQgaW5pdGlhdGUgdGhlIGNvbm5lY3Rpb24gKGlzIFBBTlUpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RQYW5PckluY29taW5nUGFuQ29ubmVjdGlvbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsCisgICAgICAgICAgICBib29sZWFuIGNvbm5lY3QpIHsKKyAgICAgICAgbG9uZyBzdGFydCA9IC0xOworICAgICAgICBpbnQgbWFzaywgcm9sZTsKKyAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgICAgICAgaWYgKGNvbm5lY3QpIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb25uZWN0UGFuKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICAgICAgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHIHwKKyAgICAgICAgICAgICAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNUSU5HX0ZMQUcpOworICAgICAgICAgICAgcm9sZSA9IEJsdWV0b290aFBhbi5MT0NBTF9QQU5VX1JPTEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiaW5jb21pbmdQYW5Db25uZWN0aW9uKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICAgICAgbWFzayA9IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfQ09OTkVDVEVEX0ZMQUc7CisgICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX05BUF9ST0xFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOworICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOworICAgICAgICBDb25uZWN0UGFuUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBtYXNrKTsKKworICAgICAgICBpbnQgc3RhdGUgPSBtUGFuLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNUSU5HOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaSgiQlQiLCAiY29ubmVjdCB0byBwYW4iKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtUGFuLmNvbm5lY3QoZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIHN0YXRlID0gbVBhbi5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVECisgICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCVzKSIsCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0cyB0aGUgUEFOVSBmcm9tIGEgcmVtb3RlIE5BUCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBQQU5VIGlzIGRpc2Nvbm5lY3RlZAorICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGRpc2Nvbm5lY3RGcm9tUmVtb3RlT3JWZXJpZnlDb25uZWN0TmFwKGFkYXB0ZXIsIGRldmljZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgYSByZW1vdGUgUEFOVSBkaXNjb25uZWN0cyBmcm9tIHRoZSBsb2NhbCBOQVAgY29ycmVjdGx5IGFuZCB0aGF0IHRoZSBjb3JyZWN0CisgICAgICogYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgeworICAgICAgICBkaXNjb25uZWN0RnJvbVJlbW90ZU9yVmVyaWZ5Q29ubmVjdE5hcChhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgYnkge0BsaW5rICNkaXNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IGFuZAorICAgICAqIHtAbGluayAjaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9IHRvIGVpdGhlciBkaXNjb25uZWN0CisgICAgICogZnJvbSBhIHJlbW90ZSBOQVAgb3IgdmVyaWZ5IHRoYXQgYSByZW1vdGUgZGV2aWNlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBsb2NhbCBOQVAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBkaXNjb25uZWN0IFdoZXRoZXIgdGhlIG1ldGhvZCBzaG91bGQgY29ubmVjdCBvciB2ZXJpZnkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3RGcm9tUmVtb3RlT3JWZXJpZnlDb25uZWN0TmFwKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwKKyAgICAgICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gZGlzY29ubmVjdCkgeworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIGludCBtYXNrLCByb2xlOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBpZiAoZGlzY29ubmVjdCkgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImRpc2Nvbm5lY3RQYW4oZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgICAgICBtYXNrID0gKENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcgfAorICAgICAgICAgICAgICAgICAgICBDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyk7CisgICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJpbmNvbWluZ1BhbkRpc2Nvbm5lY3Rpb24oZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgICAgICBtYXNrID0gQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNURURfRkxBRzsKKyAgICAgICAgICAgIHJvbGUgPSBCbHVldG9vdGhQYW4uTE9DQUxfTkFQX1JPTEU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgbVBhbiA9IChCbHVldG9vdGhQYW4pIGNvbm5lY3RQcm94eShhZGFwdGVyLCBCbHVldG9vdGhQcm9maWxlLlBBTik7CisgICAgICAgIGFzc2VydE5vdE51bGwobVBhbik7CisgICAgICAgIENvbm5lY3RQYW5SZWNlaXZlciByZWNlaXZlciA9IGdldENvbm5lY3RQYW5SZWNlaXZlcihkZXZpY2UsIHJvbGUsIG1hc2spOworCisgICAgICAgIGludCBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBpZiAocm9sZSA9PSBCbHVldG9vdGhQYW4uTE9DQUxfUEFOVV9ST0xFKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobVBhbi5kaXNjb25uZWN0KGRldmljZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVElORzoKKyAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX0RJU0NPTk5FQ1RfUFJPRklMRV9USU1FT1VUKSB7CisgICAgICAgICAgICBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoSW5wdXREZXZpY2UuU1RBVEVfRElTQ09OTkVDVEVECisgICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7CisgICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7CisgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKKyAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCVzKSIsCisgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRCwgZmlyZWRGbGFncywgbWFzaykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgU0NPIGNoYW5uZWwgdXNpbmcge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3N0YXJ0Qmx1ZXRvb3RoU2NvKCl9IGFuZCBjaGVja3MKKyAgICAgKiB0byBtYWtlIHN1cmUgdGhhdCB0aGUgY2hhbm5lbCBpcyBvcGVuZWQgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgorICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN0YXJ0U3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyBhIFNDTyBjaGFubmVsIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciNzdG9wQmx1ZXRvb3RoU2NvKCl9IGFuZCBjaGVja3MKKyAgICAgKiAgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNoYW5uZWwgaXMgY2xvc2VkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN0YXJ0U3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UsIGZhbHNlKTsKKyAgICB9CisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCBmb3Ige0BsaW5rICNzdGFydFNjbyhCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSBhbmQKKyAgICAgKiB7QGxpbmsgI3N0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgorICAgICAqIEBwYXJhbSBpc1N0YXJ0IFdoZXRoZXIgdGhlIFNDTyBjaGFubmVsIHNob3VsZCBiZSBvcGVuZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0U3RvcFNjbyhCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGJvb2xlYW4gaXNTdGFydCkgeworICAgICAgICBsb25nIHN0YXJ0ID0gLTE7CisgICAgICAgIGludCBtYXNrOworICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgICAgICBpZiAoaXNTdGFydCkgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInN0YXJ0U2NvKGRldmljZT0lcykiLCBkZXZpY2UpOworICAgICAgICAgICAgbWFzayA9IFN0YXJ0U3RvcFNjb1JlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoInN0b3BTY28oZGV2aWNlPSVzKSIsIGRldmljZSk7CisgICAgICAgICAgICBtYXNrID0gU3RhcnRTdG9wU2NvUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgYmx1ZXRvb3RoIG5vdCBlbmFibGVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBub3QgcGFpcmVkIiwgbWV0aG9kTmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgQXVkaW9NYW5hZ2VyIG1hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFuYWdlcik7CisKKyAgICAgICAgaWYgKCFtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvQXZhaWxhYmxlT2ZmQ2FsbCgpKSB7CisgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IFNDTyIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNTY29PbiA9IG1hbmFnZXIuaXNCbHVldG9vdGhTY29PbigpOworICAgICAgICBpZiAoaXNTdGFydCA9PSBpc1Njb09uKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTdGFydFN0b3BTY29SZWNlaXZlciByZWNlaXZlciA9IGdldFN0YXJ0U3RvcFNjb1JlY2VpdmVyKG1hc2spOworICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBpZiAoaXNTdGFydCkgeworICAgICAgICAgICAgbWFuYWdlci5zdGFydEJsdWV0b290aFNjbygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFuYWdlci5zdG9wQmx1ZXRvb3RoU2NvKCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFNUQVJUX1NUT1BfU0NPX1RJTUVPVVQpIHsKKyAgICAgICAgICAgIGlzU2NvT24gPSBtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvT24oKTsKKyAgICAgICAgICAgIGlmIChpc1N0YXJ0ID09IGlzU2NvT24gJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKKyAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKKyAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOworICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IG9uPSViIChleHBlY3RlZCAlYiksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKKyAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBpc1Njb09uLCBpc1N0YXJ0LCBmaXJlZEZsYWdzLCBtYXNrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RyaW5nIHRvIHRoZSBsb2djYXQgYW5kIGEgZmlsZSBpZiBhIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFRoZSBzdHJpbmcgdG8gYmUgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU91dHB1dChTdHJpbmcgcykgeworICAgICAgICBMb2cuaShtVGFnLCBzKTsKKyAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtT3V0cHV0V3JpdGVyLndyaXRlKHMgKyAiXG4iKTsKKyAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncobVRhZywgIkNvdWxkIG5vdCB3cml0ZSB0byBvdXRwdXQgZmlsZSIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLCBTdHJpbmdbXSBhY3Rpb25zKSB7CisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGFjdGlvbjogYWN0aW9ucykgeworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihhY3Rpb24pOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIsIGZpbHRlcik7CisgICAgICAgIG1SZWNlaXZlcnMuYWRkKHJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJsdWV0b290aFJlY2VpdmVyIGdldEJsdWV0b290aFJlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX0ZJTklTSEVELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0RJU0NPVkVSWV9TVEFSVEVELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NDQU5fTU9ERV9DSEFOR0VELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUR9OworICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IG5ldyBCbHVldG9vdGhSZWNlaXZlcihleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyUmVjZWl2ZXIgZ2V0UGFpclJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluLAorICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHsKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRH07CisgICAgICAgIFBhaXJSZWNlaXZlciByZWNlaXZlciA9IG5ldyBQYWlyUmVjZWl2ZXIoZGV2aWNlLCBwYXNza2V5LCBwaW4sIGV4cGVjdGVkRmxhZ3MpOworICAgICAgICBhZGRSZWNlaXZlcihyZWNlaXZlciwgYWN0aW9ucyk7CisgICAgICAgIHJldHVybiByZWNlaXZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgZ2V0Q29ubmVjdFByb2ZpbGVSZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcHJvZmlsZSwKKyAgICAgICAgICAgIGludCBleHBlY3RlZEZsYWdzKSB7CisgICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7CisgICAgICAgICAgICAgICAgQmx1ZXRvb3RoQTJkcC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VELAorICAgICAgICAgICAgICAgIEJsdWV0b290aEhlYWRzZXQuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwKKyAgICAgICAgICAgICAgICBCbHVldG9vdGhJbnB1dERldmljZS5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEfTsKKyAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyKGRldmljZSwgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb25uZWN0UGFuUmVjZWl2ZXIgZ2V0Q29ubmVjdFBhblJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCByb2xlLAorICAgICAgICAgICAgaW50IGV4cGVjdGVkRmxhZ3MpIHsKKyAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHtCbHVldG9vdGhQYW4uQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRH07CisgICAgICAgIENvbm5lY3RQYW5SZWNlaXZlciByZWNlaXZlciA9IG5ldyBDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdGFydFN0b3BTY29SZWNlaXZlciBnZXRTdGFydFN0b3BTY29SZWNlaXZlcihpbnQgZXhwZWN0ZWRGbGFncykgeworICAgICAgICBTdHJpbmdbXSBhY3Rpb25zID0ge0F1ZGlvTWFuYWdlci5BQ1RJT05fU0NPX0FVRElPX1NUQVRFX0NIQU5HRUR9OworICAgICAgICBTdGFydFN0b3BTY29SZWNlaXZlciByZWNlaXZlciA9IG5ldyBTdGFydFN0b3BTY29SZWNlaXZlcihleHBlY3RlZEZsYWdzKTsKKyAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOworICAgICAgICByZXR1cm4gcmVjZWl2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyKSB7CisgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihyZWNlaXZlcik7CisgICAgICAgIG1SZWNlaXZlcnMucmVtb3ZlKHJlY2VpdmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJsdWV0b290aFByb2ZpbGUgY29ubmVjdFByb3h5KEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgaW50IHByb2ZpbGUpIHsKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuQTJEUDoKKyAgICAgICAgICAgICAgICBpZiAobUEyZHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUEyZHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgaWYgKG1IZWFkc2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1IZWFkc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtSW5wdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKKyAgICAgICAgICAgICAgICBpZiAobVBhbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtUGFuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYWRhcHRlci5nZXRQcm9maWxlUHJveHkobUNvbnRleHQsIG1TZXJ2aWNlTGlzdGVuZXIsIHByb2ZpbGUpOworICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuQTJEUDoKKyAgICAgICAgICAgICAgICB3aGlsZSAobUEyZHAgPT0gbnVsbCAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX1BST1hZX1RJTUVPVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwOworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6CisgICAgICAgICAgICAgICAgd2hpbGUgKG1IZWFkc2V0ID09IG51bGwgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9QUk9YWV9USU1FT1VUKSB7CisgICAgICAgICAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldDsKKyAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6CisgICAgICAgICAgICAgICAgd2hpbGUgKG1JbnB1dCA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0OworICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlBBTjoKKyAgICAgICAgICAgICAgICB3aGlsZSAobVBhbiA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbVBhbjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2xlZXAobG9uZyB0aW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAodGltZSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWQubWsgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGIwMmQ5MDQuLjAwZjQ3ZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWQubWsKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZC5tawpAQCAtMTIsNyArMTIsNyBAQAogCSQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgRW5hYmxlZFRlc3RBcHAvc3JjKQogCiBMT0NBTF9EWF9GTEFHUyA6PSAtLWNvcmUtbGlicmFyeQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IGNvcmUtdGVzdHMgYW5kcm9pZC1jb21tb24gZnJhbWV3b3Jrcy1jb3JlLXV0aWwtbGliCitMT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gY29yZS10ZXN0cyBhbmRyb2lkLWNvbW1vbiBmcmFtZXdvcmtzLWNvcmUtdXRpbC1saWIgbW9ja3dlYnNlcnZlcgogTE9DQUxfSkFWQV9MSUJSQVJJRVMgOj0gYW5kcm9pZC50ZXN0LnJ1bm5lcgogTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEZyYW1ld29ya3NDb3JlVGVzdHMKIApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZmFkZjFlYy4uOGUyZDkyNSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC05OCw2ICs5OCw5IEBACiAgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5BU0VDX1JFTkFNRSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlNIVVRET1dOIiAvPgogCisgICAgPCEtLSBhY2Nlc3NpYmlsaXR5IHRlc3QgcGVybWlzc2lvbnMgLS0+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRVRSSUVWRV9XSU5ET1dfQ09OVEVOVCIgLz4KKwogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOnRoZW1lPSJAc3R5bGUvVGhlbWUiPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC52aWV3LlZpZXdBdHRhY2hUZXN0QWN0aXZpdHkiIGFuZHJvaWQ6bGFiZWw9IlZpZXcgQXR0YWNoIFRlc3QiPgpAQCAtMTAzNSwxMiArMTAzOCw2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPHNlcnZpY2UgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlUZXN0U2VydmljZSI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9zZXJ2aWNlPgotCiAgICAgICAgIDxzZXJ2aWNlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC53ZWJraXQuQWNjZXNzaWJpbGl0eUluamVjdG9yVGVzdCRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYWNjZXNzaWJpbGl0eXNlcnZpY2UuQWNjZXNzaWJpbGl0eVNlcnZpY2UiIC8+CkBAIC0xMjMxLDE0ICsxMjI4LDE2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5JbnRlcnJvZ2F0aW9uQWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkZSQU1FV09SS19JTlNUUlVNRU5UQVRJT05fVEVTVCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKwogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCiAgICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzIgogICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRnJhbWV3b3JrcyBDb3JlIFRlc3RzIiAvPgotCi0gICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aFRlc3RSdW5uZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzIgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQmx1ZXRvb3RoIFRlc3RzIiAvPgotCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL2xheW91dC9pbnRlcnJvZ2F0aW9uX2FjdGl2aXR5LnhtbCBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9sYXlvdXQvaW50ZXJyb2dhdGlvbl9hY3Rpdml0eS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkOTY1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy9sYXlvdXQvaW50ZXJyb2dhdGlvbl9hY3Rpdml0eS54bWwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm9vdCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgICAgID4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b24xIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjEiCisgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uMiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yIgorICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMyIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uNCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b240IgorICAgICAgICAvPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uNSIKKyAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b242IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjYiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbjciCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uNyIKKyAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b244IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjgiCisgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uOSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b245IgorICAgICAgICAvPgorICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDgwNzM4NmEuLmY1MWIwOGUgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTE3LDQgKzExNywxNiBAQAogCiAgICAgPHN0cmluZyBuYW1lPSJzZWFyY2hhYmxlX2xhYmVsIj5TZWFyY2hNYW5hZ2VyIFRlc3Q8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlYXJjaGFibGVfaGludCI+QSBzZWFyY2ggaGludDwvc3RyaW5nPgorCisgICAgPCEtLSBJbnRlcnJvZ2F0aW9uQWN0aXZpdHkgLS0+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b24xIj5CdXR0b24xPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b24yIj5CdXR0b24yPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b24zIj5CdXR0b24zPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b240Ij5CdXR0b240PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b241Ij5CdXR0b241PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b242Ij5CdXR0b242PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b243Ij5CdXR0b243PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b244Ij5CdXR0b244PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b245Ij5CdXR0b245PC9zdHJpbmc+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSW50ZXJyb2dhdGlvbkFjdGl2aXR5LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9JbnRlcnJvZ2F0aW9uQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwNTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYWNjZXNzaWJpbGl0eXNlcnZpY2UvSW50ZXJyb2dhdGlvbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKKworLyoqCisgKiBBY3Rpdml0eSBmb3IgdGVzdGluZyB0aGUgYWNjZXNzaWJpbGl0eSBBUElzIGZvciAiaW50ZXJyb2dhdGlvbiIgb2YKKyAqIHRoZSBzY3JlZW4gY29udGVudC4gVGhlc2UgQVBJcyBhbGxvdyBleHBsb3JpbmcgdGhlIHNjcmVlbiBhbmQKKyAqIHJlcXVlc3RpbmcgYW4gYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCBvbiBhIGdpdmVuIHZpZXcgZnJvbSBhbgorICogQWNjZXNzaWlibGl0eVNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcnJvZ2F0aW9uQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmludGVycm9nYXRpb25fYWN0aXZpdHkpOworCisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbjUpLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLmJ1dHRvbjUpLnNldE9uTG9uZ0NsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25Mb25nQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uTG9uZ0NsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9JbnRlcnJvZ2F0aW9uQWN0aXZpdHlUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9JbnRlcnJvZ2F0aW9uQWN0aXZpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkNTM0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2FjY2Vzc2liaWxpdHlzZXJ2aWNlL0ludGVycm9nYXRpb25BY3Rpdml0eVRlc3QuamF2YQpAQCAtMCwwICsxLDU1NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX0ZPQ1VTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX1NFTEVDVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9GT0NVUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU5vZGVJbmZvLkFDVElPTl9TRUxFQ1Q7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy5SOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVzdC5BY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlOb2RlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CisKKy8qKgorICogQWN0aXZpdHkgZm9yIHRlc3RpbmcgdGhlIGFjY2Vzc2liaWxpdHkgQVBJcyBmb3IgImludGVycm9nYXRpb24iIG9mCisgKiB0aGUgc2NyZWVuIGNvbnRlbnQuIFRoZXNlIEFQSXMgYWxsb3cgZXhwbG9yaW5nIHRoZSBzY3JlZW4gYW5kCisgKiByZXF1ZXN0aW5nIGFuIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gYSBnaXZlbiB2aWV3IGZyb20gYW4KKyAqIEFjY2Vzc2lpYmxpdHlTZXJ2aWNlLgorICovCitwdWJsaWMgY2xhc3MgSW50ZXJyb2dhdGlvbkFjdGl2aXR5VGVzdAorICAgICAgICBleHRlbmRzIEFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyPEludGVycm9nYXRpb25BY3Rpdml0eT4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIExPR19UQUcgPSAiSW50ZXJyb2dhdGlvbkFjdGl2aXR5VGVzdCI7CisKKyAgICAvLyBUaW1lb3V0IGJlZm9yZSBnaXZlIHVwIHdhaXQgZm9yIHRoZSBzeXN0ZW0gdG8gcHJvY2VzcyBhbiBhY2Nlc3NpYmlsaXR5IHNldHRpbmcgY2hhbmdlLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX1BST1BBR0FURV9BQ0NFU1NJQkxJVFlfU0VUVElORyA9IDIwMDA7CisKKyAgICAvLyBIZWxwZXJzIHRvIGZpZ3VyZSBvdXQgdGhlIGZpcnN0IGFuZCBsYXN0IHRlc3QgbWV0aG9kcworICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgbGFjayBvZiBzdWNoIHN1cHBvcnQgaW4gSlVuaXQzCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNUZXN0TWV0aG9kQ291bnQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNFeGVjdXRlZFRlc3RNZXRob2RDb3VudDsKKworICAgIC8vIEhhbmRsZSB0byBhIGNvbm5lY3Rpb24gdG8gdGhlIEFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZQorICAgIHByaXZhdGUgc3RhdGljIElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gc0Nvbm5lY3Rpb247CisKKyAgICAvLyBUaGUgbGFzdCByZWNlaXZlZCBhY2Nlc3NpYmlsaXR5IGV2ZW50CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQWNjZXNzaWJpbGl0eUV2ZW50IHNMYXN0Rm9jdXNBY2Nlc3NpYmlsaXR5RXZlbnQ7CisKKyAgICBwdWJsaWMgSW50ZXJyb2dhdGlvbkFjdGl2aXR5VGVzdCgpIHsKKyAgICAgICAgc3VwZXIoSW50ZXJyb2dhdGlvbkFjdGl2aXR5LmNsYXNzKTsKKyAgICAgICAgc1Rlc3RNZXRob2RDb3VudCA9IGdldFRlc3RNZXRob2RDb3VudCgpOworICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9CisgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJ1dHRvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYnV0dG9uLmdldENoaWxkQ291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIGJvdW5kcworICAgICAgICAgICAgUmVjdCBib3VuZHMgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgYnV0dG9uLmdldEJvdW5kc0luUGFyZW50KGJvdW5kcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYm91bmRzLmxlZnQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJvdW5kcy50b3ApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDczLCBib3VuZHMucmlnaHQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQ4LCBib3VuZHMuYm90dG9tKTsKKworICAgICAgICAgICAgLy8gY2hhciBzZXF1ZW5jZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmZyYW1ld29ya3MuY29yZXRlc3RzIiwgYnV0dG9uLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbmRyb2lkLndpZGdldC5CdXR0b24iLCBidXR0b24uZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJCdXR0b241IiwgYnV0dG9uLmdldFRleHQoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGJ1dHRvbi5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7CisKKyAgICAgICAgICAgIC8vIGJvb2xlYW4gYXR0cmlidXRlcworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNGb2N1c2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0NsaWNrYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc0ZvY3VzZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0NsaWNrYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc1Bhc3N3b3JkKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzU2VsZWN0ZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNDaGVja2FibGUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNDaGVja2VkKCkpOworCisgICAgICAgICAgICAvLyBhY3Rpb25zCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQUNUSU9OX0ZPQ1VTIHwgQUNUSU9OX1NFTEVDVCB8IEFDVElPTl9DTEVBUl9TRUxFQ1RJT04sCisgICAgICAgICAgICAgICAgYnV0dG9uLmdldEFjdGlvbnMoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGFwc2VkVGltZU1pbGxpcyArICJtcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3VGV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBiZWZvcmVDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBicmluZyB1cCB0aGUgYWN0aXZpdHkKKyAgICAgICAgICAgIGdldEFjdGl2aXR5KCk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgYSB2aWV3IGJ5IHRleHQKKyAgICAgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBidXR0b25zID0KKyAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0SW5BY3RpdmVXaW5kb3coImJ1dHRvIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOSwgYnV0dG9ucy5zaXplKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydFRpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgInRlc3RGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3VGV4dDogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBlbGFwc2VkVGltZU1pbGxpcyArICJtcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmF2ZXJzZUFsbFZpZXdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gbWFrZSBsaXN0IG9mIGV4cGVjdGVkIG5vZGVzCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gY2xhc3NOYW1lQW5kVGV4dExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Iik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dCIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Iik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkJ1dHRvbkJ1dHRvbjEiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuQnV0dG9uQnV0dG9uMiIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5CdXR0b25CdXR0b24zIik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkJ1dHRvbkJ1dHRvbjQiKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuQnV0dG9uQnV0dG9uNSIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5CdXR0b25CdXR0b242Iik7CisgICAgICAgICAgICBjbGFzc05hbWVBbmRUZXh0TGlzdC5hZGQoImFuZHJvaWQud2lkZ2V0LkJ1dHRvbkJ1dHRvbjciKTsKKyAgICAgICAgICAgIGNsYXNzTmFtZUFuZFRleHRMaXN0LmFkZCgiYW5kcm9pZC53aWRnZXQuQnV0dG9uQnV0dG9uOCIpOworICAgICAgICAgICAgY2xhc3NOYW1lQW5kVGV4dExpc3QuYWRkKCJhbmRyb2lkLndpZGdldC5CdXR0b25CdXR0b245Iik7CisKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyByb290ID0KKyAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkSW5BY3RpdmVXaW5kb3coUi5pZC5yb290KTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIldlIG11c3QgZmluZCB0aGUgZXhpc3Rpbmcgcm9vdC4iLCByb290KTsKKworICAgICAgICAgICAgUXVldWU8QWNjZXNzaWJpbGl0eU5vZGVJbmZvPiBmcmluZ2UgPSBuZXcgTGlua2VkTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+KCk7CisgICAgICAgICAgICBmcmluZ2UuYWRkKHJvb3QpOworCisgICAgICAgICAgICAvLyBkbyBhIEJGUyB0cmF2ZXJzYWwgYW5kIGNoZWNrIG5vZGVzCisgICAgICAgICAgICB3aGlsZSAoIWZyaW5nZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY3VycmVudCA9IGZyaW5nZS5wb2xsKCk7CisKKyAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgY2xhc3NOYW1lID0gY3VycmVudC5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGN1cnJlbnQuZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlZENsYXNzTmFtZUFuZFRleHQgPSBjbGFzc05hbWUudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICsgKCh0ZXh0ICE9IG51bGwpID8gdGV4dC50b1N0cmluZygpIDogIiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZENsYXNzTmFtZUFuZFRleHQgPSBjbGFzc05hbWVBbmRUZXh0TGlzdC5yZW1vdmUoMCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRpZCBub3QgZ2V0IHRoZSBleHBlY3RlZCBub2RlIGluZm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRDbGFzc05hbWVBbmRUZXh0LCByZWNlaXZlZENsYXNzTmFtZUFuZFRleHQpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBjdXJyZW50LmdldENoaWxkQ291bnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY2hpbGQgPSBjdXJyZW50LmdldENoaWxkKGkpOworICAgICAgICAgICAgICAgICAgICBmcmluZ2UuYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdFRyYXZlcnNlQWxsVmlld3M6ICIgKyBlbGFwc2VkVGltZU1pbGxpcyArICJtcyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQExhcmdlVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZm9jdXNlZAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9CisgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNGb2N1c2VkKCkpOworCisgICAgICAgICAgICAvLyBmb2N1cyB0aGUgdmlldworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fRk9DVVMpKTsKKworICAgICAgICAgICAgLy8gZmluZCB0aGUgdmlldyBhZ2FpbiBhbmQgbWFrZSBzdXJlIGl0IGlzIGZvY3VzZWQKKyAgICAgICAgICAgIGJ1dHRvbiA9IGdldENvbm5lY3Rpb24oKS5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRJbkFjdGl2ZVdpbmRvdyhSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNGb2N1c2VkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydFRpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgInRlc3RQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkZvY3VzOiAiICsgZWxhcHNlZFRpbWVNaWxsaXMgKyAibXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25DbGVhckZvY3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZm9jdXNlZAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9CisgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNGb2N1c2VkKCkpOworCisgICAgICAgICAgICAvLyBmb2N1cyB0aGUgdmlldworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fRk9DVVMpKTsKKworICAgICAgICAgICAgLy8gZmluZCB0aGUgdmlldyBhZ2FpbiBhbmQgbWFrZSBzdXJlIGl0IGlzIGZvY3VzZWQKKyAgICAgICAgICAgIGJ1dHRvbiA9ICBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkSW5BY3RpdmVXaW5kb3coUi5pZC5idXR0b241KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRm9jdXNlZCgpKTsKKworICAgICAgICAgICAgLy8gdW5mb2N1cyB0aGUgdmlldworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24ucGVyZm9ybUFjdGlvbihBQ1RJT05fQ0xFQVJfRk9DVVMpKTsKKworICAgICAgICAgICAgLy8gZmluZCB0aGUgdmlldyBhZ2FpbiBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBmb2N1c2VkCisgICAgICAgICAgICBidXR0b24gPSAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNGb2N1c2VkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydFRpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgInRlc3RQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkNsZWFyRm9jdXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZWxhcHNlZFRpbWVNaWxsaXMgKyAibXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25TZWxlY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmVmb3JlQ2xhc3NJZk5lZWRlZCgpOworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYnJpbmcgdXAgdGhlIGFjdGl2aXR5CisgICAgICAgICAgICBnZXRBY3Rpdml0eSgpOworCisgICAgICAgICAgICAvLyBmaW5kIGEgdmlldyBhbmQgbWFrZSBzdXJlIGl0IGlzIG5vdCBzZWxlY3RlZAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9CisgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNTZWxlY3RlZCgpKTsKKworICAgICAgICAgICAgLy8gc2VsZWN0IHRoZSB2aWV3CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5wZXJmb3JtQWN0aW9uKEFDVElPTl9TRUxFQ1QpKTsKKworICAgICAgICAgICAgLy8gZmluZCB0aGUgdmlldyBhZ2FpbiBhbmQgbWFrZSBzdXJlIGl0IGlzIHNlbGVjdGVkCisgICAgICAgICAgICBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkSW5BY3RpdmVXaW5kb3coUi5pZC5idXR0b241KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzU2VsZWN0ZWQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uU2VsZWN0OiAiICsgZWxhcHNlZFRpbWVNaWxsaXMgKyAibXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBMYXJnZVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25DbGVhclNlbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBiZWZvcmVDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBicmluZyB1cCB0aGUgYWN0aXZpdHkKKyAgICAgICAgICAgIGdldEFjdGl2aXR5KCk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgYSB2aWV3IGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IHNlbGVjdGVkCisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gYnV0dG9uID0KKyAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkSW5BY3RpdmVXaW5kb3coUi5pZC5idXR0b241KTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc1NlbGVjdGVkKCkpOworCisgICAgICAgICAgICAvLyBzZWxlY3QgdGhlIHZpZXcKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLnBlcmZvcm1BY3Rpb24oQUNUSU9OX1NFTEVDVCkpOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSB2aWV3IGFnYWluIGFuZCBtYWtlIHN1cmUgaXQgaXMgc2VsZWN0ZWQKKyAgICAgICAgICAgIGJ1dHRvbiA9IGdldENvbm5lY3Rpb24oKS5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRJbkFjdGl2ZVdpbmRvdyhSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNTZWxlY3RlZCgpKTsKKworICAgICAgICAgICAgLy8gdW5zZWxlY3QgdGhlIHZpZXcKKyAgICAgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLnBlcmZvcm1BY3Rpb24oQUNUSU9OX0NMRUFSX1NFTEVDVElPTikpOworCisgICAgICAgICAgICAvLyBmaW5kIHRoZSB2aWV3IGFnYWluIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IHNlbGVjdGVkCisgICAgICAgICAgICBidXR0b24gPSBnZXRDb25uZWN0aW9uKCkuZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5Vmlld0lkSW5BY3RpdmVXaW5kb3coUi5pZC5idXR0b241KTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc1NlbGVjdGVkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYWZ0ZXJDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBzdGFydFRpbWVNaWxsaXM7CisgICAgICAgICAgICAgICAgTG9nLmkoTE9HX1RBRywgInRlc3RQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbkNsZWFyU2VsZWN0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGVsYXBzZWRUaW1lTWlsbGlzICsgIm1zIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc2liaWxpdHlFdmVudEdldFNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBiZWZvcmVDbGFzc0lmTmVlZGVkKCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBicmluZyB1cCB0aGUgYWN0aXZpdHkKKyAgICAgICAgICAgIGdldEFjdGl2aXR5KCk7CisKKyAgICAgICAgICAgIC8vIGZpbmQgYSB2aWV3IGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGZvY3VzZWQKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBidXR0b24gPQorICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpb24oKS5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWRJbkFjdGl2ZVdpbmRvdyhSLmlkLmJ1dHRvbjUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgICAgIC8vIGZvY3VzIHRoZSB2aWV3CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5wZXJmb3JtQWN0aW9uKEFDVElPTl9GT0NVUykpOworCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc0Nvbm5lY3Rpb24ud2FpdCg1MDApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBsYXN0IGV2ZW50IHNvdXJjZQorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIHNvdXJjZSA9IHNMYXN0Rm9jdXNBY2Nlc3NpYmlsaXR5RXZlbnQuZ2V0U291cmNlKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZSk7CisKKyAgICAgICAgICAgIC8vIGJvdW5kcworICAgICAgICAgICAgUmVjdCBidXR0b25Cb3VuZHMgPSBuZXcgUmVjdCgpOworICAgICAgICAgICAgYnV0dG9uLmdldEJvdW5kc0luUGFyZW50KGJ1dHRvbkJvdW5kcyk7CisgICAgICAgICAgICBSZWN0IHNvdXJjZUJvdW5kcyA9IG5ldyBSZWN0KCk7CisgICAgICAgICAgICBzb3VyY2UuZ2V0Qm91bmRzSW5QYXJlbnQoc291cmNlQm91bmRzKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1dHRvbkJvdW5kcy5sZWZ0LCBzb3VyY2VCb3VuZHMubGVmdCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnV0dG9uQm91bmRzLnJpZ2h0LCBzb3VyY2VCb3VuZHMucmlnaHQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1dHRvbkJvdW5kcy50b3AsIHNvdXJjZUJvdW5kcy50b3ApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1dHRvbkJvdW5kcy5ib3R0b20sIHNvdXJjZUJvdW5kcy5ib3R0b20pOworCisgICAgICAgICAgICAvLyBjaGFyIHNlcXVlbmNlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidXR0b24uZ2V0UGFja2FnZU5hbWUoKSwgc291cmNlLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1dHRvbi5nZXRDbGFzc05hbWUoKSwgc291cmNlLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhidXR0b24uZ2V0VGV4dCgpLCBzb3VyY2UuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCBzb3VyY2UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOworCisgICAgICAgICAgICAvLyBib29sZWFuIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmlzRm9jdXNhYmxlKCksIHNvdXJjZS5pc0ZvY3VzYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmlzQ2xpY2thYmxlKCksIHNvdXJjZS5pc0NsaWNrYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmlzRW5hYmxlZCgpLCBzb3VyY2UuaXNFbmFibGVkKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShidXR0b24uaXNGb2N1c2VkKCksIHNvdXJjZS5pc0ZvY3VzZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5pc0xvbmdDbGlja2FibGUoKSwgc291cmNlLmlzTG9uZ0NsaWNrYWJsZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoYnV0dG9uLmlzUGFzc3dvcmQoKSwgc291cmNlLmlzUGFzc3dvcmQoKSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKGJ1dHRvbi5pc1NlbGVjdGVkKCksIHNvdXJjZS5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShidXR0b24uaXNDaGVja2FibGUoKSwgc291cmNlLmlzQ2hlY2thYmxlKCkpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShidXR0b24uaXNDaGVja2VkKCksIHNvdXJjZS5pc0NoZWNrZWQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdEFjY2Vzc2liaWxpdHlFdmVudEdldFNvdXJjZTogIiArIGVsYXBzZWRUaW1lTWlsbGlzICsgIm1zIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATGFyZ2VUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9iamVjdENvbnRyYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJlZm9yZUNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJyaW5nIHVwIHRoZSBhY3Rpdml0eQorICAgICAgICAgICAgZ2V0QWN0aXZpdHkoKTsKKworICAgICAgICAgICAgLy8gZmluZCBhIHZpZXcgYW5kIG1ha2Ugc3VyZSBpdCBpcyBub3QgZm9jdXNlZAorICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGJ1dHRvbiA9CisgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvbigpLmZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KFIuaWQuYnV0dG9uNSk7CisgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gcGFyZW50ID0gYnV0dG9uLmdldFBhcmVudCgpOworICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBwYXJlbnQuZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gY2hpbGQgPSBwYXJlbnQuZ2V0Q2hpbGQoaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmVxdWFscyhidXR0b24pKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRXF1YWwgb2JqZWN0cyBtdXN0IGhhdmUgc2FtZSBoYXNDb2RlLiIsIGJ1dHRvbi5oYXNoQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmFpbCgiUGFyZW50J3MgY2hpbGRyZW4gZG8gbm90IGhhdmUgdGhlIGluZm8gd2hvc2UgcGFyZW50IGlzIHRoZSBwYXJlbnQuIik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhZnRlckNsYXNzSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAidGVzdE9iamVjdENvbnRyYWN0OiAiICsgZWxhcHNlZFRpbWVNaWxsaXMgKyAibXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNjcnViQ2xhc3MoQ2xhc3M8Pz4gdGVzdENhc2VDbGFzcykgeworICAgICAgICAvKiBpbnRlbnRpb25hbGx5IGRvIG5vdCBzY3J1YiAqLworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYWNjZXNzaWJpbGl0eSBpbiBhIGdpdmVuIHN0YXRlIGJ5IHdyaXRpbmcgdGhlIHN0YXRlIHRvIHRoZQorICAgICAqIHNldHRpbmdzIGFuZCB3YWl0aW5nIHVudGlsIHRoZSBhY2Nlc3NpYmlsaXR5IG1hbmFnZXIgc2VydmljZSBwaWNrcworICAgICAqIGl0IHVwIGZvciBtYXgge0BsaW5rICNUSU1FT1VUX1BST1BBR0FURV9BQ0NFU1NJQkxJVFlfU0VUVElOR30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGFjY2Vzc2liaWxpdHkgc3RhdGUuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55IGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQWNjZXNzaWJpbGl0eVN0YXRlKGJvb2xlYW4gc3RhdGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRDb250ZXh0KCk7CisgICAgICAgIC8vIElmIHRoZSBsb2NhbCBtYW5hZ2VyIHJlYWR5ID0+IG5vdGhpbmcgdG8gZG8uCisgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIGFjY2Vzc2liaWxpdHlNYW5hZ2VyID0gQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7CisgICAgICAgIGlmIChhY2Nlc3NpYmlsaXR5TWFuYWdlci5pc0VuYWJsZWQoKSA9PSBzdGF0ZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN5c3RlbSBhbHJlYWR5IGtub3dzIGFib3V0IHRoZSBkZXNpcmVkIHN0YXRlLiAKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY3VycmVudFN0YXRlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVEKSA9PSAxOworICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAhPSBzdGF0ZSkgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSB3YWtlIG91cnNlbHZlcyBhcyB0aGUgZGVzaXJlZCBzdGF0ZSBpcyBwcm9wYWdhdGVkLgorICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlNYW5hZ2VyLmFkZEFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLkFjY2Vzc2liaWxpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWNjZXNzaWJpbGl0eVN0YXRlQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIHN0YXRlID8gMSA6IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm8gd2hpbGUgb25lIGF0dGVtcHQgYW5kIHRoYXQgaXMgaXQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdhaXQoVElNRU9VVF9QUk9QQUdBVEVfQUNDRVNTSUJMSVRZX1NFVFRJTkcpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkgIT0gc3RhdGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvdWxkIG5vdCBzZXQgYWNjZXNzaWJpbGl0eSBzdGF0ZSB0bzogIiArIHN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgc29tZSBzZXQgdXAgY29kZSBiZWZvcmUgYW55IHRlc3QgbWV0aG9kLgorICAgICAqCisgICAgICogTk9URTogSSBtaXNzIEp1bml0NCdzIEBCZWZvcmVDbGFzcworICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBiZWZvcmVDbGFzc0lmTmVlZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNFeGVjdXRlZFRlc3RNZXRob2RDb3VudCsrOworICAgICAgICBpZiAoc0V4ZWN1dGVkVGVzdE1ldGhvZENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGVuc3VyZUFjY2Vzc2liaWxpdHlTdGF0ZSh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgc29tZSBjbGVhbiB1cCBjb2RlIGFmdGVyIGFsbCB0ZXN0IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBOT1RFOiBJIG1pc3MgSnVuaXQ0J3MgQEFmdGVyQ2xhc3MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzSWZOZWVkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNFeGVjdXRlZFRlc3RNZXRob2RDb3VudCA9PSBzVGVzdE1ldGhvZENvdW50KSB7CisgICAgICAgICAgICBzRXhlY3V0ZWRUZXN0TWV0aG9kQ291bnQgPSAwOworICAgICAgICAgICAgZW5zdXJlQWNjZXNzaWJpbGl0eVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc0Nvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgSUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUV2ZW50TGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uKElBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb24gY29ubmVjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5ldmVudFR5cGVzID0gQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVTX0FMTF9NQVNLOworICAgICAgICAgICAgICAgICAgICBpbmZvLmZlZWRiYWNrVHlwZSA9IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19TUE9LRU47CisgICAgICAgICAgICAgICAgICAgIGluZm8ubm90aWZpY2F0aW9uVGltZW91dCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGluZm8uZmxhZ3MgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRTZXJ2aWNlSW5mbyhpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkludGVycnVwdCgpIHt9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldEV2ZW50VHlwZSgpID09IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfRk9DVVNFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc0xhc3RGb2N1c0FjY2Vzc2liaWxpdHlFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNDb25uZWN0aW9uLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5TWFuYWdlciBtYW5hZ2VyID0gSUFjY2Vzc2liaWxpdHlNYW5hZ2VyLlN0dWIuYXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSkpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb24gPSBtYW5hZ2VyLnJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNDb25uZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0ZXN0IG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0VGVzdE1ldGhvZENvdW50KCkgeworICAgICAgICBpbnQgdGVzdE1ldGhvZENvdW50ID0gMDsKKyAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBtb2RpZmllcnMgPSBtZXRob2QuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJ0ZXN0IikKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1vZGlmaWVycyAmIE1vZGlmaWVyLlBVQkxJQykgIT0gMAorICAgICAgICAgICAgICAgICAgICAmJiAobW9kaWZpZXJzICYgTW9kaWZpZXIuU1RBVElDKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RNZXRob2RDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQXRQYXJzZXJUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9ibHVldG9vdGgvQXRQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YWE1MmIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0F0UGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYmx1ZXRvb3RoOwotCi1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQXRDb21tYW5kSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5BdENvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQXRQYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEF0UGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIC8qIEFuIEF0Q29tbWFuZEhhbmRsZXIgaW5zdHJ1bWVudGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBIYW5kbGVyVGVzdCBleHRlbmRzIEF0Q29tbWFuZEhhbmRsZXIgewotICAgICAgICBib29sZWFuIG1CYXNpY0NhbGxlZCwgbUFjdGlvbkNhbGxlZCwgbVJlYWRDYWxsZWQsIG1UZXN0Q2FsbGVkLCAKLSAgICAgICAgICAgICAgICBtU2V0Q2FsbGVkOwotICAgICAgICBpbnQgbUJhc2ljUmV0dXJuLCBtQWN0aW9uUmV0dXJuLCBtUmVhZFJldHVybiwgbVRlc3RSZXR1cm4sIG1TZXRSZXR1cm47Ci0gICAgICAgIE9iamVjdFtdIG1TZXRBcmdzOwotICAgICAgICBTdHJpbmcgbUJhc2ljQXJnczsKLQotICAgICAgICBIYW5kbGVyVGVzdCgpIHsKLSAgICAgICAgICAgIHRoaXMoQXRDb21tYW5kUmVzdWx0LkVSUk9SLCBBdENvbW1hbmRSZXN1bHQuRVJST1IsCi0gICAgICAgICAgICAgICAgIEF0Q29tbWFuZFJlc3VsdC5FUlJPUiwgQXRDb21tYW5kUmVzdWx0LkVSUk9SLAotICAgICAgICAgICAgICAgICBBdENvbW1hbmRSZXN1bHQuRVJST1IpOwotICAgICAgICB9Ci0KLSAgICAgICAgSGFuZGxlclRlc3QoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlKSB7Ci0gICAgICAgICAgICBtQmFzaWNSZXR1cm4gPSBhOwotICAgICAgICAgICAgbUFjdGlvblJldHVybiA9IGI7Ci0gICAgICAgICAgICBtUmVhZFJldHVybiA9IGM7Ci0gICAgICAgICAgICBtU2V0UmV0dXJuID0gZDsKLSAgICAgICAgICAgIG1UZXN0UmV0dXJuID0gZTsKLSAgICAgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgICAgICBtQmFzaWNDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1BY3Rpb25DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1SZWFkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtU2V0Q2FsbGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBtVGVzdENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVNldEFyZ3MgPSBudWxsOwotICAgICAgICAgICAgbUJhc2ljQXJncyA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gd2FzQ2FsbGVkKCkgeyAgIC8vIGhlbHBlcgotICAgICAgICAgICAgcmV0dXJuIG1CYXNpY0NhbGxlZCB8fCBtQWN0aW9uQ2FsbGVkIHx8IG1SZWFkQ2FsbGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1UZXN0Q2FsbGVkIHx8IG1TZXRDYWxsZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBBdENvbW1hbmRSZXN1bHQgaGFuZGxlQmFzaWNDb21tYW5kKFN0cmluZyBhcmdzKSB7Ci0gICAgICAgICAgICBtQmFzaWNDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgbUJhc2ljQXJncyA9IGFyZ3M7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0Q29tbWFuZFJlc3VsdChtQmFzaWNSZXR1cm4pOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXRDb21tYW5kUmVzdWx0IGhhbmRsZUFjdGlvbkNvbW1hbmQoKSB7Ci0gICAgICAgICAgICBtQWN0aW9uQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXRDb21tYW5kUmVzdWx0KG1BY3Rpb25SZXR1cm4pOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXRDb21tYW5kUmVzdWx0IGhhbmRsZVJlYWRDb21tYW5kKCkgewotICAgICAgICAgICAgbVJlYWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBdENvbW1hbmRSZXN1bHQobVJlYWRSZXR1cm4pOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXRDb21tYW5kUmVzdWx0IGhhbmRsZVNldENvbW1hbmQoT2JqZWN0W10gYXJncykgewotICAgICAgICAgICAgbVNldENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICBtU2V0QXJncyA9IGFyZ3M7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEF0Q29tbWFuZFJlc3VsdChtU2V0UmV0dXJuKTsKLSAgICAgICAgfQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF0Q29tbWFuZFJlc3VsdCBoYW5kbGVUZXN0Q29tbWFuZCgpIHsKLSAgICAgICAgICAgIG1UZXN0Q2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXRDb21tYW5kUmVzdWx0KG1UZXN0UmV0dXJuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQXRQYXJzZXIgbVBhcnNlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1QYXJzZXIgPSBuZXcgQXRQYXJzZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgIH0KLQotCi0gICAgLyogVGVzdCB0aGF0IHRoZSByaWdodCBtZXRob2QgaXMgYmVpbmcgY2FsbGVkCi0gICAgICovCi0vKiAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEQgPSBuZXcgSGFuZGxlclRlc3QoMCwgMSwgMSwgMSwgMSk7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEEgPSBuZXcgSGFuZGxlclRlc3QoMCwgMSwgMSwgMSwgMSk7Ci0gICAgICAgIG1QYXJzZXIucmVnaXN0ZXIoJ0QnLCBEKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcignQScsIEEpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCIgIEEgVCBEID0gPyBUIDEgMiAzICA0ICAgIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShELm1CYXNpY0NhbGxlZCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEQubUFjdGlvbkNhbGxlZCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEQubVRlc3RDYWxsZWQpOwotICAgICAgICBhc3NlcnRGYWxzZShELm1TZXRDYWxsZWQpOwotICAgICAgICBhc3NlcnRGYWxzZShELm1SZWFkQ2FsbGVkKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQS53YXNDYWxsZWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPT9UMTIzNCIsIEQubUJhc2ljQXJncyk7Ci0gICAgfQotKi8KLSAgICAvKiBUZXN0IHNvbWUgY3Jhenkgc3RyaW5ncwotICAgICAqLy8qCi0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljMigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYW5kbGVyVGVzdCBBID0gbmV3IEhhbmRsZXJUZXN0KDAsIDEsIDEsIDEsIDEpOwotICAgICAgICBtUGFyc2VyLnJlZ2lzdGVyKCdBJywgQSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXt9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiICAgICAiKS50b1N0cmluZ3MoKSkpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCIgIGEgVCBhIHQgXCJcIiAgMSAyIDMgYSA0ICAgIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRcIlwiMTIzQTQiLCBBLm1CYXNpY0FyZ3MpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCIgIGEgVCBhIHQgIFwiZm9vIEJhUjEyWlwiIDEgMiAzIGEgNCAgICIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUXCJmb28gQmFSMTJaXCIxMjNBNCIsIEEubUJhc2ljQXJncyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUQVwiIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIlwiIiwgQS5tQmFzaWNBcmdzKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVRBXCJhIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImFcIiIsIEEubUJhc2ljQXJncyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUYVwiICIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiXCIgXCIiLCBBLm1CYXNpY0FyZ3MpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVEEgIFwib25lIFwiIHR3byBcInQgaHIgZWUgIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlwib25lIFwiVFdPXCJ0IGhyIGVlIFwiIiwgQS5tQmFzaWNBcmdzKTsKLSAgICB9Ki8KLQotICAgIC8qIFNpbXBsZSBleHRlbmRlZCBjb21tYW5kcwotICAgICAqLy8qCi0gICAgcHVibGljIHZvaWQgdGVzdEV4dDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSGFuZGxlclRlc3QgQSA9IG5ldyBIYW5kbGVyVGVzdCgxLCAwLCAwLCAwLCAwKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcigiK0EiLCBBKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJFUlJPUiJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQiIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEEud2FzQ2FsbGVkKCkpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBLm1BY3Rpb25DYWxsZWQpOwotICAgICAgICBBLm1BY3Rpb25DYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoQS53YXNDYWxsZWQoKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQT0iKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEEubVNldENhbGxlZCk7Ci0gICAgICAgIEEubVNldENhbGxlZCA9IGZhbHNlOwotICAgICAgICBhc3NlcnRGYWxzZShBLndhc0NhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEEubVNldEFyZ3MubGVuZ3RoKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBPT8iKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEEubVRlc3RDYWxsZWQpOwotICAgICAgICBBLm1UZXN0Q2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIGFzc2VydEZhbHNlKEEud2FzQ2FsbGVkKCkpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0E/IikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBLm1SZWFkQ2FsbGVkKTsKLSAgICAgICAgQS5tUmVhZENhbGxlZCA9IGZhbHNlOwotICAgICAgICBhc3NlcnRGYWxzZShBLndhc0NhbGxlZCgpKTsKLSAgICAgICAgQS5yZXNldCgpOwotICAgIH0KLSovCi0KLQotICAgIC8qIFRlc3QgY2hhaW5lZCBjb21tYW5kcwotICAgICAqLy8qCi0gICAgcHVibGljIHZvaWQgdGVzdENoYWluMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBIYW5kbGVyVGVzdCBBID0gbmV3IEhhbmRsZXJUZXN0KDAsIDEsIDEsIDEsIDEpOwotICAgICAgICBIYW5kbGVyVGVzdCBCID0gbmV3IEhhbmRsZXJUZXN0KDEsIDAsIDAsIDAsIDApOwotICAgICAgICBIYW5kbGVyVGVzdCBDID0gbmV3IEhhbmRsZXJUZXN0KDEsIDEsIDEsIDEsIDEpOwotICAgICAgICBtUGFyc2VyLnJlZ2lzdGVyKCdBJywgQSk7Ci0gICAgICAgIG1QYXJzZXIucmVnaXN0ZXIoIitCIiwgQik7Ci0gICAgICAgIG1QYXJzZXIucmVnaXN0ZXIoIitDIiwgQyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiRVJST1IifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0I7K0MiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRUcnVlKEIubUFjdGlvbkNhbGxlZCk7Ci0gICAgICAgIGFzc2VydFRydWUoQy5tQWN0aW9uQ2FsbGVkKTsKLSAgICAgICAgQi5yZXNldCgpOwotICAgICAgICBDLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiRVJST1IifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0M7K0IiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShCLndhc0NhbGxlZCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShDLm1BY3Rpb25DYWxsZWQpOwotICAgICAgICBCLnJlc2V0KCk7Ci0gICAgICAgIEMucmVzZXQoKTsKLSAgICB9Ki8KLQotICAgIC8qIFRlc3QgU2V0IGNvbW1hbmQKLSAgICAgKi8vKgotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEhhbmRsZXJUZXN0IEEgPSBuZXcgSGFuZGxlclRlc3QoMSwgMSwgMSwgMCwgMSk7Ci0gICAgICAgIG1QYXJzZXIucmVnaXN0ZXIoIitBQUFBIiwgQSk7Ci0gICAgICAgIE9iamVjdFtdIGV4cGVjdGVkUmVzdWx0OwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBQUFBPTEiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBleHBlY3RlZFJlc3VsdCA9IG5ldyBPYmplY3RbXXsoSW50ZWdlcikxfTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LCBBLm1TZXRBcmdzKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQUFBQT0xLDIsMyIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0ID0gbmV3IE9iamVjdFtdeyhJbnRlZ2VyKTEsIChJbnRlZ2VyKTIsIChJbnRlZ2VyKTN9OwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQsIEEubVNldEFyZ3MpKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBQUFBPTMsMCwwLDEiKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBleHBlY3RlZFJlc3VsdCA9IG5ldyBPYmplY3RbXXsoSW50ZWdlcikzLCAoSW50ZWdlcikwLCAoSW50ZWdlcikwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50ZWdlcikxfTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LCBBLm1TZXRBcmdzKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQUFBQT1cImZvb1wiLDEsXCJiLGFyIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHQgPSBuZXcgT2JqZWN0W117IlwiZm9vXCIiLCAxLCAiXCJiLGFyXCIifTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LCBBLm1TZXRBcmdzKSk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdeyJPSyJ9LAotICAgICAgICAgICAgICAgICAgIG1QYXJzZXIucHJvY2VzcygiQVQrQUFBQT0iKS50b1N0cmluZ3MoKSkpOwotICAgICAgICBleHBlY3RlZFJlc3VsdCA9IG5ldyBPYmplY3RbXXsiIn07Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZFJlc3VsdCwgQS5tU2V0QXJncykpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0FBQUE9LCIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0ID0gbmV3IE9iamVjdFtdeyIiLCAiIn07Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZFJlc3VsdCwgQS5tU2V0QXJncykpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUK0FBQUE9LCwsIikudG9TdHJpbmdzKCkpKTsKLSAgICAgICAgZXhwZWN0ZWRSZXN1bHQgPSBuZXcgT2JqZWN0W117IiIsICIiLCAiIiwgIiJ9OwotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQsIEEubVNldEFyZ3MpKTsKLSAgICAgICAgQS5yZXNldCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBVCtBQUFBPSwxLCxcImZvb1wiLCIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGV4cGVjdGVkUmVzdWx0ID0gbmV3IE9iamVjdFtdeyIiLCAxLCAiIiwgIlwiZm9vXCIiLCAiIn07Ci0gICAgICAgIGFzc2VydEVxdWFscyg1LCBBLm1TZXRBcmdzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZFJlc3VsdCwgQS5tU2V0QXJncykpOwotICAgICAgICBBLnJlc2V0KCk7Ci0gICAgfSovCi0KLSAgICAvKiBUZXN0IHJlcGVhdCBjb21tYW5kICJBLyIKLSAgICAgKi8vKgotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSGFuZGxlclRlc3QgQSA9IG5ldyBIYW5kbGVyVGVzdCgwLCAwLCAwLCAwLCAwKTsKLSAgICAgICAgbVBhcnNlci5yZWdpc3RlcignQScsIEEpOwotCi0gICAgICAgIC8vIFRyeSByZXBlYXRlZCBjb21tYW5kIG9uIGZyZXNoIHBhcnNlcgotICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde30sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBLyIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEEud2FzQ2FsbGVkKCkpOwotICAgICAgICBBLnJlc2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXsiT0sifSwKLSAgICAgICAgICAgICAgICAgICBtUGFyc2VyLnByb2Nlc3MoIkFUQSIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQS5tQmFzaWNDYWxsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIEEubUJhc2ljQXJncyk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICAvLyBOb3cgcmVwZWF0IHRoZSBjb21tYW5kCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBLyIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQS5tQmFzaWNDYWxsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIEEubUJhc2ljQXJncyk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgICAgICAvLyBNdWx0aXBsZSByZXBlYXRzCi0gICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117Ik9LIn0sCi0gICAgICAgICAgICAgICAgICAgbVBhcnNlci5wcm9jZXNzKCJBLyIpLnRvU3RyaW5ncygpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoQS5tQmFzaWNDYWxsZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIEEubUJhc2ljQXJncyk7Ci0gICAgICAgIEEucmVzZXQoKTsKLQotICAgIH0qLwotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhTdHJlc3NUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTM3OTEuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFN0cmVzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0Q2FzZTsKLQotLyoqCi0gKiBTdHJlc3MgdGVzdCBzdWl0ZSBmb3IgQmx1ZXRvb3RoIHJlbGF0ZWQgZnVuY3Rpb25zLgotICoKLSAqIEluY2x1ZGVzIHRlc3RzIGZvciBlbmFibGluZy9kaXNhYmxpbmcgYmx1ZXRvb3RoLCBlbmFibGluZy9kaXNhYmxpbmcgZGlzY292ZXJhYmxlIG1vZGUsCi0gKiBzdGFydGluZy9zdG9wcGluZyBzY2FucywgY29ubmVjdGluZy9kaXNjb25uZWN0aW5nIHRvIEhGUCwgQTJEUCwgSElELCBQQU4gcHJvZmlsZXMsIGFuZCB2ZXJpZnlpbmcKLSAqIHRoYXQgcmVtb3RlIGNvbm5lY3Rpb25zL2Rpc2Nvbm5lY3Rpb25zIG9jY3VyIGZvciB0aGUgUEFOIHByb2ZpbGUuCi0gKiA8cD4KLSAqIFRoaXMgdGVzdCBzdWl0ZSB1c2VzIHtAbGluayBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXN0UnVubmVyfSB0byBmb3IgcGFyYW1ldGVycyBzdWNoIGFzIHRoZQotICogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgYW5kIHRoZSBhZGRyZXNzZXMgb2YgcmVtb3RlIEJsdWV0b290aCBkZXZpY2VzLgotICovCi1wdWJsaWMgY2xhc3MgQmx1ZXRvb3RoU3RyZXNzVGVzdCBleHRlbmRzIEluc3RydW1lbnRhdGlvblRlc3RDYXNlIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFN0cmVzc1Rlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRklMRSA9ICJCbHVldG9vdGhTdHJlc3NUZXN0T3V0cHV0LnR4dCI7Ci0KLSAgICBwcml2YXRlIEJsdWV0b290aFRlc3RVdGlscyBtVGVzdFV0aWxzOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7Ci0gICAgICAgIG1UZXN0VXRpbHMgPSBuZXcgQmx1ZXRvb3RoVGVzdFV0aWxzKGNvbnRleHQsIFRBRywgT1VUUFVUX0ZJTEUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0KLSAgICAgICAgbVRlc3RVdGlscy5jbG9zZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVzcyB0ZXN0IGZvciBlbmFibGluZyBhbmQgZGlzYWJsaW5nIEJsdWV0b290aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0VuYWJsZUl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJlbmFibGUgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVzcyB0ZXN0IGZvciBwdXR0aW5nIHRoZSBkZXZpY2UgaW4gYW5kIHRha2luZyB0aGUgZGV2aWNlIG91dCBvZiBkaXNjb3ZlcmFibGUgbW9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzY292ZXJhYmxlKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Rpc2NvdmVyYWJsZUl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy51bmRpc2NvdmVyYWJsZShhZGFwdGVyKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiZGlzY292ZXJhYmxlIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb3ZlcmFibGUoYWRhcHRlcik7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLnVuZGlzY292ZXJhYmxlKGFkYXB0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVzcyB0ZXN0IGZvciBzdGFydGluZyBhbmQgc3RvcHBpbmcgQmx1ZXRvb3RoIHNjYW5zLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTY2FuKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc1NjYW5JdGVyYXRpb25zOwotICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjYW4oYWRhcHRlcik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoInNjYW4gaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLnN0YXJ0U2NhbihhZGFwdGVyKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjYW4oYWRhcHRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgdGhlIFBBTiBOQVAgcHJvZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlUGFuKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0VuYWJsZVBhbkl0ZXJhdGlvbnM7Ci0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlUGFuKGFkYXB0ZXIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJ0ZXN0RW5hYmxlUGFuIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIgotICAgICAgICAgICAgICAgICAgICArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5lbmFibGVQYW4oYWRhcHRlcik7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGVQYW4oYWRhcHRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIHBhaXJpbmcgYW5kIHVucGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgaW5pdGlhdGVzIHBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UsIGFuZCB0aGVuIHVucGFpcnMgd2l0aAotICAgICAqIHRoZSBkZXZpY2UgYWZ0ZXIgdGhlIHBhaXJpbmcgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFBhaXIoKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zUGFpckl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJwYWlyIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCi0gICAgICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOwotICAgICAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIGFjY2VwdGluZyBhIHBhaXJpbmcgcmVxdWVzdCBhbmQgdW5wYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSB3YWl0cyBmb3IgYSBwYWlyaW5nIHJlcXVlc3QgZnJvbSBhIHJlbW90ZSBkZXZpY2UuICBJdCBhY2NlcHRzCi0gICAgICogdGhlIHJlcXVlc3QgYW5kIHRoZW4gdW5wYWlycyBhZnRlciB0aGUgcGFyaW5nIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRQYWlyKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc1BhaXJJdGVyYXRpb25zOwotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiYWNjZXB0UGFpciBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuYWNjZXB0UGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAotICAgICAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVzcyB0ZXN0IGZvciBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHdpdGggYW4gQTJEUCBzb3VyY2UuCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGFuIEEyRFAgc2luaywgYW5kIGluaXRpYXRlcyBjb25uZWN0aW9ucyBhbmQKLSAgICAgKiBkaXNjb25uZWN0aW9ucyB3aXRoIGFuIEEyRFAgc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0QTJkcCgpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0QTJkcEl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCwgbnVsbCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RBMmRwIGl0ZXJhdGlvbiAiICsgKGkgKyAxKSArICIgb2YgIiArIGl0ZXJhdGlvbnMpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY29ubmVjdEEyZHAoZGV2aWNlPSVzKSIsIGRldmljZSkpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuQTJEUCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdEEyZHAoZGV2aWNlPSVzKSIsIGRldmljZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmVzcyB0ZXN0IGZvciBjb25uZWN0aW5nIGFuZCBkaXNjb25uZWN0aW5nIHRoZSBIRlAgd2l0aCBhIGhhbmRzIGZyZWUgZGV2aWNlLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgdGVzdCwgdGhlIGxvY2FsIGRldmljZSBwbGF5cyB0aGUgcm9sZSBvZiBhbiBIRlAgYXVkaW8gZ2F0ZXdheSwgYW5kIGluaXRpYXRlcwotICAgICAqIGNvbm5lY3Rpb25zIGFuZCBkaXNjb25uZWN0aW9ucyB3aXRoIGEgaGFuZHMgZnJlZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RIZWFkc2V0KCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAotICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULCBudWxsKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdEhlYWRzZXQgaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmNvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJjb25uZWN0SGVhZHNldChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0SGVhZHNldChkZXZpY2U9JXMpIiwgZGV2aWNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIGNvbm5lY3RpbmcgYW5kIGRpc2Nvbm5lY3Rpbmcgd2l0aCBhIEhJRCBkZXZpY2UuCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGEgSElEIGhvc3QsIGFuZCBpbml0aWF0ZXMgY29ubmVjdGlvbnMgYW5kCi0gICAgICogZGlzY29ubmVjdGlvbnMgd2l0aCBhIEhJRCBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RJbnB1dCgpIHsKLSAgICAgICAgaW50IGl0ZXJhdGlvbnMgPSBCbHVldG9vdGhUZXN0UnVubmVyLnNDb25uZWN0SW5wdXRJdGVyYXRpb25zOwotICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5wYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSwgbnVsbCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImNvbm5lY3RJbnB1dCBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiY29ubmVjdElucHV0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLklOUFVUX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdElucHV0KGRldmljZT0lcykiLCBkZXZpY2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJlc3MgdGVzdCBmb3IgY29ubmVjdGluZyBhbmQgZGlzY29ubmVjdGluZyB3aXRoIGEgUEFOIE5BUC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbiB0aGlzIHRlc3QsIHRoZSBsb2NhbCBkZXZpY2UgcGxheXMgdGhlIHJvbGUgb2YgYSBQQU5VLCBhbmQgaW5pdGlhdGVzIGNvbm5lY3Rpb25zIGFuZAotICAgICAqIGRpc2Nvbm5lY3Rpb25zIHdpdGggYSBOQVAuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3RQYW4oKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zQ29ubmVjdFBhbkl0ZXJhdGlvbnM7Ci0gICAgICAgIGlmIChpdGVyYXRpb25zID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciA9IEJsdWV0b290aEFkYXB0ZXIuZ2V0RGVmYXVsdEFkYXB0ZXIoKTsKLSAgICAgICAgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSA9IGFkYXB0ZXIuZ2V0UmVtb3RlRGV2aWNlKEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZUFkZHJlc3MpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMuZW5hYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLnBhaXIoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGFzc2tleSwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VQYWlyUGluKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgewotICAgICAgICAgICAgbVRlc3RVdGlscy53cml0ZU91dHB1dCgiY29ubmVjdFBhbiBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuY29ubmVjdFBhbihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICAgICAgbVRlc3RVdGlscy5kaXNjb25uZWN0UGFuKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIHZlcmlmeWluZyBhIFBBTlUgY29ubmVjdGluZyBhbmQgZGlzY29ubmVjdGluZyB3aXRoIHRoZSBkZXZpY2UuCi0gICAgICogPHA+Ci0gICAgICogSW4gdGhpcyB0ZXN0LCB0aGUgbG9jYWwgZGV2aWNlIHBsYXlzIHRoZSByb2xlIG9mIGEgTkFQIHdoaWNoIGEgcmVtb3RlIFBBTlUgY29ubmVjdHMgYW5kCi0gICAgICogZGlzY29ubmVjdHMgZnJvbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb21pbmdQYW5Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgaXRlcmF0aW9ucyA9IEJsdWV0b290aFRlc3RSdW5uZXIuc0Nvbm5lY3RQYW5JdGVyYXRpb25zOwotICAgICAgICBpZiAoaXRlcmF0aW9ucyA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIgPSBCbHVldG9vdGhBZGFwdGVyLmdldERlZmF1bHRBZGFwdGVyKCk7Ci0gICAgICAgIEJsdWV0b290aERldmljZSBkZXZpY2UgPSBhZGFwdGVyLmdldFJlbW90ZURldmljZShCbHVldG9vdGhUZXN0UnVubmVyLnNEZXZpY2VBZGRyZXNzKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlUGFuKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmVuYWJsZVBhbihhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5hY2NlcHRQYWlyKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBhc3NrZXksCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlUGFpclBpbik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyBpKyspIHsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMud3JpdGVPdXRwdXQoImluY29taW5nUGFuQ29ubmVjdGlvbiBpdGVyYXRpb24gIiArIChpICsgMSkgKyAiIG9mICIKLSAgICAgICAgICAgICAgICAgICAgKyBpdGVyYXRpb25zKTsKLSAgICAgICAgICAgIG1UZXN0VXRpbHMuaW5jb21pbmdQYW5Db25uZWN0aW9uKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLmluY29taW5nUGFuRGlzY29ubmVjdGlvbihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRlc3RVdGlscy51bnBhaXIoYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgbVRlc3RVdGlscy5kaXNhYmxlUGFuKGFkYXB0ZXIpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RyZXNzIHRlc3QgZm9yIHZlcmlmeWluZyB0aGF0IEF1ZGlvTWFuYWdlciBjYW4gb3BlbiBhbmQgY2xvc2UgU0NPIGNvbm5lY3Rpb25zLgotICAgICAqIDxwPgotICAgICAqIEluIHRoaXMgdGVzdCwgYSBIU1AgY29ubmVjdGlvbiBpcyBvcGVuZWQgd2l0aCBhbiBleHRlcm5hbCBoZWFkc2V0IGFuZCB0aGUgU0NPIGNvbm5lY3Rpb24gaXMKLSAgICAgKiByZXBlYXRpYmx5IG9wZW5lZCBhbmQgY2xvc2VkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFN0b3BTY28oKSB7Ci0gICAgICAgIGludCBpdGVyYXRpb25zID0gQmx1ZXRvb3RoVGVzdFJ1bm5lci5zU3RhcnRTdG9wU2NvSXRlcmF0aW9uczsKLSAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyID0gQmx1ZXRvb3RoQWRhcHRlci5nZXREZWZhdWx0QWRhcHRlcigpOwotICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlID0gYWRhcHRlci5nZXRSZW1vdGVEZXZpY2UoQmx1ZXRvb3RoVGVzdFJ1bm5lci5zRGV2aWNlQWRkcmVzcyk7Ci0gICAgICAgIG1UZXN0VXRpbHMuZGlzYWJsZShhZGFwdGVyKTsKLSAgICAgICAgbVRlc3RVdGlscy5lbmFibGUoYWRhcHRlcik7Ci0gICAgICAgIG1UZXN0VXRpbHMudW5wYWlyKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgIG1UZXN0VXRpbHMucGFpcihhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQYXNza2V5LAotICAgICAgICAgICAgICAgIEJsdWV0b290aFRlc3RSdW5uZXIuc0RldmljZVBhaXJQaW4pOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2Nvbm5lY3RQcm9maWxlKGFkYXB0ZXIsIGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VULCBudWxsKTsKLSAgICAgICAgbVRlc3RVdGlscy5jb25uZWN0UHJvZmlsZShhZGFwdGVyLCBkZXZpY2UsIEJsdWV0b290aFByb2ZpbGUuSEVBRFNFVCwgbnVsbCk7Ci0gICAgICAgIG1UZXN0VXRpbHMuc3RvcFNjbyhhZGFwdGVyLCBkZXZpY2UpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLndyaXRlT3V0cHV0KCJzdGFydFN0b3BTY28gaXRlcmF0aW9uICIgKyAoaSArIDEpICsgIiBvZiAiICsgaXRlcmF0aW9ucyk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLnN0YXJ0U2NvKGFkYXB0ZXIsIGRldmljZSk7Ci0gICAgICAgICAgICBtVGVzdFV0aWxzLnN0b3BTY28oYWRhcHRlciwgZGV2aWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0VXRpbHMuZGlzY29ubmVjdFByb2ZpbGUoYWRhcHRlciwgZGV2aWNlLCBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQsIG51bGwpOwotICAgICAgICBtVGVzdFV0aWxzLnVucGFpcihhZGFwdGVyLCBkZXZpY2UpOwotICAgICAgICBtVGVzdFV0aWxzLmRpc2FibGUoYWRhcHRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0UnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDJjMTIuLjAwMDAwMDAKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLmJsdWV0b290aDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjsKLWltcG9ydCBhbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogSW5zdHJ1bWVudGF0aW9uIHRlc3QgcnVubmVyIGZvciBCbHVldG9vdGggdGVzdHMuCi0gKiA8cD4KLSAqIFRvIHJ1bjoKLSAqIDxwcmU+Ci0gKiB7QGNvZGUKLSAqIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IFwKLSAqICAgICBbLWUgZW5hYmxlX2l0ZXJhdGlvbnMgPGl0ZXJhdGlvbnM+XSBcCi0gKiAgICAgWy1lIGRpc2NvdmVyYWJsZV9pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAotICogICAgIFstZSBzY2FuX2l0ZXJhdGlvbnMgPGl0ZXJhdGlvbnM+XSBcCi0gKiAgICAgWy1lIGVuYWJsZV9wYW5faXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKLSAqICAgICBbLWUgcGFpcl9pdGVyYXRpb25zIDxpdGVyYXRpb25zPl0gXAotICogICAgIFstZSBjb25uZWN0X2EyZHBfaXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKLSAqICAgICBbLWUgY29ubmVjdF9oZWFkc2V0X2l0ZXJhdGlvbnMgPGl0ZXJhdGlvbnM+XSBcCi0gKiAgICAgWy1lIGNvbm5lY3RfaW5wdXRfaXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKLSAqICAgICBbLWUgY29ubmVjdF9wYW5faXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKLSAqICAgICBbLWUgc3RhcnRfc3RvcF9zY29faXRlcmF0aW9ucyA8aXRlcmF0aW9ucz5dIFwKLSAqICAgICBbLWUgcGFpcl9hZGRyZXNzIDxhZGRyZXNzPl0gXAotICogICAgIFstZSBoZWFkc2V0X2FkZHJlc3MgPGFkZHJlc3M+XSBcCi0gKiAgICAgWy1lIGEyZHBfYWRkcmVzcyA8YWRkcmVzcz5dIFwKLSAqICAgICBbLWUgaW5wdXRfYWRkcmVzcyA8YWRkcmVzcz5dIFwKLSAqICAgICBbLWUgcGFuX2FkZHJlc3MgPGFkZHJlc3M+XSBcCi0gKiAgICAgWy1lIHBhaXJfcGluIDxwaW4+XSBcCi0gKiAgICAgWy1lIHBhaXJfcGFzc2tleSA8cGFzc2tleT5dIFwKLSAqICAgICAtdyBjb20uYW5kcm9pZC5mcmFtZXdvcmtzLmNvcmV0ZXN0cy9hbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhUZXN0UnVubmVyCi0gKiB9Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIEJsdWV0b290aFRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJsdWV0b290aFRlc3RSdW5uZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc0VuYWJsZUl0ZXJhdGlvbnMgPSAxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0Rpc2NvdmVyYWJsZUl0ZXJhdGlvbnMgPSAxMDAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNTY2FuSXRlcmF0aW9ucyA9IDEwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0VuYWJsZVBhbkl0ZXJhdGlvbnMgPSAxMDAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNQYWlySXRlcmF0aW9ucyA9IDEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGludCBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNDb25uZWN0QTJkcEl0ZXJhdGlvbnMgPSAxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RJbnB1dEl0ZXJhdGlvbnMgPSAxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBpbnQgc0Nvbm5lY3RQYW5JdGVyYXRpb25zID0gMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNTdGFydFN0b3BTY29JdGVyYXRpb25zID0gMTAwOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc0RldmljZUFkZHJlc3MgPSAiIjsKLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBzRGV2aWNlUGFpclBpbiA9IHsnMScsICcyJywgJzMnLCAnNCd9OwotICAgIHB1YmxpYyBzdGF0aWMgaW50IHNEZXZpY2VQYWlyUGFzc2tleSA9IDEyMzQ1NjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0QWxsVGVzdHMoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUodGhpcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShCbHVldG9vdGhTdHJlc3NUZXN0LmNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRMb2FkZXIoKSB7Ci0gICAgICAgIHJldHVybiBCbHVldG9vdGhUZXN0UnVubmVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGFyZ3VtZW50cykgewotICAgICAgICBTdHJpbmcgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZW5hYmxlX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNFbmFibGVJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZGlzY292ZXJhYmxlX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNEaXNjb3ZlcmFibGVJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygic2Nhbl9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzU2Nhbkl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJlbmFibGVfcGFuX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNFbmFibGVQYW5JdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygicGFpcl9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzUGFpckl0ZXJhdGlvbnMgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEludmFsaWQgYXJndW1lbnQsIGZhbGwgYmFjayB0byBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2YWwgPSBhcmd1bWVudHMuZ2V0U3RyaW5nKCJjb25uZWN0X2EyZHBfaXRlcmF0aW9ucyIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc0Nvbm5lY3RBMmRwSXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfaGVhZHNldF9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzQ29ubmVjdEhlYWRzZXRJdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiY29ubmVjdF9pbnB1dF9pdGVyYXRpb25zIik7Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzQ29ubmVjdElucHV0SXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImNvbm5lY3RfcGFuX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNDb25uZWN0UGFuSXRlcmF0aW9ucyA9IEludGVnZXIucGFyc2VJbnQodmFsKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gSW52YWxpZCBhcmd1bWVudCwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoInN0YXJ0X3N0b3Bfc2NvX2l0ZXJhdGlvbnMiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNTdGFydFN0b3BTY29JdGVyYXRpb25zID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZGV2aWNlX2FkZHJlc3MiKTsKLSAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzRGV2aWNlQWRkcmVzcyA9IHZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbCA9IGFyZ3VtZW50cy5nZXRTdHJpbmcoImRldmljZV9wYWlyX3BpbiIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ5dGVbXSBwaW4gPSBCbHVldG9vdGhEZXZpY2UuY29udmVydFBpblRvQnl0ZXModmFsKTsKLSAgICAgICAgICAgIGlmIChwaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNEZXZpY2VQYWlyUGluID0gcGluOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsID0gYXJndW1lbnRzLmdldFN0cmluZygiZGV2aWNlX3BhaXJfcGFzc2tleSIpOwotICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc0RldmljZVBhaXJQYXNza2V5ID0gSW50ZWdlci5wYXJzZUludCh2YWwpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGFyZ3VtZW50LCBmYWxsIGJhY2sgdG8gZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJlbmFibGVfaXRlcmF0aW9ucz0lZCIsIHNFbmFibGVJdGVyYXRpb25zKSk7Ci0gICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiZGlzY292ZXJhYmxlX2l0ZXJhdGlvbnM9JWQiLCBzRGlzY292ZXJhYmxlSXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoInNjYW5faXRlcmF0aW9ucz0lZCIsIHNTY2FuSXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoInBhaXJfaXRlcmF0aW9ucz0lZCIsIHNQYWlySXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImNvbm5lY3RfYTJkcF9pdGVyYXRpb25zPSVkIiwgc0Nvbm5lY3RBMmRwSXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImNvbm5lY3RfaGVhZHNldF9pdGVyYXRpb25zPSVkIiwgc0Nvbm5lY3RIZWFkc2V0SXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImNvbm5lY3RfaW5wdXRfaXRlcmF0aW9ucz0lZCIsIHNDb25uZWN0SW5wdXRJdGVyYXRpb25zKSk7Ci0gICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdCgiY29ubmVjdF9wYW5faXRlcmF0aW9ucz0lZCIsIHNDb25uZWN0UGFuSXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoInN0YXJ0X3N0b3Bfc2NvX2l0ZXJhdGlvbnM9JWQiLCBzU3RhcnRTdG9wU2NvSXRlcmF0aW9ucykpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImRldmljZV9hZGRyZXNzPSVzIiwgc0RldmljZUFkZHJlc3MpKTsKLSAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KCJkZXZpY2VfcGFpcl9waW49JXMiLCBuZXcgU3RyaW5nKHNEZXZpY2VQYWlyUGluKSkpOwotICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoImRldmljZV9wYWlyX3Bhc3NrZXk9JWQiLCBzRGV2aWNlUGFpclBhc3NrZXkpKTsKLQotICAgICAgICAvLyBDYWxsIG9uQ3JlYXRlIGxhc3Qgc2luY2Ugd2Ugd2FudCB0byBzZXQgdGhlIHN0YXRpYyB2YXJpYWJsZXMgZmlyc3QuCi0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGFyZ3VtZW50cyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvYmx1ZXRvb3RoL0JsdWV0b290aFRlc3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWRkOGZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2JsdWV0b290aC9CbHVldG9vdGhUZXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5ibHVldG9vdGg7Ci0KLWltcG9ydCBhbmRyb2lkLmJsdWV0b290aC5CbHVldG9vdGhQYW47Ci1pbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoUHJvZmlsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQmx1ZXRvb3RoVGVzdFV0aWxzIGV4dGVuZHMgQXNzZXJ0IHsKLQotICAgIC8qKiBUaW1lb3V0IGZvciBlbmFibGUvZGlzYWJsZSBpbiBtcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5BQkxFX0RJU0FCTEVfVElNRU9VVCA9IDIwMDAwOwotICAgIC8qKiBUaW1lb3V0IGZvciBkaXNjb3ZlcmFibGUvdW5kaXNjb3ZlcmFibGUgaW4gbXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NPVkVSQUJMRV9VTkRJU0NPVkVSQUJMRV9USU1FT1VUID0gNTAwMDsKLSAgICAvKiogVGltZW91dCBmb3Igc3RhcnRpbmcvc3RvcHBpbmcgYSBzY2FuIGluIG1zLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9TVE9QX1NDQU5fVElNRU9VVCA9IDUwMDA7Ci0gICAgLyoqIFRpbWVvdXQgZm9yIHBhaXIvdW5wYWlyIGluIG1zLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQUlSX1VOUEFJUl9USU1FT1VUID0gMjAwMDA7Ci0gICAgLyoqIFRpbWVvdXQgZm9yIGNvbm5lY3RpbmcvZGlzY29ubmVjdGluZyBhIHByb2ZpbGUgaW4gbXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQgPSAyMDAwMDsKLSAgICAvKiogVGltZW91dCB0byBzdGFydCBvciBzdG9wIGEgU0NPIGNoYW5uZWwgaW4gbXMuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1NUT1BfU0NPX1RJTUVPVVQgPSAxMDAwMDsKLSAgICAvKiogVGltZW91dCB0byBjb25uZWN0IGEgcHJvZmlsZSBwcm94eSBpbiBtcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVF9QUk9YWV9USU1FT1VUID0gNTAwMDsKLSAgICAvKiogVGltZSBiZXR3ZWVuIHBvbGxzIGluIG1zLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xMX1RJTUUgPSAxMDA7Ci0KLSAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIEZsYWdSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUV4cGVjdGVkRmxhZ3MgPSAwOwotICAgICAgICBwcml2YXRlIGludCBtRmlyZWRGbGFncyA9IDA7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtQ29tcGxldGVkVGltZSA9IC0xOwotCi0gICAgICAgIHB1YmxpYyBGbGFnUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgICAgIG1FeHBlY3RlZEZsYWdzID0gZXhwZWN0ZWRGbGFnczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RmlyZWRGbGFncygpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRmlyZWRGbGFnczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldENvbXBsZXRlZFRpbWUoKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBsZXRlZFRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGaXJlZEZsYWcoaW50IGZsYWcpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgICAgIG1GaXJlZEZsYWdzIHw9IGZsYWc7Ci0gICAgICAgICAgICAgICAgaWYgKChtRmlyZWRGbGFncyAmIG1FeHBlY3RlZEZsYWdzKSA9PSBtRXhwZWN0ZWRGbGFncykgewotICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQmx1ZXRvb3RoUmVjZWl2ZXIgZXh0ZW5kcyBGbGFnUmVjZWl2ZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQ09WRVJZX1NUQVJURURfRkxBRyA9IDE7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUllfRklOSVNIRURfRkxBRyA9IDEgPDwgMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9OT05FX0ZMQUcgPSAxIDw8IDI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTQ0FOX01PREVfQ09OTkVDVEFCTEVfRkxBRyA9IDEgPDwgMzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEVfRkxBRyA9IDEgPDwgNDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX09GRl9GTEFHID0gMSA8PCA1OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVFVSTklOR19PTl9GTEFHID0gMSA8PCA2OwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfT05fRkxBRyA9IDEgPDwgNzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1RVUk5JTkdfT0ZGX0ZMQUcgPSAxIDw8IDg7Ci0KLSAgICAgICAgcHVibGljIEJsdWV0b290aFJlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoQmx1ZXRvb3RoQWRhcHRlci5BQ1RJT05fRElTQ09WRVJZX1NUQVJURUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoRElTQ09WRVJZX1NUQVJURURfRkxBRyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0RJU0NPVkVSWV9GSU5JU0hFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhESVNDT1ZFUllfRklOSVNIRURfRkxBRyk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NDQU5fTU9ERV9DSEFOR0VELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1vZGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TQ0FOX01PREUsIC0xKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKC0xLCBtb2RlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNDQU5fTU9ERV9OT05FX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEVfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX1NUQVRFX0NIQU5HRUQuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoQmx1ZXRvb3RoQWRhcHRlci5FWFRSQV9TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfT0ZGX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX1RVUk5JTkdfT05fRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX09OX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9UVVJOSU5HX09GRl9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGFpclJlY2VpdmVyIGV4dGVuZHMgRmxhZ1JlY2VpdmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JPTkRFRF9GTEFHID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0JPTkRJTkdfRkxBRyA9IDEgPDwgMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX05PTkVfRkxBRyA9IDEgPDwgMjsKLQotICAgICAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtRGV2aWNlOwotICAgICAgICBwcml2YXRlIGludCBtUGFzc2tleTsKLSAgICAgICAgcHJpdmF0ZSBieXRlW10gbVBpbjsKLQotICAgICAgICBwdWJsaWMgUGFpclJlY2VpdmVyKEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LCBieXRlW10gcGluLCBpbnQgZXhwZWN0ZWRGbGFncykgewotICAgICAgICAgICAgc3VwZXIoZXhwZWN0ZWRGbGFncyk7Ci0KLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBtUGFzc2tleSA9IHBhc3NrZXk7Ci0gICAgICAgICAgICBtUGluID0gcGluOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX1BBSVJJTkdfUkVRVUVTVC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGludCB2YXJpZW50ID0gaW50ZW50LmdldEludEV4dHJhKEJsdWV0b290aERldmljZS5FWFRSQV9QQUlSSU5HX1ZBUklBTlQsIC0xKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKC0xLCB2YXJpZW50KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhcmllbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuUEFJUklOR19WQVJJQU5UX1BJTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2Uuc2V0UGluKG1QaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9QQVNTS0VZOgotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRQYXNza2V5KG1QYXNza2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5QQUlSSU5HX1ZBUklBTlRfUEFTU0tFWV9DT05GSVJNQVRJT046Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9DT05TRU5UOgotICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS5zZXRQYWlyaW5nQ29uZmlybWF0aW9uKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLlBBSVJJTkdfVkFSSUFOVF9PT0JfQ09OU0VOVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2Uuc2V0UmVtb3RlT3V0T2ZCYW5kRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChCbHVldG9vdGhEZXZpY2UuQUNUSU9OX0JPTkRfU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfQk9ORF9TVEFURSwgLTEpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoLTEsIHN0YXRlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9OT05FX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9CT05ESU5HX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0JPTkRFRF9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdFByb2ZpbGVSZWNlaXZlciBleHRlbmRzIEZsYWdSZWNlaXZlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT05ORUNURURfRkxBRyA9IDE7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNUSU5HX0ZMQUcgPSAxIDw8IDE7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DT05ORUNURURfRkxBRyA9IDEgPDwgMjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RJU0NPTk5FQ1RJTkdfRkxBRyA9IDEgPDwgMzsKLQotICAgICAgICBwcml2YXRlIEJsdWV0b290aERldmljZSBtRGV2aWNlOwotICAgICAgICBwcml2YXRlIGludCBtUHJvZmlsZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbm5lY3Rpb25BY3Rpb247Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsIGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKLQotICAgICAgICAgICAgbURldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIG1Qcm9maWxlID0gcHJvZmlsZTsKLQotICAgICAgICAgICAgc3dpdGNoIChtUHJvZmlsZSkgewotICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQOgotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbkFjdGlvbiA9IEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoSGVhZHNldC5BQ1RJT05fQ09OTkVDVElPTl9TVEFURV9DSEFOR0VEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFOgotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbkFjdGlvbiA9IEJsdWV0b290aElucHV0RGV2aWNlLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gQmx1ZXRvb3RoUGFuLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uQWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25BY3Rpb24gIT0gbnVsbCAmJiBtQ29ubmVjdGlvbkFjdGlvbi5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGlmICghbURldmljZS5lcXVhbHMoaW50ZW50LmdldFBhcmNlbGFibGVFeHRyYShCbHVldG9vdGhEZXZpY2UuRVhUUkFfREVWSUNFKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQcm9maWxlLkVYVFJBX1NUQVRFLCAtMSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZSgtMSwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9ESVNDT05ORUNURURfRkxBRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQ09OTkVDVElOR19GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmlyZWRGbGFnKFNUQVRFX0NPTk5FQ1RFRF9GTEFHKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpcmVkRmxhZyhTVEFURV9ESVNDT05ORUNUSU5HX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBDb25uZWN0UGFuUmVjZWl2ZXIgZXh0ZW5kcyBDb25uZWN0UHJvZmlsZVJlY2VpdmVyIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJvbGU7Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3RQYW5SZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcm9sZSwgaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgICAgIHN1cGVyKGRldmljZSwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4sIGV4cGVjdGVkRmxhZ3MpOwotCi0gICAgICAgICAgICBtUm9sZSA9IHJvbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgaWYgKG1Sb2xlICE9IGludGVudC5nZXRJbnRFeHRyYShCbHVldG9vdGhQYW4uRVhUUkFfTE9DQUxfUk9MRSwgLTEpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdXBlci5vblJlY2VpdmUoY29udGV4dCwgaW50ZW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU3RhcnRTdG9wU2NvUmVjZWl2ZXIgZXh0ZW5kcyBGbGFnUmVjZWl2ZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09OTkVDVEVEX0ZMQUcgPSAxOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcgPSAxIDw8IDE7Ci0KLSAgICAgICAgcHVibGljIFN0YXJ0U3RvcFNjb1JlY2VpdmVyKGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgICAgICBzdXBlcihleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoQXVkaW9NYW5hZ2VyLkFDVElPTl9TQ09fQVVESU9fU1RBVEVfQ0hBTkdFRC5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGludGVudC5nZXRJbnRFeHRyYShBdWRpb01hbmFnZXIuRVhUUkFfU0NPX0FVRElPX1NUQVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9FUlJPUik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShBdWRpb01hbmFnZXIuU0NPX0FVRElPX1NUQVRFX0VSUk9SLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfQ09OTkVDVEVEX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQXVkaW9NYW5hZ2VyLlNDT19BVURJT19TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaXJlZEZsYWcoU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lciBtU2VydmljZUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBCbHVldG9vdGhQcm9maWxlLlNlcnZpY2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChpbnQgcHJvZmlsZSwgQmx1ZXRvb3RoUHJvZmlsZSBwcm94eSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQOgotICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHAgPSAoQmx1ZXRvb3RoQTJkcCkgcHJveHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkhFQURTRVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSGVhZHNldCA9IChCbHVldG9vdGhIZWFkc2V0KSBwcm94eTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0ID0gKEJsdWV0b290aElucHV0RGV2aWNlKSBwcm94eTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuUEFOOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBhbiA9IChCbHVldG9vdGhQYW4pIHByb3h5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChpbnQgcHJvZmlsZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5BMkRQOgotICAgICAgICAgICAgICAgICAgICAgICAgbUEyZHAgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUOgotICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRzZXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5JTlBVVF9ERVZJQ0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGFuID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIExpc3Q8QnJvYWRjYXN0UmVjZWl2ZXI+IG1SZWNlaXZlcnMgPSBuZXcgQXJyYXlMaXN0PEJyb2FkY2FzdFJlY2VpdmVyPigpOwotCi0gICAgcHJpdmF0ZSBCdWZmZXJlZFdyaXRlciBtT3V0cHV0V3JpdGVyOwotICAgIHByaXZhdGUgU3RyaW5nIG1UYWc7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU91dHB1dEZpbGU7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBCbHVldG9vdGhBMmRwIG1BMmRwID0gbnVsbDsKLSAgICBwcml2YXRlIEJsdWV0b290aEhlYWRzZXQgbUhlYWRzZXQgPSBudWxsOwotICAgIHByaXZhdGUgQmx1ZXRvb3RoSW5wdXREZXZpY2UgbUlucHV0ID0gbnVsbDsKLSAgICBwcml2YXRlIEJsdWV0b290aFBhbiBtUGFuID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB1dGlsaXR5IGluc3RhbmNlIGZvciB0ZXN0aW5nIEJsdWV0b290aC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBhcHBsaWNhdGlvbiB1c2luZyB0aGUgdXRpbGl0eS4KLSAgICAgKiBAcGFyYW0gdGFnIFRoZSBsb2cgdGFnIG9mIHRoZSBhcHBsaWNhdGlvbiB1c2luZyB0aGUgdXRpbGl0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmx1ZXRvb3RoVGVzdFV0aWxzKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHRhZykgewotICAgICAgICB0aGlzKGNvbnRleHQsIHRhZywgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHV0aWxpdHkgaW5zdGFuY2UgZm9yIHRlc3RpbmcgQmx1ZXRvb3RoLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgotICAgICAqIEBwYXJhbSB0YWcgVGhlIGxvZyB0YWcgb2YgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSB1dGlsaXR5LgotICAgICAqIEBwYXJhbSBvdXRwdXRGaWxlIFRoZSBwYXRoIHRvIGFuIG91dHB1dCBmaWxlIGlmIHRoZSB1dGlsaXR5IGlzIHRvIHdyaXRlIHJlc3VsdHMgdG8gYQotICAgICAqICAgICAgICBzZXBhcmF0ZSBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyBCbHVldG9vdGhUZXN0VXRpbHMoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgdGFnLCBTdHJpbmcgb3V0cHV0RmlsZSkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1UYWcgPSB0YWc7Ci0gICAgICAgIG1PdXRwdXRGaWxlID0gb3V0cHV0RmlsZTsKLQotICAgICAgICBpZiAobU91dHB1dEZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgbU91dHB1dFdyaXRlciA9IG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VEaXJlY3RvcnkoKSwgbU91dHB1dEZpbGUpLCB0cnVlKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncobVRhZywgIlRlc3Qgb3V0cHV0IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCIsIGUpOwotICAgICAgICAgICAgICAgIG1PdXRwdXRXcml0ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSB1dGlsaXR5IGluc3RhbmNlIGFuZCB1bnJlZ2lzdGVycyBhbnkgQnJvYWRjYXN0UmVjZWl2ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewotICAgICAgICB3aGlsZSAoIW1SZWNlaXZlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVycy5yZW1vdmUoMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1PdXRwdXRXcml0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtT3V0cHV0V3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncobVRhZywgIlRlc3Qgb3V0cHV0IGZpbGUgY291bGQgbm90IGJlIGNsb3NlZCIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5hYmxlcyBCbHVldG9vdGggYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCBCbHVldG9vdGggd2FzIHR1cm5lZCBvbiBhbmQgdGhhdCB0aGUgY29ycmVjdAotICAgICAqIGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmFibGUoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGludCBtYXNrID0gKEJsdWV0b290aFJlY2VpdmVyLlNUQVRFX1RVUk5JTkdfT05fRkxBRyB8IEJsdWV0b290aFJlY2VpdmVyLlNUQVRFX09OX0ZMQUcKLSAgICAgICAgICAgICAgICB8IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9GTEFHKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IC0xOwotICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOwotCi0gICAgICAgIGludCBzdGF0ZSA9IGFkYXB0ZXIuZ2V0U3RhdGUoKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09OOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09GRjoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5lbmFibGUoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PRkY6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZW5hYmxlKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJlbmFibGUoKSBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIHN0YXRlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IEVOQUJMRV9ESVNBQkxFX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gYWRhcHRlci5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT04KLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZW5hYmxlKCkgY29tcGxldGVkIGluICVkIG1zIiwgKGZpbmlzaCAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KCJlbmFibGUoKSBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImVuYWJsZSgpIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBzdGF0ZSwgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PTiwgZmlyZWRGbGFncywgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGVzIEJsdWV0b290aCBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IEJsdWV0b290aCB3YXMgdHVybmVkIG9mZiBhbmQgdGhhdCB0aGUgY29ycmVjdAotICAgICAqIGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpbnQgbWFzayA9IChCbHVldG9vdGhSZWNlaXZlci5TVEFURV9UVVJOSU5HX09GRl9GTEFHIHwgQmx1ZXRvb3RoUmVjZWl2ZXIuU1RBVEVfT0ZGX0ZMQUcKLSAgICAgICAgICAgICAgICB8IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9OT05FX0ZMQUcpOwotICAgICAgICBsb25nIHN0YXJ0ID0gLTE7Ci0gICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gYWRhcHRlci5nZXRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuaXNFbmFibGVkKCkpOwotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfVFVSTklOR19PTjoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhBZGFwdGVyLlNUQVRFX09OOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuZGlzYWJsZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9UVVJOSU5HX09GRjoKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzYWJsZSgpIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgRU5BQkxFX0RJU0FCTEVfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBhZGFwdGVyLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TVEFURV9PRkYKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShhZGFwdGVyLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImRpc2FibGUoKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoZmluaXNoIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoImRpc2FibGUoKSBjb21wbGV0ZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoImRpc2FibGUoKSB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCi0gICAgICAgICAgICAgICAgc3RhdGUsIEJsdWV0b290aEFkYXB0ZXIuU1RBVEVfT0ZGLCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0cyB0aGUgbG9jYWwgZGV2aWNlIGludG8gZGlzY292ZXJhYmxlIG1vZGUgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbG9jYWwgZGV2aWNlCi0gICAgICogaXMgaW4gZGlzY292ZXJhYmxlIG1vZGUgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2NvdmVyYWJsZShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIpIHsKLSAgICAgICAgaW50IG1hc2sgPSBCbHVldG9vdGhSZWNlaXZlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFX0ZMQUc7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKCJkaXNjb3ZlcmFibGUoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKLSAgICAgICAgaWYgKHNjYW5Nb2RlID09IEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRCbHVldG9vdGhSZWNlaXZlcihtYXNrKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUsIHNjYW5Nb2RlKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuc2V0U2Nhbk1vZGUoQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFKSk7Ci0KLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQgPCBESVNDT1ZFUkFCTEVfVU5ESVNDT1ZFUkFCTEVfVElNRU9VVCkgewotICAgICAgICAgICAgc2Nhbk1vZGUgPSBhZGFwdGVyLmdldFNjYW5Nb2RlKCk7Ci0gICAgICAgICAgICBpZiAoc2Nhbk1vZGUgPT0gQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEVfRElTQ09WRVJBQkxFCi0gICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZGlzY292ZXJhYmxlKCkgY29tcGxldGVkIGluICVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiZGlzY292ZXJhYmxlKCkgdGltZW91dDogc2Nhbk1vZGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAiCi0gICAgICAgICAgICAgICAgKyAiKGV4cGVjdGVkIDB4JXgpIiwgc2Nhbk1vZGUsIEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFX0RJU0NPVkVSQUJMRSwKLSAgICAgICAgICAgICAgICBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHV0cyB0aGUgbG9jYWwgZGV2aWNlIGludG8gY29ubmVjdGFibGUgb25seSBtb2RlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsCi0gICAgICogZGV2aWNlIGlzIGluIGluIGNvbm5lY3RhYmxlIG1vZGUgYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuZGlzY292ZXJhYmxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpbnQgbWFzayA9IEJsdWV0b290aFJlY2VpdmVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9GTEFHOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgidW5kaXNjb3ZlcmFibGUoKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKLSAgICAgICAgaWYgKHNjYW5Nb2RlID09IEJsdWV0b290aEFkYXB0ZXIuU0NBTl9NT0RFX0NPTk5FQ1RBQkxFKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRV9ESVNDT1ZFUkFCTEUsIHNjYW5Nb2RlKTsKLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIuc2V0U2Nhbk1vZGUoQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUpKTsKLQotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IERJU0NPVkVSQUJMRV9VTkRJU0NPVkVSQUJMRV9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzY2FuTW9kZSA9IGFkYXB0ZXIuZ2V0U2Nhbk1vZGUoKTsKLSAgICAgICAgICAgIGlmIChzY2FuTW9kZSA9PSBCbHVldG9vdGhBZGFwdGVyLlNDQU5fTU9ERV9DT05ORUNUQUJMRQotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoInVuZGlzY292ZXJhYmxlKCkgY29tcGxldGVkIGluICVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgidW5kaXNjb3ZlcmFibGUoKSB0aW1lb3V0OiBzY2FuTW9kZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4ICIKLSAgICAgICAgICAgICAgICArICIoZXhwZWN0ZWQgMHgleCkiLCBzY2FuTW9kZSwgQmx1ZXRvb3RoQWRhcHRlci5TQ0FOX01PREVfQ09OTkVDVEFCTEUsIGZpcmVkRmxhZ3MsCi0gICAgICAgICAgICAgICAgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0YXJ0cyBhIHNjYW4gZm9yIHJlbW90ZSBkZXZpY2VzIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGxvY2FsIGRldmljZSBpcyBzY2FubmluZwotICAgICAqIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNjYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGludCBtYXNrID0gQmx1ZXRvb3RoUmVjZWl2ZXIuRElTQ09WRVJZX1NUQVJURURfRkxBRzsKLQotICAgICAgICBpZiAoIWFkYXB0ZXIuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIGZhaWwoInN0YXJ0U2NhbigpIGJsdWV0b290aCBub3QgZW5hYmxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCbHVldG9vdGhSZWNlaXZlciByZWNlaXZlciA9IGdldEJsdWV0b290aFJlY2VpdmVyKG1hc2spOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLnN0YXJ0RGlzY292ZXJ5KCkpOwotCi0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0IDwgU1RBUlRfU1RPUF9TQ0FOX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIGlmIChhZGFwdGVyLmlzRGlzY292ZXJpbmcoKSAmJiAoKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgic3RhcnRTY2FuKCkgY29tcGxldGVkIGluICVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCkgLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgic3RhcnRTY2FuKCkgdGltZW91dDogaXNEaXNjb3ZlcmluZz0lYiwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpLCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgYSBzY2FuIGZvciByZW1vdGUgZGV2aWNlcyBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2NhbCBkZXZpY2UgaXMgbm90IHNjYW5uaW5nCi0gICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BTY2FuKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpbnQgbWFzayA9IEJsdWV0b290aFJlY2VpdmVyLkRJU0NPVkVSWV9GSU5JU0hFRF9GTEFHOwotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbCgic3RvcFNjYW4oKSBibHVldG9vdGggbm90IGVuYWJsZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0Rpc2NvdmVyaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aFJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Qmx1ZXRvb3RoUmVjZWl2ZXIobWFzayk7Ci0KLSAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAvLyBUT0RPOiBwdXQgYXNzZXJ0VHJ1ZSgpIGFyb3VuZCBjYW5jZWxEaXNjb3ZlcnkoKSBvbmNlIGl0IHN0YXJ0cyByZXR1cm5pbmcgdHJ1ZS4KLSAgICAgICAgYWRhcHRlci5jYW5jZWxEaXNjb3ZlcnkoKTsKLQotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydCA8IFNUQVJUX1NUT1BfU0NBTl9USU1FT1VUKSB7Ci0gICAgICAgICAgICBpZiAoIWFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpICYmICgocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykpIHsKLSAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCJzdG9wU2NhbigpIGNvbXBsZXRlZCBpbiAlZCBtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoInN0b3BTY2FuKCkgdGltZW91dDogaXNEaXNjb3ZlcmluZz0lYiwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHgleCkiLAotICAgICAgICAgICAgICAgIGFkYXB0ZXIuaXNEaXNjb3ZlcmluZygpLCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbmFibGVzIFBBTiB0ZXRoZXJpbmcgb24gdGhlIGxvY2FsIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRldGhlcmluZyBpcyBlbmFibGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5hYmxlUGFuKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICBpZiAobVBhbiA9PSBudWxsKSBtUGFuID0gKEJsdWV0b290aFBhbikgY29ubmVjdFByb3h5KGFkYXB0ZXIsIEJsdWV0b290aFByb2ZpbGUuUEFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtUGFuKTsKLQotICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIG1QYW4uc2V0Qmx1ZXRvb3RoVGV0aGVyaW5nKHRydWUpOwotICAgICAgICBsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtUGFuLmlzVGV0aGVyaW5nT24oKSk7Ci0KLSAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiZW5hYmxlUGFuKCkgY29tcGxldGVkIGluICVkIG1zIiwgKHN0b3AgLSBzdGFydCkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlcyBQQU4gdGV0aGVyaW5nIG9uIHRoZSBsb2NhbCBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0ZXRoZXJpbmcgaXMKLSAgICAgKiBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2FibGVQYW4oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChtUGFuID09IG51bGwpIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOwotCi0gICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVBhbi5zZXRCbHVldG9vdGhUZXRoZXJpbmcoZmFsc2UpOwotICAgICAgICBsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UobVBhbi5pc1RldGhlcmluZ09uKCkpOwotCi0gICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoImRpc2FibGVQYW4oKSBjb21wbGV0ZWQgaW4gJWQgbXMiLCAoc3RvcCAtIHN0YXJ0KSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluaXRpYXRlcyBhIHBhaXJpbmcgd2l0aCBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZGV2aWNlcyBhcmUgcGFpcmVkCi0gICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICogQHBhcmFtIHBhc3NrZXkgVGhlIHBhaXJpbmcgcGFzc2tleSBpZiBwYWlyaW5nIHJlcXVpcmVzIGEgcGFzc2tleS4gQW55IHZhbHVlIGlmIG5vdC4KLSAgICAgKiBAcGFyYW0gcGluIFRoZSBwYWlyaW5nIHBpbiBpZiBwYWlyaW5nIHJlcXVpcmVzIGEgcGluLiBBbnkgdmFsdWUgaWYgbm90LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcGFzc2tleSwgYnl0ZVtdIHBpbikgewotICAgICAgICBwYWlyT3JBY2NlcHRQYWlyKGFkYXB0ZXIsIGRldmljZSwgcGFzc2tleSwgcGluLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBY2NlcHRzIGEgcGFpcmluZyB3aXRoIGEgcmVtb3RlIGRldmljZSBhbmQgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBkZXZpY2VzIGFyZSBwYWlyZWQKLSAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gcGFzc2tleSBUaGUgcGFpcmluZyBwYXNza2V5IGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwYXNza2V5LiBBbnkgdmFsdWUgaWYgbm90LgotICAgICAqIEBwYXJhbSBwaW4gVGhlIHBhaXJpbmcgcGluIGlmIHBhaXJpbmcgcmVxdWlyZXMgYSBwaW4uIEFueSB2YWx1ZSBpZiBub3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWNjZXB0UGFpcihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UsIGludCBwYXNza2V5LAotICAgICAgICAgICAgYnl0ZVtdIHBpbikgewotICAgICAgICBwYWlyT3JBY2NlcHRQYWlyKGFkYXB0ZXIsIGRldmljZSwgcGFzc2tleSwgcGluLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB1c2VkIGJ5IHtAbGluayAjcGFpcihCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UsIGludCwgYnl0ZVtdKX0gYW5kCi0gICAgICoge0BsaW5rICNhY2NlcHRQYWlyKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSwgaW50LCBieXRlW10pfSB0byBlaXRoZXIgcGFpciBvciBhY2NlcHQKLSAgICAgKiBhIHBhaXJpbmcgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICogQHBhcmFtIHBhc3NrZXkgVGhlIHBhaXJpbmcgcGFzc2tleSBpZiBwYWlyaW5nIHJlcXVpcmVzIGEgcGFzc2tleS4gQW55IHZhbHVlIGlmIG5vdC4KLSAgICAgKiBAcGFyYW0gcGluIFRoZSBwYWlyaW5nIHBpbiBpZiBwYWlyaW5nIHJlcXVpcmVzIGEgcGluLiBBbnkgdmFsdWUgaWYgbm90LgotICAgICAqIEBwYXJhbSBzaG91bGRQYWlyIFdoZXRoZXIgdG8gcGFpciBvciBhY2NlcHQgdGhlIHBhaXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHBhaXJPckFjY2VwdFBhaXIoQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcGFzc2tleSwKLSAgICAgICAgICAgIGJ5dGVbXSBwaW4sIGJvb2xlYW4gc2hvdWxkUGFpcikgewotICAgICAgICBpbnQgbWFzayA9IFBhaXJSZWNlaXZlci5TVEFURV9CT05ESU5HX0ZMQUcgfCBQYWlyUmVjZWl2ZXIuU1RBVEVfQk9OREVEX0ZMQUc7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7Ci0gICAgICAgIGlmIChzaG91bGRQYWlyKSB7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgicGFpcihkZXZpY2U9JXMpIiwgZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJhY2NlcHRQYWlyKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhaXJSZWNlaXZlciByZWNlaXZlciA9IGdldFBhaXJSZWNlaXZlcihkZXZpY2UsIHBhc3NrZXksIHBpbiwgbWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX05PTkU6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUGFpcikgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5jcmVhdGVCb25kKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9ORElORzoKLSAgICAgICAgICAgICAgICBtYXNrID0gMDsgLy8gRG9uJ3QgY2hlY2sgZm9yIHJlY2VpdmVkIGludGVudHMgc2luY2Ugd2UgbWlnaHQgaGF2ZSBtaXNzZWQgdGhlbS4KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVEOgotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IFBBSVJfVU5QQUlSX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gZGV2aWNlLmdldEJvbmRTdGF0ZSgpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBzdGF0ZT0lZCAoZXhwZWN0ZWQgJWQpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCi0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgc3RhdGUsIEJsdWV0b290aERldmljZS5CT05EX0JPTkRFRCwgZmlyZWRGbGFncywgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlbGV0ZXMgYSBwYWlyaW5nIHdpdGggYSByZW1vdGUgZGV2aWNlIGFuZCBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGRldmljZXMgYXJlIHVucGFpcmVkCi0gICAgICogYW5kIHRoYXQgdGhlIGNvcnJlY3QgYWN0aW9ucyB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5wYWlyKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBpbnQgbWFzayA9IFBhaXJSZWNlaXZlci5TVEFURV9OT05FX0ZMQUc7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJ1bnBhaXIoZGV2aWNlPSVzKSIsIGRldmljZSk7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBhaXJSZWNlaXZlciByZWNlaXZlciA9IGdldFBhaXJSZWNlaXZlcihkZXZpY2UsIDAsIG51bGwsIG1hc2spOwotCi0gICAgICAgIGludCBzdGF0ZSA9IGRldmljZS5nZXRCb25kU3RhdGUoKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FOgotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKGFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpOwotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aERldmljZS5CT05EX0JPTkRJTkc6Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRldmljZS5yZW1vdmVCb25kKCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhEZXZpY2UuQk9ORF9CT05ERUQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhZGFwdGVyLmdldEJvbmRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGV2aWNlLnJlbW92ZUJvbmQoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgUEFJUl9VTlBBSVJfVElNRU9VVCkgewotICAgICAgICAgICAgaWYgKGRldmljZS5nZXRCb25kU3RhdGUoKSA9PSBCbHVldG9vdGhEZXZpY2UuQk9ORF9OT05FCi0gICAgICAgICAgICAgICAgICAgICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBzdGF0ZSwgQmx1ZXRvb3RoRGV2aWNlLkJPTkRfQk9OREVELCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29ubmVjdHMgYSBwcm9maWxlIGZyb20gdGhlIGxvY2FsIGRldmljZSB0byBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUKLSAgICAgKiBwcm9maWxlIGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gcHJvZmlsZSBUaGUgcHJvZmlsZSB0byBjb25uZWN0LiBPbmUgb2Yge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjQTJEUH0sCi0gICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSEVBRFNFVH0sIG9yIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0lOUFVUX0RFVklDRX0uCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIHByaW50ZWQgaW4gdGhlIGxvZ3MuICBJZiBudWxsLCB3aWxsIGJlCi0gICAgICogImNvbm5lY3RQcm9maWxlKHByb2ZpbGU9Jmx0O3Byb2ZpbGUmZ3Q7LCBkZXZpY2U9Jmx0O2RldmljZSZndDspIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3RQcm9maWxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiY29ubmVjdFByb2ZpbGUocHJvZmlsZT0lZCwgZGV2aWNlPSVzKSIsIHByb2ZpbGUsIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG1hc2sgPSAoQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNUSU5HX0ZMQUcKLSAgICAgICAgICAgICAgICB8IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfQ09OTkVDVEVEX0ZMQUcpOwotICAgICAgICBsb25nIHN0YXJ0ID0gLTE7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aFByb2ZpbGUgcHJveHkgPSBjb25uZWN0UHJveHkoYWRhcHRlciwgcHJvZmlsZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotCi0gICAgICAgIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UHJvZmlsZVJlY2VpdmVyKGRldmljZSwgcHJvZmlsZSwgbWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gcHJveHkuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLlNUQVRFX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS5jb25uZWN0KGRldmljZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gcHJveHkuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBzdGF0ZSwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNjb25uZWN0cyBhIHByb2ZpbGUgYmV0d2VlbiB0aGUgbG9jYWwgZGV2aWNlIGFuZCBhIHJlbW90ZSBkZXZpY2UgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUKLSAgICAgKiB0aGF0IHRoZSBwcm9maWxlIGlzIGRpc2Nvbm5lY3RlZCBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gcHJvZmlsZSBUaGUgcHJvZmlsZSB0byBkaXNjb25uZWN0LiBPbmUgb2Yge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjQTJEUH0sCi0gICAgICoge0BsaW5rIEJsdWV0b290aFByb2ZpbGUjSEVBRFNFVH0sIG9yIHtAbGluayBCbHVldG9vdGhQcm9maWxlI0lOUFVUX0RFVklDRX0uCi0gICAgICogQHBhcmFtIG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIHByaW50ZWQgaW4gdGhlIGxvZ3MuICBJZiBudWxsLCB3aWxsIGJlCi0gICAgICogImNvbm5lY3RQcm9maWxlKHByb2ZpbGU9Jmx0O3Byb2ZpbGUmZ3Q7LCBkZXZpY2U9Jmx0O2RldmljZSZndDspIgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRpc2Nvbm5lY3RQcm9maWxlKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSkgewotICAgICAgICBpZiAobWV0aG9kTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiZGlzY29ubmVjdFByb2ZpbGUocHJvZmlsZT0lZCwgZGV2aWNlPSVzKSIsIHByb2ZpbGUsIGRldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG1hc2sgPSAoQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNUSU5HX0ZMQUcKLSAgICAgICAgICAgICAgICB8IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUcpOwotICAgICAgICBsb25nIHN0YXJ0ID0gLTE7Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEJsdWV0b290aFByb2ZpbGUgcHJveHkgPSBjb25uZWN0UHJveHkoYWRhcHRlciwgcHJvZmlsZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocHJveHkpOwotCi0gICAgICAgIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UHJvZmlsZVJlY2VpdmVyKGRldmljZSwgcHJvZmlsZSwgbWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gcHJveHkuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuU1RBVEVfQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUocHJveHkuZGlzY29ubmVjdChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBpbnZhbGlkIHN0YXRlOiBzdGF0ZT0lZCIsIG1ldGhvZE5hbWUsIHN0YXRlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb25nIHMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfRElTQ09OTkVDVF9QUk9GSUxFX1RJTUVPVVQpIHsKLSAgICAgICAgICAgIHN0YXRlID0gcHJveHkuZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKSAmIG1hc2spID09IG1hc2spIHsKLSAgICAgICAgICAgICAgICBsb25nIGZpbmlzaCA9IHJlY2VpdmVyLmdldENvbXBsZXRlZFRpbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnQgIT0gLTEgJiYgZmluaXNoICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCBpbiAlZCBtcyIsIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbmlzaCAtIHN0YXJ0KSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlT3V0cHV0KFN0cmluZy5mb3JtYXQoIiVzIGNvbXBsZXRlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmlyZWRGbGFncyA9IHJlY2VpdmVyLmdldEZpcmVkRmxhZ3MoKTsKLSAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIHRpbWVvdXQ6IHN0YXRlPSVkIChleHBlY3RlZCAlZCksIGZsYWdzPTB4JXggKGV4cGVjdGVkIDB4JXgpIiwKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBzdGF0ZSwgQmx1ZXRvb3RoUHJvZmlsZS5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25uZWN0cyB0aGUgUEFOVSB0byBhIHJlbW90ZSBOQVAgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgUEFOVSBpcyBjb25uZWN0ZWQgYW5kIHRoYXQKLSAgICAgKiB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBjb25uZWN0UGFuT3JJbmNvbWluZ1BhbkNvbm5lY3Rpb24oYWRhcHRlciwgZGV2aWNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDaGVja3MgdGhhdCBhIHJlbW90ZSBQQU5VIGNvbm5lY3RzIHRvIHRoZSBsb2NhbCBOQVAgY29ycmVjdGx5IGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMKLSAgICAgKiB3ZXJlIGJyb2FkY2FzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhZGFwdGVyIFRoZSBCVCBhZGFwdGVyLgotICAgICAqIEBwYXJhbSBkZXZpY2UgVGhlIHJlbW90ZSBkZXZpY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5jb21pbmdQYW5Db25uZWN0aW9uKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBjb25uZWN0UGFuT3JJbmNvbWluZ1BhbkNvbm5lY3Rpb24oYWRhcHRlciwgZGV2aWNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB1c2VkIGJ5IHtAbGluayAjY29ubmVjdFBhbihCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSBhbmQKLSAgICAgKiB7QGxpbmsgI2luY29taW5nUGFuQ29ubmVjdGlvbihCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSB0byBlaXRoZXIgY29ubmVjdCB0byBhCi0gICAgICogcmVtb3RlIE5BUCBvciB2ZXJpZnkgdGhhdCBhIHJlbW90ZSBkZXZpY2UgY29ubmVjdGVkIHRvIHRoZSBsb2NhbCBOQVAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqIEBwYXJhbSBjb25uZWN0IElmIHRoZSBtZXRob2Qgc2hvdWxkIGluaXRpYXRlIHRoZSBjb25uZWN0aW9uIChpcyBQQU5VKQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0UGFuT3JJbmNvbWluZ1BhbkNvbm5lY3Rpb24oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLAotICAgICAgICAgICAgYm9vbGVhbiBjb25uZWN0KSB7Ci0gICAgICAgIGxvbmcgc3RhcnQgPSAtMTsKLSAgICAgICAgaW50IG1hc2ssIHJvbGU7Ci0gICAgICAgIFN0cmluZyBtZXRob2ROYW1lOwotCi0gICAgICAgIGlmIChjb25uZWN0KSB7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiY29ubmVjdFBhbihkZXZpY2U9JXMpIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1hc2sgPSAoQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9DT05ORUNURURfRkxBRyB8Ci0gICAgICAgICAgICAgICAgICAgIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfQ09OTkVDVElOR19GTEFHKTsKLSAgICAgICAgICAgIHJvbGUgPSBCbHVldG9vdGhQYW4uTE9DQUxfUEFOVV9ST0xFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWV0aG9kTmFtZSA9IFN0cmluZy5mb3JtYXQoImluY29taW5nUGFuQ29ubmVjdGlvbihkZXZpY2U9JXMpIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1hc2sgPSBDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0NPTk5FQ1RFRF9GTEFHOwotICAgICAgICAgICAgcm9sZSA9IEJsdWV0b290aFBhbi5MT0NBTF9OQVBfUk9MRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBibHVldG9vdGggbm90IGVuYWJsZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWFkYXB0ZXIuZ2V0Qm9uZGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgZGV2aWNlIG5vdCBwYWlyZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtUGFuID0gKEJsdWV0b290aFBhbikgY29ubmVjdFByb3h5KGFkYXB0ZXIsIEJsdWV0b290aFByb2ZpbGUuUEFOKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChtUGFuKTsKLSAgICAgICAgQ29ubmVjdFBhblJlY2VpdmVyIHJlY2VpdmVyID0gZ2V0Q29ubmVjdFBhblJlY2VpdmVyKGRldmljZSwgcm9sZSwgbWFzayk7Ci0KLSAgICAgICAgaW50IHN0YXRlID0gbVBhbi5nZXRDb25uZWN0aW9uU3RhdGUoZGV2aWNlKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVEOgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIG1hc2sgPSAwOyAvLyBEb24ndCBjaGVjayBmb3IgcmVjZWl2ZWQgaW50ZW50cyBzaW5jZSB3ZSBtaWdodCBoYXZlIG1pc3NlZCB0aGVtLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVEVEOgotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQYW4uU1RBVEVfRElTQ09OTkVDVElORzoKLSAgICAgICAgICAgICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGlmIChyb2xlID09IEJsdWV0b290aFBhbi5MT0NBTF9QQU5VX1JPTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkJUIiwgImNvbm5lY3QgdG8gcGFuIik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobVBhbi5jb25uZWN0KGRldmljZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgaW52YWxpZCBzdGF0ZTogc3RhdGU9JWQiLCBtZXRob2ROYW1lLCBzdGF0ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX0RJU0NPTk5FQ1RfUFJPRklMRV9USU1FT1VUKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1QYW4uZ2V0Q29ubmVjdGlvblN0YXRlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gQmx1ZXRvb3RoUGFuLlNUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHglcykiLAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhQYW4uU1RBVEVfQ09OTkVDVEVELCBmaXJlZEZsYWdzLCBtYXNrKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGlzY29ubmVjdHMgdGhlIFBBTlUgZnJvbSBhIHJlbW90ZSBOQVAgYW5kIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgUEFOVSBpcyBkaXNjb25uZWN0ZWQKLSAgICAgKiBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0UGFuKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBkaXNjb25uZWN0RnJvbVJlbW90ZU9yVmVyaWZ5Q29ubmVjdE5hcChhZGFwdGVyLCBkZXZpY2UsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyB0aGF0IGEgcmVtb3RlIFBBTlUgZGlzY29ubmVjdHMgZnJvbSB0aGUgbG9jYWwgTkFQIGNvcnJlY3RseSBhbmQgdGhhdCB0aGUgY29ycmVjdAotICAgICAqIGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluY29taW5nUGFuRGlzY29ubmVjdGlvbihCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIEJsdWV0b290aERldmljZSBkZXZpY2UpIHsKLSAgICAgICAgZGlzY29ubmVjdEZyb21SZW1vdGVPclZlcmlmeUNvbm5lY3ROYXAoYWRhcHRlciwgZGV2aWNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCB1c2VkIGJ5IHtAbGluayAjZGlzY29ubmVjdFBhbihCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSBhbmQKLSAgICAgKiB7QGxpbmsgI2luY29taW5nUGFuRGlzY29ubmVjdGlvbihCbHVldG9vdGhBZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UpfSB0byBlaXRoZXIgZGlzY29ubmVjdAotICAgICAqIGZyb20gYSByZW1vdGUgTkFQIG9yIHZlcmlmeSB0aGF0IGEgcmVtb3RlIGRldmljZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbG9jYWwgTkFQLgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gZGlzY29ubmVjdCBXaGV0aGVyIHRoZSBtZXRob2Qgc2hvdWxkIGNvbm5lY3Qgb3IgdmVyaWZ5LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0RnJvbVJlbW90ZU9yVmVyaWZ5Q29ubmVjdE5hcChCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsCi0gICAgICAgICAgICBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIGRpc2Nvbm5lY3QpIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IC0xOwotICAgICAgICBpbnQgbWFzaywgcm9sZTsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7Ci0KLSAgICAgICAgaWYgKGRpc2Nvbm5lY3QpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJkaXNjb25uZWN0UGFuKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICAgICAgbWFzayA9IChDb25uZWN0UHJvZmlsZVJlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RFRF9GTEFHIHwKLSAgICAgICAgICAgICAgICAgICAgQ29ubmVjdFByb2ZpbGVSZWNlaXZlci5TVEFURV9ESVNDT05ORUNUSU5HX0ZMQUcpOwotICAgICAgICAgICAgcm9sZSA9IEJsdWV0b290aFBhbi5MT0NBTF9QQU5VX1JPTEU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gU3RyaW5nLmZvcm1hdCgiaW5jb21pbmdQYW5EaXNjb25uZWN0aW9uKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICAgICAgbWFzayA9IENvbm5lY3RQcm9maWxlUmVjZWl2ZXIuU1RBVEVfRElTQ09OTkVDVEVEX0ZMQUc7Ci0gICAgICAgICAgICByb2xlID0gQmx1ZXRvb3RoUGFuLkxPQ0FMX05BUF9ST0xFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QYW4gPSAoQmx1ZXRvb3RoUGFuKSBjb25uZWN0UHJveHkoYWRhcHRlciwgQmx1ZXRvb3RoUHJvZmlsZS5QQU4pOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1QYW4pOwotICAgICAgICBDb25uZWN0UGFuUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRDb25uZWN0UGFuUmVjZWl2ZXIoZGV2aWNlLCByb2xlLCBtYXNrKTsKLQotICAgICAgICBpbnQgc3RhdGUgPSBtUGFuLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNURUQ6Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9DT05ORUNUSU5HOgotICAgICAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvbGUgPT0gQmx1ZXRvb3RoUGFuLkxPQ0FMX1BBTlVfUk9MRSkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1QYW4uZGlzY29ubmVjdChkZXZpY2UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFBhbi5TVEFURV9ESVNDT05ORUNURUQ6Ci0gICAgICAgICAgICAgICAgcmVtb3ZlUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUGFuLlNUQVRFX0RJU0NPTk5FQ1RJTkc6Ci0gICAgICAgICAgICAgICAgbWFzayA9IDA7IC8vIERvbid0IGNoZWNrIGZvciByZWNlaXZlZCBpbnRlbnRzIHNpbmNlIHdlIG1pZ2h0IGhhdmUgbWlzc2VkIHRoZW0uCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGludmFsaWQgc3RhdGU6IHN0YXRlPSVkIiwgbWV0aG9kTmFtZSwgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9ESVNDT05ORUNUX1BST0ZJTEVfVElNRU9VVCkgewotICAgICAgICAgICAgc3RhdGUgPSBtUGFuLmdldENvbm5lY3Rpb25TdGF0ZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJsdWV0b290aElucHV0RGV2aWNlLlNUQVRFX0RJU0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAmJiAocmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpICYgbWFzaykgPT0gbWFzaykgewotICAgICAgICAgICAgICAgIGxvbmcgZmluaXNoID0gcmVjZWl2ZXIuZ2V0Q29tcGxldGVkVGltZSgpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPSAtMSAmJiBmaW5pc2ggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIGluICVkIG1zIiwgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoIC0gc3RhcnQpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVPdXRwdXQoU3RyaW5nLmZvcm1hdCgiJXMgY29tcGxldGVkIiwgbWV0aG9kTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaXJlZEZsYWdzID0gcmVjZWl2ZXIuZ2V0RmlyZWRGbGFncygpOwotICAgICAgICByZW1vdmVSZWNlaXZlcihyZWNlaXZlcik7Ci0gICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgdGltZW91dDogc3RhdGU9JWQgKGV4cGVjdGVkICVkKSwgZmxhZ3M9MHgleCAoZXhwZWN0ZWQgMHglcykiLAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIHN0YXRlLCBCbHVldG9vdGhJbnB1dERldmljZS5TVEFURV9ESVNDT05ORUNURUQsIGZpcmVkRmxhZ3MsIG1hc2spKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhIFNDTyBjaGFubmVsIHVzaW5nIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlciNzdGFydEJsdWV0b290aFNjbygpfSBhbmQgY2hlY2tzCi0gICAgICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNoYW5uZWwgaXMgb3BlbmVkIGFuZCB0aGF0IHRoZSBjb3JyZWN0IGFjdGlvbnMgd2VyZSBicm9hZGNhc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBUaGUgQlQgYWRhcHRlci4KLSAgICAgKiBAcGFyYW0gZGV2aWNlIFRoZSByZW1vdGUgZGV2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2NvKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzdGFydFN0b3BTY28oYWRhcHRlciwgZGV2aWNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgYSBTQ08gY2hhbm5lbCB1c2luZyB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIjc3RvcEJsdWV0b290aFNjbygpfSBhbmQgY2hlY2tzCi0gICAgICogIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjaGFubmVsIGlzIGNsb3NlZCBhbmQgdGhhdCB0aGUgY29ycmVjdCBhY3Rpb25zIHdlcmUgYnJvYWRjYXN0LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wU2NvKEJsdWV0b290aEFkYXB0ZXIgYWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlIGRldmljZSkgewotICAgICAgICBzdGFydFN0b3BTY28oYWRhcHRlciwgZGV2aWNlLCBmYWxzZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEhlbHBlciBtZXRob2QgZm9yIHtAbGluayAjc3RhcnRTY28oQmx1ZXRvb3RoQWRhcHRlciwgQmx1ZXRvb3RoRGV2aWNlKX0gYW5kCi0gICAgICoge0BsaW5rICNzdG9wU2NvKEJsdWV0b290aEFkYXB0ZXIsIEJsdWV0b290aERldmljZSl9LgotICAgICAqCi0gICAgICogQHBhcmFtIGFkYXB0ZXIgVGhlIEJUIGFkYXB0ZXIuCi0gICAgICogQHBhcmFtIGRldmljZSBUaGUgcmVtb3RlIGRldmljZS4KLSAgICAgKiBAcGFyYW0gaXNTdGFydCBXaGV0aGVyIHRoZSBTQ08gY2hhbm5lbCBzaG91bGQgYmUgb3BlbmVkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdGFydFN0b3BTY28oQmx1ZXRvb3RoQWRhcHRlciBhZGFwdGVyLCBCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBib29sZWFuIGlzU3RhcnQpIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IC0xOwotICAgICAgICBpbnQgbWFzazsKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWU7Ci0KLSAgICAgICAgaWYgKGlzU3RhcnQpIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJzdGFydFNjbyhkZXZpY2U9JXMpIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1hc2sgPSBTdGFydFN0b3BTY29SZWNlaXZlci5TVEFURV9DT05ORUNURURfRkxBRzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGhvZE5hbWUgPSBTdHJpbmcuZm9ybWF0KCJzdG9wU2NvKGRldmljZT0lcykiLCBkZXZpY2UpOwotICAgICAgICAgICAgbWFzayA9IFN0YXJ0U3RvcFNjb1JlY2VpdmVyLlNUQVRFX0RJU0NPTk5FQ1RFRF9GTEFHOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGFwdGVyLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIiVzIGJsdWV0b290aCBub3QgZW5hYmxlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYWRhcHRlci5nZXRCb25kZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2Ugbm90IHBhaXJlZCIsIG1ldGhvZE5hbWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEF1ZGlvTWFuYWdlciBtYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG1hbmFnZXIpOwotCi0gICAgICAgIGlmICghbWFuYWdlci5pc0JsdWV0b290aFNjb0F2YWlsYWJsZU9mZkNhbGwoKSkgewotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBTQ08iLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzU2NvT24gPSBtYW5hZ2VyLmlzQmx1ZXRvb3RoU2NvT24oKTsKLSAgICAgICAgaWYgKGlzU3RhcnQgPT0gaXNTY29PbikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RhcnRTdG9wU2NvUmVjZWl2ZXIgcmVjZWl2ZXIgPSBnZXRTdGFydFN0b3BTY29SZWNlaXZlcihtYXNrKTsKLSAgICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgaWYgKGlzU3RhcnQpIHsKLSAgICAgICAgICAgIG1hbmFnZXIuc3RhcnRCbHVldG9vdGhTY28oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hbmFnZXIuc3RvcEJsdWV0b290aFNjbygpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBTVEFSVF9TVE9QX1NDT19USU1FT1VUKSB7Ci0gICAgICAgICAgICBpc1Njb09uID0gbWFuYWdlci5pc0JsdWV0b290aFNjb09uKCk7Ci0gICAgICAgICAgICBpZiAoaXNTdGFydCA9PSBpc1Njb09uICYmIChyZWNlaXZlci5nZXRGaXJlZEZsYWdzKCkgJiBtYXNrKSA9PSBtYXNrKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBmaW5pc2ggPSByZWNlaXZlci5nZXRDb21wbGV0ZWRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IC0xICYmIGZpbmlzaCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQgaW4gJWQgbXMiLCBtZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaW5pc2ggLSBzdGFydCkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB3cml0ZU91dHB1dChTdHJpbmcuZm9ybWF0KCIlcyBjb21wbGV0ZWQiLCBtZXRob2ROYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZpcmVkRmxhZ3MgPSByZWNlaXZlci5nZXRGaXJlZEZsYWdzKCk7Ci0gICAgICAgIHJlbW92ZVJlY2VpdmVyKHJlY2VpdmVyKTsKLSAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCIlcyB0aW1lb3V0OiBvbj0lYiAoZXhwZWN0ZWQgJWIpLCBmbGFncz0weCV4IChleHBlY3RlZCAweCV4KSIsCi0gICAgICAgICAgICAgICAgbWV0aG9kTmFtZSwgaXNTY29PbiwgaXNTdGFydCwgZmlyZWRGbGFncywgbWFzaykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgbG9nY2F0IGFuZCBhIGZpbGUgaWYgYSBmaWxlIGhhcyBiZWVuIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcyBUaGUgc3RyaW5nIHRvIGJlIHdyaXR0ZW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVPdXRwdXQoU3RyaW5nIHMpIHsKLSAgICAgICAgTG9nLmkobVRhZywgcyk7Ci0gICAgICAgIGlmIChtT3V0cHV0V3JpdGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU91dHB1dFdyaXRlci53cml0ZShzICsgIlxuIik7Ci0gICAgICAgICAgICBtT3V0cHV0V3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KG1UYWcsICJDb3VsZCBub3Qgd3JpdGUgdG8gb3V0cHV0IGZpbGUiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRSZWNlaXZlcihCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciwgU3RyaW5nW10gYWN0aW9ucykgewotICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBmb3IgKFN0cmluZyBhY3Rpb246IGFjdGlvbnMpIHsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOwotICAgICAgICBtUmVjZWl2ZXJzLmFkZChyZWNlaXZlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhSZWNlaXZlciBnZXRCbHVldG9vdGhSZWNlaXZlcihpbnQgZXhwZWN0ZWRGbGFncykgewotICAgICAgICBTdHJpbmdbXSBhY3Rpb25zID0gewotICAgICAgICAgICAgICAgIEJsdWV0b290aEFkYXB0ZXIuQUNUSU9OX0RJU0NPVkVSWV9GSU5JU0hFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9ESVNDT1ZFUllfU1RBUlRFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TQ0FOX01PREVfQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhBZGFwdGVyLkFDVElPTl9TVEFURV9DSEFOR0VEfTsKLSAgICAgICAgQmx1ZXRvb3RoUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQmx1ZXRvb3RoUmVjZWl2ZXIoZXhwZWN0ZWRGbGFncyk7Ci0gICAgICAgIGFkZFJlY2VpdmVyKHJlY2VpdmVyLCBhY3Rpb25zKTsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgUGFpclJlY2VpdmVyIGdldFBhaXJSZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcGFzc2tleSwgYnl0ZVtdIHBpbiwKLSAgICAgICAgICAgIGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7Ci0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9QQUlSSU5HX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoRGV2aWNlLkFDVElPTl9CT05EX1NUQVRFX0NIQU5HRUR9OwotICAgICAgICBQYWlyUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgUGFpclJlY2VpdmVyKGRldmljZSwgcGFzc2tleSwgcGluLCBleHBlY3RlZEZsYWdzKTsKLSAgICAgICAgYWRkUmVjZWl2ZXIocmVjZWl2ZXIsIGFjdGlvbnMpOwotICAgICAgICByZXR1cm4gcmVjZWl2ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb25uZWN0UHJvZmlsZVJlY2VpdmVyIGdldENvbm5lY3RQcm9maWxlUmVjZWl2ZXIoQmx1ZXRvb3RoRGV2aWNlIGRldmljZSwgaW50IHByb2ZpbGUsCi0gICAgICAgICAgICBpbnQgZXhwZWN0ZWRGbGFncykgewotICAgICAgICBTdHJpbmdbXSBhY3Rpb25zID0gewotICAgICAgICAgICAgICAgIEJsdWV0b290aEEyZHAuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRCwKLSAgICAgICAgICAgICAgICBCbHVldG9vdGhIZWFkc2V0LkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUQsCi0gICAgICAgICAgICAgICAgQmx1ZXRvb3RoSW5wdXREZXZpY2UuQUNUSU9OX0NPTk5FQ1RJT05fU1RBVEVfQ0hBTkdFRH07Ci0gICAgICAgIENvbm5lY3RQcm9maWxlUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29ubmVjdFByb2ZpbGVSZWNlaXZlcihkZXZpY2UsIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRGbGFncyk7Ci0gICAgICAgIGFkZFJlY2VpdmVyKHJlY2VpdmVyLCBhY3Rpb25zKTsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29ubmVjdFBhblJlY2VpdmVyIGdldENvbm5lY3RQYW5SZWNlaXZlcihCbHVldG9vdGhEZXZpY2UgZGV2aWNlLCBpbnQgcm9sZSwKLSAgICAgICAgICAgIGludCBleHBlY3RlZEZsYWdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGFjdGlvbnMgPSB7Qmx1ZXRvb3RoUGFuLkFDVElPTl9DT05ORUNUSU9OX1NUQVRFX0NIQU5HRUR9OwotICAgICAgICBDb25uZWN0UGFuUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgQ29ubmVjdFBhblJlY2VpdmVyKGRldmljZSwgcm9sZSwgZXhwZWN0ZWRGbGFncyk7Ci0gICAgICAgIGFkZFJlY2VpdmVyKHJlY2VpdmVyLCBhY3Rpb25zKTsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RhcnRTdG9wU2NvUmVjZWl2ZXIgZ2V0U3RhcnRTdG9wU2NvUmVjZWl2ZXIoaW50IGV4cGVjdGVkRmxhZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gYWN0aW9ucyA9IHtBdWRpb01hbmFnZXIuQUNUSU9OX1NDT19BVURJT19TVEFURV9DSEFOR0VEfTsKLSAgICAgICAgU3RhcnRTdG9wU2NvUmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgU3RhcnRTdG9wU2NvUmVjZWl2ZXIoZXhwZWN0ZWRGbGFncyk7Ci0gICAgICAgIGFkZFJlY2VpdmVyKHJlY2VpdmVyLCBhY3Rpb25zKTsKLSAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZW1vdmVSZWNlaXZlcihCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIocmVjZWl2ZXIpOwotICAgICAgICBtUmVjZWl2ZXJzLnJlbW92ZShyZWNlaXZlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCbHVldG9vdGhQcm9maWxlIGNvbm5lY3RQcm94eShCbHVldG9vdGhBZGFwdGVyIGFkYXB0ZXIsIGludCBwcm9maWxlKSB7Ci0gICAgICAgIHN3aXRjaCAocHJvZmlsZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6Ci0gICAgICAgICAgICAgICAgaWYgKG1BMmRwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BMmRwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUOgotICAgICAgICAgICAgICAgIGlmIChtSGVhZHNldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtSGVhZHNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFOgotICAgICAgICAgICAgICAgIGlmIChtSW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46Ci0gICAgICAgICAgICAgICAgaWYgKG1QYW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVBhbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGFkYXB0ZXIuZ2V0UHJvZmlsZVByb3h5KG1Db250ZXh0LCBtU2VydmljZUxpc3RlbmVyLCBwcm9maWxlKTsKLSAgICAgICAgbG9uZyBzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIHN3aXRjaCAocHJvZmlsZSkgewotICAgICAgICAgICAgY2FzZSBCbHVldG9vdGhQcm9maWxlLkEyRFA6Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1BMmRwID09IG51bGwgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzIDwgQ09OTkVDVF9QUk9YWV9USU1FT1VUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNsZWVwKFBPTExfVElNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtQTJkcDsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5IRUFEU0VUOgotICAgICAgICAgICAgICAgIHdoaWxlIChtSGVhZHNldCA9PSBudWxsICYmIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gcyA8IENPTk5FQ1RfUFJPWFlfVElNRU9VVCkgewotICAgICAgICAgICAgICAgICAgICBzbGVlcChQT0xMX1RJTUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUhlYWRzZXQ7Ci0gICAgICAgICAgICBjYXNlIEJsdWV0b290aFByb2ZpbGUuSU5QVVRfREVWSUNFOgotICAgICAgICAgICAgICAgIHdoaWxlIChtSW5wdXQgPT0gbnVsbCAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX1BST1hZX1RJTUVPVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnB1dDsKLSAgICAgICAgICAgIGNhc2UgQmx1ZXRvb3RoUHJvZmlsZS5QQU46Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG1QYW4gPT0gbnVsbCAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMgPCBDT05ORUNUX1BST1hZX1RJTUVPVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXAoUE9MTF9USU1FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QYW47Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNsZWVwKGxvbmcgdGltZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHRpbWUpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzSGlzdG9yeVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNIaXN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzJjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzSGlzdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5uZXQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuREFZX0lOX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuSE9VUl9JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzLk1JTlVURV9JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzLlNFQ09ORF9JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzLldFRUtfSU5fTUlMTElTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlscy5ZRUFSX0lOX01JTExJUzsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitAU21hbGxUZXN0CitwdWJsaWMgY2xhc3MgTmV0d29ya1N0YXRzSGlzdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdHNIaXN0b3J5VGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfU1RBUlQgPSAxMTk0MjIwODAwMDAwTDsKKworICAgIHByaXZhdGUgTmV0d29ya1N0YXRzSGlzdG9yeSBzdGF0czsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIGlmIChzdGF0cyAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRDb25zaXN0ZW50KHN0YXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRTaW5nbGVCdWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyBCVUNLRVRfU0laRSA9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KEJVQ0tFVF9TSVpFKTsKKworICAgICAgICAvLyByZWNvcmQgZGF0YSBpbnRvIG5hcnJvdyB3aW5kb3cgdG8gZ2V0IHNpbmdsZSBidWNrZXQKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShURVNUX1NUQVJULCBURVNUX1NUQVJUICsgU0VDT05EX0lOX01JTExJUywgMTAyNEwsIDIwNDhMKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdHMuYnVja2V0Q291bnQpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDAsIDEwMjRMLCAyMDQ4TCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZEVxdWFsQnVja2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIGJ1Y2tldER1cmF0aW9uID0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoYnVja2V0RHVyYXRpb24pOworCisgICAgICAgIC8vIHNwbGl0IGVxdWFsbHkgYWNyb3NzIHR3byBidWNrZXRzCisgICAgICAgIGZpbmFsIGxvbmcgcmVjb3JkU3RhcnQgPSBURVNUX1NUQVJUICsgKGJ1Y2tldER1cmF0aW9uIC8gMik7CisgICAgICAgIHN0YXRzLnJlY29yZERhdGEocmVjb3JkU3RhcnQsIHJlY29yZFN0YXJ0ICsgYnVja2V0RHVyYXRpb24sIDEwMjRMLCAxMjhMKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3RhdHMuYnVja2V0Q291bnQpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDAsIDUxMkwsIDY0TCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgNTEyTCwgNjRMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkVG91Y2hpbmdCdWNrZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgQlVDS0VUX1NJWkUgPSAxNSAqIE1JTlVURV9JTl9NSUxMSVM7CisgICAgICAgIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoQlVDS0VUX1NJWkUpOworCisgICAgICAgIC8vIHNwbGl0IGFsbW9zdCBjb21wbGV0ZWx5IGludG8gbWlkZGxlIGJ1Y2tldCwgYnV0IHdpdGggYSBmZXcgbWludXRlcworICAgICAgICAvLyBvdmVybGFwIGludG8gbmVpZ2hib3JpbmcgYnVja2V0cy4gdG90YWwgcmVjb3JkIGlzIDIwIG1pbnV0ZXMuCisgICAgICAgIGZpbmFsIGxvbmcgcmVjb3JkU3RhcnQgPSAoVEVTVF9TVEFSVCArIEJVQ0tFVF9TSVpFKSAtIE1JTlVURV9JTl9NSUxMSVM7CisgICAgICAgIGZpbmFsIGxvbmcgcmVjb3JkRW5kID0gKFRFU1RfU1RBUlQgKyAoQlVDS0VUX1NJWkUgKiAyKSkgKyAoTUlOVVRFX0lOX01JTExJUyAqIDQpOworICAgICAgICBzdGF0cy5yZWNvcmREYXRhKHJlY29yZFN0YXJ0LCByZWNvcmRFbmQsIDEwMDBMLCA1MDAwTCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHN0YXRzLmJ1Y2tldENvdW50KTsKKyAgICAgICAgLy8gZmlyc3QgYnVja2V0IHNob3VsZCBoYXZlICgxLzIwIG9mIHZhbHVlKQorICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDAsIDUwTCwgMjUwTCk7CisgICAgICAgIC8vIHNlY29uZCBidWNrZXQgc2hvdWxkIGhhdmUgKDE1LzIwIG9mIHZhbHVlKQorICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDEsIDc1MEwsIDM3NTBMKTsKKyAgICAgICAgLy8gZmluYWwgYnVja2V0IHNob3VsZCBoYXZlICg0LzIwIG9mIHZhbHVlKQorICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDIsIDIwMEwsIDEwMDBMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjb3JkR2FwQnVja2V0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIEJVQ0tFVF9TSVpFID0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoQlVDS0VUX1NJWkUpOworCisgICAgICAgIC8vIHJlY29yZCBzb21lIGRhdGEgdG9kYXkgYW5kIG5leHQgd2VlayB3aXRoIGxhcmdlIGdhcAorICAgICAgICBmaW5hbCBsb25nIGZpcnN0U3RhcnQgPSBURVNUX1NUQVJUOworICAgICAgICBmaW5hbCBsb25nIGxhc3RTdGFydCA9IFRFU1RfU1RBUlQgKyBXRUVLX0lOX01JTExJUzsKKyAgICAgICAgc3RhdHMucmVjb3JkRGF0YShmaXJzdFN0YXJ0LCBmaXJzdFN0YXJ0ICsgU0VDT05EX0lOX01JTExJUywgMTI4TCwgMjU2TCk7CisgICAgICAgIHN0YXRzLnJlY29yZERhdGEobGFzdFN0YXJ0LCBsYXN0U3RhcnQgKyBTRUNPTkRfSU5fTUlMTElTLCA2NEwsIDUxMkwpOworCisgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIHR3byBidWNrZXRzLCBmYXIgYXBhcnQgZnJvbSBlYWNoIG90aGVyCisgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgMTI4TCwgMjU2TCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgNjRMLCA1MTJMKTsKKworICAgICAgICAvLyBub3cgcmVjb3JkIHNvbWV0aGluZyBpbiBtaWRkbGUsIHNwcmVhZCBhY3Jvc3MgdHdvIGJ1Y2tldHMKKyAgICAgICAgZmluYWwgbG9uZyBtaWRkbGVTdGFydCA9IFRFU1RfU1RBUlQgKyBEQVlfSU5fTUlMTElTOworICAgICAgICBmaW5hbCBsb25nIG1pZGRsZUVuZCA9IG1pZGRsZVN0YXJ0ICsgKEhPVVJfSU5fTUlMTElTICogMik7CisgICAgICAgIHN0YXRzLnJlY29yZERhdGEobWlkZGxlU3RhcnQsIG1pZGRsZUVuZCwgMjA0OEwsIDIwNDhMKTsKKworICAgICAgICAvLyBub3cgc2hvdWxkIGhhdmUgZm91ciBidWNrZXRzLCB3aXRoIG5ldyByZWNvcmQgaW4gbWlkZGxlIHR3byBidWNrZXRzCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgMTI4TCwgMjU2TCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgMTAyNEwsIDEwMjRMKTsKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAyLCAxMDI0TCwgMTAyNEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDMsIDY0TCwgNTEyTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlY29yZE92ZXJsYXBCdWNrZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgQlVDS0VUX1NJWkUgPSBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgc3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzSGlzdG9yeShCVUNLRVRfU0laRSk7CisKKyAgICAgICAgLy8gcmVjb3JkIHNvbWUgZGF0YSBpbiBvbmUgYnVja2V0LCBhbmQgYW5vdGhlciBvdmVybGFwcGluZyBidWNrZXRzCisgICAgICAgIHN0YXRzLnJlY29yZERhdGEoVEVTVF9TVEFSVCwgVEVTVF9TVEFSVCArIFNFQ09ORF9JTl9NSUxMSVMsIDI1NkwsIDI1NkwpOworICAgICAgICBmaW5hbCBsb25nIG1pZFN0YXJ0ID0gVEVTVF9TVEFSVCArIChIT1VSX0lOX01JTExJUyAvIDIpOworICAgICAgICBzdGF0cy5yZWNvcmREYXRhKG1pZFN0YXJ0LCBtaWRTdGFydCArIEhPVVJfSU5fTUlMTElTLCAxMDI0TCwgMTAyNEwpOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHR3byBidWNrZXRzLCB3aXRoIHNvbWUgZGF0YSBtaXhlZCB0b2dldGhlcgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3RhdHMuYnVja2V0Q291bnQpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDAsIDc2OEwsIDc2OEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDEsIDUxMkwsIDUxMkwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRFbnRpcmVHYXBJZGVudGljYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZ1tdIHRvdGFsID0gbmV3IGxvbmdbMl07CisKKyAgICAgICAgLy8gZmlyc3QsIGNyZWF0ZSB0d28gc2VwYXJhdGUgaGlzdG9yaWVzIGZhciBhcGFydAorICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IHN0YXRzMSA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KEhPVVJfSU5fTUlMTElTKTsKKyAgICAgICAgc3RhdHMxLnJlY29yZERhdGEoVEVTVF9TVEFSVCwgVEVTVF9TVEFSVCArIDIgKiBIT1VSX0lOX01JTExJUywgMjAwMEwsIDEwMDBMKTsKKworICAgICAgICBmaW5hbCBsb25nIFRFU1RfU1RBUlRfMiA9IFRFU1RfU1RBUlQgKyBEQVlfSU5fTUlMTElTOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IHN0YXRzMiA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KEhPVVJfSU5fTUlMTElTKTsKKyAgICAgICAgc3RhdHMyLnJlY29yZERhdGEoVEVTVF9TVEFSVF8yLCBURVNUX1NUQVJUXzIgKyAyICogSE9VUl9JTl9NSUxMSVMsIDEwMDBMLCA1MDBMKTsKKworICAgICAgICAvLyBjb21iaW5lIHRvZ2V0aGVyIHdpdGggaWRlbnRpY2FsIGJ1Y2tldCBzaXplCisgICAgICAgIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoSE9VUl9JTl9NSUxMSVMpOworICAgICAgICBzdGF0cy5yZWNvcmRFbnRpcmVIaXN0b3J5KHN0YXRzMSk7CisgICAgICAgIHN0YXRzLnJlY29yZEVudGlyZUhpc3Rvcnkoc3RhdHMyKTsKKworICAgICAgICAvLyBmaXJzdCB2ZXJpZnkgdGhhdCB0b3RhbHMgbWF0Y2ggdXAKKyAgICAgICAgc3RhdHMuZ2V0VG90YWxEYXRhKFRFU1RfU1RBUlQgLSBXRUVLX0lOX01JTExJUywgVEVTVF9TVEFSVCArIFdFRUtfSU5fTUlMTElTLCB0b3RhbCk7CisgICAgICAgIGFzc2VydFRvdGFsRXF1YWxzKHRvdGFsLCAzMDAwTCwgMTUwMEwpOworCisgICAgICAgIC8vIG5vdyBpbnNwZWN0IGludGVybmFsIGJ1Y2tldHMKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAwLCAxMDAwTCwgNTAwTCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgMTAwMEwsIDUwMEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDIsIDUwMEwsIDI1MEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDMsIDUwMEwsIDI1MEwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvcmRFbnRpcmVPdmVybGFwVmFyeWluZ0J1Y2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZ1tdIHRvdGFsID0gbmV3IGxvbmdbMl07CisKKyAgICAgICAgLy8gY3JlYXRlIGhpc3RvcnkganVzdCBvdmVyIGhvdXIgYnVja2V0IGJvdW5kYXJ5CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3Rvcnkgc3RhdHMxID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoSE9VUl9JTl9NSUxMSVMpOworICAgICAgICBzdGF0czEucmVjb3JkRGF0YShURVNUX1NUQVJULCBURVNUX1NUQVJUICsgTUlOVVRFX0lOX01JTExJUyAqIDYwLCA2MDBMLCA2MDBMKTsKKworICAgICAgICBmaW5hbCBsb25nIFRFU1RfU1RBUlRfMiA9IFRFU1RfU1RBUlQgKyBNSU5VVEVfSU5fTUlMTElTOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IHN0YXRzMiA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KE1JTlVURV9JTl9NSUxMSVMpOworICAgICAgICBzdGF0czIucmVjb3JkRGF0YShURVNUX1NUQVJUXzIsIFRFU1RfU1RBUlRfMiArIE1JTlVURV9JTl9NSUxMSVMgKiA1LCA1MEwsIDUwTCk7CisKKyAgICAgICAgLy8gY29tYmluZSB0b2dldGhlciB3aXRoIG1pbnV0ZSBidWNrZXQgc2l6ZQorICAgICAgICBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KE1JTlVURV9JTl9NSUxMSVMpOworICAgICAgICBzdGF0cy5yZWNvcmRFbnRpcmVIaXN0b3J5KHN0YXRzMSk7CisgICAgICAgIHN0YXRzLnJlY29yZEVudGlyZUhpc3Rvcnkoc3RhdHMyKTsKKworICAgICAgICAvLyBmaXJzdCB2ZXJpZnkgdGhhdCB0b3RhbHMgbWF0Y2ggdXAKKyAgICAgICAgc3RhdHMuZ2V0VG90YWxEYXRhKFRFU1RfU1RBUlQgLSBXRUVLX0lOX01JTExJUywgVEVTVF9TVEFSVCArIFdFRUtfSU5fTUlMTElTLCB0b3RhbCk7CisgICAgICAgIGFzc2VydFRvdGFsRXF1YWxzKHRvdGFsLCA2NTBMLCA2NTBMKTsKKworICAgICAgICAvLyBub3cgaW5zcGVjdCBpbnRlcm5hbCBidWNrZXRzCisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgMTBMLCAxMEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDEsIDIwTCwgMjBMKTsKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCAyLCAyMEwsIDIwTCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMywgMjBMLCAyMEwpOworICAgICAgICBhc3NlcnRCdWNrZXQoc3RhdHMsIDQsIDIwTCwgMjBMKTsKKyAgICAgICAgYXNzZXJ0QnVja2V0KHN0YXRzLCA1LCAyMEwsIDIwTCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgNiwgMTBMLCAxMEwpOworCisgICAgICAgIC8vIG5vdyBjb21iaW5lIHVzaW5nIDE1bWluIGJ1Y2tldHMKKyAgICAgICAgc3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzSGlzdG9yeShIT1VSX0lOX01JTExJUyAvIDQpOworICAgICAgICBzdGF0cy5yZWNvcmRFbnRpcmVIaXN0b3J5KHN0YXRzMSk7CisgICAgICAgIHN0YXRzLnJlY29yZEVudGlyZUhpc3Rvcnkoc3RhdHMyKTsKKworICAgICAgICAvLyBmaXJzdCB2ZXJpZnkgdGhhdCB0b3RhbHMgbWF0Y2ggdXAKKyAgICAgICAgc3RhdHMuZ2V0VG90YWxEYXRhKFRFU1RfU1RBUlQgLSBXRUVLX0lOX01JTExJUywgVEVTVF9TVEFSVCArIFdFRUtfSU5fTUlMTElTLCB0b3RhbCk7CisgICAgICAgIGFzc2VydFRvdGFsRXF1YWxzKHRvdGFsLCA2NTBMLCA2NTBMKTsKKworICAgICAgICAvLyBhbmQgaW5zcGVjdCBidWNrZXRzCisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMCwgMjAwTCwgMjAwTCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMSwgMTUwTCwgMTUwTCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMiwgMTUwTCwgMTUwTCk7CisgICAgICAgIGFzc2VydEJ1Y2tldChzdGF0cywgMywgMTUwTCwgMTUwTCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KEhPVVJfSU5fTUlMTElTKTsKKworICAgICAgICAvLyByZWNvcmQgc29tZSBkYXRhIGFjcm9zcyAyNCBidWNrZXRzCisgICAgICAgIHN0YXRzLnJlY29yZERhdGEoVEVTVF9TVEFSVCwgVEVTVF9TVEFSVCArIERBWV9JTl9NSUxMSVMsIDI0TCwgMjRMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI0LCBzdGF0cy5idWNrZXRDb3VudCk7CisKKyAgICAgICAgLy8gdHJ5IHJlbW92aW5nIGZhciBiZWZvcmUgYnVja2V0czsgc2hvdWxkIGJlIG5vIGNoYW5nZQorICAgICAgICBzdGF0cy5yZW1vdmVCdWNrZXRzQmVmb3JlKFRFU1RfU1RBUlQgLSBZRUFSX0lOX01JTExJUyk7CisgICAgICAgIGFzc2VydEVxdWFscygyNCwgc3RhdHMuYnVja2V0Q291bnQpOworCisgICAgICAgIC8vIHRyeSByZW1vdmluZyBqdXN0IG1vbWVudHMgaW50byBmaXJzdCBidWNrZXQ7IHNob3VsZCBiZSBubyBjaGFuZ2UKKyAgICAgICAgLy8gc2luY2UgdGhhdCBidWNrZXQgY29udGFpbnMgZGF0YSBiZXlvbmQgdGhlIGN1dG9mZgorICAgICAgICBzdGF0cy5yZW1vdmVCdWNrZXRzQmVmb3JlKFRFU1RfU1RBUlQgKyBTRUNPTkRfSU5fTUlMTElTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI0LCBzdGF0cy5idWNrZXRDb3VudCk7CisKKyAgICAgICAgLy8gdHJ5IHJlbW92aW5nIHNpbmdsZSBidWNrZXQKKyAgICAgICAgc3RhdHMucmVtb3ZlQnVja2V0c0JlZm9yZShURVNUX1NUQVJUICsgSE9VUl9JTl9NSUxMSVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjMsIHN0YXRzLmJ1Y2tldENvdW50KTsKKworICAgICAgICAvLyB0cnkgcmVtb3ZpbmcgbXVsdGlwbGUgYnVja2V0cworICAgICAgICBzdGF0cy5yZW1vdmVCdWNrZXRzQmVmb3JlKFRFU1RfU1RBUlQgKyAoNCAqIEhPVVJfSU5fTUlMTElTKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMCwgc3RhdHMuYnVja2V0Q291bnQpOworCisgICAgICAgIC8vIHRyeSByZW1vdmluZyBhbGwgYnVja2V0cworICAgICAgICBzdGF0cy5yZW1vdmVCdWNrZXRzQmVmb3JlKFRFU1RfU1RBUlQgKyBZRUFSX0lOX01JTExJUyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0cy5idWNrZXRDb3VudCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRvdGFsRGF0YSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIEJVQ0tFVF9TSVpFID0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoQlVDS0VUX1NJWkUpOworCisgICAgICAgIC8vIHJlY29yZCB1bmlmb3JtIGRhdGEgYWNyb3NzIGRheQorICAgICAgICBzdGF0cy5yZWNvcmREYXRhKFRFU1RfU1RBUlQsIFRFU1RfU1RBUlQgKyBEQVlfSU5fTUlMTElTLCAyNDAwTCwgNDgwMEwpOworCisgICAgICAgIGZpbmFsIGxvbmdbXSB0b3RhbCA9IG5ldyBsb25nWzJdOworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRvdGFsIG91dHNpZGUgcmFuZ2UgaXMgMAorICAgICAgICBzdGF0cy5nZXRUb3RhbERhdGEoVEVTVF9TVEFSVCAtIFdFRUtfSU5fTUlMTElTLCBURVNUX1NUQVJUIC0gREFZX0lOX01JTExJUywgdG90YWwpOworICAgICAgICBhc3NlcnRUb3RhbEVxdWFscyh0b3RhbCwgMCwgMCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRvdGFsIGluIGZpcnN0IGhvdXIKKyAgICAgICAgc3RhdHMuZ2V0VG90YWxEYXRhKFRFU1RfU1RBUlQsIFRFU1RfU1RBUlQgKyBIT1VSX0lOX01JTExJUywgdG90YWwpOworICAgICAgICBhc3NlcnRUb3RhbEVxdWFscyh0b3RhbCwgMTAwLCAyMDApOworCisgICAgICAgIC8vIHZlcmlmeSB0b3RhbCBhY3Jvc3MgMS41IGhvdXJzCisgICAgICAgIHN0YXRzLmdldFRvdGFsRGF0YShURVNUX1NUQVJULCBURVNUX1NUQVJUICsgKGxvbmcpICgxLjUgKiBIT1VSX0lOX01JTExJUyksIHRvdGFsKTsKKyAgICAgICAgYXNzZXJ0VG90YWxFcXVhbHModG90YWwsIDE1MCwgMzAwKTsKKworICAgICAgICAvLyB2ZXJpZnkgdG90YWwgYmV5b25kIGVuZAorICAgICAgICBzdGF0cy5nZXRUb3RhbERhdGEoVEVTVF9TVEFSVCArICgyMyAqIEhPVVJfSU5fTUlMTElTKSwgVEVTVF9TVEFSVCArIFdFRUtfSU5fTUlMTElTLCB0b3RhbCk7CisgICAgICAgIGFzc2VydFRvdGFsRXF1YWxzKHRvdGFsLCAxMDAsIDIwMCk7CisKKyAgICAgICAgLy8gdmVyaWZ5IGV2ZXJ5dGhpbmcgdG90YWwKKyAgICAgICAgc3RhdHMuZ2V0VG90YWxEYXRhKFRFU1RfU1RBUlQgLSBXRUVLX0lOX01JTExJUywgVEVTVF9TVEFSVCArIFdFRUtfSU5fTUlMTElTLCB0b3RhbCk7CisgICAgICAgIGFzc2VydFRvdGFsRXF1YWxzKHRvdGFsLCAyNDAwLCA0ODAwKTsKKworICAgIH0KKworICAgIEBTdXBwcmVzcworICAgIHB1YmxpYyB2b2lkIHRlc3RGdXp6aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBmdXp6aW5nIHdpdGggcmFuZG9tIGV2ZW50cywgbG9va2luZyBmb3IgY3Jhc2hlcworICAgICAgICAgICAgZmluYWwgUmFuZG9tIHIgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzSGlzdG9yeShyLm5leHRMb25nKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAwMDA7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoci5uZXh0Qm9vbGVhbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQgPSByLm5leHRMb25nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGVuZCA9IHN0YXJ0ICsgci5uZXh0SW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5yZWNvcmREYXRhKHN0YXJ0LCBlbmQsIHIubmV4dExvbmcoKSwgci5uZXh0TG9uZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5yZW1vdmVCdWNrZXRzQmVmb3JlKHIubmV4dExvbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0Q29uc2lzdGVudChzdGF0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsIFN0cmluZy52YWx1ZU9mKHN0YXRzKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29uc2lzdGVudChOZXR3b3JrU3RhdHNIaXN0b3J5IHN0YXRzKSB7CisgICAgICAgIC8vIHZlcmlmeSB0aW1lc3RhbXBzIGFyZSBtb25vdG9uaWMKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzdGF0cy5idWNrZXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHN0YXRzLmJ1Y2tldFN0YXJ0W2kgLSAxXSA8IHN0YXRzLmJ1Y2tldFN0YXJ0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VG90YWxFcXVhbHMobG9uZ1tdIHRvdGFsLCBsb25nIHJ4LCBsb25nIHR4KSB7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCByeCIsIHJ4LCB0b3RhbFswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCB0eCIsIHR4LCB0b3RhbFsxXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRCdWNrZXQoTmV0d29ya1N0YXRzSGlzdG9yeSBzdGF0cywgaW50IGluZGV4LCBsb25nIHJ4LCBsb25nIHR4KSB7CisgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCByeCIsIHJ4LCBzdGF0cy5yeFtpbmRleF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoInVuZXhwZWN0ZWQgdHgiLCB0eCwgc3RhdHMudHhbaW5kZXhdKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvTmV0d29ya1N0YXRzVGVzdC5qYXZhCmluZGV4IDQ1NzE5YzIuLjNjYjY0YzcgMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9OZXR3b3JrU3RhdHNUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L05ldHdvcmtTdGF0c1Rlc3QuamF2YQpAQCAtMTYsNyArMTYsOCBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0OwogCi1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzLlRBR19OT05FOworCiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlNtYWxsVGVzdDsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTI1LDMwICsyNiw3NiBAQAogcHVibGljIGNsYXNzIE5ldHdvcmtTdGF0c1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9JRkFDRSA9ICJ0ZXN0MCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfVUlEID0gMTAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRFU1RfU1RBUlQgPSAxMTk0MjIwODAwMDAwTDsKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0cy5CdWlsZGVyKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLCAzKQotICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIDEwMjQsIDApCi0gICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgMCwgMTAyNCkKLSAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAyLCAxMDI0LCAxMDI0KS5idWlsZCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgc3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzKFRFU1RfU1RBUlQsIDMpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgVEFHX05PTkUsIDEwMjRMLCAwTCkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCBUQUdfTk9ORSwgMEwsIDEwMjRMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDIsIFRBR19OT05FLCAxMDI0TCwgMTAyNEwpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5maW5kSW5kZXgoVEVTVF9JRkFDRSwgMTAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5maW5kSW5kZXgoVEVTVF9JRkFDRSwgMTAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzdGF0cy5maW5kSW5kZXgoVEVTVF9JRkFDRSwgMTAwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygtMSwgc3RhdHMuZmluZEluZGV4KFRFU1RfSUZBQ0UsIDYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHN0YXRzLmZpbmRJbmRleChURVNUX0lGQUNFLCAxMDIsIFRBR19OT05FKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5maW5kSW5kZXgoVEVTVF9JRkFDRSwgMTAyLCBUQUdfTk9ORSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3RhdHMuZmluZEluZGV4KFRFU1RfSUZBQ0UsIDEwMCwgVEFHX05PTkUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzdGF0cy5maW5kSW5kZXgoVEVTVF9JRkFDRSwgNiwgVEFHX05PTkUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRW50cnlHcm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMoVEVTVF9TVEFSVCwgMik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN0YXRzLnNpemUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3RhdHMuaWZhY2UubGVuZ3RoKTsKKworICAgICAgICBzdGF0cy5hZGRFbnRyeShURVNUX0lGQUNFLCBURVNUX1VJRCwgVEFHX05PTkUsIDFMLCAyTCk7CisgICAgICAgIHN0YXRzLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIFRFU1RfVUlELCBUQUdfTk9ORSwgMkwsIDJMKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3RhdHMuc2l6ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzdGF0cy5pZmFjZS5sZW5ndGgpOworCisgICAgICAgIHN0YXRzLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIFRFU1RfVUlELCBUQUdfTk9ORSwgM0wsIDRMKTsKKyAgICAgICAgc3RhdHMuYWRkRW50cnkoVEVTVF9JRkFDRSwgVEVTVF9VSUQsIFRBR19OT05FLCA0TCwgNEwpOworICAgICAgICBzdGF0cy5hZGRFbnRyeShURVNUX0lGQUNFLCBURVNUX1VJRCwgVEFHX05PTkUsIDVMLCA1TCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHN0YXRzLnNpemUpOworICAgICAgICBhc3NlcnRUcnVlKHN0YXRzLmlmYWNlLmxlbmd0aCA+PSA1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIHN0YXRzLnJ4WzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBzdGF0cy5yeFsxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygzTCwgc3RhdHMucnhbMl0pOworICAgICAgICBhc3NlcnRFcXVhbHMoNEwsIHN0YXRzLnJ4WzNdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDVMLCBzdGF0cy5yeFs0XSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbWJpbmVFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgc3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzKFRFU1RfU1RBUlQsIDEwKTsKKworICAgICAgICBzdGF0cy5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAxLCBUQUdfTk9ORSwgNTEyTCwgMjU2TCk7CisgICAgICAgIHN0YXRzLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMDEsIDB4ZmYsIDEyOEwsIDEyOEwpOworICAgICAgICBzdGF0cy5jb21iaW5lRW50cnkoVEVTVF9JRkFDRSwgMTAwMSwgVEFHX05PTkUsIC0xMjhMLCAtMTI4TCk7CisKKyAgICAgICAgYXNzZXJ0U3RhdHNFbnRyeShzdGF0cywgMCwgVEVTVF9JRkFDRSwgMTAwMSwgVEFHX05PTkUsIDM4NEwsIDEyOEwpOworICAgICAgICBhc3NlcnRTdGF0c0VudHJ5KHN0YXRzLCAxLCBURVNUX0lGQUNFLCAxMDAxLCAweGZmLCAxMjhMLCAxMjhMKTsKKworICAgICAgICAvLyBub3cgdHJ5IGNvbWJpbmluZyB0aGF0IHNob3VsZCBjcmVhdGUgcm93CisgICAgICAgIHN0YXRzLmNvbWJpbmVFbnRyeShURVNUX0lGQUNFLCA1MDA1LCBUQUdfTk9ORSwgMTI4TCwgMTI4TCk7CisgICAgICAgIGFzc2VydFN0YXRzRW50cnkoc3RhdHMsIDIsIFRFU1RfSUZBQ0UsIDUwMDUsIFRBR19OT05FLCAxMjhMLCAxMjhMKTsKKyAgICAgICAgc3RhdHMuY29tYmluZUVudHJ5KFRFU1RfSUZBQ0UsIDUwMDUsIFRBR19OT05FLCAxMjhMLCAxMjhMKTsKKyAgICAgICAgYXNzZXJ0U3RhdHNFbnRyeShzdGF0cywgMiwgVEVTVF9JRkFDRSwgNTAwNSwgVEFHX05PTkUsIDI1NkwsIDI1NkwpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdElkZW50aWNhbERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGJlZm9yZSA9IG5ldyBOZXR3b3JrU3RhdHMuQnVpbGRlcihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSwgMikKLSAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAwLCAxMDI0LCAwKQotICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDEsIDAsIDEwMjQpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBiZWZvcmUgPSBuZXcgTmV0d29ya1N0YXRzKFRFU1RfU1RBUlQsIDIpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgVEFHX05PTkUsIDEwMjRMLCAwTCkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCBUQUdfTk9ORSwgMEwsIDEwMjRMKTsKIAotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgYWZ0ZXIgPSBuZXcgTmV0d29ya1N0YXRzLkJ1aWxkZXIoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCksIDIpCi0gICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgMTAyNCwgMCkKLSAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCAwLCAxMDI0KS5idWlsZCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgYWZ0ZXIgPSBuZXcgTmV0d29ya1N0YXRzKFRFU1RfU1RBUlQsIDIpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgVEFHX05PTkUsIDEwMjRMLCAwTCkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCBUQUdfTk9ORSwgMEwsIDEwMjRMKTsKIAogICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgcmVzdWx0ID0gYWZ0ZXIuc3VidHJhY3QoYmVmb3JlKTsKIAorICAgICAgICAvLyBpZGVudGljYWwgZGF0YSBzaG91bGQgcmVzdWx0IGluIHplcm8gZGVsdGEKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5yeFswXSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQudHhbMF0pOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LnJ4WzFdKTsKQEAgLTU2LDEzICsxMDMsMTMgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3RJZGVudGljYWxSb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBiZWZvcmUgPSBuZXcgTmV0d29ya1N0YXRzLkJ1aWxkZXIoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCksIDIpCi0gICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgMTAyNCwgMCkKLSAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCAwLCAxMDI0KS5idWlsZCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgYmVmb3JlID0gbmV3IE5ldHdvcmtTdGF0cyhURVNUX1NUQVJULCAyKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIFRBR19OT05FLCAxMDI0TCwgMEwpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgVEFHX05PTkUsIDBMLCAxMDI0TCk7CiAKLSAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGFmdGVyID0gbmV3IE5ldHdvcmtTdGF0cy5CdWlsZGVyKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLCAyKQotICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIDEwMjUsIDIpCi0gICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgMywgMTAyOCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGFmdGVyID0gbmV3IE5ldHdvcmtTdGF0cyhURVNUX1NUQVJULCAyKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIFRBR19OT05FLCAxMDI1TCwgMkwpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgVEFHX05PTkUsIDNMLCAxMDI4TCk7CiAKICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHJlc3VsdCA9IGFmdGVyLnN1YnRyYWN0KGJlZm9yZSk7CiAKQEAgLTc0LDE0ICsxMjEsMTQgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3VidHJhY3ROZXdSb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBiZWZvcmUgPSBuZXcgTmV0d29ya1N0YXRzLkJ1aWxkZXIoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCksIDIpCi0gICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgMTAyNCwgMCkKLSAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCAwLCAxMDI0KS5idWlsZCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgYmVmb3JlID0gbmV3IE5ldHdvcmtTdGF0cyhURVNUX1NUQVJULCAyKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIFRBR19OT05FLCAxMDI0TCwgMEwpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgVEFHX05PTkUsIDBMLCAxMDI0TCk7CiAKLSAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGFmdGVyID0gbmV3IE5ldHdvcmtTdGF0cy5CdWlsZGVyKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLCAzKQotICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDAsIDEwMjQsIDApCi0gICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMSwgMCwgMTAyNCkKLSAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAyLCAxMDI0LCAxMDI0KS5idWlsZCgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgYWZ0ZXIgPSBuZXcgTmV0d29ya1N0YXRzKFRFU1RfU1RBUlQsIDMpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIDEwMCwgVEFHX05PTkUsIDEwMjRMLCAwTCkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgMTAxLCBUQUdfTk9ORSwgMEwsIDEwMjRMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCAxMDIsIFRBR19OT05FLCAxMDI0TCwgMTAyNEwpOwogCiAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyByZXN1bHQgPSBhZnRlci5zdWJ0cmFjdChiZWZvcmUpOwogCkBAIC05NCw0ICsxNDEsMTMgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMjQsIHJlc3VsdC50eFsyXSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTdGF0c0VudHJ5KAorICAgICAgICAgICAgTmV0d29ya1N0YXRzIHN0YXRzLCBpbnQgaSwgU3RyaW5nIGlmYWNlLCBpbnQgdWlkLCBpbnQgdGFnLCBsb25nIHJ4LCBsb25nIHR4KSB7CisgICAgICAgIGFzc2VydEVxdWFscyhpZmFjZSwgc3RhdHMuaWZhY2VbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHModWlkLCBzdGF0cy51aWRbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHModGFnLCBzdGF0cy50YWdbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHMocngsIHN0YXRzLnJ4W2ldKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR4LCBzdGF0cy50eFtpXSk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9BYnN0cmFjdFByb3h5VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L2h0dHAvQWJzdHJhY3RQcm94eVRlc3QuamF2YQppbmRleCBlZTg5NDE0Li5lZTRjZTk1IDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9BYnN0cmFjdFByb3h5VGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0Fic3RyYWN0UHJveHlUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDEwIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5uZXQuaHR0cDsKIAoraW1wb3J0IGNvbS5nb29nbGUubW9ja3dlYnNlcnZlci5Nb2NrUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5tb2Nrd2Vic2VydmVyLk1vY2tXZWJTZXJ2ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5tb2Nrd2Vic2VydmVyLlJlY29yZGVkUmVxdWVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLm1vY2t3ZWJzZXJ2ZXIuU29ja2V0UG9saWN5OwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKQEAgLTMzLDEwICszNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5zc2wuQWxsb3dBbGxIb3N0bmFtZVZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xTb2NrZXRGYWN0b3J5OwotaW1wb3J0IHRlc3RzLmh0dHAuTW9ja1Jlc3BvbnNlOwotaW1wb3J0IHRlc3RzLmh0dHAuTW9ja1dlYlNlcnZlcjsKLWltcG9ydCB0ZXN0cy5odHRwLlJlY29yZGVkUmVxdWVzdDsKLWltcG9ydCB0ZXN0cy5odHRwLlNvY2tldFBvbGljeTsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJveHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9Db29raWVzVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvbmV0L2h0dHAvQ29va2llc1Rlc3QuamF2YQppbmRleCBlNzM2YmM5Li4yOWU1OTBmIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9Db29raWVzVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0Nvb2tpZXNUZXN0LmphdmEKQEAgLTE2LDYgKzE2LDkgQEAKIAogcGFja2FnZSBhbmRyb2lkLm5ldC5odHRwOwogCitpbXBvcnQgY29tLmdvb2dsZS5tb2Nrd2Vic2VydmVyLk1vY2tSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLm1vY2t3ZWJzZXJ2ZXIuTW9ja1dlYlNlcnZlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLm1vY2t3ZWJzZXJ2ZXIuUmVjb3JkZWRSZXF1ZXN0OwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwpAQCAtMzAsOSArMzMsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnBhcmFtcy5Db25uUm91dGVQTmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkRlZmF1bHRIdHRwQ2xpZW50OwotaW1wb3J0IHRlc3RzLmh0dHAuTW9ja1Jlc3BvbnNlOwotaW1wb3J0IHRlc3RzLmh0dHAuTW9ja1dlYlNlcnZlcjsKLWltcG9ydCB0ZXN0cy5odHRwLlJlY29yZGVkUmVxdWVzdDsKIAogcHVibGljIGZpbmFsIGNsYXNzIENvb2tpZXNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewogCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9uZXQvaHR0cC9EZWZhdWx0SHR0cENsaWVudFRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0RlZmF1bHRIdHRwQ2xpZW50VGVzdC5qYXZhCmluZGV4IGFkM2VjM2QuLmRhNzcyOTggMTAwNjQ0Ci0tLSBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0RlZmF1bHRIdHRwQ2xpZW50VGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL25ldC9odHRwL0RlZmF1bHRIdHRwQ2xpZW50VGVzdC5qYXZhCkBAIC0xNiw2ICsxNiwxMiBAQAogCiBwYWNrYWdlIGFuZHJvaWQubmV0Lmh0dHA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLm1vY2t3ZWJzZXJ2ZXIuTW9ja1Jlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUubW9ja3dlYnNlcnZlci5Nb2NrV2ViU2VydmVyOworaW1wb3J0IGNvbS5nb29nbGUubW9ja3dlYnNlcnZlci5Tb2NrZXRQb2xpY3k7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUubW9ja3dlYnNlcnZlci5Tb2NrZXRQb2xpY3kuRElTQ09OTkVDVF9BVF9FTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUubW9ja3dlYnNlcnZlci5Tb2NrZXRQb2xpY3kuU0hVVERPV05fSU5QVVRfQVRfRU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLm1vY2t3ZWJzZXJ2ZXIuU29ja2V0UG9saWN5LlNIVVRET1dOX09VVFBVVF9BVF9FTkQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwpAQCAtMjQsMTIgKzMwLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwR2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cENsaWVudDsKLWltcG9ydCB0ZXN0cy5odHRwLk1vY2tSZXNwb25zZTsKLWltcG9ydCB0ZXN0cy5odHRwLk1vY2tXZWJTZXJ2ZXI7Ci1pbXBvcnQgdGVzdHMuaHR0cC5Tb2NrZXRQb2xpY3k7Ci1pbXBvcnQgc3RhdGljIHRlc3RzLmh0dHAuU29ja2V0UG9saWN5LkRJU0NPTk5FQ1RfQVRfRU5EOwotaW1wb3J0IHN0YXRpYyB0ZXN0cy5odHRwLlNvY2tldFBvbGljeS5TSFVURE9XTl9JTlBVVF9BVF9FTkQ7Ci1pbXBvcnQgc3RhdGljIHRlc3RzLmh0dHAuU29ja2V0UG9saWN5LlNIVVRET1dOX09VVFBVVF9BVF9FTkQ7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0SHR0cENsaWVudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3BpbS9SZWN1cnJlbmNlU2V0VGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXRUZXN0LmphdmEKaW5kZXggNWQwMWJhMC4uZTVhYjE3OSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXRUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvcGltL1JlY3VycmVuY2VTZXRUZXN0LmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKIGltcG9ydCBhbmRyb2lkLnBpbS5SZWN1cnJlbmNlU2V0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXJDb250cmFjdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIC8qKgpAQCAtNjksMTQgKzY5LDE0IEBACiAgICAgICAgIFJlY3VycmVuY2VTZXQucG9wdWxhdGVDb250ZW50VmFsdWVzKHJlY3VycmVuY2VDb21wb25lbnQsIHZhbHVlcyk7CiAgICAgICAgIExvZy5kKCJLUyIsICJ2YWx1ZXMgIiArIHZhbHVlcyk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJydWxlLCB2YWx1ZXMuZ2V0KGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIuRXZlbnRzLlJSVUxFKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZGF0ZSwgdmFsdWVzLmdldChhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyLkV2ZW50cy5SREFURSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhydWxlLCB2YWx1ZXMuZ2V0KGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIuRXZlbnRzLkVYUlVMRSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhkYXRlLCB2YWx1ZXMuZ2V0KGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIuRXZlbnRzLkVYREFURSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZHRzdGFydCwgKGxvbmcpIHZhbHVlcy5nZXRBc0xvbmcoQ2FsZW5kYXIuRXZlbnRzLkRUU1RBUlQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHR6aWQsIHZhbHVlcy5nZXQoYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhci5FdmVudHMuRVZFTlRfVElNRVpPTkUpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGR1cmF0aW9uLCB2YWx1ZXMuZ2V0KGFuZHJvaWQucHJvdmlkZXIuQ2FsZW5kYXIuRXZlbnRzLkRVUkFUSU9OKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhycnVsZSwgdmFsdWVzLmdldChhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3QuRXZlbnRzLlJSVUxFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZGF0ZSwgdmFsdWVzLmdldChhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3QuRXZlbnRzLlJEQVRFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHJ1bGUsIHZhbHVlcy5nZXQoYW5kcm9pZC5wcm92aWRlci5DYWxlbmRhckNvbnRyYWN0LkV2ZW50cy5FWFJVTEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4ZGF0ZSwgdmFsdWVzLmdldChhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkVYREFURSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZHRzdGFydCwgKGxvbmcpIHZhbHVlcy5nZXRBc0xvbmcoQ2FsZW5kYXJDb250cmFjdC5FdmVudHMuRFRTVEFSVCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHppZCwgdmFsdWVzLmdldChhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkVWRU5UX1RJTUVaT05FKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkdXJhdGlvbiwgdmFsdWVzLmdldChhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkRVUkFUSU9OKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhhbGxEYXksCi0gICAgICAgICAgICAgICAgKGludCkgdmFsdWVzLmdldEFzSW50ZWdlcihhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyLkV2ZW50cy5BTExfREFZKSk7CisgICAgICAgICAgICAgICAgKGludCkgdmFsdWVzLmdldEFzSW50ZWdlcihhbmRyb2lkLnByb3ZpZGVyLkNhbGVuZGFyQ29udHJhY3QuRXZlbnRzLkFMTF9EQVkpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0xvY2FsZVV0aWxUZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC91dGlsL0xvY2FsZVV0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzNzgxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3V0aWwvTG9jYWxlVXRpbFRlc3QuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgZGFsdmlrLmFubm90YXRpb24uVGVzdExldmVsOworaW1wb3J0IGRhbHZpay5hbm5vdGF0aW9uLlRlc3RUYXJnZXROZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC51dGlsLkxvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnV0aWwuTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fVU5ERUZJTkVEX0RPX05PVF9VU0U7CisKK3B1YmxpYyBjbGFzcyBMb2NhbGVVdGlsVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBAVGVzdFRhcmdldE5ldygKKyAgICAgICAgbGV2ZWwgPSBUZXN0TGV2ZWwuQ09NUExFVEUsCisgICAgICAgIG1ldGhvZCA9ICJnZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlIiwKKyAgICAgICAgYXJncyA9IHtMb2NhbGUuY2xhc3N9CisgICAgKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoVEVYVF9MQVlPVVRfRElSRUNUSU9OX1VOREVGSU5FRF9ET19OT1RfVVNFLAorICAgICAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShudWxsKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuRU5HTElTSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fTFRSX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkNBTkFEQSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fTFRSX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLkNBTkFEQV9GUkVOQ0gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5GUkFOQ0UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5GUkVOQ0gpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5HRVJNQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5HRVJNQU5ZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuSVRBTElBTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fTFRSX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLklUQUxZKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuVUspKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5VUykpOworCisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9VTkRFRklORURfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuUk9PVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuQ0hJTkEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5DSElORVNFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuSkFQQU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKExvY2FsZS5KQVBBTkVTRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fTFRSX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUoTG9jYWxlLktPUkVBKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuS09SRUFOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuUFJDKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuU0lNUExJRklFRF9DSElORVNFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuVEFJV0FOKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9MVFJfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShMb2NhbGUuVFJBRElUSU9OQUxfQ0hJTkVTRSkpOworCisgICAgICAgIExvY2FsZSBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkFFIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiQkgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJEWiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIkVHIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiSVEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJKTyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIktXIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiTEIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJMWSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIk1BIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiT00iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJRQSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIlNBIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiU0QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJhciIsICJTWSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImFyIiwgIlROIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiYXIiLCAiWUUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworCisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImZhIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiZmEiLCAiQUYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJmYSIsICJJUiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiaXciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJpdyIsICJJTCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoImhlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgiaGUiLCAiSUwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworCisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInBhX0FyYWIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJwYV9BcmFiIiwgIlBLIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJwcyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInBzIiwgIkFGIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1ciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9jYWxlVXRpbC5URVhUX0xBWU9VVF9ESVJFQ1RJT05fUlRMX0RPX05PVF9VU0UsCisgICAgICAgICAgICBMb2NhbGVVdGlsLmdldExheW91dERpcmVjdGlvbkZyb21Mb2NhbGUobG9jYWxlKSk7CisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInVyIiwgIklOIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgidXIiLCAiUEsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworCisgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoInV6X0FyYWIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX1JUTF9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKCJ1el9BcmFiIiwgIkFGIik7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2NhbGVVdGlsLlRFWFRfTEFZT1VUX0RJUkVDVElPTl9SVExfRE9fTk9UX1VTRSwKKyAgICAgICAgICAgIExvY2FsZVV0aWwuZ2V0TGF5b3V0RGlyZWN0aW9uRnJvbUxvY2FsZShsb2NhbGUpKTsKKworICAgICAgICAvLyBMb2NhbGUgd2l0aG91dCBhIHJlYWwgbGFuZ3VhZ2UKKyAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZSgienoiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvY2FsZVV0aWwuVEVYVF9MQVlPVVRfRElSRUNUSU9OX0xUUl9ET19OT1RfVVNFLAorICAgICAgICAgICAgTG9jYWxlVXRpbC5nZXRMYXlvdXREaXJlY3Rpb25Gcm9tTG9jYWxlKGxvY2FsZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvR3Jhdml0eVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL3ZpZXcvR3Jhdml0eVRlc3QuamF2YQppbmRleCAwMTAxMjdmLi5kOGVmNjUwIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC92aWV3L0dyYXZpdHlUZXN0LmphdmEKKysrIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvdmlldy9HcmF2aXR5VGVzdC5qYXZhCkBAIC0yOSwxNCArMjksMTQgQEAKICAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LlJJR0hULCBHcmF2aXR5LlJJR0hULCBmYWxzZSk7CiAgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5SSUdIVCwgR3Jhdml0eS5SSUdIVCwgdHJ1ZSk7CiAKLSAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LlRPUHxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuVE9QLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5UT1B8R3Jhdml0eS5MRUZULCBHcmF2aXR5LlRPUCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5UT1AsIEdyYXZpdHkuVE9QLCBmYWxzZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5UT1AsIEdyYXZpdHkuVE9QLCB0cnVlKTsKIAotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQk9UVE9NfEdyYXZpdHkuTEVGVCwgR3Jhdml0eS5CT1RUT00sIGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkJPVFRPTXxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuQk9UVE9NLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkJPVFRPTSwgR3Jhdml0eS5CT1RUT00sIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkJPVFRPTSwgR3Jhdml0eS5CT1RUT00sIHRydWUpOwogCi0gICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DRU5URVJfVkVSVElDQUx8R3Jhdml0eS5MRUZULCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMfEdyYXZpdHkuTEVGVCwgR3Jhdml0eS5DRU5URVJfVkVSVElDQUwsIHRydWUpOworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwgZmFsc2UpOworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMLCBHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCwgdHJ1ZSk7CiAKICAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCwgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCwgdHJ1ZSk7CkBAIC00NCw4ICs0NCw4IEBACiAgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DRU5URVIsIEdyYXZpdHkuQ0VOVEVSLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DRU5URVIsIEdyYXZpdHkuQ0VOVEVSLCB0cnVlKTsKIAotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuRklMTF9WRVJUSUNBTHxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuRklMTF9WRVJUSUNBTCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuRklMTF9WRVJUSUNBTHxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuRklMTF9WRVJUSUNBTCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5GSUxMX1ZFUlRJQ0FMLCBHcmF2aXR5LkZJTExfVkVSVElDQUwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTExfVkVSVElDQUwsIEdyYXZpdHkuRklMTF9WRVJUSUNBTCwgdHJ1ZSk7CiAKICAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTExfSE9SSVpPTlRBTCwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTExfSE9SSVpPTlRBTCwgR3Jhdml0eS5GSUxMX0hPUklaT05UQUwsIHRydWUpOwpAQCAtNTMsMjAgKzUzLDIyIEBACiAgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5GSUxMLCBHcmF2aXR5LkZJTEwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkZJTEwsIEdyYXZpdHkuRklMTCwgdHJ1ZSk7CiAKLSAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNMSVBfSE9SSVpPTlRBTHxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuQ0xJUF9IT1JJWk9OVEFMLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DTElQX0hPUklaT05UQUx8R3Jhdml0eS5MRUZULCBHcmF2aXR5LkNMSVBfSE9SSVpPTlRBTCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DTElQX0hPUklaT05UQUwsIEdyYXZpdHkuQ0xJUF9IT1JJWk9OVEFMLCBmYWxzZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DTElQX0hPUklaT05UQUwsIEdyYXZpdHkuQ0xJUF9IT1JJWk9OVEFMLCB0cnVlKTsKIAotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0xJUF9WRVJUSUNBTHxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuQ0xJUF9WRVJUSUNBTCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuQ0xJUF9WRVJUSUNBTHxHcmF2aXR5LkxFRlQsIEdyYXZpdHkuQ0xJUF9WRVJUSUNBTCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5DTElQX1ZFUlRJQ0FMLCBHcmF2aXR5LkNMSVBfVkVSVElDQUwsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkNMSVBfVkVSVElDQUwsIEdyYXZpdHkuQ0xJUF9WRVJUSUNBTCwgdHJ1ZSk7CiAKLSAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkxFRlQsIEdyYXZpdHkuQkVGT1JFLCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5SSUdIVCwgR3Jhdml0eS5CRUZPUkUsIHRydWUpOworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuTEVGVCwgR3Jhdml0eS5TVEFSVCwgZmFsc2UpOworICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuUklHSFQsIEdyYXZpdHkuU1RBUlQsIHRydWUpOwogCi0gICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5SSUdIVCwgR3Jhdml0eS5BRlRFUiwgZmFsc2UpOwotICAgICAgICBhc3NlcnRPbmVHcmF2aXR5KEdyYXZpdHkuTEVGVCwgR3Jhdml0eS5BRlRFUiwgdHJ1ZSk7CisgICAgICAgIGFzc2VydE9uZUdyYXZpdHkoR3Jhdml0eS5SSUdIVCwgR3Jhdml0eS5FTkQsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0T25lR3Jhdml0eShHcmF2aXR5LkxFRlQsIEdyYXZpdHkuRU5ELCB0cnVlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0T25lR3Jhdml0eShpbnQgZXhwZWN0ZWQsIGludCBpbml0aWFsLCBib29sZWFuIGlzUnRsKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgR3Jhdml0eS5nZXRBYnNvbHV0ZUdyYXZpdHkoaW5pdGlhbCwgaXNSdGwpKTsKKyAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IGlzUnRsID8gVmlldy5MQVlPVVRfRElSRUNUSU9OX1JUTCA6IFZpZXcuTEFZT1VUX0RJUkVDVElPTl9MVFI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBHcmF2aXR5LmdldEFic29sdXRlR3Jhdml0eShpbml0aWFsLCBsYXlvdXREaXJlY3Rpb24pKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IYW56aVRvUGlueWluVGVzdC5qYXZhIGIvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3V0aWwvSGFuemlUb1BpbnlpblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkZWU3MC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdXRpbC9IYW56aVRvUGlueWluVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuSGFuemlUb1BpbnlpbjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhhbnppVG9QaW55aW4uVG9rZW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBIYW56aVRvUGlueWluVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT05FX0hBTlpJID0gIlx1Njc1QyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRXT19IQU5aSSA9ICJcdTY3NUNcdTlENTEiOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBU1NJQyA9ICJ0ZXN0IjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT05FX1VOS05PV04gPSAiXHVGRjcxIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlTQyA9ICJ0ZXN0XHU2NzVDICAgVGVzdCB3aXRoIHNwYWNlXHVGRjcxXHVGRjcxXHU2NzVDIjsKLQotICAgIEBTbWFsbFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VG9rZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFBcnJheXMuYXNMaXN0KENvbGxhdG9yLmdldEF2YWlsYWJsZUxvY2FsZXMoKSkuY29udGFpbnMoTG9jYWxlLkNISU5BKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIEFycmF5TGlzdDxUb2tlbj4gdG9rZW5zID0gSGFuemlUb1Bpbnlpbi5nZXRJbnN0YW5jZSgpLmdldChPTkVfSEFOWkkpOwotICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLnNpemUoKSwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDApLnR5cGUsIFRva2VuLlBJTllJTik7Ci0gICAgICAgIGFzc2VydFRydWUodG9rZW5zLmdldCgwKS50YXJnZXQuZXF1YWxzSWdub3JlQ2FzZSgiRFUiKSk7Ci0KLSAgICAgICAgdG9rZW5zID0gSGFuemlUb1Bpbnlpbi5nZXRJbnN0YW5jZSgpLmdldChUV09fSEFOWkkpOwotICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLnNpemUoKSwgMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDApLnR5cGUsIFRva2VuLlBJTllJTik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDEpLnR5cGUsIFRva2VuLlBJTllJTik7Ci0gICAgICAgIGFzc2VydFRydWUodG9rZW5zLmdldCgwKS50YXJnZXQuZXF1YWxzSWdub3JlQ2FzZSgiRFUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUodG9rZW5zLmdldCgxKS50YXJnZXQuZXF1YWxzSWdub3JlQ2FzZSgiSlVBTiIpKTsKLQotICAgICAgICB0b2tlbnMgPSBIYW56aVRvUGlueWluLmdldEluc3RhbmNlKCkuZ2V0KEFTU0lDKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5zaXplKCksIDEpOwotICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLmdldCgwKS50eXBlLCBUb2tlbi5MQVRJTik7Ci0KLSAgICAgICAgdG9rZW5zID0gSGFuemlUb1Bpbnlpbi5nZXRJbnN0YW5jZSgpLmdldChPTkVfVU5LTk9XTik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuc2l6ZSgpLCAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMCkudHlwZSwgVG9rZW4uVU5LTk9XTik7Ci0KLSAgICAgICAgdG9rZW5zID0gSGFuemlUb1Bpbnlpbi5nZXRJbnN0YW5jZSgpLmdldChNSVNDKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5zaXplKCksIDcpOwotICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLmdldCgwKS50eXBlLCBUb2tlbi5MQVRJTik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDEpLnR5cGUsIFRva2VuLlBJTllJTik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDIpLnR5cGUsIFRva2VuLkxBVElOKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRva2Vucy5nZXQoMykudHlwZSwgVG9rZW4uTEFUSU4pOwotICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLmdldCg0KS50eXBlLCBUb2tlbi5MQVRJTik7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b2tlbnMuZ2V0KDUpLnR5cGUsIFRva2VuLlVOS05PV04pOwotICAgICAgICBhc3NlcnRFcXVhbHModG9rZW5zLmdldCg2KS50eXBlLCBUb2tlbi5QSU5ZSU4pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guZGlzdGluY3QueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gubXVsdGl0b3VjaC5kaXN0aW5jdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlOGQwOQotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guZGlzdGluY3QueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHNldCBvZiBmZWF0dXJlcyBmb3IgYSBpbmRpcmVjdCB0b3VjaCBpbnB1dCBkZXZpY2UgdGhhdCBzdXBwb3J0cworICAgICBpbmRlcGVuZGVudGx5LXRyYWNrYWJsZSBtdWx0aXBsZS1maW5nZXIgbXVsdGl0b3VjaC4gLS0+Cis8cGVybWlzc2lvbnM+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gubXVsdGl0b3VjaCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmZha2V0b3VjaC5tdWx0aXRvdWNoLmRpc3RpbmN0IiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoIiAvPgorPC9wZXJtaXNzaW9ucz4KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guamF6emhhbmQueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gubXVsdGl0b3VjaC5qYXp6aGFuZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwZTcwYgotLS0gL2Rldi9udWxsCisrKyBiL2RhdGEvZXRjL2FuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guamF6emhhbmQueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgc3RhbmRhcmQgc2V0IG9mIGZlYXR1cmVzIGZvciBhbiBpbmRpcmVjdCB0b3VjaCBpbnB1dCBkZXZpY2UgdGhhdCBzdXBwb3J0cworICAgICBpbmRlcGVuZGVudGx5LXRyYWNrYWJsZSBtdWx0aXBsZS1maW5nZXIgbXVsdGl0b3VjaC4gLS0+Cis8cGVybWlzc2lvbnM+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gubXVsdGl0b3VjaCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmZha2V0b3VjaC5tdWx0aXRvdWNoLmRpc3RpbmN0IiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoLm11bHRpdG91Y2guamF6emhhbmQiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2giIC8+Cis8L3Blcm1pc3Npb25zPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5mYWtldG91Y2gueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOTkwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmZha2V0b3VjaC54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyB0aGUgc3RhbmRhcmQgc2V0IG9mIGZlYXR1cmVzIGZvciBhIGRldmljZXMgdGhhdCBkb2VzIG5vdCBoYXZlCisgICAgIGEgdG91Y2ggc2NyZWVuLCBidXQgZG9lcyBoYXZlIHNvbWUgb3RoZXIgaW5kaXJlY3QgaW5wdXQgZGV2aWNlIHN1Y2ggYXMKKyAgICAgYSB0cmFjayBwYWQuIC0tPgorPHBlcm1pc3Npb25zPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuZmFrZXRvdWNoIiAvPgorPC9wZXJtaXNzaW9ucz4KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL2hhbmRoZWxkX2NvcmVfaGFyZHdhcmUueG1sIGIvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwKaW5kZXggN2Y4N2I3OS4uOWQyYTBjYiAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwKKysrIGIvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwKQEAgLTMxLDYgKzMxLDggQEAKICAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmJsdWV0b290aCIgLz4KICAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuIiAvPgogICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubWljcm9waG9uZSIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5wb3J0cmFpdCIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5sYW5kc2NhcGUiIC8+CiAgICAgPCEtLSBkZXZpY2VzIHdpdGggR1BTIG11c3QgaW5jbHVkZSBhbmRyb2lkLmhhcmR3YXJlLmxvY2F0aW9uLmdwcy54bWwgLS0+CiAgICAgPCEtLSBkZXZpY2VzIHdpdGggYW4gYXV0b2ZvY3VzIGNhbWVyYSBhbmQvb3IgZmxhc2ggbXVzdCBpbmNsdWRlIGVpdGhlcgogICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuYXV0b2ZvY3VzLnhtbCBvciAKZGlmZiAtLWdpdCBhL2RhdGEvZXRjL3BsYXRmb3JtLnhtbCBiL2RhdGEvZXRjL3BsYXRmb3JtLnhtbAppbmRleCA1ZWQ3OTY2Li5iOWMwZDgwIDEwMDY0NAotLS0gYS9kYXRhL2V0Yy9wbGF0Zm9ybS54bWwKKysrIGIvZGF0YS9ldGMvcGxhdGZvcm0ueG1sCkBAIC0xMzIsNiArMTMyLDcgQEAKICAgICA8YXNzaWduLXBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkJBVFRFUllfU1RBVFMiIHVpZD0ic2hlbGwiIC8+CiAgICAgPGFzc2lnbi1wZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5BTF9TWVNURU1fV0lORE9XIiB1aWQ9InNoZWxsIiAvPgogICAgIDxhc3NpZ24tcGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5KRUNUX0VWRU5UUyIgdWlkPSJzaGVsbCIgLz4KKyAgICA8YXNzaWduLXBlcm1pc3Npb24gbmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFVFJJRVZFX1dJTkRPV19DT05URU5UIiB1aWQ9InNoZWxsIiAvPgogICAgIDxhc3NpZ24tcGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX0FDVElWSVRZX1dBVENIRVIiIHVpZD0ic2hlbGwiIC8+CiAgICAgPGFzc2lnbi1wZXJtaXNzaW9uIG5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0lOUFVUX1NUQVRFIiB1aWQ9InNoZWxsIiAvPgogICAgIDxhc3NpZ24tcGVybWlzc2lvbiBuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uU0VUX09SSUVOVEFUSU9OIiB1aWQ9InNoZWxsIiAvPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sIGIvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sCmluZGV4IDk1MmQwNzgyLi5iZjI5ZmU0IDEwMDY0NAotLS0gYS9kYXRhL2V0Yy90YWJsZXRfY29yZV9oYXJkd2FyZS54bWwKKysrIGIvZGF0YS9ldGMvdGFibGV0X2NvcmVfaGFyZHdhcmUueG1sCkBAIC0zMiw2ICszMiw4IEBACiAgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbi5tdWx0aXRvdWNoIiAvPgogICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaC5kaXN0aW5jdCIgLz4KICAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLm1pY3JvcGhvbmUiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zY3JlZW4ucG9ydHJhaXQiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5zY3JlZW4ubGFuZHNjYXBlIiAvPgogICAgIDwhLS0gZGV2aWNlcyB3aXRoIEdQUyBtdXN0IGluY2x1ZGUgYW5kcm9pZC5oYXJkd2FyZS5sb2NhdGlvbi5ncHMueG1sIC0tPgogICAgIDwhLS0gZGV2aWNlcyB3aXRoIGEgcmVhci1mYWNpbmcgY2FtZXJhIG11c3QgaW5jbHVkZSBvbmUgb2YgdGhlc2UgYXMgYXBwcm9wcmlhdGU6CiAgICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS54bWwgb3IgCmRpZmYgLS1naXQgYS9kYXRhL2ZvbnRzL0Ryb2lkU2Fuc0ZhbGxiYWNrLnR0ZiBiL2RhdGEvZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmCmluZGV4IGJhOWQ3NmYuLjAzY2VhZTUgMTAwNjQ0Ci0tLSBhL2RhdGEvZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmCisrKyBiL2RhdGEvZm9udHMvRHJvaWRTYW5zRmFsbGJhY2sudHRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RhdGEvc291bmRzL0FsbEF1ZGlvLm1rIGIvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWsKaW5kZXggNGU3YTQwMy4uMmUxOGExMCAxMDA2NDQKLS0tIGEvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWsKKysrIGIvZGF0YS9zb3VuZHMvQWxsQXVkaW8ubWsKQEAgLTE4LDMgKzE4LDUgQEAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9BdWRpb1BhY2thZ2UyLm1rKQogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL0F1ZGlvUGFja2FnZTMubWspCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9zb3VuZHMvQXVkaW9QYWNrYWdlNC5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsIGZyYW1ld29ya3MvYmFzZS9kYXRhL3NvdW5kcy9BdWRpb1BhY2thZ2U1Lm1rKQorJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgZnJhbWV3b3Jrcy9iYXNlL2RhdGEvc291bmRzL0F1ZGlvUGFja2FnZTYubWspCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy9kZWJ1Z2dpbmcvZGVidWdnaW5nLXVpLmpkIGIvZG9jcy9odG1sL2d1aWRlL2RldmVsb3BpbmcvZGVidWdnaW5nL2RlYnVnZ2luZy11aS5qZAppbmRleCBkMmM0MmQ1Li4yMjc0OGJlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy9kZWJ1Z2dpbmcvZGVidWdnaW5nLXVpLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL2RlYnVnZ2luZy9kZWJ1Z2dpbmctdWkuamQKQEAgLTMxLDEwICszMSwyOSBAQAogICAgICAgICA8L2xpPgogICAgICAgICA8bGk+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+QSBjbGllbnQsIHdoaWNoIHJ1bnMgb24geW91ciBkZXZlbG9wbWVudCBtYWNoaW5lLiBZb3UgY2FuIGludm9rZSBhIGNsaWVudCBmcm9tIGEgc2hlbGwgYnkgaXNzdWluZyBhbiBhZGIgY29tbWFuZC4gT3RoZXIgQW5kcm9pZCB0b29scyBzdWNoIGFzIHRoZSBBRFQgcGx1Z2luIGFuZCBERE1TIGFsc28gY3JlYXRlIGFkYiBjbGllbnRzLiA8L2xpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcyBiL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKaW5kZXggOTE2ZGEwOS4uNTVkNzExZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcworKysgYi9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCkBAIC0yNDQsOSArMjQ0LDYgQEAKICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL2dyYXBoaWNzL29wZW5nbC5odG1sIj4KICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPjNEIHdpdGggT3BlbkdMPC9zcGFuPgogICAgICAgICAgICAgICA8L2E+PC9saT4KLSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL2dyYXBoaWNzL3JlbmRlcnNjcmlwdC5odG1sIj4KLSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPjNEIHdpdGggUmVuZGVyc2NyaXB0PC9zcGFuPgotICAgICAgICAgICAgICA8L2E+PC9saT4KICAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL2dyYXBoaWNzL2FuaW1hdGlvbi5odG1sIj4KICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPlByb3BlcnR5IEFuaW1hdGlvbjwvc3Bhbj4KICAgICAgICAgICAgICAgPC9hPjwvbGk+CkBAIC0yNTUsNiArMjUyLDIzIEBACiAgICAgICAgICAgICAgIDwvYT48L2xpPgogICAgICAgICA8L3VsPgogICAgICAgPC9saT4KKyAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgorCSAgICAgICAgPGRpdj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvcmVuZGVyc2NyaXB0L2luZGV4Lmh0bWwiPgorCSAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UmVuZGVyU2NyaXB0PC9zcGFuPgorCSAgICAgICAgICA8L2E+CisJICAgICAgICAgIDxzcGFuIGNsYXNzPSJuZXctY2hpbGQiPm5ldyE8L3NwYW4+PC9kaXY+CisJICAgICAgICA8dWw+CisJICAgICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS90b3BpY3MvcmVuZGVyc2NyaXB0L2dyYXBoaWNzLmh0bWwiPgorCSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPjNEIEdyYXBoaWNzPC9zcGFuPgorCSAgICAgICAgICAgICAgPC9hPgorCSAgICAgICAgICA8L2xpPgorCSAgICAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL3JlbmRlcnNjcmlwdC9jb21wdXRlLmh0bWwiPgorCSAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPkNvbXB1dGU8L3NwYW4+CisJICAgICAgICAgICAgICA8L2E+CisJICAgICAgICAgIDwvbGk+ICAgICAgICAgCisJICAgICAgICA8L3VsPgorICAJICA8L2xpPgorCiAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvdG9waWNzL21lZGlhL2luZGV4Lmh0bWwiPgogICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5BdWRpbyBhbmQgVmlkZW88L3NwYW4+CiAgICAgICAgICAgPC9hPjwvbGk+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL29wdGltaXppbmctZm9yLTMuMC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvb3B0aW1pemluZy1mb3ItMy4wLmpkCmluZGV4IDVjZDUxOWIuLmU5NjgzNzIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvb3B0aW1pemluZy1mb3ItMy4wLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvb3B0aW1pemluZy1mb3ItMy4wLmpkCkBAIC0yMiw2ICsyMiwxNCBAQAogPC9saT4KIDwvb2w+CiAKKzxoMj5TZWUgYWxzbzwvaDI+CisKKzxvbD4KKyAgPGxpPjxhCitocmVmPSJ7QGRvY1Jvb3R9c2RrL2NvbXBhdGliaWxpdHktbGlicmFyeS5odG1sIj5Db21wYXRpYmlsaXR5IExpYnJhcnk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9pb3NjaGVkLyI+R29vZ2xlIEkvTyBBcHAgc291cmNlIGNvZGU8L2E+PC9saT4KKzwvb2w+CisKIDwvZGl2PgogPC9kaXY+CiAKQEAgLTE3Miw3ICsxODAsOCBAQAogYXBwbGljYXRpb24gd2lsbCBsb29rIGFuZCBmZWVsIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3lzdGVtIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMgd2hlbiBpdCBpcwogZW5hYmxlZC48L3A+CiAgICAgPHA+QWRkaXRpb25hbGx5LCB3aGVuIGFuIGFjdGl2aXR5IHVzZXMgdGhlIGhvbG9ncmFwaGljIHRoZW1lLCB0aGUgc3lzdGVtIGVuYWJsZXMgdGhlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3VpL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPiBmb3IgdGhlIGFjdGl2aXR5LiBUaGUgQWN0aW9uIEJhcgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT4gZm9yIHRoZSBhY3Rpdml0eSBhbmQgcmVtb3ZlcyB0aGUKK09wdGlvbnMgTWVudSBidXR0b24gaW4gdGhlIHN5c3RlbSBiYXIuIFRoZSBBY3Rpb24gQmFyCiByZXBsYWNlcyB0aGUgdHJhZGl0aW9uYWwgdGl0bGUgYmFyIGF0IHRoZSB0b3Agb2YgdGhlIGFjdGl2aXR5IHdpbmRvdyBhbmQgcHJvdmlkZXMgdGhlIHVzZXIgYWNjZXNzIHRvCiB0aGUgYWN0aXZpdHkncyBPcHRpb25zIE1lbnUuPC9wPgogICAgICAgPC9saT4KQEAgLTIzMywyNyArMjQyLDI2IEBACiAKIAogCi0KLQogPGgyIGlkPSJVcGdyYWRpbmciPlVwZ3JhZGluZyBvciBEZXZlbG9waW5nIGEgTmV3IEFwcCBmb3IgVGFibGV0czwvaDI+CiAKIDxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+CiA8ZGl2IGNsYXNzPSJzaWRlYm94Ij4KLSAgPGgzPlVzZSBuZXcgQVBJcyBhbmQgcmVtYWluIGJhY2t3YXJkLWNvbXBhdGlibGU8L2gzPgorICA8aDM+VXNlIHRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnkgdG8gcmVtYWluIGJhY2t3YXJkLWNvbXBhdGlibGU8L2gzPgogPHA+SXQgaXMgcG9zc2libGUgZm9yIHlvdSB0byB1cGdyYWRlIHlvdXIgYXBwbGljYXRpb24gd2l0aCBzb21lIG5ldwogQVBJcyA8ZW0+YW5kPC9lbT4gcmVtYWluIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBBbmRyb2lkLiBVc3VhbGx5LCB0aGlzIHJlcXVpcmVzIHRoYXQgeW91CiB1c2UgdGVjaG5pcXVlcyBzdWNoIGFzIHJlZmxlY3Rpb24gdG8gY2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgY2VydGFpbiBBUElzIGF0IHJ1bnRpbWUuIEhvd2V2ZXIsCiB0byBoZWxwIHlvdSBhZGQgZmVhdHVyZXMgZnJvbSBBbmRyb2lkIDMuMCB3aXRob3V0IHJlcXVpcmluZyB5b3UgdG8gY2hhbmdlIHlvdXIgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI21pbiI+e0Bjb2RlIGFuZHJvaWQ6bWluU2RrVmVyc2lvbn08L2E+Ci1vciBidWlsZCB0YXJnZXQsIHdlJ3JlIHByb3ZpZGluZyBhIHN0YXRpYyBsaWJyYXJ5IGNhbGxlZCB0aGUgIkFuZHJvaWQgQ29tcGF0aWJpbGl0eSBwYWNrYWdlIgorb3IgYnVpbGQgdGFyZ2V0LCB3ZSdyZSBwcm92aWRpbmcgYSBzdGF0aWMgbGlicmFyeSBjYWxsZWQgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9c2RrL2NvbXBhdGliaWxpdHktbGlicmFyeS5odG1sIj5Db21wYXRpYmlsaXR5IExpYnJhcnk8L2E+CiAoZG93bmxvYWRhYmxlIGZyb20gdGhlIEFWRCBhbmQgU0RLIE1hbmFnZXIpLjwvcD4KIDxwPlRoaXMgbGlicmFyeSBpbmNsdWRlcyBBUElzIGZvciA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvZnJhZ21lbnRzLmh0bWwiPmZyYWdtZW50czwvYT4sIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9sb2FkZXJzLmh0bWwiPmxvYWRlcnM8L2E+LCBhbmQgc29tZSB1cGRhdGVkIGNsYXNzZXMuIEJ5CiBzaW1wbHkgYWRkaW5nIHRoaXMgbGlicmFyeSB0byB5b3VyIEFuZHJvaWQgcHJvamVjdCwgeW91IGNhbiB1c2UgdGhlc2UgQVBJcyBpbiB5b3VyIGFwcGxpY2F0aW9uIGFuZAotcmVtYWluIGNvbXBhdGlibGUgd2l0aCBBbmRyb2lkIDEuNi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgYmxvZyBwb3N0LCA8YQotaHJlZj0iaHR0cDovL2FuZHJvaWQtZGV2ZWxvcGVycy5ibG9nc3BvdC5jb20vMjAxMS8wMy9mcmFnbWVudHMtZm9yLWFsbC5odG1sIj5GcmFnbWVudHMgZm9yCi1BbGw8L2E+LjwvcD4KK3JlbWFpbiBjb21wYXRpYmxlIHdpdGggQW5kcm9pZCAxLjYuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gZ2V0IHRoZSBsaWJyYXJ5IGFuZCBzdGFydAordXNpbmcgaXQgaW4geW91ciBhcHBsaWNhdGlvbiwgc2VlIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fXNkay9jb21wYXRpYmlsaXR5LWxpYnJhcnkuaHRtbCI+Q29tcGF0aWJpbGl0eSBMaWJyYXJ5PC9hPiBkb2N1bWVudC48L3A+CiA8L2Rpdj4KIDwvZGl2PgogCkBAIC0zODAsNyArMzg4LDYgQEAKIGhyZWY9IntAZG9jUm9vdH1zZGsvYW5kcm9pZC0zLjAuaHRtbCI+QW5kcm9pZCAzLjAgUGxhdGZvcm08L2E+IGRvY3VtZW50LjwvcD4KIAogCi0KIDxoMz5Mb29rIGF0IHNvbWUgc2FtcGxlczwvaDM+CiAKIDxwPk1hbnkgb2YgdGhlIG5ldyBmZWF0dXJlcyBhbmQgQVBJcyB0aGF0IGFyZSBkZXNjcmliZWQgYWJvdmUgYW5kIGluIHRoZSA8YQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvc2VydmljZXMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9zZXJ2aWNlcy5qZAppbmRleCBhOWRkMzE1Li40NjhhNDE3IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9zZXJ2aWNlcy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy9zZXJ2aWNlcy5qZApAQCAtNDksNiArNDksMTMgQEAKICAgICAgIExvY2FsU2VydmljZX08L2E+PC9saT4KIDwvb2w+CiAKKzxoMj5BcnRpY2xlczwvaDI+Cis8b2w+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2FydGljbGVzL211bHRpdGFza2luZy1hbmRyb2lkLXdheS5odG1sIj5NdWx0aXRhc2tpbmcgdGhlIEFuZHJvaWQgV2F5PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2FydGljbGVzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aC5odG1sIj5TZXJ2aWNlIEFQSSBjaGFuZ2VzIHN0YXJ0aW5nCisgICAgICB3aXRoIEFuZHJvaWQgMi4wPC9hPjwvbGk+Cis8L29sPgorCiA8aDI+U2VlIGFsc288L2gyPgogPG9sPgogPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL2JvdW5kLXNlcnZpY2VzLmh0bWwiPkJvdW5kIFNlcnZpY2VzPC9hPjwvbGk+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy90YXNrcy1hbmQtYmFjay1zdGFjay5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3Rhc2tzLWFuZC1iYWNrLXN0YWNrLmpkCmluZGV4IGYyMmU1YjIuLjA3MjQ4OGMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3Rhc2tzLWFuZC1iYWNrLXN0YWNrLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3Rhc2tzLWFuZC1iYWNrLXN0YWNrLmpkCkBAIC0yNyw2ICsyNywxMSBAQAogPC9saT4KIDwvb2w+CiAKKzxoMj5BcnRpY2xlczwvaDI+Cis8b2w+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL2FydGljbGVzL211bHRpdGFza2luZy1hbmRyb2lkLXdheS5odG1sIj5NdWx0aXRhc2tpbmcgdGhlIEFuZHJvaWQgV2F5PC9hPjwvbGk+Cis8L29sPgorCiA8aDI+U2VlIGFsc288L2gyPgogPG9sPgogICA8bGk+PGE+PGEgaHJlZj0ie0Bkb2NSb290fXZpZGVvcy9pbmRleC5odG1sI3Y9Zkw2Z1NkNHVnU0kiPkFwcGxpY2F0aW9uIExpZmVjeWNsZSB2aWRlbzwvYT48L2xpPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9ncmFwaGljcy9hbmltYXRpb24uamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL2FuaW1hdGlvbi5qZAppbmRleCBlMTBhYjNlLi4zMWU3YzRiIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL2FuaW1hdGlvbi5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL2FuaW1hdGlvbi5qZApAQCAtODEsNiArODEsMTIgQEAKICAgSWYgdmlldyBhbmltYXRpb24gYWNjb21wbGlzaGVzIGV2ZXJ5dGhpbmcgdGhhdCB5b3UgbmVlZCB0byBkbywgb3IgaWYgeW91ciBleGlzdGluZyBjb2RlIGFscmVhZHkKICAgd29ya3MgdGhlIHdheSB5b3Ugd2FudCwgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhlIHByb3BlcnR5IGFuaW1hdGlvbiBzeXN0ZW0uPC9wPgogICAKKyAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IFRvIHNlZSBob3cgdGhlIEFEVCBsYXlvdXQgZWRpdG9yIGFsbG93cyB5b3UgdG8gZGV2ZWxvcCBhbmQKK3ByZXZpZXcgYW5pbWF0aW9ucyBpbiB5b3VyIGxheW91dCwgd2F0Y2ggdGhlIDxhCitocmVmPSJodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9T3EwNUtxalhUdnMmZmVhdHVyZT1wbGF5ZXJfZGV0YWlscGFnZSN0PTE3MDlzIj5BbmRyb2lkCitEZXZlbG9wZXIgVG9vbHMgc2Vzc2lvbjwvYT4gZnJvbSBHb29nbGUgSS9PICcxMTwvcD4KKworCiAgIDxoMiBpZD0id2hhdCI+V2hhdCBpcyBQcm9wZXJ0eSBBbmltYXRpb24/PC9oMj4KICAgQSBwcm9wZXJ0eSBhbmltYXRpb24gY2hhbmdlcyBhIHByb3BlcnR5J3MgKGEgZmllbGQgaW4KICAgYW4gb2JqZWN0KSB2YWx1ZSBvdmVyIGEgc3BlY2lmaWVkIGxlbmd0aCBvZiB0aW1lLiBUbyBhbmltYXRlIHNvbWV0aGluZywgeW91IHNwZWNpZnkgdGhlCkBAIC0xMDgsNiArMTE0LDcgQEAKICAgICBkZWZhdWx0IGlzIHNldCB0byAgcmVmcmVzaCBldmVyeSAxMCBtcywgYnV0IHRoZSBzcGVlZCBpbiB3aGljaCB5b3VyIGFwcGxpY2F0aW9uIGNhbiByZWZyZXNoIGZyYW1lcyBpcwogICAgIHVsdGltYXRlbHkgZGVwZW5kZW50IG9uIGhvdyBidXN5IHRoZSBzeXN0ZW0gaXMgb3ZlcmFsbCBhbmQgaG93IGZhc3QgdGhlIHN5c3RlbSBjYW4gc2VydmljZSB0aGUgdW5kZXJseWluZyB0aW1lci48L2xpPgogICA8L3VsPgorICAKIAogICA8aDMgaWQ9ImhvdyI+SG93IHRoZSBwcm9wZXJ0eSBhbmltYXRpb24gc3lzdGVtIHdvcmtzPC9oMz4KIApAQCAtODY4LDEwICs4NzUsMjIgQEAKIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIGFuaW1hdG9ycywgc2VlIHRoZSBzZWN0aW9ucyBvbiBhbmltYXRpbmcgd2l0aAogPGEgaHJlZj0iI3ZhbHVlLWFuaW1hdG9yIj5WYWx1ZUFuaW1hdG9yPC9hPiBhbmQgPGEgaHJlZj0iI29iamVjdC1hbmltYXRvciI+T2JqZWN0QW5pbWF0b3I8L2E+CiAKLSAgPGgyIGlkPSJkZWNsYXJpbmcteG1sIj5EZWNsYXJpbmcgQW5pbWF0aW9ucyBpbiBYTUw8L2gyPgorCis8aDIgaWQ9ImRlY2xhcmluZy14bWwiPkRlY2xhcmluZyBBbmltYXRpb25zIGluIFhNTDwvaDI+CiAKICAgPHA+VGhlIHByb3BlcnR5IGFuaW1hdGlvbiBzeXN0ZW0gbGV0cyB5b3UgZGVjbGFyZSBwcm9wZXJ0eSBhbmltYXRpb25zIHdpdGggWE1MIGluc3RlYWQgb2YgZG9pbmcKLSAgaXQgcHJvZ3JhbW1hdGljYWxseS4gVGhlIGZvbGxvd2luZyBBbmRyb2lkIGNsYXNzZXMgaGF2ZSBYTUwgZGVjbGFyYXRpb24gc3VwcG9ydCB3aXRoIHRoZQorICBpdCBwcm9ncmFtbWF0aWNhbGx5LiBCeSBkZWZpbmluZyB5b3VyIGFuaW1hdGlvbnMgaW4gWE1MLCB5b3UgY2FuIGVhc2lseSByZXVzZSB5b3VyIGFuaW1hdGlvbnMKK2luIG11bHRpcGxlIGFjdGl2aXRpZXMgYW5kIG1vcmUgZWFzaWx5IGVkaXQgdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZS48L3A+CisgIAorPHA+VG8gZGlzdGluZ3Vpc2ggYW5pbWF0aW9uIGZpbGVzIHRoYXQgdXNlIHRoZSBuZXcgcHJvcGVydHkgYW5pbWF0aW9uIEFQSXMgZnJvbSB0aG9zZSB0aGF0IHVzZSB0aGUKK2xlZ2FjeSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL3ZpZXctYW5pbWF0aW9uLmh0bWwiPnZpZXcgYW5pbWF0aW9uPC9hPiBmcmFtZXdvcmssCitzdGFydGluZyB3aXRoIEFuZHJvaWQgMy4xLCB5b3Ugc2hvdWxkIHNhdmUgdGhlIFhNTCBmaWxlcyBmb3IgcHJvcGVydHkgYW5pbWF0aW9ucyBpbiB0aGUge0Bjb2RlCityZXMvYW5pbWF0b3IvfSBkaXJlY3RvcnkgKGluc3RlYWQgb2Yge0Bjb2RlIHJlcy9hbmltL30pLiBVc2luZyB0aGUge0Bjb2RlIGFuaW1hdG9yfSBkaXJlY3RvcnkgbmFtZQoraXMgb3B0aW9uYWwsIGJ1dCBuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBsYXlvdXQgZWRpdG9yIHRvb2xzIGluIHRoZSBFY2xpcHNlIEFEVCBwbHVnaW4gKEFEVAorMTEuMC4wKyksIGJlY2F1c2UgQURUIG9ubHkgc2VhcmNoZXMgdGhlIHtAY29kZSByZXMvYW5pbWF0b3IvfSBkaXJlY3RvcnkgZm9yIHByb3BlcnR5IGFuaW1hdGlvbgorcmVzb3VyY2VzLjwvcD4KKworPHA+VGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBhbmltYXRpb24gY2xhc3NlcyBoYXZlIFhNTCBkZWNsYXJhdGlvbiBzdXBwb3J0IHdpdGggdGhlCiAgIGZvbGxvd2luZyBYTUwgdGFnczo8L3A+CiAKICAgPHVsPgpAQCAtODgyLDkxICs5MDEsNSBAQAogICAgIDxsaT57QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXR9IC0gPGNvZGU+Jmx0O3NldCZndDs8L2NvZGU+PC9saT4KICAgPC91bD4KIAotICA8cD5Cb3RoIDxjb2RlPiZsdDthbmltYXRvciZndDs8L2NvZGU+ICh7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvcn0pIGFuZAotICA8Y29kZT4mbHQ7b2JqZWN0QW5pbWF0b3ImZ3Q7PC9jb2RlPiAoe0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yfSkgaGF2ZSB0aGUgZm9sbG93aW5nCi0gIGF0dHJpYnV0ZXM6PC9wPgorPHA+U2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2FuaW1hdGlvbi1yZXNvdXJjZS5odG1sI1Byb3BlcnR5Ij5BbmltYXRpb24gUmVzb3VyY2VzPC9hPgogCi0gIDxkbD4KLSAgICA8ZHQ+PGNvZGU+YW5kcm9pZDpkdXJhdGlvbjwvY29kZT48L2R0PgotCi0gICAgPGRkPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgdGhlIGFuaW1hdGlvbiBydW5zLiBUaGUgZGVmYXVsdCBpcyAzMDAgbXMuPC9kZD4KLQotICAgIDxkdD48Y29kZT5hbmRyb2lkOnZhbHVlRnJvbTwvY29kZT4gYW5kIDxjb2RlPmFuZHJvaWQ6dmFsdWVUbzwvY29kZT48L2R0PgotCi0gICAgPGRkPlRoZSB2YWx1ZXMgYmVpbmcgYW5pbWF0ZWQgYmV0d2Vlbi4gVGhlc2UgYXJlIHJlc3RyaWN0ZWQgdG8gbnVtYmVycyAoPGNvZGU+ZmxvYXQ8L2NvZGU+IG9yCi0gICAgPGNvZGU+aW50PC9jb2RlPikgYW5kIGNvbG9yIHZhbHVlcyAoc3VjaCBhcyAjMDBmZjAwKS4gVGhleSBjYW4gYmUgPGNvZGU+ZmxvYXQ8L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCBjb2xvcnMsIAotICAgIG9yIGFueSBraW5kIG9mIDxjb2RlPk9iamVjdDwvY29kZT4gd2hlbiBjcmVhdGluZyBhbmltYXRpb25zIHByb2dyYW1tYXRpY2FsbHkuPC9kZD4KLQotICAgIDxkdD48Y29kZT5hbmRyb2lkOnZhbHVlVHlwZTwvY29kZT48L2R0PgotCi0gICAgPGRkPlNldCB0byBlaXRoZXIgPGNvZGU+ImZsb2F0VHlwZSI8L2NvZGU+IG9yIDxjb2RlPiJpbnRUeXBlIjwvY29kZT4uIFRoZSBkZWZhdWx0IGlzIAotICAgIDxjb2RlPiJmbG9hdFR5cGUiPC9jb2RlPiB1bmxlc3MgeW91IHNwZWNpZnkgc29tZXRoaW5nIGVsc2Ugb3IgaWYgdGhlIDxjb2RlPnZhbHVlc0Zyb208L2NvZGU+Ci0gICAgYW5kIDxjb2RlPnZhbHVlc1RvPC9jb2RlPiB2YWx1ZXMgYXJlIGNvbG9ycy48L2RkPgotCi0gICAgPGR0Pjxjb2RlPmFuZHJvaWQ6c3RhcnRPZmZzZXQ8L2NvZGU+PC9kdD4KLQotICAgIDxkZD5UaGUgZGVsYXksIGluIG1pbGxpc2Vjb25kcywgYmVmb3JlIHRoZSBhbmltYXRpb24gYmVnaW5zIHBsYXlpbmcgKGFmdGVyIGNhbGxpbmcge0BsaW5rCi0gICAgYW5kcm9pZC5hbmltYXRpb24uVmFsdWVBbmltYXRvciNzdGFydCBzdGFydCgpfSkuPC9kZD4KLQotICAgIDxkdD48Y29kZT5hbmRyb2lkOnJlcGVhdENvdW50PC9jb2RlPjwvZHQ+Ci0KLSAgICA8ZGQ+SG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IGFuIGFuaW1hdGlvbi4gU2V0IHRvIDxjb2RlPiItMSI8L2NvZGU+IHRvIGluZmluaXRlbHkgcmVwZWF0IG9yCi0gICAgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiA8Y29kZT4iMSI8L2NvZGU+IG1lYW5zIHRoYXQgdGhlIGFuaW1hdGlvbiBpcwotICAgIHJlcGVhdGVkIG9uY2UgYWZ0ZXIgdGhlIGluaXRpYWwgcnVuIG9mIHRoZSBhbmltYXRpb24sIHNvIHRoZSBhbmltYXRpb24gcGxheXMgYSB0b3RhbCBvZiB0d28KLSAgICB0aW1lcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAiPC9jb2RlPiwgd2hpY2ggbWVhbnMgbm8gcmVwZXRpdGlvbi48L2RkPgotCi0gICAgPGR0Pjxjb2RlPmFuZHJvaWQ6cmVwZWF0TW9kZTwvY29kZT48L2R0PgotCi0gICAgPGRkPkhvdyBhbiBhbmltYXRpb24gYmVoYXZlcyB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgotICAgIDxjb2RlPmFuZHJvaWQ6cmVwZWF0Q291bnQ8L2NvZGU+IG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgaW50ZWdlciBvciA8Y29kZT4iLTEiPC9jb2RlPiBmb3IKLSAgICB0aGlzIGF0dHJpYnV0ZSB0byBoYXZlIGFuIGVmZmVjdC4gU2V0IHRvIDxjb2RlPiJyZXZlcnNlIjwvY29kZT4gdG8gaGF2ZSB0aGUgYW5pbWF0aW9uIHJldmVyc2UKLSAgICBkaXJlY3Rpb24gd2l0aCBlYWNoIGl0ZXJhdGlvbiBvciA8Y29kZT4icmVwZWF0IjwvY29kZT4gdG8gaGF2ZSB0aGUgYW5pbWF0aW9uIGxvb3AgZnJvbSB0aGUKLSAgICBiZWdpbm5pbmcgZWFjaCB0aW1lLjwvZGQ+Ci0gIDwvZGw+Ci0KLSAgPHA+VGhlIDxjb2RlPm9iamVjdEFuaW1hdG9yPC9jb2RlPiAoe0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yfSkgZWxlbWVudCBoYXMgdGhlCi0gIGFkZGl0aW9uYWwgYXR0cmlidXRlIDxjb2RlPnByb3BlcnR5TmFtZTwvY29kZT4sIHRoYXQgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLSAgYmVpbmcgYW5pbWF0ZWQuIFRoZSA8Y29kZT5vYmplY3RBbmltYXRvcjwvY29kZT4gZWxlbWVudCBkb2VzIG5vdCBleHBvc2UgYSA8Y29kZT50YXJnZXQ8L2NvZGU+Ci0gIGF0dHJpYnV0ZSwgaG93ZXZlciwgc28geW91IGNhbm5vdCBzZXQgdGhlIG9iamVjdCB0byBhbmltYXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uIFlvdSBoYXZlIHRvCi0gIGluZmxhdGUgdGhlIFhNTCByZXNvdXJjZSBieSBjYWxsaW5nIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvckluZmxhdGVyI2xvYWRBbmltYXRvcgotICBsb2FkQW5pbWF0b3IoKX0gYW5kIGNhbGwge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yI3NldFRhcmdldCBzZXRUYXJnZXQoKX0gdG8gc2V0Ci0gIHRoZSB0YXJnZXQgb2JqZWN0IHVubGlrZSB0aGUgdW5kZXJseWluZyB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3J9LAotICBiZWZvcmUgY2FsbGluZyB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3Ijc3RhcnQgc3RhcnQoKX0uPC9wPgotCi0gIDxwPlRoZSA8Y29kZT5zZXQ8L2NvZGU+IGVsZW1lbnQgKHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldH0pIGV4cG9zZXMgYSBzaW5nbGUKLSAgYXR0cmlidXRlLCA8Y29kZT5vcmRlcmluZzwvY29kZT4uIFNldCB0aGlzIGF0dHJpYnV0ZSB0byA8Y29kZT50b2dldGhlcjwvY29kZT4gKGRlZmF1bHQpIHRvIHBsYXkKLSAgYWxsIHRoZSBhbmltYXRpb25zIGluIHRoaXMgc2V0IGF0IG9uY2UuIFNldCB0aGlzIGF0dHJpYnV0ZSB0byA8Y29kZT5zZXF1ZW50aWFsbHk8L2NvZGU+IHRvIHBsYXkKLSAgdGhlIGFuaW1hdGlvbnMgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkLjwvcD4KLQotICA8cD5Zb3UgY2FuIHNwZWNpZnkgbmVzdGVkIDxjb2RlPnNldDwvY29kZT4gdGFncyB0byBmdXJ0aGVyIGdyb3VwIGFuaW1hdGlvbnMgdG9nZXRoZXIuIFRoZQotICBhbmltYXRpb25zIHRoYXQgeW91IHdhbnQgdG8gZ3JvdXAgdG9nZXRoZXIgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIHRoZSA8Y29kZT5zZXQ8L2NvZGU+IHRhZyBhbmQgY2FuCi0gIGRlZmluZSB0aGVpciBvd24gPGNvZGU+b3JkZXJpbmc8L2NvZGU+IGF0dHJpYnV0ZS48L3A+Ci0KLSAgPHA+QXMgYW4gZXhhbXBsZSwgdGhpcyBYTUwgY29kZSBjcmVhdGVzIGFuIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldH0gb2JqZWN0IHRoYXQKLSAgYW5pbWF0ZXMgeCBhbmQgeSBhdCB0aGUgc2FtZSB0aW1lLCB0aGVuIHJ1bnMgYW4gYW5pbWF0aW9uIHRoYXQgZmFkZXMgYW4gb2JqZWN0IG91dDo8L3A+Ci0gIDxwcmU+Ci0mbHQ7c2V0IGFuZHJvaWQ6b3JkZXJpbmc9InNlcXVlbnRpYWxseSImZ3Q7Ci0gICAgJmx0O3NldCZndDsKLSAgICAgICAgJmx0O29iamVjdEFuaW1hdG9yCi0gICAgICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ieCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IjUwMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iNDAwIgotICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZVR5cGU9ImludCIvJmd0OwotICAgICAgICAmbHQ7b2JqZWN0QW5pbWF0b3IKLSAgICAgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ5IgotICAgICAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIgotICAgICAgICAgICAgYW5kcm9pZDp2YWx1ZVRvPSIzMDAiCi0gICAgICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iaW50Ii8mZ3Q7Ci0gICAgJmx0Oy9zZXQmZ3Q7Ci0gICAgJmx0O29iamVjdEFuaW1hdG9yCi0gICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKLSAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIgotICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjBmIi8mZ3Q7Ci0mbHQ7L3NldCZndDsKLTwvcHJlPgotCi0gIDxwPkluIG9yZGVyIHRvIHJ1biB0aGlzIGFuaW1hdGlvbiwgeW91IG11c3QgaW5mbGF0ZSB0aGUgWE1MIHJlc291cmNlcyBpbiB5b3VyIGNvZGUgdG8gYW4ge0BsaW5rCi0gIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0fSBvYmplY3QsIGFuZCB0aGVuIHNldCB0aGUgdGFyZ2V0IG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgYW5pbWF0aW9ucwotICBiZWZvcmUgc3RhcnRpbmcgdGhlIGFuaW1hdGlvbiBzZXQuIENhbGxpbmcge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0I3NldFRhcmdldAotICBzZXRUYXJnZXQoKX0gc2V0cyBhIHNpbmdsZSB0YXJnZXQgb2JqZWN0IGZvciBhbGwgY2hpbGRyZW4gb2YgdGhlIHtAbGluawotICBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldH0uPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3MvcmVuZGVyc2NyaXB0Lmh0bWwgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL3JlbmRlcnNjcmlwdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NGQzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL3JlbmRlcnNjcmlwdC5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO3VybD1odHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3RvcGljcy9yZW5kZXJzY3JpcHQvaW5kZXguaHRtbCI+Cis8dGl0bGU+UmVkaXJlY3RpbmcuLi48L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8cD5Zb3Ugc2hvdWxkIGJlIHJlZGlyZWN0ZWQuIFBsZWFzZSA8YQoraHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvcmVuZGVyc2NyaXB0L2luZGV4Lmh0bWwiPmNsaWNrIGhlcmU8L2E+LjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL3JlbmRlcnNjcmlwdC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3MvcmVuZGVyc2NyaXB0LmpkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGJmZmRiLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZ3JhcGhpY3MvcmVuZGVyc2NyaXB0LmpkCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLXBhZ2UudGl0bGU9M0QgUmVuZGVyaW5nIGFuZCBDb21wdXRhdGlvbiB3aXRoIFJlbmRlcnNjcmlwdAotcGFyZW50LnRpdGxlPUdyYXBoaWNzCi1wYXJlbnQubGluaz1pbmRleC5odG1sCi1AamQ6Ym9keQotCi0gIDxkaXYgaWQ9InF2LXdyYXBwZXIiPgotICAgIDxkaXYgaWQ9InF2Ij4KLSAgICAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KLQotICAgICAgPG9sPgotICAgICAgICA8bGk+PGEgaHJlZj0iI292ZXJ2aWV3Ij5SZW5kZXJzY3JpcHQgU3lzdGVtIE92ZXJ2aWV3PC9hPjwvbGk+Ci0KLSAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNhcGkiPkFQSSBPdmVydmlldzwvYT4KLQotICAgICAgICAgIDxvbD4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSIjbmF0aXZlLWFwaSI+TmF0aXZlIFJlbmRlcnNjcmlwdCBBUElzPC9hPjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSIjcmVmbGVjdGl2ZS1hcGkiPlJlZmxlY3RlZCBsYXllciBBUElzPC9hPjwvbGk+Ci0KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZ3JhcGhpY3MtYXBpIj5HcmFwaGljcyBBUElzPC9hPjwvbGk+Ci0gICAgICAgICAgPC9vbD4KLSAgICAgICAgPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGEgaHJlZj0iI2RldmVsb3BpbmciPkRldmVsb3BpbmcgYSBSZW5kZXJzY3JpcHQgYXBwbGljYXRpb248L2E+Ci0KLSAgICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2hlbGxvLWdyYXBoaWNzIj5UaGUgSGVsbG8gR3JhcGhpY3MgYXBwbGljYXRpb248L2E+PC9saT4KLSAgICAgICAgICA8L29sPgotICAgICAgICA8L2xpPgotICAgICAgPC9vbD4KLSAgICAgIDxoMj5SZWxhdGVkIFNhbXBsZXM8L2gyPgotICAgICAgPG9sPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJzY3JpcHQvQmFsbHMvaW5kZXguaHRtbCI+QmFsbHM8L2E+PC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvUmVuZGVyc2NyaXB0L0ZvdW50YWluL2luZGV4Lmh0bWwiPkZvdW50YWluPC9hPjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL1JlbmRlcnNjcmlwdC9IZWxsb0NvbXB1dGUvaW5kZXguaHRtbCI+SGVsbG8gQ29tcHV0ZTwvYT48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJzY3JpcHQvSGVsbG9Xb3JsZC9pbmRleC5odG1sIj5IZWxsbyBXb3JsZDwvYT48L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJzY3JpcHQvU2FtcGxlcy9pbmRleC5odG1sIj5TYW1wbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgPC9vbD4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0KLSAgPHA+VGhlIFJlbmRlcnNjcmlwdCBzeXN0ZW0gb2ZmZXJzIGhpZ2ggcGVyZm9ybWFuY2UgM0QgcmVuZGVyaW5nIGFuZCBtYXRoZW1hdGljYWwgY29tcHV0YXRpb24gYXQKLSAgdGhlIG5hdGl2ZSBsZXZlbC4gVGhlIFJlbmRlcnNjcmlwdCBBUElzIGFyZSBpbnRlbmRlZCBmb3IgZGV2ZWxvcGVycyB3aG8gYXJlIGNvbWZvcnRhYmxlIHdpdGgKLSAgZGV2ZWxvcGluZyBpbiBDIChDOTkgc3RhbmRhcmQpIGFuZCB3YW50IHRvIG1heGltaXplIHBlcmZvcm1hbmNlIGluIHRoZWlyIGFwcGxpY2F0aW9ucy4gVGhlCi0gIFJlbmRlcnNjcmlwdCBzeXN0ZW0gaW1wcm92ZXMgcGVyZm9ybWFuY2UgYnkgcnVubmluZyBhcyBuYXRpdmUgY29kZSBvbiB0aGUgZGV2aWNlLCBidXQgaXQgYWxzbwotICBmZWF0dXJlcyBjcm9zcy1wbGF0Zm9ybSBmdW5jdGlvbmFsaXR5LiBUbyBhY2hpZXZlIHRoaXMsIHRoZSBBbmRyb2lkIGJ1aWxkIHRvb2xzIGNvbXBpbGUgeW91cgotICBSZW5kZXJzY3JpcHQgPGNvZGU+LnJzPC9jb2RlPiBmaWxlIHRvIGludGVybWVkaWF0ZSBieXRlY29kZSBhbmQgcGFja2FnZSBpdCBpbnNpZGUgeW91cgotICBhcHBsaWNhdGlvbidzIDxjb2RlPi5hcGs8L2NvZGU+IGZpbGUuIE9uIHRoZSBkZXZpY2UsIHRoZSBieXRlY29kZSBpcyBjb21waWxlZCAoanVzdC1pbi10aW1lKSB0bwotICBtYWNoaW5lIGNvZGUgdGhhdCBpcyBmdXJ0aGVyIG9wdGltaXplZCBmb3IgdGhlIGRldmljZSB0aGF0IGl0IGlzIHJ1bm5pbmcgb24uIFRoaXMgZWxpbWluYXRlcyB0aGUKLSAgbmVlZCB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgZHVyaW5nIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiBUaGUgY29tcGlsZWQgY29kZSBvbiB0aGUKLSAgZGV2aWNlIGlzIGNhY2hlZCwgc28gc3Vic2VxdWVudCB1c2VzIG9mIHRoZSBSZW5kZXJzY3JpcHQgZW5hYmxlZCBhcHBsaWNhdGlvbiBkbyBub3QgcmVjb21waWxlIHRoZQotICBpbnRlcm1lZGlhdGUgY29kZS48L3A+Ci0KLSAgPHA+VGhlIGRpc2FkdmFudGFnZSBvZiB0aGUgUmVuZGVyc2NyaXB0IHN5c3RlbSBpcyB0aGF0IGl0IGFkZHMgY29tcGxleGl0eSB0byB0aGUgZGV2ZWxvcG1lbnQgYW5kCi0gIGRlYnVnZ2luZyBwcm9jZXNzZXMuIERlYnVnZ2luZyB2aXNpYmlsaXR5IGNhbiBiZSBsaW1pdGVkLCBiZWNhdXNlIHRoZQotICBSZW5kZXJzY3JpcHQgc3lzdGVtIGNhbiBleGVjdXRlIG9uIHByb2Nlc3NvcnMgb3RoZXIgdGhhbiB0aGUgbWFpbiBDUFUgKHN1Y2ggYXMgdGhlIEdQVSksIHNvIGlmCi0gIHRoaXMgb2NjdXJzLCBkZWJ1Z2dpbmcgYmVjb21lcyBtb3JlIGRpZmZpY3VsdC4gVGhlIHRhcmdldCB1c2UgaXMgZm9yIHBlcmZvcm1hbmNlCi0gIGNyaXRpY2FsIGNvZGUgd2hlcmUgdGhlIHRyYWRpdGlvbmFsIGZyYW1ld29yayBBUElzIChzdWNoIGFzIHVzaW5nIHtAbGluayBhbmRyb2lkLm9wZW5nbH0pIGFyZSBub3Qgc3VmZmljaWVudC4KLSAgSWYgd2hhdCB5b3UgYXJlIHJlbmRlcmluZyBvciBjb21wdXRpbmcgaXMgdmVyeSBzaW1wbGUgYW5kIGRvZXMgbm90IHJlcXVpcmUgbXVjaCBwcm9jZXNzaW5nIHBvd2VyLCB5b3Ugc2hvdWxkIHN0aWxsIHVzZSB0aGUKLSAgdHJhZGl0aW9uYWwgZnJhbWV3b3JrIEFQSXMgZm9yIGVhc2Ugb2YgZGV2ZWxvcG1lbnQuIFJlbWVtYmVyIHRoZSB0cmFkZW9mZnMgYmV0d2VlbiBkZXZlbG9wbWVudCBhbmQKLSAgZGVidWdnaW5nIGNvbXBsZXhpdHkgdmVyc3VzIHBlcmZvcm1hbmNlIHdoZW4gZGVjaWRpbmcgdG8gdXNlIFJlbmRlcnNjcmlwdC4gPC9wPgotCi0gIDxwPkZvciBhbiBleGFtcGxlIG9mIFJlbmRlcnNjcmlwdCBpbiBhY3Rpb24sIHNlZSB0aGUgM0QgY2Fyb3VzZWwgdmlldyBpbiB0aGUgQW5kcm9pZCAzLjAgdmVyc2lvbnMKLSAgb2YgR29vZ2xlIEJvb2tzIGFuZCBZb3VUdWJlIG9yIGluc3RhbGwgdGhlIFJlbmRlcnNjcmlwdCBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHNoaXBwZWQgd2l0aAotICB0aGUgU0RLIGluIDxjb2RlPiZsdDtzZGtfcm9vdCZndDsvc2FtcGxlcy9hbmRyb2lkLTExL1JlbmRlcnNjcmlwdDwvY29kZT4uPC9wPgotCi0gIDxoMiBpZD0ib3ZlcnZpZXciPlJlbmRlcnNjcmlwdCBTeXN0ZW0gT3ZlcnZpZXc8L2gyPgotCi0gIDxwPlRoZSBSZW5kZXJzY3JpcHQgc3lzdGVtIGFkb3B0cyBhIGNvbnRyb2wgYW5kIHNsYXZlIGFyY2hpdGVjdHVyZSB3aGVyZSB0aGUgbG93LWxldmVsIG5hdGl2ZQotICBjb2RlIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGhpZ2hlciBsZXZlbCBBbmRyb2lkIHN5c3RlbSB0aGF0IHJ1bnMgaW4gdGhlIHZpcnR1YWwgbWFjaGluZSAoVk0pLiBXaGVuCi0gIHlvdSB1c2UgdGhlIFJlbmRlcnNjcmlwdCBzeXN0ZW0sIHRoZXJlIGFyZSB0aHJlZSBsYXllcnMgdGhhdCBleGlzdDo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT5UaGUgbmF0aXZlIFJlbmRlcnNjcmlwdCBsYXllciBjb25zaXN0cyBvZiBuYXRpdmUgbGlicmFyaWVzIHRoYXQgYXJlIHBhY2thZ2VkIHdpdGggdGhlIFNESy4KLSAgICBUaGUgbmF0aXZlIFJlbmRlcnNjcmlwdCA8Y29kZT4ucnM8L2NvZGU+IGZpbGVzIGNvbXB1dGUgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMsIHJlbmRlciBncmFwaGljcywKLSAgICBvciBib3RoLiBUaGlzIGxheWVyIGRvZXMgdGhlIGludGVuc2l2ZSBjb21wdXRhdGlvbiBvciBncmFwaGljcyByZW5kZXJpbmcgYW5kIHJldHVybnMgdGhlIHJlc3VsdAotICAgIGJhY2sgdG8gdGhlIEFuZHJvaWQgVk0gdGhyb3VnaCB0aGUgcmVmbGVjdGVkIGxheWVyLjwvbGk+Ci0KLSAgICA8bGk+VGhlIHJlZmxlY3RlZCBsYXllciBpcyBhIHNldCBvZiBnZW5lcmF0ZWQgQW5kcm9pZCBmcmFtZXdvcmsgY2xhc3NlcyByZWZsZWN0ZWQgZnJvbQotICAgIHRoZSBuYXRpdmUgUmVuZGVyc2NyaXB0IGNvZGUgdGhhdCB5b3Ugd3JvdGUuIFRoaXMgbGF5ZXIgYWN0cyBhcyBhIGJyaWRnZSBiZXR3ZWVuIHRoZSBuYXRpdmUKLSAgICBSZW5kZXJzY3JpcHQgbGF5ZXIgYW5kIHRoZSBBbmRyb2lkIHN5c3RlbSBsYXllci4gVGhlIEFuZHJvaWQgYnVpbGQgdG9vbHMgYXV0b21hdGljYWxseSBnZW5lcmF0ZQotICAgIHRoZSBjbGFzc2VzIGZvciB0aGlzIGxheWVyIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gVGhpcyBsYXllciBhbHNvIGluY2x1ZGVzIGEgc2V0IG9mIEFuZHJvaWQKLSAgICBmcmFtZXdvcmsgQVBJcyB0aGF0IHByb3ZpZGUgdGhlIG1lbW9yeSBhbmQgcmVzb3VyY2UgYWxsb2NhdGlvbiBjbGFzc2VzIHRvIHN1cHBvcnQgdGhpcyBsYXllci48L2xpPgotCi0gICAgPGxpPlRoZSBBbmRyb2lkIHN5c3RlbSBsYXllciBjb25zaXN0cyBvZiB0aGUgdHJhZGl0aW9uYWwgZnJhbWV3b3JrIEFQSXMsIHdoaWNoIGluY2x1ZGUgdGhlIFJlbmRlcnNjcmlwdAotICAgIEFQSXMgaW4ge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0fS4gVGhpcyBsYXllciBoYW5kbGVzIHRoaW5ncyBzdWNoIGFzIHRoZSBBY3Rpdml0eSBsaWZlY3ljbGUKLSAgICBtYW5hZ2VtZW50IG9mIHlvdXIgYXBwbGljYXRpb24gYW5kIGNhbGxzIHRoZSByZWZsZWN0ZWQgbGF5ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbmF0aXZlIFJlbmRlcnNjcmlwdCBjb2RlLjwvbGk+Ci0gIDwvdWw+Ci0KLSAgPHA+VG8gZnVsbHkgdW5kZXJzdGFuZCBob3cgdGhlIFJlbmRlcnNjcmlwdCBzeXN0ZW0gd29ya3MsIHlvdSBtdXN0IHVuZGVyc3RhbmQgaG93IHRoZSByZWZsZWN0ZWQKLSAgbGF5ZXIgaXMgZ2VuZXJhdGVkIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIG5hdGl2ZSBSZW5kZXJzY3JpcHQgbGF5ZXIgYW5kIEFuZHJvaWQgc3lzdGVtCi0gIGxheWVyLiBUaGUgcmVmbGVjdGVkIGxheWVyIHByb3ZpZGVzIHRoZSBlbnRyeSBwb2ludHMgaW50byB0aGUgbmF0aXZlIGNvZGUsIGVuYWJsaW5nIHRoZSBBbmRyb2lkCi0gIHN5c3RlbSB0byBnaXZlIGhpZ2ggbGV2ZWwgY29tbWFuZHMgbGlrZSwgInJvdGF0ZSB0aGUgdmlldyIgb3IgImZpbHRlciB0aGUgYml0bWFwIiB0byB0aGUKLSAgbmF0aXZlIGxheWVyLCB3aGljaCBkb2VzIHRoZSBoZWF2eSBsaWZ0aW5nLiBUbyBhY2NvbXBsaXNoIHRoaXMsIHlvdSBuZWVkIHRvIGNyZWF0ZSBsb2dpYwotICB0byBob29rIHRvZ2V0aGVyIGFsbCBvZiB0aGVzZSBsYXllcnMgc28gdGhhdCB0aGV5IGNhbiBjb3JyZWN0bHkgY29tbXVuaWNhdGUuPC9wPgotCi0gIDxwPkF0IHRoZSByb290IG9mIGV2ZXJ5dGhpbmcgaXMgeW91ciBSZW5kZXJzY3JpcHQsIHdoaWNoIGlzIHRoZSBhY3R1YWwgQyBjb2RlIHRoYXQgeW91IHdyaXRlIGFuZAotICBzYXZlIHRvIGEgPGNvZGU+LnJzPC9jb2RlPiBmaWxlIGluIHlvdXIgcHJvamVjdC4gVGhlcmUgYXJlIHR3byBraW5kcyBvZiBSZW5kZXJzY3JpcHRzOiBjb21wdXRlCi0gIGFuZCBncmFwaGljcy4gQSBjb21wdXRlIFJlbmRlcnNjcmlwdCBkb2VzIG5vdCBkbyBhbnkgZ3JhcGhpY3MgcmVuZGVyaW5nIHdoaWxlIGEgZ3JhcGhpY3MKLSAgUmVuZGVyc2NyaXB0IGRvZXMuPC9wPgotCi0gIDxwPldoZW4geW91IGNyZWF0ZSBSZW5kZXJzY3JpcHQgPGNvZGU+LnJzPC9jb2RlPiBmaWxlcywgZXF1aXZhbGVudCwgcmVmbGVjdGVkIGNsYXNzZXMKLSAgYXJlIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQgdG9vbHMgYW5kIGV4cG9zZSB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBhbmQgZGF0YSB0eXBlcyBhbmQgc3RydWN0dXJlcwotICB0byB0aGUgQW5kcm9pZCBzeXN0ZW0uIFRoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIG1ham9yIGNvbXBvbmVudHMgb2YgeW91ciBuYXRpdmUgUmVuZGVyc2NyaXB0Ci0gIGNvZGUgdGhhdCBpcyByZWZsZWN0ZWQ6PC9wPgotCi0gIDx1bD4KLSAgICA8bGk+VGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGluIHlvdXIgUmVuZGVyc2NyaXB0ICg8Y29kZT4ucnM8L2NvZGU+IGZpbGUpIGFyZSByZWZsZWN0ZWQgaW50bwotICAgIDxjb2RlPjxlbT5TY3JpcHRDX3JlbmRlcnNjcmlwdF9maWxlbmFtZTwvZW0+PC9jb2RlPiBvZiB0eXBlIHtAbGluawotICAgIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdEN9LjwvbGk+Ci0KLSAgICA8bGk+QW55IG5vbi1zdGF0aWMsIGdsb2JhbCBSZW5kZXJzY3JpcHQgdmFyaWFibGVzIGFyZSByZWZsZWN0ZWQgaW50bwotICAgIDxjb2RlPjxlbT5TY3JpcHRDX3JlbmRlcnNjcmlwdF9maWxlbmFtZTwvZW0+PC9jb2RlPi4KLSAgICBBY2Nlc3NvciBtZXRob2RzIGFyZSBnZW5lcmF0ZWQsIHNvIHRoZSBBbmRyb2lkIHN5c3RlbSBsYXllciBjYW4gYWNjZXNzIHRoZSB2YWx1ZXMuCi0gICAgVGhlIDxjb2RlPmdldDwvY29kZT4gbWV0aG9kIGNvbWVzIHdpdGggYSBvbmUtd2F5IGNvbW11bmljYXRpb24gcmVzdHJpY3Rpb24uIAotICAgIFRoZSBBbmRyb2lkIHN5c3RlbSBsYXllciBhbHdheXMgY2FjaGVzIHRoZSBsYXN0IHZhbHVlIHRoYXQgaXMgc2V0IGFuZCByZXR1cm5zIHRoYXQgZHVyaW5nIGEgY2FsbCB0byBhIDxjb2RlPmdldDwvY29kZT4gbWV0aG9kLgotICAgIElmIHRoZSBuYXRpdmUgUmVuZGVyc2NyaXB0IGNvZGUgY2hhbmdlcyB0aGUgdmFsdWUsIHRoZSBjaGFuZ2UgZG9lcyBub3QgcHJvcGFnYXRlIGJhY2sgdG8gdGhlIEFuZHJvaWQgc3lzdGVtIGxheWVyLgotICAgIElmIHRoZSBnbG9iYWwgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgbmF0aXZlIFJlbmRlcnNjcmlwdCBjb2RlLCB0aG9zZSB2YWx1ZXMgYXJlIHVzZWQKLSAgICB0byBpbml0aWFsaXplIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgQW5kcm9pZCBzeXN0ZW0uIElmIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG1hcmtlZCBhcyA8Y29kZT5jb25zdDwvY29kZT4sCi0gICAgdGhlbiBhIDxjb2RlPnNldDwvY29kZT4gbWV0aG9kIGlzIG5vdCBnZW5lcmF0ZWQuCi0gICAgPC9saT4KLQotICAgIDxsaT5TdHJ1Y3RzIGFyZSByZWZsZWN0ZWQgaW50byB0aGVpciBvd24gY2xhc3Nlcywgb25lIGZvciBlYWNoIHN0cnVjdCwgaW50byBhIGNsYXNzIG5hbWVkCi0gICAgPGNvZGU+U2NyaXB0RmllbGRfPGVtPnN0cnVjdF9uYW1lPC9lbT48L2NvZGU+IG9mIHR5cGUge0BsaW5rCi0gICAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2NyaXB0LkZpZWxkQmFzZX0uPC9saT4KLSAgICAKLSAgICA8bGk+R2xvYmFsIHBvaW50ZXJzIGhhdmUgYSBzcGVjaWFsIHByb3BlcnR5LiBUaGV5IHByb3ZpZGUgYXR0YWNobWVudCBwb2ludHMgd2hlcmUgdGhlIEFuZHJvaWQgc3lzdGVtIGNhbiBhdHRhY2ggYWxsb2NhdGlvbnMuIAotICAgIElmIHRoZSBnbG9iYWwgcG9pbnRlciBpcyBhIHVzZXIgZGVmaW5lZCBzdHJ1Y3R1cmUgdHlwZSwgaXQgbXVzdCBiZSBhIHR5cGUgdGhhdCBpcyBsZWdhbCBmb3IgcmVmbGVjdGlvbiAocHJpbWl0aXZlcwotICAgIG9yIFJlbmRlcnNjcmlwdCBkYXRhIHR5cGVzKS4gVGhlIEFuZHJvaWQgc3lzdGVtIGNhbiBjYWxsIHRoZSByZWZsZWN0ZWQgY2xhc3MgdG8gYWxsb2NhdGUgbWVtb3J5IGFuZAotICAgIG9wdGlvbmFsbHkgcG9wdWxhdGUgZGF0YSwgdGhlbiBhdHRhY2ggaXQgdG8gdGhlIFJlbmRlcnNjcmlwdC4KLSAgICBGb3IgYXJyYXlzIG9mIGJhc2ljIHR5cGVzLCB0aGUgcHJvY2VkdXJlIGlzIHNpbWlsYXIsIGV4Y2VwdCBhIHJlZmxlY3RlZCBjbGFzcyBpcyBub3QgbmVlZGVkLgotICAgIFJlbmRlcnNjcmlwdHMgc2hvdWxkIG5vdCBkaXJlY3RseSBzZXQgdGhlIGV4cG9ydGVkIGdsb2JhbCBwb2ludGVycy48L2xpPgotICAgICA8L3VsPgotCi0gIDxwPlRoZSBBbmRyb2lkIGZyYW1ld29yayBBUEkgYWxzbyBoYXMgYSBjb3JyZXNwb25kaW5nIFJlbmRlcnNjcmlwdCBjb250ZXh0IG9iamVjdCwge0BsaW5rCi0gIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdH0gKGZvciBhIGNvbXB1dGUgUmVuZGVyc2NyaXB0KSBvciB7QGxpbmsKLSAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0x9IChmb3IgYSBncmFwaGljcyBSZW5kZXJzY3JpcHQpLiBUaGlzIGNvbnRleHQgb2JqZWN0IGFsbG93cwotICB5b3UgdG8gYmluZCB0byB0aGUgcmVmbGVjdGVkIFJlbmRlcnNjcmlwdCBjbGFzcywgc28gdGhhdCB0aGUgUmVuZGVyc2NyaXB0IGNvbnRleHQga25vd3Mgd2hhdCBpdHMKLSAgY29ycmVzcG9uZGluZyBuYXRpdmUgUmVuZGVyc2NyaXB0IGlzLiBJZiB5b3UgaGF2ZSBhIGdyYXBoaWNzIFJlbmRlcnNjcmlwdCBjb250ZXh0LCB5b3UgY2FuIGFsc28KLSAgc3BlY2lmeSBhIHZhcmlldHkgb2YgUHJvZ3JhbXMgKHN0YWdlcyBpbiB0aGUgZ3JhcGhpY3MgcGlwZWxpbmUpIHRvIHR3ZWVrIGhvdyB5b3VyIGdyYXBoaWNzIGFyZQotICByZW5kZXJlZC4gQSBncmFwaGljcyBSZW5kZXJzY3JpcHQgY29udGV4dCBhbHNvIG5lZWRzIGEgc3VyZmFjZSB0byByZW5kZXIgb24sIHtAbGluawotICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3fSwgd2hpY2ggZ2V0cyBwYXNzZWQgaW50byBpdHMgY29uc3RydWN0b3IuPC9wPgotCi0gIDxoMiBpZD0iYXBpIj5BUEkgb3ZlcnZpZXc8L2gyPgotCi0gIDxwPlJlbmRlcnNjcmlwdCBjb2RlIGlzIGNvbXBpbGVkIGFuZCBleGVjdXRlZCBpbiBhIGNvbXBhY3QgYW5kIHdlbGwgZGVmaW5lZCBydW50aW1lLCB3aGljaCBoYXMKLSAgYWNjZXNzIHRvIGEgbGltaXRlZCBhbW91bnQgb2YgZnVuY3Rpb25zLiBSZW5kZXJzY3JpcHQgY2Fubm90IHVzZSB0aGUgTkRLIG9yIHN0YW5kYXJkIEMgZnVuY3Rpb25zLAotICBiZWNhdXNlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYXNzdW1lZCB0byBiZSBydW5uaW5nIG9uIGEgc3RhbmRhcmQgQ1BVLiBUaGUgUmVuZGVyc2NyaXB0IHJ1bnRpbWUKLSAgY2hvb3NlcyB0aGUgYmVzdCBwcm9jZXNzb3IgdG8gZXhlY3V0ZSB0aGUgY29kZSwgd2hpY2ggbWF5IG5vdCBiZSB0aGUgQ1BVLCBzbyBpdCBjYW5ub3QgZ3VhcmFudGVlCi0gIHN1cHBvcnQgZm9yIHN0YW5kYXJkIEMgbGlicmFyaWVzLiBXaGF0IFJlbmRlcnNjcmlwdCBkb2VzIG9mZmVyIGlzIGFuIEFQSSB0aGF0IHN1cHBvcnRzIGludGVuc2l2ZQotICBjb21wdXRhdGlvbiB3aXRoIGFuIGV4dGVuc2l2ZSBjb2xsZWN0aW9uIG9mIG1hdGggQVBJcy4gVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBncm91cCB0aGUgQVBJcwotICBpbnRvIHRocmVlIGRpc3RpbmN0IGNhdGVnb3JpZXMuPC9wPgotCi0KLSAgPGgzIGlkPSJuYXRpdmUtYXBpIj5OYXRpdmUgUmVuZGVyc2NyaXB0IEFQSXM8L2gzPgotCi0gIDxwPlRoZSBSZW5kZXJzY3JpcHQgaGVhZGVycyBhcmUgbG9jYXRlZCBpbiB0aGUgPGNvZGU+aW5jbHVkZTwvY29kZT4gYW5kCi0gIDxjb2RlPmNsYW5nLWluY2x1ZGU8L2NvZGU+IGRpcmVjdG9yaWVzIGluIHRoZQotICA8Y29kZT4mbHQ7c2RrX3Jvb3QmZ3Q7L3BsYXRmb3Jtcy9hbmRyb2lkLTExL3JlbmRlcnNjcmlwdDwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSBBbmRyb2lkIFNESy4KLSAgVGhlIGhlYWRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgZm9yIHlvdSwgZXhjZXB0IGZvciB0aGUgZ3JhcGhpY3Mgc3BlY2lmaWMgaGVhZGVyLAotICB3aGljaCB5b3UgY2FuIGRlZmluZSBhcyBmb2xsb3dzOjwvcD4KLSAgCi08cHJlPiNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giPC9wcmU+Ci0KLTxwPlNvbWUga2V5IGZlYXR1cmVzIG9mIHRoZSBuYXRpdmUgUmVuZGVyc2NyaXB0IGxpYnJhcmllcyBpbmNsdWRlOgotICA8dWw+Ci0gICAgPGxpPkEgbGFyZ2UgY29sbGVjdGlvbiBvZiBtYXRoIGZ1bmN0aW9ucyB3aXRoIGJvdGggc2NhbGFyIGFuZCB2ZWN0b3IgdHlwZWQgb3ZlcmxvYWRlZCB2ZXJzaW9ucwotICAgIG9mIG1hbnkgY29tbW9uIHJvdXRpbmVzLiBPcGVyYXRpb25zIHN1Y2ggYXMgYWRkaW5nLCBtdWx0aXBseWluZywgZG90IHByb2R1Y3QsIGFuZCBjcm9zcyBwcm9kdWN0Ci0gICAgYXJlIGF2YWlsYWJsZS48L2xpPgotICAgIDxsaT5Db252ZXJzaW9uIHJvdXRpbmVzIGZvciBwcmltaXRpdmUgZGF0YSB0eXBlcyBhbmQgdmVjdG9ycywgbWF0cml4IHJvdXRpbmVzLCBkYXRlIGFuZCB0aW1lCi0gICAgcm91dGluZXMsIGFuZCBncmFwaGljcyByb3V0aW5lcy48L2xpPgotICAgIDxsaT5Mb2dnaW5nIGZ1bmN0aW9uczwvbGk+Ci0gICAgPGxpPkdyYXBoaWNzIHJlbmRlcmluZyBmdW5jdGlvbnM8L2xpPgotICAgIDxsaT5NZW1vcnkgYWxsb2NhdGlvbiByZXF1ZXN0IGZlYXR1cmVzPC9saT4KLSAgICA8bGk+RGF0YSB0eXBlcyBhbmQgc3RydWN0dXJlcyB0byBzdXBwb3J0IHRoZSBSZW5kZXJzY3JpcHQgc3lzdGVtIHN1Y2ggYXMKLSAgICBWZWN0b3IgdHlwZXMgZm9yIGRlZmluaW5nIHR3by0sIHRocmVlLSwgb3IgZm91ci12ZWN0b3JzLjwvbGk+Ci0gIDwvdWw+Ci0KLSAgPGgzIGlkPSJyZWZsZWN0aXZlLWFwaSI+UmVmbGVjdGVkIGxheWVyIEFQSXM8L2gzPgotCi0gIDxwPlRoZXNlIGNsYXNzZXMgYXJlIG1haW5seSB1c2VkIGJ5IHRoZSByZWZsZWN0ZWQgY2xhc3NlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZnJvbSB5b3VyIG5hdGl2ZSBSZW5kZXJzY3JpcHQKLSAgY29kZS4gVGhleSBhbGxvY2F0ZSBhbmQgbWFuYWdlIG1lbW9yeSBmb3IgeW91ciBSZW5kZXJzY3JpcHQgb24gdGhlIEFuZHJvaWQgc3lzdGVtIHNpZGUuIAotICBZb3Ugbm9ybWFsbHkgZG8gbm90IG5lZWQgdG8gY2FsbCB0aGVzZSBjbGFzc2VzIGRpcmVjdGx5LjwvcD4gCi0gIAotICA8cD5CZWNhdXNlIG9mIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgUmVuZGVyc2NyaXB0IG5hdGl2ZSBsYXllciwgeW91IGNhbm5vdCBkbyBhbnkgZHluYW1pYwotICBtZW1vcnkgYWxsb2NhdGlvbiBpbiB5b3VyIFJlbmRlcnNjcmlwdCA8Y29kZT4ucnM8L2NvZGU+IGZpbGUuCi0gIFRoZSBuYXRpdmUgUmVuZGVyc2NyaXB0IGxheWVyIGNhbiByZXF1ZXN0IG1lbW9yeSBmcm9tIHRoZSBBbmRyb2lkIHN5c3RlbSBsYXllciwgd2hpY2ggYWxsb2NhdGVzIG1lbW9yeQotICBmb3IgeW91IGFuZCBkb2VzIHJlZmVyZW5jZSBjb3VudGluZyB0byBmaWd1cmUgb3V0IHdoZW4gdG8gZnJlZSB0aGUgbWVtb3J5LiBBIG1lbW9yeSBhbGxvY2F0aW9uCi0gIGlzIHRha2VuIGNhcmUgb2YgYnkgdGhlIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9ufSBjbGFzcyBhbmQgbWVtb3J5IGlzIHJlcXVlc3RlZAotICBpbiB5b3VyIFJlbmRlcnNjcmlwdCBjb2RlIHdpdGggdGhlIDxjb2RlPnRoZSByc19hbGxvY2F0aW9uPC9jb2RlPiB0eXBlLgotICBBbGwgcmVmZXJlbmNlcyB0byBSZW5kZXJzY3JpcHQgb2JqZWN0cyBhcmUgY291bnRlZCwgc28gd2hlbiB5b3VyIFJlbmRlcnNjcmlwdCBuYXRpdmUgY29kZQotICBvciBzeXN0ZW0gY29kZSBubyBsb25nZXIgcmVmZXJlbmNlcyBhIHBhcnRpY3VsYXIge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb259LCBpdCBkZXN0cm95cyBpdHNlbGYuCi0gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY2FsbCB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbiNkZXN0cm95IGRlc3Ryb3koKX0gZnJvbSB0aGUKLSAgQW5kcm9pZCBzeXN0ZW0gbGV2ZWwsIHdoaWNoIGRlY3JlYXNlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbn0uCi0gIElmIG5vIHJlZmVyZW5jZXMgZXhpc3QgYWZ0ZXIgdGhlIGRlY3JlYXNlLCB0aGUge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb259IGRlc3Ryb3lzIGl0c2VsZi4KLSAgVGhlIEFuZHJvaWQgc3lzdGVtIG9iamVjdCwgd2hpY2ggYXQgdGhpcyBwb2ludCBpcyBqdXN0IGFuIGVtcHR5IHNoZWxsLCBpcyBldmVudHVhbGx5IGdhcmJhZ2UgY29sbGVjdGVkLgotICA8L3A+Ci0KLSAgPHA+VGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBtYWlubHkgdXNlZCBieSB0aGUgcmVmbGVjdGVkIGxheWVyIGNsYXNzZXM6PC9wPgotCi0gIDx0YWJsZT4KLSAgICA8dHI+Ci0gICAgICA8dGg+QW5kcm9pZCBPYmplY3QgVHlwZTwvdGg+Ci0KLSAgICAgIDx0aD5SZW5kZXJzY3JpcHQgTmF0aXZlIFR5cGU8L3RoPgotCi0gICAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICAgIDwvdHI+Ci0KLSAgICA8dHI+Ci0gICAgICA8dGQ+e0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnR9PC90ZD4KLQotICAgICAgPHRkPnJzX2VsZW1lbnQ8L3RkPgotCi0gICAgICA8dGQ+Ci0gICAgICAgIEFuIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50fSBpcyB0aGUgbW9zdCBiYXNpYyBlbGVtZW50IG9mIGEgbWVtb3J5IHR5cGUuIEFuCi0gICAgICAgIGVsZW1lbnQgcmVwcmVzZW50cyBvbmUgY2VsbCBvZiBhIG1lbW9yeSBhbGxvY2F0aW9uLiBBbiBlbGVtZW50IGNhbiBoYXZlIHR3byBmb3JtczogQmFzaWMgb3IKLSAgICAgICAgQ29tcGxleC4gVGhleSBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgZnJvbSBDIHN0cnVjdHVyZXMgaW4geW91ciBSZW5kZXJzY3JpcHQKLSAgICAgICAgY29kZSBkdXJpbmcgdGhlIHJlZmxlY3Rpb24gcHJvY2Vzcy4gRWxlbWVudHMgY2Fubm90IGNvbnRhaW4gcG9pbnRlcnMgb3IgbmVzdGVkIGFycmF5cy4gCi0gICAgICAgIFRoZSBvdGhlciBjb21tb24gc291cmNlIG9mIGVsZW1lbnRzIGlzIGJpdG1hcCBmb3JtYXRzLgotCi0gICAgICAgIDxwPkEgYmFzaWMgZWxlbWVudCBjb250YWlucyBhIHNpbmdsZSBjb21wb25lbnQgb2YgZGF0YSBvZiBhbnkgdmFsaWQgUmVuZGVyc2NyaXB0IGRhdGEgdHlwZS4KLSAgICAgICAgRXhhbXBsZXMgb2YgYmFzaWMgZWxlbWVudCBkYXRhIHR5cGVzIGluY2x1ZGUgYSBzaW5nbGUgZmxvYXQgdmFsdWUsIGEgZmxvYXQ0IHZlY3Rvciwgb3IgYQotICAgICAgICBzaW5nbGUgUkdCLTU2NSBjb2xvci48L3A+Ci0KLSAgICAgICAgPHA+Q29tcGxleCBlbGVtZW50cyBjb250YWluIGEgbGlzdCBvZiBzdWItZWxlbWVudHMgYW5kIG5hbWVzIHRoYXQgaXMgYmFzaWNhbGx5IGEgcmVmbGVjdGlvbgotICAgICAgICBvZiBhIEMgc3RydWN0LiBZb3UgYWNjZXNzIHRoZSBzdWItZWxlbWVudHMgYnkgbmFtZSBmcm9tIGEgc2NyaXB0IG9yIHZlcnRleCBwcm9ncmFtLiBUaGUKLSAgICAgICAgbW9zdCBiYXNpYyBwcmltaXRpdmUgdHlwZSBkZXRlcm1pbmVzIHRoZSBkYXRhIGFsaWdubWVudCBvZiB0aGUgc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwgYQotICAgICAgICBmbG9hdDQgdmVjdG9yIGlzIGFsbGlnbmVkIHRvIDxjb2RlPnNpemVvZihmbG9hdCk8L2NvZGU+IGFuZCBub3QKLSAgICAgICAgPGNvZGU+c2l6ZW9mKGZsb2F0NCk8L2NvZGU+LiBUaGUgb3JkZXJpbmcgb2YgdGhlIGVsZW1lbnRzIGluIG1lbW9yeSBhcmUgdGhlIG9yZGVyIGluIHdoaWNoCi0gICAgICAgIHRoZXkgd2VyZSBhZGRlZCwgd2l0aCBlYWNoIGNvbXBvbmVudCBhbGlnbmVkIGFzIG5lY2Vzc2FyeS48L3A+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0KLSAgICA8dHI+Ci0gICAgICA8dGQ+e0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGV9PC90ZD4KLQotICAgICAgPHRkPnJzX3R5cGU8L3RkPgotCi0gICAgICA8dGQ+QSBUeXBlIGlzIGFuIGFsbG9jYXRpb24gdGVtcGxhdGUgdGhhdCBjb25zaXN0cyBvZiBhbiBlbGVtZW50IGFuZCBvbmUgb3IgbW9yZSBkaW1lbnNpb25zLgotICAgICAgSXQgZGVzY3JpYmVzIHRoZSBsYXlvdXQgb2YgdGhlIG1lbW9yeSBidXQgZG9lcyBub3QgYWxsb2NhdGUgc3RvcmFnZSBmb3IgdGhlIGRhdGEgdGhhdCBpdAotICAgICAgZGVzY3JpYmVzLiBBIFR5cGUgY29uc2lzdHMgb2YgZml2ZSBkaW1lbnNpb25zOiBYLCBZLCBaLCBMT0QgKGxldmVsIG9mIGRldGFpbCksIGFuZCBGYWNlcyAob2YKLSAgICAgIGEgY3ViZSBtYXApLiBZb3UgY2FuIGFzc2lnbiB0aGUgWCxZLFogZGltZW5zaW9ucyB0byBhbnkgcG9zaXRpdmUgaW50ZWdlciB2YWx1ZSB3aXRoaW4gdGhlCi0gICAgICBjb25zdHJhaW50cyBvZiBhdmFpbGFibGUgbWVtb3J5LiBBIHNpbmdsZSBkaW1lbnNpb24gYWxsb2NhdGlvbiBoYXMgYW4gWCBkaW1lbnNpb24gb2YgZ3JlYXRlcgotICAgICAgdGhhbiB6ZXJvIHdoaWxlIHRoZSBZIGFuZCBaIGRpbWVuc2lvbnMgYXJlIHplcm8gdG8gaW5kaWNhdGUgbm90IHByZXNlbnQuIEZvciBleGFtcGxlLCBhbgotICAgICAgYWxsb2NhdGlvbiBvZiB4PTEwLCB5PTEgaXMgY29uc2lkZXJlZCB0d28gZGltZW5zaW9uYWwgYW5kIHg9MTAsIHk9MCBpcyBjb25zaWRlcmVkIG9uZQotICAgICAgZGltZW5zaW9uYWwuIFRoZSBMT0QgYW5kIEZhY2VzIGRpbWVuc2lvbnMgYXJlIGJvb2xlYW5zIHRvIGluZGljYXRlIHByZXNlbnQgb3Igbm90Ci0gICAgICBwcmVzZW50LjwvdGQ+Ci0gICAgPC90cj4KLQotICAgIDx0cj4KLSAgICAgIDx0ZD57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbn08L3RkPgotCi0gICAgICA8dGQ+cnNfYWxsb2NhdGlvbjwvdGQ+Ci0KLSAgICAgIDx0ZD4KLSAgICAgICAgPHA+QW4ge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb259IHByb3ZpZGVzIHRoZSBtZW1vcnkgZm9yIGFwcGxpY2F0aW9ucy4gQW4ge0BsaW5rCi0gICAgICAgIGFuZHJvaWQucmVuZGVyc2NyaXB0LkFsbG9jYXRpb259IGFsbG9jYXRlcyBtZW1vcnkgYmFzZWQgb24gYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVtb3J5IHRoYXQKLSAgICAgICAgaXMgcmVwcmVzZW50ZWQgYnkgYSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuVHlwZX0uIFRoZSB0eXBlIGRlc2NyaWJlcyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0Ci0gICAgICAgIHJlcHJlc2VudCB0aGUgbWVtb3J5IHRvIGJlIGFsbG9jYXRlZC4gQWxsb2NhdGlvbnMgYXJlIHRoZSBwcmltYXJ5IHdheSBkYXRhIG1vdmVzIGludG8gYW5kCi0gICAgICAgIG91dCBvZiBzY3JpcHRzLjwvcD4KLQotICAgICAgICA8cD5NZW1vcnkgaXMgdXNlci1zeW5jaHJvbml6ZWQgYW5kIGl0J3MgcG9zc2libGUgZm9yIGFsbG9jYXRpb25zIHRvIGV4aXN0IGluIG11bHRpcGxlCi0gICAgICAgIG1lbW9yeSBzcGFjZXMgY29uY3VycmVudGx5LiBGb3IgZXhhbXBsZSwgaWYgeW91IG1ha2UgYSBjYWxsIHRvIHRoZSBncmFwaGljcyBjYXJkIHRvIGxvYWQgYQotICAgICAgICBiaXRtYXAsIHlvdSBnaXZlIGl0IHRoZSBiaXRtYXAgdG8gbG9hZCBmcm9tIGluIHRoZSBzeXN0ZW0gbWVtb3J5LiBBZnRlciB0aGF0IGNhbGwgcmV0dXJucywKLSAgICAgICAgdGhlIGdyYXBoaWNzIG1lbW9yeSBjb250YWlucyBpdHMgb3duIGNvcHkgb2YgdGhlIGJpdG1hcCBzbyB5b3UgY2FuIGNob29zZSB3aGV0aGVyIG9yIG5vdCB0bwotICAgICAgICBtYWludGFpbiB0aGUgYml0bWFwIGluIHRoZSBzeXN0ZW0gbWVtb3J5LiBJZiB0aGUgUmVuZGVyc2NyaXB0IHN5c3RlbSBtb2RpZmllcyBhbiBhbGxvY2F0aW9uCi0gICAgICAgIHRoYXQgaXMgdXNlZCBieSBvdGhlciB0YXJnZXRzLCBpdCBtdXN0IGNhbGwge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0I3N5bmNBbGwgc3luY0FsbCgpfSB0byBwdXNoIHRoZSB1cGRhdGVzIHRvCi0gICAgICAgIHRoZSBtZW1vcnkuIE90aGVyd2lzZSwgdGhlIHJlc3VsdHMgYXJlIHVuZGVmaW5lZC48L3A+Ci0KLSAgICAgICAgPHA+QWxsb2NhdGlvbiBkYXRhIGlzIHVwbG9hZGVkIGluIG9uZSBvZiB0d28gcHJpbWFyeSB3YXlzOiB0eXBlIGNoZWNrZWQgYW5kIHR5cGUgdW5jaGVja2VkLgotICAgICAgICBGb3Igc2ltcGxlIGFycmF5cyB0aGVyZSBhcmUgPGNvZGU+Y29weUZyb20oKTwvY29kZT4gZnVuY3Rpb25zIHRoYXQgdGFrZSBhbiBhcnJheSBmcm9tIHRoZQotICAgICAgICBBbmRyb2lkIHN5c3RlbSBhbmQgY29weSBpdCB0byB0aGUgbmF0aXZlIGxheWVyIG1lbW9yeSBzdG9yZS4gQm90aCB0eXBlIGNoZWNrZWQgYW5kCi0gICAgICAgIHVuY2hlY2tlZCBjb3BpZXMgYXJlIHByb3ZpZGVkLiBUaGUgdW5jaGVja2VkIHZhcmlhbnRzIGFsbG93IHRoZSBBbmRyb2lkIHN5c3RlbSB0byBjb3B5IG92ZXIKLSAgICAgICAgYXJyYXlzIG9mIHN0cnVjdHVyZXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdXBwb3J0IHN0cnVjdHVyZXMuIEZvciBleGFtcGxlLCBpZgotICAgICAgICB0aGVyZSBpcyBhbiBhbGxvY2F0aW9uIHRoYXQgaXMgYW4gYXJyYXkgbiBmbG9hdHMsIHlvdSBjYW4gY29weSB0aGUgZGF0YSBjb250YWluZWQgaW4gYQotICAgICAgICBmbG9hdFtuXSBhcnJheSBvciBhIGJ5dGVbbio0XSBhcnJheS48L3A+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0KLSAgICA8dHI+Ci0gICAgICA8dGQ+e0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdH08L3RkPgotCi0gICAgICA8dGQ+cnNfc2NyaXB0PC90ZD4KLQotICAgICAgPHRkPlJlbmRlcnNjcmlwdCBzY3JpcHRzIGRvIG11Y2ggb2YgdGhlIHdvcmsgaW4gdGhlIG5hdGl2ZSBsYXllci4gVGhpcyBjbGFzcyBpcyBnZW5lcmF0ZWQKLSAgICAgIGZyb20gYSBSZW5kZXJzY3JpcHQgZmlsZSB0aGF0IGhhcyB0aGUgPGNvZGU+LnJzPC9jb2RlPiBmaWxlIGV4dGVuc2lvbi4gVGhpcyBjbGFzcyBpcyBuYW1lZAotICAgICAgPGNvZGU+U2NyaXB0Q188ZW0+cmVuZGVyc3JpcHRfZmlsZW5hbWU8L2VtPjwvY29kZT4gd2hlbiBpdCBnZXRzIGdlbmVyYXRlZC48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0KLSAgPGgzIGlkPSJncmFwaGljcy1hcGkiPkdyYXBoaWNzIEFQSTwvaDM+Ci0KLSAgPHA+UmVuZGVyc2NyaXB0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGdyYXBoaWNzIEFQSXMgZm9yIGhhcmR3YXJlLWFjY2VsZXJhdGVkIDNEIHJlbmRlcmluZy4gVGhlCi0gIFJlbmRlcnNjcmlwdCBncmFwaGljcyBBUElzIGluY2x1ZGUgYSBzdGF0ZWZ1bCBjb250ZXh0LCB7QGxpbmsKLSAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0x9IHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIHN0YXRlLiBUaGUgcHJpbWFyeSBzdGF0ZQotICBjb25zaXN0cyBvZiB0aGUgb2JqZWN0cyB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGUgcmVuZGVyaW5nIGNvbnRleHQsIHdoaWNoIGFyZSB0aGUgZ3JhcGhpY3MgUmVuZGVyc2NyaXB0Ci0gIGFuZCB0aGUgZm91ciBwcm9ncmFtIHR5cGVzLiBUaGUgbWFpbiB3b3JraW5nIGZ1bmN0aW9uIG9mIHRoZSBncmFwaGljcyBSZW5kZXJzY3JpcHQgaXMgdGhlIGNvZGUgdGhhdCBpcwotICBkZWZpbmVkIGluIHRoZSA8Y29kZT5yb290KCk8L2NvZGU+IGZ1bmN0aW9uLiBUaGUgPGNvZGU+cm9vdCgpPC9jb2RlPiBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIHRoZSBzdXJmYWNlIGdvZXMgdGhyb3VnaCBhIGZyYW1lCi0gIHJlZnJlc2guIFRoZSBmb3VyIHByb2dyYW0gdHlwZXMgbWlycm9yIGEgdHJhZGl0aW9uYWwgZ3JhcGhpY2FsIHJlbmRlcmluZyBwaXBlbGluZSBhbmQgYXJlOjwvcD4KLQotICA8dWw+Ci0gICAgPGxpPlZlcnRleDwvbGk+Ci0KLSAgICA8bGk+RnJhZ21lbnQ8L2xpPgotCi0gICAgPGxpPlN0b3JlPC9saT4KLQotICAgIDxsaT5SYXN0ZXI8L2xpPgotICA8L3VsPgotCi0gIDxwPkdyYXBoaWNhbCBzY3JpcHRzIGhhdmUgbW9yZSBwcm9wZXJ0aWVzIGJleW9uZCBhIGJhc2ljIGNvbXB1dGF0aW9uYWwgc2NyaXB0LCBhbmQgdGhleSBjYWxsIHRoZQotICAncnNnJy1wcmVmaXhlZCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+cnNfZ3JhcGhpY3MucnNoPC9jb2RlPiBoZWFkZXIgZmlsZS4gQSBncmFwaGljcwotICBSZW5kZXJzY3JpcHQgY2FuIGFsc28gc2V0IGZvdXIgcHJhZ21hcyB0aGF0IGNvbnRyb2wgdGhlIGRlZmF1bHQgYmluZGluZ3MgdG8gdGhlIHtAbGluawotICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTH0gY29udGV4dCB3aGVuIHRoZSBzY3JpcHQgaXMgZXhlY3V0aW5nOjwvcD4KLQotICA8dWw+Ci0gICAgPGxpPnN0YXRlVmVydGV4PC9saT4KLQotICAgIDxsaT5zdGF0ZUZyYWdtZW50PC9saT4KLQotICAgIDxsaT5zdGF0ZVJhc3RlcjwvbGk+Ci0KLSAgICA8bGk+c3RhdGVTdG9yZTwvbGk+Ci0gIDwvdWw+Ci0KLSAgPHA+VGhlIHBvc3NpYmxlIHZhbHVlcyBhcmUgPGNvZGU+cGFyZW50PC9jb2RlPiBvciA8Y29kZT5kZWZhdWx0PC9jb2RlPiBmb3IgZWFjaCBwcmFnbWEuIFVzaW5nCi0gIDxjb2RlPmRlZmF1bHQ8L2NvZGU+IHNheXMgdGhhdCB3aGVuIGEgc2NyaXB0IGlzIGV4ZWN1dGVkLCB0aGUgYmluZGluZ3MgdG8gdGhlIGdyYXBoaWNhbCBjb250ZXh0Ci0gIGFyZSB0aGUgc3lzdGVtIGRlZmF1bHRzLiBVc2luZyA8Y29kZT5wYXJlbnQ8L2NvZGU+IHNheXMgdGhhdCB0aGUgc3RhdGUgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGl0Ci0gIGlzIGluIHRoZSBjYWxsaW5nIHNjcmlwdC4gSWYgdGhpcyBpcyBhIHJvb3Qgc2NyaXB0LCB0aGUgcGFyZW50Ci0gIHN0YXRlIGlzIHRha2VuIGZyb20gdGhlIGJpbmQgcG9pbnRzIGFzIHNldCBpbiB0aGUge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMfQotICBiaW5kIG1ldGhvZHMgaW4gdGhlIGNvbnRyb2wgZW52aXJvbm1lbnQgKFZNIGVudmlyb25tZW50KS48L3A+Ci0KLSAgPHA+Rm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIHRoaXMgYXQgdGhlIHRvcCBvZiB5b3VyIG5hdGl2ZSBncmFwaGljcyBSZW5kZXJzY3JpcHQgY29kZTo8L3A+Ci0gIDxwcmU+Ci0jcHJhZ21hIHN0YXRlVmVydGV4KHBhcmVudCkKLSNwcmFnbWEgc3RhdGVTdG9yZShwYXJlbnQpCi08L3ByZT4KLQotICA8cD5UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgbWFqb3IgZ3JhcGhpY3Mgc3BlY2lmaWMgQVBJcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8geW91OjwvcD4KLQotICA8dGFibGU+Ci0gICAgPHRyPgotICAgICAgPHRoPkFuZHJvaWQgT2JqZWN0IFR5cGU8L3RoPgotCi0gICAgICA8dGg+UmVuZGVyc2NyaXB0IE5hdGl2ZSBUeXBlPC90aD4KLQotICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLSAgICA8L3RyPgotCi0gICAgPHRyPgotICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtVmVydGV4fTwvdGQ+Ci0KLSAgICAgIDx0ZD5yc19wcm9ncmFtX3ZlcnRleDwvdGQ+Ci0KLSAgICAgIDx0ZD4KLSAgICAgICAgPHA+VGhlIFJlbmRlcnNjcmlwdCB2ZXJ0ZXggcHJvZ3JhbSwgYWxzbyBrbm93biBhcyBhIHZlcnRleCBzaGFkZXIsIGRlc2NyaWJlcyB0aGUgc3RhZ2UgaW4gdGhlCi0gICAgICAgIGdyYXBoaWNzIHBpcGVsaW5lIHJlc3BvbnNpYmxlIGZvciBtYW5pcHVsYXRpbmcgZ2VvbWV0cmljIGRhdGEgaW4gYSB1c2VyLWRlZmluZWQgd2F5LiBUaGUKLSAgICAgICAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGJ5IHByb3ZpZGluZyBSZW5kZXJzY3JpcHQgd2l0aCB0aGUgZm9sbG93aW5nIGRhdGE6PC9wPgotCi0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+QW4gRWxlbWVudCBkZXNjcmliaW5nIGl0cyB2YXJ5aW5nIGlucHV0cyBvciBhdHRyaWJ1dGVzPC9saT4KLQotICAgICAgICAgIDxsaT5HTFNMIHNoYWRlciBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtPC9saT4KLQotICAgICAgICAgIDxsaT5hIFR5cGUgdGhhdCBkZXNjcmliZXMgdGhlIGxheW91dCBvZiBhbiBBbGxvY2F0aW9uIGNvbnRhaW5pbmcgY29uc3RhbnQgb3IgdW5pZm9ybQotICAgICAgICAgIGlucHV0czwvbGk+Ci0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPHA+T25jZSB0aGUgcHJvZ3JhbSBpcyBjcmVhdGVkLCBiaW5kIGl0IHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0x9IAotICAgICAgICBncmFwaGljcyBjb250ZXh0IGJ5IGNhbGxpbmcgCi0gICAgICAgIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTCNiaW5kUHJvZ3JhbVZlcnRleCBiaW5kUHJvZ3JhbVZlcnRleCgpfS4gSXQgaXMgdGhlbiB1c2VkIGZvciBhbGwKLSAgICAgICAgc3Vic2VxdWVudCBkcmF3IGNhbGxzIHVudGlsIHlvdSBiaW5kIGEgbmV3IHByb2dyYW0uIElmIHRoZSBwcm9ncmFtIGhhcyBjb25zdGFudCBpbnB1dHMsIHRoZQotICAgICAgICB1c2VyIG5lZWRzIHRvIGJpbmQgYW4gYWxsb2NhdGlvbiBjb250YWluaW5nIHRob3NlIGlucHV0cy4gVGhlIGFsbG9jYXRpb24ncyB0eXBlIG11c3QgbWF0Y2gKLSAgICAgICAgdGhlIG9uZSBwcm92aWRlZCBkdXJpbmcgY3JlYXRpb24uIFRoZSBSZW5kZXJzY3JpcHQgbGlicmFyeSB0aGVuIGRvZXMgYWxsIHRoZSBuZWNlc3NhcnkKLSAgICAgICAgcGx1bWJpbmcgdG8gc2VuZCB0aG9zZSBjb25zdGFudHMgdG8gdGhlIGdyYXBoaWNzIGhhcmR3YXJlLiBWYXJ5aW5nIGlucHV0cyB0byB0aGUgc2hhZGVyLAotICAgICAgICBzdWNoIGFzIHBvc2l0aW9uLCBub3JtYWwsIGFuZCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFyZSBtYXRjaGVkIGJ5IG5hbWUgYmV0d2VlbiB0aGUgaW5wdXQKLSAgICAgICAgRWxlbWVudCBhbmQgdGhlIE1lc2ggb2JqZWN0IGJlaW5nIGRyYXduLiBUaGUgc2lnbmF0dXJlcyBkb24ndCBoYXZlIHRvIGJlIGV4YWN0IG9yIGluIGFueQotICAgICAgICBzdHJpY3Qgb3JkZXIuIEFzIGxvbmcgYXMgdGhlIGlucHV0IG5hbWUgaW4gdGhlIHNoYWRlciBtYXRjaGVzIGEgY2hhbm5lbCBuYW1lIGFuZCBzaXplCi0gICAgICAgIGF2YWlsYWJsZSBvbiB0aGUgbWVzaCwgdGhlIHJ1bi10aW1lIHdvdWxkIHRha2UgY2FyZSBvZiBjb25uZWN0aW5nIHRoZSB0d28uIFVubGlrZSBPcGVuR0wsCi0gICAgICAgIHRoZXJlIGlzIG5vIG5lZWQgdG8gbGluayB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtcy48L3A+Ci0gICAgICAgIDxwPiAgVG8gYmluZCBzaGFkZXIgY29uc3RydWN0cyB0byB0aGUgUHJvZ3JhbSwgZGVjbGFyZSBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBuZWNlc3Nhcnkgc2hhZGVyIGNvbnN0YW50cyBpbiB5b3VyIG5hdGl2ZSBSZW5kZXJzY3JpcHQgY29kZS4KLSAgVGhpcyBzdHJ1Y3QgaXMgZ2VuZXJhdGVkIGludG8gYSByZWZsZWN0ZWQgY2xhc3MgdGhhdCB5b3UgY2FuIHVzZSBhcyBhIGNvbnN0YW50IGlucHV0IGVsZW1lbnQKLSAgZHVyaW5nIHRoZSBQcm9ncmFtJ3MgY3JlYXRpb24uIEl0IGlzIGFuIGVhc3kgd2F5IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdCBhcyBhbiBhbGxvY2F0aW9uLgotICBZb3Ugd291bGQgdGhlbiBiaW5kIHRoaXMgQWxsb2NhdGlvbiB0byB0aGUgUHJvZ3JhbSBhbmQgdGhlIFJlbmRlcnNjcmlwdCBzeXN0ZW0gc2VuZHMgdGhlIGRhdGEgdGhhdAotICBpcyBjb250YWluZWQgaW4gdGhlIHN0cnVjdCB0byB0aGUgaGFyZHdhcmUgd2hlbiBuZWNlc3NhcnkuIFRvIHVwZGF0ZSBzaGFkZXIgY29uc3RhbnRzLCB5b3UgY2hhbmdlIHRoZSB2YWx1ZXMKLSAgaW4gdGhlIEFsbG9jYXRpb24gYW5kIG5vdGlmeSB0aGUgbmF0aXZlIFJlbmRlcnNjcmlwdCBjb2RlIG9mIHRoZSBjaGFuZ2UuPC9wPgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPHRyPgotICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtRnJhZ21lbnR9PC90ZD4KLQotICAgICAgPHRkPnJzX3Byb2dyYW1fZnJhZ21lbnQ8L3RkPgotCi0gICAgICA8dGQ+PHA+VGhlIFJlbmRlcnNjcmlwdCBmcmFnbWVudCBwcm9ncmFtLCBhbHNvIGtub3duIGFzIHRoZSBmcmFnbWVudCBzaGFkZXIsIGlzIHJlc3BvbnNpYmxlIGZvcgotICAgICAgbWFuaXB1bGF0aW5nIHBpeGVsIGRhdGEgaW4gYSB1c2VyLWRlZmluZWQgd2F5LiBJdCdzIGNvbnN0cnVjdGVkIGZyb20gYSBHTFNMIHNoYWRlciBzdHJpbmcKLSAgICAgIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0gYm9keSwgdGV4dHVyZXMgaW5wdXRzLCBhbmQgYSBUeXBlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBjb25zdGFudHMgdXNlZAotICAgICAgYnkgdGhlIHByb2dyYW0uIExpa2UgdGhlIHZlcnRleCBwcm9ncmFtcywgd2hlbiBhbiBhbGxvY2F0aW9uIHdpdGggY29uc3RhbnQgaW5wdXQgdmFsdWVzIGlzCi0gICAgICBib3VuZCB0byB0aGUgc2hhZGVyLCBpdHMgdmFsdWVzIGFyZSBzZW50IHRvIHRoZSBncmFwaGljcyBwcm9ncmFtIGF1dG9tYXRpY2FsbHkuIE5vdGUgdGhhdCB0aGUKLSAgICAgIHZhbHVlcyBpbnNpZGUgdGhlIGFsbG9jYXRpb24gYXJlIG5vdCBleHBsaWNpdGx5IHRyYWNrZWQuIElmIHRoZXkgY2hhbmdlIGJldHdlZW4gdHdvIGRyYXcKLSAgICAgIGNhbGxzIHVzaW5nIHRoZSBzYW1lIHByb2dyYW0gb2JqZWN0LCBub3RpZnkgdGhlIHJ1bnRpbWUgb2YgdGhhdCBjaGFuZ2UgYnkgY2FsbGluZwotICAgICAgcnNnQWxsb2NhdGlvblN5bmNBbGwgc28gaXQgY291bGQgc2VuZCB0aGUgbmV3IHZhbHVlcyB0byBoYXJkd2FyZS4gQ29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQotICAgICAgdmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtcyBpcyBoYW5kbGVkIGludGVybmFsbHkgaW4gdGhlIEdMU0wgY29kZS4gRm9yIGV4YW1wbGUsIGlmIHRoZQotICAgICAgZnJhZ21lbnQgcHJvZ3JhbSBpcyBleHBlY3RpbmcgYSB2YXJ5aW5nIGlucHV0IGNhbGxlZCB2YXJUZXgwLCB0aGUgR0xTTCBjb2RlIGluc2lkZSB0aGUKLSAgICAgIHByb2dyYW0gdmVydGV4IG11c3QgcHJvdmlkZSBpdC48L3A+Ci0gICAgICA8cD4gIFRvIGJpbmQgc2hhZGVyIGNvbnN0cnVjdHMgdG8gdGhlIHRoaXMgUHJvZ3JhbSwgZGVjbGFyZSBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBuZWNlc3Nhcnkgc2hhZGVyIGNvbnN0YW50cyBpbiB5b3VyIG5hdGl2ZSBSZW5kZXJzY3JpcHQgY29kZS4KLSAgVGhpcyBzdHJ1Y3QgaXMgZ2VuZXJhdGVkIGludG8gYSByZWZsZWN0ZWQgY2xhc3MgdGhhdCB5b3UgY2FuIHVzZSBhcyBhIGNvbnN0YW50IGlucHV0IGVsZW1lbnQKLSAgZHVyaW5nIHRoZSBQcm9ncmFtJ3MgY3JlYXRpb24uIEl0IGlzIGFuIGVhc3kgd2F5IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdCBhcyBhbiBhbGxvY2F0aW9uLgotICBZb3Ugd291bGQgdGhlbiBiaW5kIHRoaXMgQWxsb2NhdGlvbiB0byB0aGUgUHJvZ3JhbSBhbmQgdGhlIFJlbmRlcnNjcmlwdCBzeXN0ZW0gc2VuZHMgdGhlIGRhdGEgdGhhdAotICBpcyBjb250YWluZWQgaW4gdGhlIHN0cnVjdCB0byB0aGUgaGFyZHdhcmUgd2hlbiBuZWNlc3NhcnkuIFRvIHVwZGF0ZSBzaGFkZXIgY29uc3RhbnRzLCB5b3UgY2hhbmdlIHRoZSB2YWx1ZXMKLSAgaW4gdGhlIEFsbG9jYXRpb24gYW5kIG5vdGlmeSB0aGUgbmF0aXZlIFJlbmRlcnNjcmlwdCBjb2RlIG9mIHRoZSBjaGFuZ2UuPC9wPjwvdGQ+Ci0gICAgPC90cj4KLQotICAgIDx0cj4KLSAgICAgIDx0ZD57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlfTwvdGQ+Ci0KLSAgICAgIDx0ZD5yc19wcm9ncmFtX3N0b3JlPC90ZD4KLQotICAgICAgPHRkPlRoZSBSZW5kZXJzY3JpcHQgUHJvZ3JhbVN0b3JlIGNvbnRhaW5zIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBjb250cm9sIGhvdyB0aGUgZ3JhcGhpY3MKLSAgICAgIGhhcmR3YXJlIHdyaXRlcyB0byB0aGUgZnJhbWVidWZmZXIuIEl0IGNvdWxkIGJlIHVzZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGRlcHRoIHdyaXRlcyBhbmQKLSAgICAgIHRlc3RpbmcsIHNldHVwIHZhcmlvdXMgYmxlbmRpbmcgbW9kZXMgZm9yIGVmZmVjdHMgbGlrZSB0cmFuc3BhcmVuY3kgYW5kIGRlZmluZSB3cml0ZSBtYXNrcwotICAgICAgZm9yIGNvbG9yIGNvbXBvbmVudHMuPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPHRyPgotICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyfTwvdGQ+Ci0KLSAgICAgIDx0ZD5yc19wcm9ncmFtX3Jhc3RlcjwvdGQ+Ci0KLSAgICAgIDx0ZD5Qcm9ncmFtIHJhc3RlciBpcyBwcmltYXJpbHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgcG9pbnQgc3ByaXRlcyBhcmUgZW5hYmxlZCBhbmQgdG8KLSAgICAgIGNvbnRyb2wgdGhlIGN1bGxpbmcgbW9kZS4gQnkgZGVmYXVsdCBiYWNrIGZhY2VzIGFyZSBjdWxsZWQuPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPHRyPgotICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyfTwvdGQ+Ci0KLSAgICAgIDx0ZD5yc19zYW1wbGVyPC90ZD4KLQotICAgICAgPHRkPkEgU2FtcGxlciBvYmplY3QgZGVmaW5lcyBob3cgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbSB0ZXh0dXJlcy4gU2FtcGxlcnMgYXJlIGJvdW5kIHRvCi0gICAgICBQcm9ncmFtIG9iamVjdHMgKGN1cnJlbnRseSBvbmx5IGEgRnJhZ21lbnQgUHJvZ3JhbSkgYWxvbmdzaWRlIHRoZSB0ZXh0dXJlIHdob3NlIHNhbXBsaW5nIHRoZXkKLSAgICAgIGNvbnRyb2wuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgdG8gc3BlY2lmeSBzdWNoIHRoaW5ncyBhcyBlZGdlIGNsYW1waW5nIGJlaGF2aW9yLCB3aGV0aGVyCi0gICAgICBtaXAtbWFwcyBhcmUgdXNlZCBhbmQgdGhlIGFtb3VudCBvZiBhbmlzb3Ryb3B5IHJlcXVpcmVkLiBUaGVyZSBtYXkgYmUgc2l0dWF0aW9ucyB3aGVyZQotICAgICAgaGFyZHdhcmUgbGltaXRhdGlvbnMgcHJldmVudCB0aGUgZXhhY3QgYmVoYXZpb3IgZnJvbSBiZWluZyBtYXRjaGVkLiBJbiB0aGVzZSBjYXNlcywgdGhlCi0gICAgICBydW50aW1lIGF0dGVtcHRzIHRvIHByb3ZpZGUgdGhlIGNsb3Nlc3QgcG9zc2libGUgYXBwcm94aW1hdGlvbi4gRm9yIGV4YW1wbGUsIHRoZSB1c2VyCi0gICAgICByZXF1ZXN0ZWQgMTZ4IGFuaXNvdHJvcHksIGJ1dCBvbmx5IDh4IHdhcyBzZXQgYmVjYXVzZSBpdCdzIHRoZSBiZXN0IGF2YWlsYWJsZSBvbiB0aGUKLSAgICAgIGhhcmR3YXJlLjwvdGQ+Ci0gICAgPC90cj4KLQotICAgIDx0cj4KLSAgICAgIDx0ZD57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaH08L3RkPgotCi0gICAgICA8dGQ+cnNfbWVzaDwvdGQ+Ci0KLSAgICAgIDx0ZD5BIGNvbGxlY3Rpb24gb2YgYWxsb2NhdGlvbnMgdGhhdCByZXByZXNlbnQgdmVydGV4IGRhdGEgKHBvc2l0aW9ucywgbm9ybWFscywgdGV4dHVyZQotICAgICAgY29vcmRpbmF0ZXMpIGFuZCBpbmRleCBkYXRhIHN1Y2ggYXMgdHJpYW5nbGVzIGFuZCBsaW5lcy4gVmVydGV4IGRhdGEgY2FuIGJlIGludGVybGVhdmVkCi0gICAgICB3aXRoaW4gb25lIGFsbG9jYXRpb24sIHByb3ZpZGVkIHNlcGFyYXRlbHkgYXMgbXVsdGlwbGUgYWxsb2NhdGlvbiBvYmplY3RzLCBvciBkb25lIGFzIGEKLSAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZS4gVGhlIGxheW91dCBvZiB0aGVzZSBhbGxvY2F0aW9ucyB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZWlyCi0gICAgICBFbGVtZW50cy4gV2hlbiBhIHZlcnRleCBjaGFubmVsIG5hbWUgbWF0Y2hlcyBhbiBpbnB1dCBpbiB0aGUgdmVydGV4IHByb2dyYW0sIFJlbmRlcnNjcmlwdAotICAgICAgYXV0b21hdGljYWxseSBjb25uZWN0cyB0aGUgdHdvLiBNb3Jlb3ZlciwgZXZlbiBhbGxvY2F0aW9ucyB0aGF0IGNhbm5vdCBiZSBkaXJlY3RseSBtYXBwZWQgdG8KLSAgICAgIGdyYXBoaWNzIGhhcmR3YXJlIGNhbiBiZSBzdG9yZWQgYXMgcGFydCBvZiB0aGUgbWVzaC4gU3VjaCBhbGxvY2F0aW9ucyBjYW4gYmUgdXNlZCBhcyBhCi0gICAgICB3b3JraW5nIGFyZWEgZm9yIHZlcnRleC1yZWxhdGVkIGNvbXB1dGF0aW9uIGFuZCB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIGhhcmR3YXJlLiBQYXJ0cyBvZiB0aGUKLSAgICAgIG1lc2ggY291bGQgYmUgcmVuZGVyZWQgd2l0aCBlaXRoZXIgZXhwbGljaXQgaW5kZXggc2V0cyBvciBwcmltaXRpdmUgdHlwZXMuPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPHRyPgotICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Gb250fTwvdGQ+Ci0KLSAgICAgIDx0ZD5yc19mb250PC90ZD4KLQotICAgICAgPHRkPgotICAgICAgICA8cD5UaGlzIGNsYXNzIGdpdmVzIHlvdSBhIHdheSB0byBkcmF3IGhhcmR3YXJlIGFjY2VsZXJhdGVkIHRleHQuIEludGVybmFsbHksIHRoZSBnbHlwaHMgYXJlCi0gICAgICAgIHJlbmRlcmVkIHVzaW5nIHRoZSBGcmVldHlwZSBsaWJyYXJ5LCBhbmQgYW4gaW50ZXJuYWwgY2FjaGUgb2YgcmVuZGVyZWQgZ2x5cGggYml0bWFwcyBpcwotICAgICAgICBtYWludGFpbmVkLiBFYWNoIGZvbnQgb2JqZWN0IHJlcHJlc2VudHMgYSBjb21iaW5hdGlvbiBvZiBhIHR5cGVmYWNlIGFuZCBwb2ludCBzaXplcy4KLSAgICAgICAgTXVsdGlwbGUgZm9udCBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIHRvIHJlcHJlc2VudCBmYWNlcyBzdWNoIGFzIGJvbGQgYW5kIGl0YWxpYyBhbmQgdG8KLSAgICAgICAgY3JlYXRlIGRpZmZlcmVudCBmb250IHNpemVzLiBEdXJpbmcgY3JlYXRpb24sIHRoZSBmcmFtZXdvcmsgZGV0ZXJtaW5lcyB0aGUgZGV2aWNlIHNjcmVlbidzCi0gICAgICAgIERQSSB0byBlbnN1cmUgcHJvcGVyIHNpemluZyBhY3Jvc3MgbXVsdGlwbGUgY29uZmlndXJhdGlvbnMuPC9wPgotCi0gICAgICAgIDxwPkZvbnQgcmVuZGVyaW5nIGNhbiBpbXBhY3QgcGVyZm9ybWFuY2UuIEV2ZW4gdGhvdWdoIHRob3VnaCB0aGUgc3RhdGUgY2hhbmdlcyBhcmUKLSAgICAgICAgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIsIHRoZXkgYXJlIGhhcHBlbmluZyBpbnRlcm5hbGx5LiBJdCBpcyBtb3JlIGVmZmljaWVudCB0byByZW5kZXIKLSAgICAgICAgbGFyZ2UgYmF0Y2hlcyBvZiB0ZXh0IGluIHNlcXVlbmNlLCBhbmQgaXQgaXMgYWxzbyBtb3JlIGVmZmljaWVudCB0byByZW5kZXIgbXVsdGlwbGUKLSAgICAgICAgY2hhcmFjdGVycyBhdCBvbmNlIGluc3RlYWQgb2Ygb25lIGJ5IG9uZS48L3A+Ci0KLSAgICAgICAgPHA+Rm9udCBjb2xvciBhbmQgdHJhbnNwYXJlbmN5IGFyZSBub3QgcGFydCBvZiB0aGUgZm9udCBvYmplY3QgYW5kIGNhbiBiZSBmcmVlbHkgbW9kaWZpZWQKLSAgICAgICAgaW4gdGhlIHNjcmlwdCB0byBzdWl0IHRoZSB5b3VyIG5lZWRzLiBGb250IGNvbG9ycyB3b3JrIGFzIGEgc3RhdGUgbWFjaGluZSwgYW5kIGV2ZXJ5IG5ldwotICAgICAgICBjYWxsIHRvIGRyYXcgdGV4dCB3aWxsIHVzZSB0aGUgbGFzdCBjb2xvciBzZXQgaW4gdGhlIHNjcmlwdC48L3A+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0KLQotICA8aDIgaWQ9ImRldmVsb3BpbmciPkRldmVsb3BpbmcgYSBSZW5kZXJzY3JpcHQgYXBwbGljYXRpb248L2gyPgotCi0gIDxwPlRoZSBiYXNpYyB3b3JrZmxvdyBvZiBkZXZlbG9waW5nIGEgUmVuZGVyc2NyaXB0IGFwcGxpY2F0aW9uIGlzOjwvcD4KLQotICA8b2w+Ci0gICAgPGxpPkFuYWx5emUgeW91ciBhcHBsaWNhdGlvbidzIHJlcXVpcmVtZW50cyBhbmQgZmlndXJlIG91dCB3aGF0IHlvdSB3YW50IHRvIGRldmVsb3Agd2l0aAotICAgIFJlbmRlcnNjcmlwdC4gVG8gdGFrZSBmdWxsIGFkdmFudGFnZSBvZiB0aGUgUmVuZGVyc2NyaXB0IHN5c3RlbSwgeW91IHdhbnQgdG8gdXNlIGl0IHdoZW4gdGhlIGNvbXB1dGF0aW9uCi0gICAgb3IgZ3JhcGhpY3MgcGVyZm9ybWFuY2UgeW91J3JlIGdldHRpbmcgd2l0aCB0aGUgdHJhZGl0aW9uYWwgZnJhbWV3b3JrIEFQSXMgaXMKLSAgICBpbnN1ZmZpY2llbnQuPC9saT4KLQotICAgIDxsaT5EZXNpZ24gdGhlIGludGVyZmFjZSBvZiB5b3VyIFJlbmRlcnNjcmlwdCBjb2RlIGFuZCBpbXBsZW1lbnQgaXQgdXNpbmcgdGhlIG5hdGl2ZQotICAgIFJlbmRlcnNjcmlwdCBBUElzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBBbmRyb2lkIFNESyBpbgotICAgIDxjb2RlPiZsdDtzZGtfcm9vdCZndDsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvcmVuZGVyc2NyaXB0PC9jb2RlPi48L2xpPgotCi0gICAgPGxpPkNyZWF0ZSBhbiBBbmRyb2lkIHByb2plY3QgYXMgeW91IHdvdWxkIG5vcm1hbGx5LCBpbiBFY2xpcHNlIG9yIHdpdGggdGhlCi0gICAgPGNvZGU+YW5kcm9pZDwvY29kZT4gdG9vbC48L2xpPgotCi0gICAgPGxpPlBsYWNlIHlvdXIgUmVuZGVyc2NyaXB0IGZpbGVzIGluIDxjb2RlPnNyYzwvY29kZT4gZm9sZGVyIG9mIHRoZSBBbmRyb2lkIHByb2plY3Qgc28gdGhhdCB0aGUKLSAgICBidWlsZCB0b29scyBjYW4gZ2VuZXJhdGUgdGhlIHJlZmxlY3RlZCBsYXllciBjbGFzc2VzLjwvbGk+Ci0KLSAgICA8bGk+Q3JlYXRlIHlvdXIgYXBwbGljYXRpb24sIGNhbGxpbmcgdGhlIFJlbmRlcnNjcmlwdCB0aHJvdWdoIHRoZSByZWZsZWN0ZWQgY2xhc3MgbGF5ZXIgd2hlbgotICAgIHlvdSBuZWVkIHRvLjwvbGk+Ci0KLSAgICA8bGk+QnVpbGQsIGluc3RhbGwsIGFuZCBydW4geW91ciBhcHBsaWNhdGlvbiBhcyB5b3Ugd291bGQgbm9ybWFsbHkuPC9saT4KLSAgPC9vbD4KLQotICA8cD5UbyBzZWUgaG93IGEgc2ltcGxlIFJlbmRlcnNjcmlwdCBhcHBsaWNhdGlvbiBpcyBwdXQgdG9nZXRoZXIsIHNlZSB0aGUgCi0gIDxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJzY3JpcHQvaW5kZXguaHRtbCI+UmVuZGVyc2NyaXB0IHNhbXBsZXM8L2E+Ci0gIGFuZCA8YSBocmVmPSIjaGVsbG8tZ3JhcGhpY3MiPlRoZSBIZWxsbyBHcmFwaGljcyBBcHBsaWNhdGlvbjwvYT4gc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbi48L3A+Ci0KLSAgPGgzIGlkPSJoZWxsby1ncmFwaGljcyI+VGhlIEhlbGxvIEdyYXBoaWNzIEFwcGxpY2F0aW9uPC9oMz4KLQotICA8cD5UaGlzIHNtYWxsIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc3RydWN0dXJlIG9mIGEgc2ltcGxlIFJlbmRlcnNjcmlwdCBhcHBsaWNhdGlvbi4gWW91Ci0gIGNhbiBtb2RlbCB5b3VyIFJlbmRlcnNjcmlwdCBhcHBsaWNhdGlvbiBhZnRlciB0aGUgYmFzaWMgc3RydWN0dXJlIG9mIHRoaXMgYXBwbGljYXRpb24uIFlvdSBjYW4KLSAgZmluZCB0aGUgY29tcGxldGUgc291cmNlIGluIHRoZSBTREsgaW4gdGhlCi0gIDxjb2RlPiZsdDthbmRyb2lkLXNkayZndDsvc2FtcGxlcy9hbmRyb2lkLTExL0hlbGxvV29ybGRSUyBkaXJlY3Rvcnk8L2NvZGU+LiBUaGUKLSAgYXBwbGljYXRpb24gdXNlcyBSZW5kZXJzY3JpcHQgdG8gZHJhdyB0aGUgc3RyaW5nLCAiSGVsbG8gV29ybGQhIiB0byB0aGUgc2NyZWVuIGFuZCByZWRyYXdzIHRoZQotICB0ZXh0IHdoZW5ldmVyIHRoZSB1c2VyIHRvdWNoZXMgdGhlIHNjcmVlbiBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHRvdWNoLiBUaGlzIGFwcGxpY2F0aW9uIGlzIG9ubHkKLSAgYSBkZW1vbnN0cmF0aW9uIGFuZCB5b3Ugc2hvdWxkIG5vdCB1c2UgdGhlIFJlbmRlcnNjcmlwdCBzeXN0ZW0gdG8gZG8gc29tZXRoaW5nIHRoaXMgdHJpdmlhbC4gVGhlCi0gIGFwcGxpY2F0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc291cmNlIGZpbGVzOjwvcD4KLQotICA8dWw+Ci0gICAgPGxpPjxjb2RlPkhlbGxvV29ybGQ8L2NvZGU+OiBUaGUgbWFpbiBBY3Rpdml0eSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGNsYXNzIGlzIHByZXNlbnQgdG8KLSAgICBwcm92aWRlIEFjdGl2aXR5IGxpZmVjeWNsZSBtYW5hZ2VtZW50LiBJdCBtYWlubHkgZGVsZWdhdGVzIHdvcmsgdG8gSGVsbG9Xb3JsZFZpZXcsIHdoaWNoIGlzIHRoZQotICAgIFJlbmRlcnNjcmlwdCBzdXJmYWNlIHRoYXQgdGhlIHNhbXBsZSBhY3R1YWxseSBkcmF3cyBvbi48L2xpPgotCi0gICAgPGxpPjxjb2RlPkhlbGxvV29ybGRWaWV3PC9jb2RlPjogVGhlIFJlbmRlcnNjcmlwdCBzdXJmYWNlIHRoYXQgdGhlIGdyYXBoaWNzIHJlbmRlciBvbi4gSWYgeW91Ci0gICAgYXJlIHVzaW5nIFJlbmRlcnNjcmlwdCBmb3IgZ3JhcGhpY3MgcmVuZGVyaW5nLCB5b3UgbXVzdCBoYXZlIGEgc3VyZmFjZSB0byByZW5kZXIgb24uIElmIHlvdSBhcmUKLSAgICB1c2luZyBpdCBmb3IgY29tcHV0YXRhdGlvbmFsIG9wZXJhdGlvbnMgb25seSwgdGhlbiB5b3UgZG8gbm90IG5lZWQgdGhpcy48L2xpPgotCi0gICAgPGxpPjxjb2RlPkhlbGxvV29ybGRSUzwvY29kZT46IFRoZSBjbGFzcyB0aGF0IGNhbGxzIHRoZSBuYXRpdmUgUmVuZGVyc2NyaXB0IGNvZGUgdGhyb3VnaCBoaWdoCi0gICAgbGV2ZWwgZW50cnkgcG9pbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgQW5kcm9pZCBidWlsZCB0b29scy48L2xpPgotCi0gICAgPGxpPjxjb2RlPmhlbGxvd29ybGQucnM8L2NvZGU+OiBUaGUgUmVuZGVyc2NyaXB0IG5hdGl2ZSBjb2RlIHRoYXQgZHJhd3MgdGhlIHRleHQgb24gdGhlCi0gICAgc2NyZWVuLjwvbGk+Ci0KLSAgICA8bGk+Ci0gICAgICA8cD5UaGUgPGNvZGU+Jmx0O3Byb2plY3Rfcm9vdCZndDsvZ2VuPC9jb2RlPiBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHJlZmxlY3RlZCBsYXllciBjbGFzc2VzCi0gICAgICB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIEFuZHJvaWQgYnVpbGQgdG9vbHMuIFlvdSB3aWxsIG5vdGljZSBhCi0gICAgICA8Y29kZT5TY3JpcHRDX2hlbGxvd29ybGQ8L2NvZGU+IGNsYXNzLCB3aGljaCBpcyB0aGUgcmVmbGVjdGl2ZSB2ZXJzaW9uIG9mIHRoZSBSZW5kZXJzY3JpcHQKLSAgICAgIGFuZCBjb250YWlucyB0aGUgZW50cnkgcG9pbnRzIGludG8gdGhlIDxjb2RlPmhlbGxvd29ybGQucnM8L2NvZGU+IG5hdGl2ZSBjb2RlLiBUaGlzIGZpbGUgZG9lcwotICAgICAgbm90IGFwcGVhciB1bnRpbCB5b3UgcnVuIGEgYnVpbGQuPC9wPgotICAgIDwvbGk+Ci0gIDwvdWw+Ci0KLSAgPHA+RWFjaCBmaWxlIGhhcyBpdHMgb3duIGRpc3RpbmN0IHVzZS4gVGhlIGZvbGxvd2luZyBmaWxlcyBjb21wcmlzZSB0aGUgbWFpbiBwYXJ0cyBvZiB0aGUgc2FtcGxlIGFuZAotICBkZW1vbnN0cmF0ZSBpbiBkZXRhaWwgaG93IHRoZSBzYW1wbGUgd29ya3M6PC9wPgotCi0gIDxkbD4KLSAgICA8ZHQ+PGNvZGU+aGVsbG93b3JsZC5yczwvY29kZT48L2R0PgotCi0gICAgPGRkPgotICAgICAgVGhlIG5hdGl2ZSBSZW5kZXJzY3JpcHQgY29kZSBpcyBjb250YWluZWQgaW4gdGhlIDxjb2RlPmhlbGxvd29ybGQucnM8L2NvZGU+IGZpbGUuIEV2ZXJ5Ci0gICAgICA8Y29kZT4ucnM8L2NvZGU+IGZpbGUgbXVzdCBjb250YWluIHR3byBwcmFnbWFzIHRoYXQgZGVmaW5lIHRoZSB2ZXJzaW9uIG9mIFJlbmRlcnNjcmlwdAotICAgICAgdGhhdCBpdCBpcyB1c2luZyAoMSBpcyB0aGUgb25seSB2ZXJzaW9uIGZvciBub3cpLCBhbmQgdGhlIHBhY2thZ2UgbmFtZSB0aGF0IHRoZSByZWZsZWN0ZWQKLSAgICAgIGNsYXNzZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCB3aXRoLiBGb3IgZXhhbXBsZToKLTxwcmU+Ci0jcHJhZ21hIHZlcnNpb24oMSkKLQotI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20ubXkucGFja2FnZS5uYW1lKQotPC9wcmU+ICAgICAgCi0gICAgICA8cD5BbiA8Y29kZT4ucnM8L2NvZGU+IGZpbGUgY2FuIGFsc28gZGVjbGFyZSB0d28gc3BlY2lhbCBmdW5jdGlvbnM6PC9wPgotCi0gICAgICA8dWw+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICA8Y29kZT5pbml0KCk8L2NvZGU+OiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoaXMgUmVuZGVyc2NyaXB0Ci0gICAgICAgICAgZmlsZSB0aGF0IGlzIGxvYWRlZCBvbiB0aGUgZGV2aWNlLCBiZWZvcmUgdGhlIHNjcmlwdCBpcyBhY2Nlc3NlZCBpbiBhbnkgb3RoZXIgd2F5IGJ5IHRoZQotICAgICAgICAgIFJlbmRlcnNjcmlwdCBzeXN0ZW0uIFRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IGlzIGlkZWFsIGZvciBkb2luZyBvbmUgdGltZSBzZXR1cCBhZnRlciB0aGUKLSAgICAgICAgICBtYWNoaW5lIGNvZGUgaXMgbG9hZGVkIHN1Y2ggYXMgaW5pdGlhbGl6aW5nIGNvbXBsZXggY29uc3RhbnQgdGFibGVzLiBUaGUKLSAgICAgICAgICA8Y29kZT5pbml0KCk8L2NvZGU+IGZ1bmN0aW9uIGZvciB0aGUgPGNvZGU+aGVsbG93b3JsZC5yczwvY29kZT4gc2NyaXB0IHNldHMgdGhlIGluaXRpYWwKLSAgICAgICAgICBsb2NhdGlvbiBvZiB0aGUgdGV4dCB0aGF0IGlzIHJlbmRlcmVkIHRvIHRoZSBzY3JlZW46Ci0gICAgICAgICAgPHByZT4KLXZvaWQgaW5pdCgpewotICAgIGdUb3VjaFggPSA1MC4wZjsKLSAgICBnVG91Y2hZID0gNTAuMGY7Ci19Ci08L3ByZT4KLSAgICAgICAgPC9saT4KLQotICAgICAgICA8bGk+Ci0gICAgICAgICAgPGNvZGU+cm9vdCgpPC9jb2RlPjogVGhpcyBmdW5jdGlvbiBpcyB0aGUgZGVmYXVsdCB3b3JrZXIgZnVuY3Rpb24gZm9yIHRoaXMgUmVuZGVyc2NyaXB0Ci0gICAgICAgICAgZmlsZS4gRm9yIGdyYXBoaWNzIFJlbmRlcnNjcmlwdCBhcHBsaWNhdGlvbnMsIGxpa2UgdGhpcyBvbmUsIHRoZSBSZW5kZXJzY3JpcHQgc3lzdGVtCi0gICAgICAgICAgZXhwZWN0cyB0aGlzIGZ1bmN0aW9uIHRvIHJlbmRlciB0aGUgZnJhbWUgdGhhdCBpcyBnb2luZyB0byBiZSBkaXNwbGF5ZWQuIEl0IGlzIGNhbGxlZAotICAgICAgICAgIGV2ZXJ5IHRpbWUgdGhlIGZyYW1lIHJlZnJlc2hlcy4gVGhlIDxjb2RlPnJvb3QoKTwvY29kZT4gZnVuY3Rpb24gZm9yIHRoZQotICAgICAgICAgIDxjb2RlPmhlbGxvd29ybGQucnM8L2NvZGU+IHNjcmlwdCBzZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBmcmFtZSwgdGhlIGNvbG9yIG9mCi0gICAgICAgICAgdGhlIHRleHQsIGFuZCB0aGVuIGRyYXdzIHRoZSB0ZXh0IHdoZXJlIHRoZSB1c2VyIGxhc3QgdG91Y2hlZCB0aGUgc2NyZWVuOgotPHByZT4KLWludCByb290KGludCBsYXVuY2hJRCkgewotICAgIC8vIENsZWFyIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCi0gICAgcnNnQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKLSAgICAvLyBUZWxsIHRoZSBydW50aW1lIHdoYXQgdGhlIGZvbnQgY29sb3Igc2hvdWxkIGJlCi0gICAgcnNnRm9udENvbG9yKDEuMGYsIDEuMGYsIDEuMGYsIDEuMGYpOwotICAgIC8vIEludHJvZHVjZSBvdXJzZWx2ZXMgdG8gdGhlIHdvcmxkIGJ5IGRyYXdpbmcgYSBncmVldGluZwotICAgIC8vIGF0IHRoZSBwb3NpdGlvbiB0aGF0IHRoZSB1c2VyIHRvdWNoZWQgb24gdGhlIHNjcmVlbgotICAgIHJzZ0RyYXdUZXh0KCJIZWxsbyBXb3JsZCEiLCBnVG91Y2hYLCBnVG91Y2hZKTsKLSAgICAgICAgICAKLSAgICAvLyBSZXR1cm4gdmFsdWUgdGVsbHMgUlMgcm91Z2hseSBob3cgb2Z0ZW4gdG8gcmVkcmF3Ci0gICAgLy8gaW4gdGhpcyBjYXNlIDIwIG1zCi0gICAgcmV0dXJuIDIwOwotfQotPC9wcmU+Ci0KLSAgICAgICAgICA8cD5UaGUgcmV0dXJuIHZhbHVlLCA8Y29kZT4yMDwvY29kZT4sIGlzIHRoZSBkZXNpcmVkIGZyYW1lIHJlZnJlc2ggcmF0ZSBpbiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAgVGhlIHJlYWwgc2NyZWVuIHJlZnJlc2ggcmF0ZSBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSwgY29tcHV0YXRpb24sIGFuZCByZW5kZXJpbmcKLSAgICAgICAgICBjb21wbGV4aXR5IHRoYXQgdGhlIDxjb2RlPnJvb3QoKTwvY29kZT4gZnVuY3Rpb24gaGFzIHRvIGV4ZWN1dGUuIEEgdmFsdWUgb2YKLSAgICAgICAgICA8Y29kZT4wPC9jb2RlPiB0ZWxscyB0aGUgc2NyZWVuIHRvIHJlbmRlciBvbmx5IG9uY2UgYW5kIHRvIG9ubHkgcmVuZGVyIGFnYWluIHdoZW4gYQotICAgICAgICAgIGNoYW5nZSBoYXMgYmVlbiBtYWRlIHRvIG9uZSBvZiB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBiZWluZyBtb2RpZmllZCBieSB0aGUgUmVuZGVyc2NyaXB0Ci0gICAgICAgICAgY29kZS48L3A+Ci0KLSAgICAgICAgICA8cD5CZXNpZGVzIHRoZSA8Y29kZT5pbml0KCk8L2NvZGU+IGFuZCA8Y29kZT5yb290KCk8L2NvZGU+IGZ1bmN0aW9ucywgeW91IGNhbiBkZWZpbmUgdGhlCi0gICAgICAgICAgb3RoZXIgbmF0aXZlIGZ1bmN0aW9ucywgc3RydWN0cywgZGF0YSB0eXBlcywgYW5kIGFueSBvdGhlciBsb2dpYyBmb3IgeW91ciBSZW5kZXJzY3JpcHQuCi0gICAgICAgICAgWW91IGNhbiBldmVuIGRlZmluZSBzZXBhcmF0ZSBoZWFkZXIgZmlsZXMgYXMgPGNvZGU+LnJzaDwvY29kZT4gZmlsZXMuPC9wPgotICAgICAgICA8L2xpPgotICAgICAgPC91bD4KLSAgICA8L2RkPgotCi0gICAgPGR0Pjxjb2RlPlNjcmlwdENfaGVsbG93b3JsZDwvY29kZT48L2R0PgotCi0gICAgPGRkPlRoaXMgY2xhc3MgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBBbmRyb2lkIGJ1aWxkIHRvb2xzIGFuZCBpcyB0aGUgcmVmbGVjdGVkIHZlcnNpb24gb2YgdGhlCi0gICAgPGNvZGU+aGVsbG93b3JsZC5yczwvY29kZT4gUmVuZGVyc2NyaXB0LiBJdCBwcm92aWRlcyBhIGEgaGlnaCBsZXZlbCBlbnRyeSBwb2ludCBpbnRvIHRoZQotICAgIDxjb2RlPmhlbGxvd29ybGQucnM8L2NvZGU+IG5hdGl2ZSBjb2RlIGJ5IGRlZmluaW5nIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMgdGhhdCB5b3UgY2FuIGNhbGwKLSAgICBmcm9tIHRoZSB0cmFkaXRpb25hbCBmcmFtZXdvcmsgQVBJcy48L2RkPgotCi0gICAgPGR0Pjxjb2RlPmhlbGxvd29ybGQuYmM8L2NvZGU+IGJ5dGVjb2RlPC9kdD4KLQotICAgIDxkZD5UaGlzIGZpbGUgaXMgdGhlIGludGVybWVkaWF0ZSwgcGxhdGZvcm0taW5kZXBlbmRlbnQgYnl0ZWNvZGUgdGhhdCBnZXRzIGNvbXBpbGVkIG9uIHRoZQotICAgIGRldmljZSB3aGVuIHRoZSBSZW5kZXJzY3JpcHQgYXBwbGljYXRpb24gcnVucy4gSXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBBbmRyb2lkIGJ1aWxkIHRvb2xzIGFuZAotICAgIGlzIHBhY2thZ2VkIHdpdGggdGhlIDxjb2RlPi5hcGs8L2NvZGU+IGZpbGUgYW5kIHN1YnNlcXVlbnRseSBjb21waWxlZCBvbiB0aGUgZGV2aWNlIGF0IHJ1bnRpbWUuCi0gICAgVGhpcyBmaWxlIGlzIGxvY2F0ZWQgaW4gdGhlIDxjb2RlPiZsdDtwcm9qZWN0X3Jvb3QmZ3Q7L3Jlcy9yYXcvPC9jb2RlPiBkaXJlY3RvcnkgYW5kIGlzIG5hbWVkCi0gICAgPGNvZGU+cnNfZmlsZW5hbWUuYmM8L2NvZGU+LiBZb3UgbmVlZCB0byBiaW5kIHRoZXNlIGZpbGVzIHRvIHlvdXIgUmVuZGVyc2NyaXB0IGNvbnRleHQgYmVmb3JlCi0gICAgY2FsbCBhbnkgUmVuZGVyc2NyaXB0IGNvZGUgZnJvbSB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24uIFlvdSBjYW4gcmVmZXJlbmNlIHRoZW0gaW4geW91ciBjb2RlCi0gICAgd2l0aCA8Y29kZT5SLmlkLnJzX2ZpbGVuYW1lPC9jb2RlPi48L2RkPgotCi0gICAgPGR0Pjxjb2RlPkhlbGxvV29ybGRWaWV3PC9jb2RlPiBjbGFzczwvZHQ+Ci0KLSAgICA8ZGQ+Ci0gICAgICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIFN1cmZhY2UgVmlldyB0aGF0IHRoZSBSZW5kZXJzY3JpcHQgZ3JhcGhpY3MgYXJlIGRyYXduIG9uLiBJdCBkb2VzCi0gICAgICBzb21lIGFkbWluaXN0cmF0aXZlIHRhc2tzIGluIHRoZSA8Y29kZT5lbnN1cmVSZW5kZXJTY3JpcHQoKTwvY29kZT4gbWV0aG9kIHRoYXQgc2V0cyB1cCB0aGUKLSAgICAgIFJlbmRlcnNjcmlwdCBzeXN0ZW0uIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0x9Ci0gICAgICBvYmplY3QsIHdoaWNoIHJlcHJlc2VudHMgdGhlIGNvbnRleHQgb2YgdGhlIFJlbmRlcnNjcmlwdCBhbmQgY3JlYXRlcyBhIGRlZmF1bHQgc3VyZmFjZSB0bwotICAgICAgZHJhdyBvbiAoeW91IGNhbiBzZXQgdGhlIHN1cmZhY2UgcHJvcGVydGllcyBzdWNoIGFzIGFscGhhIGFuZCBiaXQgZGVwdGggaW4gdGhlIHtAbGluawotICAgICAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZ30gY2xhc3MgKS4gV2hlbiBhIHtAbGluawotICAgICAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0x9IGlzIGluc3RhbnRpYXRlZCwgdGhpcyBjbGFzcyBjYWxscyB0aGUKLSAgICAgIDxjb2RlPkhlbGxvUlM8L2NvZGU+IGNsYXNzIGFuZCBjcmVhdGVzIHRoZSBpbnN0YW5jZSBvZiB0aGUgYWN0dWFsIFJlbmRlcnNjcmlwdCBncmFwaGljcwotICAgICAgcmVuZGVyZXIuCi0gICAgICA8cHJlPgotLy8gUmVuZGVyc2NpcHQgY29udGV4dAotcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci0vLyBTY3JpcHQgdGhhdCBkb2VzIHRoZSByZW5kZXJpbmcKLXByaXZhdGUgSGVsbG9Xb3JsZFJTIG1SZW5kZXI7Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUmVuZGVyU2NyaXB0KCkgewotICAgICAgICBpZiAobVJTID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEluaXRpYWxpemUgUmVuZGVyc2NyaXB0IHdpdGggZGVzaXJlZCBzdXJmYWNlIGNoYXJhY3RlcmlzdGljcy4KLSAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwganVzdCB1c2UgdGhlIGRlZmF1bHRzCi0gICAgICAgICAgICBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnIHNjID0gbmV3IFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcoKTsKLSAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBSZW5kZXJzY3JpcHQgdGhhdCBkb2VzIHRoZSByZW5kZXJpbmcKLSAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgSGVsbG9Xb3JsZFJTKCk7Ci0gICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci08L3ByZT4KLQotICAgICAgPHA+VGhpcyBjbGFzcyBhbHNvIGhhbmRsZXMgdGhlIGltcG9ydGFudCBsaWZlY3ljbGUgZXZlbnRzIGFuZCByZWxheXMgdG91Y2ggZXZlbnRzIHRvIHRoZQotICAgICAgUmVuZGVyc2NyaXB0IHJlbmRlcmVyLiBXaGVuIGEgdXNlciB0b3VjaGVzIHRoZSBzY3JlZW4sIGl0IGNhbGxzIHRoZSByZW5kZXJlciwKLSAgICAgIDxjb2RlPkhlbGxvV29ybGRSUzwvY29kZT4gYW5kIGFza3MgaXQgdG8gZHJhdyB0aGUgdGV4dCBvbiB0aGUgc2NyZWVuIGF0IHRoZSBuZXcgbG9jYXRpb24uPC9wPgotICAgICAgPHByZT4KLXB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgewotICAgIC8vIFBhc3MgdG91Y2ggZXZlbnRzIGZyb20gdGhlIHN5c3RlbSB0byB0aGUgcmVuZGVyaW5nIHNjcmlwdAotICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTikgewotICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotPC9wcmU+Ci0gICAgPC9kZD4KLQotICAgIDxkdD48Y29kZT5IZWxsb1dvcmxkUlM8L2NvZGU+PC9kdD4KLQotICAgIDxkZD4KLSAgICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgUmVuZGVyc2NyaXB0IHJlbmRlcmVyIGZvciB0aGUgPGNvZGU+SGVsbG9Xb3JsZFZpZXc8L2NvZGU+IFN1cmZhY2UKLSAgICAgIFZpZXcuIEl0IGludGVyYWN0cyB3aXRoIHRoZSBuYXRpdmUgUmVuZGVyc2NyaXB0IGNvZGUgdGhhdCBpcyBkZWZpbmVkIGluCi0gICAgICA8Y29kZT5oZWxsb3dvcmxkLnJzPC9jb2RlPiB0aHJvdWdoIHRoZSBpbnRlcmZhY2VzIGV4cG9zZWQgYnkgPGNvZGU+U2NyaXB0Q19oZWxsb3dvcmxkPC9jb2RlPi4KLSAgICAgIFRvIGJlIGFibGUgdG8gY2FsbCB0aGUgbmF0aXZlIGNvZGUsIGl0IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFJlbmRlcnNjcmlwdCByZWZsZWN0ZWQKLSAgICAgIGNsYXNzLCA8Y29kZT5TY3JpcHRDX2hlbGxvd29ybGQ8L2NvZGU+LiBUaGUgcmVmbGVjdGVkIFJlbmRlcnNjcmlwdCBvYmplY3QgYmluZHMgdGhlCi0gICAgICBSZW5kZXJzY3JpcHQgYnl0ZWNvZGUgKDxjb2RlPlIucmF3LmhlbGxvd29ybGQ8L2NvZGU+KSBhbmQgdGhlIFJlbmRlcnNjcmlwdCBjb250ZXh0LCB7QGxpbmsKLSAgICAgIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMfSwgc28gdGhlIGNvbnRleHQga25vd3MgdG8gdXNlIHRoZSByaWdodCBSZW5kZXJzY3JpcHQgdG8KLSAgICAgIHJlbmRlciBpdHMgc3VyZmFjZS4KLSAgICAgIDxwcmU+Ci1wcml2YXRlIFJlc291cmNlcyBtUmVzOwotcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7Ci1wcml2YXRlIFNjcmlwdENfaGVsbG93b3JsZCBtU2NyaXB0OwotCi1wcml2YXRlIHZvaWQgaW5pdFJTKCkgewotICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19oZWxsb3dvcmxkKG1SUywgbVJlcywgUi5yYXcuaGVsbG93b3JsZCk7Ci0gICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOwotfQotPC9wcmU+Ci0gICAgPC9kZD4KLSAgPC9kbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3JlbmRlcnNjcmlwdC9jb21wdXRlLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZW5kZXJzY3JpcHQvY29tcHV0ZS5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGMyMjgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZW5kZXJzY3JpcHQvY29tcHV0ZS5qZApAQCAtMCwwICsxLDM4IEBACitwYWdlLnRpdGxlPUNvbXB1dGUKK3BhcmVudC50aXRsZT1SZW5kZXJTY3JpcHQKK3BhcmVudC5saW5rPWluZGV4Lmh0bWwgCitAamQ6Ym9keQorCisgIDxkaXYgaWQ9InF2LXdyYXBwZXIiPgorICAgIDxkaXYgaWQ9InF2Ij4KKworICAgICAgPGgyPlJlbGF0ZWQgU2FtcGxlczwvaDI+CisKKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Db21wdXRlL2luZGV4Lmh0bWwiPkhlbGxvCisgICAgICAgIENvbXB1dGU8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJTY3JpcHQvQmFsbHMvaW5kZXguaHRtbCI+QmFsbHM8L2E+PC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgIDxwPlJlbmRlclNjcmlwdCBleHBvc2VzIGEgc2V0IG9mIGNvbXB1dGUgQVBJcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGRvIGludGVuc2l2ZSBjb21wdXRhdGlvbmFsIG9wZXJhdGlvbnMuCisgIFlvdSBjYW4gdXNlIHRoZSBjb21wdXRlIEFQSXMgaW4gdGhlIGNvbnRleHQgb2YgYSBncmFwaGljcyBSZW5kZXJTY3JpcHQgc3VjaCBhcyBjYWxjdWxhdGluZyB0aGUKKyAgdHJhbnNmb3JtYXRpb24gb2YgbWFueSBnZW9tZXRyaWMgb2JqZWN0cyBpbiBhIHNjZW5lLiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgc3RhbmRhbG9uZSBjb21wdXRlIFJlbmRlclNjcmlwdCB0aGF0IGRvZXMgbm90CisgIGRyYXcgYW55dGhpbmcgdG8gdGhlIHNjcmVlbiBzdWNoIGFzIGJpdG1hcCBpbWFnZSBwcm9jZXNzaW5nIGZvciBhIHBob3RvIGVkaXRvciBhcHBsaWNhdGlvbi4KKyAgVGhlIFJlbmRlclNjcmlwdCBjb21wdXRlIEFQSXMgYXJlIG1haW5seSBkZWZpbmVkIGluIHRoZSA8Y29kZT5yc19jbC5yc2g8L2NvZGU+IGhlYWRlcjwvcD4KKyAgCisgIDxwPkNvbXB1dGUgUmVuZGVyU2NyaXB0cyBhcmUgc2ltcGxlciB0byBzZXR1cCBhbmQgaW1wbGVtZW50IGFzIHRoZXJlIGlzIG5vIGdyYXBoaWNzIHJlbmRlcmluZyBpbnZvbHZlZC4KKyAgWW91IGNhbiBvZmZsb2FkIGNvbXB1dGF0aW9uYWwgYXNwZWN0cyBvZiB5b3VyIGFwcGxpY2F0aW9uIHRvIFJlbmRlclNjcmlwdCBieSBjcmVhdGluZyBhIG5hdGl2ZSBSZW5kZXJTY3JpcHQKKyAgZmlsZSAoLnJzKSBhbmQgdXNpbmcgdGhlIGdlbmVyYXRlZCByZWZsZWN0ZWQgbGF5ZXIgY2xhc3MgdG8gY2FsbCBmdW5jdGlvbnMgaW4gdGhlIDxjb2RlPi5yczwvY29kZT4gZmlsZS4gCisKKyAgPHA+U2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0hlbGxvQ29tcHV0ZS9pbmRleC5odG1sIj5IZWxsb0NvbXB1dGU8L2E+CisgIHNhbXBsZSBpbiB0aGUgQW5kcm9pZCBTREsgZm9yIG1vcmUKKyAgaW5mb3JtYXRpb24gb24gaG93IHRvIGNyZWF0ZSBhIHNpbXBsZSBjb21wdXRlIFJlbmRlclNjcmlwdC48L3A+CisgIDxwPiAgCisgIFNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXJlc291cmNlcy9zYW1wbGVzL1JlbmRlclNjcmlwdC9CYWxscy9pbmRleC5odG1sIj5CYWxsczwvYT4KKyAgc2FtcGxlIGluIHRoZSBBbmRyb2lkIFNESyBmb3IgbW9yZQorICBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3JlYXRlIGEgY29tcHV0ZSBSZW5kZXJTY3JpcHQgdGhhdCBpcyB1c2VkIGluIGEgZ3JhcGhpY3MgUmVuZGVyU2NyaXB0LgorICBUaGUgY29tcHV0ZSBSZW5kZXJTY3JpcHQgaXMgY29udGFpbmVkIGluIAorICA8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3JzL2JhbGxzL2JhbGxfcGh5c2ljcy5odG1sIj5iYWxsc19waHlzaWNzLnJzPC9hPi4KKyAgPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVuZGVyc2NyaXB0L2dyYXBoaWNzLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZW5kZXJzY3JpcHQvZ3JhcGhpY3MuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiZTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVuZGVyc2NyaXB0L2dyYXBoaWNzLmpkCkBAIC0wLDAgKzEsNjE5IEBACitwYWdlLnRpdGxlPTNEIEdyYXBoaWNzCitwYXJlbnQudGl0bGU9UmVuZGVyU2NyaXB0IAorcGFyZW50Lmxpbms9aW5kZXguaHRtbAorQGpkOmJvZHkKKworICA8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKyAgICA8ZGl2IGlkPSJxdiI+CisgICAgICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisKKyAgICAgIDxvbD4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNkZXZlbG9waW5nIj5EZXZlbG9waW5nIGEgUmVuZGVyU2NyaXB0IGFwcGxpY2F0aW9uPC9hPgorCisgICAgICAgICAgPG9sPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNoZWxsby1ncmFwaGljcyI+VGhlIEhlbGxvIEdyYXBoaWNzIGFwcGxpY2F0aW9uPC9hPjwvbGk+CisgICAgICAgICAgPC9vbD4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisKKyAgICAgIDxoMj5SZWxhdGVkIFNhbXBsZXM8L2gyPgorCisgICAgICA8b2w+CisgICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvUmVuZGVyU2NyaXB0L0JhbGxzL2luZGV4Lmh0bWwiPkJhbGxzPC9hPjwvbGk+CisKKyAgICAgICAgPGxpPjxhIGhyZWY9CisgICAgICAgICJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvUmVuZGVyc2NyaXB0L0ZvdW50YWluL2luZGV4Lmh0bWwiPkZvdW50YWluPC9hPjwvbGk+CisKKyAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJTY3JpcHQvSGVsbG9Xb3JsZC9pbmRleC5odG1sIj5IZWxsbworICAgICAgICBXb3JsZDwvYT48L2xpPgorCisgICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvUmVuZGVyU2NyaXB0L1NhbXBsZXMvaW5kZXguaHRtbCI+U2FtcGxlczwvYT48L2xpPgorICAgICAgPC9vbD4KKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisKKyAgPHA+UmVuZGVyU2NyaXB0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGdyYXBoaWNzIEFQSXMgZm9yIDNEIHJlbmRlcmluZywgYm90aCBhdCB0aGUgQW5kcm9pZAorICBmcmFtZXdvcmsgbGV2ZWwgYXMgd2VsbCBhcyBhdCB0aGUgbmF0aXZlIGxldmVsLiBGb3IgaW5zdGFuY2UsIHRoZSBBbmRyb2lkIGZyYW1ld29yayBBUElzIGxldCB5b3UKKyAgY3JlYXRlIG1lc2hlcyBhbmQgZGVmaW5lIHNoYWRlcnMgdG8gY3VzdG9taXplIHRoZSBncmFwaGljYWwgcmVuZGVyaW5nIHBpcGVsaW5lLiBUaGUgbmF0aXZlCisgIFJlbmRlclNjcmlwdCBncmFwaGljcyBBUElzIGxldHMgeW91IGRyYXcgdGhlIGFjdHVhbCBtZXNoZXMgdG8gcmVuZGVyIHlvdXIgc2NlbmUuIEluIGdlbmVyYWwsIHlvdQorICB3aWxsIG5lZWQgdG8gYmUgZmFtaWxpYXIgd2l0aCBBUElzIHRvIGFwcHJvcHJpYXRlbHkgcmVuZGVyIDNEIGdyYXBoaWNzIG9uIGFuIEFuZHJvaWQtcG93ZXJlZAorICBkZXZpY2UuPC9wPgorCisgIDxoMj5DcmVhdGluZyBhIEdyYXBoaWNzIFJlbmRlclNjcmlwdDwvaDI+CisKKyAgPHA+QmVjYXVzZSBvZiB0aGUgdmFyaW91cyBsYXllcnMgb2YgY29kZSB3aGVuIHdyaXRpbmcgYSBSZW5kZXJTY3JpcHQgYXBwbGljYXRpb24sIGl0IGlzIHVzZWZ1bCB0bworICBjcmVhdGUgdGhlIGZvbGxvd2luZyBmaWxlcyBmb3IgYSBzY2VuZSB0aGF0IHlvdSB3YW50IHRvIHJlbmRlcjo8L3A+CisKKyAgPHVsPgorICAgIDxsaT5UaGUgbmF0aXZlIFJlbmRlclNjcmlwdCA8Y29kZT4ucnM8L2NvZGU+IGZpbGUuIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbG9naWMgdG8gZG8gdGhlCisgICAgZ3JhcGhpY3MgcmVuZGVyaW5nLjwvbGk+CisKKyAgICA8bGk+VGhlIFJlbmRlclNjcmlwdCBlbnRyeSBwb2ludCBjbGFzcyB0aGF0IGFsbG93cyB5b3VyIHZpZXcgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgY29kZSBkZWZpbmVkCisgICAgaW4gdGhlIDxjb2RlPi5yczwvY29kZT4gZmlsZS4gVGhpcyBjbGFzcyBjb250YWlucyBhIFJlbmRlclNjcmlwdCBvYmplY3QoaW5zdGFuY2Ugb2YKKyAgICA8Y29kZT5TY3JpcHRDXzxlbT5yZW5kZXJzY3JpcHRfZmlsZTwvZW0+PC9jb2RlPiksIHdoaWNoIGFsbG93cyB5b3VyIEFuZHJvaWQgZnJhbWV3b3JrIGNvZGUgdG8KKyAgICBjYWxsIHRoZSBuYXRpdmUgUmVuZGVyU2NyaXB0IGNvZGUuIFRoaXMgY2xhc3MgYWxzbyBjcmVhdGVzIHRoZSB7QGxpbmsKKyAgICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTH0gY29udGV4dCBvYmplY3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBjdXJyZW50IHJlbmRlcmluZyBzdGF0ZQorICAgIG9mIHRoZSBSZW5kZXJTY3JpcHQgc3VjaCBhcyBwcm9ncmFtcyAodmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzLCBmb3IgZXhhbXBsZSkgdGhhdCB5b3Ugd2FudAorICAgIHRvIGRlZmluZSBhbmQgYmluZCB0byB0aGUgZ3JhcGhpY3MgcGlwZWxpbmUuIFRoZSBjb250ZXh0IG9iamVjdCBhdHRhY2hlcyB0byB0aGUgUmVuZGVyU2NyaXB0CisgICAgb2JqZWN0IChpbnN0YW5jZSBvZiA8Y29kZT48ZW0+U2NyaXB0Q19yZW5kZXJzY3JpcHRfZmlsZTwvZW0+PC9jb2RlPikgdGhhdCBkb2VzIHRoZSByZW5kZXJpbmcuCisgICAgT3VyIGV4YW1wbGUgbmFtZXMgdGhpcyBjbGFzcyA8Y29kZT5IZWxsb1dvcmxkUlM8L2NvZGU+LjwvbGk+CisKKyAgICA8bGk+Q3JlYXRlIGEgY2xhc3MgdGhhdCBleHRlbmRzIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3fSB0byBwcm92aWRlIGEgc3VyZmFjZQorICAgIHRvIHJlbmRlciBvbi4gSWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IGNhbGxiYWNrcyBmcm9tIGV2ZW50cyBpbmhlcml0ZWQgZnJvbSB7QGxpbmsKKyAgICBhbmRyb2lkLnZpZXcuVmlld30sIHN1Y2ggYXMge0BsaW5rIGFuZHJvaWQudmlldy5WaWV3I29uVG91Y2hFdmVudCBvblRvdWNoRXZlbnQoKX0gYW5kIHtAbGluaworICAgIGFuZHJvaWQudmlldy5WaWV3I29uS2V5RG93biBvbktleURvd24oKX0sIGRvIHNvIGluIHRoaXMgY2xhc3MgYXMgd2VsbC48L2xpPgorCisgICAgPGxpPkNyZWF0ZSBhIGNsYXNzIHRoYXQgaXMgdGhlIG1haW4gQWN0aXZpdHkgY2xhc3MsIGxpa2UgeW91IHdvdWxkIHdpdGggYW55IEFuZHJvaWQKKyAgICBhcHBsaWNhdGlvbi4gVGhpcyBjbGFzcyBzZXRzIHlvdXIge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXd9IGFzIHRoZSBjb250ZW50CisgICAgdmlldyBmb3IgdGhpcyBBY3Rpdml0eS48L2xpPgorICA8L3VsPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgaG93IHRvIGltcGxlbWVudCB0aGVzZSB0aHJlZSBjbGFzc2VzIGJ5IHVzaW5nIHRoZSBIZWxsb1dvcmxkCisgIFJlbmRlclNjcmlwdCBzYW1wbGUgdGhhdCBpcyBwcm92aWRlZCBpbiB0aGUgU0RLIGFzIGEgZ3VpZGUgKHNvbWUgY29kZSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGl0cworICBvcmlnaW5hbCBmb3JtIGZvciBzaW1wbGljaXR5KS48L3A+CisKKyAgPGgzPkNyZWF0aW5nIHRoZSBuYXRpdmUgUmVuZGVyU2NyaXB0IGZpbGU8L2gzPgorCisgIDxwPllvdXIgbmF0aXZlIFJlbmRlclNjcmlwdCBjb2RlIHJlc2lkZXMgaW4gYSA8Y29kZT4ucnM8L2NvZGU+IGZpbGUgaW4gdGhlCisgIDxjb2RlPiZsdDtwcm9qZWN0X3Jvb3QmZ3Q7L3NyYy88L2NvZGU+IGRpcmVjdG9yeS4gWW91IGNhbiBhbHNvIGRlZmluZSA8Y29kZT4ucnNoPC9jb2RlPiBoZWFkZXIKKyAgZmlsZXMuIFRoaXMgY29kZSBjb250YWlucyB0aGUgbG9naWMgdG8gcmVuZGVyIHlvdXIgZ3JhcGhpY3MgYW5kIGRlY2xhcmVzIGFsbCBuZWNlc3NhcnkgdmFyaWFibGVzCisgIGFuZCBwb2ludGVycy4gRXZlcnkgZ3JhcGhpY3MgPGNvZGU+LnJzPC9jb2RlPiBmaWxlIGdlbmVyYWxseSBjb250YWlucyB0aGUgZm9sbG93aW5nIGl0ZW1zOjwvcD4KKworICA8dWw+CisgICAgPGxpPkEgcHJhZ21hICg8Y29kZT4jcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKDxlbT5wYWNrYWdlLm5hbWU8L2VtPik8L2NvZGU+KSB0aGF0IGRlY2xhcmVzCisgICAgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgPGNvZGU+LmphdmE8L2NvZGU+IHJlZmxlY3Rpb24gb2YgdGhpcyBSZW5kZXJTY3JpcHQuPC9saT4KKworICAgIDxsaT5BIHByYWdtYSAoPGNvZGU+I3ByYWdtYSB2ZXJzaW9uKDEpPC9jb2RlPikgdGhhdCBkZWNsYXJlcyB0aGUgdmVyc2lvbiBvZiBSZW5kZXJTY3JpcHQgdGhhdAorICAgIHlvdSBhcmUgdXNpbmcgKDEgaXMgdGhlIG9ubHkgdmFsdWUgZm9yIG5vdykuPC9saT4KKworICAgIDxsaT5BIDxjb2RlPiNpbmNsdWRlPC9jb2RlPiBvZiB0aGUgcnNfZ3JhcGhpY3MucnNoIGhlYWRlciBmaWxlLjwvbGk+CisKKyAgICA8bGk+QSA8Y29kZT5yb290KCk8L2NvZGU+IGZ1bmN0aW9uLiBUaGlzIGlzIHRoZSBtYWluIHdvcmtlciBmdW5jdGlvbiBmb3IgeW91ciBSZW5kZXJTY3JpcHQgYW5kCisgICAgY2FsbHMgUmVuZGVyU2NyaXB0IGdyYXBoaWNzIEFQSXMgdG8gZHJhdyBtZXNoZXMgdG8gdGhlIHN1cmZhY2UuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5CisgICAgdGltZSBhIGZyYW1lIHJlZnJlc2ggb2NjdXJzLCB3aGljaCBpcyBzcGVjaWZpZWQgYXMgaXRzIHJldHVybiB2YWx1ZS4gQSA8Y29kZT4wPC9jb2RlPiBzcGVjaWZpZWQKKyAgICBmb3IgdGhlIHJldHVybiB2YWx1ZSBzYXlzIHRvIG9ubHkgcmVuZGVyIHRoZSBmcmFtZSB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIHNjZW5lIHRoYXQgeW91IGFyZQorICAgIHJlbmRlcmluZyBjaGFuZ2VzLiBBIG5vbi16ZXJvIHBvc2l0aXZlIGludGVnZXIgc3BlY2lmaWVzIHRoZSByZWZyZXNoIHJhdGUgb2YgdGhlIGZyYW1lIGluCisgICAgbWlsbGlzZWNvbmRzLgorCisgICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgUmVuZGVyU2NyaXB0IHJ1bnRpbWUgbWFrZXMgaXRzIGJlc3QgZWZmb3J0IHRvCisgICAgICByZWZyZXNoIHRoZSBmcmFtZSBhdCB0aGUgc3BlY2lmaWVkIHJhdGUuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgbGl2ZSB3YWxscGFwZXIKKyAgICAgIGFuZCBzZXQgdGhlIHJldHVybiB2YWx1ZSB0byA1MCwgdGhlIHJ1bnRpbWUgcmVuZGVycyB0aGUgd2FsbHBhcGVyIGF0IDIwZnBzIGlmIGl0IGhhcyBqdXN0CisgICAgICBlbm91Z2ggb3IgbW9yZSByZXNvdXJjZXMgdG8gZG8gc28sIGFuZCByZW5kZXJzIGFzIGZhc3QgYXMgaXQgY2FuIGlmIGl0IGRvZXMgbm90LjwvcD4KKyAgICAgIAorICAgICAgPHA+Rm9yIG1vcmUKKyAgICAgIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBSZW5kZXJTY3JpcHQgZ3JhcGhpY3MgZnVuY3Rpb25zLCBzZWUgPGEgaHJlZj0KKyAgICAgICJ1c2luZy1ncmFwaGljcy1hcGkiPlVzaW5nIHRoZSBHcmFwaGljcyBBUElzPC9hPi48L3A+CisgICAgPC9saT4KKworICAgIDxsaT5BbiA8Y29kZT5pbml0KCk8L2NvZGU+IGZ1bmN0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZG8gYW55IGluaXRpYWxpemF0aW9uIG9mIHlvdXIKKyAgICBSZW5kZXJTY3JpcHQgYmVmb3JlIHRoZSA8Y29kZT5yb290KCk8L2NvZGU+IGZ1bmN0aW9uIHJ1bnMsIHN1Y2ggYXMgaW5pdGlhbGl6aW5nIHZhcmlhYmxlcy4gVGhpcworICAgIGZ1bmN0aW9uIHJ1bnMgb25jZSBhbmQgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgUmVuZGVyU2NyaXB0IHN0YXJ0cywgYmVmb3JlIGFueXRoaW5nCisgICAgZWxzZSBpbiB5b3VyIFJlbmRlclNjcmlwdC4gQ3JlYXRpbmcgdGhpcyBmdW5jdGlvbiBpcyBvcHRpb25hbC48L2xpPgorCisgICAgPGxpPkFueSB2YXJpYWJsZXMsIHBvaW50ZXJzLCBhbmQgc3RydWN0dXJlcyB0aGF0IHlvdSB3aXNoIHRvIHVzZSBpbiB5b3VyIFJlbmRlclNjcmlwdCBjb2RlIChjYW4KKyAgICBiZSBkZWNsYXJlZCBpbiA8Y29kZT4ucnNoPC9jb2RlPiBmaWxlcyBpZiBkZXNpcmVkKTwvbGk+CisgIDwvdWw+CisKKyAgPHA+VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgPGNvZGU+aGVsbG93b3JsZC5yczwvY29kZT4gZmlsZSBpcyBpbXBsZW1lbnRlZDo8L3A+CisgIDxwcmU+CisjcHJhZ21hIHZlcnNpb24oMSkKKworLy8gVGVsbCB3aGljaCBqYXZhIHBhY2thZ2UgbmFtZSB0aGUgcmVmbGVjdGVkIGZpbGVzIHNob3VsZCBiZWxvbmcgdG8KKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMuaGVsbG93b3JsZCkKKworLy8gQnVpbHQtaW4gaGVhZGVyIHdpdGggZ3JhcGhpY3MgQVBJcworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworLy8gZ1RvdWNoWCBhbmQgZ1RvdWNoWSBhcmUgdmFyaWFibGVzIHRoYXQgYXJlIHJlZmxlY3RlZCBmb3IgdXNlCisvLyBieSB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgQVBJLiBUaGlzIFJlbmRlclNjcmlwdCB1c2VzIHRoZW0gdG8gYmUgbm90aWZpZWQgb2YgdG91Y2ggZXZlbnRzLgoraW50IGdUb3VjaFg7CitpbnQgZ1RvdWNoWTsKKworLy8gVGhpcyBpcyBpbnZva2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc2NyaXB0IGlzIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVzIHRoZSB2YXJpYWJsZXMKKy8vIGluIHRoZSBBbmRyb2lkIGZyYW1ld29yayBsYXllciBhcyB3ZWxsLgordm9pZCBpbml0KCkgeworICAgIGdUb3VjaFggPSA1MC4wZjsKKyAgICBnVG91Y2hZID0gNTAuMGY7Cit9CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgLy8gQ2xlYXIgdGhlIGJhY2tncm91bmQgY29sb3IKKyAgICByc2dDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworICAgIC8vIFRlbGwgdGhlIHJ1bnRpbWUgd2hhdCB0aGUgZm9udCBjb2xvciBzaG91bGQgYmUKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisgICAgLy8gSW50cm91ZHVjZSBvdXJzZWx2ZXMgdG8gdGhlIHdvcmxkIGJ5IGRyYXdpbmcgYSBncmVldGluZworICAgIC8vIGF0IHRoZSBwb3NpdGlvbiB1c2VyIHRvdWNoZWQgb24gdGhlIHNjcmVlbgorICAgIHJzZ0RyYXdUZXh0KCJIZWxsbyBXb3JsZCEiLCBnVG91Y2hYLCBnVG91Y2hZKTsKKworICAgIC8vIFJldHVybiB2YWx1ZSB0ZWxscyBSUyByb3VnaGx5IGhvdyBvZnRlbiB0byByZWRyYXcKKyAgICAvLyBpbiB0aGlzIGNhc2UgMjAgbXMKKyAgICByZXR1cm4gMjA7Cit9Cis8L3ByZT4KKworICA8aDM+Q3JlYXRpbmcgdGhlIFJlbmRlclNjcmlwdCBlbnRyeSBwb2ludCBjbGFzczwvaDM+CisKKyAgPHA+V2hlbiB5b3UgY3JlYXRlIGEgUmVuZGVyU2NyaXB0ICg8Y29kZT4ucnM8L2NvZGU+KSBmaWxlLCBpdCBpcyBoZWxwZnVsIHRvIGNyZWF0ZSBhCisgIGNvcnJlc3BvbmRpbmcgQW5kcm9pZCBmcmFtZXdvcmsgY2xhc3MgdGhhdCBpcyBhbiBlbnRyeSBwb2ludCBpbnRvIHRoZSA8Y29kZT4ucnM8L2NvZGU+IGZpbGUuIEluCisgIHRoaXMgZW50cnkgcG9pbnQgY2xhc3MsIHlvdSBjcmVhdGUgYSBSZW5kZXJTY3JpcHQgb2JqZWN0IGJ5IGluc3RhbnRpYXRpbmcgYQorICA8Y29kZT5TY3JpcHRDXzxlbT5yc19maWxlbmFtZTwvZW0+PC9jb2RlPiBhbmQgYmluZGluZyBpdCB0byB0aGUgUmVuZGVyU2NyaXB0IGNvbnRleHQuIFRoZQorICBSZW5kZXJTY3JpcHQgb2JqZWN0IGlzIGF0dGFjaGVkIHRvIHRoZSBSZW5kZXJTY3JpcHQgYnl0ZWNvZGUsIHdoaWNoIGlzIHBsYXRmb3JtLWluZGVwZW5kZW50IGFuZAorICBnZXRzIGNvbXBpbGVkIG9uIHRoZSBkZXZpY2Ugd2hlbiB0aGUgUmVuZGVyU2NyaXB0IGFwcGxpY2F0aW9uIHJ1bnMuIEJvdGggdGhlCisgIDxjb2RlPlNjcmlwdENfPGVtPnJzX2ZpbGVuYW1lPC9lbT48L2NvZGU+IGNsYXNzIGFuZCBieXRlY29kZSBpcyBnZW5lcmF0ZWQgYnkgdGhlIEFuZHJvaWQgYnVpbGQKKyAgdG9vbHMgYW5kIGlzIHBhY2thZ2VkIHdpdGggdGhlIDxjb2RlPi5hcGs8L2NvZGU+IGZpbGUuIFRoZSBieXRlY29kZSBmaWxlIGlzIGxvY2F0ZWQgaW4gdGhlCisgIDxjb2RlPiZsdDtwcm9qZWN0X3Jvb3QmZ3Q7L3Jlcy9yYXcvPC9jb2RlPiBkaXJlY3RvcnkgYW5kIGlzIG5hbWVkIDxjb2RlPnJzX2ZpbGVuYW1lLmJjPC9jb2RlPi4KKyAgWW91IHJlZmVyIHRvIHRoZSBieXRlY29kZSBhcyBhIHJlc291cmNlICg8Y29kZT5SLnJhdy48ZW0+cnNfZmlsZW5hbWU8L2VtPjwvY29kZT4pLiB3aGVuIGNyZWF0aW5nCisgIHRoZSBSZW5kZXJTY3JpcHQgb2JqZWN0Li48L3A+CisKKyAgPHA+WW91IHRoZW4gYmluZCB0aGUgUmVuZGVyU2NyaXB0IG9iamVjdCB0byB0aGUgUmVuZGVyU2NyaXB0IGNvbnRleHQsIHNvIHRoYXQgdGhlIHN1cmZhY2UgdmlldworICBrbm93cyB3aGF0IGNvZGUgdG8gdXNlIHRvIHJlbmRlciBncmFwaGljcy4gVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUKKyAgPGNvZGU+SGVsbG9Xb3JsZFJTPC9jb2RlPiBjbGFzcyBpcyBpbXBsZW1lbnRlZDo8L3A+CisgIDxwcmU+CitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJTIHsKKyAgICAvL2NvbnRleHQgYW5kIHJlc291cmNlcyBhcmUgb2J0YWluZWQgZnJvbSBSU1N1cmZhY2VWaWV3LCB3aGljaCBjYWxscyBpbml0KCkKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworCisgICAgLy9EZWNsYXJlIHRoZSBSZW5kZXJTY3JpcHQgb2JqZWN0CisgICAgcHJpdmF0ZSBTY3JpcHRDX2hlbGxvd29ybGQgbVNjcmlwdDsKKworICAgIHB1YmxpYyBIZWxsb1dvcmxkUlMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBwcm92aWRlcyB1cyB3aXRoIHRoZSBSZW5kZXJTY3JpcHQgY29udGV4dCBhbmQgcmVzb3VyY2VzCisgICAgICogdGhhdCBhbGxvdyB1cyB0byBjcmVhdGUgdGhlIFJlbmRlclNjcmlwdCBvYmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0KFJlbmRlclNjcmlwdEdMIHJzLCBSZXNvdXJjZXMgcmVzKSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBpbml0UlMoKTsKKyAgICB9CisgICAgLyoqCisgICAgICogQ2FsbHMgbmF0aXZlIFJlbmRlclNjcmlwdCBmdW5jdGlvbnMgKHNldF9nVG91Y2hYIGFuZCBzZXRfZ1RvdWNoWSkKKyAgICAgKiB0aHJvdWdoIHRoZSByZWZsZWN0ZWQgbGF5ZXIgY2xhc3MgU2NyaXB0Q19oZWxsb3dvcmxkIHRvIHBhc3MgaW4KKyAgICAgKiB0b3VjaCBwb2ludCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RvdWNoWCh4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RvdWNoWSh5KTsKKyAgICB9CisgICAgLyoqCisgICAgICogQmluZHMgdGhlIFJlbmRlclNjcmlwdCBvYmplY3QgdG8gdGhlIFJlbmRlclNjcmlwdCBjb250ZXh0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRSUygpIHsKKyAgICAgICAgLy9jcmVhdGUgdGhlIFJlbmRlclNjcmlwdCBvYmplY3QKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX2hlbGxvd29ybGQobVJTLCBtUmVzLCBSLnJhdy5oZWxsb3dvcmxkKTsKKyAgICAgICAgLy9iaW5kIHRoZSBSZW5kZXJTY3JpcHQgb2JqZWN0IHRvIHRoZSBSZW5kZXJTY3JpcHQgY29udGV4dAorICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CisgICAgfQorfQorCis8L3ByZT4KKworICA8aDM+Q3JlYXRpbmcgdGhlIHN1cmZhY2UgdmlldzwvaDM+CisKKyAgPHA+VG8gY3JlYXRlIGEgc3VyZmFjZSB2aWV3IHRvIHJlbmRlciBncmFwaGljcyBvbiwgY3JlYXRlIGEgY2xhc3MgdGhhdCBleHRlbmRzIHtAbGluaworICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3fS4gVGhpcyBjbGFzcyBhbHNvIGNyZWF0ZXMgYSBSZW5kZXJTY3JpcHQgY29udGV4dCBvYmplY3QKKyAgKHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTH0gYW5kIHBhc3NlcyBpdCB0byB0aGUgUmVuZHNjcmlwdCBlbnRyeSBwb2ludCBjbGFzcyB0bworICBiaW5kIHRoZSB0d28uIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdGhlIDxjb2RlPkhlbGxvV29ybGRWaWV3PC9jb2RlPiBjbGFzcyBpcworICBpbXBsZW1lbnRlZDo8L3A+CisgIDxwcmU+CitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGRWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisgICAgLy8gUmVuZGVyU2NyaXB0IGNvbnRleHQKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICAvLyBSZW5kZXJTY3JpcHQgZW50cnkgcG9pbnQgb2JqZWN0IHRoYXQgZG9lcyB0aGUgcmVuZGVyaW5nCisgICAgcHJpdmF0ZSBIZWxsb1dvcmxkUlMgbVJlbmRlcjsKKworICAgIHB1YmxpYyBIZWxsb1dvcmxkVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIGluaXRSUygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UlMoKSB7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBSZW5kZXJTY3JpcHQgd2l0aCBkZWZhdWx0IHN1cmZhY2UgY2hhcmFjdGVyaXN0aWNzLgorICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CisgICAgICAgICAgICAvL0NyZWF0ZSB0aGUgUmVuZGVyU2NyaXB0IGNvbnRleHQKKyAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUmVuZGVyU2NyaXB0IGVudHJ5IHBvaW50IGNsYXNzCisgICAgICAgICAgICBtUmVuZGVyID0gbmV3IEhlbGxvV29ybGRSUygpOworICAgICAgICAgICAgLy8gQ2FsbCB0aGUgZW50cnkgcG9pbnQgY2xhc3MgdG8gYmluZCBpdCB0byB0aGlzIGNvbnRleHQKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYmluZCBldmVyeXRoaW5nIHdoZW4gdGhlIHdpbmRvdyBiZWNvbWVzIGF0dGFjaGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCByZW5kZXJpbmcgd2hlbiB3aW5kb3cgYmVjb21lcyBkZXRhY2hlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICAvLyBIYW5kbGUgdGhlIHN5c3RlbSBldmVudCBhbmQgY2xlYW4gdXAKKyAgICAgICAgbVJlbmRlciA9IG51bGw7CisgICAgICAgIGlmIChtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJTID0gbnVsbDsKKyAgICAgICAgICAgIGRlc3Ryb3lSZW5kZXJTY3JpcHRHTCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIGNhbGxiYWNrcyB0byByZWxheSBkYXRhIHRvIFJlbmRlclNjcmlwdCBlbnRyeSBwb2ludCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikgeworICAgICAgICAvLyBQYXNzIHRvdWNoIGV2ZW50cyBmcm9tIHRoZSBzeXN0ZW0gdG8gdGhlIHJlbmRlcmluZyBzY3JpcHQKKyAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCis8L3ByZT4KKworICA8aDM+Q3JlYXRpbmcgdGhlIEFjdGl2aXR5PC9oMz4KKworICA8cD5BcHBsaWNhdGlvbnMgdGhhdCB1c2UgUmVuZGVyU2NyaXB0IHN0aWxsIGFkaGVyZSB0byBhY3Rpdml0eSBsaWZlY3lsZSwgYW5kIGFyZSBwYXJ0IG9mIHRoZSBzYW1lCisgIHZpZXcgaGllcmFyY2h5IGFzIHRyYWRpdGlvbmFsIEFuZHJvaWQgYXBwbGljYXRpb25zLCB3aGljaCBpcyBoYW5kbGVkIGJ5IHRoZSBBbmRyb2lkIFZNLiBUaGlzCisgIEFjdGl2aXR5IGNsYXNzIHNldHMgaXRzIHZpZXcgdG8gYmUgdGhlIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3fSBhbmQgaGFuZGxlcworICBsaWZlY3ljbGUgY2FsbGJhY2sgZXZlbnRzIGFwcHJvcHJpYXRlbHkuIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdGhlIDxjb2RlPkhlbGxvV29ybGQ8L2NvZGU+CisgIGNsYXNzIGlzIGltcGxlbWVudGVkOjwvcD4KKyAgPHByZT4KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICAvL0N1c3RvbSB2aWV3IHRvIHVzZSB3aXRoIFJlbmRlclNjcmlwdAorICAgIHByaXZhdGUgSGVsbG9Xb3JsZFZpZXcgdmlldzsKKworICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKyAgICAgICAgLy8gQ3JlYXRlIHN1cmZhY2UgdmlldyBhbmQgc2V0IGl0IGFzIHRoZSBjb250ZW50IG9mIG91ciBBY3Rpdml0eQorICAgICAgICBtVmlldyA9IG5ldyBIZWxsb1dvcmxkVmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcodmlldyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYW4gYXBwIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIHZpZXcucmVzdW1lKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhbiBhcHAgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICB2aWV3LnBhdXNlKCk7CisgICAgfQorfQorPC9wcmU+CisKKyAgPGgyPkRyYXdpbmc8L2gyPgorCisgIDxoMz5EcmF3aW5nIHVzaW5nIHRoZSByc2dEcmF3IGZ1bmN0aW9uczwvaDM+CisKKyAgPHA+VGhlIG5hdGl2ZSBSZW5kZXJTY3JpcHQgQVBJcyBwcm92aWRlIGEgZmV3IGNvbnZlbmllbnQgZnVuY3Rpb25zIHRvIGVhc2lseSBkcmF3IGEgcG9seWdvbiB0bworICB0aGUgc2NyZWVuLiBZb3UgY2FsbCB0aGVzZSBpbiB5b3VyIDxjb2RlPnJvb3QoKTwvY29kZT4gZnVuY3Rpb24gdG8gaGF2ZSB0aGVtIHJlbmRlciB0byB0aGUKKyAgc3VyZmFjZSB2aWV3LiBUaGVzZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3Igc2ltcGxlIGRyYXdpbmcgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgY29tcGxleAorICBncmFwaGljcyByZW5kZXJpbmc6PC9wPgorCisgIDx1bD4KKyAgICA8bGk+PGNvZGU+cnNnRHJhd1JlY3QoKTwvY29kZT46IFNldHMgdXAgYSBtZXNoIGFuZCBkcmF3cyBhIHJlY3RhbmdsZSB0byB0aGUgc2NyZWVuLiBJdCB1c2VzIHRoZQorICAgIHRvcCBsZWZ0IHZlcnRleCBhbmQgYm90dG9tIHJpZ2h0IHZlcnRleCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRyYXcuPC9saT4KKworICAgIDxsaT48Y29kZT5yc2dEcmF3UXVhZCgpPC9jb2RlPjogU2V0cyB1cCBhIG1lc2ggYW5kIGRyYXdzIGEgcXVhZHJpbGF0ZXJhbCB0byB0aGUgc2NyZWVuLjwvbGk+CisKKyAgICA8bGk+PGNvZGU+cnNnRHJhd1F1YWRUZXhDb29yZHMoKTwvY29kZT46IFNldHMgdXAgYSBtZXNoIGFuZCBkcmF3cyBhIHRleHR1cmVkIHF1YWRyaWxhdGVyYWwgdG8KKyAgICB0aGUgc2NyZWVuLjwvbGk+CisgIDwvdWw+CisKKyAgPGgzPkRyYXdpbmcgd2l0aCBhIG1lc2g8L2gzPgorCisgIDxwPldoZW4geW91IHdhbnQgdG8gZHJhdyBjb21wbGV4IHNoYXBlcyBhbmQgdGV4dHVyZXMgdG8gdGhlIHNjcmVlbiwgaW5zdGFudGlhdGUgYSB7QGxpbmsKKyAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaH0gYW5kIGRyYXcgaXQgdG8gdGhlIHNjcmVlbiB3aXRoIDxjb2RlPnJzZ0RyYXdNZXNoKCk8L2NvZGU+LiBBIHtAbGluaworICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNofSBpcyBhIGNvbGxlY3Rpb24gb2YgYWxsb2NhdGlvbnMgdGhhdCByZXByZXNlbnQgdmVydGV4IGRhdGEgKHBvc2l0aW9ucywKKyAgbm9ybWFscywgdGV4dHVyZSBjb29yZGluYXRlcykgYW5kIGluZGV4IGRhdGEgc3VjaCBhcyB0cmlhbmdsZXMgYW5kIGxpbmVzLiBZb3UgY2FuIGJ1aWxkIGEgTWVzaCBpbgorICB0aHJlZSBkaWZmZXJlbnQgd2F5czo8L3A+CisKKyAgPHVsPgorICAgIDxsaT5CdWlsZCB0aGUgbWVzaCB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyfSBjbGFzcywgd2hpY2gKKyAgICBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBzZXQgb2YgdmVydGljZXMgYW5kIGluZGljZXMgZm9yIGVhY2ggdHJpYW5nbGUgdGhhdCB5b3Ugd2FudCB0byBkcmF3LgorICAgIFRoZSBkb3duc2lkZSBvZiBkb2luZyBpdCB0aGlzIHdheSBpcyB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSB0aGUgdmVydGljZXMgaW4geW91ciBuYXRpdmUKKyAgICBSZW5kZXJTY3JpcHQgY29kZS48L2xpPgorCisgICAgPGxpPkJ1aWxkIHRoZSBtZXNoIHVzaW5nIGFuIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9ufSBvciBhIHNldCBvZiB7QGxpbmsKKyAgICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9ufXMgd2l0aCB0aGUge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guQWxsb2NhdGlvbkJ1aWxkZXJ9CisgICAgY2xhc3MuIFRoaXMgYWxsb3dzIHlvdSB0byBidWlsZCBhIG1lc2ggd2l0aCB2ZXJ0aWNlcyBhbHJlYWR5IHN0b3JlZCBpbiBtZW1vcnksIHdoaWNoIGFsbG93cyB5b3UKKyAgICB0byBzZXQgdGhlIHZlcnRpY2VzIGluIG5hdGl2ZSBvciBBbmRyb2lkIGNvZGUuPC9saT4KKworICAgIDxsaT5CdWlsZCB0aGUgbWVzaCB3aXRoIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5CdWlsZGVyfSBjbGFzcy4gVGhpcyBpcyBhCisgICAgY29udmVuaWVuY2UgbWV0aG9kIGZvciB3aGVuIHlvdSBrbm93IHdoYXQgZGF0YSB0eXBlcyB5b3Ugd2FudCB0byB1c2UgdG8gYnVpbGQgeW91ciBtZXNoLCBidXQKKyAgICBkb24ndCB3YW50IHRvIG1ha2Ugc2VwYXJhdGUgbWVtb3J5IGFsbG9jYXRpb25zIGxpa2Ugd2l0aCB7QGxpbmsKKyAgICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLkFsbG9jYXRpb25CdWlsZGVyfS4gWW91IGNhbiBzcGVjaWZ5IHRoZSB0eXBlcyB0aGF0IHlvdSB3YW50IGFuZCB0aGlzCisgICAgbWVzaCBidWlsZGVyIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbWVtb3J5IGFsbG9jYXRpb25zIGZvciB5b3UuPC9saT4KKyAgPC91bD4KKworICA8cD5UbyBjcmVhdGUgYSBtZXNoIHVzaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyfSwgeW91IG5lZWQgdG8KKyAgc3VwcGx5IGl0IHdpdGggYSBzZXQgb2YgdmVydGljZXMgYW5kIHRoZSBpbmRpY2VzIGZvciB0aGUgdmVydGljZXMgdGhhdCBjb21wcmlzZSB0aGUgdHJpYW5nbGUuIEZvcgorICBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGUgc3BlY2lmaWVzIHRocmVlIHZlcnRpY2VzLCB3aGljaCBhcmUgYWRkZWQgdG8gYW4gaW50ZXJuYWwgYXJyYXksCisgIGluZGV4ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZC4gVGhlIGNhbGwgdG8ge0BsaW5rCisgIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciNhZGRUcmlhbmdsZSBhZGRUcmlhbmdsZSgpfSBkcmF3cyB0aGUgdHJpYW5nbGUgd2l0aAorICB2ZXJ0ZXggMCwgMSwgYW5kIDIgKHRoZSB2ZXJ0aWNlcyBhcmUgZHJhd24gY291bnRlci1jbG9ja3dpc2UpLjwvcD4KKyAgPHByZT4KK2ludCBmbG9hdDJWdHhTaXplID0gMjsKK01lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB0cmlhbmdsZSA9IG5ldyBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIocmVuZGVyc2NyaXB0R0wsCitmbG9hdDJWdHhTaXplLCBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuQ09MT1IpOwordHJpYW5nbGVzLmFkZFZlcnRleCgzMDAuZiwgMzAwLmYpOwordHJpYW5nbGVzLmFkZFZlcnRleCgxNTAuZiwgNDUwLmYpOwordHJpYW5nbGVzLmFkZFZlcnRleCg0NTAuZiwgNDUwLmYpOwordHJpYW5nbGVzLmFkZFRyaWFuZ2xlKDAgLCAxLCAyKTsKK01lc2ggc21QID0gdHJpYW5nbGUuY3JlYXRlKHRydWUpOworc2NyaXB0LnNldF9tZXNoKHNtUCk7Cis8L3ByZT4KKworICA8cD5UbyBkcmF3IGEgbWVzaCB1c2luZyB0aGUge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0Lk1lc2guQWxsb2NhdGlvbkJ1aWxkZXJ9LCB5b3UgbmVlZCB0bworICBzdXBwbHkgaXQgd2l0aCBvbmUgb3IgbW9yZSBhbGxvY2F0aW9ucyB0aGF0IGNvbnRhaW4gdGhlIHZlcnRleCBkYXRhOjwvcD4KKyAgPHByZT4KK0FsbG9jYXRpb24gdmVydGljZXM7CisKKy4uLgorTWVzaC5BbGxvY2F0aW9uQnVpbGRlciB0cmlhbmdsZSA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CitzbWIuYWRkVmVydGV4QWxsb2NhdGlvbih2ZXJ0aWNlcy5nZXRBbGxvY2F0aW9uKCkpOworc21iLmFkZEluZGV4U2V0VHlwZShNZXNoLlByaW1pdGl2ZS5UUklBTkdMRSk7CitNZXNoIHNtUCA9IHNtYi5jcmVhdGUoKTsKK3NjcmlwdC5zZXRfbWVzaChzbVApOworPC9wcmU+CisKKyAgPHA+SW4geW91ciBuYXRpdmUgUmVuZGVyU2NyaXB0IGNvZGUsIGRyYXcgdGhlIGJ1aWx0IG1lc2ggdG8gdGhlIHNjcmVlbjo8L3A+CisgIDxwcmU+Cityc19tZXNoIG1lc2g7CisuLi4KKworaW50IHJvb3QoKXsKKy4uLgorcnNnRHJhd01lc2gobWVzaCk7CisuLi4KK3JldHVybiAwOyAvL3NwZWNpZnkgYSBub24gemVybywgcG9zaXRpdmUgaW50ZWdlciB0byBzcGVjaWZ5IHRoZSBmcmFtZSByZWZyZXNoLgorICAgICAgICAgIC8vMCByZWZyZXNoZXMgdGhlIGZyYW1lIG9ubHkgd2hlbiB0aGUgbWVzaCBjaGFuZ2VzLgorfQorPC9wcmU+CisKKyAgPGgyIGlkPSJzaGFkZXJzIj5TaGFkZXJzPC9oMj4KKworICA8cD5Zb3UgY2FuIGF0dGFjaCBmb3VyIHByb2dyYW0gb2JqZWN0cyB0byB0aGUge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMfSBjb250ZXh0CisgIHRvIGN1c3RvbWl6ZSB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjcmVhdGUgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXJzIGluCisgIEdMU0wgb3IgYnVpbGQgYSByYXN0ZXIgcHJvZ3JhbSBvYmplY3Qgd2l0aCBwcm92aWRlZCBtZXRob2RzIHdpdGhvdXQgd3JpdGluZyBHTFNMIGNvZGUuIFRoZSBmb3VyCisgIHByb2dyYW0gb2JqZWN0cyBtaXJyb3IgYSB0cmFkaXRpb25hbCBncmFwaGljYWwgcmVuZGVyaW5nIHBpcGVsaW5lOjwvcD4KKworICA8dGFibGU+CisgICAgPHRyPgorICAgICAgPHRoPkFuZHJvaWQgT2JqZWN0IFR5cGU8L3RoPgorCisgICAgICA8dGg+UmVuZGVyU2NyaXB0IE5hdGl2ZSBUeXBlPC90aD4KKworICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtVmVydGV4fTwvdGQ+CisKKyAgICAgIDx0ZD5yc19wcm9ncmFtX3ZlcnRleDwvdGQ+CisKKyAgICAgIDx0ZD4KKyAgICAgICAgPHA+VGhlIFJlbmRlclNjcmlwdCB2ZXJ0ZXggcHJvZ3JhbSwgYWxzbyBrbm93biBhcyBhIHZlcnRleCBzaGFkZXIsIGRlc2NyaWJlcyB0aGUgc3RhZ2UgaW4KKyAgICAgICAgdGhlIGdyYXBoaWNzIHBpcGVsaW5lIHJlc3BvbnNpYmxlIGZvciBtYW5pcHVsYXRpbmcgZ2VvbWV0cmljIGRhdGEgaW4gYSB1c2VyLWRlZmluZWQgd2F5LgorICAgICAgICBUaGUgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGJ5IHByb3ZpZGluZyBSZW5kZXJTY3JpcHQgd2l0aCB0aGUgZm9sbG93aW5nIGRhdGE6PC9wPgorCisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+QW4gRWxlbWVudCBkZXNjcmliaW5nIGl0cyB2YXJ5aW5nIGlucHV0cyBvciBhdHRyaWJ1dGVzPC9saT4KKworICAgICAgICAgIDxsaT5HTFNMIHNoYWRlciBzdHJpbmcgdGhhdCBkZWZpbmVzIHRoZSBib2R5IG9mIHRoZSBwcm9ncmFtPC9saT4KKworICAgICAgICAgIDxsaT5hIFR5cGUgdGhhdCBkZXNjcmliZXMgdGhlIGxheW91dCBvZiBhbiBBbGxvY2F0aW9uIGNvbnRhaW5pbmcgY29uc3RhbnQgb3IgdW5pZm9ybQorICAgICAgICAgIGlucHV0czwvbGk+CisgICAgICAgIDwvdWw+CisKKyAgICAgICAgPHA+T25jZSB0aGUgcHJvZ3JhbSBpcyBjcmVhdGVkLCBiaW5kIGl0IHRvIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0x9CisgICAgICAgIGdyYXBoaWNzIGNvbnRleHQgYnkgY2FsbGluZyB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0wjYmluZFByb2dyYW1WZXJ0ZXgKKyAgICAgICAgYmluZFByb2dyYW1WZXJ0ZXgoKX0uIEl0IGlzIHRoZW4gdXNlZCBmb3IgYWxsIHN1YnNlcXVlbnQgZHJhdyBjYWxscyB1bnRpbCB5b3UgYmluZCBhIG5ldworICAgICAgICBwcm9ncmFtLiBJZiB0aGUgcHJvZ3JhbSBoYXMgY29uc3RhbnQgaW5wdXRzLCB0aGUgdXNlciBuZWVkcyB0byBiaW5kIGFuIGFsbG9jYXRpb24KKyAgICAgICAgY29udGFpbmluZyB0aG9zZSBpbnB1dHMuIFRoZSBhbGxvY2F0aW9uJ3MgdHlwZSBtdXN0IG1hdGNoIHRoZSBvbmUgcHJvdmlkZWQgZHVyaW5nIGNyZWF0aW9uLgorICAgICAgICBUaGUgUmVuZGVyU2NyaXB0IGxpYnJhcnkgdGhlbiBkb2VzIGFsbCB0aGUgbmVjZXNzYXJ5IHBsdW1iaW5nIHRvIHNlbmQgdGhvc2UgY29uc3RhbnRzIHRvCisgICAgICAgIHRoZSBncmFwaGljcyBoYXJkd2FyZS4gVmFyeWluZyBpbnB1dHMgdG8gdGhlIHNoYWRlciwgc3VjaCBhcyBwb3NpdGlvbiwgbm9ybWFsLCBhbmQgdGV4dHVyZQorICAgICAgICBjb29yZGluYXRlcyBhcmUgbWF0Y2hlZCBieSBuYW1lIGJldHdlZW4gdGhlIGlucHV0IEVsZW1lbnQgYW5kIHRoZSBNZXNoIG9iamVjdCBiZWluZyBkcmF3bi4KKyAgICAgICAgVGhlIHNpZ25hdHVyZXMgZG9uJ3QgaGF2ZSB0byBiZSBleGFjdCBvciBpbiBhbnkgc3RyaWN0IG9yZGVyLiBBcyBsb25nIGFzIHRoZSBpbnB1dCBuYW1lIGluCisgICAgICAgIHRoZSBzaGFkZXIgbWF0Y2hlcyBhIGNoYW5uZWwgbmFtZSBhbmQgc2l6ZSBhdmFpbGFibGUgb24gdGhlIG1lc2gsIHRoZSBydW4tdGltZSB3b3VsZCB0YWtlCisgICAgICAgIGNhcmUgb2YgY29ubmVjdGluZyB0aGUgdHdvLiBVbmxpa2UgT3BlbkdMLCB0aGVyZSBpcyBubyBuZWVkIHRvIGxpbmsgdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQKKyAgICAgICAgcHJvZ3JhbXMuPC9wPgorCisgICAgICAgIDxwPlRvIGJpbmQgc2hhZGVyIGNvbnN0cnVjdHMgdG8gdGhlIFByb2dyYW0sIGRlY2xhcmUgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbmVjZXNzYXJ5CisgICAgICAgIHNoYWRlciBjb25zdGFudHMgaW4geW91ciBuYXRpdmUgUmVuZGVyU2NyaXB0IGNvZGUuIFRoaXMgc3RydWN0IGlzIGdlbmVyYXRlZCBpbnRvIGEKKyAgICAgICAgcmVmbGVjdGVkIGNsYXNzIHRoYXQgeW91IGNhbiB1c2UgYXMgYSBjb25zdGFudCBpbnB1dCBlbGVtZW50IGR1cmluZyB0aGUgUHJvZ3JhbSdzIGNyZWF0aW9uLgorICAgICAgICBJdCBpcyBhbiBlYXN5IHdheSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3QgYXMgYW4gYWxsb2NhdGlvbi4gWW91IHdvdWxkIHRoZW4KKyAgICAgICAgYmluZCB0aGlzIEFsbG9jYXRpb24gdG8gdGhlIFByb2dyYW0gYW5kIHRoZSBSZW5kZXJTY3JpcHQgc3lzdGVtIHNlbmRzIHRoZSBkYXRhIHRoYXQgaXMKKyAgICAgICAgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3QgdG8gdGhlIGhhcmR3YXJlIHdoZW4gbmVjZXNzYXJ5LiBUbyB1cGRhdGUgc2hhZGVyIGNvbnN0YW50cywgeW91CisgICAgICAgIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZSBBbGxvY2F0aW9uIGFuZCBub3RpZnkgdGhlIG5hdGl2ZSBSZW5kZXJTY3JpcHQgY29kZSBvZiB0aGUKKyAgICAgICAgY2hhbmdlLjwvcD4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZD57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbUZyYWdtZW50fTwvdGQ+CisKKyAgICAgIDx0ZD5yc19wcm9ncmFtX2ZyYWdtZW50PC90ZD4KKworICAgICAgPHRkPgorICAgICAgICA8cD5UaGUgUmVuZGVyU2NyaXB0IGZyYWdtZW50IHByb2dyYW0sIGFsc28ga25vd24gYXMgdGhlIGZyYWdtZW50IHNoYWRlciwgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICAgIG1hbmlwdWxhdGluZyBwaXhlbCBkYXRhIGluIGEgdXNlci1kZWZpbmVkIHdheS4gSXQncyBjb25zdHJ1Y3RlZCBmcm9tIGEgR0xTTCBzaGFkZXIgc3RyaW5nCisgICAgICAgIGNvbnRhaW5pbmcgdGhlIHByb2dyYW0gYm9keSwgdGV4dHVyZXMgaW5wdXRzLCBhbmQgYSBUeXBlIG9iamVjdCBkZXNjcmliaW5nIHRoZSBjb25zdGFudHMKKyAgICAgICAgdXNlZCBieSB0aGUgcHJvZ3JhbS4gTGlrZSB0aGUgdmVydGV4IHByb2dyYW1zLCB3aGVuIGFuIGFsbG9jYXRpb24gd2l0aCBjb25zdGFudCBpbnB1dAorICAgICAgICB2YWx1ZXMgaXMgYm91bmQgdG8gdGhlIHNoYWRlciwgaXRzIHZhbHVlcyBhcmUgc2VudCB0byB0aGUgZ3JhcGhpY3MgcHJvZ3JhbSBhdXRvbWF0aWNhbGx5LgorICAgICAgICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBpbnNpZGUgdGhlIGFsbG9jYXRpb24gYXJlIG5vdCBleHBsaWNpdGx5IHRyYWNrZWQuIElmIHRoZXkgY2hhbmdlCisgICAgICAgIGJldHdlZW4gdHdvIGRyYXcgY2FsbHMgdXNpbmcgdGhlIHNhbWUgcHJvZ3JhbSBvYmplY3QsIG5vdGlmeSB0aGUgcnVudGltZSBvZiB0aGF0IGNoYW5nZSBieQorICAgICAgICBjYWxsaW5nIHJzZ0FsbG9jYXRpb25TeW5jQWxsIHNvIGl0IGNvdWxkIHNlbmQgdGhlIG5ldyB2YWx1ZXMgdG8gaGFyZHdhcmUuIENvbW11bmljYXRpb24KKyAgICAgICAgYmV0d2VlbiB0aGUgdmVydGV4IGFuZCBmcmFnbWVudCBwcm9ncmFtcyBpcyBoYW5kbGVkIGludGVybmFsbHkgaW4gdGhlIEdMU0wgY29kZS4gRm9yCisgICAgICAgIGV4YW1wbGUsIGlmIHRoZSBmcmFnbWVudCBwcm9ncmFtIGlzIGV4cGVjdGluZyBhIHZhcnlpbmcgaW5wdXQgY2FsbGVkIHZhclRleDAsIHRoZSBHTFNMIGNvZGUKKyAgICAgICAgaW5zaWRlIHRoZSBwcm9ncmFtIHZlcnRleCBtdXN0IHByb3ZpZGUgaXQuPC9wPgorCisgICAgICAgIDxwPlRvIGJpbmQgc2hhZGVyIGNvbnN0YW50cyB0byB0aGlzIHByb2dyYW0sIGRlY2xhcmUgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbmVjZXNzYXJ5CisgICAgICAgIHNoYWRlciBjb25zdGFudHMgaW4geW91ciBuYXRpdmUgUmVuZGVyU2NyaXB0IGNvZGUuIFRoaXMgc3RydWN0IGlzIGdlbmVyYXRlZCBpbnRvIGEKKyAgICAgICAgcmVmbGVjdGVkIGNsYXNzIHRoYXQgeW91IGNhbiB1c2UgYXMgYSBjb25zdGFudCBpbnB1dCBlbGVtZW50IGR1cmluZyB0aGUgUHJvZ3JhbSdzIGNyZWF0aW9uLgorICAgICAgICBJdCBpcyBhbiBlYXN5IHdheSB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3QgYXMgYW4gYWxsb2NhdGlvbi4gWW91IHdvdWxkIHRoZW4KKyAgICAgICAgYmluZCB0aGlzIEFsbG9jYXRpb24gdG8gdGhlIFByb2dyYW0gYW5kIHRoZSBSZW5kZXJTY3JpcHQgc3lzdGVtIHNlbmRzIHRoZSBkYXRhIHRoYXQgaXMKKyAgICAgICAgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3QgdG8gdGhlIGhhcmR3YXJlIHdoZW4gbmVjZXNzYXJ5LiBUbyB1cGRhdGUgc2hhZGVyIGNvbnN0YW50cywgeW91CisgICAgICAgIGNoYW5nZSB0aGUgdmFsdWVzIGluIHRoZSBBbGxvY2F0aW9uIGFuZCBub3RpZnkgdGhlIG5hdGl2ZSBSZW5kZXJTY3JpcHQgY29kZSBvZiB0aGUKKyAgICAgICAgY2hhbmdlLjwvcD4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZD57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlfTwvdGQ+CisKKyAgICAgIDx0ZD5yc19wcm9ncmFtX3N0b3JlPC90ZD4KKworICAgICAgPHRkPlRoZSBSZW5kZXJTY3JpcHQgUHJvZ3JhbVN0b3JlIGNvbnRhaW5zIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBjb250cm9sIGhvdyB0aGUgZ3JhcGhpY3MKKyAgICAgIGhhcmR3YXJlIHdyaXRlcyB0byB0aGUgZnJhbWVidWZmZXIuIEl0IGNvdWxkIGJlIHVzZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlIGRlcHRoIHdyaXRlcyBhbmQKKyAgICAgIHRlc3RpbmcsIHNldHVwIHZhcmlvdXMgYmxlbmRpbmcgbW9kZXMgZm9yIGVmZmVjdHMgbGlrZSB0cmFuc3BhcmVuY3kgYW5kIGRlZmluZSB3cml0ZSBtYXNrcworICAgICAgZm9yIGNvbG9yIGNvbXBvbmVudHMuPC90ZD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtUmFzdGVyfTwvdGQ+CisKKyAgICAgIDx0ZD5yc19wcm9ncmFtX3Jhc3RlcjwvdGQ+CisKKyAgICAgIDx0ZD5Qcm9ncmFtIHJhc3RlciBpcyBwcmltYXJpbHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgcG9pbnQgc3ByaXRlcyBhcmUgZW5hYmxlZCBhbmQgdG8KKyAgICAgIGNvbnRyb2wgdGhlIGN1bGxpbmcgbW9kZS4gQnkgZGVmYXVsdCBiYWNrIGZhY2VzIGFyZSBjdWxsZWQuPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWZpbmVzIGEgdmVydGV4IHNoYWRlciBpbiBHTFNMIGFuZCBiaW5kcyBpdCB0byB0aGUgUmVuZGVyU2NyaXB0OjwvcD4KKyAgPHByZT4KKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIGdsUmVuZGVyZXI7ICAgICAgLy9yZW5kZXJpbmcgY29udGV4dAorICAgIHByaXZhdGUgU2NyaXB0RmllbGRfUG9pbnQgbVBvaW50czsgICAgICAvL3ZlcnRpY2VzCisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9WcENvbnN0cyBtVnBDb25zdHM7IC8vc2hhZGVyIGNvbnN0YW50cworCisgICAgLi4uCisKKyAgICAgUHJvZ3JhbVZlcnRleC5CdWlsZGVyIHNiID0gbmV3IFByb2dyYW1WZXJ0ZXguQnVpbGRlcihnbFJlbmRlcmVyKTsKKyAgICAgICAgU3RyaW5nIHQgPSAgInZhcnlpbmcgdmVjNCB2YXJDb2xvcjtcbiIgKworICAgICAgICAgICAgICAgICAgICAidm9pZCBtYWluKCkge1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIHZlYzQgcG9zID0gdmVjNCgwLjAsIDAuMCwgMC4wLCAxLjApO1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIHBvcy54eSA9IEFUVFJJQl9wb3NpdGlvbjtcbiIgKworICAgICAgICAgICAgICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBwb3M7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgdmFyQ29sb3IgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgZ2xfUG9pbnRTaXplID0gQVRUUklCX3NpemU7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIn1cbiI7CisgICAgICAgIHNiLnNldFNoYWRlcih0KTsKKyAgICAgICAgc2IuYWRkQ29uc3RhbnQobVZwQ29uc3RzLmdldFR5cGUoKSk7CisgICAgICAgIHNiLmFkZElucHV0KG1Qb2ludHMuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgUHJvZ3JhbVZlcnRleCBwdnMgPSBzYi5jcmVhdGUoKTsKKyAgICAgICAgcHZzLmJpbmRDb25zdGFudHMobVZwQ29uc3RzLmdldEFsbG9jYXRpb24oKSwgMCk7CisgICAgICAgIGdsUmVuZGVyZXIuYmluZFByb2dyYW1WZXJ0ZXgocHZzKTsKKworCis8L3ByZT4KKworICA8cD5UaGUgPGEgaHJlZj0KKyAgIntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5odG1sIj4KKyAgUnNSZW5kZXJTdGF0ZXNSUzwvYT4gc2FtcGxlIGhhcyBtYW55IGV4YW1wbGVzIG9uIGhvdyB0byBjcmVhdGUgYSBzaGFkZXIgd2l0aG91dCB3cml0aW5nIEdMU0wuPC9wPgorCisgIDxoMz5TaGFkZXIgYmluZGluZ3M8L2gzPgorCisgIDxwPllvdSBjYW4gYWxzbyBzZXQgZm91ciBwcmFnbWFzIHRoYXQgY29udHJvbCB0aGUgc2hhZGVycycgZGVmYXVsdCBiaW5kaW5ncyB0byB0aGUge0BsaW5rCisgIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMfSBjb250ZXh0IHdoZW4gdGhlIHNjcmlwdCBpcyBleGVjdXRpbmc6PC9wPgorCisgIDx1bD4KKyAgICA8bGk+c3RhdGVWZXJ0ZXg8L2xpPgorCisgICAgPGxpPnN0YXRlRnJhZ21lbnQ8L2xpPgorCisgICAgPGxpPnN0YXRlUmFzdGVyPC9saT4KKworICAgIDxsaT5zdGF0ZVN0b3JlPC9saT4KKyAgPC91bD4KKworICA8cD5UaGUgcG9zc2libGUgdmFsdWVzIGZvciBlYWNoIHByYWdtYSBhcmUgPGNvZGU+cGFyZW50PC9jb2RlPiBvciA8Y29kZT5kZWZhdWx0PC9jb2RlPi4gVXNpbmcKKyAgPGNvZGU+ZGVmYXVsdDwvY29kZT4gYmluZHMgdGhlIHNoYWRlcnMgdG8gdGhlIGdyYXBoaWNhbCBjb250ZXh0IHdpdGggdGhlIHN5c3RlbSBkZWZhdWx0cy4gVGhlCisgIGRlZmF1bHQgc2hhZGVyIGlzIGRlZmluZWQgYmVsb3c6PC9wPgorICA8cHJlPgorKCJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iKTsKKygidmFyeWluZyB2ZWMyIHZhclRleDA7XG4iKTsKKygidm9pZCBtYWluKCkge1xuIik7CisoIiBnbF9Qb3NpdGlvbiA9IFVOSV9NVlAgKiBBVFRSSUJfcG9zaXRpb247XG4iKTsKKygiIGdsX1BvaW50U2l6ZSA9IDEuMDtcbiIpOworKCIgdmFyQ29sb3IgPSBBVFRSSUJfY29sb3I7XG4iKTsKKygiIHZhclRleDAgPSBBVFRSSUJfdGV4dHVyZTA7XG4iKTsKKygifVxuIik7Cis8L3ByZT4KKworICA8cD5Vc2luZyA8Y29kZT5wYXJlbnQ8L2NvZGU+IGJpbmRzIHRoZSBzaGFkZXJzIGluIHRoZSBzYW1lIG1hbm5lciBhcyBpdCBpcyBib3VuZCBpbiB0aGUgY2FsbGluZworICBzY3JpcHQuIElmIHRoaXMgaXMgdGhlIHJvb3Qgc2NyaXB0LCB0aGUgcGFyZW50IHN0YXRlIGlzIHRha2VuIGZyb20gdGhlIGJpbmQgcG9pbnRzIHRoYXQgYXJlIHNldAorICBieSB0aGUge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMfSBiaW5kIG1ldGhvZHMuPC9wPgorCisgIDxwPkZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSB0aGlzIGF0IHRoZSB0b3Agb2YgeW91ciBuYXRpdmUgZ3JhcGhpY3MgUmVuZGVyU2NyaXB0IGNvZGUgdG8gaGF2ZQorICB0aGUgVmVydGV4IGFuZCBTdG9yZSBzaGFkZXJzIGluaGVyZW50IHRoZSBiaW5kIHByb3BlcnRpZXMgZnJvbSB0aGVpciBwYXJlbnQgc2NyaXB0czo8L3A+CisgIDxwcmU+CisjcHJhZ21hIHN0YXRlVmVydGV4KHBhcmVudCkKKyNwcmFnbWEgc3RhdGVTdG9yZShwYXJlbnQpCis8L3ByZT4KKworICA8aDM+RGVmaW5pbmcgYSBzYW1wbGVyPC9oMz4KKworICA8cD5BIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TYW1wbGVyfSBvYmplY3QgZGVmaW5lcyBob3cgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbSB0ZXh0dXJlcy4KKyAgU2FtcGxlcnMgYXJlIGJvdW5kIHRvIFByb2dyYW0gb2JqZWN0cyAoY3VycmVudGx5IG9ubHkgYSBGcmFnbWVudCBQcm9ncmFtKSBhbG9uZ3NpZGUgdGhlIHRleHR1cmUKKyAgd2hvc2Ugc2FtcGxpbmcgdGhleSBjb250cm9sLiBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIHRvIHNwZWNpZnkgc3VjaCB0aGluZ3MgYXMgZWRnZSBjbGFtcGluZworICBiZWhhdmlvciwgd2hldGhlciBtaXAtbWFwcyBhcmUgdXNlZCwgYW5kIHRoZSBhbW91bnQgb2YgYW5pc290cm9weSByZXF1aXJlZC4gVGhlcmUgbWlnaHQgYmUKKyAgc2l0dWF0aW9ucyB3aGVyZSBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBkZXNpcmVkIGJlaGF2aW9yIG9mIHRoZSBzYW1wbGVyLiBJbiB0aGVzZSBjYXNlcywKKyAgdGhlIHJ1bnRpbWUgYXR0ZW1wdHMgdG8gcHJvdmlkZSB0aGUgY2xvc2VzdCBwb3NzaWJsZSBhcHByb3hpbWF0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIHVzZXIKKyAgcmVxdWVzdGVkIDE2eCBhbmlzb3Ryb3B5LCBidXQgb25seSA4eCB3YXMgc2V0IGJlY2F1c2UgaXQncyB0aGUgYmVzdCBhdmFpbGFibGUgb24gdGhlCisgIGhhcmR3YXJlLjwvcD4KKworICA8cD5UaGUgPGEgaHJlZj0KKyAgIntAZG9jUm9vdH1yZXNvdXJjZXMvc2FtcGxlcy9SZW5kZXJTY3JpcHQvTWlzY1NhbXBsZXMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvcnMvbWlzY3NhbXBsZXMvUnNSZW5kZXJTdGF0ZXNSUy5odG1sIj4KKyAgUnNSZW5kZXJTdGF0ZXNSUzwvYT4gc2FtcGxlIGhhcyBtYW55IGV4YW1wbGVzIG9uIGhvdyB0byBjcmVhdGUgYSBzYW1wbGVyIGFuZCBiaW5kIGl0IHRvIGEKKyAgRnJhZ21lbnQgcHJvZ3JhbS48L3A+CisgIAorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZW5kZXJzY3JpcHQvaW5kZXguamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3JlbmRlcnNjcmlwdC9pbmRleC5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjc3MzEwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZW5kZXJzY3JpcHQvaW5kZXguamQKQEAgLTAsMCArMSw2NDAgQEAKK3BhZ2UudGl0bGU9UmVuZGVyU2NyaXB0CitAamQ6Ym9keQorCisgIDxkaXYgaWQ9InF2LXdyYXBwZXIiPgorICAgIDxkaXYgaWQ9InF2Ij4KKyAgICAgIDxoMj5JbiB0aGlzIGRvY3VtZW50PC9oMj4KKworICAgICAgPG9sPgorICAgICAgICA8bGk+PGEgaHJlZj0iI292ZXJ2aWV3Ij5SZW5kZXJTY3JpcHQgU3lzdGVtIE92ZXJ2aWV3PC9hPjwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICA8b2w+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI25hdGl2ZSI+TmF0aXZlIFJlbmRlclNjcmlwdCBsYXllcjwvYT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3JlZmxlY3RlZCI+UmVmbGVjdGVkIGxheWVyPC9hPjwvbGk+CisKKyAgICAgICAgICAgIDxsaT48YSBocmVmPSIjZnJhbWV3b3JrIj5BbmRyb2lkIGZyYW1ld29yayBsYXllcjwvYT48L2xpPgorICAgICAgICAgIDwvb2w+CisgICAgICAgIDwvbGk+CisKKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNtZW0tYWxsb2NhdGlvbiI+TWVtb3J5IEFsbG9jYXRpb24gQVBJczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPgorICAgICAgICAgIDxhIGhyZWY9IiNkeW5hbWljIj5EeW5hbWljIE1lbW9yeSBBbGxvY2F0aW9uczwvYT4KKyAgICAgICAgICA8b2w+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3BvaW50ZXJzIj5EZWNsYXJpbmcgcG9pbnRlcnM8L2E+PC9saT4KKworICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNzdHJ1Y3QtcG9pbnRlci1yZWZsZWN0aW9uIj5Ib3cgcG9pbnRlcnMgYXJlIHJlZmxlY3RlZDwvYT48L2xpPgorCisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI2JpbmRpbmciPkFsbG9jYXRpbmcgYW5kIGJpbmRpbmcgbWVtb3J5IHRvIHRoZSBSZW5kZXJTY3JpcHQ8L2E+PC9saT4KKworICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiNyZWFkLXdyaXRlLWR5bmFtaWMiPlJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gbWVtb3J5PC9hPjwvbGk+CisKKyAgICAgICAgICA8L29sPgorICAgICAgICA8L2xpPgorICAgICAgICA8bGk+CisgICAgICAgICAgPGEgaHJlZj0iI3N0YXRpYyI+U3RhdGljIE1lbW9yeSBBbGxvY2F0aW9uczwvYT4KKyAgICAgICAgPC9saT4KKyAgICAgIDwvb2w+CisgICAgPC9kaXY+CisgIDwvZGl2PgorCisgIDxwPlJlbmRlclNjcmlwdCBvZmZlcnMgYSBoaWdoIHBlcmZvcm1hbmNlIDNEIGdyYXBoaWNzIHJlbmRlcmluZyBhbmQgY29tcHV0ZSBBUEkgYXQgdGhlIG5hdGl2ZQorICBsZXZlbCwgd2hpY2ggeW91IHdyaXRlIGluIHRoZSBDIChDOTkgc3RhbmRhcmQpLiBUaGUgbWFpbiBhZHZhbnRhZ2VzIG9mIFJlbmRlclNjcmlwdCBhcmU6PC9wPgorICA8dWw+CisgICAgPGxpPlBvcnRhYmlsaXR5OiBSZW5kZXJTY3JpcHQgaXMgZGVzaWduZWQgdG8gcnVuIG9uIG1hbnkgdHlwZXMgb2YgZGV2aWNlcyB3aXRoIGRpZmZlcmVudCBDUFUKKyAgICBhbmQgR1BVIGFyY2hpdGVjdHVyZXMuIEl0IHN1cHBvcnRzIGFsbCBvZiB0aGVzZSBhcmNoaXRlY3R1cmVzIHdpdGhvdXQgaGF2aW5nIHRvIHRhcmdldCBlYWNoCisgICAgZGV2aWNlLCBiZWNhdXNlIHRoZSBjb2RlIGlzIGNvbXBpbGVkIGFuZCBjYWNoZWQgb24gdGhlIGRldmljZSBhdCBydW50aW1lLjwvbGk+CisKKyAgICA8bGk+UGVyZm9ybWFuY2U6IFJlbmRlclNjcmlwdCBwcm92aWRlcyBzaW1pbGFyIHBlcmZvcm1hbmNlIHRvIE9wZW5HTCB3aXRoIHRoZSBOREsgd2hpbGUKKyAgICBvZmZlcmluZyB0aGUgcG9ydGFiaWxpdHkgb2YgdGhlIE9wZW5HTCBBUElzIHByb3ZpZGVkIGJ5IHRoZSBBbmRyb2lkIGZyYW1ld29yayAoe0BsaW5rCisgICAgYW5kcm9pZC5vcGVuZ2x9KS4gSW4gYWRkaXRpb24sIGl0IGFsc28gb2ZmZXJzIGEgaGlnaCBwZXJmb3JtYW5jZSBjb21wdXRlIEFQSSB0aGF0IGlzIG5vdAorICAgIG9mZmVyZWQgYnkgT3BlbkdMLjwvbGk+CisKKyAgICA8bGk+VXNhYmlsaXR5OiBSZW5kZXJTY3JpcHQgc2ltcGxpZmllcyBkZXZlbG9wbWVudCB3aGVuIHBvc3NpYmxlLCBzdWNoIGFzIGVsaW1pbmF0aW5nIEpOSSBnbHVlIGNvZGUKKyAgICBhbmQgc2ltcGxpZnlpbmcgbWVzaCBzZXR1cC48L2xpPgorICA8L3VsPgorCisgIDxwPlRoZSBtYWluIGRpc2FkdmFudGFnZXMgYXJlOjwvcD4KKworICA8dWw+CisgICAgPGxpPkRldmVsb3BtZW50IGNvbXBsZXhpdHk6IFJlbmRlclNjcmlwdCBpbnRyb2R1Y2VzIGEgbmV3IHNldCBvZiBBUElzIHRoYXQgeW91IGhhdmUgdG8gbGVhcm4uCisgICAgUmVuZGVyU2NyaXB0IGFsc28gaGFuZGxlcyBtZW1vcnkgZGlmZmVyZW50bHkgY29tcGFyZWQgdG8gT3BlbkdMIHdpdGggdGhlIEFuZHJvaWQgZnJhbWV3b3JrIEFQSXMKKyAgICBvciBOREsuPC9saT4KKworICAgIDxsaT5EZWJ1Z2dpbmcgdmlzaWJpbGl0eTogUmVuZGVyU2NyaXB0IGNhbiBwb3RlbnRpYWxseSBleGVjdXRlIChwbGFubmVkIGZlYXR1cmUgZm9yIGxhdGVyIHJlbGVhc2VzKQorICAgIG9uIHByb2Nlc3NvcnMgb3RoZXIgdGhhbiB0aGUgbWFpbiBDUFUgKHN1Y2ggYXMgdGhlIEdQVSksIHNvIGlmIHRoaXMgb2NjdXJzLCBkZWJ1Z2dpbmcgYmVjb21lcyBtb3JlIGRpZmZpY3VsdC4gCisgICAgPC9saT4KKworICAgIDxsaT5MZXNzIGZlYXR1cmVzOiBSZW5kZXJTY3JpcHQgZG9lcyBub3QgcHJvdmlkZSBhcyBtYW55IGZlYXR1cmVzIGFzIE9wZW5HTCBzdWNoIGFzIGFsbCB0aGUgY29tcHJlc3NlZAorICAgIHRleHR1cmUgZm9ybWF0cyBvciBHTCBleHRlbnNpb25zLjwvbGk+CisgIDwvdWw+CisKKyAgPHA+WW91IG5lZWQgdG8gY29uc2lkZXIgYWxsIG9mIHRoZSBhc3BlY3RzIG9mIFJlbmRlclNjcmlwdCBiZWZvcmUgZGVjaWRpbmcgd2hlbiB0byB1c2UgaXQuIFRoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMKKyAgZ2VuZXJhbCBndWlkZWxpbmVzIG9uIHdoZW4gdG8gdXNlIE9wZW5HTCAoZnJhbWV3b3JrIEFQSXMgb3IgTkRLKSBvciBSZW5kZXJTY3JpcHQ6PC9wPgorICA8dWw+CisgICAgPGxpPklmIHlvdSBhcmUgZG9pbmcgc2ltcGxlIGdyYXBoaWNzIHJlbmRlcmluZyBhbmQgcGVyZm9ybWFuY2UgaXMgbm90IGNyaXRpY2FsLCB5b3UgcHJvYmFibHkgd2FudCB0byB1c2UgdGhlCisgIEFuZHJvaWQgZnJhbWV3b3JrIE9wZW5HTCBBUElzLCB3aGljaCBzdGlsbCBwcm92aWRlIGFkZXF1YXRlIHBlcmZvcm1hbmNlLCB0byBlbGltaW5hdGUgdGhlIGFkZGVkIGNvZGluZyBhbmQgZGVidWdnaW5nIGNvbXBsZXhpdHkgb2YKKyAgUmVuZGVyU2NyaXB0LjwvbGk+CisKKyAgPGxpPklmIHlvdSB3YW50IHRoZSBtb3N0IGZsZXhpYmlsaXR5IGFuZCBmZWF0dXJlcyB3aGlsZSBtYWludGFpbmluZyByZWxhdGl2ZWx5IGdvb2QgZGVidWdnaW5nCisgIHN1cHBvcnQsIHlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBPcGVuR0wgYW5kIHRoZSBOREsuIEFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgdGhpcyBhcmUgaGlnaCBlbmQKKyAgb3IgY29tcGxpY2F0ZWQgZ2FtZXMsIGZvciBleGFtcGxlLjwvbGk+CisgCisgIDxsaT5JZiB5b3Ugd2FudCBhIHNvbHV0aW9uIHRoYXQgaXMgcG9ydGFibGUsIGhhcyBnb29kIHBlcmZvcm1hbmNlLAorICBhbmQgeW91IGRvbid0IG5lZWQgdGhlIGZ1bGwgZmVhdHVyZSBzZXQgb2YgT3BlbkdMLCBSZW5kZXJTY3JpcHQgaXMgYSBnb29kIHNvbHV0aW9uLiBJZiB5b3UgYWxzbworICBuZWVkIGEgaGlnaCBwZXJmb3JtYW5jZSBjb21wdXRlIGxhbmd1YWdlLCB0aGVuIFJlbmRlclNjcmlwdCBvZmZlcnMgdGhhdCBhcyB3ZWxsLgorICBHb29kIGNhbmRpZGF0ZXMgZm9yIFJlbmRlclNjcmlwdCBhcmUgZ3JhcGhpY3MgaW50ZW5zaXZlIFVJcyB0aGF0IHJlcXVpcmUgM0QgcmVuZGVyaW5nLCBsaXZlIHdhbGxwYXBlcnMsCisgIG9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgaW50ZW5zaXZlIG1hdGhlbWF0aWNhbCBjb21wdXRhdGlvbi48L2xpPgorICA8L3VsPgorCisgIDxwPkZvciBhbiBleGFtcGxlIG9mIFJlbmRlclNjcmlwdCBpbiBhY3Rpb24sIGluc3RhbGwgdGhlIFJlbmRlclNjcmlwdCBzYW1wbGUgYXBwbGljYXRpb25zIHRoYXQKKyAgYXJlIHNoaXBwZWQgd2l0aCB0aGUgU0RLIGluIDxjb2RlPiZsdDtzZGtfcm9vdCZndDsvc2FtcGxlcy9hbmRyb2lkLTExL1JlbmRlclNjcmlwdDwvY29kZT4uCisgIFlvdSBjYW4gYWxzbyBzZWUgYSB0eXBpY2FsIHVzZSBvZiBSZW5kZXJTY3JpcHQgd2l0aCB0aGUgM0QgY2Fyb3VzZWwgdmlldyBpbiB0aGUgQW5kcm9pZCAzLngKKyAgdmVyc2lvbnMgb2YgR29vZ2xlIEJvb2tzIGFuZCBZb3VUdWJlLjwvcD4KKworICA8aDIgaWQ9Im92ZXJ2aWV3Ij5SZW5kZXJTY3JpcHQgU3lzdGVtIE92ZXJ2aWV3PC9oMj4KKworICA8cD5UaGUgUmVuZGVyU2NyaXB0IHN5c3RlbSBhZG9wdHMgYSBjb250cm9sIGFuZCBzbGF2ZSBhcmNoaXRlY3R1cmUgd2hlcmUgdGhlIGxvdy1sZXZlbCBuYXRpdmUKKyAgY29kZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBoaWdoZXIgbGV2ZWwgQW5kcm9pZCBzeXN0ZW0gdGhhdCBydW5zIGluIGEgdmlydHVhbCBtYWNoaW5lIChWTSkuIFRoZQorICBBbmRyb2lkIFZNIHN0aWxsIHJldGFpbnMgYWxsIGNvbnRyb2wgb2YgbWVtb3J5IGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBhbmQgY2FsbHMgdGhlIG5hdGl2ZQorICBSZW5kZXJTY3JpcHQgY29kZSB3aGVuIG5lY2Vzc2FyeS4gVGhlIG5hdGl2ZSBjb2RlIGlzIGNvbXBpbGVkIHRvIGludGVybWVkaWF0ZSBieXRlY29kZSAoTExWTSkgYW5kCisgIHBhY2thZ2VkIGluc2lkZSB5b3VyIGFwcGxpY2F0aW9uJ3MgPGNvZGU+LmFwazwvY29kZT4gZmlsZS4gT24gdGhlIGRldmljZSwgdGhlIGJ5dGVjb2RlIGlzCisgIGNvbXBpbGVkIChqdXN0LWluLXRpbWUpIHRvIG1hY2hpbmUgY29kZSB0aGF0IGlzIGZ1cnRoZXIgb3B0aW1pemVkIGZvciB0aGUgZGV2aWNlIHRoYXQgaXQgaXMKKyAgcnVubmluZyBvbi4gVGhlIGNvbXBpbGVkIGNvZGUgb24gdGhlIGRldmljZSBpcyBjYWNoZWQsIHNvIHN1YnNlcXVlbnQgdXNlcyBvZiB0aGUgUmVuZGVyU2NyaXB0CisgIGVuYWJsZWQgYXBwbGljYXRpb24gZG8gbm90IHJlY29tcGlsZSB0aGUgaW50ZXJtZWRpYXRlIGNvZGUuIFJlbmRlclNjcmlwdCBoYXMgdGhyZWUgbGF5ZXJzIG9mIGNvZGUKKyAgdG8gZW5hYmxlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgbmF0aXZlIGFuZCBBbmRyb2lkIGZyYW1ld29yayBjb2RlOjwvcD4KKworICA8dWw+CisgICAgPGxpPlRoZSBuYXRpdmUgUmVuZGVyU2NyaXB0IGxheWVyIGRvZXMgdGhlIGludGVuc2l2ZSBjb21wdXRhdGlvbiBvciBncmFwaGljcyByZW5kZXJpbmcuIFlvdQorICAgIGRlZmluZSB5b3VyIG5hdGl2ZSBjb2RlIGluIDxjb2RlPi5yczwvY29kZT4gYW5kIDxjb2RlPi5yc2g8L2NvZGU+IGZpbGVzLjwvbGk+CisKKyAgICA8bGk+VGhlIHJlZmxlY3RlZCBsYXllciBpcyBhIHNldCBvZiBjbGFzc2VzIHRoYXQgYXJlIHJlZmxlY3RlZCBmcm9tIHRoZSBuYXRpdmUgY29kZS4gSXQgaXMgYmFzaWNhbGx5CisgICAgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNvZGUgdGhhdCBhbGxvd3MgdGhlIEFuZHJvaWQgZnJhbWV3b3JrIHRvIGludGVyYWN0IHdpdGggbmF0aXZlIFJlbmRlclNjcmlwdHMuCisgICAgVGhlIEFuZHJvaWQgYnVpbGQgdG9vbHMgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgY2xhc3NlcyBmb3IgdGhpcyBsYXllciBkdXJpbmcKKyAgICB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgZWxpbWluYXRlcyB0aGUgbmVlZCB0byB3cml0ZSBKTkkgZ2x1ZSBjb2RlLCBsaWtlIHdpdGggdGhlIE5ESy48L2xpPgorCisgICAgPGxpPlRoZSBBbmRyb2lkIGZyYW1ld29yayBsYXllciBpcyBjb21wcmlzZWQgb2YgdGhlIEFuZHJvaWQgZnJhbWV3b3JrCisgICAgIEFQSXMsIHdoaWNoIGluY2x1ZGUgdGhlIHtAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdH0gcGFja2FnZS4gVGhpcyBsYXllciBnaXZlcyBoaWdoIGxldmVsIGNvbW1hbmRzCisgICAgIGxpa2UsICJyb3RhdGUgdGhlIHZpZXciIG9yICJmaWx0ZXIgdGhlIGJpdG1hcCIsIGJ5IGNhbGxpbmcgdGhlIHJlZmxlY3RlZCBsYXllciwgd2hpY2ggaW4gdHVybiBjYWxscworICAgICB0aGUgbmF0aXZlIGxheWVyLiA8L2xpPgorICA8L3VsPgorCisgIDxoMyBpZD0ibmF0aXZlIj5OYXRpdmUgUmVuZGVyU2NyaXB0IGxheWVyPC9oMz4KKworICA8cD5UaGUgbmF0aXZlIFJlbmRlclNjcmlwdCBsYXllciBjb25zaXN0cyBvZiB5b3VyIFJlbmRlclNjcmlwdCBjb2RlLCB3aGljaCBpcyBjb21waWxlZCBhbmQKKyAgZXhlY3V0ZWQgaW4gYSBjb21wYWN0IGFuZCB3ZWxsIGRlZmluZWQgcnVudGltZS4gWW91ciBSZW5kZXJTY3JpcHQgY29kZSBoYXMgYWNjZXNzIHRvIGEgbGltaXRlZAorICBhbW91bnQgb2YgZnVuY3Rpb25zIGJlY2F1c2UgaXQgY2Fubm90IGFjY2VzcyB0aGUgTkRLIG9yIHN0YW5kYXJkIEMgZnVuY3Rpb25zLCBzaW5jZSB0aGV5IG11c3QgYmUgZ3VhcmFudGVlZCB0bworICBydW4gb24gYSBzdGFuZGFyZCBDUFUuIFRoZSBSZW5kZXJTY3JpcHQgcnVudGltZSB3YXMgZGVzaWduZWQgdG8gcnVuIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9jZXNzb3JzLAorICB3aGljaCBtYXkgbm90IGJlIHRoZSBDUFUsIHNvIGl0IGNhbm5vdCBndWFyYW50ZWUgc3VwcG9ydCBmb3Igc3RhbmRhcmQgQyBsaWJyYXJpZXMuIFdoYXQKKyAgUmVuZGVyU2NyaXB0IGRvZXMgb2ZmZXIgaXMgYW4gQVBJIHRoYXQgc3VwcG9ydHMgaW50ZW5zaXZlIGNvbXB1dGF0aW9uIGFuZCBncmFwaGljcyByZW5kZXJpbmcgd2l0aCBhIGNvbGxlY3Rpb24gb2YgbWF0aAorICBhbmQgZ3JhcGhpY3MgQVBJcy48L3A+CisKKyAgPHA+U29tZSBrZXkgZmVhdHVyZXMgb2YgdGhlIG5hdGl2ZSBSZW5kZXJTY3JpcHQgbGlicmFyaWVzIGluY2x1ZGU6PC9wPgorCisgIDx1bD4KKyAgICA8bGk+QSBsYXJnZSBjb2xsZWN0aW9uIG9mIG1hdGggZnVuY3Rpb25zIHdpdGggYm90aCBzY2FsYXIgYW5kIHZlY3RvciB0eXBlZCBvdmVybG9hZGVkIHZlcnNpb25zCisgICAgb2YgbWFueSBjb21tb24gcm91dGluZXMuIE9wZXJhdGlvbnMgc3VjaCBhcyBhZGRpbmcsIG11bHRpcGx5aW5nLCBkb3QgcHJvZHVjdCwgYW5kIGNyb3NzIHByb2R1Y3QKKyAgICBhcmUgYXZhaWxhYmxlLjwvbGk+CisKKyAgICA8bGk+Q29udmVyc2lvbiByb3V0aW5lcyBmb3IgcHJpbWl0aXZlIGRhdGEgdHlwZXMgYW5kIHZlY3RvcnMsIG1hdHJpeCByb3V0aW5lcywgZGF0ZSBhbmQgdGltZQorICAgIHJvdXRpbmVzLCBhbmQgZ3JhcGhpY3Mgcm91dGluZXMuPC9saT4KKworICAgIDxsaT5Mb2dnaW5nIGZ1bmN0aW9uczwvbGk+CisKKyAgICA8bGk+R3JhcGhpY3MgcmVuZGVyaW5nIGZ1bmN0aW9uczwvbGk+CisKKyAgICA8bGk+TWVtb3J5IGFsbG9jYXRpb24gcmVxdWVzdCBmZWF0dXJlczwvbGk+CisKKyAgICA8bGk+RGF0YSB0eXBlcyBhbmQgc3RydWN0dXJlcyB0byBzdXBwb3J0IHRoZSBSZW5kZXJTY3JpcHQgc3lzdGVtIHN1Y2ggYXMgVmVjdG9yIHR5cGVzIGZvcgorICAgIGRlZmluaW5nIHR3by0sIHRocmVlLSwgb3IgZm91ci12ZWN0b3JzLjwvbGk+CisgIDwvdWw+CisKKyAgPHA+VGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvcmVuZGVyc2NyaXB0L3JzLWFwaS9maWxlcy5odG1sIj5SZW5kZXJTY3JpcHQgaGVhZGVyIGZpbGVzPC9hPgorICBhbmQgTExWTSBmcm9udC1lbmQgbGlicmFyaWVzIGFyZSBsb2NhdGVkIGluIHRoZSA8Y29kZT5pbmNsdWRlPC9jb2RlPiBhbmQKKyAgPGNvZGU+Y2xhbmctaW5jbHVkZTwvY29kZT4gZGlyZWN0b3JpZXMgaW4gdGhlCisgIDxjb2RlPiZsdDtzZGtfcm9vdCZndDsvcGxhdGZvcm1zL2FuZHJvaWQtMTEvcmVuZGVyc2NyaXB0PC9jb2RlPiBkaXJlY3Rvcnkgb2YgdGhlIEFuZHJvaWQgU0RLLiBUaGUKKyAgaGVhZGVycyBhcmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBmb3IgeW91LCBleGNlcHQgZm9yIHRoZSBSZW5kZXJTY3JpcHQgZ3JhcGhpY3Mgc3BlY2lmaWMgaGVhZGVyIGZpbGUsIHdoaWNoCisgIHlvdSBjYW4gaW5jbHVkZSBhcyBmb2xsb3dzOjwvcD4KKyAgPHByZT4KKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCis8L3ByZT4KKworICA8aDMgaWQ9InJlZmxlY3RlZCI+UmVmbGVjdGVkIGxheWVyPC9oMz4KKworICA8cD5UaGUgcmVmbGVjdGVkIGxheWVyIGlzIGEgc2V0IG9mIGNsYXNzZXMgdGhhdCB0aGUgQW5kcm9pZCBidWlsZCB0b29scyBnZW5lcmF0ZSB0byBhbGxvdyBhY2Nlc3MKKyAgdG8gdGhlIG5hdGl2ZSBSZW5kZXJTY3JpcHQgY29kZSBmcm9tIHRoZSBBbmRyb2lkIFZNLiBUaGlzIGxheWVyIGRlZmluZXMgZW50cnkgcG9pbnRzIGZvcgorICBSZW5kZXJTY3JpcHQgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMsIHNvIHRoYXQgeW91IGNhbiBpbnRlcmFjdCB3aXRoIHRoZW0gd2l0aCB0aGUgQW5kcm9pZAorICBmcmFtZXdvcmsuIFRoaXMgbGF5ZXIgYWxzbyBwcm92aWRlcyBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMgdGhhdCBhbGxvdyB5b3UgdG8gYWxsb2NhdGUgbWVtb3J5CisgIGZvciBwb2ludGVycyB0aGF0IGFyZSBkZWZpbmVkIGluIHlvdXIgUmVuZGVyU2NyaXB0IGNvZGUuIFRoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIG1ham9yCisgIGNvbXBvbmVudHMgdGhhdCBhcmUgcmVmbGVjdGVkOjwvcD4KKworICA8dWw+CisgICAgPGxpPkV2ZXJ5IDxjb2RlPi5yczwvY29kZT4gZmlsZSB0aGF0IHlvdSBjcmVhdGUgaXMgZ2VuZXJhdGVkIGludG8gYSBjbGFzcyBuYW1lZAorICAgIDxjb2RlPlNjcmlwdENfPGVtPnJlbmRlcnNjcmlwdF9maWxlbmFtZTwvZW0+PC9jb2RlPiBvZiB0eXBlIHtAbGluaworICAgIGFuZHJvaWQucmVuZGVyc2NyaXB0LlNjcmlwdEN9LiBUaGlzIGlzIHRoZSA8Y29kZT4uamF2YTwvY29kZT4gdmVyc2lvbiBvZiB5b3VyIDxjb2RlPi5yczwvY29kZT4KKyAgICBmaWxlLCB3aGljaCB5b3UgY2FuIGNhbGwgZnJvbSB0aGUgQW5kcm9pZCBmcmFtZXdvcmsuIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGZvbGxvd2luZworICAgIHJlZmxlY3Rpb25zOgorCisgICAgICA8dWw+CisgICAgICAgIDxsaT5Ob24tc3RhdGljIGZ1bmN0aW9ucyBpbiB5b3VyIDxjb2RlPi5yczwvY29kZT4gZmlsZS48L2xpPgorCisgICAgICAgIDxsaT5Ob24tc3RhdGljLCBnbG9iYWwgUmVuZGVyU2NyaXB0IHZhcmlhYmxlcy4gQWNjZXNzb3IgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoCisgICAgICAgIHZhcmlhYmxlLCBzbyB5b3UgY2FuIHJlYWQgYW5kIHdyaXRlIHRoZSBuYXRpdmVseSBkZWNsYXJlZCB2YXJpYWJsZXMgZnJvbSB0aGUgQW5kcm9pZAorICAgICAgICBmcmFtZXdvcmsuIFRoZSA8Y29kZT5nZXQ8L2NvZGU+IG1ldGhvZCBjb21lcyB3aXRoIGEgb25lLXdheSBjb21tdW5pY2F0aW9uIHJlc3RyaWN0aW9uLiBUaGUKKyAgICAgICAgbGFzdCB2YWx1ZSB0aGF0IGlzIHNldCBmcm9tIHRoZSBBbmRyb2lkIGZyYW1ld29yayBpcyBhbHdheXMgcmV0dXJuZWQgZHVyaW5nIGEgY2FsbCB0byBhCisgICAgICAgIDxjb2RlPmdldDwvY29kZT4gbWV0aG9kLiBJZiB0aGUgbmF0aXZlIFJlbmRlclNjcmlwdCBjb2RlIGNoYW5nZXMgdGhlIHZhbHVlLCB0aGUgY2hhbmdlIGRvZXMKKyAgICAgICAgbm90IHByb3BhZ2F0ZSBiYWNrIHRvIHRoZSBBbmRyb2lkIGZyYW1ld29yayBsYXllci4KKyAgICAgICAgSWYgdGhlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkCisgICAgICAgIGluIHRoZSBuYXRpdmUgUmVuZGVyU2NyaXB0IGNvZGUsIHRob3NlIHZhbHVlcyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHZhbHVlcyBpbiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgbGF5ZXIuIElmIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG1hcmtlZCBhcworICAgICAgICA8Y29kZT5jb25zdDwvY29kZT4sIHRoZW4gYSA8Y29kZT5zZXQ8L2NvZGU+IG1ldGhvZCBpcyBub3QgZ2VuZXJhdGVkLjwvbGk+CisgICAgICAgIDxsaT5HbG9iYWwgcG9pbnRlcnMgZ2VuZXJhdGUgYSBzcGVjaWFsIG1ldGhvZCBuYW1lZCA8Y29kZT5iaW5kXzxlbT5wb2ludGVyX25hbWU8L2VtPjwvY29kZT4KKyAgICAgICAgaW5zdGVhZCBvZiBhIDxjb2RlPnNldCgpPC9jb2RlPiBtZXRob2QuIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gYmluZCB0aGUgbWVtb3J5IHRoYXQgaXMKKyAgICAgICAgYWxsb2NhdGVkIGluIHRoZSBBbmRyb2lkIFZNIGZvciB0aGUgcG9pbnRlciB0byB0aGUgbmF0aXZlIFJlbmRlclNjcmlwdCAoeW91IGNhbm5vdCBhbGxvY2F0ZQorICAgICAgICBtZW1vcnkgaW4geW91ciA8Y29kZT4ucnM8L2NvZGU+IGZpbGUpLiBZb3UgY2FuIHJlYWQgYW5kIHdyaXRlIHRvIHRoaXMgbWVtb3J5IGZyb20gYm90aCB0aGUKKyAgICAgICAgQW5kcm9pZCBmcmFtZXdvcmsgYW5kIFJlbmRlclNjcmlwdCBjb2RlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Im1lbS1tZ210Ij5Xb3JraW5nCisgICAgICAgIHdpdGggTWVtb3J5IGFuZCBEYXRhPC9hPjwvbGk+CisgICAgICA8L3VsPgorICAgIDwvbGk+CisKKyAgICA8bGk+QSA8Y29kZT5zdHJ1Y3Q8L2NvZGU+IGlzIHJlZmxlY3RlZCBpbnRvIGl0cyBvd24gY2xhc3MgbmFtZWQKKyAgICA8Y29kZT5TY3JpcHRGaWVsZF88ZW0+c3RydWN0X25hbWU8L2VtPjwvY29kZT4sIHdoaWNoIGV4dGVuZHMge0BsaW5rCisgICAgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2NyaXB0LkZpZWxkQmFzZX0uIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhcnJheSBvZiB0aGUKKyAgICA8Y29kZT5zdHJ1Y3Q8L2NvZGU+LCB3aGljaCBhbGxvd3MgeW91IHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIHRoaXMKKyAgICA8Y29kZT5zdHJ1Y3Q8L2NvZGU+LjwvbGk+CisgIDwvdWw+CisKKyAgPGgzIGlkPSJmcmFtZXdvcmsiPkFuZHJvaWQgZnJhbWV3b3JrIGxheWVyPC9oMz4KKworICA8cD5UaGUgQW5kcm9pZCBmcmFtZXdvcmsgbGF5ZXIgY29uc2lzdHMgb2YgdGhlIHVzdWFsIEFuZHJvaWQgZnJhbWV3b3JrIEFQSXMsIHdoaWNoIGluY2x1ZGUgdGhlCisgICAgUmVuZGVyU2NyaXB0IEFQSXMgaW4ge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0fS4gVGhpcyBsYXllciBoYW5kbGVzIHRoaW5ncyBzdWNoIGFzIHRoZQorICAgIEFjdGl2aXR5IGxpZmVjeWNsZSBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbi4gSXQgaXNzdWVzIGhpZ2ggbGV2ZWwgY29tbWFuZHMgdG8KKyAgICB0aGUgbmF0aXZlIFJlbmRlclNjcmlwdCBjb2RlIHRocm91Z2ggdGhlIHJlZmxlY3RlZCBsYXllciBhbmQgcmVjZWl2ZXMgZXZlbnRzIGZyb20gdGhlIHVzZXIgc3VjaAorICAgIGFzIHRvdWNoIGFuZCBpbnB1dCBldmVudHMgYW5kIHJlbGF5cyB0aGVtIHRvIHlvdXIgUmVuZGVyU2NyaXB0IGNvZGUsIGlmIG5lZWRlZC4KKyAgPC9wPgorCisgIDxoMiBpZD0ibWVtLWFsbG9jYXRpb24iPk1lbW9yeSBBbGxvY2F0aW9uIEFQSXM8L2gyPgorCisgIDxwPkJlZm9yZSB5b3UgYmVnaW4gd3JpdGluZyB5b3VyIGZpcnN0IFJlbmRlclNjcmlwdCBhcHBsaWNhdGlvbiwgeW91IG11c3QgdW5kZXJzdGFuZCBob3cgCisgIG1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHlvdXIgUmVuZGVyU2NyaXB0IGNvZGUgYW5kIGhvdyBkYXRhIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSBuYXRpdmUgYW5kIFZNCisgIHNwYWNlcy4gUmVuZGVyU2NyaXB0IGFsbG93cyB5b3UgdG8gYWNjZXNzIGFsbG9jYXRlZCBtZW1vcnkgaW4gYm90aCB0aGUgbmF0aXZlIGxheWVyCisgIGFuZCBBbmRyb2lkIHN5c3RlbSBsYXllci4gQWxsIGR5bmFtaWMgYW5kIHN0YXRpYyBtZW1vcnkgaXMgYWxsb2NhdGVkIGJ5IHRoZSBBbmRyb2lkIFZNLgorICBUaGUgQW5kcm9pZCBWTSBhbHNvIGRvZXMgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHlvdS4gCisgIFlvdSBjYW4gYWxzbyBleHBsaWNpdGx5IGZyZWUgbWVtb3J5IHRoYXQgeW91IG5vIGxvbmdlciBuZWVkLjwvcD4KKworICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUbyBkZWNsYXJlIHRlbXBvcmFyeSBtZW1vcnkgaW4geW91ciBuYXRpdmUgUmVuZGVyU2NyaXB0CisgIGNvZGUgd2l0aG91dCBhbGxvY2F0aW5nIGl0IGluIHRoZSBBbmRyb2lkIFZNLCB5b3UgY2FuIHN0aWxsIGRvIHRoaW5ncyBsaWtlIGluc3RhbnRpYXRlIGEgc2NyYXRjaAorICBidWZmZXIgdXNpbmcgYW4gYXJyYXkuPC9wPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgY2xhc3NlcyBzdXBwb3J0IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBmZWF0dXJlcyBvZiBSZW5kZXJTY3JpcHQgaW4gdGhlIEFuZHJvaWQKKyAgVk0uIFlvdSBub3JtYWxseSBkbyBub3QgbmVlZCB0byB3b3JrIHdpdGggdGhlc2UgY2xhc3NlcyBkaXJlY3RseSwgYmVjYXVzZSB0aGUgcmVmbGVjdGVkIGxheWVyCisgIGNsYXNzZXMgcHJvdmlkZSBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMgdGhhdCBzZXQgdXAgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB5b3UuIFRoZXJlIGFyZQorICBzb21lIHNpdHVhdGlvbnMgd2hlcmUgeW91IHdvdWxkIHdhbnQgdG8gdXNlIHRoZXNlIGNsYXNzZXMgZGlyZWN0bHkgdG8gYWxsb2NhdGUgbWVtb3J5IG9uIHlvdXIKKyAgb3duLCBzdWNoIGFzIGxvYWRpbmcgYSBiaXRtYXAgZnJvbSBhIHJlc291cmNlIG9yIHdoZW4geW91IHdhbnQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwb2ludGVycyB0bworICBwcmltaXRpdmUgdHlwZXMuPC9wPgorCisgIDx0YWJsZSBpZD0ibWVtLW1nbXQtdGFibGUiPgorICAgIDx0cj4KKyAgICAgIDx0aD5BbmRyb2lkIE9iamVjdCBUeXBlPC90aD4KKworICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8L3RyPgorCisgICAgPHRyPgorICAgICAgPHRkPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50fTwvdGQ+CisKKyAgICAgIDx0ZD4KKyAgICAgICAgPHA+QW4gZWxlbWVudCByZXByZXNlbnRzIG9uZSBjZWxsIG9mIGEgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGNhbiBoYXZlIHR3byBmb3JtczogQmFzaWMgb3IKKyAgICAgICAgQ29tcGxleC48L3A+CisKKyAgICAgICAgPHA+QSBiYXNpYyBlbGVtZW50IGNvbnRhaW5zIGEgc2luZ2xlIGNvbXBvbmVudCBvZiBkYXRhIG9mIGFueSB2YWxpZCBSZW5kZXJTY3JpcHQgZGF0YSB0eXBlLgorICAgICAgICBFeGFtcGxlcyBvZiBiYXNpYyBlbGVtZW50IGRhdGEgdHlwZXMgaW5jbHVkZSBhIHNpbmdsZSBmbG9hdCB2YWx1ZSwgYSBmbG9hdDQgdmVjdG9yLCBvciBhCisgICAgICAgIHNpbmdsZSBSR0ItNTY1IGNvbG9yLjwvcD4KKworICAgICAgICA8cD5Db21wbGV4IGVsZW1lbnRzIGNvbnRhaW4gYSBsaXN0IG9mIGJhc2ljIGVsZW1lbnRzIGFuZCBhcmUgY3JlYXRlZCBmcm9tCisgICAgICAgIDxjb2RlPnN0cnVjdDwvY29kZT5zIHRoYXQgeW91IGRlY2xhcmUgaW4geW91ciBSZW5kZXJTY3JpcHQgY29kZS4gVGhlIG1vc3QgYmFzaWMgcHJpbWl0aXZlCisgICAgICAgIHR5cGUgZGV0ZXJtaW5lcyB0aGUgZGF0YSBhbGlnbm1lbnQgb2YgdGhlIG1lbW9yeS4gRm9yIGV4YW1wbGUsIGEgZmxvYXQ0IHZlY3RvciBzdWJlbGVtZW50CisgICAgICAgIGlzIGFsbGlnbmVkIHRvIDxjb2RlPnNpemVvZihmbG9hdCk8L2NvZGU+IGFuZCBub3QgPGNvZGU+c2l6ZW9mKGZsb2F0NCk8L2NvZGU+LiBUaGUgb3JkZXJpbmcKKyAgICAgICAgb2YgdGhlIGVsZW1lbnRzIGluIG1lbW9yeSBhcmUgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZCwgd2l0aCBlYWNoIGNvbXBvbmVudAorICAgICAgICBhbGlnbmVkIGFzIG5lY2Vzc2FyeS48L3A+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisKKyAgICA8dHI+CisgICAgICA8dGQ+e0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGV9PC90ZD4KKworICAgICAgPHRkPgorICAgICAgICBBIHR5cGUgaXMgYSBtZW1vcnkgYWxsb2NhdGlvbiB0ZW1wbGF0ZSBhbmQgY29uc2lzdHMgb2YgYW4gZWxlbWVudCBhbmQgb25lIG9yIG1vcmUKKyAgICAgICAgZGltZW5zaW9ucy4gSXQgZGVzY3JpYmVzIHRoZSBsYXlvdXQgb2YgdGhlIG1lbW9yeSAoYmFzaWNhbGx5IGFuIGFycmF5IG9mIHtAbGluaworICAgICAgICBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50fXMpIGJ1dCBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgZGF0YSB0aGF0IGl0CisgICAgICAgIGRlc2NyaWJlcy4KKworICAgICAgICA8cD5BIHR5cGUgY29uc2lzdHMgb2YgZml2ZSBkaW1lbnNpb25zOiBYLCBZLCBaLCBMT0QgKGxldmVsIG9mIGRldGFpbCksIGFuZCBGYWNlcyAob2YgYSBjdWJlCisgICAgICAgIG1hcCkuIFlvdSBjYW4gYXNzaWduIHRoZSBYLFksWiBkaW1lbnNpb25zIHRvIGFueSBwb3NpdGl2ZSBpbnRlZ2VyIHZhbHVlIHdpdGhpbiB0aGUKKyAgICAgICAgY29uc3RyYWludHMgb2YgYXZhaWxhYmxlIG1lbW9yeS4gQSBzaW5nbGUgZGltZW5zaW9uIGFsbG9jYXRpb24gaGFzIGFuIFggZGltZW5zaW9uIG9mCisgICAgICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIHdoaWxlIHRoZSBZIGFuZCBaIGRpbWVuc2lvbnMgYXJlIHplcm8gdG8gaW5kaWNhdGUgbm90IHByZXNlbnQuIEZvcgorICAgICAgICBleGFtcGxlLCBhbiBhbGxvY2F0aW9uIG9mIHg9MTAsIHk9MSBpcyBjb25zaWRlcmVkIHR3byBkaW1lbnNpb25hbCBhbmQgeD0xMCwgeT0wIGlzCisgICAgICAgIGNvbnNpZGVyZWQgb25lIGRpbWVuc2lvbmFsLiBUaGUgTE9EIGFuZCBGYWNlcyBkaW1lbnNpb25zIGFyZSBib29sZWFucyB0byBpbmRpY2F0ZSBwcmVzZW50CisgICAgICAgIG9yIG5vdCBwcmVzZW50LjwvcD4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKworICAgIDx0cj4KKyAgICAgIDx0ZD57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbn08L3RkPgorCisgICAgICA8dGQ+CisgICAgICAgIDxwPkFuIGFsbG9jYXRpb24gcHJvdmlkZXMgdGhlIG1lbW9yeSBmb3IgYXBwbGljYXRpb25zIGJhc2VkIG9uIGEgZGVzY3JpcHRpb24gb2YgdGhlIG1lbW9yeQorICAgICAgICB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IGEge0BsaW5rIGFuZHJvaWQucmVuZGVyc2NyaXB0LlR5cGV9LiBBbGxvY2F0ZWQgbWVtb3J5IGNhbiBleGlzdCBpbgorICAgICAgICBtYW55IG1lbW9yeSBzcGFjZXMgY29uY3VycmVudGx5LiBJZiBtZW1vcnkgaXMgbW9kaWZpZWQgaW4gb25lIHNwYWNlLCB5b3UgbXVzdCBleHBsaWNpdGx5CisgICAgICAgIHN5bmNocm9uaXplIHRoZSBtZW1vcnksIHNvIHRoYXQgaXQgaXMgdXBkYXRlZCBpbiBhbGwgdGhlIG90aGVyIHNwYWNlcyB0aGF0IGl0IGV4aXN0cworICAgICAgICBpbi48L3A+CisKKyAgICAgICAgPHA+QWxsb2NhdGlvbiBkYXRhIGlzIHVwbG9hZGVkIGluIG9uZSBvZiB0d28gcHJpbWFyeSB3YXlzOiB0eXBlIGNoZWNrZWQgYW5kIHR5cGUgdW5jaGVja2VkLgorICAgICAgICBGb3Igc2ltcGxlIGFycmF5cyB0aGVyZSBhcmUgPGNvZGU+Y29weUZyb20oKTwvY29kZT4gZnVuY3Rpb25zIHRoYXQgdGFrZSBhbiBhcnJheSBmcm9tIHRoZQorICAgICAgICBBbmRyb2lkIHN5c3RlbSBhbmQgY29weSBpdCB0byB0aGUgbmF0aXZlIGxheWVyIG1lbW9yeSBzdG9yZS4gVGhlIHVuY2hlY2tlZCB2YXJpYW50cyBhbGxvdworICAgICAgICB0aGUgQW5kcm9pZCBzeXN0ZW0gdG8gY29weSBvdmVyIGFycmF5cyBvZiBzdHJ1Y3R1cmVzIGJlY2F1c2UgaXQgZG9lcyBub3Qgc3VwcG9ydAorICAgICAgICBzdHJ1Y3R1cmVzLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gYWxsb2NhdGlvbiB0aGF0IGlzIGFuIGFycmF5IG9mIG4gZmxvYXRzLCB0aGUgZGF0YQorICAgICAgICBjb250YWluZWQgaW4gYSBmbG9hdFtuXSBhcnJheSBvciBhIGJ5dGVbbio0XSBhcnJheSBjYW4gYmUgY29waWVkLjwvcD4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90YWJsZT4KKworICA8aDIgaWQ9ImR5bmFtaWMiPldvcmtpbmcgd2l0aCBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uczwvaDI+CisKKyAgPHA+UmVuZGVyU2NyaXB0IGhhcyBzdXBwb3J0IGZvciBwb2ludGVycywgYnV0IHlvdSBtdXN0IGFsbG9jYXRlIHRoZSBtZW1vcnkgaW4geW91ciBBbmRyb2lkIGZyYW1ld29yaworICBjb2RlLiBXaGVuIHlvdSBkZWNsYXJlIGEgZ2xvYmFsIHBvaW50ZXIgaW4geW91ciA8Y29kZT4ucnM8L2NvZGU+IGZpbGUsIHlvdSBhbGxvY2F0ZSBtZW1vcnkKKyAgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgcmVmbGVjdGVkIGxheWVyIGNsYXNzIGFuZCBiaW5kIHRoYXQgbWVtb3J5IHRvIHRoZSBuYXRpdmUKKyAgUmVuZGVyU2NyaXB0IGxheWVyLiBZb3UgY2FuIHJlYWQgYW5kIHdyaXRlIHRvIHRoaXMgbWVtb3J5IGZyb20gdGhlIEFuZHJvaWQgZnJhbWV3b3JrIGxheWVyIGFzIHdlbGwgYXMgdGhlCisgIFJlbmRlclNjcmlwdCBsYXllciwgd2hpY2ggb2ZmZXJzIHlvdSB0aGUgZmxleGliaWxpdHkgdG8gbW9kaWZ5IHZhcmlhYmxlcyBpbiB0aGUgbW9zdCBhcHByb3ByaWF0ZQorICBsYXllci4gVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBzaG93IHlvdSBob3cgdG8gd29yayB3aXRoIHBvaW50ZXJzLCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZW0sIGFuZAorICByZWFkIGFuZCB3cml0ZSB0byB0aGUgbWVtb3J5LjwvcD4KKworICA8aDMgaWQ9InBvaW50ZXJzIj5EZWNsYXJpbmcgcG9pbnRlcnM8L2gzPgorCisgIDxwPkJlY2F1c2UgUmVuZGVyU2NyaXB0IGlzIHdyaXR0ZW4gaW4gQzk5LCBkZWNsYXJpbmcgYSBwb2ludGVyIGlzIGRvbmUgaW4gYSBmYW1pbGlhciB3YXkuIFlvdSBjYW4KKyAgZGVjbGFyZSBwb2ludGVycyB0byBhIDxjb2RlPnN0cnVjdDwvY29kZT4gb3IgYSBwcmltaXRpdmUgdHlwZSwgYnV0IGEgPGNvZGU+c3RydWN0PC9jb2RlPiBjYW5ub3QKKyAgY29udGFpbiBwb2ludGVycyBvciBuZXN0ZWQgYXJyYXlzLiBUaGUgZm9sbG93aW5nIGNvZGUgZGVjbGFyZXMgYSA8Y29kZT5zdHJ1Y3Q8L2NvZGU+LCBhIHBvaW50ZXIKKyAgdG8gdGhhdCA8Y29kZT5zdHJ1Y3Q8L2NvZGU+LCBhbmQgYSBwb2ludGVyIG9mIHByaW1pdGl2ZSB0eXBlIDxjb2RlPmludDMyX3Q8L2NvZGU+IGluIGFuIDxjb2RlPi5yczwvY29kZT4gZmlsZTo8L3A+CisgIDxwcmU+CisjcHJhZ21hIHZlcnNpb24oMSkKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmV4YW1wbGUucmVuZGVyc2NyaXB0KQorCisuLi4KKwordHlwZWRlZiBzdHJ1Y3QgUG9pbnQgeworICAgICAgZmxvYXQyIHBvaW50OworICB9IFBvaW50X3Q7CisKKyAgUG9pbnRfdCAqdG91Y2hQb2ludHM7CisgIGludDMyX3QgKmludFBvaW50ZXI7CisKKy4uLgorPC9wcmU+CisKKzxwPllvdSBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGVzZSBwb2ludGVycyBpbiB5b3VyIFJlbmRlclNjcmlwdCBjb2RlLCBidXQgdGhlIEFuZHJvaWQKK2J1aWxkIHRvb2xzIGdlbmVyYXRlIGNsYXNzZXMgZm9yIHlvdSB0aGF0IGFsbG93IHlvdSB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gdGhlIEFuZHJvaWQgVk0gZm9yIHVzZSBieQoreW91ciBSZW5kZXJTY3JpcHQgY29kZS4gVGhlc2UgY2xhc3NlcyBhbHNvIGxldCB5b3UgcmVhZCBhbmQgd3JpdGUgdG8gdGhlIG1lbW9yeS4gVGhlIG5leHQgc2VjdGlvbgorZGVzY3JpYmVzIGhvdyB0aGVzZSBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgdGhyb3VnaCByZWZsZWN0aW9uLjwvcD4KKworICA8aDM+SG93IHBvaW50ZXJzIGFyZSByZWZsZWN0ZWQ8L2gzPgorCisgIDxwPkdsb2JhbCB2YXJpYWJsZXMgaGF2ZSBhIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZCBnZW5lcmF0ZWQuIEEgZ2xvYmFsIHBvaW50ZXIgZ2VuZXJhdGVzIGEKKyAgPGNvZGU+YmluZF9wb2ludGVyTmFtZSgpPC9jb2RlPiBtZXRob2QgaW5zdGVhZCBvZiBhIHNldCgpIG1ldGhvZC4gVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBiaW5kCisgIHRoZSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgaW4gdGhlIEFuZHJvaWQgVk0gdG8gdGhlIG5hdGl2ZSBSZW5kZXJTY3JpcHQuIEZvciBleGFtcGxlLCB0aGUgdHdvCisgIHBvaW50ZXJzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgYWNjZXNzb3IgbWV0aG9kcyBpbiB0aGUgPGNvZGU+U2NyaXB0Q188ZW0+cnNfZmlsZW5hbWU8L2VtPjwvY29kZT4gZmlsZTo8L3A+CisgIDxwcmU+CisKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX1BvaW50IG1FeHBvcnRWYXJfdG91Y2hQb2ludHM7CisgICAgcHVibGljIHZvaWQgYmluZF90b3VjaFBvaW50cyhTY3JpcHRGaWVsZF9Qb2ludCB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfdG91Y2hQb2ludHMgPSB2OworICAgICAgICBpZiAodiA9PSBudWxsKSBiaW5kQWxsb2NhdGlvbihudWxsLCBtRXhwb3J0VmFySWR4X3RvdWNoUG9pbnRzKTsKKyAgICAgICAgZWxzZSBiaW5kQWxsb2NhdGlvbih2LmdldEFsbG9jYXRpb24oKSwgbUV4cG9ydFZhcklkeF90b3VjaFBvaW50cyk7CisgICAgfQorCisgICAgcHVibGljIFNjcmlwdEZpZWxkX1BvaW50IGdldF90b3VjaFBvaW50cygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfdG91Y2hQb2ludHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1FeHBvcnRWYXJfaW50UG9pbnRlcjsKKyAgICBwdWJsaWMgdm9pZCBiaW5kX2ludFBvaW50ZXIoQWxsb2NhdGlvbiB2KSB7CisgICAgICAgIG1FeHBvcnRWYXJfaW50UG9pbnRlciA9IHY7CisgICAgICAgIGlmICh2ID09IG51bGwpIGJpbmRBbGxvY2F0aW9uKG51bGwsIG1FeHBvcnRWYXJJZHhfaW50UG9pbnRlcik7CisgICAgICAgIGVsc2UgYmluZEFsbG9jYXRpb24odiwgbUV4cG9ydFZhcklkeF9pbnRQb2ludGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWxsb2NhdGlvbiBnZXRfaW50UG9pbnRlcigpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfaW50UG9pbnRlcjsKKyAgICB9CisKKzwvcHJlPgorCisgIDxoMz5BbGxvY2F0aW5nIGFuZCBiaW5kaW5nIG1lbW9yeSB0byB0aGUgUmVuZGVyU2NyaXB0PC9oMz4KKworICA8cD5XaGVuIHRoZSBidWlsZCB0b29scyBnZW5lcmF0ZSB0aGUgcmVmbGVjdGVkIGxheWVyLCB5b3UgY2FuIHVzZSB0aGUgYXBwcm9wcmlhdGUgY2xhc3MKKyAgKDxjb2RlPlNjcmlwdEZpZWxkX1BvaW50PC9jb2RlPiwgaW4gb3VyIGV4YW1wbGUpIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYSBwb2ludGVyLiBUbyBkbyB0aGlzLAorICB5b3UgY2FsbCB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB7QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2NyaXB0LkZpZWxkQmFzZX0gY2xhc3MgYW5kIHNwZWNpZnkKKyAgdGhlIGFtb3VudCBvZiBzdHJ1Y3R1cmVzIHRoYXQgeW91IHdhbnQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvci4gVG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhIHByaW1pdGl2ZQorICB0eXBlIHBvaW50ZXIsIHlvdSBtdXN0IGJ1aWxkIGFuIGFsbG9jYXRpb24gbWFudWFsbHksIHVzaW5nIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBjbGFzc2VzCisgIGRlc2NyaWJlZCBpbiA8YSBocmVmPSJtZW0tbWdtdC10YWJsZSI+VGFibGUgMTwvYT4uIFRoZSBleGFtcGxlIGJlbG93IGFsbG9jYXRlcyBtZW1vcnkgZm9yIGJvdGgKKyAgdGhlIDxjb2RlPmludFBvaW50ZXI8L2NvZGU+IGFuZCA8Y29kZT50b3VjaFBvaW50czwvY29kZT4gcG9pbnRlciBhbmQgYmluZHMgaXQgdG8gdGhlCisgIFJlbmRlclNjcmlwdDo8L3A+CisgIDxwcmU+Citwcml2YXRlIFJlbmRlclNjcmlwdEdMIGdsUmVuZGVyZXI7Citwcml2YXRlIFNjcmlwdENfZXhhbXBsZSBzY3JpcHQ7Citwcml2YXRlIFJlc291cmNlcyByZXNvdXJjZXM7CisKK3B1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMpIHsKKyAgIC8vZ2V0IHRoZSByZW5kZXJpbmcgY29udGV4dCBhbmQgcmVzb3VyY2VzIGZyb20gdGhlIGNhbGxpbmcgbWV0aG9kCisgICBnbFJlbmRlcmVyID0gcnM7IAorICAgcmVzb3VyY2VzID0gcmVzOyAKKyAgIAorICAgLy9hbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzdHJ1Y3QgcG9pbnRlciwgY2FsbGluZyB0aGUgY29uc3RydWN0b3IKKyAgICBTY3JpcHRGaWVsZF9Qb2ludCB0b3VjaFBvaW50cyA9IG5ldyBTY3JpcHRGaWVsZF9Qb2ludChnbFJlbmRlcmVyLCAyKTsgCisgICAgCisgICAvL0NyZWF0ZSBhbiBlbGVtZW50IG1hbnVhbGx5IGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpbnQgcG9pbnRlciAKKyAgICBpbnRQb2ludGVyID0gQWxsb2NhdGlvbi5jcmVhdGVTaXplZChnbFJlbmRlcmVyLCBFbGVtZW50LkkzMihnbFJlbmRlcmVyKSwgMik7IAorICAgIAorICAgIC8vY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBSZW5kZXJTY3JpcHQsIHBvaW50aW5nIGl0IHRvIHRoZSBieXRlY29kZSByZXNvdXJjZQorICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19leGFtcGxlKGdsUmVuZGVyZXIsIHJlc291cmNlcywgUi5yYXcuZXhhbXBsZSk7IAorICAgIAorICAgIC8vIGJpbmQgdGhlIHN0cnVjdCBhbmQgaW50IHBvaW50ZXJzIHRvIHRoZSBSZW5kZXJTY3JpcHQKKyAgICBtU2NyaXB0LmJpbmRfdG91Y2hQb2ludHModG91Y2hQb2ludHMpOyAKKyAgICBzY3JpcHQuYmluZF9pbnRQb2ludGVyKGludFBvaW50ZXIpOworICAgIAorICAgIC8vYmluZCB0aGUgUmVuZGVyU2NyaXB0IHRvIHRoZSByZW5kZXJpbmcgY29udGV4dAorICAgIGdsUmVuZGVyZXIuYmluZFJvb3RTY3JpcHQoc2NyaXB0KTsKK30KKzwvcHJlPgorCisgIDxoMz5SZWFkaW5nIGFuZCB3cml0aW5nIHRvIG1lbW9yeTwvaDM+CisKKyAgPHA+QWx0aG91Z2ggeW91IGhhdmUgdG8gYWxsb2NhdGUgbWVtb3J5IHdpdGhpbiB0aGUgQW5kcm9pZCBWTSwgeW91IGNhbiB3b3JrIHdpdGggdGhlIG1lbW9yeSBib3RoCisgIGluIHlvdXIgbmF0aXZlIFJlbmRlclNjcmlwdCBjb2RlIGFuZCBpbiB5b3VyIEFuZHJvaWQgY29kZS4gT25jZSBtZW1vcnkgaXMgYm91bmQsIHRoZSBuYXRpdmUKKyAgUmVuZGVyU2NyaXB0IGNhbiByZWFkIGFuZCB3cml0ZSB0byB0aGUgbWVtb3J5IGRpcmVjdGx5LiBZb3UgY2FuIGFsc28ganVzdCB1c2UgdGhlIGFjY2Vzc29yCisgIG1ldGhvZHMgaW4gdGhlIHJlZmxlY3RlZCBjbGFzc2VzIHRvIGFjY2VzcyB0aGUgbWVtb3J5LiBJZiB5b3UgbW9kaWZ5IG1lbW9yeSBpbiB0aGUgQW5kcm9pZAorICBmcmFtZXdvcmssIGl0IGdldHMgYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZWQgdG8gdGhlIG5hdGl2ZSBsYXllci4gSWYgeW91IG1vZGlmeSBtZW1vcnkgaW4gdGhlIDxjb2RlPi5yczwvY29kZT4KKyAgZmlsZSwgdGhlc2UgY2hhbmdlcyBkbyBub3QgZ2V0IHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgQW5kcm9pZCBmcmFtZXdvcmsuCisgIEZvciBleGFtcGxlLCB5b3UgY2FuIG1vZGlmeSB0aGUgc3RydWN0IGluIHlvdXIgQW5kcm9pZCBjb2RlIGxpa2UgdGhpczo8L3A+CisgIDxwcmU+CitpbnQgaW5kZXggPSAwOworYm9vbGVhbiBjb3B5Tm93ID0gdHJ1ZTsKK0Zsb2F0MiBwb2ludCA9IG5ldyBGbG9hdDIoMC4wZiwgMC4wZik7Cit0b3VjaFBvaW50cy5zZXRfcG9pbnQoaW5kZXgsIHBvaW50LCBjb3B5Tm93KTsKKzwvcHJlPnRoZW4gcmVhZCBpdCBpbiB5b3VyIG5hdGl2ZSBSZW5kZXJTY3JpcHQgY29kZSBsaWtlIHRoaXM6CisgIDxwcmU+Cityc0RlYnVnKCJQcmludGluZyBvdXQgYSBQb2ludCIsIHRvdWNoUG9pbnRzWzBdLnBvaW50LngsIHRvdWNoUG9pbnRzWzBdLnBvaW50LnkpOworPC9wcmU+CisKKyAgPGgyPldvcmtpbmcgd2l0aCBzdGF0aWNhbGx5IGFsbG9jYXRlZCBtZW1vcnk8L2gyPgorCisgIDxwPk5vbi1zdGF0aWMsIGdsb2JhbCBwcmltaXRpdmVzIGFuZCBzdHJ1Y3RzIHRoYXQgeW91IGRlY2xhcmUgaW4geW91ciBSZW5kZXJTY3JpcHQgYXJlIGVhc2llciB0byB3b3JrIHdpdGgsCisgIGJlY2F1c2UgdGhlIG1lbW9yeSBpcyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhdCBjb21waWxlIHRpbWUuIEFjY2Vzc29yIG1ldGhvZHMgdG8gc2V0IGFuZCBnZXQgdGhlc2UKKyAgdmFyaWFibGVzIGFyZSBnZW5lcmF0ZWQgd2hlbiB0aGUgQW5kcm9pZCBidWlsZCB0b29scyBnZW5lcmF0ZSB0aGUgcmVmbGVjdGVkIGxheWVyIGNsYXNzZXMuIFlvdQorICBjYW4gZ2V0IGFuZCBzZXQgdGhlc2UgdmFyaWFibGVzIHVzaW5nIHRoZSBwcm92aWRlZCBhY2Nlc3NvciBtZXRob2RzLgorIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSA8Y29kZT5nZXQ8L2NvZGU+IG1ldGhvZCBjb21lcyB3aXRoIGEgb25lLXdheSBjb21tdW5pY2F0aW9uIHJlc3RyaWN0aW9uLiBUaGUgbGFzdCB2YWx1ZQorICB0aGF0IGlzIHNldCBmcm9tIHRoZSBBbmRyb2lkIGZyYW1ld29yayBpcyBhbHdheXMgcmV0dXJuZWQgZHVyaW5nIGEgY2FsbCB0byBhIDxjb2RlPmdldDwvY29kZT4KKyAgbWV0aG9kLiBJZiB0aGUgbmF0aXZlIFJlbmRlclNjcmlwdCBjb2RlIGNoYW5nZXMgdGhlIHZhbHVlLCB0aGUgY2hhbmdlIGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvCisgIHRoZSBBbmRyb2lkIGZyYW1ld29yayBsYXllci4gSWYgdGhlIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIGluIHRoZSBuYXRpdmUgUmVuZGVyU2NyaXB0CisgIGNvZGUsIHRob3NlIHZhbHVlcyBhcmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGUgQW5kcm9pZCBmcmFtZXdvcmsKKyAgbGF5ZXIuIElmIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG1hcmtlZCBhcyA8Y29kZT5jb25zdDwvY29kZT4sIHRoZW4gYSA8Y29kZT5zZXQ8L2NvZGU+IG1ldGhvZCBpcworICBub3QgZ2VuZXJhdGVkLjwvcD4KKyAgPC9wPgorCisgIDxwPkZvciBleGFtcGxlLCBpZiB5b3UgZGVjbGFyZSB0aGUgZm9sbG93aW5nIHByaW1pdGl2ZSBpbiB5b3VyIFJlbmRlclNjcmlwdCBjb2RlOjwvcD4KKyAgPHByZT4KKyAgdWludDMyX3QgdW5zaWduZWRJbnRlZ2VyID0gMTsKKyAgCis8L3ByZT4KKzxwPnRoZW4gdGhlIGZvbGxvd2luZyBjb2RlIGlzIGdlbmVyYXRlZCBpbiA8Y29kZT5TY3JpcHRDXzxlbT5zY3JpcHRfbmFtZTwvZW0+LmphdmE8L2NvZGU+OjwvcD4KKyAgPHByZT4KKyBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgbUV4cG9ydFZhcklkeF91bnNpZ25lZEludGVnZXIgPSA5OworICAgIHByaXZhdGUgbG9uZyBtRXhwb3J0VmFyX3Vuc2lnbmVkSW50ZWdlcjsKKyAgICBwdWJsaWMgdm9pZCBzZXRfdW5zaWduZWRJbnRlZ2VyKGxvbmcgdikgeworICAgICAgICBtRXhwb3J0VmFyX3Vuc2lnbmVkSW50ZWdlciA9IHY7CisgICAgICAgIHNldFZhcihtRXhwb3J0VmFySWR4X3Vuc2lnbmVkSW50ZWdlciwgdik7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0X3Vuc2lnbmVkSW50ZWdlcigpIHsKKyAgICAgICAgcmV0dXJuIG1FeHBvcnRWYXJfdW5zaWduZWRJbnRlZ2VyOworICAgIH0KKzwvcHJlPgorCisgIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBtRXhwb3J0VmFySWR4X3Vuc2lnbmVkSW50ZWdlciB2YXJpYWJsZSByZXByZXNlbnRzIHRoZQorICBpbmRleCBvZiB0aGUgPGNvZGU+dW5zaWduZWRJbnRlZ2VyPC9jb2RlPidzIGluIGFuIGFycmF5IG9mIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHByaW1pdGl2ZXMuIFlvdSBkbworICBub3QgbmVlZCB0byB3b3JrIHdpdGggb3IgYmUgYXdhcmUgb2YgdGhpcyBpbmRleC48L3A+CisgIAorICA8cD5Gb3IgYSA8Y29kZT5zdHJ1Y3Q8L2NvZGU+LCB0aGUgQW5kcm9pZCBidWlsZCB0b29scyBnZW5lcmF0ZSBhIGNsYXNzIG5hbWVkCisgIDxjb2RlPiZsdDtwcm9qZWN0X3Jvb3QmZ3Q7L2dlbi9jb20vZXhhbXBsZS9yZW5kZXJzY3JpcHQvU2NyaXB0RmllbGRfc3RydWN0X25hbWU8L2NvZGU+LiBUaGlzCisgIGNsYXNzIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdGhlIDxjb2RlPnN0cnVjdDwvY29kZT4gYW5kIGFsbG93cyB5b3UgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhCisgIHNwZWNpZmllZCBudW1iZXIgb2YgPGNvZGU+c3RydWN0PC9jb2RlPnMuIFRoaXMgY2xhc3MgZGVmaW5lczo8L3A+CisKKyAgPHVsPgorICAgIDxsaT5PdmVybG9hZGVkIGNvbnN0cnVjdG9ycyB0aGF0IGFsbG93IHlvdSB0byBhbGxvY2F0ZSBtZW1vcnkuIFRoZQorICAgIDxjb2RlPlNjcmlwdEZpZWxkXzxlbT5zdHJ1Y3RfbmFtZTwvZW0+KFJlbmRlclNjcmlwdCBycywgaW50IGNvdW50KTwvY29kZT4gY29uc3RydWN0b3IgYWxsb3dzCisgICAgeW91IHRvIGRlZmluZSB0aGUgbnVtYmVyIG9mIHN0cnVjdHVyZXMgdGhhdCB5b3Ugd2FudCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdpdGggdGhlCisgICAgPGNvZGU+Y291bnQ8L2NvZGU+IHBhcmFtZXRlci4gVGhlIDxjb2RlPlNjcmlwdEZpZWxkXzxlbT5zdHJ1Y3RfbmFtZTwvZW0+KFJlbmRlclNjcmlwdCBycywgaW50CisgICAgY291bnQsIGludCB1c2FnZXMpPC9jb2RlPiBjb25zdHJ1Y3RvciBkZWZpbmVzIGFuIGV4dHJhIHBhcmFtZXRlciwgPGNvZGU+dXNhZ2VzPC9jb2RlPiwgdGhhdAorICAgIGxldHMgeW91IHNwZWNpZnkgdGhlIG1lbW9yeSBzcGFjZSBvZiB0aGlzIG1lbW9yeSBhbGxvY2F0aW9uLiBUaGVyZSBhcmUgZm91ciBtZW1vcnkgc3BhY2UKKyAgICBwb3NzaWJpbGl0aWVzOgorCisgICAgICA8dWw+CisgICAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbiNVU0FHRV9TQ1JJUFR9OiBBbGxvY2F0ZXMgaW4gdGhlIHNjcmlwdCBtZW1vcnkKKyAgICAgICAgc3BhY2UuIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IHNwYWNlIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIG1lbW9yeSBzcGFjZS48L2xpPgorCisgICAgICAgIDxsaT57QGxpbmsgYW5kcm9pZC5yZW5kZXJzY3JpcHQuQWxsb2NhdGlvbiNVU0FHRV9HUkFQSElDU19URVhUVVJFfTogQWxsb2NhdGVzIGluIHRoZQorICAgICAgICB0ZXh0dXJlIG1lbW9yeSBzcGFjZSBvZiB0aGUgR1BVLjwvbGk+CisKKyAgICAgICAgPGxpPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uI1VTQUdFX0dSQVBISUNTX1ZFUlRFWH06IEFsbG9jYXRlcyBpbiB0aGUgdmVydGV4CisgICAgICAgIG1lbW9yeSBzcGFjZSBvZiB0aGUgR1BVLjwvbGk+CisKKyAgICAgICAgPGxpPntAbGluayBhbmRyb2lkLnJlbmRlcnNjcmlwdC5BbGxvY2F0aW9uI1VTQUdFX0dSQVBISUNTX0NPTlNUQU5UU306IEFsbG9jYXRlcyBpbiB0aGUKKyAgICAgICAgY29uc3RhbnRzIG1lbW9yeSBzcGFjZSBvZiB0aGUgR1BVIHRoYXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBwcm9ncmFtIG9iamVjdHMuPC9saT4KKyAgICAgIDwvdWw+CisKKyAgICAgIDxwPllvdSBjYW4gc3BlY2lmeSBvbmUgb3IgYWxsIG9mIHRoZXNlIG1lbW9yeSBzcGFjZXMgYnkgT1InaW5nIHRoZW0gdG9nZXRoZXIuIERvaW5nIHNvIG5vdGlmaWVzCisgICAgICB0aGUgUmVuZGVyU2NyaXB0IHJ1bnRpbWUgdGhhdCB5b3UgaW50ZW5kIG9uIGFjY2Vzc2luZyB0aGUgZGF0YSBpbiB0aGUgc3BlY2lmaWVkIG1lbW9yeSBzcGFjZXMuIFRoZSBmb2xsb3dpbmcKKyAgICAgIGV4YW1wbGUgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBjdXN0b20gZGF0YSB0eXBlIGluIGJvdGggdGhlIHNjcmlwdCBhbmQgdmVydGV4IG1lbW9yeSBzcGFjZXM6PC9wPgorPHByZT4KK1NjcmlwdEZpZWxkX1BvaW50IHRvdWNoUG9pbnRzID0gbmV3IFNjcmlwdEZpZWxkX1BvaW50KGdsUmVuZGVyZXIsIDIsCitBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCB8IEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfVkVSVEVYKTsKKzwvcHJlPgorCisgICAgICA8cD5JZiB5b3UgbW9kaWZ5IHRoZSBtZW1vcnkgaW4gb25lIG1lbW9yeSBzcGFjZSBhbmQgd2FudCB0byBwdXNoIHRoZSB1cGRhdGVzIHRvIHRoZSByZXN0IG9mCisgICAgICB0aGUgbWVtb3J5IHNwYWNlcywgY2FsbCA8Y29kZT5yc2dBbGxvY2F0aW9uU3luY0FsbCgpPC9jb2RlPiBpbiB5b3VyIFJlbmRlclNjcmlwdCBjb2RlIHRvCisgICAgICBzeW5jaHJvbml6ZSB0aGUgbWVtb3J5LjwvcD4KKyAgICA8L2xpPgorCisgICAgPGxpPkEgc3RhdGljIG5lc3RlZCBjbGFzcywgPGNvZGU+SXRlbTwvY29kZT4sIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZQorICAgIDxjb2RlPnN0cnVjdDwvY29kZT4sIGluIHRoZSBmb3JtIG9mIGFuIG9iamVjdC4gVGhpcyBpcyB1c2VmdWwgaWYgaXQgbWFrZXMgbW9yZSBzZW5zZSB0byB3b3JrCisgICAgd2l0aCB0aGUgPGNvZGU+c3RydWN0PC9jb2RlPiBpbiB5b3VyIEFuZHJvaWQgY29kZS4gV2hlbiB5b3UgYXJlIGRvbmUgbWFuaXB1bGF0aW5nIHRoZSBvYmplY3QsCisgICAgeW91IGNhbiBwdXNoIHRoZSBvYmplY3QgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkgYnkgY2FsbGluZyA8Y29kZT5zZXQoSXRlbSBpLCBpbnQgaW5kZXgsIGJvb2xlYW4KKyAgICBjb3B5Tm93KTwvY29kZT4gYW5kIHNldHRpbmcgdGhlIDxjb2RlPkl0ZW08L2NvZGU+IHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uIGluIHRoZSBhcnJheS4gVGhlCisgICAgbmF0aXZlIFJlbmRlclNjcmlwdCBjb2RlIGF1dG9tYXRpY2FsbHkgaGFzIGFjY2VzcyB0byB0aGUgbmV3bHkgd3JpdHRlbiBtZW1vcnkuCisKKyAgICA8bGk+QWNjZXNzb3IgbWV0aG9kcyB0byBnZXQgYW5kIHNldCB0aGUgdmFsdWVzIG9mIGVhY2ggZmllbGQgaW4gYSBzdHJ1Y3QuIEVhY2ggb2YgdGhlc2UKKyAgICBhY2Nlc3NvciBtZXRob2RzIGhhdmUgYW4gPGNvZGU+aW5kZXg8L2NvZGU+IHBhcmFtZXRlciB0byBzcGVjaWZ5IHRoZSA8Y29kZT5zdHJ1Y3Q8L2NvZGU+IGluIHRoZQorICAgIGFycmF5IHRoYXQgeW91IHdhbnQgdG8gcmVhZCBvciB3cml0ZSB0by4gRWFjaCBzZXR0ZXIgbWV0aG9kIGFsc28gaGFzIGEgPGNvZGU+Y29weU5vdzwvY29kZT4KKyAgICBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gaW1tZWRpYXRlbHkgc3luYyB0aGlzIG1lbW9yeSB0byB0aGUgbmF0aXZlCisgICAgUmVuZGVyU2NyaXB0IGxheWVyLiBUbyBzeW5jIGFueSBtZW1vcnkgdGhhdCBoYXMgbm90IGJlZW4gc3luY2VkLCBjYWxsIDxjb2RlPmNvcHlBbGwoKTwvY29kZT4uPC9saT4KKworICAgIDxsaT5UaGUgY3JlYXRlRWxlbWVudCgpIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyB0aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgc3RydWN0LjwvbGk+CisKKyAgICA8bGk+cmVzaXplKCkgd29ya3MgbXVjaCBsaWtlIGEgPGNvZGU+cmVhbGxvYzwvY29kZT4sIGFsbG93aW5nIHlvdSB0byBleHBhbmQgcHJldmlvdXNseQorICAgIGFsbG9jYXRlZCBtZW1vcnksIG1haW50YWluaW5nIHRoZSBjdXJyZW50IHZhbHVlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBzZXQuPC9saT4KKworICAgIDxsaT5jb3B5QWxsKCkgc3luY2hyb25pemVzIG1lbW9yeSB0aGF0IHdhcyBzZXQgb24gdGhlIGZyYW1ld29yayBsZXZlbCB0byB0aGUgbmF0aXZlIGxldmVsLiBXaGVuIHlvdSBjYWxsCisgICAgYSBzZXQgYWNjZXNzb3IgbWV0aG9kIG9uIGEgbWVtYmVyLCB0aGVyZSBpcyBhbiBvcHRpb25hbCA8Y29kZT5jb3B5Tm93PC9jb2RlPiBib29sZWFuIHBhcmFtZXRlciB0aGF0IHlvdSBjYW4gc3BlY2lmeS4gU3BlY2lmeWluZworICAgIDxjb2RlPnRydWU8L2NvZGU+IHN5bmNocm9uaXplcyB0aGUgbWVtb3J5IHdoZW4geW91IGNhbGwgdGhlIG1ldGhvZC4gSWYgeW91IHNwZWNpZnkgZmFsc2UsIHlvdSBjYW4gY2FsbCA8Y29kZT5jb3B5QWxsKCk8L2NvZGU+CisgICAgb25jZSwgYW5kIGl0IHN5bmNocm9uaXplcyBtZW1vcnkgZm9yIHRoZSBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHN5bmNocm9uaXplZC48L2xpPgorICA8L3VsPgorCisgIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgcmVmbGVjdGVkIGNsYXNzLCA8Y29kZT5TY3JpcHRGaWVsZF9Qb2ludC5qYXZhPC9jb2RlPiB0aGF0IGlzCisgIGdlbmVyYXRlZCBmcm9tIHRoZSBQb2ludCA8Y29kZT5zdHJ1Y3Q8L2NvZGU+LjwvcD4KKyAgPHByZT4KK3BhY2thZ2UgY29tLmV4YW1wbGUucmVuZGVyc2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKKworCitwdWJsaWMgY2xhc3MgU2NyaXB0RmllbGRfUG9pbnQgZXh0ZW5kcyBhbmRyb2lkLnJlbmRlcnNjcmlwdC5TY3JpcHQuRmllbGRCYXNlIHsKKyAgICBzdGF0aWMgcHVibGljIGNsYXNzIEl0ZW0geworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBzaXplb2YgPSA4OworCisgICAgICAgIEZsb2F0MiBwb2ludDsKKworICAgICAgICBJdGVtKCkgeworICAgICAgICAgICAgcG9pbnQgPSBuZXcgRmxvYXQyKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgSXRlbSBtSXRlbUFycmF5W107CisgICAgcHJpdmF0ZSBGaWVsZFBhY2tlciBtSU9CdWZmZXI7CisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoUmVuZGVyU2NyaXB0IHJzKSB7CisgICAgICAgIEVsZW1lbnQuQnVpbGRlciBlYiA9IG5ldyBFbGVtZW50LkJ1aWxkZXIocnMpOworICAgICAgICBlYi5hZGQoRWxlbWVudC5GMzJfMihycyksICJwb2ludCIpOworICAgICAgICByZXR1cm4gZWIuY3JlYXRlKCk7CisgICAgfQorCisgICAgcHVibGljICBTY3JpcHRGaWVsZF9Qb2ludChSZW5kZXJTY3JpcHQgcnMsIGludCBjb3VudCkgeworICAgICAgICBtSXRlbUFycmF5ID0gbnVsbDsKKyAgICAgICAgbUlPQnVmZmVyID0gbnVsbDsKKyAgICAgICAgbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHJzKTsKKyAgICAgICAgaW5pdChycywgY291bnQpOworICAgIH0KKworICAgIHB1YmxpYyAgU2NyaXB0RmllbGRfUG9pbnQoUmVuZGVyU2NyaXB0IHJzLCBpbnQgY291bnQsIGludCB1c2FnZXMpIHsKKyAgICAgICAgbUl0ZW1BcnJheSA9IG51bGw7CisgICAgICAgIG1JT0J1ZmZlciA9IG51bGw7CisgICAgICAgIG1FbGVtZW50ID0gY3JlYXRlRWxlbWVudChycyk7CisgICAgICAgIGluaXQocnMsIGNvdW50LCB1c2FnZXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb3B5VG9BcnJheShJdGVtIGksIGludCBpbmRleCkgeworICAgICAgICBpZiAobUlPQnVmZmVyID09IG51bGwpIG1JT0J1ZmZlciA9IG5ldyBGaWVsZFBhY2tlcihJdGVtLnNpemVvZiAqIGdldFR5cGUoKS5nZXRYKCkvKiBjb3VudCAqLyk7CisgICAgICAgIG1JT0J1ZmZlci5yZXNldChpbmRleCAqIEl0ZW0uc2l6ZW9mKTsKKyAgICAgICAgbUlPQnVmZmVyLmFkZEYzMihpLnBvaW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXQoSXRlbSBpLCBpbnQgaW5kZXgsIGJvb2xlYW4gY29weU5vdykgeworICAgICAgICBpZiAobUl0ZW1BcnJheSA9PSBudWxsKSBtSXRlbUFycmF5ID0gbmV3IEl0ZW1bZ2V0VHlwZSgpLmdldFgoKSAvKiBjb3VudCAqL107CisgICAgICAgIG1JdGVtQXJyYXlbaW5kZXhdID0gaTsKKyAgICAgICAgaWYgKGNvcHlOb3cpICB7CisgICAgICAgICAgICBjb3B5VG9BcnJheShpLCBpbmRleCk7CisgICAgICAgICAgICBtQWxsb2NhdGlvbi5zZXRGcm9tRmllbGRQYWNrZXIoaW5kZXgsIG1JT0J1ZmZlcik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBJdGVtIGdldChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1JdGVtQXJyYXkgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBtSXRlbUFycmF5W2luZGV4XTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfcG9pbnQoaW50IGluZGV4LCBGbG9hdDIgdiwgYm9vbGVhbiBjb3B5Tm93KSB7CisgICAgICAgIGlmIChtSU9CdWZmZXIgPT0gbnVsbCkgbUlPQnVmZmVyID0gbmV3IEZpZWxkUGFja2VyKEl0ZW0uc2l6ZW9mICogZ2V0VHlwZSgpLmdldFgoKS8qIGNvdW50ICovKWZuYXRpOworICAgICAgICBpZiAobUl0ZW1BcnJheSA9PSBudWxsKSBtSXRlbUFycmF5ID0gbmV3IEl0ZW1bZ2V0VHlwZSgpLmdldFgoKSAvKiBjb3VudCAqL107CisgICAgICAgIGlmIChtSXRlbUFycmF5W2luZGV4XSA9PSBudWxsKSBtSXRlbUFycmF5W2luZGV4XSA9IG5ldyBJdGVtKCk7CisgICAgICAgIG1JdGVtQXJyYXlbaW5kZXhdLnBvaW50ID0gdjsKKyAgICAgICAgaWYgKGNvcHlOb3cpICB7CisgICAgICAgICAgICBtSU9CdWZmZXIucmVzZXQoaW5kZXggKiBJdGVtLnNpemVvZik7CisgICAgICAgICAgICBtSU9CdWZmZXIuYWRkRjMyKHYpOworICAgICAgICAgICAgRmllbGRQYWNrZXIgZnAgPSBuZXcgRmllbGRQYWNrZXIoOCk7CisgICAgICAgICAgICBmcC5hZGRGMzIodik7CisgICAgICAgICAgICBtQWxsb2NhdGlvbi5zZXRGcm9tRmllbGRQYWNrZXIoaW5kZXgsIDAsIGZwKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIEZsb2F0MiBnZXRfcG9pbnQoaW50IGluZGV4KSB7CisgICAgICAgIGlmIChtSXRlbUFycmF5ID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gbUl0ZW1BcnJheVtpbmRleF0ucG9pbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29weUFsbCgpIHsKKyAgICAgICAgZm9yIChpbnQgY3QgPSAwOyBjdCAmbHQ7IG1JdGVtQXJyYXkubGVuZ3RoOyBjdCsrKSBjb3B5VG9BcnJheShtSXRlbUFycmF5W2N0XSwgY3QpOworICAgICAgICBtQWxsb2NhdGlvbi5zZXRGcm9tRmllbGRQYWNrZXIoMCwgbUlPQnVmZmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNpemUoaW50IG5ld1NpemUpIHsKKyAgICAgICAgaWYgKG1JdGVtQXJyYXkgIT0gbnVsbCkgIHsKKyAgICAgICAgICAgIGludCBvbGRTaXplID0gbUl0ZW1BcnJheS5sZW5ndGg7CisgICAgICAgICAgICBpbnQgY29weVNpemUgPSBNYXRoLm1pbihvbGRTaXplLCBuZXdTaXplKTsKKyAgICAgICAgICAgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHJldHVybjsKKyAgICAgICAgICAgIEl0ZW0gbmlbXSA9IG5ldyBJdGVtW25ld1NpemVdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtSXRlbUFycmF5LCAwLCBuaSwgMCwgY29weVNpemUpOworICAgICAgICAgICAgbUl0ZW1BcnJheSA9IG5pOworICAgICAgICB9CisKKyAgICAgICAgbUFsbG9jYXRpb24ucmVzaXplKG5ld1NpemUpOworICAgICAgICBpZiAobUlPQnVmZmVyICE9IG51bGwpIG1JT0J1ZmZlciA9IG5ldyBGaWVsZFBhY2tlcihJdGVtLnNpemVvZiAqIGdldFR5cGUoKS5nZXRYKCkvKiBjb3VudCAqLyk7CisgICAgfQorCit9Cis8L3ByZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvYW5pbWF0aW9uLXJlc291cmNlLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvYW5pbWF0aW9uLXJlc291cmNlLmpkCmluZGV4IDk3MmRkNzIuLjNkZjY2OWMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2FuaW1hdGlvbi1yZXNvdXJjZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9hbmltYXRpb24tcmVzb3VyY2UuamQKQEAgLTUsMjggKzUsMzQ4IEBACiAKIDxkaXYgaWQ9InF2LXdyYXBwZXIiPgogICA8ZGl2IGlkPSJxdiI+CisgICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CisgICAgPG9sPgorICAgICAgPGxpPjxhIGhyZWY9IiNQcm9wZXJ0eSI+UHJvcGVydHkgQW5pbWF0aW9uPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI1ZpZXciPlZpZXcgQW5pbWF0aW9uPC9hPgorICAgICAgICA8b2w+CisgICAgICAgICAgPGxpPjxhIGhyZWY9IlR3ZWVuIj5Ud2VlbiBhbmltYXRpb248L2xpPgorICAgICAgICAgIDxsaT48YSBocmVmPSJGcmFtZSI+RnJhbWUgYW5pbWF0aW9uPC9saT4KKyAgICAgICAgPC9vbD4gICAgICAKKyAgICAgIDwvbGk+CisgICAgPC9vbD4KICAgICA8aDI+U2VlIGFsc288L2gyPgogICAgIDxvbD4KLSAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzLzJkLWdyYXBoaWNzLmh0bWwjdHdlZW4tYW5pbWF0aW9uIj4yRAotR3JhcGhpY3M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL3ZpZXctYW5pbWF0aW9uLmh0bWwiPlZpZXcgQW5pbWF0aW9uPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9ncmFwaGljcy9hbmltYXRpb24uaHRtbCI+UHJvcGVydHkgQW5pbWF0aW9uPC9hPjwvbGk+CiAgICAgPC9vbD4KICAgPC9kaXY+CiA8L2Rpdj4KIAogCiA8cD5BbiBhbmltYXRpb24gcmVzb3VyY2UgY2FuIGRlZmluZSBvbmUgb2YgdHdvIHR5cGVzIG9mIGFuaW1hdGlvbnM6PC9wPgorCiA8ZGw+Ci0gIDxkdD48YSBocmVmPSIjVHdlZW4iPlR3ZWVuIEFuaW1hdGlvbjwvYT48L2R0PgotICA8ZGQ+Q3JlYXRlcyBhbiBhbmltYXRpb24gYnkgcGVyZm9ybWluZyBhIHNlcmllcyBvZiB0cmFuc2Zvcm1hdGlvbnMgb24gYSBzaW5nbGUgaW1hZ2UuCi0gICAgQW4ge0BsaW5rIGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9ufS48L2RkPgotICA8ZHQ+PGEgaHJlZj0iI0ZyYW1lIj5GcmFtZSBBbmltYXRpb248L2E+PC9kdD4KLSAgPGRkPkNyZWF0ZXMgYW4gYW5pbWF0aW9uIGJ5IHNob3dpbmcgYSBzZXF1ZW5jZSBvZiBpbWFnZXMgaW4gb3JkZXIuCi0gICAgQW4ge0BsaW5rIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGV9LjwvZGQ+CisgIDxkdD48YSBocmVmPSIjUHJvcGVydHkiPlByb3BlcnR5IEFuaW1hdGlvbjwvYT48L2R0PgorICA8ZGQ+Q3JlYXRlcyBhbiBhbmltYXRpb24gYnkgbW9kaWZ5aW5nIGFuIG9iamVjdCdzIHByb3BlcnR5IHZhbHVlcyBvdmVyIGEgc2V0IHBlcmlvZAorICBvZiB0aW1lIHdpdGggYW4ge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yfS48L2RkPgorICA8ZHQ+PGEgaHJlZj0iI1ZpZXciPlZpZXcgQW5pbWF0aW9uPC9hPjwvZHQ+CisgIDxkZD4KKyAgPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiBhbmltYXRpb25zIHRoYXQgeW91IGNhbiBkbyB3aXRoIHRoZSB2aWV3IGFuaW1hdGlvbiBmcmFtZXdvcms6PC9wPgorICA8dWw+CisgICAgPGxpPjxhIGhyZWY9IiNUd2VlbiI+VHdlZW4gYW5pbWF0aW9uPC9hPjogQ3JlYXRlcyBhbiBhbmltYXRpb24gYnkgcGVyZm9ybWluZyBhIHNlcmllcyBvZiB0cmFuc2Zvcm1hdGlvbnMgb24gYSBzaW5nbGUgaW1hZ2UKKyAgICB3aXRoIGFuIHtAbGluayBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFuaW1hdGlvbn08L2xpPgorICAgIDxsaT48YSBocmVmPSIjRnJhbWUiPkZyYW1lIGFuaW1hdGlvbjwvYT46IG9yIGNyZWF0ZXMgYW4gYW5pbWF0aW9uIGJ5IHNob3dpbmcgYSBzZXF1ZW5jZSBvZiBpbWFnZXMgaW4gb3JkZXIKKyAgICB3aXRoIGFuIHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlfS48L2xpPgorICA8L3VsPgorICA8L2RkPgogPC9kbD4KIAogCis8aDIgaWQ9IlByb3BlcnR5Ij5Qcm9wZXJ0eSBBbmltYXRpb248L2gyPgorPHA+QW4gYW5pbWF0aW9uIGRlZmluZWQgaW4gWE1MIHRoYXQgbW9kaWZpZXMgcHJvcGVydGllcyBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgc3VjaCBhcworYmFja2dyb3VuZCBjb2xvciBvciBhbHBoYSB2YWx1ZSwgb3ZlciBhIHNldCBhbW91bnQgb2YgdGltZS48L3A+CiAKLTxoMiBpZD0iVHdlZW4iPlR3ZWVuIEFuaW1hdGlvbjwvaDI+Cis8ZGwgY2xhc3M9InhtbCI+CisKKzxkdD5maWxlIGxvY2F0aW9uOjwvZHQ+Cis8ZGQ+PGNvZGU+cmVzL2FuaW1hdG9yLzxlbT5maWxlbmFtZTwvZW0+LnhtbDwvY29kZT48YnIvPgorVGhlIGZpbGVuYW1lIHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVzb3VyY2UgSUQuPC9kZD4KKworPGR0PmNvbXBpbGVkIHJlc291cmNlIGRhdGF0eXBlOjwvZHQ+Cis8ZGQ+UmVzb3VyY2UgcG9pbnRlciB0byBhIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yfSwge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yfSwKK29yIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldH0uPC9kZD4KKworPGR0PnJlc291cmNlIHJlZmVyZW5jZTo8L2R0PgorPGRkPgorSW4gSmF2YTogPGNvZGU+Ui5hbmltYXRvci48ZW0+ZmlsZW5hbWU8L2VtPjwvY29kZT48YnIvPgorSW4gWE1MOiA8Y29kZT5AWzxlbT5wYWNrYWdlPC9lbT46XWFuaW1hdG9yLzxlbT5maWxlbmFtZTwvZW0+PC9jb2RlPgorPC9kZD4KKworPGR0PnN5bnRheDo8L2R0PgorPGRkPgorPHByZSBjbGFzcz0ic3R4Ij4KKyZsdDs8YSBocmVmPSIjYW5pbWF0b3Itc2V0LWVsZW1lbnQiPnNldDwvYT4KKyAgYW5kcm9pZDpvcmRlcmluZz1bInRvZ2V0aGVyIiB8ICJzZXF1ZW50aWFsbHkiXSZndDsKKworICAgICZsdDs8YSBocmVmPSIjb2JqLWFuaW1hdG9yLWVsZW1lbnQiPm9iamVjdEFuaW1hdG9yPC9hPgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0iPGVtPnN0cmluZzwvZW0+IgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI8ZW0+aW50PC9lbT4iCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSI8ZW0+ZmxvYXQ8L2VtPiB8IDxlbT5pbnQ8L2VtPiB8IDxlbT5jb2xvcjwvZW0+IgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjxlbT5mbG9hdDwvZW0+IHwgPGVtPmludDwvZW0+IHwgPGVtPmNvbG9yPC9lbT4iCisgICAgICAgIGFuZHJvaWQ6c3RhcnRPZmZzZXQ9IjxlbT5pbnQ8L2VtPiIKKyAgICAgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iPGVtPmludDwvZW0+IgorICAgICAgICBhbmRyb2lkOnJlcGVhdE1vZGU9WyJyZXBlYXQiIHwgInJldmVyc2UiXQorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT1bImludFR5cGUiIHwgImZsb2F0VHlwZSJdLyZndDsKKworICAgICZsdDs8YSBocmVmPSIjdmFsLWFuaW1hdG9yLWVsZW1lbnQiPmFuaW1hdG9yPC9hPgorICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI8ZW0+aW50PC9lbT4iCisgICAgICAgIGFuZHJvaWQ6dmFsdWVGcm9tPSI8ZW0+ZmxvYXQ8L2VtPiB8IDxlbT5pbnQ8L2VtPiB8IDxlbT5jb2xvcjwvZW0+IgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjxlbT5mbG9hdDwvZW0+IHwgPGVtPmludDwvZW0+IHwgPGVtPmNvbG9yPC9lbT4iCisgICAgICAgIGFuZHJvaWQ6c3RhcnRPZmZzZXQ9IjxlbT5pbnQ8L2VtPiIKKyAgICAgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iPGVtPmludDwvZW0+IgorICAgICAgICBhbmRyb2lkOnJlcGVhdE1vZGU9WyJyZXBlYXQiIHwgInJldmVyc2UiXQorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT1bImludFR5cGUiIHwgImZsb2F0VHlwZSJdLyZndDsKKworICAgICZsdDs8YSBocmVmPSIjYW5pbWF0b3Itc2V0LWVsZW1lbnQiPnNldDwvYT4mZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvc2V0Jmd0OworJmx0Oy9zZXQmZ3Q7Cis8L3ByZT4KKworPHA+VGhlIGZpbGUgbXVzdCBoYXZlIGEgc2luZ2xlIHJvb3QgZWxlbWVudDogZWl0aGVyIAorPGNvZGU+Jmx0O3NldCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7b2JqZWN0QW5pbWF0b3ImZ3Q7PC9jb2RlPiwgb3IgPGNvZGU+Jmx0O3ZhbHVlQW5pbWF0b3ImZ3Q7PC9jb2RlPi4gWW91IGNhbgorZ3JvdXAgYW5pbWF0aW9uIGVsZW1lbnRzIHRvZ2V0aGVyIGluc2lkZSB0aGUgPGNvZGU+Jmx0O3NldCZndDs8L2NvZGU+IGVsZW1lbnQsIGluY2x1ZGluZyBvdGhlcgorPGNvZGU+Jmx0O3NldCZndDs8L2NvZGU+IGVsZW1lbnRzLgorPC9wPgorPC9kZD4KKworPGR0PmVsZW1lbnRzOjwvZHQ+CisgIDxkZD4KKyAgPGRsIGNsYXNzPSJ0YWctbGlzdCI+CisgICAgPGR0IGlkPSJhbmltYXRvci1zZXQtZWxlbWVudCI+PGNvZGU+Jmx0O3NldCZndDs8L2NvZGU+PC9kdD4KKyAgICA8ZGQ+QSBjb250YWluZXIgdGhhdCBob2xkcyBvdGhlciBhbmltYXRpb24gZWxlbWVudHMgKDxjb2RlPiZsdDtvYmplY3RBbmltYXRvciZndDs8L2NvZGU+LAorICAgIDxjb2RlPiZsdDt2YWx1ZUFuaW1hdG9yJmd0OzwvY29kZT4sIG9yIG90aGVyIDxjb2RlPiZsdDtzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cykuICBSZXByZXNlbnRzCisgICAgYW4ge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0fS4KKyAgICA8cD5Zb3UgY2FuIHNwZWNpZnkgbmVzdGVkIDxjb2RlPiZsdDtzZXQmZ3Q7PC9jb2RlPiB0YWdzIHRvIGZ1cnRoZXIKKyAgICBncm91cCBhbmltYXRpb25zIHRvZ2V0aGVyLiBFYWNoIDxjb2RlPiZsdDtzZXQmZ3Q7PC9jb2RlPiBjYW4gZGVmaW5lIGl0cyBvd24gCisgICAgPGNvZGU+b3JkZXJpbmc8L2NvZGU+IGF0dHJpYnV0ZS48L3A+CisKKyAgICAgIDxwIGNsYXNzPSJjYXBzIj5hdHRyaWJ1dGVzOjwvcD4KKyAgICAgIDxkbCBjbGFzcz0iYXRuLWxpc3QiPgorICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDpvcmRlcmluZzwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5LZXl3b3JkPC9lbT4uIFNwZWNpZmllcyB0aGUgcGxheSBvcmRlcmluZyBvZiBhbmltYXRpb25zIGluIHRoaXMgc2V0LgorICAgICAgICAgIDx0YWJsZT4gCisgICAgICAgICAgICA8dHI+PHRoPlZhbHVlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdHI+IAorICAgICAgICAgICAgPHRyPjx0ZD48Y29kZT5zZXF1ZW50aWFsbHk8L2NvZGU+PC90ZD48dGQ+UGxheSBhbmltYXRpb25zIGluIHRoaXMgc2V0IHNlcXVlbnRpYWxseTwvdGQ+PC90cj4gCisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPnRvZ2V0aGVyPC9jb2RlPiAoZGVmYXVsdCk8L3RkPjx0ZD5QbGF5IGFuaW1hdGlvbnMgaW4gdGhpcyBzZXQgYXQgdGhlIHNhbWUgdGltZS48L3RkPjwvdHI+IAorICAgICAgICAgIDwvdGFibGU+IAorICAgICAgICA8L2RkPgorICAgICAgPC9kbD4KKyAgICA8L2RkPgorCisgIDxkdCBpZD0ib2JqLWFuaW1hdG9yLWVsZW1lbnQiPjxjb2RlPiZsdDtvYmplY3RBbmltYXRvciZndDs8L2NvZGU+PC9kdD4KKyAgICA8ZGQ+QW5pbWF0ZXMgYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhbiBvYmplY3Qgb3ZlciBhIHNwZWNpZmljIGFtb3VudCBvZiB0aW1lLiBSZXByZXNlbnRzCisgICAgYW4ge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yfS48L3A+CisgICAgCisgICAgICA8cCBjbGFzcz0iY2FwcyI+YXR0cmlidXRlczo8L3A+CisgICAgICA8ZGwgY2xhc3M9ImF0bi1saXN0Ij4KKyAgICAgICAgPGR0PgorICAgICAgICAgIDxjb2RlPmFuZHJvaWQ6cHJvcGVydHlOYW1lPC9jb2RlPiAKKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5TdHJpbmc8L2VtPi4gPHN0cm9uZz5SZXF1aXJlZDwvc3Ryb25nPi4gVGhlIG9iamVjdCdzIHByb3BlcnR5IHRvIGFuaW1hdGUsIHJlZmVyZW5jZWQgYnkgaXRzIG5hbWUuIEZvciBleGFtcGxlIHlvdSBjYW4gc3BlY2lmeQorICAgICAgICAgIDxjb2RlPiJhbHBoYSI8L2NvZGU+IG9yIDxjb2RlPiJiYWNrZ3JvdW5kQ29sb3IiPC9jb2RlPiBmb3IgYSBWaWV3IG9iamVjdC4KKyAgICAgICAgICBUaGUgPGNvZGU+b2JqZWN0QW5pbWF0b3I8L2NvZGU+IGVsZW1lbnQgZG9lcyBub3QgZXhwb3NlIGEgPGNvZGU+dGFyZ2V0PC9jb2RlPgorICAgICAgICAgIGF0dHJpYnV0ZSwgaG93ZXZlciwgc28geW91IGNhbm5vdCBzZXQgdGhlIG9iamVjdCB0byBhbmltYXRlIGluIHRoZSBYTUwgZGVjbGFyYXRpb24uIFlvdSBoYXZlIHRvCisgICAgICAgICAgaW5mbGF0ZSB5b3VyIGFuaW1hdGlvbiBYTUwgcmVzb3VyY2UgYnkgY2FsbGluZyB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JJbmZsYXRlciNsb2FkQW5pbWF0b3IKKyAgICAgICAgICBsb2FkQW5pbWF0b3IoKX0gYW5kIGNhbGwge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yI3NldFRhcmdldCBzZXRUYXJnZXQoKX0gdG8gc2V0CisgICAgICAgICAgdGhlIHRhcmdldCBvYmplY3QgdGhhdCBjb250YWlucyB0aGlzIHByb3BlcnR5LgorICAgICAgICA8L2RkPgorCisgICAgICAgIDxkdD4KKyAgICAgICAgICA8Y29kZT5hbmRyb2lkOnZhbHVlVG88L2NvZGU+CisgICAgICAgIDwvZHQ+CisgICAgICAgIDxkZD4KKyAgICAgICAgICA8ZW0+ZmxvYXQsIGludCwgb3IgY29sb3I8L2VtPi4gPHN0cm9uZz5SZXF1aXJlZDwvc3Ryb25nPi4gVGhlIHZhbHVlIHdoZXJlIHRoZSBhbmltYXRlZCBwcm9wZXJ0eSBlbmRzLiBDb2xvcnMgYXJlIHJlcHJlc2VudGVkCisgICAgICAgICAgYXMgc2l4IGRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcnMgKGZvciBleGFtcGxlLCAjMzMzMzMzKS4KKyAgICAgICAgPC9kZD4KKworICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDp2YWx1ZUZyb208L2NvZGU+CisgICAgICAgIDwvZHQ+CisgICAgICAgIDxkZD4KKyAgICAgICAgICA8ZW0+ZmxvYXQsIGludCwgb3IgY29sb3I8L2VtPi4gVGhlIHZhbHVlIHdoZXJlIHRoZSBhbmltYXRlZCBwcm9wZXJ0eSBzdGFydHMuIElmIG5vdAorICAgICAgICAgIHNwZWNpZmllZCwgdGhlIGFuaW1hdGlvbiBzdGFydHMgYXQgdGhlIHZhbHVlIG9idGFpbmVkIGJ5IHRoZSBwcm9wZXJ0eSdzIGdldCBtZXRob2QuIENvbG9ycyBhcmUgcmVwcmVzZW50ZWQKKyAgICAgICAgICBhcyBzaXggZGlnaXQgaGV4YWRlY2ltYWwgbnVtYmVycyAoZm9yIGV4YW1wbGUsICMzMzMzMzMpLgorICAgICAgICA8L2RkPgorCisgICAgICAgIDxkdD4KKyAgICAgICAgICA8Y29kZT5hbmRyb2lkOmR1cmF0aW9uPC9jb2RlPgorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+CisgICAgICAgICAgPGVtPmludDwvZW0+LiBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlIGFuaW1hdGlvbi4gMzAwIG1pbGxpc2Vjb25kcyBpcyB0aGUgZGVmYXVsdC4KKyAgICAgICAgPC9kZD4KKworICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDpzdGFydE9mZnNldDwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5pbnQ8L2VtPi4gVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdGhlIGFuaW1hdGlvbiBkZWxheXMgYWZ0ZXIKKyAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hbmltYXRpb24uT2JqZWN0QW5pbWF0b3Ijc3RhcnQgc3RhcnQoKX0gaXMgY2FsbGVkLgorICAgICAgICA8L2RkPgorCisgICAgICAgIDxkdD4KKyAgICAgICAgICA8Y29kZT5hbmRyb2lkOnJlcGVhdENvdW50PC9jb2RlPgorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+CisgICAgICAgICAgPGVtPmludDwvZW0+LiBIb3cgbWFueSB0aW1lcyB0byByZXBlYXQgYW4gYW5pbWF0aW9uLiBTZXQgdG8gPGNvZGU+Ii0xIjwvY29kZT4gdG8gaW5maW5pdGVseQorICAgICAgICAgIHJlcGVhdCBvciB0byBhIHBvc2l0aXZlIGludGVnZXIuIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mIDxjb2RlPiIxIjwvY29kZT4gbWVhbnMgdGhhdCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgaXMgcmVwZWF0ZWQgb25jZSBhZnRlciB0aGUgaW5pdGlhbCBydW4gb2YgdGhlIGFuaW1hdGlvbiwgc28gdGhlIGFuaW1hdGlvbiBwbGF5cyBhIHRvdGFsCisgICAgICAgICAgb2YgdHdvIHRpbWVzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMCI8L2NvZGU+LCB3aGljaCBtZWFucyBubyByZXBldGl0aW9uLgorCisgICAgICAgIDwvZGQ+CisKKyAgICAgICAgPGR0PgorICAgICAgICAgIDxjb2RlPmFuZHJvaWQ6cmVwZWF0TW9kZTwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5pbnQ8L2VtPi4gSG93IGFuIGFuaW1hdGlvbiBiZWhhdmVzIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24uIDxjb2RlPmFuZHJvaWQ6cmVwZWF0Q291bnQ8L2NvZGU+CisgICAgICAgICAgbXVzdCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIG9yIDxjb2RlPiItMSI8L2NvZGU+IGZvciB0aGlzIGF0dHJpYnV0ZSB0byBoYXZlIGFuIGVmZmVjdC4gU2V0IHRvIDxjb2RlPiJyZXZlcnNlIjwvY29kZT4KKyAgICAgICAgICB0byBoYXZlIHRoZSBhbmltYXRpb24gcmV2ZXJzZSBkaXJlY3Rpb24gd2l0aCBlYWNoIGl0ZXJhdGlvbiBvciA8Y29kZT4icmVwZWF0IjwvY29kZT4gdG8gaGF2ZSB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgbG9vcCBmcm9tIHRoZSBiZWdpbm5pbmcgZWFjaCB0aW1lLgorICAgICAgICA8L2RkPgorCisgICAgICAgIDxkdD4KKyAgICAgICAgICA8Y29kZT5hbmRyb2lkOnZhbHVlVHlwZTwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5LZXl3b3JkPC9lbT4uIERvIG5vdCBzcGVjaWZ5IHRoaXMgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZSBpcyBhIGNvbG9yLiBUaGUgYW5pbWF0aW9uIGZyYW1ld29yayBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgY29sb3IKKyAgICAgICAgICB2YWx1ZXMKKyAgICAgICAgICA8dGFibGU+IAorICAgICAgICAgICAgPHRyPjx0aD5WYWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPiAKKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+aW50VHlwZTwvY29kZT48L3RkPjx0ZD5TcGVjaWZpZXMgdGhhdCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGFyZSBpbnRlZ2VyczwvdGQ+PC90cj4gCisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPmZsb2F0VHlwZTwvY29kZT4gKGRlZmF1bHQpPC90ZD48dGQ+U3BlY2lmaWVzIHRoYXQgdGhlIGFuaW1hdGVkIHZhbHVlcyBhcmUgZmxvYXRzPC90ZD48L3RyPiAKKyAgICAgICAgICA8L3RhYmxlPiAKKyAgICAgICAgPC9kZD4KKworICAgICAgPC9kbD4KKyAgICA8L2RkPgorCis8ZHQgaWQ9InZhbC1hbmltYXRvci1lbGVtZW50Ij48Y29kZT4mbHQ7YW5pbWF0b3ImZ3Q7PC9jb2RlPjwvZHQ+CisgICAgPGRkPkFuaW1hdGVzIGEgb3ZlciBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZS4KKyAgICBSZXByZXNlbnRzIGEge0BsaW5rIGFuZHJvaWQuYW5pbWF0aW9uLlZhbHVlQW5pbWF0b3J9LgorCisgICAgICA8cCBjbGFzcz0iY2FwcyI+YXR0cmlidXRlczo8L3A+CisgICAgICA8ZGwgY2xhc3M9ImF0bi1saXN0Ij4KKyAgICAgICAgPGR0PgorICAgICAgICAgIDxjb2RlPmFuZHJvaWQ6dmFsdWVUbzwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5mbG9hdCwgaW50LCBvciBjb2xvcjwvZW0+LiA8c3Ryb25nPlJlcXVpcmVkPC9zdHJvbmc+LiBUaGUgdmFsdWUgd2hlcmUgdGhlIGFuaW1hdGlvbiBlbmRzLiBDb2xvcnMgYXJlIHJlcHJlc2VudGVkCisgICAgICAgICAgYXMgc2l4IGRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcnMgKGZvciBleGFtcGxlLCAjMzMzMzMzKS4KKyAgICAgICAgPC9kZD4KKworICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDp2YWx1ZUZyb208L2NvZGU+CisgICAgICAgIDwvZHQ+CisgICAgICAgIDxkZD4KKyAgICAgICAgICA8ZW0+ZmxvYXQsIGludCwgb3IgY29sb3I8L2VtPi4gPHN0cm9uZz5SZXF1aXJlZDwvc3Ryb25nPi4gVGhlIHZhbHVlIHdoZXJlIHRoZSBhbmltYXRpb24gc3RhcnRzLiBDb2xvcnMgYXJlIHJlcHJlc2VudGVkCisgICAgICAgICAgYXMgc2l4IGRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcnMgKGZvciBleGFtcGxlLCAjMzMzMzMzKS4KKyAgICAgICAgPC9kZD4KKworICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDpkdXJhdGlvbjwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5pbnQ8L2VtPi4gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZSBhbmltYXRpb24uIDMwMG1zIGlzIHRoZSBkZWZhdWx0LgorICAgICAgICA8L2RkPgorCisgICAgICAgIDxkdD4KKyAgICAgICAgICA8Y29kZT5hbmRyb2lkOnN0YXJ0T2Zmc2V0PC9jb2RlPgorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+CisgICAgICAgICAgPGVtPmludDwvZW0+LiBUaGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0aGUgYW5pbWF0aW9uIGRlbGF5cyBhZnRlcgorICAgICAgICAgIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yI3N0YXJ0IHN0YXJ0KCl9IGlzIGNhbGxlZC4KKyAgICAgICAgPC9kZD4KKworICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDpyZXBlYXRDb3VudDwvY29kZT4KKyAgICAgICAgPC9kdD4KKyAgICAgICAgPGRkPgorICAgICAgICAgIDxlbT5pbnQ8L2VtPi4gSG93IG1hbnkgdGltZXMgdG8gcmVwZWF0IGFuIGFuaW1hdGlvbi4gU2V0IHRvIDxjb2RlPiItMSI8L2NvZGU+IHRvIGluZmluaXRlbHkKKyAgICAgICAgICByZXBlYXQgb3IgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyLiBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiA8Y29kZT4iMSI8L2NvZGU+IG1lYW5zIHRoYXQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgIGlzIHJlcGVhdGVkIG9uY2UgYWZ0ZXIgdGhlIGluaXRpYWwgcnVuIG9mIHRoZSBhbmltYXRpb24sIHNvIHRoZSBhbmltYXRpb24gcGxheXMgYSB0b3RhbAorICAgICAgICAgIG9mIHR3byB0aW1lcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjAiPC9jb2RlPiwgd2hpY2ggbWVhbnMgbm8gcmVwZXRpdGlvbi4KKyAgICAgICAgPC9kZD4KKworICAgICAgICA8ZHQ+CisgICAgICAgICAgPGNvZGU+YW5kcm9pZDpyZXBlYXRNb2RlPC9jb2RlPgorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+CisgICAgICAgICAgPGVtPmludDwvZW0+LiBIb3cgYW4gYW5pbWF0aW9uIGJlaGF2ZXMgd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4gPGNvZGU+YW5kcm9pZDpyZXBlYXRDb3VudDwvY29kZT4KKyAgICAgICAgICBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIGludGVnZXIgb3IgPGNvZGU+Ii0xIjwvY29kZT4gZm9yIHRoaXMgYXR0cmlidXRlIHRvIGhhdmUgYW4gZWZmZWN0LiBTZXQgdG8gPGNvZGU+InJldmVyc2UiPC9jb2RlPgorICAgICAgICAgIHRvIGhhdmUgdGhlIGFuaW1hdGlvbiByZXZlcnNlIGRpcmVjdGlvbiB3aXRoIGVhY2ggaXRlcmF0aW9uIG9yIDxjb2RlPiJyZXBlYXQiPC9jb2RlPiB0byBoYXZlIHRoZSBhbmltYXRpb24KKyAgICAgICAgICBsb29wIGZyb20gdGhlIGJlZ2lubmluZyBlYWNoIHRpbWUuCisgICAgICAgIDwvZGQ+CisKKyAgICAgICAgPGR0PgorICAgICAgICAgIDxjb2RlPmFuZHJvaWQ6dmFsdWVUeXBlPC9jb2RlPgorICAgICAgICA8L2R0PgorICAgICAgICA8ZGQ+CisgICAgICAgICAgPGVtPktleXdvcmQ8L2VtPi4gRG8gbm90IHNwZWNpZnkgdGhpcyBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGlzIGEgY29sb3IuIFRoZSBhbmltYXRpb24gZnJhbWV3b3JrIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyBjb2xvcgorICAgICAgICAgIHZhbHVlcy4KKyAgICAgICAgICA8dGFibGU+IAorICAgICAgICAgICAgPHRyPjx0aD5WYWx1ZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RyPiAKKyAgICAgICAgICAgIDx0cj48dGQ+PGNvZGU+aW50VHlwZTwvY29kZT48L3RkPjx0ZD5TcGVjaWZpZXMgdGhhdCB0aGUgYW5pbWF0ZWQgdmFsdWVzIGFyZSBpbnRlZ2VyczwvdGQ+PC90cj4gCisgICAgICAgICAgICA8dHI+PHRkPjxjb2RlPmZsb2F0VHlwZTwvY29kZT4gKGRlZmF1bHQpPC90ZD48dGQ+U3BlY2lmaWVzIHRoYXQgdGhlIGFuaW1hdGVkIHZhbHVlcyBhcmUgZmxvYXRzPC90ZD48L3RyPiAKKyAgICAgICAgICA8L3RhYmxlPiAKKyAgICAgICAgPC9kZD4KKworICAgICAgPC9kbD4KKyAgICA8L2RkPgorICA8L2RsPgorCis8L2RkPiA8IS0tIGVuZCAgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgLS0+CisKKzxkdD5leGFtcGxlOjwvZHQ+Cis8ZGQ+CisgIDxwcD5YTUwgZmlsZSBzYXZlZCBhdCA8Y29kZT5yZXMvYW5pbWF0b3IvcHJvcGVydHlfYW5pbWF0b3IueG1sPC9jb2RlPjo8L3A+Cis8cHJlPgorJmx0O3NldCBhbmRyb2lkOm9yZGVyaW5nPSJzZXF1ZW50aWFsbHkiJmd0OworICAgICZsdDtzZXQmZ3Q7CisgICAgICAgICZsdDtvYmplY3RBbmltYXRvcgorICAgICAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9IngiCisgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiCisgICAgICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjQwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJpbnRUeXBlIi8mZ3Q7CisgICAgICAgICZsdDtvYmplY3RBbmltYXRvcgorICAgICAgICAgICAgYW5kcm9pZDpwcm9wZXJ0eU5hbWU9InkiCisgICAgICAgICAgICBhbmRyb2lkOmR1cmF0aW9uPSI1MDAiCisgICAgICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjMwMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJpbnRUeXBlIi8mZ3Q7CisgICAgJmx0Oy9zZXQmZ3Q7CisgICAgJmx0O29iamVjdEFuaW1hdG9yCisgICAgICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJhbHBoYSIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iNTAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVG89IjFmIi8mZ3Q7CismbHQ7L3NldCZndDsKKzwvcHJlPgorICA8cD5JbiBvcmRlciB0byBydW4gdGhpcyBhbmltYXRpb24sIHlvdSBtdXN0IGluZmxhdGUgdGhlIFhNTCByZXNvdXJjZXMgaW4geW91ciBjb2RlIHRvIGFuIHtAbGluaworICBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldH0gb2JqZWN0LCBhbmQgdGhlbiBzZXQgdGhlIHRhcmdldCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIGFuaW1hdGlvbnMKKyAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBhbmltYXRpb24gc2V0LiBDYWxsaW5nIHtAbGluayBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldCNzZXRUYXJnZXQKKyAgc2V0VGFyZ2V0KCl9IHNldHMgYSBzaW5nbGUgdGFyZ2V0IG9iamVjdCBmb3IgYWxsIGNoaWxkcmVuIG9mIHRoZSB7QGxpbmsKKyAgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3JTZXR9IGFzIGEgY29udmVuaWVuY2UuIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgdG8gZG8gdGhpczo8L3A+CisgIAorPHByZT4KK0FuaW1hdG9yU2V0IHNldCA9IChBbmltYXRvclNldCkgQW5pbWF0b3JJbmZsYXRlci5sb2FkQW5pbWF0b3IobXlDb250ZXh0LAorICAgIFIuYW5pbS5wcm9wZXJ0eV9hbmltYXRvcik7CitzZXQuc2V0VGFyZ2V0KG15T2JqZWN0KTsKK3NldC5zdGFydCgpOworPC9wcmU+CisKKworPC9kZD4gPCEtLSBlbmQgZXhhbXBsZSAtLT4KKworPGR0PnNlZSBhbHNvOjwvZHQ+Cis8ZGQ+Cis8dWw+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL2FuaW1hdGlvbi5odG1sIj5Qcm9wZXJ0eSBBbmltYXRpb248L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly96b3NvOjgwODAvcmVzb3VyY2VzL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vaW5kZXguaHRtbCI+QVBJIERlbW9zPC9hPiBmb3IgZXhhbXBsZXMKKyAgb24gaG93IHRvIHVzZSB0aGUgcHJvcGVydHkgYW5pbWF0aW9uIHN5c3RlbS48L2xpPgorPC91bD4KKzwvZGQ+CisKKzwvZGw+CisKKzxoMiBpZD0iVmlldyI+VmlldyBBbmltYXRpb248L2gyPgorVGhlIHZpZXcgYW5pbWF0aW9uIGZyYW1ld29yayBzdXBwb3J0cyBib3RoIHR3ZWVuIGFuZCBmcmFtZSBieSBmcmFtZSBhbmltYXRpb25zLCB3aGljaCBjYW4gYm90aCBiZSBkZWNsYXJlZAoraW4gWE1MLiBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIGhvdyB0byB1c2UgYm90aCBtZXRob2RzLgorCis8aDMgaWQ9IlR3ZWVuIj5Ud2VlbiBhbmltYXRpb248L2gzPgogCiA8cD5BbiBhbmltYXRpb24gZGVmaW5lZCBpbiBYTUwgdGhhdCBwZXJmb3JtcyB0cmFuc2l0aW9ucyBzdWNoIGFzIHJvdGF0aW5nLAogZmFkaW5nLCBtb3ZpbmcsIGFuZCBzdHJldGNoaW5nIG9uIGEgZ3JhcGhpYy4KQEAgLTI1NCwxOCArNTc0LDE0IEBACiA8ZHQ+c2VlIGFsc286PC9kdD4KIDxkZD4KIDx1bD4KLSAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZ3JhcGhpY3MvMmQtZ3JhcGhpY3MuaHRtbCN0d2Vlbi1hbmltYXRpb24iPjJECisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL3ZpZXctYW5pbWF0aW9uLmh0bWwjdHdlZW4tYW5pbWF0aW9uIj4yRAogR3JhcGhpY3M6IFR3ZWVuIEFuaW1hdGlvbjwvYT48L2xpPgogPC91bD4KIDwvZGQ+CiAKIDwvZGw+CiAKLQotCi0KLQotPGgzIGlkPSJJbnRlcnBvbGF0b3JzIj5JbnRlcnBvbGF0b3JzPC9oMz4KKzxoNCBpZD0iSW50ZXJwb2xhdG9ycyI+SW50ZXJwb2xhdG9yczwvaDQ+CiAKIDxwPkFuIGludGVycG9sYXRvciBpcyBhbiBhbmltYXRpb24gbW9kaWZpZXIgZGVmaW5lZCBpbiBYTUwgdGhhdCBhZmZlY3RzIHRoZSByYXRlIG9mIGNoYW5nZSBpbiBhbgogYW5pbWF0aW9uLiBUaGlzIGFsbG93cyB5b3VyIGV4aXN0aW5nIGFuaW1hdGlvbiBlZmZlY3RzIHRvIGJlIGFjY2VsZXJhdGVkLCBkZWNlbGVyYXRlZCwgcmVwZWF0ZWQsCkBAIC00NTYsMjIgKzc3Miw3IEBACiA8L2RsPgogCiAKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLTxoMiBpZD0iRnJhbWUiPkZyYW1lIEFuaW1hdGlvbjwvaDI+Cis8aDMgaWQ9IkZyYW1lIj5GcmFtZSBhbmltYXRpb248L2gzPgogCiA8cD5BbiBhbmltYXRpb24gZGVmaW5lZCBpbiBYTUwgdGhhdCBzaG93cyBhIHNlcXVlbmNlIG9mIGltYWdlcyBpbiBvcmRlciAobGlrZSBhIGZpbG0pLgogPC9wPgpAQCAtNTYyLDcgKzg2MywxMSBAQAogICA8L2RsPgogPC9kZD4gPCEtLSBlbmQgZXhhbXBsZSAtLT4KIAorPGR0PnNlZSBhbHNvOjwvZHQ+Cis8ZGQ+Cis8dWw+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL3ZpZXctYW5pbWF0aW9uLmh0bWwjZnJhbWUtYW5pbWF0aW9uIj4yRAorR3JhcGhpY3M6IEZyYW1lIEFuaW1hdGlvbjwvYT48L2xpPgorPC91bD4KKzwvZGQ+CiA8L2RsPgotCi0KLQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL3Byb3ZpZGluZy1yZXNvdXJjZXMuamQKaW5kZXggMzI1OTVhMC4uYTk5NmNjYyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvcHJvdmlkaW5nLXJlc291cmNlcy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmpkCkBAIC04OCw5ICs4OCwxOCBAQAogICA8L3RyPgogCiAgIDx0cj4KKyAgICA8dGQ+PGNvZGU+YW5pbWF0b3IvPC9jb2RlPjwvdGQ+CisgICAgPHRkPlhNTCBmaWxlcyB0aGF0IGRlZmluZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2dyYXBoaWNzL2FuaW1hdGlvbi5odG1sIj5wcm9wZXJ0eQorYW5pbWF0aW9uczwvYT4uPC90ZD4KKyAgPC90cj4KKworICA8dHI+CiAgICAgPHRkPjxjb2RlPmFuaW0vPC9jb2RlPjwvdGQ+Ci0gICAgPHRkPlhNTCBmaWxlcyB0aGF0IGRlZmluZSB0d2VlbiBhbmltYXRpb25zLiBTZWUgPGEKLWhyZWY9ImFuaW1hdGlvbi1yZXNvdXJjZS5odG1sIj5BbmltYXRpb24gUmVzb3VyY2VzPC9hPi48L3RkPgorICAgIDx0ZD5YTUwgZmlsZXMgdGhhdCBkZWZpbmUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZ3JhcGhpY3Mvdmlldy1hbmltYXRpb24uaHRtbCN0d2Vlbi1hbmltYXRpb24iPnR3ZWVuCithbmltYXRpb25zPC9hPi4gKFByb3BlcnR5IGFuaW1hdGlvbnMgY2FuIGFsc28gYmUgc2F2ZWQgaW4gdGhpcyBkaXJlY3RvcnksIGJ1dAordGhlIHtAY29kZSBhbmltYXRvci99IGRpcmVjdG9yeSBpcyBwcmVmZXJyZWQgZm9yIHByb3BlcnR5IGFuaW1hdGlvbnMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdHdvCit0eXBlcy4pPC90ZD4KICAgPC90cj4KIAogICA8dHI+CkBAIC0zMjQsNiArMzMzLDg2IEBACiBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbG9jYWxlLjwvcD4KICAgICAgIDwvdGQ+CiAgICAgPC90cj4KKyAgICA8dHIgaWQ9IlNtYWxsZXN0U2NyZWVuV2lkdGhRdWFsaWZpZXIiPgorICAgICAgPHRkPlNtYWxsZXN0IHNjcmVlbiB3aWR0aDwvdGQ+CisgICAgICA8dGQ+RXhhbXBsZXM6PGJyLz4KKyAgICAgICAgPGNvZGU+c3czMjBkcDwvY29kZT48YnIvPgorICAgICAgICA8Y29kZT5zdzYwMGRwPC9jb2RlPjxici8+CisgICAgICAgIDxjb2RlPnN3NzIwZHA8L2NvZGU+PGJyLz4KKyAgICAgICAgZXRjLgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHA+U3BlY2lmaWVzIGEgbWluaW11bSAic21hbGxlc3Qgc2NyZWVuIHdpZHRoLCIgaW4gImRwIiB1bml0cywgYXQgd2hpY2ggdGhlIHJlc291cmNlCisgICAgICAgICAgc2hvdWxkIGJlIHVzZWQuICBUaGlzIGNvbmZpZ3VyYXRpb24gdmFsdWUgcmVwcmVzZW50cyB0aGUgYmFzZSBzY3JlZW4gc2l6ZQorICAgICAgICAgIG9mIHRoZSBkZXZpY2UsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBkaXNwbGF5LiAgSXQgaXMgYmFzZWQKKyAgICAgICAgICBvbiB0aGUgc21hbGxlc3Qgd2lkdGggdGhlIGFwcGxpY2F0aW9uIHdpbGwgaGF2ZSBpbiB3aGljaCB0byBwZXJmb3JtIGl0cworICAgICAgICAgIFVJIGxheW91dCAoaW4gZHAgdW5pdHMpIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzY3JlZW4uICBUaGUKKyAgICAgICAgICB2YWx1ZSBoZXJlIHRha2VzIGludG8gYWNjb3VudCBzY3JlZW4gZGVjb3JhdGlvbnMgc28gaWYgdGhlIGRldmljZSBoYXMgc29tZQorICAgICAgICAgIHBlcnNpc3RlbnQgVUkgZWxlbWVudHMgb24gdGhlIGxlZnQgb3IgcmlnaHQgZWRnZSBvZiB0aGUgZGlzcGxheSBpdCBtdXN0CisgICAgICAgICAgcHJlc2VudCBhIHZhbHVlIGhlcmUgdGhhdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlYWwgc2NyZWVuIHNpemUsIGFjY291bnRpbmcKKyAgICAgICAgICBmb3IgdGhlc2UgVUkgZWxlbWVudHMgcmVkdWNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgYXZhaWxhYmxlIHNwYWNlLjwvcD4KKyAgICAgICAgPHA+U29tZSB2YWx1ZXMgeW91IG1heSB1c2UgaGVyZSBmb3IgY29tbW9uIHNjcmVlbiBzaXplczo8L3A+CisgICAgICAgIDx1bD4KKyAgICAgICAgICA8bGk+MjQweDMyMCBsZHBpIChRVkdBIHBob25lKTogMzIwCisgICAgICAgICAgPGxpPjMyMHg0ODAgbWRwaSAocGhvbmUpOiAzMjAKKyAgICAgICAgICA8bGk+NDgweDgwMCBoZHBpIChoaWdoIGRlbnNpdHkgcGhvbmUpOiAzMjAKKyAgICAgICAgICA8bGk+NDgweDgwMCBtZHBpICh0YWJsZXQvcGhvbmUpOiA0ODAKKyAgICAgICAgICA8bGk+NjAweDEwMjQgbWRwaSAoNyIgdGFibGV0KTogNjAwCisgICAgICAgICAgPGxpPjcyMHgxMjgwIG1kcGkgKDEwIiB0YWJsZXQpOiA3MjAKKyAgICAgICAgPC91bD4KKyAgICAgICAgPHA+PGVtPkFkZGVkIGluIEFQSSBMZXZlbCAxMy48L2VtPjwvcD4KKyAgICAgICAgPHA+QWxzbyBzZWUgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24jc21hbGxlc3RTY3JlZW5XaWR0aERwfQorICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmllbGQsIHdoaWNoIGhvbGRzIHRoZSBjdXJyZW50IHNtYWxsZXN0IHNjcmVlbiB3aWR0aC48L3A+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyIGlkPSJTY3JlZW5XaWR0aFF1YWxpZmllciI+CisgICAgICA8dGQ+U2NyZWVuIHdpZHRoPC90ZD4KKyAgICAgIDx0ZD5FeGFtcGxlczo8YnIvPgorICAgICAgICA8Y29kZT53NzIwZHA8L2NvZGU+PGJyLz4KKyAgICAgICAgPGNvZGU+dzEwMjRkcDwvY29kZT48YnIvPgorICAgICAgICBldGMuCisgICAgICA8L3RkPgorICAgICAgPHRkPgorICAgICAgICA8cD5TcGVjaWZpZXMgYSBtaW5pbXVtIHNjcmVlbiB3aWR0aCwgaW4gImRwIiB1bml0cywgYXQgd2hpY2ggdGhlIHJlc291cmNlCisgICAgICAgICAgc2hvdWxkIGJlIHVzZWQuICBUaGlzIGNvbmZpZ3VyYXRpb24gdmFsdWUgd2lsbCBjaGFuZ2Ugd2hlbiB0aGUgb3JpZW50YXRpb24KKyAgICAgICAgICBjaGFuZ2VzIGJldHdlZW4gbGFuZHNjYXBlIGFuZCBwb3J0cmFpdCB0byBtYXRjaCB0aGUgY3VycmVudCBhY3R1YWwgd2lkdGguCisgICAgICAgICAgV2hlbiBtdWx0aXBsZSBzY3JlZW4gd2lkdGggY29uZmlndXJhdGlvbnMgYXJlIGF2YWlsYWJsZSwgdGhlIGNsb3Nlc3QgdG8KKyAgICAgICAgICB0aGUgY3VycmVudCBzY3JlZW4gd2lkdGggd2lsbCBiZSB1c2VkLiAgVGhlCisgICAgICAgICAgdmFsdWUgaGVyZSB0YWtlcyBpbnRvIGFjY291bnQgc2NyZWVuIGRlY29yYXRpb25zIHNvIGlmIHRoZSBkZXZpY2UgaGFzIHNvbWUKKyAgICAgICAgICBwZXJzaXN0ZW50IFVJIGVsZW1lbnRzIG9uIHRoZSBsZWZ0IG9yIHJpZ2h0IGVkZ2Ugb2YgdGhlIGRpc3BsYXkgaXQgbXVzdAorICAgICAgICAgIHByZXNlbnQgYSB2YWx1ZSBoZXJlIHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZSByZWFsIHNjcmVlbiBzaXplLCBhY2NvdW50aW5nCisgICAgICAgICAgZm9yIHRoZXNlIFVJIGVsZW1lbnRzIHJlZHVjaW5nIHRoZSBhcHBsaWNhdGlvbidzIGF2YWlsYWJsZSBzcGFjZS48L3A+CisgICAgICAgIDxwPjxlbT5BZGRlZCBpbiBBUEkgTGV2ZWwgMTMuPC9lbT48L3A+CisgICAgICAgIDxwPkFsc28gc2VlIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uI3NjcmVlbldpZHRoRHB9CisgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWVsZCwgd2hpY2ggaG9sZHMgdGhlIGN1cnJlbnQgc2NyZWVuIHdpZHRoLjwvcD4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHIgaWQ9IlNjcmVlbkhlaWdodFF1YWxpZmllciI+CisgICAgICA8dGQ+U2NyZWVuIGhlaWdodDwvdGQ+CisgICAgICA8dGQ+RXhhbXBsZXM6PGJyLz4KKyAgICAgICAgPGNvZGU+aDcyMGRwPC9jb2RlPjxici8+CisgICAgICAgIDxjb2RlPmgxMDI0ZHA8L2NvZGU+PGJyLz4KKyAgICAgICAgZXRjLgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD4KKyAgICAgICAgPHA+U3BlY2lmaWVzIGEgbWluaW11bSBzY3JlZW4gaGVpZ2h0LCBpbiAiZHAiIHVuaXRzLCBhdCB3aGljaCB0aGUgcmVzb3VyY2UKKyAgICAgICAgICBzaG91bGQgYmUgdXNlZC4gIFRoaXMgY29uZmlndXJhdGlvbiB2YWx1ZSB3aWxsIGNoYW5nZSB3aGVuIHRoZSBvcmllbnRhdGlvbgorICAgICAgICAgIGNoYW5nZXMgYmV0d2VlbiBsYW5kc2NhcGUgYW5kIHBvcnRyYWl0IHRvIG1hdGNoIHRoZSBjdXJyZW50IGFjdHVhbCBoZWlnaHQuCisgICAgICAgICAgV2hlbiBtdWx0aXBsZSBzY3JlZW4gaGVpZ2h0IGNvbmZpZ3VyYXRpb25zIGFyZSBhdmFpbGFibGUsIHRoZSBjbG9zZXN0IHRvCisgICAgICAgICAgdGhlIGN1cnJlbnQgc2NyZWVuIGhlaWdodCB3aWxsIGJlIHVzZWQuICBUaGUKKyAgICAgICAgICB2YWx1ZSBoZXJlIHRha2VzIGludG8gYWNjb3VudCBzY3JlZW4gZGVjb3JhdGlvbnMgc28gaWYgdGhlIGRldmljZSBoYXMgc29tZQorICAgICAgICAgIHBlcnNpc3RlbnQgVUkgZWxlbWVudHMgb24gdGhlIGxlZnQgb3IgcmlnaHQgZWRnZSBvZiB0aGUgZGlzcGxheSBpdCBtdXN0CisgICAgICAgICAgcHJlc2VudCBhIHZhbHVlIGhlcmUgdGhhdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJlYWwgc2NyZWVuIHNpemUsIGFjY291bnRpbmcKKyAgICAgICAgICBmb3IgdGhlc2UgVUkgZWxlbWVudHMgcmVkdWNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgYXZhaWxhYmxlIHNwYWNlLiAgU2NyZWVuCisgICAgICAgICAgZGVjb3JhdGlvbnMgdGhhdCBhcmUgbm90IGZpeGVkIChzdWNoIGFzIGEgcGhvbmUgc3RhdHVzIGJhciB0aGF0IGNhbiBiZQorICAgICAgICAgIGhpZGRlbiB3aGVuIGZ1bGwgc2NyZWVuKSBhcmUgPGVtPm5vdDwvZW0+IGFjY291bnRlZCBmb3IgaGVyZSwgbm9yIGFyZQorICAgICAgICAgIHdpbmRvdyBkZWNvcmF0aW9ucyBsaWtlIHRpdGxlIGJhciwgc28gYXBwbGljYXRpb25zIG11c3QgYmUgcHJlcGFyZWQgdG8KKyAgICAgICAgICBkZWFsIHdpdGggYSBzb21ld2hhdCBzbWFsbGVyIHNwYWNlIHRoYW4gdGhleSBzcGVjaWZ5LgorICAgICAgICA8cD48ZW0+QWRkZWQgaW4gQVBJIExldmVsIDEzLjwvZW0+PC9wPgorICAgICAgICA8cD5BbHNvIHNlZSB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiNzY3JlZW5IZWlnaHREcH0KKyAgICAgICAgICBjb25maWd1cmF0aW9uIGZpZWxkLCB3aGljaCBob2xkcyB0aGUgY3VycmVudCBzY3JlZW4gd2lkdGguPC9wPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgogICAgIDx0ciBpZD0iU2NyZWVuU2l6ZVF1YWxpZmllciI+CiAgICAgICA8dGQ+U2NyZWVuIHNpemU8L3RkPgogICAgICAgPHRkPgpAQCAtMzgzLDQ2ICs0NzIsNiBAQAogd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNjcmVlbiBpcyBsb25nLjwvcD4KICAgICAgIDwvdGQ+CiAgICAgPC90cj4KLSAgICA8dHIgaWQ9IlNjcmVlbldpZHRoUXVhbGlmaWVyIj4KLSAgICAgIDx0ZD5TY3JlZW4gd2lkdGg8L3RkPgotICAgICAgPHRkPkV4YW1wbGVzOjxici8+Ci0gICAgICAgIDxjb2RlPnc3MjBkcDwvY29kZT48YnIvPgotICAgICAgICA8Y29kZT53MTAyNGRwPC9jb2RlPjxici8+Ci0gICAgICAgIGV0Yy4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxwPlNwZWNpZmllcyBhIG1pbmltdW0gc2NyZWVuIHdpZHRoLCBpbiAiZHAiIHVuaXRzLCBhdCB3aGljaCB0aGUgcmVzb3VyY2UKLSAgICAgICAgICBzaG91bGQgYmUgdXNlZC4gIFRoaXMgY29uZmlndXJhdGlvbiB2YWx1ZSB3aWxsIGNoYW5nZSB3aGVuIHRoZSBvcmllbnRhdGlvbgotICAgICAgICAgIGNoYW5nZXMgYmV0d2VlbiBsYW5kc2NhcGUgYW5kIHBvcnRyYWl0IHRvIG1hdGNoIHRoZSBjdXJyZW50IGFjdHVhbCB3aWR0aC4KLSAgICAgICAgICBXaGVuIG11bHRpcGxlIHNjcmVlbiB3aWR0aCBjb25maWd1cmF0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgY2xvc2VzdCB0bwotICAgICAgICAgIHRoZSBjdXJyZW50IHNjcmVlbiB3aWR0aCB3aWxsIGJlIHVzZWQuICBUaGUgdmFsdWUgc3BlY2lmaWVkIGhlcmUgaXMKLSAgICAgICAgICBhcHByb3hpbWF0ZTsgc2NyZWVuIGRlY29yYXRpb25zIGxpa2UgYSBzdGF0dXMgYmFyIG9yIHN5c3RlbSBiYXIgbWF5IGNhdXNlCi0gICAgICAgICAgdGhlIGFjdHVhbCBzcGFjZSBhdmFpbGFibGUgaW4geW91ciBVSSB0byBiZSBzbGlnaHRseSBzbWFsbGVyLgotICAgICAgICA8cD48ZW0+QWRkZWQgaW4gQVBJIExldmVsIDEzLjwvZW0+PC9wPgotICAgICAgICA8cD5BbHNvIHNlZSB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbiNzY3JlZW5XaWR0aERwfQotICAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmllbGQsIHdoaWNoIGhvbGRzIHRoZSBjdXJyZW50IHNjcmVlbiB3aWR0aC48L3A+Ci0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyIGlkPSJTY3JlZW5IZWlnaHRRdWFsaWZpZXIiPgotICAgICAgPHRkPlNjcmVlbiBoZWlnaHQ8L3RkPgotICAgICAgPHRkPkV4YW1wbGVzOjxici8+Ci0gICAgICAgIDxjb2RlPmg3MjBkcDwvY29kZT48YnIvPgotICAgICAgICA8Y29kZT5oMTAyNGRwPC9jb2RlPjxici8+Ci0gICAgICAgIGV0Yy4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQ+Ci0gICAgICAgIDxwPlNwZWNpZmllcyBhIG1pbmltdW0gc2NyZWVuIGhlaWdodCwgaW4gImRwIiB1bml0cywgYXQgd2hpY2ggdGhlIHJlc291cmNlCi0gICAgICAgICAgc2hvdWxkIGJlIHVzZWQuICBUaGlzIGNvbmZpZ3VyYXRpb24gdmFsdWUgd2lsbCBjaGFuZ2Ugd2hlbiB0aGUgb3JpZW50YXRpb24KLSAgICAgICAgICBjaGFuZ2VzIGJldHdlZW4gbGFuZHNjYXBlIGFuZCBwb3J0cmFpdCB0byBtYXRjaCB0aGUgY3VycmVudCBhY3R1YWwgaGVpZ2h0LgotICAgICAgICAgIFdoZW4gbXVsdGlwbGUgc2NyZWVuIGhlaWdodCBjb25maWd1cmF0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgY2xvc2VzdCB0bwotICAgICAgICAgIHRoZSBjdXJyZW50IHNjcmVlbiBoZWlnaHQgd2lsbCBiZSB1c2VkLiAgVGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIGlzCi0gICAgICAgICAgYXBwcm94aW1hdGU7IHNjcmVlbiBkZWNvcmF0aW9ucyBsaWtlIGEgc3RhdHVzIGJhciBvciBzeXN0ZW0gYmFyIG1heSBjYXVzZQotICAgICAgICAgIHRoZSBhY3R1YWwgc3BhY2UgYXZhaWxhYmxlIGluIHlvdXIgVUkgdG8gYmUgc2xpZ2h0bHkgc21hbGxlci4KLSAgICAgICAgPHA+PGVtPkFkZGVkIGluIEFQSSBMZXZlbCAxMy48L2VtPjwvcD4KLSAgICAgICAgPHA+QWxzbyBzZWUgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb24jc2NyZWVuSGVpZ2h0RHB9Ci0gICAgICAgICAgY29uZmlndXJhdGlvbiBmaWVsZCwgd2hpY2ggaG9sZHMgdGhlIGN1cnJlbnQgc2NyZWVuIHdpZHRoLjwvcD4KLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KICAgICA8dHIgaWQ9Ik9yaWVudGF0aW9uUXVhbGlmaWVyIj4KICAgICAgIDx0ZD5TY3JlZW4gb3JpZW50YXRpb248L3RkPgogICAgICAgPHRkPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91aS9hY3Rpb25iYXIuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2FjdGlvbmJhci5qZAppbmRleCA3ZTEzNTY5Li42ZjEyYjk1IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2FjdGlvbmJhci5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2FjdGlvbmJhci5qZApAQCAtMTg0LDcgKzE4NCw3IEBACiA8cHJlPgogJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPyZndDsKICZsdDttZW51IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZW51X2FkZCIKKyAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lbnVfc2F2ZSIKICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9pY19tZW51X3NhdmUiCiAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZW51X3NhdmUiCiAgICAgICAgICAgPGI+YW5kcm9pZDpzaG93QXNBY3Rpb249ImlmUm9vbXx3aXRoVGV4dCI8L2I+IC8mZ3Q7CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9hZGsuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9hZGsuamQKaW5kZXggOGFhYTY1Yy4uZTRlMTIxNSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91c2IvYWRrLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdXNiL2Fkay5qZApAQCAtMjQsOCArMjQsNyBAQAogICAgICAgICA8L2xpPgogCiAgICAgICAgIDxsaT4KLSAgICAgICAgICA8YSBocmVmPSIjaG93Ij5Ib3cgYW4gQWNjZXNzb3J5IENvbW11bmljYXRlcyB3aXRoIGFuIEFuZHJvaWQtcG93ZXJlZCBEZXZpY2UgaW4gQWNjZXNzb3J5Ci0gICAgICAgICAgTW9kZTwvYT4KKyAgICAgICAgICA8YSBocmVmPSIjYWNjZXNzb3J5LXByb3RvY29sIj5JbXBsZW1lbnRpbmcgdGhlIEFuZHJvaWQgQWNjZXNzb3J5IFByb3RvY29sPC9hPgogCiAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiN3YWl0Ij5XYWl0IGZvciBhbmQgZGV0ZWN0IGNvbm5lY3RlZCBkZXZpY2VzPC9hPjwvbGk+CkBAIC00MCw4ICszOSw3IEBACiAgICAgICAgIDwvbGk+CiAKICAgICAgICAgPGxpPgotICAgICAgICAgIDxhIGhyZWY9IiNmaXJtd2FyZSI+SG93IHRoZSBBREsgYm9hcmQgY29tbXVuaWNhdGVzIHdpdGggYW4gQW5kcm9pZC1wb3dlcmVkIERldmljZSBpbgotICAgICAgICAgIEFjY2Vzc29yeSBNb2RlPC9hPgorICAgICAgICAgIDxhIGhyZWY9IiNmaXJtd2FyZSI+SG93IHRoZSBBREsgYm9hcmQgaW1wbGVtZW50cyB0aGUgQW5kcm9pZCBBY2Nlc3NvcnkgUHJvdG9jb2w8L2E+CiAKICAgICAgICAgICA8b2w+CiAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iI3dhaXQtYWRrIj5XYWl0IGZvciBhbmQgZGV0ZWN0IGNvbm5lY3RlZCBkZXZpY2VzPC9hPjwvbGk+CkBAIC01Niw3ICs1NCw3IEBACiAgICAgICAgIDwvbGk+CiAgICAgICA8L29sPgogCi0gICAgICAKKwogCiAgICAgICA8aDI+U2VlIGFsc288L2gyPgogCkBAIC02NCw3ICs2Miw3IEBACiAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9czdzemNwWGYyckUiPkdvb2dsZSBJL08gU2Vzc2lvbiBWaWRlbzwvYT48L2xpPgogICAgICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy91c2IvYWNjZXNzb3J5Lmh0bWwiPlVTQiBBY2Nlc3NvcnkgRGV2IEd1aWRlPC9hPjwvbGk+CiAgICAgICA8L29sPgotICAgICAgCisKICAgICAgIDxoMj5XaGVyZSB0byBidXk8L2gyPgogCiAgICAgICA8b2w+CkBAIC03OCw2ICs3Niw5IEBACiAKICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc3RvcmUuZGl5ZHJvbmVzLmNvbS9Qcm9kdWN0RGV0YWlscy5hc3A/UHJvZHVjdENvZGU9QlItUGhvbmVEcm9uZSI+CiAgICAgICAgIERJWSBEcm9uZXM8L2E+PC9saT4KKworICAgIDxsaT48YSBocmVmPSJodHRwOi8vc2hvcC5tb2Rlcm5kZXZpY2UuY29tL3Byb2R1Y3RzL2ZyZWVkdWluby11c2ItaG9zdC1ib2FyZCI+CisgICAgICAgIE1vZGVybiBEZXZpY2U8L2E+PC9saT4KICAgICAgIDwvb2w+CiAgICAgPC9kaXY+CiAgIDwvZGl2PgpAQCAtODYsNyArODcsNyBAQAogICBzdXBwb3J0LCB3aGljaCBhbGxvd3MgZXh0ZXJuYWwgVVNCIGhhcmR3YXJlIChhbiBBbmRyb2lkIFVTQiBhY2Nlc3NvcnkpIHRvIGludGVyYWN0IHdpdGggYW4KICAgQW5kcm9pZC1wb3dlcmVkIGRldmljZSBpbiBhIHNwZWNpYWwgImFjY2Vzc29yeSIgbW9kZS4gV2hlbiBhbiBBbmRyb2lkLXBvd2VyZWQgcG93ZXJlZCBkZXZpY2UgaXMKICAgaW4gYWNjZXNzb3J5IG1vZGUsIHRoZSBjb25uZWN0ZWQgYWNjZXNzb3J5IGFjdHMgYXMgdGhlIFVTQiBob3N0IChwb3dlcnMgdGhlIGJ1cyBhbmQgZW51bWVyYXRlcwotICBkZXZpY2VzKSBhbmQgdGhlIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UgYWN0cyBhcyB0aGUgZGV2aWNlLiBBbmRyb2lkIFVTQiBhY2Nlc3NvcmllcyBhcmUKKyAgZGV2aWNlcykgYW5kIHRoZSBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlIGFjdHMgYXMgdGhlIFVTQiBkZXZpY2UuIEFuZHJvaWQgVVNCIGFjY2Vzc29yaWVzIGFyZQogICBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gYXR0YWNoIHRvIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2VzIGFuZCBhZGhlcmUgdG8gYSBzaW1wbGUgcHJvdG9jb2wKICAgKEFuZHJvaWQgYWNjZXNzb3J5IHByb3RvY29sKSB0aGF0IGFsbG93cyB0aGVtIHRvIGRldGVjdCBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlcyB0aGF0IHN1cHBvcnQKICAgYWNjZXNzb3J5IG1vZGUuIEFjY2Vzc29yaWVzIG11c3QgYWxzbyBwcm92aWRlIDUwMG1BIGF0IDVWIGZvciBjaGFyZ2luZyBwb3dlci4gTWFueSBwcmV2aW91c2x5CkBAIC0xMTIsNiArMTEzLDggQEAKICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9zdG9yZS5kaXlkcm9uZXMuY29tL1Byb2R1Y3REZXRhaWxzLmFzcD9Qcm9kdWN0Q29kZT1CUi1QaG9uZURyb25lIj5ESVkKICAgICBEcm9uZXM8L2E+IHByb3ZpZGVzIGFuIEFyZHVpbm8tY29tcGF0aWJsZSBib2FyZCBnZWFyZWQgdG93YXJkcyBSQyAocmFkaW8gY29udHJvbGxlZCkgYW5kIFVBVgogICAgICh1bm1hbm5lZCBhZXJpYWwgdmVoaWNsZSkgZW50aHVzaWFzdHMuPC9saT4KKyAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3Nob3AubW9kZXJuZGV2aWNlLmNvbS9wcm9kdWN0cy9mcmVlZHVpbm8tdXNiLWhvc3QtYm9hcmQiPk1vZGVybgorICAgICAgICBEZXZpY2U8L2E+IHByb3ZpZGVzIGFuIEFyZHVpbm8tY29tcGF0aWJsZSBib2FyZCB0aGF0IHN1cHBvcnRzIHRoZSBBREsgZmlybXdhcmUuPC9saT4KICAgPC91bD4KIAogICA8cD5XZSBleHBlY3QgbW9yZSBoYXJkd2FyZSBkaXN0cmlidXRlcnMgdG8gY3JlYXRlIGEgdmFyaWV0eSBvZiBraXRzLCBzbyBwbGVhc2Ugc3RheSB0dW5lZCBmb3IKQEAgLTM4MCwxNCArMzgzLDExIEBACiAgIGFjY2Vzc29yaWVzIGNvbW11bmljYXRlIHdpdGggQW5kcm9pZC1wb3dlcmVkIGRldmljZXMgZGVzY3JpYmUgbXVjaCBvZiB3aGF0IHlvdSBzaG91bGQgYmUgZG9pbmcgaW4KICAgeW91ciBvd24gYWNjZXNzb3J5LjwvcD4KIAotICA8aDIgaWQ9ImhvdyI+SG93IGFuIEFjY2Vzc29yeSBDb21tdW5pY2F0ZXMgd2l0aCBhbiBBbmRyb2lkLXBvd2VyZWQgRGV2aWNlIGluIEFjY2Vzc29yeSBNb2RlPC9oMj4KKyAgPGgyIGlkPSJhY2Nlc3NvcnktcHJvdG9jb2wiPkltcGxlbWVudGluZyB0aGUgQW5kcm9pZCBBY2Nlc3NvcnkgUHJvdG9jb2w8L2gyPgogCi0gIDxwPldoZW4geW91IGNvbm5lY3QgYW4gYWNjZXNzb3J5IHRvIGFuIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UsIHRoZSBhY2Nlc3NvcnkncyBmaXJtd2FyZSBtdXN0Ci0gIGNhcnJ5IG91dCBzb21lIHN0YW5kYXJkIHN0ZXBzIHRvIHNldCB1cCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UuIElmIHlvdSBhcmUKLSAgYnVpbGRpbmcgYW4gYWNjZXNzb3J5IGFsb25nIHdpdGggYW4gYXBwbGljYXRpb24sIHRoaXMgc2VjdGlvbiBnb2VzIG92ZXIgc29tZSBnZW5lcmFsIHN0ZXBzIHRoYXQKLSAgeW91ciBmaXJtd2FyZSBzaG91bGQgY2Fycnkgb3V0LjwvcD4KLQotICA8cD5JbiBnZW5lcmFsLCBhbiBhY2Nlc3Nvcnkgc2hvdWxkIGNhcnJ5IG91dCB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KKyAgPHA+QW4gQW5kcm9pZCBVU0IgYWNjZXNzb3J5IG11c3QgYWRoZXJlIHRvIEFuZHJvaWQgQWNjZXNzb3J5IFByb3RvY29sLCB3aGljaCBkZWZpbmVzIGhvdworICBhbiBhY2Nlc3NvcnkgZGV0ZWN0cyBhbmQgc2V0cyB1cCBjb21tdW5pY2F0aW9uIHdpdGggYW4gQW5kcm9pZC1wb3dlcmVkIGRldmljZS4gSW4gZ2VuZXJhbCwgYW4KKyAgYWNjZXNzb3J5IHNob3VsZCBjYXJyeSBvdXQgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+CiAKICAgPG9sPgogICAgIDxsaT5XYWl0IGZvciBhbmQgZGV0ZWN0IGNvbm5lY3RlZCBkZXZpY2VzPC9saT4KQEAgLTM5OSw2ICszOTksOCBAQAogICAgIDxsaT5Fc3RhYmxpc2ggY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkZXZpY2UgaWYgaXQgc3VwcG9ydHMgdGhlIEFuZHJvaWQgYWNjZXNzb3J5IHByb3RvY29sPC9saT4KICAgPC9vbD4KIAorICA8cD5UaGUgZm9sbG93aW5nIHNlY3Rpb25zIGdvIGludG8gZGVwdGggYWJvdXQgaG93IHRvIGltcGxlbWVudCB0aGVzZSBzdGVwcy48L3A+CisKICAgPGgzIGlkPSJ3YWl0Ij5XYWl0IGZvciBhbmQgZGV0ZWN0IGNvbm5lY3RlZCBkZXZpY2VzPC9oMz4KIAogICA8cD5Zb3VyIGFjY2Vzc29yeSBzaG91bGQgaGF2ZSBsb2dpYyB0byBjb250aW51b3VzbHkgY2hlY2sKQEAgLTQ3NiwxMiArNDc4LDEyIEBACiAgICAgICA8cD5UaGUgZm9sbG93aW5nIHN0cmluZyBJRHMgYXJlIHN1cHBvcnRlZCwgd2l0aCBhIG1heGltdW0gc2l6ZSBvZiAyNTYgYnl0ZXMgZm9yIGVhY2ggc3RyaW5nCiAgICAgICAobXVzdCBiZSB6ZXJvIHRlcm1pbmF0ZWQgd2l0aCBcMCkuPC9wPgogICAgICAgPHByZT4KLW1hbnVmYWN0dXJlciBuYW1lOiAgMQotbW9kZWwgbmFtZTogICAgICAgICAyCi1kZXNjcmlwdGlvbjogICAgICAgIDMKLXZlcnNpb246ICAgICAgICAgICAgNAotVVJJOiAgICAgICAgICAgICAgICA1Ci1zZXJpYWwgbnVtYmVyOiAgICAgIDYKK21hbnVmYWN0dXJlciBuYW1lOiAgMAorbW9kZWwgbmFtZTogICAgICAgICAxCitkZXNjcmlwdGlvbjogICAgICAgIDIKK3ZlcnNpb246ICAgICAgICAgICAgMworVVJJOiAgICAgICAgICAgICAgICA0CitzZXJpYWwgbnVtYmVyOiAgICAgIDUKIDwvcHJlPgogICAgIDwvbGk+CiAKQEAgLTUyMCwxMiArNTIyLDExIEBACiAgIGRldmljZSdzIGNvbmZpZ3VyYXRpb24gdG8gYSB2YWx1ZSBvZiAxIHdpdGggYSBTRVRfQ09ORklHVVJBVElPTiAoMHgwOSkgZGV2aWNlIHJlcXVlc3QsIHRoZW4KICAgY29tbXVuaWNhdGUgdXNpbmcgdGhlIGVuZHBvaW50cy48L3A+CiAKLSAgPGgyIGlkPSJmaXJtd2FyZSI+SG93IHRoZSBBREsgYm9hcmQgY29tbXVuaWNhdGVzIHdpdGggYW4gQW5kcm9pZC1wb3dlcmVkIERldmljZSBpbiBBY2Nlc3NvcnkKLSAgTW9kZTwvaDI+CisgIDxoMiBpZD0iZmlybXdhcmUiPkhvdyB0aGUgQURLIGJvYXJkIGltcGxlbWVudHMgdGhlIEFuZHJvaWQgQWNjZXNzb3J5IHByb3RvY29sPC9oMj4KIAogICA8cD5JZiB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhlIEFESyBib2FyZCBhbmQgc2hpZWxkLCB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIHRoZSBmaXJtd2FyZQogICBjb2RlIHRoYXQgeW91IGluc3RhbGxlZCBvbnRvIHRoZSBBREsgYm9hcmQuIFRoZSBmaXJtd2FyZSBkZW1vbnN0cmF0ZXMgYSBwcmFjdGljYWwgZXhhbXBsZSBvZiBob3cKLSAgdG8gY29tbXVuaWNhdGUgd2l0aCBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLiBFdmVuIGlmIHlvdSBkbyBub3QgaGF2ZSB0aGUgQURLIGJvYXJkIGFuZCBzaGllbGQsCisgIHRvIGltcGxlbWVudCB0aGUgQW5kcm9pZCBBY2Nlc3NvcnkgcHJvdG9jb2wuIEV2ZW4gaWYgeW91IGRvIG5vdCBoYXZlIHRoZSBBREsgYm9hcmQgYW5kIHNoaWVsZCwKICAgcmVhZGluZyB0aHJvdWdoIGhvdyB0aGUgaGFyZHdhcmUgZGV0ZWN0cyBhbmQgaW50ZXJhY3RzIHdpdGggZGV2aWNlcyBpbiBhY2Nlc3NvcnkgbW9kZSBpcyBzdGlsbAogICB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcG9ydCB0aGUgY29kZSBvdmVyIGZvciB5b3VyIG93biBhY2Nlc3Nvcmllcy48L3A+CiAKQEAgLTU0MCw4ICs1NDEsNyBAQAogICBzZWN0aW9ucy48L3A+CiAKICAgPHA+VGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSB0aGUgZmlybXdhcmUgY29kZSBpbiB0aGUgY29udGV4dCBvZiB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgotICA8YSBocmVmPSIjaG93Ij5Ib3cgYW4gQWNjZXNzb3J5IENvbW11bmljYXRlcyB3aXRoIGFuIEFuZHJvaWQtcG93ZXJlZCBEZXZpY2UgaW4gQWNjZXNzb3J5Ci0gIE1vZGU8L2E+LjwvcD4KKyAgPGEgaHJlZj0iI2FjY2Vzc29yeS1wcm90b2NvbCI+SW1wbGVtZW50aW5nIHRoZSBBbmRyb2lkIEFjY2Vzc29yeSBQcm90b2NvbDwvYT4uPC9wPgogCiAgIDxoMyBpZD0id2FpdC1hZGsiPldhaXQgZm9yIGFuZCBkZXRlY3QgY29ubmVjdGVkIGRldmljZXM8L2gzPgogCkBAIC01NTksMTMgKzU1OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgIjEuMCIsCiAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5hbmRyb2lkLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAiMDAwMDAwMDAxMjM0NTY3OCIpOwotICAgICAgICAgICAgICAgICAgICAgCisKIC4uLgogdm9pZCBsb29wKCkKIHsKIC4uLgotICAgIGlmIChhY2MuaXNDb25uZWN0ZWQoKSkgeyAgCi0gICAgICAgIC8vY29tbXVuaWNhdGUgd2l0aCBBbmRyb2lkIGFwcGxpY2F0aW9uIAorICAgIGlmIChhY2MuaXNDb25uZWN0ZWQoKSkgeworICAgICAgICAvL2NvbW11bmljYXRlIHdpdGggQW5kcm9pZCBhcHBsaWNhdGlvbgogICAgIH0KICAgICBlbHNlewogICAgICAgICAvL3NldCB0aGUgYWNjZXNzb3J5IHRvIGl0cyBkZWZhdWx0IHN0YXRlCkBAIC03MjgsNyArNzI4LDcgQEAKICAgICAgICAgU2VyaWFsLnByaW50KCJDYW4ndCBnZXQgY29uZmlnIGRlc2NyaXB0b3JcbiIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAorCiAuLi4KIDwvcHJlPgogCkBAIC04NTksMTMgKzg1OSwxMyBAQAogICBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgYWNjZXNzb3J5LCBzdWNoIGFzIGxpZ2h0aW5nIHVwIG9yIGNoYW5naW5nIHRoZSBjb2xvciBvZiB0aGUgTEVECiAgIGxpZ2h0cy48L3A+CiAgIDxwcmU+Ci1pbnQgQW5kcm9pZEFjY2Vzc29yeTo6cmVhZCh2b2lkICpidWZmLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgbmFrTGltaXQpIHsgCi0gIHJldHVybiB1c2IubmV3SW5UcmFuc2ZlcigxLCBpbiwgbGVuLCAoY2hhciAqKWJ1ZmYsIG5ha0xpbWl0KTsgfSAKLSAgCi1pbnQgQW5kcm9pZEFjY2Vzc29yeTo6d3JpdGUodm9pZCAqYnVmZiwgaW50IGxlbikgeyAKLSAgdXNiLm91dFRyYW5zZmVyKDEsIG91dCwgbGVuLCAoY2hhciAqKWJ1ZmYpOyAKK2ludCBBbmRyb2lkQWNjZXNzb3J5OjpyZWFkKHZvaWQgKmJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBuYWtMaW1pdCkgeworICByZXR1cm4gdXNiLm5ld0luVHJhbnNmZXIoMSwgaW4sIGxlbiwgKGNoYXIgKilidWZmLCBuYWtMaW1pdCk7IH0KKworaW50IEFuZHJvaWRBY2Nlc3Nvcnk6OndyaXRlKHZvaWQgKmJ1ZmYsIGludCBsZW4pIHsKKyAgdXNiLm91dFRyYW5zZmVyKDEsIG91dCwgbGVuLCAoY2hhciAqKWJ1ZmYpOwogICByZXR1cm4gbGVuOyB9Ci0gIAorCiA8L3ByZT4KIAogICA8cD5TZWUgdGhlIDxjb2RlPmZpcm13YXJlL2RlbW9raXQvZGVtb2tpdC5wZGU8L2NvZGU+IGZpbGUgZm9yIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgQURLIGJvYXJkCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdXNiL2luZGV4LmpkCmluZGV4IDE4YWYwNmEuLjNlMmExOGIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdXNiL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdXNiL2luZGV4LmpkCkBAIC02LDkgKzYsOSBAQAogICAgICAgPGgyPlRvcGljczwvaDI+CiAKICAgICAgIDxvbD4KLSAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH0vZ3VpZGUvdG9waWNzL1VTQi9hY2Nlc3NvcnkuamQiPlVTQiBBY2Nlc3Nvcnk8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvVVNCL2FjY2Vzc29yeS5qZCI+VVNCIEFjY2Vzc29yeTwvYT48L2xpPgogCi0gICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9L2d1aWRlL3RvcGljcy9VU0IvaG9zdC5qZCI+VVNCIEhvc3Q8L2E+PC9saT4KKyAgICAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvVVNCL2hvc3QuamQiPlVTQiBIb3N0PC9hPjwvbGk+CiAgICAgICA8L29sPgogICAgIDwvZGl2PgogICA8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvaW1hZ2VzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aF9ydW5uaW5nc2VydmljZXMucG5nIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9pbWFnZXMvc2VydmljZS1hcGktY2hhbmdlcy1zdGFydGluZy13aXRoX3J1bm5pbmdzZXJ2aWNlcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1OWZmZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvaW1hZ2VzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aF9ydW5uaW5nc2VydmljZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvaW1hZ2VzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aF9zdG9wc2VydmljZS5wbmcgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2ltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfc3RvcHNlcnZpY2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOGYwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2ltYWdlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGhfc3RvcHNlcnZpY2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvbXVsdGl0YXNraW5nLWFuZHJvaWQtd2F5LmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9tdWx0aXRhc2tpbmctYW5kcm9pZC13YXkuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjODYyNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvbXVsdGl0YXNraW5nLWFuZHJvaWQtd2F5LmpkCkBAIC0wLDAgKzEsMTAzIEBACitwYWdlLnRpdGxlPU11bHRpdGFza2luZyB0aGUgQW5kcm9pZCBXYXkKK3BhcmVudC50aXRsZT1BcnRpY2xlcworcGFyZW50Lmxpbms9Li4vYnJvd3Nlci5odG1sP3RhZz1hcnRpY2xlCitAamQ6Ym9keQorCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKzxkaXYgaWQ9InF2Ij4KKworICA8aDI+U2VlIGFsc288L2gyPgorICA8b2w+CisgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3Rhc2tzLWFuZC1iYWNrLXN0YWNrLmh0bWwiPlRhc2tzIGFuZCBCYWNrIFN0YWNrPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3NlcnZpY2VzLmh0bWwiPlNlcnZpY2VzPC9hPjwvbGk+CisgIDwvb2w+CisKKyAgPGgyPktleSBjbGFzc2VzPC9oMj4KKyAgPG9sPgorICAgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX08L2xpPgorICAgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfTwvbGk+CisgIDwvb2w+CisKKzwvZGl2PgorPC9kaXY+CisKKzxwPkFuZHJvaWQgaXMgZmFpcmx5IHVuaXF1ZSBpbiB0aGUgd2F5cyBpdCBhbGxvd3MgbXVsdGlwbGUgYXBwbGljYXRpb25zIHRvIHJ1biBhdCB0aGUgc2FtZSB0aW1lLiAgRGV2ZWxvcGVycyBjb21pbmcgZnJvbSBhIGRpZmZlcmVudCBwbGF0Zm9ybSBtYXkgZmluZCB0aGUgd2F5IGl0IG9wZXJhdGVzIHN1cnByaXNpbmcuICBVbmRlcnN0YW5kaW5nIGl0cyBiZWhhdmlvciBpcyBpbXBvcnRhbnQgZm9yIGRlc2lnbmluZyBhcHBsaWNhdGlvbnMgdGhhdCB3aWxsIHdvcmsgd2VsbCBhbmQgaW50ZWdyYXRlIHNlYW1sZXNzbHkgd2l0aCB0aGUgcmVzdCBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4gIFRoaXMgYXJ0aWNsZSBjb3ZlcnMgdGhlIHJlYXNvbnMgZm9yIEFuZHJvaWQncyBtdWx0aXRhc2tpbmcgZGVzaWduLCBpdHMgaW1wYWN0IG9uIGhvdyBhcHBsaWNhdGlvbnMgd29yaywgYW5kIGhvdyB5b3UgY2FuIGJlc3QgdGFrZSBhZHZhbnRhZ2Ugb2YgQW5kcm9pZCdzIHVuaXF1ZSBmZWF0dXJlcy48L3A+Cis8aDM+RGVzaWduIGNvbnNpZGVyYXRpb25zPC9oMz4KKzxwPk1vYmlsZSBkZXZpY2VzIGhhdmUgdGVjaG5pY2FsIGxpbWl0YXRpb25zIGFuZCB1c2VyIGV4cGVyaWVuY2UgcmVxdWlyZW1lbnRzIG5vdCBwcmVzZW50IGluIGRlc2t0b3Agb3Igd2ViIHN5c3RlbXMuICBIZXJlIGFyZSB0aGUgZm91ciBrZXkgY29uc3RyYWludHMgd2Ugd2VyZSB3b3JraW5nIHVuZGVyIGFzIHdlIGRlc2lnbmVkIEFuZHJvaWQncyBtdWx0aXRhc2tpbmc6PC9wPgorPHVsPgorICA8bGk+CisgICAgPHA+V2UgZGlkIG5vdCB3YW50IHRvIHJlcXVpcmUgdGhhdCB1c2VycyBjbG9zZSBhcHBsaWNhdGlvbnMgd2hlbiAiZG9uZSIgd2l0aCB0aGVtLiAgU3VjaCBhIHVzYWdlIHBhdHRlcm4gZG9lcyBub3Qgd29yayB3ZWxsIGluIGEgbW9iaWxlIGVudmlyb25tZW50LCB3aGVyZSB1c2FnZSB0ZW5kcyB0byBpbnZvbHZlIHJlcGVhdGVkIGJyaWVmIGNvbnRhY3Qgd2l0aCBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgdGhyb3VnaG91dCB0aGUgZGF5LjwvcD4KKyAgPC9saT4KKyAgPGxpPgorICAgIDxwPk1vYmlsZSBkZXZpY2VzIGRvbid0IGhhdmUgdGhlIGx1eHVyeSBvZiBzd2FwIHNwYWNlLCBzbyBoYXZlIGZhaXJseSBoYXJkIGxpbWl0cyBvbiBtZW1vcnkgdXNlLiAgUm9iZXJ0IExvdmUgaGFzIDxhIGhyZWY9Imh0dHA6Ly9ibG9nLnJsb3ZlLm9yZy8yMDEwLzA0L3doeS1pcGFkLWFuZC1pcGhvbmUtZG9udC1zdXBwb3J0Lmh0bWwiPmEgdmVyeSBnb29kIGFydGljbGU8L2E+IGNvdmVyaW5nIHRoZSB0b3BpYy48L3A+CisgIDwvbGk+CisgIDxsaT4KKyAgICA8cD5BcHBsaWNhdGlvbiBzd2l0Y2hpbmcgb24gYSBtb2JpbGUgZGV2aWNlIGlzIGV4dHJlbWVseSBjcml0aWNhbDsgd2UgdGFyZ2V0IHNpZ25pZmljYW50bHkgbGVzcyB0aGFuIDEgc2Vjb25kIHRvIGxhdW5jaCBhIG5ldyBhcHBsaWNhdGlvbi4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgd2hlbiB0aGUgdXNlciBpcyBzd2l0Y2hpbmcgYmV0d2VlbiBhIGZldyBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMgc3dpdGNoaW5nIHRvIGxvb2sgYXQgYSBuZXcgU01TIG1lc3NhZ2Ugd2hpbGUgd2F0Y2hpbmcgYSB2aWRlbywgYW5kIHRoZW4gcmV0dXJuaW5nIHRvIHRoYXQgdmlkZW8uICBBIG5vdGljZWFibGUgd2FpdCBpbiBzdWNoIHNpdHVhdGlvbnMgd2lsbCBxdWlja2x5IG1ha2UgdXNlcnMgaGF0ZSB5b3UuPC9wPgorICA8L2xpPgorICA8bGk+CisgICAgPHA+VGhlIGF2YWlsYWJsZSBBUElzIG11c3QgYmUgc3VmZmljaWVudCBmb3Igd3JpdGluZyB0aGUgYnVpbHQtaW4gR29vZ2xlIGFwcGxpY2F0aW9ucywgYXMgcGFydCBvZiBvdXIgImFsbCBhcHBsaWNhdGlvbnMgYXJlIGNyZWF0ZWQgZXF1YWwiIHBoaWxvc29waHkuICBUaGlzIG1lYW5zIGJhY2tncm91bmQgbXVzaWMgcGxheWJhY2ssIGRhdGEgc3luY2luZywgR1BTIG5hdmlnYXRpb24sIGFuZCBhcHBsaWNhdGlvbiBkb3dubG9hZGluZyBtdXN0IGJlIGltcGxlbWVudGVkIHdpdGggdGhlIHNhbWUgQVBJcyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhpcmQgcGFydHkgZGV2ZWxvcGVycy48L3A+CisgIDwvbGk+Cis8L3VsPgorPHA+VGhlIGZpcnN0IHR3byByZXF1aXJlbWVudHMgaGlnaGxpZ2h0IGFuIGludGVyZXN0aW5nIGNvbmZsaWN0LiAgV2UgZG9uJ3Qgd2FudCB1c2VycyB0byB3b3JyeSBhYm91dCBjbG9zaW5nIHRoZWlyIGFwcHMsIGJ1dCByYXRoZXIgbWFrZSBpdCBhcHBlYXIgdGhhdCBhbGwgb2YgdGhlIGFwcGxpY2F0aW9ucyBhcmUgYWx3YXlzIHJ1bm5pbmcuICBBdCB0aGUgc2FtZSB0aW1lLCBtb2JpbGUgZGV2aWNlcyBoYXZlIGhhcmQgbGltaXRzIG9uIG1lbW9yeSB1c2UsIHNvIHRoYXQgYSBzeXN0ZW0gd2lsbCBkZWdyYWRlIG9yIGV2ZW4gc3RhcnQgZmFpbGluZyB2ZXJ5IHF1aWNrbHkgYXMgaXQgbmVlZHMgbW9yZSBSQU0gdGhhbiBpcyBhdmFpbGFibGU7IGEgZGVza3RvcCBjb21wdXRlciwgd2l0aCBzd2FwLCBpbiBjb250cmFzdCB3aWxsIHNpbXBseSBzdGFydCBzbG93aW5nIGRvd24gYXMgaXQgbmVlZHMgdG8gcGFnZSBSQU0gdG8gaXRzIHN3YXAgc3BhY2UuICBUaGVzZSBjb21wZXRpbmcgY29uc3RyYWludHMgd2VyZSBhIGtleSBtb3RpdmF0aW9uIGZvciBBbmRyb2lkJ3MgZGVzaWduLjwvcD4KKzxoMz5XaGVuIGRvZXMgYW4gYXBwbGljYXRpb24gInN0b3AiPzwvaDM+Cis8cD5BIGNvbW1vbiBtaXN1bmRlcnN0YW5kaW5nIGFib3V0IEFuZHJvaWQgbXVsdGl0YXNraW5nIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwcm9jZXNzIGFuZCBhbiBhcHBsaWNhdGlvbi4gIEluIEFuZHJvaWQgdGhlc2UgYXJlIG5vdCB0aWdodGx5IGNvdXBsZWQgZW50aXRpZXM6IGFwcGxpY2F0aW9ucyBtYXkgc2VlbSBwcmVzZW50IHRvIHRoZSB1c2VyIHdpdGhvdXQgYW4gYWN0dWFsIHByb2Nlc3MgY3VycmVudGx5IHJ1bm5pbmcgdGhlIGFwcDsgbXVsdGlwbGUgYXBwbGljYXRpb25zIG1heSBzaGFyZSBwcm9jZXNzZXMsIG9yIG9uZSBhcHBsaWNhdGlvbiBtYXkgbWFrZSB1c2Ugb2YgbXVsdGlwbGUgcHJvY2Vzc2VzIGRlcGVuZGluZyBvbiBpdHMgbmVlZHM7IHRoZSBwcm9jZXNzKGVzKSBvZiBhbiBhcHBsaWNhdGlvbiBtYXkgYmUga2VwdCBhcm91bmQgYnkgQW5kcm9pZCBldmVuIHdoZW4gdGhhdCBhcHBsaWNhdGlvbiBpcyBub3QgYWN0aXZlbHkgZG9pbmcgc29tZXRoaW5nLjwvcD4KKzxwPlRoZSBmYWN0IHRoYXQgeW91IGNhbiBzZWUgYW4gYXBwbGljYXRpb24ncyBwcm9jZXNzICJydW5uaW5nIiBkb2VzIG5vdCBtZWFuIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIG9yIGRvaW5nIGFueXRoaW5nLiAgSXQgbWF5IHNpbXBseSBiZSB0aGVyZSBiZWNhdXNlIEFuZHJvaWQgbmVlZGVkIGl0IGF0IHNvbWUgcG9pbnQsIGFuZCBoYXMgZGVjaWRlZCB0aGF0IGl0IHdvdWxkIGJlIGJlc3QgdG8ga2VlcCBpdCBhcm91bmQgaW4gY2FzZSBpdCBuZWVkcyBpdCBhZ2Fpbi4gIExpa2V3aXNlLCB5b3UgbWF5IGxlYXZlIGFuIGFwcGxpY2F0aW9uIGZvciBhIGxpdHRsZSBiaXQgYW5kIHJldHVybiB0byBpdCBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiwgYW5kIGR1cmluZyB0aGF0IHRpbWUgQW5kcm9pZCBtYXkgaGF2ZSBuZWVkZWQgdG8gZ2V0IHJpZCBvZiB0aGUgcHJvY2VzcyBmb3Igb3RoZXIgdGhpbmdzLjwvcD4KKzxwPkEga2V5IHRvIGhvdyBBbmRyb2lkIGhhbmRsZXMgYXBwbGljYXRpb25zIGluIHRoaXMgd2F5IGlzIHRoYXQgcHJvY2Vzc2VzIGRvbid0IHNodXQgZG93biBjbGVhbmx5LiAgV2hlbiB0aGUgdXNlciBsZWF2ZXMgYW4gYXBwbGljYXRpb24sIGl0cyBwcm9jZXNzIGlzIGtlcHQgYXJvdW5kIGluIHRoZSBiYWNrZ3JvdW5kLCBhbGxvd2luZyBpdCB0byBjb250aW51ZSB3b3JraW5nIChmb3IgZXhhbXBsZSBkb3dubG9hZGluZyB3ZWIgcGFnZXMpIGlmIG5lZWRlZCwgYW5kIGNvbWUgaW1tZWRpYXRlbHkgdG8gdGhlIGZvcmVncm91bmQgaWYgdGhlIHVzZXIgcmV0dXJucyB0byBpdC4gIElmIGEgZGV2aWNlIG5ldmVyIHJ1bnMgb3V0IG9mIG1lbW9yeSwgdGhlbiBBbmRyb2lkIHdpbGwga2VlcCBhbGwgb2YgdGhlc2UgcHJvY2Vzc2VzIGFyb3VuZCwgdHJ1bHkgbGVhdmluZyBhbGwgYXBwbGljYXRpb25zICJydW5uaW5nIiBhbGwgb2YgdGhlIHRpbWUuPC9wPgorPHA+T2YgY291cnNlLCB0aGVyZSBpcyBhIGxpbWl0ZWQgYW1vdW50IG9mIG1lbW9yeSwgYW5kIHRvIGFjY29tbW9kYXRlIHRoaXMgQW5kcm9pZCBtdXN0IGRlY2lkZSB3aGVuIHRvIGdldCByaWQgb2YgcHJvY2Vzc2VzIHRoYXQgYXJlIG5vdCBuZWVkZWQuICBUaGlzIGxlYWRzIHRvIEFuZHJvaWQncyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5odG1sI3Byb2NsaWZlIj5wcm9jZXNzIGxpZmVjeWNsZTwvYT4sIHRoZSBydWxlcyBpdCB1c2VzIHRvIGRlY2lkZSBob3cgaW1wb3J0YW50IGVhY2ggcHJvY2VzcyBpcyBhbmQgdGh1cyB0aGUgbmV4dCBvbmUgdGhhdCBzaG91bGQgYmUgZHJvcHBlZC4gIFRoZXNlIHJ1bGVzIGFyZSBiYXNlZCBvbiBib3RoIGhvdyBpbXBvcnRhbnQgYSBwcm9jZXNzIGlzIGZvciB0aGUgdXNlcidzIGN1cnJlbnQgZXhwZXJpZW5jZSwgYXMgd2VsbCBhcyBob3cgbG9uZyBpdCBoYXMgYmVlbiBzaW5jZSB0aGUgcHJvY2VzcyB3YXMgbGFzdCBuZWVkZWQgYnkgdGhlIHVzZXIuPC9wPgorPHA+T25jZSBBbmRyb2lkIGRldGVybWluZXMgdGhhdCBpdCBuZWVkcyB0byByZW1vdmUgYSBwcm9jZXNzLCBpdCBkb2VzIHRoaXMgYnJ1dGFsbHksIHNpbXBseSBmb3JjZS1raWxsaW5nIGl0LiAgVGhlIGtlcm5lbCBjYW4gdGhlbiBpbW1lZGlhdGVseSByZWNsYWltIGFsbCByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBwcm9jZXNzLCB3aXRob3V0IHJlbHlpbmcgb24gdGhhdCBhcHBsaWNhdGlvbiBiZWluZyB3ZWxsIHdyaXR0ZW4gYW5kIHJlc3BvbnNpdmUgdG8gYSBwb2xpdGUgcmVxdWVzdCB0byBleGl0LiAgQWxsb3dpbmcgdGhlIGtlcm5lbCB0byBpbW1lZGlhdGVseSByZWNsYWltIGFwcGxpY2F0aW9uIHJlc291cmNlcyBtYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gYXZvaWQgc2VyaW91cyBvdXQgb2YgbWVtb3J5IHNpdHVhdGlvbnMuPC9wPgorPHA+SWYgYSB1c2VyIGxhdGVyIHJldHVybnMgdG8gYW4gYXBwbGljYXRpb24gdGhhdCdzIGJlZW4ga2lsbGVkLCBBbmRyb2lkIG5lZWRzIGEgd2F5IHRvIHJlLWxhdW5jaCBpdCBpbiB0aGUgc2FtZSBzdGF0ZSBhcyBpdCB3YXMgbGFzdCBzZWVuLCB0byBwcmVzZXJ2ZSB0aGUgImFsbCBhcHBsaWNhdGlvbnMgYXJlIHJ1bm5pbmcgYWxsIG9mIHRoZSB0aW1lIiBleHBlcmllbmNlLiAgVGhpcyBpcyBkb25lIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbiB0aGUgdXNlciBpcyBhd2FyZSBvZiAodGhlIEFjdGl2aXRpZXMpLCBhbmQgcmUtc3RhcnRpbmcgdGhlbSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN0YXRlIHRoZXkgd2VyZSBzZWVuIGluLiAgVGhpcyBsYXN0IHN0YXRlIGlzIGdlbmVyYXRlZCBlYWNoIHRpbWUgdGhlIHVzZXIgbGVhdmVzIHRoYXQgcGFydCBvZiB0aGUgYXBwbGljYXRpb24sIG5vdCB3aGVuIGl0IGlzIGtpbGxlZCwgc28gdGhhdCB0aGUga2VybmVsIGNhbiBsYXRlciBmcmVlbHkga2lsbCBpdCB3aXRob3V0IGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYXRpb24gdG8gcmVzcG9uZCBjb3JyZWN0bHkgYXQgdGhhdCBwb2ludC48L3A+Cis8cD5JbiBzb21lIHdheXMsIEFuZHJvaWQncyBwcm9jZXNzIG1hbmFnZW1lbnQgY2FuIGJlIHNlZW4gYXMgYSBmb3JtIG9mIHN3YXAgc3BhY2U6IGFwcGxpY2F0aW9uIHByb2Nlc3NlcyByZXByZXNlbnQgYSBjZXJ0YWluIGFtb3VudCBvZiBpbi11c2UgbWVtb3J5OyB3aGVuIG1lbW9yeSBpcyBsb3csIHNvbWUgcHJvY2Vzc2VzIGNhbiBiZSBraWxsZWQgKHN3YXBwZWQgb3V0KTsgd2hlbiB0aG9zZSBwcm9jZXNzZXMgYXJlIG5lZWRlZCBhZ2FpbiwgdGhleSBjYW4gYmUgcmUtc3RhcnRlZCBmcm9tIHRoZWlyIGxhc3Qgc2F2ZWQgc3RhdGUgKHN3YXBwZWQgaW4pLjwvcD4KKzxoMz5FeHBsaWNpdGx5IHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQ8L2gzPgorPHA+U28gZmFyLCB3ZSBoYXZlIGEgd2F5IGZvciBhcHBsaWNhdGlvbnMgdG8gaW1wbGljaXRseSBkbyB3b3JrIGluIHRoZSBiYWNrZ3JvdW5kLCBhcyBsb25nIGFzIHRoZSBwcm9jZXNzIGRvZXNuJ3QgZ2V0IGtpbGxlZCBieSBBbmRyb2lkIGFzIHBhcnQgb2YgaXRzIHJlZ3VsYXIgbWVtb3J5IG1hbmFnZW1lbnQuICBUaGlzIGlzIGZpbmUgZm9yIHRoaW5ncyBsaWtlIGxvYWRpbmcgd2ViIHBhZ2VzIGluIHRoZSBiYWNrZ3JvdW5kLCBidXQgd2hhdCBhYm91dCBmZWF0dXJlcyB3aXRoIGhhcmRlciByZXF1aXJlbWVudHM/ICBCYWNrZ3JvdW5kIG11c2ljIHBsYXliYWNrLCBkYXRhIHN5bmNocm9uaXphdGlvbiwgbG9jYXRpb24gdHJhY2tpbmcsIGFsYXJtIGNsb2NrcywgZXRjLjwvcD4KKzxwLz4KKzxwPkZvciB0aGVzZSB0YXNrcywgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIGEgd2F5IHRvIHRlbGwgQW5kcm9pZCAiSSB3b3VsZCBleHBsaWNpdGx5IGxpa2UgdG8gcnVuIGF0IHRoaXMgcG9pbnQuIiAgVGhlcmUgYXJlIHR3byBtYWluIGZhY2lsaXRpZXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucyBmb3IgdGhpcywgcmVwcmVzZW50ZWQgYnkgdHdvIGtpbmRzIG9mIGNvbXBvbmVudHMgdGhleSBjYW4gcHVibGlzaCBpbiB0aGVpciBtYW5pZmVzdDogPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6aXRhbGljOyI+YnJvYWRjYXN0IHJlY2VpdmVyczwvc3Bhbj4gYW5kIDxzcGFuIHN0eWxlPSJmb250LXN0eWxlOml0YWxpYzsiPnNlcnZpY2VzPC9zcGFuPi48L3A+Cis8aDQ+QnJvYWRjYXN0IFJlY2VpdmVyczwvaDQ+Cis8cD5BIEJyb2FkY2FzdFJlY2VpdmVyIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBydW4sIGZvciBhIGJyaWVmIGFtb3VudCBvZiB0aW1lLCBpbiB0aGUgYmFja2dyb3VuZCBhcyBhIHJlc3VsdCBvZiBzb21ldGhpbmcgZWxzZSBoYXBwZW5pbmcuICBJdCBjYW4gYmUgdXNlZCBpbiBtYW55IHdheXMgdG8gYnVpbGQgaGlnaGVyLWxldmVsIGZhY2lsaXRpZXM6IGZvciBleGFtcGxlIHRoZSBBbGFybU1hbmFnZXIgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIGhhdmUgYSBicm9hZGNhc3Qgc2VudCBhdCBhIGNlcnRhaW4gdGltZSBpbiB0aGUgZnV0dXJlLCBhbmQgdGhlIExvY2F0aW9uTWFuYWdlciBjYW4gc2VuZCBhIGJyb2FkY2FzdCB3aGVuIGl0IGRldGVjdHMgaW50ZXJlc3RpbmcgY2hhbmdlcyBpbiBsb2NhdGlvbi4gIEJlY2F1c2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY2VpdmVyIGlzIHBhcnQgb2YgYW4gYXBwbGljYXRpb24ncyBtYW5pZmVzdCwgQW5kcm9pZCBjYW4gZmluZCBhbmQgbGF1bmNoIHRoZSBhcHBsaWNhdGlvbiBldmVuIGlmIGl0IGlzbid0IHJ1bm5pbmc7IG9mIGNvdXJzZSBpZiBpdCBhbHJlYWR5IGhhcyBpdHMgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIGJhY2tncm91bmQsIHRoZSBicm9hZGNhc3QgY2FuIHZlcnkgZWZmaWNpZW50bHkgYmUgZGlyZWN0bHkgZGlzcGF0Y2hlZCB0byBpdC48L3A+Cis8cD5XaGVuIGhhbmRsaW5nIGEgYnJvYWRjYXN0LCB0aGUgYXBwbGljYXRpb24gaXMgZ2l2ZW4gYSBmaXhlZCBzZXQgb2YgdGltZSAoY3VycmVudGx5IDEwIHNlY29uZHMpIGluIHdoaWNoIHRvIGRvIGl0cyB3b3JrLiAgSWYgaXQgZG9lc24ndCBjb21wbGV0ZSBpbiB0aGF0IHRpbWUsIHRoZSBhcHBsaWNhdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlIG1pc2JlaGF2aW5nLCBhbmQgaXRzIHByb2Nlc3MgaW1tZWRpYXRlbHkgdG9zc2VkIGludG8gdGhlIGJhY2tncm91bmQgc3RhdGUgdG8gYmUga2lsbGVkIGZvciBtZW1vcnkgaWYgbmVlZGVkLjwvcD4KKzxwPkJyb2FkY2FzdCByZWNlaXZlcnMgYXJlIGdyZWF0IGZvciBkb2luZyBzbWFsbCBwaWVjZXMgb2Ygd29yayBpbiByZXNwb25zZSB0byBhbiBleHRlcm5hbCBzdGltdWx1cywgc3VjaCBhcyBwb3N0aW5nIGEgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyIGFmdGVyIGJlaW5nIHNlbnQgYSBuZXcgR1BTIGxvY2F0aW9uIHJlcG9ydC4gIFRoZXkgYXJlIHZlcnkgbGlnaHR3ZWlnaHQsIHNpbmNlIHRoZSBhcHBsaWNhdGlvbidzIHByb2Nlc3Mgb25seSBuZWVkcyB0byBiZSBhcm91bmQgd2hpbGUgYWN0aXZlbHkgcmVjZWl2aW5nIHRoZSBicm9hZGNhc3QuICBCZWNhdXNlIHRoZXkgYXJlIGFjdGl2ZSBmb3IgYSBkZXRlcm1pbmlzdGljIGFtb3VudCBvZiB0aW1lLCBmYWlybHkgc3Ryb25nIGd1YXJhbnRlZXMgY2FuIGJlIG1hZGUgYWJvdXQgbm90IGtpbGxpbmcgdGhlaXIgcHJvY2VzcyB3aGlsZSBydW5uaW5nLiAgSG93ZXZlciB0aGV5IGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIGFueXRoaW5nIG9mIGluZGV0ZXJtaW5hdGUgbGVuZ3RoLCBzdWNoIGFzIG5ldHdvcmtpbmcuPC9wPgorPGg0PlNlcnZpY2VzPC9oND4KKzxwPkEgU2VydmljZSBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gaW1wbGVtZW50IGxvbmdlci1ydW5uaW5nIGJhY2tncm91bmQgb3BlcmF0aW9ucy4gIFRoZXJlIGFyZSBhY3R1YWxseSBhIGxvdCBvZiBvdGhlciBmdW5jdGlvbnMgdGhhdCBzZXJ2aWNlcyBwcm92aWRlLCBidXQgZm9yIHRoZSBkaXNjdXNzaW9uIGhlcmUgdGhlaXIgZnVuZGFtZW50YWwgcHVycG9zZSBpcyBmb3IgYW4gYXBwbGljYXRpb24gdG8gc2F5ICJoZXkgSSB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIHJ1bm5pbmcgZXZlbiB3aGlsZSBpbiB0aGUgYmFja2dyb3VuZCwgdW50aWwgSSBzYXkgSSBhbSBkb25lLiIgIEFuIGFwcGxpY2F0aW9uIGNvbnRyb2xzIHdoZW4gaXRzIHNlcnZpY2UgcnVucyBieSBleHBsaWNpdGx5IHN0YXJ0aW5nIGFuZCBzdG9wcGluZyB0aGUgc2VydmljZS48L3A+Cis8cD5XaGlsZSBzZXJ2aWNlcyBkbyBwcm92aWRlIGEgcmljaCBjbGllbnQtc2VydmVyIG1vZGVsLCBpdHMgdXNlIGlzIG9wdGlvbmFsLiAgVXBvbiBzdGFydGluZyBhbiBhcHBsaWNhdGlvbidzIHNlcnZpY2VzLCBBbmRyb2lkIHNpbXBseSBpbnN0YW50aWF0ZXMgdGhlIGNvbXBvbmVudCBpbiB0aGUgYXBwbGljYXRpb24ncyBwcm9jZXNzIHRvIHByb3ZpZGUgaXRzIGNvbnRleHQuICBIb3cgaXQgaXMgdXNlZCBhZnRlciB0aGF0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbjogaXQgY2FuIHB1dCBhbGwgb2YgdGhlIG5lZWRlZCBjb2RlIGluc2lkZSBvZiB0aGUgc2VydmljZSBpdHNlbGYgd2l0aG91dCBpbnRlcmFjdGluZyB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbiwgbWFrZSBjYWxscyBvbiBvdGhlciBzaW5nbGV0b24gb2JqZWN0cyBzaGFyZWQgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgYXBwLCBkaXJlY3RseSByZXRyaWV2ZSB0aGUgU2VydmljZSBpbnN0YW5jZSBmcm9tIGVsc2V3aGVyZSBpZiBuZWVkZWQsIG9yIHJ1biBpdCBpbiBhbm90aGVyIHByb2Nlc3MgYW5kIGRvIGEgZnVsbC1ibG93biBSUEMgcHJvdG9jb2wgaWYgdGhhdCBpcyBkZXNpcmVkLjwvcD4KKzxwPlByb2Nlc3MgbWFuYWdlbWVudCBmb3Igc2VydmljZXMgaXMgZGlmZmVyZW50IHRoYW4gYnJvYWRjYXN0IHJlY2VpdmVycywgYmVjYXVzZSBhbiB1bmJvdW5kZWQgbnVtYmVyIG9mIHNlcnZpY2VzIGNhbiBhc2sgdG8gYmUgcnVubmluZyBmb3IgYW4gdW5rbm93biBhbW91bnQgb2YgdGltZS4gIFRoZXJlIG1heSBub3QgYmUgZW5vdWdoIFJBTSB0byBoYXZlIGFsbCBvZiB0aGUgcmVxdWVzdGluZyBzZXJ2aWNlcyBydW4sIHNvIGFzIGEgcmVzdWx0IG5vIHN0cm9uZyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IGJlaW5nIGFibGUgdG8ga2VlcCB0aGVtIHJ1bm5pbmcuPC9wPgorPHA+SWYgdGhlcmUgaXMgdG9vIGxpdHRsZSBSQU0sIHByb2Nlc3NlcyBob3N0aW5nIHNlcnZpY2VzIHdpbGwgYmUgaW1tZWRpYXRlbHkga2lsbGVkIGxpa2UgYmFja2dyb3VuZCBwcm9jZXNzZXMgYXJlLiAgSG93ZXZlciwgaWYgYXBwcm9wcmlhdGUsIEFuZHJvaWQgd2lsbCByZW1lbWJlciB0aGF0IHRoZXNlIHNlcnZpY2VzIHdpc2ggdG8gcmVtYWluIHJ1bm5pbmcsIGFuZCByZXN0YXJ0IHRoZWlyIHByb2Nlc3MgYXQgYSBsYXRlciB0aW1lIHdoZW4gbW9yZSBSQU0gaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIGdvZXMgdG8gYSB3ZWIgcGFnZSB0aGF0IHJlcXVpcmVzIGxhcmdlIGFtb3VudHMgb2YgUkFNLCBBbmRyb2lkIG1heSBraWxsIGJhY2tncm91bmQgc2VydmljZSBwcm9jZXNzZXMgbGlrZSBzeW5jIHVudGlsIHRoZSBicm93c2VyJ3MgbWVtb3J5IG5lZWRzIGdvIGRvd24uPC9wPgorPHA+U2VydmljZXMgY2FuIGZ1cnRoZXIgbmVnb3RpYXRlIHRoaXMgYmVoYXZpb3IgYnkgcmVxdWVzdGluZyB0aGV5IGJlIGNvbnNpZGVyZWQgImZvcmVncm91bmQuIiAgVGhpcyBwbGFjZXMgdGhlIHNlcnZpY2UgaW4gYSAicGxlYXNlIGRvbid0IGtpbGwiIHN0YXRlLCBidXQgcmVxdWlyZXMgdGhhdCBpdCBpbmNsdWRlIGEgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyIGFib3V0IGl0IGFjdGl2ZWx5IHJ1bm5pbmcuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc2VydmljZXMgc3VjaCBhcyBiYWNrZ3JvdW5kIG11c2ljIHBsYXliYWNrIG9yIGNhciBuYXZpZ2F0aW9uLCB3aGljaCB0aGUgdXNlciBpcyBhY3RpdmVseSBhd2FyZSBvZjsgd2hlbiB5b3UncmUgcGxheWluZyBtdXNpYyBhbmQgdXNpbmcgdGhlIGJyb3dzZXIsIHlvdSBjYW4gYWx3YXlzIHNlZSB0aGUgbXVzaWMtcGxheWluZyBnbHlwaCBpbiB0aGUgc3RhdHVzIGJhci4gIEFuZHJvaWQgd29uJ3QgdHJ5IHRvIGtpbGwgdGhlc2Ugc2VydmljZXMsIGJ1dCBhcyBhIHRyYWRlLW9mZiwgZW5zdXJlcyB0aGUgdXNlciBrbm93cyBhYm91dCB0aGVtIGFuZCBpcyBhYmxlIHRvIGV4cGxpY2l0bHkgc3RvcCB0aGVtIHdoZW4gZGVzaXJlZC48L3A+Cis8aDM+VGhlIHZhbHVlIG9mIGdlbmVyaWMgY29tcG9uZW50czwvaDM+Cis8cD5BbmRyb2lkJ3MgZ2VuZXJpYyBicm9hZGNhc3QgcmVjZWl2ZXIgYW5kIHNlcnZpY2UgY29tcG9uZW50cyBhbGxvdyBkZXZlbG9wZXJzIHRvIGNyZWF0ZSBhIHdpZGUgdmFyaWV0eSBvZiBlZmZpY2llbnQgYmFja2dyb3VuZCBvcGVyYXRpb25zLCBpbmNsdWRpbmcgdGhpbmdzIHRoYXQgd2VyZSBuZXZlciBvcmlnaW5hbGx5IGNvbnNpZGVyZWQuICBJbiBBbmRyb2lkIDEuMCB0aGV5IHdlcmUgdXNlZCB0byBpbXBsZW1lbnQgbmVhcmx5IGFsbCBvZiB0aGUgYmFja2dyb3VuZCBiZWhhdmlvciB0aGF0IHRoZSBidWlsdC1pbiBhbmQgcHJvcHJpZXRhcnkgR29vZ2xlIGFwcHMgcHJvdmlkZWQ6PC9wPgorPHVsPgorICA8bGk+CisgICAgTXVzaWMgcGxheWJhY2sgcnVucyBpbiBhIHNlcnZpY2UgdG8gYWxsb3cgaXQgdG8gY29udGludWUgb3BlcmF0aW5nIGFmdGVyIHRoZSB1c2VyIGxlYXZlcyB0aGUgbXVzaWMgYXBwbGljYXRpb24uCisgIDwvbGk+CisgIDxsaT4KKyAgICBUaGUgYWxhcm0gY2xvY2sgc2NoZWR1bGVzIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHdpdGggdGhlIGFsYXJtIG1hbmFnZXIsIHRvIGdvIG9mZiBhdCB0aGUgbmV4dCBzZXQgYWxhcm0gdGltZS4KKyAgPC9saT4KKyAgPGxpPgorICAgIFRoZSBjYWxlbmRhciBhcHBsaWNhdGlvbiBsaWtld2lzZSBzY2hlZHVsZXMgYW4gYWxhcm0gdG8gZGlzcGxheSBvciB1cGRhdGUgaXRzIG5vdGlmaWNhdGlvbiBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZSBmb3IgdGhlIG5leHQgY2FsZW5kYXIgZXZlbnQuCisgIDwvbGk+CisgIDxsaT4KKyAgICBCYWNrZ3JvdW5kIGZpbGUgZG93bmxvYWQgaXMgaW1wbGVtZW50ZWQgYSBzZXJ2aWNlIHRoYXQgcnVucyB3aGVuIHRoZXJlIGFyZSBhbnkgZG93bmxvYWRzIHRvIHByb2Nlc3MuCisgIDwvbGk+CisgIDxsaT4KKyAgICBUaGUgZS1tYWlsIGFwcGxpY2F0aW9uIHNjaGVkdWxlcyBhbiBhbGFybSB0byB3YWtlIHVwIGEgc2VydmljZSBhdCByZWd1bGFyIGludGVydmFscyB0aGF0IGxvb2tzIGZvciBhbmQgcmV0cmlldmVzIGFueSBuZXcgbWFpbC4KKyAgPC9saT4KKyAgPGxpPgorICAgIFRoZSBHb29nbGUgYXBwbGljYXRpb25zIG1haW50YWluIGEgc2VydmljZSB0byByZWNlaXZlIHB1c2ggbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBuZXR3b3JrOyBpdCBpbiB0dXJuIHNlbmRzIGJyb2FkY2FzdHMgdG8gaW5kaXZpZHVhbCBhcHBzIHdoZW4gaXQgaXMgdG9sZCB0aGF0IHRoZXkgbmVlZCB0byBkbyB0aGluZ3MgbGlrZSBzeW5jaHJvbml6ZSBjb250YWN0cy48L3A+CisgIDwvbGk+Cis8L3VsPgorPHA+QXMgdGhlIHBsYXRmb3JtIGhhcyBldm9sdmVkLCB0aGVzZSBzYW1lIGJhc2ljIGNvbXBvbmVudHMgaGF2ZSBiZWVuIHVzZWQgdG8gaW1wbGVtZW50IG1hbnkgb2YgdGhlIG1ham9yIG5ldyBkZXZlbG9wZXIgZmVhdHVyZXM6Cis8dWw+CisgIDxsaT4KKyAgICBJbnB1dCBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBieSBkZXZlbG9wZXJzIGFzIGEgU2VydmljZSBjb21wb25lbnQgdGhhdCBBbmRyb2lkIG1hbmFnZXMgYW5kIHdvcmtzIHdpdGggdG8gZGlzcGxheSBhcyB0aGUgY3VycmVudCBJTUUuCisgIDwvbGk+CisgIDxsaT4KKyAgICBBcHBsaWNhdGlvbiB3aWRnZXRzIGFyZSBicm9hZGNhc3QgcmVjZWl2ZXJzIHRoYXQgQW5kcm9pZCBzZW5kcyBicm9hZGNhc3RzIHRvIHdoZW4gaXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGVtLiAgVGhpcyBhbGxvd3MgYXBwIHdpZGdldHMgdG8gYmUgcXVpdGUgbGlnaHR3ZWlnaHQsIGJ5IG5vdCBuZWVkaW5nIHRoZWlyIGFwcGxpY2F0aW9uJ3MgcHJvY2VzcyByZW1haW4gcnVubmluZy4KKyAgPC9saT4KKyAgPGxpPgorICAgIEFjY2Vzc2liaWxpdHkgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkIGFzIHNlcnZpY2VzIHRoYXQgQW5kcm9pZCBrZWVwcyBydW5uaW5nIHdoaWxlIGluIHVzZSBhbmQgc2VuZHMgYXBwcm9wcmlhdGUgaW5mb3JtYXRpb24gdG8gYWJvdXQgdXNlciBpbnRlcmFjdGlvbnMuCisgIDwvbGk+CisgIDxsaT4KKyAgICBTeW5jIGFkYXB0ZXJzIGludHJvZHVjZWQgaW4gQW5kcm9pZCAyLjAgYXJlIHNlcnZpY2VzIHRoYXQgYXJlIHJ1biBpbiB0aGUgYmFja2dyb3VuZCB3aGVuIGEgcGFydGljdWxhciBkYXRhIHN5bmMgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLgorICA8L2xpPgorICA8bGk+CisgICAgTGl2ZSB3YWxscGFwZXJzIGFyZSBhIHNlcnZpY2Ugc3RhcnRlZCBieSBBbmRyb2lkIHdoZW4gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCisgIDwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGguamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aC5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmFmZDgxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGguamQKQEAgLTAsMCArMSwxNzcgQEAKK3BhZ2UudGl0bGU9U2VydmljZSBBUEkgY2hhbmdlcyBzdGFydGluZyB3aXRoIEFuZHJvaWQgMi4wCitwYXJlbnQudGl0bGU9QXJ0aWNsZXMKK3BhcmVudC5saW5rPS4uL2Jyb3dzZXIuaHRtbD90YWc9YXJ0aWNsZQorQGpkOmJvZHkKKworCis8ZGl2IGlkPSJxdi13cmFwcGVyIj4KKzxkaXYgaWQ9InF2Ij4KKworICA8aDI+U2VlIGFsc288L2gyPgorICA8b2w+CisgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzL3NlcnZpY2VzLmh0bWwiPlNlcnZpY2VzPC9hPjwvbGk+CisgIDwvb2w+CisKKyAgPGgyPktleSBjbGFzc2VzPC9oMj4KKyAgPG9sPgorICAgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX08L2xpPgorICA8L29sPgorCis8L2Rpdj4KKzwvZGl2PgorCis8cD5XYXRjaGluZyBkZXZlbG9wZXJzIHVzZSB0aGUgQW5kcm9pZCBwbGF0Zm9ybSB0aGUgbGFzdCB5ZWFyIGhhcyBzaG93biBhIG51bWJlciBvZiB0cm91YmxlIGFyZWFzIGluIHRoZSBTZXJ2aWNlIEFQSSBhcyB3ZWxsIGFzIGdyb3dpbmcgaXNzdWVzIGluIHRoZSB3YXlzIHNlcnZpY2VzIG9wZXJhdGUuIEFzIGEgcmVzdWx0LCBBbmRyb2lkIDIuMCBpbnRyb2R1Y2VkIGEgbnVtYmVyIG9mIGNoYW5nZXMgYW5kIGltcHJvdmVtZW50cyBpbiB0aGlzIGFyZWEgZm9yIGJvdGggZGV2ZWxvcGVycyBhbmQgdXNlcnMuPC9wPgorPHA+VGhlIHRocmVlIG1haW4gY2hhbmdlcyB0byBiZSBhd2FyZSBvZiBhcmU6PC9wPgorPHVsPgorICA8bGk+U2VydmljZS5zZXRGb3JlZ3JvdW5kKCkgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIGluIDIuMCBkb2VzIG5vdGhpbmcuPC9saT4KKyAgPGxpPlRoZXJlIHdlcmUgbWFueSBlZGdlIGNhc2VzIGluIHRoZSBzZXJ2aWNlIGxpZmVjeWNsZSB0aGF0IG1hZGUgaXQgdmVyeSBlYXN5IHRvIGFjY2lkZW50YWxseSBsZWF2ZSBhIHNlcnZpY2UgcnVubmluZzsgbmV3IEFQSXMgaW4gMi4wIG1ha2UgdGhpcyBtdWNoIGVhc2llciB0byBkZWFsIHdpdGguPC9saT4KKyAgPGxpPkFuZHJvaWQgMi4wIGFsc28gaW50cm9kdWNlcyBhIG5ldyBVSSBmb3IgZW5kIHVzZXJzIHRvIG1vbml0b3IgYW5kIG1hbmFnZSB0aGUgcnVubmluZyBzZXJ2aWNlcyBvbiB0aGVpciBkZXZpY2UuPC9saT4KKzwvdWw+Cis8aDM+QmFja2dyb3VuZCBvbiBzZXJ2aWNlczwvaDM+Cis8cD5CZWZvcmUgZ29pbmcgaW50byB0aGUgZGV0YWlscyBvZiAyLjAsIGl0IG1heSBiZSB1c2VmdWwgdG8gZ28gb3ZlciBhIHF1aWNrIHN1bW1hcnkgb2Ygc2VydmljZXMuIFRoZSBTZXJ2aWNlIEFQSSBpbiBBbmRyb2lkIGlzIG9uZSBvZiB0aGUga2V5IG1lY2hhbmlzbXMgZm9yIGFwcGxpY2F0aW9ucyB0byBkbyB3b3JrIGluIHRoZSBiYWNrZ3JvdW5kLiBEdWUgdG8gdGhlIHdheSBBbmRyb2lkIGlzIGRlc2lnbmVkLCBvbmNlIGFuIGFwcGxpY2F0aW9uIGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHRoZSB1c2VyIGl0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIGV4cGVuZGFibGUgYW5kIGEgY2FuZGlkYXRlIHRvIGJlIGtpbGxlZCBieSB0aGUgc3lzdGVtIGlmIGl0IGV2ZXIgbmVlZHMgbWVtb3J5IGVsc2V3aGVyZS4gVGhlIG1haW4gd2F5IGFwcGxpY2F0aW9ucyBnZXQgYXJvdW5kIHRoaXMgaXMgYnkgc3RhcnRpbmcgYSBTZXJ2aWNlIGNvbXBvbmVudCwgd2hpY2ggZXhwbGljaXRseSB0ZWxscyB0aGUgc3lzdGVtIHRoYXQgdGhleSBhcmUgZG9pbmcgc29tZSB2YWx1YWJsZSB3b3JrIGFuZCB3b3VsZCBwcmVmZXIgdGhhdCB0aGUgc3lzdGVtIG5vdCBraWxsIHRoZWlyIHByb2Nlc3MgaWYgaXQgZG9lc24ndCB0cnVseSBuZWVkIHRvLjwvcD4KKzxwPlRoaXMgaXMgYSB2ZXJ5IHBvd2VyZnVsIGZhY2lsaXR5IGJ1dCBhbG9uZyB3aXRoIHRoYXQgcG93ZXIgY29tZXMgc29tZSByZXNwb25zaWJpbGl0eTogYW4gYWN0aXZlbHkgcnVubmluZyBzZXJ2aWNlIGlzIHRha2luZyByZXNvdXJjZXMgYXdheSBmcm9tIG90aGVyIHRoaW5ncyB0aGF0IGNhbiBydW4gKGluY2x1ZGluZyBpbmFjdGl2ZSBwcm9jZXNzZXMgaW4gdGhlIGJhY2tncm91bmQgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgdmlzaXRzIHRoZW0pLiBJdCBpcyB0aHVzIGltcG9ydGFudCB0aGF0IGRldmVsb3BlcnMgdGFrZSBjYXJlIHdoZW4gZGVzaWduaW5nIHRoZWlyIHNlcnZpY2VzIHRoYXQgdGhleSBvbmx5IHJ1biB3aGVuIHRydWx5IG5lZWRlZCBhbmQgYXZvaWQgYW55IGJ1Z3Mgd2hlcmUgdGhleSBtYXkgYWNjaWRlbnRhbGx5IGxlYXZlIHRoZSBzZXJ2aWNlIHJ1bm5pbmcgZm9yIGxvbmcgZHVyYXRpb25zLjwvcD4KKzxoMz5SZWRlc2lnbmluZyBTZXJ2aWNlLnNldEZvcmVncm91bmQoKTwvaDM+Cis8cD5EdXJpbmcgdGhlIGZpbmFsIHN0YWJpbGl6YXRpb24gcGVyaW9kIG9mIEFuZHJvaWQgMS42IHdlIHN0YXJ0ZWQgdG8gc2VlIG1vcmUgaXNzdWVzIGR1ZSB0byBhbiBpbmNyZWFzaW5nIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIFNlcnZpY2Uuc2V0Rm9yZWdyb3VuZCgpIEFQSSB3aGVuIHRoZXkgc2hvdWxkbid0IGJlLiBUaGlzIGlzIGFuIEFQSSB0aGF0IHdlIGhhdmVuJ3QgYWR2ZXJ0aXNlZCBtdWNoIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IG1vc3QgYXBwbGljYXRpb25zIGFuZCBjYW4gYmUgdmVyeSBoYXJkIG9uIHRoZSBzeXN0ZW06IGl0IGFza3MgdGhhdCB0aGUgc2VydmljZSdzIHByb2Nlc3MgYmUgdHJlYXRlZCBhcyBpbiB0aGUgZm9yZWdyb3VuZCwgZXNzZW50aWFsbHkgbWFraW5nIGl0IHVua2lsbGFibGUgYW5kIHRodXMgbW9yZSBkaWZmaWN1bHQgZm9yIHRoZSBzeXN0ZW0gdG8gcmVjb3ZlciBmcm9tIGxvdyBtZW1vcnkgc2l0dWF0aW9ucy48L3A+Cis8cD5BdCB0aGF0IHBvaW50IGluIDEuNiBpdCB3YXMgdG9vIGxhdGUgdG8gbWFrZSBhbnkgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgYmVoYXZpb3IgaGVyZSwgYnV0IGluIDIuMCB3ZSBoYXZlIGRvbmUgc286IFNlcnZpY2Uuc2V0Rm9yZWdyb3VuZCgpIG5vdyBkb2VzIG5vdGhpbmcuIFRoZSBBUEkgd2FzIGFsd2F5cyBpbnRlbmRlZCB0byBiZSBzb21ldGhpbmcgYSBzZXJ2aWNlIHdvdWxkIGRvIGluIGNvbmp1bmN0aW9uIHdpdGggcHV0dGluZyB1cCBhbiBvbmdvaW5nIG5vdGlmaWNhdGlvbiBmb3IgdGhlIHVzZXI7IGJ5IHNheWluZyB5b3UgYXJlIGluIHRoZSBmb3JlZ3JvdW5kLCB0aGUgdXNlciBzaG91bGQgYmUgImF3YXJlIiB0aGF0IHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcgaW4gc29tZSB3YXkgYW5kIGtub3cgaG93IHRvIHN0b3AgaXQuIFRodXMgaW4gcGxhY2Ugb2YgdGhlIG9sZCBBUEkgQW5kcmlvZCAyLjAgaW50cm9kdWNlcyB0d28gbmV3IEFQSXMgdGhhdCByZXF1aXJlIGEgbm90aWZpY2F0aW9uIGdvIGFsb25nIHdpdGggYmVpbmcgaW4gdGhlIGZvcmVncm91bmQ6PC9wPgorPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorcHVibGljIGZpbmFsIHZvaWQgc3RhcnRGb3JlZ3JvdW5kKGludCBpZCwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbik7CitwdWJsaWMgZmluYWwgdm9pZCBzdG9wRm9yZWdyb3VuZChib29sZWFuIHJlbW92ZU5vdGlmaWNhdGlvbik7Cis8L3ByZT4KKzxwPlRoaXMgYWxzbyBub3QgY29pbmNpZGVudGFsbHkgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gbWFuYWdlIHRoZSBub3RpZmljYXRpb24gc3RhdGUgYWxvbmcgd2l0aCB0aGUgc2VydmljZSwgc2luY2UgdGhlIHN5c3RlbSBjYW4gbm93IGd1YXJhbnRlZSB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhIG5vdGlmaWNhdGlvbiB3aGlsZSB0aGUgc2VydmljZSBpcyBpbiB0aGUgZm9yZWdyb3VuZCwgYW5kIHRoYXQgdGhlIG5vdGlmaWNhdGlvbiBnb2VzIGF3YXkgd2hlbmV2ZXIgdGhlIHNlcnZpY2UgZG9lcy48L3A+Cis8cD5NYW55IGRldmVsb3BlcnMgd2lsbCB3YW50IHRvIHdyaXRlIGEgc2VydmljZSB0aGF0IHdvcmtzIG9uIG9sZGVyIHBsYXRmb3JtcyBhcyB3ZWxsIGFzIDIuMCBhbmQgbGF0ZXI7IHRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gc2VsZWN0aXZlbHkgY2FsbCB0aGUgbmV3IEFQSXMgd2hlbiB0aGV5IGFyZSBhdmFpbGFibGUuPC9wPgorPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBtU3RhcnRGb3JlZ3JvdW5kU2lnbmF0dXJlID0gbmV3IENsYXNzW10geworICAgIGludC5jbGFzcywgTm90aWZpY2F0aW9uLmNsYXNzfTsKK3ByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gbVN0b3BGb3JlZ3JvdW5kU2lnbmF0dXJlID0gbmV3IENsYXNzW10geworICAgIGJvb2xlYW4uY2xhc3N9OworCitwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5NOworcHJpdmF0ZSBNZXRob2QgbVN0YXJ0Rm9yZWdyb3VuZDsKK3ByaXZhdGUgTWV0aG9kIG1TdG9wRm9yZWdyb3VuZDsKK3ByaXZhdGUgT2JqZWN0W10gbVN0YXJ0Rm9yZWdyb3VuZEFyZ3MgPSBuZXcgT2JqZWN0WzJdOworcHJpdmF0ZSBPYmplY3RbXSBtU3RvcEZvcmVncm91bmRBcmdzID0gbmV3IE9iamVjdFsxXTsKKworJiM2NDtPdmVycmlkZQorcHVibGljIHZvaWQgb25DcmVhdGUoKSB7CisgICAgbU5NID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShOT1RJRklDQVRJT05fU0VSVklDRSk7CisgICAgdHJ5IHsKKyAgICAgICAgbVN0YXJ0Rm9yZWdyb3VuZCA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKCJzdGFydEZvcmVncm91bmQiLAorICAgICAgICAgICAgICAgIG1TdGFydEZvcmVncm91bmRTaWduYXR1cmUpOworICAgICAgICBtU3RvcEZvcmVncm91bmQgPSBnZXRDbGFzcygpLmdldE1ldGhvZCgic3RvcEZvcmVncm91bmQiLAorICAgICAgICAgICAgICAgIG1TdG9wRm9yZWdyb3VuZFNpZ25hdHVyZSk7CisgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgLy8gUnVubmluZyBvbiBhbiBvbGRlciBwbGF0Zm9ybS4KKyAgICAgICAgbVN0YXJ0Rm9yZWdyb3VuZCA9IG1TdG9wRm9yZWdyb3VuZCA9IG51bGw7CisgICAgfQorfQorCisvKioKKyAqIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmV3IHN0YXJ0Rm9yZWdyb3VuZCBtZXRob2QsIHVzaW5nIHRoZSBvbGRlcgorICogQVBJcyBpZiBpdCBpcyBub3QgYXZhaWxhYmxlLgorICovCit2b2lkIHN0YXJ0Rm9yZWdyb3VuZENvbXBhdChpbnQgaWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAvLyBJZiB3ZSBoYXZlIHRoZSBuZXcgc3RhcnRGb3JlZ3JvdW5kIEFQSSwgdGhlbiB1c2UgaXQuCisgICAgaWYgKG1TdGFydEZvcmVncm91bmQgIT0gbnVsbCkgeworICAgICAgICBtU3RhcnRGb3JlZ3JvdW5kQXJnc1swXSA9IEludGVnZXIudmFsdWVPZihpZCk7CisgICAgICAgIG1TdGFydEZvcmVncm91bmRBcmdzWzFdID0gbm90aWZpY2F0aW9uOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVN0YXJ0Rm9yZWdyb3VuZC5pbnZva2UodGhpcywgbVN0YXJ0Rm9yZWdyb3VuZEFyZ3MpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgTG9nLncoIk15QXBwIiwgIlVuYWJsZSB0byBpbnZva2Ugc3RhcnRGb3JlZ3JvdW5kIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICBMb2cudygiTXlBcHAiLCAiVW5hYmxlIHRvIGludm9rZSBzdGFydEZvcmVncm91bmQiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIEZhbGwgYmFjayBvbiB0aGUgb2xkIEFQSS4KKyAgICBzZXRGb3JlZ3JvdW5kKHRydWUpOworICAgIG1OTS5ub3RpZnkoaWQsIG5vdGlmaWNhdGlvbik7Cit9CisKKy8qKgorICogVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBuZXcgc3RvcEZvcmVncm91bmQgbWV0aG9kLCB1c2luZyB0aGUgb2xkZXIKKyAqIEFQSXMgaWYgaXQgaXMgbm90IGF2YWlsYWJsZS4KKyAqLwordm9pZCBzdG9wRm9yZWdyb3VuZENvbXBhdChpbnQgaWQpIHsKKyAgICAvLyBJZiB3ZSBoYXZlIHRoZSBuZXcgc3RvcEZvcmVncm91bmQgQVBJLCB0aGVuIHVzZSBpdC4KKyAgICBpZiAobVN0b3BGb3JlZ3JvdW5kICE9IG51bGwpIHsKKyAgICAgICAgbVN0b3BGb3JlZ3JvdW5kQXJnc1swXSA9IEJvb2xlYW4uVFJVRTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1TdG9wRm9yZWdyb3VuZC5pbnZva2UodGhpcywgbVN0b3BGb3JlZ3JvdW5kQXJncyk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICBMb2cudygiTXlBcHAiLCAiVW5hYmxlIHRvIGludm9rZSBzdG9wRm9yZWdyb3VuZCIsIGUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgTG9nLncoIk15QXBwIiwgIlVuYWJsZSB0byBpbnZva2Ugc3RvcEZvcmVncm91bmQiLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIEZhbGwgYmFjayBvbiB0aGUgb2xkIEFQSS4gIE5vdGUgdG8gY2FuY2VsIEJFRk9SRSBjaGFuZ2luZyB0aGUKKyAgICAvLyBmb3JlZ3JvdW5kIHN0YXRlLCBzaW5jZSB3ZSBjb3VsZCBiZSBraWxsZWQgYXQgdGhhdCBwb2ludC4KKyAgICBtTk0uY2FuY2VsKGlkKTsKKyAgICBzZXRGb3JlZ3JvdW5kKGZhbHNlKTsKK30KKzwvcHJlPgorPGgzPlNlcnZpY2UgbGlmZWN5Y2xlIGNoYW5nZXM8L2gzPgorPHA+QW5vdGhlciBzaXR1YXRpb24gd2Ugd2VyZSBpbmNyZWFzaW5nbHkgc2VlaW5nIGluIDEuNiB3YXMgdGhhdCwgZXZlbiBpZ25vcmluZyB0aGUgc2VydmljZXMgdGhhdCBpbmFwcHJvcHJpYXRlbHkgbWFrZSB0aGVtc2VsdmVzIGZvcmVncm91bmQsIHdlIGhhZCBhIGdyb3dpbmcgbnVtYmVyIG9mIGRldmljZXMgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzZXJ2aWNlcyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIGFsbCBmaWdodGluZyBlYWNoIG90aGVyIG92ZXIgdGhlIGF2YWlsYWJsZSBtZW1vcnkuPC9wPgorPHA+UGFydCBvZiB0aGlzIHByb2JsZW0gaXMgc2VydmljZXMgdGhhdCBhcmUgcnVubmluZyBtb3JlIHRoYW4gdGhleSBzaG91bGQgb3IgdGhlcmUgc2ltcGx5IGJlaW5nIHRvbyBtdWNoIHN0dWZmIHRyeWluZyB0byBiZSBkb25lIG9uIHRoZSBkZXZpY2UuIEhvd2V2ZXIsIHdlIGFsc28gZm91bmQgbWFueSBpc3N1ZXMgaW4gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gc2VydmljZXMgYW5kIHRoZSBwbGF0Zm9ybSB0aGF0IG1hZGUgaXQgZWFzeSBmb3IgYW4gYXBwbGljYXRpb24gdG8gbGVhdmUgYSBzZXJ2aWNlIHJ1bm5pbmcgZXZlbiB3aGVuIGl0IGlzIHRyeWluZyB0byBkbyB0aGUgcmlnaHQgdGhpbmcuIENvbnNpZGVyIHRoaXMgdHlwaWNhbCBzY2VuYXJpbzo8L3A+Cis8b2w+CisgIDxsaT5BbiBhcHBsaWNhdGlvbiBjYWxscyBzdGFydFNlcnZpY2UoKS48L2xpPgorICA8bGk+VGhhdCBzZXJ2aWNlIGdldHMgb25DcmVhdGUoKSwgb25TdGFydCgpLCBhbmQgdGhlbiBzcGF3bnMgYSBiYWNrZ3JvdW5kIHRocmVhZCB0byBkbyBzb21lIHdvcmsuPC9saT4KKyAgPGxpPlRoZSBzeXN0ZW0gaXMgdGlnaHQgb24gbWVtb3J5LCBzbyBoYXMgdG8ga2lsbCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2VydmljZS48L2xpPgorICA8bGk+TGF0ZXIgd2hlbiBtZW1vcnkgaXMgZnJlZSwgdGhlIHNlcnZpY2UgaXMgcmVzdGFydGVkLCBhbmQgZ2V0cyBvbkNyZWF0ZSgpIGNhbGxlZCBidXQgbm90IG9uU3RhcnQoKSBiZWNhdXNlIHRoZXJlIGhhcyBub3QgYmVlbiBhbm90aGVyIGNhbGwgdG8gc3RhcnRTZXJ2aWNlKCkgd2l0aCBhIG5ldyBJbnRlbnQgY29tbWFuZCB0byBzZW5kIGl0LjwvbGk+Cis8L29sPgorPHA+Tm93IHRoZSBzZXJ2aWNlIHdpbGwgc2l0IHRoZXJlIGNyZWF0ZWQsIG5vdCByZWFsaXppbmcgaXQgdXNlZCB0byBiZSBkb2luZyBzb21lIHdvcmssIGFuZCBzbyBub3Qga25vd2luZyBpdCBzaG91bGQgc3RvcCBpdHNlbGYgYXQgc29tZSBwb2ludC48L3A+Cis8cD5UbyBhZGRyZXNzIHRoaXMsIGluIEFuZHJvaWQgMi4wIFNlcnZpY2Uub25TdGFydCgpIGFzIGJlZW4gZGVwcmVjYXRlZCAodGhvdWdoIHN0aWxsIGV4aXN0cyBhbmQgb3BlcmF0ZXMgYXMgaXQgdXNlZCB0byBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0pLiBJdCBpcyByZXBsYWNlZCB3aXRoIGEgbmV3IHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlI29uU3RhcnRDb21tYW5kKGFuZHJvaWQuY29udGVudC5JbnRlbnQsIGludCwgaW50KX0gY2FsbGJhY2sgdGhhdCBhbGxvd3MgdGhlIHNlcnZpY2UgdG8gYmV0dGVyIGNvbnRyb2wgaG93IHRoZSBzeXN0ZW0gc2hvdWxkIG1hbmFnZSBpdC4gVGhlIGtleSBwYXJ0IGhlcmUgaXMgYSBuZXcgcmVzdWx0IGNvZGUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uLCB0ZWxsaW5nIHRoZSBzeXN0ZW0gd2hhdCBpdCBzaG91bGQgZG8gd2l0aCB0aGUgc2VydmljZSBpZiBpdHMgcHJvY2VzcyBpcyBraWxsZWQgd2hpbGUgaXQgaXMgcnVubmluZzo8L3A+Cis8dWw+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNTVEFSVF9TVElDS1l9IGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgYmVoYXZpb3IsIHdoZXJlIHRoZSBzZXJ2aWNlIGlzIGxlZnQgInN0YXJ0ZWQiIGFuZCB3aWxsIGxhdGVyIGJlIHJlc3RhcnRlZCBieSB0aGUgc3lzdGVtLiBUaGUgb25seSBkaWZmZXJlbmNlIGZyb20gcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtIGlzIHRoYXQgaXQgaWYgaXQgZ2V0cyByZXN0YXJ0ZWQgYmVjYXVzZSBpdHMgcHJvY2VzcyBpcyBraWxsZWQsIG9uU3RhcnRDb21tYW5kKCkgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2Ugd2l0aCBhIG51bGwgSW50ZW50IGluc3RlYWQgb2Ygbm90IGJlaW5nIGNhbGxlZCBhdCBhbGwuIFNlcnZpY2VzIHRoYXQgdXNlIHRoaXMgbW9kZSBzaG91bGQgYWx3YXlzIGNoZWNrIGZvciB0aGlzIGNhc2UgYW5kIGRlYWwgd2l0aCBpdCBhcHByb3ByaWF0ZWx5LjwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNTVEFSVF9OT1RfU1RJQ0tZfSBzYXlzIHRoYXQsIGFmdGVyIHJldHVybmluZyBmcm9tIG9uU3RhcnRDcmVhdGVkKCksIGlmIHRoZSBwcm9jZXNzIGlzIGtpbGxlZCB3aXRoIG5vIHJlbWFpbmluZyBzdGFydCBjb21tYW5kcyB0byBkZWxpdmVyLCB0aGVuIHRoZSBzZXJ2aWNlIHdpbGwgYmUgc3RvcHBlZCBpbnN0ZWFkIG9mIHJlc3RhcnRlZC4gVGhpcyBtYWtlcyBhIGxvdCBtb3JlIHNlbnNlIGZvciBzZXJ2aWNlcyB0aGF0IGFyZSBpbnRlbmRlZCB0byBvbmx5IHJ1biB3aGlsZSBleGVjdXRpbmcgY29tbWFuZHMgc2VudCB0byB0aGVtLiBGb3IgZXhhbXBsZSwgYSBzZXJ2aWNlIG1heSBiZSBzdGFydGVkIGV2ZXJ5IDE1IG1pbnV0ZXMgZnJvbSBhbiBhbGFybSB0byBwb2xsIHNvbWUgbmV0d29yayBzdGF0ZS4gSWYgaXQgZ2V0cyBraWxsZWQgd2hpbGUgZG9pbmcgdGhhdCB3b3JrLCBpdCB3b3VsZCBiZSBiZXN0IHRvIGp1c3QgbGV0IGl0IGJlIHN0b3BwZWQgYW5kIGdldCBzdGFydGVkIHRoZSBuZXh0IHRpbWUgdGhlIGFsYXJtIGZpcmVzLjwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNTVEFSVF9SRURFTElWRVJfSU5URU5UfSBpcyBsaWtlIFNUQVJUX05PVF9TVElDS1ksIGV4Y2VwdCBpZiB0aGUgc2VydmljZSdzIHByb2Nlc3MgaXMga2lsbGVkIGJlZm9yZSBpdCBjYWxscyBzdG9wU2VsZigpIGZvciBhIGdpdmVuIGludGVudCwgdGhhdCBpbnRlbnQgd2lsbCBiZSByZS1kZWxpdmVyZWQgdG8gaXQgdW50aWwgaXQgY29tcGxldGVzICh1bmxlc3MgYWZ0ZXIgc29tZSBudW1iZXIgb2YgbW9yZSB0cmllcyBpdCBzdGlsbCBjYW4ndCBjb21wbGV0ZSwgYXQgd2hpY2ggcG9pbnQgdGhlIHN5c3RlbSBnaXZlcyB1cCkuIFRoaXMgaXMgdXNlZnVsIGZvciBzZXJ2aWNlcyB0aGF0IGFyZSByZWNlaXZpbmcgY29tbWFuZHMgb2Ygd29yayB0byBkbywgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkgZG8gZXZlbnR1YWxseSBjb21wbGV0ZSB0aGUgd29yayBmb3IgZWFjaCBjb21tYW5kIHNlbnQuPC9saT4KKzwvdWw+Cis8cD5Gb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywgdGhlIGRlZmF1bHQgcmV0dXJuIGNvZGUgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0YXJnZXRpbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZSBwbGF0Zm9ybSBpcyBhIHNwZWNpYWwge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2UjU1RBUlRfU1RJQ0tZX0NPTVBBVElCSUxJVFl9IGNvZGUgdGhhdCBwcm92aWRlcyB0aGUgb2xkIGJlaGF2aW9yIG9mIG5vdCBjYWxsaW5nIG9uU3RhcnQoKSB3aXRoIGEgbnVsbCBpbnRlbnQuIE9uY2UgeW91IHN0YXJ0IHRhcmdldGluZyBBUEkgdmVyc2lvbiA1IG9yIGxhdGVyLCB0aGUgZGVmYXVsdCBtb2RlIGlzIFNUQVJUX1NUSUNLWSBhbmQgeW91IG11c3QgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIG9uU3RhcnQoKSBvciBvblN0YXJ0Q29tbWFuZCgpIGJlaW5nIGNhbGxlZCB3aXRoIGEgbnVsbCBJbnRlbnQuPC9wPgorPHA+WW91IGNhbiBhbHNvIGVhc2lseSB3cml0ZSBhIFNlcnZpY2UgdGhhdCB1c2VzIGJvdGggdGhlIG9sZCBhbmQgbmV3IEFQSXMsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uIEFsbCB5b3UgbmVlZCB0byBkbyBpcyBjb21waWxlIGFnYWluc3QgdGhlIDIuMCBTREsgd2l0aCB0aGlzIGNvZGU6PC9wPgorPHByZSBjbGFzcz0icHJldHR5cHJpbnQiPgorLy8gVGhpcyBpcyB0aGUgb2xkIG9uU3RhcnQgbWV0aG9kIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gdGhlIHByZS0yLjAKKy8vIHBsYXRmb3JtLiAgT24gMi4wIG9yIGxhdGVyIHdlIG92ZXJyaWRlIG9uU3RhcnRDb21tYW5kKCkgc28gdGhpcworLy8gbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZC4KKyYjNjQ7T3ZlcnJpZGUKK3B1YmxpYyB2b2lkIG9uU3RhcnQoSW50ZW50IGludGVudCwgaW50IHN0YXJ0SWQpIHsKKyAgICBoYW5kbGVTdGFydChpbnRlbnQsIHN0YXJ0SWQpOworfQorCismIzY0O092ZXJyaWRlCitwdWJsaWMgaW50IG9uU3RhcnRDb21tYW5kKEludGVudCBpbnRlbnQsIGludCBmbGFncywgaW50IHN0YXJ0SWQpIHsKKyAgICBoYW5kbGVTdGFydChpbnRlbnQsIHN0YXJ0SWQpOworICAgIHJldHVybiBTVEFSVF9OT1RfU1RJQ0tZOworfQorCit2b2lkIGhhbmRsZVN0YXJ0KEludGVudCBpbnRlbnQsIGludCBzdGFydElkKSB7CisgICAgLy8gZG8gd29yaworfQorPC9wcmU+Cis8aDM+TmV3ICJydW5uaW5nIHNlcnZpY2VzIiB1c2VyIGludGVyZmFjZTwvaDM+Cis8cD5PdXIgZmluYWwgaXNzdWUgdG8gYWRkcmVzcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgc2ltcGx5IHRvbyBtYW55IHNlcnZpY2UgcnVubmluZyBpbiB0aGUgYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgb24gYSBkZXZpY2UuIFRoaXMgbWF5IGJlIGR1ZSB0byBidWdzIG9yIGRlc2lnbiBmbGF3cyBpbiBpbnN0YWxsZWQgYXBwbGljYXRpb25zLCBvciB0aGUgdXNlciBzaW1wbHkgdHJ5aW5nIHRvIGRvIHRvbyBtdWNoLiBIaXN0b3JpY2FsbHkgdXNlcnMgaGF2ZSBoYWQgbm8gdmlzaWJpbGl0eSBpbnRvIHdoYXQgaXMgZ29pbmcgb24gYXQgdGhpcyBsZXZlbCBpbiB0aGUgc3lzdGVtLCBidXQgaXQgaGFzIGJlY29tZSBpbXBvcnRhbnQgdG8gZXhwb3NlIHRoaXMsIGF0IGxlYXN0IGZvciBsb3dlci1lbmQgZGV2aWNlcywgYXMgdGhlIHVzZSBvZiBzZXJ2aWNlcyBoYXMgaGFkIGFuIGluY3JlYXNpbmcgaW1wYWN0IG9uIHRoZSB1c2VyIGV4cGVyaWVuY2UuPC9wPgorPHA+VG8gaGVscCBhZGRyZXNzIHRoaXMsIEFuZHJvaWQgMi4wIGludHJvZHVjZXMgYSBuZXcgIlJ1bm5pbmcgU2VydmljZXMiIGFjdGl2aXR5IGF2YWlsYWJsZSBmcm9tIHRoZSBBcHBsaWNhdGlvbiBzeXN0ZW0gc2V0dGluZ3MuIFdoZW4gYnJvdWdodCB1cCwgaXQgbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Cis8aW1nIHNyYz0iaW1hZ2VzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aF9ydW5uaW5nc2VydmljZXMucG5nIiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjMyMCIgYWx0PSJSdW5uaW5nIFNlcnZpY2VzIi8+Cis8cD5UaGUgbWFpbiBjb250ZW50IGlzIGEgbGlzdCBvZiBhbGwgcnVubmluZyBzZXJ2aWNlcyB0aGF0IG1heSBiZSBvZiBpbnRlcmVzdCB0byB0aGUgdXNlciwgb3JnYW5pemVkIGJ5IHRoZSBwcm9jZXNzZXMgdGhleSBydW4gaW4uIEluIHRoZSBleGFtcGxlIGhlcmUsIHdlIHNlZSB0aHJlZSBzZXJ2aWNlczo8L3A+Cis8dWw+CisgIDxsaT48Yj5HVGFsa1NlcnZpY2U8L2I+IGlzIHBhcnQgb2YgdGhlIHN0YW5kYXJkIEdvb2dsZSBhcHBsaWNhdGlvbiBzdWl0OyBpdCBpcyBydW5uaW5nIGluIEdvb2dsZSdzICJnYXBwcyIgcHJvY2Vzcywgd2hpY2ggY3VycmVudGx5IGNvbnN1bWVzIDYuOE1CLiBJdCBoYXMgYmVlbiBzdGFydGVkIGZvciAzIGhvdXJzIDU1IG1pbnV0ZXMsIHdoaWNoIG9uIHRoaXMgZGV2aWNlIGlzIHRoZSB0aW1lIGZyb20gd2hlbiBpdCB3YXMgZmlyc3QgYm9vdGVkLjwvbGk+CisgIDxsaT48Yj5BY3Rpdml0eVNlcnZpY2U8L2I+IGlzIHBhcnQgb2YgdGhlIFBob25lYm9vayBhcHAsIGFuZCBpdHMgcHJvY2VzcyBjb25zdW1lcyA0TUIuIFRoaXMgYWxzbyBoYXMgYmVlbiBydW5uaW5nIHNpbmNlIGJvb3QuPC9saT4KKyAgPGxpPjxiPlNvZnRLZXlib2FyZDwvYj4gaXMgYSB0aGlyZCBwYXJ0eSBpbnB1dCBtZXRob2QuIEl0IGhhcyBiZWVuIHJ1bm5pbmcgc2luY2UgSSBzd2l0Y2hlZCB0byBpdCwgYWJvdXQgNCBtaW51dGVzIGFnby48L2xpPgorPC91bD4KKzxwPlRoZSB1c2VyIGNhbiB0YXAgb24gYW55IG9mIHRoZXNlIHNlcnZpY2VzIHRvIGNvbnRyb2wgaXQ7IGZvciBub3JtYWwgc2VydmljZXMgdGhhdCBhcmUgcnVubmluZyBiZWNhdXNlIHRoZXkgd2VyZSBleHBsaWNpdGx5IHN0YXJ0ZWQsIHRoaXMgd2lsbCBwcmVzZW50IGEgZGlhbG9nIGFsbG93aW5nIHRoZSB1c2VyIHRvIGV4cGxpY2l0bHkgc3RvcCBpdDo8L3A+Cis8aW1nIHNyYz0iaW1hZ2VzL3NlcnZpY2UtYXBpLWNoYW5nZXMtc3RhcnRpbmctd2l0aF9zdG9wc2VydmljZS5wbmciIGhlaWdodD0iMzIwIiB3aWR0aD0iMTkyIiBhbHQ9IlN0b3AgU2VydmljZSIvPgorPHA+U29tZSBvdGhlciBzZXJ2aWNlcywgbGlrZSB0aGUgaW5wdXQgbWV0aG9kLCBhcmUgcnVubmluZyBmb3Igb3RoZXIgcmVhc29ucy4gRm9yIHRoZXNlLCB0YXBwaW5nIG9uIHRoZSBzZXJ2aWNlIHdpbGwgZ28gdG8gdGhlIGNvcnJlc3BvbmRpbmcgVUkgdG8gbWFuYWdlIGl0IChpbiB0aGlzIGNhc2UgdGhlIHN5c3RlbSdzIGlucHV0IHNldHRpbmdzKS48L3A+Cis8cD5GaW5hbGx5LCBhbG9uZyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gYXJlIHNvbWUgb2JzY3VyZSBudW1iZXJzLiBJZiB5b3Uga25vdyBob3cgdG8gaW50ZXJwcmV0IHRoZW0sIHRoaXMgZ2l2ZXMgeW91IGEgbG90IG9mIGluZm9ybWF0aW9uIG9uIHRoZSBtZW1vcnkgc3RhdHVzIG9mIHlvdXIgZGV2aWNlOjwvcD4KKzx1bD4KKyAgPGxpPjxiPkF2YWlsOiAzOE1CKzExNE1CIGluIDI1PC9iPiBzYXlzIHRoYXQgdGhlIGRldmljZSBoYXMgMzhNQiBvZiBjb21wbGV0ZWx5IGZyZWUgKG9yIGxpa2VseSB1c2VkIGZvciB1bnJlcXVpcmVkIGNhY2hlcykgbWVtb3J5LCBhbmQgaGFzIGFub3RoZXIgMTE0TUIgb2YgYXZhaWxhYmxlIG1lbW9yeSBpbiAyNSBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBpdCBjYW4ga2lsbCBhdCBhbnkgdGltZS48L2xpPgorICA8bGk+PGI+T3RoZXI6IDMyTUIgaW4gMzwvYj4gc2F5cyB0aGF0IHRoZSBkZXZpY2UgaGFzIDMyTUIgb2YgdW5hdmFpbGFibGUgbWVtb3J5IGluIDMgdW5raWxsYWJsZSBwcm9jZXNzZXMgKHRoYXQgaXMsIHByb2Nlc3NlcyB0aGF0IGFyZSBjdXJyZW50bHkgY29uc2lkZXJlZCB0byBiZSBmb3JlZ3JvdW5kIGFuZCBtdXN0IGJlIGtlcHQgcnVubmluZyk8L2xpPgorPC91bD4KKzxwPkZvciBtb3N0IHVzZXJzLCB0aGlzIG5ldyB1c2VyIGludGVyZmFjZSBzaG91bGQgYmUgYSBtdWNoIG1vcmUgZWZmZWN0aXZlIHdheSB0byBtYW5hZ2UgdGhlIGJhY2tncm91bmQgYXBwbGljYXRpb25zIG9uIHRoZWlyIGRldmljZSB0aGFuIHRoZSBleGlzdGluZyAidGFzayBraWxsZXIiIGFwcGxpY2F0aW9ucy4gSW4gdGhlIHZhc3QgbWFqb3JpdHkgb2YgY2FzZXMgdGhlIHJlYXNvbiBmb3IgYSBzbG93IHJ1bm5pbmcgZGV2aWNlIGlzIHRvbyBtYW55IHNlcnZpY2VzIHRyeWluZyB0byBydW4uIFRoaXMgcHJldmVudHMgdGhlIHN5c3RlbSBmcm9tIGJlaW5nIGFibGUgdG8gcnVuIGFueSBiYWNrZ3JvdW5kIHByb2Nlc3NlcyAod2hpY2ggc3BlZWQgdXAgYXBwIHN3aXRjaGluZyksIGFuZCB1bHRpbWF0ZWx5IGNhbiByZXN1bHQgaW4gdGhyYXNoaW5nIHRocm91Z2ggdGhlIHNlcnZpY2VzIHdoZW4gbm90IGV2ZW4gdGhleSBjYW4gYWxsIGJlIGtlcHQgcnVubmluZy4gVGhlIFJ1bm5pbmcgU2VydmljZXMgVUkgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSB2ZXJ5IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2aWNlcyB0aGF0IGFyZSBydW5uaW5nLCB0byBoZWxwIG1ha2UgYSBnb29kIGRlY2lzaW9uIGFib3V0IHdoYXQgc2hvdWxkIGJlIHN0b3BwZWQuIEl0IGFsc28gZG9lcyBub3QgdXNlIHRoZSBBUEkgdG8gZm9yY2Ugc3RvcCBhbiBhcHBsaWNhdGlvbiwgd2hpY2ggY2FuIHVuaW50ZW50aW9uYWxseSBicmVhayBhcHBsaWNhdGlvbnMgaW4gbnVtZXJvdXMgd2F5cy48L3A+Cis8cD5Gb3IgZGV2ZWxvcGVycywgdGhpcyBpcyBhbiBpbXBvcnRhbnQgdG9vbCB0byBlbnN1cmUgeW91ciBzZXJ2aWNlcyBhcmUgd2VsbCBiZWhhdmVkLiBBcyB5b3UgZGV2ZWxvcCB5b3VyIGFwcCwgYmUgc3VyZSB0byBrZWVwIGFuIGV5ZSBvbiBSdW5uaW5nIFNlcnZpY2VzIHRvIGVuc3VyZSB0aGF0IHlvdSBhcmUgbm90IGFjY2lkZW50YWxseSBsZWF2aW5nIHlvdXIgc2VydmljZXMgcnVubmluZyB3aGVuIHRoZXkgc2hvdWxkbid0IGJlLiBZb3Ugc2hvdWxkIGFsc28gbm93IGtlZXAgaW4gbWluZCB0aGF0IHVzZXJzIG1heSBmcmVlbHkgc3RvcCBhbnkgb2YgeW91ciBzZXJ2aWNlcyBhcyB0aGV5IHdpc2gsIHdpdGhvdXQgeW91ciBjb250cm9sLCBhbmQgYWNjb3VudCBmb3IgdGhhdC48L3A+Cis8cD5BbmRyb2lkJ3MgU2VydmljZXMgYXJlIGEgdmVyeSBwb3dlcmZ1bCB0b29sLCBidXQgb25lIG9mIHRoZSBtYWluIGFuZCBzdWJ0bGUgd2F5cyB0aGF0IGFwcGxpY2F0aW9uIGRldmVsb3BlcnMgY2FuIGhhcm0gdGhlIG92ZXJhbGwgZXhwZXJpZW5jZSBhIHVzZXIgaGFzIHdpdGggdGhlaXIgcGhvbmUuPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvcmVzb3VyY2VzLWRhdGEuanMKaW5kZXggOGQ5YjdiMS4uMDk3ZDAwNCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9yZXNvdXJjZXMtZGF0YS5qcworKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL3Jlc291cmNlcy1kYXRhLmpzCkBAIC0yMCw2ICsyMCw3IEBACiAgICAgJ2ludGVudCc6ICdJbnRlbnRzJywKICAgICAnbGF5b3V0JzogJ0xheW91dHMvVmlld3MnLAogICAgICdtZWRpYSc6ICdNdWx0aW1lZGlhJywKKyAgICAnbXVsdGl0YXNraW5nJzogJ011bHRpLXRhc2tpbmcnLAogICAgICduZXdmZWF0dXJlJzogJ05ldyBGZWF0dXJlcycsCiAgICAgJ3BlcmZvcm1hbmNlJzogJ1BlcmZvcm1hbmNlJywKICAgICAnc2VhcmNoJzogJ1NlYXJjaCcsCkBAIC0yMDEsNiArMjAyLDE2IEBACiAgICAgfQogICB9LAogICB7CisgICAgdGFnczogWydhcnRpY2xlJywgJ2Jlc3RwcmFjdGljZScsICdtdWx0aXRhc2tpbmcnXSwKKyAgICBwYXRoOiAnYXJ0aWNsZXMvbXVsdGl0YXNraW5nLWFuZHJvaWQtd2F5Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ011bHRpdGFza2luZyB0aGUgQW5kcm9pZCBXYXknCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdUaGlzIGFydGljbGUgZGVzY3JpYmVzIGJlc3QgcHJhY3RpY2VzIGFuZCB1c2VyIGV4cGVyaWVuY2UgZ3VpZGVsaW5lcyBmb3IgbXVsdGktdGFza2luZyBvbiBBbmRyb2lkLicKKyAgICB9CisgIH0sCisgIHsKICAgICB0YWdzOiBbJ2FydGljbGUnLCAnaW5wdXQnXSwKICAgICBwYXRoOiAnYXJ0aWNsZXMvb24tc2NyZWVuLWlucHV0cy5odG1sJywKICAgICB0aXRsZTogewpAQCAtMjQxLDYgKzI1MiwxNiBAQAogICAgIH0KICAgfSwKICAgeworICAgIHRhZ3M6IFsnYXJ0aWNsZScsICdjb21wYXRpYmlsaXR5JywgJ211bHRpdGFza2luZyddLAorICAgIHBhdGg6ICdhcnRpY2xlcy9zZXJ2aWNlLWFwaS1jaGFuZ2VzLXN0YXJ0aW5nLXdpdGguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnU2VydmljZSBBUEkgY2hhbmdlcyBzdGFydGluZyB3aXRoIEFuZHJvaWQgMi4wJworICAgIH0sCisgICAgZGVzY3JpcHRpb246IHsKKyAgICAgIGVuOiAnVGhpcyBhcnRpY2xlIGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIHNlcnZpY2VzIGludHJvZHVjZWQgaW4gQW5kcm9pZCAyLjAsIGFzIHdlbGwgYXMgc3RyYXRlZ2llcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4nCisgICAgfQorICB9LAorICB7CiAgICAgdGFnczogWydhcnRpY2xlJywgJ3VpJ10sCiAgICAgcGF0aDogJ2FydGljbGVzL3RvdWNoLW1vZGUuaHRtbCcsCiAgICAgdGl0bGU6IHsKQEAgLTM4Niw2ICs0MDcsMjYgQEAKICAgICB9CiAgIH0sCiAgIHsKKyAgICB0YWdzOiBbJ3NhbXBsZScsICdsYXlvdXQnLCAndWknLCAnZnJhZ21lbnQnLCAnbG9hZGVyJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1N1cHBvcnQ0RGVtb3MvaW5kZXguaHRtbCcsCisgICAgdGl0bGU6IHsKKyAgICAgIGVuOiAnQVBJIDQrIFN1cHBvcnQgRGVtb3MnCisgICAgfSwKKyAgICBkZXNjcmlwdGlvbjogeworICAgICAgZW46ICdBIHZhcmlldHkgb2Ygc21hbGwgYXBwbGljYXRpb25zIHRoYXQgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiB0aGUgaGVscGVyIGNsYXNzZXMgaW4gdGhlIEFuZHJvaWQgQVBJIDQrIFN1cHBvcnQgTGlicmFyeSAoY2xhc3NlcyB3aGljaCB3b3JrIGRvd24gdG8gQVBJIGxldmVsIDQgb3IgdmVyc2lvbiAxLjYgb2YgdGhlIHBsYXRmb3JtKS4nCisgICAgfQorICB9LAorICB7CisgICAgdGFnczogWydzYW1wbGUnLCAnbGF5b3V0JywgJ3VpJywgJ25ldyddLAorICAgIHBhdGg6ICdzYW1wbGVzL1N1cHBvcnQxM0RlbW9zL2luZGV4Lmh0bWwnLAorICAgIHRpdGxlOiB7CisgICAgICBlbjogJ0FQSSAxMysgU3VwcG9ydCBEZW1vcycKKyAgICB9LAorICAgIGRlc2NyaXB0aW9uOiB7CisgICAgICBlbjogJ0EgdmFyaWV0eSBvZiBzbWFsbCBhcHBsaWNhdGlvbnMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHRoZSBoZWxwZXIgY2xhc3NlcyBpbiB0aGUgQW5kcm9pZCBBUEkgMTMrIFN1cHBvcnQgTGlicmFyeSAoY2xhc3NlcyB3aGljaCB3b3JrIGRvd24gdG8gQVBJIGxldmVsIDEzIG9yIHZlcnNpb24gMy4yIG9mIHRoZSBwbGF0Zm9ybSkuJworICAgIH0KKyAgfSwKKyAgewogICAgIHRhZ3M6IFsnc2FtcGxlJywgJ2RhdGEnLCAnbmV3ZmVhdHVyZScsICdhY2NvdW50c3luYyddLAogICAgIHBhdGg6ICdzYW1wbGVzL0JhY2t1cFJlc3RvcmUvaW5kZXguaHRtbCcsCiAgICAgdGl0bGU6IHsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuMy5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuMy5qZAppbmRleCA2ZDYwZmNjLi4xMGZjMDQ5IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjMuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy4zLmpkCkBAIC0xNDEsOCArMTQxLDggQEAKIDxsaT5ORkMtRiAoSklTIDYzMTktNCk8L2xpPgogPGxpPk5GQy1WIChJU08gMTU2OTMpPC9saT4KIDxsaT5JU08tREVQIChJU08gMTQ0NDMtNCk8L2xpPgotPGxpPk1pZmFyZSBDbGFzc2ljPC9saT4KLTxsaT5NaWZhcmUgVWx0cmFsaWdodDwvbGk+Cis8bGk+TUlGQVJFIENsYXNzaWM8L2xpPgorPGxpPk1JRkFSRSBVbHRyYWxpZ2h0PC9saT4KIDxsaT5ORkMgRm9ydW0gTkRFRiB0YWdzPC9saT4KIDwvdWw+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuNC5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuNC5qZAppbmRleCBlNTc2NWQzLi40Y2I0NGI5IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjQuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy40LmpkCkBAIC0xMjgsNyArMTI4LDcgQEAKIDxhIGhyZWY9IntAZG9jUm9vdH1zZGsvYW5kcm9pZC0yLjMuMy5odG1sIj5BbmRyb2lkIDIuMy4zIHZlcnNpb24gbm90ZXM8L2E+LjwvcD4KIAogCi08aDIgaWQ9Im9wZW5hY2Nlc3NvcnkiPk9wZW4gQWNjZXNzb3J5IExpYnJhcnk8L2gzPgorPGgyIGlkPSJvcGVuYWNjZXNzb3J5Ij5PcGVuIEFjY2Vzc29yeSBMaWJyYXJ5PC9oMj4KIAogPHA+PGVtPk9wZW4gQWNjZXNzb3J5PC9lbT4gaXMgYSBuZXcgY2FwYWJpbGl0eSBmb3IgaW50ZWdyYXRpbmcKIGNvbm5lY3RlZCBwZXJpcGhlcmFscyB3aXRoIGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBwbGF0Zm9ybS4gVGhlIGNhcGFiaWxpdHkKQEAgLTI0MSw3ICsyNDEsNyBAQAogPGxpPkNhbWVyYTwvbGk+CiA8bGk+Q2xvY2s8L2xpPgogPGxpPkNvbnRhY3RzPC9saT4KLTxsaT5DdXNvbSBMb2NhbGU8L2xpPgorPGxpPkN1c3RvbSBMb2NhbGU8L2xpPgogPGxpPkRldiBUb29sczwvbGk+CiA8bGk+RG93bmxvYWRzPC9saT4KIDxsaT5FbWFpbDwvbGk+CkBAIC0zMDksNiArMzA5LDcgQEAKIDwvdWw+CiA8L3RkPgogPHRkIHN0eWxlPSJib3JkZXI6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi1ib3R0b206MDtwYWRkaW5nLWxlZnQ6NWVtOyI+Cis8dWw+CiA8bGk+Q3JvYXRpYW4sIENyb2F0aWEgKGhyX0hSKTwvbGk+CiA8bGk+SHVuZ2FyaWFuLCBIdW5nYXJ5IChodV9IVSk8L2xpPgogPGxpPkluZG9uZXNpYW4sIEluZG9uZXNpYSAoaWRfSUQpPC9saT4KQEAgLTMzNyw2ICszMzgsNyBAQAogPGxpPlZpZXRuYW1lc2UsIFZpZXRuYW0gKHZpX1ZOKTwvbGk+CiA8bGk+Q2hpbmVzZSwgUFJDICh6aF9DTik8L2xpPgogPGxpPkNoaW5lc2UsIFRhaXdhbiAoemhfVFcpPC9saT4KKzwvdWw+CiA8L3RkPgogPC90cj4KIDwvdGFibGU+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2NvbXBhdGliaWxpdHktbGlicmFyeS5qZCBiL2RvY3MvaHRtbC9zZGsvY29tcGF0aWJpbGl0eS1saWJyYXJ5LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjY5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvc2RrL2NvbXBhdGliaWxpdHktbGlicmFyeS5qZApAQCAtMCwwICsxLDIyNCBAQAorcGFnZS50aXRsZT1Db21wYXRpYmlsaXR5IExpYnJhcnkKKworQGpkOmJvZHkKKworPGRpdiBpZD0icXYtd3JhcHBlciI+Cis8ZGl2IGlkPSJxdiI+CisgIAorPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgorPG9sPgorICA8bGk+PGEgaHJlZj0iI05vdGVzIj5SZXZpc2lvbnM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNJbnN0YWxsaW5nIj5JbnN0YWxsaW5nIHRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNTZXR0aW5nVXAiPlNldHRpbmcgVXAgYSBQcm9qZWN0IHRvIFVzZSB0aGUgTGlicmFyeTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI1VzaW5nIj5Vc2luZyBTb21lIG9mIHRoZSBMaWJyYXJ5IEFQSXM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNTYW1wbGVzIj5TYW1wbGVzPC9hPjwvbGk+Cis8L29sPgorCis8aDI+U2VlIGFsc288L2gyPgorPG9sPgorICA8bGk+PGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvb3B0aW1pemluZy1mb3ItMy4wLmh0bWwiPk9wdGltaXppbmcgQXBwcyBmb3IgQW5kcm9pZCAzLjA8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9pb3NjaGVkLyI+R29vZ2xlIEkvTyBBcHAgc291cmNlIGNvZGU8L2E+PC9saT4KKzwvb2w+CisKKzwvZGl2PgorPC9kaXY+CisKKzxwPjxlbT5NaW5pbXVtIEFQSSBsZXZlbCBzdXBwb3J0ZWQ6PC9lbT4gPGI+NDwvYj48L3A+CisKKzxwPlRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnkgaXMgYSBzdGF0aWMgbGlicmFyeSB5b3UgY2FuIGFkZCB0byB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gaW4gb3JkZXIgdG8KK3VzZSBBUElzIG5vdCBhdmFpbGFibGUgaW4gb2xkZXIgdmVyc2lvbnMgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0uIFRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlIGxpYnJhcnkgaXMKK3RvIHByb3ZpZGUgQVBJcyBpbnRyb2R1Y2VkIGluIEFuZHJpb2QgMy4wIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIHNvIHRoYXQgYWxsIGFwcGxpY2F0aW9ucyBjYW4KK3VzZSB0aGVtLjwvcD4KKworPHA+SWYgeW91J3JlIG5vdCBhYmxlIHRvIHVzZSBBUElzIGludHJvZHVjZWQgaW4gQW5kcm9pZCAzLjAgZGlyZWN0bHksIGJlY2F1c2UgeW91IHdhbnQgdG8gcmVtYWluCitiYWNrd2FyZC1jb21wYXRpYmxlLCB0aGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5IHByb3ZpZGVzIHlvdXIgYXBwbGljYXRpb24gYWNjZXNzIHRvIHNlbGYtY29udGFpbmVkCit2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBsYXRlc3QgQVBJcyB0aGF0IHlvdSBjYW4gdXNlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgQW5kcm9pZC4gTW9zdAoraW1wb3J0YW50bHksIHRoZSBsaWJyYXJ5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBvZiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fSBhbmQge0BsaW5rCithbmRyb2lkLmNvbnRlbnQuTG9hZGVyfSBBUElzLCBzbyB5b3UgY2FuIHVzZSB0aGVtIGluIGEgd2F5IHRoYXQncyBjb21wYXRpYmxlIHdpdGggZGV2aWNlcyBydW5uaW5nCitBbmRyb2lkIDEuNiAoQVBJIGxldmVsIDQpIGFuZCBoaWdoZXIuIFRodXMsIHlvdSBjYW4gbW9yZSBlYXNpbHkgY3JlYXRlIGEgc2luZ2xlIEFQSyB0aGF0IHN1cHBvcnRzIGEKK21ham9yaXR5IG9mIGRldmljZXMgYW5kIHByb3ZpZGUgbGFyZ2VyIGRldmljZXMgKHN1Y2ggYXMgdGFibGV0cykgYSBmdWxseSBvcHRpbWl6ZWQgZXhwZXJpZW5jZSBieQordXNpbmcgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9mdW5kYW1lbnRhbHMvZnJhZ21lbnRzLmh0bWwiPkZyYWdtZW50czwvYT4gaW4geW91ciBhY3Rpdml0eQorZGVzaWduLjwvcD4KKworCis8aDIgaWQ9Ik5vdGVzIj5SZXZpc2lvbnM8L2gyPgorCis8cD5UaGUgc2VjdGlvbnMgYmVsb3cgcHJvdmlkZSBub3RlcyBhYm91dCBzdWNjZXNzaXZlIHJlbGVhc2VzIG9mCit0aGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5LCBhcyBkZW5vdGVkIGJ5IHJldmlzaW9uIG51bWJlci48L3A+CisKKworPGRpdiBjbGFzcz0idG9nZ2xlLWNvbnRlbnQgb3BlbiI+CisKKyAgPHA+PGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZUNvbnRlbnQodGhpcykiPgorICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIiBjbGFzcz0idG9nZ2xlLWNvbnRlbnQtaW1nIiAvPgorICAgIENvbXBhdGliaWxpdHkgTGlicmFyeSwgcmV2aXNpb24gMiAoTWF5IDIwMTEpCisgIDwvYT48L3A+CisKKyAgPGRpdiBjbGFzcz0idG9nZ2xlLWNvbnRlbnQtdG9nZ2xlbWUiIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MmVtIj4gCisgICAgPGRsPgorICAgIDxkdD5DaGFuZ2VzOjwvZHQ+CisgICAgPGRkPgorICAgICAgPHVsPgorICAgICAgICA8bGk+U3VwcG9ydCBmb3IgZnJhZ21lbnQgYW5pbWF0aW9ucy48L2xpPgorICAgICAgICA8bGk+Rml4IHtAY29kZSBGcmFnbWVudC5vbkFjdGl2aXR5UmVzdWx0KCl9IGJ1Zy48L2xpPgorICAgICAgPC91bD4KKyAgICA8L2RkPgorICAgIDwvZGw+CisgIDwvZGl2PgorCis8L2Rpdj4KKworCis8ZGl2IGNsYXNzPSJ0b2dnbGUtY29udGVudCBjbG9zZWQiPgorCisgIDxwPjxhIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiB0b2dnbGVDb250ZW50KHRoaXMpIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvdHJpYW5nbGUtY2xvc2VkLnBuZyIgY2xhc3M9InRvZ2dsZS1jb250ZW50LWltZyIgLz4KKyAgICBDb21wYXRpYmlsaXR5IExpYnJhcnksIHJldmlzaW9uIDEgKE1hcmNoIDIwMTEpCisgIDwvYT48L3A+CisKKyAgPGRpdiBjbGFzcz0idG9nZ2xlLWNvbnRlbnQtdG9nZ2xlbWUiIHN0eWxlPSJwYWRkaW5nLWxlZnQ6MmVtIj4gCisgICAgICA8cD5Jbml0aWFsIHJlbGVhc2Ugb2YgdGhlIGxpYnJhcnkuPC9wPgorICA8L2Rpdj4KKworPC9kaXY+CisKKworCis8aDIgaWQ9Ikluc3RhbGxpbmciPkluc3RhbGxpbmcgdGhlIENvbXBhdGliaWxpdHkgTGlicmFyeTwvaDI+CisKKzxwPlRoZSBDb21wYXRpYmlsaXR5IExpYnJhcnkgaXMgcHJvdmlkZWQgYXMgYSBkb3dubG9hZGFibGUgcGFja2FnZSBmcm9tIHRoZSBBbmRyb2lkIFNESyBhbmQgQVZECitNYW5hZ2VyLiBUbyBpbnN0YWxsIHRoZSBsaWJyYXJ5OjwvcD4KKworPG9sPgorICA8bGk+TGF1bmNoIHRoZSBTREsgYW5kIEFWRCBNYW5hZ2VyLiAKKyAgICA8cD5Gcm9tIEVjbGlwc2UsIHlvdSBjYW4gc2VsZWN0IDxzdHJvbmc+V2luZG93PC9zdHJvbmc+CismZ3Q7IDxzdHJvbmc+QW5kcm9pZCBTREsgYW5kIEFWRCBNYW5hZ2VyPC9zdHJvbmc+LiBPciwgbGF1bmNoIHtAY29kZSBTREsgTWFuYWdlci5leGV9IGZyb20KK3RoZSB7QGNvZGUgJmx0O3NkayZndDsvfSBkaXJlY3RvcnkgKG9uIFdpbmRvd3Mgb25seSkgb3Ige0Bjb2RlIGFuZHJvaWR9IGZyb20gdGhlIHtAY29kZQorJmx0O3NkayZndDsvdG9vbHMvfSBkaXJlY3RvcnkuPC9wPjwvbGk+CisgIDxsaT5FeHBhbmQgdGhlIEFuZHJvaWQgUmVwb3NpdG9yeSwgY2hlY2sgPHN0cm9uZz5BbmRyb2lkIENvbXBhdGliaWxpdHkgcGFja2FnZTwvc3Ryb25nPgorYW5kIGNsaWNrIDxzdHJvbmc+SW5zdGFsbCBzZWxlY3RlZDwvc3Ryb25nPi48L2xpPgorICA8bGk+UHJvY2VlZCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlLjwvbGk+Cis8L29sPgorCis8cD5XaGVuIGRvbmUsIGFsbCBmaWxlcyAoaW5jbHVkaW5nIHNvdXJjZSBjb2RlLCBzYW1wbGVzLCBhbmQgdGhlIHtAY29kZSAuamFyfSBmaWxlKSBhcmUgc2F2ZWQKK2ludG8gdGhlIDxjb2RlPiZsdDtzZGsmZ3Q7L2V4dHJhcy9hbmRyb2lkL2NvbXBhdGliaWxpdHkvPC9jb2RlPiBkaXJlY3RvcnkuIFRoZSBuZXh0IGRpcmVjdG9yeQorbmFtZSBpcyB7QGNvZGUgdjR9LCB3aGljaCBpbmRpY2F0ZXMgdGhlIGxvd2VzdCBjb21wYXRpYmxlIHZlcnNpb24gZm9yIHRoZSBsaWJyYXJ5IHdpdGhpbi4gVGhhdAoraXMsIHRoZSBjb2RlIGluIHtAY29kZSB2NC99IHN1cHBvcnRzIEFQSSBsZXZlbCA0IGFuZCBhYm92ZS4gKFRoZXJlIG1heSBiZSBmdXR1cmUgbGlicmFyaWVzIHRoYXQKK2hhdmUgYSBkaWZmZXJlbnQgbWluaW11bSB2ZXJzaW9uLCBzbyB0aGV5IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIHRoaXMgb25lLik8L3A+CisKKworPGgyIGlkPSJTZXR0aW5nVXAiPlNldHRpbmcgVXAgYSBQcm9qZWN0IHRvIFVzZSB0aGUgTGlicmFyeTwvaDI+CisKKzxwPlRvIGFkZCB0aGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5IHRvIHlvdXIgQW5kcm9pZCBwcm9qZWN0OjwvcD4KKzxvbD4KKyAgPGxpPkluIHlvdXIgQW5kcm9pZCBwcm9qZWN0LCBjcmVhdGUgYSBkaXJlY3RvcnkgbmFtZWQge0Bjb2RlIGxpYnN9IGF0IHRoZSByb290IG9mIHlvdXIKK3Byb2plY3QgKG5leHQgdG8ge0Bjb2RlIHNyYy99LCB7QGNvZGUgcmVzL30sIGV0Yy4pPC9saT4KKyAgPGxpPk5hdmlnYXRlIHRvIHtAY29kZSAmbHQ7c2RrJmd0Oy9leHRyYXMvYW5kcm9pZC9jb21wYXRpYmlsaXR5L3Y0L30uPC9saT4KKyAgPGxpPkNvcHkgdGhlIHtAY29kZSBhbmRyb2lkLXN1cHBvcnQtdjQuamFyfSBmaWxlIGludG8geW91ciBwcm9qZWN0IHtAY29kZSBsaWJzL30gZGlyZWN0b3J5LjwvbGk+CisgIDxsaT5BZGQgdGhlIEpBUiB0byB5b3VyIHByb2plY3QgYnVpbGQgcGF0aC4gSW4gRWNsaXBzZSwgcmlnaHQtY2xpY2sgdGhlIEpBUiBmaWxlIGluIHRoZQorUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IDxzdHJvbmc+QnVpbGQgUGF0aDwvc3Ryb25nPiAmZ3Q7IDxzdHJvbmc+QWRkIHRvIEJ1aWxkIFBhdGg8L3N0cm9uZz4uCitZb3Ugc2hvdWxkIHRoZW4gc2VlIHRoZSBKQVIgZmlsZSBhcHBlYXIgaW4gYSBuZXcgZGlyZWN0b3J5IGNhbGxlZCBSZWZlcmVuY2VkIExpYnJhcmllcy48L2xpPgorPC9vbD4KKworPHA+WW91ciBhcHBsaWNhdGlvbiBpcyBub3cgcmVhZHkgdG8gdXNlIGZyYWdtZW50cywgbG9hZGVycyBhbmQgb3RoZXIgQVBJcyBmcm9tIHRoZSBsaWJyYXJ5LiBBbGwgdGhlCitwcm92aWRlZCBBUElzIGFyZSBpbiB0aGUge0Bjb2RlIGFuZHJvaWQuc3VwcG9ydC52NH0gcGFja2FnZS48L3A+CisKKzxwIGNsYXNzPSJ3YXJuaW5nIj48c3Ryb25nPldhcm5pbmc6PC9zdHJvbmc+IEJlIGNlcnRhaW4gdGhhdCB5b3Ugbm90IGNvbmZ1c2UgdGhlIHN0YW5kYXJkCit7QGNvZGUgYW5kcm9pZH0gcGFja2FnZXMgd2l0aCB0aG9zZSBpbiB7QGNvZGUgYW5kcm9pZC5zdXBwb3J0LnY0fS4gU29tZSBjb2RlIGNvbXBsZXRpb24gdG9vbHMgbWlnaHQKK2dldCB0aGlzIHdyb25nLCBlc3BlY2lhbGx5IGlmIHlvdSdyZSBidWlsZGluZyBhZ2FpbnN0IHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uIFRvIGJlIHNhZmUsCitrZWVwIHlvdXIgYnVpbGQgdGFyZ2V0IHNldCB0byB0aGUgc2FtZSB2ZXJzaW9uIGFzIHlvdSBoYXZlIGRlZmluZWQgZm9yIHlvdXIgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI21pbiI+e0Bjb2RlIGFuZHJvaWQ6bWluU2RrVmVyc2lvbn08L2E+CithbmQgZG91YmxlIGNoZWNrIHRoZSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgY2xhc3NlcyB0aGF0IGFyZSBkdXBsaWNhdGVkIGluIHRoZSBDb21wYXRpYmlsaXR5CitMaWJyYXJ5LCBzdWNoIGFzIHtAY29kZSBTaW1wbGVDdXJzb3JBZGFwdGVyfS48L3A+CisKKworPGgyIGlkPSJVc2luZyI+VXNpbmcgU29tZSBvZiB0aGUgTGlicmFyeSBBUElzPC9oMj4KKworPHA+VGhlIENvbXBhdGliaWxpdHkgTGlicmFyeSBwcm92aWRlcyBhY2Nlc3MgdG8gc2V2ZXJhbCBjbGFzc2VzIGludHJvZHVjZWQgd2l0aCBBbmRyb2lkIDMuMCwgcGx1cworc29tZSB1cGRhdGVkIHZlcnNpb24gb2YgZXhpc3RpbmcgY2xhc3Nlcy4gU29tZSBvZiB0aGUgbW9zdCB1c2VmdWwgYW5kIG5vdGFibGUgY2xhc3NlcyBpbiB0aGUKK2xpYnJhcnkgYXJlOjwvcD4KKworPHVsPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLkZyYWdtZW50fTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuRnJhZ21lbnRNYW5hZ2VyfTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbn08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudH08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50fTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5hcHAuTG9hZGVyTWFuYWdlcn08L2xpPgorICA8bGk+e0BsaW5rIGFuZHJvaWQuY29udGVudC5Mb2FkZXJ9PC9saT4KKyAgPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQuQXN5bmNUYXNrTG9hZGVyfTwvbGk+CisgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlcn08L2xpPgorPC91bD4KKworPHA+Rm9yIGVhY2ggb2YgdGhlIGNsYXNzZXMgYWJvdmUgKGFuZCBvdGhlcnMgbm90IGxpc3RlZCksIHRoZSBBUElzIHdvcmsgYWxtb3N0IGV4YWN0bHkgdGhlIHNhbWUKK2FzIHRoZSBjb3VudGVycGFydHMgaW4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtLiBUaHVzLCB5b3UgY2FuIHVzdWFsbHkgcmVmZXIgdG8KK3RoZSBsYXRlc3QgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBwb3J0ZWQgQVBJcy4gVGhlcmUgYXJlIHNvbWUKK2RpZmZlcmVuY2VzLCBob3dldmVyLiBNb3N0IG5vdGFibHk6PC9wPgorCis8dWw+CisgIDxsaT5XaGVuIGNyZWF0aW5nIGFuIGFjdGl2aXR5IHRvIHVzZSBmcmFnbWVudHMsIHlvdSBtdXN0IGRlY2xhcmUgeW91ciBhY3Rpdml0eSB0byBleHRlbmQgdGhlCit7QGNvZGUgRnJhZ21lbnRBY3Rpdml0eX0gY2xhc3MgKGluc3RlYWQgb2YgdGhlIHRyYWRpdGlvbmFsIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0KK2NsYXNzKS48L2xpPgorICA8bGk+VG8gbWFuYWdlIHlvdXIgZnJhZ21lbnRzIGFuZCBsb2FkZXJzLCB5b3UgbXVzdCB1c2UgdGhlIG1ldGhvZHMge0Bjb2RlCitGcmFnbWVudEFjdGl2aXR5LmdldFN1cHBvcnRGcmFnbWVudE1hbmFnZXIoKX0gYW5kIHtAY29kZQorRnJhZ21lbnRBY3Rpdml0eS5nZXRTdXBwb3J0TG9hZGVyTWFuYWdlcigpfSAoaW5zdGVhZCBvZiB0aGUge0BsaW5rCithbmRyb2lkLmFwcC5BY3Rpdml0eSNnZXRGcmFnbWVudE1hbmFnZXIoKX0gYW5kIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNnZXRMb2FkZXJNYW5hZ2VyKCl9CittZXRob2RzKS48L2xpPgorICA8bGk+VGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpb25CYXJ9IGlzIDxzdHJvbmc+bm90IHN1cHBvcnRlZDwvc3Ryb25nPiBieSB0aGUgbGlicmFyeS4KK0hvd2V2ZXIsIHdoZW4gY3JlYXRpbmcgeW91ciA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3VpL21lbnVzLmh0bWwjb3B0aW9ucy1tZW51Ij5PcHRpb25zCitNZW51PC9hPiwgeW91IGNhbiBkZWNsYXJlIHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgQWN0aW9uIEJhciB3aGVuIGl0J3MgYXZhaWxhYmxlIChvbgorQW5kcm9pZCAzLjAgb3IgbGF0ZXIpLiBZb3UgY2FuIGRvIHNvIHdpdGggdGhlIHtAY29kZSBNZW51Q29tcGF0LnNldFNob3dBc0FjdGlvbigpfSBtZXRob2QuIEZvcgorZXhhbXBsZToKKzxwcmU+CitwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgIE1lbnVJbmZsYXRlciBpbmZsYXRlciA9IGdldE1lbnVJbmZsYXRlcigpOworICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lm9wdGlvbnMsIG1lbnUpOworICAgIE1lbnVDb21wYXQuc2V0U2hvd0FzQWN0aW9uKG1lbnUuZmluZEl0ZW0oUi5pZC5hY3Rpb25fc2VhcmNoKSwgMSk7CisgICAgcmV0dXJuIHRydWU7Cit9Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8cD5UaGUgQ29tcGF0aWJpbGl0eSBMaWJyYXJ5IGN1cnJlbnRseSBkb2VzIG5vdCBwcm92aWRlIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgaW5jbHVkZWQKK0FQSXMuIFRvIGdlbmVyYXRlIHlvdXIgb3duIHNldCwgdXNpbmcgdGhlIHtAY29kZSBqYXZhZG9jfSB0b29sLCBwZXJmb3JtIHRoZQorZm9sbG93aW5nIGZyb20gYSBjb21tYW5kIGxpbmU6PC9wPgorCis8cHJlIGNsYXNzPSJuby1wcmV0dHktcHJpbnQiPgorY2QgJmx0O3NkayZndDsvZXh0cmFzL2FuZHJvaWQvY29tcGF0aWJpbGl0eS92NC8KK21rZGlyIGRvY3MKK2phdmFkb2MgLXNvdXJjZXBhdGggc3JjL2phdmEvIC1zdWJwYWNrYWdlcyBhbmRyb2lkLnN1cHBvcnQudjQgLWQgZG9jcworPC9wcmU+Cis8cD5PcGVuIHRoZSB7QGNvZGUgZG9jcy9pbmRleC5odG1sfSBmaWxlIHRvIGJlZ2luIGJyb3dzaW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi48L3A+CisKKworPGRpdiBjbGFzcz0ibm90ZSI+PHA+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IFRvIGVuYWJsZSB0aGUgSG9sb2dyYXBoaWMgdGhlbWUgb24gZGV2aWNlcworcnVubmluZyBBbmRyb2lkIDMuMCBvciBoaWdoZXIsIGRlY2xhcmUgaW4geW91ciBtYW5pZmVzdCBmaWxlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB0YXJnZXRzCitBUEkgbGV2ZWwgMTEuIEZvciBleGFtcGxlOjwvcD4KKzxwcmU+CismbHQ7dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSI0IiBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjExIiAvJmd0OworPC9wcmU+Cis8cD5UaGlzIHdheSwgeW91ciBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIHRoZSBIb2xvZ3JhcGhpYyB0aGVtZSBhbmQgdGhlIEFjdGlvbiBCYXIgZm9yIAorZWFjaCBhY3Rpdml0eSB3aGVuIHJ1bm5pbmcgb24gQW5kcm9pZCAzLjAgYW5kIGhpZ2hlci48L3A+Cis8L2Rpdj4KKworPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHlvdSBjYW4gb3B0aW1pemUgeW91ciBhcHBsaWNhdGlvbiBmb3IgdGhlIGxhdGVzdAorQW5kcm9pZC1wb3dlcmVkIGRldmljZXMsIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9vcHRpbWl6aW5nLWZvci0zLjAuaHRtbCI+T3B0aW1pemluZworQXBwcyBmb3IgQW5kcm9pZCAzLjA8L2E+LjwvcD4KKworCis8aDIgaWQ9IlNhbXBsZXMiPlNhbXBsZXM8L2gyPgorCis8cD5JZiB5b3Ugd2FudCB0byBzZWUgc29tZSBzYW1wbGUgY29kZSB0aGF0IHVzZXMgdGhlIENvbXBhdGliaWxpdHkgTGlicmFyeSwgdGFrZSBhIGxvb2sgYXQgdGhlCis8YSBocmVmPSJ7QGRvY1Jvb3R9cmVzb3VyY2VzL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9zdXBwb3J0L2luZGV4Lmh0bWwiPkFQSQorRGVtb3M8L2E+IHNhbXBsZSBjb2RlIHRoYXQncyBpbmNsdWRlZCB3aXRoIHRoZSBTYW1wbGVzIHBhY2thZ2UgeW91IGNhbiBkb3dubG9hZCBmcm9tIHRoZSBBVkQgYW5kIFNESworTWFuYWdlci48L3A+CisKKzxwPkFkZGl0aW9uYWxseSwgdGhlIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9pb3NjaGVkLyI+R29vZ2xlIEkvTyBBcHA8L2E+IGlzIGEgY29tcGxldGUKK2FwcGxpY2F0aW9uIHRoYXQgdXNlcyB0aGUgbGlicmFyeSB0byBwcm92aWRlIGEgc2luZ2xlIEFQSyBmb3IgYm90aCBoYW5kc2V0cyBhbmQgdGFibGV0cyBhbmQgYWxzbworZGVtb25zdHJhdGVzIHNvbWUgb2YgQW5kcm9pZCdzIGJlc3QgcHJhY3RpY2VzIGluIEFuZHJvaWQgVUkgZGVzaWduLjwvcD4KKworCisKKwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9lY2xpcHNlLWFkdC5qZCBiL2RvY3MvaHRtbC9zZGsvZWNsaXBzZS1hZHQuamQKaW5kZXggZmViODRiMS4uOTM1YmY2MyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9lY2xpcHNlLWFkdC5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2VjbGlwc2UtYWR0LmpkCkBAIC0xLDggKzEsOCBAQAogcGFnZS50aXRsZT1BRFQgUGx1Z2luIGZvciBFY2xpcHNlCi1hZHQuemlwLnZlcnNpb249MTAuMC4xCi1hZHQuemlwLmRvd25sb2FkPUFEVC0xMC4wLjEuemlwCi1hZHQuemlwLmJ5dGVzPTUwOTYxODIKLWFkdC56aXAuY2hlY2tzdW09ZTI2YTc3ZGIwODM3N2JkZDJlNjJlZGViOWEzZTM3MDEKK2FkdC56aXAudmVyc2lvbj0xMS4wLjAKK2FkdC56aXAuZG93bmxvYWQ9QURULTExLjAuMC56aXAKK2FkdC56aXAuYnl0ZXM9VE9ETworYWR0LnppcC5jaGVja3N1bT1UT0RPCiAKIEBqZDpib2R5CiAKQEAgLTEwMCw2ICsxMDAsMTM5IEBACiAgIDxhIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiB0b2dnbGVEaXYodGhpcykiPgogICAgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZyIgY2xhc3M9InRvZ2dsZS1pbWciIGhlaWdodD0iOXB4Igogd2lkdGg9IjlweCIgLz4KK0FEVCAxMS4wLjA8L2E+IDxlbT4oSnVuZSAyMDExKTwvZW0+CisgIDxkZCBjbGFzcz0idG9nZ2xlbWUiPgorCis8ZGw+CisKKzxkdD5EZXBlbmRlbmNpZXM6PC9kdD4KKworPGRkPkFEVCAxMS4wLjAgaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIFNESyBUb29scyByMTEuIElmIHlvdSBoYXZlbid0CithbHJlYWR5IGluc3RhbGxlZCBTREsgVG9vbHMgcjExIGludG8geW91ciBTREssIHVzZSB0aGUgQW5kcm9pZCBTREsgYW5kIEFWRCBNYW5hZ2VyIHRvIGRvCitzby48L2RkPgorCis8ZHQ+VmlzdWFsIFJlZmFjdG9yaW5nOjwvZHQ+Cis8ZGQ+CisgIDx1bD4KKyAgICA8bGk+IkV4dHJhY3QgU3R5bGUiIGZlYXR1cmUgcHVsbHMgb3V0IHN0eWxlLXJlbGF0ZWQgYXR0cmlidXRlcyBmcm9tIHlvdXIgbGF5b3V0IGFuZCBleHRyYWN0cwordGhlbSBhcyBhIG5ldyBzdHlsZSBkZWZpbmVkIGluIHtAY29kZSBzdHlsZXMueG1sfSAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvZXh0cmFjdHN0eWxlcmVmYWN0b3JpbmciPm1vcmUgaW5mbzwvYT4pLjwvbGk+CisgICAgPGxpPiJXcmFwIGluIENvbnRhaW5lciIgZmVhdHVyZSBsZXRzIHlvdSBzZWxlY3QgYSBncm91cCBvZiB2aWV3cyB0aGVuIHN1cnJvdW5kIHRoZW0KKyAgICBpbiBhIG5ldyBsYXlvdXQgKGEgbmV3IHZpZXcgZ3JvdXAsIHN1Y2ggYXMgYSBMaW5lYXJMYXlvdXQpLCBhbmQgdHJhbnNmZXJzIG5hbWVzcGFjZSBhbmQgbGF5b3V0CisgICAgcGFyYW1ldGVycyB0byB0aGUgbmV3IHBhcmVudCAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvbmV3cmVmYWN0b3Jpbmdzd3JhcGluY2hhbmdlbGF5b3V0Y2hhbmdld2lkZ2V0Ij5tb3JlCitpbmZvPC9hPikuPC9saT4KKyAgICA8bGk+IkNoYW5nZSBMYXlvdXQiIGZlYXR1cmUgY2hhbmdlcyBsYXlvdXRzIGZyb20gb25lIHR5cGUKKyAgICB0byBhbm90aGVyLCBhbmQgY2FuIGFsc28gZmxhdHRlbiBhIGxheW91dCBoaWVyYXJjaHkgKDxhCitocmVmPSJodHRwOi8vdG9vbHMuYW5kcm9pZC5jb20vcmVjZW50L25ld3JlZmFjdG9yaW5nc3dyYXBpbmNoYW5nZWxheW91dGNoYW5nZXdpZGdldCI+bW9yZQoraW5mbzwvYT4pLjwvbGk+CisgICAgPGxpPiJDaGFuZ2UgV2lkZ2V0IFR5cGUiIGZlYXR1cmUgY2hhbmdlcyB0aGUgdHlwZSBvZiB0aGUKKyAgICBzZWxlY3RlZCB2aWV3cyB0byBhIG5ldyB0eXBlLiBBbHNvLCBhIG5ldyBzZWxlY3Rpb24gY29udGV4dCBtZW51CisgICAgaW4gdGhlIHZpc3VhbCBsYXlvdXQgZWRpdG9yIG1ha2VzIGl0IGVhc3kgdG8gc2VsZWN0IHNpYmxpbmdzIGFzCisgICAgd2VsbCBhcyB2aWV3cyBhbnl3aGVyZSBpbiB0aGUgbGF5b3V0IHRoYXQgaGF2ZSB0aGUgc2FtZSB0eXBlICg8YQoraHJlZj0iaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL3JlY2VudC9uZXdyZWZhY3RvcmluZ3N3cmFwaW5jaGFuZ2VsYXlvdXRjaGFuZ2V3aWRnZXQiPm1vcmUKK2luZm88L2E+KS48L2xpPgorICAgIDxsaT4iRXh0cmFjdCBhcyBJbmNsdWRlIiBmZWF0dXJlIGZpbmRzIGlkZW50aWNhbCBjb2xsZWN0aW9ucyBvZiB2aWV3cworICAgIGluIG90aGVyIGxheW91dHMgYW5kIG9mZmVycyB0byBjb21iaW5lIHRoZW0gaW50byBhIHNpbmdsZSBsYXlvdXQgdGhhdCB5b3UgY2FuIHRoZW4gaW5jbHVkZSBpbgorIGVhY2ggbGF5b3V0ICg8YQoraHJlZj0iaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL3JlY2VudC9leHRyYWN0YXNpbmNsdWRlaW1wcm92ZW1lbnRzIj5tb3JlIGluZm88L2E+KS48L2xpPgorICAgIDxsaT5RdWljayBBc3Npc3RhbnQgaW4gRWNsaXBzZSBjYW4gYmUgaW52b2tlZAorICAgIGZyb20gdGhlIFhNTCBlZGl0b3IgKHdpdGggQ3RybC0xKSB0byBhcHBseSBhbnkgb2YgdGhlIGFib3ZlCisgICAgcmVmYWN0b3JpbmdzIChhbmQgRXh0cmFjdCBTdHJpbmcpIHRvIHRoZSBjdXJyZW50IHNlbGVjdGlvbiAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvcmVmYWN0b3JpbmdxdWlja2Fzc2lzdGFudCI+bW9yZSBpbmZvPC9hPikuPC9saT4KKyAgPC91bD4KKzwvZGQ+CisKKzxkdD5WaXN1YWwgTGF5b3V0IEVkaXRvcjo8L2R0PgorPGRkPgorICA8dWw+CisgICAgPGxpPlRoaXMgaXMgdGhlIHVwZGF0ZSB0byB0aGUgbGF5b3V0IGVkaXRvciB5b3UndmUgYmVlbiB3YWl0aW5nIGZvciEgSXQgaW5jbHVkZXMgKGFsbW9zdCkgYWxsCit0aGUgZ29vZGllcyBkZW1vbnN0cmF0ZWQgYXQgR29vZ2xlIEkvTy4gPGEgaHJlZj0iaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU9xMDVLcWpYVHZzIj5XYXRjaAordGhlIHZpZGVvPC9hPiBvbiBZb3VUdWJlLjwvbGk+CisgICAgPGxpPlRoZSBwYWxldHRlIG5vdyBzdXBwb3J0cyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgZm9yIHN1cHBvcnRlZCB3aWRnZXRzLiBUaGF0IGlzLCBhIHNpbmdsZQordmlldyBpcyBwcmVzZW50ZWQgaW4gdmFyaW91cyBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgdGhhdCB5b3UgY2FuIGRyYWcgaW50byB5b3VyIGxheW91dC4gRm9yCitleGFtcGxlLCB0aGVyZSBpcyBhIDxlbT5UZXh0IEZpZWxkczwvZW0+IHBhbGV0dGUgY2F0ZWdvcnkgd2hlcmUgeW91IGNhbiBkcmFnIGFuIHtAbGluaworYW5kcm9pZC53aWRnZXQuRWRpdFRleHR9IHdpZGdldCBpbiBhcyBhIHBhc3N3b3JkIGZpZWxkLCBhbiBlLW1haWwgZmllbGQsIGEgcGhvbmUgZmllbGQsIG9yIG90aGVyCit0eXBlcyBvZiB0ZXh0IGJveGVzLiBTaW1pbGFybHksIHtAbGluayBhbmRyb2lkLndpZGdldC5UZXh0Vmlld30gd2lkZ2V0cyBhcmUgcHJlY29uZmlndXJlZAord2l0aCBsYXJnZSwgbm9ybWFsIGFuZCBzbWFsbCB0aGVtZSBzaXplcywgYW5kIHtAbGluayBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXR9IGVsZW1lbnRzIGFyZQorcHJlY29uZmlndXJlZCBpbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjb25maWd1cmF0aW9ucyAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvbXVsdGlwbGV0ZXh0ZmllbGRhbmRsYXlvdXR0eXBlcyI+bW9yZSBpbmZvPC9hPikuPC9saT4KKyAgICA8bGk+VGhlIHBhbGV0dGUgc3VwcG9ydHMgY3VzdG9tIHZpZXdzLiBZb3UgY2FuIHBpY2sgdXAgYW55IGN1c3RvbQorICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgVmlldyBjbGFzcyB5b3UndmUgY3JlYXRlZCBpbiB5b3VyIHByb2plY3Qgb3IgZnJvbSBpbmNsdWRlZCBsaWJyYXJpZXMgYW5kCitkcmFnIHRoZW0gaW50byB5b3VyIGxheW91dCAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvY3VzdG9tdmlld3NpbnRoZXBhbGV0dGUiPm1vcmUgaW5mbzwvYT4pLjwvbGk+CisgICAgPGxpPkZyYWdtZW50cyBhcmUgYXZhaWxhYmxlIGluIHRoZSBwYWxldHRlIGZvciBwbGFjZW1lbnQgaW4geW91ciBsYXlvdXQuIEluIHRoZSB0b29sLCB5b3UgY2FuCitjaG9vc2Ugd2hpY2ggbGF5b3V0IHRvIHNob3cgcmVuZGVyZWQgZm9yIGEgZ2l2ZW4gZnJhZ21lbnQgdGFnLiBHbyB0byBkZWNsYXJhdGlvbiB3b3JrcyBmb3IgZnJhZ21lbnQKK2NsYXNzZXMgKDxhIGhyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvZnJhZ21lbnRzdXBwb3J0Ij5tb3JlIGluZm88L2E+KS48L2xpPiAKKyAgICA8bGk+VGhlIGxheW91dCBlZGl0b3IgYXV0b21hdGljYWxseSBhcHBsaWVzIGEgInpvb20gdG8gZml0IiBmb3IgbmV3bHkKKyAgICBvcGVuZWQgZmlsZXMgYXMgd2VsbCBhcyBvbiBkZXZpY2Ugc2l6ZSBhbmQgb3JpZW50YXRpb24gY2hhbmdlcyB0bworICAgIGVuc3VyZSB0aGF0IGxhcmdlIGxheW91dHMgYXJlIGFsd2F5cyBmdWxseSB2aXNpYmxlIHVubGVzcyB5b3UKKyAgICBtYW51YWxseSB6b29tIGluLjwvbGk+CisgICAgPGxpPllvdSBjYW4gZHJvcCBpbiBhbiB7QGNvZGUgJmx0O2luY2x1ZGUmZ3Q7fSBlbGVtZW50IGZyb20gdGhlIHBhbGV0dGUsIHdoaWNoIHdpbGwgcG9wIHVwCisgICAgYSBsYXlvdXQgY2hvb3Nlci4gV2hlbiB5b3Ugc2VsZWN0IHRoZSBsYXlvdXQgdG8gaW5jbHVkZSwgaXQgaXMgYWRkZWQgd2l0aCBhbiB7QGNvZGUKKyZsdDtpbmNsdWRlJmd0O30uIFNpbWlsYXJseSwgZHJvcHBpbmcgaW1hZ2VzIG9yIGltYWdlIGJ1dHRvbnMgd2lsbCBwb3AgdXAgaW1hZ2UKKyAgICByZXNvdXJjZSBjaG9vc2VycyAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvaW5jbHVkZXRhZ2Ryb3BzdXBwb3J0Ij5tb3JlIGluZm88L2E+KS48L2xpPgorICAgIDxsaT5UaGUgY29uZmlndXJhdGlvbiBjaG9vc2VyIG5vdyBhcHBsaWVzIHRoZSAiUmVuZGVyIFRhcmdldCIgYW5kCisgICAgIkxvY2FsZSIgc2V0dGluZ3MgcHJvamVjdCB3aWRlLCBtYWtpbmcgaXQgdHJpdmlhbCB0byBjaGVjayB0aGUKKyAgICBsYXlvdXRzIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzIG9yIHJlbmRlciB0YXJnZXRzIHdpdGhvdXQgaGF2aW5nCisgICAgdG8gY29uZmlndXJlIHRoZXNlIGluZGl2aWR1YWxseSBmb3IgZWFjaCBsYXlvdXQuPC9saT4KKyAgICA8bGk+VGhlIGxheW91dCBlZGl0b3IgaXMgc21hcnRlciBhYm91dCBwaWNraW5nIGEgZGVmYXVsdCB0aGVtZSB0bworICAgIHJlbmRlciBhIGxheW91dCB3aXRoLCBjb25zdWx0aW5nIGZhY3RvcnMgbGlrZSB0aGVtZSByZWdpc3RyYXRpb25zCisgICAgaW4gdGhlIG1hbmlmZXN0LCB0aGUgU0RLIHZlcnNpb24sIGFuZCBvdGhlciBmYWN0b3JzLjwvbGk+CisgICAgPGxpPlRoZSBsYXlvdXQgZWRpdG9yIGlzIHNtYXJ0ZXIgYWJvdXQgcGlja2luZyBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byByZW5kZXIgYSBsYXlvdXQKK3dpdGgsIGRlZmF1bHRpbmcgdG8gdGhlIGN1cnJlbnRseSB2aXNpYmxlIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHByZXZpb3VzIGZpbGUuIEl0IGFsc28gY29uc2lkZXJzIHRoZQorU0RLIHRhcmdldCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBkZWZhdWx0IHRvIGEgdGFibGV0IG9yIHBob25lIHNjcmVlbiBzaXplLjwvbGk+CisgICAgPGxpPkJhc2ljIGZvY3VzIHN1cHBvcnQuIFRoZSBmaXJzdCB0ZXh0IGZpZWxkIGRyb3BwZWQgaW4gYSBsYXlvdXQgaXMgYXNzaWduZWQgZm9jdXMsIGFuZCB0aGVyZQorYXJlIDxzdHJvbmc+UmVxdWVzdCBGb2N1czwvc3Ryb25nPiBhbmQgPHN0cm9uZz5DbGVhciBGb2N1czwvc3Ryb25nPiBjb250ZXh0IG1lbnUgaXRlbXMgb24gdGV4dAorZmllbGRzIHRvIGNoYW5nZSB0aGUgZm9jdXMuPC9saT4KKyAgPC91bD4KKzwvZGQ+CisKKzxkdD5YTUwgZWRpdG9yczo8L2R0PgorPGRkPgorPHVsPiAgCisgIDxsaT5Db2RlIGNvbXBsZXRpb24gaGFzIGJlZW4gc2lnbmlmaWNhbnRseSBpbXByb3ZlZC4gSXQgbm93IHdvcmtzCisgIHdpdGgge0Bjb2RlICZsdDtzdHlsZSZndDt9IGVsZW1lbnRzLCBjb21wbGV0ZXMgZGltZW5zaW9uYWwgdW5pdHMsCisgIHNvcnRzIHJlc291cmNlIHBhdGhzIGluIHZhbHVlcyBiYXNlZCBvbiB0aGUgYXR0cmlidXRlIG5hbWUsIGFuZCBtb3JlLiBUaGVyZSBhcmUgYWxzbyBtYW55IGZpeGVzIHRvCitoYW5kbGUgdGV4dCByZXBsYWNlbWVudCAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQveG1sY29kZWNvbXBsZXRpb25pbXByb3ZlbWVudHMiPm1vcmUgaW5mbzwvYT4pLjwvbGk+CisgIDxsaT5BQVBUIGVycm9ycyBhcmUgaGFuZGxlZCBiZXR0ZXIuIFRoZXkgYXJlIG5vdyB1bmRlcmxpbmVkIGZvciB0aGUKKyAgcmVsZXZhbnQgcmFuZ2UgaW4gdGhlIGVkaXRvciwgYW5kIGEgbmV3IHF1aWNrZml4IG1ha2VzIGl0IHRyaXZpYWwKKyAgdG8gY3JlYXRlIG1pc3NpbmcgcmVzb3VyY2VzLjwvbGk+CisgIDxsaT5Db2RlIGNvbXBsZXRpb24gZm9yIGRyYXdhYmxlLCBhbmltYXRpb24gYW5kIGNvbG9yIFhNTCBmaWxlcyAoPGEKK2hyZWY9Imh0dHA6Ly90b29scy5hbmRyb2lkLmNvbS9yZWNlbnQvY29kZWNvbXBsZXRpb25mb3JkcmF3YWJsZXNjb2xvcnNhbmRhbmltYXRpb25maWxlcyI+bW9yZQoraW5mbzwvYT4pLjwvbGk+Cis8L3VsPgorPC9kZD4KKworPGR0PkRETVM6PC9kdD4KKzxkZD4KKzx1bD4gIAorICA8bGk+Ik5ldyBGb2xkZXIiIGFjdGlvbiBpbiB0aGUgRmlsZSBFeHBsb3Jlci48L2xpPgorICA8bGk+VGhlIHNjcmVlbnNob3QgZGlhbG9nIHdpbGwgYWRkIHRpbWVzdGFtcHMgdG8gdGhlIGZpbGVuYW1lcyBhbmQgcHJlc2VydmUgdGhlIG9yaWVudGF0aW9uIG9uCitzbmFwc2hvdCByZWZyZXNoLjwvbGk+Cis8L3VsPgorPC9kZD4KKworPGR0PkdlbmVyYWwgbm90ZXM6PC9kdD4KKzxkZD4KKyAgPHVsPgorICAgIDxsaT5UcmFjZVZpZXcgc3VwcG9ydHMgem9vbWluZyB3aXRoIHRoZSBtb3VzZS13aGVlbCBpbiB0aGUgdGltZWxpbmUuPC9saT4KKyAgICA8bGk+VGhlIE5ldyBBbmRyb2lkIFByb2plY3Qgd2l6YXJkIG5vdyBzdXBwb3J0cyBFY2xpcHNlIHdvcmtpbmcgc2V0cy48L2xpPgorICA8L3VsPgorPC9kZD4KKzwvZGw+Cis8cD5Nb3JlIGluZm9ybWF0aW9uIGFib3V0IHRvb2wgY2hhbmdlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSA8YQoraHJlZj0iaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL3JlY2VudCI+QW5kcm9pZCBUb29scyBQcm9qZWN0IFNpdGU8L2E+LjwvcD4KKzwvZGl2PgorPC9kaXY+CisKKworPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgorICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIKK3dpZHRoPSI5cHgiIC8+CiBBRFQgMTAuMC4xPC9hPiA8ZW0+KE1hcmNoIDIwMTEpPC9lbT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2luZGV4LmpkIGIvZG9jcy9odG1sL3Nkay9pbmRleC5qZAppbmRleCA3YzFjODZkLi5lN2I4ZmJiIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvaW5kZXguamQKQEAgLTMxLDYgKzMxLDE2IEBACiAgIDxsaT5FeHBsb3JlIHRoZSBjb250ZW50cyBvZiB0aGUgQW5kcm9pZCBTREsgKG9wdGlvbmFsKS48L2xpPgogPC9vbD4KIAotPHA+VG8gZ2V0IHN0YXJ0ZWQsIGRvd25sb2FkIHRoZSBhcHByb3ByaWF0ZSBwYWNrYWdlIGZyb20gdGhlIHRhYmxlIGFib3ZlLCB0aGVuIHJlYWQgdGhlIGd1aWRlIHRvIDxhCi1ocmVmPSJpbnN0YWxsaW5nLmh0bWwiPkluc3RhbGxpbmcgdGhlIFNESzwvYT4uPC9wPgorPHAgY2xhc3M9Im9ubGluZS1tZXNzYWdlIj5UbyBnZXQgc3RhcnRlZCwgZG93bmxvYWQgdGhlIGFwcHJvcHJpYXRlIHBhY2thZ2UgZnJvbSB0aGUgdGFibGUgYWJvdmUsCit0aGVuIHJlYWQgdGhlIGd1aWRlIHRvIDxhIGhyZWY9Imluc3RhbGxpbmcuaHRtbCI+SW5zdGFsbGluZyB0aGUgU0RLPC9hPi48L3A+CisKKzwhLS0gbm9uLWlubGluZSBzdHlsZSBhbmQgYmFzZWQgb24gb25seSBvbmUgc2VsZWN0b3Igc28gdGhhdAorICAgICBpdCBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHRoZSBzZGtwYWdlLmNzIHRlbXBsYXRlIC0tPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgLm9mZmxpbmUtbWVzc2FnZSB7IGRpc3BsYXk6bm9uZTsgfQorPC9zdHlsZT4KKyAgICAgIAorPHAgY2xhc3M9Im9mZmxpbmUtbWVzc2FnZSI+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHNldCB1cCB5b3VyCitkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgcmVhZCB0aGUgZ3VpZGUgdG8gPGEgaHJlZj0iaW5zdGFsbGluZy5odG1sIj5JbnN0YWxsaW5nIHRoZSBTREs8L2E+LjwvcD4KKwogPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL25kay9pbmRleC5qZCBiL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCmluZGV4IGJjOWJhNGIuLmU5ODBjYTUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCkBAIC0xLDE2ICsxLDE2IEBACiBuZGs9dHJ1ZQogCi1uZGsud2luX2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI1Yi13aW5kb3dzLnppcAotbmRrLndpbl9ieXRlcz02MTI5OTgzMQotbmRrLndpbl9jaGVja3N1bT04Nzc0NWFkYTMwNWFiNjM5Mzk5MTYxYWI0ZmFmNjg0YworbmRrLndpbl9kb3dubG9hZD1hbmRyb2lkLW5kay1yNWMtd2luZG93cy56aXAKK25kay53aW5fYnl0ZXM9NjE2Mjc3MTYKK25kay53aW5fY2hlY2tzdW09MmM3NDIzODQyZmEwZjQ2ODcxZWFiMTE4NDk1ZDRiNDUKIAotbmRrLm1hY19kb3dubG9hZD1hbmRyb2lkLW5kay1yNWItZGFyd2luLXg4Ni50YXIuYnoyCi1uZGsubWFjX2J5dGVzPTUwMjEwODYzCi1uZGsubWFjX2NoZWNrc3VtPTAxOWExNDYyMmEzNzdiMzcyN2VjNzg5YWY2NzA3MDM3CituZGsubWFjX2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI1Yy1kYXJ3aW4teDg2LnRhci5iejIKK25kay5tYWNfYnl0ZXM9NTA3MTQ3MTIKK25kay5tYWNfY2hlY2tzdW09MTgzYmZiYmQ4NWNmOGU0YzBiZDc1MzFlODgwM2U3NWQKIAotbmRrLmxpbnV4X2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI1Yi1saW51eC14ODYudGFyLmJ6MgotbmRrLmxpbnV4X2J5dGVzPTQ0MTM4NTM5Ci1uZGsubGludXhfY2hlY2tzdW09NGMwMDQ1ZGRjMmJmZDY1N2JlOWQ1MTc3ZDBlMGI3ZTcKK25kay5saW51eF9kb3dubG9hZD1hbmRyb2lkLW5kay1yNWMtbGludXgteDg2LnRhci5iejIKK25kay5saW51eF9ieXRlcz00NDUzOTg5MAorbmRrLmxpbnV4X2NoZWNrc3VtPTc2NTlkZmRjOTcwMjZlZDFkOTEzZTIyNGQwNTMxZjYxCiAKIHBhZ2UudGl0bGU9QW5kcm9pZCBOREsKIEBqZDpib2R5CkBAIC01MiwxNCArNTIsOTcgQEAKICAgdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKIH0KIC50b2dnbGVhYmxlLmNsb3NlZCAudG9nZ2xlbWUgewotICBkaXNwbGF5Om5vbmU7Ci19CisgIGRpc3BsYXk6bm9uZTt9CiAjamQtY29udGVudCAudG9nZ2xlLWltZyB7CiAgIG1hcmdpbjowOwogfQogPC9zdHlsZT4KIAorCiA8ZGl2IGNsYXNzPSJ0b2dnbGVhYmxlIG9wZW4iPgorICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj48aW1nIHNyYz0KKyAgIntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCI+CisgIEFuZHJvaWQgTkRLLCBSZXZpc2lvbiA1YzwvYT4gPGVtPihKdW5lIDIwMTEpPC9lbT4KKworICA8ZGl2IGNsYXNzPSJ0b2dnbGVtZSI+CisgICAgPHA+VGhpcyByZWxlYXNlIG9mIHRoZSBOREsgZG9lcyBub3QgaW5jbHVkZSBhbnkgbmV3IGZlYXR1cmVzIGNvbXBhcmVkIHRvIHI1Yi4gVGhlIHI1YyByZWxlYXNlCisgICAgYWRkcmVzc2VzIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgaW4gdGhlIHI1YiByZWxlYXNlOjwvcD4KKyAgICA8ZGw+CisgICAgICA8ZHQ+SW1wb3J0YW50IGJ1ZyBmaXhlczo8L2R0PgorICAgICAgPGRkPgorICAgICAgICA8dWw+CisgICAgICAgICAgPGxpPjxjb2RlPm5kay1idWlsZDwvY29kZT46IEZpeGVkIGEgcmFyZSBidWcgdGhhdCBhcHBlYXJlZCB3aGVuIHRyeWluZyB0byBwZXJmb3JtIHBhcmFsbGVsCisgICAgICAgICAgYnVpbGRzIG9mIGRlYnVnZ2FibGUgcHJvamVjdHMuPC9saT4KKworICAgICAgICAgIDxsaT5GaXhlZCBhIHR5cG8gdGhhdCBwcmV2ZW50ZWQgPGNvZGU+TE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUzwvY29kZT4gdG8gd29yaworICAgICAgICAgIGNvcnJlY3RseSB3aXRoIHRoZSBuZXcgdG9vbGNoYWluIGFuZCBhZGRlZCBkb2N1bWVudGF0aW9uIGZvciB0aGlzIGluCisgICAgICAgICAgPGNvZGU+ZG9jcy9BTkRST0lELU1LLmh0bWw8L2NvZGU+LjwvbGk+CisKKyAgICAgICAgICA8bGk+Rml4ZWQgYSBidWcgd2hlcmUgY29kZSBsaW5rZWQgYWdhaW5zdCA8Y29kZT5nbnVzdGxfc3RhdGljPC9jb2RlPiBjcmFzaGVkIHdoZW4gcnVuIG9uCisgICAgICAgICAgcGxhdGZvcm0gcmVsZWFzZXMgb2xkZXIgdGhhbiBBUEkgbGV2ZWwgOCAoQW5kcm9pZCAyLjIpLjwvbGk+CisKKyAgICAgICAgICA8bGk+PGNvZGU+bmRrLWdkYjwvY29kZT46IEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIGEgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gZGVidWdnaW5nIEFuZHJvaWQgMy4wCisgICAgICAgICAgb3IgbmV3ZXIgZGV2aWNlcy48L2xpPgorCisgICAgICAgICAgPGxpPjxjb2RlPiZsdDthbmRyb2lkL2lucHV0LmgmZ3Q7PC9jb2RlPjogVHdvIGZ1bmN0aW9ucyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiBBUEkgbGV2ZWwKKyAgICAgICAgICA5IChBbmRyb2lkIDIuMykgd2VyZSBpbmNvcnJlY3QgYW5kIGFyZSBmaXhlZC4gV2hpbGUgdGhpcyBicmVha3MgdGhlIHNvdXJjZSBBUEksIHRoZQorICAgICAgICAgIGJpbmFyeSBpbnRlcmZhY2UgdG8gdGhlIHN5c3RlbSBpcyB1bmNoYW5nZWQuIFRoZSBpbmNvcnJlY3QgZnVuY3Rpb25zIHdlcmUgbWlzc2luZyBhCisgICAgICAgICAgPGNvZGU+aGlzdG9yeV9pbmRleDwvY29kZT4gcGFyYW1ldGVyLCBhbmQgdGhlIGNvcnJlY3QgZGVmaW5pdGlvbnMgYXJlIHNob3duIGJlbG93OgorPHByZT4KK2Zsb2F0IEFNb3Rpb25FdmVudF9nZXRIaXN0b3JpY2FsUmF3WChjb25zdCBBSW5wdXRFdmVudCogbW90aW9uX2V2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwb2ludGVyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBoaXN0b3J5X2luZGV4KTsKKworZmxvYXQgQU1vdGlvbkV2ZW50X2dldEhpc3RvcmljYWxSYXdZKGNvbnN0IEFJbnB1dEV2ZW50KiBtb3Rpb25fZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBvaW50ZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhpc3RvcnlfaW5kZXgpOworPC9wcmU+CisgICAgICAgICAgPC9saT4KKworICAgICAgICAgIDxsaT5VcGRhdGVkIHRoZSBDIGxpYnJhcnkgQVJNIGJpbmFyeSBmb3IgQVBJIGxldmVsIDkgKEFuZHJvaWQgMi4zKSB0byBjb3JyZWN0bHkgZXhwb3NlIGF0CisgICAgICAgICAgbGluayB0aW1lIG5ldyBmdW5jdGlvbnMgdGhhdCB3ZXJlIGFkZGVkIGluIHRoYXQgQVBJIGxldmVsIChmb3IgZXhhbXBsZSwKKyAgICAgICAgICA8Y29kZT5wdGhyZWFkX3J3bG9ja19pbml0PC9jb2RlPikuPC9saT4KKworICAgICAgICA8L3VsPgorICAgICAgPC9kZD4KKworICAgICAgPGR0Pk1pbm9yIGltcHJvdmVtZW50cyBhbmQgZml4ZXM6PC9kdD4KKyAgICAgIDxkZD4KKyAgICAgICAgPHVsPgorICAgICAgICAgIDxsaT5PYmplY3QgZmlsZXMgYXJlIG5vdyBhbHdheXMgbGlua2VkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbgorICAgICAgICAgIDxjb2RlPkxPQ0FMX1NSQ19GSUxFUzwvY29kZT4uIFRoaXMgd2FzIG5vdCB0aGUgY2FzZSBwcmV2aW91c2x5IGJlY2F1c2UgdGhlIGZpbGVzIHdlcmUKKyAgICAgICAgICBncm91cGVkIGJ5IHNvdXJjZSBleHRlbnNpb25zIGluc3RlYWQuPC9saT4KKworICAgICAgICAgIDxsaT5XaGVuIDxjb2RlPmltcG9ydC1tb2R1bGU8L2NvZGU+IGZhaWxzLCBpdCBub3cgcHJpbnRzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQKKyAgICAgICAgICB3ZXJlIHNlYXJjaGVkLiBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjayB0aGF0IHRoZSA8Y29kZT5OREtfTU9EVUxFX1BBVEg8L2NvZGU+IGRlZmluaXRpb24KKyAgICAgICAgICB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0gaXMgY29ycmVjdC48L2xpPgorCisgICAgICAgICAgPGxpPldoZW4gPGNvZGU+aW1wb3J0LW1vZHVsZTwvY29kZT4gc3VjY2VlZHMsIGl0IG5vdyBwcmludHMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUKKyAgICAgICAgICBtb2R1bGUgd2FzIGZvdW5kIHRvIHRoZSBsb2cgKHZpc2libGUgd2l0aCA8Y29kZT5OREtfTE9HPTE8L2NvZGU+KS48L2xpPgorCisgICAgICAgICAgPGxpPkluY3JlYXNlZCB0aGUgYnVpbGQgc3BlZWQgb2YgZGVidWdnYWJsZSBhcHBsaWNhdGlvbnMgd2hlbiB0aGVyZSBpcyBhIHZlcnkgbGFyZ2UgbnVtYmVyCisgICAgICAgICAgb2YgaW5jbHVkZSBkaXJlY3RvcmllcyBpbiB0aGUgcHJvamVjdC48L2xpPgorCisgICAgICAgICAgPGxpPjxjb2RlPm5kay1nZGI8L2NvZGU+OiBCZXR0ZXIgZGV0ZWN0aW9uIG9mIDxjb2RlPmFkYiBzaGVsbDwvY29kZT4gZmFpbHVyZXMgYW5kIGltcHJvdmVkCisgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuPC9saT4KKworICAgICAgICAgIDxsaT48Y29kZT4mbHQ7cHRocmVhZC5oJmd0OzwvY29kZT46IEZpeGVkIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICAgICAgPGNvZGU+UFRIUkVBRF9SV0xPQ0tfSU5JVElBTElaRVI8L2NvZGU+IGZvciBBUEkgbGV2ZWwgOSAoQW5kcm9pZCAyLjMpIGFuZCBoaWdoZXIuPC9saT4KKworICAgICAgICAgIDxsaT5GaXhlZCBhbiBpc3N1ZSB3aGVyZSBhIG1vZHVsZSBjb3VsZCBpbXBvcnQgaXRzZWxmLCByZXN1bHRpbmcgaW4gYW4gaW5maW5pdGUgbG9vcCBpbgorICAgICAgICAgIEdOVSBNYWtlLjwvbGk+CisKKyAgICAgICAgICA8bGk+Rml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgdGhlIGJ1aWxkIHRvIGZhaWwgaWYgPGNvZGU+TE9DQUxfQVJNX05FT048L2NvZGU+IHdhcyBzZXQgdG8KKyAgICAgICAgICB0cnVlICh0eXBvIGluIDxjb2RlPmJ1aWxkL2NvcmUvYnVpbGQtYmluYXJ5Lm1rPC9jb2RlPikuPC9saT4KKworICAgICAgICAgIDxsaT5GaXhlZCBhIGJ1ZyB0aGF0IHByZXZlbnRlZCB0aGUgY29tcGlsYXRpb24gb2YgPC9jb2RlPi5zPC9jb2RlPiBhc3NlbWJseSBmaWxlcworICAgICAgICAgICg8Y29kZT4uUzwvY29kZT4gZmlsZXMgd2VyZSBva2F5KS48L2xpPgorICAgICAgICA8L3VsPgorICAgICAgPC9kZD4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgogICAgIDxhIGhyZWY9IiMiCiAgICAgICAgICBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj48aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvdHJpYW5nbGUtY2xvc2VkLnBuZyIKICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtaW1nIgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9zZGtfdG9jLmNzIGIvZG9jcy9odG1sL3Nkay9zZGtfdG9jLmNzCmluZGV4IDExZjI5YjEuLjU3NTBjODEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvc2RrX3RvYy5jcworKysgYi9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MKQEAgLTEsNiArMSw1IEBACiA8P2NzIGlmOiFzZGsucmVkaXJlY3QgPz4KLTx1bD48P2NzCi0gIGlmOmFuZHJvaWQud2hpY2hkb2MgPT0gIm9ubGluZSIgPz4KKzx1bD4KICAgPGxpPgogICAgIDxoMj4KICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+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+CiAgIDxsaT4KQEAgLTE3NCw3ICsxNzUsNyBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9InpoLVRXIj48L3NwYW4+CiAgICAgPC9oMj4KICAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL25kay9pbmRleC5odG1sIj5BbmRyb2lkIE5ESywgcjViPC9hPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PnNkay9uZGsvaW5kZXguaHRtbCI+QW5kcm9pZCBOREssIHI1YzwvYT4KICAgICAgICAgPC9saT4KICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvbmRrL292ZXJ2aWV3Lmh0bWwiPldoYXQgaXMgdGhlIE5ESz88L2E+PC9saT4KICAgICA8L3VsPgpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IGMzN2I0ZjguLjQ1OGYxYjYgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTM3LDcgKzM3LDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyB2b2lkIHdyaXRlRGVjcnB0SGFuZGxlVG9QYXJjZWxEYXRhKAorc3RhdGljIHZvaWQgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKAogICAgICAgICBjb25zdCBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgewogICAgIGRhdGEtPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SWQpOwogICAgIGRhdGEtPndyaXRlU3RyaW5nOChoYW5kbGUtPm1pbWVUeXBlKTsKQEAgLTQ2LDE0ICs0NiwxNCBAQAogCiAgICAgaW50IHNpemUgPSBoYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLnNpemUoKTsKICAgICBkYXRhLT53cml0ZUludDMyKHNpemUpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+Y29weUNvbnRyb2xWZWN0b3Iua2V5QXQoaSkpOwogICAgICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+Y29weUNvbnRyb2xWZWN0b3IudmFsdWVBdChpKSk7CiAgICAgfQogCiAgICAgc2l6ZSA9IGhhbmRsZS0+ZXh0ZW5kZWREYXRhLnNpemUoKTsKICAgICBkYXRhLT53cml0ZUludDMyKHNpemUpOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5leHRlbmRlZERhdGEua2V5QXQoaSkpOwogICAgICAgICBkYXRhLT53cml0ZVN0cmluZzgoaGFuZGxlLT5leHRlbmRlZERhdGEudmFsdWVBdChpKSk7CiAgICAgfQpAQCAtNzcsMTQgKzc3LDE0IEBACiAgICAgaGFuZGxlLT5zdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgaW50IHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSArKykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIERybUNvcHlDb250cm9sIGtleSA9IChEcm1Db3B5Q29udHJvbClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBpbnQgdmFsdWUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBoYW5kbGUtPmNvcHlDb250cm9sVmVjdG9yLmFkZChrZXksIHZhbHVlKTsKICAgICB9CiAKICAgICBzaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkgKyspIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBTdHJpbmc4IGtleSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgaGFuZGxlLT5leHRlbmRlZERhdGEuYWRkKGtleSwgdmFsdWUpOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOwogCi0gICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOworICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CiAKICAgICBkYXRhLndyaXRlSW50MzIoYWN0aW9uKTsKICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8IGludD4ocmVzZXJ2ZSkpOwpAQCAtNDMzLDcgKzQzMyw3IEBACiAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOwogCi0gICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOworICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CiAKICAgICBkYXRhLndyaXRlSW50MzIocGxheWJhY2tTdGF0dXMpOwogICAgIGRhdGEud3JpdGVJbnQ2NChwb3NpdGlvbik7CkBAIC02NDYsNyArNjQ2LDcgQEAKICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CiAKLSAgICB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CisgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRV9ERUNSWVBUX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAKQEAgLTY2Miw3ICs2NjIsNyBAQAogICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKIAotICAgIHdyaXRlRGVjcnB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKKyAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOwogCiAgICAgZGF0YS53cml0ZUludDMyKGRlY3J5cHRVbml0SWQpOwogCkBAIC02ODIsNyArNjgyLDcgQEAKICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgIGRhdGEud3JpdGVJbnQzMih1bmlxdWVJZCk7CiAKLSAgICB3cml0ZURlY3JwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CisgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKIAogICAgIGRhdGEud3JpdGVJbnQzMihkZWNyeXB0VW5pdElkKTsKICAgICBkYXRhLndyaXRlSW50MzIoKCpkZWNCdWZmZXIpLT5sZW5ndGgpOwpAQCAtNzE1LDcgKzcxNSw3IEBACiAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm1NYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICBkYXRhLndyaXRlSW50MzIodW5pcXVlSWQpOwogCi0gICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOworICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShkZWNyeXB0SGFuZGxlLCAmZGF0YSk7CiAKICAgICBkYXRhLndyaXRlSW50MzIoZGVjcnlwdFVuaXRJZCk7CiAKQEAgLTczMyw3ICs3MzMsNyBAQAogICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgZGF0YS53cml0ZUludDMyKHVuaXF1ZUlkKTsKIAotICAgIHdyaXRlRGVjcnB0SGFuZGxlVG9QYXJjZWxEYXRhKGRlY3J5cHRIYW5kbGUsICZkYXRhKTsKKyAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoZGVjcnlwdEhhbmRsZSwgJmRhdGEpOwogCiAgICAgZGF0YS53cml0ZUludDMyKG51bUJ5dGVzKTsKICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKQEAgLTEyNDQsNyArMTI0NCw3IEBACiAgICAgICAgICAgICA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIGRhdGEucmVhZEludDY0KCksIGRhdGEucmVhZEludDY0KCkpOwogCiAgICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgd3JpdGVEZWNycHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CiAgICAgICAgIH0KQEAgLTEyNjIsNyArMTI2Miw3IEBACiAgICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpKTsKIAogICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOworICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwogCiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvUmVxdWVzdC5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1JlcXVlc3QuamF2YQppbmRleCAyMjIyYWU4Li4xNDI5ZmE1IDEwMDc1NQotLS0gYS9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvUmVxdWVzdC5qYXZhCisrKyBiL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9SZXF1ZXN0LmphdmEKQEAgLTMyLDE2ICszMiwxNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUkVHSVNUUkFUSU9OX0lORk8gPSAxOwogICAgIC8qKgotICAgICogQWNxdWlyZXMgaW5mb3JtYXRpb24gZm9yIHVucmVnaXN0ZXJpbmcgdGhlIERSTSBzZXJ2ZXIuCi0gICAgKi8KKyAgICAgKiBBY3F1aXJlcyBpbmZvcm1hdGlvbiBmb3IgdW5yZWdpc3RlcmluZyB0aGUgRFJNIHNlcnZlci4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1VOUkVHSVNUUkFUSU9OX0lORk8gPSAyOwogICAgIC8qKgotICAgICogQWNxdWlyZXMgcmlnaHRzIGluZm9ybWF0aW9uLgotICAgICovCisgICAgICogQWNxdWlyZXMgcmlnaHRzIGluZm9ybWF0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfUklHSFRTX0FDUVVJU0lUSU9OX0lORk8gPSAzOwogICAgIC8qKgotICAgICogQWNxdWlyZXMgdGhlIHByb2dyZXNzIG9mIHRoZSByaWdodHMgYWNxdWlzaXRpb24uCi0gICAgKi8KKyAgICAgKiBBY3F1aXJlcyB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHJpZ2h0cyBhY3F1aXNpdGlvbi4KKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1JJR0hUU19BQ1FVSVNJVElPTl9QUk9HUkVTU19JTkZPID0gNDsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1N0YXR1cy5qYXZhIGIvZHJtL2phdmEvYW5kcm9pZC9kcm0vRHJtSW5mb1N0YXR1cy5qYXZhCmluZGV4IGIwNDY5NGIuLjVjMTJhZTMgMTAwNzU1Ci0tLSBhL2RybS9qYXZhL2FuZHJvaWQvZHJtL0RybUluZm9TdGF0dXMuamF2YQorKysgYi9kcm0vamF2YS9hbmRyb2lkL2RybS9Ecm1JbmZvU3RhdHVzLmphdmEKQEAgLTMxLDIwICszMSwyMCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19FUlJPUiA9IDI7CiAKICAgICAvKioKLSAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGNvbW11bmljYXRpb24uCi0gICAgKi8KKyAgICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBjb21tdW5pY2F0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgc3RhdHVzQ29kZTsKICAgICAvKioKLSAgICAqIFRoZSB0eXBlIG9mIERSTSBpbmZvcm1hdGlvbiBwcm9jZXNzZWQuCi0gICAgKi8KKyAgICAgKiBUaGUgdHlwZSBvZiBEUk0gaW5mb3JtYXRpb24gcHJvY2Vzc2VkLgorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBpbnQgaW5mb1R5cGU7CiAgICAgLyoqCi0gICAgKiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBjb250ZW50LgotICAgICovCisgICAgICogVGhlIE1JTUUgdHlwZSBvZiB0aGUgY29udGVudC4KKyAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1pbWVUeXBlOwogICAgIC8qKgotICAgICogVGhlIHByb2Nlc3NlZCBkYXRhLgotICAgICovCisgICAgICogVGhlIHByb2Nlc3NlZCBkYXRhLgorICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBQcm9jZXNzZWREYXRhIGRhdGE7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL2luY2x1ZGUvUGx1Z0luTWFuYWdlci5oCmluZGV4IDgwMjkxMzguLjdiYjE0M2YgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9QbHVnSW5NYW5hZ2VyLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL1BsdWdJbk1hbmFnZXIuaApAQCAtMjAyLDcgKzIwMiw3IEBACiAgICAgVmVjdG9yPFN0cmluZzg+IGdldFBsdWdJblBhdGhMaXN0KGNvbnN0IFN0cmluZzgmIHJzRGlyUGF0aCkgewogICAgICAgICBWZWN0b3I8U3RyaW5nOD4gZmlsZUxpc3Q7CiAgICAgICAgIERJUiogcERpciA9IG9wZW5kaXIocnNEaXJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgc3RydWN0IGRpcmVudCogcEVudHJ5ID0gbmV3IGRpcmVudCgpOworICAgICAgICBzdHJ1Y3QgZGlyZW50KiBwRW50cnk7CiAKICAgICAgICAgd2hpbGUgKE5VTEwgIT0gcERpciAmJiBOVUxMICE9IChwRW50cnkgPSByZWFkZGlyKHBEaXIpKSkgewogICAgICAgICAgICAgaWYgKCFpc1BsdWdJbihwRW50cnkpKSB7CkBAIC0yMTksOCArMjE5LDYgQEAKICAgICAgICAgaWYgKE5VTEwgIT0gcERpcikgewogICAgICAgICAgICAgY2xvc2VkaXIocERpcik7CiAgICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHBFbnRyeTsKLSAgICAgICAgcEVudHJ5ID0gTlVMTDsKIAogICAgICAgICByZXR1cm4gZmlsZUxpc3Q7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKaW5kZXggZDQzMGY3Mi4uMDdiM2I0NyAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC01MywxMSArNTMsMTEgQEAKIH0KIAogRndkTG9ja0VuZ2luZTo6RndkTG9ja0VuZ2luZSgpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lIENvbnN0cnVjdGlvbiIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmUgQ29uc3RydWN0aW9uIik7CiB9CiAKIEZ3ZExvY2tFbmdpbmU6On5Gd2RMb2NrRW5naW5lKCkgewotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmUgRGVzdHJ1Y3Rpb24iKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lIERlc3RydWN0aW9uIik7CiAKICAgICBjb252ZXJ0U2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7CiAgICAgZGVjb2RlU2Vzc2lvbk1hcC5kZXN0cm95TWFwKCk7CkBAIC05MSw3ICs5MSw3IEBACiBEcm1Db25zdHJhaW50cyogRndkTG9ja0VuZ2luZTo6b25HZXRDb25zdHJhaW50cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgsIGludCBhY3Rpb24pIHsKICAgICBEcm1Db25zdHJhaW50cyogZHJtQ29uc3RyYWludHMgPSBOVUxMOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXRDb25zdHJhaW50cyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0Q29uc3RyYWludHMiKTsKIAogICAgIGlmIChOVUxMICE9IHBhdGggJiYKICAgICAgICAgKFJpZ2h0c1N0YXR1czo6UklHSFRTX1ZBTElEID09IG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsICpwYXRoLCBhY3Rpb24pKSkgewpAQCAtMTA1LDcgKzEwNSw3IEBACiBEcm1NZXRhZGF0YSogRndkTG9ja0VuZ2luZTo6b25HZXRNZXRhZGF0YShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgqIHBhdGgpIHsKICAgICBEcm1NZXRhZGF0YSogZHJtTWV0YWRhdGEgPSBOVUxMOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXRNZXRhZGF0YSIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0TWV0YWRhdGEiKTsKIAogICAgIGlmIChOVUxMICE9IHBhdGgpIHsKICAgICAgICAgLy8gUmV0dXJucyBlbXB0eSBtZXRhZGF0YSB0byBzaG93IG5vIGVycm9yIGNvbmRpdGlvbi4KQEAgLTExNiwxMSArMTE2LDExIEBACiB9CiAKIGFuZHJvaWQ6OnN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZShpbnQgdW5pcXVlSWQpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUiKTsKIAogCiAgICAgaWYgKEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uKCkpIHsKLSAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIC0tIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uIHN1Y2NlZWRlZCIpOworICAgICAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemUgLS0gRndkTG9ja0dsdWVfSW5pdGlhbGl6ZUtleUVuY3J5cHRpb24gc3VjY2VlZGVkIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplIC0tIEZ3ZExvY2tHbHVlX0luaXRpYWxpemVLZXlFbmNyeXB0aW9uIGZhaWxlZDoiCiAgICAgICAgICAgICAgImVycm5vID0gJWQiLCBlcnJubyk7CkBAIC0xMzIsMTMgKzEzMiwxMyBAQAogYW5kcm9pZDo6c3RhdHVzX3QKIEZ3ZExvY2tFbmdpbmU6Om9uU2V0T25JbmZvTGlzdGVuZXIoaW50IHVuaXF1ZUlkLCBjb25zdCBJRHJtRW5naW5lOjpPbkluZm9MaXN0ZW5lciogaW5mb0xpc3RlbmVyKSB7CiAgICAgLy8gTm90IHVzZWQKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNldE9uSW5mb0xpc3RlbmVyIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25TZXRPbkluZm9MaXN0ZW5lciIpOwogCiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogYW5kcm9pZDo6c3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUoaW50IHVuaXF1ZUlkKSB7Ci0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25UZXJtaW5hdGUiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvblRlcm1pbmF0ZSIpOwogCiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KQEAgLTE0Niw3ICsxNDYsNyBAQAogRHJtU3VwcG9ydEluZm8qIEZ3ZExvY2tFbmdpbmU6Om9uR2V0U3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkKSB7CiAgICAgRHJtU3VwcG9ydEluZm8qIHBTdXBwb3J0SW5mbyA9IG5ldyBEcm1TdXBwb3J0SW5mbygpOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25HZXRTdXBwb3J0SW5mbyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0U3VwcG9ydEluZm8iKTsKIAogICAgIC8vIGZpbGwgYWxsIEZvcndhcmQgTG9jayBtaW1ldHlwZXMgYW5kIGV4dGVuc2lvbnMKICAgICBpZiAoTlVMTCAhPSBwU3VwcG9ydEluZm8pIHsKQEAgLTE4Miw3ICsxODIsNyBAQAogCiAgICAgZHJtSW5mb1N0YXR1cyA9IG5ldyBEcm1JbmZvU3RhdHVzKChpbnQpRHJtSW5mb1N0YXR1czo6U1RBVFVTX09LLCAwLCBOVUxMLCBTdHJpbmc4KCIiKSk7CiAKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblByb2Nlc3NEcm1JbmZvIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25Qcm9jZXNzRHJtSW5mbyIpOwogCiAgICAgcmV0dXJuIGRybUluZm9TdGF0dXM7CiB9CkBAIC0xOTMsNyArMTkzLDcgQEAKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJpZ2h0c1BhdGgsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjb250ZW50UGF0aCkgewogICAgIC8vIE5vIHJpZ2h0cyB0byBzYXZlLiBSZXR1cm4KLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvblNhdmVSaWdodHMiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgIERybUluZm8qIGRybUluZm8gPSBOVUxMOwogCiAgICAgLy8gTm90aGluZyB0byBiZSBkb25lIGZvciBGb3J3YXJkIExvY2sgZmlsZQotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uQWNxdWlyZURybUluZm8iKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkFjcXVpcmVEcm1JbmZvIik7CiAKICAgICByZXR1cm4gZHJtSW5mbzsKIH0KQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbikgewogICAgIGludCByZXN1bHQgPSBSaWdodHNTdGF0dXM6OlJJR0hUU19JTlZBTElEOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DaGVja1JpZ2h0c1N0YXR1cyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uQ2hlY2tSaWdodHNTdGF0dXMiKTsKIAogICAgIC8vIE9ubHkgVHJhbnNmZXIgYWN0aW9uIGlzIG5vdCBhbGxvd2VkIGZvciBmb3J3YXJkIExvY2sgZmlsZXMuCiAgICAgaWYgKG9uQ2FuSGFuZGxlKHVuaXF1ZUlkLCBwYXRoKSkgewpAQCAtMjQxLDcgKzI0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpIHsKICAgICAvLyBObyByaWdodHMgY29uc3VtcHRpb24KLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMiKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCkBAIC0yNDksMTQgKzI0OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblZhbGlkYXRlQWN0aW9uIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25WYWxpZGF0ZUFjdGlvbiIpOwogCiAgICAgLy8gRm9yIHRoZSBmb3J3YXJkbG9jayBlbmdpbmUgY2hlY2tSaWdodHMgYW5kIFZhbGlkYXRlQWN0aW9uIGFyZSB0aGUgc2FtZS4KICAgICByZXR1cm4gKG9uQ2hlY2tSaWdodHNTdGF0dXModW5pcXVlSWQsIHBhdGgsIGFjdGlvbikgPT0gUmlnaHRzU3RhdHVzOjpSSUdIVFNfVkFMSUQpOwogfQogCiBTdHJpbmc4IEZ3ZExvY2tFbmdpbmU6Om9uR2V0T3JpZ2luYWxNaW1lVHlwZShpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkdldE9yaWdpbmFsTWltZVR5cGUiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkdldE9yaWdpbmFsTWltZVR5cGUiKTsKICAgICBTdHJpbmc4IG1pbWVTdHJpbmcgPSBTdHJpbmc4KCIiKTsKICAgICBpbnQgZmlsZURlc2MgPSBGd2RMb2NrRmlsZV9vcGVuKHBhdGguc3RyaW5nKCkpOwogCkBAIC0yODAsNyArMjgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBTdHJpbmc4IG1pbWVTdHIgPSBTdHJpbmc4KG1pbWVUeXBlKTsKIAotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0RHJtT2JqZWN0VHlwZSIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uR2V0RHJtT2JqZWN0VHlwZSIpOwogCiAgICAgbWltZVN0ci50b0xvd2VyKCk7CiAKQEAgLTMwMSwxMyArMzAxLDEzIEBACiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlUmlnaHRzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCkgewogICAgIC8vIE5vIFJpZ2h0cyB0byByZW1vdmUKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblJlbW92ZVJpZ2h0cyIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlUmlnaHRzIik7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25SZW1vdmVBbGxSaWdodHMoaW50IHVuaXF1ZUlkKSB7CiAgICAgLy8gTm8gcmlnaHRzIHRvIHJlbW92ZQotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uUmVtb3ZlQWxsUmlnaHRzIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25SZW1vdmVBbGxSaWdodHMiKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQogCkBAIC0zMTksMTQgKzMxOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludCBwb3NpdGlvbikgewogI2VuZGlmCiAgICAgLy8gTm90IHVzZWQKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyIpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uKGludCB1bmlxdWVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnRJZCkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkNvbnZlcnRTZXNzaW9uIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25PcGVuQ29udmVydFNlc3Npb24iKTsKICAgICBpZiAoIWNvbnZlcnRTZXNzaW9uTWFwLmlzQ3JlYXRlZChjb252ZXJ0SWQpKSB7CiAgICAgICAgIENvbnZlcnRTZXNzaW9uICpuZXdTZXNzaW9uID0gbmV3IENvbnZlcnRTZXNzaW9uKCk7CiAgICAgICAgIGlmIChGd2RMb2NrQ29udl9TdGF0dXNfT0sgPT0KQEAgLTM4Myw3ICszODMsNyBAQAogICAgIERybUJ1ZmZlciAqY29udlJlc3VsdCA9IG5ldyBEcm1CdWZmZXIoTlVMTCwgMCk7CiAgICAgaW50IG9mZnNldCA9IC0xOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25DbG9zZUNvbnZlcnRTZXNzaW9uIik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25DbG9zZUNvbnZlcnRTZXNzaW9uIik7CiAKICAgICBpZiAoY29udmVydFNlc3Npb25NYXAuaXNDcmVhdGVkKGNvbnZlcnRJZCkpIHsKICAgICAgICAgQ29udmVydFNlc3Npb24gKmNvbnZTZXNzaW9uID0gY29udmVydFNlc3Npb25NYXAuZ2V0VmFsdWUoY29udmVydElkKTsKQEAgLTQyNCw3ICs0MjQsNyBAQAogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIGludCBmaWxlRGVzYyA9IC0xOwogCi0gICAgTE9HRCgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24iKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogCiAgICAgaWYgKCgtMSA8IGZkKSAmJgogICAgICAgICAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgpAQCAtNDU1LDEyICs0NTUsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIEludGVncml0eSBDaGVjayBmYWlsZWQgZm9yIHRoZSBmZCIpOwogICAgICAgICAgICAgRndkTG9ja0ZpbGVfZGV0YWNoKGZpbGVEZXNjKTsKLSAgICAgICAgICAgIDo6Y2xvc2UoZmlsZURlc2MpOwogICAgICAgICAgICAgZGVsZXRlIGRlY29kZVNlc3Npb247CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBFeGl0LiByZXN1bHQgPSAlZCIsIHJlc3VsdCk7CisgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQgJiYgLTEgPCBmaWxlRGVzYykgeworICAgICAgICA6OmNsb3NlKGZpbGVEZXNjKTsKKyAgICB9CisKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbiBFeGl0LiByZXN1bHQgPSAlZCIsIHJlc3VsdCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQpAQCAtNDk3LDcgKzUwMCw3IEBACiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24iKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24iKTsKIAogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgewogICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwpAQCAtNTA5LDcgKzUxMiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24gRXhpdCIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiBFeGl0Iik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNTE3LDEzICs1MjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CisgICAgTE9HVigiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdCIpOwogICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKIH0KIApAQCAtNTMyLDE0ICs1MzUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIpIHsKLSAgICBMT0dEKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKKyAgICBMT0dWKCJGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQiKTsKICAgICByZXR1cm4gRFJNX0VSUk9SX1VOS05PV047CiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCkgewotICAgIExPR0QoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCIpOworICAgIExPR1YoIkZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhcmNlbFN1cmZhY2VUZXh0dXJlLmFpZGwgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFyY2VsU3VyZmFjZVRleHR1cmUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZmMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1BhcmNlbFN1cmZhY2VUZXh0dXJlLmFpZGwKQEAgLTAsMCArMSwxOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7CisKK3BhcmNlbGFibGUgUGFyY2VsU3VyZmFjZVRleHR1cmU7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFyY2VsU3VyZmFjZVRleHR1cmUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9QYXJjZWxTdXJmYWNlVGV4dHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzJjYzYKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvUGFyY2VsU3VyZmFjZVRleHR1cmUuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworCisvKioKKyAqCisgKiBAaGlkZSBQZW5kaW5nIHJldmlldyBieSBBUEkgY291bmNpbC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcmNlbFN1cmZhY2VUZXh0dXJlIGltcGxlbWVudHMgUGFyY2VsYWJsZSB7CisgICAgLyoqCisgICAgICogVGhpcyBmaWVsZCBpcyB1c2VkIGJ5IG5hdGl2ZSBjb2RlLCBkbyBub3QgYWNjZXNzIG9yIG1vZGlmeS4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorICAgIHByaXZhdGUgaW50IG1JU3VyZmFjZVRleHR1cmU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgUGFyY2VsU3VyZmFjZVRleHR1cmUgZnJvbSBhIFN1cmZhY2VUZXh0dXJlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3VyZmFjZVRleHR1cmUgVGhlIFN1cmZhY2VUZXh0dXJlIHRvIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIG5ldyBQYXJjZWxTdXJmYWNlVGV4dHVyZSBmb3IgdGhlIGdpdmVuIFN1cmZhY2VUZXh0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyY2VsU3VyZmFjZVRleHR1cmUgZnJvbVN1cmZhY2VUZXh0dXJlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyY2VsU3VyZmFjZVRleHR1cmUoc3VyZmFjZVRleHR1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgYW5kcm9pZC5vcy5QYXJjZWxhYmxlI2Rlc2NyaWJlQ29udGVudHMoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBhbmRyb2lkLm9zLlBhcmNlbGFibGUjd3JpdGVUb1BhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCwgaW50KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgeworICAgICAgICBuYXRpdmVXcml0ZVRvUGFyY2VsKGRlc3QsIGZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcmNlbGFibGUuQ3JlYXRvcjxQYXJjZWxTdXJmYWNlVGV4dHVyZT4gQ1JFQVRPUiA9CisgICAgICAgIG5ldyBQYXJjZWxhYmxlLkNyZWF0b3I8UGFyY2VsU3VyZmFjZVRleHR1cmU+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhcmNlbFN1cmZhY2VUZXh0dXJlIGNyZWF0ZUZyb21QYXJjZWwoUGFyY2VsIGluKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmNlbFN1cmZhY2VUZXh0dXJlKGluKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhcmNlbFN1cmZhY2VUZXh0dXJlW10gbmV3QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyY2VsU3VyZmFjZVRleHR1cmVbc2l6ZV07CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBQYXJjZWxTdXJmYWNlVGV4dHVyZShQYXJjZWwgaW4pIHsKKyAgICAgICAgbmF0aXZlUmVhZEZyb21QYXJjZWwoaW4pOworICAgIH0KKyAgICBwcml2YXRlIFBhcmNlbFN1cmZhY2VUZXh0dXJlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7CisgICAgICAgIG5hdGl2ZUluaXQoc3VyZmFjZVRleHR1cmUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuYXRpdmVGaW5hbGl6ZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlSW5pdChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSk7CisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVGaW5hbGl6ZSgpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlV3JpdGVUb1BhcmNlbChQYXJjZWwgZGVzdCwgaW50IGZsYWdzKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVJlYWRGcm9tUGFyY2VsKFBhcmNlbCBpbik7CisKKyAgICAvKgorICAgICAqIFdlIHVzZSBhIGNsYXNzIGluaXRpYWxpemVyIHRvIGFsbG93IHRoZSBuYXRpdmUgY29kZSB0byBjYWNoZSBzb21lCisgICAgICogZmllbGQgb2Zmc2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVDbGFzc0luaXQoKTsKKyAgICBzdGF0aWMgeyBuYXRpdmVDbGFzc0luaXQoKTsgfQorfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL1N1cmZhY2VUZXh0dXJlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUuamF2YQppbmRleCAzYzQzYTM5Li42YzczNDFmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUuamF2YQpAQCAtNjYsMTEgKzY2LDggQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgZmllbGQgaXMgdXNlZCBieSBuYXRpdmUgY29kZSwgZG8gbm90IGFjY2VzcyBvciBtb2RpZnkuCi0gICAgICogCi0gICAgICogQGhpZGUKICAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIn0pCi0gICAgcHVibGljIGludCBtU3VyZmFjZVRleHR1cmU7CisgICAgcHJpdmF0ZSBpbnQgbVN1cmZhY2VUZXh0dXJlOwogCiAgICAgLyoqCiAgICAgICogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBiZWluZyBub3RpZmllZCB0aGF0IGEgbmV3IHN0cmVhbSBmcmFtZSBpcyBhdmFpbGFibGUuCkBAIC0xMTgsNiArMTE1LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBzaXplIG9mIGJ1ZmZlcnMgcmV0dXJuZWQgYnkgcmVxdWVzdEJ1ZmZlcnMgd2hlbiBhIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAgKiBvZiB6ZXJvIGlzIHJlcXVlc3RlZC4KKyAgICAgKgorICAgICAqIEBoaWRlIFBlbmRpbmcgYXBwcm92YWwgYnkgQVBJIGNvdW5jaWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEJ1ZmZlclNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG5hdGl2ZVNldERlZmF1bHRCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgdGV4dHVyZSBpbWFnZSB0byB0aGUgbW9zdCByZWNlbnQgZnJhbWUgZnJvbSB0aGUgaW1hZ2Ugc3RyZWFtLiAgVGhpcyBtYXkgb25seSBiZQogICAgICAqIGNhbGxlZCB3aGlsZSB0aGUgT3BlbkdMIEVTIGNvbnRleHQgdGhhdCBvd25zIHRoZSB0ZXh0dXJlIGlzIGJvdW5kIHRvIHRoZSB0aHJlYWQuICBJdCB3aWxsCiAgICAgICogaW1wbGljaXRseSBiaW5kIGl0cyB0ZXh0dXJlIHRvIHRoZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyB0ZXh0dXJlIHRhcmdldC4KQEAgLTIwNiw2ICsyMTMsNyBAQAogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlRmluYWxpemUoKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZUdldFRyYW5zZm9ybU1hdHJpeChmbG9hdFtdIG10eCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyBuYXRpdmVHZXRUaW1lc3RhbXAoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVNldERlZmF1bHRCdWZmZXJTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBuYXRpdmVVcGRhdGVUZXhJbWFnZSgpOwogCiAgICAgLyoKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9BbmltYXRpb25EcmF3YWJsZS5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlLmphdmEKaW5kZXggZTI3NWJhOC4uMjIyMGY5NiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0FuaW1hdGlvbkRyYXdhYmxlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKICAqIEFuaW1hdGlvbkRyYXdhYmxlIGZyYW1lQW5pbWF0aW9uID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBpbWcuZ2V0QmFja2dyb3VuZCgpOwogICoKICAqIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24gKGxvb3BlZCBwbGF5YmFjayBieSBkZWZhdWx0KS4KLSAqIGZyYW1lQW5pbWF0aW9uLnN0YXJ0KCkKKyAqIGZyYW1lQW5pbWF0aW9uLnN0YXJ0KCk7CiAgKiA8L3ByZT4KICAqIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGd1aWRlIHRvIDxhCiAgKiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9hbmltYXRpb24tcmVzb3VyY2UuaHRtbCI+QW5pbWF0aW9uIFJlc291cmNlczwvYT4uPC9wPgpAQCAtMTkyLDYgKzE5Miw5IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRnJhbWUoRHJhd2FibGUgZnJhbWUsIGludCBkdXJhdGlvbikgewogICAgICAgICBtQW5pbWF0aW9uU3RhdGUuYWRkRnJhbWUoZnJhbWUsIGR1cmF0aW9uKTsKKyAgICAgICAgaWYgKG1DdXJGcmFtZSA8IDApIHsKKyAgICAgICAgICAgIHNldEZyYW1lKDAsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgfQogICAgIH0KICAgICAKICAgICBwcml2YXRlIHZvaWQgbmV4dEZyYW1lKGJvb2xlYW4gdW5zY2hlZHVsZSkgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0JpdG1hcERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YQppbmRleCAzMTFmMDI0Li5hNDczNGZmIDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQml0bWFwRHJhd2FibGUuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwpAQCAtMzg2LDggKzM4Nyw5IEBACiAgICAgICAgICAgICBTaGFkZXIgc2hhZGVyID0gc3RhdGUubVBhaW50LmdldFNoYWRlcigpOwogICAgICAgICAgICAgaWYgKHNoYWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1BcHBseUdyYXZpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxheW91dERpcmVjdGlvbiA9IGdldFJlc29sdmVkTGF5b3V0RGlyZWN0aW9uU2VsZigpOwogICAgICAgICAgICAgICAgICAgICBHcmF2aXR5LmFwcGx5KHN0YXRlLm1HcmF2aXR5LCBtQml0bWFwV2lkdGgsIG1CaXRtYXBIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm91bmRzKCksIG1Ec3RSZWN0LCBpc0xheW91dFJ0bFNlbGYoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qm91bmRzKCksIG1Ec3RSZWN0LCBsYXlvdXREaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICBtQXBwbHlHcmF2aXR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGJpdG1hcCwgbnVsbCwgbURzdFJlY3QsIHN0YXRlLm1QYWludCk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvQ2xpcERyYXdhYmxlLmphdmEKaW5kZXggODMwMjBhYS4uMjllZGMwNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0NsaXBEcmF3YWJsZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9DbGlwRHJhd2FibGUuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtMjA5LDcgKzIxMCw4IEBACiAgICAgICAgIGlmICgobUNsaXBTdGF0ZS5tT3JpZW50YXRpb24gJiBWRVJUSUNBTCkgIT0gMCkgewogICAgICAgICAgICAgaCAtPSAoaCAtIGloKSAqICgxMDAwMCAtIGxldmVsKSAvIDEwMDAwOwogICAgICAgICB9Ci0gICAgICAgIEdyYXZpdHkuYXBwbHkobUNsaXBTdGF0ZS5tR3Jhdml0eSwgdywgaCwgYm91bmRzLCByLCBpc0xheW91dFJ0bFNlbGYoKSk7CisgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvblNlbGYoKTsKKyAgICAgICAgR3Jhdml0eS5hcHBseShtQ2xpcFN0YXRlLm1HcmF2aXR5LCB3LCBoLCBib3VuZHMsIHIsIGxheW91dERpcmVjdGlvbik7CiAKICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwKSB7CiAgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvRHJhd2FibGUuamF2YQppbmRleCA4OTk0ZWZjLi43MmQyMzNhMyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL0RyYXdhYmxlLmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3RhdGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTI5MiwxMSArMjkzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2syIGV4dGVuZHMgQ2FsbGJhY2sgewogICAgICAgICAvKioKLSAgICAgICAgICogQSBEcmF3YWJsZSBjYW4gY2FsbCB0aGlzIHRvIGtub3cgd2hldGhlciB0aGUgPHZhcj53aG88L3Zhcj4gaXMgaW4gUlRMIGxheW91dCBkaXJlY3Rpb24uCisgICAgICAgICAqIEEgRHJhd2FibGUgY2FuIGNhbGwgdGhpcyB0byBnZXQgdGhlIHJlc29sdmVkIGxheW91dCBkaXJlY3Rpb24gb2YgdGhlIDx2YXI+d2hvPC92YXI+LgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd2hvIFRoZSBkcmF3YWJsZSBiZWluZyB1bnNjaGVkdWxlZC4KKyAgICAgICAgICogQHBhcmFtIHdobyBUaGUgZHJhd2FibGUgYmVpbmcgcXVlcmllZC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTGF5b3V0UnRsKERyYXdhYmxlIHdobyk7CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oRHJhd2FibGUgd2hvKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3NiwxNSArMzc3LDE1IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVXNlIHRoZSBjdXJyZW50IHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNhbGxiYWNrMn0gaW1wbGVtZW50YXRpb24gdG8ga25vdwotICAgICAqIGlmIHRoaXMgRHJhd2FibGUgaXMgaGF2aW5nIGEgbGF5b3V0IGluIFJUTCBkaXJlY3Rpb24uCisgICAgICogVXNlIHRoZSBjdXJyZW50IHtAbGluayBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLkNhbGxiYWNrMn0gaW1wbGVtZW50YXRpb24gdG8gZ2V0CisgICAgICogdGhlIHJlc29sdmVkIGxheW91dCBkaXJlY3Rpb24gb2YgdGhpcyBEcmF3YWJsZS4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xheW91dFJ0bFNlbGYoKSB7CisgICAgcHVibGljIGludCBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvblNlbGYoKSB7CiAgICAgICAgIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2soKTsKICAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwgfHwgIShjYWxsYmFjayBpbnN0YW5jZW9mIENhbGxiYWNrMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBWaWV3LkxBWU9VVF9ESVJFQ1RJT05fTFRSOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoKENhbGxiYWNrMikgY2FsbGJhY2spLmlzTGF5b3V0UnRsKHRoaXMpOworICAgICAgICByZXR1cm4gKChDYWxsYmFjazIpIGNhbGxiYWNrKS5nZXRSZXNvbHZlZExheW91dERpcmVjdGlvbih0aGlzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvZHJhd2FibGUvU2NhbGVEcmF3YWJsZS5qYXZhCmluZGV4IGNiZTFmMmQuLjVmZDVhMTYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9kcmF3YWJsZS9TY2FsZURyYXdhYmxlLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL2dyYXBoaWNzL2RyYXdhYmxlL1NjYWxlRHJhd2FibGUuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuKjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtMjIxLDcgKzIyMiw4IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgaWggPSBtaW4gPyBtU2NhbGVTdGF0ZS5tRHJhd2FibGUuZ2V0SW50cmluc2ljSGVpZ2h0KCkgOiAwOwogICAgICAgICAgICAgaCAtPSAoaW50KSAoKGggLSBpaCkgKiAoMTAwMDAgLSBsZXZlbCkgKiBtU2NhbGVTdGF0ZS5tU2NhbGVIZWlnaHQgLyAxMDAwMCk7CiAgICAgICAgIH0KLSAgICAgICAgR3Jhdml0eS5hcHBseShtU2NhbGVTdGF0ZS5tR3Jhdml0eSwgdywgaCwgYm91bmRzLCByLCBpc0xheW91dFJ0bFNlbGYoKSk7CisgICAgICAgIGZpbmFsIGludCBsYXlvdXREaXJlY3Rpb24gPSBnZXRSZXNvbHZlZExheW91dERpcmVjdGlvblNlbGYoKTsKKyAgICAgICAgR3Jhdml0eS5hcHBseShtU2NhbGVTdGF0ZS5tR3Jhdml0eSwgdywgaCwgYm91bmRzLCByLCBsYXlvdXREaXJlY3Rpb24pOwogCiAgICAgICAgIGlmICh3ID4gMCAmJiBoID4gMCkgewogICAgICAgICAgICAgbVNjYWxlU3RhdGUubURyYXdhYmxlLnNldEJvdW5kcyhyLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSk7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb24uamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCmluZGV4IGQ0NzdmOGUuLmU5MDA1ODQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbi5qYXZhCkBAIC0xMDAsNyArMTAwLDYgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0FHRV9HUkFQSElDU19DT05TVEFOVFMgPSAweDAwMDg7CiAKICAgICAvKioKLSAgICAgKiBAaGlkZQogICAgICAqIFVTQUdFX0dSQVBISUNTX1JFTkRFUl9UQVJHRVQgVGhlIGFsbGNhdGlvbiB3aWxsIGJlIHVzZWQgYXMgYQogICAgICAqIHRhcmdldCBmb3Igb2Zmc2NyZWVuIHJlbmRlcmluZwogICAgICAqCkBAIC01ODksMTMgKzU4OCwyOSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG9mZiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGNvcGllZC4KICAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBiZSBjb3BpZWQuCi0gICAgICogQHBhcmFtIGQgdGhlIHNvdXJjZSBkYXRhIGFycmF5CisgICAgICogQHBhcmFtIGQgdGhlIHNvdXJjZSBkYXRhIGFycmF5LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvcHkxRFJhbmdlRnJvbShpbnQgb2ZmLCBpbnQgY291bnQsIGZsb2F0W10gZCkgewogICAgICAgICB2YWxpZGF0ZUlzRmxvYXQzMigpOwogICAgICAgICBjb3B5MURSYW5nZUZyb21VbmNoZWNrZWQob2ZmLCBjb3VudCwgZCk7CiAgICAgfQogCisgICAgIC8qKgorICAgICAqIENvcHkgcGFydCBvZiBhbiBhbGxvY2F0aW9uIGZyb20gYW5vdGhlciBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9mZiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGNvcGllZC4KKyAgICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBiZSBjb3BpZWQuCisgICAgICogQHBhcmFtIGRhdGEgdGhlIHNvdXJjZSBkYXRhIGFsbG9jYXRpb24uCisgICAgICogQHBhcmFtIGRhdGFPZmYgb2ZmIFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gZGF0YSB0bworICAgICAqICAgICAgICAgIGJlIGNvcGllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5MURSYW5nZUZyb20oaW50IG9mZiwgaW50IGNvdW50LCBBbGxvY2F0aW9uIGRhdGEsIGludCBkYXRhT2ZmKSB7CisgICAgICAgIG1SUy5uQWxsb2NhdGlvbkRhdGEyRChnZXRJRCgpLCBvZmYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBUeXBlLkN1YmVtYXBGYWNlLlBPU0lUSVZFX1gubUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIDEsIGRhdGEuZ2V0SUQoKSwgZGF0YU9mZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFR5cGUuQ3ViZW1hcEZhY2UuUE9TSVRJVkVfWC5tSUQpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZTJEUmFuZ2UoaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgpIHsKICAgICAgICAgaWYgKHhvZmYgPCAwIHx8IHlvZmYgPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUlNJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUuIik7CkBAIC02MTAsOSArNjI1LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb3B5IGEgcmVjdGFuZ2x1bGFyIHJlZ2lvbiBmcm9tIHRoZSBhcnJheSBpbnRvIHRoZQotICAgICAqIGFsbG9jYXRpb24uICBUaGUgaW5jb21pbmcgYXJyYXkgaXMgYXNzdW1lZCB0byBiZSB0aWdodGx5Ci0gICAgICogcGFja2VkLgorICAgICAqIENvcHkgYSByZWN0YW5ndWxhciByZWdpb24gZnJvbSB0aGUgYXJyYXkgaW50byB0aGUgYWxsb2NhdGlvbi4KKyAgICAgKiBUaGUgaW5jb21pbmcgYXJyYXkgaXMgYXNzdW1lZCB0byBiZSB0aWdodGx5IHBhY2tlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSB4b2ZmIFggb2Zmc2V0IG9mIHRoZSByZWdpb24gdG8gdXBkYXRlCiAgICAgICogQHBhcmFtIHlvZmYgWSBvZmZzZXQgb2YgdGhlIHJlZ2lvbiB0byB1cGRhdGUKQEAgLTY0NSw2ICs2NTksMjggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGludG8gdGhlIGFsbG9jYXRpb24gZnJvbSBhbm90aGVyCisgICAgICogYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4b2ZmIFggb2Zmc2V0IG9mIHRoZSByZWdpb24gdG8gdXBkYXRlLgorICAgICAqIEBwYXJhbSB5b2ZmIFkgb2Zmc2V0IG9mIHRoZSByZWdpb24gdG8gdXBkYXRlLgorICAgICAqIEBwYXJhbSB3IFdpZHRoIG9mIHRoZSBpbmNvbWluZyByZWdpb24gdG8gdXBkYXRlLgorICAgICAqIEBwYXJhbSBoIEhlaWdodCBvZiB0aGUgaW5jb21pbmcgcmVnaW9uIHRvIHVwZGF0ZS4KKyAgICAgKiBAcGFyYW0gZGF0YSBzb3VyY2UgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gZGF0YVhvZmYgWCBvZmZzZXQgaW4gZGF0YSBvZiB0aGUgcmVnaW9uIHRvIHVwZGF0ZS4KKyAgICAgKiBAcGFyYW0gZGF0YVlvZmYgWSBvZmZzZXQgaW4gZGF0YSBvZiB0aGUgcmVnaW9uIHRvIHVwZGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb3B5MkRSYW5nZUZyb20oaW50IHhvZmYsIGludCB5b2ZmLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24gZGF0YSwgaW50IGRhdGFYb2ZmLCBpbnQgZGF0YVlvZmYpIHsKKyAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgIHZhbGlkYXRlMkRSYW5nZSh4b2ZmLCB5b2ZmLCB3LCBoKTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uRGF0YTJEKGdldElEKCksIHhvZmYsIHlvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBUeXBlLkN1YmVtYXBGYWNlLlBPU0lUSVZFX1gubUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgZGF0YS5nZXRJRCgpLCBkYXRhWG9mZiwgZGF0YVlvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBUeXBlLkN1YmVtYXBGYWNlLlBPU0lUSVZFX1gubUlEKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb3B5IGEgYml0bWFwIGludG8gYW4gYWxsb2NhdGlvbi4gIFRoZSBoZWlnaHQgYW5kIHdpZHRoIG9mCiAgICAgICogdGhlIHVwZGF0ZSB3aWxsIHVzZSB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBvZiB0aGUgaW5jb21pbmcKICAgICAgKiBiaXRtYXAuCkBAIC0xMDEyLDE1ICsxMDQ4LDE1IEBACiAgICAgICAgIEFsbG9jYXRpb24gY3ViZW1hcCA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQocnMsIHQsIG1pcHMsIHVzYWdlKTsKIAogICAgICAgICBBbGxvY2F0aW9uQWRhcHRlciBhZGFwdGVyID0gQWxsb2NhdGlvbkFkYXB0ZXIuY3JlYXRlMkQocnMsIGN1YmVtYXApOwotICAgICAgICBhZGFwdGVyLnNldEZhY2UoVHlwZS5DdWJlbWFwRmFjZS5QT1NJVFZFX1gpOworICAgICAgICBhZGFwdGVyLnNldEZhY2UoVHlwZS5DdWJlbWFwRmFjZS5QT1NJVElWRV9YKTsKICAgICAgICAgYWRhcHRlci5jb3B5RnJvbSh4cG9zKTsKICAgICAgICAgYWRhcHRlci5zZXRGYWNlKFR5cGUuQ3ViZW1hcEZhY2UuTkVHQVRJVkVfWCk7CiAgICAgICAgIGFkYXB0ZXIuY29weUZyb20oeG5lZyk7Ci0gICAgICAgIGFkYXB0ZXIuc2V0RmFjZShUeXBlLkN1YmVtYXBGYWNlLlBPU0lUVkVfWSk7CisgICAgICAgIGFkYXB0ZXIuc2V0RmFjZShUeXBlLkN1YmVtYXBGYWNlLlBPU0lUSVZFX1kpOwogICAgICAgICBhZGFwdGVyLmNvcHlGcm9tKHlwb3MpOwogICAgICAgICBhZGFwdGVyLnNldEZhY2UoVHlwZS5DdWJlbWFwRmFjZS5ORUdBVElWRV9ZKTsKICAgICAgICAgYWRhcHRlci5jb3B5RnJvbSh5bmVnKTsKLSAgICAgICAgYWRhcHRlci5zZXRGYWNlKFR5cGUuQ3ViZW1hcEZhY2UuUE9TSVRWRV9aKTsKKyAgICAgICAgYWRhcHRlci5zZXRGYWNlKFR5cGUuQ3ViZW1hcEZhY2UuUE9TSVRJVkVfWik7CiAgICAgICAgIGFkYXB0ZXIuY29weUZyb20oenBvcyk7CiAgICAgICAgIGFkYXB0ZXIuc2V0RmFjZShUeXBlLkN1YmVtYXBGYWNlLk5FR0FUSVZFX1opOwogICAgICAgICBhZGFwdGVyLmNvcHlGcm9tKHpuZWcpOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uQWRhcHRlci5qYXZhIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9BbGxvY2F0aW9uQWRhcHRlci5qYXZhCmluZGV4IGYyZmVkZWEuLjYxZjJlMWYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQWxsb2NhdGlvbkFkYXB0ZXIuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0FsbG9jYXRpb25BZGFwdGVyLmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBwcml2YXRlIEFsbG9jYXRpb24gbUFsbG9jOwogCiAgICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkTE9EID0gMDsKLSAgICBwcml2YXRlIFR5cGUuQ3ViZW1hcEZhY2UgbVNlbGVjdGVkRmFjZSA9IFR5cGUuQ3ViZW1hcEZhY2UuUE9TSVRWRV9YOzsKKyAgICBwcml2YXRlIFR5cGUuQ3ViZW1hcEZhY2UgbVNlbGVjdGVkRmFjZSA9IFR5cGUuQ3ViZW1hcEZhY2UuUE9TSVRJVkVfWDsKIAogICAgIEFsbG9jYXRpb25BZGFwdGVyKGludCBpZCwgUmVuZGVyU2NyaXB0IHJzLCBBbGxvY2F0aW9uIGFsbG9jKSB7CiAgICAgICAgIHN1cGVyKGlkLCBycywgbnVsbCwgYWxsb2MubVVzYWdlKTsKQEAgLTE2MywxNSArMTYzLDU0IEBACiAgICAgICAgIG1SUy5uQWxsb2NhdGlvbkRhdGExRChnZXRJRCgpLCBvZmYsIG1TZWxlY3RlZExPRCwgY291bnQsIGQsIGRhdGFTaXplKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb3B5IHBhcnQgb2YgYW4gYWxsb2NhdGlvbiBmcm9tIGFub3RoZXIgYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgZWxlbWVudCB0byBiZSBjb3BpZWQuCisgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgY29waWVkLgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBzb3VyY2UgZGF0YSBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBkYXRhT2ZmIG9mZiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIGRhdGEgdG8KKyAgICAgKiAgICAgICAgICBiZSBjb3BpZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3ViRGF0YTFEKGludCBvZmYsIGludCBjb3VudCwgQWxsb2NhdGlvbkFkYXB0ZXIgZGF0YSwgaW50IGRhdGFPZmYpIHsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uRGF0YTJEKGdldElEKCksIG9mZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZExPRCwgbVNlbGVjdGVkRmFjZS5tSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgMSwgZGF0YS5nZXRJRCgpLCBkYXRhT2ZmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tU2VsZWN0ZWRMT0QsIGRhdGEubVNlbGVjdGVkRmFjZS5tSUQpOworICAgIH0KKwogCiAgICAgcHVibGljIHZvaWQgc3ViRGF0YTJEKGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IHcsIGludCBoLCBpbnRbXSBkKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkFsbG9jYXRpb25EYXRhMkQoZ2V0SUQoKSwgeG9mZiwgeW9mZiwgbVNlbGVjdGVkTE9ELCBtU2VsZWN0ZWRGYWNlLm1JRCwgdywgaCwgZCwgZC5sZW5ndGggKiA0KTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uRGF0YTJEKGdldElEKCksIHhvZmYsIHlvZmYsIG1TZWxlY3RlZExPRCwgbVNlbGVjdGVkRmFjZS5tSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBkLCBkLmxlbmd0aCAqIDQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEyRChpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwgZmxvYXRbXSBkKSB7CiAgICAgICAgIG1SUy52YWxpZGF0ZSgpOwotICAgICAgICBtUlMubkFsbG9jYXRpb25EYXRhMkQoZ2V0SUQoKSwgeG9mZiwgeW9mZiwgbVNlbGVjdGVkTE9ELCBtU2VsZWN0ZWRGYWNlLm1JRCwgdywgaCwgZCwgZC5sZW5ndGggKiA0KTsKKyAgICAgICAgbVJTLm5BbGxvY2F0aW9uRGF0YTJEKGdldElEKCksIHhvZmYsIHlvZmYsIG1TZWxlY3RlZExPRCwgbVNlbGVjdGVkRmFjZS5tSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBkLCBkLmxlbmd0aCAqIDQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgYSByZWN0YW5ndWxhciByZWdpb24gaW50byB0aGUgYWxsb2NhdGlvbiBmcm9tIGFub3RoZXIKKyAgICAgKiBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHhvZmYgWCBvZmZzZXQgb2YgdGhlIHJlZ2lvbiB0byB1cGRhdGUuCisgICAgICogQHBhcmFtIHlvZmYgWSBvZmZzZXQgb2YgdGhlIHJlZ2lvbiB0byB1cGRhdGUuCisgICAgICogQHBhcmFtIHcgV2lkdGggb2YgdGhlIGluY29taW5nIHJlZ2lvbiB0byB1cGRhdGUuCisgICAgICogQHBhcmFtIGggSGVpZ2h0IG9mIHRoZSBpbmNvbWluZyByZWdpb24gdG8gdXBkYXRlLgorICAgICAqIEBwYXJhbSBkYXRhIHNvdXJjZSBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBkYXRhWG9mZiBYIG9mZnNldCBpbiBkYXRhIG9mIHRoZSByZWdpb24gdG8gdXBkYXRlLgorICAgICAqIEBwYXJhbSBkYXRhWW9mZiBZIG9mZnNldCBpbiBkYXRhIG9mIHRoZSByZWdpb24gdG8gdXBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YkRhdGEyRChpbnQgeG9mZiwgaW50IHlvZmYsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbkFkYXB0ZXIgZGF0YSwgaW50IGRhdGFYb2ZmLCBpbnQgZGF0YVlvZmYpIHsKKyAgICAgICAgbVJTLnZhbGlkYXRlKCk7CisgICAgICAgIG1SUy5uQWxsb2NhdGlvbkRhdGEyRChnZXRJRCgpLCB4b2ZmLCB5b2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkTE9ELCBtU2VsZWN0ZWRGYWNlLm1JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIGRhdGEuZ2V0SUQoKSwgZGF0YVhvZmYsIGRhdGFZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tU2VsZWN0ZWRMT0QsIGRhdGEubVNlbGVjdGVkRmFjZS5tSUQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlYWREYXRhKGludFtdIGQpIHsKQEAgLTE4NSwxMiArMjI0LDE1IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0TE9EKGludCBsb2QpIHsKKyAgICAgICAgbVNlbGVjdGVkTE9EID0gbG9kOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEZhY2UoVHlwZS5DdWJlbWFwRmFjZSBjZikgeworICAgICAgICBtU2VsZWN0ZWRGYWNlID0gY2Y7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0WShpbnQgeSkgeworICAgICAgICBtU2VsZWN0ZWREaW1ZID0geTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRaKGludCB6KSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0Jhc2VPYmouamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCmluZGV4IGExN2U3MzUuLjYzZTdkZDEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvQmFzZU9iai5qYXZhCkBAIC0xMzQsNSArMTM0LDM1IEBACiAgICAgICAgIG1OYW1lID0gbVJTLm5HZXROYW1lKGdldElEKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENhbGN1bGF0ZXMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgYSBCYXNlT2JqLgorICAgICAqCisgICAgICogQHJldHVybiBpbnQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gbUlEOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdGhlIGN1cnJlbnQgQmFzZU9iaiB3aXRoIGFub3RoZXIgQmFzZU9iaiBmb3IgZXF1YWxpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2sgZXF1YWxpdHkgd2l0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIC8vIEVhcmx5LW91dCBjaGVjayB0byBzZWUgaWYgYm90aCBCYXNlT2JqcyBhcmUgYWN0dWFsbHkgdGhlIHNhbWUKKyAgICAgICAgaWYgKHRoaXMgPT0gb2JqKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEJhc2VPYmogYiA9IChCYXNlT2JqKSBvYmo7CisgICAgICAgIHJldHVybiBtSUQgPT0gYi5tSUQ7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0VsZW1lbnQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCmluZGV4IGE5NmVlZGQuLmY4NDQzMzEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRWxlbWVudC5qYXZhCkBAIC0zMiw4ICszMiw4IEBACiAgKiA8cD5Db21wbGV4IGVsZW1lbnRzIGNvbnRhaW4gYSBsaXN0IG9mIHN1Yi1lbGVtZW50cyBhbmQgbmFtZXMgdGhhdAogICogcmVwcmVzZW50cyBhIHN0cnVjdHVyZSBvZiBkYXRhLiBUaGUgZmllbGRzIGNhbiBiZSBhY2Nlc3NlZCBieSBuYW1lCiAgKiBmcm9tIGEgc2NyaXB0IG9yIHNoYWRlci4gVGhlIG1lbW9yeSBsYXlvdXQgaXMgZGVmaW5lZCBhbmQgb3JkZXJlZC4gRGF0YQotICogYWxpZ25tZW50IGlzIGRldGVybWluaWVkIGJ5IHRoZSBtb3N0IGJhc2ljIHByaW1pdGl2ZSB0eXBlLiBpLmUuIGEgZmxvYXQ0Ci0gKiB2ZWN0b3Igd2lsbCBiZSBhbGxpZ25lZCB0byBzaXplb2YoZmxvYXQpIGFuZCBub3Qgc2l6ZW9mKGZsb2F0NCkuICBUaGUKKyAqIGFsaWdubWVudCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBtb3N0IGJhc2ljIHByaW1pdGl2ZSB0eXBlLiBpLmUuIGEgZmxvYXQ0CisgKiB2ZWN0b3Igd2lsbCBiZSBhbGlnbmVkIHRvIHNpemVvZihmbG9hdCkgYW5kIG5vdCBzaXplb2YoZmxvYXQ0KS4gVGhlCiAgKiBvcmRlcmluZyBvZiBlbGVtZW50cyBpbiBtZW1vcnkgd2lsbCBiZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkCiAgKiB3aXRoIGVhY2ggY29tcG9uZW50IGFsaWduZWQgYXMgbmVjZXNzYXJ5LiBObyByZS1vcmRlcmluZyB3aWxsIGJlIGRvbmUuPC9wPgogICoKQEAgLTc2Niw2ICs3NjYsMzMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgY3VycmVudCBFbGVtZW50IGlzIGNvbXBhdGlibGUgd2l0aCBhbm90aGVyIEVsZW1lbnQuCisgICAgICogUHJpbWl0aXZlIEVsZW1lbnRzIGFyZSBjb21wYXRpYmxlIGlmIHRoZXkgc2hhcmUgdGhlIHNhbWUgdW5kZXJseWluZworICAgICAqIHNpemUgYW5kIHR5cGUgKGkuZS4gVTggaXMgY29tcGF0aWJsZSB3aXRoIEFfOCkuIFVzZXItZGVmaW5lZCBFbGVtZW50cworICAgICAqIG11c3QgYmUgZXF1YWwgaW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZS4gVGhpcyByZXF1aXJlcyBzdHJpY3QgbmFtZQorICAgICAqIGVxdWl2YWxlbmNlIGZvciBhbGwgc3ViLUVsZW1lbnRzIChpbiBhZGRpdGlvbiB0byBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIFRoZSBFbGVtZW50IHRvIGNoZWNrIGNvbXBhdGliaWxpdHkgd2l0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBFbGVtZW50cyBhcmUgY29tcGF0aWJsZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShFbGVtZW50IGUpIHsKKyAgICAgICAgLy8gVHJ5IHN0cmljdCBCYXNlT2JqIGVxdWFsaXR5IHRvIHN0YXJ0IHdpdGguCisgICAgICAgIGlmICh0aGlzLmVxdWFscyhlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZ25vcmUgbUtpbmQgYmVjYXVzZSBpdCBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCAodXNlciB2cy4gcGl4ZWwpLgorICAgICAgICAvLyBXZSBhbHNvIGlnbm9yZSBtTm9ybWFsaXplZCBiZWNhdXNlIGl0IGNhbiBiZSBkaWZmZXJlbnQuIFRoZSBtVHlwZQorICAgICAgICAvLyBmaWVsZCBtdXN0IGJlIG5vbi1udWxsIHNpbmNlIHdlIHJlcXVpcmUgbmFtZSBlcXVpdmFsZW5jZSBmb3IKKyAgICAgICAgLy8gdXNlci1jcmVhdGVkIEVsZW1lbnRzLgorICAgICAgICByZXR1cm4gKChtU2l6ZSA9PSBlLm1TaXplKSAmJgorICAgICAgICAgICAgICAgIChtVHlwZSAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgIChtVHlwZSA9PSBlLm1UeXBlKSAmJgorICAgICAgICAgICAgICAgIChtVmVjdG9yU2l6ZSA9PSBlLm1WZWN0b3JTaXplKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQnVpbGRlciBjbGFzcyBmb3IgcHJvZHVjaW5nIGNvbXBsZXggZWxlbWVudHMgd2l0aCBtYXRjaGluZyBmaWVsZCBhbmQgbmFtZQogICAgICAqIHBhaXJzLiAgVGhlIGJ1aWxkZXIgc3RhcnRzIGVtcHR5LiAgVGhlIG9yZGVyIGluIHdoaWNoIGVsZW1lbnRzIGFyZSBhZGRlZAogICAgICAqIGlzIHJldGFpbmVkIGZvciB0aGUgbGF5b3V0IGluIG1lbW9yeS4KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvRmllbGRQYWNrZXIuamF2YQppbmRleCBiZGRhODMwLi5mYWM3MTQ0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L0ZpZWxkUGFja2VyLmphdmEKKysrIGIvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9GaWVsZFBhY2tlci5qYXZhCkBAIC0yNSwxMCArMjUsMTUgQEAKIHB1YmxpYyBjbGFzcyBGaWVsZFBhY2tlciB7CiAgICAgcHVibGljIEZpZWxkUGFja2VyKGludCBsZW4pIHsKICAgICAgICAgbVBvcyA9IDA7CisgICAgICAgIG1MZW4gPSBsZW47CiAgICAgICAgIG1EYXRhID0gbmV3IGJ5dGVbbGVuXTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhbGlnbihpbnQgdikgeworICAgICAgICBpZiAoKHYgPD0gMCkgfHwgKCh2ICYgKHYgLSAxKSkgIT0gMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSU0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBub24temVybyBwb3dlciBvZiAyOiAiICsgdik7CisgICAgICAgIH0KKwogICAgICAgICB3aGlsZSAoKG1Qb3MgJiAodiAtIDEpKSAhPSAwKSB7CiAgICAgICAgICAgICBtRGF0YVttUG9zKytdID0gMDsKICAgICAgICAgfQpAQCAtMzgsMTEgKzQzLDE4IEBACiAgICAgICAgIG1Qb3MgPSAwOwogICAgIH0KICAgICBwdWJsaWMgdm9pZCByZXNldChpbnQgaSkgeworICAgICAgICBpZiAoKGkgPCAwKSB8fCAoaSA+PSBtTGVuKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJTSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvdXQgb2YgcmFuZ2UgYXJndW1lbnQ6ICIgKyBpKTsKKyAgICAgICAgfQogICAgICAgICBtUG9zID0gaTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBza2lwKGludCBpKSB7Ci0gICAgICAgIG1Qb3MgKz0gaTsKKyAgICAgICAgaW50IHJlcyA9IG1Qb3MgKyBpOworICAgICAgICBpZiAoKHJlcyA8IDApIHx8IChyZXMgPiBtTGVuKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJTSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvdXQgb2YgcmFuZ2UgYXJndW1lbnQ6ICIgKyBpKTsKKyAgICAgICAgfQorICAgICAgICBtUG9zID0gcmVzOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEk4KGJ5dGUgdikgewpAQCAtMjc3LDYgKzI4OSw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGFbXTsKICAgICBwcml2YXRlIGludCBtUG9zOworICAgIHByaXZhdGUgaW50IG1MZW47CiAKIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvUmVuZGVyU2NyaXB0LmphdmEKaW5kZXggMGQ5NjA3YS4uOTk0MTgyNyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvamF2YS9hbmRyb2lkL3JlbmRlcnNjcmlwdC9SZW5kZXJTY3JpcHQuamF2YQorKysgYi9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1JlbmRlclNjcmlwdC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCkBAIC0yOTQsNiArMjk1LDI2IEBACiAgICAgICAgIHJzbkFsbG9jYXRpb25FbGVtZW50RGF0YTFEKG1Db250ZXh0LCBpZCwgeG9mZiwgbWlwLCBjb21wSWR4LCBkLCBzaXplQnl0ZXMpOwogICAgIH0KIAorICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25EYXRhMkQoaW50IGNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RBbGxvYywgaW50IGRzdFhvZmYsIGludCBkc3RZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdE1pcCwgaW50IGRzdEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjQWxsb2MsIGludCBzcmNYb2ZmLCBpbnQgc3JjWW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNNaXAsIGludCBzcmNGYWNlKTsKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvbkRhdGEyRChpbnQgZHN0QWxsb2MsIGludCBkc3RYb2ZmLCBpbnQgZHN0WW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0TWlwLCBpbnQgZHN0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY0FsbG9jLCBpbnQgc3JjWG9mZiwgaW50IHNyY1lvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY01pcCwgaW50IHNyY0ZhY2UpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgcnNuQWxsb2NhdGlvbkRhdGEyRChtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RBbGxvYywgZHN0WG9mZiwgZHN0WW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNaXAsIGRzdEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNBbGxvYywgc3JjWG9mZiwgc3JjWW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNNaXAsIHNyY0ZhY2UpOworICAgIH0KKwogICAgIG5hdGl2ZSB2b2lkIHJzbkFsbG9jYXRpb25EYXRhMkQoaW50IGNvbiwgaW50IGlkLCBpbnQgeG9mZiwgaW50IHlvZmYsIGludCBtaXAsIGludCBmYWNlLCBpbnQgdywgaW50IGgsIGJ5dGVbXSBkLCBpbnQgc2l6ZUJ5dGVzKTsKICAgICBzeW5jaHJvbml6ZWQgdm9pZCBuQWxsb2NhdGlvbkRhdGEyRChpbnQgaWQsIGludCB4b2ZmLCBpbnQgeW9mZiwgaW50IG1pcCwgaW50IGZhY2UsIGludCB3LCBpbnQgaCwgYnl0ZVtdIGQsIGludCBzaXplQnl0ZXMpIHsKICAgICAgICAgdmFsaWRhdGUoKTsKQEAgLTcxOCw5ICs3MzksOCBAQAogICAgICAqIHByb2Nlc3Nlcy4KICAgICAgKi8KICAgICBwdWJsaWMgZW51bSBQcmlvcml0eSB7Ci0gICAgICAgIC8vIFJlbWFwIHRoZXNlIG51bWJlcnMgdG8gb3BhcXVlLi4uCi0gICAgICAgIExPVyAoNSksICAgICAvL0FORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCArIDUKLSAgICAgICAgTk9STUFMICgtNCk7ICAvL0FORFJPSURfUFJJT1JJVFlfRElTUExBWQorICAgICAgICBMT1cgKFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0JBQ0tHUk9VTkQgKyAoNSAqIFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0xFU1NfRkFWT1JBQkxFKSksCisgICAgICAgIE5PUk1BTCAoUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfRElTUExBWSk7CiAKICAgICAgICAgaW50IG1JRDsKICAgICAgICAgUHJpb3JpdHkoaW50IGlkKSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvcmVuZGVyc2NyaXB0L1R5cGUuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhCmluZGV4IGIzOWQyZTQuLmY4OGFmOGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9yZW5kZXJzY3JpcHQvVHlwZS5qYXZhCkBAIC00NiwxMiArNDYsMTggQEAKICAgICBFbGVtZW50IG1FbGVtZW50OwogCiAgICAgcHVibGljIGVudW0gQ3ViZW1hcEZhY2UgewotICAgICAgICBQT1NJVFZFX1ggKDApLAorICAgICAgICBQT1NJVElWRV9YICgwKSwKICAgICAgICAgTkVHQVRJVkVfWCAoMSksCi0gICAgICAgIFBPU0lUVkVfWSAoMiksCisgICAgICAgIFBPU0lUSVZFX1kgKDIpLAogICAgICAgICBORUdBVElWRV9ZICgzKSwKLSAgICAgICAgUE9TSVRWRV9aICg0KSwKLSAgICAgICAgTkVHQVRJVkVfWiAoNSk7CisgICAgICAgIFBPU0lUSVZFX1ogKDQpLAorICAgICAgICBORUdBVElWRV9aICg1KSwKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgUE9TSVRWRV9YICgwKSwKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgUE9TSVRWRV9ZICgyKSwKKyAgICAgICAgQERlcHJlY2F0ZWQKKyAgICAgICAgUE9TSVRWRV9aICg0KTsKIAogICAgICAgICBpbnQgbUlEOwogICAgICAgICBDdWJlbWFwRmFjZShpbnQgaWQpIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2puaS9hbmRyb2lkX3JlbmRlcnNjcmlwdF9SZW5kZXJTY3JpcHQuY3BwIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKaW5kZXggNjBiMzliMC4uN2U1M2NjNCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKKysrIGIvZ3JhcGhpY3Mvam5pL2FuZHJvaWRfcmVuZGVyc2NyaXB0X1JlbmRlclNjcmlwdC5jcHAKQEAgLTQ2OCw3ICs0NjgsNyBAQAogICAgIGJpdG1hcC5sb2NrUGl4ZWxzKCk7CiAgICAgY29uc3Qgdm9pZCogcHRyID0gYml0bWFwLmdldFBpeGVscygpOwogICAgIHJzQWxsb2NhdGlvbjJERGF0YShjb24sIChSc0FsbG9jYXRpb24pYWxsb2MsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIFJTX0FMTE9DQVRJT05fQ1VCTUFQX0ZBQ0VfUE9TSVRWRV9YLAorICAgICAgICAgICAgICAgICAgICAgICAwLCBSU19BTExPQ0FUSU9OX0NVQkVNQVBfRkFDRV9QT1NJVElWRV9YLAogICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBwdHIsIGJpdG1hcC5nZXRTaXplKCkpOwogICAgIGJpdG1hcC51bmxvY2tQaXhlbHMoKTsKIH0KQEAgLTU4OSw2ICs1ODksMzAgQEAKIH0KIAogc3RhdGljIHZvaWQKK25BbGxvY2F0aW9uRGF0YTJEX2FsbG9jKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgZHN0QWxsb2MsIGppbnQgZHN0WG9mZiwgamludCBkc3RZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgamludCBkc3RNaXAsIGppbnQgZHN0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgamludCBzcmNBbGxvYywgamludCBzcmNYb2ZmLCBqaW50IHNyY1lvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICBqaW50IHNyY01pcCwgamludCBzcmNGYWNlKQoreworICAgIExPR19BUEkoIm5BbGxvY2F0aW9uMkREYXRhX3MsIGNvbiglcCksIGRzdEFsbG9jKCVwKSwgZHN0WG9mZiwgZHN0WW9mZiwiCisgICAgICAgICAgICAiIGRzdE1pcCglaSksIGRzdEZhY2UoJWkpLCB3aWR0aCglaSksIGhlaWdodCglaSksIgorICAgICAgICAgICAgIiBzcmNBbGxvYyglcCksIHNyY1hvZmYoJWkpLCBzcmNZb2ZmKCVpKSwgc3JjTWlwKCVpKSwgc3JjRmFjZSglaSkiLAorICAgICAgICAgICAgY29uLCAoUnNBbGxvY2F0aW9uKWRzdEFsbG9jLCBkc3RYb2ZmLCBkc3RZb2ZmLCBkc3RNaXAsIGRzdEZhY2UsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCAoUnNBbGxvY2F0aW9uKXNyY0FsbG9jLCBzcmNYb2ZmLCBzcmNZb2ZmLCBzcmNNaXAsIHNyY0ZhY2UpOworCisgICAgcnNBbGxvY2F0aW9uQ29weTJEUmFuZ2UoY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSc0FsbG9jYXRpb24pZHN0QWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WG9mZiwgZHN0WW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNaXAsIGRzdEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUnNBbGxvY2F0aW9uKXNyY0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1hvZmYsIHNyY1lvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjTWlwLCBzcmNGYWNlKTsKK30KKworc3RhdGljIHZvaWQKIG5BbGxvY2F0aW9uUmVhZF9pKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgUnNDb250ZXh0IGNvbiwgamludCBhbGxvYywgamludEFycmF5IGRhdGEpCiB7CiAgICAgamludCBsZW4gPSBfZW52LT5HZXRBcnJheUxlbmd0aChkYXRhKTsKQEAgLTEyMTcsNiArMTI0MSw3IEBACiB7InJzbkFsbG9jYXRpb25EYXRhMkQiLCAgICAgICAgICAgICAgIihJSUlJSUlJSVtTSSlWIiwgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25EYXRhMkRfcyB9LAogeyJyc25BbGxvY2F0aW9uRGF0YTJEIiwgICAgICAgICAgICAgICIoSUlJSUlJSUlbQkkpViIsICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uRGF0YTJEX2IgfSwKIHsicnNuQWxsb2NhdGlvbkRhdGEyRCIsICAgICAgICAgICAgICAiKElJSUlJSUlJW0ZJKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvbkRhdGEyRF9mIH0sCit7InJzbkFsbG9jYXRpb25EYXRhMkQiLCAgICAgICAgICAgICAgIihJSUlJSUlJSUlJSUlJKVYiLCAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25EYXRhMkRfYWxsb2MgfSwKIHsicnNuQWxsb2NhdGlvblJlYWQiLCAgICAgICAgICAgICAgICAiKElJW0kpViIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiluQWxsb2NhdGlvblJlYWRfaSB9LAogeyJyc25BbGxvY2F0aW9uUmVhZCIsICAgICAgICAgICAgICAgICIoSUlbUylWIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW5BbGxvY2F0aW9uUmVhZF9zIH0sCiB7InJzbkFsbG9jYXRpb25SZWFkIiwgICAgICAgICAgICAgICAgIihJSVtCKVYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopbkFsbG9jYXRpb25SZWFkX2IgfSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfZ3JhcGhpY3NfUGFyY2VsU3VyZmFjZVRleHR1cmUuaCBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfZ3JhcGhpY3NfUGFyY2VsU3VyZmFjZVRleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTRhYzliCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9ncmFwaGljc19QYXJjZWxTdXJmYWNlVGV4dHVyZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTkRST0lEX0dSQVBISUNTX1BBUkNFTFNVUkZBQ0VURVhUVVJFX0gKKyNkZWZpbmUgX0FORFJPSURfR1JBUEhJQ1NfUEFSQ0VMU1VSRkFDRVRFWFRVUkVfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJU3VyZmFjZVRleHR1cmU7CisKK2V4dGVybiBzcDxBTmF0aXZlV2luZG93PiBhbmRyb2lkX1BhcmNlbFN1cmZhY2VUZXh0dXJlX2dldE5hdGl2ZVdpbmRvdygKKyAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeik7CitleHRlcm4gYm9vbCBhbmRyb2lkX1BhcmNlbFN1cmZhY2VUZXh0dXJlX2lzSW5zdGFuY2VPZihKTklFbnYqIGVudiwgam9iamVjdCB0aGl6KTsKKworLyogR2V0cyB0aGUgdW5kZXJseWluZyBJU3VyZmFjZVRleHR1cmUgZnJvbSBhIFBhcmNlbFN1cmZhY2VUZXh0dXJlIEphdmEgb2JqZWN0LiAqLworZXh0ZXJuIHNwPElTdXJmYWNlVGV4dHVyZT4gUGFyY2VsU3VyZmFjZVRleHR1cmVfZ2V0SVN1cmZhY2VUZXh0dXJlKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfQU5EUk9JRF9HUkFQSElDU19QQVJDRUxTVVJGQUNFVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1N1cmZhY2VUZXh0dXJlLmggYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1N1cmZhY2VUZXh0dXJlLmgKaW5kZXggOGU2ZmM2ZWUuLmJhZGYyMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfZ3JhcGhpY3NfU3VyZmFjZVRleHR1cmUuaAorKysgYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1N1cmZhY2VUZXh0dXJlLmgKQEAgLTIzLDggKzIzLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3VyZmFjZVRleHR1cmU7CisKIGV4dGVybiBzcDxBTmF0aXZlV2luZG93PiBhbmRyb2lkX1N1cmZhY2VUZXh0dXJlX2dldE5hdGl2ZVdpbmRvdygKICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeik7CitleHRlcm4gYm9vbCBhbmRyb2lkX1N1cmZhY2VUZXh0dXJlX2lzSW5zdGFuY2VPZihKTklFbnYqIGVudiwgam9iamVjdCB0aGl6KTsKKworLyogR2V0cyB0aGUgdW5kZXJseWluZyBTdXJmYWNlVGV4dHVyZSBmcm9tIGEgU3VyZmFjZVRleHR1cmUgSmF2YSBvYmplY3QuICovCitleHRlcm4gc3A8U3VyZmFjZVRleHR1cmU+IFN1cmZhY2VUZXh0dXJlX2dldFN1cmZhY2VUZXh0dXJlKEpOSUVudiogZW52LCBqb2JqZWN0IHRoaXopOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmggYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oCmluZGV4IGMzNzkzMmUuLjMxN2YxZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfdmlld19TdXJmYWNlLmgKKysrIGIvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaApAQCAtMjUsNiArMjUsNyBAQAogCiBleHRlcm4gc3A8QU5hdGl2ZVdpbmRvdz4gYW5kcm9pZF9TdXJmYWNlX2dldE5hdGl2ZVdpbmRvdygKICAgICAgICAgSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenopOworZXh0ZXJuIGJvb2wgYW5kcm9pZF9TdXJmYWNlX2lzSW5zdGFuY2VPZihKTklFbnYqIGVudiwgam9iamVjdCBvYmopOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAppbmRleCBkYzVmYzg0Li44M2Q0ZjZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKKysrIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAvLyBkaXJlY3Rpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSByb3RhdGlvbiBvciBtaXJyb3Jpbmcgb2YKICAgICAvLyBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OLiBDb29yZGluYXRlcyByYW5nZSBmcm9tIC0xMDAwIHRvIDEwMDAuCiAgICAgLy8gKC0xMDAwLC0xMDAwKSBpcyB0aGUgdXBwZXIgbGVmdCBwb2ludC4gKDEwMDAsIDEwMDApIGlzIHRoZSBsb3dlciByaWdodAotICAgIC8vIHBvaW50LiBUaGUgbGVuZ3RoIGFuZCB3aWR0aCBvZiBmb2N1cyBhcmVhcyBjYW5ub3QgYmUgMCBvciBuZWdhdGl2ZS4KKyAgICAvLyBwb2ludC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgZm9jdXMgYXJlYXMgY2Fubm90IGJlIDAgb3IgbmVnYXRpdmUuCiAgICAgLy8KICAgICAvLyBUaGUgZmlmdGggZWxlbWVudCBpcyB0aGUgd2VpZ2h0LiBWYWx1ZXMgZm9yIHdlaWdodCBtdXN0IHJhbmdlIGZyb20gMSB0bwogICAgIC8vIDEwMDAuICBUaGUgd2VpZ2h0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHBlci1waXhlbCB3ZWlnaHQgLSBhbGwKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgIC8vIGRpcmVjdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHJvdGF0aW9uIG9yIG1pcnJvcmluZyBvZgogICAgIC8vIENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04uIENvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUgcmFuZ2UKICAgICAvLyBmcm9tIC0xMDAwIHRvIDEwMDAuICgtMTAwMCwgLTEwMDApIGlzIHRoZSB1cHBlciBsZWZ0IHBvaW50LiAoMTAwMCwgMTAwMCkKLSAgICAvLyBpcyB0aGUgbG93ZXIgcmlnaHQgcG9pbnQuIFRoZSBsZW5ndGggYW5kIHdpZHRoIG9mIG1ldGVyaW5nIGFyZWFzIGNhbm5vdAorICAgIC8vIGlzIHRoZSBsb3dlciByaWdodCBwb2ludC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgbWV0ZXJpbmcgYXJlYXMgY2Fubm90CiAgICAgLy8gYmUgMCBvciBuZWdhdGl2ZS4KICAgICAvLwogICAgIC8vIFRoZSBmaWZ0aCBlbGVtZW50IGlzIHRoZSB3ZWlnaHQuIFZhbHVlcyBmb3Igd2VpZ2h0IG11c3QgcmFuZ2UgZnJvbSAxIHRvCkBAIC01NTAsNiArNTUwLDcgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfWVVWNDIySVtdOyAvLyBZVVkyCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMFBbXTsgLy8gWVYxMgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9SR0I1NjVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfUkdCQTg4ODhbXTsKICAgICBzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfSlBFR1tdOwogCiAgICAgLy8gVmFsdWVzIGZvciBmb2N1cyBtb2RlIHNldHRpbmdzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmUuaCBiL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlLmgKaW5kZXggMmIzMTQ2Mi4uOTI5NGRmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmUuaAorKysgYi9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZS5oCkBAIC0xODgsNiArMTg4LDExIEBACiAKICAgICBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudFNlcnZlckxvY2tlZChpbnQgYnVmZmVyQ291bnQpOwogCisgICAgLy8gY29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXggY29tcHV0ZXMgdGhlIHRyYW5zZm9ybSBtYXRyaXggZm9yIHRoZQorICAgIC8vIGN1cnJlbnQgdGV4dHVyZS4gIEl0IHVzZXMgbUN1cnJlbnRUcmFuc2Zvcm0gYW5kIHRoZSBjdXJyZW50IEdyYXBoaWNCdWZmZXIKKyAgICAvLyB0byBjb21wdXRlIHRoaXMgbWF0cml4IGFuZCBzdG9yZXMgaXQgaW4gbUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXguCisgICAgdm9pZCBjb21wdXRlQ3VycmVudFRyYW5zZm9ybU1hdHJpeCgpOworCiAgICAgZW51bSB7IElOVkFMSURfQlVGRkVSX1NMT1QgPSAtMSB9OwogCiAgICAgc3RydWN0IEJ1ZmZlclNsb3QgewpAQCAtMjg4LDkgKzI5Myw5IEBACiAgICAgLy8gYnkgY2FsbGluZyBzZXRCdWZmZXJDb3VudCBvciBzZXRCdWZmZXJDb3VudFNlcnZlcgogICAgIGludCBtQnVmZmVyQ291bnQ7CiAKLSAgICAvLyBtUmVxdWVzdGVkQnVmZmVyQ291bnQgaXMgdGhlIG51bWJlciBvZiBidWZmZXIgc2xvdHMgcmVxdWVzdGVkIGJ5IHRoZQotICAgIC8vIGNsaWVudC4gVGhlIGRlZmF1bHQgaXMgemVybywgd2hpY2ggbWVhbnMgdGhlIGNsaWVudCBkb2Vzbid0IGNhcmUgaG93Ci0gICAgLy8gbWFueSBidWZmZXJzIHRoZXJlIGlzLgorICAgIC8vIG1DbGllbnRCdWZmZXJDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlciBzbG90cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KKyAgICAvLyBUaGUgZGVmYXVsdCBpcyB6ZXJvLCB3aGljaCBtZWFucyB0aGUgY2xpZW50IGRvZXNuJ3QgY2FyZSBob3cgbWFueSBidWZmZXJzCisgICAgLy8gdGhlcmUgaXMuCiAgICAgaW50IG1DbGllbnRCdWZmZXJDb3VudDsKIAogICAgIC8vIG1TZXJ2ZXJCdWZmZXJDb3VudCBidWZmZXIgY291bnQgcmVxdWVzdGVkIGJ5IHRoZSBzZXJ2ZXItc2lkZQpAQCAtMzIyLDYgKzMyNywxMSBAQAogICAgIC8vIGdldHMgc2V0IHRvIG1MYXN0UXVldWVkVHJhbnNmb3JtIGVhY2ggdGltZSB1cGRhdGVUZXhJbWFnZSBpcyBjYWxsZWQuCiAgICAgdWludDMyX3QgbUN1cnJlbnRUcmFuc2Zvcm07CiAKKyAgICAvLyBtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCBpcyB0aGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZS4KKyAgICAvLyBJdCBnZXRzIGNvbXB1dGVkIGJ5IGNvbXB1dGVUcmFuc2Zvcm1NYXRyaXggZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzCisgICAgLy8gY2FsbGVkLgorICAgIGZsb2F0IG1DdXJyZW50VHJhbnNmb3JtTWF0cml4WzE2XTsKKwogICAgIC8vIG1DdXJyZW50VGltZXN0YW1wIGlzIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBjdXJyZW50IHRleHR1cmUuIEl0CiAgICAgLy8gZ2V0cyBzZXQgdG8gbUxhc3RRdWV1ZWRUaW1lc3RhbXAgZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4KICAgICBpbnQ2NF90IG1DdXJyZW50VGltZXN0YW1wOwpAQCAtMzYyLDYgKzM3Miw3IEBACiAgICAgLy8gdmFyaWFibGVzIG9mIFN1cmZhY2VUZXh0dXJlIG9iamVjdHMuIEl0IG11c3QgYmUgbG9ja2VkIHdoZW5ldmVyIHRoZQogICAgIC8vIG1lbWJlciB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkLgogICAgIG11dGFibGUgTXV0ZXggbU11dGV4OworCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKaW5kZXggYmFhYjJlOC4uNjA1NjgwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6LgogICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsczogICAgICAgICAgIENoYW5uZWwgbWFzazogc2VlIGF1ZGlvX2NoYW5uZWxzX3QuCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2s6IHNlZSBhdWRpb19jaGFubmVsc190LgogICAgICAqIGZyYW1lQ291bnQ6ICAgICAgICAgVG90YWwgc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSBvZiB0aGUgdHJhY2suCiAgICAgICogZmxhZ3M6ICAgICAgICAgICAgICBBIGJpdG1hc2sgb2YgYWNvdXN0aWMgdmFsdWVzIGZyb20gZW51bSByZWNvcmRfZmxhZ3MuICBJdCBlbmFibGVzCkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkKGludCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGludCBpbnB1dFNvdXJjZSAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9NT05PLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50ICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKQEAgLTM0OCw4ICszNDgsOCBAQAogCiAgICAgICAgICAgICBib29sIHByb2Nlc3NBdWRpb0J1ZmZlcihjb25zdCBzcDxDbGllbnRSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgb3BlblJlY29yZF9sKHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwpAQCAtMzY0LDEwICszNjQsMTAgQEAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKIAogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1JbnB1dFNvdXJjZTsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtUmVzZXJ2ZWQ7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbVJlc2VydmVkWzJdOwogICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7CiAKQEAgLTM4Miw3ICszODIsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVXBkYXRlUGVyaW9kOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCA2OGNkMTg4Li44OTIxM2I3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCiAvKiBYWFg6IFNob3VsZCBiZSBpbmNsdWRlIGJ5IGFsbCB0aGUgdXNlcnMgaW5zdGVhZCAqLwogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IGRlOTI4ZGEuLmRmMzBlOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC02OSw4ICs2OSw4IEBACiAgICAgICAgICAgICBNVVRFICAgID0gMHgwMDAwMDAwMQogICAgICAgICB9OwogICAgICAgICB1aW50MzJfdCAgICBmbGFnczsKLSAgICAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50OwogICAgICAgICBpbnQgICAgICAgICBmb3JtYXQ7CisgICAgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudDsgLy8gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsIGRvIG5vdCB1c2UKICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudDsKICAgICAgICAgc2l6ZV90ICAgICAgc2l6ZTsKICAgICAgICAgdW5pb24gewpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgICogc2FtcGxlUmF0ZTogICAgICAgICBUcmFjayBzYW1wbGluZyByYXRlIGluIEh6LgogICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KLSAgICAgKiBjaGFubmVsczogICAgICAgICAgIENoYW5uZWwgbWFzazogc2VlIGF1ZGlvX2NoYW5uZWxzX3QuCisgICAgICogY2hhbm5lbE1hc2s6ICAgICAgICBDaGFubmVsIG1hc2s6IHNlZSBhdWRpb19jaGFubmVsc190LgogICAgICAqIGZyYW1lQ291bnQ6ICAgICAgICAgVG90YWwgc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSBvZiB0aGUgdHJhY2suCiAgICAgICogZmxhZ3M6ICAgICAgICAgICAgICBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayggaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ICAgICAgICAgICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2sgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgICA9IDAsCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscyAgICAgICAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IDAsCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChpbnQgc3RyZWFtVHlwZSAgICAgID0tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgICAgICAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2sgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gMCwKQEAgLTQzOCw4ICs0MzgsOCBAQAogICAgICAgICAgICAgYm9vbCBwcm9jZXNzQXVkaW9CdWZmZXIoY29uc3Qgc3A8QXVkaW9UcmFja1RocmVhZD4mIHRocmVhZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVUcmFja19sKGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTQ1OSwxMSArNDU5LDEyIEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7CiAKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtRm9ybWF0OwogICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgdWludDhfdCAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICB1aW50OF90ICAgICAgICAgICAgICAgICBtTXV0ZWQ7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxzOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgIG1SZXNlcnZlZDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTGF0ZW5jeTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCBkOGZkYzI3Li40MDM3YzQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtNDgsOCArNDgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC02MSw4ICs2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLApAQCAtNzMsNyArNzMsNyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoaW50IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGNoYW5uZWxDb3VudChpbnQgb3V0cHV0KSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGZyYW1lQ291bnQoaW50IG91dHB1dCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGxhdGVuY3koaW50IG91dHB1dCkgY29uc3QgPSAwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IDA5YjJiZmUuLjBmYzhkYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCBmMDQwMWNjYS4uMThlOGE1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMTY4LDYgKzE2OCwxMCBAQAogICAgICAgICBpZiAobU5vdGlmeSkgbU5vdGlmeShtQ29va2llLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAppbmRleCA1MGEzNzhmLi5lYTVhOWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCkBAIC0xMDAsNiArMTAwLDkgQEAKICAgICBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCA9IDcwMSwKICAgICAvLyBNZWRpYVBsYXllciBpcyByZXN1bWluZyBwbGF5YmFjayBhZnRlciBmaWxsaW5nIGJ1ZmZlcnMuCiAgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EID0gNzAyLAorICAgIC8vIEJhbmR3aWR0aCBpbiByZWNlbnQgcGFzdAorICAgIE1FRElBX0lORk9fTkVUV09SS19CQU5EV0lEVEggPSA3MDMsCisKICAgICAvLyA4eHgKICAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAogICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCkBAIC0xMjgsNiArMTMxLDkgQEAKIGVudW0gbWVkaWFfc2V0X3BhcmFtZXRlcl9rZXlzIHsKICAgICBLRVlfUEFSQU1FVEVSX1RJTUVEX1RFWFRfVFJBQ0tfSU5ERVggPSAxMDAwLAogICAgIEtFWV9QQVJBTUVURVJfVElNRURfVEVYVF9BRERfT1VUX09GX0JBTkRfU09VUkNFID0gMTAwMSwKKworICAgIC8vIFN0cmVhbWluZy9idWZmZXJpbmcgcGFyYW1ldGVycworICAgIEtFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMgPSAxMTAwLAogfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIHJlZi1jb3VudGVkIG9iamVjdCBmb3IgY2FsbGJhY2tzCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCmluZGV4IDZiNmZjZGYuLjQ4ZDE0NjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgICAgIGtXYW50c1ByZWZldGNoaW5nICAgICAgPSAxLAogICAgICAgICBrU3RyZWFtZWRGcm9tTG9jYWxIb3N0ID0gMiwKICAgICAgICAga0lzQ2FjaGluZ0RhdGFTb3VyY2UgICA9IDQsCisgICAgICAgIGtJc0hUVFBCYXNlZFNvdXJjZSAgICAgPSA4LAogICAgIH07CiAKICAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbVVSSSgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCA0MDQ0YzVkLi5kZWFkZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC01NSw2ICs1NSw3IEBACiAgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKICAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKICAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKICAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaAppbmRleCA3MGRhYWZhLi41ODljZWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCkBAIC0yMDIsNiArMjAyLDEwIEBACiAgICAgYm9vbCBtT25seVN1Ym1pdE9uZUJ1ZmZlckF0T25lVGltZTsKICAgICBib29sIG1FbmFibGVHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQ7CiAKKyAgICAvLyBVc2VkIHRvIHJlY29yZCB0aGUgZGVjb2RpbmcgdGltZSBmb3IgYW4gb3V0cHV0IHBpY3R1cmUgZnJvbQorICAgIC8vIGEgdmlkZW8gZW5jb2Rlci4KKyAgICBMaXN0PGludDY0X3Q+IG1EZWNvZGluZ1RpbWVMaXN0OworCiAgICAgT01YQ29kZWMoY29uc3Qgc3A8SU9NWD4gJm9teCwgSU9NWDo6bm9kZV9pZCBub2RlLCB1aW50MzJfdCBxdWlya3MsCiAgICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIsIGNvbnN0IGNoYXIgKm1pbWUsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCkBAIC0zMTcsNiArMzIxLDggQEAKIAogICAgIHN0YXR1c190IGFwcGx5Um90YXRpb24oKTsKIAorICAgIGludDY0X3QgcmV0cmlldmVEZWNvZGluZ1RpbWVVcyhib29sIGlzQ29kZWNTcGVjaWZpYyk7CisKICAgICBPTVhDb2RlYyhjb25zdCBPTVhDb2RlYyAmKTsKICAgICBPTVhDb2RlYyAmb3BlcmF0b3I9KGNvbnN0IE9NWENvZGVjICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb3Blbm1heC9PTVhfSVZDb21tb24uaAppbmRleCA0YThiZTdiLi4xMmI0ZjkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXgvT01YX0lWQ29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCkBAIC0xNDksNiArMTQ5LDcgQEAKICAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiwKICAgICBPTVhfQ09MT1JfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAogICAgIE9NWF9DT0xPUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwLAogICAgIE9NWF9DT0xPUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9DT0xPUl9GT1JNQVRUWVBFOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCAxODI3YzNlLi4yMGFiZDUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTI2LDcgKzI2LDYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jZGVmaW5lIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQgKEFORFJPSURfUFJJT1JJVFlfQVVESU8pCiAvLyBNYXhpbXVtIGN1bXVsYXRlZCB0aW1lb3V0IG1pbGxpc2Vjb25kcyBiZWZvcmUgcmVzdGFydGluZyBhdWRpb2ZsaW5nZXIgdGhyZWFkCiAjZGVmaW5lIE1BWF9TVEFSVFVQX1RJTUVPVVRfTVMgIDMwMDAgICAgLy8gTG9uZ2VyIHRpbWVvdXQgcGVyaW9kIGF0IHN0YXJ0dXAgdG8gY29wZSB3aXRoIEEyRFAgaW5pdCB0aW1lCiAjZGVmaW5lIE1BWF9SVU5fVElNRU9VVF9NUyAgICAgIDEwMDAKQEAgLTgyLDcgKzgxLDcgQEAKICAgICAgICAgICAgICAgICAvLyAxNiBiaXQgYmVjYXVzZSBkYXRhIGlzIGNvbnZlcnRlZCB0byAxNiBiaXQgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiBidWZmZXIKIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgdWludDhfdCAgICAgcGFkMTsKICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBidWZmZXJUaW1lb3V0TXM7IC8vIE1heGltdW0gY3VtdWxhdGVkIHRpbWVvdXQgYmVmb3JlIHJlc3RhcnRpbmcgYXVkaW9mbGluZ2VyCiAKICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICB3YWl0VGltZU1zOyAgICAgIC8vIEN1bXVsYXRlZCB3YWl0IHRpbWUKQEAgLTkwLDYgKzg5LDcgQEAKICAgICB2b2xhdGlsZSAgICBpbnQzMl90ICAgICBmbGFnczsKIAogICAgICAgICAgICAgICAgIC8vIENhY2hlIGxpbmUgYm91bmRhcnkgKDMyIGJ5dGVzKQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc3RlcFVzZXIodWludDMyX3QgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RlcFNlcnZlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9TaGFyZWRCdWZmZXJTdGFjay5oIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKaW5kZXggNzE3ZjgzNy4uMGRhMDNkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmgKQEAgLTIwLDM1NSArMjAsMTIgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotCiAjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8dWkvUmVjdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLyoKLSAqIFRoZXNlIGNsYXNzZXMgbWFuYWdlIGEgc3RhY2sgb2YgYnVmZmVycyBpbiBzaGFyZWQgbWVtb3J5LgotICogCi0gKiBTaGFyZWRDbGllbnQ6IHJlcHJlc2VudHMgYSBjbGllbnQgd2l0aCBzZXZlcmFsIHN0YWNrcwotICogU2hhcmVkQnVmZmVyU3RhY2s6IHJlcHJlc2VudHMgYSBzdGFjayBvZiBidWZmZXJzCi0gKiBTaGFyZWRCdWZmZXJDbGllbnQ6IG1hbmlwdWxhdGVzIHRoZSBTaGFyZWRCdWZmZXJTdGFjayBmcm9tIHRoZSBjbGllbnQgc2lkZSAKLSAqIFNoYXJlZEJ1ZmZlclNlcnZlcjogbWFuaXB1bGF0ZXMgdGhlIFNoYXJlZEJ1ZmZlclN0YWNrIGZyb20gdGhlIHNlcnZlciBzaWRlIAotICoKLSAqIEJ1ZmZlcnMgY2FuIGJlIGRlcXVldWVkIHVudGlsIHRoZXJlIGFyZSBub25lIGF2YWlsYWJsZSwgdGhleSBjYW4gYmUgbG9ja2VkCi0gKiB1bmxlc3MgdGhleSBhcmUgaW4gdXNlIGJ5IHRoZSBzZXJ2ZXIsIHdoaWNoIGlzIG9ubHkgdGhlIGNhc2UgZm9yIHRoZSBsYXN0IAotICogZGVxdWV1ZS1hYmxlIGJ1ZmZlci4gV2hlbiB0aGVzZSB2YXJpb3VzIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSBjYWxsZXIKLSAqIHdhaXRzIHVudGlsIHRoZSBjb25kaXRpb24gaXMgbWV0LgotICogCi0gKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZWdpb247Ci1jbGFzcyBTaGFyZWRCdWZmZXJTdGFjazsKLWNsYXNzIFNoYXJlZENsaWVudDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTaGFyZWRCdWZmZXJTdGFjawotewotICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyOwotCi1wdWJsaWM6Ci0gICAgLy8gV2hlbiBjaGFuZ2luZyB0aGVzZSB2YWx1ZXMsIHRoZSBDT01QSUxFX1RJTUVfQVNTRVJUIGF0IHRoZSBlbmQgb2YgdGhpcwotICAgIC8vIGZpbGUgbmVlZCB0byBiZSB1cGRhdGVkLgotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX0xBWUVSU19NQVggID0gMzE7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fQlVGRkVSX01BWCAgPSAzMjsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9CVUZGRVJfTUlOICA9IDI7Ci0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fRElTUExBWV9NQVggPSA0OwotCi0gICAgc3RydWN0IFN0YXRpc3RpY3MgeyAvLyA0IGxvbmdzCi0gICAgICAgIHR5cGVkZWYgaW50MzJfdCB1c2Vjc190OwotICAgICAgICB1c2Vjc190ICB0b3RhbFRpbWU7Ci0gICAgICAgIHVzZWNzX3QgIHJlc2VydmVkWzNdOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgU21hbGxSZWN0IHsKLSAgICAgICAgdWludDE2X3QgbCwgdCwgciwgYjsKLSAgICB9OwotCi0gICAgc3RydWN0IEZsYXRSZWdpb24geyAvLyA1MiBieXRlcyA9IDQgKiAoMSArIDIqTikKLSAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fUkVDVF9NQVggPSA1OwotICAgICAgICB1aW50MzJfdCAgICBjb3VudDsKLSAgICAgICAgU21hbGxSZWN0ICAgcmVjdHNbTlVNX1JFQ1RfTUFYXTsKLSAgICB9OwotICAgIAotICAgIHN0cnVjdCBCdWZmZXJEYXRhIHsKLSAgICAgICAgRmxhdFJlZ2lvbiBkaXJ0eVJlZ2lvbjsKLSAgICAgICAgU21hbGxSZWN0ICBjcm9wOwotICAgICAgICB1aW50OF90IHRyYW5zZm9ybTsKLSAgICAgICAgdWludDhfdCByZXNlcnZlZFszXTsKLSAgICB9OwotICAgIAotICAgIFNoYXJlZEJ1ZmZlclN0YWNrKCk7Ci0gICAgdm9pZCBpbml0KGludDMyX3QgaWRlbnRpdHkpOwotICAgIHN0YXR1c190IHNldERpcnR5UmVnaW9uKGludCBidWZmZXIsIGNvbnN0IFJlZ2lvbiYgcmVnKTsKLSAgICBzdGF0dXNfdCBzZXRDcm9wKGludCBidWZmZXIsIGNvbnN0IFJlY3QmIHJlZyk7Ci0gICAgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCBidWZmZXIsIHVpbnQ4X3QgdHJhbnNmb3JtKTsKLSAgICBSZWdpb24gZ2V0RGlydHlSZWdpb24oaW50IGJ1ZmZlcikgY29uc3Q7Ci0gICAgUmVjdCBnZXRDcm9wKGludCBidWZmZXIpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldFRyYW5zZm9ybShpbnQgYnVmZmVyKSBjb25zdDsKLQotICAgIC8vIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHBhcnQgb2YgdGhlIGNvbmRpdGlvbnMvdXBkYXRlcwotICAgIHZvbGF0aWxlIGludDMyX3QgaGVhZDsgICAgICAvLyBzZXJ2ZXIncyBjdXJyZW50IGZyb250IGJ1ZmZlcgotICAgIHZvbGF0aWxlIGludDMyX3QgYXZhaWxhYmxlOyAvLyBudW1iZXIgb2YgZGVxdWV1ZS1hYmxlIGJ1ZmZlcnMKLSAgICB2b2xhdGlsZSBpbnQzMl90IHF1ZXVlZDsgICAgLy8gbnVtYmVyIG9mIGJ1ZmZlcnMgd2FpdGluZyBmb3IgcG9zdAotICAgIHZvbGF0aWxlIGludDMyX3QgcmVzZXJ2ZWQxOwotICAgIHZvbGF0aWxlIHN0YXR1c190IHN0YXR1czsgICAvLyBzdXJmYWNlJ3Mgc3RhdHVzIGNvZGUKLQotICAgIC8vIG5vdCBwYXJ0IG9mIHRoZSBjb25kaXRpb25zCi0gICAgdm9sYXRpbGUgaW50MzJfdCByZWFsbG9jTWFzazsKLSAgICB2b2xhdGlsZSBpbnQ4X3QgaW5kZXhbTlVNX0JVRkZFUl9NQVhdOwotCi0gICAgaW50MzJfdCAgICAgaWRlbnRpdHk7ICAgICAgIC8vIHN1cmZhY2UncyBpZGVudGl0eSAoY29uc3QpCi0gICAgaW50MzJfdCAgICAgdG9rZW47ICAgICAgICAgIC8vIHN1cmZhY2UncyB0b2tlbiAoZm9yIGRlYnVnZ2luZykKLSAgICBTdGF0aXN0aWNzICBzdGF0czsKLSAgICBpbnQ4X3QgICAgICBoZWFkQnVmOyAgICAgICAgLy8gbGFzdCByZXRpcmVkIGJ1ZmZlcgotICAgIHVpbnQ4X3QgICAgIHJlc2VydmVkQnl0ZXNbM107Ci0gICAgaW50MzJfdCAgICAgcmVzZXJ2ZWQ7Ci0gICAgQnVmZmVyRGF0YSAgYnVmZmVyc1tOVU1fQlVGRkVSX01BWF07ICAgICAvLyAxMDI0IGJ5dGVzCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIDY0IEtCIG1heAotY2xhc3MgU2hhcmVkQ2xpZW50Ci17Ci1wdWJsaWM6Ci0gICAgU2hhcmVkQ2xpZW50KCk7Ci0gICAgflNoYXJlZENsaWVudCgpOwotICAgIHN0YXR1c190IHZhbGlkYXRlKHNpemVfdCB0b2tlbikgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyOwotCi0gICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgbG9jay1sZXNzIHByaW1pdGl2ZQotICAgIE11dGV4IGxvY2s7Ci0gICAgQ29uZGl0aW9uIGN2OwotICAgIFNoYXJlZEJ1ZmZlclN0YWNrIHN1cmZhY2VzWyBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0xBWUVSU19NQVggXTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgU2hhcmVkQnVmZmVyQmFzZQotewotcHVibGljOgotICAgIFNoYXJlZEJ1ZmZlckJhc2UoU2hhcmVkQ2xpZW50KiBzaGFyZWRDbGllbnQsIGludCBzdXJmYWNlLAotICAgICAgICAgICAgaW50MzJfdCBpZGVudGl0eSk7Ci0gICAgflNoYXJlZEJ1ZmZlckJhc2UoKTsKLSAgICBzdGF0dXNfdCBnZXRTdGF0dXMoKSBjb25zdDsKLSAgICBpbnQzMl90IGdldElkZW50aXR5KCkgY29uc3Q7Ci0gICAgU3RyaW5nOCBkdW1wKGNoYXIgY29uc3QqIHByZWZpeCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBTaGFyZWRDbGllbnQqIGNvbnN0IG1TaGFyZWRDbGllbnQ7Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2sqIGNvbnN0IG1TaGFyZWRTdGFjazsKLSAgICBjb25zdCBpbnQgbUlkZW50aXR5OwotCi0gICAgZnJpZW5kIHN0cnVjdCBVcGRhdGU7Ci0gICAgZnJpZW5kIHN0cnVjdCBRdWV1ZVVwZGF0ZTsKLQotICAgIHN0cnVjdCBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrOwotICAgICAgICBpbmxpbmUgQ29uZGl0aW9uQmFzZShTaGFyZWRCdWZmZXJCYXNlKiBzYmMpIAotICAgICAgICAgICAgOiBzdGFjaygqc2JjLT5tU2hhcmVkU3RhY2spIHsgfQotICAgICAgICB2aXJ0dWFsIH5Db25kaXRpb25CYXNlKCkgeyB9OwotICAgICAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgPSAwOwotICAgIH07Ci0gICAgc3RhdHVzX3Qgd2FpdEZvckNvbmRpdGlvbihjb25zdCBDb25kaXRpb25CYXNlJiBjb25kaXRpb24pOwotCi0gICAgc3RydWN0IFVwZGF0ZUJhc2UgewotICAgICAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2s7Ci0gICAgICAgIGlubGluZSBVcGRhdGVCYXNlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYikgCi0gICAgICAgICAgICA6IHN0YWNrKCpzYmItPm1TaGFyZWRTdGFjaykgeyB9Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCB1cGRhdGVDb25kaXRpb24oVCB1cGRhdGUpOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0dXNfdCBTaGFyZWRCdWZmZXJCYXNlOjp1cGRhdGVDb25kaXRpb24oVCB1cGRhdGUpIHsKLSAgICBTaGFyZWRDbGllbnQmIGNsaWVudCggKm1TaGFyZWRDbGllbnQgKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woY2xpZW50LmxvY2spOwotICAgIHNzaXplX3QgcmVzdWx0ID0gdXBkYXRlKCk7Ci0gICAgY2xpZW50LmN2LmJyb2FkY2FzdCgpOyAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudCA6IHB1YmxpYyBTaGFyZWRCdWZmZXJCYXNlCi17Ci1wdWJsaWM6Ci0gICAgU2hhcmVkQnVmZmVyQ2xpZW50KFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LCBpbnQgc3VyZmFjZSwgaW50IG51bSwKLSAgICAgICAgICAgIGludDMyX3QgaWRlbnRpdHkpOwotCi0gICAgc3NpemVfdCBkZXF1ZXVlKCk7Ci0gICAgc3RhdHVzX3QgdW5kb0RlcXVldWUoaW50IGJ1Zik7Ci0gICAgCi0gICAgc3RhdHVzX3QgbG9jayhpbnQgYnVmKTsKLSAgICBzdGF0dXNfdCBjYW5jZWwoaW50IGJ1Zik7Ci0gICAgc3RhdHVzX3QgcXVldWUoaW50IGJ1Zik7Ci0gICAgYm9vbCBuZWVkTmV3QnVmZmVyKGludCBidWZmZXIpIGNvbnN0OwotICAgIHN0YXR1c190IHNldERpcnR5UmVnaW9uKGludCBidWZmZXIsIGNvbnN0IFJlZ2lvbiYgcmVnKTsKLSAgICBzdGF0dXNfdCBzZXRDcm9wKGludCBidWZmZXIsIGNvbnN0IFJlY3QmIHJlZyk7Ci0gICAgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKGludCBidWZmZXIsIHVpbnQzMl90IHRyYW5zZm9ybSk7Ci0KLSAgICBjbGFzcyBTZXRCdWZmZXJDb3VudENhbGxiYWNrIHsKLSAgICAgICAgZnJpZW5kIGNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVyYXRvcigpKGludCBidWZmZXJDb3VudCkgY29uc3QgPSAwOwotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+U2V0QnVmZmVyQ291bnRDYWxsYmFjaygpIHsgfQotICAgIH07Ci0gICAgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50LCBjb25zdCBTZXRCdWZmZXJDb3VudENhbGxiYWNrJiBpcGMpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgQ29uZGl0aW9uOwotICAgIGZyaWVuZCBzdHJ1Y3QgRGVxdWV1ZUNvbmRpdGlvbjsKLSAgICBmcmllbmQgc3RydWN0IExvY2tDb25kaXRpb247Ci0KLSAgICBzdHJ1Y3QgUXVldWVVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7Ci0gICAgICAgIGlubGluZSBRdWV1ZVVwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpOwotICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBEZXF1ZXVlVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgewotICAgICAgICBpbmxpbmUgRGVxdWV1ZVVwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpOwotICAgICAgICBpbmxpbmUgc3NpemVfdCBvcGVyYXRvcigpKCk7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBDYW5jZWxVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7Ci0gICAgICAgIGludCB0YWlsLCBidWY7Ci0gICAgICAgIGlubGluZSBDYW5jZWxVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgdGFpbCwgaW50IGJ1Zik7Ci0gICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKLSAgICB9OwotCi0gICAgLy8gLS0KLQotICAgIHN0cnVjdCBEZXF1ZXVlQ29uZGl0aW9uIDogcHVibGljIENvbmRpdGlvbkJhc2UgewotICAgICAgICBpbmxpbmUgRGVxdWV1ZUNvbmRpdGlvbihTaGFyZWRCdWZmZXJDbGllbnQqIHNiYyk7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiRGVxdWV1ZUNvbmRpdGlvbiI7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IExvY2tDb25kaXRpb24gOiBwdWJsaWMgQ29uZGl0aW9uQmFzZSB7Ci0gICAgICAgIGludCBidWY7Ci0gICAgICAgIGlubGluZSBMb2NrQ29uZGl0aW9uKFNoYXJlZEJ1ZmZlckNsaWVudCogc2JjLCBpbnQgYnVmKTsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0OwotICAgICAgICBpbmxpbmUgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJMb2NrQ29uZGl0aW9uIjsgfQotICAgIH07Ci0KLSAgICBpbnQzMl90IGNvbXB1dGVUYWlsKCkgY29uc3Q7Ci0KLSAgICBtdXRhYmxlIFJXTG9jayBtTG9jazsKLSAgICBpbnQgbU51bUJ1ZmZlcnM7Ci0KLSAgICBpbnQzMl90IHRhaWw7Ci0gICAgaW50MzJfdCBxdWV1ZWRfaGVhZDsKLSAgICAvLyBzdGF0aXN0aWNzLi4uCi0gICAgbnNlY3NfdCBtRGVxdWV1ZVRpbWVbU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9CVUZGRVJfTUFYXTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyCi0gICAgOiBwdWJsaWMgU2hhcmVkQnVmZmVyQmFzZSwKLSAgICAgIHB1YmxpYyBMaWdodFJlZkJhc2U8U2hhcmVkQnVmZmVyU2VydmVyPgotewotcHVibGljOgotICAgIFNoYXJlZEJ1ZmZlclNlcnZlcihTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsIGludCBudW0sCi0gICAgICAgICAgICBpbnQzMl90IGlkZW50aXR5KTsKLQotICAgIHNzaXplX3QgcmV0aXJlQW5kTG9jaygpOwotICAgIHZvaWQgc2V0U3RhdHVzKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgc3RhdHVzX3QgcmVhbGxvY2F0ZUFsbCgpOwotICAgIHN0YXR1c190IHJlYWxsb2NhdGVBbGxFeGNlcHQoaW50IGJ1ZmZlcik7Ci0gICAgaW50MzJfdCBnZXRRdWV1ZWRDb3VudCgpIGNvbnN0OwotICAgIFJlZ2lvbiBnZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyKSBjb25zdDsKLSAgICBSZWN0IGdldENyb3AoaW50IGJ1ZmZlcikgY29uc3Q7Ci0gICAgdWludDMyX3QgZ2V0VHJhbnNmb3JtKGludCBidWZmZXIpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgcmVzaXplKGludCBuZXdOdW1CdWZmZXJzKTsKLSAgICBzdGF0dXNfdCBncm93KGludCBuZXdOdW1CdWZmZXJzKTsKLSAgICBzdGF0dXNfdCBzaHJpbmsoaW50IG5ld051bUJ1ZmZlcnMpOwotCi0gICAgU2hhcmVkQnVmZmVyU3RhY2s6OlN0YXRpc3RpY3MgZ2V0U3RhdHMoKSBjb25zdDsKLSAgICAKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGlnaHRSZWZCYXNlPFNoYXJlZEJ1ZmZlclNlcnZlcj47Ci0gICAgflNoYXJlZEJ1ZmZlclNlcnZlcigpOwotCi0gICAgLyoKLSAgICAgKiBCdWZmZXJMaXN0IGlzIGJhc2ljYWxseSBhIGZpeGVkLWNhcGFjaXR5IHNvcnRlZC12ZWN0b3Igb2YKLSAgICAgKiB1bnNpZ25lZCA1LWJpdHMgaW50cyB1c2luZyBhIDMyLWJpdHMgaW50IGFzIHN0b3JhZ2UuCi0gICAgICogaXQgaGFzIGVmZmljaWVudCBpdGVyYXRvcnMgdG8gZmluZCBpdGVtcyBpbiB0aGUgbGlzdCBhbmQgbm90IGluIHRoZSBsaXN0LgotICAgICAqLwotICAgIGNsYXNzIEJ1ZmZlckxpc3QgewotICAgICAgICBzaXplX3QgbUNhcGFjaXR5OwotICAgICAgICB1aW50MzJfdCBtTGlzdDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEJ1ZmZlckxpc3Qoc2l6ZV90IGMgPSBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0JVRkZFUl9NQVgpCi0gICAgICAgICAgICA6IG1DYXBhY2l0eShjKSwgbUxpc3QoMCkgeyB9Ci0gICAgICAgIHN0YXR1c190IGFkZChpbnQgdmFsdWUpOwotICAgICAgICBzdGF0dXNfdCByZW1vdmUoaW50IHZhbHVlKTsKLSAgICAgICAgdWludDMyX3QgZ2V0TWFzaygpIGNvbnN0IHsgcmV0dXJuIG1MaXN0OyB9Ci0KLSAgICAgICAgY2xhc3MgY29uc3RfaXRlcmF0b3IgewotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEJ1ZmZlckxpc3Q7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBjdXJyOwotICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IodWludDMyX3QgbWFzaykgOgotICAgICAgICAgICAgICAgIG1hc2sobWFzayksIGN1cnIoX19idWlsdGluX2NseihtYXNrKSkgewotICAgICAgICAgICAgfQotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgY29uc3RfaXRlcmF0b3ImIHJocykgY29uc3QgewotICAgICAgICAgICAgICAgIHJldHVybiBtYXNrID09IHJocy5tYXNrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIGNvbnN0IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWFzayAhPSByaHMubWFzazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlubGluZSBpbnQgb3BlcmF0b3IgKigpIGNvbnN0IHsgcmV0dXJuIGN1cnI7IH0KLSAgICAgICAgICAgIGlubGluZSBjb25zdCBjb25zdF9pdGVyYXRvciYgb3BlcmF0b3IgKysoKSB7Ci0gICAgICAgICAgICAgICAgbWFzayAmPSB+KDE8PCgzMS1jdXJyKSk7Ci0gICAgICAgICAgICAgICAgY3VyciA9IF9fYnVpbHRpbl9jbHoobWFzayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihtTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKDApOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBmcmVlX2JlZ2luKCkgY29uc3QgewotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9ICgxIDw8ICgzMi1tQ2FwYWNpdHkpKSAtIDE7Ci0gICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoIH4obUxpc3QgfCBtYXNrKSApOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8vIHRoaXMgcHJvdGVjdHMgbU51bUJ1ZmZlcnMgYW5kIG1CdWZmZXJMaXN0Ci0gICAgbXV0YWJsZSBSV0xvY2sgbUxvY2s7Ci0gICAgaW50IG1OdW1CdWZmZXJzOwotICAgIEJ1ZmZlckxpc3QgbUJ1ZmZlckxpc3Q7Ci0KLSAgICBzdHJ1Y3QgQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbiA6IHB1YmxpYyBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgaW50IG1OdW1CdWZmZXJzOwotICAgICAgICBpbmxpbmUgQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbihTaGFyZWRCdWZmZXJTZXJ2ZXIqIHNicywKLSAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycyk7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiQnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbiI7IH0KLSAgICB9OwotCi0gICAgc3RydWN0IFJldGlyZVVwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKLSAgICAgICAgY29uc3QgaW50IG51bUJ1ZmZlcnM7Ci0gICAgICAgIGlubGluZSBSZXRpcmVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgbnVtQnVmZmVycyk7Ci0gICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IFN0YXR1c1VwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKLSAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBpbmxpbmUgU3RhdHVzVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgc3RhdHVzX3Qgc3RhdHVzKTsKLSAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwotICAgIH07Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgTlVNX0RJU1BMQVlfTUFYIDQKIAogc3RydWN0IGRpc3BsYXlfY2Jsa190CiB7CkBAIC0zODksMTIgKzQ2LDExIEBACiAgICAgdWludDhfdCAgICAgICAgIGNvbm5lY3RlZDsKICAgICB1aW50OF90ICAgICAgICAgcmVzZXJ2ZWRbM107CiAgICAgdWludDMyX3QgICAgICAgIHBhZFs3XTsKLSAgICBkaXNwbGF5X2NibGtfdCAgZGlzcGxheXNbU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9ESVNQTEFZX01BWF07CisgICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW05VTV9ESVNQTEFZX01BWF07CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ09NUElMRV9USU1FX0FTU0VSVChzaXplb2YoU2hhcmVkQ2xpZW50KSA8PSA2NTUzNikKIENPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QpIDw9IDQwOTYpCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JR3JhcGhpY0J1ZmZlckFsbG9jLmggYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL0lHcmFwaGljQnVmZmVyQWxsb2MuaAppbmRleCAwMWU0YmQ5Li5lMWI2YjU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL0lHcmFwaGljQnVmZmVyQWxsb2MuaAorKysgYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL0lHcmFwaGljQnVmZmVyQWxsb2MuaApAQCAtMjcsNiArMjcsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjbGFzcyBHcmFwaGljQnVmZmVyOworCiBjbGFzcyBJR3JhcGhpY0J1ZmZlckFsbG9jIDogcHVibGljIElJbnRlcmZhY2UKIHsKIHB1YmxpYzoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaCBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaAppbmRleCBjZDBlZTQwLi41ZmRmMjM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmgKKysrIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oCkBAIC0yNyw0MiArMjcsMjMgQEAKIAogI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIGludDMyX3QgICAgU3VyZmFjZUlEOwogCi1jbGFzcyBHcmFwaGljQnVmZmVyOworY2xhc3MgSVN1cmZhY2VUZXh0dXJlOwogCiBjbGFzcyBJU3VyZmFjZSA6IHB1YmxpYyBJSW50ZXJmYWNlCiB7CiBwcm90ZWN0ZWQ6CiAgICAgZW51bSB7Ci0gICAgICAgIFJFU0VSVkVEMCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgICAgIFJFU0VSVkVEMSwKLSAgICAgICAgUkVTRVJWRUQyLAotICAgICAgICBSRVFVRVNUX0JVRkZFUiwKLSAgICAgICAgU0VUX0JVRkZFUl9DT1VOVCwKKyAgICAgICAgR0VUX1NVUkZBQ0VfVEVYVFVSRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgfTsKIAogcHVibGljOiAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFN1cmZhY2UpOwogCi0gICAgLyoKLSAgICAgKiByZXF1ZXN0cyBhIG5ldyBidWZmZXIgZm9yIHRoZSBnaXZlbiBpbmRleC4gSWYgdywgaCwgb3IgZm9ybWF0IGFyZQotICAgICAqIG51bGwgdGhlIGJ1ZmZlciBpcyBjcmVhdGVkIHdpdGggdGhlIHBhcmFtZXRlcnMgYXNzaWduZWQgdG8gdGhlCi0gICAgICogc3VyZmFjZSBpdCBpcyBib3VuZCB0by4gT3RoZXJ3aXNlIHRoZSBidWZmZXIncyBwYXJhbWV0ZXJzIGFyZQotICAgICAqIHNldCB0byB0aG9zZSBzcGVjaWZpZWQuCi0gICAgICovCi0gICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiByZXF1ZXN0QnVmZmVyKGludCBidWZmZXJJZHgsCi0gICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSA9IDA7Ci0KLSAgICAvKgotICAgICAqIHNldHMgdGhlIG51bWJlciBvZiBidWZmZXJzIGRlcXVldWFibGUgZm9yIHRoaXMgc3VyZmFjZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkgPSAwOworICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VUZXh0dXJlPiBnZXRTdXJmYWNlVGV4dHVyZSgpIGNvbnN0ID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvSVN1cmZhY2VDb21wb3Nlci5oIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyLmgKaW5kZXggZGVhMWIxMC4uMDNmZDAxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyLmgKKysrIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyLmgKQEAgLTMzLDYgKzMzLDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorY2xhc3MgSU1lbW9yeUhlYXA7CisKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXIgOiBwdWJsaWMgSUludGVyZmFjZQogewogcHVibGljOgpAQCAtOTUsMTAgKzk3LDYgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNyZWF0ZUNvbm5lY3Rpb24oKSA9IDA7CiAKLSAgICAvKiBjcmVhdGUgYSBjbGllbnQgY29ubmVjdGlvbiB3aXRoIHN1cmZhY2UgZmxpbmdlcgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gY3JlYXRlQ2xpZW50Q29ubmVjdGlvbigpID0gMDsKLQogICAgIC8qIGNyZWF0ZSBhIGdyYXBoaWMgYnVmZmVyIGFsbG9jYXRvcgogICAgICAqLwogICAgIHZpcnR1YWwgc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gY3JlYXRlR3JhcGhpY0J1ZmZlckFsbG9jKCkgPSAwOwpAQCAtMTM0LDExICsxMzIsNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybkVsZWN0cm9uQmVhbU9mZihpbnQzMl90IG1vZGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHR1cm5FbGVjdHJvbkJlYW1PbihpbnQzMl90IG1vZGUpID0gMDsKIAotICAgIC8qIFNpZ25hbCBzdXJmYWNlZmxpbmdlciB0aGF0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgd29yayB0byBkbwotICAgICAqIFRoaXMgaXMgYW4gQVNZTkNIUk9OT1VTIGNhbGwuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbCgpIGNvbnN0ID0gMDsKLQogICAgIC8qIHZlcmlmeSB0aGF0IGFuIElTdXJmYWNlIHdhcyBjcmVhdGVkIGJ5IFN1cmZhY2VGbGluZ2VyLgogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCBhdXRoZW50aWNhdGVTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgPSAwOwpAQCAtMTU0LDcgKzE0Nyw2IEBACiAgICAgICAgIC8vIEphdmEgYnkgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS4KICAgICAgICAgQk9PVF9GSU5JU0hFRCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgICAgIENSRUFURV9DT05ORUNUSU9OLAotICAgICAgICBDUkVBVEVfQ0xJRU5UX0NPTk5FQ1RJT04sCiAgICAgICAgIENSRUFURV9HUkFQSElDX0JVRkZFUl9BTExPQywKICAgICAgICAgR0VUX0NCTEssCiAgICAgICAgIE9QRU5fR0xPQkFMX1RSQU5TQUNUSU9OLApAQCAtMTYyLDcgKzE1NCw2IEBACiAgICAgICAgIFNFVF9PUklFTlRBVElPTiwKICAgICAgICAgRlJFRVpFX0RJU1BMQVksCiAgICAgICAgIFVORlJFRVpFX0RJU1BMQVksCi0gICAgICAgIFNJR05BTCwKICAgICAgICAgQ0FQVFVSRV9TQ1JFRU4sCiAgICAgICAgIFRVUk5fRUxFQ1RST05fQkVBTV9PRkYsCiAgICAgICAgIFRVUk5fRUxFQ1RST05fQkVBTV9PTiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKaW5kZXggNDZiMWJiNy4uMmU3NWEwZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKQEAgLTMzLDkgKzMzLDYgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBJTWVtb3J5SGVhcDsKLQotdHlwZWRlZiBpbnQzMl90ICAgIENsaWVudElEOwogdHlwZWRlZiBpbnQzMl90ICAgIERpc3BsYXlJRDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTcsOSArNTQsNiBAQAogICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKICAgICB9OwogCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0Q29udHJvbEJsb2NrKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3NpemVfdCBnZXRUb2tlbkZvclN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXIpIGNvbnN0ID0gMDsKLQogICAgIC8qCiAgICAgICogUmVxdWlyZXMgQUNDRVNTX1NVUkZBQ0VfRkxJTkdFUiBwZXJtaXNzaW9uCiAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaCBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCmluZGV4IGFiMzBmNDUuLjg4NDVkYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCisrKyBiL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oCkBAIC00Myw5ICs0Myw3IEBACiBjbGFzcyBSZWN0OwogY2xhc3MgU3VyZmFjZTsKIGNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudDsKLWNsYXNzIFNoYXJlZENsaWVudDsKLWNsYXNzIFNoYXJlZEJ1ZmZlckNsaWVudDsKLWNsYXNzIFN1cmZhY2VDbGllbnQ7CitjbGFzcyBTdXJmYWNlVGV4dHVyZUNsaWVudDsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTE2Miw5ICsxNjAsNiBAQAogICAgIHN0YXR1c190ICAgIGxvY2soU3VyZmFjZUluZm8qIGluZm8sIFJlZ2lvbiogZGlydHksIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKICAgICBzdGF0dXNfdCAgICB1bmxvY2tBbmRQb3N0KCk7CiAKLSAgICAvLyBzZXRTd2FwUmVjdGFuZ2xlKCkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBHTCBFUyBjbGllbnRzCi0gICAgdm9pZCAgICAgICAgc2V0U3dhcFJlY3RhbmdsZShjb25zdCBSZWN0JiByKTsKLQogICAgIHNwPElCaW5kZXI+IGFzQmluZGVyKCkgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC0yMDksNiArMjA0LDcgQEAKICAgICBzdGF0aWMgaW50IHF1ZXJ5KGNvbnN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IHdoYXQsIGludCogdmFsdWUpOwogICAgIHN0YXRpYyBpbnQgcGVyZm9ybShBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBvcGVyYXRpb24sIC4uLik7CiAKKyAgICBpbnQgc2V0U3dhcEludGVydmFsKGludCBpbnRlcnZhbCk7CiAgICAgaW50IGRlcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlcioqIGJ1ZmZlcik7CiAgICAgaW50IGxvY2tCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKICAgICBpbnQgcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKTsKQEAgLTIxNiw4MyArMjEyLDIzIEBACiAgICAgaW50IHF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdDsKICAgICBpbnQgcGVyZm9ybShpbnQgb3BlcmF0aW9uLCB2YV9saXN0IGFyZ3MpOwogCi0gICAgdm9pZCBkaXNwYXRjaF9zZXRVc2FnZSh2YV9saXN0IGFyZ3MpOwotICAgIGludCAgZGlzcGF0Y2hfY29ubmVjdCh2YV9saXN0IGFyZ3MpOwotICAgIGludCAgZGlzcGF0Y2hfZGlzY29ubmVjdCh2YV9saXN0IGFyZ3MpOwotICAgIGludCAgZGlzcGF0Y2hfY3JvcCh2YV9saXN0IGFyZ3MpOwotICAgIGludCAgZGlzcGF0Y2hfc2V0X2J1ZmZlcl9jb3VudCh2YV9saXN0IGFyZ3MpOwotICAgIGludCAgZGlzcGF0Y2hfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgIGRpc3BhdGNoX3NldF9idWZmZXJzX3RyYW5zZm9ybSh2YV9saXN0IGFyZ3MpOwotICAgIGludCAgZGlzcGF0Y2hfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKHZhX2xpc3QgYXJncyk7Ci0KLSAgICB2b2lkIHNldFVzYWdlKHVpbnQzMl90IHJlcVVzYWdlKTsKLSAgICBpbnQgIGNvbm5lY3QoaW50IGFwaSk7Ci0gICAgaW50ICBkaXNjb25uZWN0KGludCBhcGkpOwotICAgIGludCAgY3JvcChSZWN0IGNvbnN0KiByZWN0KTsKLSAgICBpbnQgIHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0gICAgaW50ICBzZXRCdWZmZXJzR2VvbWV0cnkoaW50IHcsIGludCBoLCBpbnQgZm9ybWF0KTsKLSAgICBpbnQgIHNldEJ1ZmZlcnNUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSk7Ci0gICAgaW50ICBzZXRCdWZmZXJzVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wKTsKLQogICAgIC8qCiAgICAgICogIHByaXZhdGUgc3R1ZmYuLi4KICAgICAgKi8KICAgICB2b2lkIGluaXQoKTsKICAgICBzdGF0dXNfdCB2YWxpZGF0ZShib29sIGluQ2FuY2VsQnVmZmVyID0gZmFsc2UpIGNvbnN0OwogCi0gICAgLy8gV2hlbiB0aGUgYnVmZmVyIHBvb2wgaXMgYSBmaXhlZCBzaXplIHdlIHdhbnQgdG8gbWFrZSBzdXJlIFN1cmZhY2VGbGluZ2VyCi0gICAgLy8gd29uJ3Qgc3RhbGwgY2xpZW50cywgc28gd2UgcmVxdWlyZSBhbiBleHRyYSBidWZmZXIuCi0gICAgZW51bSB7IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgPSAyIH07Ci0KLSAgICBpbmxpbmUgY29uc3QgR3JhcGhpY0J1ZmZlck1hcHBlciYgZ2V0QnVmZmVyTWFwcGVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlck1hcHBlcjsgfQotICAgIGlubGluZSBHcmFwaGljQnVmZmVyTWFwcGVyJiBnZXRCdWZmZXJNYXBwZXIoKSB7IHJldHVybiBtQnVmZmVyTWFwcGVyOyB9Ci0KLSAgICBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoaW50IGluZGV4LAotICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7Ci0gICAgaW50IGdldEJ1ZmZlckluZGV4KGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIGNvbnN0OwotCiAgICAgaW50IGdldENvbm5lY3RlZEFwaSgpIGNvbnN0OwogICAgIAotICAgIGJvb2wgbmVlZE5ld0J1ZmZlcihpbnQgYnVmSWR4LAotICAgICAgICAgICAgdWludDMyX3QgKnBXaWR0aCwgdWludDMyX3QgKnBIZWlnaHQsCi0gICAgICAgICAgICB1aW50MzJfdCAqcEZvcm1hdCwgdWludDMyX3QgKnBVc2FnZSkgY29uc3Q7Ci0KICAgICBzdGF0aWMgdm9pZCBjbGVhbkNhY2hlZFN1cmZhY2VzTG9ja2VkKCk7CiAKLSAgICBjbGFzcyBCdWZmZXJJbmZvIHsKLSAgICAgICAgdWludDMyX3QgbVdpZHRoOwotICAgICAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgICAgICB1aW50MzJfdCBtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCBtVXNhZ2U7Ci0gICAgICAgIG11dGFibGUgdWludDMyX3QgbURpcnR5OwotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIEdFT01FVFJZID0gMHgwMQotICAgICAgICB9OwotICAgIHB1YmxpYzoKLSAgICAgICAgQnVmZmVySW5mbygpOwotICAgICAgICB2b2lkIHNldCh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQpOwotICAgICAgICB2b2lkIHNldCh1aW50MzJfdCB1c2FnZSk7Ci0gICAgICAgIHZvaWQgZ2V0KHVpbnQzMl90ICpwV2lkdGgsIHVpbnQzMl90ICpwSGVpZ2h0LAotICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwRm9ybWF0LCB1aW50MzJfdCAqcFVzYWdlKSBjb25zdDsKLSAgICAgICAgYm9vbCB2YWxpZGF0ZUJ1ZmZlcihjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSBjb25zdDsKLSAgICB9OwotCiAgICAgLy8gY29uc3RhbnRzCi0gICAgR3JhcGhpY0J1ZmZlck1hcHBlciYgICAgICAgIG1CdWZmZXJNYXBwZXI7Ci0gICAgU3VyZmFjZUNsaWVudCYgICAgICAgICAgICAgIG1DbGllbnQ7Ci0gICAgU2hhcmVkQnVmZmVyQ2xpZW50KiAgICAgICAgIG1TaGFyZWRCdWZmZXJDbGllbnQ7CiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2s7CiAgICAgc3A8SVN1cmZhY2U+ICAgICAgICAgICAgICAgIG1TdXJmYWNlOworICAgIHNwPFN1cmZhY2VUZXh0dXJlQ2xpZW50PiAgICBtU3VyZmFjZVRleHR1cmVDbGllbnQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1JZGVudGl0eTsKICAgICBQaXhlbEZvcm1hdCAgICAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUZsYWdzOwotCi0gICAgLy8gcHJvdGVjdGVkIGJ5IG1TdXJmYWNlTG9jawotICAgIFJlY3QgICAgICAgICAgICAgICAgICAgICAgICBtU3dhcFJlY3RhbmdsZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZDsKLSAgICBSZWN0ICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdWZmZXJDcm9wOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1ZmZlclRyYW5zZm9ybTsKLSAgICBCdWZmZXJJbmZvICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm87CiAgICAgCiAgICAgLy8gcHJvdGVjdGVkIGJ5IG1TdXJmYWNlTG9jay4gVGhlc2UgYXJlIGFsc28gdXNlZCBmcm9tIGxvY2svdW5sb2NrCiAgICAgLy8gYnV0IGluIHRoYXQgY2FzZSwgdGhleSBtdXN0IGJlIGNhbGxlZCBmb3JtIHRoZSBzYW1lIHRocmVhZC4KQEAgLTMwNCw5ICsyNDAsNiBAQAogICAgIG11dGFibGUgUmVnaW9uICAgICAgICAgICAgICBtT2xkRGlydHlSZWdpb247CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNlcnZlZDsKIAotICAgIC8vIG9ubHkgdXNlZCBmcm9tIGRlcXVldWVCdWZmZXIoKQotICAgIFZlY3Rvcjwgc3A8R3JhcGhpY0J1ZmZlcj4gPiBtQnVmZmVyczsKLQogICAgIC8vIHF1ZXJ5KCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBkZXF1ZXVlQnVmZmVyKCkgdGhyZWFkCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1XaWR0aDsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUhlaWdodDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmggYi9pbmNsdWRlL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VDb21wb3NlckNsaWVudC5oCmluZGV4IGM2MWE1YmYuLjE0MGI5ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9zdXJmYWNlZmxpbmdlci9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaApAQCAtMzYsMTAgKzM2LDEwIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBSZWdpb247Ci1jbGFzcyBTaGFyZWRDbGllbnQ7Ci1jbGFzcyBJU3VyZmFjZUNvbXBvc2VyOwogY2xhc3MgRGlzcGxheUluZm87CitjbGFzcyBJTWVtb3J5SGVhcDsKK2NsYXNzIElTdXJmYWNlQ29tcG9zZXI7CitjbGFzcyBSZWdpb247CiBjbGFzcyBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSW5wdXQuaCBiL2luY2x1ZGUvdWkvSW5wdXQuaAppbmRleCBiYTFjNmI0Li5jOWY2OTRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lucHV0LmgKKysrIGIvaW5jbHVkZS91aS9JbnB1dC5oCkBAIC02NTUsMTEgKzY1NSw2IEBACiAgICAgLy8gT2xkZXN0IHNhbXBsZSB0byBjb25zaWRlciB3aGVuIGNhbGN1bGF0aW5nIHRoZSB2ZWxvY2l0eS4KICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBNQVhfQUdFID0gMjAwICogMTAwMDAwMDsgLy8gMjAwIG1zCiAKLSAgICAvLyBXaGVuIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgd2luZG93IG9mIHNhbXBsZXMgYmVpbmcgYXZlcmFnZWQgaXMgbGVzcwotICAgIC8vIHRoYW4gdGhlIHdpbmRvdyBzaXplLCB0aGUgcmVzdWx0aW5nIHZlbG9jaXR5IGlzIHNjYWxlZCB0byByZWR1Y2UgdGhlIGltcGFjdAotICAgIC8vIG9mIG92ZXJlc3RpbWF0aW9uIGluIHNob3J0IHRyYWNlcy4KLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBNSU5fV0lORE9XID0gMTAwICogMTAwMDAwMDsgLy8gMTAwIG1zCi0KICAgICAvLyBUaGUgbWluaW11bSBkdXJhdGlvbiBiZXR3ZWVuIHNhbXBsZXMgd2hlbiBlc3RpbWF0aW5nIHZlbG9jaXR5LgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IE1JTl9EVVJBVElPTiA9IDEwICogMTAwMDAwMDsgLy8gMTAgbXMKIApAQCAtNjc0LDYgKzY2OSw4NyBAQAogICAgIGludDMyX3QgbUFjdGl2ZVBvaW50ZXJJZDsKIH07CiAKKworLyoKKyAqIFNwZWNpZmllcyBwYXJhbWV0ZXJzIHRoYXQgZ292ZXJuIHBvaW50ZXIgb3Igd2hlZWwgYWNjZWxlcmF0aW9uLgorICovCitzdHJ1Y3QgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyB7CisgICAgLy8gQSBzY2FsZSBmYWN0b3IgdGhhdCBpcyBtdWx0aXBsaWVkIHdpdGggdGhlIHJhdyB2ZWxvY2l0eSBkZWx0YXMKKyAgICAvLyBwcmlvciB0byBhcHBseWluZyBhbnkgb3RoZXIgdmVsb2NpdHkgY29udHJvbCBmYWN0b3JzLiAgVGhlIHNjYWxlCisgICAgLy8gZmFjdG9yIHNob3VsZCBiZSB1c2VkIHRvIGFkYXB0IHRoZSBpbnB1dCBkZXZpY2UgcmVzb2x1dGlvbgorICAgIC8vIChlZy4gY291bnRzIHBlciBpbmNoKSB0byB0aGUgb3V0cHV0IGRldmljZSByZXNvbHV0aW9uIChlZy4gcGl4ZWxzIHBlciBpbmNoKS4KKyAgICAvLworICAgIC8vIE11c3QgYmUgYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAvLyBEZWZhdWx0IGlzIDEuMCAobm8gc2NhbGluZykuCisgICAgZmxvYXQgc2NhbGU7CisKKyAgICAvLyBUaGUgc2NhbGVkIHNwZWVkIGF0IHdoaWNoIGFjY2VsZXJhdGlvbiBiZWdpbnMgdG8gYmUgYXBwbGllZC4KKyAgICAvLyBUaGlzIHZhbHVlIGVzdGFibGlzaGVzIHRoZSB1cHBlciBib3VuZCBvZiBhIGxvdyBzcGVlZCByZWdpbWUgZm9yCisgICAgLy8gc21hbGwgcHJlY2lzZSBtb3Rpb25zIHRoYXQgYXJlIHBlcmZvcm1lZCB3aXRob3V0IGFueSBhY2NlbGVyYXRpb24uCisgICAgLy8KKyAgICAvLyBNdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLgorICAgIC8vIERlZmF1bHQgaXMgMC4wIChubyBsb3cgdGhyZXNob2xkKS4KKyAgICBmbG9hdCBsb3dUaHJlc2hvbGQ7CisKKyAgICAvLyBUaGUgc2NhbGVkIHNwZWVkIGF0IHdoaWNoIG1heGltdW0gYWNjZWxlcmF0aW9uIGlzIGFwcGxpZWQuCisgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoaWdoVGhyZXNob2xkIGFuZCBsb3dUaHJlc2hvbGQgY29udHJvbHMKKyAgICAvLyB0aGUgcmFuZ2Ugb2Ygc3BlZWRzIG92ZXIgd2hpY2ggdGhlIGFjY2VsZXJhdGlvbiBmYWN0b3IgaXMgaW50ZXJwb2xhdGVkLgorICAgIC8vIFRoZSB3aWRlciB0aGUgcmFuZ2UsIHRoZSBzbW9vdGhlciB0aGUgYWNjZWxlcmF0aW9uLgorICAgIC8vCisgICAgLy8gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbG93VGhyZXNob2xkLgorICAgIC8vIERlZmF1bHQgaXMgMC4wIChubyBoaWdoIHRocmVzaG9sZCkuCisgICAgZmxvYXQgaGlnaFRocmVzaG9sZDsKKworICAgIC8vIFRoZSBhY2NlbGVyYXRpb24gZmFjdG9yLgorICAgIC8vIFdoZW4gdGhlIHNwZWVkIGlzIGFib3ZlIHRoZSBsb3cgc3BlZWQgdGhyZXNob2xkLCB0aGUgdmVsb2NpdHkgd2lsbCBzY2FsZWQKKyAgICAvLyBieSBhbiBpbnRlcnBvbGF0ZWQgdmFsdWUgYmV0d2VlbiAxLjAgYW5kIHRoaXMgYW1vdW50LgorICAgIC8vCisgICAgLy8gTXVzdCBiZSBhIHBvc2l0aXZlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjAuCisgICAgLy8gRGVmYXVsdCBpcyAxLjAgKG5vIGFjY2VsZXJhdGlvbikuCisgICAgZmxvYXQgYWNjZWxlcmF0aW9uOworCisgICAgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycygpIDoKKyAgICAgICAgICAgIHNjYWxlKDEuMGYpLCBsb3dUaHJlc2hvbGQoMC4wZiksIGhpZ2hUaHJlc2hvbGQoMC4wZiksIGFjY2VsZXJhdGlvbigxLjBmKSB7CisgICAgfQorCisgICAgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyhmbG9hdCBzY2FsZSwgZmxvYXQgbG93VGhyZXNob2xkLAorICAgICAgICAgICAgZmxvYXQgaGlnaFRocmVzaG9sZCwgZmxvYXQgYWNjZWxlcmF0aW9uKSA6CisgICAgICAgICAgICBzY2FsZShzY2FsZSksIGxvd1RocmVzaG9sZChsb3dUaHJlc2hvbGQpLAorICAgICAgICAgICAgaGlnaFRocmVzaG9sZChoaWdoVGhyZXNob2xkKSwgYWNjZWxlcmF0aW9uKGFjY2VsZXJhdGlvbikgeworICAgIH0KK307CisKKy8qCisgKiBJbXBsZW1lbnRzIG1vdXNlIHBvaW50ZXIgYW5kIHdoZWVsIHNwZWVkIGNvbnRyb2wgYW5kIGFjY2VsZXJhdGlvbi4KKyAqLworY2xhc3MgVmVsb2NpdHlDb250cm9sIHsKK3B1YmxpYzoKKyAgICBWZWxvY2l0eUNvbnRyb2woKTsKKworICAgIC8qIFNldHMgdGhlIHZhcmlvdXMgcGFyYW1ldGVycy4gKi8KKyAgICB2b2lkIHNldFBhcmFtZXRlcnMoY29uc3QgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyYgcGFyYW1ldGVycyk7CisKKyAgICAvKiBSZXNldHMgdGhlIGN1cnJlbnQgbW92ZW1lbnQgY291bnRlcnMgdG8gemVyby4KKyAgICAgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIG51bGxpZnlpbmcgYW55IGFjY2VsZXJhdGlvbi4gKi8KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvKiBUcmFuc2xhdGVzIGEgcmF3IG1vdmVtZW50IGRlbHRhIGludG8gYW4gYXBwcm9wcmlhdGVseQorICAgICAqIHNjYWxlZCAvIGFjY2VsZXJhdGVkIGRlbHRhIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlbG9jaXR5LiAqLworICAgIHZvaWQgbW92ZShuc2Vjc190IGV2ZW50VGltZSwgZmxvYXQqIGRlbHRhWCwgZmxvYXQqIGRlbHRhWSk7CisKK3ByaXZhdGU6CisgICAgLy8gSWYgbm8gbW92ZW1lbnRzIGFyZSByZWNlaXZlZCB3aXRoaW4gdGhpcyBhbW91bnQgb2YgdGltZSwKKyAgICAvLyB3ZSBhc3N1bWUgdGhlIG1vdmVtZW50IGhhcyBzdG9wcGVkIGFuZCByZXNldCB0aGUgbW92ZW1lbnQgY291bnRlcnMuCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgU1RPUF9USU1FID0gNTAwICogMTAwMDAwMDsgLy8gNTAwIG1zCisKKyAgICBWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzIG1QYXJhbWV0ZXJzOworCisgICAgbnNlY3NfdCBtTGFzdE1vdmVtZW50VGltZTsKKyAgICBWZWxvY2l0eVRyYWNrZXI6OlBvc2l0aW9uIG1SYXdQb3NpdGlvbjsKKyAgICBWZWxvY2l0eVRyYWNrZXIgbVZlbG9jaXR5VHJhY2tlcjsKK307CisKKwogLyoKICAqIERlc2NyaWJlcyB0aGUgY2hhcmFjdGVyaXN0aWNzIGFuZCBjYXBhYmlsaXRpZXMgb2YgYW4gaW5wdXQgZGV2aWNlLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0Jsb2JDYWNoZS5oIGIvaW5jbHVkZS91dGlscy9CbG9iQ2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ1ZmYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91dGlscy9CbG9iQ2FjaGUuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9CTE9CX0NBQ0hFX0gKKyNkZWZpbmUgQU5EUk9JRF9CTE9CX0NBQ0hFX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBIEJsb2JDYWNoZSBpcyBhbiBpbi1tZW1vcnkgY2FjaGUgZm9yIGJpbmFyeSBrZXkvdmFsdWUgcGFpcnMuIEFsbCB0aGUgcHVibGljCisvLyBtZXRob2RzIGFyZSB0aHJlYWQtc2FmZS4KKy8vCisvLyBUaGUgY2FjaGUgY29udGVudHMgY2FuIGJlIHNlcmlhbGl6ZWQgdG8gYSBmaWxlIGFuZCByZWxvYWRlZCBpbiBhIHN1YnNlcXVlbnQKKy8vIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbS4gVGhpcyBzZXJpYWxpemF0aW9uIGlzIG5vbi1wb3J0YWJsZSBhbmQgc2hvdWxkIG9ubHkKKy8vIGJlIGxvYWRlZCBieSB0aGUgZGV2aWNlIHRoYXQgZ2VuZXJhdGVkIGl0LgorY2xhc3MgQmxvYkNhY2hlIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorCisgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGJsb2IgY2FjaGUuIFRoZSBibG9iIGNhY2hlIHdpbGwgY2FjaGUga2V5L3ZhbHVlIHBhaXJzCisgICAgLy8gd2l0aCBrZXkgYW5kIHZhbHVlIHNpemVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXhLZXlTaXplIGFuZAorICAgIC8vIG1heFZhbHVlU2l6ZSwgcmVzcGVjdGl2ZWx5LiBUaGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiBBTEwgY2FjaGUgZW50cmllcworICAgIC8vIChrZXkgc2l6ZXMgcGx1cyB2YWx1ZSBzaXplcykgd2lsbCBub3QgZXhjZWVkIG1heFRvdGFsU2l6ZS4KKyAgICBCbG9iQ2FjaGUoc2l6ZV90IG1heEtleVNpemUsIHNpemVfdCBtYXhWYWx1ZVNpemUsIHNpemVfdCBtYXhUb3RhbFNpemUpOworCisgICAgLy8gc2V0IGluc2VydHMgYSBuZXcgYmluYXJ5IHZhbHVlIGludG8gdGhlIGNhY2hlIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlCisgICAgLy8gZ2l2ZW4gYmluYXJ5IGtleS4gIElmIHRoZSBrZXkgb3IgdmFsdWUgYXJlIHRvbyBsYXJnZSBmb3IgdGhlIGNhY2hlIHRoZW4KKyAgICAvLyB0aGUgY2FjaGUgcmVtYWlucyB1bmNoYW5nZWQuICBUaGlzIGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIGEgZGlmZmVyZW50CisgICAgLy8gdmFsdWUgd2FzIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgLSB0aGUgb2xkIHZhbHVlIHdpbGwKKyAgICAvLyByZW1haW4gaW4gdGhlIGNhY2hlLiAgSWYgdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUgYXJlIHNtYWxsIGVub3VnaCB0byBiZQorICAgIC8vIHB1dCBpbiB0aGUgY2FjaGUgKGJhc2VkIG9uIHRoZSBtYXhLZXlTaXplLCBtYXhWYWx1ZVNpemUsIGFuZCBtYXhUb3RhbFNpemUKKyAgICAvLyB2YWx1ZXMgc3BlY2lmaWVkIHRvIHRoZSBCbG9iQ2FjaGUgY29uc3RydWN0b3IpLCB0aGVuIHRoZSBrZXkvdmFsdWUgcGFpcgorICAgIC8vIHdpbGwgYmUgaW4gdGhlIGNhY2hlIGFmdGVyIHNldCByZXR1cm5zLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBhIHN1YnNlcXVlbnQKKyAgICAvLyBjYWxsIHRvIHNldCBtYXkgZXZpY3Qgb2xkIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBjYWNoZS4KKyAgICAvLworICAgIC8vIFByZWNvbmRpdGlvbnM6CisgICAgLy8gICBrZXkgIT0gTlVMTAorICAgIC8vICAgMCA8IGtleVNpemUKKyAgICAvLyAgIHZhbHVlICE9IE5VTEwKKyAgICAvLyAgIDAgPCB2YWx1ZVNpemUKKyAgICB2b2lkIHNldChjb25zdCB2b2lkKiBrZXksIHNpemVfdCBrZXlTaXplLCBjb25zdCB2b2lkKiB2YWx1ZSwKKyAgICAgICAgICAgIHNpemVfdCB2YWx1ZVNpemUpOworCisgICAgLy8gVGhlIGdldCBmdW5jdGlvbiByZXRyaWV2ZXMgZnJvbSB0aGUgY2FjaGUgdGhlIGJpbmFyeSB2YWx1ZSBhc3NvY2lhdGVkCisgICAgLy8gd2l0aCBhIGdpdmVuIGJpbmFyeSBrZXkuICBJZiB0aGUga2V5IGlzIHByZXNlbnQgaW4gdGhlIGNhY2hlIHRoZW4gdGhlCisgICAgLy8gbGVuZ3RoIG9mIHRoZSBiaW5hcnkgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQga2V5IGlzIHJldHVybmVkLiAgSWYgdGhlCisgICAgLy8gdmFsdWUgYXJndW1lbnQgaXMgbm9uLU5VTEwgYW5kIHRoZSBzaXplIG9mIHRoZSBjYWNoZWQgdmFsdWUgaXMgbGVzcyB0aGFuCisgICAgLy8gdmFsdWVTaXplIGJ5dGVzIHRoZW4gdGhlIGNhY2hlZCB2YWx1ZSBpcyBjb3BpZWQgaW50byB0aGUgYnVmZmVyIHBvaW50ZWQKKyAgICAvLyB0byBieSB0aGUgdmFsdWUgYXJndW1lbnQuICBJZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBjYWNoZSB0aGVuIDAKKyAgICAvLyBpcyByZXR1cm5lZCBhbmQgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoZSB2YWx1ZSBhcmd1bWVudCBpcyBub3QKKyAgICAvLyBtb2RpZmllZC4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCB3aGVuIGNhbGxpbmcgZ2V0IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUga2V5LCB0aGUgbGF0ZXIKKyAgICAvLyBjYWxscyBtYXkgZmFpbCwgcmV0dXJuaW5nIDAsIGV2ZW4gaWYgZWFybGllciBjYWxscyBzdWNjZWVkZWQuICBUaGUgcmV0dXJuCisgICAgLy8gdmFsdWUgbXVzdCBiZSBjaGVja2VkIGZvciBlYWNoIGNhbGwuCisgICAgLy8KKyAgICAvLyBQcmVjb25kaXRpb25zOgorICAgIC8vICAga2V5ICE9IE5VTEwKKyAgICAvLyAgIDAgPCBrZXlTaXplCisgICAgLy8gICAwIDw9IHZhbHVlU2l6ZQorICAgIHNpemVfdCBnZXQoY29uc3Qgdm9pZCoga2V5LCBzaXplX3Qga2V5U2l6ZSwgdm9pZCogdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpOworCitwcml2YXRlOgorICAgIC8vIENvcHlpbmcgaXMgZGlzYWxsb3dlZC4KKyAgICBCbG9iQ2FjaGUoY29uc3QgQmxvYkNhY2hlJik7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQmxvYkNhY2hlJik7CisKKyAgICAvLyBBIHJhbmRvbSBmdW5jdGlvbiBoZWxwZXIgdG8gZ2V0IGFyb3VuZCBNaW5HVyBub3QgaGF2aW5nIG5yYW5kNDgoKQorICAgIGxvbmcgaW50IGJsb2JfcmFuZG9tKCk7CisKKyAgICAvLyBjbGVhbiBldmljdHMgYSByYW5kb21seSBjaG9zZW4gc2V0IG9mIGVudHJpZXMgZnJvbSB0aGUgY2FjaGUgc3VjaCB0aGF0CisgICAgLy8gdGhlIHRvdGFsIHNpemUgb2YgYWxsIHJlbWFpbmluZyBlbnRyaWVzIGlzIGxlc3MgdGhhbiBtTWF4VG90YWxTaXplLzIuCisgICAgdm9pZCBjbGVhbigpOworCisgICAgLy8gaXNDbGVhbmFibGUgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWNoZSBpcyBmdWxsIGVub3VnaCBmb3IgdGhlIGNsZWFuIG1ldGhvZAorICAgIC8vIHRvIGhhdmUgc29tZSBlZmZlY3QsIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBpc0NsZWFuYWJsZSgpIGNvbnN0OworCisgICAgLy8gQSBCbG9iIGlzIGFuIGltbXV0YWJsZSBzaXplZCB1bnN0cnVjdHVyZWQgZGF0YSBibG9iLgorICAgIGNsYXNzIEJsb2IgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBCbG9iKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCBib29sIGNvcHlEYXRhKTsKKyAgICAgICAgfkJsb2IoKTsKKworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBCbG9iJiByaHMpIGNvbnN0OworCisgICAgICAgIGNvbnN0IHZvaWQqIGdldERhdGEoKSBjb25zdDsKKyAgICAgICAgc2l6ZV90IGdldFNpemUoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIENvcHlpbmcgaXMgbm90IGFsbG93ZWQuCisgICAgICAgIEJsb2IoY29uc3QgQmxvYiYpOworICAgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBCbG9iJik7CisKKyAgICAgICAgLy8gbURhdGEgcG9pbnRzIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgYmxvYiBkYXRhLgorICAgICAgICBjb25zdCB2b2lkKiBtRGF0YTsKKworICAgICAgICAvLyBtU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYmxvYiBkYXRhIGluIGJ5dGVzLgorICAgICAgICBzaXplX3QgbVNpemU7CisKKyAgICAgICAgLy8gbU93bnNEYXRhIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGlzIEJsb2Igb2JqZWN0IHNob3VsZCBmcmVlIHRoZQorICAgICAgICAvLyBtZW1vcnkgcG9pbnRlZCB0byBieSBtRGF0YSB3aGVuIHRoZSBCbG9iIGdldHMgZGVzdHJ1Y3RlZC4KKyAgICAgICAgYm9vbCBtT3duc0RhdGE7CisgICAgfTsKKworICAgIC8vIEEgQ2FjaGVFbnRyeSBpcyBhIHNpbmdsZSBrZXkvdmFsdWUgcGFpciBpbiB0aGUgY2FjaGUuCisgICAgY2xhc3MgQ2FjaGVFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgICBDYWNoZUVudHJ5KCk7CisgICAgICAgIENhY2hlRW50cnkoY29uc3Qgc3A8QmxvYj4mIGtleSwgY29uc3Qgc3A8QmxvYj4mIHZhbHVlKTsKKyAgICAgICAgQ2FjaGVFbnRyeShjb25zdCBDYWNoZUVudHJ5JiBjZSk7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2FjaGVFbnRyeSYgcmhzKSBjb25zdDsKKyAgICAgICAgY29uc3QgQ2FjaGVFbnRyeSYgb3BlcmF0b3I9KGNvbnN0IENhY2hlRW50cnkmKTsKKworICAgICAgICBzcDxCbG9iPiBnZXRLZXkoKSBjb25zdDsKKyAgICAgICAgc3A8QmxvYj4gZ2V0VmFsdWUoKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldFZhbHVlKGNvbnN0IHNwPEJsb2I+JiB2YWx1ZSk7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIC8vIG1LZXkgaXMgdGhlIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIGNhY2hlIGVudHJ5LgorICAgICAgICBzcDxCbG9iPiBtS2V5OworCisgICAgICAgIC8vIG1WYWx1ZSBpcyB0aGUgY2FjaGVkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCisgICAgICAgIHNwPEJsb2I+IG1WYWx1ZTsKKyAgICB9OworCisgICAgLy8gbU1heEtleVNpemUgaXMgdGhlIG1heGltdW0ga2V5IHNpemUgdGhhdCB3aWxsIGJlIGNhY2hlZC4gQ2FsbHMgdG8KKyAgICAvLyBCbG9iQ2FjaGU6OnNldCB3aXRoIGEga2V5U2l6ZSBwYXJhbWV0ZXIgbGFyZ2VyIHRoYW4gbU1heEtleVNpemUgd2lsbAorICAgIC8vIHNpbXBseSBub3QgYWRkIHRoZSBrZXkvdmFsdWUgcGFpciB0byB0aGUgY2FjaGUuCisgICAgY29uc3Qgc2l6ZV90IG1NYXhLZXlTaXplOworCisgICAgLy8gbU1heFZhbHVlU2l6ZSBpcyB0aGUgbWF4aW11bSB2YWx1ZSBzaXplIHRoYXQgd2lsbCBiZSBjYWNoZWQuIENhbGxzIHRvCisgICAgLy8gQmxvYkNhY2hlOjpzZXQgd2l0aCBhIHZhbHVlU2l6ZSBwYXJhbWV0ZXIgbGFyZ2VyIHRoYW4gbU1heFZhbHVlU2l6ZSB3aWxsCisgICAgLy8gc2ltcGx5IG5vdCBhZGQgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBjYWNoZS4KKyAgICBjb25zdCBzaXplX3QgbU1heFZhbHVlU2l6ZTsKKworICAgIC8vIG1NYXhUb3RhbFNpemUgaXMgdGhlIG1heGltdW0gc2l6ZSB0aGF0IGFsbCBjYWNoZSBlbnRyaWVzIGNhbiBvY2N1cHkuIFRoaXMKKyAgICAvLyBpbmNsdWRlcyBzcGFjZSBmb3IgYm90aCBrZXlzIGFuZCB2YWx1ZXMuIFdoZW4gYSBjYWxsIHRvIEJsb2JDYWNoZTo6c2V0CisgICAgLy8gd291bGQgb3RoZXJ3aXNlIGNhdXNlIHRoaXMgbGltaXQgdG8gYmUgZXhjZWVkZWQsIGVpdGhlciB0aGUga2V5L3ZhbHVlCisgICAgLy8gcGFpciBwYXNzZWQgdG8gQmxvYkNhY2hlOjpzZXQgd2lsbCBub3QgYmUgY2FjaGVkIG9yIG90aGVyIGNhY2hlIGVudHJpZXMKKyAgICAvLyB3aWxsIGJlIGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IGVudHJ5LgorICAgIGNvbnN0IHNpemVfdCBtTWF4VG90YWxTaXplOworCisgICAgLy8gbVRvdGFsU2l6ZSBpcyB0aGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiBhbGwga2V5cyBhbmQgdmFsdWVzIGN1cnJlbnRseSBpbgorICAgIC8vIHRoZSBjYWNoZS4KKyAgICBzaXplX3QgbVRvdGFsU2l6ZTsKKworICAgIC8vIG1SYW5kU3RhdGUgaXMgdGhlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzdGF0ZS4gSXQgaXMgcGFzc2VkIHRvCisgICAgLy8gbnJhbmQ0OCB0byBnZW5lcmF0ZSByYW5kb20gbnVtYmVycyB3aGVuIG5lZWRlZC4gSXQgbXVzdCBiZSBwcm90ZWN0ZWQgYnkKKyAgICAvLyBtTXV0ZXguCisgICAgdW5zaWduZWQgc2hvcnQgbVJhbmRTdGF0ZVszXTsKKworICAgIC8vIG1DYWNoZUVudHJpZXMgc3RvcmVzIGFsbCB0aGUgY2FjaGUgZW50cmllcyB0aGF0IGFyZSByZXNpZGVudCBpbiBtZW1vcnkuCisgICAgLy8gQ2FjaGUgZW50cmllcyBhcmUgYWRkZWQgdG8gaXQgYnkgdGhlICdzZXQnIG1ldGhvZC4KKyAgICBTb3J0ZWRWZWN0b3I8Q2FjaGVFbnRyeT4gbUNhY2hlRW50cmllczsKKworICAgIC8vIG1NdXRleCBpcyB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBhbGwgbWVtYmVyIHZhcmlhYmxlcy4gIEl0IG11c3QgYmUKKyAgICAvLyBsb2NrZWQgYW55IHRpbWUgdGhlIG1lbWJlciB2YXJpYWJsZXMgYXJlIHdyaXR0ZW4gb3IgcmVhZC4KKyAgICBNdXRleCBtTXV0ZXg7Cit9OworCit9CisKKyNlbmRpZiAvLyBBTkRST0lEX0JMT0JfQ0FDSEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9SZWZCYXNlLmggYi9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaAppbmRleCA0MTI2MjI1Li5jYTE3MDgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaAorKysgYi9pbmNsdWRlL3V0aWxzL1JlZkJhc2UuaApAQCAtMTE2LDE3ICsxMTYsMjQgQEAKIAogICAgIHR5cGVkZWYgUmVmQmFzZSBiYXNldHlwZTsKIAorICAgIC8vIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIFJlZkJhc2UgZGVzdHJ1Y3Rpb24uCisgICAgY2xhc3MgRGVzdHJveWVyIHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFJlZkJhc2U7CisgICAgICAgIGZyaWVuZCBjbGFzcyB3ZWFrcmVmX3R5cGU7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5EZXN0cm95ZXIoKTsKKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveShSZWZCYXNlIGNvbnN0KiBiYXNlKSA9IDA7CisgICAgfTsKKworICAgIC8vIE1ha2Ugc3VyZSB0byBuZXZlciBhY3F1aXJlIGEgc3Ryb25nIHJlZmVyZW5jZSBmcm9tIHRoaXMgZnVuY3Rpb24uIFRoZQorICAgIC8vIHNhbWUgcmVzdHJpY3Rpb25zIHRoYW4gZm9yIGRlc3RydWN0b3JzIGFwcGx5LgorICAgIHZvaWQgc2V0RGVzdHJveWVyKERlc3Ryb3llciogZGVzdHJveWVyKTsKKwogcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZkJhc2UoKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+UmVmQmFzZSgpOwogCi0gICAgLy8gY2FsbGVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMgYXdheS4gdGhpcyBpcyByZXNwb25zaWJsZSBmb3IKLSAgICAvLyBjYWxsaW5nIHRoZSBkZXN0cnVjdG9yLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGRvZXMKLSAgICAvLyAiZGVsZXRlIHRoaXM7Ii4KLSAgICAvLyBNYWtlIHN1cmUgdG8gbmV2ZXIgYWNxdWlyZSBhIHN0cm9uZyByZWZlcmVuY2UgZnJvbSB0aGlzIGZ1bmN0aW9uLiBUaGUKLSAgICAvLyBzYW1lIHJlc3RyaWN0aW9ucyB0aGFuIGZvciBkZXN0cnVjdG9ycyBhcHBseS4KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBkZXN0cm95KCkgY29uc3Q7Ci0KICAgICAvLyEgRmxhZ3MgZm9yIGV4dGVuZE9iamVjdExpZmV0aW1lKCkKICAgICBlbnVtIHsKICAgICAgICAgT0JKRUNUX0xJRkVUSU1FX1dFQUsgICAgPSAweDAwMDEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1Jlc291cmNlVHlwZXMuaCBiL2luY2x1ZGUvdXRpbHMvUmVzb3VyY2VUeXBlcy5oCmluZGV4IDJjN2NmNzUuLjYxMmZmOTM0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKKysrIGIvaW5jbHVkZS91dGlscy9SZXNvdXJjZVR5cGVzLmgKQEAgLTg0MSw2ICs4NDEsNyBAQAogICAgICAgICBERU5TSVRZX0RFRkFVTFQgPSBBQ09ORklHVVJBVElPTl9ERU5TSVRZX0RFRkFVTFQsCiAgICAgICAgIERFTlNJVFlfTE9XID0gQUNPTkZJR1VSQVRJT05fREVOU0lUWV9MT1csCiAgICAgICAgIERFTlNJVFlfTUVESVVNID0gQUNPTkZJR1VSQVRJT05fREVOU0lUWV9NRURJVU0sCisgICAgICAgIERFTlNJVFlfVFYgPSBBQ09ORklHVVJBVElPTl9ERU5TSVRZX1RWLAogICAgICAgICBERU5TSVRZX0hJR0ggPSBBQ09ORklHVVJBVElPTl9ERU5TSVRZX0hJR0gsCiAgICAgICAgIERFTlNJVFlfTk9ORSA9IEFDT05GSUdVUkFUSU9OX0RFTlNJVFlfTk9ORQogICAgIH07CkBAIC0xNDUyLDI0ICsxNDUzLDIwIEBACiAgICAgLy8gc2V0dGluZ3MgaXMgdGhlIHJlcXVlc3RlZCBzZXR0aW5ncwogICAgIGlubGluZSBib29sIG1hdGNoKGNvbnN0IFJlc1RhYmxlX2NvbmZpZyYgc2V0dGluZ3MpIGNvbnN0IHsKICAgICAgICAgaWYgKGltc2kgIT0gMCkgewotICAgICAgICAgICAgaWYgKChzZXR0aW5ncy5tY2MgIT0gMCAmJiBtY2MgIT0gMAotICAgICAgICAgICAgICAgICAmJiBtY2MgIT0gc2V0dGluZ3MubWNjKSB8fCAKLSAgICAgICAgICAgICAgICAoc2V0dGluZ3MubWNjID09IDAgJiYgbWNjICE9IDApKSB7CisgICAgICAgICAgICBpZiAobWNjICE9IDAgJiYgbWNjICE9IHNldHRpbmdzLm1jYykgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoc2V0dGluZ3MubW5jICE9IDAgJiYgbW5jICE9IDAKLSAgICAgICAgICAgICAgICAgJiYgbW5jICE9IHNldHRpbmdzLm1uYykgfHwKLSAgICAgICAgICAgICAgICAoc2V0dGluZ3MubW5jID09IDAgJiYgbW5jICE9IDApKSB7CisgICAgICAgICAgICBpZiAobW5jICE9IDAgJiYgbW5jICE9IHNldHRpbmdzLm1uYykgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobG9jYWxlICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5sYW5ndWFnZVswXSAhPSAwICYmIGxhbmd1YWdlWzBdICE9IDAKKyAgICAgICAgICAgIGlmIChsYW5ndWFnZVswXSAhPSAwCiAgICAgICAgICAgICAgICAgJiYgKGxhbmd1YWdlWzBdICE9IHNldHRpbmdzLmxhbmd1YWdlWzBdCiAgICAgICAgICAgICAgICAgICAgIHx8IGxhbmd1YWdlWzFdICE9IHNldHRpbmdzLmxhbmd1YWdlWzFdKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jb3VudHJ5WzBdICE9IDAgJiYgY291bnRyeVswXSAhPSAwCisgICAgICAgICAgICBpZiAoY291bnRyeVswXSAhPSAwCiAgICAgICAgICAgICAgICAgJiYgKGNvdW50cnlbMF0gIT0gc2V0dGluZ3MuY291bnRyeVswXQogICAgICAgICAgICAgICAgICAgICB8fCBjb3VudHJ5WzFdICE9IHNldHRpbmdzLmNvdW50cnlbMV0pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQ4MCw2NiArMTQ3Nyw1NiBAQAogICAgICAgICAgICAgY29uc3QgaW50IHNldFNjcmVlblNpemUgPSBzZXR0aW5ncy5zY3JlZW5MYXlvdXQmTUFTS19TQ1JFRU5TSVpFOwogICAgICAgICAgICAgLy8gQW55IHNjcmVlbiBzaXplcyBmb3IgbGFyZ2VyIHNjcmVlbnMgdGhhbiB0aGUgc2V0dGluZyBkbyBub3QKICAgICAgICAgICAgIC8vIG1hdGNoLgotICAgICAgICAgICAgaWYgKChzZXRTY3JlZW5TaXplICE9IDAgJiYgc2NyZWVuU2l6ZSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHNjcmVlblNpemUgPiBzZXRTY3JlZW5TaXplKSB8fAotICAgICAgICAgICAgICAgICAgICAoc2V0U2NyZWVuU2l6ZSA9PSAwICYmIHNjcmVlblNpemUgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChzY3JlZW5TaXplICE9IDAgJiYgc2NyZWVuU2l6ZSA+IHNldFNjcmVlblNpemUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGNvbnN0IGludCBzY3JlZW5Mb25nID0gc2NyZWVuTGF5b3V0Jk1BU0tfU0NSRUVOTE9ORzsKICAgICAgICAgICAgIGNvbnN0IGludCBzZXRTY3JlZW5Mb25nID0gc2V0dGluZ3Muc2NyZWVuTGF5b3V0Jk1BU0tfU0NSRUVOTE9ORzsKLSAgICAgICAgICAgIGlmIChzZXRTY3JlZW5Mb25nICE9IDAgJiYgc2NyZWVuTG9uZyAhPSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHNjcmVlbkxvbmcgIT0gc2V0U2NyZWVuTG9uZykgeworICAgICAgICAgICAgaWYgKHNjcmVlbkxvbmcgIT0gMCAmJiBzY3JlZW5Mb25nICE9IHNldFNjcmVlbkxvbmcpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNvbnN0IGludCB1aU1vZGVUeXBlID0gdWlNb2RlJk1BU0tfVUlfTU9ERV9UWVBFOwogICAgICAgICAgICAgY29uc3QgaW50IHNldFVpTW9kZVR5cGUgPSBzZXR0aW5ncy51aU1vZGUmTUFTS19VSV9NT0RFX1RZUEU7Ci0gICAgICAgICAgICBpZiAoc2V0VWlNb2RlVHlwZSAhPSAwICYmIHVpTW9kZVR5cGUgIT0gMAotICAgICAgICAgICAgICAgICAgICAmJiB1aU1vZGVUeXBlICE9IHNldFVpTW9kZVR5cGUpIHsKKyAgICAgICAgICAgIGlmICh1aU1vZGVUeXBlICE9IDAgJiYgdWlNb2RlVHlwZSAhPSBzZXRVaU1vZGVUeXBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjb25zdCBpbnQgdWlNb2RlTmlnaHQgPSB1aU1vZGUmTUFTS19VSV9NT0RFX05JR0hUOwogICAgICAgICAgICAgY29uc3QgaW50IHNldFVpTW9kZU5pZ2h0ID0gc2V0dGluZ3MudWlNb2RlJk1BU0tfVUlfTU9ERV9OSUdIVDsKLSAgICAgICAgICAgIGlmIChzZXRVaU1vZGVOaWdodCAhPSAwICYmIHVpTW9kZU5pZ2h0ICE9IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgdWlNb2RlTmlnaHQgIT0gc2V0VWlNb2RlTmlnaHQpIHsKKyAgICAgICAgICAgIGlmICh1aU1vZGVOaWdodCAhPSAwICYmIHVpTW9kZU5pZ2h0ICE9IHNldFVpTW9kZU5pZ2h0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc21hbGxlc3RTY3JlZW5XaWR0aERwICE9IDAgJiYgc21hbGxlc3RTY3JlZW5XaWR0aERwICE9IDAKKyAgICAgICAgICAgIGlmIChzbWFsbGVzdFNjcmVlbldpZHRoRHAgIT0gMAogICAgICAgICAgICAgICAgICAgICAmJiBzbWFsbGVzdFNjcmVlbldpZHRoRHAgPiBzZXR0aW5ncy5zbWFsbGVzdFNjcmVlbldpZHRoRHApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNjcmVlblNpemVEcCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc2NyZWVuV2lkdGhEcCAhPSAwICYmIHNjcmVlbldpZHRoRHAgIT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBzY3JlZW5XaWR0aERwID4gc2V0dGluZ3Muc2NyZWVuV2lkdGhEcCkgeworICAgICAgICAgICAgaWYgKHNjcmVlbldpZHRoRHAgIT0gMCAmJiBzY3JlZW5XaWR0aERwID4gc2V0dGluZ3Muc2NyZWVuV2lkdGhEcCkgewogICAgICAgICAgICAgICAgIC8vTE9HSSgiRmlsdGVyaW5nIG91dCB3aWR0aCAlZCBpbiByZXF1ZXN0ZWQgJWQiLCBzY3JlZW5XaWR0aERwLCBzZXR0aW5ncy5zY3JlZW5XaWR0aERwKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc2NyZWVuSGVpZ2h0RHAgIT0gMCAmJiBzY3JlZW5IZWlnaHREcCAhPSAwCi0gICAgICAgICAgICAgICAgICAgICYmIHNjcmVlbkhlaWdodERwID4gc2V0dGluZ3Muc2NyZWVuSGVpZ2h0RHApIHsKKyAgICAgICAgICAgIGlmIChzY3JlZW5IZWlnaHREcCAhPSAwICYmIHNjcmVlbkhlaWdodERwID4gc2V0dGluZ3Muc2NyZWVuSGVpZ2h0RHApIHsKICAgICAgICAgICAgICAgICAvL0xPR0koIkZpbHRlcmluZyBvdXQgaGVpZ2h0ICVkIGluIHJlcXVlc3RlZCAlZCIsIHNjcmVlbkhlaWdodERwLCBzZXR0aW5ncy5zY3JlZW5IZWlnaHREcCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzY3JlZW5UeXBlICE9IDApIHsKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5vcmllbnRhdGlvbiAhPSAwICYmIG9yaWVudGF0aW9uICE9IDAKLSAgICAgICAgICAgICAgICAmJiBvcmllbnRhdGlvbiAhPSBzZXR0aW5ncy5vcmllbnRhdGlvbikgeworICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9IDAgJiYgb3JpZW50YXRpb24gIT0gc2V0dGluZ3Mub3JpZW50YXRpb24pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBkZW5zaXR5IGFsd2F5cyBtYXRjaGVzIC0gd2UgY2FuIHNjYWxlIGl0LiAgU2VlIGlzQmV0dGVyVGhhbgotICAgICAgICAgICAgaWYgKHNldHRpbmdzLnRvdWNoc2NyZWVuICE9IDAgJiYgdG91Y2hzY3JlZW4gIT0gMAotICAgICAgICAgICAgICAgICYmIHRvdWNoc2NyZWVuICE9IHNldHRpbmdzLnRvdWNoc2NyZWVuKSB7CisgICAgICAgICAgICBpZiAodG91Y2hzY3JlZW4gIT0gMCAmJiB0b3VjaHNjcmVlbiAhPSBzZXR0aW5ncy50b3VjaHNjcmVlbikgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQgIT0gMCkgewogICAgICAgICAgICAgY29uc3QgaW50IGtleXNIaWRkZW4gPSBpbnB1dEZsYWdzJk1BU0tfS0VZU0hJRERFTjsKICAgICAgICAgICAgIGNvbnN0IGludCBzZXRLZXlzSGlkZGVuID0gc2V0dGluZ3MuaW5wdXRGbGFncyZNQVNLX0tFWVNISURERU47Ci0gICAgICAgICAgICBpZiAoc2V0S2V5c0hpZGRlbiAhPSAwICYmIGtleXNIaWRkZW4gIT0gMAotICAgICAgICAgICAgICAgICYmIGtleXNIaWRkZW4gIT0gc2V0S2V5c0hpZGRlbikgeworICAgICAgICAgICAgaWYgKGtleXNIaWRkZW4gIT0gMCAmJiBrZXlzSGlkZGVuICE9IHNldEtleXNIaWRkZW4pIHsKICAgICAgICAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSwgd2UgY291bnQgYSByZXF1ZXN0IGZvciBLRVlTSElEREVOX05PIGFzIGFsc28KICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyB0aGUgbW9yZSByZWNlbnQgS0VZU0hJRERFTl9TT0ZULiAgQmFzaWNhbGx5CiAgICAgICAgICAgICAgICAgLy8gS0VZU0hJRERFTl9OTyBtZWFucyB0aGVyZSBpcyBzb21lIGtpbmQgb2Yga2V5Ym9hcmQgYXZhaWxhYmxlLgpAQCAtMTU1MSwzNiArMTUzOCwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29uc3QgaW50IG5hdkhpZGRlbiA9IGlucHV0RmxhZ3MmTUFTS19OQVZISURERU47CiAgICAgICAgICAgICBjb25zdCBpbnQgc2V0TmF2SGlkZGVuID0gc2V0dGluZ3MuaW5wdXRGbGFncyZNQVNLX05BVkhJRERFTjsKLSAgICAgICAgICAgIGlmIChzZXROYXZIaWRkZW4gIT0gMCAmJiBuYXZIaWRkZW4gIT0gMAotICAgICAgICAgICAgICAgICYmIG5hdkhpZGRlbiAhPSBzZXROYXZIaWRkZW4pIHsKKyAgICAgICAgICAgIGlmIChuYXZIaWRkZW4gIT0gMCAmJiBuYXZIaWRkZW4gIT0gc2V0TmF2SGlkZGVuKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNldHRpbmdzLmtleWJvYXJkICE9IDAgJiYga2V5Ym9hcmQgIT0gMAotICAgICAgICAgICAgICAgICYmIGtleWJvYXJkICE9IHNldHRpbmdzLmtleWJvYXJkKSB7CisgICAgICAgICAgICBpZiAoa2V5Ym9hcmQgIT0gMCAmJiBrZXlib2FyZCAhPSBzZXR0aW5ncy5rZXlib2FyZCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5uYXZpZ2F0aW9uICE9IDAgJiYgbmF2aWdhdGlvbiAhPSAwCi0gICAgICAgICAgICAgICAgJiYgbmF2aWdhdGlvbiAhPSBzZXR0aW5ncy5uYXZpZ2F0aW9uKSB7CisgICAgICAgICAgICBpZiAobmF2aWdhdGlvbiAhPSAwICYmIG5hdmlnYXRpb24gIT0gc2V0dGluZ3MubmF2aWdhdGlvbikgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc2NyZWVuU2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc2NyZWVuV2lkdGggIT0gMCAmJiBzY3JlZW5XaWR0aCAhPSAwCi0gICAgICAgICAgICAgICAgJiYgc2NyZWVuV2lkdGggPiBzZXR0aW5ncy5zY3JlZW5XaWR0aCkgeworICAgICAgICAgICAgaWYgKHNjcmVlbldpZHRoICE9IDAgJiYgc2NyZWVuV2lkdGggPiBzZXR0aW5ncy5zY3JlZW5XaWR0aCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zY3JlZW5IZWlnaHQgIT0gMCAmJiBzY3JlZW5IZWlnaHQgIT0gMAotICAgICAgICAgICAgICAgICYmIHNjcmVlbkhlaWdodCA+IHNldHRpbmdzLnNjcmVlbkhlaWdodCkgeworICAgICAgICAgICAgaWYgKHNjcmVlbkhlaWdodCAhPSAwICYmIHNjcmVlbkhlaWdodCA+IHNldHRpbmdzLnNjcmVlbkhlaWdodCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAodmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc2RrVmVyc2lvbiAhPSAwICYmIHNka1ZlcnNpb24gIT0gMAotICAgICAgICAgICAgICAgICYmIHNka1ZlcnNpb24gPiBzZXR0aW5ncy5zZGtWZXJzaW9uKSB7CisgICAgICAgICAgICBpZiAoc2RrVmVyc2lvbiAhPSAwICYmIHNka1ZlcnNpb24gPiBzZXR0aW5ncy5zZGtWZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNldHRpbmdzLm1pbm9yVmVyc2lvbiAhPSAwICYmIG1pbm9yVmVyc2lvbiAhPSAwCi0gICAgICAgICAgICAgICAgJiYgbWlub3JWZXJzaW9uICE9IHNldHRpbmdzLm1pbm9yVmVyc2lvbikgeworICAgICAgICAgICAgaWYgKG1pbm9yVmVyc2lvbiAhPSAwICYmIG1pbm9yVmVyc2lvbiAhPSBzZXR0aW5ncy5taW5vclZlcnNpb24pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwMDgsNyArMTk4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYqIG91dE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYqIGRlZlR5cGUgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2KiBkZWZQYWNrYWdlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogb3V0RXJyb3JNc2cgPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogb3V0RXJyb3JNc2cgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dFB1YmxpY09ubHkgPSBOVUxMKTsKIAogICAgIHN0YXRpYyBib29sIHN0cmluZ1RvSW50KGNvbnN0IGNoYXIxNl90KiBzLCBzaXplX3QgbGVuLCBSZXNfdmFsdWUqIG91dFZhbHVlKTsKICAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0Zsb2F0KGNvbnN0IGNoYXIxNl90KiBzLCBzaXplX3QgbGVuLCBSZXNfdmFsdWUqIG91dFZhbHVlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvdGhyZWFkcy5oIGIvaW5jbHVkZS91dGlscy90aHJlYWRzLmgKaW5kZXggNDFlNTc2Ni4uMGJkNjljZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91dGlscy90aHJlYWRzLmgKKysrIGIvaW5jbHVkZS91dGlscy90aHJlYWRzLmgKQEAgLTUyNiw2ICs1MjYsNyBAQAogICAgIFRocmVhZCYgb3BlcmF0b3I9KGNvbnN0IFRocmVhZCYpOwogICAgIHN0YXRpYyAgaW50ICAgICAgICAgICAgIF90aHJlYWRMb29wKHZvaWQqIHVzZXIpOwogICAgIGNvbnN0ICAgYm9vbCAgICAgICAgICAgIG1DYW5DYWxsSmF2YTsKKyAgICAvLyBhbHdheXMgaG9sZCBtTG9jayB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZwogICAgICAgICAgICAgdGhyZWFkX2lkX3QgICAgIG1UaHJlYWQ7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAgICAgICAgICAgICBDb25kaXRpb24gICAgICAgbVRocmVhZEV4aXRlZENvbmRpdGlvbjsKZGlmZiAtLWdpdCBhL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9DcmVkZW50aWFscy5qYXZhIGIva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0NyZWRlbnRpYWxzLmphdmEKaW5kZXggNmI2OWI4YS4uZmQ2YzIyYyAxMDA2NDQKLS0tIGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0NyZWRlbnRpYWxzLmphdmEKKysrIGIva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0NyZWRlbnRpYWxzLmphdmEKQEAgLTIwLDggKzIwLDE5IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCitpbXBvcnQgY29tLmFuZHJvaWQub3JnLmJvdW5jeWNhc3RsZS5vcGVuc3NsLlBFTVJlYWRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5vcmcuYm91bmN5Y2FzdGxlLm9wZW5zc2wuUEVNV3JpdGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgogICoge0BoaWRlfQpAQCAtNjAsNiArNzEsNDAgQEAKICAgICAvKiogRGF0YSB0eXBlIGZvciBQS0NTMTIuICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtDUzEyID0gIlBLQ1MxMiI7CiAKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG9iamVjdHMgdG8gYSBQRU0gZm9ybWF0LCB3aGljaCBpcyB1c2VkIGZvcgorICAgICAqIENBX0NFUlRJRklDQVRFLCBVU0VSX0NFUlRJRklDQVRFLCBhbmQgVVNFUl9QUklWQVRFX0tFWQorICAgICAqIGVudHJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gY29udmVydFRvUGVtKE9iamVjdC4uLiBvYmplY3RzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihiYW8sIENoYXJzZXRzLlVTX0FTQ0lJKTsKKyAgICAgICAgUEVNV3JpdGVyIHB3ID0gbmV3IFBFTVdyaXRlcih3cml0ZXIpOworICAgICAgICBmb3IgKE9iamVjdCBvIDogb2JqZWN0cykgeworICAgICAgICAgICAgcHcud3JpdGVPYmplY3Qobyk7CisgICAgICAgIH0KKyAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIGJhby50b0J5dGVBcnJheSgpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IG9iamVjdHMgZnJvbSBQRU0gZm9ybWF0LCB3aGljaCBpcyB1c2VkIGZvcgorICAgICAqIENBX0NFUlRJRklDQVRFLCBVU0VSX0NFUlRJRklDQVRFLCBhbmQgVVNFUl9QUklWQVRFX0tFWQorICAgICAqIGVudHJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gY29udmVydEZyb21QZW0oYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWkgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGJhaSwgQ2hhcnNldHMuVVNfQVNDSUkpOworICAgICAgICBQRU1SZWFkZXIgcHIgPSBuZXcgUEVNUmVhZGVyKHJlYWRlcik7CisKKyAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICBPYmplY3QgbzsKKyAgICAgICAgd2hpbGUgKChvID0gcHIucmVhZE9iamVjdCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKG8pOworICAgICAgICB9CisgICAgICAgIHByLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ3JlZGVudGlhbHMgc2luZ2xldG9uOwogCiAgICAgcHVibGljIHN0YXRpYyBDcmVkZW50aWFscyBnZXRJbnN0YW5jZSgpIHsKZGlmZiAtLWdpdCBhL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9JS2V5Q2hhaW5BbGlhc0NhbGxiYWNrLmFpZGwgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvSUtleUNoYWluQWxpYXNDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTk1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvSUtleUNoYWluQWxpYXNDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5OworCisvKioKKyAqIFVzZWQgYnkgdGhlIHtAY29kZSBLZXlDaGFpbkFjdGl2aXR5fSB0byByZXR1cm4gYWxpYXMgZm9yIHtAbGluayBLZXlTdG9yZSNjaG9vc2VBbGlhc30uCisgKgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElLZXlDaGFpbkFsaWFzQ2FsbGJhY2sgeworCisgICAgdm9pZCBhbGlhcyhTdHJpbmcgYWxpYXMpOworfQpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0lLZXlDaGFpbkFsaWFzUmVzcG9uc2UuYWlkbCBiL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9JS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDIwMDEuLjAwMDAwMDAKLS0tIGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0lLZXlDaGFpbkFsaWFzUmVzcG9uc2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5OwotCi0vKioKLSAqIFVzZWQgYnkgdGhlIHtAY29kZSBLZXlDaGFpbkFjdGl2aXR5fSB0byByZXR1cm4gYWxpYXMgZm9yIHtAbGluayBLZXlTdG9yZSNjaG9vc2VBbGlhc30uCi0gKgotICogQGhpZGUKLSAqLwotaW50ZXJmYWNlIElLZXlDaGFpbkFsaWFzUmVzcG9uc2UgewotCi0gICAgdm9pZCBhbGlhcyhTdHJpbmcgYWxpYXMpOwotfQpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0tleUNoYWluLmphdmEgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5Q2hhaW4uamF2YQppbmRleCBlYzgyMGNmLi40ZjE1OTZkIDEwMDY0NAotLS0gYS9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5Q2hhaW4uamF2YQorKysgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5Q2hhaW4uamF2YQpAQCAtMzQsNyArMzQsOSBAQAogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKQEAgLTQ2LDggKzQ4LDM2IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKIAogLyoqCi0gKiBAaGlkZQorICogVGhlIHtAY29kZSBLZXlDaGFpbn0gY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIHByaXZhdGUga2V5cyBhbmQKKyAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgY2VydGlmaWNhdGUgY2hhaW5zIGluIGNyZWRlbnRpYWwgc3RvcmFnZS4KKyAqCisgKiA8cD5BcHBsaWNhdGlvbnMgYWNjZXNzaW5nIHRoZSB7QGNvZGUgS2V5Q2hhaW59IG5vcm1hbGx5IGdvIHRocm91Z2gKKyAqIHRoZXNlIHN0ZXBzOgorICoKKyAqIDxvbD4KKyAqCisgKiA8bGk+UmVjZWl2ZSBhIGNhbGxiYWNrIGZyb20gYW4ge0BsaW5rIGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXIKKyAqIFg1MDlLZXlNYW5hZ2VyfSB0aGF0IGEgcHJpdmF0ZSBrZXkgaXMgcmVxdWVzdGVkLgorICoKKyAqIDxsaT5DYWxsIHtAbGluayAjY2hvb3NlUHJpdmF0ZUtleUFsaWFzCisgKiBjaG9vc2VQcml2YXRlS2V5QWxpYXN9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBmcm9tIGEKKyAqIGxpc3Qgb2YgY3VycmVudGx5IGF2YWlsYWJsZSBwcml2YXRlIGtleXMgYW5kIGNvcnJlc3BvbmRpbmcKKyAqIGNlcnRpZmljYXRlIGNoYWlucy4gVGhlIGNob3NlbiBhbGlhcyB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZQorICogY2FsbGJhY2sge0BsaW5rIEtleUNoYWluQWxpYXNDYWxsYmFjayNhbGlhc30sIG9yIG51bGwgaWYgbm8gcHJpdmF0ZQorICoga2V5IGlzIGF2YWlsYWJsZSBvciB0aGUgdXNlciBjYW5jZWxzIHRoZSByZXF1ZXN0LgorICoKKyAqIDxsaT5DYWxsIHtAbGluayAjZ2V0UHJpdmF0ZUtleX0gYW5kIHtAbGluayAjZ2V0Q2VydGlmaWNhdGVDaGFpbn0gdG8KKyAqIHJldHJpZXZlIHRoZSBjcmVkZW50aWFscyB0byByZXR1cm4gdG8gdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rCisgKiBqYXZheC5uZXQuc3NsLlg1MDlLZXlNYW5hZ2VyfSBjYWxsYmFja3MuCisgKgorICogPC9vbD4KKyAqCisgKiA8cD5BbiBhcHBsaWNhdGlvbiBtYXkgcmVtZW1iZXIgdGhlIHZhbHVlIG9mIGEgc2VsZWN0ZWQgYWxpYXMgdG8KKyAqIGF2b2lkIHByb21wdGluZyB0aGUgdXNlciB3aXRoIHtAbGluayAjY2hvb3NlUHJpdmF0ZUtleUFsaWFzCisgKiBjaG9vc2VQcml2YXRlS2V5QWxpYXN9IG9uIHN1YnNlcXVlbnQgY29ubmVjdGlvbnMuIElmIHRoZSBhbGlhcyBpcworICogbm8gbG9uZ2VyIHZhbGlkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgb24gbG9va3VwcyB1c2luZyB0aGF0IHZhbHVlCiAgKi8KKy8vIFRPRE8gcmVmZXJlbmNlIGludGVudCBmb3IgY3JlZGVudGlhbCBpbnN0YWxsYXRpb24gd2hlbiBwdWJsaWMKIHB1YmxpYyBmaW5hbCBjbGFzcyBLZXlDaGFpbiB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIktleUNoYWluIjsKQEAgLTY2LDkgKzk2LDU4IEBACiAgICAgICogTGF1bmNoZXMgYW4ge0Bjb2RlIEFjdGl2aXR5fSBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBhbGlhcwogICAgICAqIGZvciBhIHByaXZhdGUga2V5IGFuZCBjZXJ0aWZpY2F0ZSBwYWlyIGZvciBhdXRoZW50aWNhdGlvbi4gVGhlCiAgICAgICogc2VsZWN0ZWQgYWxpYXMgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkIHZpYSB0aGUKLSAgICAgKiBJS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlIGNhbGxiYWNrLgorICAgICAqIEtleUNoYWluQWxpYXNDYWxsYmFjayBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIDxwPntAY29kZSBrZXlUeXBlc30gYW5kIHtAY29kZSBpc3N1ZXJzfSBtYXkgYmUgdXNlZCB0bworICAgICAqIGhpZ2hsaWdodCBzdWdnZXN0ZWQgY2hvaWNlcyB0byB0aGUgdXNlciwgYWx0aG91Z2ggdG8gY29wZSB3aXRoCisgICAgICogc29tZXRpbWVzIGVycm9uZW91cyB2YWx1ZXMgcHJvdmlkZWQgYnkgc2VydmVycywgdGhlIHVzZXIgbWF5IGJlCisgICAgICogYWJsZSB0byBvdmVycmlkZSB0aGVzZSBzdWdnZXN0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPntAY29kZSBob3N0fSBhbmQge0Bjb2RlIHBvcnR9IG1heSBiZSB1c2VkIHRvIGdpdmUgdGhlIHVzZXIKKyAgICAgKiBtb3JlIGNvbnRleHQgYWJvdXQgdGhlIHNlcnZlciByZXF1ZXN0aW5nIHRoZSBjcmVkZW50aWFscy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gaG9sZCB0aGUgcGVybWlzc2lvbgorICAgICAqIHtAbGluayBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24jVVNFX0NSRURFTlRJQUxTfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpdml0eSBUaGUge0BsaW5rIEFjdGl2aXR5fSBjb250ZXh0IHRvIHVzZSBmb3IKKyAgICAgKiAgICAgbGF1bmNoaW5nIHRoZSBuZXcgc3ViLUFjdGl2aXR5IHRvIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QKKyAgICAgKiAgICAgYSBwcml2YXRlIGtleTsgdXNlZCBvbmx5IHRvIGNhbGwgc3RhcnRBY3Rpdml0eSgpOyBtdXN0IG5vdAorICAgICAqICAgICBiZSBudWxsLgorICAgICAqIEBwYXJhbSByZXNwb25zZSBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBjb21wbGV0ZXM7CisgICAgICogICAgIG11c3Qgbm90IGJlIG51bGwKKyAgICAgKiBAcGFyYW0ga2V5VHlwZXMgVGhlIGFjY2VwdGFibGUgdHlwZXMgb2YgYXN5bW1ldHJpYyBrZXlzIHN1Y2ggYXMKKyAgICAgKiAgICAgIlJTQSIgb3IgIkRTQSIsIG9yIGEgbnVsbCBhcnJheS4KKyAgICAgKiBAcGFyYW0gaXNzdWVycyBUaGUgYWNjZXB0YWJsZSBjZXJ0aWZpY2F0ZSBpc3N1ZXJzIGZvciB0aGUKKyAgICAgKiAgICAgY2VydGlmaWNhdGUgbWF0Y2hpbmcgdGhlIHByaXZhdGUga2V5LCBvciBudWxsLgorICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IG5hbWUgb2YgdGhlIHNlcnZlciByZXF1ZXN0aW5nIHRoZQorICAgICAqICAgICBjZXJ0aWZpY2F0ZSwgb3IgbnVsbCBpZiB1bmF2YWlsYWJsZS4KKyAgICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBudW1iZXIgb2YgdGhlIHNlcnZlciByZXF1ZXN0aW5nIHRoZQorICAgICAqICAgICBjZXJ0aWZpY2F0ZSwgb3IgLTEgaWYgdW5hdmFpbGFibGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNob29zZVByaXZhdGVLZXlBbGlhcyhBY3Rpdml0eSBhY3Rpdml0eSwgS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNob29zZVByaXZhdGVLZXlBbGlhcyhBY3Rpdml0eSBhY3Rpdml0eSwgS2V5Q2hhaW5BbGlhc0NhbGxiYWNrIHJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5VHlwZXMsIFByaW5jaXBhbFtdIGlzc3VlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVE9ETyBjdXJyZW50bHkga2V5VHlwZXMsIGlzc3VlcnMsIGhvc3QsIGFuZCBwb3J0IGFyZQorICAgICAgICAgKiB1bnVzZWQuIFRoZXkgYXJlIG1lYW50IHRvIGZvbGxvdyB0aGUgc2VtYW50aWNzIGFuZCBwdXJwb3NlCisgICAgICAgICAqIG9mIFg1MDlLZXlNYW5hZ2VyIG1ldGhvZCBhcmd1bWVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIGtleVR5cGVzIHdvdWxkIGFsbG93IHRoZSBsaXN0IHRvIGJlIGZpbHRlcmVkIGFuZCB0eXBpY2FsbHkKKyAgICAgICAgICogd2lsbCBiZSBzZXQgY29ycmVjdGx5IGJ5IHRoZSBzZXJ2ZXIuIEluIHByYWN0aWNlIHRvZGF5LAorICAgICAgICAgKiBtb3N0IGFsbCB1c2VycyB3aWxsIHdhbnQgb25seSBSU0EsIHJhcmVseSBEU0EsIGFuZCB1c3VhbGx5CisgICAgICAgICAqIG9ubHkgYSBzbWFsbCBudW1iZXIgb2YgY2VydHMgd2lsbCBiZSBhdmFpbGFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIGlzc3VlcnMgaXMgdHlwaWNhbGx5IG5vdCB1c2VmdWwuIFNvbWUgc2VydmVycyBoaXN0b3JpY2FsbHkKKyAgICAgICAgICogd2lsbCBzZW5kIHRoZSBlbnRpcmUgbGlzdCBvZiBwdWJsaWMgQ0FzIGtub3duIHRvIHRoZQorICAgICAgICAgKiBzZXJ2ZXIuIE90aGVycyB3aWxsIHNlbmQgbm9uZS4gSWYgdGhpcyBpcyB1c2VkLCBpZiB0aGVyZQorICAgICAgICAgKiBhcmUgbm8gbWF0Y2hlcyBhZnRlciBhcHBseWluZyB0aGUgY29uc3RyYWludCwgaXQgc2hvdWxkIGJlCisgICAgICAgICAqIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIGhvc3QgYW5kIHBvcnQgbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyIGlmIGF2YWlsYWJsZSwgYnV0IGl0CisgICAgICAgICAqIHNob3VsZCBiZSBjbGVhciB0aGF0IHRoZXkgYXJlIG5vdCB2YWxpZGF0ZWQgdmFsdWVzLCBwZXJoYXBzCisgICAgICAgICAqIHNob3duIGFsb25nIHdpdGggcmVxdWVzdGluZyBhcHBsaWNhdGlvbiBpZGVudGl0eSB0byBjbGFyaWZ5CisgICAgICAgICAqIHRoZSBzb3VyY2Ugb2YgdGhlIHJlcXVlc3QuCisgICAgICAgICAqLwogICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJhY3Rpdml0eSA9PSBudWxsIik7CiAgICAgICAgIH0KQEAgLTgwLDEwICsxNTksMTAgQEAKICAgICAgICAgYWN0aXZpdHkuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFsaWFzUmVzcG9uc2UgZXh0ZW5kcyBJS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlLlN0dWIgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFsaWFzUmVzcG9uc2UgZXh0ZW5kcyBJS2V5Q2hhaW5BbGlhc0NhbGxiYWNrLlN0dWIgewogICAgICAgICBwcml2YXRlIGZpbmFsIEFjdGl2aXR5IGFjdGl2aXR5OwotICAgICAgICBwcml2YXRlIGZpbmFsIEtleUNoYWluQWxpYXNSZXNwb25zZSBrZXlDaGFpbkFsaWFzUmVzcG9uc2U7Ci0gICAgICAgIHByaXZhdGUgQWxpYXNSZXNwb25zZShBY3Rpdml0eSBhY3Rpdml0eSwgS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlIGtleUNoYWluQWxpYXNSZXNwb25zZSkgeworICAgICAgICBwcml2YXRlIGZpbmFsIEtleUNoYWluQWxpYXNDYWxsYmFjayBrZXlDaGFpbkFsaWFzUmVzcG9uc2U7CisgICAgICAgIHByaXZhdGUgQWxpYXNSZXNwb25zZShBY3Rpdml0eSBhY3Rpdml0eSwgS2V5Q2hhaW5BbGlhc0NhbGxiYWNrIGtleUNoYWluQWxpYXNSZXNwb25zZSkgewogICAgICAgICAgICAgdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwogICAgICAgICAgICAgdGhpcy5rZXlDaGFpbkFsaWFzUmVzcG9uc2UgPSBrZXlDaGFpbkFsaWFzUmVzcG9uc2U7CiAgICAgICAgIH0KQEAgLTEwNCw5ICsxODMsOSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFsaWFzQWNjb3VudE1hbmFnZXJDYWxsYmFjayBpbXBsZW1lbnRzIEFjY291bnRNYW5hZ2VyQ2FsbGJhY2s8QnVuZGxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlIGtleUNoYWluQWxpYXNSZXNwb25zZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBLZXlDaGFpbkFsaWFzQ2FsbGJhY2sga2V5Q2hhaW5BbGlhc1Jlc3BvbnNlOwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbGlhczsKLSAgICAgICAgcHJpdmF0ZSBBbGlhc0FjY291bnRNYW5hZ2VyQ2FsbGJhY2soS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlIGtleUNoYWluQWxpYXNSZXNwb25zZSwKKyAgICAgICAgcHJpdmF0ZSBBbGlhc0FjY291bnRNYW5hZ2VyQ2FsbGJhY2soS2V5Q2hhaW5BbGlhc0NhbGxiYWNrIGtleUNoYWluQWxpYXNSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFsaWFzKSB7CiAgICAgICAgICAgICB0aGlzLmtleUNoYWluQWxpYXNSZXNwb25zZSA9IGtleUNoYWluQWxpYXNSZXNwb25zZTsKICAgICAgICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhczsKQEAgLTEzNyw5ICsyMTYsMTYgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgUHJpdmF0ZUtleX0gZm9yIHRoZSByZXF1ZXN0ZWQgYWxpYXMsIG9yIG51bGwKICAgICAgKiBpZiBubyB0aGVyZSBpcyBubyByZXN1bHQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGhvbGQgdGhlIHBlcm1pc3Npb24KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1VTRV9DUkVERU5USUFMU30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgVGhlIGFsaWFzIG9mIHRoZSBkZXNpcmVkIHByaXZhdGUga2V5LCB0eXBpY2FsbHkKKyAgICAgKiByZXR1cm5lZCB2aWEge0BsaW5rIEtleUNoYWluQWxpYXNDYWxsYmFjayNhbGlhc30uCisgICAgICogQHRocm93cyBLZXlDaGFpbkV4Y2VwdGlvbiBpZiB0aGUgYWxpYXMgd2FzIHZhbGlkIGJ1dCB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIGFjY2Vzc2luZyBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFByaXZhdGVLZXkgZ2V0UHJpdmF0ZUtleShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBhbGlhcykKLSAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBLZXlDaGFpbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBpZiAoYWxpYXMgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJhbGlhcyA9PSBudWxsIik7CiAgICAgICAgIH0KQEAgLTE1Miw2ICsyMzgsMTEgQEAKICAgICAgICAgICAgIElLZXlDaGFpblNlcnZpY2Uga2V5Q2hhaW5TZXJ2aWNlID0ga2V5Q2hhaW5Db25uZWN0aW9uLmdldFNlcnZpY2UoKTsKICAgICAgICAgICAgIGJ5dGVbXSBwcml2YXRlS2V5Qnl0ZXMgPSBrZXlDaGFpblNlcnZpY2UuZ2V0UHJpdmF0ZUtleShhbGlhcywgYXV0aFRva2VuKTsKICAgICAgICAgICAgIHJldHVybiB0b1ByaXZhdGVLZXkocHJpdmF0ZUtleUJ5dGVzKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBLZXlDaGFpbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBvbmx5IGNlcnRhaW4gUnVudGltZUV4Y2VwdGlvbnMgY2FuIGJlIHByb3BhZ2F0ZWQgYWNyb3NzIHRoZSBJS2V5Q2hhaW5TZXJ2aWNlIGNhbGwKKyAgICAgICAgICAgIHRocm93IG5ldyBLZXlDaGFpbkV4Y2VwdGlvbihlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGtleUNoYWluQ29ubmVjdGlvbi5jbG9zZSgpOwogICAgICAgICB9CkBAIC0xNjAsOSArMjUxLDE2IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUge0Bjb2RlIFg1MDlDZXJ0aWZpY2F0ZX0gY2hhaW4gZm9yIHRoZSByZXF1ZXN0ZWQKICAgICAgKiBhbGlhcywgb3IgbnVsbCBpZiBubyB0aGVyZSBpcyBubyByZXN1bHQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGhvbGQgdGhlIHBlcm1pc3Npb24KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1VTRV9DUkVERU5USUFMU30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxpYXMgVGhlIGFsaWFzIG9mIHRoZSBkZXNpcmVkIGNlcnRpZmljYXRlIGNoYWluLCB0eXBpY2FsbHkKKyAgICAgKiByZXR1cm5lZCB2aWEge0BsaW5rIEtleUNoYWluQWxpYXNDYWxsYmFjayNhbGlhc30uCisgICAgICogQHRocm93cyBLZXlDaGFpbkV4Y2VwdGlvbiBpZiB0aGUgYWxpYXMgd2FzIHZhbGlkIGJ1dCB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIGFjY2Vzc2luZyBpdC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZVtdIGdldENlcnRpZmljYXRlQ2hhaW4oQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYWxpYXMpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvd3MgS2V5Q2hhaW5FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGFsaWFzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYWxpYXMgPT0gbnVsbCIpOwogICAgICAgICB9CkBAIC0xNzUsNiArMjczLDExIEBACiAgICAgICAgICAgICBJS2V5Q2hhaW5TZXJ2aWNlIGtleUNoYWluU2VydmljZSA9IGtleUNoYWluQ29ubmVjdGlvbi5nZXRTZXJ2aWNlKCk7CiAgICAgICAgICAgICBieXRlW10gY2VydGlmaWNhdGVCeXRlcyA9IGtleUNoYWluU2VydmljZS5nZXRDZXJ0aWZpY2F0ZShhbGlhcywgYXV0aFRva2VuKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlW10geyB0b0NlcnRpZmljYXRlKGNlcnRpZmljYXRlQnl0ZXMpIH07CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgS2V5Q2hhaW5FeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb25seSBjZXJ0YWluIFJ1bnRpbWVFeGNlcHRpb25zIGNhbiBiZSBwcm9wYWdhdGVkIGFjcm9zcyB0aGUgSUtleUNoYWluU2VydmljZSBjYWxsCisgICAgICAgICAgICB0aHJvdyBuZXcgS2V5Q2hhaW5FeGNlcHRpb24oZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBrZXlDaGFpbkNvbm5lY3Rpb24uY2xvc2UoKTsKICAgICAgICAgfQpAQCAtMTg1LDExICsyODgsOSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnl0ZXMgPT0gbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBLZXlGYWN0b3J5IGtleUZhY3RvcnkgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKCJSU0EiKTsKLSAgICAgICAgICAgIHJldHVybiBrZXlGYWN0b3J5LmdlbmVyYXRlUHJpdmF0ZShuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYyhieXRlcykpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwotICAgICAgICB9IGNhdGNoIChJbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBLZXlQYWlyIGtleVBhaXIgPSAoS2V5UGFpcikgQ3JlZGVudGlhbHMuY29udmVydEZyb21QZW0oYnl0ZXMpLmdldCgwKTsKKyAgICAgICAgICAgIHJldHVybiBrZXlQYWlyLmdldFByaXZhdGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0tleUNoYWluQWxpYXNDYWxsYmFjay5qYXZhIGIva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0tleUNoYWluQWxpYXNDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOWU2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5Q2hhaW5BbGlhc0NhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQuc2VjdXJpdHk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCisvKioKKyAqIFRoZSBLZXlDaGFpbkFsaWFzQ2FsbGJhY2sgaXMgdGhlIGNhbGxiYWNrIGZvciB7QGxpbmsKKyAqIEtleUNoYWluI2Nob29zZVByaXZhdGVLZXlBbGlhc30uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgS2V5Q2hhaW5BbGlhc0NhbGxiYWNrIHsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aXRoIHRoZSBhbGlhcyBvZiB0aGUgY2VydGlmaWNhdGUgY2hvc2VuIGJ5IHRoZSB1c2VyLCBvcgorICAgICAqIG51bGwgaWYgbm8gdmFsdWUgd2FzIGNob3Nlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbGlhcyhTdHJpbmcgYWxpYXMpOworfQpkaWZmIC0tZ2l0IGEva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0tleUNoYWluQWxpYXNSZXNwb25zZS5qYXZhIGIva2V5c3RvcmUvamF2YS9hbmRyb2lkL3NlY3VyaXR5L0tleUNoYWluQWxpYXNSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NhMTIzLi4wMDAwMDAwCi0tLSBhL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9LZXlDaGFpbkFsaWFzUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKLQotLyoqCi0gKiBUaGUgS2V5Q2hhaW5BbGlhc1Jlc3BvbnNlIGlzIHRoZSBjYWxsYmFjayBmb3Ige0BsaW5rCi0gKiBLZXlDaGFpbiNjaG9vc2VBbGlhc30uCi0gKgotICogQGhpZGUKLSAqLwotcHVibGljIGludGVyZmFjZSBLZXlDaGFpbkFsaWFzUmVzcG9uc2UgewotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdpdGggdGhlIGFsaWFzIG9mIHRoZSBjZXJ0aWZpY2F0ZSBjaG9zZW4gYnkgdGhlIHVzZXIsIG9yCi0gICAgICogbnVsbCBpZiBubyB2YWx1ZSB3YXMgY2hvc2VuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFsaWFzKFN0cmluZyBhbGlhcyk7Ci19CmRpZmYgLS1naXQgYS9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5Q2hhaW5FeGNlcHRpb24uamF2YSBiL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9LZXlDaGFpbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOTdmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5Q2hhaW5FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLnNlY3VyaXR5OworCisvKioKKyAqIFRocm93biBvbiBwcm9ibGVtcyBhY2Nlc3NpbmcgdGhlIHtAbGluayBLZXlDaGFpbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBLZXlDaGFpbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBLZXlDaGFpbkV4Y2VwdGlvbn0gdGhhdCBpbmNsdWRlcyB0aGUKKyAgICAgKiBjdXJyZW50IHN0YWNrIHRyYWNlLgorICAgICAqLworICAgIHB1YmxpYyBLZXlDaGFpbkV4Y2VwdGlvbigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBLZXlDaGFpbkV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBzdGFjaworICAgICAqIHRyYWNlIGFuZCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGRldGFpbE1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXRhaWwgbWVzc2FnZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEtleUNoYWluRXhjZXB0aW9uKFN0cmluZyBkZXRhaWxNZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKGRldGFpbE1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEtleUNoYWluRXhjZXB0aW9ufSB3aXRoIHRoZSBjdXJyZW50IHN0YWNrCisgICAgICogdHJhY2UsIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UgYW5kIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgdGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5Q2hhaW5FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgS2V5Q2hhaW5FeGNlcHRpb259IHdpdGggdGhlIGN1cnJlbnQgc3RhY2sKKyAgICAgKiB0cmFjZSBhbmQgdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXVzZQorICAgICAqICAgICAgICAgICAgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uLCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBLZXlDaGFpbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoKGNhdXNlID09IG51bGwgPyBudWxsIDogY2F1c2UudG9TdHJpbmcoKSksIGNhdXNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9rZXlzdG9yZS9qYXZhL2FuZHJvaWQvc2VjdXJpdHkvS2V5U3RvcmUuamF2YSBiL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZS5qYXZhCmluZGV4IDcxODM2ODguLjkwNThjYWUgMTAwNjQ0Ci0tLSBhL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZS5qYXZhCisrKyBiL2tleXN0b3JlL2phdmEvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZS5qYXZhCkBAIC0zMiw2ICszMiw4IEBACiAgKiBwcmVjbHVkZSB0aGUgdXNlIG9mIGhhcmR3YXJlIGNyeXB0by4KICAqLwogcHVibGljIGNsYXNzIEtleVN0b3JlIHsKKworICAgIC8vIFJlc3BvbnNlQ29kZXMKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19FUlJPUiA9IDE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DS0VEID0gMjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTklOSVRJQUxJWkVEID0gMzsKQEAgLTQzLDYgKzQ1LDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfQUNUSU9OID0gOTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUk9OR19QQVNTV09SRCA9IDEwOwogCisgICAgLy8gU3RhdGVzCisgICAgcHVibGljIGVudW0gU3RhdGUgeyBVTkxPQ0tFRCwgTE9DS0VELCBVTklOSVRJQUxJWkVEIH07CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbFNvY2tldEFkZHJlc3Mgc0FkZHJlc3MgPSBuZXcgTG9jYWxTb2NrZXRBZGRyZXNzKAogICAgICAgICAgICAgImtleXN0b3JlIiwgTG9jYWxTb2NrZXRBZGRyZXNzLk5hbWVzcGFjZS5SRVNFUlZFRCk7CiAKQEAgLTU0LDMxICs1OSwzNSBAQAogICAgICAgICByZXR1cm4gbmV3IEtleVN0b3JlKCk7CiAgICAgfQogCi0gICAgcHVibGljIGludCB0ZXN0KCkgeworICAgIHB1YmxpYyBTdGF0ZSBzdGF0ZSgpIHsKICAgICAgICAgZXhlY3V0ZSgndCcpOwotICAgICAgICByZXR1cm4gbUVycm9yOworICAgICAgICBzd2l0Y2ggKG1FcnJvcikgeworICAgICAgICAgICAgY2FzZSBOT19FUlJPUjogcmV0dXJuIFN0YXRlLlVOTE9DS0VEOworICAgICAgICAgICAgY2FzZSBMT0NLRUQ6IHJldHVybiBTdGF0ZS5MT0NLRUQ7CisgICAgICAgICAgICBjYXNlIFVOSU5JVElBTElaRUQ6IHJldHVybiBTdGF0ZS5VTklOSVRJQUxJWkVEOworICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1FcnJvcik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYnl0ZVtdIGdldChieXRlW10ga2V5KSB7CisgICAgcHJpdmF0ZSBieXRlW10gZ2V0KGJ5dGVbXSBrZXkpIHsKICAgICAgICAgQXJyYXlMaXN0PGJ5dGVbXT4gdmFsdWVzID0gZXhlY3V0ZSgnZycsIGtleSk7CiAgICAgICAgIHJldHVybiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSkgPyBudWxsIDogdmFsdWVzLmdldCgwKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5KSB7Ci0gICAgICAgIGJ5dGVbXSB2YWx1ZSA9IGdldChnZXRCeXRlcyhrZXkpKTsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB0b1N0cmluZyh2YWx1ZSk7CisgICAgcHVibGljIGJ5dGVbXSBnZXQoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gZ2V0KGdldEJ5dGVzKGtleSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHB1dChieXRlW10ga2V5LCBieXRlW10gdmFsdWUpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHV0KGJ5dGVbXSBrZXksIGJ5dGVbXSB2YWx1ZSkgewogICAgICAgICBleGVjdXRlKCdpJywga2V5LCB2YWx1ZSk7CiAgICAgICAgIHJldHVybiBtRXJyb3IgPT0gTk9fRVJST1I7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gcHV0KGdldEJ5dGVzKGtleSksIGdldEJ5dGVzKHZhbHVlKSk7CisgICAgcHVibGljIGJvb2xlYW4gcHV0KFN0cmluZyBrZXksIGJ5dGVbXSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcHV0KGdldEJ5dGVzKGtleSksIHZhbHVlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBkZWxldGUoYnl0ZVtdIGtleSkgeworICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGUoYnl0ZVtdIGtleSkgewogICAgICAgICBleGVjdXRlKCdkJywga2V5KTsKICAgICAgICAgcmV0dXJuIG1FcnJvciA9PSBOT19FUlJPUjsKICAgICB9CkBAIC04Nyw3ICs5Niw3IEBACiAgICAgICAgIHJldHVybiBkZWxldGUoZ2V0Qnl0ZXMoa2V5KSk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoYnl0ZVtdIGtleSkgeworICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWlucyhieXRlW10ga2V5KSB7CiAgICAgICAgIGV4ZWN1dGUoJ2UnLCBrZXkpOwogICAgICAgICByZXR1cm4gbUVycm9yID09IE5PX0VSUk9SOwogICAgIH0KQEAgLTExOCwxOSArMTI3LDExIEBACiAgICAgICAgIHJldHVybiBtRXJyb3IgPT0gTk9fRVJST1I7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gcGFzc3dvcmQoYnl0ZVtdIG9sZFBhc3N3b3JkLCBieXRlW10gbmV3UGFzc3dvcmQpIHsKLSAgICAgICAgZXhlY3V0ZSgncCcsIG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7CisgICAgcHJpdmF0ZSBib29sZWFuIHBhc3N3b3JkKGJ5dGVbXSBwYXNzd29yZCkgeworICAgICAgICBleGVjdXRlKCdwJywgcGFzc3dvcmQpOwogICAgICAgICByZXR1cm4gbUVycm9yID09IE5PX0VSUk9SOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHBhc3N3b3JkKFN0cmluZyBvbGRQYXNzd29yZCwgU3RyaW5nIG5ld1Bhc3N3b3JkKSB7Ci0gICAgICAgIHJldHVybiBwYXNzd29yZChnZXRCeXRlcyhvbGRQYXNzd29yZCksIGdldEJ5dGVzKG5ld1Bhc3N3b3JkKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gcGFzc3dvcmQoYnl0ZVtdIHBhc3N3b3JkKSB7Ci0gICAgICAgIHJldHVybiBwYXNzd29yZChwYXNzd29yZCwgcGFzc3dvcmQpOwotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIHBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewogICAgICAgICByZXR1cm4gcGFzc3dvcmQoZ2V0Qnl0ZXMocGFzc3dvcmQpKTsKICAgICB9CkBAIC0xNDAsNyArMTQxLDcgQEAKICAgICAgICAgcmV0dXJuIG1FcnJvciA9PSBOT19FUlJPUjsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiB1bmxvY2soYnl0ZVtdIHBhc3N3b3JkKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIHVubG9jayhieXRlW10gcGFzc3dvcmQpIHsKICAgICAgICAgZXhlY3V0ZSgndScsIHBhc3N3b3JkKTsKICAgICAgICAgcmV0dXJuIG1FcnJvciA9PSBOT19FUlJPUjsKICAgICB9CkBAIC0xNDksNiArMTUwLDExIEBACiAgICAgICAgIHJldHVybiB1bmxvY2soZ2V0Qnl0ZXMocGFzc3dvcmQpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICBleGVjdXRlKCd6Jyk7CisgICAgICAgIHJldHVybiBtRXJyb3IgPT0gS0VZX05PVF9GT1VORDsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldExhc3RFcnJvcigpIHsKICAgICAgICAgcmV0dXJuIG1FcnJvcjsKICAgICB9CmRpZmYgLS1naXQgYS9rZXlzdG9yZS90ZXN0cy9zcmMvYW5kcm9pZC9zZWN1cml0eS9LZXlTdG9yZVRlc3QuamF2YSBiL2tleXN0b3JlL3Rlc3RzL3NyYy9hbmRyb2lkL3NlY3VyaXR5L0tleVN0b3JlVGVzdC5qYXZhCmluZGV4IDY2MzBhNGYuLjQ1ODJhYTAgMTAwNzU1Ci0tLSBhL2tleXN0b3JlL3Rlc3RzL3NyYy9hbmRyb2lkL3NlY3VyaXR5L0tleVN0b3JlVGVzdC5qYXZhCisrKyBiL2tleXN0b3JlL3Rlc3RzL3NyYy9hbmRyb2lkL3NlY3VyaXR5L0tleVN0b3JlVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw5IEBACiBpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQWN0aXZpdHlVbml0VGVzdENhc2U7CiBpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLk1lZGl1bVRlc3Q7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogCiAvKioKICAqIEp1bml0IC8gSW5zdHJ1bWVudGF0aW9uIHRlc3QgY2FzZSBmb3IgS2V5U3RvcmUgY2xhc3MKQEAgLTMxLDE2ICszNCwxNSBAQAogQE1lZGl1bVRlc3QKIHB1YmxpYyBjbGFzcyBLZXlTdG9yZVRlc3QgZXh0ZW5kcyBBY3Rpdml0eVVuaXRUZXN0Q2FzZTxBY3Rpdml0eT4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBU1NXRCA9ICIxMjM0NTY3OCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRU1QVFlfUEFTU1dEID0gIiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfU0hPUlRfUEFTU1dEID0gInNob3J0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQVNTV0QyID0gIjg3NjU0MzIxIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9LRVlOQU1FID0gInRlc3RrZXkiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0tFWU5BTUUxID0gInRlc3RrZXkxIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9LRVlOQU1FMiA9ICJ0ZXN0a2V5MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfS0VZVkFMVUUgPSAidGVzdCB2YWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFRFU1RfS0VZVkFMVUUgPSAidGVzdCB2YWx1ZSIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpOwogCiAgICAgLy8gIkhlbGxvLCBXb3JsZCIgaW4gQ2hpbmVzZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0kxOE4gPSAiXHU0RjYwXHU1OTdELCBcdTRFMTZcdTc1NEMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0kxOE5fS0VZID0gIlx1NEY2MFx1NTk3RCwgXHU0RTE2XHU3NTRDIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gVEVTVF9JMThOX1ZBTFVFID0gVEVTVF9JMThOX0tFWS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCk7CiAKICAgICBwcml2YXRlIEtleVN0b3JlIG1LZXlTdG9yZSA9IG51bGw7CiAKQEAgLTUxLDggKzUzLDEwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbUtleVN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1LZXlTdG9yZS50ZXN0KCkgIT0gS2V5U3RvcmUuVU5JTklUSUFMSVpFRCkgbUtleVN0b3JlLnJlc2V0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5VTklOSVRJQUxJWkVELCBtS2V5U3RvcmUudGVzdCgpKTsKKyAgICAgICAgaWYgKG1LZXlTdG9yZS5zdGF0ZSgpICE9IEtleVN0b3JlLlN0YXRlLlVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIG1LZXlTdG9yZS5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5TdGF0ZS5VTklOSVRJQUxJWkVELCBtS2V5U3RvcmUuc3RhdGUoKSk7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgfQogCkBAIC02MiwyMSArNjYsMTMgQEAKICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuVU5JTklUSUFMSVpFRCwgbUtleVN0b3JlLnRlc3QoKSk7CisgICAgcHVibGljIHZvaWQgdGVzdHN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhLZXlTdG9yZS5TdGF0ZS5VTklOSVRJQUxJWkVELCBtS2V5U3RvcmUuc3RhdGUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vYXNzZXJ0RmFsc2UobUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfRU1QVFlfUEFTU1dEKSk7Ci0gICAgICAgIC8vYXNzZXJ0RmFsc2UobUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfU0hPUlRfUEFTU1dEKSk7Ci0KICAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUucGFzc3dvcmQoVEVTVF9QQVNTV0QpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLk5PX0VSUk9SLCBtS2V5U3RvcmUudGVzdCgpKTsKLQotICAgICAgICBhc3NlcnRGYWxzZShtS2V5U3RvcmUucGFzc3dvcmQoVEVTVF9QQVNTV0QyLCBURVNUX1BBU1NXRDIpKTsKLSAgICAgICAgLy9hc3NlcnRGYWxzZShtS2V5U3RvcmUucGFzc3dvcmQoVEVTVF9QQVNTV0QsIFRFU1RfU0hPUlRfUEFTU1dEKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUucGFzc3dvcmQoVEVTVF9QQVNTV0QsIFRFU1RfUEFTU1dEMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuU3RhdGUuVU5MT0NLRUQsIG1LZXlTdG9yZS5zdGF0ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC04NywxMSArODMsMTEgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0STE4bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGYWxzZShtS2V5U3RvcmUucHV0KFRFU1RfSTE4TiwgVEVTVF9JMThOKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG1LZXlTdG9yZS5jb250YWlucyhURVNUX0kxOE4pKTsKLSAgICAgICAgbUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfSTE4Tik7Ci0gICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLnB1dChURVNUX0kxOE4sIFRFU1RfSTE4TikpOwotICAgICAgICBhc3NlcnRUcnVlKG1LZXlTdG9yZS5jb250YWlucyhURVNUX0kxOE4pKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLnB1dChURVNUX0kxOE5fS0VZLCBURVNUX0kxOE5fVkFMVUUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLmNvbnRhaW5zKFRFU1RfSTE4Tl9LRVkpKTsKKyAgICAgICAgbUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfSTE4Tl9LRVkpOworICAgICAgICBhc3NlcnRUcnVlKG1LZXlTdG9yZS5wdXQoVEVTVF9JMThOX0tFWSwgVEVTVF9JMThOX1ZBTFVFKSk7CisgICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLmNvbnRhaW5zKFRFU1RfSTE4Tl9LRVkpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0xMTQsMzMgKzExMCw0NiBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RTYXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0cyA9IG1LZXlTdG9yZS5zYXcoVEVTVF9LRVlOQU1FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdHMubGVuZ3RoKTsKKyAgICAgICAgU3RyaW5nW10gZW1wdHlSZXN1bHQgPSBtS2V5U3RvcmUuc2F3KFRFU1RfS0VZTkFNRSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZW1wdHlSZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZW1wdHlSZXN1bHQubGVuZ3RoKTsKIAogICAgICAgICBtS2V5U3RvcmUucGFzc3dvcmQoVEVTVF9QQVNTV0QpOwogICAgICAgICBtS2V5U3RvcmUucHV0KFRFU1RfS0VZTkFNRTEsIFRFU1RfS0VZVkFMVUUpOwogICAgICAgICBtS2V5U3RvcmUucHV0KFRFU1RfS0VZTkFNRTIsIFRFU1RfS0VZVkFMVUUpOwogCi0gICAgICAgIHJlc3VsdHMgPSBtS2V5U3RvcmUuc2F3KFRFU1RfS0VZTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHRzLmxlbmd0aCk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdHMgPSBtS2V5U3RvcmUuc2F3KFRFU1RfS0VZTkFNRSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KFRFU1RfS0VZTkFNRTEuc3Vic3RyaW5nKFRFU1RfS0VZTkFNRS5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfS0VZTkFNRTIuc3Vic3RyaW5nKFRFU1RfS0VZTkFNRS5sZW5ndGgoKSkpKSwKKyAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QocmVzdWx0cykpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jaygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBhc3NlcnRGYWxzZShtS2V5U3RvcmUubG9jaygpKTsKIAogICAgICAgICBtS2V5U3RvcmUucGFzc3dvcmQoVEVTVF9QQVNTV0QpOwotICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuTk9fRVJST1IsIG1LZXlTdG9yZS50ZXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuU3RhdGUuVU5MT0NLRUQsIG1LZXlTdG9yZS5zdGF0ZSgpKTsKIAogICAgICAgICBhc3NlcnRUcnVlKG1LZXlTdG9yZS5sb2NrKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoS2V5U3RvcmUuTE9DS0VELCBtS2V5U3RvcmUudGVzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLlN0YXRlLkxPQ0tFRCwgbUtleVN0b3JlLnN0YXRlKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RVbmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgbUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dEKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLk5PX0VSUk9SLCBtS2V5U3RvcmUudGVzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEtleVN0b3JlLlN0YXRlLlVOTE9DS0VELCBtS2V5U3RvcmUuc3RhdGUoKSk7CiAgICAgICAgIG1LZXlTdG9yZS5sb2NrKCk7CiAKICAgICAgICAgYXNzZXJ0RmFsc2UobUtleVN0b3JlLnVubG9jayhURVNUX1BBU1NXRDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUudW5sb2NrKFRFU1RfUEFTU1dEKSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUuaXNFbXB0eSgpKTsKKyAgICAgICAgbUtleVN0b3JlLnBhc3N3b3JkKFRFU1RfUEFTU1dEKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtS2V5U3RvcmUuaXNFbXB0eSgpKTsKKyAgICAgICAgbUtleVN0b3JlLnB1dChURVNUX0tFWU5BTUUsIFRFU1RfS0VZVkFMVUUpOworICAgICAgICBhc3NlcnRGYWxzZShtS2V5U3RvcmUuaXNFbXB0eSgpKTsKKyAgICAgICAgbUtleVN0b3JlLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUobUtleVN0b3JlLmlzRW1wdHkoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlicy9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAgYi9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBjMjk1MzE1Li45MzkyY2YyIDEwMDY0NAotLS0gYS9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9saWJzL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcApAQCAtMTQ2LDYgKzE0Niw3IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjJJW10gPSAieXV2NDIyaS15dXl2IjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFBbXSAgPSAieXV2NDIwcCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SR0I1NjVbXSA9ICJyZ2I1NjUiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCQTg4ODhbXSA9ICJyZ2JhODg4OCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9KUEVHW10gPSAianBlZyI7CiAKIC8vIFZhbHVlcyBmb3IgZm9jdXMgbW9kZSBzZXR0aW5ncy4KZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0FuZHJvaWQubWsgYi9saWJzL2d1aS9BbmRyb2lkLm1rCmluZGV4IGI1NzM3ZmYuLjQwNzBlYmEgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0FuZHJvaWQubWsKKysrIGIvbGlicy9ndWkvQW5kcm9pZC5tawpAQCAtMTYsNyArMTYsNiBAQAogCUlTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwIFwKIAlJR3JhcGhpY0J1ZmZlckFsbG9jLmNwcCBcCiAJTGF5ZXJTdGF0ZS5jcHAgXAotCVNoYXJlZEJ1ZmZlclN0YWNrLmNwcCBcCiAJU3VyZmFjZS5jcHAgXAogCVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgXAogCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU3VyZmFjZS5jcHAgYi9saWJzL2d1aS9JU3VyZmFjZS5jcHAKaW5kZXggMjNiOTBhZi4uOTYxNTVkNyAxMDA2NDQKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2UuY3BwCisrKyBiL2xpYnMvZ3VpL0lTdXJmYWNlLmNwcApAQCAtMjIsOSArMjIsNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zOSwzMCArMzcsMTEgQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiByZXF1ZXN0QnVmZmVyKGludCBidWZmZXJJZHgsCi0gICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKQotICAgIHsKKyAgICB2aXJ0dWFsIHNwPElTdXJmYWNlVGV4dHVyZT4gZ2V0U3VyZmFjZVRleHR1cmUoKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVySWR4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodXNhZ2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVRVUVTVF9CVUZGRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgICAgIHJlcGx5LnJlYWQoKmJ1ZmZlcik7Ci0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlckNvdW50KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9CVUZGRVJfQ09VTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NVUkZBQ0VfVEVYVFVSRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElTdXJmYWNlVGV4dHVyZT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiB9OwogCkBAIC03NCwyMyArNTMsOSBAQAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBSRVFVRVNUX0JVRkZFUjogeworICAgICAgICBjYXNlIEdFVF9TVVJGQUNFX1RFWFRVUkU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGJ1ZmZlcklkeCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB3ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihyZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkeCwgdywgaCwgZm9ybWF0LCB1c2FnZSkpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbHktPndyaXRlKCpidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgU0VUX0JVRkZFUl9DT1VOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlciggZ2V0U3VyZmFjZVRleHR1cmUoKS0+YXNCaW5kZXIoKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmNwcCBiL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwCmluZGV4IDg5NTFjM2YuLjQwNDUwYTMgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwCisrKyBiL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwCkBAIC01NywxNSArNTcsNiBAQAogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VDb21wb3NlckNsaWVudD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNyZWF0ZUNsaWVudENvbm5lY3Rpb24oKQotICAgIHsKLSAgICAgICAgdWludDMyX3QgbjsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3Nlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpDUkVBVEVfQ0xJRU5UX0NPTk5FQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gY3JlYXRlR3JhcGhpY0J1ZmZlckFsbG9jKCkKICAgICB7CiAgICAgICAgIHVpbnQzMl90IG47CkBAIC0xNzQsMTMgKzE2NSw2IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6U0lHTkFMLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIGJvb2wgYXV0aGVudGljYXRlU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0CiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0yMjksMTEgKzIxMyw2IEBACiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiID0gY3JlYXRlQ29ubmVjdGlvbigpLT5hc0JpbmRlcigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGIpOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENSRUFURV9DTElFTlRfQ09OTkVDVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGIgPSBjcmVhdGVDbGllbnRDb25uZWN0aW9uKCktPmFzQmluZGVyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYik7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ1JFQVRFX0dSQVBISUNfQlVGRkVSX0FMTE9DOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYiA9IGNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpLT5hc0JpbmRlcigpOwpAQCAtMjcwLDEwICsyNDksNiBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGJvb3RGaW5pc2hlZCgpOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNJR05BTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNpZ25hbCgpOwotICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9DQkxLOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYiA9IGdldENibGsoKS0+YXNCaW5kZXIoKTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwIGIvbGlicy9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKaW5kZXggZWEzOGUwOC4uOGQ4MzM5MiAxMDA2NDQKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKKysrIGIvbGlicy9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKQEAgLTUwLDkgKzUwLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7Ci0gICAgR0VUX0NCTEsgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIEdFVF9UT0tFTiwKLSAgICBDUkVBVEVfU1VSRkFDRSwKKyAgICBDUkVBVEVfU1VSRkFDRSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgREVTVFJPWV9TVVJGQUNFLAogICAgIFNFVF9TVEFURQogfTsKQEAgLTY1LDIzICs2Myw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldENvbnRyb2xCbG9jaygpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NCTEssIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0VG9rZW5Gb3JTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXItPmFzQmluZGVyKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1RPS0VOLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSggc3VyZmFjZV9kYXRhX3QqIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LApAQCAtMTMxLDQxICsxMTIsNiBAQAogc3RhdHVzX3QgQm5TdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9uVHJhbnNhY3QoCiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKLSAgICAvLyBjb2RlcyB0aGF0IGRvbid0IHJlcXVpcmUgcGVybWlzc2lvbiBjaGVjawotCi0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfQ0JMSzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBjdGwoZ2V0Q29udHJvbEJsb2NrKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGN0bC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX1RPS0VOOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlckNsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IHN1ciA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzc2l6ZV90IHRva2VuID0gZ2V0VG9rZW5Gb3JTdXJmYWNlKHN1cik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0b2tlbik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gdGhlc2UgbXVzdCBiZSBjaGVja2VkCi0KLSAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKLSAgICAgaWYgKFVOTElLRUxZKHBpZCAhPSBzZWxmX3BpZCAmJiB1aWQgIT0gQUlEX0dSQVBISUNTICYmIHVpZCAhPSAwKSkgewotICAgICAgICAgLy8gd2UncmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcywgZG8gdGhlIHJlYWwgY2hlY2sKLSAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKLSAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfU1VSRkFDRV9GTElOR0VSIikpKQotICAgICAgICAgewotICAgICAgICAgICAgIExPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgb3Blbkdsb2JhbFRyYW5zYWN0aW9uIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgIH0KLSAgICAgfQotCiAgICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1NVUkZBQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9saWJzL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5jcHAgYi9saWJzL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDVkNTMuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU2hhcmVkQnVmZmVyU3RhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlNoYXJlZEJ1ZmZlclN0YWNrIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaD4KLQotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLSNpbmNsdWRlIDx1aS9SZWdpb24uaD4KLQotI2RlZmluZSBERUJVR19BVE9NSUNTIDAKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TaGFyZWRDbGllbnQ6OlNoYXJlZENsaWVudCgpCi0gICAgOiBsb2NrKE11dGV4OjpTSEFSRUQpLCBjdihDb25kaXRpb246OlNIQVJFRCkKLXsKLX0KLQotU2hhcmVkQ2xpZW50Ojp+U2hhcmVkQ2xpZW50KCkgewotfQotCi0KLS8vIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSB0aGUgY2xpZW50cwotc3RhdHVzX3QgU2hhcmVkQ2xpZW50Ojp2YWxpZGF0ZShzaXplX3QgaSkgY29uc3QgewotICAgIGlmICh1aW50MzJfdChpKSA+PSB1aW50MzJfdChTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0xBWUVSU19NQVgpKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHJldHVybiBzdXJmYWNlc1tpXS5zdGF0dXM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1TaGFyZWRCdWZmZXJTdGFjazo6U2hhcmVkQnVmZmVyU3RhY2soKQotewotfQotCi12b2lkIFNoYXJlZEJ1ZmZlclN0YWNrOjppbml0KGludDMyX3QgaSkKLXsKLSAgICBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZGVudGl0eSA9IGk7Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlclN0YWNrOjpzZXRDcm9wKGludCBidWZmZXIsIGNvbnN0IFJlY3QmIGNyb3ApCi17Ci0gICAgaWYgKHVpbnQzMl90KGJ1ZmZlcikgPj0gTlVNX0JVRkZFUl9NQVgpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0KLSAgICBidWZmZXJzW2J1ZmZlcl0uY3JvcC5sID0gdWludDE2X3QoY3JvcC5sZWZ0KTsKLSAgICBidWZmZXJzW2J1ZmZlcl0uY3JvcC50ID0gdWludDE2X3QoY3JvcC50b3ApOwotICAgIGJ1ZmZlcnNbYnVmZmVyXS5jcm9wLnIgPSB1aW50MTZfdChjcm9wLnJpZ2h0KTsKLSAgICBidWZmZXJzW2J1ZmZlcl0uY3JvcC5iID0gdWludDE2X3QoY3JvcC5ib3R0b20pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU2hhcmVkQnVmZmVyU3RhY2s6OnNldFRyYW5zZm9ybShpbnQgYnVmZmVyLCB1aW50OF90IHRyYW5zZm9ybSkKLXsKLSAgICBpZiAodWludDMyX3QoYnVmZmVyKSA+PSBOVU1fQlVGRkVSX01BWCkKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBidWZmZXJzW2J1ZmZlcl0udHJhbnNmb3JtID0gdHJhbnNmb3JtOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU2hhcmVkQnVmZmVyU3RhY2s6OnNldERpcnR5UmVnaW9uKGludCBidWZmZXIsIGNvbnN0IFJlZ2lvbiYgZGlydHkpCi17Ci0gICAgaWYgKHVpbnQzMl90KGJ1ZmZlcikgPj0gTlVNX0JVRkZFUl9NQVgpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0KLSAgICBGbGF0UmVnaW9uJiByZWcoYnVmZmVyc1tidWZmZXJdLmRpcnR5UmVnaW9uKTsKLSAgICBpZiAoZGlydHkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlZy5jb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBzaXplX3QgY291bnQ7Ci0gICAgUmVjdCBjb25zdCogciA9IGRpcnR5LmdldEFycmF5KCZjb3VudCk7Ci0gICAgaWYgKGNvdW50ID4gRmxhdFJlZ2lvbjo6TlVNX1JFQ1RfTUFYKSB7Ci0gICAgICAgIGNvbnN0IFJlY3QgYm91bmRzKGRpcnR5LmdldEJvdW5kcygpKTsKLSAgICAgICAgcmVnLmNvdW50ID0gMTsKLSAgICAgICAgcmVnLnJlY3RzWzBdLmwgPSB1aW50MTZfdChib3VuZHMubGVmdCk7Ci0gICAgICAgIHJlZy5yZWN0c1swXS50ID0gdWludDE2X3QoYm91bmRzLnRvcCk7Ci0gICAgICAgIHJlZy5yZWN0c1swXS5yID0gdWludDE2X3QoYm91bmRzLnJpZ2h0KTsKLSAgICAgICAgcmVnLnJlY3RzWzBdLmIgPSB1aW50MTZfdChib3VuZHMuYm90dG9tKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZWcuY291bnQgPSBjb3VudDsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgcmVnLnJlY3RzW2ldLmwgPSB1aW50MTZfdChyW2ldLmxlZnQpOwotICAgICAgICAgICAgcmVnLnJlY3RzW2ldLnQgPSB1aW50MTZfdChyW2ldLnRvcCk7Ci0gICAgICAgICAgICByZWcucmVjdHNbaV0uciA9IHVpbnQxNl90KHJbaV0ucmlnaHQpOwotICAgICAgICAgICAgcmVnLnJlY3RzW2ldLmIgPSB1aW50MTZfdChyW2ldLmJvdHRvbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1SZWdpb24gU2hhcmVkQnVmZmVyU3RhY2s6OmdldERpcnR5UmVnaW9uKGludCBidWZmZXIpIGNvbnN0Ci17Ci0gICAgUmVnaW9uIHJlczsKLSAgICBpZiAodWludDMyX3QoYnVmZmVyKSA+PSBOVU1fQlVGRkVSX01BWCkKLSAgICAgICAgcmV0dXJuIHJlczsKLQotICAgIGNvbnN0IEZsYXRSZWdpb24mIHJlZyhidWZmZXJzW2J1ZmZlcl0uZGlydHlSZWdpb24pOwotICAgIGlmIChyZWcuY291bnQgPiBGbGF0UmVnaW9uOjpOVU1fUkVDVF9NQVgpCi0gICAgICAgIHJldHVybiByZXM7Ci0KLSAgICBpZiAocmVnLmNvdW50ID09IDEpIHsKLSAgICAgICAgY29uc3QgUmVjdCByKAotICAgICAgICAgICAgICAgIHJlZy5yZWN0c1swXS5sLAotICAgICAgICAgICAgICAgIHJlZy5yZWN0c1swXS50LAotICAgICAgICAgICAgICAgIHJlZy5yZWN0c1swXS5yLAotICAgICAgICAgICAgICAgIHJlZy5yZWN0c1swXS5iKTsKLSAgICAgICAgcmVzLnNldChyKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPHJlZy5jb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3QgUmVjdCByKAotICAgICAgICAgICAgICAgICAgICByZWcucmVjdHNbaV0ubCwKLSAgICAgICAgICAgICAgICAgICAgcmVnLnJlY3RzW2ldLnQsCi0gICAgICAgICAgICAgICAgICAgIHJlZy5yZWN0c1tpXS5yLAotICAgICAgICAgICAgICAgICAgICByZWcucmVjdHNbaV0uYik7Ci0gICAgICAgICAgICByZXMub3JTZWxmKHIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLVJlY3QgU2hhcmVkQnVmZmVyU3RhY2s6OmdldENyb3AoaW50IGJ1ZmZlcikgY29uc3QKLXsKLSAgICBSZWN0IHJlcygtMSwgLTEpOwotICAgIGlmICh1aW50MzJfdChidWZmZXIpID49IE5VTV9CVUZGRVJfTUFYKQotICAgICAgICByZXR1cm4gcmVzOwotICAgIHJlcy5sZWZ0ID0gYnVmZmVyc1tidWZmZXJdLmNyb3AubDsKLSAgICByZXMudG9wID0gYnVmZmVyc1tidWZmZXJdLmNyb3AudDsKLSAgICByZXMucmlnaHQgPSBidWZmZXJzW2J1ZmZlcl0uY3JvcC5yOwotICAgIHJlcy5ib3R0b20gPSBidWZmZXJzW2J1ZmZlcl0uY3JvcC5iOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXVpbnQzMl90IFNoYXJlZEJ1ZmZlclN0YWNrOjpnZXRUcmFuc2Zvcm0oaW50IGJ1ZmZlcikgY29uc3QKLXsKLSAgICBpZiAodWludDMyX3QoYnVmZmVyKSA+PSBOVU1fQlVGRkVSX01BWCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGJ1ZmZlcnNbYnVmZmVyXS50cmFuc2Zvcm07Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TaGFyZWRCdWZmZXJCYXNlOjpTaGFyZWRCdWZmZXJCYXNlKFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LAotICAgICAgICBpbnQgc3VyZmFjZSwgaW50MzJfdCBpZGVudGl0eSkKLSAgICA6IG1TaGFyZWRDbGllbnQoc2hhcmVkQ2xpZW50KSwgCi0gICAgICBtU2hhcmVkU3RhY2soc2hhcmVkQ2xpZW50LT5zdXJmYWNlcyArIHN1cmZhY2UpLAotICAgICAgbUlkZW50aXR5KGlkZW50aXR5KQotewotfQotCi1TaGFyZWRCdWZmZXJCYXNlOjp+U2hhcmVkQnVmZmVyQmFzZSgpCi17Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckJhc2U6OmdldFN0YXR1cygpIGNvbnN0Ci17Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0gICAgcmV0dXJuIHN0YWNrLnN0YXR1czsKLX0KLQotaW50MzJfdCBTaGFyZWRCdWZmZXJCYXNlOjpnZXRJZGVudGl0eSgpIGNvbnN0Ci17Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0gICAgcmV0dXJuIHN0YWNrLmlkZW50aXR5OwotfQotCi1TdHJpbmc4IFNoYXJlZEJ1ZmZlckJhc2U6OmR1bXAoY2hhciBjb25zdCogcHJlZml4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMTAyNDsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsIAotICAgICAgICAgICAgIiVzWyBoZWFkPSUyZCwgYXZhaWxhYmxlPSUyZCwgcXVldWVkPSUyZCBdICIKLSAgICAgICAgICAgICJyZWFsbG9jTWFzaz0lMDh4LCBpZGVudGl0eT0lZCwgc3RhdHVzPSVkIiwKLSAgICAgICAgICAgIHByZWZpeCwgc3RhY2suaGVhZCwgc3RhY2suYXZhaWxhYmxlLCBzdGFjay5xdWV1ZWQsCi0gICAgICAgICAgICBzdGFjay5yZWFsbG9jTWFzaywgc3RhY2suaWRlbnRpdHksIHN0YWNrLnN0YXR1cyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgU2hhcmVkQnVmZmVyQmFzZTo6d2FpdEZvckNvbmRpdGlvbihjb25zdCBDb25kaXRpb25CYXNlJiBjb25kaXRpb24pCi17Ci0gICAgY29uc3QgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0gICAgU2hhcmVkQ2xpZW50JiBjbGllbnQoICptU2hhcmVkQ2xpZW50ICk7Ci0gICAgY29uc3QgbnNlY3NfdCBUSU1FT1VUID0gczJucygxKTsKLSAgICBjb25zdCBpbnQgaWRlbnRpdHkgPSBtSWRlbnRpdHk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2woY2xpZW50LmxvY2spOwotICAgIHdoaWxlICgoY29uZGl0aW9uKCk9PWZhbHNlKSAmJgotICAgICAgICAgICAgKHN0YWNrLmlkZW50aXR5ID09IGlkZW50aXR5KSAmJgotICAgICAgICAgICAgKHN0YWNrLnN0YXR1cyA9PSBOT19FUlJPUikpCi0gICAgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBjbGllbnQuY3Yud2FpdFJlbGF0aXZlKGNsaWVudC5sb2NrLCBUSU1FT1VUKTsKLSAgICAgICAgLy8gaGFuZGxlIGVycm9ycyBhbmQgdGltZW91dHMKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKGVyciAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIndhaXRGb3JDb25kaXRpb24oJXMpIHRpbWVkIG91dCAoaWRlbnRpdHk9JWQpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGNvbmRpdGlvbiBpcyB0cnVlISBXZSByZWNvdmVyZWQgYnV0IGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGRuJ3QgaGFwcGVuLiIgLCBjb25kaXRpb24ubmFtZSgpLCBzdGFjay5pZGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR1coIndhaXRGb3JDb25kaXRpb24oJXMpIHRpbWVkIG91dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKGlkZW50aXR5PSVkLCBzdGF0dXM9JWQpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ1BVIG1heSBiZSBwZWdnZWQuIHRyeWluZyBhZ2Fpbi4iLCBjb25kaXRpb24ubmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suaWRlbnRpdHksIHN0YWNrLnN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJ3YWl0Rm9yQ29uZGl0aW9uKCVzKSBlcnJvciAoJXMpICIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24ubmFtZSgpLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHN0YWNrLmlkZW50aXR5ICE9IG1JZGVudGl0eSkgPyBzdGF0dXNfdChCQURfSU5ERVgpIDogc3RhY2suc3RhdHVzOwotfQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gY29uZGl0aW9ucyBhbmQgdXBkYXRlcwotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TaGFyZWRCdWZmZXJDbGllbnQ6OkRlcXVldWVDb25kaXRpb246OkRlcXVldWVDb25kaXRpb24oCi0gICAgICAgIFNoYXJlZEJ1ZmZlckNsaWVudCogc2JjKSA6IENvbmRpdGlvbkJhc2Uoc2JjKSAgeyAKLX0KLWJvb2wgU2hhcmVkQnVmZmVyQ2xpZW50OjpEZXF1ZXVlQ29uZGl0aW9uOjpvcGVyYXRvcigpKCkgY29uc3QgewotICAgIHJldHVybiBzdGFjay5hdmFpbGFibGUgPiAwOwotfQotCi1TaGFyZWRCdWZmZXJDbGllbnQ6OkxvY2tDb25kaXRpb246OkxvY2tDb25kaXRpb24oCi0gICAgICAgIFNoYXJlZEJ1ZmZlckNsaWVudCogc2JjLCBpbnQgYnVmKSA6IENvbmRpdGlvbkJhc2Uoc2JjKSwgYnVmKGJ1ZikgeyAKLX0KLWJvb2wgU2hhcmVkQnVmZmVyQ2xpZW50OjpMb2NrQ29uZGl0aW9uOjpvcGVyYXRvcigpKCkgY29uc3QgewotICAgIC8vIE5PVEU6IGlmIHN0YWNrLmhlYWQgaXMgbWVzc2VkIHVwLCB3ZSBjb3VsZCBjcmFzaCB0aGUgY2xpZW50Ci0gICAgLy8gb3IgY2F1c2Ugc29tZSBkcmF3aW5nIGFydGlmYWN0cy4gVGhpcyBpcyBva2F5LCBhcyBsb25nIGFzIGl0IGlzCi0gICAgLy8gbGltaXRlZCB0byB0aGUgY2xpZW50LgotICAgIHJldHVybiAoYnVmICE9IHN0YWNrLmluZGV4W3N0YWNrLmhlYWRdKTsKLX0KLQotU2hhcmVkQnVmZmVyU2VydmVyOjpCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uOjpCdWZmZXJzQXZhaWxhYmxlQ29uZGl0aW9uKAotICAgICAgICBTaGFyZWRCdWZmZXJTZXJ2ZXIqIHNicywgaW50IG51bUJ1ZmZlcnMpIDogQ29uZGl0aW9uQmFzZShzYnMpLAotICAgICAgICBtTnVtQnVmZmVycyhudW1CdWZmZXJzKSB7Ci19Ci1ib29sIFNoYXJlZEJ1ZmZlclNlcnZlcjo6QnVmZmVyc0F2YWlsYWJsZUNvbmRpdGlvbjo6b3BlcmF0b3IoKSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhY2suYXZhaWxhYmxlID09IG1OdW1CdWZmZXJzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNoYXJlZEJ1ZmZlckNsaWVudDo6UXVldWVVcGRhdGU6OlF1ZXVlVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYikKLSAgICA6IFVwZGF0ZUJhc2Uoc2JiKSB7ICAgIAotfQotc3NpemVfdCBTaGFyZWRCdWZmZXJDbGllbnQ6OlF1ZXVlVXBkYXRlOjpvcGVyYXRvcigpKCkgewotICAgIGFuZHJvaWRfYXRvbWljX2luYygmc3RhY2sucXVldWVkKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVNoYXJlZEJ1ZmZlckNsaWVudDo6RGVxdWV1ZVVwZGF0ZTo6RGVxdWV1ZVVwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpCi0gICAgOiBVcGRhdGVCYXNlKHNiYikgewotfQotc3NpemVfdCBTaGFyZWRCdWZmZXJDbGllbnQ6OkRlcXVldWVVcGRhdGU6Om9wZXJhdG9yKCkoKSB7Ci0gICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmc3RhY2suYXZhaWxhYmxlKSA9PSAwKSB7Ci0gICAgICAgIExPR1coImRlcXVldWUgcHJvYmFibHkgY2FsbGVkIGZyb20gbXVsdGlwbGUgdGhyZWFkcyEiKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1TaGFyZWRCdWZmZXJDbGllbnQ6OkNhbmNlbFVwZGF0ZTo6Q2FuY2VsVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwKLSAgICAgICAgaW50IHRhaWwsIGludCBidWYpCi0gICAgOiBVcGRhdGVCYXNlKHNiYiksIHRhaWwodGFpbCksIGJ1ZihidWYpIHsKLX0KLXNzaXplX3QgU2hhcmVkQnVmZmVyQ2xpZW50OjpDYW5jZWxVcGRhdGU6Om9wZXJhdG9yKCkoKSB7Ci0gICAgc3RhY2suaW5kZXhbdGFpbF0gPSBidWY7Ci0gICAgYW5kcm9pZF9hdG9taWNfaW5jKCZzdGFjay5hdmFpbGFibGUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotU2hhcmVkQnVmZmVyU2VydmVyOjpSZXRpcmVVcGRhdGU6OlJldGlyZVVwZGF0ZSgKLSAgICAgICAgU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgbnVtQnVmZmVycykKLSAgICA6IFVwZGF0ZUJhc2Uoc2JiKSwgbnVtQnVmZmVycyhudW1CdWZmZXJzKSB7Ci19Ci1zc2l6ZV90IFNoYXJlZEJ1ZmZlclNlcnZlcjo6UmV0aXJlVXBkYXRlOjpvcGVyYXRvcigpKCkgewotICAgIGludDMyX3QgaGVhZCA9IHN0YWNrLmhlYWQ7Ci0gICAgaWYgKHVpbnQzMl90KGhlYWQpID49IFNoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fQlVGRkVSX01BWCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIC8vIERlY3JlbWVudCB0aGUgbnVtYmVyIG9mIHF1ZXVlZCBidWZmZXJzIAotICAgIGludDMyX3QgcXVldWVkOwotICAgIGRvIHsKLSAgICAgICAgcXVldWVkID0gc3RhY2sucXVldWVkOwotICAgICAgICBpZiAocXVldWVkID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChhbmRyb2lkX2F0b21pY19jbXB4Y2hnKHF1ZXVlZCwgcXVldWVkLTEsICZzdGFjay5xdWV1ZWQpKTsKLSAgICAKLSAgICAvLyBsb2NrIHRoZSBidWZmZXIgYmVmb3JlIGFkdmFuY2luZyBoZWFkLCB3aGljaCBhdXRvbWF0aWNhbGx5IHVubG9ja3MKLSAgICAvLyB0aGUgYnVmZmVyIHdlIHByZXZlbnRpdmVseSBsb2NrZWQgdXBvbiBlbnRlcmluZyB0aGlzIGZ1bmN0aW9uCi0KLSAgICBoZWFkID0gKGhlYWQgKyAxKSAlIG51bUJ1ZmZlcnM7Ci0gICAgY29uc3QgaW50OF90IGhlYWRCdWYgPSBzdGFjay5pbmRleFtoZWFkXTsKLSAgICBzdGFjay5oZWFkQnVmID0gaGVhZEJ1ZjsKLQotICAgIC8vIGhlYWQgaXMgb25seSBtb2RpZmllZCBoZXJlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHVzZSBjbXB4Y2hnCi0gICAgYW5kcm9pZF9hdG9taWNfd3JpdGUoaGVhZCwgJnN0YWNrLmhlYWQpOwotCi0gICAgLy8gbm93IHRoYXQgaGVhZCBoYXMgbW92ZWQsIHdlIGNhbiBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYnVmZmVycwotICAgIGFuZHJvaWRfYXRvbWljX2luYygmc3RhY2suYXZhaWxhYmxlKTsKLSAgICByZXR1cm4gaGVhZDsKLX0KLQotU2hhcmVkQnVmZmVyU2VydmVyOjpTdGF0dXNVcGRhdGU6OlN0YXR1c1VwZGF0ZSgKLSAgICAgICAgU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBzdGF0dXNfdCBzdGF0dXMpCi0gICAgOiBVcGRhdGVCYXNlKHNiYiksIHN0YXR1cyhzdGF0dXMpIHsKLX0KLQotc3NpemVfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OlN0YXR1c1VwZGF0ZTo6b3BlcmF0b3IoKSgpIHsKLSAgICBhbmRyb2lkX2F0b21pY193cml0ZShzdGF0dXMsICZzdGFjay5zdGF0dXMpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TaGFyZWRCdWZmZXJDbGllbnQ6OlNoYXJlZEJ1ZmZlckNsaWVudChTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwKLSAgICAgICAgaW50IHN1cmZhY2UsIGludCBudW0sIGludDMyX3QgaWRlbnRpdHkpCi0gICAgOiBTaGFyZWRCdWZmZXJCYXNlKHNoYXJlZENsaWVudCwgc3VyZmFjZSwgaWRlbnRpdHkpLAotICAgICAgbU51bUJ1ZmZlcnMobnVtKSwgdGFpbCgwKQotewotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIHRhaWwgPSBjb21wdXRlVGFpbCgpOwotICAgIHF1ZXVlZF9oZWFkID0gc3RhY2suaGVhZDsKLX0KLQotaW50MzJfdCBTaGFyZWRCdWZmZXJDbGllbnQ6OmNvbXB1dGVUYWlsKCkgY29uc3QKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICByZXR1cm4gKG1OdW1CdWZmZXJzICsgc3RhY2suaGVhZCAtIHN0YWNrLmF2YWlsYWJsZSArIDEpICUgbU51bUJ1ZmZlcnM7Ci19Ci0KLXNzaXplX3QgU2hhcmVkQnVmZmVyQ2xpZW50OjpkZXF1ZXVlKCkKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLQotICAgIFJXTG9jazo6QXV0b1JMb2NrIF9yZChtTG9jayk7Ci0KLSAgICBjb25zdCBuc2Vjc190IGRlcXVldWVUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotCi0gICAgLy9MT0dEKCJbJWRdIGFib3V0IHRvIGRlcXVldWUgYSBidWZmZXIiLAotICAgIC8vICAgICAgICBtU2hhcmVkU3RhY2stPmlkZW50aXR5KTsKLSAgICBEZXF1ZXVlQ29uZGl0aW9uIGNvbmRpdGlvbih0aGlzKTsKLSAgICBzdGF0dXNfdCBlcnIgPSB3YWl0Rm9yQ29uZGl0aW9uKGNvbmRpdGlvbik7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIHNzaXplX3QoZXJyKTsKLQotICAgIERlcXVldWVVcGRhdGUgdXBkYXRlKHRoaXMpOwotICAgIHVwZGF0ZUNvbmRpdGlvbiggdXBkYXRlICk7Ci0KLSAgICBpbnQgZGVxdWV1ZWQgPSBzdGFjay5pbmRleFt0YWlsXTsKLSAgICB0YWlsID0gKCh0YWlsKzEgPj0gbU51bUJ1ZmZlcnMpID8gMCA6IHRhaWwrMSk7Ci0gICAgTE9HRF9JRihERUJVR19BVE9NSUNTLCAiZGVxdWV1ZWQ9JWQsIHRhaWwrKz0lZCwgJXMiLAotICAgICAgICAgICAgZGVxdWV1ZWQsIHRhaWwsIGR1bXAoIiIpLnN0cmluZygpKTsKLQotICAgIG1EZXF1ZXVlVGltZVtkZXF1ZXVlZF0gPSBkZXF1ZXVlVGltZTsgCi0KLSAgICByZXR1cm4gZGVxdWV1ZWQ7Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckNsaWVudDo6dW5kb0RlcXVldWUoaW50IGJ1ZikKLXsKLSAgICByZXR1cm4gY2FuY2VsKGJ1Zik7Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckNsaWVudDo6Y2FuY2VsKGludCBidWYpCi17Ci0gICAgUldMb2NrOjpBdXRvUkxvY2sgX3JkKG1Mb2NrKTsKLQotICAgIC8vIGNhbGN1bGF0ZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSB0YWlsIGluZGV4IChlc3NlbnRpYWxseSB0YWlsLS0pCi0gICAgaW50IGxvY2FsVGFpbCA9ICh0YWlsICsgbU51bUJ1ZmZlcnMgLSAxKSAlIG1OdW1CdWZmZXJzOwotICAgIENhbmNlbFVwZGF0ZSB1cGRhdGUodGhpcywgbG9jYWxUYWlsLCBidWYpOwotICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUNvbmRpdGlvbiggdXBkYXRlICk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICB0YWlsID0gbG9jYWxUYWlsOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJDbGllbnQ6OmxvY2soaW50IGJ1ZikKLXsKLSAgICBSV0xvY2s6OkF1dG9STG9jayBfcmQobUxvY2spOwotCi0gICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0gICAgTG9ja0NvbmRpdGlvbiBjb25kaXRpb24odGhpcywgYnVmKTsKLSAgICBzdGF0dXNfdCBlcnIgPSB3YWl0Rm9yQ29uZGl0aW9uKGNvbmRpdGlvbik7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgU2hhcmVkQnVmZmVyQ2xpZW50OjpxdWV1ZShpbnQgYnVmKQotewotICAgIFJXTG9jazo6QXV0b1JMb2NrIF9yZChtTG9jayk7Ci0KLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLQotICAgIHF1ZXVlZF9oZWFkID0gKHF1ZXVlZF9oZWFkICsgMSkgJSBtTnVtQnVmZmVyczsKLSAgICBzdGFjay5pbmRleFtxdWV1ZWRfaGVhZF0gPSBidWY7Ci0KLSAgICBRdWV1ZVVwZGF0ZSB1cGRhdGUodGhpcyk7Ci0gICAgc3RhdHVzX3QgZXJyID0gdXBkYXRlQ29uZGl0aW9uKCB1cGRhdGUgKTsKLSAgICBMT0dEX0lGKERFQlVHX0FUT01JQ1MsICJxdWV1ZWQ9JWQsICVzIiwgYnVmLCBkdW1wKCIiKS5zdHJpbmcoKSk7Ci0KLSAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBzdGFjay5zdGF0cy50b3RhbFRpbWUgPSBuczJ1cyhub3cgLSBtRGVxdWV1ZVRpbWVbYnVmXSk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1ib29sIFNoYXJlZEJ1ZmZlckNsaWVudDo6bmVlZE5ld0J1ZmZlcihpbnQgYnVmKSBjb25zdAotewotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAxPDwoMzEtYnVmKTsKLSAgICByZXR1cm4gKGFuZHJvaWRfYXRvbWljX2FuZCh+bWFzaywgJnN0YWNrLnJlYWxsb2NNYXNrKSAmIG1hc2spICE9IDA7Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckNsaWVudDo6c2V0Q3JvcChpbnQgYnVmLCBjb25zdCBSZWN0JiBjcm9wKQotewotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIHJldHVybiBzdGFjay5zZXRDcm9wKGJ1ZiwgY3JvcCk7Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckNsaWVudDo6c2V0VHJhbnNmb3JtKGludCBidWYsIHVpbnQzMl90IHRyYW5zZm9ybSkKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICByZXR1cm4gc3RhY2suc2V0VHJhbnNmb3JtKGJ1ZiwgdWludDhfdCh0cmFuc2Zvcm0pKTsKLX0KLQotc3RhdHVzX3QgU2hhcmVkQnVmZmVyQ2xpZW50OjpzZXREaXJ0eVJlZ2lvbihpbnQgYnVmLCBjb25zdCBSZWdpb24mIHJlZykKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICByZXR1cm4gc3RhY2suc2V0RGlydHlSZWdpb24oYnVmLCByZWcpOwotfQotCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJDbGllbnQ6OnNldEJ1ZmZlckNvdW50KAotICAgICAgICBpbnQgYnVmZmVyQ291bnQsIGNvbnN0IFNldEJ1ZmZlckNvdW50Q2FsbGJhY2smIGlwYykKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICBpZiAodWludDMyX3QoYnVmZmVyQ291bnQpID49IFNoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fQlVGRkVSX01BWCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmICh1aW50MzJfdChidWZmZXJDb3VudCkgPCBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0JVRkZFUl9NSU4pCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBSV0xvY2s6OkF1dG9XTG9jayBfd3IobUxvY2spOwotCi0gICAgc3RhdHVzX3QgZXJyID0gaXBjKGJ1ZmZlckNvdW50KTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1OdW1CdWZmZXJzID0gYnVmZmVyQ291bnQ7Ci0gICAgICAgIHF1ZXVlZF9oZWFkID0gKHN0YWNrLmhlYWQgKyBzdGFjay5xdWV1ZWQpICUgbU51bUJ1ZmZlcnM7Ci0gICAgICAgIHRhaWwgPSBjb21wdXRlVGFpbCgpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNoYXJlZEJ1ZmZlclNlcnZlcjo6U2hhcmVkQnVmZmVyU2VydmVyKFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LAotICAgICAgICBpbnQgc3VyZmFjZSwgaW50IG51bSwgaW50MzJfdCBpZGVudGl0eSkKLSAgICA6IFNoYXJlZEJ1ZmZlckJhc2Uoc2hhcmVkQ2xpZW50LCBzdXJmYWNlLCBpZGVudGl0eSksCi0gICAgICBtTnVtQnVmZmVycyhudW0pCi17Ci0gICAgbVNoYXJlZFN0YWNrLT5pbml0KGlkZW50aXR5KTsKLSAgICBtU2hhcmVkU3RhY2stPnRva2VuID0gc3VyZmFjZTsKLSAgICBtU2hhcmVkU3RhY2stPmhlYWQgPSBudW0tMTsKLSAgICBtU2hhcmVkU3RhY2stPmF2YWlsYWJsZSA9IG51bTsKLSAgICBtU2hhcmVkU3RhY2stPnF1ZXVlZCA9IDA7Ci0gICAgbVNoYXJlZFN0YWNrLT5yZWFsbG9jTWFzayA9IDA7Ci0gICAgbWVtc2V0KG1TaGFyZWRTdGFjay0+YnVmZmVycywgMCwgc2l6ZW9mKG1TaGFyZWRTdGFjay0+YnVmZmVycykpOwotICAgIGZvciAoaW50IGk9MCA7IGk8bnVtIDsgaSsrKSB7Ci0gICAgICAgIG1CdWZmZXJMaXN0LmFkZChpKTsKLSAgICAgICAgbVNoYXJlZFN0YWNrLT5pbmRleFtpXSA9IGk7Ci0gICAgfQotfQotCi1TaGFyZWRCdWZmZXJTZXJ2ZXI6On5TaGFyZWRCdWZmZXJTZXJ2ZXIoKQotewotfQotCi1zc2l6ZV90IFNoYXJlZEJ1ZmZlclNlcnZlcjo6cmV0aXJlQW5kTG9jaygpCi17Ci0gICAgUldMb2NrOjpBdXRvUkxvY2sgX2wobUxvY2spOwotCi0gICAgUmV0aXJlVXBkYXRlIHVwZGF0ZSh0aGlzLCBtTnVtQnVmZmVycyk7Ci0gICAgc3NpemVfdCBidWYgPSB1cGRhdGVDb25kaXRpb24oIHVwZGF0ZSApOwotICAgIGlmIChidWYgPj0gMCkgewotICAgICAgICBpZiAodWludDMyX3QoYnVmKSA+PSBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0JVRkZFUl9NQVgpCi0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICAgICAgYnVmID0gc3RhY2suaW5kZXhbYnVmXTsKLSAgICAgICAgTE9HRF9JRihERUJVR19BVE9NSUNTICYmIGJ1Zj49MCwgInJldGlyZT0lZCwgJXMiLAotICAgICAgICAgICAgICAgIGludChidWYpLCBkdW1wKCIiKS5zdHJpbmcoKSk7Ci0gICAgfQotICAgIHJldHVybiBidWY7Ci19Ci0KLXZvaWQgU2hhcmVkQnVmZmVyU2VydmVyOjpzZXRTdGF0dXMoc3RhdHVzX3Qgc3RhdHVzKQotewotICAgIGlmIChzdGF0dXMgPCBOT19FUlJPUikgewotICAgICAgICBTdGF0dXNVcGRhdGUgdXBkYXRlKHRoaXMsIHN0YXR1cyk7Ci0gICAgICAgIHVwZGF0ZUNvbmRpdGlvbiggdXBkYXRlICk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OnJlYWxsb2NhdGVBbGwoKQotewotICAgIFJXTG9jazo6QXV0b1JMb2NrIF9sKG1Mb2NrKTsKLQotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIHVpbnQzMl90IG1hc2sgPSBtQnVmZmVyTGlzdC5nZXRNYXNrKCk7Ci0gICAgYW5kcm9pZF9hdG9taWNfb3IobWFzaywgJnN0YWNrLnJlYWxsb2NNYXNrKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFNoYXJlZEJ1ZmZlclNlcnZlcjo6cmVhbGxvY2F0ZUFsbEV4Y2VwdChpbnQgYnVmZmVyKQotewotICAgIFJXTG9jazo6QXV0b1JMb2NrIF9sKG1Mb2NrKTsKLQotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIEJ1ZmZlckxpc3QgdGVtcChtQnVmZmVyTGlzdCk7Ci0gICAgdGVtcC5yZW1vdmUoYnVmZmVyKTsKLSAgICB1aW50MzJfdCBtYXNrID0gdGVtcC5nZXRNYXNrKCk7Ci0gICAgYW5kcm9pZF9hdG9taWNfb3IobWFzaywgJnN0YWNrLnJlYWxsb2NNYXNrKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWludDMyX3QgU2hhcmVkQnVmZmVyU2VydmVyOjpnZXRRdWV1ZWRDb3VudCgpIGNvbnN0Ci17Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0gICAgcmV0dXJuIHN0YWNrLnF1ZXVlZDsKLX0KLQotUmVnaW9uIFNoYXJlZEJ1ZmZlclNlcnZlcjo6Z2V0RGlydHlSZWdpb24oaW50IGJ1ZikgY29uc3QKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICByZXR1cm4gc3RhY2suZ2V0RGlydHlSZWdpb24oYnVmKTsKLX0KLQotUmVjdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OmdldENyb3AoaW50IGJ1ZikgY29uc3QKLXsKLSAgICBTaGFyZWRCdWZmZXJTdGFjayYgc3RhY2soICptU2hhcmVkU3RhY2sgKTsKLSAgICByZXR1cm4gc3RhY2suZ2V0Q3JvcChidWYpOwotfQotCi11aW50MzJfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OmdldFRyYW5zZm9ybShpbnQgYnVmKSBjb25zdAotewotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIHJldHVybiBzdGFjay5nZXRUcmFuc2Zvcm0oYnVmKTsKLX0KLQotLyoKLSAqIE5PVEU6IHRoaXMgaXMgbm90IHRocmVhZC1zYWZlIG9uIHRoZSBzZXJ2ZXItc2lkZSwgbWVhbmluZwotICogJ2hlYWQnIGNhbm5vdCBtb3ZlIGR1cmluZyB0aGlzIG9wZXJhdGlvbi4gVGhlIGNsaWVudC1zaWRlCi0gKiBjYW4gc2FmZWx5IG9wZXJhdGUgYW4gdXN1YWwuCi0gKgotICovCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OnJlc2l6ZShpbnQgbmV3TnVtQnVmZmVycykKLXsKLSAgICBpZiAoKHVuc2lnbmVkIGludCkobmV3TnVtQnVmZmVycykgPCBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0JVRkZFUl9NSU4gfHwKLSAgICAgICAgKHVuc2lnbmVkIGludCkobmV3TnVtQnVmZmVycykgPiBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0JVRkZFUl9NQVgpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBSV0xvY2s6OkF1dG9XTG9jayBfbChtTG9jayk7Ci0KLSAgICBpZiAobmV3TnVtQnVmZmVycyA8IG1OdW1CdWZmZXJzKSB7Ci0gICAgICAgIHJldHVybiBzaHJpbmsobmV3TnVtQnVmZmVycyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGdyb3cobmV3TnVtQnVmZmVycyk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6Omdyb3coaW50IG5ld051bUJ1ZmZlcnMpCi17Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0gICAgY29uc3QgaW50IG51bUJ1ZmZlcnMgPSBtTnVtQnVmZmVyczsKLSAgICBjb25zdCBpbnQgZXh0cmEgPSBuZXdOdW1CdWZmZXJzIC0gbnVtQnVmZmVyczsKLQotICAgIC8vIHJlYWQgdGhlIGhlYWQsIG1ha2Ugc3VyZSBpdCdzIHZhbGlkCi0gICAgaW50MzJfdCBoZWFkID0gc3RhY2suaGVhZDsKLSAgICBpZiAodWludDMyX3QoaGVhZCkgPj0gU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9CVUZGRVJfTUFYKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgaW50IGJhc2UgPSBudW1CdWZmZXJzOwotICAgIGludDMyX3QgYXZhaWwgPSBzdGFjay5hdmFpbGFibGU7Ci0gICAgaW50IHRhaWwgPSBoZWFkIC0gYXZhaWwgKyAxOwotCi0gICAgaWYgKHRhaWwgPj0gMCkgewotICAgICAgICBpbnQ4X3QqIGNvbnN0IGluZGV4ID0gY29uc3RfY2FzdDxpbnQ4X3QqPihzdGFjay5pbmRleCk7Ci0gICAgICAgIGNvbnN0IGludCBuYiA9IG51bUJ1ZmZlcnMgLSBoZWFkOwotICAgICAgICBtZW1tb3ZlKCZpbmRleFtoZWFkICsgZXh0cmFdLCAmaW5kZXhbaGVhZF0sIG5iKTsKLSAgICAgICAgYmFzZSA9IGhlYWQ7Ci0gICAgICAgIC8vIG1vdmUgaGVhZCAnZXh0cmEnIGFoZWFkLCB0aGlzIGRvZXNuJ3QgaW1wYWN0IHN0YWNrLmluZGV4W2hlYWRdOwotICAgICAgICBzdGFjay5oZWFkID0gaGVhZCArIGV4dHJhOwotICAgIH0KLSAgICBzdGFjay5hdmFpbGFibGUgKz0gZXh0cmE7Ci0KLSAgICAvLyBmaWxsIHRoZSBuZXcgZnJlZSBzcGFjZSB3aXRoIHVudXNlZCBidWZmZXJzCi0gICAgQnVmZmVyTGlzdDo6Y29uc3RfaXRlcmF0b3IgY3VycihtQnVmZmVyTGlzdC5mcmVlX2JlZ2luKCkpOwotICAgIGZvciAoaW50IGk9MCA7IGk8ZXh0cmEgOyBpKyspIHsKLSAgICAgICAgc3RhY2suaW5kZXhbYmFzZStpXSA9ICpjdXJyOwotICAgICAgICBtQnVmZmVyTGlzdC5hZGQoKmN1cnIpOwotICAgICAgICArK2N1cnI7Ci0gICAgfQotCi0gICAgbU51bUJ1ZmZlcnMgPSBuZXdOdW1CdWZmZXJzOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU2hhcmVkQnVmZmVyU2VydmVyOjpzaHJpbmsoaW50IG5ld051bUJ1ZmZlcnMpCi17Ci0gICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrKCAqbVNoYXJlZFN0YWNrICk7Ci0KLSAgICAvLyBTaHJpbmtpbmcgaXMgb25seSBzdXBwb3J0ZWQgaWYgdGhlcmUgYXJlIG5vIGJ1ZmZlcnMgY3VycmVudGx5IGRlcXVldWVkLgotICAgIGludDMyX3QgYXZhaWwgPSBzdGFjay5hdmFpbGFibGU7Ci0gICAgaW50MzJfdCBxdWV1ZWQgPSBzdGFjay5xdWV1ZWQ7Ci0gICAgaWYgKGF2YWlsICsgcXVldWVkICE9IG1OdW1CdWZmZXJzKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICAvLyBXYWl0IGZvciBhbnkgcXVldWVkIGJ1ZmZlcnMgdG8gYmUgZGlzcGxheWVkLgotICAgIEJ1ZmZlcnNBdmFpbGFibGVDb25kaXRpb24gY29uZGl0aW9uKHRoaXMsIG1OdW1CdWZmZXJzKTsKLSAgICBzdGF0dXNfdCBlcnIgPSB3YWl0Rm9yQ29uZGl0aW9uKGNvbmRpdGlvbik7Ci0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvLyBSZXNldCBoZWFkIHRvIGluZGV4IDAgYW5kIG1ha2UgaXQgcmVmZXIgdG8gYnVmZmVyIDAuICBUaGUgc2FtZSByZW5hbWluZwotICAgIC8vIChoZWFkIC0+IDApIGlzIGRvbmUgaW4gdGhlIEJ1ZmZlck1hbmFnZXIuCi0gICAgaW50MzJfdCBoZWFkID0gc3RhY2suaGVhZDsKLSAgICBpbnQ4X3QqIGluZGV4ID0gY29uc3RfY2FzdDxpbnQ4X3QqPihzdGFjay5pbmRleCk7Ci0gICAgZm9yIChpbnQ4X3QgaSA9IDA7IGkgPCBuZXdOdW1CdWZmZXJzOyBpKyspIHsKLSAgICAgICAgaW5kZXhbaV0gPSBpOwotICAgIH0KLSAgICBzdGFjay5oZWFkID0gMDsKLSAgICBzdGFjay5oZWFkQnVmID0gMDsKLQotICAgIC8vIEZyZWUgdGhlIGJ1ZmZlcnMgZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0IHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgZm9yIChpbnQgaSA9IG5ld051bUJ1ZmZlcnM7IGkgPCBtTnVtQnVmZmVyczsgaSsrKSB7Ci0gICAgICAgIG1CdWZmZXJMaXN0LnJlbW92ZShpKTsKLSAgICB9Ci0KLSAgICAvLyBUZWxsIHRoZSBjbGllbnQgdG8gcmVhbGxvY2F0ZSBhbGwgdGhlIGJ1ZmZlcnMuCi0gICAgcmVhbGxvY2F0ZUFsbCgpOwotCi0gICAgbU51bUJ1ZmZlcnMgPSBuZXdOdW1CdWZmZXJzOwotICAgIHN0YWNrLmF2YWlsYWJsZSA9IG5ld051bUJ1ZmZlcnM7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLVNoYXJlZEJ1ZmZlclN0YWNrOjpTdGF0aXN0aWNzIFNoYXJlZEJ1ZmZlclNlcnZlcjo6Z2V0U3RhdHMoKSBjb25zdAotewotICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIHJldHVybiBzdGFjay5zdGF0czsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OkJ1ZmZlckxpc3Q6OmFkZChpbnQgdmFsdWUpCi17Ci0gICAgaWYgKHVpbnQzMl90KHZhbHVlKSA+PSBtQ2FwYWNpdHkpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgdWludDMyX3QgbWFzayA9IDE8PCgzMS12YWx1ZSk7Ci0gICAgaWYgKG1MaXN0ICYgbWFzaykKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIG1MaXN0IHw9IG1hc2s7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTaGFyZWRCdWZmZXJTZXJ2ZXI6OkJ1ZmZlckxpc3Q6OnJlbW92ZShpbnQgdmFsdWUpCi17Ci0gICAgaWYgKHVpbnQzMl90KHZhbHVlKSA+PSBtQ2FwYWNpdHkpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgdWludDMyX3QgbWFzayA9IDE8PCgzMS12YWx1ZSk7Ci0gICAgaWYgKCEobUxpc3QgJiBtYXNrKSkKLSAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIG1MaXN0ICY9IH5tYXNrOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TdXJmYWNlLmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2UuY3BwCmluZGV4IDBjNTc2N2IuLjRkMWQ5MjMgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL1N1cmZhY2UuY3BwCisrKyBiL2xpYnMvZ3VpL1N1cmZhY2UuY3BwCkBAIC0yMSwxMyArMjEsMTUgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisKKyNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaD4KIAogI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgpAQCAtMzUsMTIgKzM3LDExIEBACiAjaW5jbHVkZSA8dWkvR3JhcGhpY0xvZy5oPgogI2luY2x1ZGUgPHVpL1JlY3QuaD4KIAotI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlQ29tcG9zZXIuaD4KKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAKLSNpbmNsdWRlIDxwcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9zdXJmYWNlZmxpbmdlci9MYXllclN0YXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI3Myw1OCArMjc0LDEwIEBACiAvLyAgU3VyZmFjZQogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1jbGFzcyBTdXJmYWNlQ2xpZW50IDogcHVibGljIFNpbmdsZXRvbjxTdXJmYWNlQ2xpZW50PgotewotICAgIC8vIGFsbCB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBjb25zdGFudHMKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXJTZXJ2aWNlOwotICAgIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1DbGllbnQ7Ci0gICAgc3RhdHVzX3QgbVN0YXR1czsKLSAgICBTaGFyZWRDbGllbnQqIG1Db250cm9sOwotICAgIHNwPElNZW1vcnlIZWFwPiBtQ29udHJvbE1lbW9yeTsKLQotICAgIFN1cmZhY2VDbGllbnQoKQotICAgICAgICA6IFNpbmdsZXRvbjxTdXJmYWNlQ2xpZW50PigpLCBtU3RhdHVzKE5PX0lOSVQpCi0gICAgewotICAgICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLSAgICAgICAgbUNvbXBvc2VyU2VydmljZSA9IHNmOwotICAgICAgICBtQ2xpZW50ID0gc2YtPmNyZWF0ZUNsaWVudENvbm5lY3Rpb24oKTsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgbUNvbnRyb2xNZW1vcnkgPSBtQ2xpZW50LT5nZXRDb250cm9sQmxvY2soKTsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbE1lbW9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2wgPSBzdGF0aWNfY2FzdDxTaGFyZWRDbGllbnQgKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbE1lbW9yeS0+Z2V0QmFzZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPFN1cmZhY2VDbGllbnQ+OwotcHVibGljOgotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdGF0dXM7Ci0gICAgfQotICAgIFNoYXJlZENsaWVudCogZ2V0U2hhcmVkQ2xpZW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUNvbnRyb2w7Ci0gICAgfQotICAgIHNzaXplX3QgZ2V0VG9rZW5Gb3JTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyKSBjb25zdCB7Ci0gICAgICAgIC8vIFRPRE86IHdlIGNvdWxkIGNhY2hlIGEgZmV3IHRva2VucyBoZXJlIHRvIGF2b2lkIGFuIElQQwotICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0VG9rZW5Gb3JTdXJmYWNlKHN1cik7Ci0gICAgfQotICAgIHZvaWQgc2lnbmFsU2VydmVyKCkgY29uc3QgewotICAgICAgICBtQ29tcG9zZXJTZXJ2aWNlLT5zaWduYWwoKTsKLSAgICB9Ci19OwotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoU3VyZmFjZUNsaWVudCk7Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBTdXJmYWNlOjpTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgc3VyZmFjZSkKLSAgICA6IG1CdWZmZXJNYXBwZXIoR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkpLAotICAgICAgbUNsaWVudChTdXJmYWNlQ2xpZW50OjpnZXRJbnN0YW5jZSgpKSwKLSAgICAgIG1TaGFyZWRCdWZmZXJDbGllbnQoTlVMTCksCi0gICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1TdXJmYWNlKHN1cmZhY2UtPm1TdXJmYWNlKSwKICAgICAgIG1JZGVudGl0eShzdXJmYWNlLT5tSWRlbnRpdHkpLAogICAgICAgbUZvcm1hdChzdXJmYWNlLT5tRm9ybWF0KSwgbUZsYWdzKHN1cmZhY2UtPm1GbGFncyksCkBAIC0zMzQsMTAgKzI4Nyw3IEBACiB9CiAKIFN1cmZhY2U6OlN1cmZhY2UoY29uc3QgUGFyY2VsJiBwYXJjZWwsIGNvbnN0IHNwPElCaW5kZXI+JiByZWYpCi0gICAgOiBtQnVmZmVyTWFwcGVyKEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpKSwKLSAgICAgIG1DbGllbnQoU3VyZmFjZUNsaWVudDo6Z2V0SW5zdGFuY2UoKSksCi0gICAgICBtU2hhcmVkQnVmZmVyQ2xpZW50KE5VTEwpLAotICAgICAgbUluaXRDaGVjayhOT19JTklUKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKQogewogICAgIG1TdXJmYWNlICAgID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2U+KHJlZik7CiAgICAgbUlkZW50aXR5ICAgPSBwYXJjZWwucmVhZEludDMyKCk7CkBAIC0zODIsNyArMzMyLDYgQEAKIAogfQogCi0KIE11dGV4IFN1cmZhY2U6OnNDYWNoZWRTdXJmYWNlc0xvY2s7CiBEZWZhdWx0S2V5ZWRWZWN0b3I8d3A8SUJpbmRlcj4sIHdwPFN1cmZhY2U+ID4gU3VyZmFjZTo6c0NhY2hlZFN1cmZhY2VzOwogCkBAIC00MjIsMzIgKzM3MSwyOSBAQAogICAgIEFOYXRpdmVXaW5kb3c6OnF1ZXJ5ICAgICAgICAgICAgPSBxdWVyeTsKICAgICBBTmF0aXZlV2luZG93OjpwZXJmb3JtICAgICAgICAgID0gcGVyZm9ybTsKIAotICAgIERpc3BsYXlJbmZvIGRpbmZvOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oMCwgJmRpbmZvKTsKLSAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eGRwaSkgPSBkaW5mby54ZHBpOwotICAgIGNvbnN0X2Nhc3Q8ZmxvYXQmPihBTmF0aXZlV2luZG93Ojp5ZHBpKSA9IGRpbmZvLnlkcGk7Ci0gICAgLy8gRklYTUU6IHNldCByZWFsIHZhbHVlcyBoZXJlCi0gICAgY29uc3RfY2FzdDxpbnQmPihBTmF0aXZlV2luZG93OjptaW5Td2FwSW50ZXJ2YWwpID0gMTsKLSAgICBjb25zdF9jYXN0PGludCY+KEFOYXRpdmVXaW5kb3c6Om1heFN3YXBJbnRlcnZhbCkgPSAxOwotICAgIGNvbnN0X2Nhc3Q8dWludDMyX3QmPihBTmF0aXZlV2luZG93OjpmbGFncykgPSAwOworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gc3VyZmFjZVRleHR1cmUobVN1cmZhY2UtPmdldFN1cmZhY2VUZXh0dXJlKCkpOworICAgICAgICBMT0dFX0lGKHN1cmZhY2VUZXh0dXJlPT0wLCAiZ290IGEgTlVMTCBJU3VyZmFjZVRleHR1cmUgZnJvbSBJU3VyZmFjZSIpOworICAgICAgICBpZiAoc3VyZmFjZVRleHR1cmUgIT0gTlVMTCkgeworICAgICAgICAgICAgbVN1cmZhY2VUZXh0dXJlQ2xpZW50ID0gbmV3IFN1cmZhY2VUZXh0dXJlQ2xpZW50KHN1cmZhY2VUZXh0dXJlKTsKKyAgICAgICAgICAgIG1TdXJmYWNlVGV4dHVyZUNsaWVudC0+c2V0VXNhZ2UoR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfUkVOREVSKTsKKyAgICAgICAgfQogCi0gICAgbU5leHRCdWZmZXJUcmFuc2Zvcm0gPSAwOwotICAgIG1Db25uZWN0ZWQgPSAwOwotICAgIG1Td2FwUmVjdGFuZ2xlLm1ha2VJbnZhbGlkKCk7Ci0gICAgbU5leHRCdWZmZXJDcm9wID0gUmVjdCgwLDApOwotICAgIC8vIHR3byBidWZmZXJzIGJ5IGRlZmF1bHQKLSAgICBtQnVmZmVycy5zZXRDYXBhY2l0eSgyKTsKLSAgICBtQnVmZmVycy5pbnNlcnRBdCgwLCAyKTsKKyAgICAgICAgRGlzcGxheUluZm8gZGluZm87CisgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oMCwgJmRpbmZvKTsKKyAgICAgICAgY29uc3RfY2FzdDxmbG9hdCY+KEFOYXRpdmVXaW5kb3c6OnhkcGkpID0gZGluZm8ueGRwaTsKKyAgICAgICAgY29uc3RfY2FzdDxmbG9hdCY+KEFOYXRpdmVXaW5kb3c6OnlkcGkpID0gZGluZm8ueWRwaTsKIAotICAgIGlmIChtU3VyZmFjZSAhPSAwICYmIG1DbGllbnQuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaW50MzJfdCB0b2tlbiA9IG1DbGllbnQuZ2V0VG9rZW5Gb3JTdXJmYWNlKG1TdXJmYWNlKTsKLSAgICAgICAgaWYgKHRva2VuID49IDApIHsKLSAgICAgICAgICAgIG1TaGFyZWRCdWZmZXJDbGllbnQgPSBuZXcgU2hhcmVkQnVmZmVyQ2xpZW50KAotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LmdldFNoYXJlZENsaWVudCgpLCB0b2tlbiwgMiwgbUlkZW50aXR5KTsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBtQ2xpZW50LmdldFNoYXJlZENsaWVudCgpLT52YWxpZGF0ZSh0b2tlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dXKCJOb3QgaW5pdGlhbGl6aW5nIHRoZSBzaGFyZWQgYnVmZmVyIGNsaWVudCBiZWNhdXNlIHRva2VuID0gJWQiLAotICAgICAgICAgICAgICAgICAgICB0b2tlbik7CisgICAgICAgIGNvbnN0X2Nhc3Q8aW50Jj4oQU5hdGl2ZVdpbmRvdzo6bWluU3dhcEludGVydmFsKSA9CisgICAgICAgICAgICAgICAgbVN1cmZhY2VUZXh0dXJlQ2xpZW50LT5taW5Td2FwSW50ZXJ2YWw7CisKKyAgICAgICAgY29uc3RfY2FzdDxpbnQmPihBTmF0aXZlV2luZG93OjptYXhTd2FwSW50ZXJ2YWwpID0KKyAgICAgICAgICAgICAgICBtU3VyZmFjZVRleHR1cmVDbGllbnQtPm1heFN3YXBJbnRlcnZhbDsKKworICAgICAgICBjb25zdF9jYXN0PHVpbnQzMl90Jj4oQU5hdGl2ZVdpbmRvdzo6ZmxhZ3MpID0gMDsKKworICAgICAgICBpZiAobVN1cmZhY2VUZXh0dXJlQ2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBOT19FUlJPUjsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTQ1Niw5ICs0MDIsOCBAQAogewogICAgIC8vIGNsZWFyIGFsbCByZWZlcmVuY2VzIGFuZCB0cmlnZ2VyIGFuIElQQyBub3csIHRvIG1ha2Ugc3VyZSB0aGluZ3MKICAgICAvLyBoYXBwZW4gd2l0aG91dCBkZWxheSwgc2luY2UgdGhlc2UgcmVzb3VyY2VzIGFyZSBxdWl0ZSBoZWF2eS4KLSAgICBtQnVmZmVycy5jbGVhcigpOworICAgIG1TdXJmYWNlVGV4dHVyZUNsaWVudC5jbGVhcigpOwogICAgIG1TdXJmYWNlLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1TaGFyZWRCdWZmZXJDbGllbnQ7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogfQogCkBAIC00NzMsMzIgKzQxOCw2IEBACiAgICAgICAgIExPR0UoImludmFsaWQgdG9rZW4gKGlkZW50aXR5PSV1KSIsIG1JZGVudGl0eSk7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KLQotICAgIC8vIHZlcmlmeSB0aGUgaWRlbnRpdHkgb2YgdGhpcyBzdXJmYWNlCi0gICAgdWludDMyX3QgaWRlbnRpdHkgPSBtU2hhcmVkQnVmZmVyQ2xpZW50LT5nZXRJZGVudGl0eSgpOwotICAgIGlmIChtSWRlbnRpdHkgIT0gaWRlbnRpdHkpIHsKLSAgICAgICAgTE9HRSgiW1N1cmZhY2VdIHVzaW5nIGFuIGludmFsaWQgc3VyZmFjZSwgIgotICAgICAgICAgICAgICAgICJpZGVudGl0eT0ldSBzaG91bGQgYmUgJWQiLAotICAgICAgICAgICAgICAgIG1JZGVudGl0eSwgaWRlbnRpdHkpOwotICAgICAgICBDYWxsU3RhY2sgc3RhY2s7Ci0gICAgICAgIHN0YWNrLnVwZGF0ZSgpOwotICAgICAgICBzdGFjay5kdW1wKCJTdXJmYWNlIik7Ci0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgdGhlIHN1cmZhY2UgZGlkbid0IGJlY29tZSBpbnZhbGlkCi0gICAgc3RhdHVzX3QgZXJyID0gbVNoYXJlZEJ1ZmZlckNsaWVudC0+Z2V0U3RhdHVzKCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBpZiAoIWluQ2FuY2VsQnVmZmVyKSB7Ci0gICAgICAgICAgICBMT0dFKCJzdXJmYWNlIChpZGVudGl0eT0ldSkgaXMgaW52YWxpZCwgZXJyPSVkICglcykiLAotICAgICAgICAgICAgICAgICAgICBtSWRlbnRpdHksIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgQ2FsbFN0YWNrIHN0YWNrOwotICAgICAgICAgICAgc3RhY2sudXBkYXRlKCk7Ci0gICAgICAgICAgICBzdGFjay5kdW1wKCJTdXJmYWNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTUwOSw3ICs0MjgsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBpbnQgU3VyZmFjZTo6c2V0U3dhcEludGVydmFsKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IGludGVydmFsKSB7Ci0gICAgcmV0dXJuIDA7CisgICAgU3VyZmFjZSogc2VsZiA9IGdldFNlbGYod2luZG93KTsKKyAgICByZXR1cm4gc2VsZi0+c2V0U3dhcEludGVydmFsKGludGVydmFsKTsKIH0KIAogaW50IFN1cmZhY2U6OmRlcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCAKQEAgLTU1NCwzODMgKzQ3NCw1MiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWJvb2wgU3VyZmFjZTo6bmVlZE5ld0J1ZmZlcihpbnQgYnVmSWR4LAotICAgICAgICB1aW50MzJfdCAqcFdpZHRoLCB1aW50MzJfdCAqcEhlaWdodCwKLSAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsIHVpbnQzMl90ICpwVXNhZ2UpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdXJmYWNlTG9jayk7Ci0KLSAgICAvLyBBbHdheXMgY2FsbCBuZWVkTmV3QnVmZmVyKCksIHNpbmNlIGl0IGNsZWFycyB0aGUgbmVlZGVkIGJ1ZmZlcnMgZmxhZ3MKLSAgICBib29sIG5lZWROZXdCdWZmZXIgPSBtU2hhcmVkQnVmZmVyQ2xpZW50LT5uZWVkTmV3QnVmZmVyKGJ1ZklkeCk7Ci0gICAgYm9vbCB2YWxpZEJ1ZmZlciA9IG1CdWZmZXJJbmZvLnZhbGlkYXRlQnVmZmVyKG1CdWZmZXJzW2J1ZklkeF0pOwotICAgIGJvb2wgbmV3TmVld0J1ZmZlciA9IG5lZWROZXdCdWZmZXIgfHwgIXZhbGlkQnVmZmVyOwotICAgIGlmIChuZXdOZWV3QnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXJJbmZvLmdldChwV2lkdGgsIHBIZWlnaHQsIHBGb3JtYXQsIHBVc2FnZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXdOZWV3QnVmZmVyOworaW50IFN1cmZhY2U6OnNldFN3YXBJbnRlcnZhbChpbnQgaW50ZXJ2YWwpIHsKKyAgICByZXR1cm4gbVN1cmZhY2VUZXh0dXJlQ2xpZW50LT5zZXRTd2FwSW50ZXJ2YWwoaW50ZXJ2YWwpOwogfQogCi1pbnQgU3VyZmFjZTo6ZGVxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiogYnVmZmVyKQotewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIGVycjsKLQotICAgIEdyYXBoaWNMb2cmIGxvZ2dlcihHcmFwaGljTG9nOjpnZXRJbnN0YW5jZSgpKTsKLSAgICBsb2dnZXIubG9nKEdyYXBoaWNMb2c6OlNGX0FQUF9ERVFVRVVFX0JFRk9SRSwgbUlkZW50aXR5LCAtMSk7Ci0KLSAgICBzc2l6ZV90IGJ1ZklkeCA9IG1TaGFyZWRCdWZmZXJDbGllbnQtPmRlcXVldWUoKTsKLQotICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfQVBQX0RFUVVFVUVfQUZURVIsIG1JZGVudGl0eSwgYnVmSWR4KTsKLQotICAgIGlmIChidWZJZHggPCAwKSB7Ci0gICAgICAgIExPR0UoImVycm9yIGRlcXVldWluZyBhIGJ1ZmZlciAoJXMpIiwgc3RyZXJyb3IoYnVmSWR4KSk7Ci0gICAgICAgIHJldHVybiBidWZJZHg7Ci0gICAgfQotCi0gICAgLy8gZ3JvdyB0aGUgYnVmZmVyIGFycmF5IGlmIG5lZWRlZAotICAgIGNvbnN0IHNpemVfdCBzaXplID0gbUJ1ZmZlcnMuc2l6ZSgpOwotICAgIGNvbnN0IHNpemVfdCBuZWVkZWQgPSBidWZJZHgrMTsKLSAgICBpZiAoc2l6ZSA8IG5lZWRlZCkgewotICAgICAgICBtQnVmZmVycy5pbnNlcnRBdChzaXplLCBuZWVkZWQtc2l6ZSk7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdywgaCwgZm9ybWF0LCB1c2FnZTsKLSAgICBpZiAobmVlZE5ld0J1ZmZlcihidWZJZHgsICZ3LCAmaCwgJmZvcm1hdCwgJnVzYWdlKSkgewotICAgICAgICBlcnIgPSBnZXRCdWZmZXJMb2NrZWQoYnVmSWR4LCB3LCBoLCBmb3JtYXQsIHVzYWdlKTsKLSAgICAgICAgTE9HRV9JRihlcnIsICJnZXRCdWZmZXJMb2NrZWQoJWxkLCAldSwgJXUsICV1LCAlMDh4KSBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgYnVmSWR4LCB3LCBoLCBmb3JtYXQsIHVzYWdlLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIC8vIHJlc2V0IHRoZSB3aWR0aC9oZWlnaHQgd2l0aCB0aGUgd2hhdCB3ZSBnZXQgZnJvbSB0aGUgYnVmZmVyCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYmFja0J1ZmZlcihtQnVmZmVyc1tidWZJZHhdKTsKLSAgICAgICAgICAgIG1XaWR0aCAgPSB1aW50MzJfdChiYWNrQnVmZmVyLT53aWR0aCk7Ci0gICAgICAgICAgICBtSGVpZ2h0ID0gdWludDMyX3QoYmFja0J1ZmZlci0+aGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSBidWZmZXIgaGVyZSwgd2UgcHJvYmFibHkgcmFuIG91dCBvZiBtZW1vcnkKLSAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYmFja0J1ZmZlcihtQnVmZmVyc1tidWZJZHhdKTsKLSAgICBpZiAoIWVyciAmJiBiYWNrQnVmZmVyPT0wKSB7Ci0gICAgICAgIGVyciA9IE5PX01FTU9SWTsKLSAgICB9Ci0KK2ludCBTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqKiBidWZmZXIpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtU3VyZmFjZVRleHR1cmVDbGllbnQtPmRlcXVldWVCdWZmZXIoYnVmZmVyKTsKICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1EaXJ0eVJlZ2lvbi5zZXQoYmFja0J1ZmZlci0+d2lkdGgsIGJhY2tCdWZmZXItPmhlaWdodCk7Ci0gICAgICAgICpidWZmZXIgPSBiYWNrQnVmZmVyLmdldCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TaGFyZWRCdWZmZXJDbGllbnQtPnVuZG9EZXF1ZXVlKGJ1ZklkeCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50IFN1cmZhY2U6OmNhbmNlbEJ1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpCi17Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUodHJ1ZSk7Ci0gICAgc3dpdGNoIChlcnIpIHsKLSAgICBjYXNlIE5PX0VSUk9SOgotICAgICAgICAvLyBubyBlcnJvciwgY29tbW9uIGNhc2UKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCQURfSU5ERVg6Ci0gICAgICAgIC8vIGxlZ2l0aW1hdGUgZXJyb3JzIGhlcmUKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICBkZWZhdWx0OgotICAgICAgICAvLyBvdGhlciBlcnJvcnMgaGFwcGVuIGJlY2F1c2UgdGhlIHN1cmZhY2UgaXMgbm93IGludmFsaWQsCi0gICAgICAgIC8vIGZvciBpbnN0YW5jZSBiZWNhdXNlIGl0IGhhcyBiZWVuIGRlc3Ryb3llZC4gSW4gdGhpcyBjYXNlLAotICAgICAgICAvLyB3ZSBqdXN0IGZhaWwgc2lsZW50bHkgKGNhbmNlbGluZyBhIGJ1ZmZlciBpcyBub3QgdGVjaG5pY2FsbHkKLSAgICAgICAgLy8gYW4gZXJyb3IgYXQgdGhpcyBwb2ludCkKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGludDMyX3QgYnVmSWR4ID0gZ2V0QnVmZmVySW5kZXgoR3JhcGhpY0J1ZmZlcjo6Z2V0U2VsZihidWZmZXIpKTsKLQotICAgIGVyciA9IG1TaGFyZWRCdWZmZXJDbGllbnQtPmNhbmNlbChidWZJZHgpOwotCi0gICAgTE9HRV9JRihlcnIsICJlcnJvciBjYW5jZWxpbmcgYnVmZmVyICVkICglcykiLCBidWZJZHgsIHN0cmVycm9yKC1lcnIpKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0KLWludCBTdXJmYWNlOjpsb2NrQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcikKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpbnQzMl90IGJ1ZklkeCA9IGdldEJ1ZmZlckluZGV4KEdyYXBoaWNCdWZmZXI6OmdldFNlbGYoYnVmZmVyKSk7Ci0KLSAgICBHcmFwaGljTG9nJiBsb2dnZXIoR3JhcGhpY0xvZzo6Z2V0SW5zdGFuY2UoKSk7Ci0gICAgbG9nZ2VyLmxvZyhHcmFwaGljTG9nOjpTRl9BUFBfTE9DS19CRUZPUkUsIG1JZGVudGl0eSwgYnVmSWR4KTsKLQotICAgIGVyciA9IG1TaGFyZWRCdWZmZXJDbGllbnQtPmxvY2soYnVmSWR4KTsKLQotICAgIGxvZ2dlci5sb2coR3JhcGhpY0xvZzo6U0ZfQVBQX0xPQ0tfQUZURVIsIG1JZGVudGl0eSwgYnVmSWR4KTsKLQotICAgIExPR0VfSUYoZXJyLCAiZXJyb3IgbG9ja2luZyBidWZmZXIgJWQgKCVzKSIsIGJ1ZklkeCwgc3RyZXJyb3IoLWVycikpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlOjpxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpCi17Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gZXJyOwotCi0gICAgaWYgKG1Td2FwUmVjdGFuZ2xlLmlzVmFsaWQoKSkgewotICAgICAgICBtRGlydHlSZWdpb24uc2V0KG1Td2FwUmVjdGFuZ2xlKTsKLSAgICB9Ci0gICAgCi0gICAgaW50MzJfdCBidWZJZHggPSBnZXRCdWZmZXJJbmRleChHcmFwaGljQnVmZmVyOjpnZXRTZWxmKGJ1ZmZlcikpOwotCi0gICAgR3JhcGhpY0xvZzo6Z2V0SW5zdGFuY2UoKS5sb2coR3JhcGhpY0xvZzo6U0ZfQVBQX1FVRVVFLCBtSWRlbnRpdHksIGJ1ZklkeCk7Ci0KLSAgICBtU2hhcmVkQnVmZmVyQ2xpZW50LT5zZXRUcmFuc2Zvcm0oYnVmSWR4LCBtTmV4dEJ1ZmZlclRyYW5zZm9ybSk7Ci0gICAgbVNoYXJlZEJ1ZmZlckNsaWVudC0+c2V0Q3JvcChidWZJZHgsIG1OZXh0QnVmZmVyQ3JvcCk7Ci0gICAgbVNoYXJlZEJ1ZmZlckNsaWVudC0+c2V0RGlydHlSZWdpb24oYnVmSWR4LCBtRGlydHlSZWdpb24pOwotICAgIGVyciA9IG1TaGFyZWRCdWZmZXJDbGllbnQtPnF1ZXVlKGJ1ZklkeCk7Ci0gICAgTE9HRV9JRihlcnIsICJlcnJvciBxdWV1aW5nIGJ1ZmZlciAlZCAoJXMpIiwgYnVmSWR4LCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIFRPRE86IGNhbiB3ZSBhdm9pZCB0aGlzIElQQyBpZiB3ZSBrbm93IHRoZXJlIGlzIG9uZSBwZW5kaW5nPwotICAgICAgICBtQ2xpZW50LnNpZ25hbFNlcnZlcigpOworICAgICAgICBtRGlydHlSZWdpb24uc2V0KGJ1ZmZlclswXS0+d2lkdGgsIGJ1ZmZlclswXS0+aGVpZ2h0KTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KIAotaW50IFN1cmZhY2U6OnF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdAoteworaW50IFN1cmZhY2U6OmNhbmNlbEJ1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpIHsKKyAgICByZXR1cm4gbVN1cmZhY2VUZXh0dXJlQ2xpZW50LT5jYW5jZWxCdWZmZXIoYnVmZmVyKTsKK30KKworaW50IFN1cmZhY2U6OmxvY2tCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZUNsaWVudC0+bG9ja0J1ZmZlcihidWZmZXIpOworfQorCitpbnQgU3VyZmFjZTo6cXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZUNsaWVudC0+cXVldWVCdWZmZXIoYnVmZmVyKTsKK30KKworaW50IFN1cmZhY2U6OnF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdCB7CiAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1dJRFRIOgotICAgICAgICAqdmFsdWUgPSBpbnQobVdpZHRoKTsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUjoKKyAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBub3QgbmVlZGVkIGFueW1vcmUKKyAgICAgICAgKnZhbHVlID0gMTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19IRUlHSFQ6Ci0gICAgICAgICp2YWx1ZSA9IGludChtSGVpZ2h0KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19GT1JNQVQ6Ci0gICAgICAgICp2YWx1ZSA9IGludChtRm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTOgotICAgICAgICAqdmFsdWUgPSBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVI6IHsKLSAgICAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc2YoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgICAgICp2YWx1ZSA9IHNmLT5hdXRoZW50aWNhdGVTdXJmYWNlKG1TdXJmYWNlKSA/IDEgOiAwOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQogICAgIGNhc2UgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFOgorICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdCBuZWVkZWQgYW55bW9yZQogICAgICAgICAqdmFsdWUgPSBOQVRJVkVfV0lORE9XX1NVUkZBQ0U7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICByZXR1cm4gbVN1cmZhY2VUZXh0dXJlQ2xpZW50LT5xdWVyeSh3aGF0LCB2YWx1ZSk7CiB9CiAKLWludCBTdXJmYWNlOjpwZXJmb3JtKGludCBvcGVyYXRpb24sIHZhX2xpc3QgYXJncykKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpCi0gICAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpbnQgcmVzID0gTk9fRVJST1I7Ci0gICAgc3dpdGNoIChvcGVyYXRpb24pIHsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX1VTQUdFOgotICAgICAgICBkaXNwYXRjaF9zZXRVc2FnZSggYXJncyApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfQ09OTkVDVDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hfY29ubmVjdCggYXJncyApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfRElTQ09OTkVDVDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hfZGlzY29ubmVjdCggYXJncyApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0NST1A6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoX2Nyb3AoIGFyZ3MgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJfQ09VTlQ6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoX3NldF9idWZmZXJfY291bnQoIGFyZ3MgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0dFT01FVFJZOgotICAgICAgICByZXMgPSBkaXNwYXRjaF9zZXRfYnVmZmVyc19nZW9tZXRyeSggYXJncyApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfVFJBTlNGT1JNOgotICAgICAgICByZXMgPSBkaXNwYXRjaF9zZXRfYnVmZmVyc190cmFuc2Zvcm0oIGFyZ3MgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RJTUVTVEFNUDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKCBhcmdzICk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlcyA9IE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBTdXJmYWNlOjpkaXNwYXRjaF9zZXRVc2FnZSh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgdXNhZ2UgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICBzZXRVc2FnZSggdXNhZ2UgKTsKLX0KLWludCBTdXJmYWNlOjpkaXNwYXRjaF9jb25uZWN0KHZhX2xpc3QgYXJncykgewotICAgIGludCBhcGkgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gY29ubmVjdCggYXBpICk7Ci19Ci1pbnQgU3VyZmFjZTo6ZGlzcGF0Y2hfZGlzY29ubmVjdCh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgYXBpID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIGRpc2Nvbm5lY3QoIGFwaSApOwotfQotaW50IFN1cmZhY2U6OmRpc3BhdGNoX2Nyb3AodmFfbGlzdCBhcmdzKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IGNvbnN0KiByZWN0ID0gdmFfYXJnKGFyZ3MsIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCopOwotICAgIHJldHVybiBjcm9wKCByZWludGVycHJldF9jYXN0PFJlY3QgY29uc3QqPihyZWN0KSApOwotfQotaW50IFN1cmZhY2U6OmRpc3BhdGNoX3NldF9idWZmZXJfY291bnQodmFfbGlzdCBhcmdzKSB7Ci0gICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gdmFfYXJnKGFyZ3MsIHNpemVfdCk7Ci0gICAgcmV0dXJuIHNldEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKLX0KLWludCBTdXJmYWNlOjpkaXNwYXRjaF9zZXRfYnVmZmVyc19nZW9tZXRyeSh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgdyA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIGludCBoID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgaW50IGYgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc0dlb21ldHJ5KHcsIGgsIGYpOwotfQotCi1pbnQgU3VyZmFjZTo6ZGlzcGF0Y2hfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKHZhX2xpc3QgYXJncykgewotICAgIGludCB0cmFuc2Zvcm0gPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwotfQotCi1pbnQgU3VyZmFjZTo6ZGlzcGF0Y2hfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKHZhX2xpc3QgYXJncykgewotICAgIGludDY0X3QgdGltZXN0YW1wID0gdmFfYXJnKGFyZ3MsIGludDY0X3QpOwotICAgIHJldHVybiBzZXRCdWZmZXJzVGltZXN0YW1wKHRpbWVzdGFtcCk7Ci19Ci0KLXZvaWQgU3VyZmFjZTo6c2V0VXNhZ2UodWludDMyX3QgcmVxVXNhZ2UpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdXJmYWNlTG9jayk7Ci0gICAgbUJ1ZmZlckluZm8uc2V0KHJlcVVzYWdlKTsKLX0KLQotaW50IFN1cmZhY2U6OmNvbm5lY3QoaW50IGFwaSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN1cmZhY2VMb2NrKTsKLSAgICBpbnQgZXJyID0gTk9fRVJST1I7Ci0gICAgc3dpdGNoIChhcGkpIHsKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9FR0w6Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBhcGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50IFN1cmZhY2U6OmRpc2Nvbm5lY3QoaW50IGFwaSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN1cmZhY2VMb2NrKTsKLSAgICBpbnQgZXJyID0gTk9fRVJST1I7Ci0gICAgc3dpdGNoIChhcGkpIHsKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9FR0w6Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3RlZCA9PSBhcGkpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZTo6Y3JvcChSZWN0IGNvbnN0KiByZWN0KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3VyZmFjZUxvY2spOwotICAgIC8vIFRPRE86IHZhbGlkYXRlIHJlY3Qgc2l6ZQotCi0gICAgaWYgKHJlY3QgPT0gTlVMTCB8fCByZWN0LT5pc0VtcHR5KCkpIHsKLSAgICAgICAgbU5leHRCdWZmZXJDcm9wID0gUmVjdCgwLDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1OZXh0QnVmZmVyQ3JvcCA9ICpyZWN0OwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IFN1cmZhY2U6OnNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkKLXsKLSAgICBzcDxJU3VyZmFjZT4gcyhtU3VyZmFjZSk7Ci0gICAgaWYgKHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICBjbGFzcyBTZXRCdWZmZXJDb3VudElQQyA6IHB1YmxpYyBTaGFyZWRCdWZmZXJDbGllbnQ6OlNldEJ1ZmZlckNvdW50Q2FsbGJhY2sgewotICAgICAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVyYXRvcigpKGludCBidWZmZXJDb3VudCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHN1cmZhY2UtPnNldEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKLSAgICAgICAgfQotICAgIHB1YmxpYzoKLSAgICAgICAgU2V0QnVmZmVyQ291bnRJUEMoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSA6IHN1cmZhY2Uoc3VyZmFjZSkgeyB9Ci0gICAgfSBpcGMocyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU2hhcmVkQnVmZmVyQ2xpZW50LT5zZXRCdWZmZXJDb3VudChidWZmZXJDb3VudCwgaXBjKTsKLSAgICBMT0dFX0lGKGVyciwgIklTdXJmYWNlOjpzZXRCdWZmZXJDb3VudCglZCkgcmV0dXJuZWQgJXMiLAotICAgICAgICAgICAgYnVmZmVyQ291bnQsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgLy8gQ2xlYXIgb3V0IGFueSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgYnVmZmVycy4KLSAgICAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1pbnQgU3VyZmFjZTo6c2V0QnVmZmVyc0dlb21ldHJ5KGludCB3LCBpbnQgaCwgaW50IGZvcm1hdCkKLXsKLSAgICBpZiAodzwwIHx8IGg8MCB8fCBmb3JtYXQ8MCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmICgodyAmJiAhaCkgfHwgKCF3ICYmIGgpKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdXJmYWNlTG9jayk7Ci0gICAgaWYgKG1Db25uZWN0ZWQgPT0gTkFUSVZFX1dJTkRPV19BUElfRUdMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtQnVmZmVySW5mby5zZXQodywgaCwgZm9ybWF0KTsKLSAgICBpZiAoZm9ybWF0ICE9IDApIHsKLSAgICAgICAgLy8gd2UgdXBkYXRlIHRoZSBmb3JtYXQgb2YgdGhlIHN1cmZhY2UgYXMgcmVwb3J0ZWQgYnkgcXVlcnkoKS4KLSAgICAgICAgLy8gdGhpcyBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgYSBzdXJmYWNlJ3MKLSAgICAgICAgLy8gYnVmZmVyLCBhbmQgaGF2ZSBpdCByZWZsZWN0ZWQgaW4gRUdMOyB3aGljaCBpcyBuZWVkZWQgZm9yCi0gICAgICAgIC8vIEVHTENvbmZpZyB2YWxpZGF0aW9uLgotICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgIH0KLQotICAgIG1OZXh0QnVmZmVyQ3JvcCA9IFJlY3QoMCwwKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IFN1cmZhY2U6OnNldEJ1ZmZlcnNUcmFuc2Zvcm0oaW50IHRyYW5zZm9ybSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN1cmZhY2VMb2NrKTsKLSAgICBtTmV4dEJ1ZmZlclRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWludCBTdXJmYWNlOjpzZXRCdWZmZXJzVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wKQotewotICAgIC8vIFN1cmZhY2UgZG9lc24ndCByZWFsbHkgaGF2ZSBhbnl0aGluZyBtZWFuaW5nZnVsIHRvIGRvIHdpdGggdGltZXN0YW1wcwotICAgIC8vIHNvIHRoZXknbGwganVzdCBiZSBkcm9wcGVkIGhlcmUuCi0gICAgcmV0dXJuIE5PX0VSUk9SOworaW50IFN1cmZhY2U6OnBlcmZvcm0oaW50IG9wZXJhdGlvbiwgdmFfbGlzdCBhcmdzKSB7CisgICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZUNsaWVudC0+cGVyZm9ybShvcGVyYXRpb24sIGFyZ3MpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBTdXJmYWNlOjpnZXRDb25uZWN0ZWRBcGkoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3VyZmFjZUxvY2spOwotICAgIHJldHVybiBtQ29ubmVjdGVkOworaW50IFN1cmZhY2U6OmdldENvbm5lY3RlZEFwaSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN1cmZhY2VUZXh0dXJlQ2xpZW50LT5nZXRDb25uZWN0ZWRBcGkoKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTY3LDE2ICs1NTYsMTcgQEAKICAgICB9CiAKICAgICAvLyB3ZSdyZSBpbnRlbmRpbmcgdG8gZG8gc29mdHdhcmUgcmVuZGVyaW5nIGZyb20gdGhpcyBwb2ludAotICAgIHNldFVzYWdlKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOworICAgIG1TdXJmYWNlVGV4dHVyZUNsaWVudC0+c2V0VXNhZ2UoCisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKIAogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG91dDsKLSAgICBzdGF0dXNfdCBlcnIgPSBkZXF1ZXVlQnVmZmVyKCZvdXQpOworICAgIHN0YXR1c190IGVyciA9IG1TdXJmYWNlVGV4dHVyZUNsaWVudC0+ZGVxdWV1ZUJ1ZmZlcigmb3V0KTsKICAgICBMT0dFX0lGKGVyciwgImRlcXVldWVCdWZmZXIgZmFpbGVkICglcykiLCBzdHJlcnJvcigtZXJyKSk7CiAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewogICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBiYWNrQnVmZmVyKEdyYXBoaWNCdWZmZXI6OmdldFNlbGYob3V0KSk7Ci0gICAgICAgIGVyciA9IGxvY2tCdWZmZXIoYmFja0J1ZmZlci5nZXQoKSk7Ci0gICAgICAgIExPR0VfSUYoZXJyLCAibG9ja0J1ZmZlciAoaWR4PSVkKSBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgZ2V0QnVmZmVySW5kZXgoYmFja0J1ZmZlciksIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgZXJyID0gbVN1cmZhY2VUZXh0dXJlQ2xpZW50LT5sb2NrQnVmZmVyKGJhY2tCdWZmZXIuZ2V0KCkpOworICAgICAgICBMT0dFX0lGKGVyciwgImxvY2tCdWZmZXIgKGhhbmRsZT0lcCkgZmFpbGVkICglcykiLAorICAgICAgICAgICAgICAgIGJhY2tCdWZmZXItPmhhbmRsZSwgc3RyZXJyb3IoLWVycikpOwogICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjb25zdCBSZWN0IGJvdW5kcyhiYWNrQnVmZmVyLT53aWR0aCwgYmFja0J1ZmZlci0+aGVpZ2h0KTsKICAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiBib3VuZHNSZWdpb24oYm91bmRzKTsKQEAgLTEwNDMsMTEwICs2MzMsMTQgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBtTG9ja2VkQnVmZmVyLT51bmxvY2soKTsKICAgICBMT0dFX0lGKGVyciwgImZhaWxlZCB1bmxvY2tpbmcgYnVmZmVyICglcCkiLCBtTG9ja2VkQnVmZmVyLT5oYW5kbGUpOwogICAgIAotICAgIGVyciA9IHF1ZXVlQnVmZmVyKG1Mb2NrZWRCdWZmZXIuZ2V0KCkpOwotICAgIExPR0VfSUYoZXJyLCAicXVldWVCdWZmZXIgKGlkeD0lZCkgZmFpbGVkICglcykiLAotICAgICAgICAgICAgZ2V0QnVmZmVySW5kZXgobUxvY2tlZEJ1ZmZlciksIHN0cmVycm9yKC1lcnIpKTsKKyAgICBlcnIgPSBtU3VyZmFjZVRleHR1cmVDbGllbnQtPnF1ZXVlQnVmZmVyKG1Mb2NrZWRCdWZmZXIuZ2V0KCkpOworICAgIExPR0VfSUYoZXJyLCAicXVldWVCdWZmZXIgKGhhbmRsZT0lcCkgZmFpbGVkICglcykiLAorICAgICAgICAgICAgbUxvY2tlZEJ1ZmZlci0+aGFuZGxlLCBzdHJlcnJvcigtZXJyKSk7CiAKICAgICBtUG9zdGVkQnVmZmVyID0gbUxvY2tlZEJ1ZmZlcjsKICAgICBtTG9ja2VkQnVmZmVyID0gMDsKICAgICByZXR1cm4gZXJyOwogfQogCi12b2lkIFN1cmZhY2U6OnNldFN3YXBSZWN0YW5nbGUoY29uc3QgUmVjdCYgcikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3VyZmFjZUxvY2spOwotICAgIG1Td2FwUmVjdGFuZ2xlID0gcjsKLX0KLQotaW50IFN1cmZhY2U6OmdldEJ1ZmZlckluZGV4KGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIGNvbnN0Ci17Ci0gICAgaW50IGlkeCA9IGJ1ZmZlci0+Z2V0SW5kZXgoKTsKLSAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAvLyBUaGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBhbiBpbmRleCBzZXQuICBTZWUgaWYgdGhlIGhhbmRsZSB0aGUgc2FtZSBhcwotICAgICAgICAvLyBvbmUgb2YgdGhlIGJ1ZmZlcnMgZm9yIHdoaWNoIHdlIGRvIGtub3cgdGhlIGluZGV4LiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAgIC8vIGUuZy4gaWYgR3JhcGhpY0J1ZmZlciBpcyB1c2VkIHRvIHdyYXAgYW4gQU5hdGl2ZVdpbmRvd0J1ZmZlciB0aGF0Ci0gICAgICAgIC8vIHdhcyBkZXF1ZXVlZCBmcm9tIGFuIEFOYXRpdmVXaW5kb3cuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXSAhPSAwICYmIGJ1ZmZlci0+aGFuZGxlID09IG1CdWZmZXJzW2ldLT5oYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBpZHggPSBtQnVmZmVyc1tpXS0+Z2V0SW5kZXgoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaWR4OwotfQotCi1zdGF0dXNfdCBTdXJmYWNlOjpnZXRCdWZmZXJMb2NrZWQoaW50IGluZGV4LAotICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKQotewotICAgIHNwPElTdXJmYWNlPiBzKG1TdXJmYWNlKTsKLSAgICBpZiAocyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIHN0YXR1c190IGVyciA9IE5PX01FTU9SWTsKLQotICAgIC8vIGZyZWUgdGhlIGN1cnJlbnQgYnVmZmVyCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4mIGN1cnJlbnRCdWZmZXIobUJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkpOwotICAgIGlmIChjdXJyZW50QnVmZmVyICE9IDApIHsKLSAgICAgICAgY3VycmVudEJ1ZmZlci5jbGVhcigpOwotICAgIH0KLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IHMtPnJlcXVlc3RCdWZmZXIoaW5kZXgsIHcsIGgsIGZvcm1hdCwgdXNhZ2UpOwotICAgIExPR0VfSUYoYnVmZmVyPT0wLAotICAgICAgICAgICAgIklTdXJmYWNlOjpnZXRCdWZmZXIoJWQsICUwOHgpIHJldHVybmVkIE5VTEwiLAotICAgICAgICAgICAgaW5kZXgsIHVzYWdlKTsKLSAgICBpZiAoYnVmZmVyICE9IDApIHsgLy8gdGhpcyBzaG91bGQgYWx3YXlzIGhhcHBlbiBieSBjb25zdHJ1Y3Rpb24KLSAgICAgICAgTE9HRV9JRihidWZmZXItPmhhbmRsZSA9PSBOVUxMLCAKLSAgICAgICAgICAgICAgICAiU3VyZmFjZSAoaWRlbnRpdHk9JWQpIHJlcXVlc3RCdWZmZXIoJWQsICV1LCAldSwgJXUsICUwOHgpICIKLSAgICAgICAgICAgICAgICAicmV0dXJuZWQgYSBidWZmZXIgd2l0aCBhIG51bGwgaGFuZGxlIiwKLSAgICAgICAgICAgICAgICBtSWRlbnRpdHksIGluZGV4LCB3LCBoLCBmb3JtYXQsIHVzYWdlKTsKLSAgICAgICAgZXJyID0gbVNoYXJlZEJ1ZmZlckNsaWVudC0+Z2V0U3RhdHVzKCk7Ci0gICAgICAgIExPR0VfSUYoZXJyLCAgIlN1cmZhY2UgKGlkZW50aXR5PSVkKSBzdGF0ZSA9ICVkIiwgbUlkZW50aXR5LCBlcnIpOwotICAgICAgICBpZiAoIWVyciAmJiBidWZmZXItPmhhbmRsZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjdXJyZW50QnVmZmVyID0gYnVmZmVyOwotICAgICAgICAgICAgY3VycmVudEJ1ZmZlci0+c2V0SW5kZXgoaW5kZXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gZXJyPDAgPyBlcnIgOiBzdGF0dXNfdChOT19NRU1PUlkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7IAotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TdXJmYWNlOjpCdWZmZXJJbmZvOjpCdWZmZXJJbmZvKCkKLSAgICA6IG1XaWR0aCgwKSwgbUhlaWdodCgwKSwgbUZvcm1hdCgwKSwKLSAgICAgIG1Vc2FnZShHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiksIG1EaXJ0eSgwKQotewotfQotCi12b2lkIFN1cmZhY2U6OkJ1ZmZlckluZm86OnNldCh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQpIHsKLSAgICBpZiAoKG1XaWR0aCAhPSB3KSB8fCAobUhlaWdodCAhPSBoKSB8fCAobUZvcm1hdCAhPSBmb3JtYXQpKSB7Ci0gICAgICAgIG1XaWR0aCA9IHc7Ci0gICAgICAgIG1IZWlnaHQgPSBoOwotICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICBtRGlydHkgfD0gR0VPTUVUUlk7Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2U6OkJ1ZmZlckluZm86OnNldCh1aW50MzJfdCB1c2FnZSkgewotICAgIG1Vc2FnZSA9IHVzYWdlOwotfQotCi12b2lkIFN1cmZhY2U6OkJ1ZmZlckluZm86OmdldCh1aW50MzJfdCAqcFdpZHRoLCB1aW50MzJfdCAqcEhlaWdodCwKLSAgICAgICAgdWludDMyX3QgKnBGb3JtYXQsIHVpbnQzMl90ICpwVXNhZ2UpIGNvbnN0IHsKLSAgICAqcFdpZHRoICA9IG1XaWR0aDsKLSAgICAqcEhlaWdodCA9IG1IZWlnaHQ7Ci0gICAgKnBGb3JtYXQgPSBtRm9ybWF0OwotICAgICpwVXNhZ2UgID0gbVVzYWdlOwotfQotCi1ib29sIFN1cmZhY2U6OkJ1ZmZlckluZm86OnZhbGlkYXRlQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIGNvbnN0IHsKLSAgICAvLyBtYWtlIHN1cmUgd2UgQVQgTEVBU1QgaGF2ZSB0aGUgdXNhZ2UgZmxhZ3Mgd2Ugd2FudAotICAgIGlmIChtRGlydHkgfHwgYnVmZmVyPT0wIHx8Ci0gICAgICAgICAgICAoKGJ1ZmZlci0+dXNhZ2UgJiBtVXNhZ2UpICE9IG1Vc2FnZSkpIHsKLSAgICAgICAgbURpcnR5ID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgYi9saWJzL2d1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwCmluZGV4IGExZmYyYzEuLjE2Nzg3MTEgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKKysrIGIvbGlicy9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcApAQCAtMjAsMTkgKzIwLDIwIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+CiAKKyNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlQ29tcG9zZXIuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTdGF0ZS5oPgpAQCAtMjE3LDcgKzIxOCw3IEBACiBzdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKAogICAgICAgICBEaXNwbGF5SUQgZHB5LCBEaXNwbGF5SW5mbyogaW5mbykKIHsKLSAgICBpZiAodWludDMyX3QoZHB5KT49U2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9ESVNQTEFZX01BWCkKKyAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogCiAgICAgdm9sYXRpbGUgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCBjb25zdCAqIGNibGsgPSBnZXRfY2JsaygpOwpAQCAtMjM1LDcgKzIzNiw3IEBACiAKIHNzaXplX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5V2lkdGgoRGlzcGxheUlEIGRweSkKIHsKLSAgICBpZiAodWludDMyX3QoZHB5KT49U2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9ESVNQTEFZX01BWCkKKyAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIHZvbGF0aWxlIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3QgKiBjYmxrID0gZ2V0X2NibGsoKTsKICAgICB2b2xhdGlsZSBkaXNwbGF5X2NibGtfdCBjb25zdCAqIGRjYmxrID0gY2Jsay0+ZGlzcGxheXMgKyBkcHk7CkBAIC0yNDQsNyArMjQ1LDcgQEAKIAogc3NpemVfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlIZWlnaHQoRGlzcGxheUlEIGRweSkKIHsKLSAgICBpZiAodWludDMyX3QoZHB5KT49U2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9ESVNQTEFZX01BWCkKKyAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIHZvbGF0aWxlIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3QgKiBjYmxrID0gZ2V0X2NibGsoKTsKICAgICB2b2xhdGlsZSBkaXNwbGF5X2NibGtfdCBjb25zdCAqIGRjYmxrID0gY2Jsay0+ZGlzcGxheXMgKyBkcHk7CkBAIC0yNTMsNyArMjU0LDcgQEAKIAogc3NpemVfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlPcmllbnRhdGlvbihEaXNwbGF5SUQgZHB5KQogewotICAgIGlmICh1aW50MzJfdChkcHkpPj1TaGFyZWRCdWZmZXJTdGFjazo6TlVNX0RJU1BMQVlfTUFYKQorICAgIGlmICh1aW50MzJfdChkcHkpPj1OVU1fRElTUExBWV9NQVgpCiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgdm9sYXRpbGUgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCBjb25zdCAqIGNibGsgPSBnZXRfY2JsaygpOwogICAgIHZvbGF0aWxlIGRpc3BsYXlfY2Jsa190IGNvbnN0ICogZGNibGsgPSBjYmxrLT5kaXNwbGF5cyArIGRweTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VUZXh0dXJlLmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2VUZXh0dXJlLmNwcAppbmRleCBlZTk3ZGNmLi4zY2VjZGI0IDEwMDY0NAotLS0gYS9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZS5jcHAKKysrIGIvbGlicy9ndWkvU3VyZmFjZVRleHR1cmUuY3BwCkBAIC05Niw2ICs5Niw3IEBACiAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXIoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7CiAgICAgbUdyYXBoaWNCdWZmZXJBbGxvYyA9IGNvbXBvc2VyLT5jcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKTsKICAgICBtTmV4dENyb3AubWFrZUludmFsaWQoKTsKKyAgICBtZW1jcHkobUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgsIG10eElkZW50aXR5LCBzaXplb2YobUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgpKTsKIH0KIAogU3VyZmFjZVRleHR1cmU6On5TdXJmYWNlVGV4dHVyZSgpIHsKQEAgLTI3MCw3ICsyNzEsNyBAQAogICAgICAgICAgICAgaWYgKHN0YXRlID09IEJ1ZmZlclNsb3Q6OkRFUVVFVUVEKSB7CiAgICAgICAgICAgICAgICAgZGVxdWV1ZWRDb3VudCsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRlID09IEJ1ZmZlclNsb3Q6OkZSRUUgfHwgaSA9PSBtQ3VycmVudFRleHR1cmUpIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCdWZmZXJTbG90OjpGUkVFIC8qfHwgaSA9PSBtQ3VycmVudFRleHR1cmUqLykgewogICAgICAgICAgICAgICAgIGZvdW5kU3luYyA9IGk7CiAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbUN1cnJlbnRUZXh0dXJlKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTsKQEAgLTU0Nyw2ICs1NDgsNyBAQAogICAgICAgICBtQ3VycmVudENyb3AgPSBtU2xvdHNbYnVmXS5tQ3JvcDsKICAgICAgICAgbUN1cnJlbnRUcmFuc2Zvcm0gPSBtU2xvdHNbYnVmXS5tVHJhbnNmb3JtOwogICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCA9IG1TbG90c1tidWZdLm1UaW1lc3RhbXA7CisgICAgICAgIGNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4KCk7CiAgICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFdlIGFsd2F5cyBiaW5kIHRoZSB0ZXh0dXJlIGV2ZW4gaWYgd2UgZG9uJ3QgdXBkYXRlIGl0cyBjb250ZW50cy4KQEAgLTU5Niw4ICs1OTgsMTIgQEAKIH0KIAogdm9pZCBTdXJmYWNlVGV4dHVyZTo6Z2V0VHJhbnNmb3JtTWF0cml4KGZsb2F0IG10eFsxNl0pIHsKLSAgICBMT0dWKCJTdXJmYWNlVGV4dHVyZTo6Z2V0VHJhbnNmb3JtTWF0cml4Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBtZW1jcHkobXR4LCBtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCwgc2l6ZW9mKG1DdXJyZW50VHJhbnNmb3JtTWF0cml4KSk7Cit9CisKK3ZvaWQgU3VyZmFjZVRleHR1cmU6OmNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4KCkgeworICAgIExPR1YoIlN1cmZhY2VUZXh0dXJlOjpjb21wdXRlQ3VycmVudFRyYW5zZm9ybU1hdHJpeCIpOwogCiAgICAgZmxvYXQgeGZvcm1bMTZdOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewpAQCAtNjg0LDcgKzY5MCw3IEBACiAgICAgLy8gY29vcmRpbmF0ZSBvZiAwLCBzbyBTdXJmYWNlVGV4dHVyZSBtdXN0IGJlaGF2ZSB0aGUgc2FtZSB3YXkuICBXZSBkb24ndAogICAgIC8vIHdhbnQgdG8gZXhwb3NlIHRoaXMgdG8gYXBwbGljYXRpb25zLCBob3dldmVyLCBzbyB3ZSBtdXN0IGFkZCBhbgogICAgIC8vIGFkZGl0aW9uYWwgdmVydGljYWwgZmxpcCB0byB0aGUgdHJhbnNmb3JtIGFmdGVyIGFsbCB0aGUgb3RoZXIgdHJhbnNmb3Jtcy4KLSAgICBtdHhNdWwobXR4LCBtdHhGbGlwViwgbXR4QmVmb3JlRmxpcFYpOworICAgIG10eE11bChtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCwgbXR4RmxpcFYsIG10eEJlZm9yZUZsaXBWKTsKIH0KIAogbnNlY3NfdCBTdXJmYWNlVGV4dHVyZTo6Z2V0VGltZXN0YW1wKCkgewpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuY3BwIGIvbGlicy9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuY3BwCmluZGV4IGMyMGZjZjI3Li4yMmIwODUyIDEwMDY0NAotLS0gYS9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5jcHAKKysrIGIvbGlicy9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuY3BwCkBAIC0xODEsNiArMTgxLDEyIEBACiBpbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdCB7CiAgICAgTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OnF1ZXJ5Iik7CiAgICAgc3dpdGNoICh3aGF0KSB7CisgICAgY2FzZSBOQVRJVkVfV0lORE9XX0ZPUk1BVDoKKyAgICAgICAgaWYgKG1SZXFGb3JtYXQpIHsKKyAgICAgICAgICAgICp2YWx1ZSA9IG1SZXFGb3JtYXQ7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVI6CiAgICAgICAgIC8vIFRPRE86IHRoaXMgaXMgbm90IG5lZWRlZCBhbnltb3JlCiAgICAgICAgICp2YWx1ZSA9IDA7CmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9TdXJmYWNlVGV4dHVyZUNsaWVudF90ZXN0LmNwcCBiL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlQ2xpZW50X3Rlc3QuY3BwCmluZGV4IDJmNzA0YzguLjUxOWI0MGUgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlQ2xpZW50X3Rlc3QuY3BwCisrKyBiL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlQ2xpZW50X3Rlc3QuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewogICAgICAgICBtU1QgPSBuZXcgU3VyZmFjZVRleHR1cmUoMTIzKTsKICAgICAgICAgbVNUQyA9IG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChtU1QpOworICAgICAgICBtQU5XID0gbVNUQzsKIAogICAgICAgICAvLyBXZSBuZWVkIGEgdmFsaWQgR0wgY29udGV4dCBzbyB3ZSBjYW4gdGVzdCB1cGRhdGVUZXhJbWFnZSgpCiAgICAgICAgIC8vIFRoaXMgaW5pdGlhbGl6ZXMgRUdMIGFuZCBjcmVhdGUgYSBkdW1teSBHTCBjb250ZXh0IHdpdGggYQpAQCAtNjksNiArNzAsOCBAQAogICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKICAgICAgICAgbVNULmNsZWFyKCk7CiAgICAgICAgIG1TVEMuY2xlYXIoKTsKKyAgICAgICAgbUFOVy5jbGVhcigpOworCiAgICAgICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKICAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKQEAgLTg2LDYgKzg5LDggQEAKIAogICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBtU1Q7CiAgICAgc3A8U3VyZmFjZVRleHR1cmVDbGllbnQ+IG1TVEM7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUFOVzsKKwogICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7CiAgICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKICAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwpAQCAtOTcsMzEgKzEwMiwyNiBAQAogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBRdWV1ZXNUb1dpbmRvd0NvbXBvc2l0b3JJc0ZhbHNlKSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOwogICAgIGludCByZXN1bHQgPSAtMTIzOwotICAgIGludCBlcnIgPSBhbnctPnF1ZXJ5KGFudy5nZXQoKSwgTkFUSVZFX1dJTkRPV19RVUVVRVNfVE9fV0lORE9XX0NPTVBPU0VSLAorICAgIGludCBlcnIgPSBtQU5XLT5xdWVyeShtQU5XLmdldCgpLCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsCiAgICAgICAgICAgICAmcmVzdWx0KTsKICAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7CiAgICAgRVhQRUNUX0VRKDAsIHJlc3VsdCk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIENvbmNyZXRlVHlwZUlzU3VyZmFjZVRleHR1cmVDbGllbnQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7CiAgICAgaW50IHJlc3VsdCA9IC0xMjM7Ci0gICAgaW50IGVyciA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEUsICZyZXN1bHQpOworICAgIGludCBlcnIgPSBtQU5XLT5xdWVyeShtQU5XLmdldCgpLCBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEUsICZyZXN1bHQpOwogICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKICAgICBFWFBFQ1RfRVEoTkFUSVZFX1dJTkRPV19TVVJGQUNFX1RFWFRVUkVfQ0xJRU5ULCByZXN1bHQpOwogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBBTmF0aXZlV2luZG93TG9ja0ZhaWxzKSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOwogICAgIEFOYXRpdmVXaW5kb3dfQnVmZmVyIGJ1ZjsKLSAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBBTmF0aXZlV2luZG93X2xvY2soYW53LmdldCgpLCAmYnVmLCBOVUxMKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgQU5hdGl2ZVdpbmRvd19sb2NrKG1BTlcuZ2V0KCksICZidWYsIE5VTEwpKTsKIH0KIAogVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgRWdsQ3JlYXRlV2luZG93U3VyZmFjZVN1Y2NlZWRzKSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOwotCiAgICAgRUdMRGlzcGxheSBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwogICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CiAgICAgQVNTRVJUX05FKEVHTF9OT19ESVNQTEFZLCBkcHkpOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICAmbnVtQ29uZmlncykpOwogICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CiAKLSAgICBFR0xTdXJmYWNlIGVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIGFudy5nZXQoKSwKKyAgICBFR0xTdXJmYWNlIGVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIG1BTlcuZ2V0KCksCiAgICAgICAgICAgICBOVUxMKTsKICAgICBFWFBFQ1RfTkUoRUdMX05PX1NVUkZBQ0UsIGVnbFN1cmZhY2UpOwogICAgIEVYUEVDVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CkBAIC0xNTYsMjY5ICsxNTYsMjQ2IEBACiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5SW52YWxpZFNpemVzRmFpbCkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLQotICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIC0xLCAgMCwgIDApKTsKLSAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LmdldCgpLCAgMCwgLTEsICAwKSk7Ci0gICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudy5nZXQoKSwgIDAsICAwLCAtMSkpOwotICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIC0xLCAtMSwgIDApKTsKLSAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LmdldCgpLCAgMCwgIDgsICAwKSk7Ci0gICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudy5nZXQoKSwgIDgsICAwLCAgMCkpOworICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAtMSwgIDAsICAwKSk7CisgICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksICAwLCAtMSwgIDApKTsKKyAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgIDAsICAwLCAtMSkpOworICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAtMSwgLTEsICAwKSk7CisgICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksICAwLCAgOCwgIDApKTsKKyAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgIDgsICAwLCAgMCkpOwogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBEZWZhdWx0R2VvbWV0cnlWYWx1ZXMpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZikpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7CiAgICAgRVhQRUNUX0VRKDEsIGJ1Zi0+d2lkdGgpOwogICAgIEVYUEVDVF9FUSgxLCBidWYtPmhlaWdodCk7CiAgICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5Q2FuQmVTZXQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIDE2LCA4LCBQSVhFTF9GT1JNQVRfUkdCXzU2NSkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZikpOworICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAxNiwgOCwgUElYRUxfRk9STUFUX1JHQl81NjUpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwogICAgIEVYUEVDVF9FUSgxNiwgYnVmLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDgsIGJ1Zi0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQl81NjUsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5RGVmYXVsdFNpemVTZXRGb3JtYXQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIDAsIDAsIFBJWEVMX0ZPUk1BVF9SR0JfNTY1KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmKSk7CisgICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDAsIDAsIFBJWEVMX0ZPUk1BVF9SR0JfNTY1KSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKICAgICBFWFBFQ1RfRVEoMSwgYnVmLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDEsIGJ1Zi0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQl81NjUsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5U2V0U2l6ZURlZmF1bHRGb3JtYXQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIDE2LCA4LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmKSk7CisgICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDE2LCA4LCAwKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKICAgICBFWFBFQ1RfRVEoMTYsIGJ1Zi0+d2lkdGgpOwogICAgIEVYUEVDVF9FUSg4LCBidWYtPmhlaWdodCk7CiAgICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5U2l6ZUNhbkJlVW5zZXQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIDE2LCA4LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmKSk7CisgICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDE2LCA4LCAwKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKICAgICBFWFBFQ1RfRVEoMTYsIGJ1Zi0+d2lkdGgpOwogICAgIEVYUEVDVF9FUSg4LCBidWYtPmhlaWdodCk7CiAgICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudy5nZXQoKSwgMCwgMCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZikpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOworICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAwLCAwLCAwKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKICAgICBFWFBFQ1RfRVEoMSwgYnVmLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDEsIGJ1Zi0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWYpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKIH0KIAogVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgQnVmZmVyR2VvbWV0cnlTaXplQ2FuQmVDaGFuZ2VkV2l0aG91dEZvcm1hdCkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudy5nZXQoKSwgMCwgMCwgUElYRUxfRk9STUFUX1JHQl81NjUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWYpKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgMCwgMCwgUElYRUxfRk9STUFUX1JHQl81NjUpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwogICAgIEVYUEVDVF9FUSgxLCBidWYtPndpZHRoKTsKICAgICBFWFBFQ1RfRVEoMSwgYnVmLT5oZWlnaHQpOwogICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCXzU2NSwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWYpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LmdldCgpLCAxNiwgOCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZikpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOworICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAxNiwgOCwgMCkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7CiAgICAgRVhQRUNUX0VRKDE2LCBidWYtPndpZHRoKTsKICAgICBFWFBFQ1RfRVEoOCwgYnVmLT5oZWlnaHQpOwogICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCXzU2NSwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWYpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKIH0KIAogVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTZXREZWZhdWx0U2l6ZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKICAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7CiAgICAgRVhQRUNUX0VRKE9LLCBzdC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIDgpKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWYpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwogICAgIEVYUEVDVF9FUSgxNiwgYnVmLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDgsIGJ1Zi0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWYpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKIH0KIAogVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTZXREZWZhdWx0U2l6ZUFmdGVyRGVxdWV1ZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZbMl07Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCA0KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKICAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBzdC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIDgpKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWZbMV0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIDgpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7CiAgICAgRVhQRUNUX05FKGJ1ZlswXSwgYnVmWzFdKTsKICAgICBFWFBFQ1RfRVEoMTYsIGJ1ZlswXS0+d2lkdGgpOwogICAgIEVYUEVDVF9FUSgxNiwgYnVmWzFdLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDgsIGJ1ZlswXS0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoOCwgYnVmWzFdLT5oZWlnaHQpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIFN1cmZhY2VUZXh0dXJlU2V0RGVmYXVsdFNpemVWc0dlb21ldHJ5KSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOwotICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdChtU1QpOwogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZlsyXTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhbncuZ2V0KCksIDQpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIHN0LT5zZXREZWZhdWx0QnVmZmVyU2l6ZSgxNiwgOCkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZlsxXSkpOworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIDgpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7CiAgICAgRVhQRUNUX05FKGJ1ZlswXSwgYnVmWzFdKTsKICAgICBFWFBFQ1RfRVEoMTYsIGJ1ZlswXS0+d2lkdGgpOwogICAgIEVYUEVDVF9FUSgxNiwgYnVmWzFdLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDgsIGJ1ZlswXS0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoOCwgYnVmWzFdLT5oZWlnaHQpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5jYW5jZWxCdWZmZXIoYW53LmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KGFudy5nZXQoKSwgMTIsIDI0LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7CisgICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDEyLCAyNCwgMCkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKICAgICBFWFBFQ1RfTkUoYnVmWzBdLCBidWZbMV0pOwogICAgIEVYUEVDVF9FUSgxMiwgYnVmWzBdLT53aWR0aCk7CiAgICAgRVhQRUNUX0VRKDEyLCBidWZbMV0tPndpZHRoKTsKICAgICBFWFBFQ1RfRVEoMjQsIGJ1ZlswXS0+aGVpZ2h0KTsKICAgICBFWFBFQ1RfRVEoMjQsIGJ1ZlsxXS0+aGVpZ2h0KTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmNhbmNlbEJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsxXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVRvb01hbnlVcGRhdGVUZXhJbWFnZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKICAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgc3QtPnNldFN5bmNocm9ub3VzTW9kZShmYWxzZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGFudy5nZXQoKSwgNCkpOworICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUoZmFsc2UpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7CiAKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+cXVldWVCdWZmZXIoYW53LmdldCgpLCBidWZbMF0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIHN0LT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIHN0LT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKIAotICAgIEFTU0VSVF9FUShPSywgc3QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCAzKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOwogCi0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKIAotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7CisgICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVN5bmNNb2RlU2xvd1JldGlyZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKICAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgc3QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCA0KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzJdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwogICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7CiAgICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKICAgICBFWFBFQ1RfTkUoYnVmWzJdLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsxXSkpOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsyXSkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMF0pOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMV0pOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOworICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlswXSk7CisgICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzFdKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7CisgICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOwogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVN5bmNNb2RlRmFzdFJldGlyZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKICAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgc3QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCA0KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzJdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwogICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7CiAgICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKICAgICBFWFBFQ1RfTkUoYnVmWzJdLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsxXSkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsyXSkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzBdKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOworICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsxXSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMl0pKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7CisgICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOwogfQogCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVN5bmNNb2RlRFFRUikgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKICAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgc3QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCAzKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOwogCi0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBzdC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKHN0LT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlswXSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOworICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlswXSk7CiAKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWZbMV0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwogICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBzdC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKHN0LT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsxXSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7CisgICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMV0pOwogCi0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzJdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKICAgICBFWFBFQ1RfTkUoYnVmWzFdLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsyXSkpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7CisgICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzJdKTsKIH0KIAogLy8gWFhYOiBXZSBjdXJyZW50bHkgaGF2ZSBubyBoYXJkd2FyZSB0aGF0IHByb3Blcmx5IGhhbmRsZXMgZGVxdWV1aW5nIHRoZQogLy8gYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5IGJvdW5kIHRvIHRoZSB0ZXh0dXJlLgogVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgRElTQUJMRURfU3VyZmFjZVRleHR1cmVTeW5jTW9kZURlcXVldWVDdXJyZW50KSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOwotICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdChtU1QpOwogICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107CiAgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGZpcnN0QnVmOwotICAgIEFTU0VSVF9FUShPSywgc3QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYW53LmdldCgpLCAzKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmZmlyc3RCdWYpKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+cXVldWVCdWZmZXIoYW53LmdldCgpLCBmaXJzdEJ1ZikpOwotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBmaXJzdEJ1Zik7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzJdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzJdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmZmlyc3RCdWYpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGZpcnN0QnVmKSk7CisgICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgZmlyc3RCdWYpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOwogICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7CiAgICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKICAgICBFWFBFQ1RfTkUoYnVmWzJdLCBidWZbMF0pOwpAQCAtNDI2LDQxICs0MDMsMzYgQEAKIH0KIAogVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTeW5jTW9kZU1pblVuZGVxdWV1ZWQpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7Ci0gICAgc3A8U3VyZmFjZVRleHR1cmU+IHN0KG1TVCk7CiAgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZlszXTsKLSAgICBBU1NFUlRfRVEoT0ssIHN0LT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGFudy5nZXQoKSwgMykpOworICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKIAotICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlcXVldWUgYWxsIHRoZSBidWZmZXJzIGJlZm9yZSB3ZSd2ZSBxdWV1ZWQgYW55LgotICAgIEVYUEVDVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEVYUEVDVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9FUShPSywgYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1ZlsyXSkpOworICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlcXVldWUgYWxsIHRoZSBidWZmZXJzIGJlZm9yZSB3ZSd2ZSBxdWV1ZWQgbUFOV3kuCisgICAgRVhQRUNUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOworICAgIEVYUEVDVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzJdKSk7CiAKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmWzJdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKIAotICAgIEVYUEVDVF9FUShPSywgc3QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShzdC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMV0pOworICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsxXSk7CiAKLSAgICBFWFBFQ1RfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWZbMl0pKTsKKyAgICBFWFBFQ1RfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwogCiAgICAgLy8gT25jZSB3ZSd2ZSBxdWV1ZWQgYSBidWZmZXIsIGhvd2V2ZXIgd2Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGRlcXVldWUgbW9yZQogICAgIC8vIHRoYW4gKGJ1ZmZlci1jb3VudCAtIE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMpLCB3aGljaCBpcyAyIGluIHRoaXMgY2FzZS4KLSAgICBFWFBFQ1RfRVEoLUVCVVNZLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7CisgICAgRVhQRUNUX0VRKC1FQlVTWSwgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7CiAKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+Y2FuY2VsQnVmZmVyKGFudy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmNhbmNlbEJ1ZmZlcihhbncuZ2V0KCksIGJ1ZlsyXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOwogfQogCiAvLyBYWFg6IFRoaXMgaXMgbm90IGV4cGVjdGVkIHRvIHBhc3MgdW50aWwgdGhlIHN5bmNocm9uaXphdGlvbiBoYWNrcyBhcmUgcmVtb3ZlZAogLy8gZnJvbSB0aGUgU3VyZmFjZVRleHR1cmUgY2xhc3MuCiBURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBESVNBQkxFRF9TdXJmYWNlVGV4dHVyZVN5bmNNb2RlV2FpdFJldGlyZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU1RDKTsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKLQogICAgIGNsYXNzIE15VGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBzdDsKKyAgICAgICAgc3A8U3VyZmFjZVRleHR1cmU+IG1TVDsKICAgICAgICAgRUdMQ29udGV4dCBjdHg7CiAgICAgICAgIEVHTFN1cmZhY2Ugc3VyOwogICAgICAgICBFR0xEaXNwbGF5IGRweTsKQEAgLTQ3MCwxNCArNDQyLDE0IEBACiAgICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1ciwgc3VyLCBjdHgpOwogICAgICAgICAgICAgdXNsZWVwKDIwMDAwKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgICAgICBzdC0+dXBkYXRlVGV4SW1hZ2UoKTsKKyAgICAgICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKICAgICAgICAgICAgIG1CdWZmZXJSZXRpcmVkID0gdHJ1ZTsKICAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICBwdWJsaWM6Ci0gICAgICAgIE15VGhyZWFkKGNvbnN0IHNwPFN1cmZhY2VUZXh0dXJlPiYgc3QpCi0gICAgICAgICAgICA6IHN0KHN0KSwgbUJ1ZmZlclJldGlyZWQoZmFsc2UpIHsKKyAgICAgICAgTXlUaHJlYWQoY29uc3Qgc3A8U3VyZmFjZVRleHR1cmU+JiBtU1QpCisgICAgICAgICAgICA6IG1TVChtU1QpLCBtQnVmZmVyUmV0aXJlZChmYWxzZSkgewogICAgICAgICAgICAgY3R4ID0gZWdsR2V0Q3VycmVudENvbnRleHQoKTsKICAgICAgICAgICAgIHN1ciA9IGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKICAgICAgICAgICAgIGRweSA9IGVnbEdldEN1cnJlbnREaXNwbGF5KCk7CkBAIC00OTMsMjUgKzQ2NSwxNTIgQEAKICAgICB9OwogCiAgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZlszXTsKLSAgICBBU1NFUlRfRVEoT0ssIHN0LT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGFudy5nZXQoKSwgMykpOworICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKICAgICAvLyBkZXF1ZXVlL3F1ZXVlL3VwZGF0ZSBzbyB3ZSBoYXZlIGEgY3VycmVudCBidWZmZXIKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIGFudy0+cXVldWVCdWZmZXIoYW53LmdldCgpLCBidWZbMF0pKTsKLSAgICBzdC0+dXBkYXRlVGV4SW1hZ2UoKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwogCi0gICAgTXlUaHJlYWQqIHRocmVhZCA9IG5ldyBNeVRocmVhZChzdCk7CisgICAgTXlUaHJlYWQqIHRocmVhZCA9IG5ldyBNeVRocmVhZChtU1QpOwogICAgIHNwPFRocmVhZD4gdGhyZWFkQmFzZSh0aHJlYWQpOwogCi0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzFdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwogICAgIHRocmVhZC0+cnVuKCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmWzJdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmWzJdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOworICAgIC8vQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKKyAgICAvL0FTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7CiAgICAgdGhyZWFkLT5idWZmZXJEZXF1ZXVlZCgpOwogICAgIHRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiB9CiAKK1RFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEdldFRyYW5zZm9ybU1hdHJpeFJldHVybnNWZXJ0aWNhbEZsaXApIHsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOworICAgIGZsb2F0IG10eFsxNl0gPSB7fTsKKyAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7CisgICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKKyAgICBtU1QtPmdldFRyYW5zZm9ybU1hdHJpeChtdHgpOworCisgICAgRVhQRUNUX0VRKDEuZiwgbXR4WzBdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMV0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFsyXSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzNdKTsKKworICAgIEVYUEVDVF9FUSgwLmYsIG10eFs0XSk7CisgICAgRVhQRUNUX0VRKC0xLmYsIG10eFs1XSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzZdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbN10pOworCisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzhdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOV0pOworICAgIEVYUEVDVF9FUSgxLmYsIG10eFsxMF0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxMV0pOworCisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzEyXSk7CisgICAgRVhQRUNUX0VRKDEuZiwgbXR4WzEzXSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzE0XSk7CisgICAgRVhQRUNUX0VRKDEuZiwgbXR4WzE1XSk7CiB9CisKK1RFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEdldFRyYW5zZm9ybU1hdHJpeFN1Y2NlZWRzQWZ0ZXJGcmVlaW5nQnVmZmVycykgeworICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107CisgICAgZmxvYXQgbXR4WzE2XSA9IHt9OworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDYpKTsgLy8gZnJlZXMgYnVmZmVycworICAgIG1TVC0+Z2V0VHJhbnNmb3JtTWF0cml4KG10eCk7CisKKyAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMF0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxXSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzJdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbM10pOworCisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzRdKTsKKyAgICBFWFBFQ1RfRVEoLTEuZiwgbXR4WzVdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbNl0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFs3XSk7CisKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOF0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFs5XSk7CisgICAgRVhQRUNUX0VRKDEuZiwgbXR4WzEwXSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzExXSk7CisKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTJdKTsKKyAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTNdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTRdKTsKKyAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTVdKTsKK30KKworVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgR2V0VHJhbnNmb3JtTWF0cml4U3VjY2VlZHNBZnRlckZyZWVpbmdCdWZmZXJzV2l0aENyb3ApIHsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOworICAgIGZsb2F0IG10eFsxNl0gPSB7fTsKKyAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKKyAgICBjcm9wLmxlZnQgPSAwOworICAgIGNyb3AudG9wID0gMDsKKyAgICBjcm9wLnJpZ2h0ID0gNTsKKyAgICBjcm9wLmJvdHRvbSA9IDU7CisKKyAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7CisgICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDgsIDgsIDApKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfY3JvcChtQU5XLmdldCgpLCAmY3JvcCkpOworICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7CisgICAgQVNTRVJUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOworICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDYpKTsgLy8gZnJlZXMgYnVmZmVycworICAgIG1TVC0+Z2V0VHJhbnNmb3JtTWF0cml4KG10eCk7CisKKyAgICAvLyBUaGlzIGFjY291bnRzIGZvciB0aGUgMSB0ZXhlbCBzaHJpbmsgZm9yIGVhY2ggZWRnZSB0aGF0J3MgaW5jbHVkZWQgaW4gdGhlCisgICAgLy8gdHJhbnNmb3JtIG1hdHJpeCB0byBhdm9pZCB0ZXh0dXJpbmcgb3V0c2lkZSB0aGUgY3JvcCByZWdpb24uCisgICAgRVhQRUNUX0VRKC41ZiwgbXR4WzBdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMV0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFsyXSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzNdKTsKKworICAgIEVYUEVDVF9FUSgwLmYsIG10eFs0XSk7CisgICAgRVhQRUNUX0VRKC0uNWYsIG10eFs1XSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzZdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbN10pOworCisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzhdKTsKKyAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOV0pOworICAgIEVYUEVDVF9FUSgxLmYsIG10eFsxMF0pOworICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxMV0pOworCisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzEyXSk7CisgICAgRVhQRUNUX0VRKC41ZiwgbXR4WzEzXSk7CisgICAgRVhQRUNUX0VRKDAuZiwgbXR4WzE0XSk7CisgICAgRVhQRUNUX0VRKDEuZiwgbXR4WzE1XSk7Cit9CisKKy8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBidWZmZXIgZm9ybWF0IGNhbiBiZSBxdWVyaWVkIGltbWVkaWF0ZWx5IGFmdGVyCisvLyBpdCBpcyBzZXQuCitURVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBRdWVyeUZvcm1hdEFmdGVyU2V0dGluZ1dvcmtzKSB7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TVEMpOworICAgIGludCBmbXRzW10gPSB7CisgICAgICAgIC8vIFJHQkFfODg4OCBzaG91bGQgbm90IGNvbWUgZmlyc3QsIGFzIGl0J3MgdGhlIGRlZmF1bHQKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsCisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LAorICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQl84ODgsCisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgsCisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLAorICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgIH07CisKKyAgICBjb25zdCBpbnQgbnVtRm10cyA9IChzaXplb2YoZm10cykgLyBzaXplb2YoZm10c1swXSkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRm10czsgaSsrKSB7CisgICAgICBpbnQgZm10ID0gLTE7CisgICAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoYW53LmdldCgpLCAwLCAwLCBmbXRzW2ldKSk7CisgICAgICBBU1NFUlRfRVEoT0ssIGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZtdCkpOworICAgICAgRVhQRUNUX0VRKGZtdHNbaV0sIGZtdCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9TdXJmYWNlVGV4dHVyZV90ZXN0LmNwcCBiL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlX3Rlc3QuY3BwCmluZGV4IDg3NDdiYTUuLmY2Y2VmYTYgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlX3Rlc3QuY3BwCisrKyBiL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlX3Rlc3QuY3BwCkBAIC0xNCwxMSArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKwogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZUNvbXBvc2VyLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgpAQCAtNDMsOCArNDYsNiBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgRUdMQm9vbGVhbiByZXR1cm5WYWx1ZTsKLQogICAgICAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CiAgICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgIEFTU0VSVF9ORShFR0xfTk9fRElTUExBWSwgbUVnbERpc3BsYXkpOwpAQCAtNTYsOSArNTcsOCBAQAogICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsVmVyc2lvbk1ham9yIiwgbWFqb3JWZXJzaW9uKTsKICAgICAgICAgUmVjb3JkUHJvcGVydHkoIkVnbFZlcnNpb25NYWpvciIsIG1pbm9yVmVyc2lvbik7CiAKLSAgICAgICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwogICAgICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDA7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgZ2V0Q29uZmlnQXR0cmlicygpLCAmbXlDb25maWcsCisgICAgICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgZ2V0Q29uZmlnQXR0cmlicygpLCAmbUdsQ29uZmlnLAogICAgICAgICAgICAgICAgIDEsICZudW1Db25maWdzKSk7CiAgICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CiAKQEAgLTg1LDEyICs4NSwxMiBAQAogICAgICAgICAgICAgQVNTRVJUX1RSVUUobVN1cmZhY2VDb250cm9sLT5pc1ZhbGlkKCkpOwogCiAgICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1Db21wb3NlckNsaWVudC0+b3BlblRyYW5zYWN0aW9uKCkpOwotICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNldExheWVyKDMwMDAwKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMHg3RkZGRkZGRikpOwogICAgICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7CiAgICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1Db21wb3NlckNsaWVudC0+Y2xvc2VUcmFuc2FjdGlvbigpKTsKIAogICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93ID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG15Q29uZmlnLAorICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtR2xDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nZXQoKSwgTlVMTCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFR0xpbnQgcGJ1ZmZlckF0dHJpYnNbXSA9IHsKQEAgLTk4LDEzICs5OCwxMyBAQAogICAgICAgICAgICAgICAgIEVHTF9IRUlHSFQsIGdldFN1cmZhY2VIZWlnaHQoKSwKICAgICAgICAgICAgICAgICBFR0xfTk9ORSB9OwogCi0gICAgICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKG1FZ2xEaXNwbGF5LCBteUNvbmZpZywKKyAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgcGJ1ZmZlckF0dHJpYnMpOwogICAgICAgICB9CiAgICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgIEFTU0VSVF9ORShFR0xfTk9fU1VSRkFDRSwgbUVnbFN1cmZhY2UpOwogCi0gICAgICAgIG1FZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbXlDb25maWcsIEVHTF9OT19DT05URVhULAorICAgICAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIG1HbENvbmZpZywgRUdMX05PX0NPTlRFWFQsCiAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dEF0dHJpYnMoKSk7CiAgICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUVnbENvbnRleHQpOwpAQCAtMjcwLDggKzI3MCwxMiBAQAogICAgICAgICAqb3V0UGdtID0gcHJvZ3JhbTsKICAgICB9CiAKKyAgICBzdGF0aWMgaW50IGFicyhpbnQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogLXZhbHVlOworICAgIH0KKwogICAgIDo6dGVzdGluZzo6QXNzZXJ0aW9uUmVzdWx0IGNoZWNrUGl4ZWwoaW50IHgsIGludCB5LCBpbnQgciwKLSAgICAgICAgICAgIGludCBnLCBpbnQgYiwgaW50IGEpIHsKKyAgICAgICAgICAgIGludCBnLCBpbnQgYiwgaW50IGEsIGludCB0b2xlcmFuY2U9MikgewogICAgICAgICBHTHVieXRlIHBpeGVsWzRdOwogICAgICAgICBTdHJpbmc4IG1zZzsKICAgICAgICAgZ2xSZWFkUGl4ZWxzKHgsIHksIDEsIDEsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVsKTsKQEAgLTI4NSwyMiArMjg5LDIyIEBACiAgICAgICAgICAgICByZXR1cm4gOjp0ZXN0aW5nOjpBc3NlcnRpb25GYWlsdXJlKAogICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6Ok1lc3NhZ2UobXNnLnN0cmluZygpKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHIgPj0gMCAmJiBHTHVieXRlKHIpICE9IHBpeGVsWzBdKSB7CisgICAgICAgIGlmIChyID49IDAgJiYgYWJzKHIgLSBpbnQocGl4ZWxbMF0pKSA+IHRvbGVyYW5jZSkgewogICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiciglZCBpc24ndCAlZCkiLCBwaXhlbFswXSwgcik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGcgPj0gMCAmJiBHTHVieXRlKGcpICE9IHBpeGVsWzFdKSB7CisgICAgICAgIGlmIChnID49IDAgJiYgYWJzKGcgLSBpbnQocGl4ZWxbMV0pKSA+IHRvbGVyYW5jZSkgewogICAgICAgICAgICAgaWYgKCFtc2cuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgbXNnICs9ICIgIjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoImcoJWQgaXNuJ3QgJWQpIiwgcGl4ZWxbMV0sIGcpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChiID49IDAgJiYgR0x1Ynl0ZShiKSAhPSBwaXhlbFsyXSkgeworICAgICAgICBpZiAoYiA+PSAwICYmIGFicyhiIC0gaW50KHBpeGVsWzJdKSkgPiB0b2xlcmFuY2UpIHsKICAgICAgICAgICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIG1zZyArPSAiICI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCJiKCVkIGlzbid0ICVkKSIsIHBpeGVsWzJdLCBiKTsKICAgICAgICAgfQotICAgICAgICBpZiAoYSA+PSAwICYmIEdMdWJ5dGUoYSkgIT0gcGl4ZWxbM10pIHsKKyAgICAgICAgaWYgKGEgPj0gMCAmJiBhYnMoYSAtIGludChwaXhlbFszXSkpID4gdG9sZXJhbmNlKSB7CiAgICAgICAgICAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBtc2cgKz0gIiAiOwogICAgICAgICAgICAgfQpAQCAtMzIyLDYgKzMyNiw3IEBACiAgICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKICAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOwogICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7CisgICAgRUdMQ29uZmlnICBtR2xDb25maWc7CiB9OwogCiAvLyBYWFg6IENvZGUgYWJvdmUgdGhpcyBwb2ludCBzaG91bGQgbGl2ZSBlbHNld2hlcmUKQEAgLTM5NCw2ICszOTksMTggQEAKICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgVEVYX0lEKTsKICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7CiAKKyAgICAgICAgLy8gWFhYOiBUaGVzZSBjYWxscyBhcmUgbm90IG5lZWRlZCBmb3IgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgYXMKKyAgICAgICAgLy8gdGhleSdyZSBzZXR0aW5nIHRoZSBkZWZhdXRscyBmb3IgdGhhdCB0YXJnZXQsIGJ1dCB3aGVuIGhhY2tpbmcgdGhpbmdzCisgICAgICAgIC8vIHRvIHVzZSBHTF9URVhUVVJFXzJEIHRoZXkgYXJlIG5lZWRlZCB0byBhY2hpZXZlIHRoZSBzYW1lIGJlaGF2aW9yLgorICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7CisKICAgICAgICAgR0xmbG9hdCB0ZXhNYXRyaXhbMTZdOwogICAgICAgICBtU1QtPmdldFRyYW5zZm9ybU1hdHJpeCh0ZXhNYXRyaXgpOwogICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobVRleE1hdHJpeEhhbmRsZSwgMSwgR0xfRkFMU0UsIHRleE1hdHJpeCk7CkBAIC00NjcsMTIgKzQ4NCwyNiBAQAogICAgIH0KIH0KIAordm9pZCBmaWxsUkdCQThCdWZmZXIodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgICBjb25zdCBzaXplX3QgUElYRUxfU0laRSA9IDQ7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIG9mZl90IG9mZnNldCA9ICh5ICogc3RyaWRlICsgeCkgKiBQSVhFTF9TSVpFOworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyaXR5WCA9ICh4IC8gKDEgPDwgKGMrMikpKSAmIDE7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVkgPSAoeSAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBjXSA9IChwYXJpdHlYIF4gcGFyaXR5WSkgPyAyMzEgOiAzNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwogVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlck5wb3QpIHsKLSAgICBjb25zdCBpbnQgeXV2VGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgeXV2VGV4SGVpZ2h0ID0gNjY7CisgICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7CisgICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY2OwogCiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCi0gICAgICAgICAgICB5dXZUZXhXaWR0aCwgeXV2VGV4SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIpKTsKKyAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKIApAQCAtNDg2LDcgKzUxNyw3IEBACiAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4KICAgICB1aW50OF90KiBpbWcgPSBOVUxMOwogICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgZmlsbFlWMTJCdWZmZXIoaW1nLCB5dXZUZXhXaWR0aCwgeXV2VGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKKyAgICBmaWxsWVYxMkJ1ZmZlcihpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwogICAgIGJ1Zi0+dW5sb2NrKCk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7CiAKQEAgLTUxMSwxNiArNTQyLDEyIEBACiAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzNiwgMjIsIDE1NSwgIDI5LCAgIDAsIDI1NSkpOwogfQogCi0vLyBYWFg6IFRoaXMgdGVzdCBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGl0IGN1cnJlbnRseSBicm9rZW4gb24gYWxsIGRldmljZXMgdG8KLS8vIHdoaWNoIEkgaGF2ZSBhY2Nlc3MuICBTb21lIG9mIHRoZSBjaGVja1BpeGVsIGNhbGxzIGFyZSBub3QgY29ycmVjdCBiZWNhdXNlCi0vLyBJIGp1c3QgY29waWVkIHRoZW0gZnJvbSB0aGUgbnBvdCB0ZXN0IGFib3ZlIGFuZCBoYXZlbid0IGJvdGhlcmVkIHRvIGZpZ3VyZQotLy8gb3V0IHRoZSBjb3JyZWN0IHZhbHVlcy4KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgRElTQUJMRURfVGV4dHVyaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJQb3cyKSB7Ci0gICAgY29uc3QgaW50IHl1dlRleFdpZHRoID0gNjQ7Ci0gICAgY29uc3QgaW50IHl1dlRleEhlaWdodCA9IDY0OworVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlclBvdzIpIHsKKyAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKKyAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjQ7CiAKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHl1dlRleFdpZHRoLCB5dXZUZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOworICAgICAgICAgICAgdGV4V2lkdGgsIHRleEhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwogCkBAIC01MzQsNyArNTYxLDcgQEAKICAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYSBjaGVja2VyYm9hcmQgcGF0dGVybgogICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7CiAgICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKLSAgICBmaWxsWVYxMkJ1ZmZlcihpbWcsIHl1dlRleFdpZHRoLCB5dXZUZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOworICAgIGZpbGxZVjEyQnVmZmVyKGltZywgdGV4V2lkdGgsIHRleEhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7CiAgICAgYnVmLT51bmxvY2soKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKIApAQCAtNTQ1LDI2ICs1NzIsMjYgQEAKIAogICAgIGRyYXdUZXh0dXJlKCk7CiAKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCAgMCwgMjU1LCAxMjcsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgIDAsICAgMCwgMTMzLCAgIDAsIDI1NSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAgIDAsIDEzMywgICAwLCAyNTUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgMjU1LCAxMjcsIDI1NSwgMjU1KSk7CiAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgNjMsICAgMCwgMTMzLCAgIDAsIDI1NSkpOwogICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDYzLCAyNTUsIDEyNywgMjU1LCAyNTUpKTsKIAotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjIsIDE5LCAyNDcsICA3MCwgMjU1LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ1LCAxMSwgMjA5LCAgMzIsIDIzNSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1MiwgMTIsIDEwMCwgMjU1LCAgNzMsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDcsIDMyLCAxNTUsICAgMCwgMTE4LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDMxLCA1NCwgMTQ4LCAgNzEsIDExMCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyOSwgMjgsIDI1NSwgMTI3LCAyNTUsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzYsIDQxLCAxNTUsICAyOSwgICAwLCAyNTUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDIyLCAxOSwgMTAwLCAyNTUsICA3NCwgMjU1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NSwgMTEsIDEwMCwgMjU1LCAgNzQsIDI1NSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTIsIDEyLCAxNTUsICAgMCwgMTgxLCAyNTUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA3LCAzMiwgMTUwLCAyMzcsIDE3MCwgMjU1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMSwgNTQsICAgMCwgIDcxLCAxMTcsIDI1NSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjksIDI4LCAgIDAsIDEzMywgICAwLCAyNTUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDM2LCA0MSwgMTAwLCAyMzIsIDI1NSwgMjU1KSk7CiB9CiAKIFRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgVGV4dHVyaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJXaXRoQ3JvcCkgewotICAgIGNvbnN0IGludCB5dXZUZXhXaWR0aCA9IDY0OwotICAgIGNvbnN0IGludCB5dXZUZXhIZWlnaHQgPSA2NjsKKyAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKKyAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjY7CiAKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHl1dlRleFdpZHRoLCB5dXZUZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOworICAgICAgICAgICAgdGV4V2lkdGgsIHRleEhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwogCkBAIC01NzIsOCArNTk5LDggQEAKICAgICAgICAgezQsIDYsIDIyLCAzNn0sCiAgICAgICAgIHswLCA2LCAyMiwgMzZ9LAogICAgICAgICB7NCwgMCwgMjIsIDM2fSwKLSAgICAgICAgezQsIDYsIHl1dlRleFdpZHRoLCAzNn0sCi0gICAgICAgIHs0LCA2LCAyMiwgeXV2VGV4SGVpZ2h0fSwKKyAgICAgICAgezQsIDYsIHRleFdpZHRoLCAzNn0sCisgICAgICAgIHs0LCA2LCAyMiwgdGV4SGVpZ2h0fSwKICAgICB9OwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKQEAgLTU5Miw3ICs2MTksNyBAQAogCiAgICAgICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7CiAgICAgICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgICAgIGZpbGxZVjEyQnVmZmVyUmVjdChpbWcsIHl1dlRleFdpZHRoLCB5dXZUZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCksIGNyb3ApOworICAgICAgICBmaWxsWVYxMkJ1ZmZlclJlY3QoaW1nLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpLCBjcm9wKTsKICAgICAgICAgYnVmLT51bmxvY2soKTsKICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7CiAKQEAgLTYxOCw0ICs2NDUsNDUzIEBACiAgICAgfQogfQogCisvLyBYWFg6IFRoaXMgdGVzdCBpcyBkaXNhYmxlZCBiZWNhdXNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZHJpdmVycyB0aGF0IGNhbgorLy8gaGFuZGxlIFJHQkEgdGV4dHVyZXMgd2l0aCB0aGUgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgdGFyZ2V0LgorVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBESVNBQkxFRF9UZXh0dXJpbmdGcm9tQ3B1RmlsbGVkUkdCQUJ1ZmZlck5wb3QpIHsKKyAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKKyAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjY7CisKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKKyAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4KSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAorICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOworCisgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGFuYjsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOworICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKKworICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCisgICAgdWludDhfdCogaW1nID0gTlVMTDsKKyAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOworICAgIGZpbGxSR0JBOEJ1ZmZlcihpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOworICAgIGJ1Zi0+dW5sb2NrKCk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7CisKKyAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7CisKKyAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZHJhd1RleHR1cmUoKTsKKworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAgMzUsICAzNSwgIDM1LCAgMzUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgMjMxLCAyMzEsIDIzMSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgNjMsIDIzMSwgMjMxLCAyMzEsIDIzMSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDYzLCAgMzUsICAzNSwgIDM1LCAgMzUpKTsKKworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTUsIDEwLCAgMzUsIDIzMSwgMjMxLCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI0LCA2MywgIDM1LCAyMzEsIDIzMSwgIDM1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxOSwgNDAsICA4NywgMTc5LCAgMzUsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzgsIDMwLCAyMzEsICAzNSwgIDM1LCAgMzUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQyLCA1NCwgIDM1LCAgMzUsICAzNSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzNywgMzMsICAzNSwgMjMxLCAyMzEsIDIzMSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzEsICA4LCAyMzEsICAzNSwgIDM1LCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDM2LCA0NywgMjMxLCAgMzUsIDIzMSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyNCwgNjMsICAzNSwgMjMxLCAyMzEsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDgsICAzLCAyMzEsIDIzMSwgIDM1LCAgMzUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDU0LCA1MCwgIDM1LCAyMzEsIDIzMSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyNCwgMjUsIDE5MSwgMTkxLCAyMzEsIDIzMSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTAsICA5LCAgOTMsICA5MywgMjMxLCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI5LCAgNCwgIDM1LCAgMzUsICAzNSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NiwgMzEsICAzNSwgMjMxLCAyMzEsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTgsIDU1LCAgMzUsICAzNSwgMjMxLCAyMzEpKTsKIH0KKworLy8gWFhYOiBUaGlzIHRlc3QgaXMgZGlzYWJsZWQgYmVjYXVzZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGRyaXZlcnMgdGhhdCBjYW4KKy8vIGhhbmRsZSBSR0JBIHRleHR1cmVzIHdpdGggdGhlIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTIHRhcmdldC4KK1RFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgRElTQUJMRURfVGV4dHVyaW5nRnJvbUNwdUZpbGxlZFJHQkFCdWZmZXJQb3cyKSB7CisgICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7CisgICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY0OworCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksCisgICAgICAgICAgICB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKKyAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKKworICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBhbmI7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKKyAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+bG9ja0J1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7CisKKyAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYSBjaGVja2VyYm9hcmQgcGF0dGVybgorICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7CisgICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZpbWcpKTsKKyAgICBmaWxsUkdCQThCdWZmZXIoaW1nLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKKyAgICBidWYtPnVubG9jaygpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOworCisgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOworCisgICAgZ2xDbGVhckNvbG9yKDAuMiwgMC4yLCAwLjIsIDAuMik7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGRyYXdUZXh0dXJlKCk7CisKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCAgMCwgMjMxLCAyMzEsIDIzMSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgIDAsICAzNSwgIDM1LCAgMzUsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsIDYzLCAyMzEsIDIzMSwgMjMxLCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCA2MywgIDM1LCAgMzUsICAzNSwgIDM1KSk7CisKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDEyLCA0NiwgMjMxLCAyMzEsIDIzMSwgIDM1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNiwgIDEsIDIzMSwgMjMxLCAgMzUsIDIzMSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjEsIDEyLCAyMzEsICAzNSwgIDM1LCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI2LCA1MSwgMjMxLCAgMzUsIDIzMSwgIDM1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNSwgMzIsICAzNSwgMjMxLCAyMzEsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTMsICA4LCAgMzUsIDIzMSwgMjMxLCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ2LCAgMywgIDM1LCAgMzUsIDIzMSwgIDM1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMCwgMzMsICAzNSwgIDM1LCAgMzUsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDYsIDUyLCAyMzEsIDIzMSwgIDM1LCAgMzUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDU1LCAzMywgIDM1LCAyMzEsICAzNSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNiwgMjksICAzNSwgIDM1LCAyMzEsIDIzMSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDEsIDMwLCAgMzUsICAzNSwgIDM1LCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQxLCAzNywgIDM1LCAgMzUsIDIzMSwgMjMxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NiwgMjksIDIzMSwgMjMxLCAgMzUsICAzNSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTUsIDI1LCAgMzUsIDIzMSwgIDM1LCAyMzEpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAzLCA1MiwgIDM1LCAyMzEsICAzNSwgIDM1KSk7Cit9CisKKy8vIFhYWDogVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBkcml2ZXJzIHRoYXQgY2FuCisvLyBoYW5kbGUgUkdCQSB0ZXh0dXJlcyB3aXRoIHRoZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyB0YXJnZXQuCitURVNUX0YoU3VyZmFjZVRleHR1cmVHTFRlc3QsIERJU0FCTEVEX1RleHR1cmluZ0Zyb21HTEZpbGxlZFJHQkFCdWZmZXJQb3cyKSB7CisgICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7CisgICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY0OworCisgICAgbVNULT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKKworICAgIC8vIERvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoaW5ncworICAgIEVHTFN1cmZhY2Ugc3RjRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG1HbENvbmZpZywKKyAgICAgICAgICAgIG1BTlcuZ2V0KCksIE5VTEwpOworICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7CisgICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSk7CisKKyAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgc3RjRWdsU3VyZmFjZSwgc3RjRWdsU3VyZmFjZSwKKyAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7CisgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKKworICAgIGdsQ2xlYXJDb2xvcigwLjYsIDAuNiwgMC42LCAwLjYpOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGdsU2Npc3Nvcig0LCA0LCA0LCA0KTsKKyAgICBnbENsZWFyQ29sb3IoMS4wLCAwLjAsIDAuMCwgMS4wKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZ2xTY2lzc29yKDI0LCA0OCwgNCwgNCk7CisgICAgZ2xDbGVhckNvbG9yKDAuMCwgMS4wLCAwLjAsIDEuMCk7CisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgIGdsU2Npc3NvcigzNywgMTcsIDQsIDQpOworICAgIGdsQ2xlYXJDb2xvcigwLjAsIDAuMCwgMS4wLCAxLjApOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgc3RjRWdsU3VyZmFjZSk7CisKKyAgICAvLyBEbyB0aGUgY29uc3VtZXIgc2lkZSBvZiB0aGluZ3MKKyAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAorICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKKyAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOworCisgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisKKyAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7CisKKyAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZHJhd1RleHR1cmUoKTsKKworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgNjMsIDE1MywgMTUzLCAxNTMsIDE1MykpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDYzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKKworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDQsICA3LCAyNTUsICAgMCwgICAwLCAyNTUpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI1LCA1MSwgICAwLCAyNTUsICAgMCwgMjU1KSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0MCwgMTksICAgMCwgICAwLCAyNTUsIDI1NSkpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjksIDUxLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA1LCAzMiwgMTUzLCAxNTMsIDE1MywgMTUzKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxMywgIDgsIDE1MywgMTUzLCAxNTMsIDE1MykpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsICAzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDMwLCAzMywgMTUzLCAxNTMsIDE1MywgMTUzKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNiwgNTIsIDE1MywgMTUzLCAxNTMsIDE1MykpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTUsIDMzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE2LCAyOSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMSwgMzAsIDE1MywgMTUzLCAxNTMsIDE1MykpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDEsIDM3LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKKyAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ2LCAyOSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7CisgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNSwgMjUsIDE1MywgMTUzLCAxNTMsIDE1MykpOworICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDMsIDUyLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKK30KKworLyoKKyAqIFRoaXMgdGVzdCBpcyBmb3IgdGVzdGluZyBHTCAtPiBHTCB0ZXh0dXJlIHN0cmVhbWluZyB2aWEgU3VyZmFjZVRleHR1cmUuICBJdAorICogY29udGFpbnMgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgYSBwcm9kdWNlciB0aHJlYWQgdGhhdCB3aWxsIHBlcmZvcm0gR0wKKyAqIHJlbmRlcmluZyB0byBhbiBBTmF0aXZlV2luZG93IHRoYXQgZmVlZHMgZnJhbWVzIHRvIGEgU3VyZmFjZVRleHR1cmUuCisgKiBBZGRpdGlvbmFsbHkgaXQgc3VwcG9ydHMgaW50ZXJsb2NraW5nIHRoZSBwcm9kdWNlciBhbmQgY29uc3VtZXIgdGhyZWFkcyBzbworICogdGhhdCBhIHNwZWNpZmljIHNlcXVlbmNlIG9mIGNhbGxzIGNhbiBiZSBkZXRlcm1pbmlzdGljYWxseSBjcmVhdGVkIGJ5IHRoZQorICogdGVzdC4KKyAqCisgKiBUaGUgaW50ZW5kZWQgdXNhZ2UgaXMgYXMgZm9sbG93czoKKyAqCisgKiBURVNUX0YoLi4uKSB7CisgKiAgICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgeworICogICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgeworICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgICAgICBzd2FwQnVmZmVycygpOworICogICAgICAgICB9CisgKiAgICAgfTsKKyAqCisgKiAgICAgcnVuUHJvZHVjZXJUaHJlYWQobmV3IFBUKCkpOworICoKKyAqICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlc2UgY2FsbHMgd2lsbCB2YXJ5IGZyb20gdGVzdCB0byB0ZXN0IGFuZCBtYXkgaW5jbHVkZQorICogICAgIC8vIG11bHRpcGxlIGZyYW1lcyBhbmQgYWRkaXRpb25hbCBvcGVyYXRpb25zIChlLmcuIEdMIHJlbmRlcmluZyBmcm9tIHRoZQorICogICAgIC8vIHRleHR1cmUpLgorICogICAgIGZjLT53YWl0Rm9yRnJhbWUoKTsKKyAqICAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7CisgKiAgICAgZmMtPmZpbmlzaEZyYW1lKCk7CisgKiB9CisgKgorICovCitjbGFzcyBTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3QgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmVHTFRlc3QgeworcHJvdGVjdGVkOgorCisgICAgLy8gUHJvZHVjZXJUaHJlYWQgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyB0byBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YKKyAgICAvLyBPcGVuR0wgRVMgZnJhbWUgcHJvZHVjZXIgdGhyZWFkcy4KKyAgICBjbGFzcyBQcm9kdWNlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+UHJvZHVjZXJUaHJlYWQoKSB7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldEVnbE9iamVjdHMoRUdMRGlzcGxheSBwcm9kdWNlckVnbERpc3BsYXksCisgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSBwcm9kdWNlckVnbFN1cmZhY2UsCisgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBwcm9kdWNlckVnbENvbnRleHQpIHsKKyAgICAgICAgICAgIG1Qcm9kdWNlckVnbERpc3BsYXkgPSBwcm9kdWNlckVnbERpc3BsYXk7CisgICAgICAgICAgICBtUHJvZHVjZXJFZ2xTdXJmYWNlID0gcHJvZHVjZXJFZ2xTdXJmYWNlOworICAgICAgICAgICAgbVByb2R1Y2VyRWdsQ29udGV4dCA9IHByb2R1Y2VyRWdsQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgeworICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQobVByb2R1Y2VyRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSwgbVByb2R1Y2VyRWdsQ29udGV4dCk7CisgICAgICAgICAgICByZW5kZXIoKTsKKyAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50KG1Qcm9kdWNlckVnbERpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoKSA9IDA7CisKKyAgICAgICAgdm9pZCBzd2FwQnVmZmVycygpIHsKKyAgICAgICAgICAgIGVnbFN3YXBCdWZmZXJzKG1Qcm9kdWNlckVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgRUdMRGlzcGxheSBtUHJvZHVjZXJFZ2xEaXNwbGF5OworICAgICAgICBFR0xTdXJmYWNlIG1Qcm9kdWNlckVnbFN1cmZhY2U7CisgICAgICAgIEVHTENvbnRleHQgbVByb2R1Y2VyRWdsQ29udGV4dDsKKyAgICB9OworCisgICAgLy8gRnJhbWVDb25kaXRpb24gaXMgYSB1dGlsaXR5IGNsYXNzIGZvciBpbnRlcmxvY2tpbmcgYmV0d2VlbiB0aGUgcHJvZHVjZXIKKyAgICAvLyBhbmQgY29uc3VtZXIgdGhyZWFkcy4gIFRoZSBGcmFtZUNvbmRpdGlvbiBvYmplY3Qgc2hvdWxkIGJlIGNyZWF0ZWQgYW5kCisgICAgLy8gZGVzdHJveWVkIGluIHRoZSBjb25zdW1lciB0aHJlYWQgb25seS4gIFRoZSBjb25zdW1lciB0aHJlYWQgc2hvdWxkIHNldAorICAgIC8vIHRoZSBGcmFtZUNvbmRpdGlvbiBhcyB0aGUgRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBvZiB0aGUgU3VyZmFjZVRleHR1cmUsCisgICAgLy8gYW5kIHNob3VsZCBjYWxsIGJvdGggd2FpdEZvckZyYW1lIGFuZCBmaW5pc2hGcmFtZSBvbmNlIGZvciBlYWNoIGV4cGVjdGVkCisgICAgLy8gZnJhbWUuCisgICAgLy8KKyAgICAvLyBUaGlzIGludGVybG9ja2luZyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBvbkZyYW1lQXZhaWxhYmxlIGdldHMgY2FsbGVkCisgICAgLy8gc3luY2hyb25vdXNseSBmcm9tIFN1cmZhY2VUZXh0dXJlOjpxdWV1ZUJ1ZmZlci4KKyAgICBjbGFzcyBGcmFtZUNvbmRpdGlvbiA6IHB1YmxpYyBTdXJmYWNlVGV4dHVyZTo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICAvLyB3YWl0Rm9yRnJhbWUgd2FpdHMgZm9yIHRoZSBuZXh0IGZyYW1lIHRvIGFycml2ZS4gIFRoaXMgc2hvdWxkIGJlCisgICAgICAgIC8vIGNhbGxlZCBmcm9tIHRoZSBjb25zdW1lciB0aHJlYWQgb25jZSBmb3IgZXZlcnkgZnJhbWUgZXhwZWN0ZWQgYnkgdGhlCisgICAgICAgIC8vIHRlc3QuCisgICAgICAgIHZvaWQgd2FpdEZvckZyYW1lKCkgeworICAgICAgICAgICAgTE9HVigiK3dhaXRGb3JGcmFtZSIpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7CisgICAgICAgICAgICBMT0dWKCItd2FpdEZvckZyYW1lIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbGxvdyB0aGUgcHJvZHVjZXIgdG8gcmV0dXJuIGZyb20gaXRzIHN3YXBCdWZmZXJzIGNhbGwgYW5kIGNvbnRpbnVlCisgICAgICAgIC8vIG9uIHRvIHByb2R1Y2UgdGhlIG5leHQgZnJhbWUuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNvbnN1bWVyCisgICAgICAgIC8vIHRocmVhZCBvbmNlIGZvciBldmVyeSBmcmFtZSBleHBlY3RlZCBieSB0aGUgdGVzdC4KKyAgICAgICAgdm9pZCBmaW5pc2hGcmFtZSgpIHsKKyAgICAgICAgICAgIExPR1YoIitmaW5pc2hGcmFtZSIpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIG1GcmFtZUZpbmlzaENvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgICAgIExPR1YoIi1maW5pc2hGcmFtZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IFN1cmZhY2VUZXh0dXJlIG9uIHRoZSBwcm9kdWNlciB0aHJlYWQuCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgeworICAgICAgICAgICAgTE9HVigiK29uRnJhbWVBdmFpbGFibGUiKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICBtRnJhbWVGaW5pc2hDb25kaXRpb24ud2FpdChtTXV0ZXgpOworICAgICAgICAgICAgTE9HVigiLW9uRnJhbWVBdmFpbGFibGUiKTsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBNdXRleCBtTXV0ZXg7CisgICAgICAgIENvbmRpdGlvbiBtRnJhbWVBdmFpbGFibGVDb25kaXRpb247CisgICAgICAgIENvbmRpdGlvbiBtRnJhbWVGaW5pc2hDb25kaXRpb247CisgICAgfTsKKworICAgIFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdCgpOgorICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZShFR0xfTk9fU1VSRkFDRSksCisgICAgICAgICAgICBtUHJvZHVjZXJFZ2xDb250ZXh0KEVHTF9OT19DT05URVhUKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgICBTdXJmYWNlVGV4dHVyZUdMVGVzdDo6U2V0VXAoKTsKKworICAgICAgICBFR0xDb25maWcgbXlDb25maWcgPSB7MH07CisgICAgICAgIEVHTGludCBudW1Db25maWdzID0gMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBnZXRDb25maWdBdHRyaWJzKCksICZteUNvbmZpZywKKyAgICAgICAgICAgICAgICAxLCAmbnVtQ29uZmlncykpOworICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOworCisgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1FZ2xEaXNwbGF5LCBteUNvbmZpZywKKyAgICAgICAgICAgICAgICBtQU5XLmdldCgpLCBOVUxMKTsKKyAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtUHJvZHVjZXJFZ2xTdXJmYWNlKTsKKworICAgICAgICBtUHJvZHVjZXJFZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtRWdsRGlzcGxheSwgbXlDb25maWcsCisgICAgICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQsIGdldENvbnRleHRBdHRyaWJzKCkpOworICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOworICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0NPTlRFWFQsIG1Qcm9kdWNlckVnbENvbnRleHQpOworCisgICAgICAgIG1GQyA9IG5ldyBGcmFtZUNvbmRpdGlvbigpOworICAgICAgICBtU1QtPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobUZDKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgICAgIGlmIChtUHJvZHVjZXJUaHJlYWQgIT0gTlVMTCkgeworICAgICAgICAgICAgbVByb2R1Y2VyVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVByb2R1Y2VyRWdsQ29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbENvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGlmIChtUHJvZHVjZXJFZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgbVByb2R1Y2VyVGhyZWFkLmNsZWFyKCk7CisgICAgICAgIG1GQy5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgcnVuUHJvZHVjZXJUaHJlYWQoY29uc3Qgc3A8UHJvZHVjZXJUaHJlYWQ+IHByb2R1Y2VyVGhyZWFkKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1Qcm9kdWNlclRocmVhZCA9PSBOVUxMKTsKKyAgICAgICAgbVByb2R1Y2VyVGhyZWFkID0gcHJvZHVjZXJUaHJlYWQ7CisgICAgICAgIHByb2R1Y2VyVGhyZWFkLT5zZXRFZ2xPYmplY3RzKG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlLAorICAgICAgICAgICAgICAgIG1Qcm9kdWNlckVnbENvbnRleHQpOworICAgICAgICBwcm9kdWNlclRocmVhZC0+cnVuKCk7CisgICAgfQorCisgICAgRUdMU3VyZmFjZSBtUHJvZHVjZXJFZ2xTdXJmYWNlOworICAgIEVHTENvbnRleHQgbVByb2R1Y2VyRWdsQ29udGV4dDsKKyAgICBzcDxQcm9kdWNlclRocmVhZD4gbVByb2R1Y2VyVGhyZWFkOworICAgIHNwPEZyYW1lQ29uZGl0aW9uPiBtRkM7Cit9OworCisvLyBYWFg6IFRoaXMgdGVzdCBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNhdXNlcyBoYW5ncyBvbiBzb21lIGRldmljZXMuCitURVNUX0YoU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0LCBESVNBQkxFRF9VcGRhdGVUZXhJbWFnZUJlZm9yZUZyYW1lRmluaXNoZWRXb3JrcykgeworICAgIGNsYXNzIFBUIDogcHVibGljIFByb2R1Y2VyVGhyZWFkIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpIHsKKyAgICAgICAgICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICBzd2FwQnVmZmVycygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHJ1blByb2R1Y2VyVGhyZWFkKG5ldyBQVCgpKTsKKworICAgIG1GQy0+d2FpdEZvckZyYW1lKCk7CisgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOworICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKKworICAgIC8vIFRPRE86IEFkZCBmcmFtZSB2ZXJpZmljYXRpb24gb25jZSBSR0IgVEVYX0VYVEVSTkFMX09FUyBpcyBzdXBwb3J0ZWQhCit9CisKKy8vIFhYWDogVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2UgaXQgY2F1c2VzIGhhbmdzIG9uIHNvbWUgZGV2aWNlcy4KK1RFU1RfRihTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3QsIERJU0FCTEVEX1VwZGF0ZVRleEltYWdlQWZ0ZXJGcmFtZUZpbmlzaGVkV29ya3MpIHsKKyAgICBjbGFzcyBQVCA6IHB1YmxpYyBQcm9kdWNlclRocmVhZCB7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoKSB7CisgICAgICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMS4wZiwgMC4wZiwgMS4wZik7CisgICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICAgICAgICAgc3dhcEJ1ZmZlcnMoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7CisKKyAgICBtRkMtPndhaXRGb3JGcmFtZSgpOworICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKKyAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7CisKKyAgICAvLyBUT0RPOiBBZGQgZnJhbWUgdmVyaWZpY2F0aW9uIG9uY2UgUkdCIFRFWF9FWFRFUk5BTF9PRVMgaXMgc3VwcG9ydGVkIQorfQorCisvLyBYWFg6IFRoaXMgdGVzdCBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNhdXNlcyBoYW5ncyBvbiBzb21lIGRldmljZXMuCitURVNUX0YoU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0LCBESVNBQkxFRF9SZXBlYXRlZFVwZGF0ZVRleEltYWdlQmVmb3JlRnJhbWVGaW5pc2hlZFdvcmtzKSB7CisgICAgZW51bSB7IE5VTV9JVEVSQVRJT05TID0gMTAyNCB9OworCisgICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOworICAgICAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICAgICAgTE9HVigiK3N3YXBCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgc3dhcEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgICAgICBMT0dWKCItc3dhcEJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKKyAgICAgICAgTE9HVigiK3VwZGF0ZVRleEltYWdlIik7CisgICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKKyAgICAgICAgTE9HVigiLXVwZGF0ZVRleEltYWdlIik7CisgICAgICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKKworICAgICAgICAvLyBUT0RPOiBBZGQgZnJhbWUgdmVyaWZpY2F0aW9uIG9uY2UgUkdCIFRFWF9FWFRFUk5BTF9PRVMgaXMgc3VwcG9ydGVkIQorICAgIH0KK30KKworLy8gWFhYOiBUaGlzIHRlc3QgaXMgZGlzYWJsZWQgYmVjYXVzZSBpdCBjYXVzZXMgaGFuZ3Mgb24gc29tZSBkZXZpY2VzLgorVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdCwgRElTQUJMRURfUmVwZWF0ZWRVcGRhdGVUZXhJbWFnZUFmdGVyRnJhbWVGaW5pc2hlZFdvcmtzKSB7CisgICAgZW51bSB7IE5VTV9JVEVSQVRJT05TID0gMTAyNCB9OworCisgICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgeworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOworICAgICAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgICAgICAgICAgTE9HVigiK3N3YXBCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgc3dhcEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgICAgICBMT0dWKCItc3dhcEJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKKyAgICAgICAgbUZDLT5maW5pc2hGcmFtZSgpOworICAgICAgICBMT0dWKCIrdXBkYXRlVGV4SW1hZ2UiKTsKKyAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOworICAgICAgICBMT0dWKCItdXBkYXRlVGV4SW1hZ2UiKTsKKworICAgICAgICAvLyBUT0RPOiBBZGQgZnJhbWUgdmVyaWZpY2F0aW9uIG9uY2UgUkdCIFRFWF9FWFRFUk5BTF9PRVMgaXMgc3VwcG9ydGVkIQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0NhY2hlcy5oIGIvbGlicy9od3VpL0NhY2hlcy5oCmluZGV4IDU5Njc4MWUuLmU2NGQ4YWMgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9DYWNoZXMuaAorKysgYi9saWJzL2h3dWkvQ2FjaGVzLmgKQEAgLTc0LDcgKzc0LDcgQEAKIAogc3RydWN0IENhY2hlTG9nZ2VyIHsKICAgICBDYWNoZUxvZ2dlcigpIHsKLSAgICAgICAgTE9HRCgiQ3JlYXRpbmcgT3BlbkdMIHJlbmRlcmVyIGNhY2hlcyIpOworICAgICAgICBJTklUX0xPR0QoIkNyZWF0aW5nIE9wZW5HTCByZW5kZXJlciBjYWNoZXMiKTsKICAgICB9CiB9OyAvLyBzdHJ1Y3QgQ2FjaGVMb2dnZXIKIApkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0Rpc3BsYXlMaXN0UmVuZGVyZXIuY3BwCmluZGV4IGY4NTgyZDguLmFmYWIyNmEgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9EaXNwbGF5TGlzdFJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvRGlzcGxheUxpc3RSZW5kZXJlci5jcHAKQEAgLTExNTEsNiArMTE1MSw3IEBACiAKIHZvaWQgRGlzcGxheUxpc3RSZW5kZXJlcjo6ZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwKICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpIHsKKyAgICBpZiAoY291bnQgPD0gMCkgcmV0dXJuOwogICAgIGFkZE9wKERpc3BsYXlMaXN0OjpEcmF3VGV4dCk7CiAgICAgYWRkVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKICAgICBhZGRJbnQoY291bnQpOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5jcHAgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcAppbmRleCAxY2EwYTE5Li45YmYzZGU4IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfV0lEVEggMTAyNAogI2RlZmluZSBERUZBVUxUX1RFWFRfQ0FDSEVfSEVJR0hUIDI1NgogCisvLyBXZSBzaG91bGQgcXVlcnkgdGhlc2UgdmFsdWVzIGZyb20gdGhlIEdMIGNvbnRleHQKICNkZWZpbmUgTUFYX1RFWFRfQ0FDSEVfV0lEVEggMjA0OAogI2RlZmluZSBNQVhfVEVYVF9DQUNIRV9IRUlHSFQgMjA0OAogCkBAIC01OCw4ICs1OSw3IEBACiAgICAgfQogCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQ2FjaGVkR2x5cGhJbmZvKiBnbHlwaCA9IG1DYWNoZWRHbHlwaHMudmFsdWVBdChpKTsKLSAgICAgICAgZGVsZXRlIGdseXBoOworICAgICAgICBkZWxldGUgbUNhY2hlZEdseXBocy52YWx1ZUF0KGkpOwogICAgIH0KIH0KIApAQCAtMTM0LDQ4ICsxMzQsNDkgQEAKIAogfQogCi1Gb250OjpDYWNoZWRHbHlwaEluZm8qIEZvbnQ6OmdldENhY2hlZFVURkNoYXIoU2tQYWludCogcGFpbnQsIGludDMyX3QgdXRmQ2hhcikgeworRm9udDo6Q2FjaGVkR2x5cGhJbmZvKiBGb250OjpnZXRDYWNoZWRHbHlwaChTa1BhaW50KiBwYWludCwgZ2x5cGhfdCB0ZXh0VW5pdCkgewogICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVkR2x5cGggPSBOVUxMOwotICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGVkR2x5cGhzLmluZGV4T2ZLZXkodXRmQ2hhcik7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZWRHbHlwaHMuaW5kZXhPZktleSh0ZXh0VW5pdCk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgY2FjaGVkR2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaW5kZXgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaChwYWludCwgdXRmQ2hhcik7CisgICAgICAgIGNhY2hlZEdseXBoID0gY2FjaGVHbHlwaChwYWludCwgdGV4dFVuaXQpOwogICAgIH0KIAogICAgIC8vIElzIHRoZSBnbHlwaCBzdGlsbCBpbiB0ZXh0dXJlIGNhY2hlPwogICAgIGlmICghY2FjaGVkR2x5cGgtPm1Jc1ZhbGlkKSB7Ci0gICAgICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyh1dGZDaGFyKTsKKyAgICAgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gR0VUX01FVFJJQ1MocGFpbnQsIHRleHRVbml0KTsKICAgICAgICAgdXBkYXRlR2x5cGhDYWNoZShwYWludCwgc2tpYUdseXBoLCBjYWNoZWRHbHlwaCk7CiAgICAgfQogCiAgICAgcmV0dXJuIGNhY2hlZEdseXBoOwogfQogCi12b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKK3ZvaWQgRm9udDo6cmVuZGVyKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAogICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCkgewogICAgIGlmIChiaXRtYXAgIT0gTlVMTCAmJiBiaXRtYXBXID4gMCAmJiBiaXRtYXBIID4gMCkgewotICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgQklUTUFQLCBiaXRtYXAsCisgICAgICAgIHJlbmRlcihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCB4LCB5LCBCSVRNQVAsIGJpdG1hcCwKICAgICAgICAgICAgICAgICBiaXRtYXBXLCBiaXRtYXBILCBOVUxMKTsKICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXJVVEYocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgRlJBTUVCVUZGRVIsIE5VTEwsIDAsIDAsIE5VTEwpOworICAgICAgICByZW5kZXIocGFpbnQsIHRleHQsIHN0YXJ0LCBsZW4sIG51bUdseXBocywgeCwgeSwgRlJBTUVCVUZGRVIsIE5VTEwsCisgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCk7CiAgICAgfQogCiB9CiAKLXZvaWQgRm9udDo6bWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKK3ZvaWQgRm9udDo6bWVhc3VyZShTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKICAgICAgICAgaW50IG51bUdseXBocywgUmVjdCAqYm91bmRzKSB7CiAgICAgaWYgKGJvdW5kcyA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoIk5vIHJldHVybiByZWN0YW5nbGUgcHJvdmlkZWQgdG8gbWVhc3VyZSB0ZXh0Iik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgYm91bmRzLT5zZXQoMWU2LCAtMWU2LCAtMWU2LCAxZTYpOwotICAgIHJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOworICAgIHJlbmRlcihwYWludCwgdGV4dCwgc3RhcnQsIGxlbiwgbnVtR2x5cGhzLCAwLCAwLCBNRUFTVVJFLCBOVUxMLCAwLCAwLCBib3VuZHMpOwogfQogCiAjZGVmaW5lIFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2LCBuZXh0KSAoKChuZXh0KSAtIChwcmV2KSArIDMyKSA+PiA2IDw8IDE2KQogCi12b2lkIEZvbnQ6OnJlbmRlclVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKK3ZvaWQgRm9udDo6cmVuZGVyKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyKiB0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAogICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwgdWludDhfdCAqYml0bWFwLAogICAgICAgICB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBILFJlY3QgKmJvdW5kcykgewogICAgIGlmIChudW1HbHlwaHMgPT0gMCB8fCB0ZXh0ID09IE5VTEwgfHwgbGVuID09IDApIHsKQEAgLTE5NSwxNCArMTk2LDE0IEBACiAgICAgdGV4dCArPSBzdGFydDsKIAogICAgIHdoaWxlIChnbHlwaHNMZWZ0ID4gMCkgewotICAgICAgICBpbnQzMl90IHV0ZkNoYXIgPSBTa1VURjE2X05leHRVbmljaGFyKChjb25zdCB1aW50MTZfdCoqKSAmdGV4dCk7CisgICAgICAgIGdseXBoX3QgZ2x5cGggPSBHRVRfR0xZUEgodGV4dCk7CiAKICAgICAgICAgLy8gUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKLSAgICAgICAgaWYgKHV0ZkNoYXIgPCAwKSB7CisgICAgICAgIGlmIChJU19FTkRfT0ZfU1RSSU5HKGdseXBoKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBDYWNoZWRHbHlwaEluZm8qIGNhY2hlZEdseXBoID0gZ2V0Q2FjaGVkVVRGQ2hhcihwYWludCwgdXRmQ2hhcik7CisgICAgICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVkR2x5cGggPSBnZXRDYWNoZWRHbHlwaChwYWludCwgZ2x5cGgpOwogICAgICAgICBwZW5YICs9IFNrQXV0b0tlcm5fQWRqdXN0RihwcmV2UnNiRGVsdGEsIGNhY2hlZEdseXBoLT5tTHNiRGVsdGEpOwogICAgICAgICBwcmV2UnNiRGVsdGEgPSBjYWNoZWRHbHlwaC0+bVJzYkRlbHRhOwogCkBAIC0yNjgsMTEgKzI2OSwxMSBAQAogICAgIG1TdGF0ZS0+bVVwbG9hZFRleHR1cmUgPSB0cnVlOwogfQogCi1Gb250OjpDYWNoZWRHbHlwaEluZm8qIEZvbnQ6OmNhY2hlR2x5cGgoU2tQYWludCogcGFpbnQsIGludDMyX3QgZ2x5cGgpIHsKK0ZvbnQ6OkNhY2hlZEdseXBoSW5mbyogRm9udDo6Y2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgZ2x5cGhfdCBnbHlwaCkgewogICAgIENhY2hlZEdseXBoSW5mbyogbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CiAgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKIAotICAgIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCA9IHBhaW50LT5nZXRVbmljaGFyTWV0cmljcyhnbHlwaCk7CisgICAgY29uc3QgU2tHbHlwaCYgc2tpYUdseXBoID0gR0VUX01FVFJJQ1MocGFpbnQsIGdseXBoKTsKICAgICBuZXdHbHlwaC0+bUdseXBoSW5kZXggPSBza2lhR2x5cGguZklEOwogICAgIG5ld0dseXBoLT5tSXNWYWxpZCA9IGZhbHNlOwogCkBAIC02NzIsNyArNjczLDcgQEAKICAgICB1aW50MzJfdCByZW1haW5pbmdDYXBhY2l0eSA9IGdldFJlbWFpbmluZ0NhY2hlQ2FwYWNpdHkoKTsKICAgICB1aW50MzJfdCBwcmVjYWNoZUlkeCA9IDA7CiAgICAgd2hpbGUgKHJlbWFpbmluZ0NhcGFjaXR5ID4gMjUgJiYgcHJlY2FjaGVJZHggPCBtTGF0aW5QcmVjYWNoZS5zaXplKCkpIHsKLSAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRVVEZDaGFyKHBhaW50LCAoaW50MzJfdCkgbUxhdGluUHJlY2FjaGVbcHJlY2FjaGVJZHhdKTsKKyAgICAgICAgbUN1cnJlbnRGb250LT5nZXRDYWNoZWRHbHlwaChwYWludCwgKGludDMyX3QpIG1MYXRpblByZWNhY2hlW3ByZWNhY2hlSWR4XSk7CiAgICAgICAgIHJlbWFpbmluZ0NhcGFjaXR5ID0gZ2V0UmVtYWluaW5nQ2FjaGVDYXBhY2l0eSgpOwogICAgICAgICBwcmVjYWNoZUlkeCArKzsKICAgICB9CkBAIC03MTQsNyArNzE1LDcgQEAKICAgICB9CiAKICAgICBSZWN0IGJvdW5kczsKLSAgICBtQ3VycmVudEZvbnQtPm1lYXN1cmVVVEYocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCAmYm91bmRzKTsKKyAgICBtQ3VycmVudEZvbnQtPm1lYXN1cmUocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCAmYm91bmRzKTsKICAgICB1aW50MzJfdCBwYWRkZWRXaWR0aCA9ICh1aW50MzJfdCkgKGJvdW5kcy5yaWdodCAtIGJvdW5kcy5sZWZ0KSArIDIgKiByYWRpdXM7CiAgICAgdWludDMyX3QgcGFkZGVkSGVpZ2h0ID0gKHVpbnQzMl90KSAoYm91bmRzLnRvcCAtIGJvdW5kcy5ib3R0b20pICsgMiAqIHJhZGl1czsKICAgICB1aW50OF90KiBkYXRhQnVmZmVyID0gbmV3IHVpbnQ4X3RbcGFkZGVkV2lkdGggKiBwYWRkZWRIZWlnaHRdOwpAQCAtNzI1LDcgKzcyNiw3IEBACiAgICAgaW50IHBlblggPSByYWRpdXMgLSBib3VuZHMubGVmdDsKICAgICBpbnQgcGVuWSA9IHJhZGl1cyAtIGJvdW5kcy5ib3R0b207CiAKLSAgICBtQ3VycmVudEZvbnQtPnJlbmRlclVURihwYWludCwgdGV4dCwgc3RhcnRJbmRleCwgbGVuLCBudW1HbHlwaHMsIHBlblgsIHBlblksCisgICAgbUN1cnJlbnRGb250LT5yZW5kZXIocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCBwZW5YLCBwZW5ZLAogICAgICAgICAgICAgZGF0YUJ1ZmZlciwgcGFkZGVkV2lkdGgsIHBhZGRlZEhlaWdodCk7CiAgICAgYmx1ckltYWdlKGRhdGFCdWZmZXIsIHBhZGRlZFdpZHRoLCBwYWRkZWRIZWlnaHQsIHJhZGl1cyk7CiAKQEAgLTc1NSw3ICs3NTYsNyBAQAogICAgIG1EcmF3biA9IGZhbHNlOwogICAgIG1Cb3VuZHMgPSBib3VuZHM7CiAgICAgbUNsaXAgPSBjbGlwOwotICAgIG1DdXJyZW50Rm9udC0+cmVuZGVyVVRGKHBhaW50LCB0ZXh0LCBzdGFydEluZGV4LCBsZW4sIG51bUdseXBocywgeCwgeSk7CisgICAgbUN1cnJlbnRGb250LT5yZW5kZXIocGFpbnQsIHRleHQsIHN0YXJ0SW5kZXgsIGxlbiwgbnVtR2x5cGhzLCB4LCB5KTsKICAgICBtQm91bmRzID0gTlVMTDsKIAogICAgIGlmIChtQ3VycmVudFF1YWRJbmRleCAhPSAwKSB7CmRpZmYgLS1naXQgYS9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmggYi9saWJzL2h3dWkvRm9udFJlbmRlcmVyLmgKaW5kZXggOTVmNzE0Zi4uMjRlZDZmYSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL0ZvbnRSZW5kZXJlci5oCisrKyBiL2xpYnMvaHd1aS9Gb250UmVuZGVyZXIuaApAQCAtMzMsOCArMzMsMzIgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB1aXJlbmRlcmVyIHsKIAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGVmaW5lcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaWYgUkVOREVSX1RFWFRfQVNfR0xZUEhTCisgICAgdHlwZWRlZiB1aW50MTZfdCBnbHlwaF90OworICAgICNkZWZpbmUgR0VUX01FVFJJQ1MocGFpbnQsIGdseXBoKSBwYWludC0+Z2V0R2x5cGhNZXRyaWNzKGdseXBoKQorICAgICNkZWZpbmUgR0VUX0dMWVBIKHRleHQpIG5leHRHbHlwaCgoY29uc3QgdWludDE2X3QqKikgJnRleHQpCisgICAgI2RlZmluZSBJU19FTkRfT0ZfU1RSSU5HKGdseXBoKSBmYWxzZQorI2Vsc2UKKyAgICB0eXBlZGVmIFNrVW5pY2hhciBnbHlwaF90OworICAgICNkZWZpbmUgR0VUX01FVFJJQ1MocGFpbnQsIGdseXBoKSBwYWludC0+Z2V0VW5pY2hhck1ldHJpY3MoZ2x5cGgpCisgICAgI2RlZmluZSBHRVRfR0xZUEgodGV4dCkgU2tVVEYxNl9OZXh0VW5pY2hhcigoY29uc3QgdWludDE2X3QqKikgJnRleHQpCisgICAgI2RlZmluZSBJU19FTkRfT0ZfU1RSSU5HKGdseXBoKSBnbHlwaCA8IDAKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEZWNsYXJhdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwogY2xhc3MgRm9udFJlbmRlcmVyOwogCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBGb250CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKIC8qKgogICogUmVwcmVzZW50cyBhIGZvbnQsIGRlZmluZWQgYnkgYSBTa2lhIGZvbnQgaWQgYW5kIGEgZm9udCBzaXplLiBBIGZvbnQgaXMgdXNlZAogICogdG8gZ2VuZXJhdGUgZ2x5cGhzIGFuZCBjYWNoZSB0aGVtIGluIHRoZSBGb250U3RhdGUuCkBAIC01MSw5ICs3NSw5IEBACiAgICAgICogUmVuZGVycyB0aGUgc3BlY2lmaWVkIHN0cmluZyBvZiB0ZXh0LgogICAgICAqIElmIGJpdG1hcCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcmVuZGVyIHRhcmdldAogICAgICAqLwotICAgIHZvaWQgcmVuZGVyVVRGKFNrUGFpbnQqIHBhaW50LCBjb25zdCBjaGFyICp0ZXh0LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgaW50IG51bUdseXBocywgaW50IHgsIGludCB5LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0bWFwID0gTlVMTCwgdWludDMyX3QgYml0bWFwVyA9IDAsIHVpbnQzMl90IGJpdG1hcEggPSAwKTsKKyAgICB2b2lkIHJlbmRlcihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgIGludCBudW1HbHlwaHMsIGludCB4LCBpbnQgeSwgdWludDhfdCAqYml0bWFwID0gTlVMTCwKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdG1hcFcgPSAwLCB1aW50MzJfdCBiaXRtYXBIID0gMCk7CiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBmb250IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGZvbnQgc3RhdGUuCiAgICAgICovCkBAIC02OSwxMyArOTMsMTIgQEAKICAgICAgICAgTUVBU1VSRSwKICAgICB9OwogCi0gICAgdm9pZCByZW5kZXJVVEYoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdG1hcCwgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwKLSAgICAgICAgICAgICAgICAgICAgIFJlY3QgKmJvdW5kcyk7CisgICAgdm9pZCByZW5kZXIoU2tQYWludCogcGFpbnQsIGNvbnN0IGNoYXIgKnRleHQsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBpbnQgeCwgaW50IHksIFJlbmRlck1vZGUgbW9kZSwgdWludDhfdCAqYml0bWFwLAorICAgICAgICAgICAgdWludDMyX3QgYml0bWFwVywgdWludDMyX3QgYml0bWFwSCwgUmVjdCAqYm91bmRzKTsKIAotICAgIHZvaWQgbWVhc3VyZVVURihTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtR2x5cGhzLCBSZWN0ICpib3VuZHMpOworICAgIHZvaWQgbWVhc3VyZShTa1BhaW50KiBwYWludCwgY29uc3QgY2hhciogdGV4dCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgIGludCBudW1HbHlwaHMsIFJlY3QgKmJvdW5kcyk7CiAKICAgICBzdHJ1Y3QgQ2FjaGVkR2x5cGhJbmZvIHsKICAgICAgICAgLy8gSGFzIHRoZSBjYWNoZSBiZWVuIGludmFsaWRhdGVkPwpAQCAtMTA3LDE4ICsxMzAsMjYgQEAKICAgICBGb250KEZvbnRSZW5kZXJlciogc3RhdGUsIHVpbnQzMl90IGZvbnRJZCwgZmxvYXQgZm9udFNpemUsIGludCBmbGFncywgdWludDMyX3QgaXRhbGljU3R5bGUsCiAgICAgICAgICAgICB1aW50MzJfdCBzY2FsZVgpOwogCi0gICAgRGVmYXVsdEtleWVkVmVjdG9yPGludDMyX3QsIENhY2hlZEdseXBoSW5mbyo+IG1DYWNoZWRHbHlwaHM7CisgICAgLy8gQ2FjaGUgb2YgZ2x5cGhzCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPGdseXBoX3QsIENhY2hlZEdseXBoSW5mbyo+IG1DYWNoZWRHbHlwaHM7CiAKICAgICB2b2lkIGludmFsaWRhdGVUZXh0dXJlQ2FjaGUoKTsKIAotICAgIENhY2hlZEdseXBoSW5mbyogY2FjaGVHbHlwaChTa1BhaW50KiBwYWludCwgaW50MzJfdCBnbHlwaCk7CisgICAgQ2FjaGVkR2x5cGhJbmZvKiBjYWNoZUdseXBoKFNrUGFpbnQqIHBhaW50LCBnbHlwaF90IGdseXBoKTsKICAgICB2b2lkIHVwZGF0ZUdseXBoQ2FjaGUoU2tQYWludCogcGFpbnQsIGNvbnN0IFNrR2x5cGgmIHNraWFHbHlwaCwgQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCk7CiAgICAgdm9pZCBtZWFzdXJlQ2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LCBSZWN0ICpib3VuZHMpOwogICAgIHZvaWQgZHJhd0NhY2hlZEdseXBoKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgsIGludCB4LCBpbnQgeSk7CiAgICAgdm9pZCBkcmF3Q2FjaGVkR2x5cGgoQ2FjaGVkR2x5cGhJbmZvICpnbHlwaCwgaW50IHgsIGludCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRtYXAsIHVpbnQzMl90IGJpdG1hcFcsIHVpbnQzMl90IGJpdG1hcEgpOworICAgICAgICAgICAgdWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBiaXRtYXBXLCB1aW50MzJfdCBiaXRtYXBIKTsKIAotICAgIENhY2hlZEdseXBoSW5mbyogZ2V0Q2FjaGVkVVRGQ2hhcihTa1BhaW50KiBwYWludCwgaW50MzJfdCB1dGZDaGFyKTsKKyAgICBDYWNoZWRHbHlwaEluZm8qIGdldENhY2hlZEdseXBoKFNrUGFpbnQqIHBhaW50LCBnbHlwaF90IHRleHRVbml0KTsKKworICAgIHN0YXRpYyBnbHlwaF90IG5leHRHbHlwaChjb25zdCB1aW50MTZfdCoqIHNyY1B0cikgeworICAgICAgICBjb25zdCB1aW50MTZfdCogc3JjID0gKnNyY1B0cjsKKyAgICAgICAgZ2x5cGhfdCBnID0gKnNyYysrOworICAgICAgICAqc3JjUHRyID0gc3JjOworICAgICAgICByZXR1cm4gZzsKKyAgICB9CiAKICAgICBGb250UmVuZGVyZXIqIG1TdGF0ZTsKICAgICB1aW50MzJfdCBtRm9udElkOwpAQCAtMTI4LDYgKzE1OSwxMCBAQAogICAgIHVpbnQzMl90IG1TY2FsZVg7CiB9OwogCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBSZW5kZXJlcgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiBjbGFzcyBGb250UmVuZGVyZXIgewogcHVibGljOgogICAgIEZvbnRSZW5kZXJlcigpOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL0xheWVyUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL0xheWVyUmVuZGVyZXIuY3BwCmluZGV4IGYzMTZiYTcuLjc3ZTYzZDcgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9MYXllclJlbmRlcmVyLmNwcAorKysgYi9saWJzL2h3dWkvTGF5ZXJSZW5kZXJlci5jcHAKQEAgLTMxNSw1ICszMTUsMTE3IEBACiAgICAgfQogfQogCitib29sIExheWVyUmVuZGVyZXI6OmNvcHlMYXllcihMYXllciogbGF5ZXIsIFNrQml0bWFwKiBiaXRtYXApIHsKKyAgICBDYWNoZXMmIGNhY2hlcyA9IENhY2hlczo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAobGF5ZXIgJiYgbGF5ZXItPmlzVGV4dHVyZUxheWVyICYmIGJpdG1hcC0+d2lkdGgoKSA8PSBjYWNoZXMubWF4VGV4dHVyZVNpemUgJiYKKyAgICAgICAgICAgIGJpdG1hcC0+aGVpZ2h0KCkgPD0gY2FjaGVzLm1heFRleHR1cmVTaXplKSB7CisKKyAgICAgICAgR0x1aW50IGZibyA9IGNhY2hlcy5mYm9DYWNoZS5nZXQoKTsKKyAgICAgICAgaWYgKCFmYm8pIHsKKyAgICAgICAgICAgIExPR1coIkNvdWxkIG5vdCBvYnRhaW4gYW4gRkJPIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTa0F1dG9Mb2NrUGl4ZWxzIGFscCgqYml0bWFwKTsKKworICAgICAgICBHTHVpbnQgdGV4dHVyZTsKKyAgICAgICAgR0x1aW50IHByZXZpb3VzRmJvOworCisgICAgICAgIEdMZW51bSBmb3JtYXQ7CisgICAgICAgIEdMZW51bSB0eXBlOworCisgICAgICAgIEdMZW51bSBlcnJvciA9IEdMX05PX0VSUk9SOworICAgICAgICBib29sIHN0YXR1cyA9IGZhbHNlOworCisgICAgICAgIHN3aXRjaCAoYml0bWFwLT5jb25maWcoKSkgeworICAgICAgICAgICAgY2FzZSBTa0JpdG1hcDo6a0E4X0NvbmZpZzoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBHTF9BTFBIQTsKKyAgICAgICAgICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtSR0JfNTY1X0NvbmZpZzoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBHTF9SR0I7CisgICAgICAgICAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTa0JpdG1hcDo6a0FSR0JfNDQ0NF9Db25maWc6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAgICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBHTF9SR0JBOworICAgICAgICAgICAgICAgIHR5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgYWxwaGEgPSBsYXllci0+YWxwaGE7CisgICAgICAgIFNrWGZlcm1vZGU6Ok1vZGUgbW9kZSA9IGxheWVyLT5tb2RlOworCisgICAgICAgIGxheWVyLT5tb2RlID0gU2tYZmVybW9kZTo6a1NyY19Nb2RlOworICAgICAgICBsYXllci0+YWxwaGEgPSAyNTU7CisgICAgICAgIGxheWVyLT5mYm8gPSBmYm87CisKKyAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9GUkFNRUJVRkZFUl9CSU5ESU5HLCAoR0xpbnQqKSAmcHJldmlvdXNGYm8pOworICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgZmJvKTsKKworICAgICAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKKyAgICAgICAgaWYgKChlcnJvciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKKworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworCisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGZvcm1hdCwgYml0bWFwLT53aWR0aCgpLCBiaXRtYXAtPmhlaWdodCgpLAorICAgICAgICAgICAgICAgIDAsIGZvcm1hdCwgdHlwZSwgTlVMTCk7CisgICAgICAgIGlmICgoZXJyb3IgPSBnbEdldEVycm9yKCkpICE9IEdMX05PX0VSUk9SKSBnb3RvIGVycm9yOworCisgICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLAorICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsIHRleHR1cmUsIDApOworICAgICAgICBpZiAoKGVycm9yID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgZ290byBlcnJvcjsKKworICAgICAgICB7CisgICAgICAgICAgICBMYXllclJlbmRlcmVyIHJlbmRlcmVyKGxheWVyKTsKKyAgICAgICAgICAgIHJlbmRlcmVyLnNldFZpZXdwb3J0KGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSk7CisgICAgICAgICAgICByZW5kZXJlci5PcGVuR0xSZW5kZXJlcjo6cHJlcGFyZURpcnR5KDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSwgIWxheWVyLT5ibGVuZCk7CisgICAgICAgICAgICBpZiAoKGVycm9yID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgZ290byBlcnJvcjsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJlY3QgYm91bmRzOworICAgICAgICAgICAgICAgIGJvdW5kcy5zZXQoMC4wZiwgMC4wZiwgYml0bWFwLT53aWR0aCgpLCBiaXRtYXAtPmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICByZW5kZXJlci5kcmF3VGV4dHVyZUxheWVyKGxheWVyLCBib3VuZHMpOworCisgICAgICAgICAgICAgICAgZ2xSZWFkUGl4ZWxzKDAsIDAsIGJpdG1hcC0+d2lkdGgoKSwgYml0bWFwLT5oZWlnaHQoKSwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgYml0bWFwLT5nZXRQaXhlbHMoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGVycm9yID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgfQorCitlcnJvcjoKKyNpZiBERUJVR19PUEVOR0wKKyAgICAgICAgaWYgKGVycm9yICE9IEdMX05PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dEKCJHTCBlcnJvciB3aGlsZSBjb3B5aW5nIGxheWVyIGludG8gYml0bWFwID0gMHgleCIsIGVycm9yKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIHByZXZpb3VzRmJvKTsKKyAgICAgICAgbGF5ZXItPm1vZGUgPSBtb2RlOworICAgICAgICBsYXllci0+YWxwaGEgPSBhbHBoYTsKKyAgICAgICAgbGF5ZXItPmZibyA9IDA7CisgICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUpOworICAgICAgICBjYWNoZXMuZmJvQ2FjaGUucHV0KGZibyk7CisKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB9OyAvLyBuYW1lc3BhY2UgdWlyZW5kZXJlcgogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9MYXllclJlbmRlcmVyLmggYi9saWJzL2h3dWkvTGF5ZXJSZW5kZXJlci5oCmluZGV4IDU5Y2FiOTYuLjc5N2RmYzYgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9MYXllclJlbmRlcmVyLmgKKysrIGIvbGlicy9od3VpL0xheWVyUmVuZGVyZXIuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgIk9wZW5HTFJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiTGF5ZXIuaCIKIAorI2luY2x1ZGUgPFNrQml0bWFwLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB1aXJlbmRlcmVyIHsKIApAQCAtNjAsNiArNjIsNyBAQAogICAgICAgICAgICAgR0xlbnVtIHJlbmRlclRhcmdldCwgZmxvYXQqIHRyYW5zZm9ybSk7CiAgICAgc3RhdGljIHZvaWQgZGVzdHJveUxheWVyKExheWVyKiBsYXllcik7CiAgICAgc3RhdGljIHZvaWQgZGVzdHJveUxheWVyRGVmZXJyZWQoTGF5ZXIqIGxheWVyKTsKKyAgICBzdGF0aWMgYm9vbCBjb3B5TGF5ZXIoTGF5ZXIqIGxheWVyLCBTa0JpdG1hcCogYml0bWFwKTsKIAogcHJpdmF0ZToKICAgICB2b2lkIGdlbmVyYXRlTWVzaCgpOwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL01hdHJpeC5jcHAgYi9saWJzL2h3dWkvTWF0cml4LmNwcAppbmRleCBlN2MwZmUzLi45ZmM1MTMxIDEwMDY0NAotLS0gYS9saWJzL2h3dWkvTWF0cml4LmNwcAorKysgYi9saWJzL2h3dWkvTWF0cml4LmNwcApAQCAtNjcsNiArNjcsMTAgQEAKICAgICAgICAgICAgIEFMTU9TVF9FUVVBTChkYXRhW2tTY2FsZVhdLCAxLjBmKSAmJiBBTE1PU1RfRVFVQUwoZGF0YVtrU2NhbGVZXSwgMS4wZik7CiB9CiAKK2Jvb2wgTWF0cml4NDo6aXNTaW1wbGUoKSB7CisgICAgcmV0dXJuIG1TaW1wbGVNYXRyaXg7Cit9CisKIHZvaWQgTWF0cml4NDo6bG9hZChjb25zdCBmbG9hdCogdikgewogICAgIG1lbWNweShkYXRhLCB2LCBzaXplb2YoZGF0YSkpOwogICAgIG1TaW1wbGVNYXRyaXggPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9NYXRyaXguaCBiL2xpYnMvaHd1aS9NYXRyaXguaAppbmRleCAwOGY1ZDc3Li4yZmE2YWI3IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvTWF0cml4LmgKKysrIGIvbGlicy9od3VpL01hdHJpeC5oCkBAIC0xMTEsNiArMTExLDcgQEAKICAgICB9CiAKICAgICBib29sIGlzUHVyZVRyYW5zbGF0ZSgpOworICAgIGJvb2wgaXNTaW1wbGUoKTsKIAogICAgIGJvb2wgY2hhbmdlc0JvdW5kcygpOwogCmRpZmYgLS1naXQgYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmNwcAppbmRleCA2MjQzYjAxLi44ODc3NGM2IDEwMDY0NAotLS0gYS9saWJzL2h3dWkvT3BlbkdMUmVuZGVyZXIuY3BwCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5jcHAKQEAgLTE1MSw3ICsxNTEsNiBAQAogICAgIG1TYXZlQ291bnQgPSAxOwogCiAgICAgZ2xWaWV3cG9ydCgwLCAwLCBtV2lkdGgsIG1IZWlnaHQpOwotCiAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CiAKICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwpAQCAtNDc2LDEzICs0NzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3QtPmhlaWdodCAtIGJvdW5kcy5ib3R0b20sIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBDbGVhciB0aGUgZnJhbWVidWZmZXIgd2hlcmUgdGhlIGxheWVyIHdpbGwgZHJhdwotICAgICAgICAgICAgZ2xTY2lzc29yKGJvdW5kcy5sZWZ0LCBtU25hcHNob3QtPmhlaWdodCAtIGJvdW5kcy5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgICAgICAgICAgZGlydHlDbGlwKCk7CisgICAgICAgICAgICAvLyBFbnF1ZXVlIHRoZSBidWZmZXIgY29vcmRpbmF0ZXMgdG8gY2xlYXIgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaW9uIGxhdGVyCisgICAgICAgICAgICBtTGF5ZXJzLnB1c2gobmV3IFJlY3QoYm91bmRzKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTgxNyw2ICs4MTEsNTggQEAKICNlbmRpZgogfQogCit2b2lkIE9wZW5HTFJlbmRlcmVyOjpjbGVhckxheWVyUmVnaW9ucygpIHsKKyAgICBjb25zdCBzaXplX3QgY291bnQgPSBtTGF5ZXJzLnNpemUoKTsKKyAgICBpZiAoY291bnQgPT0gMCkgcmV0dXJuOworCisgICAgaWYgKCFtU25hcHNob3QtPmlzSWdub3JlZCgpKSB7CisgICAgICAgIC8vIERvaW5nIHNldmVyYWwgZ2xTY2lzc29yL2dsQ2xlYXIgaGVyZSBjYW4gbmVnYXRpdmVseSBpbXBhY3QKKyAgICAgICAgLy8gR1BVcyB3aXRoIGEgdGlsZXIgYXJjaGl0ZWN0dXJlLCBpbnN0ZWFkIHdlIGRyYXcgcXVhZHMgd2l0aAorICAgICAgICAvLyB0aGUgQ2xlYXIgYmxlbmRpbmcgbW9kZQorCisgICAgICAgIC8vIFRoZSBsaXN0IGNvbnRhaW5zIGJvdW5kcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGNsaXBwZWQKKyAgICAgICAgLy8gYWdhaW5zdCB0aGVpciBpbml0aWFsIGNsaXAgcmVjdCwgYW5kIHRoZSBjdXJyZW50IGNsaXAKKyAgICAgICAgLy8gaXMgbGlrZWx5IGRpZmZlcmVudCBzbyB3ZSBuZWVkIHRvIGRpc2FibGUgY2xpcHBpbmcgaGVyZQorICAgICAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKKworICAgICAgICBWZXJ0ZXggbWVzaFtjb3VudCAqIDZdOworICAgICAgICBWZXJ0ZXgqIHZlcnRleCA9IG1lc2g7CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFJlY3QqIGJvdW5kcyA9IG1MYXllcnMuaXRlbUF0KGkpOworCisgICAgICAgICAgICBWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgYm91bmRzLT5sZWZ0LCBib3VuZHMtPmJvdHRvbSk7CisgICAgICAgICAgICBWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgYm91bmRzLT5sZWZ0LCBib3VuZHMtPnRvcCk7CisgICAgICAgICAgICBWZXJ0ZXg6OnNldCh2ZXJ0ZXgrKywgYm91bmRzLT5yaWdodCwgYm91bmRzLT50b3ApOworICAgICAgICAgICAgVmVydGV4OjpzZXQodmVydGV4KyssIGJvdW5kcy0+bGVmdCwgYm91bmRzLT5ib3R0b20pOworICAgICAgICAgICAgVmVydGV4OjpzZXQodmVydGV4KyssIGJvdW5kcy0+cmlnaHQsIGJvdW5kcy0+dG9wKTsKKyAgICAgICAgICAgIFZlcnRleDo6c2V0KHZlcnRleCsrLCBib3VuZHMtPnJpZ2h0LCBib3VuZHMtPmJvdHRvbSk7CisKKyAgICAgICAgICAgIGRlbGV0ZSBib3VuZHM7CisgICAgICAgIH0KKworICAgICAgICBzZXR1cERyYXcoZmFsc2UpOworICAgICAgICBzZXR1cERyYXdDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKTsKKyAgICAgICAgc2V0dXBEcmF3QmxlbmRpbmcodHJ1ZSwgU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpOworICAgICAgICBzZXR1cERyYXdQcm9ncmFtKCk7CisgICAgICAgIHNldHVwRHJhd1B1cmVDb2xvclVuaWZvcm1zKCk7CisgICAgICAgIHNldHVwRHJhd01vZGVsVmlld1RyYW5zbGF0ZSgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCB0cnVlKTsKKworICAgICAgICBtQ2FjaGVzLnVuYmluZE1lc2hCdWZmZXIoKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1DYWNoZXMuY3VycmVudFByb2dyYW0tPnBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgZ1ZlcnRleFN0cmlkZSwgJm1lc2hbMF0ucG9zaXRpb25bMF0pOworICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBjb3VudCAqIDYpOworCisgICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtTGF5ZXJzLml0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1MYXllcnMuY2xlYXIoKTsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gVHJhbnNmb3JtcwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtOTAxLDcgKzk0Nyw4IEBACiAvLyBEcmF3aW5nIGNvbW1hbmRzCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwRHJhdygpIHsKK3ZvaWQgT3BlbkdMUmVuZGVyZXI6OnNldHVwRHJhdyhib29sIGNsZWFyKSB7CisgICAgaWYgKGNsZWFyKSBjbGVhckxheWVyUmVnaW9ucygpOwogICAgIGlmIChtRGlydHlDbGlwKSB7CiAgICAgICAgIHNldFNjaXNzb3JGcm9tQ2xpcCgpOwogICAgIH0KQEAgLTk5NCw3ICsxMDQxLDcgQEAKICAgICBpZiAobUNvbG9yU2V0ICYmIG1vZGUgPT0gU2tYZmVybW9kZTo6a0NsZWFyX01vZGUpIHsKICAgICAgICAgbUNvbG9yQSA9IDEuMGY7CiAgICAgICAgIG1Db2xvclIgPSBtQ29sb3JHID0gbUNvbG9yQiA9IDAuMGY7Ci0gICAgICAgIG1TZXRTaGFkZXJDb2xvciA9IG1EZXNjcmlwdGlvbi5zZXRBbHBoYThDb2xvcihtQ29sb3JSLCBtQ29sb3JHLCBtQ29sb3JCLCBtQ29sb3JBKTsKKyAgICAgICAgbVNldFNoYWRlckNvbG9yID0gbURlc2NyaXB0aW9uLm1vZHVsYXRlID0gdHJ1ZTsKICAgICB9CiB9CiAKQEAgLTE0NzgsOCArMTUyNSw3IEBACiAgKiB3aXRoaW4gdGhhdCBib3VuZGFyeSByZWdpb24gYW5kIGhvdyBmYXIgaW50byB0aGUgcmVnaW9uIGl0IGlzLgogICovCiB2b2lkIE9wZW5HTFJlbmRlcmVyOjpkcmF3QUFSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKLSAgICAgICAgaW50IGNvbG9yLCBTa1hmZXJtb2RlOjpNb2RlIG1vZGUpCi17CisgICAgICAgIGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKSB7CiAgICAgZmxvYXQgaW52ZXJzZVNjYWxlWCA9IDEuMGY7CiAgICAgZmxvYXQgaW52ZXJzZVNjYWxlWSA9IDEuMGY7CiAgICAgLy8gVGhlIHF1YWQgdGhhdCB3ZSB1c2UgbmVlZHMgdG8gYWNjb3VudCBmb3Igc2NhbGluZy4KQEAgLTE5MzUsNyArMTk4MSw3IEBACiAgICAgfQogCiAgICAgaW50IGNvbG9yID0gcC0+Z2V0Q29sb3IoKTsKLSAgICBpZiAocC0+aXNBbnRpQWxpYXMoKSkgeworICAgIGlmIChwLT5pc0FudGlBbGlhcygpICYmICFtU25hcHNob3QtPnRyYW5zZm9ybS0+aXNTaW1wbGUoKSkgewogICAgICAgICBkcmF3QUFSZWN0KGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgY29sb3IsIG1vZGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRyYXdDb2xvclJlY3QobGVmdCwgdG9wLCByaWdodCwgYm90dG9tLCBjb2xvciwgbW9kZSk7CkBAIC0xOTQ5LDcgKzE5OTUsMTYgQEAKICAgICB9CiAgICAgaWYgKG1TbmFwc2hvdC0+aXNJZ25vcmVkKCkpIHJldHVybjsKIAorICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBtYWtlIGEgY29weSBvZiB0aGUgcGFpbnQgaW5zdGVhZCBvZiBtb2RpZnlpbmcKKyAgICAvLyAgICAgICBpdDsgbW9kaWZ5aW5nIHRoZSBwYWludCB3aWxsIGNoYW5nZSBpdHMgZ2VuZXJhdGlvbklEIHRoZSBmaXJzdAorICAgIC8vICAgICAgIHRpbWUsIHdoaWNoIG1pZ2h0IGltcGFjdCBjYWNoZXMuIE1vcmUgaW52ZXN0aWdhdGlvbiBuZWVkZWQgdG8KKyAgICAvLyAgICAgICBzZWUgaWYgaXQgbWF0dGVycy4KKyAgICAvLyAgICAgICBJZiB3ZSBtYWtlIGEgY29weSwgdGhlbiBkcmF3VGV4dERlY29yYXRpb25zKCkgc2hvdWxkICpub3QqIG1ha2UKKyAgICAvLyAgICAgICBpdHMgb3duIGNvcHkgYXMgaXQgZG9lcyByaWdodCBub3cuCiAgICAgcGFpbnQtPnNldEFudGlBbGlhcyh0cnVlKTsKKyNpZiBSRU5ERVJfVEVYVF9BU19HTFlQSFMKKyAgICBwYWludC0+c2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CisjZW5kaWYKIAogICAgIGZsb2F0IGxlbmd0aCA9IC0xLjBmOwogICAgIHN3aXRjaCAocGFpbnQtPmdldFRleHRBbGlnbigpKSB7CkBAIC0xOTgzLDggKzIwMzgsOCBAQAogCiAgICAgaWYgKG1IYXNTaGFkb3cpIHsKICAgICAgICAgbUNhY2hlcy5kcm9wU2hhZG93Q2FjaGUuc2V0Rm9udFJlbmRlcmVyKGZvbnRSZW5kZXJlcik7Ci0gICAgICAgIGNvbnN0IFNoYWRvd1RleHR1cmUqIHNoYWRvdyA9IG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLmdldChwYWludCwgdGV4dCwgYnl0ZXNDb3VudCwKLSAgICAgICAgICAgICAgICBjb3VudCwgbVNoYWRvd1JhZGl1cyk7CisgICAgICAgIGNvbnN0IFNoYWRvd1RleHR1cmUqIHNoYWRvdyA9IG1DYWNoZXMuZHJvcFNoYWRvd0NhY2hlLmdldCgKKyAgICAgICAgICAgICAgICBwYWludCwgdGV4dCwgYnl0ZXNDb3VudCwgY291bnQsIG1TaGFkb3dSYWRpdXMpOwogICAgICAgICBjb25zdCBBdXRvVGV4dHVyZSBhdXRvQ2xlYW51cChzaGFkb3cpOwogCiAgICAgICAgIGNvbnN0IGZsb2F0IHN4ID0gb2xkWCAtIHNoYWRvdy0+bGVmdCArIG1TaGFkb3dEeDsKQEAgLTIwNzMsMTEgKzIxMjgsNiBAQAogICAgIGRyYXdUZXh0RGVjb3JhdGlvbnModGV4dCwgYnl0ZXNDb3VudCwgbGVuZ3RoLCBvbGRYLCBvbGRZLCBwYWludCk7CiB9CiAKLXZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdHbHlwaHMoY29uc3QgY2hhciogZ2x5cGhzLCBpbnQgaW5kZXgsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKLSAgICAgICAgU2tQYWludCogcGFpbnQpIHsKLSAgICAvLyBUT0RPCi19Ci0KIHZvaWQgT3BlbkdMUmVuZGVyZXI6OmRyYXdQYXRoKFNrUGF0aCogcGF0aCwgU2tQYWludCogcGFpbnQpIHsKICAgICBpZiAobVNuYXBzaG90LT5pc0lnbm9yZWQoKSkgcmV0dXJuOwogCkBAIC0yMjMwLDE0ICsyMjgwLDE1IEBACiAgICAgLy8gSGFuZGxlIHVuZGVybGluZSBhbmQgc3RyaWtlLXRocm91Z2gKICAgICB1aW50MzJfdCBmbGFncyA9IHBhaW50LT5nZXRGbGFncygpOwogICAgIGlmIChmbGFncyAmIChTa1BhaW50OjprVW5kZXJsaW5lVGV4dF9GbGFnIHwgU2tQYWludDo6a1N0cmlrZVRocnVUZXh0X0ZsYWcpKSB7CisgICAgICAgIFNrUGFpbnQgcGFpbnRDb3B5KCpwYWludCk7CiAgICAgICAgIGZsb2F0IHVuZGVybGluZVdpZHRoID0gbGVuZ3RoOwogICAgICAgICAvLyBJZiBsZW5ndGggaXMgPiAwLjBmLCB3ZSBhbHJlYWR5IG1lYXN1cmVkIHRoZSB0ZXh0IGZvciB0aGUgdGV4dCBhbGlnbm1lbnQKICAgICAgICAgaWYgKGxlbmd0aCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICB1bmRlcmxpbmVXaWR0aCA9IHBhaW50LT5tZWFzdXJlVGV4dCh0ZXh0LCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIHVuZGVybGluZVdpZHRoID0gcGFpbnRDb3B5Lm1lYXN1cmVUZXh0KHRleHQsIGJ5dGVzQ291bnQpOwogICAgICAgICB9CiAKICAgICAgICAgZmxvYXQgb2Zmc2V0WCA9IDA7Ci0gICAgICAgIHN3aXRjaCAocGFpbnQtPmdldFRleHRBbGlnbigpKSB7CisgICAgICAgIHN3aXRjaCAocGFpbnRDb3B5LmdldFRleHRBbGlnbigpKSB7CiAgICAgICAgICAgICBjYXNlIFNrUGFpbnQ6OmtDZW50ZXJfQWxpZ246CiAgICAgICAgICAgICAgICAgb2Zmc2V0WCA9IHVuZGVybGluZVdpZHRoICogMC41ZjsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyNDksOCArMjMwMCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAodW5kZXJsaW5lV2lkdGggPiAwLjBmKSB7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCB0ZXh0U2l6ZSA9IHBhaW50LT5nZXRUZXh0U2l6ZSgpOwotICAgICAgICAgICAgLy8gVE9ETzogU3VwcG9ydCBzdHJva2Ugd2lkdGggPCAxLjBmIHdoZW4gd2UgaGF2ZSBBQSBsaW5lcworICAgICAgICAgICAgY29uc3QgZmxvYXQgdGV4dFNpemUgPSBwYWludENvcHkuZ2V0VGV4dFNpemUoKTsKICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHN0cm9rZVdpZHRoID0gZm1heCh0ZXh0U2l6ZSAqIGtTdGRVbmRlcmxpbmVfVGhpY2tuZXNzLCAxLjBmKTsKIAogICAgICAgICAgICAgY29uc3QgZmxvYXQgbGVmdCA9IHggLSBvZmZzZXRYOwpAQCAtMjI4MCwxMCArMjMzMCw5IEBACiAgICAgICAgICAgICAgICAgcG9pbnRzW2N1cnJlbnRQb2ludCsrXSA9IHRvcDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU2tQYWludCBsaW5lc1BhaW50KCpwYWludCk7Ci0gICAgICAgICAgICBsaW5lc1BhaW50LnNldFN0cm9rZVdpZHRoKHN0cm9rZVdpZHRoKTsKKyAgICAgICAgICAgIHBhaW50Q29weS5zZXRTdHJva2VXaWR0aChzdHJva2VXaWR0aCk7CiAKLSAgICAgICAgICAgIGRyYXdMaW5lcygmcG9pbnRzWzBdLCBwb2ludHNDb3VudCwgJmxpbmVzUGFpbnQpOworICAgICAgICAgICAgZHJhd0xpbmVzKCZwb2ludHNbMF0sIHBvaW50c0NvdW50LCAmcGFpbnRDb3B5KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oIGIvbGlicy9od3VpL09wZW5HTFJlbmRlcmVyLmgKaW5kZXggZTJkYmJhMC4uMGEzZDUwOTAgMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCisrKyBiL2xpYnMvaHd1aS9PcGVuR0xSZW5kZXJlci5oCkBAIC0xMjMsOCArMTIzLDYgQEAKICAgICB2aXJ0dWFsIHZvaWQgZHJhd1BvaW50cyhmbG9hdCogcG9pbnRzLCBpbnQgY291bnQsIFNrUGFpbnQqIHBhaW50KTsKICAgICB2aXJ0dWFsIHZvaWQgZHJhd1RleHQoY29uc3QgY2hhciogdGV4dCwgaW50IGJ5dGVzQ291bnQsIGludCBjb3VudCwgZmxvYXQgeCwgZmxvYXQgeSwKICAgICAgICAgICAgIFNrUGFpbnQqIHBhaW50KTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0dseXBocyhjb25zdCBjaGFyKiBnbHlwaHMsIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LCBmbG9hdCB5LAotICAgICAgICAgICAgU2tQYWludCogcGFpbnQpOwogCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0U2hhZGVyKCk7CiAgICAgdmlydHVhbCB2b2lkIHNldHVwU2hhZGVyKFNraWFTaGFkZXIqIHNoYWRlcik7CkBAIC0xODAsNiArMTc4LDE0IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlbmRlcnMgdGhlIHNwZWNpZmllZCBsYXllciBhcyBhIHRleHR1cmVkIHF1YWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGxheWVyIHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSByZWN0IFRoZSBib3VuZHMgb2YgdGhlIGxheWVyCisgICAgICovCisgICAgdm9pZCBkcmF3VGV4dHVyZUxheWVyKExheWVyKiBsYXllciwgY29uc3QgUmVjdCYgcmVjdCk7CisKIHByaXZhdGU6CiAgICAgLyoqCiAgICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHJlbmRlcmVyIGFzIGEgbmV3IHNuYXBzaG90LgpAQCAtMjUxLDcgKzI1NywxMSBAQAogICAgICAqLwogICAgIHZvaWQgY29tcG9zZUxheWVyUmVjdChMYXllciogbGF5ZXIsIGNvbnN0IFJlY3QmIHJlY3QsIGJvb2wgc3dhcCA9IGZhbHNlKTsKIAotICAgIHZvaWQgZHJhd1RleHR1cmVMYXllcihMYXllciogbGF5ZXIsIGNvbnN0IFJlY3QmIHJlY3QpOworICAgIC8qKgorICAgICAqIENsZWFycyBhbGwgdGhlIHJlZ2lvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBsaXN0IG9mIGxheWVycy4KKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIGludm9rZWQgYmVmb3JlIGFueSBkcmF3aW5nIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyTGF5ZXJSZWdpb25zKCk7CiAKICAgICAvKioKICAgICAgKiBNYXJrIHRoZSBsYXllciBhcyBkaXJ0eSBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzLiBUaGUgY29vcmRpbmF0ZXMKQEAgLTI4MiwxMSArMjkyLDUzIEBACiAgICAgdm9pZCBkcmF3Q29sb3JSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKICAgICAgICAgICAgIGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlLCBib29sIGlnbm9yZVRyYW5zZm9ybSA9IGZhbHNlKTsKIAorICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzaGFwZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIHBhdGggdGV4dHVyZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpbnZva2VzIGRyYXdQYXRoVGV4dHVyZSgpIGJ1dCB0YWtlcyBpbnRvIGFjY291bnQKKyAgICAgKiB0aGUgZXh0cmEgbGVmdC90b3Agb2Zmc2V0IGFuZCB0aGUgdGV4dHVyZSBvZmZzZXQgdG8gY29ycmVjdGx5CisgICAgICogcG9zaXRpb24gdGhlIGZpbmFsIHNoYXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgc2hhcGUgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHNoYXBlIHRvIHJlbmRlcgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHJlcHJzZW50aW5nIHRoZSBzaGFwZQorICAgICAqIEBwYXJhbSBwYWludCBUaGUgcGFpbnQgdG8gZHJhdyB0aGUgc2hhcGUgd2l0aAorICAgICAqLwogICAgIHZvaWQgZHJhd1NoYXBlKGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgY29uc3QgUGF0aFRleHR1cmUqIHRleHR1cmUsIFNrUGFpbnQqIHBhaW50KTsKKworICAgIC8qKgorICAgICAqIFJlbmRlcnMgdGhlIHJlY3QgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGJvdW5kcyBhcyBhIHNoYXBlLgorICAgICAqIFRoaXMgd2lsbCByZW5kZXIgdGhlIHJlY3QgdXNpbmcgYSBwYXRoIHRleHR1cmUsIHdoaWNoIGlzIHVzZWQgdG8gcmVuZGVyCisgICAgICogcmVjdHMgd2l0aCBzdHJva2UgZWZmZWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSBsZWZ0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3QgdG8gZHJhdworICAgICAqIEBwYXJhbSB0b3AgVGhlIHRvcCBjb29yZGluYXRlIG9mIHRoZSByZWN0IHRvIGRyYXcKKyAgICAgKiBAcGFyYW0gcmlnaHQgVGhlIHJpZ2h0IGNvb3JkaW5hdGUgb2YgdGhlIHJlY3QgdG8gZHJhdworICAgICAqIEBwYXJhbSBib3R0b20gVGhlIGJvdHRvbSBjb29yZGluYXRlIG9mIHRoZSByZWN0IHRvIGRyYXcKKyAgICAgKiBAcGFyYW0gcCBUaGUgcGFpbnQgdG8gZHJhdyB0aGUgcmVjdCB3aXRoCisgICAgICovCiAgICAgdm9pZCBkcmF3UmVjdEFzU2hhcGUoZmxvYXQgbGVmdCwgZmxvYXQgdG9wLCBmbG9hdCByaWdodCwgZmxvYXQgYm90dG9tLCBTa1BhaW50KiBwKTsKIAorICAgIC8qKgorICAgICAqIERyYXdzIHRoZSBzcGVjaWZpZWQgdGV4dHVyZSBhcyBhbiBhbHBoYSBiaXRtYXAuIEFscGhhIGJpdG1hcHMgb2JleQorICAgICAqIGRpZmZlcmVudCBjb21wb3NpdGluZyBydWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0dXJlIFRoZSB0ZXh0dXJlIHRvIGRyYXcgd2l0aAorICAgICAqIEBwYXJhbSBsZWZ0IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIGJpdG1hcAorICAgICAqIEBwYXJhbSB0b3AgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgYml0bWFwCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byByZW5kZXIgd2l0aAorICAgICAqLwogICAgIHZvaWQgZHJhd0FscGhhQml0bWFwKFRleHR1cmUqIHRleHR1cmUsIGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgU2tQYWludCogcGFpbnQpOwogCisgICAgLyoqCisgICAgICogUmVuZGVycyB0aGUgcmVjdCBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYm91bmRzIGFzIGFuIGFudGktYWxpYXNlZCByZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdCB0byBkcmF3CisgICAgICogQHBhcmFtIHRvcCBUaGUgdG9wIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3QgdG8gZHJhdworICAgICAqIEBwYXJhbSByaWdodCBUaGUgcmlnaHQgY29vcmRpbmF0ZSBvZiB0aGUgcmVjdCB0byBkcmF3CisgICAgICogQHBhcmFtIGJvdHRvbSBUaGUgYm90dG9tIGNvb3JkaW5hdGUgb2YgdGhlIHJlY3QgdG8gZHJhdworICAgICAqIEBwYXJhbSBjb2xvciBUaGUgY29sb3Igb2YgdGhlIHJlY3QKKyAgICAgKiBAcGFyYW0gbW9kZSBUaGUgYmxlbmRpbmcgbW9kZSB0byBkcmF3IHRoZSByZWN0CisgICAgICovCiAgICAgdm9pZCBkcmF3QUFSZWN0KGZsb2F0IGxlZnQsIGZsb2F0IHRvcCwgZmxvYXQgcmlnaHQsIGZsb2F0IGJvdHRvbSwKICAgICAgICAgICAgIGludCBjb2xvciwgU2tYZmVybW9kZTo6TW9kZSBtb2RlKTsKIApAQCAtMzYxLDYgKzQxMywxNSBAQAogICAgIHZvaWQgZHJhd1RleHREZWNvcmF0aW9ucyhjb25zdCBjaGFyKiB0ZXh0LCBpbnQgYnl0ZXNDb3VudCwgZmxvYXQgbGVuZ3RoLAogICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOwogCisgICAgLyoqCisgICAgICogRHJhd3MgYSBwYXRoIHRleHR1cmUuIFBhdGggdGV4dHVyZXMgYXJlIGFscGhhOCBiaXRtYXBzIHRoYXQgbmVlZCBzcGVjaWFsCisgICAgICogY29tcG9zaXRpbmcgdG8gYXBwbHkgY29sb3JzL2ZpbHRlcnMvZXRjLgorICAgICAqCisgICAgICogQHBhcmFtIHRleHR1cmUgVGhlIHRleHR1cmUgdG8gcmVuZGVyCisgICAgICogQHBhcmFtIHggVGhlIHggY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dHVyZSB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSB3aGVyZSB0aGUgdGV4dHVyZSB3aWxsIGJlIGRyYXduCisgICAgICogQHBhcmFtIHBhaW50IFRoZSBwYWludCB0byBkcmF3IHRoZSB0ZXh0dXJlIHdpdGgKKyAgICAgKi8KICAgICB2b2lkIGRyYXdQYXRoVGV4dHVyZShjb25zdCBQYXRoVGV4dHVyZSogdGV4dHVyZSwgZmxvYXQgeCwgZmxvYXQgeSwgU2tQYWludCogcGFpbnQpOwogCiAgICAgLyoqCkBAIC00MzYsNyArNDk3LDcgQEAKICAgICAvKioKICAgICAgKiBJbnZva2VkIGJlZm9yZSBhbnkgZHJhd2luZyBvcGVyYXRpb24uIFRoaXMgc2V0cyByZXF1aXJlZCBzdGF0ZS4KICAgICAgKi8KLSAgICB2b2lkIHNldHVwRHJhdygpOworICAgIHZvaWQgc2V0dXBEcmF3KGJvb2wgY2xlYXIgPSB0cnVlKTsKICAgICAvKioKICAgICAgKiBWYXJpb3VzIG1ldGhvZHMgdG8gc2V0dXAgT3BlbkdMIHJlbmRlcmluZy4KICAgICAgKi8KQEAgLTUyNCw2ICs1ODUsOSBAQAogICAgIC8vIFZhcmlvdXMgY2FjaGVzCiAgICAgQ2FjaGVzJiBtQ2FjaGVzOwogCisgICAgLy8gTGlzdCBvZiByZWN0YWdubGVzIHRvIGNsZWFyIGFmdGVyIHNhdmVMYXllcigpIGlzIGludm9rZWQKKyAgICBWZWN0b3I8UmVjdCo+IG1MYXllcnM7CisKICAgICAvLyBJbmRlbnRpdHkgbWF0cml4CiAgICAgY29uc3QgbWF0NCBtSWRlbnRpdHk7CiAKZGlmZiAtLWdpdCBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmggYi9saWJzL2h3dWkvUHJvcGVydGllcy5oCmluZGV4IDJkOGI2ZjMuLjdjMTA1MTggMTAwNjQ0Ci0tLSBhL2xpYnMvaHd1aS9Qcm9wZXJ0aWVzLmgKKysrIGIvbGlicy9od3VpL1Byb3BlcnRpZXMuaApAQCAtMjgsNiArMjgsOSBAQAogLy8gSWYgdHVybmVkIG9uLCBsYXllcnMgZHJhd24gaW5zaWRlIEZCT3MgYXJlIG9wdGltaXplZCB3aXRoIHJlZ2lvbnMKICNkZWZpbmUgUkVOREVSX0xBWUVSU19BU19SRUdJT05TIDEKIAorLy8gSWYgdHVybmVkIG9uLCB0ZXh0IGlzIGludGVycHJldGVkIGFzIGdseXBocyBpbnN0ZWFkIG9mIFVURi0xNgorI2RlZmluZSBSRU5ERVJfVEVYVF9BU19HTFlQSFMgMQorCiAvKioKICAqIERlYnVnIGxldmVsIGZvciBhcHAgZGV2ZWxvcGVycy4KICAqLwpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1NoYXBlQ2FjaGUuaCBiL2xpYnMvaHd1aS9TaGFwZUNhY2hlLmgKaW5kZXggYjVjYzI5Yy4uYjA0ODQ2OSAxMDA2NDQKLS0tIGEvbGlicy9od3VpL1NoYXBlQ2FjaGUuaAorKysgYi9saWJzL2h3dWkvU2hhcGVDYWNoZS5oCkBAIC01MzcsMTUgKzUzNywxNiBAQAogICAgIGNvbnN0IGZsb2F0IHBhdGhXaWR0aCA9IGZtYXgoYm91bmRzLndpZHRoKCksIDEuMGYpOwogICAgIGNvbnN0IGZsb2F0IHBhdGhIZWlnaHQgPSBmbWF4KGJvdW5kcy5oZWlnaHQoKSwgMS4wZik7CiAKLSAgICBpZiAocGF0aFdpZHRoID4gbU1heFRleHR1cmVTaXplIHx8IHBhdGhIZWlnaHQgPiBtTWF4VGV4dHVyZVNpemUpIHsKKyAgICBjb25zdCBmbG9hdCBvZmZzZXQgPSBmbWF4KHBhaW50LT5nZXRTdHJva2VXaWR0aCgpLCAxLjBmKSAqIDEuNWY7CisKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IHVpbnQzMl90KHBhdGhXaWR0aCArIG9mZnNldCAqIDIuMCArIDAuNSk7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gdWludDMyX3QocGF0aEhlaWdodCArIG9mZnNldCAqIDIuMCArIDAuNSk7CisKKyAgICBpZiAod2lkdGggPiBtTWF4VGV4dHVyZVNpemUgfHwgaGVpZ2h0ID4gbU1heFRleHR1cmVTaXplKSB7CiAgICAgICAgIExPR1coIlNoYXBlICVzIHRvbyBsYXJnZSB0byBiZSByZW5kZXJlZCBpbnRvIGEgdGV4dHVyZSIsIG1OYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY29uc3QgZmxvYXQgb2Zmc2V0ID0gcGFpbnQtPmdldFN0cm9rZVdpZHRoKCkgKiAxLjVmOwotICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gdWludDMyX3QocGF0aFdpZHRoICsgb2Zmc2V0ICogMi4wICsgMC41KTsKLSAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSB1aW50MzJfdChwYXRoSGVpZ2h0ICsgb2Zmc2V0ICogMi4wICsgMC41KTsKLQogICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSB3aWR0aCAqIGhlaWdodDsKICAgICAvLyBEb24ndCBldmVuIHRyeSB0byBjYWNoZSBhIGJpdG1hcCB0aGF0J3MgYmlnZ2VyIHRoYW4gdGhlIGNhY2hlCiAgICAgaWYgKHNpemUgPCBtTWF4U2l6ZSkgewpkaWZmIC0tZ2l0IGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaCBiL2xpYnMvaHd1aS9UZXh0RHJvcFNoYWRvd0NhY2hlLmgKaW5kZXggZDQ2Njg2ZC4uMjhkYmExMyAxMDA2NDQKLS0tIGEvbGlicy9od3VpL1RleHREcm9wU2hhZG93Q2FjaGUuaAorKysgYi9saWJzL2h3dWkvVGV4dERyb3BTaGFkb3dDYWNoZS5oCkBAIC03Myw3ICs3Myw2IEBACiAgICAgICAgIHRleHQgPSBzdHIuc3RyaW5nKCk7CiAgICAgfQogCi0gICAgLy8gVE9ETzogU2hvdWxkIHRha2UgaW50byBhY2NvdW50IGZha2UgYm9sZCBhbmQgdGV4dCBza2V3CiAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2hhZG93VGV4dCYgcmhzKSBjb25zdCB7CiAgICAgICAgIExURV9JTlQobGVuKSB7CiAgICAgICAgICAgICBMVEVfSU5UKHJhZGl1cykgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9BbmRyb2lkLm1rIGIvbGlicy9ycy9BbmRyb2lkLm1rCmluZGV4IDljOWZhZTMuLmQ5Y2M2YjYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvQW5kcm9pZC5taworKysgYi9saWJzL3JzL0FuZHJvaWQubWsKQEAgLTExOSw2ICsxMTksNyBAQAogCWRyaXZlci9yc2RCY2MuY3BwIFwKIAlkcml2ZXIvcnNkQ29yZS5jcHAgXAogCWRyaXZlci9yc2RGcmFtZUJ1ZmZlci5jcHAgXAorCWRyaXZlci9yc2RGcmFtZUJ1ZmZlck9iai5jcHAgXAogCWRyaXZlci9yc2RHTC5jcHAgXAogCWRyaXZlci9yc2RNZXNoLmNwcCBcCiAJZHJpdmVyL3JzZE1lc2hPYmouY3BwIFwKQEAgLTE0OSwyNCArMTUwLDgyIEBACiAKICMgTm93IGJ1aWxkIGEgaG9zdCB2ZXJzaW9uIGZvciBzZXJpYWxpemF0aW9uCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRTo9IGxpYlJTCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsU1RBVElDX0xJQlJBUklFUyxsaWJSUyxIT1NULCkKKworIyBHZW5lcmF0ZSBjdXN0b20gaGVhZGVycworCitHRU4gOj0gJChhZGRwcmVmaXggJChpbnRlcm1lZGlhdGVzKS8sIFwKKyAgICAgICAgICAgIHJzZ0FwaVN0cnVjdHMuaCBcCisgICAgICAgICAgICByc2dBcGlGdW5jRGVjbC5oIFwKKyAgICAgICAgKQorCiskKEdFTikgOiBQUklWQVRFX1BBVEggOj0gJChMT0NBTF9QQVRIKQorJChHRU4pIDogUFJJVkFURV9DVVNUT01fVE9PTCA9ICQoUlNHX0dFTkVSQVRPUikgJDwgJEAgPCQoUFJJVkFURV9QQVRIKS9ycy5zcGVjCiskKEdFTikgOiAkKFJTR19HRU5FUkFUT1IpICQoTE9DQUxfUEFUSCkvcnMuc3BlYworJChHRU4pOiAkKGludGVybWVkaWF0ZXMpLyUuaCA6ICQoTE9DQUxfUEFUSCkvJS5oLnJzZworCSQodHJhbnNmb3JtLWdlbmVyYXRlZC1zb3VyY2UpCisKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoR0VOKQorCisjIEdlbmVyYXRlIGN1c3RvbSBzb3VyY2UgZmlsZXMKKworR0VOIDo9ICQoYWRkcHJlZml4ICQoaW50ZXJtZWRpYXRlcykvLCBcCisgICAgICAgICAgICByc2dBcGkuY3BwIFwKKyAgICAgICAgICAgIHJzZ0FwaVJlcGxheS5jcHAgXAorICAgICAgICApCisKKyQoR0VOKSA6IFBSSVZBVEVfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCiskKEdFTikgOiBQUklWQVRFX0NVU1RPTV9UT09MID0gJChSU0dfR0VORVJBVE9SKSAkPCAkQCA8JChQUklWQVRFX1BBVEgpL3JzLnNwZWMKKyQoR0VOKSA6ICQoUlNHX0dFTkVSQVRPUikgJChMT0NBTF9QQVRIKS9ycy5zcGVjCiskKEdFTik6ICQoaW50ZXJtZWRpYXRlcykvJS5jcHAgOiAkKExPQ0FMX1BBVEgpLyUuY3BwLnJzZworCSQodHJhbnNmb3JtLWdlbmVyYXRlZC1zb3VyY2UpCisKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQoR0VOKQorCiBMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbCAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby11bnVzZWQtdmFyaWFibGUKIExPQ0FMX0NGTEFHUyArPSAtREFORFJPSURfUlNfU0VSSUFMSVpFCitMT0NBTF9DRkxBR1MgKz0gLWZQSUMKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAorCXJzQWRhcHRlci5jcHAgXAogCXJzQWxsb2NhdGlvbi5jcHAgXAorCXJzQW5pbWF0aW9uLmNwcCBcCiAJcnNDb21wb25lbnQuY3BwIFwKKwlyc0NvbnRleHQuY3BwIFwKKwlyc0RldmljZS5jcHAgXAogCXJzRWxlbWVudC5jcHAgXAorCXJzRkJPQ2FjaGUuY3BwIFwKKwlyc0ZpZm9Tb2NrZXQuY3BwIFwKIAlyc0ZpbGVBM0QuY3BwIFwKKwlyc0ZvbnQuY3BwIFwKKwlyc0xvY2tsZXNzRmlmby5jcHAgXAogCXJzT2JqZWN0QmFzZS5jcHAgXAorCXJzTWF0cml4MngyLmNwcCBcCisJcnNNYXRyaXgzeDMuY3BwIFwKKwlyc01hdHJpeDR4NC5jcHAgXAogCXJzTWVzaC5jcHAgXAorCXJzTXV0ZXguY3BwIFwKKwlyc1Byb2dyYW0uY3BwIFwKKwlyc1Byb2dyYW1GcmFnbWVudC5jcHAgXAorCXJzUHJvZ3JhbVN0b3JlLmNwcCBcCisJcnNQcm9ncmFtUmFzdGVyLmNwcCBcCisJcnNQcm9ncmFtVmVydGV4LmNwcCBcCisJcnNTYW1wbGVyLmNwcCBcCisJcnNTY3JpcHQuY3BwIFwKKwlyc1NjcmlwdEMuY3BwIFwKKwlyc1NjcmlwdENfTGliLmNwcCBcCisJcnNTY3JpcHRDX0xpYkdMLmNwcCBcCisJcnNTaWduYWwuY3BwIFwKIAlyc1N0cmVhbS5jcHAgXAorCXJzVGhyZWFkSU8uY3BwIFwKIAlyc1R5cGUuY3BwCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzCiAKIExPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQKLUxPQ0FMX01PRFVMRTo9IGxpYlJTc2VyaWFsaXplCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaCBiL2xpYnMvcnMvUmVuZGVyU2NyaXB0LmgKaW5kZXggM2YyZDY3YS4uNTM1ZjcxMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9SZW5kZXJTY3JpcHQuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdC5oCkBAIC01NSwxNSArNTUsNyBAQAogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZShSc0RldmljZSBkZXYsIHVpbnQzMl90IHZlcnNpb24pOwogUnNDb250ZXh0IHJzQ29udGV4dENyZWF0ZUdMKFJzRGV2aWNlIGRldiwgdWludDMyX3QgdmVyc2lvbiwgUnNTdXJmYWNlQ29uZmlnIHNjLCB1aW50MzJfdCBkcGkpOwogCi0KLQotI2lmZGVmIEFORFJPSURfUlNfU0VSSUFMSVpFCi0jZGVmaW5lIE5PX1JTX0ZVTkNTCi0jZW5kaWYKLQotI2lmbmRlZiBOT19SU19GVU5DUwogI2luY2x1ZGUgInJzZ0FwaUZ1bmNEZWNsLmgiCi0jZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9SZW5kZXJTY3JpcHREZWZpbmVzLmggYi9saWJzL3JzL1JlbmRlclNjcmlwdERlZmluZXMuaAppbmRleCBlZTk2NDVjLi5kMDkyNTIwIDEwMDY0NAotLS0gYS9saWJzL3JzL1JlbmRlclNjcmlwdERlZmluZXMuaAorKysgYi9saWJzL3JzL1JlbmRlclNjcmlwdERlZmluZXMuaApAQCAtMTEwLDEyICsxMTAsMTIgQEAKIH07CiAKIGVudW0gUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgewotICAgIFJTX0FMTE9DQVRJT05fQ1VCTUFQX0ZBQ0VfUE9TSVRWRV9YID0gMCwKLSAgICBSU19BTExPQ0FUSU9OX0NVQk1BUF9GQUNFX05FR0FUSVZFX1ggPSAxLAotICAgIFJTX0FMTE9DQVRJT05fQ1VCTUFQX0ZBQ0VfUE9TSVRWRV9ZID0gMiwKLSAgICBSU19BTExPQ0FUSU9OX0NVQk1BUF9GQUNFX05FR0FUSVZFX1kgPSAzLAotICAgIFJTX0FMTE9DQVRJT05fQ1VCTUFQX0ZBQ0VfUE9TSVRWRV9aID0gNCwKLSAgICBSU19BTExPQ0FUSU9OX0NVQk1BUF9GQUNFX05FR0FUSVZFX1ogPSA1CisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWCA9IDAsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWCA9IDEsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWSA9IDIsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWSA9IDMsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWiA9IDQsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWiA9IDUKIH07CiAKIGVudW0gUnNEYXRhVHlwZSB7CmRpZmYgLS1naXQgYS9saWJzL3JzL2RyaXZlci9yc2RBbGxvY2F0aW9uLmNwcCBiL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uY3BwCmluZGV4IDJlMTNlOWQuLjAxYTBjZjYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uY3BwCisrKyBiL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAicnNkQmNjLmgiCiAjaW5jbHVkZSAicnNkUnVudGltZS5oIgogI2luY2x1ZGUgInJzZEFsbG9jYXRpb24uaCIKKyNpbmNsdWRlICJyc2RGcmFtZUJ1ZmZlck9iai5oIgogCiAjaW5jbHVkZSAicnNBbGxvY2F0aW9uLmgiCiAKQEAgLTI0NCw2ICsyNDUsOSBAQAogICAgIGlmIChhbGxvYy0+bUhhbC5zdGF0ZS51c2FnZUZsYWdzICYgflJTX0FMTE9DQVRJT05fVVNBR0VfU0NSSVBUKSB7CiAgICAgICAgIGRydi0+dXBsb2FkRGVmZXJyZWQgPSB0cnVlOwogICAgIH0KKworICAgIGRydi0+cmVhZEJhY2tGQk8gPSBOVUxMOworCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTI2OSw2ICsyNzMsMTAgQEAKICAgICAgICAgZnJlZShkcnYtPm1hbGxvY1B0cik7CiAgICAgICAgIGRydi0+bWFsbG9jUHRyID0gTlVMTDsKICAgICB9CisgICAgaWYgKGRydi0+cmVhZEJhY2tGQk8gIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgZHJ2LT5yZWFkQmFja0ZCTzsKKyAgICAgICAgZHJ2LT5yZWFkQmFja0ZCTyA9IE5VTEw7CisgICAgfQogICAgIGZyZWUoZHJ2KTsKICAgICBhbGxvYy0+bUhhbC5kcnYgPSBOVUxMOwogfQpAQCAtMjkyLDEzICszMDAsNTIgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIHJzZEFsbG9jYXRpb25TeW5jRnJvbUZCTyhjb25zdCBDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jKSB7CisgICAgaWYgKCFhbGxvYy0+Z2V0SXNTY3JpcHQoKSkgeworICAgICAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gc3luYworICAgIH0KKworICAgIFJzZEhhbCAqZGMgPSAoUnNkSGFsICopcnNjLT5tSGFsLmRydjsKKyAgICBSc2RGcmFtZUJ1ZmZlck9iaiAqbGFzdEZibyA9IGRjLT5nbC5jdXJyZW50RnJhbWVCdWZmZXI7CisKKyAgICBEcnZBbGxvY2F0aW9uICpkcnYgPSAoRHJ2QWxsb2NhdGlvbiAqKWFsbG9jLT5tSGFsLmRydjsKKyAgICBpZiAoIWRydi0+dGV4dHVyZUlEICYmICFkcnYtPnJlbmRlclRhcmdldElEKSB7CisgICAgICAgIHJldHVybjsgLy8gbm90aGluZyB3YXMgcmVuZGVyZWQgaGVyZSB5ZXQsIHNvIG5vdGhpbmcgdG8gc3luYworICAgIH0KKyAgICBpZiAoZHJ2LT5yZWFkQmFja0ZCTyA9PSBOVUxMKSB7CisgICAgICAgIGRydi0+cmVhZEJhY2tGQk8gPSBuZXcgUnNkRnJhbWVCdWZmZXJPYmooKTsKKyAgICAgICAgZHJ2LT5yZWFkQmFja0ZCTy0+c2V0Q29sb3JUYXJnZXQoZHJ2LCAwKTsKKyAgICAgICAgZHJ2LT5yZWFkQmFja0ZCTy0+c2V0RGltZW5zaW9ucyhhbGxvYy0+Z2V0VHlwZSgpLT5nZXREaW1YKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2MtPmdldFR5cGUoKS0+Z2V0RGltWSgpKTsKKyAgICB9CisKKyAgICAvLyBCaW5kIHRoZSBmcmFtZWJ1ZmZlciBvYmplY3Qgc28gd2UgY2FuIHJlYWQgYmFjayBmcm9tIGl0CisgICAgZHJ2LT5yZWFkQmFja0ZCTy0+c2V0QWN0aXZlKHJzYyk7CisKKyAgICAvLyBEbyB0aGUgcmVhZGJhY2sKKyAgICBnbFJlYWRQaXhlbHMoMCwgMCwgYWxsb2MtPmdldFR5cGUoKS0+Z2V0RGltWCgpLCBhbGxvYy0+Z2V0VHlwZSgpLT5nZXREaW1ZKCksCisgICAgICAgICAgICAgICAgIGRydi0+Z2xGb3JtYXQsIGRydi0+Z2xUeXBlLCBhbGxvYy0+Z2V0UHRyKCkpOworCisgICAgLy8gUmV2ZXJ0IGZyYW1lYnVmZmVyIHRvIGl0cyBvcmlnaW5hbAorICAgIGxhc3RGYm8tPnNldEFjdGl2ZShyc2MpOworfQogCiAKIHZvaWQgcnNkQWxsb2NhdGlvblN5bmNBbGwoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICphbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb25Vc2FnZVR5cGUgc3JjKSB7CiAgICAgRHJ2QWxsb2NhdGlvbiAqZHJ2ID0gKERydkFsbG9jYXRpb24gKilhbGxvYy0+bUhhbC5kcnY7CiAKLSAgICBpZiAoIWRydi0+dXBsb2FkRGVmZXJyZWQpIHsKKyAgICBpZiAoc3JjID09IFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfUkVOREVSX1RBUkdFVCkgeworICAgICAgICBpZighYWxsb2MtPmdldElzUmVuZGVyVGFyZ2V0KCkpIHsKKyAgICAgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfRkFUQUxfRFJJVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzeW5jIGFsbG9jYXRpb24gZnJvbSByZW5kZXIgdGFyZ2V0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igbm9uLXJlbmRlciB0YXJnZXQgYWxsb2NhdGlvbiIpOworICAgICAgICB9IGVsc2UgaWYgKGFsbG9jLT5nZXRUeXBlKCktPmdldEVsZW1lbnQoKS0+Z2V0S2luZCgpICE9IFJTX0tJTkRfUElYRUxfUkdCQSkgeworICAgICAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9GQVRBTF9EUklWRVIsICJDYW5ub3Qgb25seSBzeW5jIGZyb20gUkdCQSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyIHRhcmdldCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnNkQWxsb2NhdGlvblN5bmNGcm9tRkJPKHJzYywgYWxsb2MpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTM3OCw2ICs0MjUsNzMgQEAKIAogfQogCit2b2lkIHJzZEFsbG9jYXRpb25EYXRhMURfYWxsb2MoY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICpkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RYb2ZmLCB1aW50MzJfdCBkc3RMb2QsIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6QWxsb2NhdGlvbiAqc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjWG9mZiwgdWludDMyX3Qgc3JjTG9kKSB7Cit9CisKK3VpbnQ4X3QgKmdldE9mZnNldFB0cihjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkFsbG9jYXRpb24gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IGxvZCwKKyAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb25DdWJlbWFwRmFjZSBmYWNlKSB7CisgICAgdWludDhfdCAqcHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihhbGxvYy0+Z2V0UHRyKCkpOworICAgIHB0ciArPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRMT0RPZmZzZXQobG9kLCB4b2ZmLCB5b2ZmKTsKKworICAgIGlmIChmYWNlICE9IDApIHsKKyAgICAgICAgdWludDMyX3QgdG90YWxTaXplQnl0ZXMgPSBhbGxvYy0+Z2V0VHlwZSgpLT5nZXRTaXplQnl0ZXMoKTsKKyAgICAgICAgdWludDMyX3QgZmFjZU9mZnNldCA9IHRvdGFsU2l6ZUJ5dGVzIC8gNjsKKyAgICAgICAgcHRyICs9IGZhY2VPZmZzZXQgKiAodWludDMyX3QpZmFjZTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworCit2b2lkIHJzZEFsbG9jYXRpb25EYXRhMkRfYWxsb2Nfc2NyaXB0KGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6Q29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkFsbG9jYXRpb24gKmRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RYb2ZmLCB1aW50MzJfdCBkc3RZb2ZmLCB1aW50MzJfdCBkc3RMb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbkN1YmVtYXBGYWNlIGRzdEZhY2UsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6QWxsb2NhdGlvbiAqc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1hvZmYsIHVpbnQzMl90IHNyY1lvZmYsIHVpbnQzMl90IHNyY0xvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2Ugc3JjRmFjZSkgeworICAgIHVpbnQzMl90IGVsZW1lbnRTaXplID0gZHN0QWxsb2MtPmdldFR5cGUoKS0+Z2V0RWxlbWVudFNpemVCeXRlcygpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBoOyBpICsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdFB0ciA9IGdldE9mZnNldFB0cihkc3RBbGxvYywgZHN0WG9mZiwgZHN0WW9mZiArIGksIGRzdExvZCwgZHN0RmFjZSk7CisgICAgICAgIHVpbnQ4X3QgKnNyY1B0ciA9IGdldE9mZnNldFB0cihzcmNBbGxvYywgc3JjWG9mZiwgc3JjWW9mZiArIGksIHNyY0xvZCwgc3JjRmFjZSk7CisgICAgICAgIG1lbWNweShkc3RQdHIsIHNyY1B0ciwgdyAqIGVsZW1lbnRTaXplKTsKKworICAgICAgICBMT0dFKCJDT1BJRUQgZHN0WG9mZigldSksIGRzdFlvZmYoJXUpLCBkc3RMb2QoJXUpLCBkc3RGYWNlKCV1KSwgdygldSksIGgoJXUpLCBzcmNYb2ZmKCV1KSwgc3JjWW9mZigldSksIHNyY0xvZCgldSksIHNyY0ZhY2UoJXUpIiwKKyAgICAgICAgICAgICBkc3RYb2ZmLCBkc3RZb2ZmLCBkc3RMb2QsIGRzdEZhY2UsIHcsIGgsIHNyY1hvZmYsIHNyY1lvZmYsIHNyY0xvZCwgc3JjRmFjZSk7CisgICAgfQorfQorCit2b2lkIHJzZEFsbG9jYXRpb25EYXRhMkRfYWxsb2MoY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICpkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RYb2ZmLCB1aW50MzJfdCBkc3RZb2ZmLCB1aW50MzJfdCBkc3RMb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZHN0RmFjZSwgdWludDMyX3QgdywgdWludDMyX3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkFsbG9jYXRpb24gKnNyY0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1hvZmYsIHVpbnQzMl90IHNyY1lvZmYsIHVpbnQzMl90IHNyY0xvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb25DdWJlbWFwRmFjZSBzcmNGYWNlKSB7CisgICAgaWYgKCFkc3RBbGxvYy0+Z2V0SXNTY3JpcHQoKSAmJiAhc3JjQWxsb2MtPmdldElzU2NyaXB0KCkpIHsKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9GQVRBTF9EUklWRVIsICJOb24tc2NyaXB0IGFsbG9jYXRpb24gY29waWVzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWV0IGltcGxlbWVudGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJzZEFsbG9jYXRpb25EYXRhMkRfYWxsb2Nfc2NyaXB0KHJzYywgZHN0QWxsb2MsIGRzdFhvZmYsIGRzdFlvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TG9kLCBkc3RGYWNlLCB3LCBoLCBzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNYb2ZmLCBzcmNZb2ZmLCBzcmNMb2QsIHNyY0ZhY2UpOworfQorCit2b2lkIHJzZEFsbG9jYXRpb25EYXRhM0RfYWxsb2MoY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICpkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RYb2ZmLCB1aW50MzJfdCBkc3RZb2ZmLCB1aW50MzJfdCBkc3Rab2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdExvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZHN0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6QWxsb2NhdGlvbiAqc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjWG9mZiwgdWludDMyX3Qgc3JjWW9mZiwgdWludDMyX3Qgc3JjWm9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNMb2QsIFJzQWxsb2NhdGlvbkN1YmVtYXBGYWNlIHNyY0ZhY2UpIHsKK30KKwogdm9pZCByc2RBbGxvY2F0aW9uRWxlbWVudERhdGExRChjb25zdCBDb250ZXh0ICpyc2MsIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBjSWR4LCB1aW50MzJfdCBzaXplQnl0ZXMpIHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uaCBiL2xpYnMvcnMvZHJpdmVyL3JzZEFsbG9jYXRpb24uaAppbmRleCBkNzM4NWNlLi40ZmM0NDE5IDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RBbGxvY2F0aW9uLmgKKysrIGIvbGlicy9ycy9kcml2ZXIvcnNkQWxsb2NhdGlvbi5oCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8R0xFUy9nbC5oPgogI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgogCitjbGFzcyBSc2RGcmFtZUJ1ZmZlck9iajsKKwogc3RydWN0IERydkFsbG9jYXRpb24gewogICAgIC8vIElzIHRoaXMgYSBsZWdhbCBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBhcyBhIHRleHR1cmUgc291cmNlLgogICAgIC8vIEluaXRpYWxseSB0aGlzIHdpbGwgcmVxdWlyZSAxRCBvciAyRCBhbmQgY29sb3IgZGF0YQpAQCAtNDIsOCArNDQsOSBAQAogICAgIEdMZW51bSBnbFR5cGU7CiAgICAgR0xlbnVtIGdsRm9ybWF0OwogCi0KICAgICBib29sIHVwbG9hZERlZmVycmVkOworCisgICAgUnNkRnJhbWVCdWZmZXJPYmogKiByZWFkQmFja0ZCTzsKIH07CiAKIEdMZW51bSByc2RUeXBlVG9HTFR5cGUoUnNEYXRhVHlwZSB0KTsKQEAgLTgwLDYgKzgzLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbG9kLCBSc0FsbG9jYXRpb25DdWJlbWFwRmFjZSBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcyk7CiAKK3ZvaWQgcnNkQWxsb2NhdGlvbkRhdGExRF9hbGxvYyhjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkNvbnRleHQgKnJzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkFsbG9jYXRpb24gKmRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFhvZmYsIHVpbnQzMl90IGRzdExvZCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNYb2ZmLCB1aW50MzJfdCBzcmNMb2QpOwordm9pZCByc2RBbGxvY2F0aW9uRGF0YTJEX2FsbG9jKGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6Q29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6QWxsb2NhdGlvbiAqZHN0QWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0WG9mZiwgdWludDMyX3QgZHN0WW9mZiwgdWludDMyX3QgZHN0TG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbkN1YmVtYXBGYWNlIGRzdEZhY2UsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNYb2ZmLCB1aW50MzJfdCBzcmNZb2ZmLCB1aW50MzJfdCBzcmNMb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2Ugc3JjRmFjZSk7Cit2b2lkIHJzZEFsbG9jYXRpb25EYXRhM0RfYWxsb2MoY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OjpBbGxvY2F0aW9uICpkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RYb2ZmLCB1aW50MzJfdCBkc3RZb2ZmLCB1aW50MzJfdCBkc3Rab2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdExvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZHN0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6QWxsb2NhdGlvbiAqc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjWG9mZiwgdWludDMyX3Qgc3JjWW9mZiwgdWludDMyX3Qgc3JjWm9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNMb2QsIFJzQWxsb2NhdGlvbkN1YmVtYXBGYWNlIHNyY0ZhY2UpOworCiB2b2lkIHJzZEFsbG9jYXRpb25FbGVtZW50RGF0YTFEKGNvbnN0IGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDo6Q29udGV4dCAqcnNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkFsbG9jYXRpb24gKmFsbG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB4LApkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkQ29yZS5jcHAgYi9saWJzL3JzL2RyaXZlci9yc2RDb3JlLmNwcAppbmRleCA5NGQ1NWE2Li4zOGY2ODk1IDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RDb3JlLmNwcAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RDb3JlLmNwcApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGJjYy9iY2MuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtNzMsNiArNzQsOSBAQAogICAgICAgICByc2RBbGxvY2F0aW9uRGF0YTFELAogICAgICAgICByc2RBbGxvY2F0aW9uRGF0YTJELAogICAgICAgICByc2RBbGxvY2F0aW9uRGF0YTNELAorICAgICAgICByc2RBbGxvY2F0aW9uRGF0YTFEX2FsbG9jLAorICAgICAgICByc2RBbGxvY2F0aW9uRGF0YTJEX2FsbG9jLAorICAgICAgICByc2RBbGxvY2F0aW9uRGF0YTNEX2FsbG9jLAogICAgICAgICByc2RBbGxvY2F0aW9uRWxlbWVudERhdGExRCwKICAgICAgICAgcnNkQWxsb2NhdGlvbkVsZW1lbnREYXRhMkQKICAgICB9LApkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkQ29yZS5oIGIvbGlicy9ycy9kcml2ZXIvcnNkQ29yZS5oCmluZGV4IDQyMmJiMWIuLmYzOTNiNjAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvZHJpdmVyL3JzZENvcmUuaAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RDb3JlLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgUlNEX0NPUkVfSAogCiAjaW5jbHVkZSA8cnNfaGFsLmg+Ci0jaW5jbHVkZSA8YmNjL2JjYy5oPgogCiAjaW5jbHVkZSAicnNNdXRleC5oIgogI2luY2x1ZGUgInJzU2lnbmFsLmgiCmRpZmYgLS1naXQgYS9saWJzL3JzL2RyaXZlci9yc2RGcmFtZUJ1ZmZlci5jcHAgYi9saWJzL3JzL2RyaXZlci9yc2RGcmFtZUJ1ZmZlci5jcHAKaW5kZXggY2U3MmI1ZC4uOGMxYjEyZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9kcml2ZXIvcnNkRnJhbWVCdWZmZXIuY3BwCisrKyBiL2xpYnMvcnMvZHJpdmVyL3JzZEZyYW1lQnVmZmVyLmNwcApAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSAicnNkQ29yZS5oIgogI2luY2x1ZGUgInJzZEZyYW1lQnVmZmVyLmgiCisjaW5jbHVkZSAicnNkRnJhbWVCdWZmZXJPYmouaCIKICNpbmNsdWRlICJyc2RBbGxvY2F0aW9uLmgiCiAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKQEAgLTI4LDEzMyArMjksNzAgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKIAotc3RydWN0IERydkZyYW1lQnVmZmVyIHsKLSAgICBHTHVpbnQgbUZCT0lkOwotfTsKLQotdm9pZCBjaGVja0Vycm9yKGNvbnN0IENvbnRleHQgKnJzYykgewotICAgIEdMZW51bSBzdGF0dXM7Ci0gICAgc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKLSAgICBzd2l0Y2ggKHN0YXR1cykgewotICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEU6Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOgotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCB1cCByZW5kZXIgVGFyZ2V0OiBSRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6Ci0gICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHVwIHJlbmRlciBUYXJnZXQ6IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOgotICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCB1cCByZW5kZXIgVGFyZ2V0OiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDoKLSAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgdXAgcmVuZGVyIFRhcmdldDogR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KIHZvaWQgc2V0RGVwdGhBdHRhY2htZW50KGNvbnN0IENvbnRleHQgKnJzYywgY29uc3QgRkJPQ2FjaGUgKmZiKSB7Ci0gICAgaWYgKGZiLT5tSGFsLnN0YXRlLmRlcHRoVGFyZ2V0LmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgRHJ2QWxsb2NhdGlvbiAqZHJ2ID0gKERydkFsbG9jYXRpb24gKilmYi0+bUhhbC5zdGF0ZS5kZXB0aFRhcmdldC0+bUhhbC5kcnY7CisgICAgUnNkRnJhbWVCdWZmZXJPYmogKmZibyA9IChSc2RGcmFtZUJ1ZmZlck9iaiopZmItPm1IYWwuZHJ2OwogCi0gICAgICAgIGlmIChkcnYtPnRleHR1cmVJRCkgewotICAgICAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfREVQVEhfQVRUQUNITUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVEVYVFVSRV8yRCwgZHJ2LT50ZXh0dXJlSUQsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgR0xfREVQVEhfQVRUQUNITUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkVOREVSQlVGRkVSLCBkcnYtPnJlbmRlclRhcmdldElEKTsKKyAgICBEcnZBbGxvY2F0aW9uICpkZXB0aCA9IE5VTEw7CisgICAgaWYgKGZiLT5tSGFsLnN0YXRlLmRlcHRoVGFyZ2V0LmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgZGVwdGggPSAoRHJ2QWxsb2NhdGlvbiAqKWZiLT5tSGFsLnN0YXRlLmRlcHRoVGFyZ2V0LT5tSGFsLmRydjsKKworICAgICAgICBpZiAoZGVwdGgtPnVwbG9hZERlZmVycmVkKSB7CisgICAgICAgICAgICByc2RBbGxvY2F0aW9uU3luY0FsbChyc2MsIGZiLT5tSGFsLnN0YXRlLmRlcHRoVGFyZ2V0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gUmVzZXQgbGFzdCBhdHRhY2htZW50Ci0gICAgICAgIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsIEdMX1JFTkRFUkJVRkZFUiwgMCk7Ci0gICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsIEdMX1RFWFRVUkVfMkQsIDAsIDApOwogICAgIH0KKyAgICBmYm8tPnNldERlcHRoVGFyZ2V0KGRlcHRoKTsKIH0KIAogdm9pZCBzZXRDb2xvckF0dGFjaG1lbnQoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBGQk9DYWNoZSAqZmIpIHsKKyAgICBSc2RGcmFtZUJ1ZmZlck9iaiAqZmJvID0gKFJzZEZyYW1lQnVmZmVyT2JqKilmYi0+bUhhbC5kcnY7CiAgICAgLy8gTm93IGF0dGFjaCBjb2xvciB0YXJnZXRzCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGZiLT5tSGFsLnN0YXRlLmNvbG9yVGFyZ2V0c0NvdW50OyBpICsrKSB7Ci0gICAgICAgIHVpbnQzMl90IHRleElEID0gMDsKKyAgICAgICAgRHJ2QWxsb2NhdGlvbiAqY29sb3IgPSBOVUxMOwogICAgICAgICBpZiAoZmItPm1IYWwuc3RhdGUuY29sb3JUYXJnZXRzW2ldLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIERydkFsbG9jYXRpb24gKmRydiA9IChEcnZBbGxvY2F0aW9uICopZmItPm1IYWwuc3RhdGUuY29sb3JUYXJnZXRzW2ldLT5tSGFsLmRydjsKKyAgICAgICAgICAgIGNvbG9yID0gKERydkFsbG9jYXRpb24gKilmYi0+bUhhbC5zdGF0ZS5jb2xvclRhcmdldHNbaV0tPm1IYWwuZHJ2OwogCi0gICAgICAgICAgICBpZiAoZHJ2LT50ZXh0dXJlSUQpIHsKLSAgICAgICAgICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCArIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCBkcnYtPnRleHR1cmVJRCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwICsgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFTkRFUkJVRkZFUiwgZHJ2LT5yZW5kZXJUYXJnZXRJRCk7CisgICAgICAgICAgICBpZiAoY29sb3ItPnVwbG9hZERlZmVycmVkKSB7CisgICAgICAgICAgICAgICAgcnNkQWxsb2NhdGlvblN5bmNBbGwocnNjLCBmYi0+bUhhbC5zdGF0ZS5jb2xvclRhcmdldHNbaV0uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gUmVzZXQgbGFzdCBhdHRhY2htZW50Ci0gICAgICAgICAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCArIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFTkRFUkJVRkZFUiwgMCk7Ci0gICAgICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCArIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsIDAsIDApOwogICAgICAgICB9CisgICAgICAgIGZiby0+c2V0Q29sb3JUYXJnZXQoY29sb3IsIGkpOwogICAgIH0KIH0KIAotYm9vbCByZW5kZXJUb0ZyYW1lYnVmZmVyKGNvbnN0IEZCT0NhY2hlICpmYikgewotICAgIGlmIChmYi0+bUhhbC5zdGF0ZS5kZXB0aFRhcmdldC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZmItPm1IYWwuc3RhdGUuY29sb3JUYXJnZXRzQ291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKGZiLT5tSGFsLnN0YXRlLmNvbG9yVGFyZ2V0c1tpXS5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLQogYm9vbCByc2RGcmFtZUJ1ZmZlckluaXQoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBGQk9DYWNoZSAqZmIpIHsKLSAgICBEcnZGcmFtZUJ1ZmZlciAqZHJ2ID0gKERydkZyYW1lQnVmZmVyICopY2FsbG9jKDEsIHNpemVvZihEcnZGcmFtZUJ1ZmZlcikpOwotICAgIGlmIChkcnYgPT0gTlVMTCkgeworICAgIFJzZEZyYW1lQnVmZmVyT2JqICpmYm8gPSBuZXcgUnNkRnJhbWVCdWZmZXJPYmooKTsKKyAgICBpZiAoZmJvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBmYi0+bUhhbC5kcnYgPSBkcnY7Ci0gICAgZHJ2LT5tRkJPSWQgPSAwOworICAgIGZiLT5tSGFsLmRydiA9IGZibzsKKworICAgIFJzZEhhbCAqZGMgPSAoUnNkSGFsICopcnNjLT5tSGFsLmRydjsKKyAgICBkYy0+Z2wuY3VycmVudEZyYW1lQnVmZmVyID0gZmJvOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgcnNkRnJhbWVCdWZmZXJTZXRBY3RpdmUoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBGQk9DYWNoZSAqZmIpIHsKLSAgICBEcnZGcmFtZUJ1ZmZlciAqZHJ2ID0gKERydkZyYW1lQnVmZmVyICopZmItPm1IYWwuZHJ2OworICAgIHNldERlcHRoQXR0YWNobWVudChyc2MsIGZiKTsKKyAgICBzZXRDb2xvckF0dGFjaG1lbnQocnNjLCBmYik7CiAKLSAgICBib29sIGZyYW1lYnVmZmVyID0gcmVuZGVyVG9GcmFtZWJ1ZmZlcihmYik7Ci0gICAgaWYgKCFmcmFtZWJ1ZmZlcikgewotICAgICAgICBpZihkcnYtPm1GQk9JZCA9PSAwKSB7Ci0gICAgICAgICAgICBnbEdlbkZyYW1lYnVmZmVycygxLCAmZHJ2LT5tRkJPSWQpOwotICAgICAgICB9Ci0gICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBkcnYtPm1GQk9JZCk7Ci0KLSAgICAgICAgc2V0RGVwdGhBdHRhY2htZW50KHJzYywgZmIpOwotICAgICAgICBzZXRDb2xvckF0dGFjaG1lbnQocnNjLCBmYik7Ci0KLSAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCBmYi0+bUhhbC5zdGF0ZS5jb2xvclRhcmdldHNbMF0tPmdldFR5cGUoKS0+Z2V0RGltWCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZiLT5tSGFsLnN0YXRlLmNvbG9yVGFyZ2V0c1swXS0+Z2V0VHlwZSgpLT5nZXREaW1ZKCkpOwotCi0gICAgICAgIGNoZWNrRXJyb3IocnNjKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Ci0gICAgICAgIGdsVmlld3BvcnQoMCwgMCwgcnNjLT5nZXRXaWR0aCgpLCByc2MtPmdldEhlaWdodCgpKTsKKyAgICBSc2RGcmFtZUJ1ZmZlck9iaiAqZmJvID0gKFJzZEZyYW1lQnVmZmVyT2JqICopZmItPm1IYWwuZHJ2OworICAgIGlmIChmYi0+bUhhbC5zdGF0ZS5jb2xvclRhcmdldHNbMF0uZ2V0KCkpIHsKKyAgICAgICAgZmJvLT5zZXREaW1lbnNpb25zKGZiLT5tSGFsLnN0YXRlLmNvbG9yVGFyZ2V0c1swXS0+Z2V0VHlwZSgpLT5nZXREaW1YKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYi0+bUhhbC5zdGF0ZS5jb2xvclRhcmdldHNbMF0tPmdldFR5cGUoKS0+Z2V0RGltWSgpKTsKKyAgICB9IGVsc2UgaWYgKGZiLT5tSGFsLnN0YXRlLmRlcHRoVGFyZ2V0LmdldCgpKSB7CisgICAgICAgIGZiby0+c2V0RGltZW5zaW9ucyhmYi0+bUhhbC5zdGF0ZS5kZXB0aFRhcmdldC0+Z2V0VHlwZSgpLT5nZXREaW1YKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmYi0+bUhhbC5zdGF0ZS5kZXB0aFRhcmdldC0+Z2V0VHlwZSgpLT5nZXREaW1ZKCkpOwogICAgIH0KKworICAgIGZiby0+c2V0QWN0aXZlKHJzYyk7CiB9CiAKIHZvaWQgcnNkRnJhbWVCdWZmZXJEZXN0cm95KGNvbnN0IENvbnRleHQgKnJzYywgY29uc3QgRkJPQ2FjaGUgKmZiKSB7Ci0gICAgRHJ2RnJhbWVCdWZmZXIgKmRydiA9IChEcnZGcmFtZUJ1ZmZlciAqKWZiLT5tSGFsLmRydjsKLSAgICBpZihkcnYtPm1GQk9JZCAhPSAwKSB7Ci0gICAgICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZkcnYtPm1GQk9JZCk7Ci0gICAgfQotCi0gICAgZnJlZShmYi0+bUhhbC5kcnYpOworICAgIFJzZEZyYW1lQnVmZmVyT2JqICpmYm8gPSAoUnNkRnJhbWVCdWZmZXJPYmogKilmYi0+bUhhbC5kcnY7CisgICAgZGVsZXRlIGZibzsKICAgICBmYi0+bUhhbC5kcnYgPSBOVUxMOwogfQogCmRpZmYgLS1naXQgYS9saWJzL3JzL2RyaXZlci9yc2RGcmFtZUJ1ZmZlck9iai5jcHAgYi9saWJzL3JzL2RyaXZlci9yc2RGcmFtZUJ1ZmZlck9iai5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1YmYzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvcnMvZHJpdmVyL3JzZEZyYW1lQnVmZmVyT2JqLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgInJzZEZyYW1lQnVmZmVyT2JqLmgiCisjaW5jbHVkZSAicnNkQWxsb2NhdGlvbi5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OnJlbmRlcnNjcmlwdDsKKworUnNkRnJhbWVCdWZmZXJPYmo6OlJzZEZyYW1lQnVmZmVyT2JqKCkgeworICAgIG1GQk9JZCA9IDA7CisgICAgbVdpZHRoID0gMDsKKyAgICBtSGVpZ2h0ID0gMDsKKyAgICBtQ29sb3JUYXJnZXRzQ291bnQgPSAxOworICAgIG1Db2xvclRhcmdldHMgPSBuZXcgRHJ2QWxsb2NhdGlvbipbbUNvbG9yVGFyZ2V0c0NvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNvbG9yVGFyZ2V0c0NvdW50OyBpICsrKSB7CisgICAgICAgIG1Db2xvclRhcmdldHNbaV0gPSAwOworICAgIH0KKyAgICBtRGVwdGhUYXJnZXQgPSBOVUxMOworICAgIG1EaXJ0eSA9IHRydWU7Cit9CisKK1JzZEZyYW1lQnVmZmVyT2JqOjp+UnNkRnJhbWVCdWZmZXJPYmooKSB7CisgICAgaWYobUZCT0lkICE9IDApIHsKKyAgICAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMSwgJm1GQk9JZCk7CisgICAgfQorICAgIGRlbGV0ZSBbXSBtQ29sb3JUYXJnZXRzOworfQorCit2b2lkIFJzZEZyYW1lQnVmZmVyT2JqOjpjaGVja0Vycm9yKGNvbnN0IENvbnRleHQgKnJzYykgeworICAgIEdMZW51bSBzdGF0dXM7CisgICAgc3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOgorICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCB1cCByZW5kZXIgVGFyZ2V0OiBSRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6CisgICAgICAgIHJzYy0+c2V0RXJyb3IoUlNfRVJST1JfQkFEX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHVwIHJlbmRlciBUYXJnZXQ6IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TOgorICAgICAgICByc2MtPnNldEVycm9yKFJTX0VSUk9SX0JBRF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCB1cCByZW5kZXIgVGFyZ2V0OiBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDoKKyAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgdXAgcmVuZGVyIFRhcmdldDogR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3ZvaWQgUnNkRnJhbWVCdWZmZXJPYmo6OnNldERlcHRoQXR0YWNobWVudCgpIHsKKyAgICBpZiAobURlcHRoVGFyZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1EZXB0aFRhcmdldC0+dGV4dHVyZUlEKSB7CisgICAgICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9ERVBUSF9BVFRBQ0hNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCBtRGVwdGhUYXJnZXQtPnRleHR1cmVJRCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBHTF9ERVBUSF9BVFRBQ0hNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SRU5ERVJCVUZGRVIsIG1EZXB0aFRhcmdldC0+cmVuZGVyVGFyZ2V0SUQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVzZXQgbGFzdCBhdHRhY2htZW50CisgICAgICAgIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsIEdMX1JFTkRFUkJVRkZFUiwgMCk7CisgICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsIEdMX1RFWFRVUkVfMkQsIDAsIDApOworICAgIH0KK30KKwordm9pZCBSc2RGcmFtZUJ1ZmZlck9iajo6c2V0Q29sb3JBdHRhY2htZW50KCkgeworICAgIC8vIE5vdyBhdHRhY2ggY29sb3IgdGFyZ2V0cworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ29sb3JUYXJnZXRzQ291bnQ7IGkgKyspIHsKKyAgICAgICAgaWYgKG1Db2xvclRhcmdldHNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1Db2xvclRhcmdldHNbaV0tPnRleHR1cmVJRCkgeworICAgICAgICAgICAgICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsIG1Db2xvclRhcmdldHNbaV0tPnRleHR1cmVJRCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFTkRFUkJVRkZFUiwgbUNvbG9yVGFyZ2V0c1tpXS0+cmVuZGVyVGFyZ2V0SUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVzZXQgbGFzdCBhdHRhY2htZW50CisgICAgICAgICAgICBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFTkRFUkJVRkZFUiwgMCk7CisgICAgICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsIDAsIDApOworICAgICAgICB9CisgICAgfQorfQorCitib29sIFJzZEZyYW1lQnVmZmVyT2JqOjpyZW5kZXJUb0ZyYW1lYnVmZmVyKCkgeworICAgIGlmIChtRGVwdGhUYXJnZXQgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1Db2xvclRhcmdldHNDb3VudDsgaSArKykgeworICAgICAgICBpZiAobUNvbG9yVGFyZ2V0c1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUnNkRnJhbWVCdWZmZXJPYmo6OnNldEFjdGl2ZShjb25zdCBDb250ZXh0ICpyc2MpIHsKKyAgICBib29sIGZyYW1lYnVmZmVyID0gcmVuZGVyVG9GcmFtZWJ1ZmZlcigpOworICAgIGlmICghZnJhbWVidWZmZXIpIHsKKyAgICAgICAgaWYobUZCT0lkID09IDApIHsKKyAgICAgICAgICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZtRkJPSWQpOworICAgICAgICB9CisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtRkJPSWQpOworCisgICAgICAgIGlmIChtRGlydHkpIHsKKyAgICAgICAgICAgIHNldERlcHRoQXR0YWNobWVudCgpOworICAgICAgICAgICAgc2V0Q29sb3JBdHRhY2htZW50KCk7CisgICAgICAgICAgICBtRGlydHkgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGdsVmlld3BvcnQoMCwgMCwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgY2hlY2tFcnJvcihyc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKKyAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCByc2MtPmdldFdpZHRoKCksIHJzYy0+Z2V0SGVpZ2h0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnMvcnMvZHJpdmVyL3JzZEZyYW1lQnVmZmVyT2JqLmggYi9saWJzL3JzL2RyaXZlci9yc2RGcmFtZUJ1ZmZlck9iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTdkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RGcmFtZUJ1ZmZlck9iai5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9SU0RfRlJBTUVCVUZGRVJfT0JKX0hfCisjZGVmaW5lIF9SU0RfRlJBTUVCVUZGRVJfT0JKX0hfCisKKyNpbmNsdWRlIDxyc0NvbnRleHQuaD4KKworY2xhc3MgRHJ2QWxsb2NhdGlvbjsKKworY2xhc3MgUnNkRnJhbWVCdWZmZXJPYmogeworcHVibGljOgorICAgIFJzZEZyYW1lQnVmZmVyT2JqKCk7CisgICAgflJzZEZyYW1lQnVmZmVyT2JqKCk7CisKKyAgICB2b2lkIHNldEFjdGl2ZShjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkNvbnRleHQgKnJzYyk7CisgICAgdm9pZCBzZXRDb2xvclRhcmdldChEcnZBbGxvY2F0aW9uICpjb2xvciwgdWludDMyX3QgaW5kZXgpIHsKKyAgICAgICAgbUNvbG9yVGFyZ2V0c1tpbmRleF0gPSBjb2xvcjsKKyAgICAgICAgbURpcnR5ID0gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBzZXREZXB0aFRhcmdldChEcnZBbGxvY2F0aW9uICpkZXB0aCkgeworICAgICAgICBtRGVwdGhUYXJnZXQgPSBkZXB0aDsKKyAgICAgICAgbURpcnR5ID0gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBzZXREaW1lbnNpb25zKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorcHJvdGVjdGVkOgorICAgIHVpbnQzMl90IG1GQk9JZDsKKyAgICBEcnZBbGxvY2F0aW9uICoqbUNvbG9yVGFyZ2V0czsKKyAgICB1aW50MzJfdCBtQ29sb3JUYXJnZXRzQ291bnQ7CisgICAgRHJ2QWxsb2NhdGlvbiAqbURlcHRoVGFyZ2V0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisKKyAgICBib29sIG1EaXJ0eTsKKworICAgIGJvb2wgcmVuZGVyVG9GcmFtZWJ1ZmZlcigpOworICAgIHZvaWQgY2hlY2tFcnJvcihjb25zdCBhbmRyb2lkOjpyZW5kZXJzY3JpcHQ6OkNvbnRleHQgKnJzYyk7CisgICAgdm9pZCBzZXRDb2xvckF0dGFjaG1lbnQoKTsKKyAgICB2b2lkIHNldERlcHRoQXR0YWNobWVudCgpOworfTsKKworI2VuZGlmIC8vX1JTRF9GUkFNRUJVRkZFUl9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkR0wuY3BwIGIvbGlicy9ycy9kcml2ZXIvcnNkR0wuY3BwCmluZGV4IGE3MDU4OWIuLjNmZjAzYjQgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvZHJpdmVyL3JzZEdMLmNwcAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RHTC5jcHAKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJyc0NvbnRleHQuaCIKICNpbmNsdWRlICJyc2RTaGFkZXJDYWNoZS5oIgogI2luY2x1ZGUgInJzZFZlcnRleEFycmF5LmgiCisjaW5jbHVkZSAicnNkRnJhbWVCdWZmZXJPYmouaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMjk0LDYgKzI5NSw3IEBACiAgICAgZGMtPmdsLnNoYWRlckNhY2hlID0gbmV3IFJzZFNoYWRlckNhY2hlKCk7CiAgICAgZGMtPmdsLnZlcnRleEFycmF5U3RhdGUgPSBuZXcgUnNkVmVydGV4QXJyYXlTdGF0ZSgpOwogICAgIGRjLT5nbC52ZXJ0ZXhBcnJheVN0YXRlLT5pbml0KGRjLT5nbC5nbC5tYXhWZXJ0ZXhBdHRyaWJzKTsKKyAgICBkYy0+Z2wuY3VycmVudEZyYW1lQnVmZmVyID0gTlVMTDsKIAogICAgIExPR1YoImluaXRHTFRocmVhZCBlbmQgJXAiLCByc2MpOwogICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkR0wuaCBiL2xpYnMvcnMvZHJpdmVyL3JzZEdMLmgKaW5kZXggMDFjODQzOC4uMGQ1YjdlNyAxMDA2NDQKLS0tIGEvbGlicy9ycy9kcml2ZXIvcnNkR0wuaAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RHTC5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIGNsYXNzIFJzZFNoYWRlckNhY2hlOwogY2xhc3MgUnNkVmVydGV4QXJyYXlTdGF0ZTsKK2NsYXNzIFJzZEZyYW1lQnVmZmVyT2JqOwogCiB0eXBlZGVmIHZvaWQgKCogSW52b2tlRnVuY190KSh2b2lkKTsKIHR5cGVkZWYgdm9pZCAoKldvcmtlckNhbGxiYWNrX3QpKHZvaWQgKnVzciwgdWludDMyX3QgaWR4KTsKQEAgLTY4LDYgKzY5LDcgQEAKICAgICB1aW50MzJfdCBoZWlnaHQ7CiAgICAgUnNkU2hhZGVyQ2FjaGUgKnNoYWRlckNhY2hlOwogICAgIFJzZFZlcnRleEFycmF5U3RhdGUgKnZlcnRleEFycmF5U3RhdGU7CisgICAgUnNkRnJhbWVCdWZmZXJPYmogKmN1cnJlbnRGcmFtZUJ1ZmZlcjsKIH0gUnNkR0w7CiAKIApkaWZmIC0tZ2l0IGEvbGlicy9ycy9kcml2ZXIvcnNkTWVzaE9iai5jcHAgYi9saWJzL3JzL2RyaXZlci9yc2RNZXNoT2JqLmNwcAppbmRleCBjMjIwYWMxLi40MzE1YzBkIDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RNZXNoT2JqLmNwcAorKysgYi9saWJzL3JzL2RyaXZlci9yc2RNZXNoT2JqLmNwcApAQCAtMTM4LDcgKzEzOCwxMCBAQAogCiAgICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IG1SU01lc2gtPm1IYWwuc3RhdGUudmVydGV4QnVmZmVyc0NvdW50OyBjdCsrKSB7CiAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKmFsbG9jID0gbVJTTWVzaC0+bUhhbC5zdGF0ZS52ZXJ0ZXhCdWZmZXJzW2N0XS5nZXQoKTsKLSAgICAgICAgcnNkQWxsb2NhdGlvblN5bmNBbGwocnNjLCBhbGxvYywgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOworICAgICAgICBEcnZBbGxvY2F0aW9uICpkcnYgPSAoRHJ2QWxsb2NhdGlvbiAqKWFsbG9jLT5tSGFsLmRydjsKKyAgICAgICAgaWYgKGRydi0+dXBsb2FkRGVmZXJyZWQpIHsKKyAgICAgICAgICAgIHJzZEFsbG9jYXRpb25TeW5jQWxsKHJzYywgYWxsb2MsIFJTX0FMTE9DQVRJT05fVVNBR0VfU0NSSVBUKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzIHdpdGggZWl0aGVyIGJ1ZmZlciBpbmZvcm1hdGlvbiBvciBkYXRhIHB0ciBiYXNlZCBvbiB0aGVpciBjdXJyZW50IHN0YXRlCkBAIC0xNjMsNyArMTY2LDkgQEAKICAgICBjb25zdCBBbGxvY2F0aW9uICppZHhBbGxvYyA9IHByaW0tPm1JbmRleEJ1ZmZlci5nZXQoKTsKICAgICBpZiAoaWR4QWxsb2MpIHsKICAgICAgICAgRHJ2QWxsb2NhdGlvbiAqZHJ2QWxsb2MgPSAoRHJ2QWxsb2NhdGlvbiAqKWlkeEFsbG9jLT5tSGFsLmRydjsKLSAgICAgICAgcnNkQWxsb2NhdGlvblN5bmNBbGwocnNjLCBpZHhBbGxvYywgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOworICAgICAgICBpZiAoZHJ2QWxsb2MtPnVwbG9hZERlZmVycmVkKSB7CisgICAgICAgICAgICByc2RBbGxvY2F0aW9uU3luY0FsbChyc2MsIGlkeEFsbG9jLCBSU19BTExPQ0FUSU9OX1VTQUdFX1NDUklQVCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZHJ2QWxsb2MtPmJ1ZmZlcklEKSB7CiAgICAgICAgICAgICBnbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGRydkFsbG9jLT5idWZmZXJJRCk7CmRpZmYgLS1naXQgYS9saWJzL3JzL2RyaXZlci9yc2RSdW50aW1lU3R1YnMuY3BwIGIvbGlicy9ycy9kcml2ZXIvcnNkUnVudGltZVN0dWJzLmNwcAppbmRleCA5Y2JmZjk1Li4yNTMwMmFhIDEwMDY0NAotLS0gYS9saWJzL3JzL2RyaXZlci9yc2RSdW50aW1lU3R1YnMuY3BwCisrKyBiL2xpYnMvcnMvZHJpdmVyL3JzZFJ1bnRpbWVTdHVicy5jcHAKQEAgLTg4LDYgKzg4LDMzIEBACiAgICAgcnNyQWxsb2NhdGlvblN5bmNBbGwocnNjLCBzYywgYSwgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOwogfQogCitzdGF0aWMgdm9pZCBTQ19BbGxvY2F0aW9uQ29weTFEUmFuZ2UoQWxsb2NhdGlvbiAqZHN0QWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0T2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdE1pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNPZmYsIHVpbnQzMl90IHNyY01pcCkgeworICAgIEdFVF9UTFMoKTsKKyAgICByc3JBbGxvY2F0aW9uQ29weTFEUmFuZ2UocnNjLCBkc3RBbGxvYywgZHN0T2ZmLCBkc3RNaXAsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNBbGxvYywgc3JjT2ZmLCBzcmNNaXApOworfQorCitzdGF0aWMgdm9pZCBTQ19BbGxvY2F0aW9uQ29weTJEUmFuZ2UoQWxsb2NhdGlvbiAqZHN0QWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0WG9mZiwgdWludDMyX3QgZHN0WW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RNaXAsIHVpbnQzMl90IGRzdEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNYb2ZmLCB1aW50MzJfdCBzcmNZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY01pcCwgdWludDMyX3Qgc3JjRmFjZSkgeworICAgIEdFVF9UTFMoKTsKKyAgICByc3JBbGxvY2F0aW9uQ29weTJEUmFuZ2UocnNjLCBkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WG9mZiwgZHN0WW9mZiwgZHN0TWlwLCBkc3RGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWG9mZiwgc3JjWW9mZiwgc3JjTWlwLCBzcmNGYWNlKTsKK30KKworCiBjb25zdCBBbGxvY2F0aW9uICogU0NfZ2V0QWxsb2NhdGlvbihjb25zdCB2b2lkICpwdHIpIHsKICAgICBHRVRfVExTKCk7CiAgICAgcmV0dXJuIHJzckdldEFsbG9jYXRpb24ocnNjLCBzYywgcHRyKTsKQEAgLTU2Niw4ICs1OTMsMTEgQEAKICAgICB7ICJfWjIxcnNBbGxvY2F0aW9uTWFya0RpcnR5MTNyc19hbGxvY2F0aW9uIiwgKHZvaWQgKikmU0NfQWxsb2NhdGlvblN5bmNBbGwsIHRydWUgfSwKICAgICB7ICJfWjIwcnNnQWxsb2NhdGlvblN5bmNBbGwxM3JzX2FsbG9jYXRpb24iLCAodm9pZCAqKSZTQ19BbGxvY2F0aW9uU3luY0FsbCwgZmFsc2UgfSwKICAgICB7ICJfWjIwcnNnQWxsb2NhdGlvblN5bmNBbGwxM3JzX2FsbG9jYXRpb25qIiwgKHZvaWQgKikmU0NfQWxsb2NhdGlvblN5bmNBbGwyLCBmYWxzZSB9LAorICAgIHsgIl9aMjByc2dBbGxvY2F0aW9uU3luY0FsbDEzcnNfYWxsb2NhdGlvbjI0cnNfYWxsb2NhdGlvbl91c2FnZV90eXBlIiwgKHZvaWQgKikmU0NfQWxsb2NhdGlvblN5bmNBbGwyLCBmYWxzZSB9LAogICAgIHsgIl9aMTVyc0dldEFsbG9jYXRpb25QS3YiLCAodm9pZCAqKSZTQ19HZXRBbGxvY2F0aW9uLCB0cnVlIH0sCiAKKyAgICB7ICJfWjIzcnNBbGxvY2F0aW9uQ29weTFEUmFuZ2UxM3JzX2FsbG9jYXRpb25qampTX2pqIiwgKHZvaWQgKikmU0NfQWxsb2NhdGlvbkNvcHkxRFJhbmdlLCBmYWxzZSB9LAorICAgIHsgIl9aMjNyc0FsbG9jYXRpb25Db3B5MkRSYW5nZTEzcnNfYWxsb2NhdGlvbmpqajI2cnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2VqalNfampqUzBfIiwgKHZvaWQgKikmU0NfQWxsb2NhdGlvbkNvcHkyRFJhbmdlLCBmYWxzZSB9LAogCiAgICAgLy8gTWVzc2FnaW5nCiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnMuc3BlYyBiL2xpYnMvcnMvcnMuc3BlYwppbmRleCA4N2Q3NjRkLi45NjNhNmU3IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzLnNwZWMKKysrIGIvbGlicy9ycy9ycy5zcGVjCkBAIC0yMDksNiArMjA5LDIxIEBACiAJcGFyYW0gdWludDMyX3QgZGltWQogCX0KIAorQWxsb2NhdGlvbkNvcHkyRFJhbmdlIHsKKwlwYXJhbSBSc0FsbG9jYXRpb24gZGVzdAorCXBhcmFtIHVpbnQzMl90IGRlc3RYb2ZmCisJcGFyYW0gdWludDMyX3QgZGVzdFlvZmYKKwlwYXJhbSB1aW50MzJfdCBkZXN0TWlwCisJcGFyYW0gdWludDMyX3QgZGVzdEZhY2UKKwlwYXJhbSB1aW50MzJfdCB3aWR0aAorCXBhcmFtIHVpbnQzMl90IGhlaWdodAorCXBhcmFtIFJzQWxsb2NhdGlvbiBzcmMKKwlwYXJhbSB1aW50MzJfdCBzcmNYb2ZmCisJcGFyYW0gdWludDMyX3Qgc3JjWW9mZgorCXBhcmFtIHVpbnQzMl90IHNyY01pcAorCXBhcmFtIHVpbnQzMl90IHNyY0ZhY2UKKwl9CisKIFNhbXBsZXJDcmVhdGUgewogICAgIHBhcmFtIFJzU2FtcGxlclZhbHVlIG1hZ0ZpbHRlcgogICAgIHBhcmFtIFJzU2FtcGxlclZhbHVlIG1pbkZpbHRlcgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwIGIvbGlicy9ycy9yc0FsbG9jYXRpb24uY3BwCmluZGV4IDA1NDEyYzcuLmYzZTBjMGEgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmNwcAorKysgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5jcHAKQEAgLTE2OCwxMyArMTY4LDEwIEBACiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6YWRkUHJvZ3JhbVRvRGlydHkoY29uc3QgUHJvZ3JhbSAqcCkgewotI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIG1Ub0RpcnR5TGlzdC5wdXNoKHApOwotI2VuZGlmIC8vQU5EUk9JRF9SU19TRVJJQUxJWkUKIH0KIAogdm9pZCBBbGxvY2F0aW9uOjpyZW1vdmVQcm9ncmFtVG9EaXJ0eShjb25zdCBQcm9ncmFtICpwKSB7Ci0jaWZuZGVmIEFORFJPSURfUlNfU0VSSUFMSVpFCiAgICAgZm9yIChzaXplX3QgY3Q9MDsgY3QgPCBtVG9EaXJ0eUxpc3Quc2l6ZSgpOyBjdCsrKSB7CiAgICAgICAgIGlmIChtVG9EaXJ0eUxpc3RbY3RdID09IHApIHsKICAgICAgICAgICAgIG1Ub0RpcnR5TGlzdC5yZW1vdmVBdChjdCk7CkBAIC0xODIsNyArMTc5LDYgQEAKICAgICAgICAgfQogICAgIH0KICAgICByc0Fzc2VydCgwKTsKLSNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6ZHVtcExPR1YoY29uc3QgY2hhciAqcHJlZml4KSBjb25zdCB7CkBAIC0yNTQsMTEgKzI1MCw5IEBACiB9CiAKIHZvaWQgQWxsb2NhdGlvbjo6c2VuZERpcnR5KGNvbnN0IENvbnRleHQgKnJzYykgY29uc3QgewotI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIGZvciAoc2l6ZV90IGN0PTA7IGN0IDwgbVRvRGlydHlMaXN0LnNpemUoKTsgY3QrKykgewogICAgICAgICBtVG9EaXJ0eUxpc3RbY3RdLT5mb3JjZURpcnR5KCk7CiAgICAgfQotI2VuZGlmIC8vQU5EUk9JRF9SU19TRVJJQUxJWkUKICAgICBtUlNDLT5tSGFsLmZ1bmNzLmFsbG9jYXRpb24ubWFya0RpcnR5KHJzYywgdGhpcyk7CiB9CiAKQEAgLTMxMiw4ICszMDYsNiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLwogLy8KLSNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKQEAgLTQxMywyNSArNDA1LDI1IEBACiB9CiAKIHZvaWQgcnNpX0FsbG9jYXRpb24xRERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IGxvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IHNpemVCeXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemVCeXRlcykgewogICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKICAgICBhLT5kYXRhKHJzYywgeG9mZiwgbG9kLCBjb3VudCwgZGF0YSwgc2l6ZUJ5dGVzKTsKIH0KIAogdm9pZCByc2lfQWxsb2NhdGlvbjJERWxlbWVudERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IGxvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHVpbnQzMl90IGVvZmYsIHVpbnQzMl90IHNpemVCeXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGVvZmYsIHVpbnQzMl90IHNpemVCeXRlcykgeyAvLyBUT0RPOiB0aGlzIHNlZW1zIHdyb25nLCBlb2ZmIGFuZCBzaXplQnl0ZXMgbWF5IGJlIHN3YXBwZWQKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CiAgICAgYS0+ZWxlbWVudERhdGEocnNjLCB4LCB5LCBkYXRhLCBlb2ZmLCBzaXplQnl0ZXMpOwogfQogCiB2b2lkIHJzaV9BbGxvY2F0aW9uMURFbGVtZW50RGF0YShDb250ZXh0ICpyc2MsIFJzQWxsb2NhdGlvbiB2YSwgdWludDMyX3QgeCwgdWludDMyX3QgbG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZW9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZW9mZiwgdWludDMyX3Qgc2l6ZUJ5dGVzKSB7IC8vIFRPRE86IHRoaXMgc2VlbXMgd3JvbmcsIGVvZmYgYW5kIHNpemVCeXRlcyBtYXkgYmUgc3dhcHBlZAogICAgIEFsbG9jYXRpb24gKmEgPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHZhKTsKICAgICBhLT5lbGVtZW50RGF0YShyc2MsIHgsIGRhdGEsIGVvZmYsIHNpemVCeXRlcyk7CiB9CiAKIHZvaWQgcnNpX0FsbG9jYXRpb24yRERhdGEoQ29udGV4dCAqcnNjLCBSc0FsbG9jYXRpb24gdmEsIHVpbnQzMl90IHhvZmYsIHVpbnQzMl90IHlvZmYsIHVpbnQzMl90IGxvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplQnl0ZXMpIHsKICAgICBBbGxvY2F0aW9uICphID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPih2YSk7CiAgICAgYS0+ZGF0YShyc2MsIHhvZmYsIHlvZmYsIGxvZCwgZmFjZSwgdywgaCwgZGF0YSwgc2l6ZUJ5dGVzKTsKIH0KQEAgLTU0MCw2ICs1MzIsMjMgQEAKICAgICByZXR1cm4gdGV4QWxsb2M7CiB9CiAKK3ZvaWQgcnNpX0FsbG9jYXRpb25Db3B5MkRSYW5nZShDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIGRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFhvZmYsIHVpbnQzMl90IGRzdFlvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0TWlwLCB1aW50MzJfdCBkc3RGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uIHNyY0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1hvZmYsIHVpbnQzMl90IHNyY1lvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjTWlwLCB1aW50MzJfdCBzcmNGYWNlKSB7CisgICAgQWxsb2NhdGlvbiAqZHN0ID0gc3RhdGljX2Nhc3Q8QWxsb2NhdGlvbiAqPihkc3RBbGxvYyk7CisgICAgQWxsb2NhdGlvbiAqc3JjPSBzdGF0aWNfY2FzdDxBbGxvY2F0aW9uICo+KHNyY0FsbG9jKTsKKyAgICByc2MtPm1IYWwuZnVuY3MuYWxsb2NhdGlvbi5hbGxvY0RhdGEyRChyc2MsIGRzdCwgZHN0WG9mZiwgZHN0WW9mZiwgZHN0TWlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSc0FsbG9jYXRpb25DdWJlbWFwRmFjZSlkc3RGYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBzcmNYb2ZmLCBzcmNZb2ZmLHNyY01pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2Upc3JjRmFjZSk7Cit9CisKIH0KIH0KIApAQCAtNTQ5LDUgKzU1OCwzIEBACiAKICAgICByZXR1cm4gYS0+Z2V0VHlwZSgpOwogfQotCi0jZW5kaWYgLy9BTkRST0lEX1JTX1NFUklBTElaRQpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0FsbG9jYXRpb24uaCBiL2xpYnMvcnMvcnNBbGxvY2F0aW9uLmgKaW5kZXggNWNmNjI5Mi4uZjUzOGRkMSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0FsbG9jYXRpb24uaAorKysgYi9saWJzL3JzL3JzQWxsb2NhdGlvbi5oCkBAIC01OSw3ICs1OSw2IEBACiAKICAgICBzdGF0aWMgQWxsb2NhdGlvbiAqIGNyZWF0ZUFsbG9jYXRpb24oQ29udGV4dCAqcnNjLCBjb25zdCBUeXBlICosIHVpbnQzMl90IHVzYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb25NaXBtYXBDb250cm9sIG1jID0gUlNfQUxMT0NBVElPTl9NSVBNQVBfTk9ORSk7Ci0KICAgICB2aXJ0dWFsIH5BbGxvY2F0aW9uKCk7CiAgICAgdm9pZCB1cGRhdGVDYWNoZSgpOwogCkBAIC0xMjEsMTQgKzEyMCw2IEBACiAKIHByaXZhdGU6CiAgICAgQWxsb2NhdGlvbihDb250ZXh0ICpyc2MsIGNvbnN0IFR5cGUgKiwgdWludDMyX3QgdXNhZ2VzLCBSc0FsbG9jYXRpb25NaXBtYXBDb250cm9sIG1jKTsKLQotICAgIHZvaWQgdXBsb2FkMkRUZXh0dXJlKGJvb2wgaXNGaXJzdFVwbG9hZCk7Ci0gICAgdm9pZCB1cGRhdGUyRFRleHR1cmUoY29uc3Qgdm9pZCAqcHRyLCB1aW50MzJfdCB4b2ZmLCB1aW50MzJfdCB5b2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZmFjZSwgdWludDMyX3QgdywgdWludDMyX3QgaCk7Ci0KLSAgICB2b2lkIGFsbG9jU2NyaXB0TWVtb3J5KCk7Ci0gICAgdm9pZCBmcmVlU2NyaXB0TWVtb3J5KCk7Ci0KIH07CiAKIH0KZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNDb250ZXh0LmNwcCBiL2xpYnMvcnMvcnNDb250ZXh0LmNwcAppbmRleCBiYWI1YzU4Li40NGU5ZDg5IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzQ29udGV4dC5jcHAKKysrIGIvbGlicy9ycy9yc0NvbnRleHQuY3BwCkBAIC05Miw5ICs5MiwxMyBAQAogfQogCiB1aW50NjRfdCBDb250ZXh0OjpnZXRUaW1lKCkgY29uc3QgeworI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIHN0cnVjdCB0aW1lc3BlYyB0OwogICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdCk7CiAgICAgcmV0dXJuIHQudHZfbnNlYyArICgodWludDY0X3QpdC50dl9zZWMgKiAxMDAwICogMTAwMCAqIDEwMDApOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCiB9CiAKIHZvaWQgQ29udGV4dDo6dGltZXJSZXNldCgpIHsKQEAgLTIwMCwxMSArMjA0LDExIEBACiAKIHZvaWQgKiBDb250ZXh0Ojp0aHJlYWRQcm9jKHZvaWQgKnZyc2MpIHsKICAgICBDb250ZXh0ICpyc2MgPSBzdGF0aWNfY2FzdDxDb250ZXh0ICo+KHZyc2MpOworI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIHJzYy0+bU5hdGl2ZVRocmVhZElkID0gZ2V0dGlkKCk7Ci0KICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIHJzYy0+bU5hdGl2ZVRocmVhZElkLCBBTkRST0lEX1BSSU9SSVRZX0RJU1BMQVkpOwogICAgIHJzYy0+bVRocmVhZFByaW9yaXR5ID0gQU5EUk9JRF9QUklPUklUWV9ESVNQTEFZOwotCisjZW5kaWYgLy9BTkRST0lEX1JTX1NFUklBTElaRQogICAgIHJzYy0+cHJvcHMubUxvZ1RpbWVzID0gZ2V0UHJvcCgiZGVidWcucnMucHJvZmlsZSIpOwogICAgIHJzYy0+cHJvcHMubUxvZ1NjcmlwdHMgPSBnZXRQcm9wKCJkZWJ1Zy5ycy5zY3JpcHQiKTsKICAgICByc2MtPnByb3BzLm1Mb2dPYmplY3RzID0gZ2V0UHJvcCgiZGVidWcucnMub2JqZWN0Iik7CkBAIC0zMzAsMTAgKzMzNCwxNiBAQAogICAgIG1PYmpIZWFkID0gTlVMTDsKICAgICBtRXJyb3IgPSBSU19FUlJPUl9OT05FOwogICAgIG1EUEkgPSA5NjsKKyAgICBtSXNDb250ZXh0TGl0ZSA9IGZhbHNlOwogfQogCiBDb250ZXh0ICogQ29udGV4dDo6Y3JlYXRlQ29udGV4dChEZXZpY2UgKmRldiwgY29uc3QgUnNTdXJmYWNlQ29uZmlnICpzYykgewogICAgIENvbnRleHQgKiByc2MgPSBuZXcgQ29udGV4dCgpOworCisgICAgLy8gVGVtcG9yYXJ5IHRvIGF2b2lkIGJyZWFraW5nIHRoZSB0b29scworICAgIGlmICghZGV2KSB7CisgICAgICAgIHJldHVybiByc2M7CisgICAgfQogICAgIGlmICghcnNjLT5pbml0Q29udGV4dChkZXYsIHNjKSkgewogICAgICAgICBkZWxldGUgcnNjOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM0MSw2ICszNTEsMTIgQEAKICAgICByZXR1cm4gcnNjOwogfQogCitDb250ZXh0ICogQ29udGV4dDo6Y3JlYXRlQ29udGV4dExpdGUoKSB7CisgICAgQ29udGV4dCAqIHJzYyA9IG5ldyBDb250ZXh0KCk7CisgICAgcnNjLT5tSXNDb250ZXh0TGl0ZSA9IHRydWU7CisgICAgcmV0dXJuIHJzYzsKK30KKwogYm9vbCBDb250ZXh0Ojppbml0Q29udGV4dChEZXZpY2UgKmRldiwgY29uc3QgUnNTdXJmYWNlQ29uZmlnICpzYykgewogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CiAKQEAgLTM5NSwyNiArNDExLDI4IEBACiBDb250ZXh0Ojp+Q29udGV4dCgpIHsKICAgICBMT0dWKCJDb250ZXh0Ojp+Q29udGV4dCIpOwogCi0gICAgbUlPLmNvcmVGbHVzaCgpOwotICAgIHJzQXNzZXJ0KG1FeGl0KTsKLSAgICBtRXhpdCA9IHRydWU7Ci0gICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIHZvaWQgKnJlczsKKyAgICBpZiAoIW1Jc0NvbnRleHRMaXRlKSB7CisgICAgICAgIG1JTy5jb3JlRmx1c2goKTsKKyAgICAgICAgcnNBc3NlcnQobUV4aXQpOworICAgICAgICBtRXhpdCA9IHRydWU7CisgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgdm9pZCAqcmVzOwogCi0gICAgbUlPLnNodXRkb3duKCk7Ci0gICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfam9pbihtVGhyZWFkSWQsICZyZXMpOworICAgICAgICBtSU8uc2h1dGRvd24oKTsKKyAgICAgICAgaW50IHN0YXR1cyA9IHB0aHJlYWRfam9pbihtVGhyZWFkSWQsICZyZXMpOwogCi0gICAgaWYgKG1IYWwuZnVuY3Muc2h1dGRvd25Ecml2ZXIpIHsKLSAgICAgICAgbUhhbC5mdW5jcy5zaHV0ZG93bkRyaXZlcih0aGlzKTsKKyAgICAgICAgaWYgKG1IYWwuZnVuY3Muc2h1dGRvd25Ecml2ZXIpIHsKKyAgICAgICAgICAgIG1IYWwuZnVuY3Muc2h1dGRvd25Ecml2ZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHbG9iYWwgc3RydWN0dXJlIGNsZWFudXAuCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CisgICAgICAgIGlmIChtRGV2KSB7CisgICAgICAgICAgICBtRGV2LT5yZW1vdmVDb250ZXh0KHRoaXMpOworICAgICAgICAgICAgbURldiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOwogICAgIH0KLQotICAgIC8vIEdsb2JhbCBzdHJ1Y3R1cmUgY2xlYW51cC4KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwotICAgIGlmIChtRGV2KSB7Ci0gICAgICAgIG1EZXYtPnJlbW92ZUNvbnRleHQodGhpcyk7Ci0gICAgICAgIG1EZXYgPSBOVUxMOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7CiAgICAgTE9HVigiQ29udGV4dDo6fkNvbnRleHQgZG9uZSIpOwogfQogCkBAIC01NDIsNyArNTYwLDcgQEAKIAogICAgIExPR0UoIiBSUyB3aWR0aCAlaSwgaGVpZ2h0ICVpIiwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICBMT0dFKCIgUlMgcnVubmluZyAlaSwgZXhpdCAlaSwgcGF1c2VkICVpIiwgbVJ1bm5pbmcsIG1FeGl0LCBtUGF1c2VkKTsKLSAgICBMT0dFKCIgUlMgcFRocmVhZElEICVsaSwgbmF0aXZlVGhyZWFkSUQgJWkiLCBtVGhyZWFkSWQsIG1OYXRpdmVUaHJlYWRJZCk7CisgICAgTE9HRSgiIFJTIHBUaHJlYWRJRCAlbGksIG5hdGl2ZVRocmVhZElEICVpIiwgKGxvbmcgaW50KW1UaHJlYWRJZCwgbU5hdGl2ZVRocmVhZElkKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTk1LDcgKzYxMyw3IEBACiAgICAgcnNjLT5zZXRGb250KGZvbnQpOwogfQogCi12b2lkIHJzaV9Bc3NpZ25OYW1lKENvbnRleHQgKnJzYywgUnNPYmplY3RCYXNlIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgbmFtZV9sZW5ndGgpIHsKK3ZvaWQgcnNpX0Fzc2lnbk5hbWUoQ29udGV4dCAqcnNjLCBSc09iamVjdEJhc2Ugb2JqLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW5ndGgpIHsKICAgICBPYmplY3RCYXNlICpvYiA9IHN0YXRpY19jYXN0PE9iamVjdEJhc2UgKj4ob2JqKTsKICAgICByc2MtPmFzc2lnbk5hbWUob2IsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKIH0KQEAgLTYyNyw3ICs2NDUsNyBAQAogfQogCiB2b2lkIHJzaV9Db250ZXh0RGVzdHJveVdvcmtlcihDb250ZXh0ICpyc2MpIHsKLSAgICByc2MtPmRlc3Ryb3lXb3JrZXJUaHJlYWRSZXNvdXJjZXMoKTs7CisgICAgcnNjLT5kZXN0cm95V29ya2VyVGhyZWFkUmVzb3VyY2VzKCk7CiB9CiAKIHZvaWQgcnNpX0NvbnRleHREZXN0cm95KENvbnRleHQgKnJzYykgewpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc0NvbnRleHQuaCBiL2xpYnMvcnMvcnNDb250ZXh0LmgKaW5kZXggNGJhMDBmZS4uMzA5ZmU5NSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0NvbnRleHQuaAorKysgYi9saWJzL3JzL3JzQ29udGV4dC5oCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlICJyc19oYWwuaCIKIAotI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogI2luY2x1ZGUgInJzTXV0ZXguaCIKICNpbmNsdWRlICJyc1RocmVhZElPLmgiCiAjaW5jbHVkZSAicnNNYXRyaXg0eDQuaCIKQEAgLTQyLDggKzQxLDYgQEAKICNpbmNsdWRlICJyc2dBcGlTdHJ1Y3RzLmgiCiAjaW5jbHVkZSAicnNMb2NrbGVzc0ZpZm8uaCIKIAotI2VuZGlmIC8vIEFORFJPSURfUlNfU0VSSUFMSVpFCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02Nyw4ICs2NCw2IEBACiAjZGVmaW5lIENIRUNLX09CSl9PUl9OVUxMKG8pCiAjZW5kaWYKIAotI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQotCiBjbGFzcyBDb250ZXh0IHsKIHB1YmxpYzoKICAgICBzdHJ1Y3QgSGFsIHsKQEAgLTc5LDYgKzc0LDcgQEAKICAgICBIYWwgbUhhbDsKIAogICAgIHN0YXRpYyBDb250ZXh0ICogY3JlYXRlQ29udGV4dChEZXZpY2UgKiwgY29uc3QgUnNTdXJmYWNlQ29uZmlnICpzYyk7CisgICAgc3RhdGljIENvbnRleHQgKiBjcmVhdGVDb250ZXh0TGl0ZSgpOwogICAgIH5Db250ZXh0KCk7CiAKICAgICBzdGF0aWMgcHRocmVhZF9tdXRleF90IGdJbml0TXV0ZXg7CkBAIC0yNDMsNiArMjM5LDcgQEAKICAgICBzdGF0aWMgdm9pZCAqIGhlbHBlclRocmVhZFByb2Modm9pZCAqKTsKIAogICAgIGJvb2wgbUhhc1N1cmZhY2U7CisgICAgYm9vbCBtSXNDb250ZXh0TGl0ZTsKIAogICAgIFZlY3RvcjxPYmplY3RCYXNlICo+IG1OYW1lczsKIApAQCAtMjU5LDQ2ICsyNTYsNiBAQAogICAgIHVpbnQzMl90IG1BdmVyYWdlRlBTOwogfTsKIAotI2Vsc2UKLQotY2xhc3MgQ29udGV4dCB7Ci1wdWJsaWM6Ci0gICAgQ29udGV4dCgpIHsKLSAgICAgICAgbU9iakhlYWQgPSBOVUxMOwotICAgIH0KLSAgICB+Q29udGV4dCgpIHsKLSAgICAgICAgT2JqZWN0QmFzZTo6emVyb0FsbFVzZXJSZWYodGhpcyk7Ci0gICAgfQotCi0gICAgc3RydWN0IEhhbCB7Ci0gICAgICAgIHZvaWQgKiBkcnY7Ci0KLSAgICAgICAgUnNkSGFsRnVuY3Rpb25zIGZ1bmNzOwotICAgIH07Ci0gICAgSGFsIG1IYWw7Ci0KLSAgICBFbGVtZW50U3RhdGUgbVN0YXRlRWxlbWVudDsKLSAgICBUeXBlU3RhdGUgbVN0YXRlVHlwZTsKLQotICAgIHN0cnVjdCB7Ci0gICAgICAgIGJvb2wgbUxvZ1RpbWVzOwotICAgICAgICBib29sIG1Mb2dTY3JpcHRzOwotICAgICAgICBib29sIG1Mb2dPYmplY3RzOwotICAgICAgICBib29sIG1Mb2dTaGFkZXJzOwotICAgICAgICBib29sIG1Mb2dTaGFkZXJzQXR0cjsKLSAgICAgICAgYm9vbCBtTG9nU2hhZGVyc1VuaWZvcm1zOwotICAgICAgICBib29sIG1Mb2dWaXN1YWw7Ci0gICAgfSBwcm9wczsKLQotICAgIHZvaWQgc2V0RXJyb3IoUnNFcnJvciBlLCBjb25zdCBjaGFyICptc2cgPSBOVUxMKSB7ICB9Ci0KLSAgICBtdXRhYmxlIGNvbnN0IE9iamVjdEJhc2UgKiBtT2JqSGVhZDsKLQotcHJvdGVjdGVkOgotCi19OwotI2VuZGlmIC8vQU5EUk9JRF9SU19TRVJJQUxJWkUKLQogfSAvLyByZW5kZXJzY3JpcHQKIH0gLy8gYW5kcm9pZAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRkJPQ2FjaGUuY3BwIGIvbGlicy9ycy9yc0ZCT0NhY2hlLmNwcAppbmRleCA2OTYwZWYyLi5jNWM2NGMyIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRkJPQ2FjaGUuY3BwCisrKyBiL2xpYnMvcnMvcnNGQk9DYWNoZS5jcHAKQEAgLTgwLDE2ICs4MCw2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobUhhbC5zdGF0ZS5kZXB0aFRhcmdldC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1IYWwuc3RhdGUuZGVwdGhUYXJnZXQtPnN5bmNBbGwocnNjLCBSU19BTExPQ0FUSU9OX1VTQUdFX1NDUklQVCk7Ci0gICAgfQotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1IYWwuc3RhdGUuY29sb3JUYXJnZXRzQ291bnQ7IGkgKyspIHsKLSAgICAgICAgaWYgKG1IYWwuc3RhdGUuY29sb3JUYXJnZXRzW2ldLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1IYWwuc3RhdGUuY29sb3JUYXJnZXRzW2ldLT5zeW5jQWxsKHJzYywgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcnNjLT5tSGFsLmZ1bmNzLmZyYW1lYnVmZmVyLnNldEFjdGl2ZShyc2MsIHRoaXMpOwogCiAgICAgbURpcnR5ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzRmlmb1NvY2tldC5jcHAgYi9saWJzL3JzL3JzRmlmb1NvY2tldC5jcHAKaW5kZXggODQ4YmJhNS4uOGI4MDA4ZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc0ZpZm9Tb2NrZXQuY3BwCisrKyBiL2xpYnMvcnMvcnNGaWZvU29ja2V0LmNwcApAQCAtNzAsOSArNzAsOSBAQAogfQogCiB2b2lkIEZpZm9Tb2NrZXQ6OnJlYWRSZXR1cm4oY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGJ5dGVzKSB7Ci0gICAgTE9HRSgicmVhZFJldHVybiAlcCAlaSIsIGRhdGEsIGJ5dGVzKTsKKyAgICBMT0dFKCJyZWFkUmV0dXJuICVwICVadSIsIGRhdGEsIGJ5dGVzKTsKICAgICBzaXplX3QgcmV0ID0gOjpzZW5kKHN2WzFdLCBkYXRhLCBieXRlcywgMCk7Ci0gICAgTE9HRSgicmVhZFJldHVybiAlaSIsIHJldCk7CisgICAgTE9HRSgicmVhZFJldHVybiAlWnUiLCByZXQpOwogICAgIHJzQXNzZXJ0KHJldCA9PSBieXRlcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGb250LmNwcCBiL2xpYnMvcnMvcnNGb250LmNwcAppbmRleCBiNjI1NTA0Li5jZTY3NGY0IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzRm9udC5jcHAKKysrIGIvbGlicy9ycy9yc0ZvbnQuY3BwCkBAIC0yMSw5ICsyMSwxMSBAQAogI2luY2x1ZGUgInJzUHJvZ3JhbUZyYWdtZW50LmgiCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAorI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICiAjaW5jbHVkZSBGVF9CSVRNQVBfSAorI2VuZGlmIC8vQU5EUk9JRF9SU19TRVJJQUxJWkUKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwpAQCAtMzUsNiArMzcsNyBAQAogfQogCiBib29sIEZvbnQ6OmluaXQoY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgZm9udFNpemUsIHVpbnQzMl90IGRwaSwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgZGF0YUxlbikgeworI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgTE9HRSgiUmVpbml0aWFsaXphdGlvbiBvZiBmb250cyBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTY1LDYgKzY4LDcgQEAKICAgICBtSGFzS2VybmluZyA9IEZUX0hBU19LRVJOSU5HKG1GYWNlKTsKIAogICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisjZW5kaWYgLy9BTkRST0lEX1JTX1NFUklBTElaRQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yMzAsNiArMjM0LDcgQEAKIH0KIAogdm9pZCBGb250Ojp1cGRhdGVHbHlwaENhY2hlKENhY2hlZEdseXBoSW5mbyAqZ2x5cGgpIHsKKyNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKICAgICBGVF9FcnJvciBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIG1GYWNlLCBnbHlwaC0+bUdseXBoSW5kZXgsIEZUX0xPQURfUkVOREVSICk7CiAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgIExPR0UoIkNvdWxkbid0IGxvYWQgZ2x5cGguIik7CkBAIC0yNzAsMTUgKzI3NSwxNiBAQAogICAgIGdseXBoLT5tQml0bWFwTWluViA9IChmbG9hdClzdGFydFkgLyAoZmxvYXQpY2FjaGVIZWlnaHQ7CiAgICAgZ2x5cGgtPm1CaXRtYXBNYXhVID0gKGZsb2F0KWVuZFggLyAoZmxvYXQpY2FjaGVXaWR0aDsKICAgICBnbHlwaC0+bUJpdG1hcE1heFYgPSAoZmxvYXQpZW5kWSAvIChmbG9hdCljYWNoZUhlaWdodDsKKyNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCiB9CiAKIEZvbnQ6OkNhY2hlZEdseXBoSW5mbyAqRm9udDo6Y2FjaGVHbHlwaCh1aW50MzJfdCBnbHlwaCkgewogICAgIENhY2hlZEdseXBoSW5mbyAqbmV3R2x5cGggPSBuZXcgQ2FjaGVkR2x5cGhJbmZvKCk7CiAgICAgbUNhY2hlZEdseXBocy5hZGQoZ2x5cGgsIG5ld0dseXBoKTsKLQorI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIG5ld0dseXBoLT5tR2x5cGhJbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KG1GYWNlLCBnbHlwaCk7CiAgICAgbmV3R2x5cGgtPm1Jc1ZhbGlkID0gZmFsc2U7Ci0KKyNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCiAgICAgdXBkYXRlR2x5cGhDYWNoZShuZXdHbHlwaCk7CiAKICAgICByZXR1cm4gbmV3R2x5cGg7CkBAIC0zMDksOSArMzE1LDExIEBACiB9CiAKIEZvbnQ6On5Gb250KCkgeworI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIGlmIChtRmFjZSkgewogICAgICAgICBGVF9Eb25lX0ZhY2UobUZhY2UpOwogICAgIH0KKyNlbmRpZgogCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZWRHbHlwaHMuc2l6ZSgpOyBpICsrKSB7CiAgICAgICAgIENhY2hlZEdseXBoSW5mbyAqZ2x5cGggPSBtQ2FjaGVkR2x5cGhzLnZhbHVlQXQoaSk7CkBAIC0zMjQsNyArMzMyLDkgQEAKICAgICBtTWF4TnVtYmVyT2ZRdWFkcyA9IDEwMjQ7CiAgICAgbUN1cnJlbnRRdWFkSW5kZXggPSAwOwogICAgIG1SU0MgPSBOVUxMOworI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogICAgIG1MaWJyYXJ5ID0gTlVMTDsKKyNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCiAKICAgICAvLyBHZXQgdGhlIHJlbmRlcmVyIHByb3BlcnRpZXMKICAgICBjaGFyIHByb3BlcnR5W1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0zNjMsNyArMzczLDcgQEAKIAogICAgIHJzQXNzZXJ0KCFtQWN0aXZlRm9udHMuc2l6ZSgpKTsKIH0KLQorI2lmbmRlZiBBTkRST0lEX1JTX1NFUklBTElaRQogRlRfTGlicmFyeSBGb250U3RhdGU6OmdldExpYigpIHsKICAgICBpZiAoIW1MaWJyYXJ5KSB7CiAgICAgICAgIEZUX0Vycm9yIGVycm9yID0gRlRfSW5pdF9GcmVlVHlwZSgmbUxpYnJhcnkpOwpAQCAtMzc1LDYgKzM4NSw4IEBACiAKICAgICByZXR1cm4gbUxpYnJhcnk7CiB9CisjZW5kaWYgLy9BTkRST0lEX1JTX1NFUklBTElaRQorCiAKIHZvaWQgRm9udFN0YXRlOjppbml0KENvbnRleHQgKnJzYykgewogICAgIG1SU0MgPSByc2M7CkBAIC0zOTMsNiArNDA1LDcgQEAKICAgICB9CiB9CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKIGJvb2wgRm9udFN0YXRlOjpjYWNoZUJpdG1hcChGVF9CaXRtYXAgKmJpdG1hcCwgdWludDMyX3QgKnJldE9yaWdpblgsIHVpbnQzMl90ICpyZXRPcmlnaW5ZKSB7CiAgICAgLy8gSWYgdGhlIGdseXBoIGlzIHRvbyB0YWxsLCBkb24ndCBjYWNoZSBpdAogICAgIGlmICgodWludDMyX3QpYml0bWFwLT5yb3dzID4gbUNhY2hlTGluZXNbbUNhY2hlTGluZXMuc2l6ZSgpLTFdLT5tTWF4SGVpZ2h0KSB7CkBAIC00NjYsNiArNDc5LDcgQEAKIAogICAgIHJldHVybiB0cnVlOwogfQorI2VuZGlmIC8vQU5EUk9JRF9SU19TRVJJQUxJWkUKIAogdm9pZCBGb250U3RhdGU6OmluaXRSZW5kZXJTdGF0ZSgpIHsKICAgICBTdHJpbmc4IHNoYWRlclN0cmluZygidmFyeWluZyB2ZWMyIHZhclRleDA7XG4iKTsKQEAgLTc5MSwxMyArODA1LDE1IEBACiAgICAgbUNhY2hlTGluZXMuY2xlYXIoKTsKIAogICAgIG1EZWZhdWx0LmNsZWFyKCk7Ci0KKyNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKICAgICBpZiAobUxpYnJhcnkpIHsKICAgICAgICAgRlRfRG9uZV9GcmVlVHlwZSggbUxpYnJhcnkgKTsKICAgICAgICAgbUxpYnJhcnkgPSBOVUxMOwogICAgIH0KKyNlbmRpZiAvL0FORFJPSURfUlNfU0VSSUFMSVpFCiB9CiAKKyNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKIGJvb2wgRm9udFN0YXRlOjpDYWNoZVRleHR1cmVMaW5lOjpmaXRCaXRtYXAoRlRfQml0bWFwXyAqYml0bWFwLCB1aW50MzJfdCAqcmV0T3JpZ2luWCwgdWludDMyX3QgKnJldE9yaWdpblkpIHsKICAgICBpZiAoKHVpbnQzMl90KWJpdG1hcC0+cm93cyA+IG1NYXhIZWlnaHQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtODEzLDYgKzgyOSw3IEBACiAKICAgICByZXR1cm4gZmFsc2U7CiB9CisjZW5kaWYgLy9BTkRST0lEX1JTX1NFUklBTElaRQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNGb250LmggYi9saWJzL3JzL3JzRm9udC5oCmluZGV4IGQxOGMwZDkuLmIwZTE0MzAgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNGb250LmgKKysrIGIvbGlicy9ycy9yc0ZvbnQuaApAQCAtMTk5LDggKzE5OSwxMCBAQAogICAgIGZsb2F0IG1XaGl0ZVRocmVzaG9sZDsKIAogICAgIC8vIEZyZWUgdHlwZSBsaWJyYXJ5LCB3ZSBvbmx5IG5lZWQgb25lIGNvcHkKKyNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKICAgICBGVF9MaWJyYXJ5UmVjXyAqbUxpYnJhcnk7CiAgICAgRlRfTGlicmFyeVJlY18gKmdldExpYigpOworI2VuZGlmIC8vQU5EUk9JRF9SU19TRVJJQUxJWkUKICAgICBWZWN0b3I8Rm9udCo+IG1BY3RpdmVGb250czsKIAogICAgIC8vIFJlbmRlciBzdGF0ZSBmb3IgdGhlIGZvbnQKQEAgLTIxNyw3ICsyMTksOSBAQAogICAgICAgICByZXR1cm4gKHVpbnQ4X3QqKW1UZXh0VGV4dHVyZS0+Z2V0UHRyKCk7CiAgICAgfQogCisjaWZuZGVmIEFORFJPSURfUlNfU0VSSUFMSVpFCiAgICAgYm9vbCBjYWNoZUJpdG1hcChGVF9CaXRtYXBfICpiaXRtYXAsIHVpbnQzMl90ICpyZXRPcmlnaW5YLCB1aW50MzJfdCAqcmV0T3JpZ2luWSk7CisjZW5kaWYgLy9BTkRST0lEX1JTX1NFUklBTElaRQogICAgIGNvbnN0IFR5cGUqIGdldENhY2hlVGV4dHVyZVR5cGUoKSB7CiAgICAgICAgIHJldHVybiBtVGV4dFRleHR1cmUtPmdldFR5cGUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzTWVzaC5jcHAgYi9saWJzL3JzL3JzTWVzaC5jcHAKaW5kZXggNjJlMzg4Yy4uMzU5ZDA5ZiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc01lc2guY3BwCisrKyBiL2xpYnMvcnMvcnNNZXNoLmNwcApAQCAtMTYxLDggKzE2MSw2IEBACiAgICAgcmV0dXJuIG1lc2g7CiB9CiAKLSNpZm5kZWYgQU5EUk9JRF9SU19TRVJJQUxJWkUKLQogdm9pZCBNZXNoOjpyZW5kZXIoQ29udGV4dCAqcnNjKSBjb25zdCB7CiAgICAgZm9yICh1aW50MzJfdCBjdCA9IDA7IGN0IDwgbUhhbC5zdGF0ZS5wcmltaXRpdmVzQ291bnQ7IGN0ICsrKSB7CiAgICAgICAgIHJlbmRlclByaW1pdGl2ZShyc2MsIGN0KTsKQEAgLTI1NSw5ICsyNTMsOSBAQAogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CiAKIFJzTWVzaCByc2lfTWVzaENyZWF0ZShDb250ZXh0ICpyc2MsCi0gICAgICAgICAgICAgICAgICAgICAgUnNBbGxvY2F0aW9uICp2dHgsIHVpbnQzMl90IHZ0eENvdW50LAotICAgICAgICAgICAgICAgICAgICAgIFJzQWxsb2NhdGlvbiAqaWR4LCB1aW50MzJfdCBpZHhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcHJpbVR5cGUsIHVpbnQzMl90IHByaW1UeXBlQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gKiB2dHgsIHNpemVfdCB2dHhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gKiBpZHgsIHNpemVfdCBpZHhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqIHByaW1UeXBlLCBzaXplX3QgcHJpbVR5cGVDb3VudCkgewogICAgIHJzQXNzZXJ0KGlkeENvdW50ID09IHByaW1UeXBlQ291bnQpOwogICAgIE1lc2ggKnNtID0gbmV3IE1lc2gocnNjLCB2dHhDb3VudCwgaWR4Q291bnQpOwogICAgIHNtLT5pbmNVc2VyUmVmKCk7CkBAIC0zMDksNSArMzA3LDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbUZyYWdtZW50LmNwcCBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCmluZGV4IDA4MjNkODIuLjM1NmZmNzcgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtRnJhZ21lbnQuY3BwCkBAIC0xMjcsOCArMTI3LDggQEAKIG5hbWVzcGFjZSByZW5kZXJzY3JpcHQgewogCiBSc1Byb2dyYW1GcmFnbWVudCByc2lfUHJvZ3JhbUZyYWdtZW50Q3JlYXRlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoYWRlckxlbmd0aCwgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGFkZXJMZW5ndGgsIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFyYW1MZW5ndGgpIHsKICAgICBQcm9ncmFtRnJhZ21lbnQgKnBmID0gbmV3IFByb2dyYW1GcmFnbWVudChyc2MsIHNoYWRlclRleHQsIHNoYWRlckxlbmd0aCwgcGFyYW1zLCBwYXJhbUxlbmd0aCk7CiAgICAgcGYtPmluY1VzZXJSZWYoKTsKICAgICAvL0xPR0UoInJzaV9Qcm9ncmFtRnJhZ21lbnRDcmVhdGUgJXAiLCBwZik7CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAgYi9saWJzL3JzL3JzUHJvZ3JhbVZlcnRleC5jcHAKaW5kZXggZTY3OTBjYi4uMDU4YTQ1NiAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1Byb2dyYW1WZXJ0ZXguY3BwCisrKyBiL2xpYnMvcnMvcnNQcm9ncmFtVmVydGV4LmNwcApAQCAtMjIzLDggKzIyMyw4IEBACiBuYW1lc3BhY2UgcmVuZGVyc2NyaXB0IHsKIAogUnNQcm9ncmFtVmVydGV4IHJzaV9Qcm9ncmFtVmVydGV4Q3JlYXRlKENvbnRleHQgKnJzYywgY29uc3QgY2hhciAqIHNoYWRlclRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoYWRlckxlbmd0aCwgY29uc3QgdWludDMyX3QgKiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaGFkZXJMZW5ndGgsIGNvbnN0IHVpbnQzMl90ICogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFyYW1MZW5ndGgpIHsKICAgICBQcm9ncmFtVmVydGV4ICpwdiA9IG5ldyBQcm9ncmFtVmVydGV4KHJzYywgc2hhZGVyVGV4dCwgc2hhZGVyTGVuZ3RoLCBwYXJhbXMsIHBhcmFtTGVuZ3RoKTsKICAgICBwdi0+aW5jVXNlclJlZigpOwogICAgIHJldHVybiBwdjsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNSdW50aW1lLmggYi9saWJzL3JzL3JzUnVudGltZS5oCmluZGV4IDZkNDUyODUuLmNiOTYyYTggMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNSdW50aW1lLmgKKysrIGIvbGlicy9ycy9yc1J1bnRpbWUuaApAQCAtODUsNiArODUsMjEgQEAKIHZvaWQgcnNyQ29sb3IoQ29udGV4dCAqLCBTY3JpcHQgKiwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CiB2b2lkIHJzckZpbmlzaChDb250ZXh0ICosIFNjcmlwdCAqKTsKIHZvaWQgcnNyQWxsb2NhdGlvblN5bmNBbGwoQ29udGV4dCAqLCBTY3JpcHQgKiwgQWxsb2NhdGlvbiAqKTsKKwordm9pZCByc3JBbGxvY2F0aW9uQ29weTFEUmFuZ2UoQ29udGV4dCAqLCBBbGxvY2F0aW9uICpkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdE9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdE1pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNPZmYsIHVpbnQzMl90IHNyY01pcCk7Cit2b2lkIHJzckFsbG9jYXRpb25Db3B5MkRSYW5nZShDb250ZXh0ICosIEFsbG9jYXRpb24gKmRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0WG9mZiwgdWludDMyX3QgZHN0WW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdE1pcCwgdWludDMyX3QgZHN0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1hvZmYsIHVpbnQzMl90IHNyY1lvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNNaXAsIHVpbnQzMl90IHNyY0ZhY2UpOworCiB2b2lkIHJzckNsZWFyQ29sb3IoQ29udGV4dCAqLCBTY3JpcHQgKiwgZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSk7CiB2b2lkIHJzckNsZWFyRGVwdGgoQ29udGV4dCAqLCBTY3JpcHQgKiwgZmxvYXQgdik7CiB1aW50MzJfdCByc3JHZXRXaWR0aChDb250ZXh0ICosIFNjcmlwdCAqKTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHQuY3BwIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKaW5kZXggNzY0MWNhYi4uZjYyYzcyZSAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdC5jcHAKQEAgLTUzLDcgKzUzLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCBsZW4pIHsKK3ZvaWQgU2NyaXB0OjpzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgbGVuKSB7CiAgICAgLy9MT0dFKCJzZXRWYXIgJWkgJXAgJWkiLCBzbG90LCB2YWwsIGxlbik7CiAgICAgaWYgKHNsb3QgPj0gbUhhbC5pbmZvLmV4cG9ydGVkVmFyaWFibGVDb3VudCkgewogICAgICAgICBMT0dFKCJTY3JpcHQ6OnNldFZhciB1bmFibGUgdG8gc2V0IGFsbG9jYXRpb24sIGludmFsaWQgc2xvdCBpbmRleCIpOwpAQCAtODIsMTQgKzgyLDE0IEBACiAgICAgLy9MT0dFKCJyc2lfU2NyaXB0QmluZEFsbG9jYXRpb24gJWkgICVwICAlcCIsIHNsb3QsIGEsIGEtPmdldFB0cigpKTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0VGltZVpvbmUoQ29udGV4dCAqIHJzYywgUnNTY3JpcHQgdnMsIGNvbnN0IGNoYXIgKiB0aW1lWm9uZSwgdWludDMyX3QgbGVuZ3RoKSB7Cit2b2lkIHJzaV9TY3JpcHRTZXRUaW1lWm9uZShDb250ZXh0ICogcnNjLCBSc1NjcmlwdCB2cywgY29uc3QgY2hhciAqIHRpbWVab25lLCBzaXplX3QgbGVuZ3RoKSB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKICAgICBzLT5tRW52aXJvbWVudC5tVGltZVpvbmUgPSB0aW1lWm9uZTsKIH0KIAogdm9pZCByc2lfU2NyaXB0Rm9yRWFjaChDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LAogICAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb24gdmFpbiwgUnNBbGxvY2F0aW9uIHZhb3V0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwYXJhbXMsIHVpbnQzMl90IHBhcmFtTGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHBhcmFtTGVuKSB7CiAgICAgU2NyaXB0ICpzID0gc3RhdGljX2Nhc3Q8U2NyaXB0ICo+KHZzKTsKICAgICBzLT5ydW5Gb3JFYWNoKHJzYywKICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFsbG9jYXRpb24gKj4odmFpbiksIHN0YXRpY19jYXN0PEFsbG9jYXRpb24gKj4odmFvdXQpLApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgcy0+SW52b2tlKHJzYywgc2xvdCwgTlVMTCwgMCk7CiB9CiAKLXZvaWQgcnNpX1NjcmlwdEludm9rZVYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKSB7Cit2b2lkIHJzaV9TY3JpcHRJbnZva2VWKENvbnRleHQgKnJzYywgUnNTY3JpcHQgdnMsIHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pIHsKICAgICBTY3JpcHQgKnMgPSBzdGF0aWNfY2FzdDxTY3JpcHQgKj4odnMpOwogICAgIHMtPkludm9rZShyc2MsIHNsb3QsIGRhdGEsIGxlbik7CiB9CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICBzLT5zZXRWYXIoc2xvdCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKIH0KIAotdm9pZCByc2lfU2NyaXB0U2V0VmFyVihDb250ZXh0ICpyc2MsIFJzU2NyaXB0IHZzLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pIHsKK3ZvaWQgcnNpX1NjcmlwdFNldFZhclYoQ29udGV4dCAqcnNjLCBSc1NjcmlwdCB2cywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewogICAgIFNjcmlwdCAqcyA9IHN0YXRpY19jYXN0PFNjcmlwdCAqPih2cyk7CiAgICAgcy0+c2V0VmFyKHNsb3QsIGRhdGEsIGxlbik7CiB9CmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0LmggYi9saWJzL3JzL3JzU2NyaXB0LmgKaW5kZXggMDg4YzhkMS4uYzAzMjRkZCAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1NjcmlwdC5oCisrKyBiL2xpYnMvcnMvcnNTY3JpcHQuaApAQCAtNzAsNyArNzAsNyBAQAogCiAgICAgdm9pZCBpbml0U2xvdHMoKTsKICAgICB2b2lkIHNldFNsb3QodWludDMyX3Qgc2xvdCwgQWxsb2NhdGlvbiAqYSk7Ci0gICAgdm9pZCBzZXRWYXIodWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqdmFsLCB1aW50MzJfdCBsZW4pOworICAgIHZvaWQgc2V0VmFyKHVpbnQzMl90IHNsb3QsIGNvbnN0IHZvaWQgKnZhbCwgc2l6ZV90IGxlbik7CiAgICAgdm9pZCBzZXRWYXJPYmoodWludDMyX3Qgc2xvdCwgT2JqZWN0QmFzZSAqdmFsKTsKIAogICAgIHZpcnR1YWwgdm9pZCBydW5Gb3JFYWNoKENvbnRleHQgKnJzYywKQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdXNyQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnNTY3JpcHRDYWxsICpzYyA9IE5VTEwpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgSW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXR1cFNjcmlwdChDb250ZXh0ICpyc2MpID0gMDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopID0gMDsKIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDLmNwcCBiL2xpYnMvcnMvcnNTY3JpcHRDLmNwcAppbmRleCA2ZDA3MDFkLi5iMjMwYmI1IDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Qy5jcHAKKysrIGIvbGlicy9ycy9yc1NjcmlwdEMuY3BwCkBAIC0xOSwxMSArMTksNiBAQAogI2luY2x1ZGUgInV0aWxzL1RpbWVycy5oIgogI2luY2x1ZGUgInV0aWxzL1N0b3BXYXRjaC5oIgogCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPGJjYy9iY2MuaD4KLQogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVuZGVyc2NyaXB0OwogCkBAIC0xMjksNyArMTI0LDcgQEAKICAgICByc2MtPm1IYWwuZnVuY3Muc2NyaXB0Lmludm9rZUZvckVhY2gocnNjLCB0aGlzLCBhaW4sIGFvdXQsIHVzciwgdXNyQnl0ZXMsIHNjKTsKIH0KIAotdm9pZCBTY3JpcHRDOjpJbnZva2UoQ29udGV4dCAqcnNjLCB1aW50MzJfdCBzbG90LCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4pIHsKK3ZvaWQgU2NyaXB0Qzo6SW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewogICAgIGlmIChzbG90ID49IG1IYWwuaW5mby5leHBvcnRlZEZ1bmN0aW9uQ291bnQpIHsKICAgICAgICAgcnNjLT5zZXRFcnJvcihSU19FUlJPUl9CQURfU0NSSVBULCAiQ2FsbGluZyBpbnZva2Ugb24gYmFkIHNjcmlwdCIpOwogICAgICAgICByZXR1cm47CkBAIC0yNjksNyArMjY0LDcgQEAKIFJzU2NyaXB0IHJzaV9TY3JpcHRDQ3JlYXRlKENvbnRleHQgKnJzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc05hbWUsIHNpemVfdCByZXNOYW1lX2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhY2hlRGlyLCBzaXplX3QgY2FjaGVEaXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCwgdWludDMyX3QgdGV4dF9sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXh0LCBzaXplX3QgdGV4dF9sZW5ndGgpCiB7CiAgICAgU2NyaXB0QyAqcyA9IG5ldyBTY3JpcHRDKHJzYyk7CiAKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNTY3JpcHRDLmggYi9saWJzL3JzL3JzU2NyaXB0Qy5oCmluZGV4IDRjODU3NDUuLjVjMTkxZDkgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNTY3JpcHRDLmgKKysrIGIvbGlicy9ycy9yc1NjcmlwdEMuaApAQCAtMzksNyArMzksNyBAQAogICAgIGNvbnN0IEFsbG9jYXRpb24gKnB0clRvQWxsb2NhdGlvbihjb25zdCB2b2lkICopIGNvbnN0OwogCiAKLSAgICB2aXJ0dWFsIHZvaWQgSW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuKTsKKyAgICB2aXJ0dWFsIHZvaWQgSW52b2tlKENvbnRleHQgKnJzYywgdWludDMyX3Qgc2xvdCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IHJ1bihDb250ZXh0ICopOwogCmRpZmYgLS1naXQgYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwIGIvbGlicy9ycy9yc1NjcmlwdENfTGliLmNwcAppbmRleCA0ZWUwYTNlLi5lYzE1YmMwIDEwMDY0NAotLS0gYS9saWJzL3JzL3JzU2NyaXB0Q19MaWIuY3BwCisrKyBiL2xpYnMvcnMvcnNTY3JpcHRDX0xpYi5jcHAKQEAgLTE2NCw2ICsxNjQsMjkgQEAKICAgICBhLT5zeW5jQWxsKHJzYywgdXNhZ2UpOwogfQogCit2b2lkIHJzckFsbG9jYXRpb25Db3B5MURSYW5nZShDb250ZXh0ICpyc2MsIEFsbG9jYXRpb24gKmRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0T2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0TWlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY09mZiwgdWludDMyX3Qgc3JjTWlwKSB7CisgICAgcnNpX0FsbG9jYXRpb25Db3B5MkRSYW5nZShyc2MsIGRzdEFsbG9jLCBkc3RPZmYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNaXAsIDAsIGNvdW50LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQWxsb2MsIHNyY09mZiwgMCwgc3JjTWlwLCAwKTsKK30KKwordm9pZCByc3JBbGxvY2F0aW9uQ29weTJEUmFuZ2UoQ29udGV4dCAqcnNjLCBBbGxvY2F0aW9uICpkc3RBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFhvZmYsIHVpbnQzMl90IGRzdFlvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RNaXAsIHVpbnQzMl90IGRzdEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbiAqc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNYb2ZmLCB1aW50MzJfdCBzcmNZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjTWlwLCB1aW50MzJfdCBzcmNGYWNlKSB7CisgICAgcnNpX0FsbG9jYXRpb25Db3B5MkRSYW5nZShyc2MsIGRzdEFsbG9jLCBkc3RYb2ZmLCBkc3RZb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWlwLCBkc3RGYWNlLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQWxsb2MsIHNyY1hvZmYsIHNyY1lvZmYsIHNyY01pcCwgc3JjRmFjZSk7Cit9CisKIGNvbnN0IEFsbG9jYXRpb24gKiByc3JHZXRBbGxvY2F0aW9uKENvbnRleHQgKnJzYywgU2NyaXB0ICpzLCBjb25zdCB2b2lkICpwdHIpIHsKICAgICBTY3JpcHRDICpzYyA9IChTY3JpcHRDICopczsKICAgICByZXR1cm4gc2MtPnB0clRvQWxsb2NhdGlvbihwdHIpOwpkaWZmIC0tZ2l0IGEvbGlicy9ycy9yc1RocmVhZElPLmNwcCBiL2xpYnMvcnMvcnNUaHJlYWRJTy5jcHAKaW5kZXggNDQyOTU1Ni4uYWIxNjRjMyAxMDA2NDQKLS0tIGEvbGlicy9ycy9yc1RocmVhZElPLmNwcAorKysgYi9saWJzL3JzL3JzVGhyZWFkSU8uY3BwCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgbVRvQ2xpZW50U29ja2V0LnJlYWQoJm1MYXN0Q2xpZW50SGVhZGVyLCBzaXplb2YobUxhc3RDbGllbnRIZWFkZXIpKTsKICAgICB9IGVsc2UgewogICAgICAgICBzaXplX3QgYnl0ZXNEYXRhID0gMDsKLSAgICAgICAgY29uc3QgdWludDMyX3QgKmQgPSAoY29uc3QgdWludDMyX3QgKiltVG9DbGllbnQuZ2V0KCZtTGFzdENsaWVudEhlYWRlci5jbWRJRCwgJmJ5dGVzRGF0YSk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpkID0gKGNvbnN0IHVpbnQzMl90ICopbVRvQ2xpZW50LmdldCgmbUxhc3RDbGllbnRIZWFkZXIuY21kSUQsICh1aW50MzJfdCopJmJ5dGVzRGF0YSk7CiAgICAgICAgIGlmIChieXRlc0RhdGEgPj0gc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgbUxhc3RDbGllbnRIZWFkZXIudXNlcklEID0gZFswXTsKICAgICAgICAgICAgIG1MYXN0Q2xpZW50SGVhZGVyLmJ5dGVzID0gYnl0ZXNEYXRhIC0gc2l6ZW9mKHVpbnQzMl90KTsKZGlmZiAtLWdpdCBhL2xpYnMvcnMvcnNfaGFsLmggYi9saWJzL3JzL3JzX2hhbC5oCmluZGV4IDQ0YzdlNzEuLjkyOGRjYTUgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvcnNfaGFsLmgKKysrIGIvbGlicy9ycy9yc19oYWwuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBSU19IQUxfSAogCiAjaW5jbHVkZSA8UmVuZGVyU2NyaXB0RGVmaW5lcy5oPgotI2luY2x1ZGUgPHVpL2VnbC9hbmRyb2lkX25hdGl2ZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlbmRlcnNjcmlwdCB7CkBAIC0xMTMsNiArMTEyLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2UgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZCwgY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZUJ5dGVzKTsKIAorICAgICAgICAvLyBBbGxvY2F0aW9uIHRvIGFsbG9jYXRpb24gY29waWVzCisgICAgICAgIHZvaWQgKCphbGxvY0RhdGExRCkoY29uc3QgQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKmRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFhvZmYsIHVpbnQzMl90IGRzdExvZCwgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqc3JjQWxsb2MsIHVpbnQzMl90IHNyY1hvZmYsIHVpbnQzMl90IHNyY0xvZCk7CisgICAgICAgIHZvaWQgKCphbGxvY0RhdGEyRCkoY29uc3QgQ29udGV4dCAqcnNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKmRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdFhvZmYsIHVpbnQzMl90IGRzdFlvZmYsIHVpbnQzMl90IGRzdExvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb25DdWJlbWFwRmFjZSBkc3RGYWNlLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb24gKnNyY0FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1hvZmYsIHVpbnQzMl90IHNyY1lvZmYsIHVpbnQzMl90IHNyY0xvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSc0FsbG9jYXRpb25DdWJlbWFwRmFjZSBzcmNGYWNlKTsKKyAgICAgICAgdm9pZCAoKmFsbG9jRGF0YTNEKShjb25zdCBDb250ZXh0ICpyc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxsb2NhdGlvbiAqZHN0QWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0WG9mZiwgdWludDMyX3QgZHN0WW9mZiwgdWludDMyX3QgZHN0Wm9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RMb2QsIFJzQWxsb2NhdGlvbkN1YmVtYXBGYWNlIGRzdEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uICpzcmNBbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNYb2ZmLCB1aW50MzJfdCBzcmNZb2ZmLCB1aW50MzJfdCBzcmNab2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY0xvZCwgUnNBbGxvY2F0aW9uQ3ViZW1hcEZhY2Ugc3JjRmFjZSk7CisKICAgICAgICAgdm9pZCAoKmVsZW1lbnREYXRhMUQpKGNvbnN0IENvbnRleHQgKnJzYywgY29uc3QgQWxsb2NhdGlvbiAqYWxsb2MsIHVpbnQzMl90IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBlbGVtZW50T2ZmLCB1aW50MzJfdCBzaXplQnl0ZXMpOwogICAgICAgICB2b2lkICgqZWxlbWVudERhdGEyRCkoY29uc3QgQ29udGV4dCAqcnNjLCBjb25zdCBBbGxvY2F0aW9uICphbGxvYywgdWludDMyX3QgeCwgdWludDMyX3QgeSwKZGlmZiAtLWdpdCBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2ggYi9saWJzL3JzL3NjcmlwdGMvcnNfZ3JhcGhpY3MucnNoCmluZGV4IGQ1M2JjOTUuLjlhOGE0ZTYgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19ncmFwaGljcy5yc2gKKysrIGIvbGlicy9ycy9zY3JpcHRjL3JzX2dyYXBoaWNzLnJzaApAQCAtMTQ0LDYgKzE0NCwxNyBAQAogICAgIHJzZ0FsbG9jYXRpb25TeW5jQWxsKHJzX2FsbG9jYXRpb24gYWxsb2MpOwogCiAvKioKKyAqIFN5bmMgdGhlIGNvbnRlbnRzIG9mIGFuIGFsbG9jYXRpb24gZnJvbSBtZW1vcnkgc3BhY2UKKyAqIHNwZWNpZmllZCBieSBzb3VyY2UuCisgKgorICogQHBhcmFtIGFsbG9jCisgKiBAcGFyYW0gc291cmNlCisgKi8KK2V4dGVybiB2b2lkIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCisgICAgcnNnQWxsb2NhdGlvblN5bmNBbGwocnNfYWxsb2NhdGlvbiBhbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICByc19hbGxvY2F0aW9uX3VzYWdlX3R5cGUgc291cmNlKTsKKworLyoqCiAgKiBMb3cgcGVyZm9ybWFuY2UgdXRpbGl0eSBmdW5jdGlvbiBmb3IgZHJhd2luZyBhIHNpbXBsZSByZWN0YW5nbGUuICBOb3QKICAqIGludGVuZGVkIGZvciBkcmF3aW5nIGxhcmdlIHF1YW50aXRpZXMgb2YgZ2VvbWV0cnkuCiAgKgpkaWZmIC0tZ2l0IGEvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX21hdGgucnNoCmluZGV4IDZlM2NmZGIuLjU4NDMxN2UgMTAwNjQ0Ci0tLSBhL2xpYnMvcnMvc2NyaXB0Yy9yc19tYXRoLnJzaAorKysgYi9saWJzL3JzL3NjcmlwdGMvcnNfbWF0aC5yc2gKQEAgLTEzNiw2ICsxMzYsNTggQEAKIGV4dGVybiB1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQogICAgIHJzQWxsb2NhdGlvbkdldERpbUZhY2VzKHJzX2FsbG9jYXRpb24pOwogCisvKioKKyAqIENvcHkgcGFydCBvZiBhbiBhbGxvY2F0aW9uIGZyb20gYW5vdGhlciBhbGxvY2F0aW9uLgorICoKKyAqIEBwYXJhbSBkc3RBbGxvYyBBbGxvY2F0aW9uIHRvIGNvcHkgZGF0YSBpbnRvLgorICogQHBhcmFtIGRzdE9mZiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbGVtZW50IHRvIGJlIGNvcGllZCBpbgorICogICAgICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gYWxsb2NhdGlvbi4KKyAqIEBwYXJhbSBkc3RNaXAgTWlwIGxldmVsIGluIHRoZSBkZXN0aW5hdGlvbiBhbGxvY2F0aW9uLgorICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gYmUgY29waWVkLgorICogQHBhcmFtIHNyY0FsbG9jIFRoZSBzb3VyY2UgZGF0YSBhbGxvY2F0aW9uLgorICogQHBhcmFtIHNyY09mZiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIGRhdGEgdG8gYmUKKyAqICAgICAgICAgICAgICAgY29waWVkIGluIHRoZSBzb3VyY2UgYWxsb2NhdGlvbi4KKyAqIEBwYXJhbSBzcmNNaXAgTWlwIGxldmVsIGluIHRoZSBzb3VyY2UgYWxsb2NhdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgX19hdHRyaWJ1dGVfXygob3ZlcmxvYWRhYmxlKSkKKyAgICByc0FsbG9jYXRpb25Db3B5MURSYW5nZShyc19hbGxvY2F0aW9uIGRzdEFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRzdE9mZiwgdWludDMyX3QgZHN0TWlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjT2ZmLCB1aW50MzJfdCBzcmNNaXApOworCisvKioKKyAqIENvcHkgYSByZWN0YW5ndWxhciByZWdpb24gaW50byB0aGUgYWxsb2NhdGlvbiBmcm9tIGFub3RoZXIKKyAqIGFsbG9jYXRpb24uCisgKgorICogQHBhcmFtIGRzdEFsbG9jIGFsbG9jYXRpb24gdG8gY29weSBkYXRhIGludG8uCisgKiBAcGFyYW0gZHN0WG9mZiBYIG9mZnNldCBvZiB0aGUgcmVnaW9uIHRvIHVwZGF0ZSBpbiB0aGUKKyAqICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGFsbG9jYXRpb24uCisgKiBAcGFyYW0gZHN0WW9mZiBZIG9mZnNldCBvZiB0aGUgcmVnaW9uIHRvIHVwZGF0ZSBpbiB0aGUKKyAqICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIGFsbG9jYXRpb24uCisgKiBAcGFyYW0gZHN0TWlwIE1pcCBsZXZlbCBpbiB0aGUgZGVzdGluYXRpb24gYWxsb2NhdGlvbi4KKyAqIEBwYXJhbSBkc3RGYWNlIEN1YmVtYXAgZmFjZSBvZiB0aGUgZGVzdGluYXRpb24gYWxsb2NhdGlvbiwKKyAqICAgICAgICAgICAgICAgIGlnbm9yZWQgZm9yIGFsbG9jYXRpb25zIHRoYXQgYXJlbid0IGN1YmVtYXBzLgorICogQHBhcmFtIHdpZHRoIFdpZHRoIG9mIHRoZSBpbmNvbWluZyByZWdpb24gdG8gdXBkYXRlLgorICogQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgdGhlIGluY29taW5nIHJlZ2lvbiB0byB1cGRhdGUuCisgKiBAcGFyYW0gc3JjQWxsb2MgVGhlIHNvdXJjZSBkYXRhIGFsbG9jYXRpb24uCisgKiBAcGFyYW0gc3JjWG9mZiBYIG9mZnNldCBpbiBkYXRhIG9mIHRoZSBzb3VyY2UgYWxsb2NhdGlvbi4KKyAqIEBwYXJhbSBzcmNZb2ZmIFkgb2Zmc2V0IGluIGRhdGEgb2YgdGhlIHNvdXJjZSBhbGxvY2F0aW9uLgorICogQHBhcmFtIHNyY01pcCBNaXAgbGV2ZWwgaW4gdGhlIHNvdXJjZSBhbGxvY2F0aW9uLgorICogQHBhcmFtIHNyY0ZhY2UgQ3ViZW1hcCBmYWNlIG9mIHRoZSBzb3VyY2UgYWxsb2NhdGlvbiwKKyAqICAgICAgICAgICAgICAgIGlnbm9yZWQgZm9yIGFsbG9jYXRpb25zIHRoYXQgYXJlbid0IGN1YmVtYXBzLgorICovCitleHRlcm4gdm9pZCBfX2F0dHJpYnV0ZV9fKChvdmVybG9hZGFibGUpKQorICAgIHJzQWxsb2NhdGlvbkNvcHkyRFJhbmdlKHJzX2FsbG9jYXRpb24gZHN0QWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0WG9mZiwgdWludDMyX3QgZHN0WW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RNaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2UgZHN0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzX2FsbG9jYXRpb24gc3JjQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjWG9mZiwgdWludDMyX3Qgc3JjWW9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNNaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2Ugc3JjRmFjZSk7CisKIC8vIEV4dHJhY3QgYSBzaW5nbGUgZWxlbWVudCBmcm9tIGFuIGFsbG9jYXRpb24uCiBleHRlcm4gY29uc3Qgdm9pZCAqIF9fYXR0cmlidXRlX18oKG92ZXJsb2FkYWJsZSkpCiAgICAgcnNHZXRFbGVtZW50QXQocnNfYWxsb2NhdGlvbiwgdWludDMyX3QgeCk7CmRpZmYgLS1naXQgYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoIGIvbGlicy9ycy9zY3JpcHRjL3JzX3R5cGVzLnJzaAppbmRleCBkOWY0YjRiLi41MzZkMWYwIDEwMDY0NAotLS0gYS9saWJzL3JzL3NjcmlwdGMvcnNfdHlwZXMucnNoCisrKyBiL2xpYnMvcnMvc2NyaXB0Yy9yc190eXBlcy5yc2gKQEAgLTg4LDQgKzg4LDIxIEBACiAKICNkZWZpbmUgUlNfUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpCiAKK3R5cGVkZWYgZW51bSB7CisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWCA9IDAsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWCA9IDEsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWSA9IDIsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWSA9IDMsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWiA9IDQsCisgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfTkVHQVRJVkVfWiA9IDUKK30gcnNfYWxsb2NhdGlvbl9jdWJlbWFwX2ZhY2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUlNfQUxMT0NBVElPTl9VU0FHRV9TQ1JJUFQgPSAweDAwMDEsCisgICAgUlNfQUxMT0NBVElPTl9VU0FHRV9HUkFQSElDU19URVhUVVJFID0gMHgwMDAyLAorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfVkVSVEVYID0gMHgwMDA0LAorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfQ09OU1RBTlRTID0gMHgwMDA4LAorICAgIFJTX0FMTE9DQVRJT05fVVNBR0VfR1JBUEhJQ1NfUkVOREVSX1RBUkdFVCA9IDB4MDAxMAorfSByc19hbGxvY2F0aW9uX3VzYWdlX3R5cGU7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy91aS9JbnB1dC5jcHAgYi9saWJzL3VpL0lucHV0LmNwcAppbmRleCAxYmEzOGE3Li4wYWY3ZjgwIDEwMDY0NAotLS0gYS9saWJzL3VpL0lucHV0LmNwcAorKysgYi9saWJzL3VpL0lucHV0LmNwcApAQCAtMTMsNiArMTMsMTAgQEAKIC8vIExvZyBkZWJ1ZyBtZXNzYWdlcyBhYm91dCB2ZWxvY2l0eSB0cmFja2luZy4KICNkZWZpbmUgREVCVUdfVkVMT0NJVFkgMAogCisvLyBMb2cgZGVidWcgbWVzc2FnZXMgYWJvdXQgYWNjZWxlcmF0aW9uLgorI2RlZmluZSBERUJVR19BQ0NFTEVSQVRJT04gMAorCisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtMjAsNiArMjQsNyBAQAogI2luY2x1ZGUgPHVpL0lucHV0Lmg+CiAKICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CiAKICNpZmRlZiBIQVZFX0FORFJPSURfT1MKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC02OTMsNiArNjk4LDEwIEBACiAKIC8vIC0tLSBWZWxvY2l0eVRyYWNrZXIgLS0tCiAKK2NvbnN0IHVpbnQzMl90IFZlbG9jaXR5VHJhY2tlcjo6SElTVE9SWV9TSVpFOworY29uc3QgbnNlY3NfdCBWZWxvY2l0eVRyYWNrZXI6Ok1BWF9BR0U7Citjb25zdCBuc2Vjc190IFZlbG9jaXR5VHJhY2tlcjo6TUlOX0RVUkFUSU9OOworCiBWZWxvY2l0eVRyYWNrZXI6OlZlbG9jaXR5VHJhY2tlcigpIHsKICAgICBjbGVhcigpOwogfQpAQCAtODgxLDE0ICs4OTAsNiBAQAogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSB1c2VkIGF0IGxlYXN0IG9uZSBzYW1wbGUuCiAgICAgICAgIGlmIChzYW1wbGVzVXNlZCAhPSAwKSB7Ci0gICAgICAgICAgICAvLyBTY2FsZSB0aGUgdmVsb2NpdHkgbGluZWFybHkgaWYgdGhlIHdpbmRvdyBvZiBzYW1wbGVzIGlzIHNtYWxsLgotICAgICAgICAgICAgbnNlY3NfdCB0b3RhbER1cmF0aW9uID0gbmV3ZXN0TW92ZW1lbnQuZXZlbnRUaW1lIC0gb2xkZXN0TW92ZW1lbnQuZXZlbnRUaW1lOwotICAgICAgICAgICAgaWYgKHRvdGFsRHVyYXRpb24gPCBNSU5fV0lORE9XKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBmbG9hdCh0b3RhbER1cmF0aW9uKSAvIGZsb2F0KE1JTl9XSU5ET1cpOwotICAgICAgICAgICAgICAgIGFjY3VtVnggKj0gc2NhbGU7Ci0gICAgICAgICAgICAgICAgYWNjdW1WeSAqPSBzY2FsZTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgKm91dFZ4ID0gYWNjdW1WeDsKICAgICAgICAgICAgICpvdXRWeSA9IGFjY3VtVnk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTkwMiw2ICs5MDMsODUgQEAKIH0KIAogCisvLyAtLS0gVmVsb2NpdHlDb250cm9sIC0tLQorCitjb25zdCBuc2Vjc190IFZlbG9jaXR5Q29udHJvbDo6U1RPUF9USU1FOworCitWZWxvY2l0eUNvbnRyb2w6OlZlbG9jaXR5Q29udHJvbCgpIHsKKyAgICByZXNldCgpOworfQorCit2b2lkIFZlbG9jaXR5Q29udHJvbDo6c2V0UGFyYW1ldGVycyhjb25zdCBWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKSB7CisgICAgbVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgVmVsb2NpdHlDb250cm9sOjpyZXNldCgpIHsKKyAgICBtTGFzdE1vdmVtZW50VGltZSA9IExMT05HX01JTjsKKyAgICBtUmF3UG9zaXRpb24ueCA9IDA7CisgICAgbVJhd1Bvc2l0aW9uLnkgPSAwOworICAgIG1WZWxvY2l0eVRyYWNrZXIuY2xlYXIoKTsKK30KKwordm9pZCBWZWxvY2l0eUNvbnRyb2w6Om1vdmUobnNlY3NfdCBldmVudFRpbWUsIGZsb2F0KiBkZWx0YVgsIGZsb2F0KiBkZWx0YVkpIHsKKyAgICBpZiAoKGRlbHRhWCAmJiAqZGVsdGFYKSB8fCAoZGVsdGFZICYmICpkZWx0YVkpKSB7CisgICAgICAgIGlmIChldmVudFRpbWUgPj0gbUxhc3RNb3ZlbWVudFRpbWUgKyBTVE9QX1RJTUUpIHsKKyNpZiBERUJVR19BQ0NFTEVSQVRJT04KKyAgICAgICAgICAgIExPR0QoIlZlbG9jaXR5Q29udHJvbDogc3RvcHBlZCwgbGFzdCBtb3ZlbWVudCB3YXMgJTAuM2ZtcyBhZ28iLAorICAgICAgICAgICAgICAgICAgICAoZXZlbnRUaW1lIC0gbUxhc3RNb3ZlbWVudFRpbWUpICogMC4wMDAwMDFmKTsKKyNlbmRpZgorICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0TW92ZW1lbnRUaW1lID0gZXZlbnRUaW1lOworICAgICAgICBpZiAoZGVsdGFYKSB7CisgICAgICAgICAgICBtUmF3UG9zaXRpb24ueCArPSAqZGVsdGFYOworICAgICAgICB9CisgICAgICAgIGlmIChkZWx0YVkpIHsKKyAgICAgICAgICAgIG1SYXdQb3NpdGlvbi55ICs9ICpkZWx0YVk7CisgICAgICAgIH0KKyAgICAgICAgbVZlbG9jaXR5VHJhY2tlci5hZGRNb3ZlbWVudChldmVudFRpbWUsIEJpdFNldDMyKEJpdFNldDMyOjp2YWx1ZUZvckJpdCgwKSksICZtUmF3UG9zaXRpb24pOworCisgICAgICAgIGZsb2F0IHZ4LCB2eTsKKyAgICAgICAgZmxvYXQgc2NhbGUgPSBtUGFyYW1ldGVycy5zY2FsZTsKKyAgICAgICAgaWYgKG1WZWxvY2l0eVRyYWNrZXIuZ2V0VmVsb2NpdHkoMCwgJnZ4LCAmdnkpKSB7CisgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IGh5cG90Zih2eCwgdnkpICogc2NhbGU7CisgICAgICAgICAgICBpZiAoc3BlZWQgPj0gbVBhcmFtZXRlcnMuaGlnaFRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIC8vIEFwcGx5IGZ1bGwgYWNjZWxlcmF0aW9uIGFib3ZlIHRoZSBoaWdoIHNwZWVkIHRocmVzaG9sZC4KKyAgICAgICAgICAgICAgICBzY2FsZSAqPSBtUGFyYW1ldGVycy5hY2NlbGVyYXRpb247CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNwZWVkID4gbVBhcmFtZXRlcnMubG93VGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgdGhlIGFjY2VsZXJhdGlvbiB0byBhcHBseSBiZXR3ZWVuIHRoZSBsb3cgYW5kIGhpZ2gKKyAgICAgICAgICAgICAgICAvLyBzcGVlZCB0aHJlc2hvbGRzLgorICAgICAgICAgICAgICAgIHNjYWxlICo9IDEgKyAoc3BlZWQgLSBtUGFyYW1ldGVycy5sb3dUaHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAvIChtUGFyYW1ldGVycy5oaWdoVGhyZXNob2xkIC0gbVBhcmFtZXRlcnMubG93VGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAobVBhcmFtZXRlcnMuYWNjZWxlcmF0aW9uIC0gMSk7CisgICAgICAgICAgICB9CisKKyNpZiBERUJVR19BQ0NFTEVSQVRJT04KKyAgICAgICAgICAgIExPR0QoIlZlbG9jaXR5Q29udHJvbCglMC4zZiwgJTAuM2YsICUwLjNmLCAlMC4zZik6ICIKKyAgICAgICAgICAgICAgICAgICAgInZ4PSUwLjNmLCB2eT0lMC4zZiwgc3BlZWQ9JTAuM2YsIGFjY2VsPSUwLjNmIiwKKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuc2NhbGUsIG1QYXJhbWV0ZXJzLmxvd1RocmVzaG9sZCwgbVBhcmFtZXRlcnMuaGlnaFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuYWNjZWxlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICB2eCwgdnksIHNwZWVkLCBzY2FsZSAvIG1QYXJhbWV0ZXJzLnNjYWxlKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworI2lmIERFQlVHX0FDQ0VMRVJBVElPTgorICAgICAgICAgICAgTE9HRCgiVmVsb2NpdHlDb250cm9sKCUwLjNmLCAlMC4zZiwgJTAuM2YsICUwLjNmKTogdW5rbm93biB2ZWxvY2l0eSIsCisgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnNjYWxlLCBtUGFyYW1ldGVycy5sb3dUaHJlc2hvbGQsIG1QYXJhbWV0ZXJzLmhpZ2hUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmFjY2VsZXJhdGlvbik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWx0YVgpIHsKKyAgICAgICAgICAgICpkZWx0YVggKj0gc2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlbHRhWSkgeworICAgICAgICAgICAgKmRlbHRhWSAqPSBzY2FsZTsKKyAgICAgICAgfQorICAgIH0KK30KKworCiAvLyAtLS0gSW5wdXREZXZpY2VJbmZvIC0tLQogCiBJbnB1dERldmljZUluZm86OklucHV0RGV2aWNlSW5mbygpIHsKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvQW5kcm9pZC5tayBiL2xpYnMvdXRpbHMvQW5kcm9pZC5tawppbmRleCBlOGQ0MGJhLi4wOTMxODljIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL0FuZHJvaWQubWsKKysrIGIvbGlicy91dGlscy9BbmRyb2lkLm1rCkBAIC0yMSw2ICsyMSw3IEBACiAJQXNzZXQuY3BwIFwKIAlBc3NldERpci5jcHAgXAogCUFzc2V0TWFuYWdlci5jcHAgXAorCUJsb2JDYWNoZS5jcHAgXAogCUJ1ZmZlcmVkVGV4dE91dHB1dC5jcHAgXAogCUNhbGxTdGFjay5jcHAgXAogCURlYnVnLmNwcCBcCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0JhY2t1cEhlbHBlcnMuY3BwIGIvbGlicy91dGlscy9CYWNrdXBIZWxwZXJzLmNwcAppbmRleCBlMTU4NzVmLi44NzU0OWZlIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL0JhY2t1cEhlbHBlcnMuY3BwCisrKyBiL2xpYnMvdXRpbHMvQmFja3VwSGVscGVycy5jcHAKQEAgLTUwMyw2ICs1MDMsMTYgQEAKICAgICAgICAgbmVlZEV4dGVuZGVkID0gdHJ1ZTsKICAgICB9CiAKKyAgICAvLyBOb24tN2JpdC1jbGVhbiBwYXRoIGFsc28gbWVhbnMgbmVlZGluZyBwYXggZXh0ZW5kZWQgZm9ybWF0CisgICAgaWYgKCFuZWVkRXh0ZW5kZWQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWxlcGF0aC5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKGZpbGVwYXRoW2ldICYgMHg4MCkgIT0gMCkgeworICAgICAgICAgICAgICAgIG5lZWRFeHRlbmRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBpbnQgZXJyID0gMDsKICAgICBzdHJ1Y3Qgc3RhdDY0IHM7CiAgICAgaWYgKGxzdGF0NjQoZmlsZXBhdGguc3RyaW5nKCksICZzKSAhPSAwKSB7CkBAIC01MTUsNiArNTI1LDcgQEAKICAgICBTdHJpbmc4IHByZWZpeDsKIAogICAgIGNvbnN0IGludCBpc2RpciA9IFNfSVNESVIocy5zdF9tb2RlKTsKKyAgICBpZiAoaXNkaXIpIHMuc3Rfc2l6ZSA9IDA7ICAgLy8gZGlyZWN0b3JpZXMgZ2V0IG5vIGFjdHVhbCBkYXRhIGluIHRoZSB0YXIgc3RyZWFtCiAKICAgICAvLyAhISEgVE9ETzogdXNlIG1tYXAgd2hlbiBwb3NzaWJsZSB0byBhdm9pZCBjaHVybmluZyB0aGUgYnVmZmVyIGNhY2hlCiAgICAgLy8gISEhIFRPRE86IHRoaXMgd2lsbCBicmVhayB3aXRoIHN5bWxpbmtzOyBuZWVkIHRvIHVzZSByZWFkbGluaygyKQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9CbG9iQ2FjaGUuY3BwIGIvbGlicy91dGlscy9CbG9iQ2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDU3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL3V0aWxzL0Jsb2JDYWNoZS5jcHAKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJsb2JDYWNoZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvQmxvYkNhY2hlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQmxvYkNhY2hlOjpCbG9iQ2FjaGUoc2l6ZV90IG1heEtleVNpemUsIHNpemVfdCBtYXhWYWx1ZVNpemUsIHNpemVfdCBtYXhUb3RhbFNpemUpOgorICAgICAgICBtTWF4S2V5U2l6ZShtYXhLZXlTaXplKSwKKyAgICAgICAgbU1heFZhbHVlU2l6ZShtYXhWYWx1ZVNpemUpLAorICAgICAgICBtTWF4VG90YWxTaXplKG1heFRvdGFsU2l6ZSksCisgICAgICAgIG1Ub3RhbFNpemUoMCkgeworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworI2lmZGVmIF9XSU4zMgorICAgIHNyYW5kKG5vdyk7CisjZWxzZQorICAgIG1SYW5kU3RhdGVbMF0gPSAobm93ID4+IDApICYgMHhGRkZGOworICAgIG1SYW5kU3RhdGVbMV0gPSAobm93ID4+IDE2KSAmIDB4RkZGRjsKKyAgICBtUmFuZFN0YXRlWzJdID0gKG5vdyA+PiAzMikgJiAweEZGRkY7CisjZW5kaWYKKyAgICBMT0dWKCJpbml0aWFsaXppbmcgcmFuZG9tIHNlZWQgdXNpbmcgJWxsZCIsIG5vdyk7Cit9CisKK3ZvaWQgQmxvYkNhY2hlOjpzZXQoY29uc3Qgdm9pZCoga2V5LCBzaXplX3Qga2V5U2l6ZSwgY29uc3Qgdm9pZCogdmFsdWUsCisgICAgICAgIHNpemVfdCB2YWx1ZVNpemUpIHsKKyAgICBpZiAobU1heEtleVNpemUgPCBrZXlTaXplKSB7CisgICAgICAgIExPR1YoInNldDogbm90IGNhY2hpbmcgYmVjYXVzZSB0aGUga2V5IGlzIHRvbyBsYXJnZTogJWQgKGxpbWl0OiAlZCkiLAorICAgICAgICAgICAgICAgIGtleVNpemUsIG1NYXhLZXlTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobU1heFZhbHVlU2l6ZSA8IHZhbHVlU2l6ZSkgeworICAgICAgICBMT0dWKCJzZXQ6IG5vdCBjYWNoaW5nIGJlY2F1c2UgdGhlIHZhbHVlIGlzIHRvbyBsYXJnZTogJWQgKGxpbWl0OiAlZCkiLAorICAgICAgICAgICAgICAgIHZhbHVlU2l6ZSwgbU1heFZhbHVlU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1NYXhUb3RhbFNpemUgPCBrZXlTaXplICsgdmFsdWVTaXplKSB7CisgICAgICAgIExPR1YoInNldDogbm90IGNhY2hpbmcgYmVjYXVzZSB0aGUgY29tYmluZWQga2V5L3ZhbHVlIHNpemUgaXMgdG9vICIKKyAgICAgICAgICAgICAgICAibGFyZ2U6ICVkIChsaW1pdDogJWQpIiwga2V5U2l6ZSArIHZhbHVlU2l6ZSwgbU1heFRvdGFsU2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGtleVNpemUgPT0gMCkgeworICAgICAgICBMT0dXKCJzZXQ6IG5vdCBjYWNoaW5nIGJlY2F1c2Uga2V5U2l6ZSBpcyAwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHZhbHVlU2l6ZSA8PSAwKSB7CisgICAgICAgIExPR1coInNldDogbm90IGNhY2hpbmcgYmVjYXVzZSB2YWx1ZVNpemUgaXMgMCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBzcDxCbG9iPiBkdW1teUtleShuZXcgQmxvYihrZXksIGtleVNpemUsIGZhbHNlKSk7CisgICAgQ2FjaGVFbnRyeSBkdW1teUVudHJ5KGR1bW15S2V5LCBOVUxMKTsKKworICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZUVudHJpZXMuaW5kZXhPZihkdW1teUVudHJ5KTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNhY2hlIGVudHJ5LgorICAgICAgICAgICAgc3A8QmxvYj4ga2V5QmxvYihuZXcgQmxvYihrZXksIGtleVNpemUsIHRydWUpKTsKKyAgICAgICAgICAgIHNwPEJsb2I+IHZhbHVlQmxvYihuZXcgQmxvYih2YWx1ZSwgdmFsdWVTaXplLCB0cnVlKSk7CisgICAgICAgICAgICBzaXplX3QgbmV3VG90YWxTaXplID0gbVRvdGFsU2l6ZSArIGtleVNpemUgKyB2YWx1ZVNpemU7CisgICAgICAgICAgICBpZiAobU1heFRvdGFsU2l6ZSA8IG5ld1RvdGFsU2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChpc0NsZWFuYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHRoZSBjYWNoZSBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAgICBjbGVhbigpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXQ6IG5vdCBjYWNoaW5nIG5ldyBrZXkvdmFsdWUgcGFpciBiZWNhdXNlIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGNhY2hlIHNpemUgbGltaXQgd291bGQgYmUgZXhjZWVkZWQ6ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGxpbWl0OiAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVNpemUgKyB2YWx1ZVNpemUsIG1NYXhUb3RhbFNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGVFbnRyaWVzLmFkZChDYWNoZUVudHJ5KGtleUJsb2IsIHZhbHVlQmxvYikpOworICAgICAgICAgICAgbVRvdGFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTsKKyAgICAgICAgICAgIExPR1YoInNldDogY3JlYXRlZCBuZXcgY2FjaGUgZW50cnkgd2l0aCAlZCBieXRlIGtleSBhbmQgJWQgYnl0ZSB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgIGtleVNpemUsIHZhbHVlU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGNhY2hlIGVudHJ5LgorICAgICAgICAgICAgc3A8QmxvYj4gdmFsdWVCbG9iKG5ldyBCbG9iKHZhbHVlLCB2YWx1ZVNpemUsIHRydWUpKTsKKyAgICAgICAgICAgIHNwPEJsb2I+IG9sZFZhbHVlQmxvYihtQ2FjaGVFbnRyaWVzW2luZGV4XS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBuZXdUb3RhbFNpemUgPSBtVG90YWxTaXplICsgdmFsdWVTaXplIC0gb2xkVmFsdWVCbG9iLT5nZXRTaXplKCk7CisgICAgICAgICAgICBpZiAobU1heFRvdGFsU2l6ZSA8IG5ld1RvdGFsU2l6ZSkgeworICAgICAgICAgICAgICAgIGlmIChpc0NsZWFuYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHRoZSBjYWNoZSBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgICAgICAgICBjbGVhbigpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJzZXQ6IG5vdCBjYWNoaW5nIG5ldyB2YWx1ZSBiZWNhdXNlIHRoZSB0b3RhbCBjYWNoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgbGltaXQgd291bGQgYmUgZXhjZWVkZWQ6ICVkIChsaW1pdDogJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTaXplICsgdmFsdWVTaXplLCBtTWF4VG90YWxTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlRW50cmllcy5lZGl0SXRlbUF0KGluZGV4KS5zZXRWYWx1ZSh2YWx1ZUJsb2IpOworICAgICAgICAgICAgbVRvdGFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTsKKyAgICAgICAgICAgIExPR1YoInNldDogdXBkYXRlZCBleGlzdGluZyBjYWNoZSBlbnRyeSB3aXRoICVkIGJ5dGUga2V5IGFuZCAlZCBieXRlICIKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlIiwga2V5U2l6ZSwgdmFsdWVTaXplKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3NpemVfdCBCbG9iQ2FjaGU6OmdldChjb25zdCB2b2lkKiBrZXksIHNpemVfdCBrZXlTaXplLCB2b2lkKiB2YWx1ZSwKKyAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSkgeworICAgIGlmIChtTWF4S2V5U2l6ZSA8IGtleVNpemUpIHsKKyAgICAgICAgTE9HVigiZ2V0OiBub3Qgc2VhcmNoaW5nIGJlY2F1c2UgdGhlIGtleSBpcyB0b28gbGFyZ2U6ICVkIChsaW1pdCAlZCkiLAorICAgICAgICAgICAgICAgIGtleVNpemUsIG1NYXhLZXlTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgc3A8QmxvYj4gZHVtbXlLZXkobmV3IEJsb2Ioa2V5LCBrZXlTaXplLCBmYWxzZSkpOworICAgIENhY2hlRW50cnkgZHVtbXlFbnRyeShkdW1teUtleSwgTlVMTCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZUVudHJpZXMuaW5kZXhPZihkdW1teUVudHJ5KTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIExPR1YoImdldDogbm8gY2FjaGUgZW50cnkgZm91bmQgZm9yIGtleSBvZiBzaXplICVkIiwga2V5U2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFRoZSBrZXkgd2FzIGZvdW5kLiBSZXR1cm4gdGhlIHZhbHVlIGlmIHRoZSBjYWxsZXIncyBidWZmZXIgaXMgbGFyZ2UKKyAgICAvLyBlbm91Z2guCisgICAgc3A8QmxvYj4gdmFsdWVCbG9iKG1DYWNoZUVudHJpZXNbaW5kZXhdLmdldFZhbHVlKCkpOworICAgIHNpemVfdCB2YWx1ZUJsb2JTaXplID0gdmFsdWVCbG9iLT5nZXRTaXplKCk7CisgICAgaWYgKHZhbHVlQmxvYlNpemUgPD0gdmFsdWVTaXplKSB7CisgICAgICAgIExPR1YoImdldDogY29weWluZyAlZCBieXRlcyB0byBjYWxsZXIncyBidWZmZXIiLCB2YWx1ZUJsb2JTaXplKTsKKyAgICAgICAgbWVtY3B5KHZhbHVlLCB2YWx1ZUJsb2ItPmdldERhdGEoKSwgdmFsdWVCbG9iU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVigiZ2V0OiBjYWxsZXIncyBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciB2YWx1ZTogJWQgKG5lZWRzICVkKSIsCisgICAgICAgICAgICAgICAgdmFsdWVTaXplLCB2YWx1ZUJsb2JTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQmxvYlNpemU7Cit9CisKK2xvbmcgaW50IEJsb2JDYWNoZTo6YmxvYl9yYW5kb20oKSB7CisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIHJhbmQoKTsKKyNlbHNlCisgICAgcmV0dXJuIG5yYW5kNDgobVJhbmRTdGF0ZSk7CisjZW5kaWYKK30KKwordm9pZCBCbG9iQ2FjaGU6OmNsZWFuKCkgeworICAgIC8vIFJlbW92ZSBhIHJhbmRvbSBjYWNoZSBlbnRyeSB1bnRpbCB0aGUgdG90YWwgY2FjaGUgc2l6ZSBnZXRzIGJlbG93IGhhbGYKKyAgICAvLyB0aGUgbWF4aW11bSB0b3RhbCBjYWNoZSBzaXplLgorICAgIHdoaWxlIChtVG90YWxTaXplID4gbU1heFRvdGFsU2l6ZSAvIDIpIHsKKyAgICAgICAgc2l6ZV90IGkgPSBzaXplX3QoYmxvYl9yYW5kb20oKSAlIChtQ2FjaGVFbnRyaWVzLnNpemUoKSkpOworICAgICAgICBjb25zdCBDYWNoZUVudHJ5JiBlbnRyeShtQ2FjaGVFbnRyaWVzW2ldKTsKKyAgICAgICAgbVRvdGFsU2l6ZSAtPSBlbnRyeS5nZXRLZXkoKS0+Z2V0U2l6ZSgpICsgZW50cnkuZ2V0VmFsdWUoKS0+Z2V0U2l6ZSgpOworICAgICAgICBtQ2FjaGVFbnRyaWVzLnJlbW92ZUF0KGkpOworICAgIH0KK30KKworYm9vbCBCbG9iQ2FjaGU6OmlzQ2xlYW5hYmxlKCkgY29uc3QgeworICAgIHJldHVybiBtVG90YWxTaXplID4gbU1heFRvdGFsU2l6ZSAvIDI7Cit9CisKK0Jsb2JDYWNoZTo6QmxvYjo6QmxvYihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBjb3B5RGF0YSk6CisgICAgICAgIG1EYXRhKGNvcHlEYXRhID8gbWFsbG9jKHNpemUpIDogZGF0YSksCisgICAgICAgIG1TaXplKHNpemUpLAorICAgICAgICBtT3duc0RhdGEoY29weURhdGEpIHsKKyAgICBpZiAoY29weURhdGEpIHsKKyAgICAgICAgbWVtY3B5KGNvbnN0X2Nhc3Q8dm9pZCo+KG1EYXRhKSwgZGF0YSwgc2l6ZSk7CisgICAgfQorfQorCitCbG9iQ2FjaGU6OkJsb2I6On5CbG9iKCkgeworICAgIGlmIChtT3duc0RhdGEpIHsKKyAgICAgICAgZnJlZShjb25zdF9jYXN0PHZvaWQqPihtRGF0YSkpOworICAgIH0KK30KKworYm9vbCBCbG9iQ2FjaGU6OkJsb2I6Om9wZXJhdG9yPChjb25zdCBCbG9iJiByaHMpIGNvbnN0IHsKKyAgICBpZiAobVNpemUgPT0gcmhzLm1TaXplKSB7CisgICAgICAgIHJldHVybiBtZW1jbXAobURhdGEsIHJocy5tRGF0YSwgbVNpemUpIDwgMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbVNpemUgPCByaHMubVNpemU7CisgICAgfQorfQorCitjb25zdCB2b2lkKiBCbG9iQ2FjaGU6OkJsb2I6OmdldERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhOworfQorCitzaXplX3QgQmxvYkNhY2hlOjpCbG9iOjpnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2l6ZTsKK30KKworQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpDYWNoZUVudHJ5KCkgeworfQorCitCbG9iQ2FjaGU6OkNhY2hlRW50cnk6OkNhY2hlRW50cnkoY29uc3Qgc3A8QmxvYj4mIGtleSwgY29uc3Qgc3A8QmxvYj4mIHZhbHVlKToKKyAgICAgICAgbUtleShrZXkpLAorICAgICAgICBtVmFsdWUodmFsdWUpIHsKK30KKworQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpDYWNoZUVudHJ5KGNvbnN0IENhY2hlRW50cnkmIGNlKToKKyAgICAgICAgbUtleShjZS5tS2V5KSwKKyAgICAgICAgbVZhbHVlKGNlLm1WYWx1ZSkgeworfQorCitib29sIEJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6b3BlcmF0b3I8KGNvbnN0IENhY2hlRW50cnkmIHJocykgY29uc3QgeworICAgIHJldHVybiAqbUtleSA8ICpyaHMubUtleTsKK30KKworY29uc3QgQmxvYkNhY2hlOjpDYWNoZUVudHJ5JiBCbG9iQ2FjaGU6OkNhY2hlRW50cnk6Om9wZXJhdG9yPShjb25zdCBDYWNoZUVudHJ5JiByaHMpIHsKKyAgICBtS2V5ID0gcmhzLm1LZXk7CisgICAgbVZhbHVlID0gcmhzLm1WYWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3NwPEJsb2JDYWNoZTo6QmxvYj4gQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpnZXRLZXkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1LZXk7Cit9CisKK3NwPEJsb2JDYWNoZTo6QmxvYj4gQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZhbHVlOworfQorCit2b2lkIEJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6c2V0VmFsdWUoY29uc3Qgc3A8QmxvYj4mIHZhbHVlKSB7CisgICAgbVZhbHVlID0gdmFsdWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvUmVmQmFzZS5jcHAgYi9saWJzL3V0aWxzL1JlZkJhc2UuY3BwCmluZGV4IGRkMDA1MmEuLjhkYjIwMDk1IDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL1JlZkJhc2UuY3BwCisrKyBiL2xpYnMvdXRpbHMvUmVmQmFzZS5jcHAKQEAgLTQ5LDYgKzQ5LDExIEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitSZWZCYXNlOjpEZXN0cm95ZXI6On5EZXN0cm95ZXIoKSB7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjbGFzcyBSZWZCYXNlOjp3ZWFrcmVmX2ltcGwgOiBwdWJsaWMgUmVmQmFzZTo6d2Vha3JlZl90eXBlCiB7CiBwdWJsaWM6CkBAIC01Niw3ICs2MSw3IEBACiAgICAgdm9sYXRpbGUgaW50MzJfdCAgICBtV2VhazsKICAgICBSZWZCYXNlKiBjb25zdCAgICAgIG1CYXNlOwogICAgIHZvbGF0aWxlIGludDMyX3QgICAgbUZsYWdzOwotCisgICAgRGVzdHJveWVyKiAgICAgICAgICBtRGVzdHJveWVyOwogCiAjaWYgIURFQlVHX1JFRlMKIApAQCAtNjUsNiArNzAsNyBAQAogICAgICAgICAsIG1XZWFrKDApCiAgICAgICAgICwgbUJhc2UoYmFzZSkKICAgICAgICAgLCBtRmxhZ3MoMCkKKyAgICAgICAgLCBtRGVzdHJveWVyKDApCiAgICAgewogICAgIH0KIApAQCAtMzQ1LDEwICszNTEsNiBAQAogICAgIGNvbnN0X2Nhc3Q8UmVmQmFzZSo+KHRoaXMpLT5vbkZpcnN0UmVmKCk7CiB9CiAKLXZvaWQgUmVmQmFzZTo6ZGVzdHJveSgpIGNvbnN0IHsKLSAgICBkZWxldGUgdGhpczsKLX0KLQogdm9pZCBSZWZCYXNlOjpkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0CiB7CiAgICAgd2Vha3JlZl9pbXBsKiBjb25zdCByZWZzID0gbVJlZnM7CkBAIC0zNjEsNyArMzYzLDExIEBACiAgICAgaWYgKGMgPT0gMSkgewogICAgICAgICBjb25zdF9jYXN0PFJlZkJhc2UqPih0aGlzKS0+b25MYXN0U3Ryb25nUmVmKGlkKTsKICAgICAgICAgaWYgKChyZWZzLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX1dFQUspICE9IE9CSkVDVF9MSUZFVElNRV9XRUFLKSB7Ci0gICAgICAgICAgICBkZXN0cm95KCk7CisgICAgICAgICAgICBpZiAocmVmcy0+bURlc3Ryb3llcikgeworICAgICAgICAgICAgICAgIHJlZnMtPm1EZXN0cm95ZXItPmRlc3Ryb3kodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJlZnMtPmRlY1dlYWsoaWQpOwpAQCAtMzk0LDcgKzQwMCw5IEBACiAgICAgcmV0dXJuIG1SZWZzLT5tU3Ryb25nOwogfQogCi0KK3ZvaWQgUmVmQmFzZTo6c2V0RGVzdHJveWVyKFJlZkJhc2U6OkRlc3Ryb3llciogZGVzdHJveWVyKSB7CisgICAgbVJlZnMtPm1EZXN0cm95ZXIgPSBkZXN0cm95ZXI7Cit9CiAKIFJlZkJhc2UqIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6cmVmQmFzZSgpIGNvbnN0CiB7CkBAIC00MTgsMTggKzQyNiwyOCBAQAogICAgIGlmIChjICE9IDEpIHJldHVybjsKICAgICAKICAgICBpZiAoKGltcGwtPm1GbGFncyZPQkpFQ1RfTElGRVRJTUVfV0VBSykgIT0gT0JKRUNUX0xJRkVUSU1FX1dFQUspIHsKLSAgICAgICAgaWYgKGltcGwtPm1TdHJvbmcgPT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpCi0gICAgICAgICAgICBpZiAoaW1wbC0+bUJhc2UpCi0gICAgICAgICAgICAgICAgaW1wbC0+bUJhc2UtPmRlc3Ryb3koKTsKLSAgICAgICAgZWxzZSB7CisgICAgICAgIGlmIChpbXBsLT5tU3Ryb25nID09IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAoaW1wbC0+bUJhc2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1wbC0+bURlc3Ryb3llcikgeworICAgICAgICAgICAgICAgICAgICBpbXBsLT5tRGVzdHJveWVyLT5kZXN0cm95KGltcGwtPm1CYXNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgaW1wbC0+bUJhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gTE9HVigiRnJlZWluZyByZWZzICVwIG9mIG9sZCBSZWZCYXNlICVwXG4iLCB0aGlzLCBpbXBsLT5tQmFzZSk7CiAgICAgICAgICAgICBkZWxldGUgaW1wbDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGltcGwtPm1CYXNlLT5vbkxhc3RXZWFrUmVmKGlkKTsKICAgICAgICAgaWYgKChpbXBsLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX0ZPUkVWRVIpICE9IE9CSkVDVF9MSUZFVElNRV9GT1JFVkVSKSB7Ci0gICAgICAgICAgICBpZiAoaW1wbC0+bUJhc2UpCi0gICAgICAgICAgICAgICAgaW1wbC0+bUJhc2UtPmRlc3Ryb3koKTsKKyAgICAgICAgICAgIGlmIChpbXBsLT5tQmFzZSkgeworICAgICAgICAgICAgICAgIGlmIChpbXBsLT5tRGVzdHJveWVyKSB7CisgICAgICAgICAgICAgICAgICAgIGltcGwtPm1EZXN0cm95ZXItPmRlc3Ryb3koaW1wbC0+bUJhc2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbXBsLT5tQmFzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01NTEsOCArNTY5LDEwIEBACiAKIFJlZkJhc2U6On5SZWZCYXNlKCkKIHsKLSAgICBpZiAobVJlZnMtPm1XZWFrID09IDApIHsKLSAgICAgICAgZGVsZXRlIG1SZWZzOworICAgIGlmICgobVJlZnMtPm1GbGFncyAmIE9CSkVDVF9MSUZFVElNRV9XRUFLKSA9PSBPQkpFQ1RfTElGRVRJTUVfV0VBSykgeworICAgICAgICBpZiAobVJlZnMtPm1XZWFrID09IDApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUmVmczsKKyAgICAgICAgfQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcCBiL2xpYnMvdXRpbHMvUmVzb3VyY2VUeXBlcy5jcHAKaW5kZXggNGE2YTNkYi4uY2I2YzI0NiAxMDA2NDQKLS0tIGEvbGlicy91dGlscy9SZXNvdXJjZVR5cGVzLmNwcAorKysgYi9saWJzL3V0aWxzL1Jlc291cmNlVHlwZXMuY3BwCkBAIC0yNjYzLDYgKzI2NjMsOSBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIG5vcGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dFR5cGVTcGVjRmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAqb3V0VHlwZVNwZWNGbGFncyA9IFJlc1RhYmxlX3R5cGVTcGVjOjpTUEVDX1BVQkxJQzsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBtLT5pZDsKIG5vcGU6CiAgICAgICAgICAgICA7CkBAIC0yNjc3LDYgKzI2ODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvdXRUeXBlU3BlY0ZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRUeXBlU3BlY0ZsYWdzID0gUmVzVGFibGVfdHlwZVNwZWM6OlNQRUNfUFVCTElDOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gIFJlc19NQUtFQVJSQVkoaW5kZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjg3LDYgKzI2OTMsOCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBib29sIGZha2VQdWJsaWMgPSBmYWxzZTsKKwogICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHBhY2thZ2UgYW5kIHR5cGUgd2UgYXJlIGxvb2tpbmcgaW4uLi4KIAogICAgIGNvbnN0IGNoYXIxNl90KiBwYWNrYWdlRW5kID0gTlVMTDsKQEAgLTI2OTgsNyArMjcwNiwxMyBAQAogICAgICAgICBlbHNlIGlmICgqcCA9PSAnLycpIHR5cGVFbmQgPSBwOwogICAgICAgICBwKys7CiAgICAgfQotICAgIGlmICgqbmFtZSA9PSAnQCcpIG5hbWUrKzsKKyAgICBpZiAoKm5hbWUgPT0gJ0AnKSB7CisgICAgICAgIG5hbWUrKzsKKyAgICAgICAgaWYgKCpuYW1lID09ICcqJykgeworICAgICAgICAgICAgZmFrZVB1YmxpYyA9IHRydWU7CisgICAgICAgICAgICBuYW1lKys7CisgICAgICAgIH0KKyAgICB9CiAgICAgaWYgKG5hbWUgPj0gbmFtZUVuZCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yODAzLDYgKzI4MTcsOSBAQAogICAgICAgICAgICAgICAgIGlmIChkdG9obChlbnRyeS0+a2V5LmluZGV4KSA9PSAoc2l6ZV90KWVpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRUeXBlU3BlY0ZsYWdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0VHlwZVNwZWNGbGFncyA9IHR5cGVDb25maWdzLT50eXBlU3BlY0ZsYWdzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZha2VQdWJsaWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0VHlwZVNwZWNGbGFncyB8PSBSZXNUYWJsZV90eXBlU3BlYzo6U1BFQ19QVUJMSUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc19NQUtFSUQoZ3JvdXAtPmlkLTEsIHRpLCBpKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yODE5LDcgKzI4MzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYqIG91dE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiogZGVmVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2KiBkZWZQYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG91dEVycm9yTXNnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG91dEVycm9yTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogb3V0UHVibGljT25seSkKIHsKICAgICBjb25zdCBjaGFyMTZfdCogcGFja2FnZUVuZCA9IE5VTEw7CiAgICAgY29uc3QgY2hhcjE2X3QqIHR5cGVFbmQgPSBOVUxMOwpAQCAtMjgzNiw2ICsyODU0LDE2IEBACiAgICAgcCA9IHJlZlN0cjsKICAgICBpZiAoKnAgPT0gJ0AnKSBwKys7CiAKKyAgICBpZiAob3V0UHVibGljT25seSAhPSBOVUxMKSB7CisgICAgICAgICpvdXRQdWJsaWNPbmx5ID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCpwID09ICcqJykgeworICAgICAgICBwKys7CisgICAgICAgIGlmIChvdXRQdWJsaWNPbmx5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpvdXRQdWJsaWNPbmx5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAocGFja2FnZUVuZCkgewogICAgICAgICAqb3V0UGFja2FnZSA9IFN0cmluZzE2KHAsIHBhY2thZ2VFbmQtcCk7CiAgICAgICAgIHAgPSBwYWNrYWdlRW5kKzE7CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1N0cmVhbWluZ1ppcEluZmxhdGVyLmNwcCBiL2xpYnMvdXRpbHMvU3RyZWFtaW5nWmlwSW5mbGF0ZXIuY3BwCmluZGV4IDVhMTYyY2MuLjAwNDk4YmQgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvU3RyZWFtaW5nWmlwSW5mbGF0ZXIuY3BwCisrKyBiL2xpYnMvdXRpbHMvU3RyZWFtaW5nWmlwSW5mbGF0ZXIuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19OREVCVUcgMQorLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJzemlwaW5mIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCkBAIC03Nyw3ICs3Nyw3IEBACiB9CiAKIHZvaWQgU3RyZWFtaW5nWmlwSW5mbGF0ZXI6OmluaXRJbmZsYXRlU3RhdGUoKSB7Ci0gICAgTE9HRCgiSW5pdGlhbGl6aW5nIGluZmxhdGUgc3RhdGUiKTsKKyAgICBMT0dWKCJJbml0aWFsaXppbmcgaW5mbGF0ZSBzdGF0ZSIpOwogCiAgICAgbWVtc2V0KCZtSW5mbGF0ZVN0YXRlLCAwLCBzaXplb2YobUluZmxhdGVTdGF0ZSkpOwogICAgIG1JbmZsYXRlU3RhdGUuemFsbG9jID0gWl9OVUxMOwpAQCAtMTUyLDEzICsxNTIsMTMgQEAKICAgICAgICAgICAgIG1JbmZsYXRlU3RhdGUuYXZhaWxfb3V0ID0gbU91dEJ1ZlNpemU7CiAKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBMT0dEKCJJbmZsYXRpbmcgdG8gb3V0YnVmOiBhdmFpbF9pbj0ldSBhdmFpbF9vdXQ9JXUgbmV4dF9pbj0lcCBuZXh0X291dD0lcCIsCisgICAgICAgICAgICBMT0dWKCJJbmZsYXRpbmcgdG8gb3V0YnVmOiBhdmFpbF9pbj0ldSBhdmFpbF9vdXQ9JXUgbmV4dF9pbj0lcCBuZXh0X291dD0lcCIsCiAgICAgICAgICAgICAgICAgICAgIG1JbmZsYXRlU3RhdGUuYXZhaWxfaW4sIG1JbmZsYXRlU3RhdGUuYXZhaWxfb3V0LAogICAgICAgICAgICAgICAgICAgICBtSW5mbGF0ZVN0YXRlLm5leHRfaW4sIG1JbmZsYXRlU3RhdGUubmV4dF9vdXQpOwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGludCByZXN1bHQgPSBaX09LOwogICAgICAgICAgICAgaWYgKG1TdHJlYW1OZWVkc0luaXQpIHsKLSAgICAgICAgICAgICAgICBMT0dEKCJJbml0aWFsaXppbmcgemxpYiB0byBpbmZsYXRlIik7CisgICAgICAgICAgICAgICAgTE9HVigiSW5pdGlhbGl6aW5nIHpsaWIgdG8gaW5mbGF0ZSIpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGluZmxhdGVJbml0MigmbUluZmxhdGVTdGF0ZSwgLU1BWF9XQklUUyk7CiAgICAgICAgICAgICAgICAgbVN0cmVhbU5lZWRzSW5pdCA9IGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgICAgIHNpemVfdCB0b1JlYWQgPSBtaW5fb2YobUluQnVmU2l6ZSwgbUluVG90YWxTaXplIC0gbUluTmV4dENodW5rT2Zmc2V0KTsKICAgICAgICAgaWYgKHRvUmVhZCA+IDApIHsKICAgICAgICAgICAgIHNzaXplX3QgZGlkUmVhZCA9IDo6cmVhZChtRmQsIG1JbkJ1ZiwgdG9SZWFkKTsKLSAgICAgICAgICAgIC8vTE9HRCgiUmVhZGluZyBpbnB1dCBjaHVuaywgc2l6ZSAlMDh4IGRpZHJlYWQgJTA4eCIsIHRvUmVhZCwgZGlkUmVhZCk7CisgICAgICAgICAgICAvL0xPR1YoIlJlYWRpbmcgaW5wdXQgY2h1bmssIHNpemUgJTA4eCBkaWRyZWFkICUwOHgiLCB0b1JlYWQsIGRpZFJlYWQpOwogICAgICAgICAgICAgaWYgKGRpZFJlYWQgPCAwKSB7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciByZWFkaW5nIGFzc2V0IGRhdGEiKTsKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAgYi9saWJzL3V0aWxzL1RocmVhZHMuY3BwCmluZGV4IDhiNWRhMGUuLjE1YmIxZDIgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAKKysrIGIvbGlicy91dGlscy9UaHJlYWRzLmNwcApAQCAtMTY4LDYgKzE2OCw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8vIE5vdGUgdGhhdCAqdGhyZWFkSUQgaXMgZGlyZWN0bHkgYXZhaWxhYmxlIHRvIHRoZSBwYXJlbnQgb25seSwgYXMgaXQgaXMKKyAgICAvLyBhc3NpZ25lZCBhZnRlciB0aGUgY2hpbGQgc3RhcnRzLiAgVXNlIG1lbW9yeSBiYXJyaWVyIC8gbG9jayBpZiB0aGUgY2hpbGQKKyAgICAvLyBvciBvdGhlciB0aHJlYWRzIGFsc28gbmVlZCBhY2Nlc3MuCiAgICAgaWYgKHRocmVhZElkICE9IE5VTEwpIHsKICAgICAgICAgKnRocmVhZElkID0gKGFuZHJvaWRfdGhyZWFkX2lkX3QpdGhyZWFkOyAvLyBYWFg6IHRoaXMgaXMgbm90IHBvcnRhYmxlCiAgICAgfQpAQCAtMzMyLDEwICszMzUsMTcgQEAKIAogICAgIHB0aHJlYWRfb25jZSgmZ0RvU2NoZWR1bGluZ0dyb3VwT25jZSwgY2hlY2tEb1NjaGVkdWxpbmdHcm91cCk7CiAgICAgaWYgKGdEb1NjaGVkdWxpbmdHcm91cCkgeworICAgICAgICAvLyBzZXRfc2NoZWRfcG9saWN5IGRvZXMgbm90IHN1cHBvcnQgdGlkID09IDAKKyAgICAgICAgaW50IHBvbGljeV90aWQ7CisgICAgICAgIGlmICh0aWQgPT0gMCkgeworICAgICAgICAgICAgcG9saWN5X3RpZCA9IGFuZHJvaWRHZXRUaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvbGljeV90aWQgPSB0aWQ7CisgICAgICAgIH0KICAgICAgICAgaWYgKHByaSA+PSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgIHJjID0gc2V0X3NjaGVkX3BvbGljeSh0aWQsIFNQX0JBQ0tHUk9VTkQpOworICAgICAgICAgICAgcmMgPSBzZXRfc2NoZWRfcG9saWN5KHBvbGljeV90aWQsIFNQX0JBQ0tHUk9VTkQpOwogICAgICAgICB9IGVsc2UgaWYgKGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgdGlkKSA+PSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgIHJjID0gc2V0X3NjaGVkX3BvbGljeSh0aWQsIFNQX0ZPUkVHUk9VTkQpOworICAgICAgICAgICAgcmMgPSBzZXRfc2NoZWRfcG9saWN5KHBvbGljeV90aWQsIFNQX0ZPUkVHUk9VTkQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MTgsNyArNzI4LDYgQEAKICAgICAgICAgcmVzID0gYW5kcm9pZENyZWF0ZVJhd1RocmVhZEV0YyhfdGhyZWFkTG9vcCwKICAgICAgICAgICAgICAgICB0aGlzLCBuYW1lLCBwcmlvcml0eSwgc3RhY2ssICZtVGhyZWFkKTsKICAgICB9Ci0gICAgLy8gVGhlIG5ldyB0aHJlYWQgd2FrZXMgdXAgYXQgX3RocmVhZExvb3AsIGJ1dCBpbW1lZGlhdGVseSBibG9ja3Mgb24gbUxvY2sKICAgICAKICAgICBpZiAocmVzID09IGZhbHNlKSB7CiAgICAgICAgIG1TdGF0dXMgPSBVTktOT1dOX0VSUk9SOyAgIC8vIHNvbWV0aGluZyBoYXBwZW5lZCEKQEAgLTc0MiwxMSArNzUxLDYgQEAKIHsKICAgICBUaHJlYWQqIGNvbnN0IHNlbGYgPSBzdGF0aWNfY2FzdDxUaHJlYWQqPih1c2VyKTsKIAotICAgIC8vIGZvcmNlIGEgbWVtb3J5IGJhcnJpZXIgYmVmb3JlIHJlYWRpbmcgYW55IGZpZWxkcywgaW4gcGFydGljdWxhciBtSG9sZFNlbGYKLSAgICB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNlbGYtPm1Mb2NrKTsKLSAgICB9Ci0KICAgICBzcDxUaHJlYWQ+IHN0cm9uZyhzZWxmLT5tSG9sZFNlbGYpOwogICAgIHdwPFRocmVhZD4gd2VhayhzdHJvbmcpOwogICAgIHNlbGYtPm1Ib2xkU2VsZi5jbGVhcigpOwpAQCAtODE2LDYgKzgyMCw3IEBACiAKIHN0YXR1c190IFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtVGhyZWFkID09IGdldFRocmVhZElkKCkpIHsKICAgICAgICAgTE9HVygKICAgICAgICAgIlRocmVhZCAodGhpcz0lcCk6IGRvbid0IGNhbGwgd2FpdEZvckV4aXQoKSBmcm9tIHRoaXMgIgpAQCAtODI1LDkgKzgzMCw4IEBACiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKICAgICB9CiAgICAgCi0gICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtRXhpdFBlbmRpbmcgPSB0cnVlOwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICB3aGlsZSAobVJ1bm5pbmcgPT0gdHJ1ZSkgewogICAgICAgICBtVGhyZWFkRXhpdGVkQ29uZGl0aW9uLndhaXQobUxvY2spOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvdGVzdHMvQW5kcm9pZC5tayBiL2xpYnMvdXRpbHMvdGVzdHMvQW5kcm9pZC5tawppbmRleCA3MmQ0ODc2Li44N2FkOThlIDEwMDY0NAotLS0gYS9saWJzL3V0aWxzL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbGlicy91dGlscy90ZXN0cy9BbmRyb2lkLm1rCkBAIC02LDYgKzYsNyBAQAogCiAjIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgogdGVzdF9zcmNfZmlsZXMgOj0gXAorCUJsb2JDYWNoZV90ZXN0LmNwcCBcCiAJT2JiRmlsZV90ZXN0LmNwcCBcCiAJTG9vcGVyX3Rlc3QuY3BwIFwKIAlTdHJpbmc4X3Rlc3QuY3BwIFwKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvdGVzdHMvQmxvYkNhY2hlX3Rlc3QuY3BwIGIvbGlicy91dGlscy90ZXN0cy9CbG9iQ2FjaGVfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzZWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvdXRpbHMvdGVzdHMvQmxvYkNhY2hlX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKioKKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKioKKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9CbG9iQ2FjaGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBCbG9iQ2FjaGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisgICAgZW51bSB7CisgICAgICAgIE1BWF9LRVlfU0laRSA9IDYsCisgICAgICAgIE1BWF9WQUxVRV9TSVpFID0gOCwKKyAgICAgICAgTUFYX1RPVEFMX1NJWkUgPSAxMywKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgeworICAgICAgICBtQkMgPSBuZXcgQmxvYkNhY2hlKE1BWF9LRVlfU0laRSwgTUFYX1ZBTFVFX1NJWkUsIE1BWF9UT1RBTF9TSVpFKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CisgICAgICAgIG1CQy5jbGVhcigpOworICAgIH0KKworICAgIHNwPEJsb2JDYWNoZT4gbUJDOworfTsKKworVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlU2luZ2xlVmFsdWVTdWNjZWVkcykgeworICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07CisgICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiZWZnaCIsIDQpOworICAgIEFTU0VSVF9FUShzaXplX3QoNCksIG1CQy0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7CisgICAgQVNTRVJUX0VRKCdlJywgYnVmWzBdKTsKKyAgICBBU1NFUlRfRVEoJ2YnLCBidWZbMV0pOworICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlsyXSk7CisgICAgQVNTRVJUX0VRKCdoJywgYnVmWzNdKTsKK30KKworVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlVHdvVmFsdWVzU3VjY2VlZHMpIHsKKyAgICBjaGFyIGJ1ZlsyXSA9IHsgMHhlZSwgMHhlZSB9OworICAgIG1CQy0+c2V0KCJhYiIsIDIsICJjZCIsIDIpOworICAgIG1CQy0+c2V0KCJlZiIsIDIsICJnaCIsIDIpOworICAgIEFTU0VSVF9FUShzaXplX3QoMiksIG1CQy0+Z2V0KCJhYiIsIDIsIGJ1ZiwgMikpOworICAgIEFTU0VSVF9FUSgnYycsIGJ1ZlswXSk7CisgICAgQVNTRVJUX0VRKCdkJywgYnVmWzFdKTsKKyAgICBBU1NFUlRfRVEoc2l6ZV90KDIpLCBtQkMtPmdldCgiZWYiLCAyLCBidWYsIDIpKTsKKyAgICBBU1NFUlRfRVEoJ2cnLCBidWZbMF0pOworICAgIEFTU0VSVF9FUSgnaCcsIGJ1ZlsxXSk7Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBHZXRPbmx5V3JpdGVzSW5zaWRlQm91bmRzKSB7CisgICAgY2hhciBidWZbNl0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKKyAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7CisgICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYrMSwgNCkpOworICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMF0pOworICAgIEFTU0VSVF9FUSgnZScsIGJ1ZlsxXSk7CisgICAgQVNTRVJUX0VRKCdmJywgYnVmWzJdKTsKKyAgICBBU1NFUlRfRVEoJ2cnLCBidWZbM10pOworICAgIEFTU0VSVF9FUSgnaCcsIGJ1Zls0XSk7CisgICAgQVNTRVJUX0VRKDB4ZWUsIGJ1Zls1XSk7Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBHZXRPbmx5V3JpdGVzSWZCdWZmZXJJc0xhcmdlRW5vdWdoKSB7CisgICAgY2hhciBidWZbM10gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKKyAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7CisgICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIDMpKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzBdKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzFdKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzJdKTsKK30KKworVEVTVF9GKEJsb2JDYWNoZVRlc3QsIEdldERvZXNudEFjY2Vzc051bGxCdWZmZXIpIHsKKyAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7CisgICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBOVUxMLCAwKSk7Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBNdWx0aXBsZVNldHNDYWNoZUxhdGVzdFZhbHVlKSB7CisgICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKKyAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7CisgICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiaWprbCIsIDQpOworICAgIEFTU0VSVF9FUShzaXplX3QoNCksIG1CQy0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7CisgICAgQVNTRVJUX0VRKCdpJywgYnVmWzBdKTsKKyAgICBBU1NFUlRfRVEoJ2onLCBidWZbMV0pOworICAgIEFTU0VSVF9FUSgnaycsIGJ1ZlsyXSk7CisgICAgQVNTRVJUX0VRKCdsJywgYnVmWzNdKTsKK30KKworVEVTVF9GKEJsb2JDYWNoZVRlc3QsIFNlY29uZFNldEtlZXBzRmlyc3RWYWx1ZUlmVG9vTGFyZ2UpIHsKKyAgICBjaGFyIGJ1ZltNQVhfVkFMVUVfU0laRSsxXSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OworICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKKyAgICBtQkMtPnNldCgiYWJjZCIsIDQsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUrMSk7CisgICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKKyAgICBBU1NFUlRfRVEoJ2UnLCBidWZbMF0pOworICAgIEFTU0VSVF9FUSgnZicsIGJ1ZlsxXSk7CisgICAgQVNTRVJUX0VRKCdnJywgYnVmWzJdKTsKKyAgICBBU1NFUlRfRVEoJ2gnLCBidWZbM10pOworfQorCitURVNUX0YoQmxvYkNhY2hlVGVzdCwgRG9lc250Q2FjaGVJZktleUlzVG9vQmlnKSB7CisgICAgY2hhciBrZXlbTUFYX0tFWV9TSVpFKzFdOworICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfS0VZX1NJWkUrMTsgaSsrKSB7CisgICAgICAgIGtleVtpXSA9ICdhJzsKKyAgICB9CisgICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUrMSwgImJiYmIiLCA0KTsKKyAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMtPmdldChrZXksIE1BWF9LRVlfU0laRSsxLCBidWYsIDQpKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzBdKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzFdKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzJdKTsKKyAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzNdKTsKK30KKworVEVTVF9GKEJsb2JDYWNoZVRlc3QsIERvZXNudENhY2hlSWZWYWx1ZUlzVG9vQmlnKSB7CisgICAgY2hhciBidWZbTUFYX1ZBTFVFX1NJWkUrMV07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRSsxOyBpKyspIHsKKyAgICAgICAgYnVmW2ldID0gJ2InOworICAgIH0KKyAgICBtQkMtPnNldCgiYWJjZCIsIDQsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUrMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRSsxOyBpKyspIHsKKyAgICAgICAgYnVmW2ldID0gMHhlZTsKKyAgICB9CisgICAgQVNTRVJUX0VRKHNpemVfdCgwKSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIE1BWF9WQUxVRV9TSVpFKzEpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9WQUxVRV9TSVpFKzE7IGkrKykgeworICAgICAgICBTQ09QRURfVFJBQ0UoaSk7CisgICAgICAgIEFTU0VSVF9FUSgweGVlLCBidWZbaV0pOworICAgIH0KK30KKworVEVTVF9GKEJsb2JDYWNoZVRlc3QsIERvZXNudENhY2hlSWZLZXlWYWx1ZVBhaXJJc1Rvb0JpZykgeworICAgIC8vIENoZWNrIGEgdGVzdGluZyBhc3N1bXB0aW9ucworICAgIEFTU0VSVF9UUlVFKE1BWF9UT1RBTF9TSVpFIDwgTUFYX0tFWV9TSVpFICsgTUFYX1ZBTFVFX1NJWkUpOworICAgIEFTU0VSVF9UUlVFKE1BWF9LRVlfU0laRSA8IE1BWF9UT1RBTF9TSVpFKTsKKworICAgIGVudW0geyBidWZTaXplID0gTUFYX1RPVEFMX1NJWkUgLSBNQVhfS0VZX1NJWkUgKyAxIH07CisKKyAgICBjaGFyIGtleVtNQVhfS0VZX1NJWkVdOworICAgIGNoYXIgYnVmW2J1ZlNpemVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0tFWV9TSVpFOyBpKyspIHsKKyAgICAgICAga2V5W2ldID0gJ2EnOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZlNpemU7IGkrKykgeworICAgICAgICBidWZbaV0gPSAnYic7CisgICAgfQorCisgICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUpOworICAgIEFTU0VSVF9FUShzaXplX3QoMCksIG1CQy0+Z2V0KGtleSwgTUFYX0tFWV9TSVpFLCBOVUxMLCAwKSk7Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1heEtleVNpemVTdWNjZWVkcykgeworICAgIGNoYXIga2V5W01BWF9LRVlfU0laRV07CisgICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9LRVlfU0laRTsgaSsrKSB7CisgICAgICAgIGtleVtpXSA9ICdhJzsKKyAgICB9CisgICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUsICJ3eHl6IiwgNCk7CisgICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoa2V5LCBNQVhfS0VZX1NJWkUsIGJ1ZiwgNCkpOworICAgIEFTU0VSVF9FUSgndycsIGJ1ZlswXSk7CisgICAgQVNTRVJUX0VRKCd4JywgYnVmWzFdKTsKKyAgICBBU1NFUlRfRVEoJ3knLCBidWZbMl0pOworICAgIEFTU0VSVF9FUSgneicsIGJ1ZlszXSk7Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1heFZhbHVlU2l6ZVN1Y2NlZWRzKSB7CisgICAgY2hhciBidWZbTUFYX1ZBTFVFX1NJWkVdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1ZBTFVFX1NJWkU7IGkrKykgeworICAgICAgICBidWZbaV0gPSAnYic7CisgICAgfQorICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgYnVmLCBNQVhfVkFMVUVfU0laRSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRTsgaSsrKSB7CisgICAgICAgIGJ1ZltpXSA9IDB4ZWU7CisgICAgfQorICAgIEFTU0VSVF9FUShzaXplX3QoTUFYX1ZBTFVFX1NJWkUpLCBtQkMtPmdldCgiYWJjZCIsIDQsIGJ1ZiwKKyAgICAgICAgICAgIE1BWF9WQUxVRV9TSVpFKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRTsgaSsrKSB7CisgICAgICAgIFNDT1BFRF9UUkFDRShpKTsKKyAgICAgICAgQVNTRVJUX0VRKCdiJywgYnVmW2ldKTsKKyAgICB9Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1heEtleVZhbHVlUGFpclNpemVTdWNjZWVkcykgeworICAgIC8vIENoZWNrIGEgdGVzdGluZyBhc3N1bXB0aW9uCisgICAgQVNTRVJUX1RSVUUoTUFYX0tFWV9TSVpFIDwgTUFYX1RPVEFMX1NJWkUpOworCisgICAgZW51bSB7IGJ1ZlNpemUgPSBNQVhfVE9UQUxfU0laRSAtIE1BWF9LRVlfU0laRSB9OworCisgICAgY2hhciBrZXlbTUFYX0tFWV9TSVpFXTsKKyAgICBjaGFyIGJ1ZltidWZTaXplXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9LRVlfU0laRTsgaSsrKSB7CisgICAgICAgIGtleVtpXSA9ICdhJzsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZTaXplOyBpKyspIHsKKyAgICAgICAgYnVmW2ldID0gJ2InOworICAgIH0KKworICAgIG1CQy0+c2V0KGtleSwgTUFYX0tFWV9TSVpFLCBidWYsIGJ1ZlNpemUpOworICAgIEFTU0VSVF9FUShzaXplX3QoYnVmU2l6ZSksIG1CQy0+Z2V0KGtleSwgTUFYX0tFWV9TSVpFLCBOVUxMLCAwKSk7Cit9CisKK1RFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZU1pbktleUFuZFZhbHVlU2l6ZVN1Y2NlZWRzKSB7CisgICAgY2hhciBidWZbMV0gPSB7IDB4ZWUgfTsKKyAgICBtQkMtPnNldCgieCIsIDEsICJ5IiwgMSk7CisgICAgQVNTRVJUX0VRKHNpemVfdCgxKSwgbUJDLT5nZXQoIngiLCAxLCBidWYsIDEpKTsKKyAgICBBU1NFUlRfRVEoJ3knLCBidWZbMF0pOworfQorCitURVNUX0YoQmxvYkNhY2hlVGVzdCwgQ2FjaGVTaXplRG9lc250RXhjZWVkVG90YWxMaW1pdCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBrID0gaTsKKyAgICAgICAgbUJDLT5zZXQoJmssIDEsICJ4IiwgMSk7CisgICAgfQorICAgIGludCBudW1DYWNoZWQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgdWludDhfdCBrID0gaTsKKyAgICAgICAgaWYgKG1CQy0+Z2V0KCZrLCAxLCBOVUxMLCAwKSA9PSAxKSB7CisgICAgICAgICAgICBudW1DYWNoZWQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfR0UoTUFYX1RPVEFMX1NJWkUgLyAyLCBudW1DYWNoZWQpOworfQorCitURVNUX0YoQmxvYkNhY2hlVGVzdCwgRXhjZWVkaW5nVG90YWxMaW1pdEhhbHZlc0NhY2hlU2l6ZSkgeworICAgIC8vIEZpbGwgdXAgdGhlIGVudGlyZSBjYWNoZSB3aXRoIDEgY2hhciBrZXkvdmFsdWUgcGFpcnMuCisgICAgY29uc3QgaW50IG1heEVudHJpZXMgPSBNQVhfVE9UQUxfU0laRSAvIDI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBrID0gaTsKKyAgICAgICAgbUJDLT5zZXQoJmssIDEsICJ4IiwgMSk7CisgICAgfQorICAgIC8vIEluc2VydCBvbmUgbW9yZSBlbnRyeSwgY2F1c2luZyBhIGNhY2hlIG92ZXJmbG93LgorICAgIHsKKyAgICAgICAgdWludDhfdCBrID0gbWF4RW50cmllczsKKyAgICAgICAgbUJDLT5zZXQoJmssIDEsICJ4IiwgMSk7CisgICAgfQorICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgY2FjaGUuCisgICAgaW50IG51bUNhY2hlZCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhFbnRyaWVzKzE7IGkrKykgeworICAgICAgICB1aW50OF90IGsgPSBpOworICAgICAgICBpZiAobUJDLT5nZXQoJmssIDEsIE5VTEwsIDApID09IDEpIHsKKyAgICAgICAgICAgIG51bUNhY2hlZCsrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtYXhFbnRyaWVzLzIgKyAxLCBudW1DYWNoZWQpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFGaWxlLmphdmEKaW5kZXggYTU0Y2YyOC4uNzYzNGM2YyAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhRmlsZS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYUZpbGUuamF2YQpAQCAtNzYsOCArNzYsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9QTkcgICAgID0gMzM7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9UWVBFX0JNUCAgICAgPSAzNDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxFX1RZUEVfV0JNUCAgICA9IDM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9XRUJQICAgID0gMzY7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJUlNUX0lNQUdFX0ZJTEVfVFlQRSA9IEZJTEVfVFlQRV9KUEVHOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX0lNQUdFX0ZJTEVfVFlQRSA9IEZJTEVfVFlQRV9XQk1QOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMQVNUX0lNQUdFX0ZJTEVfVFlQRSA9IEZJTEVfVFlQRV9XRUJQOwogICAgCiAgICAgLy8gUGxheWxpc3QgZmlsZSB0eXBlcwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTEVfVFlQRV9NM1UgICAgICA9IDQxOwpAQCAtMjEzLDYgKzIxNCw3IEBACiAgICAgICAgIGFkZEZpbGVUeXBlKCJQTkciLCBGSUxFX1RZUEVfUE5HLCAiaW1hZ2UvcG5nIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9QTkcpOwogICAgICAgICBhZGRGaWxlVHlwZSgiQk1QIiwgRklMRV9UWVBFX0JNUCwgImltYWdlL3gtbXMtYm1wIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9CTVApOwogICAgICAgICBhZGRGaWxlVHlwZSgiV0JNUCIsIEZJTEVfVFlQRV9XQk1QLCAiaW1hZ2Uvdm5kLndhcC53Ym1wIik7CisgICAgICAgIGFkZEZpbGVUeXBlKCJXRUJQIiwgRklMRV9UWVBFX1dCTVAsICJpbWFnZS93ZWJwIik7CiAgCiAgICAgICAgIGFkZEZpbGVUeXBlKCJNM1UiLCBGSUxFX1RZUEVfTTNVLCAiYXVkaW8veC1tcGVndXJsIiwgTXRwQ29uc3RhbnRzLkZPUk1BVF9NM1VfUExBWUxJU1QpOwogICAgICAgICBhZGRGaWxlVHlwZSgiTTNVIiwgRklMRV9UWVBFX00zVSwgImFwcGxpY2F0aW9uL3gtbXBlZ3VybCIsIE10cENvbnN0YW50cy5GT1JNQVRfTTNVX1BMQVlMSVNUKTsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllci5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKaW5kZXggOGY3ZGQ2MC4uMjU1NzczMCAxMDA2NDQKLS0tIGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWVyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhcmNlbFN1cmZhY2VUZXh0dXJlOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiAKQEAgLTUxLDYgKzUyLDcgQEAKICAqIDxsaT48YSBocmVmPSIjU3RhdGVEaWFncmFtIj5TdGF0ZSBEaWFncmFtPC9hPgogICogPGxpPjxhIGhyZWY9IiNWYWxpZF9hbmRfSW52YWxpZF9TdGF0ZXMiPlZhbGlkIGFuZCBJbnZhbGlkIFN0YXRlczwvYT4KICAqIDxsaT48YSBocmVmPSIjUGVybWlzc2lvbnMiPlBlcm1pc3Npb25zPC9hPgorICogPGxpPjxhIGhyZWY9IiNDYWxsYmFja3MiPlJlZ2lzdGVyIGluZm9ybWF0aW9uYWwgYW5kIGVycm9yIGNhbGxiYWNrczwvYT4KICAqIDwvb2w+CiAgKgogICogPGEgbmFtZT0iU3RhdGVEaWFncmFtIj48L2E+CkBAIC00NTgsNiArNDYwLDI1IEBACiAgKiBhbmRyb2lkLlIuc3R5bGVhYmxlI0FuZHJvaWRNYW5pZmVzdFVzZXNQZXJtaXNzaW9uICZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7fQogICogZWxlbWVudC4KICAqCisgKiA8YSBuYW1lPSJDYWxsYmFja3MiPjwvYT4KKyAqIDxoMz5DYWxsYmFja3M8L2gzPgorICogPHA+QXBwbGljYXRpb25zIG1heSB3YW50IHRvIHJlZ2lzdGVyIGZvciBpbmZvcm1hdGlvbmFsIGFuZCBlcnJvcgorICogZXZlbnRzIGluIG9yZGVyIHRvIGJlIGluZm9ybWVkIG9mIHNvbWUgaW50ZXJuYWwgc3RhdGUgdXBkYXRlIGFuZAorICogcG9zc2libGUgcnVudGltZSBlcnJvcnMgZHVyaW5nIHBsYXliYWNrIG9yIHN0cmVhbWluZy4gUmVnaXN0cmF0aW9uIGZvcgorICogdGhlc2UgZXZlbnRzIGlzIGRvbmUgYnkgcHJvcGVybHkgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzICh2aWEgY2FsbHMKKyAqIHRvCisgKiB7QGxpbmsgI3NldE9uUHJlcGFyZWRMaXN0ZW5lcihPblByZXBhcmVkTGlzdGVuZXIpfXNldE9uUHJlcGFyZWRMaXN0ZW5lciwKKyAqIHtAbGluayAjc2V0T25WaWRlb1NpemVDaGFuZ2VkTGlzdGVuZXIoT25WaWRlb1NpemVDaGFuZ2VkTGlzdGVuZXIpfXNldE9uVmlkZW9TaXplQ2hhbmdlZExpc3RlbmVyLAorICoge0BsaW5rICNzZXRPblNlZWtDb21wbGV0ZUxpc3RlbmVyKE9uU2Vla0NvbXBsZXRlTGlzdGVuZXIpfXNldE9uU2Vla0NvbXBsZXRlTGlzdGVuZXIsCisgKiB7QGxpbmsgI3NldE9uQ29tcGxldGlvbkxpc3RlbmVyKE9uQ29tcGxldGlvbkxpc3RlbmVyKX1zZXRPbkNvbXBsZXRpb25MaXN0ZW5lciwKKyAqIHtAbGluayAjc2V0T25CdWZmZXJpbmdVcGRhdGVMaXN0ZW5lcihPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyKX1zZXRPbkJ1ZmZlcmluZ1VwZGF0ZUxpc3RlbmVyLAorICoge0BsaW5rICNzZXRPbkluZm9MaXN0ZW5lcihPbkluZm9MaXN0ZW5lcil9c2V0T25JbmZvTGlzdGVuZXIsCisgKiB7QGxpbmsgI3NldE9uRXJyb3JMaXN0ZW5lcihPbkVycm9yTGlzdGVuZXIpfXNldE9uRXJyb3JMaXN0ZW5lciwgZXRjKS4KKyAqIEluIG9yZGVyIHRvIHJlY2VpdmUgdGhlIHJlc3BlY3RpdmUgY2FsbGJhY2sKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBsaXN0ZW5lcnMsIGFwcGxpY2F0aW9ucyBhcmUgcmVxdWlyZWQgdG8gY3JlYXRlCisgKiBNZWRpYVBsYXllciBvYmplY3RzIG9uIGEgdGhyZWFkIHdpdGggaXRzIG93biBMb29wZXIgcnVubmluZyAobWFpbiBVSQorICogdGhyZWFkIGJ5IGRlZmF1bHQgaGFzIGEgTG9vcGVyIHJ1bm5pbmcpLgorICoKICAqLwogcHVibGljIGNsYXNzIE1lZGlhUGxheWVyCiB7CkBAIC01MDksNyArNTMwLDcgQEAKICAgICBwcml2YXRlIGludCBtTGlzdGVuZXJDb250ZXh0OyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgbWV0aG9kcwogICAgIHByaXZhdGUgU3VyZmFjZSBtU3VyZmFjZTsgLy8gYWNjZXNzZWQgYnkgbmF0aXZlIG1ldGhvZHMKICAgICBwcml2YXRlIFN1cmZhY2VIb2xkZXIgIG1TdXJmYWNlSG9sZGVyOwotICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgbWV0aG9kcworICAgIHByaXZhdGUgUGFyY2VsU3VyZmFjZVRleHR1cmUgbVBhcmNlbFN1cmZhY2VUZXh0dXJlOyAvLyBhY2Nlc3NlZCBieSBuYXRpdmUgbWV0aG9kcwogICAgIHByaXZhdGUgRXZlbnRIYW5kbGVyIG1FdmVudEhhbmRsZXI7CiAgICAgcHJpdmF0ZSBQb3dlck1hbmFnZXIuV2FrZUxvY2sgbVdha2VMb2NrID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNjcmVlbk9uV2hpbGVQbGF5aW5nOwpAQCAtNTQxLDcgKzU2Miw3IEBACiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgTWVkaWFQbGF5ZXIgSVN1cmZhY2UgYW5kIElTdXJmYWNlVGV4dHVyZS4KLSAgICAgKiBDYWxsIGFmdGVyIHVwZGF0aW5nIG1TdXJmYWNlIGFuZC9vciBtU3VyZmFjZVRleHR1cmUuCisgICAgICogQ2FsbCBhZnRlciB1cGRhdGluZyBtU3VyZmFjZSBhbmQvb3IgbVBhcmNlbFN1cmZhY2VUZXh0dXJlLgogICAgICAqLwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX3NldFZpZGVvU3VyZmFjZU9yU3VyZmFjZVRleHR1cmUoKTsKIApAQCAtNjA3LDcgKzYyOCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtU3VyZmFjZSA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gbnVsbDsKKyAgICAgICAgbVBhcmNlbFN1cmZhY2VUZXh0dXJlID0gbnVsbDsKICAgICAgICAgX3NldFZpZGVvU3VyZmFjZU9yU3VyZmFjZVRleHR1cmUoKTsKICAgICAgICAgdXBkYXRlU3VyZmFjZVNjcmVlbk9uKCk7CiAgICAgfQpAQCAtNjMwLDEyICs2NTEsMzIgQEAKICAgICAgKiBwcm9ncmFtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRleHR1cmUoU3VyZmFjZVRleHR1cmUgc3QpIHsKLSAgICAgICAgaWYgKG1TY3JlZW5PbldoaWxlUGxheWluZyAmJiBzdCAhPSBudWxsICYmIG1TdXJmYWNlVGV4dHVyZSA9PSBudWxsKSB7CisgICAgICAgIFBhcmNlbFN1cmZhY2VUZXh0dXJlIHBzdCA9IG51bGw7CisgICAgICAgIGlmIChzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBwc3QgPSBQYXJjZWxTdXJmYWNlVGV4dHVyZS5mcm9tU3VyZmFjZVRleHR1cmUoc3QpOworICAgICAgICB9CisgICAgICAgIHNldFBhcmNlbFN1cmZhY2VUZXh0dXJlKHBzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIFBhcmNlbFN1cmZhY2VUZXh0dXJlfSB0byBiZSB1c2VkIGFzIHRoZSBzaW5rIGZvciB0aGUgdmlkZW8gcG9ydGlvbiBvZgorICAgICAqIHRoZSBtZWRpYS4gVGhpcyBpcyBzaW1pbGFyIHRvIHtAbGluayAjc2V0VGV4dHVyZShTdXJmYWNlVGV4dHVyZSl9LCBidXQgc3VwcG9ydHMgdXNpbmcKKyAgICAgKiBhIHtAbGluayBQYXJjZWxTdXJmYWNlVGV4dHVyZX0gdG8gdHJhbnNwb3J0IHRoZSB0ZXh0dXJlIHRvIGJlIHVzZWQgdmlhIEJpbmRlci4gU2V0dGluZworICAgICAqIGEgcGFyY2VsZWQgc3VyZmFjZSB0ZXh0dXJlIHdpbGwgdW4tc2V0IGFueSBzdXJmYWNlIG9yIHN1cmZhY2UgdGV4dHVyZSB0aGF0IHdhcyBwcmV2aW91c2x5CisgICAgICogc2V0LiBTZWUge0BsaW5rICNzZXRUZXh0dXJlKFN1cmZhY2VUZXh0dXJlKX0gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwc3QgVGhlIHtAbGluayBQYXJjZWxTdXJmYWNlVGV4dHVyZX0gdG8gYmUgdXNlZCBhcyB0aGUgc2luayBmb3IKKyAgICAgKiB0aGUgdmlkZW8gcG9ydGlvbiBvZiB0aGUgbWVkaWEuCisgICAgICoKKyAgICAgKiBAaGlkZSBQZW5kaW5nIHJldmlldyBieSBBUEkgY291bmNpbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJjZWxTdXJmYWNlVGV4dHVyZShQYXJjZWxTdXJmYWNlVGV4dHVyZSBwc3QpIHsKKyAgICAgICAgaWYgKG1TY3JlZW5PbldoaWxlUGxheWluZyAmJiBwc3QgIT0gbnVsbCAmJiBtUGFyY2VsU3VyZmFjZVRleHR1cmUgPT0gbnVsbCkgewogICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2NyZWVuT25XaGlsZVBsYXlpbmcodHJ1ZSkgaXMgaW5lZmZlY3RpdmUgZm9yIFN1cmZhY2VUZXh0dXJlIik7CiAgICAgICAgIH0KICAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwogICAgICAgICBtU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IHN0OworICAgICAgICBtUGFyY2VsU3VyZmFjZVRleHR1cmUgPSBwc3Q7CiAgICAgICAgIF9zZXRWaWRlb1N1cmZhY2VPclN1cmZhY2VUZXh0dXJlKCk7CiAgICAgICAgIHVwZGF0ZVN1cmZhY2VTY3JlZW5PbigpOwogICAgIH0KQEAgLTk2Miw3ICsxMDAzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTY3JlZW5PbldoaWxlUGxheWluZyhib29sZWFuIHNjcmVlbk9uKSB7CiAgICAgICAgIGlmIChtU2NyZWVuT25XaGlsZVBsYXlpbmcgIT0gc2NyZWVuT24pIHsKLSAgICAgICAgICAgIGlmIChzY3JlZW5PbiAmJiBtU3VyZmFjZVRleHR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNjcmVlbk9uICYmIG1QYXJjZWxTdXJmYWNlVGV4dHVyZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2NyZWVuT25XaGlsZVBsYXlpbmcodHJ1ZSkgaXMgaW5lZmZlY3RpdmUgZm9yIFN1cmZhY2VUZXh0dXJlIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU2NyZWVuT25XaGlsZVBsYXlpbmcgPSBzY3JlZW5PbjsKZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFSZWNvcmRlci5qYXZhCmluZGV4IDM4MjAyZjIuLmRkNDUxMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhUmVjb3JkZXIuamF2YQpAQCAtNTEsNiArNTEsMTYgQEAKICAqIHJlY29yZGVyLnJlbGVhc2UoKTsgLy8gTm93IHRoZSBvYmplY3QgY2Fubm90IGJlIHJldXNlZAogICogPC9wcmU+CiAgKgorICogPHA+QXBwbGljYXRpb25zIG1heSB3YW50IHRvIHJlZ2lzdGVyIGZvciBpbmZvcm1hdGlvbmFsIGFuZCBlcnJvcgorICogZXZlbnRzIGluIG9yZGVyIHRvIGJlIGluZm9ybWVkIG9mIHNvbWUgaW50ZXJuYWwgdXBkYXRlIGFuZCBwb3NzaWJsZQorICogcnVudGltZSBlcnJvcnMgZHVyaW5nIHJlY29yZGluZy4gUmVnaXN0cmF0aW9uIGZvciBzdWNoIGV2ZW50cyBpcworICogZG9uZSBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMgKHZpYSBjYWxscworICogKHRvIHtAbGluayAjc2V0T25JbmZvTGlzdGVuZXIoT25JbmZvTGlzdGVuZXIpfXNldE9uSW5mb0xpc3RlbmVyIGFuZC9vcgorICoge0BsaW5rICNzZXRPbkVycm9yTGlzdGVuZXIoT25FcnJvckxpc3RlbmVyKX1zZXRPbkVycm9yTGlzdGVuZXIpLgorICogSW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGUgcmVzcGVjdGl2ZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlc2UgbGlzdGVuZXJzLAorICogYXBwbGljYXRpb25zIGFyZSByZXF1aXJlZCB0byBjcmVhdGUgTWVkaWFSZWNvcmRlciBvYmplY3RzIG9uIHRocmVhZHMgd2l0aCBhCisgKiBMb29wZXIgcnVubmluZyAodGhlIG1haW4gVUkgdGhyZWFkIGJ5IGRlZmF1bHQgYWxyZWFkeSBoYXMgYSBMb29wZXIgcnVubmluZykuCisgKgogICogPHA+U2VlIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21lZGlhL2luZGV4Lmh0bWwiPkF1ZGlvIGFuZCBWaWRlbzwvYT4KICAqIGRvY3VtZW50YXRpb24gZm9yIGFkZGl0aW9uYWwgaGVscCB3aXRoIHVzaW5nIE1lZGlhUmVjb3JkZXIuCiAgKiA8cD5Ob3RlOiBDdXJyZW50bHksIE1lZGlhUmVjb3JkZXIgZG9lcyBub3Qgd29yayBvbiB0aGUgZW11bGF0b3IuCkBAIC03MTYsNiArNzI2LDEyIEBACiAgICAgLyoqCiAgICAgICogU3RvcHMgcmVjb3JkaW5nLiBDYWxsIHRoaXMgYWZ0ZXIgc3RhcnQoKS4gT25jZSByZWNvcmRpbmcgaXMgc3RvcHBlZCwKICAgICAgKiB5b3Ugd2lsbCBoYXZlIHRvIGNvbmZpZ3VyZSBpdCBhZ2FpbiBhcyBpZiBpdCBoYXMganVzdCBiZWVuIGNvbnN0cnVjdGVkLgorICAgICAqIE5vdGUgdGhhdCBhIFJ1bnRpbWVFeGNlcHRpb24gaXMgaW50ZW50aW9uYWxseSB0aHJvd24gdG8gdGhlCisgICAgICogYXBwbGljYXRpb24sIGlmIG5vIHZhbGlkIGF1ZGlvL3ZpZGVvIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgd2hlbiBzdG9wKCkKKyAgICAgKiBpcyBjYWxsZWQuIFRoaXMgaGFwcGVucyBpZiBzdG9wKCkgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyCisgICAgICogc3RhcnQoKS4gVGhlIGZhaWx1cmUgbGV0cyB0aGUgYXBwbGljYXRpb24gdGFrZSBhY3Rpb24gYWNjb3JkaW5nbHkgdG8KKyAgICAgKiBjbGVhbiB1cCB0aGUgb3V0cHV0IGZpbGUgKGRlbGV0ZSB0aGUgb3V0cHV0IGZpbGUsIGZvciBpbnN0YW5jZSksIHNpbmNlCisgICAgICogdGhlIG91dHB1dCBmaWxlIGlzIG5vdCBwcm9wZXJseSBjb25zdHJ1Y3RlZCB3aGVuIHRoaXMgaGFwcGVucy4KICAgICAgKgogICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGl0IGlzIGNhbGxlZCBiZWZvcmUgc3RhcnQoKQogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL210cC9NdHBEYXRhYmFzZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL210cC9NdHBEYXRhYmFzZS5qYXZhCmluZGV4IGM5ZTBmNmYuLjRlMjcxYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tdHAvTXRwRGF0YWJhc2UuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbXRwL010cERhdGFiYXNlLmphdmEKQEAgLTkyLDEzICs5MiwxOCBAQAogICAgIH07CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuX0lEICsgIj0/IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSEVSRSA9IEZpbGVzLkZpbGVDb2x1bW5zLkRBVEEgKyAiPT8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfV0hFUkUgPSBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQgKyAiPT8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfRk9STUFUX1dIRVJFID0gUEFSRU5UX1dIRVJFICsgIiBBTkQgIgorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JBR0VfV0hFUkUgPSBGaWxlcy5GaWxlQ29sdW1ucy5TVE9SQUdFX0lEICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuUEFSRU5UICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1dIRVJFID0gRmlsZXMuRmlsZUNvbHVtbnMuRk9STUFUICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUkFHRV9GT1JNQVRfV0hFUkUgPSBTVE9SQUdFX1dIRVJFICsgIiBBTkQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGVzLkZpbGVDb2x1bW5zLkZPUk1BVCArICI9PyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9TVE9SQUdFX1dIRVJFID0gUEFSRU5UX1dIRVJFICsgIiBBTkQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGVzLkZpbGVDb2x1bW5zLlNUT1JBR0VfSUQgKyAiPT8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfU1RPUkFHRV9GT1JNQVRfV0hFUkUgPSBQQVJFTlRfU1RPUkFHRV9XSEVSRSArICIgQU5EICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlcy5GaWxlQ29sdW1ucy5GT1JNQVQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFX1BBUkVOVF9XSEVSRSA9IFNUT1JBR0VfV0hFUkUgKyAiIEFORCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZXMuRmlsZUNvbHVtbnMuUEFSRU5UICsgIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BBUkVOVF9XSEVSRSA9IEZPUk1BVF9XSEVSRSArICIgQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQgKyAiPT8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SQUdFX0ZPUk1BVF9QQVJFTlRfV0hFUkUgPSBTVE9SQUdFX0ZPUk1BVF9XSEVSRSArICIgQU5EICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlcy5GaWxlQ29sdW1ucy5QQVJFTlQgKyAiPT8iOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNjYW5uZXIgbU1lZGlhU2Nhbm5lcjsKIApAQCAtMjQ5LDI2ICsyNTQsNjcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIEN1cnNvciBjcmVhdGVPYmplY3RRdWVyeShpbnQgc3RvcmFnZUlELCBpbnQgZm9ybWF0LCBpbnQgcGFyZW50KSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHN0b3JhZ2VJRCAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfU1RPUkFHRV9GT1JNQVRfV0hFUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoc3RvcmFnZUlEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sIG51bGwpOworICAgICAgICBpZiAoc3RvcmFnZUlEID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGFsbCBzdG9yZXMKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IGFsbCBmb3JtYXRzCisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IGFsbCBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiByb290IG9mIHN0b3JlCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwgUEFSRU5UX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sIG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRfU1RPUkFHRV9XSEVSRSwgbmV3IFN0cmluZ1tdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpLCBJbnRlZ2VyLnRvU3RyaW5nKHN0b3JhZ2VJRCkgfSwgbnVsbCk7CisgICAgICAgICAgICAgICAgLy8gcXVlcnkgc3BlY2lmaWMgZm9ybWF0CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IGFsbCBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwgRk9STUFUX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvYmplY3RzIGluIHJvb3Qgb2Ygc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYVByb3ZpZGVyLnF1ZXJ5KG1PYmplY3RzVXJpLCBJRF9QUk9KRUNUSU9OLCBGT1JNQVRfUEFSRU5UX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpLCBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX0ZPUk1BVF9XSEVSRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCksIEludGVnZXIudG9TdHJpbmcoZm9ybWF0KSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IHNwZWNpZmljIHN0b3JlCisgICAgICAgICAgICBpZiAoZm9ybWF0ID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBxdWVyeSBhbGwgZm9ybWF0cworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBxdWVyeSBhbGwgb2JqZWN0cworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sIFNUT1JBR0VfV0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhzdG9yYWdlSUQpIH0sIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG9iamVjdHMgaW4gcm9vdCBvZiBzdG9yZQorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sIFNUT1JBR0VfUEFSRU5UX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhzdG9yYWdlSUQpLCBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1lZGlhUHJvdmlkZXIucXVlcnkobU9iamVjdHNVcmksIElEX1BST0pFQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1dIRVJFLCBuZXcgU3RyaW5nW10geyBJbnRlZ2VyLnRvU3RyaW5nKHBhcmVudCkgfSwgbnVsbCk7CisgICAgICAgICAgICAgICAgLy8gcXVlcnkgc3BlY2lmaWMgZm9ybWF0CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5IGFsbCBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwgU1RPUkFHRV9GT1JNQVRfV0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgIEludGVnZXIudG9TdHJpbmcoc3RvcmFnZUlEKSwgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gMHhGRkZGRkZGRikgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb2JqZWN0cyBpbiByb290IG9mIHN0b3JlCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFQcm92aWRlci5xdWVyeShtT2JqZWN0c1VyaSwgSURfUFJPSkVDVElPTiwgU1RPUkFHRV9GT1JNQVRfUEFSRU5UX1dIRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSW50ZWdlci50b1N0cmluZyhzdG9yYWdlSUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhwYXJlbnQpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tdHAvTXRwU2VydmVyLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbXRwL010cFNlcnZlci5qYXZhCmluZGV4IGMwNjVjYTguLjY4N2NjNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tdHAvTXRwU2VydmVyLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL210cC9NdHBTZXJ2ZXIuamF2YQpAQCAtNjEsMTAgKzYxLDYgQEAKICAgICAgICAgbmF0aXZlX3NlbmRfb2JqZWN0X3JlbW92ZWQoaGFuZGxlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRQdHBNb2RlKGJvb2xlYW4gdXNlUHRwKSB7Ci0gICAgICAgIG5hdGl2ZV9zZXRfcHRwX21vZGUodXNlUHRwKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgdm9pZCBhZGRTdG9yYWdlKE10cFN0b3JhZ2Ugc3RvcmFnZSkgewogICAgICAgICBuYXRpdmVfYWRkX3N0b3JhZ2Uoc3RvcmFnZSk7CiAgICAgfQpAQCAtNzgsNyArNzQsNiBAQAogICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3N0b3AoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9hZGRlZChpbnQgaGFuZGxlKTsKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkKGludCBoYW5kbGUpOwotICAgIHByaXZhdGUgbmF0aXZlIGZpbmFsIHZvaWQgbmF0aXZlX3NldF9wdHBfbW9kZShib29sZWFuIHVzZVB0cCk7CiAgICAgcHJpdmF0ZSBuYXRpdmUgZmluYWwgdm9pZCBuYXRpdmVfYWRkX3N0b3JhZ2UoTXRwU3RvcmFnZSBzdG9yYWdlKTsKICAgICBwcml2YXRlIG5hdGl2ZSBmaW5hbCB2b2lkIG5hdGl2ZV9yZW1vdmVfc3RvcmFnZShpbnQgc3RvcmFnZUlkKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcCBiL21lZGlhL2puaS9hbmRyb2lkX21lZGlhX01lZGlhUGxheWVyLmNwcAppbmRleCBiMDNhYTM4Li41NjYzNjgzIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tZWRpYV9NZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvam5pL2FuZHJvaWRfbWVkaWFfTWVkaWFQbGF5ZXIuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAiSk5JSGVscC5oIgogI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oIgorI2luY2x1ZGUgImFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1BhcmNlbFN1cmZhY2VUZXh0dXJlLmgiCiAjaW5jbHVkZSAidXRpbHMvRXJyb3JzLmgiICAvLyBmb3Igc3RhdHVzX3QKICNpbmNsdWRlICJ1dGlscy9LZXllZFZlY3Rvci5oIgogI2luY2x1ZGUgInV0aWxzL1N0cmluZzguaCIKQEAgLTM3LDcgKzM4LDYgQEAKIAogI2luY2x1ZGUgImFuZHJvaWRfdXRpbF9CaW5kZXIuaCIKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+CiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlVGV4dHVyZS5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTUyLDExICs1Miw5IEBACiBzdHJ1Y3QgZmllbGRzX3QgewogICAgIGpmaWVsZElEICAgIGNvbnRleHQ7CiAgICAgamZpZWxkSUQgICAgc3VyZmFjZTsKLSAgICBqZmllbGRJRCAgICBzdXJmYWNlVGV4dHVyZTsKKyAgICBqZmllbGRJRCAgICBwYXJjZWxTdXJmYWNlVGV4dHVyZTsKICAgICAvKiBhY3R1YWxseSBpbiBhbmRyb2lkLnZpZXcuU3VyZmFjZSBYWFggKi8KICAgICBqZmllbGRJRCAgICBzdXJmYWNlX25hdGl2ZTsKLSAgICAvLyBhY3R1YWxseSBpbiBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlCi0gICAgamZpZWxkSUQgICAgc3VyZmFjZVRleHR1cmVfbmF0aXZlOwogCiAgICAgam1ldGhvZElEICAgcG9zdF9ldmVudDsKIH07CkBAIC0xMzAsMTMgKzEyOCw2IEBACiAgICAgcmV0dXJuIChTdXJmYWNlKillbnYtPkdldEludEZpZWxkKGNsYXp6LCBmaWVsZHMuc3VyZmFjZV9uYXRpdmUpOwogfQogCi1zcDxJU3VyZmFjZVRleHR1cmU+IGdldFN1cmZhY2VUZXh0dXJlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6KQotewotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gc3VyZmFjZVRleHR1cmUoCi0gICAgICAgIChJU3VyZmFjZVRleHR1cmUqKWVudi0+R2V0SW50RmllbGQoY2xhenosIGZpZWxkcy5zdXJmYWNlVGV4dHVyZV9uYXRpdmUpKTsKLSAgICByZXR1cm4gc3VyZmFjZVRleHR1cmU7Ci19Ci0KIHN0YXRpYyBzcDxNZWRpYVBsYXllcj4gZ2V0TWVkaWFQbGF5ZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgdGhpeikKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChzTG9jayk7CkBAIC0yNTcsOCArMjQ4LDggQEAKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXI+JiBtcCwgSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgY29uc3QgY2hhciAqcHJlZml4KQogewogICAgIC8vIFRoZSBKYXZhIE1lZGlhUGxheWVyIGNsYXNzIG1ha2VzIHN1cmUgdGhhdCBhdCBtb3N0IG9uZSBvZiBtU3VyZmFjZSBhbmQKLSAgICAvLyBtU3VyZmFjZVRleHR1cmUgaXMgbm9uLW51bGwuICBCdXQganVzdCBpbiBjYXNlLCB3ZSBnaXZlIHByaW9yaXR5IHRvCi0gICAgLy8gbVN1cmZhY2Ugb3ZlciBtU3VyZmFjZVRleHR1cmUuCisgICAgLy8gbVBhcmNlbFN1cmZhY2VUZXh0dXJlIGlzIG5vbi1udWxsLiAgQnV0IGp1c3QgaW4gY2FzZSwgd2UgZ2l2ZSBwcmlvcml0eSB0bworICAgIC8vIG1TdXJmYWNlIG92ZXIgbVBhcmNlbFN1cmZhY2VUZXh0dXJlLgogICAgIGpvYmplY3Qgc3VyZmFjZSA9IGVudi0+R2V0T2JqZWN0RmllbGQodGhpeiwgZmllbGRzLnN1cmZhY2UpOwogICAgIGlmIChzdXJmYWNlICE9IE5VTEwpIHsKICAgICAgICAgc3A8U3VyZmFjZT4gbmF0aXZlX3N1cmZhY2UoZ2V0X3N1cmZhY2UoZW52LCBzdXJmYWNlKSk7CkBAIC0yNjYsMTAgKzI1NywxMCBAQAogICAgICAgICAgICAgIG5hdGl2ZV9zdXJmYWNlLmdldCgpLCBuYXRpdmVfc3VyZmFjZS0+Z2V0SWRlbnRpdHkoKSk7CiAgICAgICAgIG1wLT5zZXRWaWRlb1N1cmZhY2UobmF0aXZlX3N1cmZhY2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGpvYmplY3Qgc3VyZmFjZVRleHR1cmUgPSBlbnYtPkdldE9iamVjdEZpZWxkKHRoaXosIGZpZWxkcy5zdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIGlmIChzdXJmYWNlVGV4dHVyZSAhPSBOVUxMKSB7CisgICAgICAgIGpvYmplY3QgcGFyY2VsU3VyZmFjZVRleHR1cmUgPSBlbnYtPkdldE9iamVjdEZpZWxkKHRoaXosIGZpZWxkcy5wYXJjZWxTdXJmYWNlVGV4dHVyZSk7CisgICAgICAgIGlmIChwYXJjZWxTdXJmYWNlVGV4dHVyZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxJU3VyZmFjZVRleHR1cmU+IG5hdGl2ZV9zdXJmYWNlVGV4dHVyZSgKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3VyZmFjZVRleHR1cmUoZW52LCBzdXJmYWNlVGV4dHVyZSkpOworICAgICAgICAgICAgICAgICAgICBQYXJjZWxTdXJmYWNlVGV4dHVyZV9nZXRJU3VyZmFjZVRleHR1cmUoZW52LCBwYXJjZWxTdXJmYWNlVGV4dHVyZSkpOwogICAgICAgICAgICAgTE9HVigiJXM6IHRleHR1cmU9JXAiLCBwcmVmaXgsIG5hdGl2ZV9zdXJmYWNlVGV4dHVyZS5nZXQoKSk7CiAgICAgICAgICAgICBtcC0+c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShuYXRpdmVfc3VyZmFjZVRleHR1cmUpOwogICAgICAgICB9CkBAIC02MTAsMjMgKzYwMSwxMSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZmllbGRzLnN1cmZhY2VUZXh0dXJlID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCAibVN1cmZhY2VUZXh0dXJlIiwKLSAgICAgICAgICAgICJMYW5kcm9pZC9ncmFwaGljcy9TdXJmYWNlVGV4dHVyZTsiKTsKLSAgICBpZiAoZmllbGRzLnN1cmZhY2VUZXh0dXJlID09IE5VTEwpIHsKKyAgICBmaWVsZHMucGFyY2VsU3VyZmFjZVRleHR1cmUgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosICJtUGFyY2VsU3VyZmFjZVRleHR1cmUiLAorICAgICAgICAgICAgIkxhbmRyb2lkL2dyYXBoaWNzL1BhcmNlbFN1cmZhY2VUZXh0dXJlOyIpOworICAgIGlmIChmaWVsZHMucGFyY2VsU3VyZmFjZVRleHR1cmUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotCi0gICAgamNsYXNzIHN1cmZhY2VUZXh0dXJlID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZ3JhcGhpY3MvU3VyZmFjZVRleHR1cmUiKTsKLSAgICBpZiAoc3VyZmFjZVRleHR1cmUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmllbGRzLnN1cmZhY2VUZXh0dXJlX25hdGl2ZSA9IGVudi0+R2V0RmllbGRJRChzdXJmYWNlVGV4dHVyZSwKLSAgICAgICAgICAgIEFORFJPSURfR1JBUEhJQ1NfU1VSRkFDRVRFWFRVUkVfSk5JX0lELCAiSSIpOwotICAgIGlmIChmaWVsZHMuc3VyZmFjZVRleHR1cmVfbmF0aXZlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvam5pL2FuZHJvaWRfbXRwX010cFNlcnZlci5jcHAgYi9tZWRpYS9qbmkvYW5kcm9pZF9tdHBfTXRwU2VydmVyLmNwcAppbmRleCA0ZDg0Y2I3Li5lMzZlNmRiIDEwMDY0NAotLS0gYS9tZWRpYS9qbmkvYW5kcm9pZF9tdHBfTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9qbmkvYW5kcm9pZF9tdHBfTXRwU2VydmVyLmNwcApAQCAtNzAsMTQgKzcwLDEyIEBACiAgICAgTXRwRGF0YWJhc2UqICAgIG1EYXRhYmFzZTsKICAgICBNdHBTZXJ2ZXIqICAgICAgbVNlcnZlcjsKICAgICBNdHBTdG9yYWdlTGlzdCAgbVN0b3JhZ2VMaXN0OwotICAgIGJvb2wgICAgICAgICAgICBtVXNlUHRwOwogICAgIGludCAgICAgICAgICAgICBtRmQ7CiAKIHB1YmxpYzoKICAgICBNdHBUaHJlYWQoTXRwRGF0YWJhc2UqIGRhdGFiYXNlKQogICAgICAgICA6ICAgbURhdGFiYXNlKGRhdGFiYXNlKSwKICAgICAgICAgICAgIG1TZXJ2ZXIoTlVMTCksCi0gICAgICAgICAgICBtVXNlUHRwKGZhbHNlKSwKICAgICAgICAgICAgIG1GZCgtMSkKICAgICB7CiAgICAgfQpAQCAtODUsMTAgKzgzLDYgQEAKICAgICB2aXJ0dWFsIH5NdHBUaHJlYWQoKSB7CiAgICAgfQogCi0gICAgdm9pZCBzZXRQdHBNb2RlKGJvb2wgdXNlUHRwKSB7Ci0gICAgICAgIG1Vc2VQdHAgPSB1c2VQdHA7Ci0gICAgfQotCiAgICAgdm9pZCBhZGRTdG9yYWdlKE10cFN0b3JhZ2UgKnN0b3JhZ2UpIHsKICAgICAgICAgbVN0b3JhZ2VMaXN0LnB1c2goc3RvcmFnZSk7CiAgICAgICAgIGlmIChtU2VydmVyKQpAQCAtMTE5LDkgKzExMyw2IEBACiAKICAgICAgICAgbUZkID0gb3BlbigiL2Rldi9tdHBfdXNiIiwgT19SRFdSKTsKICAgICAgICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgICAgICBpb2N0bChtRmQsIE1UUF9TRVRfSU5URVJGQUNFX01PREUsCi0gICAgICAgICAgICAgICAgICAgIChtVXNlUHRwID8gTVRQX0lOVEVSRkFDRV9NT0RFX1BUUCA6IE1UUF9JTlRFUkZBQ0VfTU9ERV9NVFApKTsKLQogICAgICAgICAgICAgbVNlcnZlciA9IG5ldyBNdHBTZXJ2ZXIobUZkLCBtRGF0YWJhc2UsIEFJRF9NRURJQV9SVywgMDY2NCwgMDc3NSk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdG9yYWdlTGlzdC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIG1TZXJ2ZXItPmFkZFN0b3JhZ2UobVN0b3JhZ2VMaXN0W2ldKTsKQEAgLTIyNCwxOCArMjE1LDYgQEAKIH0KIAogc3RhdGljIHZvaWQKLWFuZHJvaWRfbXRwX010cFNlcnZlcl9zZXRfcHRwX21vZGUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamJvb2xlYW4gdXNlUHRwKQotewotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIHNNdXRleC5sb2NrKCk7Ci0gICAgTXRwVGhyZWFkICp0aHJlYWQgPSBzVGhyZWFkLmdldCgpOwotICAgIGlmICh0aHJlYWQpCi0gICAgICAgIHRocmVhZC0+c2V0UHRwTW9kZSh1c2VQdHApOwotICAgIHNNdXRleC51bmxvY2soKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAogYW5kcm9pZF9tdHBfTXRwU2VydmVyX2FkZF9zdG9yYWdlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpvYmplY3QganN0b3JhZ2UpCiB7CiAjaWZkZWYgSEFWRV9BTkRST0lEX09TCkBAIC0yOTAsNyArMjY5LDYgQEAKICAgICB7Im5hdGl2ZV9zdG9wIiwgICAgICAgICAgICAgICAgICIoKVYiLCAgKHZvaWQgKilhbmRyb2lkX210cF9NdHBTZXJ2ZXJfc3RvcH0sCiAgICAgeyJuYXRpdmVfc2VuZF9vYmplY3RfYWRkZWQiLCAgICAiKEkpViIsICh2b2lkICopYW5kcm9pZF9tdHBfTXRwU2VydmVyX3NlbmRfb2JqZWN0X2FkZGVkfSwKICAgICB7Im5hdGl2ZV9zZW5kX29iamVjdF9yZW1vdmVkIiwgICIoSSlWIiwgKHZvaWQgKilhbmRyb2lkX210cF9NdHBTZXJ2ZXJfc2VuZF9vYmplY3RfcmVtb3ZlZH0sCi0gICAgeyJuYXRpdmVfc2V0X3B0cF9tb2RlIiwgICAgICAgICAiKFopViIsICh2b2lkICopYW5kcm9pZF9tdHBfTXRwU2VydmVyX3NldF9wdHBfbW9kZX0sCiAgICAgeyJuYXRpdmVfYWRkX3N0b3JhZ2UiLCAgICAgICAgICAiKExhbmRyb2lkL210cC9NdHBTdG9yYWdlOylWIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilhbmRyb2lkX210cF9NdHBTZXJ2ZXJfYWRkX3N0b3JhZ2V9LAogICAgIHsibmF0aXZlX3JlbW92ZV9zdG9yYWdlIiwgICAgICAgIihJKVYiLCAodm9pZCAqKWFuZHJvaWRfbXRwX010cFNlcnZlcl9yZW1vdmVfc3RvcmFnZX0sCmRpZmYgLS1naXQgYS9tZWRpYS9qbmkvc291bmRwb29sL1NvdW5kUG9vbC5jcHAgYi9tZWRpYS9qbmkvc291bmRwb29sL1NvdW5kUG9vbC5jcHAKaW5kZXggM2VhMTNhNi4uNGZmYjJjMCAxMDA2NDQKLS0tIGEvbWVkaWEvam5pL3NvdW5kcG9vbC9Tb3VuZFBvb2wuY3BwCisrKyBiL21lZGlhL2puaS9zb3VuZHBvb2wvU291bmRQb29sLmNwcApAQCAtMjMsNyArMjMsNiBAQAogLy8gWFhYIG5lZWRlZCBmb3IgdGltaW5nIGxhdGVuY3kKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IGIwZTg1ODUuLmEzZTc2ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0yNTcsNyArMjU3LDcgQEAKICAgICB9CiAKICAgICAvLyBjcmVhdGUgZWZmZWN0IGluIGxpYnJhcnkKLSAgICBsLT5kZXNjLT5jcmVhdGVfZWZmZWN0KHV1aWQsIHNlc3Npb25JZCwgaW9JZCwgJml0ZmUpOworICAgIHJldCA9IGwtPmRlc2MtPmNyZWF0ZV9lZmZlY3QodXVpZCwgc2Vzc2lvbklkLCBpb0lkLCAmaXRmZSk7CiAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgIExPR1coIkVmZmVjdENyZWF0ZSgpIGxpYnJhcnkgJXM6IGNvdWxkIG5vdCBjcmVhdGUgZnggJXMsIGVycm9yICVkIiwgbC0+bmFtZSwgZC0+bmFtZSwgcmV0KTsKICAgICAgICAgZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDQ0NmUzZGYuLmE0MWQ3YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApCiB7Ci0gICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKKyAgICBtU3RhdHVzID0gc2V0KGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzZXNzaW9uSWQpOwogfQogCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgaW50IGlucHV0U291cmNlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCkKIHsKIAotICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVscyAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbHMsIGZyYW1lQ291bnQpOworICAgIExPR1YoInNldCgpOiBzYW1wbGVSYXRlICVkLCBjaGFubmVsTWFzayAlZCwgZnJhbWVDb3VudCAlZCIsc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQpOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCkBAIC0xNTYsMTQgKzE1NiwxNCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVscykpIHsKKyAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaW50IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxzKTsKKyAgICBpbnQgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQoaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCAoYXVkaW9faW5fYWNvdXN0aWNzX3QpZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgKGF1ZGlvX2luX2Fjb3VzdGljc190KWZsYWdzKTsKICAgICBpZiAoaW5wdXQgPT0gMCkgewogICAgICAgICBMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTkwLDcgKzE5MCw3IEBACiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gb3BlblJlY29yZF9sKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LAorICAgIHN0YXR1cyA9IG9wZW5SZWNvcmRfbChzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGlucHV0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC0yMDksNyArMjA5LDcgQEAKICAgICAvLyBVcGRhdGUgYnVmZmVyIHNpemUgaW4gY2FzZSBpdCBoYXMgYmVlbiBsaW1pdGVkIGJ5IEF1ZGlvRmxpbmdlciBkdXJpbmcgdHJhY2sgY3JlYXRpb24KICAgICBtRnJhbWVDb3VudCA9IG1DYmxrLT5mcmFtZUNvdW50OwogICAgIG1DaGFubmVsQ291bnQgPSAodWludDhfdCljaGFubmVsQ291bnQ7Ci0gICAgbUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgbUFjdGl2ZSA9IDA7CiAgICAgbUNiZiA9IGNiZjsKICAgICBtTm90aWZpY2F0aW9uRnJhbWVzID0gbm90aWZpY2F0aW9uRnJhbWVzOwpAQCAtMzE1LDkgKzMxNSw5IEBACiAgICAgICAgICAgICBjYmxrLT5idWZmZXJUaW1lb3V0TXMgPSBNQVhfUlVOX1RJTUVPVVRfTVM7CiAgICAgICAgICAgICBjYmxrLT53YWl0VGltZU1zID0gMDsKICAgICAgICAgICAgIGlmICh0ICE9IDApIHsKLSAgICAgICAgICAgICAgIHQtPnJ1bigiQ2xpZW50UmVjb3JkVGhyZWFkIiwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICAgICB0LT5ydW4oIkNsaWVudFJlY29yZFRocmVhZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtQWN0aXZlID0gMDsKQEAgLTQzNyw4ICs0MzcsOCBAQAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6b3BlblJlY29yZF9sKAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQpAQCAtNDUxLDcgKzQ1MSw3IEBACiAKICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IGF1ZGlvRmxpbmdlci0+b3BlblJlY29yZChnZXRwaWQoKSwgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpZmxhZ3MpIDw8IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLApAQCAtNTg5LDcgKzU4OSw3IEBACiB7CiAgICAgbUlucHV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0KG1JbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsIG1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9faW5fYWNvdXN0aWNzX3QpbUZsYWdzKTsKICAgICByZXR1cm4gbUlucHV0OwogfQpAQCAtNzU2LDcgKzc1Niw3IEBACiAgICAgICAgIC8vIGlmIHRoZSBuZXcgSUF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsIG9wZW5SZWNvcmRfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgICAgICAvLyBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlczogbUF1ZGlvUmVjb3JkLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCiAgICAgICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQotICAgICAgICByZXN1bHQgPSBvcGVuUmVjb3JkX2woY2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgcmVzdWx0ID0gb3BlblJlY29yZF9sKGNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUZsYWdzLCBnZXRJbnB1dF9sKCkpOwogICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKaW5kZXggOGExODBkOC4uNmNiMzg0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcApAQCAtMjYsMTMgKzI2LDYgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCi0KLSNpZm5kZWYgSEFWRV9HRVRUSUQKLSMgZGVmaW5lIGdldHRpZCBnZXRwaWQKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAppbmRleCA3NTIwZWQ5Li4zN2ZlMTgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcApAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAogI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQpAQCAtODcsNyArODcsNyBAQAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxzLAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAsIGZhbHNlLCBzZXNzaW9uSWQpOwogfQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbHMsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7Ci0gICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAorICAgIG1TdGF0dXMgPSBzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCk7CiB9CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLApAQCAtMTgwLDggKzE4MCw4IEBACiAgICAgaWYgKGZvcm1hdCA9PSAwKSB7CiAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBpZiAoY2hhbm5lbHMgPT0gMCkgewotICAgICAgICBjaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgeworICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCkBAIC0xOTUsMTUgKzE5NSwxNSBAQAogICAgICAgICBmbGFncyB8PSBBVURJT19QT0xJQ1lfT1VUUFVUX0ZMQUdfRElSRUNUOwogICAgIH0KIAotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbHMpKSB7CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKICAgICAgICAgTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbHMpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdClmbGFncyk7CiAKICAgICBpZiAob3V0cHV0ID09IDApIHsKQEAgLTIyMiw4ICsyMjIsOCBAQAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVUcmFja19sKHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkQnVmZmVyLApAQCAtMjQ1LDggKzI0NSw4IEBACiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgbVN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwotICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUZvcm1hdCA9ICh1aW50MzJfdClmb3JtYXQ7CisgICAgbUNoYW5uZWxNYXNrID0gKHVpbnQzMl90KWNoYW5uZWxNYXNrOwogICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtTXV0ZWQgPSBmYWxzZTsKQEAgLTM0Miw5ICszNDIsOSBAQAogICAgICAgICBjYmxrLT53YWl0VGltZU1zID0gMDsKICAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVEX09OLCAmY2Jsay0+ZmxhZ3MpOwogICAgICAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgICAgIHQtPnJ1bigiQXVkaW9UcmFja1RocmVhZCIsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOworICAgICAgICAgICB0LT5ydW4oIkF1ZGlvVHJhY2tUaHJlYWQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgVEhSRUFEX1BSSU9SSVRZX0FVRElPX0NMSUVOVCk7CisgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgICAgICB9CiAKICAgICAgICAgTE9HVigic3RhcnQgJXAgYmVmb3JlIGxvY2sgY2JsayAlcCIsIHRoaXMsIG1DYmxrKTsKQEAgLTY4MSw3ICs2ODEsNyBAQAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0X2woKQogewogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KChhdWRpb19zdHJlYW1fdHlwZV90KW1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVscywgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCltRmxhZ3MpOworICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgKGF1ZGlvX3BvbGljeV9vdXRwdXRfZmxhZ3NfdCltRmxhZ3MpOwogfQogCiBpbnQgQXVkaW9UcmFjazo6Z2V0U2Vzc2lvbklkKCkKQEAgLTcwNSw4ICs3MDUsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2tfbCgKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTc2Nyw2ICs3NjcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGFsaWdubWVudCBtYXRjaGVzIGNoYW5uZWxjb3VudAorICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIGlmICgoKHVpbnQzMl90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGNoYW5uZWxDb3VudCB8IDEpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25lbWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbENvdW50ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIGNoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTc3OSw3ICs3ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZsYWdzKSA8PCAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKQEAgLTExNjQsNyArMTE2NSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRyYWNrX2wobVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+c2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCAxNThkMmY1Li40YTEyOTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcApAQCAtODIsOCArODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1UeXBlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxDb3VudCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzaGFyZWRCdWZmZXItPmFzQmluZGVyKCkpOwpAQCAtMTI5LDggKzEyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLApAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsQ291bnQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY2hhbm5lbE1hc2spOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZnJhbWVDb3VudCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIGludCBsU2Vzc2lvbklkID0gMDsKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBpbnQgZm9ybWF0KGludCBvdXRwdXQpIGNvbnN0CisgICAgdmlydHVhbCB1aW50MzJfdCBmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggZWJlODIxZi4uMDcxNTJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMzAsMjYgKzMwLDYgQEAKIC8vIGZvcmVncm91bmQgdGhyZWFkLgogI2lmbmRlZiBESVNBQkxFX0dST1VQX1NDSEVEVUxFX0hBQ0sKIAotLyogZGVza3RvcCBMaW51eCBuZWVkcyBhIGxpdHRsZSBoZWxwIHdpdGggZ2V0dGlkKCkgKi8KLSNpZiBkZWZpbmVkKEhBVkVfR0VUVElEKSAmJiAhZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0jZGVmaW5lIF9fS0VSTkVMX18KLSMgaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaWZkZWYgX3N5c2NhbGwwCi1fc3lzY2FsbDAocGlkX3QsZ2V0dGlkKQotI2Vsc2UKLXBpZF90IGdldHRpZCgpIHsgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpO30KLSNlbmRpZgotI3VuZGVmIF9fS0VSTkVMX18KLSNlbmRpZgotCi1zdGF0aWMgaW50IG15VGlkKCkgewotI2lmZGVmIEhBVkVfR0VUVElECi0gICAgcmV0dXJuIGdldHRpZCgpOwotI2Vsc2UKLSAgICByZXR1cm4gZ2V0cGlkKCk7Ci0jZW5kaWYKLX0KLQogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC02MCwxOCArNDAsMTggQEAKIHN0YXRpYyB2b2lkIHNlbmRTY2hlZFBvbGljeShQYXJjZWwmIGRhdGEpCiB7CiAgICAgU2NoZWRQb2xpY3kgcG9saWN5OwotICAgIGdldF9zY2hlZF9wb2xpY3kobXlUaWQoKSwgJnBvbGljeSk7CisgICAgZ2V0X3NjaGVkX3BvbGljeShnZXR0aWQoKSwgJnBvbGljeSk7CiAgICAgZGF0YS53cml0ZUludDMyKHBvbGljeSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldFNjaGVkUG9saWN5KGNvbnN0IFBhcmNlbCYgZGF0YSkKIHsKICAgICBTY2hlZFBvbGljeSBwb2xpY3kgPSAoU2NoZWRQb2xpY3kpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgc2V0X3NjaGVkX3BvbGljeShteVRpZCgpLCBwb2xpY3kpOworICAgIHNldF9zY2hlZF9wb2xpY3koZ2V0dGlkKCksIHBvbGljeSk7CiB9CiBzdGF0aWMgdm9pZCByZXN0b3JlU2NoZWRQb2xpY3koKQogewotICAgIHNldF9zY2hlZF9wb2xpY3kobXlUaWQoKSwgU1BfRk9SRUdST1VORCk7CisgICAgc2V0X3NjaGVkX3BvbGljeShnZXR0aWQoKSwgU1BfRk9SRUdST1VORCk7CiB9CiB9OyAvLyBlbmQgbmFtZXNwYWNlIGFuZHJvaWQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0pldFBsYXllci5jcHAKaW5kZXggODgxNTdkMi4uOGI5NTNlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCkBAIC0yMywxMyArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0pldFBsYXllci5oPgogCiAKLSNpZmRlZiBIQVZFX0dFVFRJRAotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0dGlkKCk7IH0KLSNlbHNlCi1zdGF0aWMgcGlkX3QgbXlUaWQoKSB7IHJldHVybiBnZXRwaWQoKTsgfQotI2VuZGlmCi0KLQogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIApAQCAtMTg4LDcgKzE4MSw3IEBACiAgICAgLy8gc2lnbmFsIG1haW4gdGhyZWFkIHRoYXQgd2Ugc3RhcnRlZAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICAgICAgbVRpZCA9IG15VGlkKCk7CisgICAgICAgIG1UaWQgPSBnZXR0aWQoKTsKICAgICAgICAgTE9HVigiSmV0UGxheWVyOjpyZW5kZXIoKTogcmVuZGVyIHRocmVhZCglZCkgc2lnbmFsIiwgbVRpZCk7CiAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggMjhjODY0MjYuLjQ1YmRmZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcApAQCAtODksNyArODksNyBAQAogICAgIGlmIChwYXRoUmVtYWluaW5nID49IDggLyogc3RybGVuKCIubm9tZWRpYSIpICovICkgewogICAgICAgICBzdHJjcHkoZmlsZVNwb3QsICIubm9tZWRpYSIpOwogICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIEZfT0spID09IDApIHsKLSAgICAgICAgICAgIExPR0QoImZvdW5kIC5ub21lZGlhLCBzZXR0aW5nIG5vTWVkaWEgZmxhZ1xuIik7CisgICAgICAgICAgICBMT0dWKCJmb3VuZCAubm9tZWRpYSwgc2V0dGluZyBub01lZGlhIGZsYWdcbiIpOwogICAgICAgICAgICAgbm9NZWRpYSA9IHRydWU7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVG9uZUdlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAppbmRleCA5ZjFiM2Q2Li43YzIyMDBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9Ub25lR2VuZXJhdG9yLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBkNTFjOTQ2Li5hNzdkZmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNjgsMTggKzY4LDYgQEAKIAogI2luY2x1ZGUgPE9NWC5oPgogCi0vKiBkZXNrdG9wIExpbnV4IG5lZWRzIGEgbGl0dGxlIGhlbHAgd2l0aCBnZXR0aWQoKSAqLwotI2lmIGRlZmluZWQoSEFWRV9HRVRUSUQpICYmICFkZWZpbmVkKEhBVkVfQU5EUk9JRF9PUykKLSNkZWZpbmUgX19LRVJORUxfXwotIyBpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpZmRlZiBfc3lzY2FsbDAKLV9zeXNjYWxsMChwaWRfdCxnZXR0aWQpCi0jZWxzZQotcGlkX3QgZ2V0dGlkKCkgeyByZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7fQotI2VuZGlmCi0jdW5kZWYgX19LRVJORUxfXwotI2VuZGlmCi0KIG5hbWVzcGFjZSB7CiB1c2luZyBhbmRyb2lkOjptZWRpYTo6TWV0YWRhdGE7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKQEAgLTM4MCw2ICszNjgsOSBAQAogICAgICAgICAgICAgbVBpZCwgbUNvbm5JZCwgbVN0YXR1cywgbUxvb3A/InRydWUiOiAiZmFsc2UiKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgaWYgKG1QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBtUGxheWVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICB9CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7CiAgICAgICAgIG1BdWRpb091dHB1dC0+ZHVtcChmZCwgYXJncyk7CiAgICAgfQpAQCAtMzg3LDE0ICszNzgsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdGljIGludCBteVRpZCgpIHsKLSNpZmRlZiBIQVZFX0dFVFRJRAotICAgIHJldHVybiBnZXR0aWQoKTsKLSNlbHNlCi0gICAgcmV0dXJuIGdldHBpZCgpOwotI2VuZGlmCi19Ci0KIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC00MjYsNyArNDA5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBGaWxlcyBvcGVuZWQgYW5kL29yIG1hcHBlZDpcbiIpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9tYXBzIiwgbXlUaWQoKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXR0aWQoKSk7CiAgICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7CiAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKQEAgLTQ0NiwxMyArNDI5LDEzIEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICB9CiAKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBteVRpZCgpKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXR0aWQoKSk7CiAgICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKICAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIG15VGlkKCksIGVudC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQvJXMiLCBnZXR0aWQoKSwgZW50LT5kX25hbWUpOwogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzOwogICAgICAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZMTkspIHsKQEAgLTExNjQsNyArMTE0Nyw3IEBACiAgICAgbWVtID0gbmV3IE1lbW9yeUJhc2UoY2FjaGUtPmdldEhlYXAoKSwgMCwgY2FjaGUtPnNpemUoKSk7CiAgICAgKnBTYW1wbGVSYXRlID0gY2FjaGUtPnNhbXBsZVJhdGUoKTsKICAgICAqcE51bUNoYW5uZWxzID0gY2FjaGUtPmNoYW5uZWxDb3VudCgpOwotICAgICpwRm9ybWF0ID0gY2FjaGUtPmZvcm1hdCgpOworICAgICpwRm9ybWF0ID0gKGludCljYWNoZS0+Zm9ybWF0KCk7CiAgICAgTE9HVigicmV0dXJuIG1lbW9yeSBAICVwLCBzYW1wbGVSYXRlPSV1LCBjaGFubmVsQ291bnQgPSAlZCwgZm9ybWF0ID0gJWQiLCBtZW0tPnBvaW50ZXIoKSwgKnBTYW1wbGVSYXRlLCAqcE51bUNoYW5uZWxzLCAqcEZvcm1hdCk7CiAKIEV4aXQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAppbmRleCA4Zjc3NmI0Li5kNTc0ZWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKQEAgLTQwLDE4ICszOSw2IEBACiAjaW5jbHVkZSAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCiAKLS8qIGRlc2t0b3AgTGludXggbmVlZHMgYSBsaXR0bGUgaGVscCB3aXRoIGdldHRpZCgpICovCi0jaWYgZGVmaW5lZChIQVZFX0dFVFRJRCkgJiYgIWRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotI2RlZmluZSBfX0tFUk5FTF9fCi0jIGluY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2lmZGVmIF9zeXNjYWxsMAotX3N5c2NhbGwwKHBpZF90LGdldHRpZCkKLSNlbHNlCi1waWRfdCBnZXR0aWQoKSB7IHJldHVybiBzeXNjYWxsKF9fTlJfZ2V0dGlkKTt9Ci0jZW5kaWYKLSN1bmRlZiBfX0tFUk5FTF9fCi0jZW5kaWYKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBleHRlcm4gcGxheWVyX3R5cGUgZ2V0UGxheWVyVHlwZShjb25zdCBjaGFyKiB1cmwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NaWRpRmlsZS5jcHAKaW5kZXggNTg5YzYyNS4uN2UwNDUyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01pZGlGaWxlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWlkaUZpbGUuY3BwCkBAIC0yOSwxNyArMjksMTIgQEAKICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc19yZXZlcmIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJNaWRpRmlsZS5oIgogCi0jaWZkZWYgSEFWRV9HRVRUSUQKLXN0YXRpYyBwaWRfdCBteVRpZCgpIHsgcmV0dXJuIGdldHRpZCgpOyB9Ci0jZWxzZQotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0cGlkKCk7IH0KLSNlbmRpZgotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQ1NSw3ICs0NTAsNyBAQAogICAgIC8vIHNpZ25hbCBtYWluIHRocmVhZCB0aGF0IHdlIHN0YXJ0ZWQKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIG1UaWQgPSBteVRpZCgpOworICAgICAgICBtVGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIExPR1YoInJlbmRlciB0aHJlYWQoJWQpIHNpZ25hbCIsIG1UaWQpOwogICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCmluZGV4IDAyZWM5MTEuLjg3MGUyOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcApAQCAtMjE0LDQgKzIxNCw4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBsYXllci0+ZHVtcChmZCwgYXJncyk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCmluZGV4IGRkZDM3ZTQuLjg1YTU0NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oCkBAIC02MSw2ICs2MSw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YSgKICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBpZHMsIFBhcmNlbCAqcmVjb3Jkcyk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBBd2Vzb21lUGxheWVyICptUGxheWVyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAppbmRleCA4NDEzMjA4Li5kMTMzZTkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA2NDJiM2EzLi5kNjI4MzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTg4OCw4ICs4ODgsNiBAQAogICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKICAgICBDSEVDS19FUSgoaW50KWZvcm1hdC5lQ29tcHJlc3Npb25Gb3JtYXQsIChpbnQpT01YX1ZJREVPX0NvZGluZ1VudXNlZCk7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiAgICAgQ0hFQ0soZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyCiAgICAgICAgICAgIHx8IGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIKICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCBiMTBkNTJjLi42NDM2MDcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDNkMjcwZjg5Li5hYTdlZGNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcApAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IHNvbWV0aGluZyB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlci4KICAgICAgICAgICAgIG1VcmlIZWFkZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCi0gICAgICAgICAgICBtRmxhZ3MgfD0gSU5DT0dOSVRPOworICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoSU5DT0dOSVRPLCBTRVQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNzksNiArMjc5LDEyIEBACiAgICAgLy8gOjpmaW5pc2hTZXREYXRhU291cmNlX2wgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIGNhbGxpbmcgdGhyZWFkIGluCiAgICAgLy8gc2V0RGF0YVNvdXJjZSBmb3IgYW55IHNpZ25pZmljYW50IHRpbWUuCiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GZCA9IC0xOworICAgICAgICBtU3RhdHMubVVSSSA9IG1Vcmk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yOTgsNiArMzA0LDEyIEBACiAKICAgICBtRmlsZVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GZCA9IGZkOworICAgICAgICBtU3RhdHMubVVSSSA9IFN0cmluZzgoKTsKKyAgICB9CisKICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGRhdGFTb3VyY2UpOwogfQogCkBAIC0zMzYsNiArMzQ4LDEwIEBACiAKICAgICAgICAgaW50MzJfdCBiaXRyYXRlOwogICAgICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgTE9HVygidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggYml0cmF0ZSIsIG1pbWUpOworCiAgICAgICAgICAgICB0b3RhbEJpdFJhdGUgPSAtMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNDcsNiArMzYzLDE0IEBACiAKICAgICBMT0dWKCJtQml0cmF0ZSA9ICVsbGQgYml0cy9zZWMiLCBtQml0cmF0ZSk7CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1CaXRyYXRlID0gbUJpdHJhdGU7CisgICAgICAgIG1TdGF0cy5tVHJhY2tzLmNsZWFyKCk7CisgICAgICAgIG1TdGF0cy5tQXVkaW9UcmFja0luZGV4ID0gLTE7CisgICAgICAgIG1TdGF0cy5tVmlkZW9UcmFja0luZGV4ID0gLTE7CisgICAgfQorCiAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOyArK2kpIHsKQEAgLTM3MCwxMCArMzk0LDI3IEBACiAgICAgICAgICAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5SGVpZ2h0OwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9UcmFja0luZGV4ID0gbVN0YXRzLm1UcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgICAgIG1TdGF0cy5tVHJhY2tzLnB1c2goKTsKKyAgICAgICAgICAgICAgICBUcmFja1N0YXQgKnN0YXQgPQorICAgICAgICAgICAgICAgICAgICAmbVN0YXRzLm1UcmFja3MuZWRpdEl0ZW1BdChtU3RhdHMubVZpZGVvVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgc3RhdC0+bU1JTUUgPSBtaW1lOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFoYXZlQXVkaW8gJiYgIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgc2V0QXVkaW9Tb3VyY2UoZXh0cmFjdG9yLT5nZXRUcmFjayhpKSk7CiAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwogCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICAgICAgICAgIG1TdGF0cy5tQXVkaW9UcmFja0luZGV4ID0gbVN0YXRzLm1UcmFja3Muc2l6ZSgpOworICAgICAgICAgICAgICAgIG1TdGF0cy5tVHJhY2tzLnB1c2goKTsKKyAgICAgICAgICAgICAgICBUcmFja1N0YXQgKnN0YXQgPQorICAgICAgICAgICAgICAgICAgICAmbVN0YXRzLm1UcmFja3MuZWRpdEl0ZW1BdChtU3RhdHMubUF1ZGlvVHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgc3RhdC0+bU1JTUUgPSBtaW1lOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgZG8gdGhpcyBmb3Igdm9yYmlzIGF1ZGlvLCBub25lIG9mIHRoZSBvdGhlciBhdWRpbwogICAgICAgICAgICAgICAgIC8vIGZvcm1hdHMgZXZlbiBzdXBwb3J0IHRoaXMgcmluZ3RvbmUgc3BlY2lmaWMgaGFjayBhbmQKQEAgLTM4Myw3ICs0MjQsNyBAQAogICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcDsKICAgICAgICAgICAgICAgICBpZiAoZmlsZU1ldGEgIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IEFVVE9fTE9PUElORzsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQVVUT19MT09QSU5HLCBTRVQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CkBAIC00MzEsNyArNDcyLDcgQEAKICAgICB9CiAKICAgICBpZiAobUZsYWdzICYgUFJFUEFSSU5HKSB7Ci0gICAgICAgIG1GbGFncyB8PSBQUkVQQVJFX0NBTkNFTExFRDsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoUFJFUEFSRV9DQU5DRUxMRUQsIFNFVCk7CiAgICAgICAgIGlmIChtQ29ubmVjdGluZ0RhdGFTb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgTE9HSSgiaW50ZXJydXB0aW5nIHRoZSBjb25uZWN0aW9uIHByb2Nlc3MiKTsKICAgICAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS0+ZGlzY29ubmVjdCgpOwpAQCAtNDk0LDcgKzUzNSw3IEBACiAgICAgfQogCiAgICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtRmxhZ3MgPSAwOworICAgIG1vZGlmeUZsYWdzKDAsIEFTU0lHTik7CiAgICAgbUV4dHJhY3RvckZsYWdzID0gMDsKICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSAwOwogICAgIG1WaWRlb1RpbWVVcyA9IDA7CkBAIC01MTAsNiArNTUxLDIyIEBACiAKICAgICBtQml0cmF0ZSA9IC0xOwogICAgIG1MYXN0VmlkZW9UaW1lVXMgPSAtMTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOworICAgICAgICBtU3RhdHMubUZkID0gLTE7CisgICAgICAgIG1TdGF0cy5tVVJJID0gU3RyaW5nOCgpOworICAgICAgICBtU3RhdHMubUJpdHJhdGUgPSAtMTsKKyAgICAgICAgbVN0YXRzLm1BdWRpb1RyYWNrSW5kZXggPSAtMTsKKyAgICAgICAgbVN0YXRzLm1WaWRlb1RyYWNrSW5kZXggPSAtMTsKKyAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQgPSAwOworICAgICAgICBtU3RhdHMubU51bVZpZGVvRnJhbWVzRHJvcHBlZCA9IDA7CisgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCA9IC0xOworICAgICAgICBtU3RhdHMubVZpZGVvSGVpZ2h0ID0gLTE7CisgICAgICAgIG1TdGF0cy5tRmxhZ3MgPSAwOworICAgICAgICBtU3RhdHMubVRyYWNrcy5jbGVhcigpOworICAgIH0KKwogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om5vdGlmeUxpc3RlbmVyX2woaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CkBAIC02MzEsMTUgKzY4OCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNhY2hlZERhdGFSZW1haW5pbmcgPCBrTG93V2F0ZXJNYXJrQnl0ZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGlzIHJ1bm5pbmcgbG93ICg8ICVkKSAsIHBhdXNpbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrTG93V2F0ZXJNYXJrQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQ0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBTRVQpOwogICAgICAgICAgICAgICAgICAgICBwYXVzZV9sKCk7CiAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPiBrSGlnaFdhdGVyTWFya0J5dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewogICAgICAgICAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHJlc3VtaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIaWdoV2F0ZXJNYXJrQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5X2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfRU5EKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKQEAgLTY4OSwxNSArNzQ3LDE2IEBACiAgICAgICAgICAgICAgICAgJiYgKGNhY2hlZER1cmF0aW9uVXMgPCBrTG93V2F0ZXJNYXJrVXMpKSB7CiAgICAgICAgICAgICBMT0dJKCJjYWNoZSBpcyBydW5uaW5nIGxvdyAoJS4yZiBzZWNzKSAsIHBhdXNpbmcuIiwKICAgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0gQ0FDSEVfVU5ERVJSVU47CisgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgU0VUKTsKICAgICAgICAgICAgIHBhdXNlX2woKTsKICAgICAgICAgICAgIGVuc3VyZUNhY2hlSXNGZXRjaGluZ19sKCk7CisgICAgICAgICAgICBzZW5kQ2FjaGVTdGF0cygpOwogICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZER1cmF0aW9uVXMgPiBoaWdoV2F0ZXJNYXJrVXMpIHsKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewogICAgICAgICAgICAgICAgIExPR0koImNhY2hlIGhhcyBmaWxsZWQgdXAgKCUuMmYgc2VjcyksIHJlc3VtaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKENBQ0hFX1VOREVSUlVOLCBDTEVBUik7CiAgICAgICAgICAgICAgICAgcGxheV9sKCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19FTkQpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBQUkVQQVJJTkcpIHsKQEAgLTcxMSw2ICs3NzAsMTggQEAKICAgICBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOwogfQogCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OnNlbmRDYWNoZVN0YXRzKCkgeworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMICYmIG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IGticHMgPSAwOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ2FjaGVkU291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKCZrYnBzKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgKKyAgICAgICAgICAgICAgICBNRURJQV9JTkZPLCBNRURJQV9JTkZPX05FVFdPUktfQkFORFdJRFRILCBrYnBzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBBd2Vzb21lUGxheWVyOjpvblN0cmVhbURvbmUoKSB7CiAgICAgLy8gUG9zdGVkIHdoZW5ldmVyIGFueSBzdHJlYW0gZmluaXNoZXMgcGxheWluZy4KIApAQCAtNzI4LDcgKzc5OSw3IEBACiAKICAgICAgICAgcGF1c2VfbCh0cnVlIC8qIGF0IGVvcyAqLyk7CiAKLSAgICAgICAgbUZsYWdzIHw9IEFUX0VPUzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVRfRU9TLCBTRVQpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC03NTIsMjAgKzgyMywyMCBAQAogCiAgICAgICAgIHBhdXNlX2wodHJ1ZSAvKiBhdCBlb3MgKi8pOwogCi0gICAgICAgIG1GbGFncyB8PSBBVF9FT1M7CisgICAgICAgIG1vZGlmeUZsYWdzKEFUX0VPUywgU0VUKTsKICAgICB9CiB9CiAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnBsYXkoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1GbGFncyAmPSB+Q0FDSEVfVU5ERVJSVU47CisgICAgbW9kaWZ5RmxhZ3MoQ0FDSEVfVU5ERVJSVU4sIENMRUFSKTsKIAogICAgIHJldHVybiBwbGF5X2woKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6cGxheV9sKCkgewotICAgIG1GbGFncyAmPSB+U0VFS19QUkVWSUVXOworICAgIG1vZGlmeUZsYWdzKFNFRUtfUFJFVklFVywgQ0xFQVIpOwogCiAgICAgaWYgKG1GbGFncyAmIFBMQVlJTkcpIHsKICAgICAgICAgcmV0dXJuIE9LOwpAQCAtNzc5LDggKzg1MCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gUExBWUlORzsKLSAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgbW9kaWZ5RmxhZ3MoUExBWUlORywgU0VUKTsKKyAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgU0VUKTsKIAogICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgcG9zaXRpb247CkBAIC04MTQsNyArODg1LDcgQEAKICAgICAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvUGxheWVyOwogICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfihQTEFZSU5HIHwgRklSU1RfRlJBTUUpOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKChQTEFZSU5HIHwgRklSU1RfRlJBTUUpLCBDTEVBUik7CiAKICAgICAgICAgICAgICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+c2V0UGxheWJhY2tTdGF0dXMoCkBAIC04NjYsNyArOTM3LDcgQEAKICAgICB9CiAKICAgICBpZiAoIShtRmxhZ3MgJiBBVURJT1BMQVlFUl9TVEFSVEVEKSkgewotICAgICAgICBtRmxhZ3MgfD0gQVVESU9QTEFZRVJfU1RBUlRFRDsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9QTEFZRVJfU1RBUlRFRCwgU0VUKTsKIAogICAgICAgICBib29sIHdhc1NlZWtpbmcgPSBtQXVkaW9QbGF5ZXItPmlzU2Vla2luZygpOwogCkBAIC04OTAsNyArOTYxLDcgQEAKICAgICAgICAgbUF1ZGlvUGxheWVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBtRmxhZ3MgfD0gQVVESU9fUlVOTklORzsKKyAgICBtb2RpZnlGbGFncyhBVURJT19SVU5OSU5HLCBTRVQpOwogCiAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwogCkBAIC05MzcsNiArMTAwOCwxMiBAQAogICAgICAgICB1c2FibGVIZWlnaHQgPSBtRGlzcGxheUhlaWdodDsKICAgICB9CiAKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1WaWRlb1dpZHRoID0gdXNhYmxlV2lkdGg7CisgICAgICAgIG1TdGF0cy5tVmlkZW9IZWlnaHQgPSB1c2FibGVIZWlnaHQ7CisgICAgfQorCiAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgaWYgKCFtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICBrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CkBAIC05OTksNyArMTA3Niw3IEBACiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpwYXVzZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogCiAgICAgcmV0dXJuIHBhdXNlX2woKTsKIH0KQEAgLTEwMjEsMTUgKzEwOTgsMTUgQEAKICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKICAgICAgICAgfQogCi0gICAgICAgIG1GbGFncyAmPSB+QVVESU9fUlVOTklORzsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9fUlVOTklORywgQ0xFQVIpOwogICAgIH0KIAogICAgIGlmIChtRmxhZ3MgJiBURVhUUExBWUVSX1NUQVJURUQpIHsKICAgICAgICAgbVRleHRQbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgIG1GbGFncyAmPSB+VEVYVF9SVU5OSU5HOworICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIENMRUFSKTsKICAgICB9CiAKLSAgICBtRmxhZ3MgJj0gflBMQVlJTkc7CisgICAgbW9kaWZ5RmxhZ3MoUExBWUlORywgQ0xFQVIpOwogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKICAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPnNldFBsYXliYWNrU3RhdHVzKG1EZWNyeXB0SGFuZGxlLApAQCAtMTExMSw3ICsxMTg4LDcgQEAKICAgICAgICAgbVNlZWtpbmcgPSBTRUVLOwogICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgICAgICBtU2Vla1RpbWVVcyA9IG1MYXN0VmlkZW9UaW1lVXM7Ci0gICAgICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7CisgICAgICAgIG1vZGlmeUZsYWdzKChBVF9FT1MgfCBBVURJT19BVF9FT1MgfCBWSURFT19BVF9FT1MpLCBDTEVBUik7CiAgICAgfQogCiAgICAgaWYgKHdhc1BsYXlpbmcpIHsKQEAgLTExMjksMTAgKzEyMDYsMTAgQEAKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OnNldExvb3BpbmcoYm9vbCBzaG91bGRMb29wKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1GbGFncyA9IG1GbGFncyAmIH5MT09QSU5HOworICAgIG1vZGlmeUZsYWdzKExPT1BJTkcsIENMRUFSKTsKIAogICAgIGlmIChzaG91bGRMb29wKSB7Ci0gICAgICAgIG1GbGFncyB8PSBMT09QSU5HOworICAgICAgICBtb2RpZnlGbGFncyhMT09QSU5HLCBTRVQpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTExODYsMTUgKzEyNjMsMTUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtRmxhZ3MgfD0gVEVYVF9SVU5OSU5HOwotICAgICAgICAgICAgbUZsYWdzIHw9IFRFWFRQTEFZRVJfU1RBUlRFRDsKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRfUlVOTklORywgU0VUKTsKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKFRFWFRQTEFZRVJfU1RBUlRFRCwgU0VUKTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfSBlbHNlIHsgLy8gdG8gdHVybiBvZmYgdGhlIHRleHQgdHJhY2sgZGlzcGxheQogICAgICAgICAgICAgaWYgKG1GbGFncyAgJiBURVhUX1JVTk5JTkcpIHsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gflRFWFRfUlVOTklORzsKKyAgICAgICAgICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIENMRUFSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtRmxhZ3MgICYgVEVYVFBMQVlFUl9TVEFSVEVEKSB7Ci0gICAgICAgICAgICAgICAgbUZsYWdzICY9IH5URVhUUExBWUVSX1NUQVJURUQ7CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoVEVYVFBMQVlFUl9TVEFSVEVELCBDTEVBUik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBtVGV4dFBsYXllci0+c2V0VGltZWRUZXh0VHJhY2tJbmRleChpbmRleCk7CkBAIC0xMjIxLDcgKzEyOTgsNyBAQAogICAgIH0KIAogICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgewotICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOwogICAgICAgICBwbGF5X2woKTsKICAgICB9CiAKQEAgLTEyMzYsNyArMTMxMyw3IEBACiAgICAgbVNlZWtpbmcgPSBTRUVLOwogICAgIG1TZWVrTm90aWZpY2F0aW9uU2VudCA9IGZhbHNlOwogICAgIG1TZWVrVGltZVVzID0gdGltZVVzOwotICAgIG1GbGFncyAmPSB+KEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyk7CisgICAgbW9kaWZ5RmxhZ3MoKEFUX0VPUyB8IEFVRElPX0FUX0VPUyB8IFZJREVPX0FUX0VPUyksIENMRUFSKTsKIAogICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIApAQCAtMTI1Miw3ICsxMzI5LDcgQEAKICAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKIAogICAgICAgICBpZiAoKG1GbGFncyAmIFBSRVBBUkVEKSAmJiBtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZsYWdzIHw9IFNFRUtfUFJFVklFVzsKKyAgICAgICAgICAgIG1vZGlmeUZsYWdzKFNFRUtfUFJFVklFVywgU0VUKTsKICAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzMzAsNiArMTQwNywxOSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgVHJhY2tTdGF0ICpzdGF0ID0gJm1TdGF0cy5tVHJhY2tzLmVkaXRJdGVtQXQobVN0YXRzLm1BdWRpb1RyYWNrSW5kZXgpOworCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudDsKKyAgICAgICAgaWYgKCFtQXVkaW9Tb3VyY2UtPmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgLT5maW5kQ1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgJmNvbXBvbmVudCkpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudCA9ICJub25lIjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXQtPm1EZWNvZGVyTmFtZSA9IGNvbXBvbmVudDsKKyAgICB9CisKICAgICByZXR1cm4gbUF1ZGlvU291cmNlICE9IE5VTEwgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKQEAgLTE0MDksNiArMTQ5OSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgVHJhY2tTdGF0ICpzdGF0ID0gJm1TdGF0cy5tVHJhY2tzLmVkaXRJdGVtQXQobVN0YXRzLm1WaWRlb1RyYWNrSW5kZXgpOworCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudDsKKyAgICAgICAgQ0hFQ0sobVZpZGVvU291cmNlLT5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgIC0+ZmluZENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICZjb21wb25lbnQpKTsKKworICAgICAgICBzdGF0LT5tRGVjb2Rlck5hbWUgPSBjb21wb25lbnQ7CisgICAgfQorCiAgICAgcmV0dXJuIG1WaWRlb1NvdXJjZSAhPSBOVUxMID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCkBAIC0xNDM4LDcgKzE1MzksNyBAQAogICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSB0cnVlOwogICAgIH0KIAotICAgIG1GbGFncyB8PSBGSVJTVF9GUkFNRTsKKyAgICBtb2RpZnlGbGFncyhGSVJTVF9GUkFNRSwgU0VUKTsKICAgICBtU2Vla2luZyA9IE5PX1NFRUs7CiAKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewpAQCAtMTQ3Nyw3ICsxNTc4LDcgQEAKICAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCAmJiAobUZsYWdzICYgQVVESU9fUlVOTklORykpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnBhdXNlKCk7CiAKLSAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfkFVRElPX1JVTk5JTkc7CisgICAgICAgICAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9fUlVOTklORywgQ0xFQVIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvU291cmNlLT5wYXVzZSgpOwogICAgICAgICB9CkBAIC0xNTI2LDcgKzE2MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGFydEF1ZGlvUGxheWVyX2woKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOworICAgICAgICAgICAgICAgIG1vZGlmeUZsYWdzKFZJREVPX0FUX0VPUywgU0VUKTsKICAgICAgICAgICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZXJyKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC0xNTQyLDYgKzE2NDMsMTEgQEAKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRzTG9jayk7CisgICAgICAgICAgICArK21TdGF0cy5tTnVtVmlkZW9GcmFtZXNEZWNvZGVkOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lVXM7CkBAIC0xNTc0LDEzICsxNjgwLDEzIEBACiAKICAgICBpZiAoKG1GbGFncyAmIFRFWFRQTEFZRVJfU1RBUlRFRCkgJiYgIShtRmxhZ3MgJiAoVEVYVF9SVU5OSU5HIHwgU0VFS19QUkVWSUVXKSkpIHsKICAgICAgICAgbVRleHRQbGF5ZXItPnJlc3VtZSgpOwotICAgICAgICBtRmxhZ3MgfD0gVEVYVF9SVU5OSU5HOworICAgICAgICBtb2RpZnlGbGFncyhURVhUX1JVTk5JTkcsIFNFVCk7CiAgICAgfQogCiAgICAgVGltZVNvdXJjZSAqdHMgPSAobUZsYWdzICYgQVVESU9fQVRfRU9TKSA/ICZtU3lzdGVtVGltZVNvdXJjZSA6IG1UaW1lU291cmNlOwogCiAgICAgaWYgKG1GbGFncyAmIEZJUlNUX0ZSQU1FKSB7Ci0gICAgICAgIG1GbGFncyAmPSB+RklSU1RfRlJBTUU7CisgICAgICAgIG1vZGlmeUZsYWdzKEZJUlNUX0ZSQU1FLCBDTEVBUik7CiAgICAgICAgIG1UaW1lU291cmNlRGVsdGFVcyA9IHRzLT5nZXRSZWFsVGltZVVzKCkgLSB0aW1lVXM7CiAgICAgfQogCkBAIC0xNjMyLDYgKzE3MzgsMTEgQEAKICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgICAgICAgICArK21TdGF0cy5tTnVtVmlkZW9GcmFtZXNEcm9wcGVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwb3N0VmlkZW9FdmVudF9sKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTE2NTgsNyArMTc2OSw3IEBACiAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKIAogICAgIGlmICh3YXNTZWVraW5nICE9IE5PX1NFRUsgJiYgKG1GbGFncyAmIFNFRUtfUFJFVklFVykpIHsKLSAgICAgICAgbUZsYWdzICY9IH5TRUVLX1BSRVZJRVc7CisgICAgICAgIG1vZGlmeUZsYWdzKFNFRUtfUFJFVklFVywgQ0xFQVIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xNzMyLDggKzE4NDMsOCBAQAogICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwogICAgIGlmIChtV2F0Y2hGb3JBdWRpb0VPUyAmJiBtQXVkaW9QbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewogICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IGZhbHNlOwotICAgICAgICBtRmxhZ3MgfD0gQVVESU9fQVRfRU9TOwotICAgICAgICBtRmxhZ3MgfD0gRklSU1RfRlJBTUU7CisgICAgICAgIG1vZGlmeUZsYWdzKEFVRElPX0FUX0VPUywgU0VUKTsKKyAgICAgICAgbW9kaWZ5RmxhZ3MoRklSU1RfRlJBTUUsIFNFVCk7CiAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChmaW5hbFN0YXR1cyk7CiAgICAgfQogfQpAQCAtMTc4Nyw3ICsxODk4LDcgQEAKICAgICAgICAgbVF1ZXVlU3RhcnRlZCA9IHRydWU7CiAgICAgfQogCi0gICAgbUZsYWdzIHw9IFBSRVBBUklORzsKKyAgICBtb2RpZnlGbGFncyhQUkVQQVJJTkcsIFNFVCk7CiAgICAgbUFzeW5jUHJlcGFyZUV2ZW50ID0gbmV3IEF3ZXNvbWVFdmVudCgKICAgICAgICAgICAgIHRoaXMsICZBd2Vzb21lUGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KTsKIApAQCAtMTk3NCw3ICsyMDg1LDcgQEAKICAgICB9CiAKICAgICBtUHJlcGFyZVJlc3VsdCA9IGVycjsKLSAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCk7CisgICAgbW9kaWZ5RmxhZ3MoKFBSRVBBUklOR3xQUkVQQVJFX0NBTkNFTExFRHxQUkVQQVJJTkdfQ09OTkVDVEVEKSwgQ0xFQVIpOwogICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7CiAgICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwogfQpAQCAtMjAyMiw3ICsyMTMzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1GbGFncyB8PSBQUkVQQVJJTkdfQ09OTkVDVEVEOworICAgIG1vZGlmeUZsYWdzKFBSRVBBUklOR19DT05ORUNURUQsIFNFVCk7CiAKICAgICBpZiAoaXNTdHJlYW1pbmdIVFRQKCkgfHwgbVJUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKICAgICAgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKQEAgLTIwNDMsOCArMjE1NCw4IEBACiAgICAgfQogCiAgICAgbVByZXBhcmVSZXN1bHQgPSBPSzsKLSAgICBtRmxhZ3MgJj0gfihQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCk7Ci0gICAgbUZsYWdzIHw9IFBSRVBBUkVEOworICAgIG1vZGlmeUZsYWdzKChQUkVQQVJJTkd8UFJFUEFSRV9DQU5DRUxMRUR8UFJFUEFSSU5HX0NPTk5FQ1RFRCksIENMRUFSKTsKKyAgICBtb2RpZnlGbGFncyhQUkVQQVJFRCwgU0VUKTsKICAgICBtQXN5bmNQcmVwYXJlRXZlbnQgPSBOVUxMOwogICAgIG1QcmVwYXJlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKIH0KQEAgLTIwODMsNiArMjE5NCwxMCBAQAogCiAgICAgICAgICAgICByZXR1cm4gbVRleHRQbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwogICAgICAgICB9CisgICAgICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9DQUNIRV9TVEFUX0NPTExFQ1RfRlJFUV9NUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNldENhY2hlU3RhdENvbGxlY3RGcmVxKHJlcXVlc3QpOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTIwOTAsNiArMjIwNSwxNiBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoY29uc3QgUGFyY2VsICZyZXF1ZXN0KSB7CisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IGZyZXFNcyA9IHJlcXVlc3QucmVhZEludDMyKCk7CisgICAgICAgIExPR0QoIlJlcXVlc3QgdG8ga2VlcCBjYWNoZSBzdGF0cyBpbiB0aGUgcGFzdCAlZCBtcyIsCisgICAgICAgICAgICBmcmVxTXMpOworICAgICAgICByZXR1cm4gbUNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoZnJlcU1zKTsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewogICAgIHJldHVybiBPSzsKIH0KQEAgLTIwOTgsNCArMjIyMyw3NSBAQAogICAgIHJldHVybiBtQ2FjaGVkU291cmNlICE9IE5VTEwgfHwgbVdWTUV4dHJhY3RvciAhPSBOVUxMOwogfQogCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKworICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOworCisgICAgZnByaW50ZihvdXQsICIgQXdlc29tZVBsYXllclxuIik7CisgICAgaWYgKG1TdGF0cy5tRmQgPCAwKSB7CisgICAgICAgIGZwcmludGYob3V0LCAiICBVUkkoJXMpIiwgbVN0YXRzLm1VUkkuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYob3V0LCAiICBmZCglZCkiLCBtU3RhdHMubUZkKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKG91dCwgIiwgZmxhZ3MoMHglMDh4KSIsIG1TdGF0cy5tRmxhZ3MpOworCisgICAgaWYgKG1TdGF0cy5tQml0cmF0ZSA+PSAwKSB7CisgICAgICAgIGZwcmludGYob3V0LCAiLCBiaXRyYXRlKCVsbGQgYnBzKSIsIG1TdGF0cy5tQml0cmF0ZSk7CisgICAgfQorCisgICAgZnByaW50ZihvdXQsICJcbiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RhdHMubVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBUcmFja1N0YXQgJnN0YXQgPSBtU3RhdHMubVRyYWNrcy5pdGVtQXQoaSk7CisKKyAgICAgICAgZnByaW50ZihvdXQsICIgIFRyYWNrICVkXG4iLCBpICsgMSk7CisgICAgICAgIGZwcmludGYob3V0LCAiICAgTUlNRSglcykiLCBzdGF0Lm1NSU1FLnN0cmluZygpKTsKKworICAgICAgICBpZiAoIXN0YXQubURlY29kZXJOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIsIGRlY29kZXIoJXMpIiwgc3RhdC5tRGVjb2Rlck5hbWUuc3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgZnByaW50ZihvdXQsICJcbiIpOworCisgICAgICAgIGlmICgoc3NpemVfdClpID09IG1TdGF0cy5tVmlkZW9UcmFja0luZGV4KSB7CisgICAgICAgICAgICBmcHJpbnRmKG91dCwKKyAgICAgICAgICAgICAgICAgICAgIiAgIHZpZGVvRGltZW5zaW9ucyglZCB4ICVkKSwgIgorICAgICAgICAgICAgICAgICAgICAibnVtVmlkZW9GcmFtZXNEZWNvZGVkKCVsbGQpLCAiCisgICAgICAgICAgICAgICAgICAgICJudW1WaWRlb0ZyYW1lc0Ryb3BwZWQoJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVmlkZW9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1WaWRlb0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm1OdW1WaWRlb0ZyYW1lc0RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5tTnVtVmlkZW9GcmFtZXNEcm9wcGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZjbG9zZShvdXQpOworICAgIG91dCA9IE5VTEw7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQXdlc29tZVBsYXllcjo6bW9kaWZ5RmxhZ3ModW5zaWduZWQgdmFsdWUsIEZsYWdNb2RlIG1vZGUpIHsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBTRVQ6CisgICAgICAgICAgICBtRmxhZ3MgfD0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDTEVBUjoKKyAgICAgICAgICAgIG1GbGFncyAmPSB+dmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBU1NJR046CisgICAgICAgICAgICBtRmxhZ3MgPSB2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdHNMb2NrKTsKKyAgICAgICAgbVN0YXRzLm1GbGFncyA9IG1GbGFnczsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCBhMWYwNGQzLi42MWJiMmE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTcwMSwxMiArNzAxLDExIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID4gMCAmJgotICAgICAgICB0aW1lc3RhbXBVcyAtIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA+IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKSB7Ci0gICAgICAgIGlmIChtTnVtR2xpdGNoZXMgJSAxMCA9PSAwKSB7ICAvLyBEb24ndCBzcGFtIHRoZSBsb2cKLSAgICAgICAgICAgIExPR1YoIkxvbmcgZGVsYXkgZGV0ZWN0ZWQgaW4gdmlkZW8gcmVjb3JkaW5nIik7CisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDApIHsKKyAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPiBtTGFzdEZyYW1lVGltZXN0YW1wVXMpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgLSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPiBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcykgeworICAgICAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgICAgIH0KLSAgICAgICAgKyttTnVtR2xpdGNoZXM7CiAgICAgfQogCiAgICAgLy8gTWF5IG5lZWQgdG8gc2tpcCBmcmFtZSBvciBtb2RpZnkgdGltZXN0YW1wLiBDdXJyZW50bHkgaW1wbGVtZW50ZWQKQEAgLTczMiw2ICs3MzEsNyBAQAogICAgIH0KICAgICArK21OdW1GcmFtZXNSZWNlaXZlZDsKIAorICAgIENIRUNLKGRhdGEgIT0gTlVMTCAmJiBkYXRhLT5zaXplKCkgPiAwKTsKICAgICBtRnJhbWVzUmVjZWl2ZWQucHVzaF9iYWNrKGRhdGEpOwogICAgIGludDY0X3QgdGltZVVzID0gbVN0YXJ0VGltZVVzICsgKHRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOwogICAgIG1GcmFtZVRpbWVzLnB1c2hfYmFjayh0aW1lVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKaW5kZXggMzY4OTU1Ny4uY2MyMjU3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC00ODYsNyArNDg2LDggQEAKICAgICAgICAgICAgIGlmIChtRm9yY2VSZWFkKSB7CiAgICAgICAgICAgICAgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wIHRpbWVsYXBzZTogZm9yY2VkIHJlYWQiKTsKICAgICAgICAgICAgICAgICBtRm9yY2VSZWFkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgKnRpbWVzdGFtcFVzID0gbUxhc3RGcmFtZVRpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgICp0aW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyArIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXM7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggNThiMTdhNy4uYzBhZTI5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSFRUUEJhc2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKICNpZiBDSFJPTUlVTV9BVkFJTEFCTEUKQEAgLTIyLDExICsyNiwxOSBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUhUVFBCYXNlOjpIVFRQQmFzZSgpIHt9CitIVFRQQmFzZTo6SFRUUEJhc2UoKQorICAgIDogbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcygwKSwKKyAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzKDApLAorICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcygwKSwKKyAgICAgIG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcygwKSwKKyAgICAgIG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwcygwKSwKKyAgICAgIG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zKDUwMDApIHsKK30KIAogLy8gc3RhdGljCiBzcDxIVFRQQmFzZT4gSFRUUEJhc2U6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgewpAQCAtNDIsNCArNTQsNjkgQEAKICAgICB9CiB9CiAKK3ZvaWQgSFRUUEJhc2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KAorICAgICAgICBzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7CisgICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7CisgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKKyAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOworCisgICAgbUJhbmR3aWR0aEhpc3RvcnkucHVzaF9iYWNrKGVudHJ5KTsKKyAgICBpZiAoKyttTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID4gMTAwKSB7CisgICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKKyAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOworICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7CisgICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOworICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7CisKKyAgICAgICAgaW50NjRfdCB0aW1lTm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpZiAodGltZU5vd1VzIC0gbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzID49CisgICAgICAgICAgICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMgKiAxMDAwTEwpIHsKKworICAgICAgICAgICAgaWYgKG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzID0KKyAgICAgICAgICAgICAgICAgICAgKG1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTMgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgPSB0aW1lTm93VXM7CisgICAgICAgIH0KKyAgICB9CisKK30KKworYm9vbCBIVFRQQmFzZTo6ZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2JwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA8IDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpiYW5kd2lkdGhfYnBzID0gKChkb3VibGUpbVRvdGFsVHJhbnNmZXJCeXRlcyAqIDhFNiAvIG1Ub3RhbFRyYW5zZmVyVGltZVVzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBIVFRQQmFzZTo6Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqa2JwcyA9IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhUVFBCYXNlOjpzZXRCYW5kd2lkdGhTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKGZyZXFNcyA8IGtNaW5CYW5kd2lkdGhDb2xsZWN0RnJlcU1zCisgICAgICAgICAgICB8fCBmcmVxTXMgPiBrTWF4QmFuZHdpZHRoQ29sbGVjdEZyZXFNcykgeworCisgICAgICAgIExPR0UoImZyZXF1ZW5jeSAoJWQgbXMpIGlzIG91dCBvZiByYW5nZSBbMTAwMCwgNjAwMDBdIiwgZnJlcU1zKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBMT0dJKCJmcmVxdWVuY3kgc2V0IHRvICVkIG1zIiwgZnJlcU1zKTsKKyAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyA9IGZyZXFNczsKKyAgICByZXR1cm4gT0s7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwCmluZGV4IDJjYWYyMTEuLmExNTZkYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwCkBAIC0xMzksNiArMTM5LDkgQEAKICAgICAgICAgaW50IHMsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIGJvb2wgc2VuZERhdGEpIHsKICAgICBzc2l6ZV90IHJlc3VsdCA9IDA7CiAKKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICB3aGlsZSAoc2l6ZSA+IDApIHsKICAgICAgICAgZmRfc2V0IHJzLCB3cywgZXM7CiAgICAgICAgIEZEX1pFUk8oJnJzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcAppbmRleCBmNmE4YjE3Li41OGY2Njk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CkBAIC0xMjgsMTcgKzEyNywyOCBAQAogICAgIHNpemVfdCAgICAgICAgbU51bVN0c3NUYWJsZUVudHJpZXM7CiAgICAgTGlzdDxpbnQzMl90PiBtU3Rzc1RhYmxlRW50cmllczsKIAotICAgIHNpemVfdCAgICAgICAgbU51bVN0dHNUYWJsZUVudHJpZXM7CiAgICAgc3RydWN0IFN0dHNUYWJsZUVudHJ5IHsKIAotICAgICAgICBTdHRzVGFibGVFbnRyeSh1aW50MzJfdCBjb3VudCwgdWludDMyX3QgZHVyYXRpb25VcykKLSAgICAgICAgICAgIDogc2FtcGxlQ291bnQoY291bnQpLCBzYW1wbGVEdXJhdGlvblVzKGR1cmF0aW9uVXMpIHt9CisgICAgICAgIFN0dHNUYWJsZUVudHJ5KHVpbnQzMl90IGNvdW50LCB1aW50MzJfdCBkdXJhdGlvbikKKyAgICAgICAgICAgIDogc2FtcGxlQ291bnQoY291bnQpLCBzYW1wbGVEdXJhdGlvbihkdXJhdGlvbikge30KIAogICAgICAgICB1aW50MzJfdCBzYW1wbGVDb3VudDsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb25VczsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlRHVyYXRpb247ICAvLyB0aW1lIHNjYWxlIGJhc2VkCiAgICAgfTsKKyAgICBzaXplX3QgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzOwogICAgIExpc3Q8U3R0c1RhYmxlRW50cnk+IG1TdHRzVGFibGVFbnRyaWVzOwogCisgICAgc3RydWN0IEN0dHNUYWJsZUVudHJ5IHsKKyAgICAgICAgQ3R0c1RhYmxlRW50cnkodWludDMyX3QgY291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cikKKyAgICAgICAgICAgIDogc2FtcGxlQ291bnQoY291bnQpLCBzYW1wbGVEdXJhdGlvbih0aW1lc2NhbGVkRHVyKSB7fQorCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50OworICAgICAgICBpbnQzMl90IHNhbXBsZUR1cmF0aW9uOyAgLy8gdGltZSBzY2FsZSBiYXNlZAorICAgIH07CisgICAgYm9vbCAgICAgICAgICBtSGFzTmVnYXRpdmVDdHRzRGVsdGFEdXJhdGlvbjsKKyAgICBzaXplX3QgICAgICAgIG1OdW1DdHRzVGFibGVFbnRyaWVzOworICAgIExpc3Q8Q3R0c1RhYmxlRW50cnk+IG1DdHRzVGFibGVFbnRyaWVzOworCiAgICAgLy8gU2VxdWVuY2UgcGFyYW1ldGVyIHNldCBvciBwaWN0dXJlIHBhcmFtZXRlciBzZXQKICAgICBzdHJ1Y3QgQVZDUGFyYW1TZXQgewogICAgICAgICBBVkNQYXJhbVNldCh1aW50MTZfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEpCkBAIC0yMTYsNyArMjI2LDEwIEBACiAgICAgdm9pZCB1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpOwogICAgIHZvaWQgYWRkT25lU3RzY1RhYmxlRW50cnkoc2l6ZV90IGNodW5rSWQsIHNpemVfdCBzYW1wbGVJZCk7CiAgICAgdm9pZCBhZGRPbmVTdHNzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlSWQpOwotICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQ2NF90IGR1cmF0aW9uVXMpOworCisgICAgLy8gRHVyYXRpb24gaXMgdGltZSBzY2FsZSBiYXNlZAorICAgIHZvaWQgYWRkT25lU3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOworICAgIHZvaWQgYWRkT25lQ3R0c1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQzMl90IHRpbWVzY2FsZWREdXIpOwogICAgIHZvaWQgc2VuZFRyYWNrU3VtbWFyeShib29sIGhhc011bHRpcGxlVHJhY2tzKTsKIAogICAgIC8vIFdyaXRlIHRoZSBib3hlcwpAQCAtMjI1LDYgKzIzOCw3IEBACiAgICAgdm9pZCB3cml0ZVN0c3pCb3goKTsKICAgICB2b2lkIHdyaXRlU3Rzc0JveCgpOwogICAgIHZvaWQgd3JpdGVTdHRzQm94KCk7CisgICAgdm9pZCB3cml0ZUN0dHNCb3goKTsKICAgICB2b2lkIHdyaXRlRDI2M0JveCgpOwogICAgIHZvaWQgd3JpdGVQYXNwQm94KCk7CiAgICAgdm9pZCB3cml0ZUF2Y2NCb3goKTsKQEAgLTExNDUsNiArMTE1OSw3IEBACiAgICAgICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyArPSBtTnVtU3RzY1RhYmxlRW50cmllcyAqIDEyICsgIC8vIHN0c2MgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TdHNzVGFibGVFbnRyaWVzICogNCArICAgLy8gc3RzcyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVN0dHNUYWJsZUVudHJpZXMgKiA4ICsgICAvLyBzdHRzIGJveCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQ3R0c1RhYmxlRW50cmllcyAqIDggKyAgIC8vIGN0dHMgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y29Cb3hTaXplQnl0ZXMgKyAgICAgICAgICAgLy8gc3RjbyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RzekJveFNpemVCeXRlczsgICAgICAgICAgICAvLyBzdHN6IGJveCBzaXplCiAgICAgfQpAQCAtMTE2NCwxMyArMTE3OSwyNyBAQAogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lU3R0c1RhYmxlRW50cnkoCi0gICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCwgaW50NjRfdCBkdXJhdGlvblVzKSB7CisgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCBkdXJhdGlvbikgewogCi0gICAgU3R0c1RhYmxlRW50cnkgc3R0c0VudHJ5KHNhbXBsZUNvdW50LCBkdXJhdGlvblVzKTsKKyAgICBTdHRzVGFibGVFbnRyeSBzdHRzRW50cnkoc2FtcGxlQ291bnQsIGR1cmF0aW9uKTsKICAgICBtU3R0c1RhYmxlRW50cmllcy5wdXNoX2JhY2soc3R0c0VudHJ5KTsKICAgICArK21OdW1TdHRzVGFibGVFbnRyaWVzOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lQ3R0c1RhYmxlRW50cnkoCisgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCwgaW50MzJfdCBkdXJhdGlvbikgeworCisgICAgaWYgKG1Jc0F1ZGlvKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGR1cmF0aW9uIDwgMCAmJiAhbUhhc05lZ2F0aXZlQ3R0c0RlbHRhRHVyYXRpb24pIHsKKyAgICAgICAgbUhhc05lZ2F0aXZlQ3R0c0RlbHRhRHVyYXRpb24gPSB0cnVlOworICAgIH0KKyAgICBDdHRzVGFibGVFbnRyeSBjdHRzRW50cnkoc2FtcGxlQ291bnQsIGR1cmF0aW9uKTsKKyAgICBtQ3R0c1RhYmxlRW50cmllcy5wdXNoX2JhY2soY3R0c0VudHJ5KTsKKyAgICArK21OdW1DdHRzVGFibGVFbnRyaWVzOworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKICAgICArK21OdW1TdGNvVGFibGVFbnRyaWVzOwogICAgIG1DaHVua09mZnNldHMucHVzaF9iYWNrKG9mZnNldCk7CkBAIC0xMzA4LDYgKzEzMzcsNyBAQAogICAgIHNpemVfdCBvdXRzdGFuZGluZ0NodW5rcyA9IDA7CiAgICAgQ2h1bmsgY2h1bms7CiAgICAgd2hpbGUgKGZpbmRDaHVua1RvV3JpdGUoJmNodW5rKSkgeworICAgICAgICB3cml0ZUNodW5rVG9GaWxlKCZjaHVuayk7CiAgICAgICAgICsrb3V0c3RhbmRpbmdDaHVua3M7CiAgICAgfQogCkBAIC0xNDgwLDYgKzE1MTAsNyBAQAogICAgIG1OdW1TdHNzVGFibGVFbnRyaWVzID0gMDsKICAgICBtTnVtU3RzY1RhYmxlRW50cmllcyA9IDA7CiAgICAgbU51bVN0dHNUYWJsZUVudHJpZXMgPSAwOworICAgIG1OdW1DdHRzVGFibGVFbnRyaWVzID0gMDsKICAgICBtTWRhdFNpemVCeXRlcyA9IDA7CiAgICAgbUlzTWVkaWFUaW1lQWRqdXN0bWVudE9uID0gZmFsc2U7CiAgICAgbVByZXZNZWRpYVRpbWVBZGp1c3RUaW1lc3RhbXBVcyA9IDA7CkBAIC0xNDg4LDYgKzE1MTksNyBAQAogICAgIG1Ub3RhbERyaWZ0VGltZVRvQWRqdXN0VXMgPSAwOwogICAgIG1QcmV2VG90YWxBY2N1bURyaWZ0VGltZVVzID0gMDsKICAgICBtTWF4Q2h1bmtEdXJhdGlvblVzID0gMDsKKyAgICBtSGFzTmVnYXRpdmVDdHRzRGVsdGFEdXJhdGlvbiA9IGZhbHNlOwogCiAgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKICAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CkBAIC0xOTI5LDIxICsxOTYxLDM2IEBACiAgICAgaW50NjRfdCBjaHVua1RpbWVzdGFtcFVzID0gMDsKICAgICBpbnQzMl90IG5DaHVua3MgPSAwOwogICAgIGludDMyX3Qgblplcm9MZW5ndGhGcmFtZXMgPSAwOwotICAgIGludDY0X3QgbGFzdFRpbWVzdGFtcFVzID0gMDsgIC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wIGluIG1zCi0gICAgaW50NjRfdCBsYXN0RHVyYXRpb25VcyA9IDA7ICAgLy8gQmV0d2VlbiB0aGUgcHJldmlvdXMgdHdvIHNhbXBsZXMgaW4gbXMKLSAgICBpbnQ2NF90IGN1cnJEdXJhdGlvblRpY2tzID0gMDsgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcwotICAgIGludDY0X3QgbGFzdER1cmF0aW9uVGlja3MgPSAwOyAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCi0gICAgaW50MzJfdCBzYW1wbGVDb3VudCA9IDE7ICAgICAgLy8gU2FtcGxlIGNvdW50IGluIHRoZSBjdXJyZW50IHN0dHMgdGFibGUgZW50cnkKLSAgICB1aW50MzJfdCBwcmV2aW91c1NhbXBsZVNpemUgPSAwOyAgLy8gU2l6ZSBvZiB0aGUgcHJldmlvdXMgc2FtcGxlCisgICAgaW50NjRfdCBsYXN0VGltZXN0YW1wVXMgPSAwOyAgICAgIC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wCisgICAgaW50NjRfdCBsYXN0Q3R0c1RpbWVVcyA9IDA7ICAgICAgIC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wCisgICAgaW50NjRfdCBsYXN0RHVyYXRpb25VcyA9IDA7ICAgICAgIC8vIEJldHdlZW4gdGhlIHByZXZpb3VzIHR3byBzYW1wbGVzCisgICAgaW50NjRfdCBjdXJyRHVyYXRpb25UaWNrcyA9IDA7ICAgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcworICAgIGludDY0X3QgbGFzdER1cmF0aW9uVGlja3MgPSAwOyAgICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKKyAgICBpbnQzMl90IHNhbXBsZUNvdW50ID0gMTsgICAgICAgICAgLy8gU2FtcGxlIGNvdW50IGluIHRoZSBjdXJyZW50IHN0dHMgdGFibGUgZW50cnkKKyAgICBpbnQ2NF90IGN1cnJDdHRzRHVyVGlja3MgPSAwOyAgICAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCisgICAgaW50NjRfdCBsYXN0Q3R0c0R1clRpY2tzID0gMDsgICAgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcworICAgIGludDMyX3QgY3R0c1NhbXBsZUNvdW50ID0gMTsgICAgICAvLyBTYW1wbGUgY291bnQgaW4gdGhlIGN1cnJlbnQgY3R0cyB0YWJsZSBlbnRyeQorICAgIHVpbnQzMl90IHByZXZpb3VzU2FtcGxlU2l6ZSA9IDA7ICAgICAgLy8gU2l6ZSBvZiB0aGUgcHJldmlvdXMgc2FtcGxlCiAgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOwotICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgaW50NjRfdCB0aW1lc3RhbXBVcyA9IDA7CisgICAgaW50NjRfdCBjdHRzRGVsdGFUaW1lVXMgPSAwOworICAgIGJvb2wgaGFzQkZyYW1lcyA9IGZhbHNlOwogCisjaWYgMQorICAgIC8vIFhYWDogU2Ftc3VuZydzIHZpZGVvIGVuY29kZXIncyBvdXRwdXQgYnVmZmVyIHRpbWVzdGFtcAorICAgIC8vIGlzIG5vdCBjb3JyZWN0LiBzZWUgYnVnIDQ3MjQzMzkKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicncubWVkaWEucmVjb3JkLmhhc2IiLCB2YWx1ZSwgTlVMTCkgJiYKKyAgICAgICAgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAiMSIpKSkgeworICAgICAgICBoYXNCRnJhbWVzID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYKICAgICBpZiAobUlzQXVkaW8pIHsKICAgICAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJBdWRpb1RyYWNrRW5jb2RpbmciLCAwLCAwLCAwKTsKICAgICB9IGVsc2UgewogICAgICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIlZpZGVvVHJhY2tFbmNvZGluZyIsIDAsIDAsIDApOwogICAgIH0KLSAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSgwLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhX2RhdGE7CiAKQEAgLTIwNjAsNyArMjEwNyw2IEBACiAgICAgICAgICAqCiAgICAgICAgICAqLwogICAgICAgICBDSEVDSyhtZXRhX2RhdGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7Ci0gICAgICAgIExPR1YoIiVzIHRpbWVzdGFtcFVzOiAlbGxkIiwgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIHRpbWVzdGFtcFVzKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgaWYgKG1OdW1TYW1wbGVzID09IDApIHsKQEAgLTIwODEsNiArMjEyNywyNCBAQAogCiAgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKICAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPj0gMCk7CisgICAgICAgIGlmICghbUlzQXVkaW8gJiYgaGFzQkZyYW1lcykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbXBvc2l0aW9uIHRpbWU6IHRpbWVzdGFtcFVzCisgICAgICAgICAgICAgKiBEZWNvZGluZyB0aW1lOiBkZWNvZGluZ1RpbWVVcworICAgICAgICAgICAgICogQ29tcG9zaXRpb24gdGltZSBkZWx0YSA9IGNvbXBvc2l0aW9uIHRpbWUgLSBkZWNvZGluZyB0aW1lCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogV2Ugc2F2ZSBwaWN0dXJlIGRlY29kaW5nIHRpbWUgc3RhbXAgZGVsdGEgaW4gc3R0cyB0YWJsZSBlbnRyaWVzLAorICAgICAgICAgICAgICogYW5kIGNvbXBvc2l0aW9uIHRpbWUgZGVsdGEgZHVyYXRpb24gaW4gY3R0cyB0YWJsZSBlbnRyaWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgQ0hFQ0sobWV0YV9kYXRhLT5maW5kSW50NjQoa0tleURlY29kaW5nVGltZSwgJmRlY29kaW5nVGltZVVzKSk7CisgICAgICAgICAgICBkZWNvZGluZ1RpbWVVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGRlY29kaW5nVGltZVVzOworICAgICAgICAgICAgY3R0c0RlbHRhVGltZVVzID0gdGltZXN0YW1wVXMgLSBkZWNvZGluZ1RpbWVVczsKKyAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gZGVjb2RpbmdUaW1lVXM7CisgICAgICAgICAgICBMT0dWKCJkZWNvZGluZyB0aW1lOiAlbGxkIGFuZCBjdHRzIGRlbHRhIHRpbWU6ICVsbGQiLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBjdHRzRGVsdGFUaW1lVXMpOworICAgICAgICB9CiAKICAgICAgICAgLy8gTWVkaWEgdGltZSBhZGp1c3RtZW50IGZvciByZWFsLXRpbWUgYXBwbGljYXRpb25zCiAgICAgICAgIGlmIChtSXNSZWFsVGltZVJlY29yZGluZykgewpAQCAtMjEzMSwxMSArMjE5NSwyMyBAQAogICAgICAgICAgICAgaWYgKG1OdW1TYW1wbGVzID09IDMgfHwgY3VyckR1cmF0aW9uVGlja3MgIT0gbGFzdER1cmF0aW9uVGlja3MpIHsKICAgICAgICAgICAgICAgICBMT0dWKCIlcyBsYXN0RHVyYXRpb25VczogJWxsZCB1cywgY3VyckR1cmF0aW9uVGlja3M6ICVsbGQgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8/ICJBdWRpbyI6ICJWaWRlbyIsIGxhc3REdXJhdGlvblVzLCBjdXJyRHVyYXRpb25UaWNrcyk7Ci0gICAgICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVGlja3MpOwogICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gMTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICAgICAgICAgIGN1cnJDdHRzRHVyVGlja3MgPQorICAgICAgICAgICAgICAgICAgICAgKChjdHRzRGVsdGFUaW1lVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KKyAgICAgICAgICAgICAgICAgICAgIChsYXN0Q3R0c1RpbWVVcyAqIG1UaW1lU2NhbGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEwpOworICAgICAgICAgICAgICAgIGlmIChjdXJyQ3R0c0R1clRpY2tzICE9IGxhc3RDdHRzRHVyVGlja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkT25lQ3R0c1RhYmxlRW50cnkoY3R0c1NhbXBsZUNvdW50LCBsYXN0Q3R0c0R1clRpY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgY3R0c1NhbXBsZUNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7CiAgICAgICAgICAgICBpZiAobU51bVNhbXBsZXMgPj0gMiAmJiBwcmV2aW91c1NhbXBsZVNpemUgIT0gc2FtcGxlU2l6ZSkgewpAQCAtMjE0OSw2ICsyMjI1LDExIEBACiAgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CiAgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwogCisgICAgICAgIGlmICghbUlzQXVkaW8pIHsKKyAgICAgICAgICAgIGxhc3RDdHRzRHVyVGlja3MgPSBjdXJyQ3R0c0R1clRpY2tzOworICAgICAgICAgICAgbGFzdEN0dHNUaW1lVXMgPSBjdHRzRGVsdGFUaW1lVXM7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoaXNTeW5jICE9IDApIHsKICAgICAgICAgICAgIGFkZE9uZVN0c3NUYWJsZUVudHJ5KG1OdW1TYW1wbGVzKTsKICAgICAgICAgfQpAQCAtMjIxNywxOSArMjI5OCwyMyBAQAogICAgIC8vIGZyYW1lJ3MgZHVyYXRpb24uCiAgICAgaWYgKG1OdW1TYW1wbGVzID09IDEpIHsKICAgICAgICAgbGFzdER1cmF0aW9uVXMgPSAwOyAgLy8gQSBzaW5nbGUgc2FtcGxlJ3MgZHVyYXRpb24KKyAgICAgICAgbGFzdER1cmF0aW9uVGlja3MgPSAwOworICAgICAgICBsYXN0Q3R0c0R1clRpY2tzID0gMDsKICAgICB9IGVsc2UgewogICAgICAgICArK3NhbXBsZUNvdW50OyAgLy8gQ291bnQgZm9yIHRoZSBsYXN0IHNhbXBsZQorICAgICAgICArK2N0dHNTYW1wbGVDb3VudDsKICAgICB9CiAKICAgICBpZiAobU51bVNhbXBsZXMgPD0gMikgewotICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeSgxLCBsYXN0RHVyYXRpb25Vcyk7CisgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KDEsIGxhc3REdXJhdGlvblRpY2tzKTsKICAgICAgICAgaWYgKHNhbXBsZUNvdW50IC0gMSA+IDApIHsKLSAgICAgICAgICAgIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNhbXBsZUNvdW50IC0gMSwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQgLSAxLCBsYXN0RHVyYXRpb25UaWNrcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVXMpOworICAgICAgICBhZGRPbmVTdHRzVGFibGVFbnRyeShzYW1wbGVDb3VudCwgbGFzdER1cmF0aW9uVGlja3MpOwogICAgIH0KIAorICAgIGFkZE9uZUN0dHNUYWJsZUVudHJ5KGN0dHNTYW1wbGVDb3VudCwgbGFzdEN0dHNEdXJUaWNrcyk7CiAgICAgbVRyYWNrRHVyYXRpb25VcyArPSBsYXN0RHVyYXRpb25VczsKICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CiAKQEAgLTI0MjgsNiArMjUxMyw3IEBACiAgICAgfQogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCiAgICAgd3JpdGVTdHRzQm94KCk7CisgICAgd3JpdGVDdHRzQm94KCk7CiAgICAgaWYgKCFtSXNBdWRpbykgewogICAgICAgICB3cml0ZVN0c3NCb3goKTsKICAgICB9CkBAIC0yNzcyLDIzICsyODU4LDU1IEBACiAgICAgICAgIENIRUNLKG1TdGFydFRpbWVzdGFtcFVzID4gbW9vdlN0YXJ0VGltZVVzKTsKICAgICAgICAgdHJhY2tTdGFydFRpbWVPZmZzZXRVcyA9IG1TdGFydFRpbWVzdGFtcFVzIC0gbW9vdlN0YXJ0VGltZVVzOwogICAgIH0KLSAgICBpbnQ2NF90IHByZXZUaW1lc3RhbXBVcyA9IHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXM7Ci0gICAgZm9yIChMaXN0PFN0dHNUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3R0c1RhYmxlRW50cmllcy5iZWdpbigpOwotICAgICAgICBpdCAhPSBtU3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgIExpc3Q8U3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1TdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgQ0hFQ0soaXQgIT0gbVN0dHNUYWJsZUVudHJpZXMuZW5kKCkgJiYgaXQtPnNhbXBsZUNvdW50ID09IDEpOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlQ291bnQpOworICAgIGludDMyX3QgZHVyID0gKHRyYWNrU3RhcnRUaW1lT2Zmc2V0VXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOworICAgIG1Pd25lci0+d3JpdGVJbnQzMihkdXIgKyBpdC0+c2FtcGxlRHVyYXRpb24pOworCisgICAgaW50NjRfdCB0b3RhbENvdW50ID0gMTsKKyAgICB3aGlsZSAoKytpdCAhPSBtU3R0c1RhYmxlRW50cmllcy5lbmQoKSkgewogICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKLQotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgY2FsY3VsYXRpbmcgdGhlIHNhbXBsZSBkdXJhdGlvbiB0aGUgZXhhY3RseQotICAgICAgICAvLyBzYW1lIHdheSBhcyB3ZSBtYWRlIGRlY2lzaW9uIG9uIGhvdyB0byBjcmVhdGUgc3R0cyBlbnRyaWVzLgotICAgICAgICBpbnQ2NF90IGN1cnJUaW1lc3RhbXBVcyA9IHByZXZUaW1lc3RhbXBVcyArIGl0LT5zYW1wbGVEdXJhdGlvblVzOwotICAgICAgICBpbnQzMl90IGR1ciA9ICgoY3VyclRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCi0gICAgICAgICAgICAocHJldlRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7Ci0gICAgICAgIHByZXZUaW1lc3RhbXBVcyArPSAoaXQtPnNhbXBsZUNvdW50ICogaXQtPnNhbXBsZUR1cmF0aW9uVXMpOwotCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihkdXIpOworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUR1cmF0aW9uKTsKKyAgICAgICAgdG90YWxDb3VudCArPSBpdC0+c2FtcGxlQ291bnQ7CiAgICAgfQorICAgIENIRUNLKHRvdGFsQ291bnQgPT0gbU51bVNhbXBsZXMpOwogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHRzCiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZUN0dHNCb3goKSB7CisgICAgaWYgKG1Jc0F1ZGlvKSB7ICAvLyBjdHRzIGlzIG5vdCBmb3IgYXVkaW8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIERvIG5vdCB3cml0ZSBjdHRzIGJveCB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8gaGF2ZSBpdC4KKyAgICBpZiAoKG1OdW1DdHRzVGFibGVFbnRyaWVzID09IDEgJiYKKyAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMuYmVnaW4oKS0+c2FtcGxlRHVyYXRpb24gPT0gMCkgfHwKKyAgICAgICAgbU51bUN0dHNUYWJsZUVudHJpZXMgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HVigiY3R0cyBib3ggaGFzICVkIGVudHJpZXMiLCBtTnVtQ3R0c1RhYmxlRW50cmllcyk7CisKKyAgICBtT3duZXItPmJlZ2luQm94KCJjdHRzIik7CisgICAgaWYgKG1IYXNOZWdhdGl2ZUN0dHNEZWx0YUR1cmF0aW9uKSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDAwMDEwMDAwKTsgIC8vIHZlcnNpb249MSwgZmxhZ3M9MAorICAgIH0gZWxzZSB7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgIH0KKyAgICBtT3duZXItPndyaXRlSW50MzIobU51bUN0dHNUYWJsZUVudHJpZXMpOworCisgICAgaW50NjRfdCB0b3RhbENvdW50ID0gMDsKKyAgICBmb3IgKExpc3Q8Q3R0c1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1DdHRzVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtQ3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZUNvdW50KTsKKyAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVEdXJhdGlvbik7CisgICAgICAgIHRvdGFsQ291bnQgKz0gaXQtPnNhbXBsZUNvdW50OworICAgIH0KKyAgICBDSEVDSyh0b3RhbENvdW50ID09IG1OdW1TYW1wbGVzKTsKKyAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gY3R0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVTdHNzQm94KCkgewogICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c3MiKTsKICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKQEAgLTI4NjIsOCArMjk4MCw4IEBACiAgICAgICogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgYW55IHVzZXIgZGF0YSBzdGFydAogICAgICAqIHdpdGggIlwweEE5IiwgbXVzdCBiZSBmb2xsb3dlZCBieSBpdHMgYXNzb2ljYXRlZAogICAgICAqIGxhbmd1YWdlIGNvZGUuCi0gICAgICogMHgwMDEyOiBsb2NhbGUgZW4KLSAgICAgKiAweDE1Yzc6IGxhbmd1YWdlIDU1NzUKKyAgICAgKiAweDAwMTI6IHRleHQgc3RyaW5nIGxlbmd0aAorICAgICAqIDB4MTVjNzogbGFuZyAobG9jYWxlKSBjb2RlOiBlbgogICAgICAqLwogICAgIHdyaXRlSW50MzIoMHgwMDEyMTVjNyk7CiAgICAgd3JpdGVMYXRpdHVkZShtTGF0aXR1ZGV4MTAwMDApOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggODFmMmU0Ny4uNzdhNjYwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjAxLDYgKzIwMiwyMiBAQAogICAgIG1DYWNoZSA9IE5VTEw7CiB9CiAKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKSB7CisgICAgaWYgKG1Tb3VyY2UtPmZsYWdzKCkgJiBrSXNIVFRQQmFzZWRTb3VyY2UpIHsKKyAgICAgICAgSFRUUEJhc2UqIHNvdXJjZSA9IHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1Tb3VyY2UuZ2V0KCkpOworICAgICAgICByZXR1cm4gc291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKGticHMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6c2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBIVFRQQmFzZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBzb3VyY2UtPnNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShmcmVxTXMpOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIHN0YXR1c190IE51Q2FjaGVkU291cmNlMjo6aW5pdENoZWNrKCkgY29uc3QgewogICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKIH0KQEAgLTIxMCw3ICsyMjcsOSBAQAogfQogCiB1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgewotICAgIHJldHVybiAobVNvdXJjZS0+ZmxhZ3MoKSAmIH5rV2FudHNQcmVmZXRjaGluZykgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZTsKKyAgICAvLyBSZW1vdmUgSFRUUCByZWxhdGVkIGZsYWdzIHNpbmNlIE51Q2FjaGVkU291cmNlMiBpcyBub3QgSFRUUC1iYXNlZC4KKyAgICB1aW50MzJfdCBmbGFncyA9IG1Tb3VyY2UtPmZsYWdzKCkgJiB+KGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlKTsKKyAgICByZXR1cm4gKGZsYWdzIHwga0lzQ2FjaGluZ0RhdGFTb3VyY2UpOwogfQogCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051SFRUUERhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKaW5kZXggODIxYmE5Yi4uZGFjMmVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTk3LDkgKzk3LDYgQEAKICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQoZmFsc2UpLAogICAgICAgbUhhc0NodW5rZWRUcmFuc2ZlckVuY29kaW5nKGZhbHNlKSwKICAgICAgIG1DaHVua0RhdGFCeXRlc0xlZnQoMCksCi0gICAgICBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAotICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCi0gICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7CiB9CkBAIC00MzEsNyArNDI4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLSAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChuLCBkZWxheVVzKTsKKyAgICAgICAgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQobiwgZGVsYXlVcyk7CiAKICAgICAgICAgbnVtQnl0ZXNSZWFkICs9IChzaXplX3QpbjsKIApAQCAtNDY3LDcgKzQ2NCw3IEBACiB9CiAKIHVpbnQzMl90IE51SFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZzsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNTE3LDM2ICs1MTQsNiBAQAogICAgIH0KIH0KIAotYm9vbCBOdUhUVFBEYXRhU291cmNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbCgKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7Ci0gICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKLSAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOwotCi0gICAgbUJhbmR3aWR0aEhpc3RvcnkucHVzaF9iYWNrKGVudHJ5KTsKLSAgICBpZiAoKyttTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID4gMTAwKSB7Ci0gICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOwotICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7Ci0gICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOwotICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgfQotfQotCiBzcDxEZWNyeXB0SGFuZGxlPiBOdUhUVFBEYXRhU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbigpIHsKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewogICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IG5ldyBEcm1NYW5hZ2VyQ2xpZW50KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKaW5kZXggNjMzOTcxMC4uYzRmY2M3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcApAQCAtNjEsOCArNjEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KIHN0cnVjdCBDb2RlY0luZm8gewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgY29uc3QgY2hhciAqY29kZWM7CkBAIC0yMDAsNiArMTk4LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlRJLlZpZGVvLkRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguU0VDLkFWQy5EZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguZ29vZ2xlLmF2Yy5kZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiQVZDRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgIk9NWC5nb29nbGUudm9yYmlzLmRlY29kZXIiIH0sCkBAIC0xMzg4LDggKzEzODcsNiBAQAogICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAgICAgICAgIENIRUNLX0VRKChpbnQpZm9ybWF0LmVDb21wcmVzc2lvbkZvcm1hdCwgKGludClPTVhfVklERU9fQ29kaW5nVW51c2VkKTsKIAotICAgICAgICBzdGF0aWMgY29uc3QgaW50IE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIgPSAweDdGQTMwQzAwOwotCiAgICAgICAgIENIRUNLKGZvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcgogICAgICAgICAgICAgICAgfHwgZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZCkBAIC0xNjQ2LDE3ICsxNjQzLDcgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwotICAgIEluaXRPTVhQYXJhbXMoJmRlZik7Ci0gICAgZGVmLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQorICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGlmIChtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpIHsKICAgICAgICAgZXJyID0gbU9NWC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhtTm9kZSwga1BvcnRJbmRleElucHV0LCBPTVhfVFJVRSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE2NjUsNiArMTY1MiwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICBkZWYublBvcnRJbmRleCA9IHBvcnRJbmRleDsKKworICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgQ09ERUNfTE9HSSgiYWxsb2NhdGluZyAlbHUgYnVmZmVycyBvZiBzaXplICVsdSBvbiAlcyBwb3J0IiwKICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGRlZi5uQnVmZmVyU2l6ZSwKICAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOwpAQCAtMTk4Myw2ICsxOTgxLDIwIEBACiAgICAgcmV0dXJuIGJ1ZkluZm87CiB9CiAKK2ludDY0X3QgT01YQ29kZWM6OnJldHJpZXZlRGVjb2RpbmdUaW1lVXMoYm9vbCBpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICBDSEVDSyhtSXNFbmNvZGVyKTsKKyAgICBDSEVDSyghbURlY29kaW5nVGltZUxpc3QuZW1wdHkoKSk7CisgICAgTGlzdDxpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBtRGVjb2RpbmdUaW1lTGlzdC5iZWdpbigpOworICAgIGludDY0X3QgdGltZVVzID0gKml0OworCisgICAgLy8gSWYgdGhlIG91dHB1dCBidWZmZXIgaXMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiwKKyAgICAvLyBkbyBub3QgcmVtb3ZlIHRoZSBkZWNvZGluZyB0aW1lIGZyb20gdGhlIGxpc3QuCisgICAgaWYgKCFpc0NvZGVjU3BlY2lmaWMpIHsKKyAgICAgICAgbURlY29kaW5nVGltZUxpc3QuZXJhc2UoaXQpOworICAgIH0KKyAgICByZXR1cm4gdGltZVVzOworfQorCiB2b2lkIE9NWENvZGVjOjpvbl9tZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKICAgICBpZiAobVN0YXRlID09IEVSUk9SKSB7CiAgICAgICAgIExPR1coIkRyb3BwaW5nIE9NWCBtZXNzYWdlIC0gd2UncmUgaW4gRVJST1Igc3RhdGUuIik7CkBAIC0yMTMwLDE0ICsyMTQyLDIxIEBACiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgaXNDb2RlY1NwZWNpZmljID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpc0NvZGVjU3BlY2lmaWMgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc0dyYXBoaWNCdWZmZXIgfHwgbVF1aXJrcyAmIGtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZSkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNVbnJlYWRhYmxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlY29kaW5nVGltZVVzID0gcmV0cmlldmVEZWNvZGluZ1RpbWVVcyhpc0NvZGVjU3BlY2lmaWMpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5RGVjb2RpbmdUaW1lLCBkZWNvZGluZ1RpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0UG9pbnRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5wbGF0Zm9ybV9wcml2YXRlKTsKQEAgLTI5NDAsNiArMjk1OSw5IEBACiAgICAgICAgIGludDY0X3QgbGFzdEJ1ZmZlclRpbWVVczsKICAgICAgICAgQ0hFQ0soc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbGFzdEJ1ZmZlclRpbWVVcykpOwogICAgICAgICBDSEVDSyhsYXN0QnVmZmVyVGltZVVzID49IDApOworICAgICAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICAgICAgbURlY29kaW5nVGltZUxpc3QucHVzaF9iYWNrKGxhc3RCdWZmZXJUaW1lVXMpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGxhc3RCdWZmZXJUaW1lVXM7CkBAIC00MjU2LDkgKzQyNzgsMTEgQEAKICAgICAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC4iLCA0KSkgewogICAgICAgICAgICAgLy8gTm90IGFuIE9wZW5NYXggY29tcG9uZW50IGJ1dCBhIHNvZnR3YXJlIGNvZGVjLgogCisjaWYgSEFWRV9TT0ZUV0FSRV9ERUNPREVSUwogICAgICAgICAgICAgcmVzdWx0cy0+cHVzaCgpOwogICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgKmNhcHMgPSAmcmVzdWx0cy0+ZWRpdEl0ZW1BdChyZXN1bHRzLT5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIGNhcHMtPm1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyNlbmRpZgogCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKaW5kZXggNWE0NTNlOS4uMTAwZDhhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCkBAIC0zMCw3ICszMCw2IEBACiAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgogCkBAIC0yMTAsOCArMjA5LDcgQEAKICAgICB2bS0+QXR0YWNoQ3VycmVudFRocmVhZCgmZW52LCBOVUxMKTsKICNlbmRpZgogCi0gICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBBTkRST0lEX1BSSU9SSVRZX0ZPUkVHUk9VTkQpOwotICAgIHNldF9zY2hlZF9wb2xpY3koYW5kcm9pZEdldFRpZCgpLCBTUF9GT1JFR1JPVU5EKTsKKyAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKIAogICAgIHN0YXRpY19jYXN0PFRpbWVkRXZlbnRRdWV1ZSAqPihtZSktPnRocmVhZEVudHJ5KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuY3BwCmluZGV4IDEwOTY3MTcuLjU4OGE3NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9DaHJvbWl1bUhUVFBEYXRhU291cmNlLmNwcApAQCAtMzQsOSArMzQsNiBAQAogICAgICAgbUN1cnJlbnRPZmZzZXQoMCksCiAgICAgICBtSU9SZXN1bHQoT0spLAogICAgICAgbUNvbnRlbnRTaXplKC0xKSwKLSAgICAgIG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMoMCksCi0gICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKLSAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpIHsKICAgICBtRGVsZWdhdGUtPnNldE93bmVyKHRoaXMpOwpAQCAtMTg4LDcgKzE4NSw3IEBACiAKICAgICAgICAgLy8gVGhlIHJlYWQgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBtSU9SZXN1bHQgY29udGFpbnMKICAgICAgICAgLy8gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLgotICAgICAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudF9sKG1JT1Jlc3VsdCwgZGVsYXlVcyk7CisgICAgICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG1JT1Jlc3VsdCwgZGVsYXlVcyk7CiAKICAgICAgICAgbUN1cnJlbnRPZmZzZXQgKz0gbUlPUmVzdWx0OwogICAgICAgICByZXR1cm4gbUlPUmVzdWx0OwpAQCAtMjIxLDcgKzIxOCw3IEBACiB9CiAKIHVpbnQzMl90IENocm9taXVtSFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZzsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMjQ2LDM2ICsyNDMsNiBAQAogICAgIGNsZWFyRFJNU3RhdGVfbCgpOwogfQogCi12b2lkIENocm9taXVtSFRUUERhdGFTb3VyY2U6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50X2woCi0gICAgICAgIHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgQmFuZHdpZHRoRW50cnkgZW50cnk7Ci0gICAgZW50cnkubURlbGF5VXMgPSBkZWxheVVzOwotICAgIGVudHJ5Lm1OdW1CeXRlcyA9IG51bUJ5dGVzOwotICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzICs9IGRlbGF5VXM7Ci0gICAgbVRvdGFsVHJhbnNmZXJCeXRlcyArPSBudW1CeXRlczsKLQotICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgaWYgKCsrbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA+IDEwMCkgewotICAgICAgICBCYW5kd2lkdGhFbnRyeSAqZW50cnkgPSAmKm1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7Ci0gICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC09IGVudHJ5LT5tRGVsYXlVczsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJCeXRlcyAtPSBlbnRyeS0+bU51bUJ5dGVzOwotICAgICAgICBtQmFuZHdpZHRoSGlzdG9yeS5lcmFzZShtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpKTsKLSAgICAgICAgLS1tTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotICAgIH0KLX0KLQotYm9vbCBDaHJvbWl1bUhUVFBEYXRhU291cmNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKmJhbmR3aWR0aF9icHMgPSAoKGRvdWJsZSltVG90YWxUcmFuc2ZlckJ5dGVzICogOEU2IC8gbVRvdGFsVHJhbnNmZXJUaW1lVXMpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIHNwPERlY3J5cHRIYW5kbGU+IENocm9taXVtSFRUUERhdGFTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuY3BwCmluZGV4IDgwNWJkNDguLmVkNjg0NmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2Nocm9taXVtX2h0dHAvc3VwcG9ydC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmNwcApAQCAtNDAsNyArNDAsNyBAQAogCiBzdGF0aWMgTXV0ZXggZ05ldHdvcmtUaHJlYWRMb2NrOwogc3RhdGljIGJhc2U6OlRocmVhZCAqZ05ldHdvcmtUaHJlYWQgPSBOVUxMOwotc3RhdGljIHNjb3BlZF9yZWZwdHI8VVJMUmVxdWVzdENvbnRleHQ+IGdSZXFDb250ZXh0Oworc3RhdGljIHNjb3BlZF9yZWZwdHI8bmV0OjpVUkxSZXF1ZXN0Q29udGV4dD4gZ1JlcUNvbnRleHQ7CiAKIHN0YXRpYyB2b2lkIEluaXRpYWxpemVOZXR3b3JrVGhyZWFkSWZOZWNlc3NhcnkoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdOZXR3b3JrVGhyZWFkTG9jayk7CkBAIC0yMTQsNyArMjE0LDcgQEAKIH0KIAogdm9pZCBTZkRlbGVnYXRlOjpPblJlc3BvbnNlU3RhcnRlZChuZXQ6OlVSTFJlcXVlc3QgKnJlcXVlc3QpIHsKLSAgICBpZiAocmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkgIT0gVVJMUmVxdWVzdFN0YXR1czo6U1VDQ0VTUykgeworICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBuZXQ6OlVSTFJlcXVlc3RTdGF0dXM6OlNVQ0NFU1MpIHsKICAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCBhbmQgb3NfZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSwKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTVlfTE9HVigicmVhZE1vcmUgcGVuZGluZyByZWFkIik7CiAKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0LT5zdGF0dXMoKS5zdGF0dXMoKSAhPSBVUkxSZXF1ZXN0U3RhdHVzOjpJT19QRU5ESU5HKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkgIT0gbmV0OjpVUkxSZXF1ZXN0U3RhdHVzOjpJT19QRU5ESU5HKSB7CiAgICAgICAgICAgICAgICAgTVlfTE9HSShTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpcmVjdCByZWFkIGZhaWxlZCB3LyBzdGF0dXMgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+c3RhdHVzKCkuc3RhdHVzKCkpLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY2hyb21pdW1faHR0cC9zdXBwb3J0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaAppbmRleCA0ZDAzNDkzLi44ZmU4ZGIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jaHJvbWl1bV9odHRwL3N1cHBvcnQuaApAQCAtNTAsNyArNTAsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNmTmV0TG9nKTsKIH07CiAKLXN0cnVjdCBTZlJlcXVlc3RDb250ZXh0IDogcHVibGljIFVSTFJlcXVlc3RDb250ZXh0IHsKK3N0cnVjdCBTZlJlcXVlc3RDb250ZXh0IDogcHVibGljIG5ldDo6VVJMUmVxdWVzdENvbnRleHQgewogICAgIFNmUmVxdWVzdENvbnRleHQoKTsKIAogICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgJkdldFVzZXJBZ2VudChjb25zdCBHVVJMICZ1cmwpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjNjODc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMjcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCS4vc291cmNlL2gyNjRic2RfdHJhbnNmb3JtLmMgXAorCS4vc291cmNlL2gyNjRic2RfdXRpbC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2J5dGVfc3RyZWFtLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2VxX3BhcmFtX3NldC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3BpY19wYXJhbV9zZXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zbGljZV9oZWFkZXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zbGljZV9kYXRhLmMgXAorCS4vc291cmNlL2gyNjRic2RfbWFjcm9ibG9ja19sYXllci5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3N0cmVhbS5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX3ZsYy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2NhdmxjLmMgXAorCS4vc291cmNlL2gyNjRic2RfbmFsX3VuaXQuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9uZWlnaGJvdXIuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9zdG9yYWdlLmMgXAorCS4vc291cmNlL2gyNjRic2Rfc2xpY2VfZ3JvdXBfbWFwLmMgXAorCS4vc291cmNlL2gyNjRic2RfaW50cmFfcHJlZGljdGlvbi5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ludGVyX3ByZWRpY3Rpb24uYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9yZWNvbnN0cnVjdC5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2RwYi5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2ltYWdlLmMgXAorCS4vc291cmNlL2gyNjRic2RfZGVibG9ja2luZy5jIFwKKwkuL3NvdXJjZS9oMjY0YnNkX2NvbmNlYWwuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF92dWkuYyBcCisJLi9zb3VyY2UvaDI2NGJzZF9waWNfb3JkZXJfY250LmMgXAorCS4vc291cmNlL2gyNjRic2RfZGVjb2Rlci5jIFwKKwkuL3NvdXJjZS9IMjY0U3dEZWNBcGkuYyBcCisJU29mdEFWQy5jcHAgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi9pbmMgXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4IFwKKworTVlfQVNNIDo9IFwKKwkuL3NvdXJjZS9hcm1fbmVvbl9hc21fZ2NjL2gyNjRic2RXcml0ZU1hY3JvYmxvY2suUyBcCisJLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYy9oMjY0YnNkQ2xlYXJNYkxheWVyLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZpbGxSb3c3LlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZENvdW50TGVhZGluZ1plcm9zLlMgXAorCS4vc291cmNlL2FybV9uZW9uX2FzbV9nY2MvaDI2NGJzZEZsdXNoQml0cy5TCisKKworTVlfT01YRExfQ19TUkMgOj0gXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYyBcCisJLi9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBcCisJLi9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCisKK01ZX09NWERMX0FTTV9TUkMgOj0gXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TIFwKKwkuL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLlMgXAorCS4vb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MuUyBcCisJLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TIFwKKworCitpZmVxICgkKEFSQ0hfQVJNX0hBVkVfTkVPTiksdHJ1ZSkKKyAgICBMT0NBTF9BUk1fTkVPTiAgIDo9IHRydWUKKyMgICAgTE9DQUxfQ0ZMQUdTICAgICA6PSAtc3RkPWM5OSAtRC5fTkVPTiAtRC5fT01YREwKKyAgICBMT0NBTF9DRkxBR1MgICAgIDo9IC1ESDI2NERFQ19ORU9OIC1ESDI2NERFQ19PTVhETAorICAgIExPQ0FMX1NSQ19GSUxFUyAgKz0gJChNWV9BU00pICQoTVlfT01YRExfQ19TUkMpICQoTVlfT01YRExfQVNNX1NSQykKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi9zb3VyY2UvYXJtX25lb25fYXNtX2djYworICAgIExPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS8uL29teGRsL2FybV9uZW9uL2FwaSBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKExPQ0FMX1BBVEgpLy4vb214ZGwvYXJtX25lb24vdmMvYXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoTE9DQUxfUEFUSCkvLi9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkKK2VuZGlmCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0IGxpYnN0YWdlZnJpZ2h0X29teCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYnV0aWxzIFwKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X3NvZnRfaDI2NGRlYworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IHV0aWxpdHk6IGRlY29kZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjIFRlc3QgYXBwbGljYXRpb24KKyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IC4vc291cmNlL0RlY1Rlc3RCZW5jaC5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzdGFnZWZyaWdodF9zb2Z0X2gyNjRkZWMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gZGVidWcKKworTE9DQUxfTU9EVUxFIDo9IGRlY29kZXIKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBkMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL1NvZnRBVkMuY3BwCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTb2Z0QVZDIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU29mdEFWQy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyB2b2lkIEluaXRPTVhQYXJhbXMoVCAqcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uU2l6ZSA9IHNpemVvZihUKTsKKyAgICBwYXJhbXMtPm5WZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcGFyYW1zLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uUmV2aXNpb24gPSAwOworICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7Cit9CisKK1NvZnRBVkM6OlNvZnRBVkMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkKKyAgICA6IFNpbXBsZVNvZnRPTVhDb21wb25lbnQobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAorICAgICAgbUhhbmRsZShOVUxMKSwKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAorICAgICAgbVdpZHRoKDMyMCksCisgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICBtUGljdHVyZVNpemUobVdpZHRoICogbUhlaWdodCAqIDMgLyAyKSwKKyAgICAgIG1Dcm9wTGVmdCgwKSwKKyAgICAgIG1Dcm9wVG9wKDApLAorICAgICAgbUNyb3BXaWR0aChtV2lkdGgpLAorICAgICAgbUNyb3BIZWlnaHQobUhlaWdodCksCisgICAgICBtRmlyc3RQaWN0dXJlKE5VTEwpLAorICAgICAgbUZpcnN0UGljdHVyZUlkKC0xKSwKKyAgICAgIG1QaWNJZCgwKSwKKyAgICAgIG1IZWFkZXJzRGVjb2RlZChmYWxzZSksCisgICAgICBtRU9TU3RhdHVzKElOUFVUX0RBVEFfQVZBSUxBQkxFKSwKKyAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UoTk9ORSkgeworICAgIGluaXRQb3J0cygpOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7Cit9CisKK1NvZnRBVkM6On5Tb2Z0QVZDKCkgeworICAgIEgyNjRTd0RlY1JlbGVhc2UobUhhbmRsZSk7CisgICAgbUhhbmRsZSA9IE5VTEw7CisKKyAgICB3aGlsZSAobVBpY1RvSGVhZGVyTWFwLnNpemUoKSAhPSAwKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtUGljVG9IZWFkZXJNYXAuZWRpdFZhbHVlQXQoMCk7CisgICAgICAgIG1QaWNUb0hlYWRlck1hcC5yZW1vdmVJdGVtc0F0KDApOworICAgICAgICBkZWxldGUgaGVhZGVyOworICAgICAgICBoZWFkZXIgPSBOVUxMOworICAgIH0KKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZShrSW5wdXRQb3J0SW5kZXgpOworICAgIENIRUNLKG91dFF1ZXVlLmVtcHR5KCkpOworICAgIENIRUNLKGluUXVldWUuZW1wdHkoKSk7CisKKyAgICBkZWxldGVbXSBtRmlyc3RQaWN0dXJlOworfQorCit2b2lkIFNvZnRBVkM6OmluaXRQb3J0cygpIHsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSBrSW5wdXRQb3J0SW5kZXg7CisgICAgZGVmLmVEaXIgPSBPTVhfRGlySW5wdXQ7CisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1JbnB1dEJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLm5CdWZmZXJTaXplID0gODE5MjsKKyAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKKyAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDE7CisKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPihNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIGRlZi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSA9IDA7CisgICAgZGVmLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgYWRkUG9ydChkZWYpOworCisgICAgZGVmLm5Qb3J0SW5kZXggPSBrT3V0cHV0UG9ydEluZGV4OworICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bU91dHB1dEJ1ZmZlcnM7CisgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CisgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworCisgICAgZGVmLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOworICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gMDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAwOworICAgIGRlZi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGRlZi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgZGVmLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIGRlZi5uQnVmZmVyU2l6ZSA9CisgICAgICAgIChkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICogZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKiAzKSAvIDI7CisKKyAgICBhZGRQb3J0KGRlZik7Cit9CisKK3N0YXR1c190IFNvZnRBVkM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChIMjY0U3dEZWNJbml0KCZtSGFuZGxlLCAxKSA9PSBIMjY0U1dERUNfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbEdldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqZm9ybWF0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uUG9ydEluZGV4ID4ga091dHB1dFBvcnRJbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXRQYXJhbXMtPm5JbmRleCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdBVkM7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+eEZyYW1lcmF0ZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIRUNLKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA9PSBrT3V0cHV0UG9ydEluZGV4KTsKKworICAgICAgICAgICAgICAgIGZvcm1hdFBhcmFtcy0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBmb3JtYXRQYXJhbXMtPmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgZm9ybWF0UGFyYW1zLT54RnJhbWVyYXRlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldFBhcmFtZXRlcigKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIHsKKyAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcm9sZVBhcmFtcyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKHN0cm5jbXAoKGNvbnN0IGNoYXIgKilyb2xlUGFyYW1zLT5jUm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAtIDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKmZvcm1hdFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFBhcmFtcy0+blBvcnRJbmRleCA+IGtPdXRwdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0UGFyYW1zLT5uSW5kZXggIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldFBhcmFtZXRlcihpbmRleCwgcGFyYW1zKTsKKyAgICB9Cit9CisKK09NWF9FUlJPUlRZUEUgU29mdEFWQzo6Z2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgeworICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfQ09ORklHX1JFQ1RUWVBFICpyZWN0UGFyYW1zID0gKE9NWF9DT05GSUdfUkVDVFRZUEUgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmIChyZWN0UGFyYW1zLT5uUG9ydEluZGV4ICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWN0UGFyYW1zLT5uTGVmdCA9IG1Dcm9wTGVmdDsKKyAgICAgICAgICAgIHJlY3RQYXJhbXMtPm5Ub3AgPSBtQ3JvcFRvcDsKKyAgICAgICAgICAgIHJlY3RQYXJhbXMtPm5XaWR0aCA9IG1Dcm9wV2lkdGg7CisgICAgICAgICAgICByZWN0UGFyYW1zLT5uSGVpZ2h0ID0gbUNyb3BIZWlnaHQ7CisKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworICAgIH0KK30KKwordm9pZCBTb2Z0QVZDOjpvblF1ZXVlRmlsbGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1FT1NTdGF0dXMgPT0gT1VUUFVUX0ZSQU1FU19GTFVTSEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoa0lucHV0UG9ydEluZGV4KTsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIEgyNjRTd0RlY1JldCByZXQgPSBIMjY0U1dERUNfUElDX1JEWTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBib29sIHBvcnRTZXR0aW5nc0NoYW5nZWQgPSBmYWxzZTsKKyAgICB3aGlsZSAoKG1FT1NTdGF0dXMgIT0gSU5QVVRfREFUQV9BVkFJTEFCTEUgfHwgIWluUXVldWUuZW1wdHkoKSkKKyAgICAgICAgICAgICYmIG91dFF1ZXVlLnNpemUoKSA9PSBrTnVtT3V0cHV0QnVmZmVycykgeworCisgICAgICAgIGlmIChtRU9TU3RhdHVzID09IElOUFVUX0VPU19TRUVOKSB7CisgICAgICAgICAgICBkcmFpbkFsbE91dHB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgKyttUGljSWQ7CisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7CisgICAgICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfRU9TX1NFRU47CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBuZXcgT01YX0JVRkZFUkhFQURFUlRZUEU7CisgICAgICAgIG1lbXNldChoZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworICAgICAgICBoZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgaGVhZGVyLT5uRmxhZ3MgPSBpbkhlYWRlci0+bkZsYWdzOworICAgICAgICBtUGljVG9IZWFkZXJNYXAuYWRkKG1QaWNJZCwgaGVhZGVyKTsKKyAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworCisgICAgICAgIEgyNjRTd0RlY0lucHV0IGluUGljdHVyZTsKKyAgICAgICAgSDI2NFN3RGVjT3V0cHV0IG91dFBpY3R1cmU7CisgICAgICAgIG1lbXNldCgmaW5QaWN0dXJlLCAwLCBzaXplb2YoaW5QaWN0dXJlKSk7CisgICAgICAgIGluUGljdHVyZS5kYXRhTGVuID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgIGluUGljdHVyZS5wU3RyZWFtID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgaW5QaWN0dXJlLnBpY0lkID0gbVBpY0lkOworICAgICAgICBpblBpY3R1cmUuaW50cmFDb25jZWFsbWVudE1ldGhvZCA9IDE7CisgICAgICAgIEgyNjRTd0RlY1BpY3R1cmUgZGVjb2RlZFBpY3R1cmU7CisKKyAgICAgICAgd2hpbGUgKGluUGljdHVyZS5kYXRhTGVuID4gMCkgeworICAgICAgICAgICAgcmV0ID0gSDI2NFN3RGVjRGVjb2RlKG1IYW5kbGUsICZpblBpY3R1cmUsICZvdXRQaWN0dXJlKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gSDI2NFNXREVDX0hEUlNfUkRZX0JVRkZfTk9UX0VNUFRZIHx8CisgICAgICAgICAgICAgICAgcmV0ID09IEgyNjRTV0RFQ19QSUNfUkRZX0JVRkZfTk9UX0VNUFRZKSB7CisgICAgICAgICAgICAgICAgaW5QaWN0dXJlLmRhdGFMZW4gLT0gKHUzMikob3V0UGljdHVyZS5wU3RybUN1cnJQb3MgLSBpblBpY3R1cmUucFN0cmVhbSk7CisgICAgICAgICAgICAgICAgaW5QaWN0dXJlLnBTdHJlYW0gPSBvdXRQaWN0dXJlLnBTdHJtQ3VyclBvczsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEgyNjRTV0RFQ19IRFJTX1JEWV9CVUZGX05PVF9FTVBUWSkgeworICAgICAgICAgICAgICAgICAgICBtSGVhZGVyc0RlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBIMjY0U3dEZWNJbmZvIGRlY29kZXJJbmZvOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhIMjY0U3dEZWNHZXRJbmZvKG1IYW5kbGUsICZkZWNvZGVySW5mbykgPT0gSDI2NFNXREVDX09LKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUG9ydFNldHRpbmdDaGFuZ2VFdmVudCgmZGVjb2RlckluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVySW5mby5jcm9wcGluZ0ZsYWcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNyb3BSZWN0RXZlbnQoJmRlY29kZXJJbmZvLmNyb3BQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRTZXR0aW5nc0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEgyNjRTd0RlY05leHRQaWN0dXJlKG1IYW5kbGUsICZkZWNvZGVkUGljdHVyZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID09IEgyNjRTV0RFQ19QSUNfUkRZKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhpcyBvdXRwdXQgYnVmZmVyOyBvdGhlcndpc2UsIGl0IHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvc3QgZHVyaW5nIGR5bmFtaWMgcG9ydCByZWNvbmZpZ3VyYXRpb24gYmVjYXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3Blbk1BWCBjbGllbnQgd2lsbCBkZWxldGUgX2FsbF8gb3V0cHV0IGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBwcm9jZXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUZpcnN0T3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRQaWN0dXJlLnBpY0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluUGljdHVyZS5kYXRhTGVuID0gMDsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJEZWNvZGVyIGZhaWxlZDogJWQiLCByZXQpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgIGlmIChwb3J0U2V0dGluZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICBwb3J0U2V0dGluZ3NDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUZpcnN0UGljdHVyZSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgZHJhaW5PbmVPdXRwdXRCdWZmZXIobUZpcnN0UGljdHVyZUlkLCBtRmlyc3RQaWN0dXJlKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1GaXJzdFBpY3R1cmU7CisgICAgICAgICAgICBtRmlyc3RQaWN0dXJlID0gTlVMTDsKKyAgICAgICAgICAgIG1GaXJzdFBpY3R1cmVJZCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFvdXRRdWV1ZS5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgbUhlYWRlcnNEZWNvZGVkICYmCisgICAgICAgICAgICAgICAgSDI2NFN3RGVjTmV4dFBpY3R1cmUobUhhbmRsZSwgJmRlY29kZWRQaWN0dXJlLCAwKQorICAgICAgICAgICAgICAgICAgICA9PSBIMjY0U1dERUNfUElDX1JEWSkgeworCisgICAgICAgICAgICBpbnQzMl90IHBpY0lkID0gZGVjb2RlZFBpY3R1cmUucGljSWQ7CisgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKikgZGVjb2RlZFBpY3R1cmUucE91dHB1dFBpY3R1cmU7CisgICAgICAgICAgICBkcmFpbk9uZU91dHB1dEJ1ZmZlcihwaWNJZCwgZGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBTb2Z0QVZDOjpoYW5kbGVQb3J0U2V0dGluZ0NoYW5nZUV2ZW50KGNvbnN0IEgyNjRTd0RlY0luZm8gKmluZm8pIHsKKyAgICBpZiAobVdpZHRoICE9IGluZm8tPnBpY1dpZHRoIHx8IG1IZWlnaHQgIT0gaW5mby0+cGljSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCAgPSBpbmZvLT5waWNXaWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGluZm8tPnBpY0hlaWdodDsKKyAgICAgICAgbVBpY3R1cmVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworICAgICAgICBtQ3JvcFdpZHRoID0gbVdpZHRoOworICAgICAgICBtQ3JvcEhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgIHVwZGF0ZVBvcnREZWZpbml0aW9ucygpOworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CisgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNvZnRBVkM6OmhhbmRsZUNyb3BSZWN0RXZlbnQoY29uc3QgQ3JvcFBhcmFtcyAqY3JvcCkgeworICAgIGlmIChtQ3JvcExlZnQgIT0gY3JvcC0+Y3JvcExlZnRPZmZzZXQgfHwKKyAgICAgICAgbUNyb3BUb3AgIT0gY3JvcC0+Y3JvcFRvcE9mZnNldCB8fAorICAgICAgICBtQ3JvcFdpZHRoICE9IGNyb3AtPmNyb3BPdXRXaWR0aCB8fAorICAgICAgICBtQ3JvcEhlaWdodCAhPSBjcm9wLT5jcm9wT3V0SGVpZ2h0KSB7CisgICAgICAgIG1Dcm9wTGVmdCA9IGNyb3AtPmNyb3BMZWZ0T2Zmc2V0OworICAgICAgICBtQ3JvcFRvcCA9IGNyb3AtPmNyb3BUb3BPZmZzZXQ7CisgICAgICAgIG1Dcm9wV2lkdGggPSBjcm9wLT5jcm9wT3V0V2lkdGg7CisgICAgICAgIG1Dcm9wSGVpZ2h0ID0gY3JvcC0+Y3JvcE91dEhlaWdodDsKKworICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwKKyAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCBOVUxMKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNvZnRBVkM6OnNhdmVGaXJzdE91dHB1dEJ1ZmZlcihpbnQzMl90IHBpY0lkLCB1aW50OF90ICpkYXRhKSB7CisgICAgQ0hFQ0sobUZpcnN0UGljdHVyZSA9PSBOVUxMKTsKKyAgICBtRmlyc3RQaWN0dXJlSWQgPSBwaWNJZDsKKworICAgIG1GaXJzdFBpY3R1cmUgPSBuZXcgdWludDhfdFttUGljdHVyZVNpemVdOworICAgIG1lbWNweShtRmlyc3RQaWN0dXJlLCBkYXRhLCBtUGljdHVyZVNpemUpOworfQorCit2b2lkIFNvZnRBVkM6OmRyYWluT25lT3V0cHV0QnVmZmVyKGludDMyX3QgcGljSWQsIHVpbnQ4X3QqIGRhdGEpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKGtPdXRwdXRQb3J0SW5kZXgpOworICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKKyAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBoZWFkZXItPm5UaW1lU3RhbXA7CisgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBoZWFkZXItPm5GbGFnczsKKyAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtUGljdHVyZVNpemU7CisgICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgIGRhdGEsIG1QaWN0dXJlU2l6ZSk7CisgICAgbVBpY1RvSGVhZGVyTWFwLnJlbW92ZUl0ZW0ocGljSWQpOworICAgIGRlbGV0ZSBoZWFkZXI7CisgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Cit9CisKK2Jvb2wgU29mdEFWQzo6ZHJhaW5BbGxPdXRwdXRCdWZmZXJzKCkgeworICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoa091dHB1dFBvcnRJbmRleCk7CisgICAgSDI2NFN3RGVjUGljdHVyZSBkZWNvZGVkUGljdHVyZTsKKworICAgIHdoaWxlICghb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgaWYgKG1IZWFkZXJzRGVjb2RlZCAmJgorICAgICAgICAgICAgSDI2NFNXREVDX1BJQ19SRFkgPT0KKyAgICAgICAgICAgICAgICBIMjY0U3dEZWNOZXh0UGljdHVyZShtSGFuZGxlLCAmZGVjb2RlZFBpY3R1cmUsIDEgLyogZmx1c2ggKi8pKSB7CisKKyAgICAgICAgICAgIGludDMyX3QgcGljSWQgPSBkZWNvZGVkUGljdHVyZS5waWNJZDsKKyAgICAgICAgICAgIENIRUNLKG1QaWNUb0hlYWRlck1hcC5pbmRleE9mS2V5KHBpY0lkKSA+PSAwKTsKKworICAgICAgICAgICAgbWVtY3B5KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCwKKyAgICAgICAgICAgICAgICBkZWNvZGVkUGljdHVyZS5wT3V0cHV0UGljdHVyZSwKKyAgICAgICAgICAgICAgICBtUGljdHVyZVNpemUpOworCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gbVBpY1RvSGVhZGVyTWFwLnZhbHVlRm9yKHBpY0lkKTsKKyAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IGhlYWRlci0+blRpbWVTdGFtcDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gaGVhZGVyLT5uRmxhZ3M7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBtUGljdHVyZVNpemU7CisgICAgICAgICAgICBtUGljVG9IZWFkZXJNYXAucmVtb3ZlSXRlbShwaWNJZCk7CisgICAgICAgICAgICBkZWxldGUgaGVhZGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKyAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQ7CisgICAgICAgIH0KKworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgU29mdEFWQzo6b25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBpZiAocG9ydEluZGV4ID09IGtJbnB1dFBvcnRJbmRleCkgeworICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfREFUQV9BVkFJTEFCTEU7CisgICAgfQorfQorCit2b2lkIFNvZnRBVkM6Om9uUG9ydEVuYWJsZUNvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgc3dpdGNoIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVdBSVRJTkdfRElTQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKCFlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UsIChpbnQpQVdBSVRJTkdfRU5BQkxFRCk7CisgICAgICAgICAgICBDSEVDSyhlbmFibGVkKTsKKyAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBOT05FOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU29mdEFWQzo6dXBkYXRlUG9ydERlZmluaXRpb25zKCkgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmRlZiA9ICZlZGl0UG9ydEluZm8oMCktPm1EZWY7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgZGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gZGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworCisgICAgZGVmID0gJmVkaXRQb3J0SW5mbygxKS0+bURlZjsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgIGRlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBkZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBkZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICBkZWYtPm5CdWZmZXJTaXplID0KKyAgICAgICAgKGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoCisgICAgICAgICAgICAqIGRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAqIDMpIC8gMjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpTb2Z0QVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9Tb2Z0QVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzllZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvU29mdEFWQy5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTT0ZUX0FWQ19IXworCisjZGVmaW5lIFNPRlRfQVZDX0hfCisKKyNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworI2luY2x1ZGUgIkgyNjRTd0RlY0FwaS5oIgorI2luY2x1ZGUgImJhc2V0eXBlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNvZnRBVkMgOiBwdWJsaWMgU2ltcGxlU29mdE9NWENvbXBvbmVudCB7CisgICAgU29mdEFWQyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+U29mdEFWQygpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsR2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0RW5hYmxlQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4LCBib29sIGVuYWJsZWQpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrSW5wdXRQb3J0SW5kZXggICA9IDAsCisgICAgICAgIGtPdXRwdXRQb3J0SW5kZXggID0gMSwKKyAgICAgICAga051bUlucHV0QnVmZmVycyAgPSA4LAorICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDE2LAorICAgIH07CisKKyAgICBlbnVtIEVPU1N0YXR1cyB7CisgICAgICAgIElOUFVUX0RBVEFfQVZBSUxBQkxFLAorICAgICAgICBJTlBVVF9FT1NfU0VFTiwKKyAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVELAorICAgIH07CisKKyAgICB2b2lkICptSGFuZGxlOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworCisgICAgdWludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtUGljdHVyZVNpemU7CisgICAgdWludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcDsKKyAgICB1aW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKKworICAgIHVpbnQ4X3QgKm1GaXJzdFBpY3R1cmU7CisgICAgaW50MzJfdCBtRmlyc3RQaWN0dXJlSWQ7CisKKyAgICBpbnQzMl90IG1QaWNJZDsgIC8vIFdoaWNoIG91dHB1dCBwaWN0dXJlIGlzIGZvciB3aGljaCBpbnB1dCBidWZmZXI/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+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIAorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmU2YjYwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpAQCAtMCwwICsxLDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBpbnRyYSBjaHJvbWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIG1hY3JvYmxvY2sgKDE2eDE2KS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNEc3QgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiBNdXN0IGJlIDgtYnl0ZSBhbGlnbmVkLgorICogW2luXQlzcmNkc3RTdGVwICAgICAgU3RlcCBvZiB0aGUgYXJyYXlzCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIGFycmF5IG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJQUFycmF5IG9mIHNpemUgIDh4MiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSBlZGdlIG9mIGVhY2ggNHgyIG9yIDJ4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbiAgaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCWFycmF5IG9mIHNpemUgMTZ4MiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4xXT09IDQuICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcFNyY0RzdAkJcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jaworICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzLCBvciBwQlMgaXMgTlVMTC4KKyAqICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4KKyAqICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKyAqICAgLSBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0koCisJT01YX1U4KiBwU3JjRHN0LCAKKwlPTVhfUzMyIHNyY2RzdFN0ZXAsIAorCWNvbnN0IE9NWF9VOCogcEFscGhhLCAKKwljb25zdCBPTVhfVTgqIHBCZXRhLCAKKwljb25zdCBPTVhfVTgqIHBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90OEJ5dGVBbGlnbmVkKHBTcmNEc3QpLCAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBUaHJlc2hvbGRzID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBwQlMpOworCisgICAgYXJtUmV0QXJnRXJySWYoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIsIGVycm9yQ29kZSkKKyAgICAKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrOCwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIzODYyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKQEAgLTAsMCArMSw5MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGx1bWEgZGVibG9jaworICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKyAKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGRlYmxvY2sgZmlsdGVyaW5nIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jaworICooMTZ4MTYpLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0RzdCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIE11c3QgYmUgOC1ieXRlIGFsaWduZWQuCisgKiBbaW5dCXNyY2RzdFN0ZXAgICAgICBpbWFnZSB3aWR0aAorICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsIGhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcFRocmVzaG9sZHMJCXBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIGZvbGxvd3M6IHsgdmFsdWVzIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgIGxlZnQgb3IgYWJvdmUgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gIHZlcnRpY2FsIGJsb2NrIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGluIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCisgKiBbaW5dCXBCUwkJCQkgcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgQlMgcGFyYW1ldGVycyBhcnJhbmdlZCBpbiBzY2FuIGJsb2NrIG9yZGVyIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjFdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuCisgKiBbb3V0XQlwU3JjRHN0CQlwb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorICogT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzCisgKiAgICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcyBvciBwQlMgaXMgTlVMTC4KKyAqICAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCisgKiAgICAtIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOAorICogICAgLSBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIHBCU1tpXjFdIT00KSBmb3IgMDw9aTw9My4KKy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSSgKKwlPTVhfVTgqIHBTcmNEc3QsIAorCU9NWF9TMzIgc3JjZHN0U3RlcCwgCisJY29uc3QgT01YX1U4KiBwQWxwaGEsIAorCWNvbnN0IE9NWF9VOCogcEJldGEsIAorCWNvbnN0IE9NWF9VOCogcFRocmVzaG9sZHMsIAorCWNvbnN0IE9NWF9VOCAqcEJTCispCit7CisgICAgT01YUmVzdWx0IGVycm9yQ29kZTsKKyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwU3JjRHN0ID09IE5VTEwsICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q4Qnl0ZUFsaWduZWQocFNyY0RzdCksIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsgICAgCisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJldGEgPT0gTlVMTCwgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocFRocmVzaG9sZHMgPT0gTlVMTCwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIHBCUyk7CisKKyAgICBhcm1SZXRBcmdFcnJJZihlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciwgZXJyb3JDb2RlKQorICAgIAorICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGErMiwgcEJldGErMiwgcFRocmVzaG9sZHMrMTYsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5ZjI3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw2MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEguMjY0IGRlY29kZSBjb2VmZmljaWVudHMgbW9kdWxlCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIENBVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHJhc3RlciBzY2FuIGZvciAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIHBvc2l0aW9uLWNvZWZmaWNpZW50IAorICogYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyByYXN0ZXIgc2NhbiBvcmRlciwgbmFtZWx5IHBvc2l0aW9uIG9yZGVyLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtCisgKgkJCQkJCQkJYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIAorICoJCQkJCQkJCXBvaW50ZWQgdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzCisgKgkJCQkJCQkJaW4gdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICAgY29uc3QgT01YX1U4KiogcHBCaXRTdHJlYW0sCisgICAgIE9NWF9TMzIqIHBPZmZzZXQsCisgICAgIE9NWF9VOCogcE51bUNvZWZmLAorICAgICBPTVhfVTgqKiBwcFBvc0NvZWZidWYgICAgICAgIAorICkKKworeworICAgIHJldHVybiBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcihwcEJpdFN0cmVhbSwgcE9mZnNldCwgcE51bUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcFBvc0NvZWZidWYsIDE3LCA0KTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWJiNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKQEAgLTAsMCArMSw2OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCxMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiAKKyAqIEludmVyc2UgZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyB6aWd6YWcgb3JkZXIgaW5zdGVhZCAKKyAqIG9mIHBvc2l0aW9uIG9yZGVyLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrCisgKiBbaW5dCXNWTENTZWxlY3QJCVZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSBudW1iZXIgb2Ygbm9uLXplcm8KKyAqCQkJCQkJCQlBQyBjb2VmZmljaWVudHMgb2YgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gSXQgaXMgCisgKgkJCQkJCQkJZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIAorICoJCQkJCQkJCXRhYmxlIDktNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW6hr3QgYmUgbGVzcyB0aGFuIHplcm8uCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1Ziwgc1ZMQ1NlbGVjdCwgc01heE51bUNvZWZmKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzE0ODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCkBAIC0wLDAgKzEsNDgwIEBACis7Ly8KKzsvLyAoYykgQ29weXJpZ2h0IDIwMDcgQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCis7Ly8gCis7Ly8gCisKKyAgICAgICAgCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZSAKKyAgICAgICAgCisgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMsIEFSTTExMzZKU19VCisgICAgICAgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMgCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BTcmNEc3QgICAgICAgUk4gIDAKK1FQICAgICAgICAgICAgUk4gIDEKKworCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BRUGRpdiAgICAgICAgICBSTiAgNAorcFFQbW9kICAgICAgICAgIFJOICA1CitwVlJvdyAgICAgICAgICAgUk4gIDIKK1FQbW9kICAgICAgICAgICBSTiAgNgorc2hpZnQgICAgICAgICAgIFJOICAzCityb3dMdW1hMDEgICAgICAgUk4gIDEKK3Jvd0x1bWEyMyAgICAgICBSTiAgNAorCitTcmNEc3QwMCAgICAgICAgUk4gIDUKK1NyY0RzdDAyICAgICAgICBSTiAgNgorU3JjRHN0MTAgICAgICAgIFJOICA3CitTcmNEc3QxMiAgICAgICAgUk4gIDgKK1NyY0RzdDIwICAgICAgICBSTiAgOQorU3JjRHN0MjIgICAgICAgIFJOICAxMAorU3JjRHN0MzAgICAgICAgIFJOICAxMQorU3JjRHN0MzIgICAgICAgIFJOICAxMgorCit0ZW1wMSAgICAgICAgICAgUk4gIDIKK3RlbXAyICAgICAgICAgICBSTiAgMwordGVtcDMgICAgICAgICAgIFJOICAxNAorICAgIAorICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCxyMTEKKyAgICAgICAgIAorICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKKyAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIAorICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2CisgICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2CisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUkggICAgcm93THVtYTAxLFtwVlJvdyxRUG1vZF0hICAgICAgICAgICAgIDsvLyByb3dMdW1hMDEgPSBbMDB8MGFdCisgICAgICAgIExEUkggICAgdGVtcDMsW3BWUm93LCMyXSAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMyAgICAgPSBbMDB8MGJdICAgCisgICAgICAgIExEUkggICAgcm93THVtYTIzLFtwVlJvdywjNF0gICAgICAgICAgICAgICAgIDsvLyByb3dMdW1hMjMgPSBbMDB8MGNdIAorICAgICAgICBPUlIgICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsdGVtcDMsTFNMICMxNiAgICA7Ly8gcm93THVtYTAxID0gWzBifDBhXSAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYWxsIHRoZSAxNiAnc3JjJyB2YWx1ZXMKKyAgICAgICAgTERNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAnU2hpZnQnIHJhbmdlcyBiZXR3ZWVuIFswLDhdIAorICAgICAgICA7Ly8gU28gd2UgY2FuIHNoaWZ0IHRoZSBwYWNrZWQgcm93THVtYSB2YWx1ZXMgWzBifDBhXSB3aXRoIGEgc2luZ2xlIExTTCBvcGVyYXRpb24KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgTFNMICAgIHJvd0x1bWEwMSxyb3dMdW1hMDEsc2hpZnQKKyAgICAgICAgTFNMICAgIHJvd0x1bWEyMyxyb3dMdW1hMjMsc2hpZnQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhlIGlkZWEgaXMgdG8gdW5yb2xsIHRoZSBMb29wIGNvbXBsZXRlbHkKKyAgICAgICAgOy8vIEFsbCB0aGUgMTYgc3JjIHZhbHVlcyBhcmUgbG9hZGVkIGF0IG9uY2UgaW50byA4IHJlZ2lzdGVycyA6IFNyY0RzdDx5Pjx4PiAoYWJvdmUpCisgICAgICAgIDsvLyAwPD0gYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV0gPD0yIGZvciBhbnkgJ2k8MTYnIAorICAgICAgICA7Ly8gU28gdGhlIG9ubHkgdmFsdWVzIG9mIHBWUm93W2ldIHRoYXQgbmVlZCB0byBiZSBsb2FkZWQgYXJlIGZvciBpPTAsMSwyCisgICAgICAgIDsvLyBUaGVzZSAzIHZhbHVlcyBhcmUgbG9hZGVkIGludG8gcm93THVtYTAxIGFuZCByb3dMdW1hMjMgKGFib3ZlKQorICAgICAgICA7Ly8gV2UgZmlyc3QgY2FsY3VsYXRlIHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSkgPDwgU2hpZnQgd2hpY2ggZml0cyBpbnRvIDE2IGJpdHMgKGFib3ZlKQorICAgICAgICA7Ly8gVGhlbiB0aGUgcHJvZHVjdCBwU3JjRHN0W2ldICogKHBWUm93W2FybVZDTTRQMTBfUG9zVG9WQ29sNHg0W2ldXSA8PCBTaGlmdCkgaXMgY2FsY3VsYXRlZAorICAgICAgICA7Ly8gSGVyZSB3ZSBpbnRlcmxlYXZlIHRoZSBQS0hCVCBvcGVyYXRpb25zIGZvciB2YXJpb3VzIHJvd3MgIHRvIGF2b2lkZSBwaXBlbGluZSBzdGFsbHMKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gV2UgdGhlbiBwYWNrIHRoZSB0d28gMTYgYml0IG11bHRpcGxpY2F0aW9uIHJlc3VsdCBpbnRvIGEgd29yZCBhbmQgc3RvcmUgYXQgb25lIGdvCisgICAgICAgIDsvLworICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAxCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMSxTcmNEc3QwMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzFdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MDAsU3JjRHN0MDAscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXSAqIChwVlJvd1swXTw8U2hpZnQpICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MDIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFszXSAqIChwVlJvd1syXTw8U2hpZnQpIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDAyLFNyY0RzdDAyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMl0gKiAocFZSb3dbMF08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QwMCxTcmNEc3QwMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBmaXJzdCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMgorICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDEwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNV0gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDEwLFNyY0RzdDEwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNF0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QwMixTcmNEc3QwMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICBTTVVMVFQgIHRlbXAyLFNyY0RzdDEyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbN10gKiAocFZSb3dbMV08PFNoaWZ0KQorICAgICAgICBTTVVMQkIgIFNyY0RzdDEyLFNyY0RzdDEyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbNl0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QxMCxTcmNEc3QxMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gUm93IDMgICAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDIwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOV0gKiAocFZSb3dbMl08PFNoaWZ0KSAgICAgICAgIAorICAgICAgICBTTVVMQkIgIFNyY0RzdDIwLFNyY0RzdDIwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbOF0gKiAocFZSb3dbMF08PFNoaWZ0KSAgCisgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MTIsU3JjRHN0MTIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICBTTVVMVEIgIHRlbXAyLFNyY0RzdDIyLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTFdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MjIsU3JjRHN0MjIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMF0gKiAocFZSb3dbMF08PFNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MjAsU3JjRHN0MjAsdGVtcDEsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgbmV4dCB0d28gcHJvZHVjdCB2YWx1ZXMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgNCAgIAorICAgICAgICAKKyAgICAgICAgU01VTFRUICB0ZW1wMSxTcmNEc3QzMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEzXSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MzAsU3JjRHN0MzAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMl0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgICAKKyAgICAgICAgU01VTFRUICB0ZW1wMyxTcmNEc3QzMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE1XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MzIsU3JjRHN0MzIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxNF0gKiAocFZSb3dbMl08PFNoaWZ0KQorICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDIyLFNyY0RzdDIyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIHJlbWFpbmluZyBwcm9kdWN0IHZhbHVlcworICAgICAgICBQS0hCVCAgIFNyY0RzdDMwLFNyY0RzdDMwLHRlbXAxLExTTCAjMTYKKyAgICAgICAgUEtIQlQgICBTcmNEc3QzMixTcmNEc3QzMix0ZW1wMyxMU0wgIzE2CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU1RNSUEgICBwU3JjRHN0LHtTcmNEc3QwMCxTcmNEc3QwMixTcmNEc3QxMCxTcmNEc3QxMixTcmNEc3QyMCxTcmNEc3QyMixTcmNEc3QzMCxTcmNEc3QzMn0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAorIAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIEFSTTExMzZKU19VCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BTcmNEc3QgICAgICAgUk4gIDAKK1FQICAgICAgICAgICAgUk4gIDEKKworCis7Ly9PdXRwdXQgUmVnaXN0ZXJzCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BRUGRpdiAgICAgICAgICBSTiAgNAorcFFQbW9kICAgICAgICAgIFJOICA1CitwVlJvdyAgICAgICAgICAgUk4gIDIKK1FQbW9kICAgICAgICAgICBSTiAgNgorc2hpZnQgICAgICAgICAgIFJOICAzCityb3dMdW1hMDEgICAgICAgUk4gIDEKK3Jvd0x1bWEyMyAgICAgICBSTiAgNAorCitTcmNEc3QwMCAgICAgICAgUk4gIDUKK1NyY0RzdDAyICAgICAgICBSTiAgNgorU3JjRHN0MTAgICAgICAgIFJOICA3CitTcmNEc3QxMiAgICAgICAgUk4gIDgKK1NyY0RzdDIwICAgICAgICBSTiAgOQorU3JjRHN0MjIgICAgICAgIFJOICAxMAorU3JjRHN0MzAgICAgICAgIFJOICAxMQorU3JjRHN0MzIgICAgICAgIFJOICAxMgorCit0ZW1wMSAgICAgICAgICAgUk4gIDIKK3RlbXAyICAgICAgICAgICBSTiAgMwordGVtcDMgICAgICAgICAgIFJOICAxNAorICAgIAorICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NCxyMTEKKyAgICAgICAgIAorICAgICAgICBMRFIgICAgcFFQbW9kLD1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgTERSICAgIHBRUGRpdiw9YXJtVkNNNFAxMF9RUERpdlRhYmxlICAgICAgICAKKyAgICAgICAgTERSICAgIHBWUm93LD1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIAorICAgICAgICBMRFJTQiAgUVBtb2QsW3BRUG1vZCxRUF0gICAgICAgICAgICAgICAgICAgIDsvLyAoUVAlNikgKiA2CisgICAgICAgIExEUlNCICBzaGlmdCxbcFFQZGl2LFFQXSAgICAgICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gUVAgLyA2CisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICByb3dMdW1hMDEsW3BWUm93LFFQbW9kXSEgICAgICAgICAgICAgOy8vIHJvd0x1bWEwMSA9IFswYnwwYV0KKyAgICAgICAgTERSICAgIHJvd0x1bWEyMyxbcFZSb3csIzRdICAgICAgICAgICAgICAgICA7Ly8gcm93THVtYTIzID0gWzBkfDBjXSAgICAKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDE2ICdzcmMnIHZhbHVlcworICAgICAgICBMRE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICdTaGlmdCcgcmFuZ2VzIGJldHdlZW4gWzAsOF0gCisgICAgICAgIDsvLyBTbyB3ZSBjYW4gc2hpZnQgdGhlIHBhY2tlZCByb3dMdW1hIHZhbHVlcyBbMGJ8MGFdIHdpdGggYSBzaW5nbGUgTFNMIG9wZXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBMU0wgICAgcm93THVtYTAxLHJvd0x1bWEwMSxzaGlmdAorICAgICAgICBMU0wgICAgcm93THVtYTIzLHJvd0x1bWEyMyxzaGlmdAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGUgaWRlYSBpcyB0byB1bnJvbGwgdGhlIExvb3AgY29tcGxldGVseQorICAgICAgICA7Ly8gQWxsIHRoZSAxNiBzcmMgdmFsdWVzIGFyZSBsb2FkZWQgYXQgb25jZSBpbnRvIDggcmVnaXN0ZXJzIDogU3JjRHN0PHk+PHg+IChhYm92ZSkKKyAgICAgICAgOy8vIDA8PSBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NFtpXSA8PTIgZm9yIGFueSAnaTwxNicgCisgICAgICAgIDsvLyBTbyB0aGUgb25seSB2YWx1ZXMgb2YgcFZSb3dbaV0gdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhcmUgZm9yIGk9MCwxLDIKKyAgICAgICAgOy8vIFRoZXNlIDMgdmFsdWVzIGFyZSBsb2FkZWQgaW50byByb3dMdW1hMDEgYW5kIHJvd0x1bWEyMyAoYWJvdmUpCisgICAgICAgIDsvLyBXZSBmaXJzdCBjYWxjdWxhdGUgcFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dKSA8PCBTaGlmdCB3aGljaCBmaXRzIGludG8gMTYgYml0cyAoYWJvdmUpCisgICAgICAgIDsvLyBUaGVuIHRoZSBwcm9kdWN0IHBTcmNEc3RbaV0gKiAocFZSb3dbYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDRbaV1dIDw8IFNoaWZ0KSBpcyBjYWxjdWxhdGVkCisgICAgICAgIDsvLyBIZXJlIHdlIGludGVybGVhdmUgdGhlIFBLSEJUIG9wZXJhdGlvbnMgZm9yIHZhcmlvdXMgcm93cyAgdG8gYXZvaWRlIHBpcGVsaW5lIHN0YWxscworICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBXZSB0aGVuIHBhY2sgdGhlIHR3byAxNiBiaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGludG8gYSB3b3JkIGFuZCBzdG9yZSBhdCBvbmUgZ28KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDEKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMVEIgIHRlbXAxLFNyY0RzdDAwLHJvd0x1bWEyMyAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QwMCxTcmNEc3QwMCxyb3dMdW1hMDEgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzBdICogKHBWUm93WzBdPDxTaGlmdCkgIAorICAgICAgICAKKyAgICAgICAgU01VTFRCICB0ZW1wMixTcmNEc3QwMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzNdICogKHBWUm93WzJdPDxTaGlmdCkgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MDIsU3JjRHN0MDIscm93THVtYTAxICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsyXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAwLFNyY0RzdDAwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIGZpcnN0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyAyCisgICAgICAgIFNNVUxUVCAgdGVtcDEsU3JjRHN0MTAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs1XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTAsU3JjRHN0MTAscm93THVtYTIzICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDAyLFNyY0RzdDAyLHRlbXAyLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUVCAgdGVtcDIsU3JjRHN0MTIscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs3XSAqIChwVlJvd1sxXTw8U2hpZnQpCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MTIsU3JjRHN0MTIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs2XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIFNyY0RzdDEwLFNyY0RzdDEwLHRlbXAxLExTTCAjMTYgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMyAgICAKKyAgICAgICAgCisgICAgICAgIFNNVUxUQiAgdGVtcDEsU3JjRHN0MjAscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs5XSAqIChwVlJvd1syXTw8U2hpZnQpICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgU3JjRHN0MjAsU3JjRHN0MjAscm93THVtYTAxICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFs4XSAqIChwVlJvd1swXTw8U2hpZnQpICAKKyAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QxMixTcmNEc3QxMix0ZW1wMixMU0wgIzE2ICAgICAgICAgICAgICAgOy8vIFBhY2sgdGhlIG5leHQgdHdvIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFNNVUxUQiAgdGVtcDIsU3JjRHN0MjIscm93THVtYTIzICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFsxMV0gKiAocFZSb3dbMl08PFNoaWZ0KSAKKyAgICAgICAgU01VTEJCICBTcmNEc3QyMixTcmNEc3QyMixyb3dMdW1hMDEgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEwXSAqIChwVlJvd1swXTw8U2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgUEtIQlQgICBTcmNEc3QyMCxTcmNEc3QyMCx0ZW1wMSxMU0wgIzE2ICAgICAgICAgICAgIDsvLyBQYWNrIHRoZSBuZXh0IHR3byBwcm9kdWN0IHZhbHVlcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0ICAgCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAxLFNyY0RzdDMwLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTNdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMCxTcmNEc3QzMCxyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzEyXSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgIAorICAgICAgICBTTVVMVFQgIHRlbXAzLFNyY0RzdDMyLHJvd0x1bWEwMSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNEc3RbMTVdICogKHBWUm93WzFdPDxTaGlmdCkKKyAgICAgICAgU01VTEJCICBTcmNEc3QzMixTcmNEc3QzMixyb3dMdW1hMjMgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjRHN0WzE0XSAqIChwVlJvd1syXTw8U2hpZnQpCisgICAgICAgCisgICAgICAgIFBLSEJUICAgU3JjRHN0MjIsU3JjRHN0MjIsdGVtcDIsTFNMICMxNiAgICAgICAgICAgICA7Ly8gUGFjayB0aGUgcmVtYWluaW5nIHByb2R1Y3QgdmFsdWVzCisgICAgICAgIFBLSEJUICAgU3JjRHN0MzAsU3JjRHN0MzAsdGVtcDEsTFNMICMxNgorICAgICAgICBQS0hCVCAgIFNyY0RzdDMyLFNyY0RzdDMyLHRlbXAzLExTTCAjMTYKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBTcmNEc3Qse1NyY0RzdDAwLFNyY0RzdDAyLFNyY0RzdDEwLFNyY0RzdDEyLFNyY0RzdDIwLFNyY0RzdDIyLFNyY0RzdDMwLFNyY0RzdDMyfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKU19VICAgICAgICAKKworCisKKworCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICBJRiAgQVJNMTEzNkpTCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BwU3JjICAgICAgIFJOICAwCitwUHJlZCAgICAgICBSTiAgMQorcERDICAgICAgICAgUk4gIDIKK3BEc3QgICAgICAgIFJOICAzCisgICAKKworOy8vT3V0cHV0IFJlZ2lzdGVycworcmVzdWx0ICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3BEZWx0YSAgICAgIFJOICA0CitwRGVsdGFUbXAgICBSTiAgNgorQUMgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitwUHJlZFRlbXAgICBSTiAgNworcERDVGVtcCAgICAgUk4gIDgKK3BEc3RUZW1wICAgIFJOICA5CitwRGVsdGFBcmcxICBSTiAgMQorcERlbHRhQXJnMCAgUk4gIDAKK1FQICAgICAgICAgIFJOICAxICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjaworREN2YWwgICAgICAgUk4gIDEwICAKK0RDdmFsQ29weSAgIFJOICAxMQorcHJlZHN0ZXAgICAgUk4gIDEKK2RzdFN0ZXAgICAgIFJOICAxMAoreWNvdW50ZXIgICAgUk4gIDAKK1ByZWRWYWwxICAgIFJOICAzCitQcmVkVmFsMiAgICBSTiAgNQorRGVsdGFWYWwxICAgUk4gIDIKK0RlbHRhVmFsMiAgIFJOICAxMQorUHJlZFZhbCAgICAgUk4gIDgKK3RtcERlbHRhVmFsIFJOICA2CitzdW0xICAgICAgICBSTiAgMTIKK3N1bTIgICAgICAgIFJOICAxNAorICAgIAorICAgIAorICAgICAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DOCBwQnVmZmVyLCAzMgorICAgICAgICAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCxyMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHJlZFN0ZXBPblN0YWNrLCA0CisgICAgICAgIE1fQVJHICAgZHN0U3RlcE9uU3RhY2ssNAorICAgICAgICBNX0FSRyAgIFFQT25TdGFjaywgNAorICAgICAgICBNX0FSRyAgIEFDT25TdGFjayw0CisgIAorICAgICAgICAKKyAgICAgICAgTV9BRFIgICBwRGVsdGEscEJ1ZmZlciAKKyAgICAgICAgTV9MRFIgICBBQyxBQ09uU3RhY2sgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBTYXZlIHJlZ2lzdGVycyByMSxyMixyMyBiZWZvcmUgZnVuY3Rpb24gY2FsbCAgICAKKyAgICAgICAgTU9WICAgICBwUHJlZFRlbXAscFByZWQKKyAgICAgICAgTU9WICAgICBwRENUZW1wLHBEQworICAgICAgICBNT1YgICAgIHBEc3RUZW1wLHBEc3QKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgQUMsIzAKKyAgICAgICAgQkVRICAgICBEQ2Nhc2UKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgCisgICAgICAgIE1fTERSICAgUVAsUVBPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBEZXF1YW50THVtYUFDNHg0CisgICAgICAgIE1PViAgICAgcERlbHRhQXJnMCxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIwIGZvciBEZXF1YW50THVtYUFDNHg0CisKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBDTVAgICAgIHBEQ1RlbXAsIzAKKyAgICAgICAgTERSU0hORSBEQ3ZhbCxbcERDVGVtcF0KKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcwLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjAgZm9yIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgTU9WICAgICBwRGVsdGFBcmcxLHBEZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXQgdXAgcjEgZm9yIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAgICAgU1RSSE5FICBEQ3ZhbCxbcERlbHRhXQorICAgICAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0CisgICAgICAgIEIgICAgICAgT3V0RENjYXNlIAorICAgICAgICAKKworRENjYXNlCisgICAgICAgIExEUlNIICAgREN2YWwsW3BEQ1RlbXBdIAorICAgICAgICBBREQgICAgIERDdmFsLERDdmFsLCMzMiAKKyAgICAgICAgQVNSICAgICBEQ3ZhbCxEQ3ZhbCwjNgorICAgICAgICBQS0hCVCAgIERDdmFsLERDdmFsLERDdmFsLExTTCAjMTYgICAgICAgICAgICAgICAgICA7Ly8gRHVwbGljYXRpbmcgdGhlIExvd2VyIGhhbGZ3b3JkCisgICAgICAgIE1PViAgICAgREN2YWxDb3B5LCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBOZWVkZWQgZm9yIFNUUkQKKyAgICAgICAgU1RSRCAgICBEQ3ZhbCwgW3BEZWx0YSwgIzBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVswXSAgPSBwRGVsdGFbMV0gID0gcERlbHRhWzJdICA9IHBEZWx0YVszXSA9IERDdmFsCisgICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICM4XSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbNF0gID0gcERlbHRhWzVdICA9IHBEZWx0YVs2XSAgPSBwRGVsdGFbN10gPSBEQ3ZhbAorICAgICAgICBTVFJEICAgIERDdmFsLCBbcERlbHRhLCAjMTZdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzhdICA9IHBEZWx0YVs5XSAgPSBwRGVsdGFbMTBdID0gcERlbHRhWzExXSA9IERDdmFsCisgICAgICAgIFNUUkQgICAgREN2YWwsIFtwRGVsdGEsICMyNF0gICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKK091dERDY2FzZSAgICAgIAorICAgICAgICBNX0xEUiAgIHByZWRzdGVwLHByZWRTdGVwT25TdGFjaworICAgICAgICBNX0xEUiAgIGRzdFN0ZXAsZHN0U3RlcE9uU3RhY2sKKyAgICAgICAgCisgICAgICAgIExETUlBICAgcERlbHRhISx7dG1wRGVsdGFWYWwsRGVsdGFWYWwyfSAgICAgICAgICAgICA7Ly8gUHJlIGxvYWQKKyAgICAgICAgTU9WICAgICB5Y291bnRlciwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb3VudGVyIGZvciB0aGUgUHJlZFBsdXNEZWx0YUxvb3AKKyAgICAgICAgTERSICAgICBQcmVkVmFsLFtwUHJlZFRlbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmUgbG9hZAorCitQcmVkUGx1c0RlbHRhTG9vcAorICAgICAgICAKKyAgICAgICAKKyAgICAgICAgU1VCUyAgICB5Y291bnRlcix5Y291bnRlciwjMQorICAgICAgICBBREQgICAgIHBQcmVkVGVtcCxwUHJlZFRlbXAscHJlZHN0ZXAgICAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwUHJlZCBwdHIKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgRGVsdGFWYWwxLHRtcERlbHRhVmFsLERlbHRhVmFsMixMU0wgIzE2ICAgICA7Ly8gRGVsdGF2YWwxID0gW0MgQV0gICAKKyAgICAgICAgUEtIVEIgICBEZWx0YVZhbDIsRGVsdGFWYWwyLHRtcERlbHRhVmFsLEFTUiAjMTYgICAgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICBQcmVkVmFsMSxQcmVkVmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQcmVkVmFsMSA9IFswYzBhXQorICAgICAgICBVWFRCMTYgIFByZWRWYWwyLFByZWRWYWwsUk9SICM4ICAgICAgICAgICAgICAgICAgICAgOy8vIFByZWRWYWwyID0gWzBkMGJdCisgICAgICAgIAorICAgICAgICBMRFJHVCAgIFByZWRWYWwsW3BQcmVkVGVtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFByZSBsb2FkCisgICAgICAgIAorICAgICAgICBRQUREMTYgIHN1bTIsRGVsdGFWYWwyLFByZWRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIEFkZCBhbmQgc2F0dXJhdGUgdG8gMTYgYml0cworICAgICAgICBRQUREMTYgIHN1bTEsRGVsdGFWYWwxLFByZWRWYWwxCisgICAgICAgIAorICAgICAgICBVU0FUMTYgIHN1bTIsIzgsc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwyNTUsc3VtMikKKyAgICAgICAgVVNBVDE2ICBzdW0xLCM4LHN1bTEKKyAgICAgICAgCisgICAgICAgIExETUdUSUEgICBwRGVsdGEhLHt0bXBEZWx0YVZhbCxEZWx0YVZhbDJ9ICAgICAgICAgICA7Ly8gUHJlIGxvYWQKKyAgICAgICAgICAKKyAgICAgICAgT1JSICAgICBzdW0xLHN1bTEsc3VtMixMU0wgIzggICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gW2RjYmFdCisgICAgICAgIFNUUiAgICAgc3VtMSxbcERzdFRlbXBdCisgICAgICAgIAorICAgICAgICBBREQgICAgIHBEc3RUZW1wLHBEc3RUZW1wLGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEluY3JlbWVudCBwRHN0IHB0cgorICAgICAgICBCR1QgICAgIFByZWRQbHVzRGVsdGFMb29wICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VycgorICAgICAgICAKK0VuZCAgICAgICAgICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgIAorICAgIAorICAgIAorOy8vIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgICAgICAgICAgCisgICAgCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgCisgICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5NjBmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMzM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKK01BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCitMT09QX0NPVU5UICBFUVUgMHg1MDAwMDAwMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhQXJnICAgUk4gMgorcEJldGFBcmcgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA2CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAxMAorCithbHBoYSAgICAgICBSTiA2CithbHBoYTAgICAgICBSTiA2CithbHBoYTEgICAgICBSTiA4CisKK2JldGEgICAgICAgIFJOIDcKK2JldGEwICAgICAgIFJOIDcKK2JldGExICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgTG9jYWwvVGVtcG9yYXJ5IHZhcmlhYmxlcworCis7Ly8gUGl4ZWxzCitwXzAgICAgICAgICBSTiAzICAKK3BfMSAgICAgICAgIFJOIDUgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKKworOy8vIEZpbHRlcmluZworCitkcDBxMCAgICAgICBSTiAxMgorZHAxcDAgICAgICAgUk4gMTIKK2RxMXEwICAgICAgIFJOIDEyCisKK2FwMHEwICAgICAgIFJOIDQgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCitwUTAgICAgICAgICBSTiAwCitTdGVwICAgICAgICBSTiAxCisgICAgICAgICAgICAKKzsvLyBPdXRwdXQKKyAgICAgICAgICAgIAorUF8wICAgICAgICAgUk4gNgorUV8wICAgICAgICAgUk4gNyAKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKwordEMgICAgICAgICAgUk4gMTIKK3RDMCAgICAgICAgIFJOIDUKK3RDMSAgICAgICAgIFJOIDEyCitwb3MgICAgICAgICBSTiA1CituZWcgICAgICAgICBSTiA5CisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAorCithICAgICAgICAgICBSTiAxMAordDEgICAgICAgICAgUk4gMTAKK3QyICAgICAgICAgIFJOIDEyCit0MyAgICAgICAgICBSTiAxNAordDQgICAgICAgICAgUk4gNgordDUgICAgICAgICAgUk4gNQorCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMCw4CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGExLDgKKyAgICAgICAgTV9BTExPQzggcFhZQlMsNAorICAgICAgICBNX0FMTE9DNCBwcEJTLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisgICAgICAgIAorICAgICAgICBMRFJCICAgIGFscGhhMSwgW3BBbHBoYUFyZywjMV0KKyAgICAgICAgTERSQiAgICBiZXRhMSwgIFtwQmV0YUFyZywjMV0KKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzQXJnCisgICAgICAgIExEUiAgICAgYSw9TUFTS18xCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBMRFJCICAgIGFscGhhMCwgW3BBbHBoYUFyZ10KKworICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCBhCisgICAgICAgIE1VTCAgICAgYmV0YTEsIGJldGExLCBhCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMCwgYmV0YTAsIGEKKworICAgICAgICBNX1NUUkQgIGFscGhhMSwgYmV0YTEsIHBBbHBoYUJldGExCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fU1RSRCAgYWxwaGEwLCBiZXRhMCwgcEFscGhhQmV0YTAKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKK0xvb3BZCitMb29wWAorOy8vLS0tLS0tLS0tLS0tLS0tTG9hZCBQaXhlbHMtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjMgorICAgICAgICAKKyAgICAgICAgTV9TVFIgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICBwXzEsIFtwUTBdLHNyY2RzdFN0ZXAKKworICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBwXzAsIFtwUTBdLHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzAsIFtwUTBdLHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzEsIFtwUTBdCisgICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xICAgICAgICAgICAgICAgIDsvLyAgMDEwMTAxMDEgbWFzayAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIAorICAgICAgICA7Ly8gcF8wID0gW3IzcDAgcjJwMCByMXAwIHIwcDBdCisgICAgICAgIDsvLyBwXzEgPSBbcjNwMSByMnAxIHIxcDEgcjBwMV0KKyAgICAgICAgOy8vIHFfMCA9IFtyM3EwIHIycTAgcjFxMCByMHEwXQorICAgICAgICA7Ly8gcV8xID0gW3IzcTEgcjJxMSByMXExIHIwcTFdCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTU9WICAgICBtMDAsICNNQVNLXzAgICAgICAgICAgICAgICAgOy8vICAwMDAwMDAwMCBtYXNrIAorCisgICAgICAgIE1PViAgICAgZmlsdCwgbTAxCisgICAgICAgIFRTVCAgICAgYlMsICMweGZmMDAKKyAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2CisgICAgICAgIFRTVCAgICAgYlMsICMweGZmCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgorICAgICAgICBUU1QgICAgIGJTLCAjNAorCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKKyAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKKyAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICBCRVEgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworCisgICAgICAgIDsvLyBDb21wdXRlIFAwYgorICAgICAgICBVSEFERDggIHQxLCBwXzAsIHFfMQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgTVZOICAgICB0MiwgcF8xCisgICAgICAgIFVIU1VCOCAgdDEsIHQxLCB0MgorICAgICAgICBVU1VCOCAgIHQyLCBmaWx0LCBtMDEKKyAgICAgICAgRU9SICAgICB0MSwgdDEsIG0wMSwgTFNMICM3CisKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcyxwVGhyZXNob2xkcywgIzIKKyAgICAgICAgCisgICAgICAgIDsvLyBDb21wdXRlIFEwYiAKKyAgICAgICAgVUhBREQ4ICB0MiwgcV8wLCBwXzEKKyAgICAgICAgTVZOICAgICB0MywgcV8xCisgICAgICAgIFVIU1VCOCAgdDIsIHQyLCB0MworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU0VMICAgICBQXzAsIHQxLCBwXzAKKyAgICAgICAgRU9SICAgICB0MiwgdDIsIG0wMSwgTFNMICM3CisgICAgICAgIFNFTCAgICAgUV8wLCB0MiwgcV8wCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEIgICAgICAgU3RvcmVSZXN1bHRBbmRFeGl0CisKKzsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQorOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCisKK05vRmlsdGVyRmlsdDAKK05vRmlsdGVyQlMwCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKKworICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWQorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorICAgICAgICAKK2JTTFQ0ICAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICAKKyAgICAgICAgOy8vIFNpbmNlIGJldGEgPD0gMTggYW5kIGFscGhhIDw9IDI1NSB3ZSBrbm93CisgICAgICAgIDsvLyAtMjU0IDw9IHAwLXEwIDw9IDI1NAorICAgICAgICA7Ly8gIC0xNyA8PSBxMS1xMCA8PSAxNworICAgICAgICA7Ly8gIC0xNyA8PSBwMS1wMCA8PSAxNworCisgICAgICAgIDsvLyBkZWx0YSA9IENsaXAzKCAtdEMsIHRDLCAoKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MykpCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vICAgIENhbGN1bGF0ZSBBID0gKCgocTAtcDApPDwyKSArIChwMS1xMSkgKyA0KT4+MworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgPSAoNCpxMCAtIDQqcDAgKyBwMSAtIHExICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKChwMS1wMCkgLSAocTEtcTApIC0gMyoocDAtcTApICsgNCk+PjMKKworICAgICAgICBVU1VCOCAgIHQxLCBwXzEsIHBfMAorICAgICAgICBVU1VCOCAgIHQyLCBxXzEsIHFfMAorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgdEMwLCBbcFRocmVzaG9sZHNdLCMxCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0MgorICAgICAgICBMRFJCICAgIHRDMSwgW3BUaHJlc2hvbGRzXSwjMQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKKyAgICAgICAgT1JSICAgICB0QywgdEMwLCB0QzEsIExTTCAjMTYKKyAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKKyAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKKyAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAorCisgICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAorCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKKyAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKKyAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QworICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcworICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCisgICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCisgICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcworICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCisgICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZworICAgICAgICAKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisKKyAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKKyAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAorICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCisgICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAorICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKKyAgICAKK1N0b3JlUmVzdWx0QW5kRXhpdAorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorCisgICAgICAgIE1fU1RSICAgUF8wLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBTVFIgICAgIFFfMCwgW3BRMF0sICM0CisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCisKK0V4aXRMb29wWQorICAgICAgICBBREQgICAgIHBCUywgcEJTLCAjNAorICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgTV9TVFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRiAgICAgICAgCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzgzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsNDM3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCisgICAgICAgIAorTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKK01BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLXzIgICAgICBFUVUgMHgwMDAwZmYwMAorTE9PUF9DT1VOVCAgRVFVIDB4NTAwMDAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNgorcEJTICAgICAgICAgUk4gOQorcFEwICAgICAgICAgUk4gMAorYlMgICAgICAgICAgUk4gMgorYlNUZW1wICAgICAgUk4gMTAKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3FfMCAgICAgICAgIFJOIDggIAorcV8xICAgICAgICAgUk4gOSAgCisKKzsvLyBVbnBhY2tpbmcKK21hc2sgICAgICAgIFJOIDExIAorCityb3cwICAgICAgICBSTiAyCityb3cxICAgICAgICBSTiA0Cityb3cyICAgICAgICBSTiA1Cityb3czICAgICAgICBSTiAzCisKK3JvdzQgICAgICAgIFJOIDgKK3JvdzUgICAgICAgIFJOIDkKK3JvdzYgICAgICAgIFJOIDEwCityb3c3ICAgICAgICBSTiAxMgorCit0dW5wazAgICAgICBSTiAyCit0dW5wazIgICAgICBSTiAxMAordHVucGszICAgICAgUk4gMTIKKwordHVucGs0ICAgICAgUk4gNAordHVucGs1ICAgICAgUk4gNQordHVucGs2ICAgICAgUk4gMTQKK3R1bnBrNyAgICAgIFJOIDIgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorCithcDBxMCAgICAgICBSTiA0ICAKK2ZpbHQgICAgICAgIFJOIDIKKyAgICAgICAgCittMDAgICAgICAgICBSTiAxNAorbTAxICAgICAgICAgUk4gMTEKKyAgICAgICAgICAgIAorcFEwICAgICAgICAgUk4gMAorU3RlcCAgICAgICAgUk4gMQorICAgICAgICAgICAgCis7Ly8gT3V0cHV0CisgICAgICAgICAgICAKK1BfMCAgICAgICAgIFJOIDYKK1FfMCAgICAgICAgIFJOIDcgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDICAgICAgICAgIFJOIDEyCit0QzAgICAgICAgICBSTiA1Cit0QzEgICAgICAgICBSTiAxMgorcG9zICAgICAgICAgUk4gNQorbmVnICAgICAgICAgUk4gOQorCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCisKKzsvLyBNaXNjZWxsYW5vdXMKK1hZICAgICAgICAgIFJOIDgKKworYSAgICAgICAgICAgUk4gMTAKK3QxICAgICAgICAgIFJOIDEwCit0MiAgICAgICAgICBSTiAxMgordDMgICAgICAgICAgUk4gMTQKK3Q0ICAgICAgICAgIFJOIDYKK3Q1ICAgICAgICAgIFJOIDUKKworCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCisgICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0ksIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vSW5wdXQgYXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkc0FyZywgNAorICAgICAgICBNX0FSRyAgIHBwQlNBcmcsIDQKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQorICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHNBcmcKKyAgICAgICAgTERSICAgICBhLD1NQVNLXzEKKyAgICAgICAgTERSQiAgICBiZXRhMCwgIFtwQmV0YUFyZ10KKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIExEUkIgICAgYWxwaGEwLCBbcEFscGhhQXJnXQorCisgICAgICAgIE1VTCAgICAgYWxwaGExLCBhbHBoYTEsIGEKKyAgICAgICAgTVVMICAgICBiZXRhMSwgYmV0YTEsIGEKKyAgICAgICAgTVVMICAgICBhbHBoYTAsIGFscGhhMCwgYQorICAgICAgICBNVUwgICAgIGJldGEwLCBiZXRhMCwgYQorCisgICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKKyAgICAgICAgTV9MRFIgICBwQlMsIHBwQlNBcmcKKyAgICAgICAgTV9TVFJEICBhbHBoYTAsIGJldGEwLCBwQWxwaGFCZXRhMAorCisgICAgICAgIExEUiAgICAgWFksPUxPT1BfQ09VTlQKKyAgICAgICAgTV9TVFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICAKKyAgICAgICAgCitMb29wWQorTG9vcFgKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBxMC1xMS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUkggICAgYlMsIFtwQlNdLCAjOAorICAgICAgICBMRFIgICAgIG1hc2ssID1NQVNLXzIKKworICAgICAgICBNX0xEUkggIHJvdzQsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIENNUCAgICAgYlMsICMwCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSSCAgcm93NSwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQkVRLlcgICBOb0ZpbHRlckJTMAorICAgICAgICBMRFJIICAgIHJvdzYsIFtwUTBdCisgICAgICAgIExEUkggICAgcm93NywgW3BRMCwgc3JjZHN0U3RlcF0KKworICAgICAgICA7Ly8gcm93NCA9IFswIDAgcjBxMCByMHExXQorICAgICAgICA7Ly8gcm93NSA9IFswIDAgcjFxMCByMXExXQorICAgICAgICA7Ly8gcm93NiA9IFswIDAgcjJxMCByMnExXQorICAgICAgICA7Ly8gcm93NyA9IFswIDAgcjNxMCByM3ExXQorCisgICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0CisgICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNSwgdHVucGs1LCByb3c1CisgICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2CisgICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAorICAgICAgICBVWFRBQiAgIHR1bnBrNywgdHVucGs3LCByb3c3CisKKyAgICAgICAgOy8vIHR1bnBrNCA9IFswIDAgcjBxMCByMXEwXQorICAgICAgICA7Ly8gdHVucGs1ID0gWzAgMCByMHExIHIxcTFdCisgICAgICAgIDsvLyB0dW5wazYgPSBbMCAwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIHR1bnBrNyA9IFswIDAgcjJxMSByM3ExXQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjMgorCisgICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2CisgICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2CisKKyAgICAgICAgOy8vIHFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorICAgICAgICA7Ly8gcV8xID0gW3IwcTEgcjFxMSByMnExIHIzcTFdCisKKworOy8vLS0tLS0tLS0tLS0tLS0tLVBhY2sgcDAtcDEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIE1fTERSSCAgcm93MCwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIE1fTERSSCAgcm93MSwgW3BRMF0sIHNyY2RzdFN0ZXAgICAgICAgICAgCisgICAgICAgIExEUkggICAgcm93MiwgW3BRMF0KKyAgICAgICAgTERSSCAgICByb3czLCBbcFEwLCBzcmNkc3RTdGVwXQorICAgICAgICAKKyAgICAgICAgOy8vIHJvdzAgPSBbMCAwIHIwcDAgcjBwMV0KKyAgICAgICAgOy8vIHJvdzEgPSBbMCAwIHIxcDAgcjFwMV0KKyAgICAgICAgOy8vIHJvdzIgPSBbMCAwIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHJvdzMgPSBbMCAwIHIzcDAgcjNwMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MAorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazIsIHR1bnBrMiwgcm93MSwgUk9SIzgKKyAgICAgICAgVVhUQUIgICB0dW5wazYsIHR1bnBrNiwgcm93MQorCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrLCByb3cyCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrLCByb3cyLCBMU0wjOAorICAgICAgICBVWFRBQiAgIHR1bnBrMCwgdHVucGswLCByb3czLCBST1IjOAorICAgICAgICBVWFRBQiAgIHR1bnBrMywgdHVucGszLCByb3czCisKKyAgICAgICAgOy8vIHR1bnBrMiA9IFswIDAgcjBwMCByMXAwXQorICAgICAgICA7Ly8gdHVucGs2ID0gWzAgMCByMHAxIHIxcDFdCisgICAgICAgIDsvLyB0dW5wazAgPSBbMCAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIHR1bnBrMyA9IFswIDAgcjJwMSByM3AxXQorCisgICAgICAgIFBLSEJUICAgcF8wLCB0dW5wazAsIHR1bnBrMiwgTFNMIzE2CisgICAgICAgIE1fTERSICAgYlNUZW1wLCBwcEJTCisgICAgICAgIFBLSEJUICAgcF8xLCB0dW5wazMsIHR1bnBrNiwgTFNMIzE2CisKKyAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQorICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisKKzsvLy0tLS0tLS0tLS0tLS0tRmlsdGVyaW5nIERlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIExEUiAgICAgbTAxLCA9TUFTS18xCisgICAgICAgIExEUkggICAgYlNUZW1wLCBbYlNUZW1wICwjLThdCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgZmlsdCwgbTAxCisgICAgICAgIFRTVCAgICAgYlNUZW1wLCAjMHhmZjAwCisgICAgICAgIE1PVkVRICAgZmlsdCwgZmlsdCwgTFNMICMxNgorICAgICAgICBUU1QgICAgIGJTVGVtcCwgIzB4ZmYKKyAgICAgICAgTU9WRVEgICBmaWx0LCBmaWx0LCBMU1IgIzE2CisgICAgICAgIFRTVCAgICAgYlNUZW1wLCAjNAorCisgICAgICAgIDsvLyBDaGVjayB8cDAtcTB8PEFscGhhIAorICAgICAgICBVU1VCOCAgIGEsIHFfMCwgcF8wCisgICAgICAgIFNFTCAgICAgYXAwcTAsIGEsIGRwMHEwCisgICAgICAgIFVTVUI4ICAgYSwgYXAwcTAsIGFscGhhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgfHAxLXAwfDxCZXRhIAorICAgICAgICBVU1VCOCAgIGRwMXAwLCBwXzEsIHBfMAorICAgICAgICBVU1VCOCAgIGEsIHBfMCwgcF8xCisgICAgICAgIFNFTCAgICAgYSwgYSwgZHAxcDAKKyAgICAgICAgVVNVQjggICBhLCBhLCBiZXRhCisgICAgICAgIFNFTCAgICAgZmlsdCwgbTAwLCBmaWx0CisKKyAgICAgICAgOy8vIENoZWNrIHxxMS1xMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcTFxMCwgcV8xLCBxXzAKKyAgICAgICAgVVNVQjggICBhLCBxXzAsIHFfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRxMXEwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIEJFUSAgICAgYlNMVDQgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBDTVAgICAgIGZpbHQsICMwCisKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisKKyAgICAgICAgOy8vIENvbXB1dGUgUDBiCisgICAgICAgIFVIQUREOCAgdDEsIHBfMCwgcV8xCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorICAgICAgICBNVk4gICAgIHQyLCBwXzEKKyAgICAgICAgVUhTVUI4ICB0MSwgdDEsIHQyCisgICAgICAgIFVTVUI4ICAgdDIsIGZpbHQsIG0wMQorICAgICAgICBFT1IgICAgIHQxLCB0MSwgbTAxLCBMU0wgIzcKKworICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLHBUaHJlc2hvbGRzLCAjNAorICAgICAgICAKKyAgICAgICAgOy8vIENvbXB1dGUgUTBiIAorICAgICAgICBVSEFERDggIHQyLCBxXzAsIHBfMQorICAgICAgICBNVk4gICAgIHQzLCBxXzEKKyAgICAgICAgVUhTVUI4ICB0MiwgdDIsIHQzCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBTRUwgICAgIFBfMCwgdDEsIHBfMAorICAgICAgICBFT1IgICAgIHQyLCB0MiwgbTAxLCBMU0wgIzcKKyAgICAgICAgU0VMICAgICBRXzAsIHQyLCBxXzAKKworICAgICAgICBCICAgICAgIFN0b3JlUmVzdWx0QW5kRXhpdAorCis7Ly8tLS0tLS0tLS0tIEV4aXQgb2YgTG9vcFggLS0tLS0tLS0tLS0tLS0KKzsvLy0tLS0gZm9yIHRoZSBjYXNlIG9mIG5vIGZpbHRlcmluZyAtLS0tLQorCitOb0ZpbHRlckZpbHQwCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICMyCitOb0ZpbHRlckJTMAorICAgICAgICBNX0xEUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcgorICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWQorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorICAgICAgICAKK2JTTFQ0ICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tYlNMVDQgRXhlY3V0aW9uLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIAorCisgICAgICAgIDsvLyBTaW5jZSBiZXRhIDw9IDE4IGFuZCBhbHBoYSA8PSAyNTUgd2Uga25vdworICAgICAgICA7Ly8gLTI1NCA8PSBwMC1xMCA8PSAyNTQKKyAgICAgICAgOy8vICAtMTcgPD0gcTEtcTAgPD0gMTcKKyAgICAgICAgOy8vICAtMTcgPD0gcDEtcDAgPD0gMTcKKworICAgICAgICA7Ly8gZGVsdGEgPSBDbGlwMyggLXRDLCB0QywgKCgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMpKQorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyAgICBDYWxjdWxhdGUgQSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCk+PjMKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgID0gKDQqcTAgLSA0KnAwICsgcDEgLSBxMSArIDQpPj4zCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICA9ICgocDEtcDApIC0gKHExLXEwKSAtIDMqKHAwLXEwKSArIDQpPj4zCisKKyAgICAgICAgVVNVQjggICB0MSwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICB0MiwgcV8xLCBxXzAKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3BUaHJlc2hvbGRzXSwgIzEKKyAgICAgICAgU1NVQjggICB0MSwgdDEsIHQyCisgICAgICAgIExEUkIgICAgdEMxLCBbcFRocmVzaG9sZHNdLCAjMworICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgVUhTVUI4ICB0NCwgcF8wLCBxXzAKKyAgICAgICAgT1JSICAgICB0QywgdEMxLCB0QzAsIExTTCAjMTYKKyAgICAgICAgVVNVQjggICB0NSwgcF8wLCBxXzAKKyAgICAgICAgQU5EICAgICB0NSwgdDUsIG0wMQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDUKKyAgICAgICAgT1JSICAgICB0QywgdEMsIExTTCAjOCAgICAgICAgCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCB0NQorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgVVFBREQ4ICB0QywgdEMsIG0wMQorICAgICAgICBTQUREOCAgIHQxLCB0MSwgbTAxCisgICAgICAgIFVTVUI4ICAgdDUsIGZpbHQsIG0wMSAgIAorICAgICAgICBTSFNVQjggIHQxLCB0MSwgdDQKKyAgICAgICAgU0VMICAgICB0QywgdEMsIG0wMAorCisgICAgICAgIDsvLyBTcGxpdCBpbnRvIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0IGFuZCBjbGlwIAorCisgICAgICAgIFNTVUI4ICAgdDEsIHQxLCBtMDAKKyAgICAgICAgU0VMICAgICBwb3MsIHQxLCBtMDAKKyAgICAgICAgVVNVQjggICBuZWcsIHBvcywgdDEKKyAgICAgICAgVVNVQjggICB0MywgcG9zLCB0QworICAgICAgICBTRUwgICAgIHBvcywgdEMsIHBvcworICAgICAgICBVU1VCOCAgIHQzLCBuZWcsIHRDCisgICAgICAgIFNFTCAgICAgbmVnLCB0QywgbmVnCisgICAgICAgIFVRQUREOCAgUF8wLCBwXzAsIHBvcworICAgICAgICBVUVNVQjggIFFfMCwgcV8wLCBwb3MKKyAgICAgICAgVVFTVUI4ICBQXzAsIFBfMCwgbmVnCisgICAgICAgIFVRQUREOCAgUV8wLCBRXzAsIG5lZworICAgICAgICAKKyAgICAgICAgOy8vIENob29zZSB0byBzdG9yZSB0aGUgZmlsdGVyZWQKKyAgICAgICAgOy8vIHZhbHVlIG9yIHRoZSBvcmlnaW5hbCBwaXhlbAorICAgICAgICBVU1VCOCAgIHQxLCBmaWx0LCBtMDEgICAgCisgICAgICAgIFNFTCAgICAgUF8wLCBQXzAsIHBfMAorICAgICAgICBTRUwgICAgIFFfMCwgUV8wLCBxXzAKKyAgICAKK1N0b3JlUmVzdWx0QW5kRXhpdAorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIDsvLyBQXzAgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFFfMCA9IFtyMHEwIHIxcTAgcjJxMCByM3EwXQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgICAgIHBRMCwgcFEwLCAjMSAgICAgIAorIAorICAgICAgICBNT1YgICAgIHQxLCBRXzAsIExTUiAjMjQKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMCwgIzFdCisgICAgICAgIE1PViAgICAgdDEsIFBfMCwgTFNSICMyNAorICAgICAgICBNX1NUUkIgIHQxLCBbcFEwXSwgc3JjZHN0U3RlcAorCisgICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICMxNgorICAgICAgICBTVFJCICAgIHQxLCBbcFEwLCAjMV0KKyAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzE2CisgICAgICAgIE1fU1RSQiAgdDEsIFtwUTBdLCBzcmNkc3RTdGVwCisKKyAgICAgICAgTU9WICAgICB0MSwgUF8wLCBMU1IgIzgKKyAgICAgICAgU1RSQiAgICB0MSwgW3BRMF0KKyAgICAgICAgU1RSQiAgICBQXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCisgICAgICAgIE1PViAgICAgdDEsIFFfMCwgTFNSICM4CisgICAgICAgIFNUUkIgICAgdDEsIFtwUTAsICMxXSEKKyAgICAgICAgU1RSQiAgICBRXzAsIFtwUTAsIHNyY2RzdFN0ZXBdCisKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCisKK0V4aXRMb29wWQorCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjOAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE0IAorICAgICAgICBTVUIgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzYKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCis7Ly8tLS0tLS0tLS0tLS0tLS0tLUVuZCBGaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODQwODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpAQCAtMCwwICsxLDMzMSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNHRTRfdW5zYWZlCisKKyAgICAKKworICAgIElGIEFSTTExMzZKUworCisKK01BU0tfMCAgICAgIEVRVSAweDAwMDAwMDAwICAgCitNQVNLXzEgICAgICBFUVUgMHgwMTAxMDEwMQorTUFTS18yICAgICAgRVFVIDB4ZmYwMGZmMDAKK0xPT1BfQ09VTlQgIEVRVSAweDExMTEwMDAwCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGFBcmcgICBSTiAyCitwQmV0YUFyZyAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDE0CitwQlMgICAgICAgICBSTiA5CitwUTAgICAgICAgICBSTiAwCitiUyAgICAgICAgICBSTiAyCisKK2FscGhhICAgICAgIFJOIDYKK2FscGhhMCAgICAgIFJOIDYKK2FscGhhMSAgICAgIFJOIDgKKworYmV0YSAgICAgICAgUk4gNworYmV0YTAgICAgICAgUk4gNworYmV0YTEgICAgICAgUk4gOQorCis7Ly8gRGVjbGFyZSBMb2NhbC9UZW1wb3JhcnkgdmFyaWFibGVzCisKKzsvLyBQaXhlbHMKK3BfMCAgICAgICAgIFJOIDMgIAorcF8xICAgICAgICAgUk4gNSAgCitwXzIgICAgICAgICBSTiA0ICAKK3BfMyAgICAgICAgIFJOIDIgIAorcV8wICAgICAgICAgUk4gOCAgCitxXzEgICAgICAgICBSTiA5ICAKK3FfMiAgICAgICAgIFJOIDEwIAorcV8zICAgICAgICAgUk4gMTIgCisKKzsvLyBGaWx0ZXJpbmcKKworZHAwcTAgICAgICAgUk4gMTIKK2RwMXAwICAgICAgIFJOIDEyCitkcTFxMCAgICAgICBSTiAxMgorZHAycDAgICAgICAgUk4gMTIKK2RxMnEwICAgICAgIFJOIDEyCisgICAgICAgICAgICAKK2FwMHEwICAgICAgIFJOIDEgIAorZmlsdCAgICAgICAgUk4gMgorICAgICAgICAKK20wMCAgICAgICAgIFJOIDE0CittMDEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCithcGZsZyAgICAgICBSTiAwIAorYXFmbGcgICAgICAgUk4gNgorYXBxZmxnICAgICAgUk4gMAorICAgICAgICAgICAgCisKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNMVDQga2VybmVsCisKK3RDMCAgICAgICAgIFJOIDcKK3B0QzAgICAgICAgIFJOIDEKKworcFEwYSAgICAgICAgUk4gMCAgICAKK1N0ZXBhICAgICAgIFJOIDEgICAgCittYXNrYSAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGEgICAgICAgICBSTiAxCitQMWEgICAgICAgICBSTiA4CitRMGEgICAgICAgICBSTiA3CitRMWEgICAgICAgICBSTiAxMQorICAgICAgICAgICAgCis7Ly9EZWNsYXJhdGlvbnMgZm9yIGJTR0U0IGtlcm5lbAorCitwUTBiICAgICAgICBSTiAwCitTdGVwYiAgICAgICBSTiAxCittYXNrYiAgICAgICBSTiAxNAorICAgICAgICAgICAgCitQMGIgICAgICAgICBSTiA2CitQMWIgICAgICAgICBSTiA3CitQMmIgICAgICAgICBSTiAxCitQM2IgICAgICAgICBSTiAzCisgICAgICAgICAgICAKK1EwYiAgICAgICAgIFJOIDkgCitRMWIgICAgICAgICBSTiAwICAgCitRMmIgICAgICAgICBSTiAyIAorUTNiICAgICAgICAgUk4gMyAKKworOy8vIE1pc2NlbGxhbm91cworWFkgICAgICAgICAgUk4gOAordDAgICAgICAgICAgUk4gMyAKK3QxICAgICAgICAgIFJOIDEyCit0MiAgICAgICAgICBSTiAxNAordDcgICAgICAgICAgUk4gNwordDQgICAgICAgICAgUk4gNAordDUgICAgICAgICAgUk4gMSAgCit0OCAgICAgICAgICBSTiA2ICAKK2EgICAgICAgICAgIFJOIDAKKworICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgCisgICAgICAgIE1fQUxMT0M0IHBwVGhyZXNob2xkcyw0CisgICAgICAgIE1fQUxMT0M0IHBRXzMsNAorICAgICAgICBNX0FMTE9DNCBwUF8zLDQKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTAsOAorICAgICAgICBNX0FMTE9DOCBwQWxwaGFCZXRhMSw4CisgICAgICAgIE1fQUxMT0M4IHBYWUJTLDQKKyAgICAgICAgTV9BTExPQzQgcHBCUyw0CisgICAgICAgIE1fQUxMT0M4IHBwUTBTdGVwLDQKKyAgICAgICAgTV9BTExPQzQgcFN0ZXAsNAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvL0lucHV0IGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHNBcmcsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTQXJnLCA0CisKKyAgICAgICAgTERSICAgICB0NCw9TUFTS18xCisKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQorICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQorCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0CisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAorICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKKworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisgICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworTG9vcFkKK0xvb3BYCis7Ly8tLS0tLS0tLS0tLS0tLS1Mb2FkIFBpeGVscy0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgTV9TVFIgICBwUTAsIHBwUTBTdGVwCisgICAgICAgIE1fTERSICAgcF8zLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHBfMiwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9TVFIgICBwXzMsIHBQXzMKKyAgICAgICAgTERSQiAgICBiUywgW3BCU10sICMxCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgcF8xLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgIGJTLCAjMAorICAgICAgICBNX0xEUiAgIHBfMCwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzAsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIE1fTERSICAgcV8xLCBbcFEwXSwgc3JjZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHFfMiwgW3BRMF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgTV9MRFIgICBxXzMsIFtwUTBdLCBzcmNkc3RTdGVwCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgQ01QICAgICBiUywgIzQKKyAgICAgICAgTV9TVFIgICBxXzMsIHBRXzMKKworOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKKyAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKKyAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQorCisgICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAorICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgorICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKKyAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKKyAgICAgICAgTU9WICAgICB0NywjMAorCisgICAgICAgIEJMVCAgICAgYlNMVDQgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLUZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCitiU0dFNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTR0U0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTRUwgICAgIHQxLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAorICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIE9SUiAgICAgYXBxZmxnLCBhcGZsZywgdDEsIExTTCAjMQorICAgICAgICBNX0xEUkQgIHBRMCwgc3JjZHN0U3RlcCwgcHBRMFN0ZXAsIEVRCisgICAgICAgIEJFUSAgICAgTm9GaWx0ZXJGaWx0MAorCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tU3RvcmUgcmVzdWx0LS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNT1YgICAgIHBfMiwgUTFiCisgICAgICAgIE1PViAgICAgcF8xLCBQMmIKKyAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKKyAgICAgICAgQUREICAgICBwVGhyZXNob2xkcywgIzEKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgcF8xLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBNX1NUUiAgIFAxYiwgW3BRMGIsIFN0ZXBiXSEKKyAgICAgICAgTV9TVFIgICBQMGIsIFtwUTBiLCBTdGVwYl0hCisgICAgICAgIE1fU1RSICAgUTBiLCBbcFEwYiwgU3RlcGJdIQorICAgICAgICBTVFIgICAgIHBfMiwgW3BRMGIsIFN0ZXBiXQorICAgICAgICBTVFIgICAgIFEyYiwgW3BRMGIsIFN0ZXBiLCBMU0wgIzFdCisKKworICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYiwgTFNMICMyCisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsICM0CisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisKKzsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQorOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCisKK05vRmlsdGVyQlMwCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMworTm9GaWx0ZXJGaWx0MAorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCAjNAorICAgICAgICA7Ly8gTG9hZCBjb3VudGVyIGZvciBMb29wWAorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX0xEUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMQorICAgICAgICBNX1NUUiAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICBCICAgICAgIEV4aXRMb29wWQorCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAorICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcworICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjMQorICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcworCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICBNT1YgICAgIHBfMiwgUDBhCisgICAgICAgIE1fTERSRCAgcFEwYSwgU3RlcGEsIHBwUTBTdGVwCisgICAgICAgIE1fU1RSICAgUDFhLCBbcFEwYSwgU3RlcGEsIExTTCAjMV0hCisgICAgICAgIE1fU1RSICAgcF8yLCBbcFEwYSwgU3RlcGFdIQorICAgICAgICBNX1NUUiAgIFEwYSwgW3BRMGEsIFN0ZXBhXSEKKyAgICAgICAgU1RSICAgICBRMWEsIFtwUTBhLCBTdGVwYV0KKyAgICAgICAKKyAgICAgICAgOy8vIExvYWQgY291bnRlcgorICAgICAgICBNX0xEUkQgIFhZLCBwQlMsIHBYWUJTCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGEwCisKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMGEsIFN0ZXBhLCBMU0wgIzIKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICAKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCitFeGl0TG9vcFkKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKyAgICAgICAgU1VCICAgICBwUTAsIHBRMCwgIzE2CisgICAgICAgIEFERCAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBNX1NUUkQgIGFscGhhLCBiZXRhLCBwQWxwaGFCZXRhMAorCisgICAgICAgIEJORSAgICAgTG9vcFkKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfTm9FcnIKKzsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRiAgICAgICAgCisgICAgICAgIAorCisgICAgICAgIEVORAorICAgICAgICAKKyAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdkZGMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKQEAgLTAsMCArMSw1NTAgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgICAgICAKKyAgICAKKyAgICBJRiBBUk0xMTM2SlMKKworTUFTS18wICAgICAgRVFVIDB4MDAwMDAwMDAgICAKK01BU0tfMSAgICAgIEVRVSAweDAxMDEwMTAxCitNQVNLXzIgICAgICBFUVUgMHhmZjAwZmYwMAorTE9PUF9DT1VOVCAgRVFVIDB4MTExMTAwMDAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYUFyZyAgIFJOIDIKK3BCZXRhQXJnICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gMTQKK3BCUyAgICAgICAgIFJOIDkKK3BRMCAgICAgICAgIFJOIDAKK2JTICAgICAgICAgIFJOIDIKKworYWxwaGEgICAgICAgUk4gNgorYWxwaGEwICAgICAgUk4gNgorYWxwaGExICAgICAgUk4gOAorCitiZXRhICAgICAgICBSTiA3CitiZXRhMCAgICAgICBSTiA3CitiZXRhMSAgICAgICBSTiA5CisKKzsvLyBEZWNsYXJlIExvY2FsL1RlbXBvcmFyeSB2YXJpYWJsZXMKKworOy8vIFBpeGVscworcF8wICAgICAgICAgUk4gMyAgCitwXzEgICAgICAgICBSTiA1ICAKK3BfMiAgICAgICAgIFJOIDQgIAorcF8zICAgICAgICAgUk4gMiAgCitxXzAgICAgICAgICBSTiA4ICAKK3FfMSAgICAgICAgIFJOIDkgIAorcV8yICAgICAgICAgUk4gMTAgCitxXzMgICAgICAgICBSTiAxMiAKKworOy8vIFVucGFja2luZworbWFzayAgICAgICAgUk4gMTEgCisKK3JvdzAgICAgICAgIFJOIDIKK3JvdzEgICAgICAgIFJOIDQKK3JvdzIgICAgICAgIFJOIDUKK3JvdzMgICAgICAgIFJOIDMKKworcm93NCAgICAgICAgUk4gOAorcm93NSAgICAgICAgUk4gOQorcm93NiAgICAgICAgUk4gMTAKK3JvdzcgICAgICAgIFJOIDEyCityb3c4ICAgICAgICBSTiAxNAorcm93OSAgICAgICAgUk4gNworICAgICAgICAgICAgCit0dW5wazAgICAgICBSTiA4Cit0dW5wazEgICAgICBSTiA5Cit0dW5wazIgICAgICBSTiAxMAordHVucGszICAgICAgUk4gMTIKK3R1bnBrNCAgICAgIFJOIDAKKwordHVucGs1ICAgICAgUk4gMQordHVucGs2ICAgICAgUk4gMTQKK3R1bnBrNyAgICAgIFJOIDIgCit0dW5wazggICAgICBSTiA1IAordHVucGs5ICAgICAgUk4gNiAKKyAKKworOy8vIEZpbHRlcmluZworCitkcDBxMCAgICAgICBSTiAxMgorZHAxcDAgICAgICAgUk4gMTIKK2RxMXEwICAgICAgIFJOIDEyCitkcDJwMCAgICAgICBSTiAxMgorZHEycTAgICAgICAgUk4gMTIKKyAgICAgICAgICAgIAorYXAwcTAgICAgICAgUk4gMSAgCitmaWx0ICAgICAgICBSTiAyCisgICAgICAgIAorbTAwICAgICAgICAgUk4gMTQKK20wMSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKK2FwZmxnICAgICAgIFJOIDAgCithcWZsZyAgICAgICBSTiA2CithcHFmbGcgICAgICBSTiAwCisgICAgICAgICAgICAKKworOy8vRGVjbGFyYXRpb25zIGZvciBiU0xUNCBrZXJuZWwKKwordEMwICAgICAgICAgUk4gNworcHRDMCAgICAgICAgUk4gMQorCitwUTBhICAgICAgICBSTiAwICAgIAorU3RlcGEgICAgICAgUk4gMSAgICAKK21hc2thICAgICAgIFJOIDE0CisgICAgICAgICAgICAKK1AwYSAgICAgICAgIFJOIDEKK1AxYSAgICAgICAgIFJOIDgKK1EwYSAgICAgICAgIFJOIDcKK1ExYSAgICAgICAgIFJOIDExCisgICAgICAgICAgICAKKzsvL0RlY2xhcmF0aW9ucyBmb3IgYlNHRTQga2VybmVsCisKK3BRMGIgICAgICAgIFJOIDAKK1N0ZXBiICAgICAgIFJOIDEKK21hc2tiICAgICAgIFJOIDE0CisgICAgICAgICAgICAKK1AwYiAgICAgICAgIFJOIDYKK1AxYiAgICAgICAgIFJOIDcKK1AyYiAgICAgICAgIFJOIDEKK1AzYiAgICAgICAgIFJOIDMKKyAgICAgICAgICAgIAorUTBiICAgICAgICAgUk4gOSAKK1ExYiAgICAgICAgIFJOIDAgICAKK1EyYiAgICAgICAgIFJOIDIgCitRM2IgICAgICAgICBSTiAzIAorCis7Ly8gTWlzY2VsbGFub3VzCitYWSAgICAgICAgICBSTiA4Cit0MCAgICAgICAgICBSTiAzIAordDEgICAgICAgICAgUk4gMTIKK3QyICAgICAgICAgIFJOIDE0Cit0NyAgICAgICAgICBSTiA3Cit0NCAgICAgICAgICBSTiA0Cit0NSAgICAgICAgICBSTiAxICAKK3Q4ICAgICAgICAgIFJOIDYgIAorYSAgICAgICAgICAgUk4gMAorCisgICAgICAgICAgICAKKworICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IAorICAgICAgICBNX0FMTE9DNCBwcFRocmVzaG9sZHMsNAorICAgICAgICBNX0FMTE9DNCBwUV8zLDQKKyAgICAgICAgTV9BTExPQzQgcFBfMyw0CisgICAgICAgIE1fQUxMT0M4IHBBbHBoYUJldGEwLDgKKyAgICAgICAgTV9BTExPQzggcEFscGhhQmV0YTEsOAorICAgICAgICBNX0FMTE9DOCBwWFlCUyw0CisgICAgICAgIE1fQUxMT0M0IHBwQlMsNAorICAgICAgICBNX0FMTE9DOCBwcFEwU3RlcCw0CisgICAgICAgIE1fQUxMT0M0IHBTdGVwLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgcjExCisgICAgICAgIAorICAgICAgICA7Ly9JbnB1dCBhcmd1bWVudHMgb24gdGhlIHN0YWNrCisgICAgICAgIE1fQVJHICAgcHBUaHJlc2hvbGRzQXJnLCA0CisgICAgICAgIE1fQVJHICAgcHBCU0FyZywgNAorICAgICAgICAKKyAgICAgICAgTERSICAgICB0NCw9TUFTS18xCisKKyAgICAgICAgTERSQiAgICBhbHBoYTAsIFtwQWxwaGFBcmddCisgICAgICAgIExEUkIgICAgYmV0YTAsICBbcEJldGFBcmddCisgICAgICAgIExEUkIgICAgYWxwaGExLCBbcEFscGhhQXJnLCMxXQorICAgICAgICBMRFJCICAgIGJldGExLCAgW3BCZXRhQXJnLCMxXQorCisgICAgICAgIE1VTCAgICAgYWxwaGEwLCBhbHBoYTAsIHQ0CisgICAgICAgIE1VTCAgICAgYmV0YTAsIGJldGEwLCB0NAorICAgICAgICBNVUwgICAgIGFscGhhMSwgYWxwaGExLCB0NAorICAgICAgICBNVUwgICAgIGJldGExLCBiZXRhMSwgdDQKKworICAgICAgICBNX1NUUkQgIGFscGhhMCwgYmV0YTAsIHBBbHBoYUJldGEwCisgICAgICAgIE1fU1RSRCAgYWxwaGExLCBiZXRhMSwgcEFscGhhQmV0YTEKKworICAgICAgICBMRFIgICAgIFhZLD1MT09QX0NPVU5UCisgICAgICAgIE1fTERSICAgcEJTLCBwcEJTQXJnCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkc0FyZworICAgICAgICBNX1NUUiAgIHNyY2RzdFN0ZXAsIHBTdGVwCisgICAgICAgIE1fU1RSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIAorICAgICAgICBTVUIgICAgIHBRMCwgcFEwLCAjNAorTG9vcFkKKzsvLy0tLS0tLS0tLS0tLS0tLUxvYWQgUGl4ZWxzLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tUGFjayBwMC1wMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIExEUiAgICAgbWFzaywgPU1BU0tfMgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICByb3cwLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKKyAgICAgICAgTV9MRFIgICByb3cxLCBbcFEwXSwgc3JjZHN0U3RlcCAgICAgICAgICAKKyAgICAgICAgTERSICAgICByb3cyLCBbcFEwXQorICAgICAgICBMRFIgICAgIHJvdzMsIFtwUTAsIHNyY2RzdFN0ZXBdCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsIHNyY2RzdFN0ZXAsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgOy8vIHJvdzAgPSBbcjBwMCByMHAxIHIwcDIgcjBwM10KKyAgICAgICAgOy8vIHJvdzEgPSBbcjFwMCByMXAxIHIxcDIgcjFwM10KKyAgICAgICAgOy8vIHJvdzIgPSBbcjJwMCByMnAxIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHJvdzMgPSBbcjNwMCByM3AxIHIzcDIgcjNwM10KKworICAgICAgICBBTkQgICAgIHR1bnBrMCwgbWFzaywgcm93MAorICAgICAgICBBTkQgICAgIHR1bnBrNiwgbWFzaywgcm93MCwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazAsIHR1bnBrMCwgcm93MSwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazYsIHR1bnBrNiwgcm93MQorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFzaywgcm93MgorICAgICAgICBBTkQgICAgIHR1bnBrMywgbWFzaywgcm93MiwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgcm93MywgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazMsIHR1bnBrMywgcm93MworCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBwMCByMXAwIHIwcDIgcjFwMl0KKyAgICAgICAgOy8vIHR1bnBrNiA9IFtyMHAxIHIxcDEgcjBwMyByMXAzXQorICAgICAgICA7Ly8gdHVucGsyID0gW3IycDAgcjNwMCByMnAyIHIzcDJdCisgICAgICAgIDsvLyB0dW5wazMgPSBbcjJwMSByM3AxIHIycDMgcjNwM10KKworICAgICAgICBQS0hUQiAgIHBfMCwgdHVucGswLCB0dW5wazIsIEFTUiMxNgorICAgICAgICBQS0hUQiAgIHBfMSwgdHVucGs2LCB0dW5wazMsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHBfMiwgdHVucGsyLCB0dW5wazAsIExTTCMxNgorICAgICAgICBQS0hCVCAgIHBfMywgdHVucGszLCB0dW5wazYsIExTTCMxNgorCisKKyAgICAgICAgOy8vIHBfMCA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQorICAgICAgICA7Ly8gcF8xID0gW3IwcDEgcjFwMSByMnAxIHIzcDFdCisgICAgICAgIDsvLyBwXzIgPSBbcjBwMiByMXAyIHIycDEgcjNwMl0KKyAgICAgICAgOy8vIHBfMyA9IFtyMHAzIHIxcDMgcjJwMyByM3AzXQorCisgICAgICAgIE1fU1RSICAgcF8zLCBwUF8zCisKKzsvLy0tLS0tLS0tLS0tLS0tLS1QYWNrIHEwLXEzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xvb3BYCisgICAgICAgIExEUkIgICAgYlMsIFtwQlNdLCAjNAorICAgICAgICBNX1NUUiAgIHBRMCwgcHBRMFN0ZXAKKyAgICAgICAgTERSICAgICBtYXNrLCA9TUFTS18yCisgICAgICAgIENNUCAgICAgYlMsICMwCisgICAgICAgIE1fU1RSICAgcEJTLCBwcEJTCisKKyAgICAgICAgTERSICAgICByb3c0LCBbcFEwLCAjNF0hCisgICAgICAgIEJFUS5XICAgTm9GaWx0ZXJCUzAKKyAgICAgICAgTV9MRFIgICByb3c1LCBbcFEwLCBzcmNkc3RTdGVwXSEKKyAgICAgICAgTV9MRFIgICByb3c2LCBbcFEwLCBzcmNkc3RTdGVwXSEKKyAgICAgICAgTV9MRFIgICByb3c3LCBbcFEwLCBzcmNkc3RTdGVwXQorCisgICAgICAgIDsvLyByb3c0ID0gW3IwcTMgcjBxMiByMHExIHIwcTBdCisgICAgICAgIDsvLyByb3c1ID0gW3IxcTMgcjFxMiByMXExIHIxcTBdCisgICAgICAgIDsvLyByb3c2ID0gW3IycTMgcjJxMiByMnExIHIycTBdCisgICAgICAgIDsvLyByb3c3ID0gW3IzcTMgcjNxMiByM3ExIHIzcTBdCisgICAgCisgICAgICAgIEFORCAgICAgdHVucGs0LCBtYXNrLCByb3c0CisgICAgICAgIENNUCAgICAgYlMsICM0CisgICAgICAgIEFORCAgICAgdHVucGs1LCBtYXNrLCByb3c0LCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNCwgdHVucGs0LCByb3c1LCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNSwgdHVucGs1LCByb3c1CisgICAgICAgIEFORCAgICAgdHVucGs2LCBtYXNrLCByb3c2CisgICAgICAgIEFORCAgICAgdHVucGs3LCBtYXNrLCByb3c2LCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNiwgdHVucGs2LCByb3c3LCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrNywgdHVucGs3LCByb3c3CisKKyAgICAgICAgOy8vIHR1bnBrNCA9IFtyMHEwIHIxcTAgcjBxMiByMXEyXQorICAgICAgICA7Ly8gdHVucGs1ID0gW3IwcTEgcjFxMSByMHEzIHIxcTNdCisgICAgICAgIDsvLyB0dW5wazYgPSBbcjJxMCByM3EwIHIycTIgcjNxMl0KKyAgICAgICAgOy8vIHR1bnBrNyA9IFtyMnExIHIzcTEgcjJxMyByM3EzXQorCisgICAgICAgIFBLSFRCICAgcV8zLCB0dW5wazQsIHR1bnBrNiwgQVNSIzE2CisgICAgICAgIFBLSFRCICAgcV8yLCB0dW5wazUsIHR1bnBrNywgQVNSIzE2CisgICAgICAgIFBLSEJUICAgcV8xLCB0dW5wazYsIHR1bnBrNCwgTFNMIzE2CisgICAgICAgIE1fU1RSICAgcV8zLCBwUV8zCisgICAgICAgIFBLSEJUICAgcV8wLCB0dW5wazcsIHR1bnBrNSwgTFNMIzE2CisKKworICAgICAgICA7Ly8gcV8wID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBxXzEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKyAgICAgICAgOy8vIHFfMiA9IFtyMHEyIHIxcTIgcjJxMSByM3EyXQorICAgICAgICA7Ly8gcV8zID0gW3IwcTMgcjFxMyByMnEzIHIzcTNdCisKKworOy8vLS0tLS0tLS0tLS0tLS1GaWx0ZXJpbmcgRGVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBMRFIgICAgIG0wMSwgPU1BU0tfMSAgICAgICAgICAgICAgICA7Ly8gIDAxMDEwMTAxIG1hc2sgCisgICAgICAgIE1PViAgICAgbTAwLCAjTUFTS18wICAgICAgICAgICAgICAgIDsvLyAgMDAwMDAwMDAgbWFzayAKKworICAgICAgICA7Ly8gQ2hlY2sgfHAwLXEwfDxBbHBoYSAKKyAgICAgICAgVVNVQjggICBkcDBxMCwgcF8wLCBxXzAgCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBwXzAKKyAgICAgICAgU0VMICAgICBhcDBxMCwgYSwgZHAwcTAKKyAgICAgICAgVVNVQjggICBhLCBhcDBxMCwgYWxwaGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIG0wMQorICAgICAgICAKKyAgICAgICAgOy8vIENoZWNrIHxwMS1wMHw8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDFwMCwgcF8xLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMQorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMXAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGZpbHQsIG0wMCwgZmlsdAorCisgICAgICAgIDsvLyBDaGVjayB8cTEtcTB8PEJldGEgCisgICAgICAgIFVTVUI4ICAgZHExcTAsIHFfMSwgcV8wCisgICAgICAgIFVTVUI4ICAgYSwgcV8wLCBxXzEKKyAgICAgICAgU0VMICAgICBhLCBhLCBkcTFxMAorICAgICAgICBVU1VCOCAgIGEsIGEsIGJldGEKKyAgICAgICAgU0VMICAgICBmaWx0LCBtMDAsIGZpbHQKKworICAgICAgICA7Ly8gQ2hlY2sgYXA8QmV0YSAKKyAgICAgICAgVVNVQjggICBkcDJwMCwgcF8yLCBwXzAKKyAgICAgICAgVVNVQjggICBhLCBwXzAsIHBfMgorICAgICAgICBTRUwgICAgIGEsIGEsIGRwMnAwCisgICAgICAgIFVTVUI4ICAgYSwgYSwgYmV0YQorICAgICAgICBTRUwgICAgIGFwZmxnLCBtMDAsIGZpbHQgICAgICAgICAgICA7Ly8gYXBmbGcgPSBmaWx0ICYmIChhcDxiZXRhKQorCisgICAgICAgIDsvLyBDaGVjayBhcTxCZXRhIAorICAgICAgICBVU1VCOCAgIGRxMnEwLCBxXzIsIHFfMAorICAgICAgICBVU1VCOCAgIHQyLCBxXzAsIHFfMgorICAgICAgICBTRUwgICAgIHQyLCB0MiwgZHEycTAKKyAgICAgICAgVVNVQjggICB0MiwgdDIsIGJldGEKKyAgICAgICAgTU9WICAgICB0NywjMAorICAgICAgICAKKworICAgICAgICBCTFQgICAgIGJTTFQ0ICAgICAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS1GaWx0ZXItLS0tLS0tLS0tLS0tLS0tLS0tLQorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS1iU0dFNCBFeGVjdXRpb24tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgU0VMICAgICB0MSwgdDcsIGZpbHQgICAgICAgICAgICA7Ly8gYXFmbGcgPSBmaWx0ICYmIChhcTxiZXRhKSAKKyAgICAgICAgQ01QICAgICBmaWx0LCAjMAorICAgICAgICBPUlIgICAgIGFwcWZsZywgYXBmbGcsIHQxLCBMU0wgIzEKKyAgICAgICAgTV9MRFJEICBwUTAsIHNyY2RzdFN0ZXAsIHBwUTBTdGVwLCBFUQorICAgICAgICBCRVEgICAgIE5vRmlsdGVyRmlsdDAKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIExEUiAgICAgbWFza2IsPU1BU0tfMgorCisgICAgICAgIDsvLyBQMGIgPSBbcjBwMCByMXAwIHIycDAgcjNwMF0KKyAgICAgICAgOy8vIFAxYiA9IFtyMHAxIHIxcDEgcjJwMSByM3AxXQorICAgICAgICA7Ly8gUDJiID0gW3IwcDIgcjFwMiByMnAyIHIzcDJdCisgICAgICAgIDsvLyBQM2IgPSBbcjBwMyByMXAzIHIycDMgcjNwM10KKworICAgICAgICBNX0xEUiAgIFAzYiwgcFBfMyAgIAorICAgICAgICBNX1NUUiAgIFEwYiwgcFBfMyAgIAorCisgICAgICAgIDsvLy0tLS0tLVBhY2sgcDAtcDMtLS0tLS0KKyAgICAgICAgQU5EICAgICB0dW5wazAsIG1hc2tiLCBQMGIKKyAgICAgICAgQU5EICAgICB0dW5wazIsIG1hc2tiLCBQMGIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGswLCB0dW5wazAsIFAxYiwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazIsIHR1bnBrMiwgUDFiCisKKyAgICAgICAgQU5EICAgICB0dW5wazMsIG1hc2tiLCBQMmIKKyAgICAgICAgQU5EICAgICB0dW5wazgsIG1hc2tiLCBQMmIsIExTTCM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFAzYiwgUk9SIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazgsIHR1bnBrOCwgUDNiCisKKyAgICAgICAgOy8vIHR1bnBrMCA9IFtyMHAwIHIwcDEgcjJwMCByMnAxXQorICAgICAgICA7Ly8gdHVucGsyID0gW3IxcDAgcjFwMSByM3AwIHIzcDFdCisgICAgICAgIDsvLyB0dW5wazMgPSBbcjBwMiByMHAzIHIycDIgcjJwM10KKyAgICAgICAgOy8vIHR1bnBrOCA9IFtyMXAyIHIxcDMgcjNwMiByM3AzXQorCisgICAgICAgIE1PViAgICAgcF8yLCBRMWIKKyAgICAgICAgTV9MRFJEICBwUTBiLCBTdGVwYiwgcHBRMFN0ZXAKKworICAgICAgICBQS0hUQiAgIHJvdzksIHR1bnBrMCwgdHVucGszLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazMsIHR1bnBrMCwgTFNMIzE2CisgICAgICAgIFBLSFRCICAgcm93MywgdHVucGsyLCB0dW5wazgsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrOCwgdHVucGsyLCBMU0wjMTYKKworICAgICAgICA7Ly8gcm93OSA9IFtyMHAwIHIwcDEgcjBwMiByMHAzXQorICAgICAgICA7Ly8gcm93MyA9IFtyMXAwIHIxcDEgcjFwMiByMXAzXQorICAgICAgICA7Ly8gcm93NyA9IFtyMnAwIHIycDEgcjJwMiByMnAzXQorICAgICAgICA7Ly8gcm93NiA9IFtyM3AwIHIzcDEgcjNwMiByM3AzXQorCisgICAgICAgIE1fU1RSICAgcm93OSwgW3BRMGJdLCBTdGVwYgorICAgICAgICBTVFIgICAgIHJvdzcsIFtwUTBiLCBTdGVwYl0KKyAgICAgICAgU1RSICAgICByb3c2LCBbcFEwYiwgU3RlcGIsIExTTCAjMV0KKyAgICAgICAgU1RSICAgICByb3czLCBbcFEwYl0sICM0CisgICAgICAgIAorICAgICAgICBNX0xEUiAgIFEzYiwgcFFfMworCisgICAgICAgIDsvLyBRMGIgPSBbcjBxMCByMXEwIHIycTAgcjNxMF0KKyAgICAgICAgOy8vIFExYiA9IFtyMHExIHIxcTEgcjJxMSByM3ExXQorICAgICAgICA7Ly8gUTJiID0gW3IwcTIgcjFxMiByMnEyIHIzcTJdCisgICAgICAgIDsvLyBRM2IgPSBbcjBxMyByMXEzIHIycTMgcjNxM10KKworICAgICAgICA7Ly8tLS0tLS1QYWNrIHEwLXEzLS0tLS0tCisgICAgICAgIEFORCAgICAgdHVucGswLCBtYXNrYiwgcF8yCisgICAgICAgIEFORCAgICAgdHVucGsyLCBtYXNrYiwgcF8yLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMCwgdHVucGswLCBRMGIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGsyLCB0dW5wazIsIFEwYgorCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYiwgUTNiCisgICAgICAgIEFORCAgICAgdHVucGs4LCBtYXNrYiwgUTNiLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMywgdHVucGszLCBRMmIsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGs4LCB0dW5wazgsIFEyYgorCisgICAgICAgIDsvLyB0dW5wazAgPSBbcjBxMSByMHEwIHIycTEgcjJxMF0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXExIHIxcTAgcjNxMSByM3EwXQorICAgICAgICA7Ly8gdHVucGszID0gW3IwcTMgcjBxMiByMnEzIHIycTJdCisgICAgICAgIDsvLyB0dW5wazggPSBbcjFxMyByMXEyIHIzcTMgcjNxMl0KKworICAgICAgICBQS0hUQiAgIHJvdzgsIHR1bnBrMywgdHVucGswLCBBU1IjMTYKKyAgICAgICAgUEtIQlQgICByb3c3LCB0dW5wazAsIHR1bnBrMywgTFNMIzE2CisgICAgICAgIFBLSFRCICAgcm93NCwgdHVucGs4LCB0dW5wazIsIEFTUiMxNgorICAgICAgICBQS0hCVCAgIHJvdzYsIHR1bnBrMiwgdHVucGs4LCBMU0wjMTYKKworICAgICAgICA7Ly8gcm93OCA9IFtyMHEwIHIwcTEgcjBxMiByMHEzXQorICAgICAgICA7Ly8gcm93NCA9IFtyMXEwIHIxcTEgcjFxMiByMXEzXQorICAgICAgICA7Ly8gcm93NyA9IFtyMnEwIHIycTEgcjJxMiByMnEzXQorICAgICAgICA7Ly8gcm93NiA9IFtyM3EwIHIzcTEgcjNxMiByM3EzXQorCisgICAgICAgIFNUUiAgICAgcm93NCwgW3BRMGJdCisgICAgICAgIFNUUiAgICAgcm93NywgW3BRMGIsIFN0ZXBiXQorICAgICAgICBTVFIgICAgIHJvdzYsIFtwUTBiLCBTdGVwYiwgTFNMICMxXQorCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTBiLCBTdGVwYgorICAgICAgICBNT1YgICAgIHBfMSwgUTJiCisKKyAgICAgICAgU1RSICAgICByb3c4LCBbcFEwXQorCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgQUREUyAgICBYWSwgWFksIFhZCisgICAgICAgIEFERCAgICAgcFRocmVzaG9sZHMsICM0CisgICAgICAgIE1fU1RSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworICAgICAgICBNX1NUUiAgIFhZLCBwWFlCUworICAgICAgICBCQ0MgICAgIExvb3BYCisgICAgICAgIEIgICAgICAgRXhpdExvb3BZCisKKzsvLy0tLS0tLS0tLS0gRXhpdCBvZiBMb29wWCAtLS0tLS0tLS0tLS0tLQorOy8vLS0tLSBmb3IgdGhlIGNhc2Ugb2Ygbm8gZmlsdGVyaW5nIC0tLS0tCisKK05vRmlsdGVyRmlsdDAKKyAgICAgICAgQUREICAgICBwUTAsIHBRMCwgIzQKK05vRmlsdGVyQlMwCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIgZm9yIExvb3BYCisgICAgICAgIE1fTERSRCAgWFksIHBCUywgcFhZQlMKKyAgICAgICAgTV9MRFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fTERSRCAgYWxwaGEsIGJldGEsIHBBbHBoYUJldGExCisKKyAgICAgICAgOy8vIEFsaWduIHRoZSBwb2ludGVyCisgICAgICAgIEFERFMgICAgWFksIFhZLCBYWQorICAgICAgICBBREQgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisgICAgICAgIE1fU1RSICAgWFksIHBYWUJTCisgICAgICAgIEJDQyAgICAgTG9vcFkKKyAgICAgICAgQiAgICAgICBFeGl0TG9vcFkKKyAgICAgICAgCitiU0xUNCAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLWJTTFQ0IEV4ZWN1dGlvbi0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTRUwgICAgIGFxZmxnLCB0NywgZmlsdCAgICAgICAgICAgIDsvLyBhcWZsZyA9IGZpbHQgJiYgKGFxPGJldGEpIAorICAgICAgICBNX0xEUiAgIHB0QzAsIHBwVGhyZXNob2xkcworICAgICAgICBDTVAgICAgIGZpbHQsICMwCisgICAgICAgIE1fTERSRCAgcFEwLCBzcmNkc3RTdGVwLCBwcFEwU3RlcCwgRVEKKyAgICAgICAgQkVRICAgICBOb0ZpbHRlckZpbHQwCisgICAgICAgIAorICAgICAgICBMRFJCICAgIHRDMCwgW3B0QzBdLCAjNAorICAgICAgICBNX1NUUiAgIHB0QzAsIHBwVGhyZXNob2xkcworCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorCisgICAgICAgIDsvLy0tLS0tLS0tLVN0b3JlIHJlc3VsdC0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8tLS0tLS0tLVBhY2sgcDEscDAscTEscTAtLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvL0xvYWQgZGVzdGluYXRpb24gcG9pbnRlcgorICAgICAgICBMRFIgICAgIG1hc2thLD1NQVNLXzIKKyAgICAgICAgTV9TVFIgICBRMGEsIHBQXzMKKyAgICAgICAgTU9WICAgICBwXzEsIHFfMgorCisgICAgICAgIDsvLyBQMWEgPSBbcjBwMSByMXAxIHIycDEgcjNwMV0KKyAgICAgICAgOy8vIFAwYSA9IFtyMHAwIHIxcDAgcjJwMCByM3AwXQorICAgICAgICA7Ly8gUTBhID0gW3IwcTAgcjFxMCByMnEwIHIzcTBdCisgICAgICAgIDsvLyBRMWEgPSBbcjBxMSByMXExIHIycTEgcjNxMV0KKworICAgICAgICBBTkQgICAgIHR1bnBrMSwgbWFza2EsIFAwYQorICAgICAgICBBTkQgICAgIHR1bnBrMiwgbWFza2EsIFAwYSwgTFNMIzgKKyAgICAgICAgVVhUQUIxNiB0dW5wazEsIHR1bnBrMSwgUDFhLCBST1IjOAorICAgICAgICBVWFRBQjE2IHR1bnBrMiwgdHVucGsyLCBQMWEKKworICAgICAgICBNX0xEUkQgIHBRMGEsIFN0ZXBhLCBwcFEwU3RlcAorCisgICAgICAgIEFORCAgICAgdHVucGs5LCBtYXNrYSwgUTFhCisgICAgICAgIEFORCAgICAgdHVucGszLCBtYXNrYSwgUTFhLCBMU0wjOAorICAgICAgICBVWFRBQjE2IHR1bnBrOSwgdHVucGs5LCBRMGEsIFJPUiM4CisgICAgICAgIFVYVEFCMTYgdHVucGszLCB0dW5wazMsIFEwYQorCisgICAgICAgIDsvLyB0dW5wazEgPSBbcjBwMCByMHAxIHIycDAgcjJwMV0KKyAgICAgICAgOy8vIHR1bnBrMiA9IFtyMXAwIHIxcDEgcjNwMCByM3AxXQorICAgICAgICA7Ly8gdHVucGs5ID0gW3IwcTEgcjBxMCByMnExIHIycTBdCisgICAgICAgIDsvLyB0dW5wazMgPSBbcjFxMSByMXEwIHIzcTEgcjNxMF0KKworICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazEsIExTUiAjMTYKKyAgICAgICAgTU9WICAgICB0MCwgdHVucGs5LCBMU1IgIzE2CisKKyAgICAgICAgU1RSSCAgICB0NCxbcFEwYSwgIzJdISAgICAgICAgICA7Ly9TdG9yZXMgW3IwcDAgcjBwMV0KKyAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IwcTAgcjBxMV0KKworICAgICAgICBNT1YgICAgIHQ0LCB0dW5wazIsIExTUiAjMTYKKyAgICAgICAgTU9WICAgICB0MCwgdHVucGszLCBMU1IgIzE2CisKKyAgICAgICAgTV9TVFJIICB0NCxbcFEwYSwgU3RlcGFdISAgICAgICA7Ly9TdG9yZXMgW3IxcDAgcjFwMV0KKyAgICAgICAgU1RSSCAgICB0MCxbcFEwYSwgIzJdICAgICAgICAgICA7Ly9TdG9yZXMgW3IxcTAgcjFxMV0KKyAgICAgICAgCisgICAgICAgIE1fU1RSSCAgdHVucGsxLFtwUTBhLCBTdGVwYV0hICAgOy8vU3RvcmVzIFtyMnAwIHIycDFdCisgICAgICAgIFNUUkggICAgdHVucGsyLFtwUTBhLCBTdGVwYV0gICAgOy8vU3RvcmVzIFtyM3AwIHIzcDFdCisgICAgICAgIFNUUkggICAgdHVucGs5LFtwUTBhLCAjMl0hICAgICAgICA7Ly9TdG9yZXMgW3IycTAgcjJxMV0KKyAgICAgICAgU1RSSCAgICB0dW5wazMsW3BRMGEsIFN0ZXBhXSAgICA7Ly9TdG9yZXMgW3IzcTAgcjNxMV0KKworICAgICAgICBTVUIgICAgIHBRMCwgcFEwYSwgU3RlcGEsIExTTCAjMQorCisgICAgICAgIDsvLyBMb2FkIGNvdW50ZXIKKyAgICAgICAgTV9MRFJEICBYWSwgcEJTLCBwWFlCUworCisgICAgICAgIDsvLyBSZWxvYWQgUGl4ZWxzCisgICAgICAgIE1fTERSICAgcF8wLCBwUV8zCisgICAgICAgIE1PViAgICAgcF8yLCBRMWEKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTEKKworICAgICAgICBBRERTICAgIFhZLCBYWSwgWFkKKyAgICAgICAgTV9TVFIgICBYWSwgcFhZQlMKKyAgICAgICAgQkNDICAgICBMb29wWAorICAgICAgICAKKzsvLy0tLS0tLS0tIENvbW1vbiBFeGl0IG9mIExvb3BZIC0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBBbGlnbiB0aGUgcG9pbnRlcnMgCisgICAgICAgIE1fTERSICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcworRXhpdExvb3BZCisgICAgICAgIFNVQiAgICAgcFEwLCBwUTAsICMxNgorICAgICAgICBBREQgICAgIHBRMCwgcFEwLCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgU1VCICAgICBwQlMsIHBCUywgIzE1CisgICAgICAgIFNVQiAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTUKKyAgICAgICAgTV9TVFIgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzCisKKyAgICAgICAgTV9MRFJEICBhbHBoYSwgYmV0YSwgcEFscGhhQmV0YTAKKworICAgICAgICBCTkUgICAgIExvb3BZCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tRW5kIEZpbHRlci0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBFTkRJRiAgICAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU4MzViZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgY2FsY3VsYXRlIDEvOCBQaXhlbCBpbnRlcnBvbGF0aW9uIGZvciBDaHJvbWEgQmxvY2sKKyAqIAorICovCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1WQy5oIgorI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLAorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgMS84LXBpeGVsIGludGVycG9sYXRpb24gZm9yIGludGVyIGNocm9tYSBNQi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmMJUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKyAqIFtpbl0Jc3JjU3RlcCBSZWZlcmVuY2UgZnJhbWUgc3RlcCBpbiBieXRlCisgKiBbaW5dCWRzdFN0ZXAgRGVzdGluYXRpb24gZnJhbWUgc3RlcCBpbiBieXRlLiBNdXN0IGJlIG11bHRpcGxlIG9mIHJvaS53aWR0aC4KKyAqIFtpbl0JZHgJCUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlkeQkJRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50CisgKgkJCQkJCWluIDEvOCBwaXhlbCB1bml0O3ZhbGlkIGluIHRoZSByYW5nZSBbMCw3XQorICogW2luXQlyb2kJCURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247dGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IG11c3QKKyAqICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciAyLCA0LCBvciA4LgorICogW291dF0JcERzdAlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTIsICAyLWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKiAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorICogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBPTVhfU3RzX0JhZEFyZ0VycjoKKyAqCXBTcmMgb3IgcERzdCBpcyBOVUxMLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIDwgOC4KKyAqCWR4IG9yIGR5IGlzIG91dCBvZiByYW5nZSBbMC03XS4KKyAqCXJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDIsIGJ1dCBwRHN0IGlzIG5vdCAyLWJ5dGUgYWxpZ25lZC4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLgorICoJc3JjU3RlcCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICAgY29uc3QgT01YX1U4KiBwU3JjLAorICAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgIE9NWF9VOCogcERzdCwKKyAgICAgT01YX1MzMiBkc3RTdGVwLAorICAgICBPTVhfUzMyIGR4LAorICAgICBPTVhfUzMyIGR5LAorICAgICBPTVhTaXplIHJvaQorICkKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEgCisgICAgICAgICgoT01YX1U4KilwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwLCByb2kud2lkdGgsIHJvaS5oZWlnaHQsIGR4LCBkeSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBGSUxFCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2MTFhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCkBAIC0wLDAgKzEsNDI2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCis7Ly8KKzsvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgaW4gdjYgYXNzZW1ibHkuCis7Ly8gUGVyZm9ybXMgcXVhcnRlciBwZWwgaW50ZXJwb2xhdGlvbiBvZiBpbnRlciBsdW1hIE1CLgorOy8vIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKzsvLyBQYXJhbWV0ZXJzOgorOy8vIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKzsvLyBbaW5dICAgIHNyY1N0ZXAgICAgIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKKzsvLyBbaW5dICAgIGRzdFN0ZXAgICAgIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGgKKzsvLyBbaW5dICAgIGR4ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQorOy8vIFtpbl0gICAgZHkgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQorOy8vIFtpbl0gICAgcm9pICAgICAgICAgRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4KKzsvLyBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8KKzsvLyBSZXR1cm4gVmFsdWU6Cis7Ly8gSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorOy8vIEl0IGlzIGFzc3VlZCB0aGF0IGZvbGxvd2luZyBjYXNlcyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246Cis7Ly8gIHBTcmMgb3IgcERzdCBpcyBub3QgTlVMTC4KKzsvLyAgc3JjU3RlcCBvciBkc3RTdGVwID49IHJvaS53aWR0aC4KKzsvLyAgICAgZHggb3IgZHkgaXMgaW4gdGhlIHJhbmdlIFswLTNdLgorOy8vICAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBub3Qgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBEc3QgaXMgNCBieXRlIGFsaWduZWQuCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBwRHN0IGlzIDggYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gMTYsIHBEc3QgaXMgMTYgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBzcmNTdGVwIGFuZCBkc3RTdGVwIGlzIG11bHRpcGxlIG9mIDguCis7Ly8KKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUworICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKyAgICBFTkRJRgorCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgRU5ESUYKKyAgICAKKyAgICAKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgIFJOIDEKK3BEc3QgICAgICAgICAgICBSTiAyCitkc3RTdGVwICAgICAgICAgUk4gMworaUhlaWdodCAgICAgICAgIFJOIDQKK2lXaWR0aCAgICAgICAgICBSTiA1CisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK2lkeCAgICAgICAgICAgICBSTiA2CitpZHkgICAgICAgICAgICAgUk4gNworaW5kZXggICAgICAgICAgIFJOIDYKK1RlbXAgICAgICAgICAgICBSTiAxMgorcEFyZ3MgICAgICAgICAgIFJOIDExCisKKworICAgICAgICA7Ly8gRW5kIG9mIENvcnRleEE4CisgICAgICAgICAgICAgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgCisgICAgSUYgQVJNMTEzNkpTCisKKworICAgICAgICBNX0FMTE9DNCBwcERzdCwgOAorICAgICAgICBNX0FMTE9DNCBwcFNyYywgOAorICAgICAgICBNX0FMTE9DNCBwcEFyZ3MsIDE2CisgICAgICAgIE1fQUxMT0M0IHBCdWZmZXIsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxMjAgPSAxMngxMAorICAgICAgICBNX0FMTE9DOCBwSW50ZXJCdWYsIDEyMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTIwID0gMTIqNSoyCisgICAgICAgIE1fQUxMT0M4IHBUZW1wQnVmLCAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAzMiA9ICA4KjQKKyAgICAgICAgCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgOy8vIEludGVycG9sYXRpb24gb2YgbHVtYSBpcyBpbXBsZW1lbnRlZCBieSBwcm9jZXNzaW5nIGJsb2NrIG9mIHBpeGVscywgc2l6ZSA0eDQgYXQgYSB0aW1lLgorICAgICAgICA7Ly8gRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgbW90aW9uIHZlY3RvciBmcmFjdGlvbmFsIHBhcnRzIChkeCxkeSksIG9uZSBvdXQgb2YgMTYgY2FzZXMgd2lsbCBiZSBwcm9jZXNzZWQuCisgICAgICAgIDsvLyBSZWdpc3RlcnMgcjQsIHI1LCByNiB0byBiZSBwcmVzZXJ2ZWQgYnkgaW50ZXJuYWwgdW5zYWZlIGZ1bmN0aW9ucworICAgICAgICA7Ly8gcjQgLSBpSGVpZ2h0CisgICAgICAgIDsvLyByNSAtIGlXaWR0aAorICAgICAgICA7Ly8gcjYgLSBpbmRleAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCByMTEKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworaWR4ICAgICAgICAgICAgIFJOIDYKK2lkeSAgICAgICAgICAgICBSTiA3CitpbmRleCAgICAgICAgICAgUk4gNgorVGVtcCAgICAgICAgICAgIFJOIDEyCitwQXJncyAgICAgICAgICAgUk4gMTEKKworcEJ1ZiAgICAgICAgICAgIFJOIDgKK0hlaWdodCAgICAgICAgICBSTiA5IAorYnVmU3RlcCAgICAgICAgIFJOIDkKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHRyaWR4LCA0CisgICAgICAgIE1fQVJHICAgcHRyaWR5LCA0ICAgICAgICAKKyAgICAgICAgTV9BUkcgICBwdHJXaWR0aCwgNAorICAgICAgICBNX0FSRyAgIHB0ckhlaWdodCwgNCAgICAgICAgCisKKyAgICAgICAgOy8vIExvYWQgc3RydWN0dXJlIGVsZW1lbnRzIG9mIHJvaSAKKyAgICAgICAgTV9MRFIgICBpZHgsIHB0cmlkeAorICAgICAgICBNX0xEUiAgIGlkeSwgcHRyaWR5CisgICAgICAgIE1fTERSICAgaVdpZHRoLCBwdHJXaWR0aAorICAgICAgICBNX0xEUiAgIGlIZWlnaHQsIHB0ckhlaWdodAorICAgICAgICAKKyAgICAgICAgTV9QUklOVEYgInJvaS53aWR0aCAlZFxuIiwgaVdpZHRoCisgICAgICAgIE1fUFJJTlRGICJyb2kuaGVpZ2h0ICVkXG4iLCBpSGVpZ2h0CisKKyAgICAgICAgQUREICAgICBpbmRleCwgaWR4LCBpZHksIExTTCAjMiAgICAgICAgICAgICAgICAgOy8vICBbaW5kZXhdID0gW2lkeV1baWR4XQorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKworSW50ZXJwb2xhdGVMdW1hCitCbG9jazR4NFdpZHRoTG9vcAorQmxvY2s0eDRIZWlnaHRMb29wCisKKyAgICAgICAgU1RNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9IAorICAgICAgICBNX0FEUiAgIHBCdWYsIHBCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gc3dpdGNoIHRhYmxlIHVzaW5nIG1vdGlvbiB2ZWN0b3IgYXMgaW5kZXgKKyAgICAgICAgTV9TV0lUQ0ggaW5kZXgsIEwKKyAgICAgICAgTV9DQVNFICBDYXNlXzAKKyAgICAgICAgTV9DQVNFICBDYXNlXzEKKyAgICAgICAgTV9DQVNFICBDYXNlXzIKKyAgICAgICAgTV9DQVNFICBDYXNlXzMKKyAgICAgICAgTV9DQVNFICBDYXNlXzQKKyAgICAgICAgTV9DQVNFICBDYXNlXzUKKyAgICAgICAgTV9DQVNFICBDYXNlXzYKKyAgICAgICAgTV9DQVNFICBDYXNlXzcKKyAgICAgICAgTV9DQVNFICBDYXNlXzgKKyAgICAgICAgTV9DQVNFICBDYXNlXzkKKyAgICAgICAgTV9DQVNFICBDYXNlX2EKKyAgICAgICAgTV9DQVNFICBDYXNlX2IKKyAgICAgICAgTV9DQVNFICBDYXNlX2MKKyAgICAgICAgTV9DQVNFICBDYXNlX2QKKyAgICAgICAgTV9DQVNFICBDYXNlX2UKKyAgICAgICAgTV9DQVNFICBDYXNlX2YKKyAgICAgICAgTV9FTkRTV0lUQ0gKKworQ2FzZV8wCisgICAgICAgIDsvLyBDYXNlIEcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMCBcbiIKKworICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCisKK0Nhc2VfMQorICAgICAgICA7Ly8gQ2FzZSBhCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDEgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzIKKyAgICAgICAgOy8vIENhc2UgYgorICAgICAgICBNX1BSSU5URiAiQ2FzZSAyIFxuIgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfMworICAgICAgICA7Ly8gQ2FzZSBjCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDMgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzQKKyAgICAgICAgOy8vIENhc2UgZAorICAgICAgICBNX1BSSU5URiAiQ2FzZSA0IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV81CisgICAgICAgIDsvLyBDYXNlIGUKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNSBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIAorCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzYKKyAgICAgICAgOy8vIENhc2UgZgorICAgICAgICBNX1BSSU5URiAiQ2FzZSA2IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV83CisgICAgICAgIDsvLyBDYXNlIGcKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgNyBcbiIKKyAgICAgICAgCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzgKKyAgICAgICAgOy8vIENhc2UgaAorICAgICAgICBNX1BSSU5URiAiQ2FzZSA4IFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfOQorICAgICAgICA7Ly8gQ2FzZSBpCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDkgXG4iCisKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2EKKyAgICAgICAgOy8vIENhc2UgagorICAgICAgICBNX1BSSU5URiAiQ2FzZSBhIFxuIgorCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfYgorICAgICAgICA7Ly8gQ2FzZSBrCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGIgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM5CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwSW50ZXJCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBpZHksIHBUZW1wQnVmCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlICAgIAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9jCisgICAgICAgIDsvLyBDYXNlIG4KKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYyBcbiIKKworICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgcFNyYyB0byBvbmUgcm93IGRvd24KKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZAorICAgICAgICA7Ly8gQ2FzZSBwCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGQgXG4iCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjNAorICAgICAgICBNX0FEUiAgIHBEc3QsIHBUZW1wQnVmCisgICAgICAgIE1PViAgICAgZHN0U3RlcCwgIzQKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcEFyZ3MsIHBwQXJncworICAgICAgICBMRE0gICAgIHBBcmdzLCB7cFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcH0KKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgTV9BRFIgICBwQnVmLCBwQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgSGVpZ2h0LCAjOQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwU3JjLCBwVGVtcEJ1ZgorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICM0CisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2UKKyAgICAgICAgOy8vIENhc2UgcQorICAgICAgICBNX1BSSU5URiAiQ2FzZSBlIFxuIgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIHBCdWYsIHBJbnRlckJ1ZgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBNX0FEUiAgIGlkeSwgcFRlbXBCdWYKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmUKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKKworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9mCisgICAgICAgIDsvLyBDYXNlIHIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZiBcbiIKKyAgICAgICAgU1VCICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICBIZWlnaHQsICM0CisgICAgICAgIE1fQURSICAgcERzdCwgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBkc3RTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgcEFyZ3MsIHtwU3JjLCBzcmNTdGVwLCBwRHN0LCBkc3RTdGVwfQorICAgICAgICBTVUIgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIE1fQURSICAgcEJ1ZiwgcEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgIEhlaWdodCwgIzkKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgICAgIE1fQURSICAgcFNyYywgcFRlbXBCdWYKKyAgICAgICAgTU9WICAgICBzcmNTdGVwLCAjNAorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorCitCbG9jazR4NExvb3BFbmQKKworICAgICAgICA7Ly8gV2lkdGggTG9vcAorICAgICAgICBTVUJTICAgIGlXaWR0aCwgaVdpZHRoLCAjNAorICAgICAgICBNX0FEUiAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgTERNICAgICBwQXJncywge3BTcmMsc3JjU3RlcCxwRHN0LGRzdFN0ZXB9ICA7Ly8gTG9hZCBhcmd1bWVudHMKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCAjNCAgICAgIAorICAgICAgICBBREQgICAgIHBEc3QsIHBEc3QsICM0CisgICAgICAgIEJHVCAgICAgQmxvY2s0eDRXaWR0aExvb3AKKworICAgICAgICA7Ly8gSGVpZ2h0IExvb3AKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAorICAgICAgICBNX0xEUiAgIGlXaWR0aCwgcHRyV2lkdGgKKyAgICAgICAgTV9BRFIgICBwQXJncywgcHBBcmdzCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgCisgICAgICAgIEFERCAgICAgcERzdCwgcERzdCwgZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVdpZHRoCisgICAgICAgIFNVQiAgICAgcERzdCwgcERzdCwgaVdpZHRoCisgICAgICAgIEJHVCAgICAgQmxvY2s0eDRIZWlnaHRMb29wCisKK0VuZE9mSW50ZXJwb2xhdGlvbgorICAgICAgICBNT1YgICAgIHIwLCAjMAorICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKyAgICAgICAgICAgICAgICAgICAgCisKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmZWRkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucwpAQCAtMCwwICsxLDQ5NCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgCisgICAgIEFSRUEgdGFibGUsIERBVEEgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgRENEICBPTVhfVkNfQ0hST01BX0RDLCAgICAgT01YX1ZDX0NIUk9NQV9IT1IgCisgICAgRENEICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORSAgCisgICAgCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCwxCisgICAgRENXICAgMywgMiwgMSw0IAorICAgIERDVyAgLTMsLTIsLTEsMAorICAgIERDVyAgIDEsIDIsIDMsNAorICAgIAorICAgIElGIEFSTTExMzZKUworICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gQ29uc3RhbnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCisKK0JMS19TSVpFICAgICAgICBFUVUgMHg4CitNVUxfQ09OU1QwICAgICAgRVFVIDB4MDEwMTAxMDEKK01BU0tfQ09OU1QgICAgICBFUVUgMHgwMEZGMDBGRgorTVVMX0NPTlNUMSAgICAgIEVRVSAweDgwODA4MDgwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3kgICAgICAgICAgICAgICBSTiAxMiAgIAorcGMgICAgICAgICAgICAgIFJOIDE1ICAgCityZXR1cm4gICAgICAgICAgUk4gMCAgICAKK3BTcmNMZWZ0MiAgICAgICBSTiAxICAgIAorcERzdDIgICAgICAgICAgIFJOIDIgICAgCitzdW0xICAgICAgICAgICAgUk4gNiAgICAKK3N1bTIgICAgICAgICAgICBSTiA3ICAgIAorcFRhYmxlICAgICAgICAgIFJOIDkgICAgCitkc3RTdGVweDIgICAgICAgUk4gMTEgICAKK2xlZnRTdGVweDIgICAgICBSTiAxNCAgIAorb3V0ZXJDb3VudCAgICAgIFJOIDE0ICAgCityMHgwMTAxMDEwMSAgICAgUk4gMTAgICAKK3IweDAwRkYwMEZGICAgICBSTiAxMSAgIAorCit0VmFsMCAgICAgICAgICAgUk4gMCAgICAKK3RWYWwxICAgICAgICAgICBSTiAxICAgIAordFZhbDIgICAgICAgICAgIFJOIDIgICAgCit0VmFsMyAgICAgICAgICAgUk4gMyAgICAKK3RWYWw0ICAgICAgICAgICBSTiA0ICAgIAordFZhbDUgICAgICAgICAgIFJOIDUgICAgCit0VmFsNiAgICAgICAgICAgUk4gNiAgICAKK3RWYWw3ICAgICAgICAgICBSTiA3ICAgIAordFZhbDggICAgICAgICAgIFJOIDggICAgCit0VmFsOSAgICAgICAgICAgUk4gOSAgICAKK3RWYWwxMCAgICAgICAgICBSTiAxMCAgIAordFZhbDExICAgICAgICAgIFJOIDExICAgCit0VmFsMTIgICAgICAgICAgUk4gMTIgICAKK3RWYWwxNCAgICAgICAgICBSTiAxNCAgIAorCitiICAgICAgICAgICAgICAgUk4gMTQgICAKK2MgICAgICAgICAgICAgICBSTiAxMiAgIAorCitwMnAwICAgICAgICAgICAgUk4gMCAgICAKK3AzcDEgICAgICAgICAgICBSTiAxICAgIAorcDZwNCAgICAgICAgICAgIFJOIDIgICAgCitwN3A1ICAgICAgICAgICAgUk4gNCAgICAKKworcHAycHAwICAgICAgICAgIFJOIDYgICAgCitwcDNwcDEgICAgICAgICAgUk4gNyAgICAKK3BwNnBwNCAgICAgICAgICBSTiA4ICAgIAorcHA3cHA1ICAgICAgICAgIFJOIDkgICAgCisKK3AzMjEwICAgICAgICAgICBSTiAxMCAgIAorcDc2NTQgICAgICAgICAgIFJOIDEwICAgCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcEluZGV4VGFibGU4eDggICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisKK09NWF9WQ19DSFJPTUFfREMKKyAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCBhdmFpbGFiaWxpdHksIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjKE9NWF9WQ19VUFBFUiArIE9NWF9WQ19MRUZUKSA7Ly8gaWYoYXZhaWxhYmlsaXR5ICYgKCNPTVhfVkNfVVBQRVIgfCAjT01YX1ZDX0xFRlQpKQorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAKKyAgICAgICAgQk5FICAgICAgVFNUX1VQUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKKyAgICAgICAgTERNICAgICAgcFNyY0Fib3ZlLHt0VmFsOCx0VmFsOX0gICAgICAgICAgICAgOy8vIHRWYWwgOCB0byA5ID0gcFNyY0Fib3ZlWzAgdG8gN10KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVUFERDE2ICAgc3VtMSwgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVWFRCMTYgICB0VmFsOSwgdFZhbDksIFJPUiAjOCAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHN1bTIsIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbNCwgNl0KKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgc3VtMSwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCBzdW0yLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs0XSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIFVYVEggICAgIHN1bTEsIHN1bTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICBVWFRIICAgICBzdW0yLCBzdW0yICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0yIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs0XQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs1XQorICAgICAgICBBREQgICAgICB0VmFsMTQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gdFZhbDQgKyB0VmFsMTIKKyAgICAgICAgCisgICAgICAgIExEUkIgICAgIHRWYWw0LCBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzZdCisgICAgICAgIExEUkIgICAgIHRWYWwxMixbcFNyY0xlZnQyXSAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzddCisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHRWYWw4ICsgdFZhbDkKKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWwyLCB0VmFsMTQgICAgICAgICAgICAgICAgOy8vIGxlZnRzdW0xICA9IHN1bShwU3JjTGVmdFswXSB0byBwU3JjTGVmdFszXSkKKyAgICAgICAgQUREICAgICAgdFZhbDQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gdFZhbDQgKyB0VmFsMTIKKyAgICAgICAgQUREICAgICAgdFZhbDE0LCB0VmFsOCwgdFZhbDQgICAgICAgICAgICAgICAgOy8vIGxlZnRzdW0yICA9IHN1bShwU3JjTGVmdFs0XSB0byBwU3JjTGVmdFs3XSkKKyAgICAgICAgQUREICAgICAgdFZhbDgsIHRWYWwxNCwgIzIgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw4ID0gbGVmdHN1bTIgKyAyCisgICAgICAgIEFERCAgICAgIHRWYWw5LCBzdW0yLCAgICMyICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IHVwc3VtMiArIDIKKyAgICAgICAgQUREICAgICAgc3VtMSwgIHN1bTEsIHRWYWwyICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgPSB1cHN1bTEgKyBsZWZ0c3VtMQorICAgICAgICBBREQgICAgICBzdW0yLCAgc3VtMiwgdFZhbDE0ICAgICAgICAgICAgICAgICA7Ly8gc3VtMiA9IHVwc3VtMiArIGxlZnRzdW0yCisgICAgICAgIEFERCAgICAgIHN1bTEsIHN1bTEsICM0ICAgICAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDQpCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICM0ICAgICAgICAgICAgICAgICAgICAgIDsvLyAoc3VtMiArIDQpCisgICAgICAgIE1PViAgICAgIHN1bTEsICBzdW0xLCAgTFNSICMzICAgICAgICAgICAgICAgIDsvLyAoc3VtMSArIDQpPj4zCisgICAgICAgIE1PViAgICAgIHRWYWw5LCB0VmFsOSwgTFNSICMyICAgICAgICAgICAgICAgIDsvLyAodFZhbDkgKyAyKT4+MgorICAgICAgICBNT1YgICAgICB0VmFsOCwgdFZhbDgsIExTUiAjMiAgICAgICAgICAgICAgICA7Ly8gKHRWYWw4ICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgIHN1bTIsICBMU1IgIzMgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgNCk+PjMKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHRWYWwwLCBzdW0xLCByMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWwxLCB0VmFsOSxyMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCB0VmFsOCxyMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw5LCBzdW0yLCByMHgwMTAxMDEwMSAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDAgdG8gMQorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDAgdG8gMQorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDAgdG8gMQorICAgICAgICBNX1NUUkQgICB0VmFsMCwgdFZhbDEsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDAgdG8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1fU1RSRCAgIHRWYWw4LCB0VmFsOSwgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgOCB0byA5CisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorVFNUX1VQUEVSCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIAorICAgICAgICBCTkUgICAgICBUU1RfTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUse3RWYWw4LHRWYWw5fSAgICAgICAgICAgICA7Ly8gdFZhbCA4IHRvIDkgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDgsIHRWYWw4LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBVQUREMTYgICBzdW0xLCAgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIAorICAgICAgICBVWFRCMTYgICB0VmFsNywgdFZhbDkgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsOSwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNSwgN10KKyAgICAgICAgVUFERDE2ICAgc3VtMiwgIHRWYWw3LCB0VmFsOSAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXSArIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgc3VtMSwgTFNSICMxNiAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICBBREQgICAgICBzdW0yLCBzdW0yLCBzdW0yLCBMU1IgIzE2ICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVs0XSB0byBwU3JjQWJvdmVbN10pCisgICAgICAgIAorICAgICAgICBVWFRIICAgICBzdW0xLCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdXBzdW0xIChDbGVhciB0aGUgdG9wIGp1bmsgYml0cykKKyAgICAgICAgVVhUSCAgICAgc3VtMiwgc3VtMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMiAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIAorICAgICAgICBBREQgICAgICBzdW0xLCBzdW0xLCAjMiAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtMSArIDIKKyAgICAgICAgQUREICAgICAgc3VtMiwgc3VtMiwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTIgKyAyCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBzdW0xLCBzdW0xLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTEgKyAyKT4+MgorICAgICAgICBNT1YgICAgICBzdW0yLCBzdW0yLCBMU1IgIzIgICAgICAgICAgICAgICAgICA7Ly8gKHN1bTIgKyAyKT4+MgorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgc3VtMSwgc3VtMSxyMHgwMTAxMDEwMSAgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgc3VtMiwgc3VtMixyMHgwMTAxMDEwMSAgICAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorVFNUX0xFRlQgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zICAgICAgIAorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQk5FICAgICAgVFNUX0NPVU5UMAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCxsZWZ0U3RlcCAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IDIgKiBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDQsIFtwU3JjTGVmdF0sICArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWw0ID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEyLFtwU3JjTGVmdDJdLCArbGVmdFN0ZXB4MiAgICAgOy8vIHRWYWwxMj0gcFNyY0xlZnRbM10KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWw2LCB0VmFsOCwgdFZhbDkgICAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IHRWYWw4ICsgdFZhbDkKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzRdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNCwgdFZhbDEyICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHRWYWw0ICsgdFZhbDEyCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzVdCisgICAgICAgIE1fTERSQiAgIHRWYWw0LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsNCA9IHBTcmNMZWZ0WzZdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMixbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTI9IHBTcmNMZWZ0WzddCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHN1bTEsICB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBzdW0xICA9IHN1bShwU3JjTGVmdFswXSB0byBwU3JjTGVmdFszXSkKKyAgICAgICAgQUREICAgICAgdFZhbDQsIHRWYWw0LCB0VmFsMTIgICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gdFZhbDQgKyB0VmFsMTIKKyAgICAgICAgQUREICAgICAgc3VtMiwgIHRWYWw4LCB0VmFsNCAgICAgICAgICAgICAgICAgOy8vIHN1bTIgID0gc3VtKHBTcmNMZWZ0WzRdIHRvIHBTcmNMZWZ0WzddKQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgc3VtMSwgc3VtMSwgIzIgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bTEgKyAyCisgICAgICAgIEFERCAgICAgIHN1bTIsIHN1bTIsICMyICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0yICsgMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgc3VtMSwgc3VtMSwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0xICsgMik+PjIKKyAgICAgICAgTU9WICAgICAgc3VtMiwgc3VtMiwgTFNSICMyICAgICAgICAgICAgICAgICAgOy8vIChzdW0yICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCBzdW0xLHIweDAxMDEwMTAxICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1VTCAgICAgIHRWYWw4LCBzdW0yLHIweDAxMDEwMTAxICAgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBNT1YgICAgICB0VmFsNyx0VmFsNiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSBzdW0xCisgICAgICAgIE1PViAgICAgIHRWYWw5LHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IHN1bTIKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3CisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDggdG8gOQorICAgICAgICBNX1NUUkQgICB0VmFsOCwgdFZhbDksIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDggdG8gOQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworVFNUX0NPVU5UMAorICAgICAgICBMRFIgICAgICBzdW0xLCA9TVVMX0NPTlNUMSAgICAgICAgICAgICAgICAgIDsvLyBzdW0xID0gMHg4MDgwODA4MCBpZihjb3VudCA9PSAwKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHRWYWw3LCBzdW0xICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsNyA9IHN1bTEKKyAgICAgICAgCisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzAgdG8gN10gICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzggdG8gMTVdICA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzE2IHRvIDIzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzI0IHRvIDMxXSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzMyIHRvIDM5XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQwIHRvIDQ3XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzQ4IHRvIDU1XSA9IHRWYWwgNiB0byA3CisgICAgICAgIE1fU1RSRCAgIHRWYWw2LCB0VmFsNywgW3BEc3RdLCBkc3RTdGVwICAgICAgIDsvLyBwRHN0WzU2IHRvIDYzXSA9IHRWYWwgNiB0byA3CisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitPTVhfVkNfQ0hST01BX0hPUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIgCisgICAgICAgIAorICAgICAgICBBREQgICAgICBwU3JjTGVmdDIsIHBTcmNMZWZ0LCBsZWZ0U3RlcCAgICAgICA7Ly8gcFNyY0xlZnQyID0gcFNyY0xlZnQgKyBsZWZ0U3RlcAorICAgICAgICBBREQgICAgICBsZWZ0U3RlcHgyLCBsZWZ0U3RlcCwgbGVmdFN0ZXAgICAgICA7Ly8gbGVmdFN0ZXB4MiA9IGxlZnRTdGVwICogMgorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdCwgZHN0U3RlcCAgICAgICAgICAgICAgICA7Ly8gcERzdDIgPSBwRHN0ICsgZHN0U3RlcAorICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICM0ICAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyA0CisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCA9TVVMX0NPTlNUMCAgICAgICAgICAgIDsvLyBDb25zdCB0byByZXBlYXQgdGhlIGJ5dGUgaW4gcmVnIDQgdGltZXMKKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbMV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw4ID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTV9MRFJCICAgdFZhbDksIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICAgOy8vIHRWYWw5ID0gcFNyY0xlZnRbM10KKyAgICAgICAgTVVMICAgICAgdFZhbDYsIHRWYWw2LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgTVVMICAgICAgdFZhbDksIHRWYWw5LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXSAKKyAgICAgICAgU1RSICAgICAgdFZhbDcsIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCAgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFs0IHRvIDddCisgICAgICAgIE1fU1RSICAgIHRWYWw3LCBbcERzdDJdLCBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCB0byAzXQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw4LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDksIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBNX0xEUkIgICB0VmFsNiwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDYgPSBwU3JjTGVmdFs0XQorICAgICAgICBNX0xEUkIgICB0VmFsNywgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDcgPSBwU3JjTGVmdFs1XQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFs2XQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFs3XQorICAgICAgICBNVUwgICAgICB0VmFsNiwgdFZhbDYsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsNywgdFZhbDcsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOCwgdFZhbDgsIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIE1fU1RSICAgIHRWYWw2LCBbcERzdF0sICBkc3RTdGVweDIgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgdG8gN10KKyAgICAgICAgTV9TVFIgICAgdFZhbDcsIFtwRHN0Ml0sIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOCwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0IFswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw5LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgIGRzdFN0ZXB4MiAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbNCB0byA3XQorICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorT01YX1ZDX0NIUk9NQV9WRVJUCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NCAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsN30gICAgICAgICAgICA7Ly8gdFZhbCA2IHRvIDcgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFswIHRvIDddICAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs4IHRvIDE1XSAgPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsxNiB0byAyM10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFsyNCB0byAzMV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFszMiB0byAzOV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0MCB0byA0N10gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs0OCB0byA1NV0gPSB0VmFsIDYgdG8gNworICAgICAgICBNX1NUUkQgICB0VmFsNiwgdFZhbDcsIFtwRHN0XSwgZHN0U3RlcCAgICAgICA7Ly8gcERzdFs1NiB0byA2M10gPSB0VmFsIDYgdG8gNworCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ19DSFJPTUFfUExBTkUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBSU0IgICAgICB0VmFsMTQsIGxlZnRTdGVwLCBsZWZ0U3RlcCwgTFNMICMzICA7Ly8gNypsZWZ0U3RlcAorICAgICAgICBMRFJCICAgICB0VmFsNywgW3BTcmNBYm92ZSwgIys3XSAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzddCisgICAgICAgIExEUkIgICAgIHRWYWw2LCBbcFNyY0xlZnQsICt0VmFsMTRdICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXQorICAgICAgICBMRFJCICAgICB0VmFsOCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBMRFJCICAgICB0VmFsOSwgW3BTcmNBYm92ZSwgIys2IF0gICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzZdCisgICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMF0KKyAgICAgICAgQUREICAgICAgdFZhbDIsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs3XSArIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdCisgICAgICAgIFNVQiAgICAgIHRWYWw2LCB0VmFsNiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBWMCA9IHBTcmNMZWZ0WzcqbGVmdFN0ZXBdIC0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDcsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gSDAgPSBwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdICAgICAgICAKKyAgICAgICAgTFNMICAgICAgdFZhbDIsIHRWYWwyLCAjNCAgICAgICAgICAgICAgICAgICAgOy8vIGEgPSAxNiAqIChwU3JjQWJvdmVbMTVdICsgcFNyY0xlZnRbMTUqbFNdKQorICAgICAgICBBREQgICAgICB0VmFsMiwgdFZhbDIsICMxNiAgICAgICAgICAgICAgICAgICA7Ly8gYSArIDE2CisgICAgICAgIFNVQiAgICAgIHRWYWw5LCB0VmFsOSx0VmFsMTAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0KKyAgICAgICAgTERSQiAgICAgdFZhbDgsIFtwU3JjQWJvdmUsIys1XSAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XQorICAgICAgICBMRFJCICAgICB0VmFsMTAsW3BTcmNBYm92ZSwjKzFdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzFdCisgICAgICAgIEFERCAgICAgIHRWYWw5LCB0VmFsOSwgdFZhbDksIExTTCAjMSAgICAgICAgIDsvLyBIMSA9IDMgKiAocFNyY0Fib3ZlWzZdIC0gcFNyY0Fib3ZlWzBdKQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDksIHRWYWw3LCBMU0wgIzIgICAgICAgICA7Ly8gSCA9IEgxICsgSDAKKyAgICAgICAgU1VCICAgICAgdFZhbDgsIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1XSAtIHBTcmNBYm92ZVsxXQorICAgICAgICBMRFJCICAgICB0VmFsOSwgW3BTcmNBYm92ZSwjKzRdICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzRdCisgICAgICAgIExEUkIgICAgIHRWYWwxMCxbcFNyY0Fib3ZlLCMrMl0gICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMl0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIEggPSBIICsgSDIKKyAgICAgICAgU1VCICAgICAgdFZhbDExLCB0VmFsMTQsbGVmdFN0ZXAgICAgICAgICAgICAgOy8vIDYqbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICAgdFZhbDExLCBwU3JjTGVmdCwgdFZhbDExICAgICAgICAgICAgOy8vIHBTcmNMZWZ0ICsgNipsZWZ0U3RlcAorICAgICAgICBNT1YgICAgICB0VmFsMTIsIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnQKKyAgICAgICAgU1VCICAgICAgdFZhbDksIHRWYWw5LCB0VmFsMTAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0XSAtIHBTcmNBYm92ZVsyXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDcsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gSCA9IEggKyBIMworICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgdFZhbDcsIExTTCAjNCAgICAgICAgIDsvLyAxNyAqIEgKKyAgICAgICAgQUREICAgICAgdFZhbDcsIHRWYWw3LCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIDE3ICogSCArIDE2CisgICAgICAgIFNVQiAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCisgICAgICAgIEFTUiAgICAgIGIsIHRWYWw3LCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBiID0gKDE3ICogSCArIDE2KSA+PiA1CisgICAgICAgIEFERCAgICAgIHRWYWw4LCB0VmFsOCwgdFZhbDgsIExTTCAjMSAgICAgICAgIDsvLyBWMSA9IDMgKiAocFNyY0xlZnRbNipsZWZ0U3RlcF0gLSBwU3JjTGVmdFswXSkKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw4LCB0VmFsNiwgTFNMICMyICAgICAgICAgOy8vIFYgPSBWMCArVjEKKyAgICAgICAgTV9MRFJCICAgdFZhbDgsIFt0VmFsMTFdLC1sZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCxbdFZhbDEyXSwrbGVmdFN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFtsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsIGIsIGIsIExTTCAjMSAgICAgICAgICAgICAgICAgOy8vIDMqYgorICAgICAgICBTVUIgICAgICB0VmFsMiwgdFZhbDIsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gYSArIDE2IC0gMypiCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1KmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3RWYWwxMV0sLWxlZnRTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLFt0VmFsMTJdLCtsZWZ0U3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNywgTFNMICMxICAgICAgICAgOy8vIFYgPSBWICsgVjIKKyAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsID1NQVNLX0NPTlNUICAgICAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgorICAgICAgICBTVUIgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDYsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gViA9IFYgKyBWNworICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjNCAgICAgICAgICAgICAgICA7Ly8gZHN0U3RlcCAtIDQKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCB0VmFsNiwgTFNMICM0ICAgICAgICAgOy8vIDE3KlYKKyAgICAgICAgQUREICAgICAgdFZhbDYsIHRWYWw2LCAjMTYgICAgICAgICAgICAgICAgICAgOy8vIDE3KlYgKyAxNgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgIGMsIHRWYWw2LCAjNSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjID0gKDE3KlYgKyAxNik+PjUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICB0VmFsNiwgYywgYywgTFNMICMxICAgICAgICAgICAgICAgICA7Ly8gMypjCisgICAgICAgIFVYVEggICAgIGMsIGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBvbmx5IGluIGhhbGYgd29yZAorICAgICAgICBTVUIgICAgICB0VmFsNiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gYSAtIDMqYiAtIDMqYyArIDE2CisgICAgICAgIE9SUiAgICAgIGMsIGMsIGMsIExTTCAjMTYgICAgICAgICAgICAgICAgICAgIDsvLyBjIGMKKyAgICAgICAgQUREICAgICAgdFZhbDcsIGIsIGIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIDJiCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsNiwgdFZhbDcgICAgICAgICAgICAgICAgIDsvLyBwcDIgPSBkICsgMipiCisgICAgICAgIEFERCAgICAgIHRWYWw3LCB0VmFsNywgYiAgICAgICAgICAgICAgICAgICAgIDsvLyAzYgorICAgICAgICBPUlIgICAgICBwMnAwLCAgIHRWYWw2LCAgdFZhbDIsICBMU0wgIzE2ICAgICA7Ly8gcDJwMCAgID0gcGFjayB7cDIsIHAwfQorICAgICAgICBVWFRIICAgICBiLCBiCisgICAgICAgIFVYVEggICAgIHRWYWw3LCB0VmFsNworICAgICAgICBPUlIgICAgICBiLCBiLCBiLCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgICA7Ly8ge2IsYn0KKyAgICAgICAgT1JSICAgICAgdFZhbDcsIHRWYWw3LCB0VmFsNywgTFNMICMxNiAgICAgICAgOy8vIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwMnAwLCBiICAgICAgICAgICAgICAgICAgICAgOy8vIHAzcDEgICA9IHAycDAgKyB7YixifQorICAgICAgICBTQUREMTYgICBwNnA0LCAgIHAzcDEsIHRWYWw3ICAgICAgICAgICAgICAgICA7Ly8gcDZwNCAgID0gcDNwMSArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwNnA0LCBiICAgICAgICAgICAgICAgICAgICAgOy8vIHA3cDUgICA9IHA2cDQgKyB7YixifQorICAgICAgICBNT1YgICAgICBvdXRlckNvdW50LCAjQkxLX1NJWkUgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudCAgICAgICAgCisgICAgICAgIAorTE9PUF9QTEFORSAgICAgICAgCisKKyAgICAgICAgVVNBVDE2ICAgcDdwNSwgICAjMTMsIHA3cDUgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDcpIGNsaXAxMyhwNSkKKyAgICAgICAgVVNBVDE2ICAgcDZwNCwgICAjMTMsIHA2cDQgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDYpIGNsaXAxMyhwNCkKKyAgICAgICAgVVNBVDE2ICAgcDNwMSwgICAjMTMsIHAzcDEgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDMpIGNsaXAxMyhwMSkKKyAgICAgICAgVVNBVDE2ICAgcDJwMCwgICAjMTMsIHAycDAgICAgICAgICAgICAgICAgICAgIDsvLyBjbGlwMTMocDIpIGNsaXAxMyhwMCkKKyAgICAgICAgCisgICAgICAgIEFORCAgICAgIHBwN3BwNSwgcjB4MDBGRjAwRkYsIHA3cDUsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDcpIGNsaXA4KHA1KQorICAgICAgICBBTkQgICAgICBwcDZwcDQsIHIweDAwRkYwMEZGLCBwNnA0LCBBU1IgIzUgICAgOy8vIGNsaXA4KHA2KSBjbGlwOChwNCkKKyAgICAgICAgQU5EICAgICAgcHAzcHAxLCByMHgwMEZGMDBGRiwgcDNwMSwgQVNSICM1ICAgIDsvLyBjbGlwOChwMykgY2xpcDgocDEpCisgICAgICAgIEFORCAgICAgIHBwMnBwMCwgcjB4MDBGRjAwRkYsIHAycDAsIEFTUiAjNSAgICA7Ly8gY2xpcDgocDIpIGNsaXA4KHAwKQorICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgb3V0ZXJDb3VudCwgb3V0ZXJDb3VudCwgIzEgICAgICAgICAgIDsvLyBvdXRlckNvdW50LS0KKyAgICAgIAorICAgICAgICBPUlIgICAgICBwMzIxMCwgcHAycHAwLCBwcDNwcDEsIExTTCAjOCAgICAgICAgOy8vIHBhY2sge3AzLHAyLCBwMSwgcDB9CisgICAgICAgIFNUUiAgICAgIHAzMjEwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3BEc3RbMF0gdG8gcERzdFszXX0gIAorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgcDc2NTQsIHBwNnBwNCwgcHA3cHA1LCBMU0wgIzggICAgICAgIDsvLyBwYWNrIHtwNyxwNiwgcDUsIHA0fQorICAgICAgICBNX1NUUiAgICBwNzY1NCwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtwRHN0WzRdIHRvIHBEc3RbN119CisKKyAgICAgICAgU0FERDE2ICAgcDdwNSwgICBwN3A1LCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDcgKyBjfSwge3A1ICsgY30KKyAgICAgICAgU0FERDE2ICAgcDZwNCwgICBwNnA0LCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDYgKyBjfSwge3A0ICsgY30KKyAgICAgICAgU0FERDE2ICAgcDNwMSwgICBwM3AxLCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDMgKyBjfSwge3AxICsgY30KKyAgICAgICAgU0FERDE2ICAgcDJwMCwgICBwMnAwLCAgIGMgICAgICAgICAgICAgICAgICAgIDsvLyB7cDIgKyBjfSwge3AwICsgY30KKyAgICAgIAorICAgICAgICBCTkUgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDggdGltZXMKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTcyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpAQCAtMCwwICsxLDUwMSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUyAgICAKKyAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9WRVJULCBPTVhfVkNfMTZYMTZfSE9SIAorICAgIERDRCAgT01YX1ZDXzE2WDE2X0RDLCAgIE9NWF9WQ18xNlgxNl9QTEFORQorICAgIAorICAgIElGIEFSTTExMzZKUworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cyAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK0JMS19TSVpFICAgICAgICBFUVUgMHgxMAorTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCitNVUxfQ09OU1QxICAgICAgRVFVIDB4MDAwNjAwMDQKK01VTF9DT05TVDIgICAgICBFUVUgMHgwMDA3MDAwNQorTVVMX0NPTlNUMyAgICAgIEVRVSAweDAwMDMwMDAxCitNQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoreSAgICAgICAgICAgICAgIFJOIDEyICAgCitwYyAgICAgICAgICAgICAgUk4gMTUgICAKKworcmV0dXJuICAgICAgICAgIFJOIDAgICAgCitpbm5lckNvdW50ICAgICAgUk4gMCAgICAKK291dGVyQ291bnQgICAgICBSTiAxICAgIAorcFNyY0xlZnQyICAgICAgIFJOIDEgICAgCitwRHN0MiAgICAgICAgICAgUk4gMiAgICAKK3N1bSAgICAgICAgICAgICBSTiA2ICAgIAorcFRhYmxlICAgICAgICAgIFJOIDkgICAgCit0ZW1wMSAgICAgICAgICAgUk4gMTAgICAKK3RlbXAyICAgICAgICAgICBSTiAxMiAgIAorY011bDEgICAgICAgICAgIFJOIDExICAgCitjTXVsMiAgICAgICAgICAgUk4gMTIgICAKK2NvdW50ICAgICAgICAgICBSTiAxMiAgIAorZHN0U3RlcHgyICAgICAgIFJOIDExICAgCitsZWZ0U3RlcHgyICAgICAgUk4gMTQgICAKK3IweDAxMDEwMTAxICAgICBSTiAxMCAgIAorcjB4MDBGRjAwRkYgICAgIFJOIDExCisKK3RWYWwwICAgICAgICAgICBSTiAwICAgIAordFZhbDEgICAgICAgICAgIFJOIDEgICAgCit0VmFsMiAgICAgICAgICAgUk4gMiAgICAKK3RWYWwzICAgICAgICAgICBSTiAzICAgIAordFZhbDQgICAgICAgICAgIFJOIDQgICAgCit0VmFsNSAgICAgICAgICAgUk4gNSAgICAKK3RWYWw2ICAgICAgICAgICBSTiA2ICAgIAordFZhbDcgICAgICAgICAgIFJOIDcgICAgCit0VmFsOCAgICAgICAgICAgUk4gOCAgICAKK3RWYWw5ICAgICAgICAgICBSTiA5ICAgIAordFZhbDEwICAgICAgICAgIFJOIDEwICAgCit0VmFsMTEgICAgICAgICAgUk4gMTEgICAKK3RWYWwxMiAgICAgICAgICBSTiAxMiAgIAordFZhbDE0ICAgICAgICAgIFJOIDE0ICAgCisKK2IgICAgICAgICAgICAgICBSTiAxMiAgIAorYyAgICAgICAgICAgICAgIFJOIDE0ICAgCisKK3AycDAgICAgICAgICAgICBSTiAwICAgIAorcDNwMSAgICAgICAgICAgIFJOIDEgICAgCitwNnA0ICAgICAgICAgICAgUk4gMiAgICAKK3A3cDUgICAgICAgICAgICBSTiA0ICAgIAorcDEwcDggICAgICAgICAgIFJOIDYgICAgCitwMTFwOSAgICAgICAgICAgUk4gNyAgICAKK3AxNHAxMiAgICAgICAgICBSTiA4ICAgIAorcDE1cDEzICAgICAgICAgIFJOIDkgICAgCisKK3AzMjEwICAgICAgICAgICBSTiAxMCAgIAorcDc2NTQgICAgICAgICAgIFJOIDEwICAgCitwMTExMDk4ICAgICAgICAgUk4gMTAgICAKK3AxNTE0MTMxMiAgICAgICBSTiAxMCAgIAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYsIHIxMQorICAgICAgICAKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgTGVmdFN0ZXAsICAgICA0CisgICAgICAgIE1fQVJHICAgIERzdFN0ZXAsICAgICAgNAorICAgICAgICBNX0FSRyAgICBQcmVkTW9kZSwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgQXZhaWxhYmlsaXR5LCA0CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB5LCAjQkxLX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgTG9vcCBDb3VudAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfVkVSVAorICAgICAgICBMRE0gICAgICBwU3JjQWJvdmUsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX07Ly8gdFZhbCA2IHRvIDkgPSBwU3JjQWJvdmVbMCB0byAxNV0KKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MiAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0YWxsIG91dHNpZGUgdGhlIGxvb3AKKworTE9PUF9WRVJUCisgICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIEJORSAgICAgIExPT1BfVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisKKyAgICAgICAgCitPTVhfVkNfMTZYMTZfSE9SCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NiAKKyAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgPU1VTF9DT05TVDAgICAgICAgICAgICA7Ly8gQ29uc3QgdG8gcmVwZWF0IHRoZSBieXRlIGluIHJlZyA0IHRpbWVzCisgICAgICAgIE1PViAgICAgIHksICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIE1fTERSQiAgIHRWYWw2LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsNiA9IHBTcmNMZWZ0WzAgdG8gM10KKyAgICAgICAgQUREICAgICAgcERzdDIsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3QyLSBwRHN0IGFkdmFuY2VkIGJ5IGRzdFN0ZXAKKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWwxID0gcFNyY0xlZnRbNCB0byA3XQorICAgICAgICBBREQgICAgICBkc3RTdGVweDIsIGRzdFN0ZXAsIGRzdFN0ZXAgICAgICAgICA7Ly8gZG91YmxlIGRzdFN0ZXAKKyAgICAgICAgU1VCICAgICAgZHN0U3RlcHgyLCBkc3RTdGVweDIsICMxMiAgICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwICBtaW51cyAxMgorICAgICAgIAorTE9PUF9IT1IgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVwICAgICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswIHRvIDNdCisgICAgICAgIE1VTCAgICAgIHRWYWw2LCB0VmFsNiwgcjB4MDEwMTAxMDEgICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnRdLCArbGVmdFN0ZXAgICAgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzQgdG8gN10KKyAgICAgICAgTVVMICAgICAgdFZhbDcsIHRWYWw3LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQorICAgICAgICBTVFIgICAgICB0VmFsNiwgW3BEc3RdLCAgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzAgdG8gM10gCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzAgdG8gM10KKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw3LCBbcERzdDJdLCAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDd9IGF0IHBEc3QyWzQgdG8gN10KKyAgICAgICAgTVVMICAgICAgdFZhbDgsIHRWYWw4LCByMHgwMTAxMDEwMSAgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgU1RSICAgICAgdFZhbDYsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFs4IHRvIDExXQorICAgICAgICBTVFIgICAgICB0VmFsNywgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls4IHRvIDExXQorICAgICAgICBNVUwgICAgICB0VmFsOSwgdFZhbDksIHIweDAxMDEwMTAxICAgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX1NUUiAgICB0VmFsNiwgW3BEc3RdLCBkc3RTdGVweDIgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw2fSBhdCBwRHN0WzEyIHRvIDE1XQorICAgICAgICBNX1NUUiAgICB0VmFsNywgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KKyAgICAgICAgU1RSICAgICAgdFZhbDgsIFtwRHN0XSwgICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFswIHRvIDNdIAorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlswIHRvIDNdCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbNCB0byA3XQorICAgICAgICBTVFIgICAgICB0VmFsOSwgW3BEc3QyXSwgIys0ICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0Mls0IHRvIDddCisgICAgICAgIFNUUiAgICAgIHRWYWw4LCBbcERzdF0sICAjKzQgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3RbOCB0byAxMV0KKyAgICAgICAgU1RSICAgICAgdFZhbDksIFtwRHN0Ml0sICMrNCAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsN30gYXQgcERzdDJbOCB0byAxMV0KKyAgICAgICAgTV9TVFIgICAgdFZhbDgsIFtwRHN0XSwgZHN0U3RlcHgyICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdFsxMiB0byAxNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDYsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw2ID0gcFNyY0xlZnRbMCB0byAzXQorICAgICAgICBNX1NUUiAgICB0VmFsOSwgW3BEc3QyXSwgZHN0U3RlcHgyICAgICAgICAgICA7Ly8gc3RvcmUge3RWYWw3fSBhdCBwRHN0MlsxMiB0byAxNV0KKyAgICAgICAgTV9MRFJCICAgdFZhbDcsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcCAgICAgICAgOy8vIHRWYWw3ID0gcFNyY0xlZnRbNCB0byA3XQorICAgICAgICBCTkUgICAgICBMT09QX0hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9vcCBmb3IgMyB0aW1lcworICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK09NWF9WQ18xNlgxNl9EQworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3VudCA9IDAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSICAgICAgICAgOy8vIGlmKGF2YWlsYWJpbGl0eSAmICNPTVhfVkNfVVBQRVIpCisgICAgICAgIEJFUSAgICAgIFRTVF9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBKdW1wIHRvIExlZnQgaWYgbm90IHVwcGVyCisgICAgICAgIExETSAgICAgIHBTcmNBYm92ZSx7dFZhbDgsdFZhbDksdFZhbDEwLHRWYWwxMX07Ly8gdFZhbCA4IHRvIDExID0gcFNyY0Fib3ZlWzAgdG8gMTVdCisgICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiB1cHBlciBpbmMgY291bnQgYnkgMQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWwyLCB0VmFsOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDYsIHRWYWw5ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs0LCA2XQorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw2ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzQsIDZdCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsOCwgUk9SICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgVVhUQjE2ICAgdFZhbDksIHRWYWw5LCBST1IgIzggICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVs1LCA3XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdICsgcFNyY0Fib3ZlWzUsIDddCisgICAgICAgIFVBREQxNiAgIHRWYWwyLCB0VmFsMiwgdFZhbDggICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVs3XSkKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw4LCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOCwgMTBdCisgICAgICAgIFVYVEIxNiAgIHRWYWw5LCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTIsIDE0XQorICAgICAgICBVQUREMTYgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzgsIDEwXSArIHBTcmNBYm92ZVsxMiwgMTRdCisgICAgICAgIFVYVEIxNiAgIHRWYWwxMCwgdFZhbDEwLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbOSwgMTFdCisgICAgICAgIFVYVEIxNiAgIHRWYWwxMSwgdFZhbDExLCBST1IgIzggICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTMsIDE1XQorICAgICAgICBVQUREMTYgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzksIDExXSArIHBTcmNBYm92ZVsxMywgMTVdCisgICAgICAgIFVBREQxNiAgIHRWYWw4LCB0VmFsOCwgdFZhbDEwICAgICAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzhdIHRvIHBTcmNBYm92ZVsxNV0pCisgICAgICAgIAorICAgICAgICBVQUREMTYgICB0VmFsMiwgdFZhbDIsIHRWYWw4ICAgICAgICAgICAgICAgICA7Ly8gc3VtKHBTcmNBYm92ZVswXSB0byBwU3JjQWJvdmVbMTVdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHRWYWwyLCB0VmFsMiwgdFZhbDIsIExTUiAjMTYgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVsxNV0pCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtLCB0VmFsMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4dHJhY3QgdGhlIGxvd2VyIGhhbGYgZm9yIHJlc3VsdAorICAgICAgICAKK1RTVF9MRUZUICAgICAgICAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UCisgICAgICAgIEFERCAgICAgIGxlZnRTdGVweDIsIGxlZnRTdGVwLGxlZnRTdGVwICAgICAgIDsvLyBsZWZ0U3RlcHgyID0gMiAqIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHBTcmNMZWZ0MiwgcFNyY0xlZnQsIGxlZnRTdGVwICAgICAgIDsvLyBwU3JjTGVmdDIgPSBwU3JjTGVmdCArIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgW3BTcmNMZWZ0XSwgICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDggPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICB0VmFsOSwgW3BTcmNMZWZ0Ml0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDkgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFtwU3JjTGVmdF0sICtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDEwPSBwU3JjTGVmdFsyXQorICAgICAgICBNX0xEUkIgICB0VmFsMTEsIFtwU3JjTGVmdDJdLCtsZWZ0U3RlcHgyICAgICA7Ly8gdFZhbDExPSBwU3JjTGVmdFszXQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgIDsvLyBJbmMgQ291bnRlciBpZiBMZWZ0IGlzIGF2YWlsYWJsZQorICAgICAgICBBREQgICAgICB0VmFsNiwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsMTAgKyB0VmFsMTEKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHN1bSwgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSB0VmFsOCArIHRWYWwxMAorICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNworICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCBbcFNyY0xlZnRdLCAgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIHRWYWw5LCBbcFNyY0xlZnQyXSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsOSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3BTcmNMZWZ0XSwgK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTA9IHBTcmNMZWZ0WzJdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3BTcmNMZWZ0Ml0sK2xlZnRTdGVweDIgICAgIDsvLyB0VmFsMTE9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIHN1bSwgc3VtLCB0VmFsNyAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSBzdW0gKyB0VmFsNworICAgICAgICBBREQgICAgICB0VmFsOCwgdFZhbDgsIHRWYWw5ICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSB0VmFsOCArIHRWYWw5CisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsMTEgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IHRWYWwxMCArIHRWYWwxMQorICAgICAgICBBREQgICAgICB0VmFsNywgdFZhbDgsIHRWYWwxMCAgICAgICAgICAgICAgICA7Ly8gdFZhbDcgPSB0VmFsOCArIHRWYWwxMAorICAgICAgICBBREQgICAgICBzdW0sIHN1bSwgdFZhbDcgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtID0gc3VtICsgdFZhbDcKKworVFNUX0NPVU5UICAgICAgICAKKyAgICAgICAgQ01QICAgICAgY291bnQsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCisgICAgICAgIE1PVkVRICAgIHN1bSwgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdW0gPSAxMjggaWYoY291bnQgPT0gMCkKKyAgICAgICAgQkVRICAgICAgVFNUX0NPVU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmKGNvdW50ID09IDApCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZihjb3VudCA9PSAxKQorICAgICAgICBBRERFUSAgICBzdW0sIHN1bSwgIzggICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDggaWYoY291bnQgPT0gMSkKKyAgICAgICAgQURETkUgICAgc3VtLCBzdW0sIHRWYWwyICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA9IHN1bWxlZnQgKyBzdW11cHBlcgorICAgICAgICBBRERORSAgICBzdW0sIHN1bSwgIzE2ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3VtICs9IDE2IGlmKGNvdW50ID09IDIpCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgVVhUSCAgICAgc3VtLCBzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSBvbmx5IGJ5dGUgcmVzdCBjbGVhcmVkCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTFNSRVEgICAgc3VtLCBzdW0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA0IGlmKGNvdW50ID09IDEpCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTFNSTkUgICAgc3VtLCBzdW0sICM1ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN1bSA+PiA1IGlmKGNvdW50ID09IDIpCisKK1RTVF9DT1VOVDAKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBPUlIgICAgICBzdW0sIHN1bSwgc3VtLCBMU0wgIzggICAgICAgICAgICAgICA7Ly8gc3VtIHJlcGxpY2F0ZWQgaW4gdHdvIGhhbGZ3b3JkCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgT1JSICAgICAgdFZhbDYsIHN1bSwgc3VtLCBMU0wgIzE2ICAgICAgICAgICAgOy8vIHN1bSAgcmVwbGljYXRlZCBpbiBhbGwgYnl0ZXMKKyAgICAgICAgQ1BZICAgICAgdFZhbDcsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxID0gdFZhbDAKKyAgICAgICAgQ1BZICAgICAgdFZhbDgsIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwyID0gdFZhbDAKKyAgICAgICAgQ1BZICAgICAgdFZhbDksIHRWYWw2ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwzID0gdFZhbDAKKyAgICAgICAgQUREICAgICAgZHN0U3RlcHgyLCBkc3RTdGVwLCBkc3RTdGVwICAgICAgICAgOy8vIGRvdWJsZSBkc3RTdGVwCisgICAgICAgIEFERCAgICAgIHBEc3QyLCBwRHN0LCBkc3RTdGVwICAgICAgICAgICAgICAgIDsvLyBwRHN0Mi0gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIE1PViAgICAgIHksICNCTEtfU0laRSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXRlciBMb29wIENvdW50CisgICAgICAgIAorTE9PUF9EQyAgICAgICAgCisgICAgICAgIFNUTSAgICAgIHBEc3QsIHt0VmFsNix0VmFsNyx0VmFsOCx0VmFsOX0gICAgIDsvLyBwRHN0WzAgdG8gMTVdID0gdFZhbCA2IHRvIDkKKyAgICAgICAgU1VCUyAgICAgeSwgeSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHktLQorICAgICAgICBBREQgICAgICBwRHN0LCBwRHN0LCBkc3RTdGVweDIgICAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIFNUTSAgICAgIHBEc3QyLCB7dFZhbDYsdFZhbDcsdFZhbDgsdFZhbDl9ICAgIDsvLyBwRHN0MlsxNiB0byAzMV0gPSB0VmFsIDYgdG8gOQorICAgICAgICBBREQgICAgICBwRHN0MiwgcERzdDIsIGRzdFN0ZXB4MiAgICAgICAgICAgICA7Ly8gcERzdCBhZHZhbmNlZCBieSBkc3RTdGVwCisgICAgICAgIEJORSAgICAgIExPT1BfREMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb29wIGZvciA4IHRpbWVzCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVAorCitPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIFJTQiAgICAgIHRWYWwxNCwgbGVmdFN0ZXAsIGxlZnRTdGVwLCBMU0wgIzQgIDsvLyB0VmFsMTQgPSAxNSpsZWZ0U3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgTERSQiAgICAgdFZhbDEwLCBbcFNyY0xlZnQsICB0VmFsMTRdICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQorICAgICAgICBMRFJCICAgICB0VmFsMTEsIFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICA7Ly8gdFZhbDExID0gcFNyY0Fib3ZlTGVmdFswXQorICAgICAgICBMRFJCICAgICB0VmFsMTIsIFtwU3JjQWJvdmUsICMxNV0KKworICAgICAgICBBREQgICAgICB0VmFsMiwgIHRWYWwxMiwgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDIgID0gcFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXQorICAgICAgICBTVUIgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMSAgICAgICAgICAgICA7Ly8gdFZhbDEwID0gVjAgPSBwU3JjTGVmdFsxNSpsZWZ0U3RlcF0gLSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIFNVQiAgICAgIHRWYWwxMSwgdFZhbDEyLCAgdFZhbDExICAgICAgICAgICAgIDsvLyB0VmFsMTEgPSBIMCA9IHBTcmNBYm92ZVsxNV0gLSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDIsICAgTFNMICM0ICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhID0gMTYgKiAocFNyY0Fib3ZlWzE1XSArIHBTcmNMZWZ0WzE1KmxlZnRTdGVwXSkKKworICAgICAgICBNT1YgICAgIHRWYWwxMSwgdFZhbDExLCBMU0wgIzMgICAgICAgICAgICAgIDsvLyA4KlsxNV0tWy0xXQorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMF0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzE0XQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgUlNCICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzMgICAgICAgICA7Ly8gNypbMTRdLVswXQorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjMV0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEzXQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMxICAgICAgICAgOy8vIDYqWzEzXS1bMV0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzJdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMl0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDgsIHRWYWw4LCB0VmFsOCwgTFNMICMyICAgICAgICAgOy8vIDUqWzEyXS1bMl0KKyAgICAgICAgQUREICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgKKyAgICAgICAgTERSQiAgICB0VmFsNiwgW3BTcmNBYm92ZSwgIzNdCisgICAgICAgIExEUkIgICAgdFZhbDcsIFtwU3JjQWJvdmUsICMxMV0KKyAgICAgICAgU1VCICAgICB0VmFsOCwgdFZhbDcsIHRWYWw2CisgICAgICAgIEFERCAgICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4LCBMU0wgIzIgICAgICAgOy8vICsgNCpbMTFdLVszXQorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNF0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzEwXQorICAgICAgICBTVUIgICAgIHRWYWw4LCB0VmFsNywgdFZhbDYKKyAgICAgICAgQUREICAgICB0VmFsOCwgdFZhbDgsIHRWYWw4LCBMU0wgIzEgICAgICAgICA7Ly8gMypbMTBdLVs0XQorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOAorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNV0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzldCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNgorICAgICAgICBBREQgICAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCwgTFNMICMxICAgICAgIDsvLyArIDIqWzldLVs1XQorICAgICAgICBMRFJCICAgIHRWYWw2LCBbcFNyY0Fib3ZlLCAjNl0KKyAgICAgICAgTERSQiAgICB0VmFsNywgW3BTcmNBYm92ZSwgIzhdCisgICAgICAgIFNVQiAgICAgdFZhbDgsIHRWYWw3LCB0VmFsNiAgICAgICAgICAgICAgICAgOy8vIDEqWzhdLVs2XQorICAgICAgICBBREQgICAgIHRWYWw3LCB0VmFsMTEsIHRWYWw4CisKKyAgICAgICAgQUREICAgICAgdFZhbDIsICB0VmFsMiwgICAjMTYgICAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IGEgKyAxNgorICAgICAgICBNT1YgICAgICB0VmFsMSwgIHBTcmNMZWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgID0gcFNyY0xlZnQKKyAgICAgICAgU1VCICAgICAgdFZhbDksICB0VmFsMTQsICAgbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw5ICA9IDE0KmxlZnRTdGVwCisgICAgICAgIEFERCAgICAgIHRWYWw5LCAgcFNyY0xlZnQsIHRWYWw5ICAgICAgICAgICAgIDsvLyB0VmFsOSAgPSBwU3JjTGVmdCArIDE0KmxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTQqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMSwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTEgPSBwU3JjTGVmdFswXQorICAgICAgICBBREQgICAgICB0VmFsNywgIHRWYWw3LCAgdFZhbDcsICBMU0wgIzIgICAgICA7Ly8gdFZhbDcgID0gNSAqIEgKKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICMzMiAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IDUgKiBIICsgMzIKKyAgICAgICAgU1VCICAgICAgdFZhbDgsICB0VmFsOCwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzE0KmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzBdCisgICAgICAgIEFTUiAgICAgIHRWYWwxMiwgdFZhbDcsICAjNiAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTIgPSBiID0gKDUgKiBIICsgMzIpID4+IDYKKyAgICAgICAgCisgICAgICAgIFJTQiAgICAgIHRWYWw4LCAgdFZhbDgsICB0VmFsOCwgIExTTCAjMyAgICAgIDsvLyB0VmFsOCAgPSBWMSA9IDcqIChwU3JjTGVmdFsxNCpsZWZ0U3RlcF0tcFNyY0xlZnRbMF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDgsICB0VmFsMTAsIExTTCAjMyAgICAgIDsvLyB0VmFsNiAgPSBWID0gVjAgK1YxCisgICAgICAgIE1fTERSQiAgIHRWYWw4LCAgW3RWYWw5XSwgLWxlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsOCAgPSBwU3JjTGVmdFsxMypsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0W2xlZnRTdGVwXQorICAgICAgICBSU0IgICAgICB0VmFsNywgIHRWYWwxMiwgIHRWYWwxMiwgIExTTCAjMyAgICA7Ly8gdFZhbDcgID0gNypiCisgICAgICAgIFNVQiAgICAgIHRWYWwyLCAgdFZhbDIsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsMiAgPSBhICsgMTYgLSA3KmIKKyAgICAgICAgU1VCICAgICAgdFZhbDcsICB0VmFsOCwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWw3ICA9IHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTIqbFNdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSAyICogKHBTcmNMZWZ0WzEzKmxlZnRTdGVwXSAtIHBTcmNMZWZ0W2xlZnRTdGVwXSkKKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzIqbGVmdFN0ZXBdICAgICAgICAKKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMSAgICAgOy8vIHRWYWw3ICA9IDYgKiAocFNyY0xlZnRbMTMqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWMgorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDgsICBbdFZhbDldLCAtbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWw4ICA9IHBTcmNMZWZ0WzExKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsMTAsIFt0VmFsMV0sICtsZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDEwID0gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgQUREICAgICAgdFZhbDcsICB0VmFsNywgICB0VmFsNywgIExTTCAjMiAgICAgOy8vIHRWYWw3ICA9IDUgKiAocFNyY0xlZnRbMTIqbGVmdFN0ZXBdIC0gcFNyY0xlZnRbMipsZWZ0U3RlcF0pCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcgICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFYzCisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbMTAqbGVmdFN0ZXBdCisgICAgICAgIE1fTERSQiAgIHRWYWwxMCwgW3RWYWwxXSwgK2xlZnRTdGVwICAgICAgICAgIDsvLyB0VmFsMTAgPSBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3LCAgTFNMICMyICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNAorICAgICAgICBTVUIgICAgICBkc3RTdGVwLCBkc3RTdGVwLCAjMTYgICAgICAgICAgICAgICA7Ly8gdFZhbDUgID0gZHN0U3RlcCAtIDE2CisgICAgICAgIFNVQiAgICAgIHRWYWw3LCAgdFZhbDgsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwU3JjTGVmdFsxMCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw3LCAgdFZhbDcsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNyAgPSAzICogKHBTcmNMZWZ0WzEwKmxlZnRTdGVwXSAtIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdKQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNQorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOSpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs1KmxlZnRTdGVwXQorICAgICAgICBNX0xEUkIgICB0VmFsOCwgIFt0VmFsOV0sIC1sZWZ0U3RlcCAgICAgICAgICA7Ly8gdFZhbDggID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0KKyAgICAgICAgTV9MRFJCICAgdFZhbDEwLCBbdFZhbDFdLCArbGVmdFN0ZXAgICAgICAgICAgOy8vIHRWYWwxMCA9IHBTcmNMZWZ0WzYqbGVmdFN0ZXBdCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgdFZhbDYsICAgdFZhbDcsICBMU0wgIzEgICAgIDsvLyB0VmFsNiAgPSBWID0gViArIFY2CisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICBTVUIgICAgICB0VmFsNywgIHRWYWw4LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDcgID0gcFNyY0xlZnRbOCpsZWZ0U3RlcF0gLSBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gViA9IFYgKyBWNworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgQUREICAgICAgdFZhbDYsICB0VmFsNiwgICB0VmFsNiwgIExTTCAjMiAgICAgOy8vIHRWYWw2ICA9IDUqVgorICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgICMzMiAgICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gNSpWICsgMzIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIEFTUiAgICAgIHRWYWwxNCwgdFZhbDYsICAgIzYgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTQgPSBjID0gKDUqViArIDMyKT4+NgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgUlNCICAgICAgdFZhbDYsICB0VmFsMTQsICB0VmFsMTQsIExTTCAjMyAgICAgOy8vIHRWYWw2ICA9IDcqYworICAgICAgICBVWFRIICAgICB0VmFsMTQsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCisgICAgICAgIEFERCAgICAgIHRWYWwxMCwgdFZhbDEyLCAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsMTAgPSAyKmIKKyAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMTQsICB0VmFsMTQsIExTTCAjMTYgICAgOy8vIHRWYWwxNCA9IHtjICAsICBjfQorICAgICAgICBTVUIgICAgICB0VmFsNiwgIHRWYWwyLCAgIHRWYWw2ICAgICAgICAgICAgICA7Ly8gdFZhbDYgID0gZCA9IGEgLSA3KmIgLSA3KmMgKyAxNgorICAgICAgICBBREQgICAgICB0VmFsMSwgIHRWYWw2LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcHAyID0gZCArIDIqYgorICAgICAgICBBREQgICAgICB0VmFsMTAsIHRWYWwxMCwgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEwID0zKmIKKyAgICAgICAgT1JSICAgICAgdFZhbDAsICB0VmFsNiwgICB0VmFsMSwgIExTTCAjMTYgICAgOy8vIHR2YWwwICA9IHAycDAgICA9IHBhY2sge3AyLCBwMH0KKyAgICAgICAgVVhUSCAgICAgdFZhbDEyLCB0VmFsMTIgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMiA9IENsZWFyZWQgdGhlIHVwcGVyIGhhbGYgd29yZAorICAgICAgICBVWFRIICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyID0gQ2xlYXJlZCB0aGUgdXBwZXIgaGFsZiB3b3JkCisgICAgICAgIE9SUiAgICAgIHRWYWwxMiwgdFZhbDEyLCAgdFZhbDEyLCBMU0wgIzE2ICAgIDsvLyB0VmFsMTIgPSB7YiAgLCAgYn0KKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTAsIExTTCAjMTYgICAgOy8vIHRWYWwxMCA9IHszYiAsIDNifQorICAgICAgICBTQUREMTYgICB0VmFsMSwgIHRWYWwwLCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDEgID0gcDNwMSAgID0gcDJwMCAgICsge2IsYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDIsICB0VmFsMSwgICB0VmFsMTAgICAgICAgICAgICAgOy8vIHRWYWwyICA9IHA2cDQgICA9IHAzcDEgICArIHszYiwzYn0KKyAgICAgICAgU0FERDE2ICAgdFZhbDQsICB0VmFsMiwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWw0ICA9IHA3cDUgICA9IHA2cDQgICArIHtiLGJ9CisgICAgICAgIFNBREQxNiAgIHRWYWw2LCAgdFZhbDQsICAgdFZhbDEwICAgICAgICAgICAgIDsvLyB0VmFsNiAgPSBwMTBwOCAgPSBwN3A1ICAgKyB7M2IsM2J9CisgICAgICAgIFNBREQxNiAgIHRWYWw3LCAgdFZhbDYsICAgdFZhbDEyICAgICAgICAgICAgIDsvLyB0VmFsNyAgPSBwMTFwOSAgPSBwMTBwOCAgKyB7YixifQorICAgICAgICBTQUREMTYgICB0VmFsOCwgIHRWYWw3LCAgIHRWYWwxMCAgICAgICAgICAgICA7Ly8gdFZhbDggID0gcDE0cDEyID0gcDExcDkgICsgezNiLDNifQorICAgICAgICBTQUREMTYgICB0VmFsOSwgIHRWYWw4LCAgIHRWYWwxMiAgICAgICAgICAgICA7Ly8gdFZhbDkgID0gcDE1cDEzID0gcDE0cDEyICsge2IsYn0KKyAgICAgICAgTERSICAgICAgcjB4MDBGRjAwRkYsICAgICA9TUFTS19DT05TVCAgICAgICAgOy8vIHIweDAwRkYwMEZGID0gMHgwMEZGMDBGRgorICAgICAgICAKK0xPT1BfUExBTkUgICAgICAgIAorCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAzcDEKKyAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDJwMAorICAgICAgICBTQUREMTYgICBwM3AxLCAgIHAzcDEsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAycDAsICAgcDJwMCwgICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHA3cDUKKyAgICAgICAgVVNBVDE2ICAgdGVtcDEsICMxMywgcDZwNAorICAgICAgICBTQUREMTYgICBwN3A1LCAgIHA3cDUsICAgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHA2cDQsICAgcDZwNCwgICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIFVTQVQxNiAgIHRlbXAyLCAjMTMsIHAxMXA5CisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxMHA4CisgICAgICAgIFNBREQxNiAgIHAxMXA5LCAgcDExcDksICBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgcDEwcDgsICBwMTBwOCwgIGMgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICB0ZW1wMiwgcjB4MDBGRjAwRkYsIHRlbXAyLCBBU1IgIzUKKyAgICAgICAgQU5EICAgICAgdGVtcDEsIHIweDAwRkYwMEZGLCB0ZW1wMSwgQVNSICM1CisgICAgICAgIE9SUiAgICAgIHRlbXAxLCB0ZW1wMSwgdGVtcDIsIExTTCAjOAorICAgICAgICBTVFIgICAgICB0ZW1wMSwgW3BEc3RdLCAjNAorICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgdGVtcDIsICMxMywgcDE1cDEzCisgICAgICAgIFVTQVQxNiAgIHRlbXAxLCAjMTMsIHAxNHAxMgorICAgICAgICBTQUREMTYgICBwMTVwMTMsIHAxNXAxMywgYyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNBREQxNiAgIHAxNHAxMiwgcDE0cDEyLCBjICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgdGVtcDIsIHIweDAwRkYwMEZGLCB0ZW1wMiwgQVNSICM1CisgICAgICAgIEFORCAgICAgIHRlbXAxLCByMHgwMEZGMDBGRiwgdGVtcDEsIEFTUiAjNQorICAgICAgICBPUlIgICAgICB0ZW1wMSwgdGVtcDEsIHRlbXAyLCBMU0wgIzgKKyAgICAgICAgU1RSICAgICAgdGVtcDEsIFtwRHN0XSwgIzQKKyAgICAgICAgCisgICAgICAgIEFERFMgICAgIHIweDAwRkYwMEZGLCByMHgwMEZGMDBGRiwgIzE8PDI4ICAgICA7Ly8gTG9vcCBjb3VudGVyIHZhbHVlIGluIHRvcCA0IGJpdHMKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBCQ0MgICAgICBMT09QX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDE2IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBBUk0xMTM2SlMKKworICAgICAgICAgICAgCisgICAgICAgIEVORAorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IGVuZHMKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGY0NjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCkBAIC0wLDAgKzEsNTY3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQKKyAgICBEQ0QgIE9NWF9WQ180eDRfVkVSVCwgICAgIE9NWF9WQ180eDRfSE9SIAorICAgIERDRCAgT01YX1ZDXzR4NF9EQywgICAgICAgT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgRENEICBPTVhfVkNfNHg0X0RJQUdfRFIsICBPTVhfVkNfNHg0X1ZSCisgICAgRENEICBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgRENEICBPTVhfVkNfNHg0X0hVICAgCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBDb25zdGFudHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK0JMS19TSVpFICAgICAgICAgICAgICBFUVUgMHg4CitNVUxfQ09OU1QwICAgICAgICAgICAgRVFVIDB4MDEwMTAxMDEKK0FERF9DT05TVDEgICAgICAgICAgICBFUVUgMHg4MDgwODA4MAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityZXR1cm4gICAgICAgICAgUk4gMAorcFRhYmxlICAgICAgICAgIFJOIDkKK3BjICAgICAgICAgICAgICBSTiAxNQorcjB4MDEwMTAxMDEgICAgIFJOIDEKK3IweDgwODA4MDgwICAgICBSTiAwCisKK3RWYWwwICAgICAgICAgICBSTiAwCit0VmFsMSAgICAgICAgICAgUk4gMQordFZhbDIgICAgICAgICAgIFJOIDIKK3RWYWw0ICAgICAgICAgICBSTiA0Cit0VmFsNiAgICAgICAgICAgUk4gNgordFZhbDcgICAgICAgICAgIFJOIDcKK3RWYWw4ICAgICAgICAgICBSTiA4Cit0VmFsOSAgICAgICAgICAgUk4gOQordFZhbDEwICAgICAgICAgIFJOIDEwCit0VmFsMTEgICAgICAgICAgUk4gMTEKK3RWYWwxMiAgICAgICAgICBSTiAxMgordFZhbDE0ICAgICAgICAgIFJOIDE0CisKK091dDAgICAgICAgICAgICBSTiA2CitPdXQxICAgICAgICAgICAgUk4gNworT3V0MiAgICAgICAgICAgIFJOIDgKK091dDMgICAgICAgICAgICBSTiA5CisKK0xlZnQwICAgICAgICAgICBSTiA2CitMZWZ0MSAgICAgICAgICAgUk4gNworTGVmdDIgICAgICAgICAgIFJOIDgKK0xlZnQzICAgICAgICAgICBSTiA5CisKK0Fib3ZlMDEyMyAgICAgICBSTiAxMgorQWJvdmU0NTY3ICAgICAgIFJOIDE0CisKK0Fib3ZlTGVmdCAgICAgICBSTiAxMAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgcjExCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwVGFibGUsPWFybVZDTTRQMTBfcFN3aXRjaFRhYmxlNHg0ICA7Ly8gTG9hZCBpbmRleCB0YWJsZSBmb3Igc3dpdGNoIGNhc2UKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSICAgIHByZWRNb2RlLCBQcmVkTW9kZSAgICAgICAgICAgICAgICAgIDsvLyBBcmcgcHJlZE1vZGUgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBsZWZ0U3RlcCwgTGVmdFN0ZXAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgZHN0U3RlcCwgIERzdFN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIEFyZyBkc3RTdGVwIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAgICAgICAgIAorICAgICAgICBNX0xEUiAgICBhdmFpbGFiaWxpdHksIEF2YWlsYWJpbGl0eSAgICAgICAgICA7Ly8gQXJnIGF2YWlsYWJpbGl0eSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwYywgW3BUYWJsZSwgcHJlZE1vZGUsIExTTCAjMl0gICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIHByZU1vZGUKKworT01YX1ZDXzR4NF9WRVJUCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gcFNyY0Fib3ZlWzAgdG8gM10KKyAgICAgICAgTV9TVFIgICAgQWJvdmUwMTIzLCAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgOy8vIHBEc3RbMCAgdG8gM10gID0gQWJvdmUwMTIzCisgICAgICAgIE1fU1RSICAgIEFib3ZlMDEyMywgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgIDsvLyBwRHN0WzQgIHRvIDddICA9IEFib3ZlMDEyMworICAgICAgICBNX1NUUiAgICBBYm92ZTAxMjMsICBbcERzdF0sICBkc3RTdGVwICAgICAgICA7Ly8gcERzdFs4ICB0byAxMV0gPSBBYm92ZTAxMjMKKyAgICAgICAgU1RSICAgICAgQWJvdmUwMTIzLCAgW3BEc3RdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTIgdG8gMTVdID0gQWJvdmUwMTIzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDXzR4NF9IT1IKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz02IAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIENvbnN0IHRvIHJlcGVhdCB0aGUgYnl0ZSBpbiByZWcgNCB0aW1lcworICAgICAgICBNX0xEUkIgICBMZWZ0MCwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDAgPSBwU3JjTGVmdFswXQorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgPSBwU3JjTGVmdFsxXQorICAgICAgICBNX0xEUkIgICBMZWZ0MiwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDIgPSBwU3JjTGVmdFsyXQorICAgICAgICBMRFJCICAgICBMZWZ0MywgIFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gTGVmdDMgPSBwU3JjTGVmdFszXQorICAgICAgICBNVUwgICAgICBPdXQwLCAgIExlZnQwLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQxLCAgIExlZnQxLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQyLCAgIExlZnQyLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNVUwgICAgICBPdXQzLCAgIExlZnQzLCAgIHIweDAxMDEwMTAxICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzAgIHRvIDMgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQxfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQyfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0RDCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NgorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgYXZhaWxhYmlsaXR5LCAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQ01QICAgICAgYXZhaWxhYmlsaXR5LCAgIyhPTVhfVkNfVVBQRVIgKyBPTVhfVkNfTEVGVCkKKyAgICAgICAgQk5FICAgICAgVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGJvdGgKKyAgICAgICAgTERSICAgICAgQWJvdmUwMTIzLCAgW3BTcmNBYm92ZV0gICAgICAgICAgICAgOy8vIEFib3ZlMDEyMyAgPSBwU3JjQWJvdmVbMCB0byAzXQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEIxNiAgIHRWYWw3LCAgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0KKyAgICAgICAgVVhUQjE2ICAgdFZhbDYsICBBYm92ZTAxMjMsICBST1IgIzggICAgICAgICAgOy8vIHBTcmNBYm92ZVsxLCAzXQorICAgICAgICBVQUREMTYgICB0VmFsMTEsIHRWYWw2LCAgIHRWYWw3ICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAsIDJdICsgcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIEFERCAgICAgIHRWYWwxMSwgdFZhbDExLCAgTFNSICMxNiAgICAgICAgICAgIDsvLyBzdW0ocFNyY0Fib3ZlWzBdIHRvIHBTcmNBYm92ZVszXSkKKyAgICAgICAgTV9MRFJCICAgTGVmdDIsICBbcFNyY0xlZnRdLCAgbGVmdFN0ZXAgICAgICAgOy8vIExlZnQyID0gcFNyY0xlZnRbMl0KKyAgICAgICAgTERSQiAgICAgTGVmdDMsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQzID0gcFNyY0xlZnRbM10KKyAgICAgICAgVVhUSCAgICAgdFZhbDExLCB0VmFsMTEgICAgICAgICAgICAgICAgICAgICAgOy8vIHVwc3VtMSAoQ2xlYXIgdGhlIHRvcCBqdW5rIGJpdHMpCisgICAgICAgIEFERCAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyB0VmFsNiA9IExlZnQwICsgTGVmdDEKKyAgICAgICAgQUREICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQzICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gTGVmdDIgKyBMZWZ0MworICAgICAgICBBREQgICAgICB0VmFsNiwgIHRWYWw2LCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDYgPSB0VmFsNiArIHRWYWw3CisgICAgICAgIEFERCAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyBPdXQwICA9IHRWYWw2ICsgdFZhbDExICAgCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICAjNCAgICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgKyA0CisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgID1NVUxfQ09OU1QwICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgIExTUiAjMyAgICAgICAgICAgICAgIDsvLyBPdXQwID0gKE91dDAgKyA0KT4+MworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1VTCAgICAgIE91dDAsICAgT3V0MCwgIHIweDAxMDEwMTAxICAgICAgICAgIDsvLyByZXBsaWNhdGUgdGhlIHZhbCBpbiBhbGwgdGhlIGJ5dGVzCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MCwgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFsxMiB0byAxNV0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorVXBwZXJPckxlZnRPck5vbmVBdmFpbGFibGUKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTMKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIGF2YWlsYWJpbGl0eSwgICNPTVhfVkNfVVBQRVIgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCTkUgICAgICBMZWZ0T3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzICA9IHBTcmNBYm92ZVswIHRvIDNdCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgVVhUQjE2ICAgdFZhbDcsICBBYm92ZTAxMjMgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswLCAyXQorICAgICAgICBVWFRCMTYgICB0VmFsNiwgIEFib3ZlMDEyMywgIFJPUiAjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzEsIDNdCisgICAgICAgIFVBREQxNiAgIE91dDAsICAgdFZhbDYsICB0VmFsNyAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCwgMl0gKyBwU3JjQWJvdmVbMSwgM10KKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICAgPU1VTF9DT05TVDAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgQUREICAgICAgT3V0MCwgICBPdXQwLCAgIExTUiAjMTYgICAgICAgICAgICAgOy8vIHN1bShwU3JjQWJvdmVbMF0gdG8gcFNyY0Fib3ZlWzNdKQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFVYVEggICAgIE91dDAsICAgT3V0MCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB1cHN1bTEgKENsZWFyIHRoZSB0b3AganVuayBiaXRzKQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzQgIHRvIDcgXSAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHt0VmFsNn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7dFZhbDZ9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICAKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorTGVmdE9yTm9uZUF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgICA9TVVMX0NPTlNUMCAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBDTVAgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfTEVGVAorICAgICAgICBCTkUgICAgICBOb25lQXZhaWxhYmxlCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIEFERCAgICAgIE91dDAsICAgTGVmdDAsICBMZWZ0MSAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IExlZnQwICsgTGVmdDEKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBBREQgICAgICBPdXQxLCAgIExlZnQyLCAgTGVmdDMgICAgICAgICAgICAgICA7Ly8gT3V0MSAgPSBMZWZ0MiArIExlZnQzCisgICAgICAgIEFERCAgICAgIE91dDAsICAgT3V0MCwgICBPdXQxICAgICAgICAgICAgICAgIDsvLyBPdXQwICA9IE91dDAgICsgT3V0MQorICAgICAgICBBREQgICAgICBPdXQwLCAgIE91dDAsICAgIzIgICAgICAgICAgICAgICAgICA7Ly8gT3V0MCAgPSBPdXQwICsgMgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIE91dDAsICAgT3V0MCwgICBMU1IgIzIgICAgICAgICAgICAgIDsvLyBPdXQwICA9IChPdXQwICsgMik+PjIKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNVUwgICAgICBPdXQwLCAgIE91dDAsICAgcjB4MDEwMTAxMDEgICAgICAgICA7Ly8gcmVwbGljYXRlIHRoZSB2YWwgaW4gYWxsIHRoZSBieXRlcworICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFswICB0byAzIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sICBkc3RTdGVwICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSBhdCBwRHN0IFs0ICB0byA3IF0gCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIFNUUiAgICAgIE91dDAsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorCitOb25lQXZhaWxhYmxlCisgICAgICAgIE1PViAgICAgIE91dDAsICAgIzEyOCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBPdXQwID0gMTI4IGlmKGNvdW50ID09IDApCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9NQorICAgICAgICAKKyAgICAgICAgTVVMICAgICAgT3V0MCwgICBPdXQwLCAgcjB4MDEwMTAxMDEgICAgICAgICAgOy8vIHJlcGxpY2F0ZSB0aGUgdmFsIGluIGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gYXQgcERzdCBbNCAgdG8gNyBdIAorICAgICAgICBNX1NUUiAgICBPdXQwLCAgIFtwRHN0XSwgIGRzdFN0ZXAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzggIHRvIDExXQorICAgICAgICBTVFIgICAgICBPdXQwLCAgIFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDB9IGF0IHBEc3QgWzEyIHRvIDE1XQorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCitPTVhfVkNfNHg0X0RJQUdfREwKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gZiA9IChhKzIqYitjKzIpPj4yCisgICAgICAgIDsvLyBDYWxjdWxhdGUgYXM6CisgICAgICAgIDsvLyBkID0gKGEgKyBjICk+PjEKKyAgICAgICAgOy8vIGUgPSAoZCAtIGInKT4+MQorICAgICAgICA7Ly8gZiA9IGUgKyAxMjgKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gTV9TVEFMTCBBUk0xMTM2SlM9MworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX1VQUEVSX1JJR0hUICAgICAgICAgICAgICAgICAgCisgICAgICAgIExETUlBICAgIHBTcmNBYm92ZSwgIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gIDsvLyBBYm92ZTAxMjMsIEFib3ZlNDU2NyA9IHBTcmNBYm92ZVswIHRvIDddCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIEJORSAgICAgIERMVXBwZXJSaWdodEF2YWlsYWJsZQorICAgICAgICBMRFIgICAgICByMHgwMTAxMDEwMSwgID1NVUxfQ09OU1QwICAgICAgICAgICA7Ly8gMHgwMTAxMDEwMQorICAgICAgICBNT1YgICAgICB0VmFsNywgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDExLCB0VmFsNywgIExTTCAjMjQgICAgICAgICAgICAgOy8vIHtVMywgIDAwLCAgMDAsICAwMCB9CisgICAgICAgIE1VTCAgICAgIE91dDMsICAgdFZhbDcsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgVTMgfSAKKyAgICAgICAgTU9WICAgICAgdFZhbDgsICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMCAgICAgICAgICAgICAgICAgICAgICA7Ly8gezAwJywgVTMnLCBVMicsIFUxJ30KKyAgICAgICAgVUhBREQ4ICAgdFZhbDgsICB0VmFsOCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHt4eCwgIHh4LCAgZDEsICBkMCB9CisgICAgICAgIFVIQUREOCAgIHRWYWw2LCAgQWJvdmUwMTIzLCAgdFZhbDkgICAgICAgICAgIDsvLyB7eHgsICBkMiwgIHh4LCAgeHggfQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWw4LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge3h4LCAgeHgsICBlMSwgIGUwIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHt4eCwgIGUyLCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7eHgsICB4eCwgIGYxLCAgZjAgfQorICAgICAgICBVQUREOCAgICB0VmFsNiwgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge3h4LCAgZjIsICB4eCwgIHh4IH0KKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0xCisgICAgICAgIAorICAgICAgICBQS0hCVCAgICB0VmFsNiwgIHRWYWw4LCAgdFZhbDYgICAgICAgICAgICAgICA7Ly8ge3h4LCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgQklDICAgICAgdFZhbDYsICB0VmFsNiwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHswMCwgIGYyLCAgZjEsICBmMCB9CisgICAgICAgIE9SUiAgICAgIE91dDAsICAgdFZhbDYsICB0VmFsMTEgICAgICAgICAgICAgIDsvLyB7VTMsICBmMiwgIGYxLCAgZjAgfQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTEKKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgIE91dDEsICAgT3V0MywgICBPdXQwLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIGYyLCAgZjEgfQorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyCisgICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgQVNSICM4ICAgICAgIDsvLyB7VTMsICBVMywgIFUzLCAgZjIgfQorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisKK0RMVXBwZXJSaWdodEF2YWlsYWJsZSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTUiAjMjQgICAgICAgICA7Ly8gezAwLCAgMDAsICAwMCwgIFUzIH0KKyAgICAgICAgTU9WICAgICAgdFZhbDksICBBYm92ZTAxMjMsICBMU1IgIzE2ICAgICAgICAgOy8vIHswMCwgIDAwLCAgVTMsICBVMiB9CisgICAgICAgIE1PViAgICAgIHRWYWwxMCwgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB7MDAsICBVMywgIFUyLCAgVTEgfQorICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmU0NTY3LCBMU0wgIzggICA7Ly8ge1U2LCAgVTUsICBVNCwgIFUzIH0KKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCB0VmFsMTAsIEFib3ZlNDU2NywgTFNMICMyNCAgOy8vIHtVNCwgIFUzLCAgVTIsICBVMSB9CisgICAgICAgIFBLSEJUICAgIHRWYWw5LCAgdFZhbDksICBBYm92ZTQ1NjcsIExTTCAjMTYgIDsvLyB7VTUsICBVNCwgIFUzLCAgVTIgfQorICAgICAgICBNVk4gICAgICB0VmFsMSwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8ge1U2JywgVTUnLCBVNCcsIFUzJ30KKyAgICAgICAgTVZOICAgICAgdFZhbDEwLCB0VmFsMTAgICAgICAgICAgICAgICAgICAgICAgOy8vIHtVNCcsIFUzJywgVTInLCBVMSd9CisgICAgICAgIE1WTiAgICAgIHRWYWwyLCAgQWJvdmU0NTY3ICAgICAgICAgICAgICAgICAgIDsvLyB7VTcnLCBVNicsIFU1JywgVTQnfQorICAgICAgICBVSEFERDggICB0VmFsNiwgIEFib3ZlMDEyMywgIHRWYWw5ICAgICAgICAgICA7Ly8ge2QzLCAgZDIsICBkMSwgIGQwIH0KKyAgICAgICAgVUhBREQ4ICAgdFZhbDksICB0VmFsOSwgIEFib3ZlNDU2NyAgICAgICAgICAgOy8vIHtkNSwgIGQ0LCAgZDMsICBkMiB9CisgICAgICAgIFVIQUREOCAgIHRWYWw4LCAgQWJvdmU0NTY3LCAgdFZhbDggICAgICAgICAgIDsvLyB7ZDYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVSFNVQjggICB0VmFsNiwgIHRWYWw2LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8ge2UzLCAgZTIsICBlMSwgIGUwIH0KKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsOSwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIHtlNSwgIGU0LCAgZTMsICBlMiB9CisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDgsICB0VmFsMiAgICAgICAgICAgICAgIDsvLyB7ZTYsICB4eCwgIHh4LCAgeHggfQorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw2LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8ge2YzLCAgZjIsICBmMSwgIGYwIH0KKyAgICAgICAgVUFERDggICAgdFZhbDksICB0VmFsOCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHtmNiwgIHh4LCAgeHgsICB4eCB9CisgICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB7ZjUsICBmNCwgIGYzLCAgZjIgfQorICAgICAgICBNT1YgICAgICB0VmFsNywgIE91dDAsICAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gezAwLCAgZjMsICBmMiwgIGYxIH0KKyAgICAgICAgQU5EICAgICAgdFZhbDksICB0VmFsOSwgICMweEZGMDAwMDAwICAgICAgICAgOy8vIHtmNiwgIDAwLCAgMDAsICAwMCB9CisgICAgICAgIFBLSEJUICAgIE91dDEsICAgdFZhbDcsICBPdXQyLCAgTFNMICM4ICAgICAgIDsvLyB7ZjQsICBmMywgIGYyLCAgZjEgfQorICAgICAgICBPUlIgICAgICBPdXQzLCAgIHRWYWw5LCAgT3V0MiwgIExTUiAjOCAgICAgICA7Ly8ge2Y2LCAgZjUsICBmNCwgIGYzIH0KKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmMyB0byBmMH0gYXQgcERzdFszICB0byAwIF0KKyAgICAgICAgTV9TVFIgICAgT3V0MSwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNCB0byBmMX0gYXQgcERzdFs3ICB0byA0IF0KKyAgICAgICAgTV9TVFIgICAgT3V0MiwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNSB0byBmMn0gYXQgcERzdFsxMSB0byA4IF0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtmNiB0byBmM30gYXQgcERTdFsxNSB0byAxMl0KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKyAgICAgICAgCisKK09NWF9WQ180eDRfRElBR19EUgorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIExEUkIgICAgIEFib3ZlTGVmdCwgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgIDsvLyBBYm92ZUxlZnQgPSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MCwgIExTTCAjOCAgICAgIDsvLyB0VmFsNyA9IDAwIDAwIEwwIEwxCisgICAgICAgIExEUiAgICAgIEFib3ZlMDEyMywgIFtwU3JjQWJvdmVdICAgICAgICAgICAgIDsvLyBBYm92ZTAxMjMgPSBVMyBVMiBVMSBVMAorICAgICAgICBMRFIgICAgICByMHg4MDgwODA4MCwgPUFERF9DT05TVDEgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MAorICAgICAgICBPUlIgICAgICB0VmFsOCwgIExlZnQzLCAgTGVmdDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDggPSAwMCAwMCBMMiBMMworICAgICAgICBQS0hCVCAgICB0VmFsNywgIHRWYWw4LCAgdFZhbDcsICBMU0wgIzE2ICAgICA7Ly8gdFZhbDcgPSBMMCBMMSBMMiBMMworICAgICAgICBNT1YgICAgICB0VmFsOCwgIEFib3ZlMDEyMywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw3LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCBMMCBMMSBMMgorICAgICAgICBPUlIgICAgICB0VmFsOCwgIHRWYWw4LCAgQWJvdmVMZWZ0ICAgICAgICAgICA7Ly8gdFZhbDggPSBVMiBVMSBVMCBVTAorICAgICAgICBPUlIgICAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmVMZWZ0LCBMU0wgIzI0ICA7Ly8gdFZhbDkgPSBVTCBMMCBMMSBMMgorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlMDEyMywgIExTTCAjMjQgICAgICAgICA7Ly8gdFZhbDEwPSBVMCAwMCAwMCAwMAorICAgICAgICBVWFRCICAgICB0VmFsMTEsIHRWYWw3LCAgUk9SICMyNCAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCAwMCAwMCBMMAorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDksICBMU1IgIzggICAgICA7Ly8gdFZhbDEwPSBVMCBVTCBMMCBMMQorICAgICAgICBPUlIgICAgICB0VmFsMTEsIHRWYWwxMSwgdFZhbDgsICBMU0wgIzggICAgICA7Ly8gdFZhbDExPSBVMSBVMCBVTCBMMAorICAgICAgICBVSEFERDggICB0VmFsMTEsIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDExPSBkMSBkMCBkTCBnMAorICAgICAgICBVSEFERDggICB0VmFsMTAsIHRWYWw3LCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBnMCBnMSBnMiBnMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWw4ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVMidVMSdVMCdVTCcKKyAgICAgICAgTVZOICAgICAgdFZhbDksICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw5ID0gVUwnTDAnTDEnTDInCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGUxIGUwIGVMIGgwCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMCwgdFZhbDEwLCB0VmFsOSAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IGgwIGgxIGgyIGgzCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDEwLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGkwIGkxIGkyIGkzCisgICAgICAgIFVBREQ4ICAgIE91dDAsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQwICA9IGYxIGYwIGZMIGkwCisgICAgICAgIFVYVEggICAgIHRWYWwxMSwgT3V0MywgICBST1IgIzggICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIDAwIGkxIGkyCisgICAgICAgIE1PViAgICAgIHRWYWw3LCAgT3V0MCwgICBMU0wgIzggICAgICAgICAgICAgIDsvLyB0VmFsNyA9IGYwIGZMIGkwIDAwCisgICAgICAgIE9SUiAgICAgIE91dDEsICAgdFZhbDcsICB0VmFsMTEsICBMU1IgIzggICAgIDsvLyBPdXQxICA9IGYwIGZMIGkwIGkxCisgICAgICAgIFBLSEJUICAgIE91dDIsICAgdFZhbDExLCBPdXQwLCAgICBMU0wgIzE2ICAgIDsvLyBPdXQyICA9IGZMIGkwIGkxIGkyCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjEgdG8gaTB9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZjAgdG8gaTF9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7ZkwgdG8gaTJ9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFNUUiAgICAgIE91dDMsICAgW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB7aTAgdG8gaTN9IGF0IHBEc3RbMTUgdG8gMTJdIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTWFjcm8gdG8gZXhpdCBtaWR3YXktYnJlYWsgZnJtIGNhc2UKKworT01YX1ZDXzR4NF9WUgorCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCAgICAgPSAwMCAwMCAwMCBMMAorICAgICAgICBNX0xEUkIgICBMZWZ0MSwgIFtwU3JjTGVmdF0sICBsZWZ0U3RlcCAgICAgICA7Ly8gTGVmdDEgICAgID0gMDAgMDAgMDAgTDEKKyAgICAgICAgTERSQiAgICAgTGVmdDIsICBbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgOy8vIExlZnQyICAgICA9IDAwIDAwIDAwIEwyCisgICAgICAgIE1PViAgICAgIHRWYWwwLCAgQWJvdmUwMTIzLCAgTFNMICM4ICAgICAgICAgIDsvLyB0VmFsMCAgICAgPSBVMiBVMSBVMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsOSwgIEFib3ZlMDEyMyAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDkgICAgID0gVTMgVTIgVTEgVTAgCisgICAgICAgIE9SUiAgICAgIHRWYWwxNCwgdFZhbDAsICAgQWJvdmVMZWZ0ICAgICAgICAgIDsvLyB0VmFsMTQgICAgPSBVMiBVMSBVMCBVTAorICAgICAgICBNVk4gICAgICB0VmFsMTEsIHRWYWwxNCAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDExICAgID0gVTInVTEnVTAnVUwnCisgICAgICAgIE1PViAgICAgIHRWYWwyLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMiAgICAgPSBVMSBVMCBVTCAwMAorICAgICAgICBVSFNVQjggICB0VmFsMSwgIEFib3ZlMDEyMywgIHRWYWwxMSAgICAgICAgICA7Ly8gdFZhbDEgICAgID0gZDIgZDEgZDAgZEwKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEwLCBBYm92ZUxlZnQsIExlZnQxICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IDAwIDAwIDAwIGoxICAgICAgIAorICAgICAgICBNVk4gICAgICB0VmFsNCwgIExlZnQwICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDQgICAgID0gMDAgMDAgMDAgTDAnCisgICAgICAgIFVIU1VCOCAgIHRWYWw0LCAgdFZhbDEwLCAgdFZhbDQgICAgICAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBrMQorICAgICAgICBPUlIgICAgICB0VmFsMTIsIHRWYWwwLCAgIExlZnQwICAgICAgICAgICAgICA7Ly8gdFZhbDEyICAgID0gVTIgVTEgVTAgTDAKKyAgICAgICAgT1JSICAgICAgdFZhbDE0LCB0VmFsMiwgICBMZWZ0MCAgICAgICAgICAgICAgOy8vIHRWYWwxNCAgICA9IFUxIFUwIFVMIEwwCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIFVIQUREOCAgIHRWYWwxMCwgdFZhbDksICAgdFZhbDE0ICAgICAgICAgICAgIDsvLyB0VmFsMTAgICAgPSBnMyBnMiBnMSBnMAorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWwxLCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MCAgICAgID0gZTIgZTEgZTAgZUwKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEwLCB0VmFsMTAsICB0VmFsMTEgICAgICAgICAgICAgOy8vIHRWYWwxMCAgICA9IGgzIGgyIGgxIGgwCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTIgdG8gZUx9IGF0IHBEc3RbMyAgdG8gMCBdCisgICAgICAgIE1PViAgICAgIHRWYWwxLCAgdFZhbDE0LCAgTFNMICM4ICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCAwMAorICAgICAgICBNT1YgICAgICB0VmFsNiwgIE91dDAsICAgIExTTCAjOCAgICAgICAgICAgICA7Ly8gdFZhbDYgICAgID0gZTEgZTAgZUwgMDAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICB0VmFsMiwgICBMZWZ0MSAgICAgICAgICAgICAgOy8vIHRWYWwyICAgICA9IFUxIFUwIFVMIEwxCisgICAgICAgIFVBREQ4ICAgIHRWYWw0LCAgdFZhbDQsICAgcjB4ODA4MDgwODAgICAgICAgIDsvLyB0VmFsNCAgICAgPSAwMCAwMCAwMCBsMSAgICAgICAgCisgICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDEwLCAgcjB4ODA4MDgwODAgICAgICAgIDsvLyBPdXQxICAgICAgPSBpMyBpMiBpMSBpMAorICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDE0ICAgID0gVTEnVTAnVUwnTDEnCisgICAgICAgIE9SUiAgICAgIHRWYWwxLCAgdFZhbDEsICAgTGVmdDIgICAgICAgICAgICAgIDsvLyB0VmFsMSAgICAgPSBVMCBVTCBMMCBMMgorICAgICAgICBPUlIgICAgICBPdXQyLCAgIHRWYWw2LCAgIHRWYWw0ICAgICAgICAgICAgICA7Ly8gT3V0MiAgICAgID0gZTEgZTAgZUwgbDEKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEsICB0VmFsMSwgICB0VmFsMTIgICAgICAgICAgICAgOy8vIHRWYWwxICAgICA9IGcyIGcxIGcwIGoyCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7aTMgdG8gaTB9IGF0IHBEc3RbNyAgdG8gNCBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCAgZHN0U3RlcCAgICAgICAgICAgIDsvLyBzdG9yZSB7ZTEgdG8gbDF9IGF0IHBEc3RbMTEgdG8gOCBdCisgICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEsICAgdFZhbDIgICAgICAgICAgICAgIDsvLyB0VmFsOSAgICAgPSBoMiBoMSBoMCBrMgorICAgICAgICBVQUREOCAgICBPdXQzLCAgIHRWYWw5LCAgIHIweDgwODA4MDgwICAgICAgICA7Ly8gT3V0MyAgICAgID0gaTIgaTEgaTAgbDIKKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtpMiB0byBsMn0gYXQgcERzdFsxNSB0byAxMl0gCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfSEQKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz00CisgICAgICAgIAorICAgICAgICBMRFIgICAgICBBYm92ZTAxMjMsICBbcFNyY0Fib3ZlXSAgICAgICAgICAgICA7Ly8gQWJvdmUwMTIzID0gVTMgVTIgVTEgVTAKKyAgICAgICAgTERSQiAgICAgQWJvdmVMZWZ0LCAgW3BTcmNBYm92ZUxlZnRdICAgICAgICAgOy8vIEFib3ZlTGVmdCA9IDAwIDAwIDAwIFVMCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IDAwIDAwIDAwIEwwCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IDAwIDAwIDAwIEwxCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IDAwIDAwIDAwIEwyCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IDAwIDAwIDAwIEwzCisgICAgICAgIExEUiAgICAgIHIweDgwODA4MDgwLCAgPUFERF9DT05TVDEgICAgICAgICAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWwyLCAgQWJvdmVMZWZ0LCBBYm92ZTAxMjMsIExTTCAjODsvLyB0VmFsMiA9IFUyIFUxIFUwIFVMCisgICAgICAgIE1WTiAgICAgIHRWYWwxLCAgTGVmdDAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMSA9IDAwIDAwIDAwIEwwJworICAgICAgICBPUlIgICAgICB0VmFsNCwgIExlZnQwLCAgdFZhbDIsICBMU0wgIzggICAgICA7Ly8gdFZhbDQgPSBVMSBVMCBVTCBMMAorICAgICAgICBNVk4gICAgICB0VmFsMiwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSBVMidVMSdVMCdVTCcKKyAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNCwgIEFib3ZlMDEyMyAgICAgICAgICAgOy8vIHRWYWw0ID0gZzMgZzIgZzEgZzAKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEsICBBYm92ZUxlZnQsICB0VmFsMSAgICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZEwKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWwyICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaDMgaDIgaDEgaDAKKyAgICAgICAgVUFERDggICAgdFZhbDEsICB0VmFsMSwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxID0gMDAgMDAgMDAgZUwKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gaTMgaTIgaTEgaTAKKyAgICAgICAgT1JSICAgICAgdFZhbDIsICBMZWZ0MCwgIEFib3ZlTGVmdCwgIExTTCAjMTYgOy8vIHRWYWwyID0gMDAgVUwgMDAgTDAKKyAgICAgICAgTU9WICAgICAgdFZhbDQsICB0VmFsNCwgIExTTCAjOCAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gaTIgaTEgaTAgMDAKKyAgICAgICAgT1JSICAgICAgdFZhbDExLCBMZWZ0MSwgIExlZnQwLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMT0gMDAgTDAgMDAgTDEKKyAgICAgICAgT1JSICAgICAgdFZhbDcsICBMZWZ0MiwgIExlZnQxLCAgTFNMICMxNiAgICAgOy8vIHRWYWw3ID0gMDAgTDEgMDAgTDIKKyAgICAgICAgT1JSICAgICAgdFZhbDEwLCBMZWZ0MywgIExlZnQyLCAgTFNMICMxNiAgICAgOy8vIHRWYWwxMD0gMDAgTDIgMDAgTDMKKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsNCwgIHRWYWwxICAgICAgICAgICAgICAgOy8vIE91dDAgID0gaTIgaTEgaTAgZUwKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdIAorICAgICAgICBNT1YgICAgICB0VmFsNCwgIE91dDAsICAgTFNMICMxNiAgICAgICAgICAgICA7Ly8gdFZhbDQgPSBpMSBpMCAwMCAwMAorICAgICAgICBVSEFERDggICB0VmFsMiwgIHRWYWwyLCAgdFZhbDcgICAgICAgICAgICAgICA7Ly8gdFZhbDIgPSAwMCBqMSAwMCBqMgorICAgICAgICBVSEFERDggICB0VmFsNiwgIHRWYWwxMSwgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDExPSAwMCBqMiAwMCBqMworICAgICAgICBNVk4gICAgICB0VmFsMTIsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEyPSAwMCBMMCcwMCBMMScKKyAgICAgICAgTVZOICAgICAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxND0gMDAgTDEnMDAgTDInCisgICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDIsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGsxIDAwIGsyCisgICAgICAgIFVIU1VCOCAgIHRWYWw4LCAgdFZhbDcsICB0VmFsMTIgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGQxIDAwIGQyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDYsICB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGsyIDAwIGszCisgICAgICAgIFVIU1VCOCAgIHRWYWw5LCAgdFZhbDEwLCB0VmFsMTQgICAgICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGQyIDAwIGQzCisgICAgICAgIFVBREQ4ICAgIHRWYWwyLCAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMiA9IDAwIGwxIDAwIGwyCisgICAgICAgIFVBREQ4ICAgIHRWYWw4LCAgdFZhbDgsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOCA9IDAwIGUxIDAwIGUyCisgICAgICAgIFVBREQ4ICAgIHRWYWwxMSwgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsMTE9IDAwIGwyIDAwIGwzCisgICAgICAgIFVBREQ4ICAgIHRWYWw5LCAgdFZhbDksICByMHg4MDgwODA4MCAgICAgICAgIDsvLyB0VmFsOSA9IDAwIGUyIDAwIGUzCisgICAgICAgIE9SUiAgICAgIE91dDIsICAgdFZhbDgsICB0VmFsMiwgIExTTCAjOCAgICAgIDsvLyBPdXQyICA9IGwxIGUxIGwyIGUyCisgICAgICAgIE9SUiAgICAgIE91dDMsICAgdFZhbDksICB0VmFsMTEsIExTTCAjOCAgICAgIDsvLyBPdXQzICA9IGwyIGUyIGwzIGUzCisgICAgICAgIFBLSFRCICAgIE91dDEsICAgdFZhbDQsICBPdXQyLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQxICA9IGkxIGkwIGwxIGUxCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBNYWNybyB0byBleGl0IG1pZHdheS1icmVhayBmcm0gY2FzZQorICAgICAgICAKK09NWF9WQ180eDRfVkwKKyAgICAgICAgCisgICAgICAgIDsvLyBNX1NUQUxMIEFSTTExMzZKUz0zCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwU3JjQWJvdmUsIHtBYm92ZTAxMjMsIEFib3ZlNDU2N30gICA7Ly8gQWJvdmUwMTIzLCBBYm92ZTQ1NjcgPSBwU3JjQWJvdmVbMCB0byA3XQorICAgICAgICBUU1QgICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVJfUklHSFQKKyAgICAgICAgTERSICAgICAgcjB4ODA4MDgwODAsICA9QUREX0NPTlNUMSAgICAgICAgICAgOy8vIDB4ODA4MDgwODAKKyAgICAgICAgTERSICAgICAgcjB4MDEwMTAxMDEsICA9TVVMX0NPTlNUMCAgICAgICAgICAgOy8vIDB4MDEwMTAxMDEKKyAgICAgICAgTU9WICAgICAgdFZhbDExLCBBYm92ZTAxMjMsICBMU1IgIzI0ICAgICAgICAgOy8vIHRWYWwxMT0gMDAgMDAgMDAgVTMKKyAgICAgICAgTVVMRVEgICAgQWJvdmU0NTY3LCB0VmFsMTEsIHIweDAxMDEwMTAxICAgICAgOy8vIEFib3ZlNDU2NyA9IFUzIFUzIFUzIFUzCisgICAgICAgIE1PViAgICAgIHRWYWw5LCAgQWJvdmUwMTIzLCAgTFNSICM4ICAgICAgICAgIDsvLyB0VmFsOSA9IDAwIFUzIFUyIFUxCisgICAgICAgIE1WTiAgICAgIHRWYWwxMCwgQWJvdmUwMTIzICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsMTA9IFUzJ1UyJ1UxJ1UwJworICAgICAgICBPUlIgICAgICB0VmFsMiwgIHRWYWw5LCAgQWJvdmU0NTY3LCAgTFNMICMyNCA7Ly8gdFZhbDIgPSBVNCBVMyBVMiBVMQorICAgICAgICBVSFNVQjggICB0VmFsOCwgIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBkNCBkMyBkMiBkMQorICAgICAgICBVQUREOCAgICBPdXQwLCAgIHRWYWw4LCAgcjB4ODA4MDgwODAgICAgICAgICA7Ly8gT3V0MCA9IGU0IGUzIGUyIGUxCisgICAgICAgIE1fU1RSICAgIE91dDAsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MH0gIGF0IHBEc3QgWzAgIHRvIDMgXQorICAgICAgICBNT1YgICAgICB0VmFsOSwgIHRWYWw5LCAgTFNSICM4ICAgICAgICAgICAgICA7Ly8gdFZhbDkgPSAwMCAwMCBVMyBVMgorICAgICAgICBNT1YgICAgICB0VmFsMTAsIEFib3ZlNDU2NywgIExTTCAjOCAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCAwMAorICAgICAgICBQS0hCVCAgICB0VmFsOSwgIHRWYWw5LCAgQWJvdmU0NTY3LCBMU0wgIzE2ICA7Ly8gdFZhbDkgPSBVNSBVNCBVMyBVMgorICAgICAgICBPUlIgICAgICB0VmFsMTAsIHRWYWwxMCwgdFZhbDExICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSBVNiBVNSBVNCBVMworICAgICAgICBVSEFERDggICB0VmFsMTEsIHRWYWw5LCAgQWJvdmUwMTIzICAgICAgICAgICA7Ly8gdFZhbDExPSBnNSBnNCBnMyBnMgorICAgICAgICBVSEFERDggICB0VmFsMTQsIHRWYWwyLCAgdFZhbDEwICAgICAgICAgICAgICA7Ly8gdFZhbDE0PSBnNiBnNSBnNCBnMworICAgICAgICBNVk4gICAgICB0VmFsOCwgIHRWYWwyICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDggPSBVNCdVMydVMidVMScKKyAgICAgICAgTVZOICAgICAgdFZhbDcsICB0VmFsOSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWw3ID0gVTUnVTQnVTMnVTInCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMiwgdFZhbDksICB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTI9IGQ1IGQ0IGQzIGQyCisgICAgICAgIFVIU1VCOCAgIHRWYWwxMSwgdFZhbDExLCB0VmFsOCAgICAgICAgICAgICAgIDsvLyB0VmFsMTE9IGg1IGg0IGgzIGgyCisgICAgICAgIFVIU1VCOCAgIHRWYWwyLCAgdFZhbDE0LCB0VmFsNyAgICAgICAgICAgICAgIDsvLyB0VmFsMiA9IGg2IGg1IGg0IGgzCisgICAgICAgIFVBREQ4ICAgIE91dDEsICAgdFZhbDExLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQxICA9IGk1IGk0IGkzIGkyCisgICAgICAgIFVBREQ4ICAgIE91dDIsICAgdFZhbDEyLCByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQyICA9IGU1IGU0IGUzIGUyCisgICAgICAgIFVBREQ4ICAgIE91dDMsICAgdFZhbDIsICByMHg4MDgwODA4MCAgICAgICAgIDsvLyBPdXQzICA9IGk2IGk1IGk0IGkzCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gYXQgcERzdCBbNCAgdG8gNyBdCisgICAgICAgIE1fU1RSICAgIE91dDIsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0Mn0gYXQgcERzdCBbOCAgdG8gMTFdCisgICAgICAgIE1fU1RSICAgIE91dDMsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0M30gYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE1hY3JvIHRvIGV4aXQgbWlkd2F5LWJyZWFrIGZybSBjYXNlCisgICAgICAgIAorT01YX1ZDXzR4NF9IVQorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTIKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHIweDAxMDEwMTAxLCAgPU1VTF9DT05TVDAgICAgICAgICAgIDsvLyAweDAxMDEwMTAxCisgICAgICAgIE1fTERSQiAgIExlZnQwLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MCA9IHBTcmNMZWZ0WzBdCisgICAgICAgIE1fTERSQiAgIExlZnQxLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MSA9IHBTcmNMZWZ0WzFdCisgICAgICAgIE1fTERSQiAgIExlZnQyLCAgW3BTcmNMZWZ0XSwgIGxlZnRTdGVwICAgICAgIDsvLyBMZWZ0MiA9IHBTcmNMZWZ0WzJdCisgICAgICAgIExEUkIgICAgIExlZnQzLCAgW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgIDsvLyBMZWZ0MyA9IHBTcmNMZWZ0WzNdCisgICAgICAgIE1PViAgICAgIHIweDgwODA4MDgwLCAgcjB4MDEwMTAxMDEsIExTTCAjNyAgIDsvLyAweDgwODA4MDgwCisgICAgICAgIE9SUiAgICAgIHRWYWw2LCAgTGVmdDAsICBMZWZ0MSwgIExTTCAjMTYgICAgIDsvLyB0VmFsNiA9IDAwIEwxIDAwIEwwCisgICAgICAgIE9SUiAgICAgIHRWYWw3LCAgTGVmdDEsICBMZWZ0MiwgIExTTCAjMTYgICAgIDsvLyB0VmFsNyA9IDAwIEwyIDAwIEwxCisgICAgICAgIE9SUiAgICAgIHRWYWwxMSwgTGVmdDIsICBMZWZ0MywgIExTTCAjMTYgICAgIDsvLyB0VmFsMTE9IDAwIEwzIDAwIEwyCisgICAgICAgIE1VTCAgICAgIE91dDMsICAgTGVmdDMsICByMHgwMTAxMDEwMSAgICAgICAgIDsvLyBPdXQzICA9IEwzIEwzIEwzIEwzCisgICAgICAgIE1WTiAgICAgIHRWYWw4LCAgdFZhbDcgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0VmFsOCA9IDAwIEwyJzAwIEwxJworICAgICAgICBNVk4gICAgICB0VmFsMTAsIHRWYWwxMSAgICAgICAgICAgICAgICAgICAgICA7Ly8gdFZhbDEwPSAwMCBMMycwMCBMMicKKyAgICAgICAgVUhBREQ4ICAgdFZhbDQsICB0VmFsNiwgIHRWYWwxMSAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgZzMgMDAgZzIKKyAgICAgICAgVVhUQjE2ICAgdFZhbDEyLCBPdXQzICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgTDMgMDAgTDMKKyAgICAgICAgVUhTVUI4ICAgdFZhbDQsICB0VmFsNCwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaDMgMDAgaDIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDYsICB0VmFsNiwgIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWw2ID0gMDAgZDIgMDAgZDEKKyAgICAgICAgVUhTVUI4ICAgdFZhbDExLCB0VmFsMTEsIHRWYWw4ICAgICAgICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZDMgMDAgZDIKKyAgICAgICAgVUhBREQ4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWw3ICAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgZzQgMDAgZzMKKyAgICAgICAgVUFERDggICAgdFZhbDQsICB0VmFsNCwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw0ID0gMDAgaTMgMDAgaTIKKyAgICAgICAgVUhTVUI4ICAgdFZhbDEyLCB0VmFsMTIsIHRWYWwxMCAgICAgICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaDQgMDAgaDMKKyAgICAgICAgVUFERDggICAgdFZhbDgsICB0VmFsNiwgIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWw4ID0gMDAgZTIgMDAgZTEKKyAgICAgICAgVUFERDggICAgdFZhbDExLCB0VmFsMTEsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMT0gMDAgZTMgMDAgZTIKKyAgICAgICAgVUFERDggICAgdFZhbDEyLCB0VmFsMTIsIHIweDgwODA4MDgwICAgICAgICAgOy8vIHRWYWwxMj0gMDAgaTQgMDAgaTMKKyAgICAgICAgT1JSICAgICAgT3V0MCwgICB0VmFsOCwgIHRWYWw0LCAgTFNMICM4ICAgICAgOy8vIE91dDAgID0gaTMgZTIgaTIgZTEKKyAgICAgICAgT1JSICAgICAgT3V0MSwgICB0VmFsMTEsIHRWYWwxMiwgTFNMICM4ICAgICAgOy8vIE91dDEgID0gaTQgZTMgaTMgZTIKKyAgICAgICAgTV9TVFIgICAgT3V0MCwgICBbcERzdF0sIGRzdFN0ZXAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQwfSAgYXQgcERzdCBbMCAgdG8gMyBdCisgICAgICAgIFBLSFRCICAgIE91dDIsICAgT3V0MywgICBPdXQxLCAgIEFTUiAjMTYgICAgIDsvLyBPdXQyICA9IEwzIEwzIGk0IGUzCisgICAgICAgIE1fU1RSICAgIE91dDEsICAgW3BEc3RdLCBkc3RTdGVwICAgICAgICAgICAgIDsvLyBzdG9yZSB7T3V0MX0gIGF0IHBEc3QgWzQgIHRvIDcgXQorICAgICAgICBNX1NUUiAgICBPdXQyLCAgIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgICAgICA7Ly8gc3RvcmUge091dDJ9ICBhdCBwRHN0IFs4ICB0byAxMV0KKyAgICAgICAgU1RSICAgICAgT3V0MywgICBbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHtPdXQzfSAgYXQgcERzdCBbMTIgdG8gMTVdCisgICAgICAgIE1PViAgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgIE1fRU5ECisKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIEVORAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTk3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCkBAIC0wLDAgKzEsMTI4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfVk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgIAorCisgICAgSUYgQVJNMTEzNkpTCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcFNyYyAgICAgICBSTiAwCitwRHN0ICAgICAgICBSTiAxCitRUCAgICAgICAgICBSTiAyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZSBmb3IgVW5wYWNrMngyIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgIFJOIDkKK1ZhbHVlICAgICAgIFJOIDQKK1ZhbHVlMiAgICAgIFJOIDUKK0ZsYWcgICAgICAgIFJOIDYKK3N0ck9mZnNldCAgIFJOIDcKK2NzdE9mZnNldCAgIFJOIDgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcjB3MCAgICAgICAgUk4gIDMKK3IwdzEgICAgICAgIFJOICA0CisKK2MwdzAgICAgICAgIFJOICA1CitjMXcwICAgICAgICBSTiAgNgorCityZXR1cm4gICAgICBSTiAgMAorcFFQRGl2VGFibGUgUk4gIDUKK3BRUE1vZFRhYmxlICAgIFJOICA2CitTaGlmdCAgICAgICAgUk4gIDkKK1NjYWxlICAgICAgICBSTiAgMgorCitUZW1wMSAgICAgICBSTiAgMworVGVtcDIgICAgICAgUk4gIDQKK1RlbXAzICAgICAgIFJOICA3CitUZW1wNCAgICAgICBSTiAgOAorCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyLCByOQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKKyAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBWYWx1ZSwgICMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBNT1YgICAgICBWYWx1ZTIsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBMRFJCICAgICBGbGFnLCAgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gUHJlbG9hZCA8RmxhZz4gYmVmb3JlIDx1bnBhY2tMb29wPgorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICMwXSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwCisgICAgICAgIAorCit1bnBhY2tMb29wCisgICAgICAgIFRTVCAgICAgIEZsYWcsICAjMHgxMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb21wdXRpbmcgKEZsYWcgJiAweDEwKQorICAgICAgICBMRFJTQk5FICBWYWx1ZTIsW3BTcmMsIzFdICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUkJORSAgIFZhbHVlLCBbcFNyY10sICMyICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIGJ5dGUgd2lzZSB0byBhdm9pZCB1bmFsaWduZWQgYWNjZXNzCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgTERNSUEgICAgcERzdCwge3IwdzAsIHIwdzF9ICAgICAgICAgICAgICAgICAgOy8vIHIwdzAgPSB8YzF8YzB8ICYgcjB3MSA9IHxjM3xjMnwKKworCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQorICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KKyAgICAgICAgCisgICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQorICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KKyAgICAgICAgCisgICAgICAgIExTTCAgICAgIFNjYWxlLCBTY2FsZSwgU2hpZnQgICAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IFNjYWxlIDw8IFNoaWZ0CisgICAgICAgIAorICAgICAgICBTTVVMVEIgICBUZW1wMiwgYzB3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUKKyAgICAgICAgU01VTFRCICAgVGVtcDQsIGMxdzAsICBTY2FsZSAgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlCisgICAgICAgIFNNVUxCQiAgIFRlbXAxLCBjMHcwLCAgU2NhbGUgICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZQorICAgICAgICBTTVVMQkIgICBUZW1wMywgYzF3MCwgIFNjYWxlICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUKKyAgICAgICAgTU9WICAgICAgVGVtcDIsIFRlbXAyLCBBU1IgIzEgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVGVtcDIgPj4gMSAmIFRlbXAxID0gKFRlbXAxID4+IDEpIDw8IDE2CisgICAgICAgIE1PViAgICAgIFRlbXA0LCBUZW1wNCwgQVNSICMxICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFRlbXA0ID4+IDEgJiBUZW1wMyA9IChUZW1wMyA+PiAxKSA8PCAxNgorICAgICAgICBQS0hCVCAgICBjMHcwLCAgVGVtcDIsIFRlbXAxLCBMU0wgIzE1ICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAxIHwgVGVtcDIgfAorICAgICAgICBQS0hCVCAgICBjMXcwLCAgVGVtcDQsIFRlbXAzLCBMU0wgIzE1ICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAzIHwgVGVtcDQgfAorICAgICAgICBTVE1JQSAgICBwRHN0LCB7YzB3MCwgYzF3MH0gICAgICAgICAgICAgICAgICA7Ly8gU3RvcmluZyBhbGwgdGhlIGNvZWZmaWNpZW50cyBhdCBvbmNlCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYgOy8vIEFSTTExMzZKUworICAgIAorICAgIAorICAgIAorICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2NhZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKQEAgLTAsMCArMSw0NjkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQvRXhwb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbS90byBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBBUk0xMTM2SlMgCisKKworOy8vSW5wdXQgUmVnaXN0ZXJzCitwRGF0YSAgICAgICAgICAgICAgIFJOICAwCitRUCAgICAgICAgICAgICAgICAgIFJOICAxCisKKzsvL091dHB1dCBSZWdpc3RlcnMKKworCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworCis7Ly8gUGFja2VkIElucHV0IHBpeGVscworaW4wMCAgICAgICAgICAgICAgICBSTiAgMiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzBdICYgU3JjWzFdIAoraW4wMiAgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzJdICYgU3JjWzNdCitpbjEwICAgICAgICAgICAgICAgIFJOICA0ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbNF0gJiBTcmNbNV0KK2luMTIgICAgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vIFNyY1s2XSAmIFNyY1s3XQoraW4yMCAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzhdICYgU3JjWzldCitpbjIyICAgICAgICAgICAgICAgIFJOICA3ICAgICAgICAgICAgICAgICAgIDsvLyBTcmNbMTBdICYgU3JjWzExXQoraW4zMCAgICAgICAgICAgICAgICBSTiAgOCAgICAgICAgICAgICAgICAgICA7Ly8gU3JjWzEyXSAmIFNyY1sxM10KK2luMzIgICAgICAgICAgICAgICAgUk4gIDkgICAgICAgICAgICAgICAgICAgOy8vIFNyY1sxNF0gJiBTcmNbMTVdCisKKzsvLyBUcmFuc3Bvc2UgZm9yIFJvdyBvcGVyYXRpb25zIChSb3dzIHRvIGNvbHMpCit0clJvdzAwICAgICAgICAgICAgIFJOICAyCit0clJvdzEwICAgICAgICAgICAgIFJOICAxMAordHJSb3cwMiAgICAgICAgICAgICBSTiAgMwordHJSb3cxMiAgICAgICAgICAgICBSTiAgNQordHJSb3cyMCAgICAgICAgICAgICBSTiAgMTEKK3RyUm93MzAgICAgICAgICAgICAgUk4gIDEyCit0clJvdzMyICAgICAgICAgICAgIFJOICAxNAordHJSb3cyMiAgICAgICAgICAgICBSTiAgNworCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworcm93U3VtMSAgICAgICAgICAgICBSTiAgNAorcm93U3VtMiAgICAgICAgICAgICBSTiAgNgorcm93RGlmZjEgICAgICAgICAgICBSTiAgOAorcm93RGlmZjIgICAgICAgICAgICBSTiAgOQorCisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCityb3dPcDAwICAgICAgICAgICAgIFJOICAyCityb3dPcDEwICAgICAgICAgICAgIFJOICAxMAorcm93T3AyMCAgICAgICAgICAgICBSTiAgMTEKK3Jvd09wMzAgICAgICAgICAgICAgUk4gIDEyCityb3dPcDAyICAgICAgICAgICAgIFJOICAzCityb3dPcDEyICAgICAgICAgICAgIFJOICA1Cityb3dPcDIyICAgICAgICAgICAgIFJOICA3Cityb3dPcDMyICAgICAgICAgICAgIFJOICAxNAorCis7Ly8gVHJhbnNwb3NlIGZvciBjb2x1bG1uIG9wZXJhdGlvbnMKK3RyQ29sMDAgICAgICAgICAgICAgUk4gIDIgICAgICAgICAgICAgICAgICAgCit0ckNvbDAyICAgICAgICAgICAgIFJOICAzICAgICAgICAgICAgICAgICAgIAordHJDb2wxMCAgICAgICAgICAgICBSTiAgNCAgICAgICAgICAgICAgICAgICAKK3RyQ29sMTIgICAgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgCit0ckNvbDIwICAgICAgICAgICAgIFJOICA2ICAgICAgICAgICAgICAgICAgIAordHJDb2wyMiAgICAgICAgICAgICBSTiAgNyAgICAgICAgICAgICAgICAgICAKK3RyQ29sMzAgICAgICAgICAgICAgUk4gIDggICAgICAgICAgICAgICAgICAgCit0ckNvbDMyICAgICAgICAgICAgIFJOICA5ICAKKworOy8vIEludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMKK2NvbFN1bTEgICAgICAgICAgICAgUk4gIDEwCitjb2xTdW0yICAgICAgICAgICAgIFJOICAxMQorY29sRGlmZjEgICAgICAgICAgICBSTiAgMTIKK2NvbERpZmYyICAgICAgICAgICAgUk4gIDE0CisKKworOy8vIENvbG91bW4gb3BlcmF0ZWQgcGl4ZWxzCitjb2xPcDAwICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorY29sT3AwMiAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK2NvbE9wMTAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitjb2xPcDEyICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorY29sT3AyMCAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK2NvbE9wMjIgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitjb2xPcDMwICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorY29sT3AzMiAgICAgICAgICAgICBSTiAgOSAgCisKKzsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKK3BRUERpdlRhYmxlICAgICAgICAgUk4gIDAKK3BRUE1vZFRhYmxlICAgICAgICAgUk4gIDExCitTaGlmdCAgICAgICAgICAgICAgIFJOICAxMAorU2NhbGUgICAgICAgICAgICAgICBSTiAgMTQKK1JvdW5kICAgICAgICAgICAgICAgUk4gIDAKKwordGVtcDEgICAgICAgICAgICAgICBSTiAgMTAKK3RlbXAyICAgICAgICAgICAgICAgIFJOICAxMQordGVtcDMgICAgICAgICAgICAgICBSTiAgMTIKK3RlbXA0ICAgICAgICAgICAgICAgUk4gIDEKKworCisKKzsvLyBJbnZUcmFuc2Zvcm1lZCBhbmQgRGVxdWFudGl6ZWQgcGl4ZWxzCitvdXQwMCAgICAgICAgICAgICAgIFJOICAyICAgICAgICAgICAgICAgICAgIAorb3V0MDIgICAgICAgICAgICAgICBSTiAgMyAgICAgICAgICAgICAgICAgICAKK291dDEwICAgICAgICAgICAgICAgUk4gIDQgICAgICAgICAgICAgICAgICAgCitvdXQxMiAgICAgICAgICAgICAgIFJOICA1ICAgICAgICAgICAgICAgICAgIAorb3V0MjAgICAgICAgICAgICAgICBSTiAgNiAgICAgICAgICAgICAgICAgICAKK291dDIyICAgICAgICAgICAgICAgUk4gIDcgICAgICAgICAgICAgICAgICAgCitvdXQzMCAgICAgICAgICAgICAgIFJOICA4ICAgICAgICAgICAgICAgICAgIAorb3V0MzIgICAgICAgICAgICAgICBSTiAgOSAgCisgICAgICAKKyAgICAgICAgCisKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCAgICBwRGF0YU9uU3RhY2ssIDQKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQscjExCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKKyAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMKKyAgICAgICAgCisgICAgICAgIExETUlBICAgcERhdGEse2luMDAsaW4wMixpbjEwLGluMTIsaW4yMCxpbjIyLGluMzAsaW4zMn0KKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSBtYXRyaXggaW5vcmRlciB0byBwZXJmb3JtIHJvdyBvcHMgYXMgY29sb3VtbiBvcHMKKyAgICAgICAgOy8vIElucHV0OiAgIGluW11bXSA9IG9yaWdpbmFsIG1hdHJpeAorICAgICAgICA7Ly8gT3V0cHV0OiAgdHJSb3dbXVtdPSB0cmFuc3Bvc2VkIG1hdHJpeAorICAgICAgICA7Ly8gU3RlcDE6IE9idGFpbiB0aGUgTEwgcGFydCBvZiB0aGUgdHJhbnNwb3NlZCBtYXRyaXgKKyAgICAgICAgOy8vIFN0ZXAyOiBPYnRhaW4gdGhlIEhMIHBhcnQKKyAgICAgICAgOy8vIHN0ZXAzOiBPYnRhaW4gdGhlIExIIHBhcnQKKyAgICAgICAgOy8vIFN0ZXA0OiBPYnRhaW4gdGhlIEhIIHBhcnQKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJSb3cxMCxpbjEwLGluMDAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNSA0XSA9IFtmNTpmMV0gICAgCisgICAgICAgIFBLSEJUICAgdHJSb3cwMCxpbjAwLGluMTAsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0clJvdzMwLGluMTIsaW4wMixBU1IgIzE2ICAgICAgICAgICAgICA7Ly8gWzEzIDEyXSA9IFs3IDNdCisgICAgICAgICBQS0hCVCAgIHRyUm93MjAsaW4wMixpbjEyLExTTCAjMTYgICAgICAgICAgICAgIDsvLyBbOSA4XSA9IFs2IDJdIAorICAgICAgICAKKyAgICAgICAgOy8vIExIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAKKyAgICAgICAgOy8vICAgLSAtIGQyIGQzIAorICAgICAgICA7Ly8gICAtIC0gZDYgZDcgCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIDsvLyAgIC0gLSAtICAtCisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHRyUm93MDIsaW4yMCxpbjMwLExTTCAjMTYgICAgICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJSb3cxMixpbjMwLGluMjAsQVNSICMxNiAgICAgICAgICAgICAgIDsvLyBbNyA2XSA9IFtmMTM6ZjldIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgCisgICAgICAgIDsvLyBISCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggIAorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgIC0gICAtCisgICAgICAgIDsvLyAgICAtIC0gIGQxMCBkMTEKKyAgICAgICAgOy8vICAgIC0gLSAgZDE0IGQxNQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB0clJvdzMyLGluMzIsaW4yMixBU1IgIzE2ICAgICAgICAgICAgICAgOy8vIFsxNSAxNF0gPSBbMTUgMTFdCisgICAgICAgIFBLSEJUICAgdHJSb3cyMixpbjIyLGluMzIsTFNMICMxNiAgICAgICAgICAgICAgIDsvLyBbMTEgMTBdID0gWzE0IDEwXQorICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBSb3cgT3BlcmF0aW9ucyAoUGVyZm9ybWVkIG9uIGNvbHVtbnMpCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTEsdHJSb3cwMCx0clJvdzEwICAgICAgICAgICAgICAgIDsvLyAoYzArYzEpCisgICAgICAgIFNBREQxNiAgICAgIHJvd1N1bTIsdHJSb3cyMCx0clJvdzMwICAgICAgICAgICAgICAgIDsvLyAoYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYxLHRyUm93MDAsdHJSb3cxMCAgICAgICAgICAgICAgIDsvLyAoYzAtYzEpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd0RpZmYyLHRyUm93MjAsdHJSb3czMCAgICAgICAgICAgICAgIDsvLyAoYzItYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMDAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzErYzIrYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMTAscm93U3VtMSxyb3dTdW0yICAgICAgICAgICAgICAgIDsvLyAoYzArYzEtYzItYzMpCisgICAgICAgIFNTVUIxNiAgICAgIHJvd09wMjAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIHJvd09wMzAscm93RGlmZjEscm93RGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU0lNRCBvcGVyYXRpb25zIG9uIG5leHQgdHdvIGNvbHVtbnMobmV4dCB0d28gcm93cyBvZiB0aGUgb3JpZ2luYWwgbWF0cml4KQorICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMSx0clJvdzAyLHRyUm93MTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgcm93U3VtMix0clJvdzIyLHRyUm93MzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjEsdHJSb3cwMix0clJvdzEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgcm93RGlmZjIsdHJSb3cyMix0clJvdzMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AwMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AxMixyb3dTdW0xLHJvd1N1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgcm93T3AyMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgcm93T3AzMixyb3dEaWZmMSxyb3dEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOy8vIElucHV0OiAgcm93T3BbXVtdCisgICAgICAgIDsvLyBPdXRwdXQ6IHRyQ29sW11bXSAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICA7Ly8gTEwgMngyIHRyYW5zcG9zZWQgbWF0cml4IAorICAgICAgICA7Ly8gICBkMCBkMSAtIC0KKyAgICAgICAgOy8vICAgZDQgZDUgLSAtCisgICAgICAgIDsvLyAgIC0gIC0gIC0gLQorICAgICAgICA7Ly8gICAtICAtICAtIC0KKyAgICAgICAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMCxyb3dPcDEwLHJvd09wMDAsQVNSICMxNiAgICAgICAgICAgOy8vIFs1IDRdID0gW2Y1OmYxXQorICAgICAgICBQS0hCVCAgIHRyQ29sMDAscm93T3AwMCxyb3dPcDEwLExTTCAjMTYgICAgICAgICAgIDsvLyBbMSAwXSA9IFtmNDpmMF0gIAorICAgICAgICAKKyAgICAgICAgOy8vIEhMIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtICAgLSAgIC0gLQorICAgICAgICA7Ly8gICAgLSAgIC0gICAtIC0KKyAgICAgICAgOy8vICAgIGQ4ICBkOSAgLSAtCisgICAgICAgIDsvLyAgIGQxMiBkMTMgIC0gLQorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgUEtIVEIgICB0ckNvbDMwLHJvd09wMTIscm93T3AwMixBU1IgIzE2ICAgICAgICAgIDsvLyBbMTMgMTJdID0gWzcgM10KKyAgICAgICAgIFBLSEJUICAgdHJDb2wyMCxyb3dPcDAyLHJvd09wMTIsTFNMICMxNiAgICAgICAgICA7Ly8gWzkgOF0gPSBbNiAyXSAKKyAgICAgICAgCisgICAgICAgIDsvLyBMSCAyeDIgdHJhbnNwb3NlZCBtYXRyaXggCisgICAgICAgIDsvLyAgIC0gLSBkMiBkMyAKKyAgICAgICAgOy8vICAgLSAtIGQ2IGQ3IAorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICA7Ly8gICAtIC0gLSAgLQorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB0ckNvbDAyLHJvd09wMjAscm93T3AzMCxMU0wgIzE2ICAgICAgICAgICA7Ly8gWzMgMl0gPSBbZjEyOmY4XSAgCisgICAgICAgIFBLSFRCICAgdHJDb2wxMixyb3dPcDMwLHJvd09wMjAsQVNSICMxNiAgICAgICAgICAgOy8vIFs3IDZdID0gW2YxMzpmOV0gCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgOy8vIEhIIDJ4MiB0cmFuc3Bvc2VkIG1hdHJpeCAgCisgICAgICAgIDsvLyAgICAtIC0gICAtICAgLQorICAgICAgICA7Ly8gICAgLSAtICAgLSAgIC0KKyAgICAgICAgOy8vICAgIC0gLSAgZDEwIGQxMQorICAgICAgICA7Ly8gICAgLSAtICBkMTQgZDE1CisgICAgICAgIAorICAgICAgICBQS0hUQiAgIHRyQ29sMzIscm93T3AzMixyb3dPcDIyLEFTUiAjMTYgICAgICAgICAgICA7Ly8gWzE1IDE0XSA9IFsxNSAxMV0KKyAgICAgICAgUEtIQlQgICB0ckNvbDIyLHJvd09wMjIscm93T3AzMixMU0wgIzE2ICAgICAgICAgICAgOy8vIFsxMSAxMF0gPSBbMTQgMTBdCisgICAgICAgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gU3RvcmUgcERhdGEoUk4wKSBvbiBzdGFjayBhbmQgcmVzdG9yZSBpdCBvbmx5IGF0IHRoZSBmaW5hbCBzdG9yZSBiYWNrCisgICAgICAgIDsvLyBUaGlzIGZyZWVzIHVwIGEgcmVnaXN0ZXIgKFJOMCkgd2hpY2ggaXMgdXNlZCB0byByZWR1Y2UgbnVtYmVyIG9mIGludGVybWVkaWF0ZSBzdGFsbHMgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIE1fU1RSICAgICAgIHBEYXRhLHBEYXRhT25TdGFjaworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gZmlyc3QgdHdvIGNvbHVtbnModHdvIHJvd3Mgb2YgdGhlIG9yaWdpbmFsIG1hdHJpeCkKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAwLHRyQ29sMTAgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIwLHRyQ29sMzAgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMCx0ckNvbDEwICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMCx0ckNvbDMwICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMCxjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AyMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMS1jMitjMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AzMCxjb2xEaWZmMSxjb2xEaWZmMiAgICAgICAgICAgICAgOy8vIChjMC1jMStjMi1jMykKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBTSU1EIG9wZXJhdGlvbnMgb24gbmV4dCB0d28gY29sdW1ucyhuZXh0IHR3byByb3dzIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXgpCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMSx0ckNvbDAyLHRyQ29sMTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMSkKKyAgICAgICAgU0FERDE2ICAgICAgY29sU3VtMix0ckNvbDIyLHRyQ29sMzIgICAgICAgICAgICAgICAgOy8vIChjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjEsdHJDb2wwMix0ckNvbDEyICAgICAgICAgICAgICAgOy8vIChjMC1jMSkKKyAgICAgICAgU1NVQjE2ICAgICAgY29sRGlmZjIsdHJDb2wyMix0ckNvbDMyICAgICAgICAgICAgICAgOy8vIChjMi1jMykKKyAgICAgICAgU0FERDE2ICAgICAgY29sT3AwMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMStjMitjMykKKyAgICAgICAgU1NVQjE2ICAgICAgY29sT3AxMixjb2xTdW0xLGNvbFN1bTIgICAgICAgICAgICAgICAgOy8vIChjMCtjMS1jMi1jMykKKyAgICAgICAgTERSICAgICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSU0IgICAgICAgU2hpZnQsIFtwUVBEaXZUYWJsZSwgUVBdICAgICAgICAgICAgICAgOy8vIFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIFNTVUIxNiAgICAgIGNvbE9wMjIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzEtYzIrYzMpCisgICAgICAgIFNBREQxNiAgICAgIGNvbE9wMzIsY29sRGlmZjEsY29sRGlmZjIgICAgICAgICAgICAgIDsvLyAoYzAtYzErYzItYzMpCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIExEUlNCICAgICAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBTY2FsZSA9IHBRUE1vZFRhYmxlW1FQXSAKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyA8RGVxdWFudGl6ZT4gaW1wcm92ZXMgb24gdGhlIGMtcmVmZXJlbmNlIGNvZGUKKyAgICAgICAgOy8vIEJvdGggdGhlICBjYXNlcyBpLmUuLCBTaGlmdD49MCBhbmQgU2hpZnQ8MCBjYXNlcyBhcmUgY292ZXJlZCB0b2dldGhlcgorICAgICAgICA7Ly8gV2UgZG8gbm90IHN1YnRyYWN0IDIgZnJvbSBTaGlmdCBhcyBpbiBDIHJlZmVyZW5jZSwgaW5zdGVhZCBwZXJmb3JtIGEKKyAgICAgICAgOy8vIFNjYWxlIDw8IFNoaWZ0IG9uY2UgaW4gdGhlIGJlZ2lubmluZyBhbmQgZG8gYSByaWdodCBzaGlmdCBieSBhIAorICAgICAgICA7Ly8gY29uc3RhbnQgMiBhZnRlciB0aGUgTXVsdGlwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiBSb3VuZCB3b3VsZCBiZSAyIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBCeSBkb2luZyB0aGlzIHdlIGF2aW9kIHRoZSBCcmFuY2hlcyByZXF1aXJlZCBhbmQgYWxzbyAKKyAgICAgICAgOy8vIHJlZHVjZSB0aGUgY29kZSBzaXplIHN1YnN0YW50aWFsbHkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBSb3VuZCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJvdW5kID0gMgorICAgICAgICBMU0wgICAgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICAgICAgOy8vIFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBSb3cgMQorICAgICAgICBTTUxBQkIgIHRlbXAxLCBjb2xPcDAwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gQihjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQUJCICB0ZW1wMywgY29sT3AwMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IEIoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDIsIGNvbE9wMDAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDIgPSBUKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXA0LCBjb2xPcDAyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXA0ID0gVChjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgCisgICAgICAgIEFTUiAgICAgdGVtcDEsIHRlbXAxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBUZW1wMSA+PiAyCisgICAgICAgIEFTUiAgICAgdGVtcDMsIHRlbXAzLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBUZW1wMyA+PiAyCisgICAgICAgIFBLSEJUICAgb3V0MDAsICB0ZW1wMSwgdGVtcDIsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzB3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICBQS0hCVCAgIG91dDAyLCAgdGVtcDMsIHRlbXA0LCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMxdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDIKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AxMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMTIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDEwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AxMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDEwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQxMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICA7Ly8gUm93IDMKKyAgICAgICAgU01MQUJCICB0ZW1wMSwgY29sT3AyMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMSA9IEIoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFCQiAgdGVtcDMsIGNvbE9wMjIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDMgPSBCKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBVEIgIHRlbXAyLCBjb2xPcDIwLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAyID0gVChjMHcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wNCwgY29sT3AyMiwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wNCA9IFQoYzF3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIAorICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMiAKKyAgICAgICAgQVNSICAgICB0ZW1wMywgdGVtcDMsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZW1wMyA9IFRlbXAzID4+IDIKKyAgICAgICAgUEtIQlQgICBvdXQyMCwgIHRlbXAxLCB0ZW1wMiwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMHcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIFBLSEJUICAgb3V0MjIsICB0ZW1wMywgdGVtcDQsIExTTCAjMTQgICAgICAgICAgICAgICA7Ly8gYzF3MCAgPSB8IFRlbXAyIHwgVGVtcDEgfAorICAgICAgICAKKyAgICAgICAgOy8vIFJvdyA0CisgICAgICAgIFNNTEFCQiAgdGVtcDEsIGNvbE9wMzAsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDEgPSBCKGMwdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICBTTUxBQkIgIHRlbXAzLCBjb2xPcDMyLCBTY2FsZSwgUm91bmQgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gQihjMXcwKSAqIFNjYWxlICsgUm91bmQKKyAgICAgICAgU01MQVRCICB0ZW1wMiwgY29sT3AzMCwgU2NhbGUsIFJvdW5kICAgICAgICAgICAgICAgIDsvLyBUZW1wMiA9IFQoYzB3MCkgKiBTY2FsZSArIFJvdW5kCisgICAgICAgIFNNTEFUQiAgdGVtcDQsIGNvbE9wMzIsIFNjYWxlLCBSb3VuZCAgICAgICAgICAgICAgICA7Ly8gVGVtcDQgPSBUKGMxdzApICogU2NhbGUgKyBSb3VuZAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICBwRGF0YSxwRGF0YU9uU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEYXRhIHBvaW50ZXIgZnJvbSBzdGFjaworICAgICAgICBBU1IgICAgIHRlbXAxLCB0ZW1wMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAxID0gVGVtcDEgPj4gMgorICAgICAgICBBU1IgICAgIHRlbXAzLCB0ZW1wMywgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlbXAzID0gVGVtcDMgPj4gMgorICAgICAgICBQS0hCVCAgIG91dDMwLCAgdGVtcDEsIHRlbXAyLCBMU0wgIzE0ICAgICAgICAgICAgICAgOy8vIGMwdzAgID0gfCBUZW1wMiB8IFRlbXAxIHwKKyAgICAgICAgUEtIQlQgICBvdXQzMiwgIHRlbXAzLCB0ZW1wNCwgTFNMICMxNCAgICAgICAgICAgICAgIDsvLyBjMXcwICA9IHwgVGVtcDIgfCBUZW1wMSB8CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3N0b3JlX2NvZWZmCisgICAgICAgIAorICAgICAgICBTVE1JQSAgIHBEYXRhLHtvdXQwMCxvdXQwMixvdXQxMCxvdXQxMixvdXQyMCxvdXQyMixvdXQzMCxvdXQzMn0KKyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORCAgICAgICAgCisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgICAgICAgIAorICAgIAorCis7Ly8gU3RhdGljIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKworOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgICAgICAKKworCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BwU3JjICAgICAgICAgICAgICAgUk4gIDAKK3BEc3QgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjIgICAgICAgICAgICAgICAgUk4gIDIKKworOy8vT3V0cHV0IFJlZ2lzdGVycworcmVzdWx0ICAgICAgICAgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERzdFI0ICAgICAgICAgICAgICBSTiAgNAorcERzdFIwICAgICAgICAgICAgICBSTiAgMAorUVBSMSAgICAgICAgICAgICAgICBSTiAgMQorUVBSNSAgICAgICAgICAgICAgICBSTiAgNQorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIscjUKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFI0LHBEc3QgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMQorICAgICAgICBNT1YgICAgIFFQUjUsUVBSMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTYXZpbmcgcmVnaXN0ZXIgcjIKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHBEc3RSMCxwRHN0UjQgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTZXR0aW5nIHVwIHJlZ2lzdGVyIHIwCisgICAgICAgIE1PViAgICAgUVBSMSxRUFI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjEKKyAgICAgICAgQkwgICAgICBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgTU9WICAgICByZXN1bHQsI09NWF9TdHNfTm9FcnIgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9BUk0xMTM2SlMgIAorICAgIAorCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxMTVkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YSFVGRlRBQl9IXworI2RlZmluZSBfT01YSFVGRlRBQl9IXworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07CisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07CisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY4NjVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqCisgKiBGaWxlOiAgICAgICAgYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBaaWd6YWcgc2NhbiBpbiBNUDRQMiBjb2RlYy4KKyAqCisgKi8KKyAKKyNpZm5kZWYgX09NWFpJR1pBR1RBQl9ICisjZGVmaW5lIF9PTVhaSUdaQUdUQUJfSAorCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiBbMTkyXTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUhvcml6b250YWxaaWd6YWdTY2FuIFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FWZXJ0aWNhbFppZ3phZ1NjYW4gWzY0XTsKKworI2VuZGlmIC8qIF9PTVhaSUdaQUdUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMWU1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfQ2xpcDhfcy5zCkBAIC0wLDAgKzEsNzUgQEAKKzsgLyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0NsaXA4X3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZSBmb3IgQ2xpcHBpbmcgMTYgYml0IHZhbHVlIHRvIFswLDI1NV0gUmFuZ2UKKzsgKi8gCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAKKworICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAKKyAgICAgCisgICAgICBJRiBBUk0xMTM2SlMKKyAKKzsvL0lucHV0IEFyZ3VtZW50cworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgICAgICBSTiAxCitzdGVwICAgICAgICAgICAgICAgICBSTiAyCisKKzsvLyBMb2NhbCB2YXJpYWJsZXMKKworeDAgICAgICAgICAgICAgICAgICAgUk4gMworeDEgICAgICAgICAgICAgICAgICAgUk4gNAoreDIgICAgICAgICAgICAgICAgICAgUk4gNQoreDMgICAgICAgICAgICAgICAgICAgUk4gNgorCitDb3VudCAgICAgICAgICAgICAgICBSTiAxNAorICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAyX0NsaXA4LHI2CisgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgIENvdW50LCM4Citsb29wCisKKyAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MCwgeDF9CisgICAgICAgIFNVQlMgICAgICAgICBDb3VudCxDb3VudCwgIzEgICAgICAgICAgOy8vIGNvdW50IGRvd24KKyAgICAgICAgTERNSUEgICAgICAgIHBTcmMhLHt4MiwgeDN9CisgICAgICAgIFVTQVQxNiAgICAgICB4MCwgIzgsIHgwICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFVTQVQxNiAgICAgICB4MSwgIzgsIHgxICAgICAgICAgICAgICAgICA7Ly8gY2xpcCB0d28gc2FtcGxlcyB0byBbMCwyNTVdCisgICAgICAgIFNUUkIgICAgICAgICB4MCwgW3BEc3RdCisgICAgICAgIE1PViAgICAgICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgwLCBbcERzdCwjMV0KKyAgICAgICAgU1RSQiAgICAgICAgIHgxLCBbcERzdCwjMl0KKyAgICAgICAgTU9WICAgICAgICAgIHgxLCB4MSwgTFNSICMxNgorICAgICAgICBTVFJCICAgICAgICAgeDEsIFtwRHN0LCMzXQorICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICAgeDIsICM4LCB4MiAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBVU0FUMTYgICAgICAgeDMsICM4LCB4MyAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdHdvIHNhbXBsZXMgdG8gWzAsMjU1XQorICAgICAgICBTVFJCICAgICAgICAgeDIsIFtwRHN0LCM0XQorICAgICAgICBNT1YgICAgICAgICAgeDIsIHgyLCBMU1IgIzE2CisgICAgICAgIFNUUkIgICAgICAgICB4MiwgW3BEc3QsIzVdCisgICAgICAgIFNUUkIgICAgICAgICB4MywgW3BEc3QsIzZdCisgICAgICAgIE1PViAgICAgICAgICB4MywgeDMsIExTUiAjMTYKKyAgICAgICAgU1RSQiAgICAgICAgIHgzLCBbcERzdCwjN10KKyAgICAgICAgQUREICAgICAgICAgIHBEc3QscERzdCxzdGVwICAgICAgICAgICAgIDsvLyBJbmNyZW1lbnQgcERzdCBieSBzdGVwIHZhbHVlCisgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgIGxvb3AgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDb250aW51ZSBsb29wIHVudGlsIENvdW50IHJlYWNoZXMgNjQgCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzMDkwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwzOTggQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCis7ICoKKzsgKiAKKzsgKgorOyAqIAorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKKworZnR5cGUgICAgICAgICAgICAgICAgUk4gMAordGVtcDMgICAgICAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgICAgUk4gNQorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRXNjYXBlICAgICAgICAgICAgICAgUk4gNQorCis7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKK3ppZ3phZyAgICAgICAgICAgICAgIFJOIDAKK3N0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKK3RlbXAyICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKK3NpZ24gICAgICAgICAgICAgICAgIFJOIDUKK0xhc3QgICAgICAgICAgICAgICAgIFJOIDcKK3N0b3JlUnVuICAgICAgICAgICAgIFJOIDE0CisKKworcGFja1JldEluZGV4ICAgICAgICAgUk4gNQorCisKK21hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAorICAgICAgICAKKworCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisgICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAorICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCisgICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCisgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKKworICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucworCitnZXRWTENiaXRzCisgICAgICAgIAorICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCisgICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAorICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMworCisgICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCisgICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQorCisgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KKworICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCisgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgCisgICAgICAgIAorCitlbmRGaWxsVkxECisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQorICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQorICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICAKKworbm90RXNjYXBlbW9kZQorCisgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+PTMgZ2V0IHBlcmZvcm0gRml4ZWQgTGVuZ3RoIERlY29kaW5nIChFc2NhcGUgTW9kZSAzKQorICAgICAgICBCR0UgICAgICAgICAgICAgRXNjYXBlTW9kZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEVsc2UgY29udGludWUgbm9ybWFsIFZMQyBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgOy8vIFZhcmlhYmxlIGxlbmdoIGRlY29kaW5nLCAiYXJtVW5QYWNrVkxDMzIiIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fQkRfVkxEICAgICAgICBwYWNrUmV0SW5kZXgsVDEsVDIscFZsY1RhYmxlTDBMMSw0LDIKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgdGVtcDMsPTB4RkZGCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgcGFja1JldEluZGV4LHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGZvciBpbnZhbGlkIHN5bWJvbAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIGludmFsaWQgc3ltYm9sIG9jY3VycyBleGl0IHdpdGggYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgICAgIExhc3QscGFja1JldEluZGV4LCMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgTGFzdCBmcm9tIHBhY2tlZCBJbmRleAorICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAKKworICAgICAgICBMU1IgICAgICAgICAgICAgc3RvcmVSdW4scGFja1JldEluZGV4LCM3ICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEdldCBSdW4gVmFsdWUgZnJvbSBQYWNrZWQgaW5kZXgKKyAgICAgICAgQU5EICAgICAgICAgICAgIHN0b3JlTGV2ZWwscGFja1JldEluZGV4LCMweDdjICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZUxldmVsPXBhY2tSZXRJbmRleFsyLTZdLHN0b3JlTGV2ZWxbMC0xXT0wIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCB0YWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTFNSICAgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMZXZlbCB2YWx1ZQorCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICAgICAgZnR5cGUyCisgICAgICAgIAorICAgICAgICA7Ly8gZnR5cGU9PTE7IEVzY2FwZSBtb2RlID0xCisgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICB0ZW1wMSwgcExNQVhUYWJsZUwwTDEsIExhc3QsIExTTCM0ICAgICAgICAgICAgICA7Ly8gSWYgdGhlIExhc3Q9MSBhZGQgMzIgdG8gdGFibGUgYWRkcmVzcworICAgICAgICBMRFJCICAgICAgICAgICAgdGVtcDEsW3RlbXAxLHN0b3JlUnVuXQorCisgICAgICAgCisgICAgICAgIEFERCAgICAgICAgICAgICBzdG9yZUxldmVsLHRlbXAxLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAKKworZnR5cGUyCisKKyAgICAgICAgOy8vIGZ0eXBlID0yOyBFc2NhcGUgbW9kZSA9MgorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUgCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICBCTkUgICAgICAgICAgICAgRmlsbFZMREwxCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgdGVtcDEsIHBSTUFYVGFibGVMMEwxLCBMYXN0LCBMU0wjNCAgICAgICAgICAgICAgIDsvLyBJZiBMYXN0PTEgYWRkIDMyIHRvIHRhYmxlIGFkZHJlc3MKKyAgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAyLHN0b3JlTGV2ZWwsIzEKKyAgICAgICAgTERSQiAgICAgICAgICAgIHRlbXAxLFt0ZW1wMSx0ZW1wMl0KKworICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgc3RvcmVSdW4sc3RvcmVSdW4sIzEKKyAgICAgICAgQUREICAgICAgICAgICAgIHN0b3JlUnVuLHRlbXAxCisgICAgICAgIAorRmlsbFZMREwxICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgc2lnbiwxLFQxCisKKyAgICAgICAgQ01QICAgICAgICAgICAgIHNpZ24sIzEKKyAgICAgICAgUlNCRVEgICAgICAgICAgIHN0b3JlTGV2ZWwsc3RvcmVMZXZlbCwjMAorIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDEsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgUnVuICsgQ291bnQgZXhjZWVkcyA2MworICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gVG8gUmVmbGVjdCBSdW5sZW5naHQKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKyAKK3N0b3JlTGV2ZWxMMQorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBMZXZlbCB2YWwgaXMgTGFzdCBub24gemVybyB2YWwKKyAgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxCisgICAgICAgIExTUiAgICAgICAgICAgICBMYXN0LExhc3QsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAKKyAgICAgICAgQk5FICAgICAgICAgICAgIGVuZAorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworIAorCisKKyAgICAgICAgOy8vIEZpeGVkIExlbmdoIERlY29kaW5nIEVzY2FwZSBNb2RlIDMKKworRXNjYXBlTW9kZTMKKworICAgICAgICBNX0JEX1JFQUQ4ICAgICAgTGFzdCwxLFQxCisgICAgICAgIE1fQkRfUkVBRDggICAgICBzdG9yZVJ1biw2LFQxCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICAgdGVtcDIsc3RvcmVSdW4sQ291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIFJ1biArIENvdW50IGV4Y2VlZHMgNjMKKyAgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAyLCM2NAorICAgICAgICBCR0UgICAgICAgICAgICAgRXhpdEVycm9yCisKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICBtYXJrZXJiaXQsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgbWFya2VyIGJpdCBpcyB6ZXJvCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKyAgICAgICAgCisgICAgICAgIE1fQkRfUkVBRDE2ICAgICBzdG9yZUxldmVsLDEyLFQxCisKKyAgICAgICAgVFNUICAgICAgICAgICAgIHN0b3JlTGV2ZWwsIzB4ODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZXN0IGlmIHRoZSBsZXZlbCBpcyBuZWdhdGl2ZQorICAgICAgICBTVUJORSAgICAgICAgICAgc3RvcmVMZXZlbCxzdG9yZUxldmVsLCM0MDk2CisgICAgICAgIENNUCAgICAgICAgICAgICBzdG9yZUxldmVsLCMwCisgICAgICAgIENNUE5FICAgICAgICAgICBzdG9yZUxldmVsLCMtMjA0OAorICAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEV4aXQgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIExldmVsPT0wIG9yICAtMjA0OCAKKworICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYWRkcmVzcyBvZiB6aWd6YWdUYWJsZQorICAgICAgICAgICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIG1hcmtlcmJpdCwxLFQxCisgICAgICAgICAgIAorCisgICAgICAgIDsvLyBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlciAoIFNpZ24gbm90IHVzZWQgYXMgc3RvcmVMZXZlbCBpcyBwcmVwcm9jZXNzZWQpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIAorCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1biBMZW5ndGgKKworICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsc3RvcmVSdW4KKworCisgCitzdG9yZUxldmVsTGFzdAorICAgICAgICAKKyAgICAgICAgTERSQiAgICAgICAgICAgIHppZ3phZyxbcFppZ3phZ1RhYmxlLENvdW50XQorICAgICAgICBDTVAgICAgICAgICAgICAgTGFzdCwjMQorICAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgIHN0b3JlTGV2ZWwsW3BEc3QsemlnemFnXSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgICAgICAgICBlbmQgCisgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPaworICAgICAgICAKK2VuZAorCisgICAgICAgIENNUCAgICAgICAgICAgICBDb3VudCwjNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9SdW4gdGhlIExvb3AgdW50aWxsIENvdW50IHJlYWNoZXMgNjQKKworICAgICAgICBCTFQgICAgICAgICAgICAgZ2V0VkxDYml0cworCisgICAgICAgIAorRXhpdE9rCisgICAgICAgIDsvLyBFeGl0IFdoZW4gVkxDIERlY29kaW5nIGlzIGRvbmUgU3VjY2Vzc2Z1bGx5IAorICAgCisgICAgICAgIDsvLyBMb2FkaW5nIHBwQml0U3RyZWFtIGFuZCBwQml0T2Zmc2V0IGZyb20gc3RhY2sKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBMYXN0LCMxCisgICAgICAgIE1fTERSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQKKworICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgICAgICAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICBNT1ZORSAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorICAgICAgICBNX0xEUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB0aGUgTGluayBSZWdpc3RlciBCYWNrCisgICAgICAgIEIgICAgICAgICAgICAgICBleGl0MgorCitFeGl0RXJyb3IKKyAgICAgICAgOy8vIEV4aXQgV2hlbiBhbiBFcnJvciBvY2N1cnMgCisKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcE9mZnNldAorICAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIExSLHBMaW5rUmVnaXN0ZXIKKyAgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19FcnIKKworZXhpdDIKKyAgICAgICAKKworICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgRU5ECmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRkMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYwpAQCAtMCwwICsxLDIxMSBAQAorIC8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMKKyAqIERlc2NyaXB0aW9uOiBDb250YWlucyBhbGwgdGhlIEh1ZmZtYW4gdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisKKworCisvLyBDb250YWlucyBvcHRpbWl6ZWQgYW5kIFBhY2tlZCBWTEMgdGFibGVzIHdpdGggTGFzdD0wIGFuZCBMYXN0PTEKKworLy8gICAgICAgICAgICAgIG9wdGltaXplZCBQYWNrZWQgVkxDIHRhYmxlIEVudHJ5IEZvcm1hdCAKKy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIAorLy8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCisvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8gICAgICAgfCAgTGVuICAgfCAgICAgICBSdW4gICAgICAgfCAgICAgTGV2ZWwgICAgfEwgfCAxIHwKKy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLyAgICAgICB8ICAgICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgICAgICB8IDAgfAorLy8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vIElmIHRoZSB0YWJsZSBlbnRyeSBpcyBhIGxlYWYgZW50cnkgdGhlbiBiaXQgMCBzZXQ6CisvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAgKDAgdG8gNykgIDMgYml0cworLy8gICAgUnVuICAgID0gUnVuTGVuZ3RoIG9mIHRoZSBTeW1ib2wgICgwIHRvIDYzKSA2IGJpdHMKKy8vICAgIExldmVsICA9IExldmVsIG9mIHRoZSBTeW1ib2wgICAgICAoMCB0byAzMSkgNSBiaXRzCisvLyAgICBMICAgICAgPSBMYXN0IFZhbHVlIG9mIHRoZSBTeW1ib2wgKDAgb3IgMSkgIDEgYml0CisvLworLy8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKy8vICAgIE9mZnNldCA9IE51bWJlciBvZiAoMTYtYml0KSBoYWxmIHdvcmRzIGZyb20gdGhlIHRhYmxlCisvLyAgICAgICAgICAgICBzdGFydCB0byB0aGUgbmV4dCB0YWJsZSBub2RlCisvLworLy8gVGhlIHRhYmxlIGlzIGFjY2Vzc2VkIGJ5IHN1Y2Nlc3NpdmUgbG9va3VwIHVwIG9uIHRoZQorLy8gbmV4dCBTdGVwIGJpdHMgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSB1bnRpbCBhIGxlYWYgbm9kZQorLy8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorCisvLyBUaGUgVkxDIHRhYmxlcyB1c2VkIGZvciBJbnRyYSBhbmQgbm9uIGludGEgY29lZmZpY2llbnRzIGluIG5vbiBFc2NhcGUgbW9kZQorLy8gY29udGFpbnMgc3ltYm9scyB3aXRoIGJvdGggTGFzdD0wIGFuZCBMYXN0PTEuCisvLyBJZiBhIHN5bWJvbCBpcyBub3QgZm91bmQgaW4gdGhlIHRhYmxlIGl0IHdpbGwgYmUgY29kZWQgYXMgMHhGRkYKKyAKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDFiMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIxMDksIDB4MjEwOSwgMHgwMjA5LCAweDAwMTEsCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIxMTUsIDB4MjExNSwgMHgyMDFkLCAweDIwMWQsCisgICAgMHgyMDU5LCAweDIwNTksIDB4MjA1MSwgMHgyMDUxLCAweDFjMGQsIDB4MWIwZCwgMHgxYTBkLCAweDE5MGQsCisgICAgMHgwOTExLCAweDA4MTEsIDB4MDcxMSwgMHgwNjExLCAweDA1MTEsIDB4MDMxOSwgMHgwMjE5LCAweDAxMjEsCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMDYxLCAweDIwNjEsIDB4MjEyOSwgMHgyMTI5LCAweDM3MDksIDB4MzcwOSwgMHgzODA5LCAweDM4MDksCisgICAgMHgzZDBkLCAweDNkMGQsIDB4M2UwZCwgMHgzZTBkLCAweDNmMGQsIDB4M2YwZCwgMHgyMDBkLCAweDIwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAxMzEsIDB4MDIyMSwgMHgwNDE5LCAweDA1MTksCisgICAgMHgwNjE5LCAweDBhMTEsIDB4MTkwOSwgMHgxYTA5LCAweDIxMGQsIDB4MjIwZCwgMHgyMzBkLCAweDI0MGQsCisgICAgMHgyNTBkLCAweDI2MGQsIDB4MjcwZCwgMHgyODBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDQ5LCAweDAwNDEsIDB4MzgwZCwgMHgzODBkLCAweDM3MGQsIDB4MzcwZCwgMHgzNjBkLCAweDM2MGQsCisgICAgMHgzNTBkLCAweDM1MGQsIDB4MzQwZCwgMHgzNDBkLCAweDMzMGQsIDB4MzMwZCwgMHgzMjBkLCAweDMyMGQsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDMxMGQsIDB4MzEwZCwgMHgyMDE1LCAweDIwMTUsCisgICAgMHgzNjA5LCAweDM2MDksIDB4MzUwOSwgMHgzNTA5LCAweDM0MDksIDB4MzQwOSwgMHgzMzA5LCAweDMzMDksCisgICAgMHgzMjA5LCAweDMyMDksIDB4MzEwOSwgMHgzMTA5LCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgxMDBkLCAweDMwMDksIDB4MzAwOSwgMHgyZjA5LCAweDJmMDksCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjMxMSwgMHgyMzExLCAweDIwMzksIDB4MjAzOSwgMHgyMDMxLCAweDIwMzEsCisgICAgMHgwZjBkLCAweDBlMGQsIDB4MGQwZCwgMHgwYzBkLCAweDBiMGQsIDB4MGEwZCwgMHgwOTBkLCAweDBlMDksCisgICAgMHgwZDA5LCAweDAyMTEsIDB4MDExOSwgMHgwMDI5LCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyODBkLCAweDI4MGQsIDB4MjcwZCwgMHgyNzBkLCAweDI2MGQsIDB4MjYwZCwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyYzA5LCAweDJjMDksIDB4Yjc1OSwgMHhiNzU5LCAweDJhMDksIDB4MmEwOSwgMHgyMDIxLCAweDIwMjEsCisgICAgMHgwNDBkLCAweDAzMGQsIDB4MGIzNSwgMHgwMTBkLCAweDA5MDksIDB4MDgwOSwgMHgwNzA5LCAweDA2MDksCisgICAgMHgwMTExLCAweDAwMTksIDB4MjUwOSwgMHgyNTA5LCAweDI0MDksIDB4MjQwOSwgMHgyMzA5LCAweDIzMDkKK307CisKKworY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50cmFWbGNMMEwxWzIwMF0gPSB7CisgICAgMHgwMDIwLCAweDAxMDgsIDB4MDE0OCwgMHgwMTcwLCAweDAxNzgsIDB4MDE4MCwgMHgwMTg4LCAweDBmMDksCisgICAgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDIwMTEsIDB4MjAxMSwgMHgwMTA5LCAweDAwMTksCisgICAgMHgwMDI4LCAweDAwNjAsIDB4MDBiOCwgMHgwMGUwLCAweDAwMzAsIDB4MDA0OCwgMHgwMDUwLCAweDAwNTgsCisgICAgMHgzZmZmLCAweDNmZmYsIDB4MDAzOCwgMHgwMDQwLCAweDIwM2QsIDB4MjAzZCwgMHgyMDM1LCAweDIwMzUsCisgICAgMHgyMGIxLCAweDIwYjEsIDB4MjBhOSwgMHgyMGE5LCAweDAyMTUsIDB4MDExZCwgMHgwMDJkLCAweDBkMDksCisgICAgMHgwNTE5LCAweDA4MTEsIDB4MDQxOSwgMHgwMzIxLCAweDAyMjEsIDB4MDEzOSwgMHgwMGExLCAweDAwOTksCisgICAgMHgwMDY4LCAweDAwOTAsIDB4M2ZmZiwgMHgzZmZmLCAweDAwNzAsIDB4MDA3OCwgMHgwMDgwLCAweDAwODgsCisgICAgMHgyMGI5LCAweDIwYjksIDB4MjBjMSwgMHgyMGMxLCAweDIxNDEsIDB4MjE0MSwgMHgyOTExLCAweDI5MTEsCisgICAgMHgyMzE1LCAweDIzMTUsIDB4MjQxNSwgMHgyNDE1LCAweDJmMGQsIDB4MmYwZCwgMHgzMDBkLCAweDMwMGQsCisgICAgMHgwMDk4LCAweDAwYTAsIDB4MDBhOCwgMHgwMGIwLCAweDAwYzksIDB4MDBkMSwgMHgwMGQ5LCAweDAxNDksCisgICAgMHgwNjE5LCAweDAxNTEsIDB4MDIyOSwgMHgwNzE5LCAweDBlMDksIDB4MDA0NSwgMHgwNTE1LCAweDA2MTUsCisgICAgMHgxMTBkLCAweDEyMGQsIDB4MTMwZCwgMHgxNDBkLCAweDAwYzAsIDB4MDBjOCwgMHgwMGQwLCAweDAwZDgsCisgICAgMHgwMDkxLCAweDAwODksIDB4MmUwZCwgMHgyZTBkLCAweDJkMGQsIDB4MmQwZCwgMHgyYzBkLCAweDJjMGQsCisgICAgMHgyYjBkLCAweDJiMGQsIDB4MmEwZCwgMHgyYTBkLCAweDIxMTUsIDB4MjExNSwgMHgyMDI1LCAweDIwMjUsCisgICAgMHgwMGU4LCAweDAwZjAsIDB4MDBmOCwgMHgwMTAwLCAweDJjMDksIDB4MmMwOSwgMHgyYjA5LCAweDJiMDksCisgICAgMHgyNzExLCAweDI3MTEsIDB4MjYxMSwgMHgyNjExLCAweDI1MTEsIDB4MjUxMSwgMHgyMzE5LCAweDIzMTksCisgICAgMHgyMjE5LCAweDIyMTksIDB4MjEzMSwgMHgyMTMxLCAweDAxMTAsIDB4MDEzMCwgMHgwMTM4LCAweDAxNDAsCisgICAgMHgwMTE4LCAweDAxMjAsIDB4MDEyOCwgMHgwODBkLCAweDIxMjksIDB4MjEyOSwgMHgyMDgxLCAweDIwODEsCisgICAgMHgyNDExLCAweDI0MTEsIDB4MjA3OSwgMHgyMDc5LCAweDIwNzEsIDB4MjA3MSwgMHgyMDY5LCAweDIwNjksCisgICAgMHgxYmI1LCAweDA2MGQsIDB4MDAxZCwgMHhkM2Y5LCAweDA5MDksIDB4MDgwOSwgMHgwOTBkLCAweDAzMTEsCisgICAgMHgwMTIxLCAweDAwNjEsIDB4MDA1OSwgMHgwMDUxLCAweDAxNTAsIDB4MDE1OCwgMHgwMTYwLCAweDAxNjgsCisgICAgMHgyNDBkLCAweDI0MGQsIDB4MjMwZCwgMHgyMzBkLCAweDI2MDksIDB4MjYwOSwgMHgyNTBkLCAweDI1MGQsCisgICAgMHgyNzA5LCAweDI3MDksIDB4MjIxMSwgMHgyMjExLCAweDIxMTksIDB4MjExOSwgMHgyMDQ5LCAweDIwNDksCisgICAgMHgwMDE1LCAweDA1MDksIDB4MDIwZCwgMHgwMTBkLCAweDA0MDksIDB4MDMwOSwgMHgwMDQxLCAweDAwMzksCisgICAgMHgwMTExLCAweDAwMzEsIDB4MjIwOSwgMHgyMjA5LCAweDIwMjksIDB4MjAyOSwgMHgyMDIxLCAweDIwMjEKK307CisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FJbnRyYURDTHVtYUNocm9tYUluZGV4WzY0XSA9IHsKKyAgICAweDAwMjAsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksIDB4MjAwNywgMHgyMDA3LCAweDIwMDEsIDB4MjAwMSwKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDAwMjgsIDB4MDAwZiwgMHgyMDBkLCAweDIwMGQsIDB4MDAzMCwgMHgwMDEzLCAweDIwMTEsIDB4MjAxMSwKKyAgICAweDAwMzgsIDB4MDAxNywgMHgyMDE1LCAweDIwMTUsIDB4M2ZmZiwgMHgzZmZmLCAweDIwMTksIDB4MjAxOSwKKworCTB4MDAyMCwgMHgwMDA5LCAweDIwMDcsIDB4MjAwNywgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LAorICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLAorICAgIDB4MDAyOCwgMHgwMDBkLCAweDIwMGIsIDB4MjAwYiwgMHgwMDMwLCAweDAwMTEsIDB4MjAwZiwgMHgyMDBmLAorICAgIDB4MDAzOCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywgMHgxZmZmLCAweDAwMTksIDB4MjAxNywgMHgyMDE3Cit9OworCisKK2NvbnN0IE9NWF9VMTYgYXJtVkNNNFAyX2FWbGNNVkRbMTI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDBmMCwgMHgwMDQzLCAweDAwM2YsIDB4NDA0MSwgMHg0MDQxLCAweDQwNDEsIDB4NDA0MSwKKyAgICAweDAwMTgsIDB4MDBkOCwgMHgwMDQ3LCAweDAwM2IsIDB4MDAyMCwgMHgwMDgwLCAweDAwYTgsIDB4MDBkMCwKKyAgICAweDAwMjgsIDB4MDA0OCwgMHgwMDcwLCAweDAwNzgsIDB4MWZmZiwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwKKyAgICAweDAwODEsIDB4MDAwMSwgMHgwMDdmLCAweDAwMDMsIDB4MjA3ZCwgMHgyMDdkLCAweDIwMDUsIDB4MjAwNSwKKyAgICAweDIwN2IsIDB4MjA3YiwgMHgyMDA3LCAweDIwMDcsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MDA2OCwKKyAgICAweDIwNzksIDB4MjA3OSwgMHgyMDA5LCAweDIwMDksIDB4MjA3NywgMHgyMDc3LCAweDIwMGIsIDB4MjAwYiwKKyAgICAweDIwNzUsIDB4MjA3NSwgMHgyMDBkLCAweDIwMGQsIDB4MjA3MywgMHgyMDczLCAweDIwMGYsIDB4MjAwZiwKKyAgICAweDAwNzEsIDB4MDAxMSwgMHgwMDZmLCAweDAwMTMsIDB4MDA2ZCwgMHgwMDE1LCAweDAwNmIsIDB4MDAxNywKKyAgICAweDAwODgsIDB4MDA5MCwgMHgwMDk4LCAweDAwYTAsIDB4MDA2OSwgMHgwMDE5LCAweDAwNjcsIDB4MDAxYiwKKyAgICAweDAwNjUsIDB4MDAxZCwgMHgwMDYzLCAweDAwMWYsIDB4MDA2MSwgMHgwMDIxLCAweDAwNWYsIDB4MDAyMywKKyAgICAweDAwNWQsIDB4MDAyNSwgMHgwMDViLCAweDAwMjcsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwNTksIDB4MDAyOSwgMHgwMDU3LCAweDAwMmIsIDB4MjA1NSwgMHgyMDU1LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwNTMsIDB4MjA1MywgMHgyMDJmLCAweDIwMmYsIDB4MjA1MSwgMHgyMDUxLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDMzLCAweDIwMzMsIDB4MDBlMCwgMHgwMGU4LCAweDAwNDksIDB4MDAzOSwKKyAgICAweDIwNGQsIDB4MjA0ZCwgMHgyMDM1LCAweDIwMzUsIDB4MjA0YiwgMHgyMDRiLCAweDIwMzcsIDB4MjAzNywKKyAgICAweDIwNDUsIDB4MjA0NSwgMHgyMDNkLCAweDIwM2QKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRlciAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzI3LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFMTUFYWzczXSA9IAoreworICAgMTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLCAKKyAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMQorfTsKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFsxMi0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRlckwwTDFSTUFYWzM1XSA9IAoreworICAgMjYsIDEwLCAgNiwgIDIsICAxLCAgMSwgICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCisgICAgMCwgIDAsICAwLCAgMCwgIDQwLCAgMSwgIDAKK307CisKKy8qIExNQVggdGFibGUgZm9yIG5vbiBJbnRyYSAoTGFzdCA9PSAwIGFuZCBMYXN0PTEpCisgICBMZXZlbCAtIDEgSW5kZXhlZAorICAgcGFkZGVkIGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzE1LTMxXSB3aXRoIHplcm9zIHRvIGFjZXNzIGVudHJpZXMgZm9yIExhc3Q9MSBlZmZlY3RpdmVseQorCisqLworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXSA9IAoreworICAgMjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAKKyAgICAzLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisKKwk4LCAgMywgIDIsICAyLCAgMiwgIDIsICAyLCAgMSwgCisJMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisJMSwgIDEsICAxLCAgMSwgIDEKK307CisKKworLyogUk1BWCB0YWJsZSBmb3Igbm9uIEludGVyIChMYXN0ID09IDAgYW5kIExhc3Q9MSkKKyAgIExldmVsIC0gMSBJbmRleGVkIAorIHBhZGRlZCBhcm1WQ000UDJfSW50cmFMMEwxUk1BWFsyNy0zMV0gd2l0aCB6ZXJvcyB0byBhY2Nlc3MgZW50cmllcyBmb3IgTGFzdD0xIHRhYmxlIGVmZmVjdGl2ZWx5ICovCisKKworY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFSTUFYWzQwXSA9Cit7CisgICAxNCwgIDksICA3LCAgMywgIDIsICAxLAkxLCAgCisgICAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAJMCwgIAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorCTAsCTAsCTAsCTAsCisJCisJMjAsICA2LCAgMSwgIDAsICAwLCAgMCwgIDAsICAwCisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2Y4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYwpAQCAtMCwwICsxLDc1IEBACisgLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfTG9va3VwX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgYWxsIHRoZSBMb29rdXAgdGFibGVzIHVzZWQgaW4gTVBFRzQgY29kZWMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyAgICAvKiAqIFRhYmxlIEVudHJpZXMgY29udGFpbiBEYyBTY2FsZXIgdmFsdWVzCisgICAgICAgKiBhcm1WQ000UDJfRENTY2FsZXJbaV09IDggICAgICAgICAgIGZvciBpPTEgIHRvICA0IGFuZCBpPTMzIHRvIDM2CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IDIqaSAgICAgICAgIGZvciBpPTUgIHRvICA4CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGkrOCAgICAgICAgIGZvciBpPTkgIHRvICAyNQorICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyKmktMTYgICAgICBmb3IgaT0yNiB0byAgMzEKKyAgICAgICAqICAgICAgICAgICAgICAgICAgICAgID0gKGktMzIrMTMpLzIgZm9yIGk9MzcgdG8gIDU5CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICA9IGktNi0zMiAgICAgIGZvciBpPTYwIHRvICA2MworICAgICAgICogICAgICAgICAgICAgICAgICAgICAgPSAyNTUgICAgICAgICBmb3IgaT0wIGFuZCBpPTMyCisgICAgICAgKi8KKyAgICAgICAKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfRENTY2FsZXJbNjRdPXsKKwkweGZmLCAweDgsICAweDgsICAweDgsICAweDgsICAweGEsICAweGMsICAweGUsICAKKyAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAKKyAgICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLAorICAgIDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYsIDB4MjgsIDB4MmEsIDB4MmMsIDB4MmUsCisgICAgMHhmZiwgMHg4LCAgMHg4LCAgMHg4LCAgMHg4LCAgMHg5LCAgMHg5LCAgMHhhLCAgCisgICAgMHhhLCAgMHhiLCAgMHhiLCAgMHhjLCAgMHhjLCAgMHhkLCAgMHhkLCAgMHhlLCAgCisgICAgMHhlLCAgMHhmLCAgMHhmLCAgMHgxMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMiwgCisgICAgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwKKworfTsKKworICAgICAgICAgICAgICAKKyAgICAgLyogIFRhYmxlIEVudHJpZXMgQ29udGFpbiByZWNpcHJvY2FsIG9mIDEgdG8gNjMKKyAgICAgICogIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNltpXT1yb3VuZCgzMjc2Ny9pKQorICAgICAgKiAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzE2WzBdPSAwCisgICAgICAqLworCitjb25zdCBPTVhfUzE2IGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNls2NF09eworCTB4MDAwMCwweDdmZmYsMHg0MDAwLDB4MmFhYSwweDIwMDAsMHgxOTk5LDB4MTU1NSwweDEyNDksCisgICAgMHgxMDAwLDB4MGUzOSwweDBjY2QsMHgwYmEzLDB4MGFhYiwweDA5ZDksMHgwOTI1LDB4MDg4OCwKKyAgICAweDA4MDAsMHgwNzg3LDB4MDcxYywweDA2YmQsMHgwNjY2LDB4MDYxOCwweDA1ZDEsMHgwNTkxLAorICAgIDB4MDU1NSwweDA1MWYsMHgwNGVjLDB4MDRiZSwweDA0OTIsMHgwNDZhLDB4MDQ0NCwweDA0MjEsCisgICAgMHgwNDAwLDB4MDNlMSwweDAzYzQsMHgwM2E4LDB4MDM4ZSwweDAzNzYsMHgwMzVlLDB4MDM0OCwKKyAgICAweDAzMzMsMHgwMzFmLDB4MDMwYywweDAyZmEsMHgwMmU5LDB4MDJkOCwweDAyYzgsMHgwMmI5LAorICAgIDB4MDJhYiwweDAyOWQsMHgwMjhmLDB4MDI4MiwweDAyNzYsMHgwMjZhLDB4MDI1ZiwweDAyNTQsCisgICAgMHgwMjQ5LDB4MDIzZiwweDAyMzUsMHgwMjJiLDB4MDIyMiwweDAyMTksMHgwMjExLDB4MDIwOAorCSAgIAorfTsKKyAgICAgCisgICAgICAvKiBUYWJsZSBFbnRyaWVzIENvbnRhaW4gcmVjaXByb2NhbCBvZiAxIHRvIDYzCisgICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbaV09cm91bmQoMTMxMDcxL2kpCisgICAgICAgKiBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMzJbMF09IDAKKyAgICAgICAqLworCitjb25zdCBPTVhfUzMyIGFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMls2NF09eworCTB4MDAwMDAwMDAsMHgwMDAxZmZmZiwweDAwMDEwMDAwLDB4MDAwMGFhYWEsIDB4MDAwMDgwMDAsIDB4MDAwMDY2NjYsIDB4MDAwMDU1NTUsIDB4MDAwMDQ5MjQsCisgICAgMHgwMDAwNDAwMCwweDAwMDAzOGUzLDB4MDAwMDMzMzMsMHgwMDAwMmU4YywgMHgwMDAwMmFhYiwgMHgwMDAwMjc2MiwgMHgwMDAwMjQ5MiwgMHgwMDAwMjIyMiwKKyAgICAweDAwMDAyMDAwLDB4MDAwMDFlMWUsMHgwMDAwMWM3MiwweDAwMDAxYWYyLCAweDAwMDAxOTlhLCAweDAwMDAxODYxLCAweDAwMDAxNzQ2LCAweDAwMDAxNjQzLAorICAgIDB4MDAwMDE1NTUsMHgwMDAwMTQ3YiwweDAwMDAxM2IxLDB4MDAwMDEyZjYsIDB4MDAwMDEyNDksIDB4MDAwMDExYTgsIDB4MDAwMDExMTEsIDB4MDAwMDEwODQsCisgICAgMHgwMDAwMTAwMCwweDAwMDAwZjg0LDB4MDAwMDBmMGYsMHgwMDAwMGVhMSwgMHgwMDAwMGUzOSwgMHgwMDAwMGRkNiwgMHgwMDAwMGQ3OSwgMHgwMDAwMGQyMSwKKyAgICAweDAwMDAwY2NkLDB4MDAwMDBjN2QsMHgwMDAwMGMzMSwweDAwMDAwYmU4LCAweDAwMDAwYmEzLCAweDAwMDAwYjYxLCAweDAwMDAwYjIxLCAweDAwMDAwYWU1LAorICAgIDB4MDAwMDBhYWIsMHgwMDAwMGE3MywweDAwMDAwYTNkLDB4MDAwMDBhMGEsIDB4MDAwMDA5ZDksIDB4MDAwMDA5YTksIDB4MDAwMDA5N2IsIDB4MDAwMDA5NGYsCisgICAgMHgwMDAwMDkyNSwweDAwMDAwOGZiLDB4MDAwMDA4ZDQsMHgwMDAwMDhhZSwgMHgwMDAwMDg4OSwgMHgwMDAwMDg2NSwgMHgwMDAwMDg0MiwgMHgwMDAwMDgyMAorCQorfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9hcm1WQ000UDJfU2V0UHJlZERpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTJkODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCkBAIC0wLDAgKzEsMTA0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDJfU2V0UHJlZERpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7ICoqCis7ICogRnVuY3Rpb246IGFybVZDTTRQMl9TZXRQcmVkRGlyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBkZXRlY3RpbmcgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uCis7ICoKKzsgKiBSZW1hcmtzOgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LCBvZiBJU08vSUVDCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgIDE0NDk2LTIuIEZ1cnRoZXJtb3JlLCBpbmRleGVzIDYgdG8gOSBpbmRpY2F0ZSB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgMCB0byAzIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suCis7ICogW2luXSBwQ29lZkJ1ZlJvdyBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyCis7ICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorOyAqIFtvdXRdcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCis7ICogW291dF1wcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorOyAqICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAgICBwcmVkaWN0IGhvcml6b250YWxseQorOyAqICAgICAgICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCis7ICoKKzsgKi8KKworICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgIElOQ0xVREUgb214VkNfcy5oCisKKworICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKworICAgICAgIElGIEFSTTExMzZKUworIAorOy8vIElucHV0IEFyZ3VtZW50cworQmxvY2tJbmRleCAgICAgICAgIFJOIDAKK3BDb2VmQnVmUm93ICAgICAgICBSTiAxCitwQ29lZkJ1ZkNvbCAgICAgICAgUk4gMgorcHJlZERpciAgICAgICAgICAgIFJOIDMKK3ByZWRRUCAgICAgICAgICAgICBSTiA0CitwUXBCdWYgICAgICAgICAgICAgUk4gNQorCis7Ly8gTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICBSTiAwCitibG9ja0RDTGVmdCAgICAgICAgUk4gNiAgCitibG9ja0RDVG9wICAgICAgICAgUk4gNworYmxvY2tEQ1RvcExlZnQgICAgIFJOIDgKK3RlbXAxICAgICAgICAgICAgICBSTiA5Cit0ZW1wMiAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIE1fU1RBUlQgICAgYXJtVkNNNFAyX1NldFByZWREaXIscjkKKworICAgICAgIE1fQVJHICAgICAgIHBwcmVkUVAsNAorICAgICAgIE1fQVJHICAgICAgIHBwUXBCdWYsNAorICAgIAorICAgICAgIExEUkggICAgICAgIGJsb2NrRENUb3BMZWZ0LFtwQ29lZkJ1ZlJvdywjLTE2XQorICAgICAgIExEUkggICAgICAgIGJsb2NrRENMZWZ0LFtwQ29lZkJ1ZkNvbF0KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICBCbG9ja0luZGV4LCMzCisgICAgICAgTERSRVFIICAgICAgYmxvY2tEQ1RvcCxbcENvZWZCdWZDb2wsIy0xNl0KKyAgICAgICBMRFJORUggICAgICBibG9ja0RDVG9wLFtwQ29lZkJ1ZlJvd10KKyAgICAgICAgICAgICAKKyAgICAgICBTVUJTICAgICAgICB0ZW1wMSxibG9ja0RDTGVmdCxibG9ja0RDVG9wTGVmdAorICAgICAgIFJTQkxUICAgICAgIHRlbXAxLHRlbXAxLCMwCisgICAgICAgU1VCUyAgICAgICAgdGVtcDIsYmxvY2tEQ1RvcExlZnQsYmxvY2tEQ1RvcAorICAgICAgIFJTQkxUICAgICAgIHRlbXAyLHRlbXAyLCMwCisgICAgICAKKyAgICAgICBNX0xEUiAgICAgICBwUXBCdWYscHBRcEJ1ZgorICAgICAgIE1fTERSICAgICAgIHByZWRRUCxwcHJlZFFQCisgICAgICAgQ01QICAgICAgICAgdGVtcDEsdGVtcDIKKyAgICAgICBNT1YgICAgICAgICB0ZW1wMiwjT01YX1ZDX1ZFUlRJQ0FMCisgICAgICAgTERSTFRCICAgICAgdGVtcDEsW3BRcEJ1ZiwjMV0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBTVFJMVCAgICAgICB0ZW1wMSxbcHJlZFFQXQorICAgICAgIE1PViAgICAgICAgIHRlbXAyLCNPTVhfVkNfSE9SSVpPTlRBTCAgICAgICAgICAgCisgICAgICAgTERSR0VCICAgICAgdGVtcDEsW3BRcEJ1Zl0KKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMixbcHJlZERpcl0KKyAgICAgICBNT1YgICAgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICBTVFJHRSAgICAgICB0ZW1wMSxbcHJlZFFQXSAKKworICAgICAgICAgCisgICAgCisgICAgICAgTV9FTkQKKyAKKyAgICAgICBFTkRJRgorCisgICAgICAgRU5EICAgIAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE3ZjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKQEAgLTAsMCArMSw2MSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgOTY0MQorICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnWmFnX1RhYmxlcy5jCisgKiBEZXNjcmlwdGlvbjogQ29udGFpbnMgdGhlIHppZ3phZyB0YWJsZXMKKyAqCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKy8qIENvbnRhaW5zIERvdWJsZSB0aGUgdmFsdWVzIGluIHRoZSByZWZlcmVuY2UgWmlnemFnIFRhYmxlCisgKiBDb250YWlucyBDbGFzc2ljYWwsVmV0aWNhbCBhbmQgSG9yaXpvbnRhbCBaaWd6YWdzY2FuIHRhYmxlcyBpbiBvbmUgYXJyYXkgIAorICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gWzE5Ml0gPSAKK3sKKyAgICAgMCwgIDIsICAxNiwgMzIsICAxOCwgIDQsICA2LCAyMCwKKyAgICAzNCwgNDgsIDY0LCA1MCwgMzYsIDIyLCAgOCwgIDEwLAorICAgIDI0LCAzOCwgNTIsIDY2LCA4MCwgOTYsIDgyLCA2OCwKKyAgICA1NCwgNDAsIDI2LCAgMTIsICAxNCwgMjgsIDQyLCA1NiwgCisgICAgNzAsIDg0LCA5OCwgMTEyLCAxMTQsIDEwMCwgODYsIDcyLAorICAgIDU4LCA0NCwgMzAsIDQ2LCA2MCwgNzQsIDg4LCAxMDIsCisgICAgMTE2LCAxMTgsIDEwNCwgOTAsIDc2LCA2MiwgNzgsIDkyLAorICAgIDEwNiwgMTIwLCAxMjIsIDEwNCwgOTQsIDExMCwgMTI0LCAxMjYsCisKKwkwLCAgMTYsIDMyLCA0OCwgIDIsICAxOCwgIDQsIDIwLAorICAgIDM0LCA1MCwgNjQsIDgwLCA5NiwgMTEyLCAxMTQsIDk4LAorICAgIDgyLCA2NiwgNTIsIDM2LCAgNiwgMjIsICA4LCAyNCwKKyAgICAzOCwgNTQsIDY4LCA4NCwgMTAwLCAxMTYsIDcwLCA4NiwKKyAgICAxMDIsIDExOCwgNDAsIDU2LCAgMTAsIDI2LCAgMTIsIDI4LAorICAgIDQyLCA1OCwgNzIsIDg4LCAxMDQsIDEyMCwgNzQsIDkwLCAKKyAgICAxMDYsIDEyMiwgNDQsIDYwLCAgMTQsIDMwLCA0NiwgNjIsCisgICAgNzYsIDkyLCAxMDgsIDEyNCwgNzgsIDk0LCAxMTAsIDEyNiwKKworICAgIDAsICAyLCAgNCwgIDYsICAxNiwgIDE4LCAzMiwgMzQsCisgICAgMjAsIDIyLCAgOCwgIDEwLCAgMTIsICAxNCwgMzAsIDI4LAorICAgIDI2LCAyNCwgMzgsIDM2LCA0OCwgNTAsIDY0LCA2NiwKKyAgICA1MiwgNTQsIDQwLCA0MiwgNDQsIDQ2LCA1NiwgNTgsCisgICAgNjAsIDYyLCA2OCwgNzAsIDgwLCA4MiwgOTYsIDk4LAorICAgIDg0LCA4NiwgNzIsIDc0LCA3NiwgNzgsIDg4LCA5MCwgCisgICAgOTIsIDk0LCAxMDAsIDEwMiwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTIwLCAxMjIsIDEyNCwgMTI2CisKKworfTsKKworCisKKworCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2M2QyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCkBAIC0wLDAgKzEsMTAyIEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKyAKKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKworCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRFUiBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZyBhbmQgSURDVCwgd2l0aCBhcHByb3ByaWF0ZSBjbGlwcGluZyBvbiBlYWNoIHN0ZXAsIGFyZSBwZXJmb3JtZWQKKyAqIG9uIHRoZSBjb2VmZmljaWVudHMuIFRoZSByZXN1bHRzIChyZXNpZHVhbHMpIGFyZSBwbGFjZWQgaW4gYSBjb250aWd1b3VzIGFycmF5CisgKiBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IGJ1ZmZlciBob2xkcyB0aGUgcmVzaWR1YWxzIGZvcgorICogZnVydGhlciByZWNvbnN0cnVjdGlvbi4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddCisgKiBbaW5dCVFQCQkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciAgICBhIGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgaW5kaWNhdGVzIHVzaW5nIHF1YW50aXphdGlvbiBtZXRob2QgZGVmaW5lZCBpbiBzaG9ydAorICogICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbyBoZWFkZXIgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgaW5kaWNhdGVzIG5vcm1haWwgcXVhbnRpemF0aW9uIG1ldGhvZC4KKyAqIFtvdXRdIHBwQml0U3RyZWFtIAkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtCisgKiBbb3V0XSBwRHN0CQkJcG9pbnRlciB0byB0aGUgZGVjb2RlZCByZXNpZHVhbCBidWZmZXIgKGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cyBvZgorICogICAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBkYXRhIHR5cGUpLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE51bGw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0CisgKiAgIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBiZWxvdyBjYXNlOgorICogICAtICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIFFQIDw9IDA7CisgKgkgLSBwRHN0IG5vdCAxNi1ieXRlIGFsaWduZWQKKyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlcigKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKQoreworICAgIC8qIDY0IGVsZW1lbnRzIGFyZSBuZWVkZWQgYnV0IHRvIGFsaWduIGl0IHRvIDE2IGJ5dGVzIG5lZWQKKyAgICAxNSBtb3JlIGVsZW1lbnRzIG9mIHBhZGRpbmcgKi8KKyAgICBPTVhfUzE2IHRlbXBCdWZbNzldOworICAgIE9NWF9TMTYgKnBUZW1wQnVmMTsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1Zik7CisgICAgCisgICAgCisgICAgLyogVkxEIGFuZCB6aWd6YWcgKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyKHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcEJ1ZjEsc2hvcnRWaWRlb0hlYWRlcik7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIFFQKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBJbnZlcnNlIHRyYW5zZm9ybSAqLworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9JRENUOHg4YmxrKHBUZW1wQnVmMSwgcERzdCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisJICAgIAorICAgIHJldHVybiBPTVhfU3RzX05vRXJyOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDlhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZXNjcmlwdGlvbjogCisgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRyYSByZWNvbnN0cnVjdGlvbgorICogCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhCisgKgorICogRGVzY3JpcHRpb246CisgKiBEZWNvZGVzIHRoZSBJTlRSQSBibG9jayBjb2VmZmljaWVudHMuIEludmVyc2UgcXVhbnRpemF0aW9uLCBpbnZlcnNlbHkgemlnemFnCisgKiBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgcGVyZm9ybWVkCisgKiBvbiB0aGUgY29lZmZpY2llbnRzLiBUaGUgcmVzdWx0cyBhcmUgdGhlbiBwbGFjZWQgaW4gdGhlIG91dHB1dCBmcmFtZS9wbGFuZSBvbgorICogYSBwaXhlbCBiYXNpcy4gRm9yIElOVFJBIGJsb2NrLCB0aGUgb3V0cHV0IHZhbHVlcyBhcmUgY2xpcHBlZCB0byBbMCwgMjU1XSBhbmQKKyAqIHdyaXR0ZW4gdG8gY29ycmVzcG9uZGluZyBibG9jayBidWZmZXIgd2l0aGluIHRoZSBkZXN0aW5hdGlvbiBwbGFuZS4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKyAqCQkJCQkJCQl0aGUgYml0IHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5CisgKgkJCQkJCQkJY2hlY2sgZm9yIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbgorICoJCQkJCQkJCVswLTddLgorICogW2luXQlzdGVwCQkJd2lkdGggb2YgdGhlIGRlc3RpbmF0aW9uIHBsYW5lCisgKiBbaW4vb3V0XQlwQ29lZkJ1ZlJvdwkJW2luXSAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICBbb3V0XSB1cGRhdGVkIGNvZWZmaWNpZW50IHJ3byBidWZmZXIKKyAqIFtpbi9vdXRdCXBDb2VmQnVmQ29sCQlbaW5dICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRdIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXQljdXJRUAkJCXF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIG1hY3JvYmxvY2sgd2hpY2gKKyAqCQkJCQkJCQl0aGUgY3VycmVudCBibG9jayBiZWxvbmdzIHRvCisgKiBbaW5dCXBRcEJ1ZgkJIFBvaW50ZXIgdG8gYSAyLWVsZW1lbnQgUVAgYXJyYXkuIHBRcEJ1ZlswXSBob2xkcyB0aGUgUVAgb2YgdGhlIDh4OCBibG9jayBsZWZ0IHRvCisgKiAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBibG9jayhRUGEpLiBwUXBCdWZbMV0gaG9sZHMgdGhlIFFQIG9mIHRoZSA4eDggYmxvY2sganVzdCBhYm92ZSB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2soUVBjKS4KKyAqICAgICAgICAgICAgICAgICAgIE5vdGUsIGluIGNhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgaXMgb3V0IG9mIFZPUCBib3VuZCwgdGhlIFFQIHZhbHVlIHdpbGwgaGF2ZQorICogICAgICAgICAgICAgICAgICAgbm8gZWZmZWN0IHRvIHRoZSBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MuIFJlZmVyIHRvIHN1YmNsYXVzZSAgIjcuNC4zLjMgQWRhcHRpdmUKKyAqICAgICAgICAgICAgICAgICAgIGFjIGNvZWZmaWNpZW50IHByZWRpY3Rpb24iIG9mIElTTy9JRUMgMTQ0OTYtMihNUEVHNCBQYXJ0MikgZm9yIGFjY3VyYXRlIGRlc2NyaXB0aW9uLgorICogW2luXQlibG9ja0luZGV4CQlibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQKKyAqCQkJCQkJCQlwb3NpdGlvbiBhcyBkZWZpbmVkIGluIHN1YmNsYXVzZSA2LjEuMy44LAorICoJCQkJCQkJCUZpZ3VyZSA2LTUgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JaW50cmFEQ1ZMQwkJYSBjb2RlIGRldGVybWluZWQgYnkgaW50cmFfZGNfdmxjX3RociBhbmQgUVAuCisgKgkJCQkJCQkJVGhpcyBhbGxvd3MgYSBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQworICoJCQkJCQkJCWZvciBjb2Rpbmcgb2YgSW50cmEgREMgY29lZmZpY2llbnRzIGFzIHBlciBUYWJsZQorICoJCQkJCQkJCTYtMjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLiAKKyAqIFtpbl0JQUNQcmVkRmxhZwkJYSBmbGFnIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyAob2YgbHVtaW5hbmNlKSBpbmRpY2F0aW5nCisgKgkJCQkJCQkJaWYgdGhlIGFjIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0CisgKgkJCQkJCQkJY29sdW1uIGFyZSBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQKKyAqCQkJCQkJCQltYWNyb2Jsb2NrLgorICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorICoJCQkJCQkJYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKyAqIFtvdXRdCXBwQml0U3RyZWFtCQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKyAqCQkJCQkJCQlkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKgkJCQkJCQkJaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbb3V0XQlwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCQkqcHBCaXRTdHJlYW0KKyAqIFtvdXRdCXBEc3QJCQlwb2ludGVyIHRvIHRoZSBibG9jayBpbiB0aGUgZGVzdGluYXRpb24gcGxhbmUuCisgKgkJCQkJCQkJcERzdCBzaG91bGQgYmUgMTYtYnl0ZSBhbGlnbmVkLgorICogW291dF0JcENvZWZCdWZSb3cJCXBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlci4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtCUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFQQnVmLCBwRHN0LgorICogICAgICBvcgorICogICAtICBBdCBsZWFzdCBvbmUgb2YgdGhlIGJlbG93IGNhc2U6ICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10sIGN1clFQIGV4Y2VlZHMgKDEsIDMxKSwKKyAqICAgICAgYmxvY2tJbmRleCBleGNlZWRzIFswLDldLCBzdGVwIGlzIG5vdCB0aGUgbXVsdGlwbGUgb2YgOCwgaW50cmFEQ1ZMQyBpcyB6ZXJvIHdoaWxlCisgKiAgICAgIGJsb2NrSW5kZXggZ3JlYXRlciB0aGFuIDUuCisgKiAgICAgIG9yCisgKiAgIC0JcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkCisgKiBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvcgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBPTVhfVTggKnBEc3QsCisgICAgIE9NWF9JTlQgc3RlcCwKKyAgICAgT01YX1MxNiAqcENvZWZCdWZSb3csCisgICAgIE9NWF9TMTYgKnBDb2VmQnVmQ29sLAorICAgICBPTVhfVTggY3VyUVAsCisgICAgIGNvbnN0IE9NWF9VOCAqcFFQQnVmLAorICAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorCSBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyApCit7CisgICAgT01YX1MxNiB0ZW1wQnVmMVs3OV0sIHRlbXBCdWYyWzc5XTsKKyAgICBPTVhfUzE2ICpwVGVtcEJ1ZjEsICpwVGVtcEJ1ZjI7CisgICAgT01YX0lOVCBwcmVkRGlyLCBwcmVkQUNEaXI7CisgICAgT01YX0lOVCAgcHJlZFFQOworICAgIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50IHZpZGVvQ29tcDsKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIAorICAgIC8qIEFsaWduaW5nIHRoZSBsb2NhbCBidWZmZXJzICovCisgICAgcFRlbXBCdWYxID0gYXJtQWxpZ25UbzE2Qnl0ZXModGVtcEJ1ZjEpOworICAgIHBUZW1wQnVmMiA9IGFybUFsaWduVG8xNkJ5dGVzKHRlbXBCdWYyKTsKKyAgICAKKyAgICAvKiBTZXR0aW5nIHRoZSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBhbmQgcHJlZGljdGlvbiBkaXJlY3Rpb24gKi8KKyAgICBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgICAgYmxvY2tJbmRleCwKKyAgICAgICAgcENvZWZCdWZSb3csCisgICAgICAgIHBDb2VmQnVmQ29sLAorICAgICAgICAmcHJlZERpciwKKyAgICAgICAgJnByZWRRUCwKKyAgICAgICAgcFFQQnVmKTsKKworICAgIHByZWRBQ0RpciA9IHByZWREaXI7CisKKyAgICAKKyAgICBpZiAoQUNQcmVkRmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgcHJlZEFDRGlyID0gT01YX1ZDX05PTkU7CisgICAgfQorCisgICAgLyogU2V0dGluZyB0aGUgdmlkZW9Db21wICovCisgICAgaWYgKGJsb2NrSW5kZXggPD0gMykKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19MVU1JTkFOQ0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvQ29tcCA9IE9NWF9WQ19DSFJPTUlOQU5DRTsKKyAgICB9CisgICAgCisKKyAgICAvKiBWTEQgYW5kIHppZ3phZyAqLworICAgIGlmIChpbnRyYURDVkxDID09IDEpCisgICAgeworICAgICAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMoCisgICAgICAgICAgICBwcEJpdFN0cmVhbSwKKyAgICAgICAgICAgIHBCaXRPZmZzZXQsCisgICAgICAgICAgICBwVGVtcEJ1ZjEsCisgICAgICAgICAgICBwcmVkQUNEaXIsCisgICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyLAorICAgICAgICAgICAgdmlkZW9Db21wKTsKKyAgICAgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQygKKyAgICAgICAgICAgIHBwQml0U3RyZWFtLAorICAgICAgICAgICAgcEJpdE9mZnNldCwKKyAgICAgICAgICAgIHBUZW1wQnVmMSwKKyAgICAgICAgICAgIHByZWRBQ0RpciwKKyAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgICAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBBQyBEQyBwcmVkaWN0aW9uICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSgKKyAgICAgICAgcFRlbXBCdWYxLAorICAgICAgICBwQ29lZkJ1ZlJvdywKKyAgICAgICAgcENvZWZCdWZDb2wsCisgICAgICAgIGN1clFQLAorICAgICAgICBwcmVkUVAsCisgICAgICAgIHByZWREaXIsCisgICAgICAgIEFDUHJlZEZsYWcsCisgICAgICAgIHZpZGVvQ29tcCk7CisgICAgYXJtUmV0RGF0YUVycklmKChlcnJvckNvZGUgIT0gT01YX1N0c19Ob0VyciksIGVycm9yQ29kZSk7CisgICAgCisgICAgLyogRGVxdWFudGl6YXRpb24gKi8KKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JKAorICAgICBwVGVtcEJ1ZjEsCisgICAgIGN1clFQLAorICAgICB2aWRlb0NvbXAsCisgICAgIHNob3J0VmlkZW9IZWFkZXIpOworICAgIGFybVJldERhdGFFcnJJZigoZXJyb3JDb2RlICE9IE9NWF9TdHNfTm9FcnIpLCBlcnJvckNvZGUpOworICAgIAorICAgIC8qIEludmVyc2UgdHJhbnNmb3JtICovCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAyX0lEQ1Q4eDhibGsgKHBUZW1wQnVmMSwgcFRlbXBCdWYyKTsKKyAgICBhcm1SZXREYXRhRXJySWYoKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyKSwgZXJyb3JDb2RlKTsKKyAgICAKKyAgICAvKiBQbGFjaW5nIHRoZSBsaW5lYXIgYXJyYXkgaW50byB0aGUgZGVzdGluYXRpb24gcGxhbmUgYW5kIGNsaXBwaW5nCisgICAgICAgaXQgdG8gMCB0byAyNTUgKi8KKyAgICAKKwlhcm1WQ000UDJfQ2xpcDgocFRlbXBCdWYyLHBEc3Qsc3RlcCk7CisJCisJCisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4NjFkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKQEAgLTAsMCArMSwzNjQgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqIAorOyAqKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUAorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogRGVjb2RlcyBhbmQgcGFkcyBmb3VyIG1vdGlvbiB2ZWN0b3JzIG9mIHRoZSBub24taW50cmEgbWFjcm9ibG9jayBpbiBQLVZPUC4KKzsgKiBUaGUgbW90aW9uIHZlY3RvciBwYWRkaW5nIHByb2Nlc3MgaXMgc3BlY2lmaWVkIGluIHN1YmNsYXVzZSA3LjYuMS42IG9mCis7ICogSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqCis7ICogUGFyYW1ldGVyczoKKzsgKiBbaW5dICAgIHBwQml0U3RyZWFtICAgICAgICBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4KKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbaW5dICAgIHBCaXRPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJ5ICpwcEJpdFN0cmVhbS4gKnBCaXRPZmZzZXQgaXMgdmFsaWQgd2l0aGluCis7ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCis7ICogW2luXSAgICBwU3JjTVZMZWZ0TUIgICAgICAgcG9pbnRlcnMgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYnVmZmVycyBvZiB0aGUKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2tzIHNwZWNpYWxseSBhdCB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIHBTcmNNVlVwcGVyTUIgICAgICBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlciBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIHBTcmNNVlVwcGVyUmlnaHRNQiBwb2ludGVycyB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9ja3Mgc3BlY2lhbGx5IGF0IHRoZSB1cHBlci1yaWdodCBzaWRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKzsgKiAgICAgICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4KKzsgKiBbaW5dICAgIGZjb2RlRm9yd2FyZCAgICAgICBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00Cis7ICogICAgICAgICAgICAgICAgICAgICBiaXQgc3RyZWFtIHN5bnRheAorOyAqIFtpbl0gICAgTUJUeXBlICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlCis7ICogICAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbgorOyAqICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgc3RpbGwgZmlsbGVkIHdpdGggdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBzYW1lIGRlY29kZWQgdmVjdG9yLgorOyAqIFtvdXRdICAgcHBCaXRTdHJlYW0gICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwKKzsgKiAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorOyAqICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0KKzsgKiBbb3V0XSAgIHBEc3RNVkN1ck1CICAgICAgICAgcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgb2YgdGhlIGN1cnJlbnQKKzsgKiAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sgd2hpY2ggY29udGFpbnMgZm91ciBkZWNvZGVkIG1vdGlvbiB2ZWN0b3JzCis7ICoKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtbm8gZXJyb3IKKzsgKiAKKzsgKiAgICAgICAgICAgICAgICAgICAgIAorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICoKKzsgKgorICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorICAgICAgICBJTkNMVURFIG9teFZDX3MuaAorICAgICAgICAKKyAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgIAorICAgICAgICAgICAgICAgIAorCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgIFJOIDEKK3BTcmNNVkxlZnRNQiAgICAgICAgICBSTiAyCitwU3JjTVZVcHBlck1CICAgICAgICAgUk4gMworcFNyY01WVXBwZXJSaWdodE1CICAgIFJOIDQKK3BEc3RNVkN1ck1CICAgICAgICAgICBSTiA1CitmY29kZUZvcndhcmQgICAgICAgICAgUk4gNgorTUJUeXBlICAgICAgICAgICAgICAgIFJOIDcKKworOy8vTG9jYWwgVmFyaWFibGVzCisKK3plcm8gICAgICAgICAgICAgICAgICBSTiA0CitvbmUgICAgICAgICAgICAgICAgICAgUk4gNAorc2NhbGVGYWN0b3IgICAgICAgICAgIFJOIDEKKworCitSZXR1cm4gICAgICAgICAgICAgICAgUk4gMAorCitWbGNNVkQgICAgICAgICAgICAgICAgUk4gMAoraW5kZXggICAgICAgICAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgICBSTiA3CisKK212SG9yRGF0YSAgICAgICAgICAgICBSTiA0CittdkhvclJlc2lkdWFsICAgICAgICAgUk4gMAorCittdlZlckRhdGEgICAgICAgICAgICAgUk4gNCAgICAgICAgICAgICAKK212VmVyUmVzaWR1YWwgICAgICAgICBSTiAwCisKK3RlbXAgICAgICAgICAgICAgICAgICBSTiAxCisKK3RlbXAxICAgICAgICAgICAgICAgICBSTiAzCitIaWdoICAgICAgICAgICAgICAgICAgUk4gNAorTG93ICAgICAgICAgICAgICAgICAgIFJOIDIKK1JhbmdlICAgICAgICAgICAgICAgICBSTiAxCisKK0Jsa0NvdW50ICAgICAgICAgICAgICBSTiAxNAorCitkaWZmTVZkeCAgICAgICAgICAgICAgUk4gMAorZGlmZk1WZHkgICAgICAgICAgICAgIFJOIDEKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgICBSTiA4CitSQml0Q291bnQgICAgICAgICAgICAgUk4gOQorUkJpdEJ1ZmZlciAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgIFJOIDEyCitMUiAgICAgICAgICAgICAgICAgICAgUk4gMTQKKworICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYVZsY01WRAorICAgICAgIElNUE9SVCAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZAorCisgICAgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSAgICAgICAgCisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBwRHN0TVZDdXJNQiw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBEc3RNVlByZWRNRSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBCbGtDb3VudCw0CisgICAgICAgCisgICAgICAgTV9BTExPQzQgICAgICAgIHBwcEJpdFN0cmVhbSw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwQml0T2Zmc2V0LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcHBTcmNNVkxlZnRNQiw0CisgICAgICAgTV9BTExPQzQgICAgICAgIHBwU3JjTVZVcHBlck1CLDQKKyAgICAgICAKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR4LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcGRpZmZNVmR5LDQKKyAgICAgICBNX0FMTE9DNCAgICAgICAgcEhpZ2gsNAorICAgICAgIAorICAgICAgICAgICAgICAKKworCisgICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QLHIxMQorICAgICAgIAorICAgICAgIE1fQVJHICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUJvblN0YWNrLDQgICAgICAgICAgIDsvLyBwb2ludGVyIHRvICBwU3JjTVZVcHBlclJpZ2h0TUIgb24gc3RhY2sKKyAgICAgICBNX0FSRyAgICAgICAgICAgcERzdE1WQ3VyTUJvblN0YWNrLDQgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBwRHN0TVZDdXJNQiBvbiBzdGFjaworICAgICAgIE1fQVJHICAgICAgICAgICBmY29kZUZvcndhcmRvblN0YWNrLDQgICAgICAgICAgICAgICAgIDsvLyBwb2ludGVyIHRvIGZjb2RlRm9yd2FyZCBvbiBzdGFjayAKKyAgICAgICBNX0FSRyAgICAgICAgICAgTUJUeXBlb25TdGFjayw0ICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG9pbnRlciB0byBNQlR5cGUgb24gc3RhY2sKKworICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgCisgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0U3RyZWFtIE1hY3JvCisKKyAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgIE1fTERSICAgICAgICAgICBNQlR5cGUsTUJUeXBlb25TdGFjayAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIE1CVHlwZSBmcm9tIHN0YWNrCisgICAgICAgTV9MRFIgICAgICAgICAgIHBEc3RNVkN1ck1CLHBEc3RNVkN1ck1Cb25TdGFjayAgICAgICAgOy8vIExvYWQgcERzdE1WQ3VyTUIgZnJvbSBzdGFjaworICAgICAgIE1PViAgICAgICAgICAgICB6ZXJvLCMwCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5UUkEgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRSQQorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRSQV9RICAgICAgICAgICAgICAgIDsvLyBjaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVFJBX1EKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUJdCisgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgTV9CRF9JTklUMiAgICAgIFQxLCBUMiwgVDIKKyAgICAgICBTVFJFUSAgICAgICAgICAgemVybyxbcERzdE1WQ3VyTUIsIzRdCisgICAgICAgTU9WRVEgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgIE1PViAgICAgICAgICAgICBCbGtDb3VudCwjMAorICAgICAgIFNUUkVRICAgICAgICAgICB6ZXJvLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdE9LCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVI0ViAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUjRWCisgICAgICAgVEVRTkUgICAgICAgICAgIE1CVHlwZSwjT01YX1ZDX0lOVEVSNFZfUSAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIE1CVHlwZT1PTVhfVkNfSU5URVI0Vl9RCisgICAgICAgTU9WRVEgICAgICAgICAgIENvdW50LCM0CisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgaWYgTUJUeXBlPU9NWF9WQ19JTlRFUgorICAgICAgIFRFUU5FICAgICAgICAgICBNQlR5cGUsI09NWF9WQ19JTlRFUl9RICAgICAgICAgICAgICAgIDsvLyBDaGVjayBpZiBNQlR5cGU9T01YX1ZDX0lOVEVSX1EKKyAgICAgICBNT1ZFUSAgICAgICAgICAgQ291bnQsIzEKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgZmNvZGVGb3J3YXJkLGZjb2RlRm9yd2FyZG9uU3RhY2sgICAgICA7Ly8gTG9hZCBmY29kZUZvcndhcmQgIGZyb20gc3RhY2sKKworICAgICAgIDsvLyBTdG9yaW5nIHRoZSB2YWx1ZXMgdGVtcG9yYXJpbHkgb24gc3RhY2sKKworICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgIAorICAgICAgIE1fU1RSICAgICAgICAgICBwQml0T2Zmc2V0LHBwQml0T2Zmc2V0CisgICAgICAgICAgICAKKworICAgICAgIFNVQiAgICAgICAgICAgICB0ZW1wLGZjb2RlRm9yd2FyZCwjMSAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPWZjb2RlRm9yd2FyZC0xCisgICAgICAgTU9WICAgICAgICAgICAgIG9uZSwjMQorICAgICAgIE1fU1RSICAgICAgICAgICBwU3JjTVZMZWZ0TUIscHBTcmNNVkxlZnRNQgorICAgICAgIExTTCAgICAgICAgICAgICBzY2FsZUZhY3RvcixvbmUsdGVtcCAgICAgICAgICAgICAgICAgIDsvLyBzY2FsZUZhY3Rvcj0xPDwoZmNvZGVGb3J3YXJkLTEpCisgICAgICAgTV9TVFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKKyAgICAgICBMU0wgICAgICAgICAgICAgc2NhbGVGYWN0b3Isc2NhbGVGYWN0b3IsIzUgICAgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgc2NhbGVGYWN0b3IscEhpZ2ggICAgICAgICAgICAgICAgICAgICA7Ly8gW3BIaWdoXT0zMipzY2FsZUZhY3RvcgorICAgICAgICAgICAgICAKKyAgICAgICA7Ly8gVkxEIERlY29kaW5nCisKKworTG9vcAorCisgICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZCB0aGUgb3B0aW1pemVkIE1WRCBWTEMgdGFibGUKKworICAgICAgIDsvLyBIb3Jpem9udGFsIERhdGEgYW5kIFJlc2lkdWFsIGNhbGN1bGF0aW9uCisKKyAgICAgICBMRFIgICAgICAgICAgICAgdGVtcCw9MHhGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBNX0JEX1ZMRCAgICAgICAgaW5kZXgsVDEsVDIsVmxjTVZELDMsMiAgICAgICAgICAgICAgICA7Ly8gdmFyaWFibGUgbGVuZ2h0IGRlY29kaW5nIHVzaW5nIHRoZSBtYWNybworICAgICAgCisgICAgICAgVEVRICAgICAgICAgICAgIGluZGV4LHRlbXAKKyAgICAgICBCRVEgICAgICAgICAgICAgRXhpdEVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgdGhlIGRlY29kZWQgc3ltYm9sIGlzIGFuIGludmFsaWVkIHN5bWJvbCAKKyAgICAgICAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZIb3JEYXRhLGluZGV4LCMzMiAgICAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWluZGV4LTMyICAgICAgICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICBtdkhvclJlc2lkdWFsLCMxICAgICAgICAgICAgICAgICAgICAgIDsvLyBtdkhvclJlc2lkdWFsPTEKKyAgICAgICBDTVAgICAgICAgICAgICAgZmNvZGVGb3J3YXJkLCMxCisgICAgICAgVEVRTkUgICAgICAgICAgIG12SG9yRGF0YSwjMAorICAgICAgIE1PVkVRICAgICAgICAgICBkaWZmTVZkeCxtdkhvckRhdGEgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBzY2FsZUZhY3Rvcj0xKGZjb2RlRm9yd2FyZD0xKSBvciBtdkhvckRhdGE9MCBkaWZmTVZkeD1tdkhvckRhdGEgICAgICAgICAKKyAgICAgICBCRVEgICAgICAgICAgICAgVmVydGljYWxEYXRhCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCisgICAgICAgTV9CRF9WUkVBRDggICAgIG12SG9yUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIGdldCBtdkhvclJlc2lkdWFsIGZyb20gYml0c3RyZWFtIGlmIGZjb2RlRm9yd2FyZD4xIGFuZCBtdkhvckRhdGEhPTAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBtdkhvckRhdGEsIzAKKyAgICAgICBSU0JMVCAgICAgICAgICAgbXZIb3JEYXRhLG12SG9yRGF0YSwjMCAgICAgICAgICAgICAgICA7Ly8gbXZIb3JEYXRhPWFicyhtdkhvckRhdGEpCisgICAgICAgU1VCICAgICAgICAgICAgIG12SG9yUmVzaWR1YWwsbXZIb3JSZXNpZHVhbCxmY29kZUZvcndhcmQKKyAgICAgICBTTUxBQkIgICAgICAgICAgZGlmZk1WZHgsbXZIb3JEYXRhLGZjb2RlRm9yd2FyZCxtdkhvclJlc2lkdWFsIDsvLyBkaWZmTVZkeD1hYnMobXZIb3JEYXRhKSpmY29kZUZvcndhcmQrbXZIb3JSZXNpZHVhbC1mY29kZUZvcndhcmQKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzEKKyAgICAgICBSU0JMVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsIzAKKyAgICAgICAKKyAgICAgICA7Ly8gVmVydGljYWwgRGF0YSBhbmQgUmVzaWR1YWwgY2FsY3VsYXRpb24KKworVmVydGljYWxEYXRhCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIGRpZmZNVmR4IG9uIHN0YWNrCisgICAgICAgTERSICAgICAgICAgICAgIFZsY01WRCwgPWFybVZDTTRQMl9hVmxjTVZEICAgICAgICA7Ly8gTG9hZGluZyB0aGUgYWRkcmVzcyBvZiBvcHRpbWl6ZWQgVkxDIHRhYmxlcworCisgICAgICAgTERSICAgICAgICAgICAgIHRlbXAsPTB4RkZGCisgICAgICAgTV9CRF9WTEQgICAgICAgIGluZGV4LFQxLFQyLFZsY01WRCwzLDIgICAgICAgICAgICAgICAgOy8vIFZMQyBkZWNvZGluZyB1c2luZyB0aGUgbWFjcm8KKyAgICAgICAKKyAgICAgICBURVEgICAgICAgICAgICAgaW5kZXgsdGVtcAorICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSBpZiBhbiBJbnZhbGllZCBTeW1ib2wgb2NjdXJzCisgICAgICAgCisgICAgICAgU1VCICAgICAgICAgICAgIG12VmVyRGF0YSxpbmRleCwjMzIgICAgICAgICAgICAgICAgICAgOy8vIG12VmVyRGF0YT1pbmRleC0zMiAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCwjMSAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGZjb2RlRm9yd2FyZCwjMQorICAgICAgIFRFUU5FICAgICAgICAgICBtdlZlckRhdGEsIzAKKyAgICAgICBNT1ZFUSAgICAgICAgICAgZGlmZk1WZHksbXZWZXJEYXRhICAgICAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHkgPSBtdlZlckRhdGEgaWYgc2NhbGVGYWN0b3I9MShmY29kZUZvcndhcmQ9MSkgb3IgbXZWZXJEYXRhPTAKKyAgICAgICBCRVEgICAgICAgICAgICAgRmluZE1WUHJlZAorCisgICAgICAgU1VCICAgICAgICAgICAgIHRlbXAsZmNvZGVGb3J3YXJkLCMxCisgICAgICAgTV9CRF9WUkVBRDggICAgIG12VmVyUmVzaWR1YWwsdGVtcCxUMSxUMiAgICAgICAgICAgICAgOy8vIEdldCBtdlZlclJlc2lkdWFsIGZyb20gYml0IHN0cmVhbSBpZiBmY29kZUZvcndhcmQ+MSBhbmQgbW5WZXJEYXRhIT0wCisgICAgICAgICAgICAgCisKKyAgICAgICBDTVAgICAgICAgICAgICAgbXZWZXJEYXRhLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIG12VmVyRGF0YSxtdlZlckRhdGEsIzAKKyAgICAgICBTVUIgICAgICAgICAgICAgbXZWZXJSZXNpZHVhbCxtdlZlclJlc2lkdWFsLGZjb2RlRm9yd2FyZAorICAgICAgIFNNTEFCQiAgICAgICAgICBkaWZmTVZkeSxtdlZlckRhdGEsZmNvZGVGb3J3YXJkLG12VmVyUmVzaWR1YWwgOy8vIGRpZmZNVmR5PWFicyhtdlZlckRhdGEpKmZjb2RlRm9yd2FyZCttdlZlclJlc2lkdWFsLWZjb2RlRm9yd2FyZAorICAgICAgIEFERCAgICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMQorICAgICAgIFJTQkxUICAgICAgICAgICBkaWZmTVZkeSxkaWZmTVZkeSwjMAorCisgICAgICAgOy8vQ2FsbGluZyB0aGUgRnVuY3Rpb24gb214VkNNNFAyX0ZpbmRNVnByZWQKKyAgICAgICAgCitGaW5kTVZQcmVkCisKKyAgICAgICBNX1NUUiAgICAgICAgICAgZGlmZk1WZHkscGRpZmZNVmR5CisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAscERzdE1WQ3VyTUIsQmxrQ291bnQsTFNMICMyICAgICAgOy8vIHRlbXA9cERzdE1WQ3VyTUJbQmxrQ291bnRdCisgICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscHBEc3RNVkN1ck1CICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIHRlbXAgb24gc3RhY2sgZm9yIHBhc3NpbmcgYXMgYW4gYXJndW1lbnQgdG8gRmluZE1WUHJlZAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wLCMwCisgICAgICAgTV9TVFIgICAgICAgICAgIHRlbXAscERzdE1WUHJlZE1FICAgICAgICAgICAgICAgICAgICAgOy8vIFBhc3MgcERzdE1WUHJlZE1FPU5VTEwgYXMgYW4gYXJndW1lbnQgICAgICAgICAKKyAgICAgICBNX1NUUiAgICAgICAgICAgQmxrQ291bnQscEJsa0NvdW50ICAgICAgICAgICAgICAgICAgICA7Ly8gUGFzc3MgQmxrQ291bnQgYXMgQXJndW1lbnQgdGhyb3VnaCBzdGFjaworCisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAscFNyY01WTGVmdE1CICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAgKFJOIDEpPXBTcmNNVkxlZnRNQgorICAgICAgIE1fTERSICAgICAgICAgICBwU3JjTVZVcHBlclJpZ2h0TUIscFNyY01WVXBwZXJSaWdodE1Cb25TdGFjaworICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZMZWZ0TUIscFNyY01WVXBwZXJNQiAgICAgICAgICAgIDsvLyBwU3JjTVZMZWZ0TUIgKCBSTiAyKSA9IHBTcmNNVlVwcGVyTUIKKyAgICAgICBNT1YgICAgICAgICAgICAgcHBCaXRTdHJlYW0scERzdE1WQ3VyTUIgICAgICAgICAgICAgICA7Ly8gcHBCaXRTdHJlYW0gICggUk4gMCkgPSBwRHN0TVZDdXJNQgorICAgICAgIE1PViAgICAgICAgICAgICBwU3JjTVZVcHBlck1CLHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIDsvLyBwU3JjTVZVcHBlck1CKCBSTiAzKSA9IHBTcmNNVlVwcGVyUmlnaHRNQiAgICAgIAorICAgICAgIEJMICAgICAgICAgICAgICBvbXhWQ000UDJfRmluZE1WcHJlZCAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBzdWJyb3V0aW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkCisKKyAgICAgICA7Ly8gU3RvcmUgSG9yaXpvbnRhbCBNb3Rpb24gVmVjdG9yCisgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBCbGtDb3VudCxwQmxrQ291bnQgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIEJsa0NvdW50IGZyb20gc3RhY2sKKyAgICAgICBNX0xEUiAgICAgICAgICAgSGlnaCxwSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSGlnaD0zMipzY2FsZUZhY3RvcgorICAgICAgIExTTCAgICAgICAgICAgICB0ZW1wMSxCbGtDb3VudCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wPUJsa0NvdW50KjQKKyAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR4ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeAorICAgICAgIAorICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XQorICAgICAgIAorICAgICAgIAorICAgICAgIFJTQiAgICAgICAgICAgICBMb3csSGlnaCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb3cgPSAtMzIqc2NhbGVGYWN0b3IKKyAgICAgICBBREQgICAgICAgICAgICAgZGlmZk1WZHgsdGVtcCxkaWZmTVZkeCAgICAgICAgICAgICAgICA7Ly8gZGlmZk1WZHg9cERzdE1WQ3VyTUJbQmxrQ291bnRdK2RpZmZNVmR4CisgICAgICAgQUREICAgICAgICAgICAgIFJhbmdlLEhpZ2gsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFJhbmdlPTY0KlNjYWxlRmFjdG9yCisgICAgICAgU1VCICAgICAgICAgICAgIEhpZ2gsSGlnaCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEhpZ2g9IDMyKnNjYWxlRmFjdG9yLTEKKworICAgICAgIENNUCAgICAgICAgICAgICBkaWZmTVZkeCxMb3cgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeDxMb3cgICAgICAgICAgCisgICAgICAgQURETFQgICAgICAgICAgIGRpZmZNVmR4LGRpZmZNVmR4LFJhbmdlICAgICAgICAgICAgICAgOy8vIGRpZmZNVmR4Kz1SYW5nZQorICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaCAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTVUJHVCAgICAgICAgICAgZGlmZk1WZHgsZGlmZk1WZHgsUmFuZ2UgICAgICAgICAgICAgICA7Ly8gSWYgZGlmZk1WZHggPiBIaWdoIGRpZmZNVmR4LT1SYW5nZQorICAgICAgIFNUUkggICAgICAgICAgICBkaWZmTVZkeCxbcERzdE1WQ3VyTUIsdGVtcDFdCisKKyAgICAgICA7Ly8gU3RvcmUgVmVydGljYWwKKworICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMSx0ZW1wMSwjMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT00KkJsa0NvdW50KzIKKyAgICAgICBNX0xEUiAgICAgICAgICAgZGlmZk1WZHgscGRpZmZNVmR5ICAgICAgICAgICAgICAgICAgICA7Ly8gTGFhZCBkaWZmTVZkeQorICAgICAgIExEUlNIICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgICAgICAgICAgIDsvLyB0ZW1wPXBEc3RNVkN1ck1CW0Jsa0NvdW50XS5kaWZmTVZkeQorICAgICAgIEFERCAgICAgICAgICAgICBCbGtDb3VudCxCbGtDb3VudCwjMSAgICAgICAgICAgICAgICAgIDsvLyBCbGtDb3VudD1CbGtDb3VudCsxCisgICAgICAgQUREICAgICAgICAgICAgIGRpZmZNVmR4LHRlbXAsZGlmZk1WZHggICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIGRpZmZNVmR4LExvdworICAgICAgIEFERExUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeTxMb3cgIGRpZmZNVmR5Kz1SYW5nZSAgICAgICAgICAgICAgICAKKyAgICAgICBDTVAgICAgICAgICAgICAgZGlmZk1WZHgsSGlnaAorICAgICAgIFNVQkdUICAgICAgICAgICBkaWZmTVZkeCxkaWZmTVZkeCxSYW5nZSAgICAgICAgICAgICAgIDsvLyBJZiBkaWZmTVZkeSA+IEhpZ2ggZGlmZk1WZHktPVJhbmdlCisgICAgICAgU1RSSCAgICAgICAgICAgIGRpZmZNVmR4LFtwRHN0TVZDdXJNQix0ZW1wMV0gICAgCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIEJsa0NvdW50LENvdW50CisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVkxlZnRNQixwcFNyY01WTGVmdE1CCisgICAgICAgTV9MRFIgICAgICAgICAgIHBTcmNNVlVwcGVyTUIscHBTcmNNVlVwcGVyTUIKKworICAgICAgIEJMVCAgICAgICAgICAgICBMb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBCbGtDb3VudDxDb3VudCBDb250aW51ZSB0aGUgTG9vcAorCisKKyAgICAgICA7Ly8gSWYgTUJUeXBlPU9NWF9WQ19JTlRFUiBvciBNQnR5cGU9T01YX1ZDX0lOVEVSX1EgY29weSBwRHN0TVZDdXJNQlswXSB0bworICAgICAgIDsvLyBwRHN0TVZDdXJNQlsxXSwgcERzdE1WQ3VyTUJbMl0sIHBEc3RNVkN1ck1CWzNdIAorCisgICAgICAgTV9MRFIgICAgICAgICAgIE1CVHlwZSxNQlR5cGVvblN0YWNrCisKKyAgICAgICBURVEgICAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBURVFORSAgICAgICAgICAgTUJUeXBlLCNPTVhfVkNfSU5URVJfUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBMRFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUJdCisgICAgICAgTV9MRFIgICAgICAgICAgIHBwQml0U3RyZWFtLHBwcEJpdFN0cmVhbQorICAgICAgIFNUUkVRICAgICAgICAgICB0ZW1wLFtwRHN0TVZDdXJNQiwjNF0KKyAgICAgICAKKyAgICAgICBTVFJFUSAgICAgICAgICAgdGVtcCxbcERzdE1WQ3VyTUIsIzhdCisgICAgICAgU1RSRVEgICAgICAgICAgIHRlbXAsW3BEc3RNVkN1ck1CLCMxMl0KKyAgICAgICAKKyAgICAgICAKKyAgICAgICBNX0xEUiAgICAgICAgICAgcEJpdE9mZnNldCxwcEJpdE9mZnNldAorICAgICAgIDsvL0VuZGluZyB0aGUgbWFjcm8KKyAgICAgICBNX0JEX0ZJTkkgICAgICAgcHBCaXRTdHJlYW0scEJpdE9mZnNldCAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGluZyB0aGUgTWFjcm8gICAgICAgCisKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisgICAgICAgQiAgICAgICAgICAgICAgIEV4aXRPSworIAorRXhpdEVycm9yCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgcHBCaXRTdHJlYW0scHBwQml0U3RyZWFtCisgICAgICAgTV9MRFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBCaXRPZmZzZXQKKyAgICAgICA7Ly9FbmRpbmcgdGhlIG1hY3JvCisgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQKKyAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgUmV0dXJuLCNPTVhfU3RzX0VycgorCitFeGl0T0sgICAgICAgICAgICAgCisKKyAgICAgICBNX0VORAorICAgICAgIEVORElGCisgICAgICAgRU5ECisKKworICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzYjI1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucwpAQCAtMCwwICsxLDEzMiBAQAorOy8qKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXJfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICoKKzsgKiBEZXNjcmlwdGlvbjogCis7ICogQ29udGFpbnMgbW9kdWxlcyBmb3IgemlnemFnIHNjYW5uaW5nIGFuZCBWTEMgZGVjb2RpbmcKKzsgKiBmb3IgaW50ZXIgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludGVyIGNvZGVkIGJsb2NrLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwcEJpdFN0cmVhbSAgICAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCis7ICogICAgICAgICAgICAgICAgICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyCis7ICogW2luXSAgICBwQml0T2Zmc2V0ICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorOyAqICAgICAgICAgICAgICAgICAgICB0byBieSAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiAgICBbMC03XS4KKzsgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgICAgIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOworOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCis7ICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworOyAqICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCis7ICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorOyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKzsgKiAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCis7ICogW291dF0gICAgcERzdCAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrLiBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZAorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgLUF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIG9yCis7ICogICAtcERzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLCBvcgorOyAqICAgLSpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10uCis7ICogT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IKKzsgKiAgIC1BdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybworOyAqICAgLUVuY291bnRlcmVkIGFuIGlsbGVnYWwgc3RyZWFtIGNvZGUgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIFZMQyB0YWJsZQorOyAqICAgLUVuY291bnRlcmVkIGFuZCBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUKKzsgKiAgIC1UaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQKKzsgKgorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgOy8vIEltcG9ydCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgZm9yIHRoZSBmdW5jdGlvbgorCisgICAgICAgIAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICA7Ly8gQ29udGFpbnMgb3B0aW1pemVkIGFuZCBwYWNrZWQgVkxDIFRhYmxlcyBmb3IgYm90aCBMYXN0ID0xIGFuZCBsYXN0PTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQYWNrZWQgaW4gUnVuOkxldmVsOkxhc3QgZm9ybWF0CisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxTE1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBMTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBDb250YWlucyBSTUFYIHRhYmxlIGVudHJpZXMgd2l0aCBib3RoIExhc3Q9MCBhbmQgTGFzdD0xCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBjb250YWlucyBjbGFzc2ljYWwgWmlnemFnIHRhYmxlIGVudHJpZXMgd2l0aCBkb3VibGUgdGhlIG9yaWdpbmFsIHZhbHVlcworICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUKKworCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIHRoZSBWTEMsWmlnemFnLExNQVggYW5kIFJNQVggdGFibGVzCisgICAgIAorICAgICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyLHIxMgorCisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCA9YXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICAgIDsvLyBMb2FkIHppZ3phZyB0YWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgemlnemFnIHRhYmxlIG9uIHN0YWNrIHRvIHBhc3MgYXMgYXJndW1lbnQgdG8gdW5zYWZlIGZ1bmN0aW9uCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludGVyVmxjTDBMMSAgICAgICAgICAgICAgOy8vIExvYWQgb3B0aW1pemVkIFZMQyB0YWJsZSB3aXRoIGJvdGggTD0wIGFuZCBMPTEgZW50cmllcworICAgICAgICBNX1NUUiAgICAgICAgICAgcFZsY1RhYmxlTDBMMSxwcFZsY1RhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgb3B0aW1pemVkIFZMQyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRlckwwTDFMTUFYICAgICAgICAgICAgOy8vIExvYWQgSW50ZXJsZWF2ZWQgTD0wIGFuZCBMPTEgTE1BWCBUYWJsZXMKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLHBwTE1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggdGFibGUgYWRkcmVzcyBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50ZXJMMEwxUk1BWCAgICAgICAgICAgIDsvLyBMb2FkIEludGVybGVhdmVkIEw9MCBhbmQgTD0xIFJNQVggVGFibGVzCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzZXQgc3RhcnQ9MAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgUk1BWCB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgICAgICAgICAgCisKKyAgICAgICAgQkwgICAgICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlICAgICAgICAgICAgICAgICA7Ly8gY2FsbCBVbnNhZmUgRnVuY3Rpb24gZm9yIFZMQyBaaWd6YWcgRGVjb2RpbmcKKyAgICAgICAgIAorICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2NzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhQUNWTENfcy5zCkBAIC0wLDAgKzEsMTM2IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorCisKKworICAgICBJRiBBUk0xMTM2SlMKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgY2xhc3NpY2FsIFppZ3phZyB0YWJsZSBlbnRyaWVzIHdpdGggZG91YmxlIHRoZSBvcmlnaW5hbCB2YWx1ZXMKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCisKKzsvL0lucHV0IEFyZ3VtZW50cworCitwcEJpdFN0cmVhbSAgICAgICAgICBSTiAwCitwQml0T2Zmc2V0ICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitQcmVkRGlyICAgICAgICAgICAgICBSTiAzCitzaG9ydFZpZGVvSGVhZGVyICAgICBSTiAzCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKK0NvdW50ICAgICAgICAgICAgICAgIFJOIDYKKworCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHRvIHN0b3JlIG9wdGltaXplZCBWTEMsWmlnemFnLCBSTUFYLCBMTUFYIFRhYmxlIEFkZHJlc3NlcyAKKyAgICAgCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFZsY1RhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcExNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBSTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwWmlnemFnVGFibGUsNAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBvaW50ZXIgdG8gSW5wdXQgQXJndW1lbnQgb24gc3RhY2sgICAgICAgICAgIAorCisgICAgICAgIExEUiAgICAgICAgICAgICBwWmlnemFnVGFibGUsID1hcm1WQ000UDJfYUNsYXNzaWNhbFppZ3phZ1NjYW4gICAgIDsvLyBMb2FkIEFkZHJlc3Mgb2YgdGhlIFppZ3phZyB0YWJsZSAgICAKKyAgICAgICAgQUREICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgcFppZ3phZ1RhYmxlLCBQcmVkRGlyLCBMU0wgIzYgICAgICAgICAgIDsvLyBMb2FkaW5nIERpZmZlcmVudCB0eXBlIG9mIHppZ3phZyB0YWJsZXMgYmFzZWQgb24gUHJlZERpcgorICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIFppZ3phZyB0YWJsZSBhZGRyZXNzIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwVmxjVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhVmxjTDBMMSAgICAgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIFRhYmxlIHdpdGggYm90aCBMPTAgYW5kIEw9MSBlbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgVkxDIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBMTUFYVGFibGVMMEwxLCA9YXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExNQVggVGFibGUgYWRkcmVzcyBvbiBTdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICA7Ly8gTG9hZCBSTUFYIFRhYmxlCisgICAgICAgIE1PViAgICAgICAgICAgICBDb3VudCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IFN0YXJ0PTAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBSTUFYVGFibGVMMEwxLHBwUk1BWFRhYmxlTDBMMSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBSTUFYIFRhYmxlIGFkZHJlc3Mgb24gc3RhY2sKKyAgICAgICAgICAgICAgCisKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgIDsvLyBnZXQgdGhlIElucHV0IEFyZ3VtZW50IGZyb20gc3RhY2sKKworICAgICAgICBCTCAgICAgICAgICAgICAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmUgICAgICAgICAgICAgICA7Ly8gQ2FsbCBVbnNhZmUgRnVuY3Rpb24KKworCisKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5Y2IxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCkBAIC0wLDAgKzEsMjI0IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGRlY29kaW5nCis7ICogZm9yIGludGVyIGJsb2NrLgorOyAqCis7ICoKKzsgKgorOyAqIEZ1bmN0aW9uOiBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIG9uZSBpbnRyYSBjb2RlZCBibG9jay4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gICAgcHBCaXRTdHJlYW0gICAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorOyAqIFtpbl0gICAgcEJpdE9mZnNldCAgICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKzsgKiAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4gICAgWzAtN10uCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyICAgICBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorOyAqIFtvdXRdICAgIHBwQml0U3RyZWFtICAgICAgICAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMKKzsgKiAgICAgICAgICAgICAgICAgICAgZGVjb2RlZCwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZQorOyAqICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIKKzsgKiBbb3V0XSAgICBwQml0T2Zmc2V0ICAgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorOyAqICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5Cis7ICogICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbQorOyAqIFtvdXRdICAgIHBEc3QgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudAorOyAqICAgICAgICAgICAgICAgICAgICBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQKKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgIC1BdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0LCBvcgorOyAqICAgLXBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IKKzsgKiAgIC0qcEJpdE9mZnNldCBleGNlZWRzIFswLDddLgorOyAqIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yCis7ICogICAtQXQgbGVhc3Qgb25lIG1hcmsgYml0IGlzIGVxdWFsIHRvIHplcm8KKzsgKiAgIC1FbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIHN0cmVhbSBjb2RlIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBWTEMgdGFibGUKKzsgKiAgIC1FbmNvdW50ZXJlZCBhbmQgaWxsZWdhbCBjb2RlIGluIHRoZSBWTEMgRkxDIHRhYmxlCis7ICogICAtVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0Cis7ICoKKzsgKi8KKworCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX0JpdERlY19zLmgKKworCisgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgIAorICAgICAgCisKKworICAgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICAgCisgICAgICAgIDsvLyBJbXBvcnQgdmFyaW91cyB0YWJsZXMgbmVlZGVkIGZvciB0aGUgZnVuY3Rpb24KKworICAgICAgICAKKyAgICAgICAgSU1QT1JUICAgICAgICAgIGFybVZDTTRQMl9JbnRyYVZsY0wwTDEgICAgICAgICAgICAgOy8vIENvbnRhaW5zIG9wdGltaXplZCBhbmQgcGFja2VkIFZMQyBUYWJsZXMgZm9yIGJvdGggTGFzdCA9MSBhbmQgbGFzdD0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUGFja2VkIGluIFJ1bjpMZXZlbDpMYXN0IGZvcm1hdAorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMUxNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgTE1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX0ludHJhTDBMMVJNQVggICAgICAgICAgICA7Ly8gQ29udGFpbnMgUk1BWCB0YWJsZSBlbnRyaWVzIHdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MQorICAgICAgICBJTVBPUlQgICAgICAgICAgYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuICAgICA7Ly8gY29udGFpbnMgQ0xhc3NpY2FsLCBIb3Jpem9udGFsLCBWZXJ0aWNhbCBaaWd6YWcgdGFibGUgZW50cmllcyB3aXRoIGRvdWJsZSB0aGUgb3JpZ2luYWwgdmFsdWVzCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfYUludHJhRENMdW1hQ2hyb21hSW5kZXggIDsvLyBDb250YWlucyBPcHRpbWl6ZWQgRENMdW1hIGFuZCBEQ0Nocm9tYSBJbmRleCB0YWJsZSBFbnRyaWVzCisgICAgICAgIAorCisgICAgICAgIElNUE9SVCAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorUHJlZERpciAgICAgICAgICAgICAgUk4gMworc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMwordmlkZW9Db21wICAgICAgICAgICAgUk4gNQorOy8vTG9jYWwgVmFyaWFibGVzCisKK1JldHVybiAgICAgICAgICAgICAgIFJOIDAKKworcERDTHVtYUNocm9tYUluZGV4ICAgUk4gNAorcERDQ2hyb21hSW5kZXggICAgICAgUk4gNworcFZsY1RhYmxlTDBMMSAgICAgICAgUk4gNAorcExNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFJNQVhUYWJsZUwwTDEgICAgICAgUk4gNAorcFppZ3phZ1RhYmxlICAgICAgICAgUk4gNAorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRENWYWx1ZVNpemUgICAgICAgICAgUk4gNgorcG93T2ZTaXplICAgICAgICAgICAgUk4gNwordGVtcDEgICAgICAgICAgICAgICAgUk4gNQorCisKKzsvLyBTY3JhdGNoIFJlZ2lzdGVycworCitSQml0U3RyZWFtICAgICAgICAgICBSTiA4CitSQml0QnVmZmVyICAgICAgICAgICBSTiA5CitSQml0Q291bnQgICAgICAgICAgICBSTiAxMAorCitUMSAgICAgICAgICAgICAgICAgICBSTiAxMQorVDIgICAgICAgICAgICAgICAgICAgUk4gMTIKK0RDVmFsICAgICAgICAgICAgICAgIFJOIDE0CisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSBzdGFjayBtZW1vcnkgdG8gc3RvcmUgb3B0aW1pemVkIFZMQyxaaWd6YWcsIFJNQVgsIExNQVggVGFibGUgQWRkcmVzc2VzIAorICAgICAKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwVmxjVGFibGVMMEwxLDQKKyAgICAgICAgTV9BTExPQzQgICAgICAgIHBwTE1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcFJNQVhUYWJsZUwwTDEsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBaaWd6YWdUYWJsZSw0CisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwRENDb2VmZiw0CisgICAgICAgIAorCisgICAgICAgIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyxyMTIKKworICAgICAgICBNX0FSRyAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2ssNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUG9pbnRlciB0byBhcmd1bWVudCBvbiBzdGFjayAgCisgICAgICAgIE1fQVJHICAgICAgICAgICB2aWRlb0NvbXBvbnN0YWNrLDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBQb2ludGVyIHRvIGFyZ3VtZW50IG9uIHN0YWNrCisKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgREMgQ29lZmZpY2llbnQKKworICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBEQ0x1bWFDaHJvbWFJbmRleCwgPWFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleCA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIGZvciBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlCisKKyAgICAgICAgOy8vIEluaXRpYWxpemluZyB0aGUgQml0c3RyZWFtIE1hY3JvCisKKyAgICAgICAgTV9CRF9JTklUMCAgICAgIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBSQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHZpZGVvQ29tcCx2aWRlb0NvbXBvbnN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDEgICAgICBUMSwgVDIsIFQyCisgICAgICAgIEFERCAgICAgICAgICAgICBwRENMdW1hQ2hyb21hSW5kZXgscERDTHVtYUNocm9tYUluZGV4LHZpZGVvQ29tcCwgTFNMICM2ICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9WTEQgICAgICAgIERDVmFsdWVTaXplLFQxLFQyLHBEQ0x1bWFDaHJvbWFJbmRleCw0LDIgICAgICAgICAgICAgICAgICAgIDsvLyBWTEMgRGVjb2RlIHVzaW5nIG9wdGltaXplZCBMdW1pbmFuY2UgYW5kIENocm9taW5hbmNlIFZMQyBUYWJsZQorCisgICAgCisgICAgICAgCisKK0RlY29kZURDCisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjMTIgICAgIAorICAgICAgICBCR1QgICAgICAgICAgICAgRXhpdEVycm9yCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWx1ZVNpemUsIzAKKyAgICAgICAgTU9WRVEgICAgICAgICAgIERDVmFsLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBEQ1ZhbHVlU2l6ZSBpcyB6ZXJvIHRoZW4gREMgY29lZmYgPTAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEFDRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gcGVyZm9ybSBBQyBDb2VmZiBEZWNvZGluZworICAgICAgICAKKyAgICAgICAgTV9CRF9WUkVBRDE2ICAgIERDVmFsLERDVmFsdWVTaXplLFQxLFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgREMgVmFsdWUgRnJvbSBCaXQgc3RyZWFtCisgICAgICAgICAKKworICAgICAgICBNT1YgICAgICAgICAgICAgcG93T2ZTaXplLCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExTTCAgICAgICAgICAgICBwb3dPZlNpemUsRENWYWx1ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcG93T2ZTaXplPXBvdygyLERDVmFsdWVTaXplKQorICAgICAgICBDTVAgICAgICAgICAgICAgRENWYWwscG93T2ZTaXplLExTUiAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgRENWYWwgd2l0aCBwb3dPZlNpemUvMiAKKyAgICAgICAgQURETFQgICAgICAgICAgIERDVmFsLERDVmFsLCMxCisgICAgICAgIFNVQkxUICAgICAgICAgICBEQ1ZhbCxEQ1ZhbCxwb3dPZlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTGVzc3RoYW4gcG93T2ZTaXplLzIgRENWYWw9RENWYWwtcG93T2ZTaXplKzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFbHNlIERDVmFsPSBmZXRjaGJpdHMgZnJvbSBiaXQgc3RyZWFtCisKK0NoZWNrRENWYWx1ZVNpemUKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBEQ1ZhbHVlU2l6ZSwjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgRENWYWx1ZVNpemUgZ3JlYXRlciB0aGFuIDggY2hlY2sgbWFya2VyIGJpdAorCisgICAgICAgIEJMRSAgICAgICAgICAgICBBQ0RlY29kZQorCisgICAgICAgIE1fQkRfUkVBRDggICAgICB0ZW1wMSwxLFQxCisgICAgICAgIFRFUSAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgTWFya2VyIGJpdCBpcyB6ZXJvIEV4aXQgd2l0aCBhbiBFcnJvciBNZXNzYWdlCisgICAgICAgIEJFUSAgICAgICAgICAgICBFeGl0RXJyb3IKKworICAgICAgICAKKworICAgICAgICA7Ly8gRGVjb2RlIEFDIENvZWZmaWNpZW50CisKK0FDRGVjb2RlCisKKyAgICAgICAgTV9TVFIgICAgICAgICAgIERDVmFsLHBEQ0NvZWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIERlY29kZWQgREMgQ29lZmYgb24gU3RhY2sKKyAgICAgICAgTV9CRF9GSU5JICAgICAgIHBwQml0U3RyZWFtLHBCaXRPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRlcm1pbmF0aW5nIHRoZSBCaXQgc3RyZWFtIE1hY3JvCisgICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgICAgIHBaaWd6YWdUYWJsZSwgPWFybVZDTTRQMl9hQ2xhc3NpY2FsWmlnemFnU2NhbiAgICAgICAgICA7Ly8gTG9hZCBaaWd6YWcgdGFsYmUgYWRkcmVzcyAgIAorICAgICAgICBBREQgICAgICAgICAgICAgcFppZ3phZ1RhYmxlLCBwWmlnemFnVGFibGUsIFByZWREaXIsIExTTCAjNiAgICAgICAgICAgICAgICA7Ly8gTW9kaWZ5IHRoZSBaaWd6YWcgdGFibGUgYWRyZXNzIGJhc2VkIG9uIFByZWREaXIgICAgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgICAgICBwWmlnemFnVGFibGUscHBaaWd6YWdUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSB6aWd6YWcgdGFibGUgb24gc3RhY2sKKyAgICAgICAgTERSICAgICAgICAgICAgIHBWbGNUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFWbGNMMEwxICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBPcHRpbWl6ZWQgVkxDIFRhYmxlIFdpdGggYm90aCBMYXN0PTAgYW5kIExhc3Q9MSBFbnRyaWVzCisgICAgICAgIE1fU1RSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBPcHRpbWl6ZWQgVkxDIFRhYmxlIG9uIHN0YWNrCisgICAgICAgIExEUiAgICAgICAgICAgICBwTE1BWFRhYmxlTDBMMSwgPWFybVZDTTRQMl9JbnRyYUwwTDFMTUFYICAgICAgICAgICAgICAgOy8vIExvYWQgTE1BWCBUYWJsZQorICAgICAgICBNX1NUUiAgICAgICAgICAgcExNQVhUYWJsZUwwTDEscHBMTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgTE1BWCB0YWJsZSBvbiBzdGFjaworICAgICAgICBMRFIgICAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEsID1hcm1WQ000UDJfSW50cmFMMEwxUk1BWCAgICAgICAgICAgICAgIDsvLyBMb2FkIFJNQVggVGFibGUKKyAgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldCBTdGFydCA9MSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICAgICAgcFJNQVhUYWJsZUwwTDEscHBSTUFYVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgUk1BWCBUYWJsZSBvbiBTdGFjaworICAgICAgICAKKyAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXIsc2hvcnRWaWRlb0hlYWRlcm9uU3RhY2sgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgdGhlIElucHV0IEFyZ3VtZW50IEZyb20gU3RhY2sKKyAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgICAgICBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZSAgICAgICAgICAgICAgICAgICAgOy8vIENhbGwgdGhlIFVuc2FmZSBGdW5jdGlvbgorCisgICAgICAgIE1fTERSICAgICAgICAgICBEQ1ZhbCxwRENDb2VmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBHZXQgdGhlIERlY29kZWQgREMgVmFsdWUgRnJvbSBTdGFjaworICAgICAgICBTVFJIICAgICAgICAgICAgRENWYWwsW3BEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgdGhlIERDIFZhbHVlIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9LCisgICAgICAgIAorICAgICAgICAgICAgICAKKworRXhpdEVycm9yCisgCisgICAgICAgIE1fQkRfRklOSSAgICAgICBwcEJpdFN0cmVhbSxwQml0T2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUZXJtaW5hdGluZyB0aGUgQml0IFN0cmVhbSBNYWNybyBpbiBjYXNlIG9mIGFuIEVycm9yCisgICAgICAgIE1PViAgICAgICAgICAgICBSZXR1cm4sI09NWF9TdHNfRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBFeGl0IHdpdGggYW4gRXJyb3IgTWVzc2FnZSAKK0V4aXRPSworICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRmluZE1WcHJlZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0ZpbmRNVnByZWRfcy5zCkBAIC0wLDAgKzEsMTk0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfRmluZE1WcHJlZF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMl9GaW5kTVZwcmVkCis7Ly8KKyAgICAgICAgOy8vIEluY2x1ZGUgaGVhZGVycworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtVkNDT01NX3MuaAorCisgICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICBNX1RBQkxFIGFybVZDTTRQMl9wQmxrSW5kZXhUYWJsZQorICAgICAgICBEQ0QgIE9NWFZDQmxrMCwgT01YVkNCbGsxCisgICAgICAgIERDRCAgT01YVkNCbGsyLCBPTVhWQ0JsazMKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCitwU3JjTVZDdXJNQiAgICAgICAgICAgIFJOIDAKK3BTcmNDYW5kTVYxICAgICAgICAgICAgUk4gMQorcFNyY0NhbmRNVjIgICAgICAgICAgICBSTiAyCitwU3JjQ2FuZE1WMyAgICAgICAgICAgIFJOIDMKK3BEc3RNVlByZWQgICAgICAgICAgICAgUk4gNAorcERzdE1WUHJlZE1FICAgICAgICAgICBSTiA1CitpQmxrICAgICAgICAgICAgICAgICAgIFJOIDYKKworcFRhYmxlICAgICAgICAgICAgICAgICBSTiA0CitDYW5kTVYgICAgICAgICAgICAgICAgIFJOIDEyCisKK3BDYW5kTVYxICAgICAgICAgICAgICAgUk4gNworcENhbmRNVjIgICAgICAgICAgICAgICBSTiA4CitwQ2FuZE1WMyAgICAgICAgICAgICAgIFJOIDkKKworQ2FuZE1WMWR4ICAgICAgICAgICAgICBSTiAwIAorQ2FuZE1WMWR5ICAgICAgICAgICAgICBSTiAxIAorQ2FuZE1WMmR4ICAgICAgICAgICAgICBSTiAyCitDYW5kTVYyZHkgICAgICAgICAgICAgIFJOIDMKK0NhbmRNVjNkeCAgICAgICAgICAgICAgUk4gMTAKK0NhbmRNVjNkeSAgICAgICAgICAgICAgUk4gMTEKKwordGVtcCAgICAgICAgICAgICAgICAgICBSTiAxNAorCit6ZXJvICAgICAgICAgICAgICAgICAgIFJOIDE0CityZXR1cm4gICAgICAgICAgICAgICAgIFJOIDAKKyAgICAgICAgCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTWFpbiByb3V0aW5lCis7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIAorCisgICAgICAgIE1fQUxMT0M0IE1WLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyIAorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMl9GaW5kTVZwcmVkLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWQsICA0CisgICAgICAgIE1fQVJHICAgcHBEc3RNVlByZWRNRSwgNAorICAgICAgICBNX0FSRyAgIEJsaywgNAorICAgICAgICAKKyAgICAgICAgTV9BRFIgQ2FuZE1WLCBNVgorICAgICAgICBNT1YgICB6ZXJvLCAjMAorICAgICAgICBNX0xEUiBpQmxrLCBCbGsKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZXNlCisgICAgICAgIDsvLyB0byBiZSB1c2VkIGlmIHBTcmNDYW5kTVZbMXwyfDNdID09IE5VTEwKKyAgICAgICAgTU9WICAgcENhbmRNVjEsIENhbmRNVgorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgQ2FuZE1WCisgICAgICAgIE1PViAgIHBDYW5kTVYzLCBDYW5kTVYKKyAgICAKKyAgICAgICAgU1RSICAgemVybywgW0NhbmRNVl0KKworICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBjYXNlIGJhc2VkIG9uIGJsayBudW1iZXIKKyAgICAgICAgTV9TV0lUQ0ggaUJsaworICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazAgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fQ0FTRSAgIE9NWFZDQmxrMSAgICAgIDsvLyBpQmxrPTAKKyAgICAgICAgTV9DQVNFICAgT01YVkNCbGsyICAgICAgOy8vIGlCbGs9MAorICAgICAgICBNX0NBU0UgICBPTVhWQ0JsazMgICAgICA7Ly8gaUJsaz0wCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorT01YVkNCbGswCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMSwgcFNyY0NhbmRNVjEsICM0CisgICAgICAgIAorICAgICAgICBDTVAgICBwU3JjQ2FuZE1WMiwgIzAKKyAgICAgICAgQURETkUgcENhbmRNVjIsIHBTcmNDYW5kTVYyLCAjOAorCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYzLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMywgcFNyY0NhbmRNVjMsICM4CisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYxLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMywgcENhbmRNVjIKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYyCisgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYxLCAjMAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMiwgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjEsIHBDYW5kTVYzCisgICAgICAgIE1PVkVRIHBDYW5kTVYyLCBwQ2FuZE1WMworICAgICAgICAKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjIsICMwCisgICAgICAgIENNUEVRIHBTcmNDYW5kTVYzLCAjMAorICAgIAorICAgICAgICBNT1ZFUSBwQ2FuZE1WMiwgcENhbmRNVjEKKyAgICAgICAgTU9WRVEgcENhbmRNVjMsIHBDYW5kTVYxCisgICAgICAgIAorICAgICAgICBCICAgICBCbGtFbmQKKyAgICAKK09NWFZDQmxrMQorICAgICAgICBNT1YgICBwQ2FuZE1WMSwgcFNyY01WQ3VyTUIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjMsICMwCisgICAgICAgIEFERE5FIHBDYW5kTVYzLCBwU3JjQ2FuZE1WMywgIzgKKyAgICAgICAgCisgICAgICAgIENNUCAgIHBTcmNDYW5kTVYyLCAjMAorICAgICAgICBBRERORSBwQ2FuZE1WMiwgcFNyY0NhbmRNVjIsICMxMgorICAgIAorICAgICAgICBDTVBFUSBwU3JjQ2FuZE1WMywgIzAKKyAgICAKKyAgICAgICAgTU9WRVEgcENhbmRNVjIsIHBDYW5kTVYxCisgICAgICAgIE1PVkVRIHBDYW5kTVYzLCBwQ2FuZE1WMQorICAgICAgICAgICAgCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazIKKyAgICAgICAgQ01QICAgcFNyY0NhbmRNVjEsICMwCisgICAgICAgIE1PViAgIHBDYW5kTVYyLCBwU3JjTVZDdXJNQgorICAgICAgICBBREQgICBwQ2FuZE1WMywgcFNyY01WQ3VyTUIsICM0CisgICAgICAgIEFERE5FIHBDYW5kTVYxLCBwU3JjQ2FuZE1WMSwgIzEyCisgICAgICAgIEIgICAgIEJsa0VuZAorCitPTVhWQ0JsazMKKyAgICAgICAgQUREICAgcENhbmRNVjEsIHBTcmNNVkN1ck1CLCAjOAorICAgICAgICBNT1YgICBwQ2FuZE1WMiwgcFNyY01WQ3VyTUIKKyAgICAgICAgQUREICAgcENhbmRNVjMsIHBTcmNNVkN1ck1CLCAjNAorICAgIAorQmxrRW5kCisKKyAgICAgICAgOy8vIFVzaW5nIHRoZSB0cmFuc3BlcmFuY3kgaW5mbywgemVybworICAgICAgICA7Ly8gb3V0IHRoZSBjYW5kaWRhdGUgTVYgaWYgbmVjY2VzYXJ5CisgICAgICAgIExEUlNIIENhbmRNVjFkeCwgW3BDYW5kTVYxXSwgIzIKKyAgICAgICAgTERSU0ggQ2FuZE1WMmR4LCBbcENhbmRNVjJdLCAjMgorICAgICAgICBMRFJTSCBDYW5kTVYzZHgsIFtwQ2FuZE1WM10sICMyCisgICAgCisgICAgICAgIDsvLyBMb2FkIGFyZ3VtZW50IGZyb20gdGhlIHN0YWNrCisgICAgICAgIE1fTERSIHBEc3RNVlByZWRNRSwgcHBEc3RNVlByZWRNRQorCisgICAgICAgIExEUlNIIENhbmRNVjFkeSwgW3BDYW5kTVYxXQorICAgICAgICBMRFJTSCBDYW5kTVYyZHksIFtwQ2FuZE1WMl0KKyAgICAgICAgTERSU0ggQ2FuZE1WM2R5LCBbcENhbmRNVjNdCisKKyAgICAgICAgQ01QIHBEc3RNVlByZWRNRSwgIzAgICAgICAgIAorCisgICAgICAgIDsvLyBTdG9yZSB0aGUgY2FuZGlkYXRlIE1WJ3MgaW50byB0aGUgcERzdE1WUHJlZE1FLCAKKyAgICAgICAgOy8vIHRoZXNlIGNhbiBiZSB1c2VkIGluIHRoZSBmYXN0IGFsZ29yaXRobSBpZiBpbXBsZW1lbnRlZCAKKworICAgICAgICBTVFJITkUgQ2FuZE1WMWR4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjFkeSwgW3BEc3RNVlByZWRNRV0sICMyICAgICAgICAKKyAgICAgICAgU1RSSE5FIENhbmRNVjJkeCwgW3BEc3RNVlByZWRNRV0sICMyCisgICAgICAgIFNUUkhORSBDYW5kTVYyZHksIFtwRHN0TVZQcmVkTUVdLCAjMgorICAgICAgICBTVFJITkUgQ2FuZE1WM2R4LCBbcERzdE1WUHJlZE1FXSwgIzIKKyAgICAgICAgU1RSSE5FIENhbmRNVjNkeSwgW3BEc3RNVlByZWRNRV0KKyAgICAgICAgICAgCisgICAgICAgIDsgRmluZCB0aGUgbWVkaWFuIG9mIHRoZSAzIGNhbmRpZGF0ZSBNVidzCisgICAgICAgIE1fTUVESUFOMyBDYW5kTVYxZHgsIENhbmRNVjJkeCwgQ2FuZE1WM2R4LCB0ZW1wCisKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgcERzdE1WUHJlZCwgcHBEc3RNVlByZWQKKworICAgICAgICBNX01FRElBTjMgQ2FuZE1WMWR5LCBDYW5kTVYyZHksIENhbmRNVjNkeSwgdGVtcAorICAgIAorICAgICAgICBTVFJIIENhbmRNVjNkeCwgW3BEc3RNVlByZWRdLCAjMgorICAgICAgICBTVFJIIENhbmRNVjNkeSwgW3BEc3RNVlByZWRdCisKKyAgICAgICAgTU9WIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAKKyAgICAgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYjU0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKQEAgLTAsMCArMSw3MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAyX0lEQ1Q4eDhibGtfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgOTY0MQorOy8vIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsaworOy8vCisgICAgICAgIDsvLyBJbmNsdWRlIGhlYWRlcnMKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIDsvLyBEZWZpbmUgY3B1IHZhcmlhbnRzCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX0lEQ1Rfcy5oICAgICAgICAKKyAgICAgICAgCisgICAgICAgIElNUE9SVCBhcm1DT01NX0lEQ1RQcmVTY2FsZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEZ1bmN0aW9uIHByb3RvdHlwZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICAgICBPTVhSZXN1bHQKKyAgICAgICAgOy8vICAgICBvbXhWQ000UDJfSURDVDh4OGJsayhjb25zdCBPTVhfUzE2KiBwU3JjLAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzE2KiBwRHN0KQorICAgICAgICA7Ly8gICAgCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICBNX0FMTE9DNCAgcHBEZXN0LCA0CisgICAgICAgIE1fQUxMT0M0ICBwU3RyaWRlLCA0CisgICAgICAgIE1fQUxMT0M4ICBwQmxrLCAyKjgqOAorICAgIEVORElGCisgICAgCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAyX0lEQ1Q4eDhibGssIHIxMQorICAgIEVORElGCisgICAgCisgICAgICAgIAorICAgIElGIEFSTTExMzZKUyA6TE9SOiBDb3J0ZXhBOAorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3BEc3QgICAgICAgICAgICBSTiAxCisKKzsvLyBEZWNsYXJlIG90aGVyIGludGVybWVkaWF0ZSByZWdpc3RlcnMKK1Jlc3VsdCAgICAgICAgICBSTiAwCisKKzsvLyBQcm90b3R5cGUgZm9yIG1hY3JvIE1fSURDVAorOy8vIHBTcmMgICAgICAgICAgICBSTiAwICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCis7Ly8gU3RyaWRlICAgICAgICAgIFJOIDEgIDsvLyBkZXN0aW5hdGlvbiBzdHJpZGUgaW4gYnl0ZXMKKzsvLyBwRGVzdCAgICAgICAgICAgUk4gMiAgOy8vIGRlc3RpbmF0aW9uIGRhdGEgYnVmZmVyCis7Ly8gcFNjYWxlICAgICAgICAgIFJOIDMgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworcFNyYyAgICBSTiAwICAgIAorU3RyaWRlICBSTiAxICAgIAorcERlc3QgICBSTiAyICAgIAorcFNjYWxlICBSTiAzICAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwRGVzdCwgcERzdAorICAgICAgICBMRFIgICAgICAgICBwU2NhbGUsID1hcm1DT01NX0lEQ1RQcmVTY2FsZSAgICAgICAgCisgICAgICAgIE1fSURDVCAgICAgIHM5LCBzMTYsIDE2ICAgICAgCisgICAgICAgIE1PViAgICAgICAgIFJlc3VsdCwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQgICAgICAgCisgICAgRU5ESUYgIAorICAgICAgICA7Ly8gQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4CisKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk2NWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCkBAIC0wLDAgKzEsNzEzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDJfTUNSZWNvbkJsb2NrX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDk2NDEKKzsvLyBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8KKzsvLworCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKzsvLyBJbXBvcnQgc3ltYm9scyByZXF1aXJlZCBmcm9tIG90aGVyIGZpbGVzCisKKyAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7Ly8gQVJNMTEzNkpTIGltcGxlbWVudGF0aW9uCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgSUYgIEFSTTExMzZKUworICAgIAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIE1BQ1JPIERFRklOSVRJT05TCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLworICAgIDsvLyAgIGRlc3Rbal0gPSAoeFtqXSArIHlbal0gKyByb3VuZCkgPj4gMSwgICBqPTAuLjMKKyAgICA7Ly8KKyAgICA7Ly8gU2ltaWxhciB0byBVSEFERDggaW5zdHJ1Y3Rpb24sIGJ1dCB3aXRoIGEgcm91bmRpbmcgdmFsdWUgb2YgMSBhZGRlZCB0bworICAgIDsvLyBlYWNoIHN1bSBiZWZvcmUgZGl2aWRpbmcgYnkgdHdvLCBpZiByb3VuZCBpcyAxCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzaworICAgIDsvLworICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICR4ICAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB4WzNdIDogIHhbMl0gIDogIHhbMV0gIDogIHhbMF0KKyAgICA7Ly8gJHkgICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHlbM10gOiAgeVsyXSAgOiAgeVsxXSAgOiAgeVswXQorICAgIDsvLyAkcm91bmQgICAgMCBpZiBubyByb3VuZGluZyB0byBiZSBhZGRlZCwgMSBpZiByb3VuZGluZyB0byBiZSBkb25lCisgICAgOy8vICRtYXNrICAgICBzb21lIHJlZ2lzdGVyIHNldCB0byAweDgwODA4MDgwCisgICAgOy8vCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vICRkZXN0ICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzNdIDogIHpbMl0gIDogIHpbMV0gIDogIHpbMF0KKworICAgIE1BQ1JPCisgICAgTV9VSEFERDhSICAgJGRlc3QsICR4LCAkeSwgJHJvdW5kLCAkbWFzaworICAgIElGICRyb3VuZCA9IDEKKyAgICAgICAgSUYgICRkZXN0IC89ICR5CisgICAgICAgICAgICBNVk4gICAgICAgICAkZGVzdCwgJHgKKyAgICAgICAgICAgIFVIU1VCOCAgICAgICRkZXN0LCAkeSwgJGRlc3QKKyAgICAgICAgICAgIEVPUiAgICAgICAgICRkZXN0LCAkZGVzdCwgJG1hc2sKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTVZOICAgICAgICAgJGRlc3QsICR5CisgICAgICAgICAgICBVSFNVQjggICAgICAkZGVzdCwgJHgsICRkZXN0CisgICAgICAgICAgICBFT1IgICAgICAgICAkZGVzdCwgJGRlc3QsICRtYXNrCisgICAgICAgIEVORElGCisgICAgRUxTRQorICAgICAgICBVSEFERDggICAgICAkZGVzdCwgJHgsICR5CisgICAgRU5ESUYKKyAgICBNRU5ECis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSAkcFNyYyAoYWxpZ25lZCBvciB1bmFsaWduZWQgbG9jYXRpb25zKQorICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAorICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgorICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQorICAgIDsvLyAkc2NyYXRjaCAgICBBIHNjcmF0Y2ggcmVnaXN0ZXIsIHVzZWQgaW50ZXJuYWxseSBmb3IgdGVtcCBjYWxjdWxhdGlvbnMKKyAgICA7Ly8gJG9mZnNldCAgICAgRGlmZmVyZW5jZSBvZiBzb3VyY2UgZGF0YSBsb2NhdGlvbiB0byB0aGUgc291cmNlIHBvaW50ZXIKKyAgICA7Ly8gICAgICAgICAgICAgVXNlIHdoZW4gJG9mZnNldCAhPSAwICh1bmFsaWduZWQgbG9hZCkKKyAgICA7Ly8KKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHBTcmMgICAgICAgSW4gY2FzZSB0aGUgbWFjcm8gYWNjZXB0cyBzdHJpZGUsIGl0IGluY3JlbWVudHMgdGhlIHBTcmMgYnkgCisgICAgOy8vICAgICAgICAgICAgIHRoYXQgdmFsdWUsIGVsc2UgdW5jaGFuZ2VkCisgICAgOy8vICRvdXQwICAgICAgIGZvdXIgcGFja2VkIGJ5dGVzLCAgIHpbM10gOiAgelsyXSAgOiAgelsxXSAgOiAgelswXQorICAgIDsvLyAkb3V0MSAgICAgICBmb3VyIHBhY2tlZCBieXRlcywgICB6WzddIDogIHpbNl0gIDogIHpbNV0gIDogIHpbNF0KKyAgICA7Ly8KKyAgICA7Ly8gTm90ZTogeyRvdXQwLCAkb3V0MSwgJHNjcmF0Y2h9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nLiBJbiBjYXNlIG9mZnNldCBpcyAwLCAkc2NyYXRjaCBpcyBub3QgbW9kaWZpZWQuCisKKyAgICBNQUNSTworICAgIE1fTE9BRF9YICAgICRwU3JjLCAkc3JjU3RlcCwgJG91dDAsICRvdXQxLCAkc2NyYXRjaCwgJG9mZnNldAorICAgICAgICBJRiAkb2Zmc2V0ID0gMAorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskb3V0MCwgJG91dDF9CisgICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JG91dDAsICRvdXQxLCAkc2NyYXRjaH0gCisgICAgICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgICAgICRvdXQwLCAkb3V0MCwgTFNSICM4ICogJG9mZnNldAorICAgICAgICAgICAgT1JSICAgICAgICAgJG91dDAsICRvdXQwLCAkb3V0MSwgTFNMICMoMzIgLSA4ICogKCRvZmZzZXQpKQorICAgICAgICAgICAgTU9WICAgICAgICAgJG91dDEsICRvdXQxLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkb3V0MSwgJG91dDEsICRzY3JhdGNoLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisgICAgICAgIEVORElGCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBMb2FkcyB0aHJlZSB3b3JkcyBmb3IgWCBpbnRlcnBvbGF0aW9uLCB1cGRhdGUgcG9pbnRlciB0byBuZXh0IHJvdy4gRm9yIAorICAgIDsvLyBYIGludGVycG9sYXRpb24sIGdpdmVuIGEgdHJ1bmNhdGVkLTRieXRlQWxpZ25lZCBzb3VyY2UgcG9pbnRlciwgCisgICAgOy8vIGludmFyaWFibHkgdGhyZWUgY29udGlub3VzIHdvcmRzIGFyZSByZXF1aXJlZCBmcm9tIHRoZXJlIHRvIGdldCB0aGUKKyAgICA7Ly8gbmluZSBieXRlcyBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciBmb3IgZmlsdGVyaW5nLiAKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICA0IGJ5dGUgYWxpZ25lZCBzb3VyY2UgcG9pbnRlciB0byBhbiBhZGRyZXNzIGp1c3QgbGVzcyB0aGFuIAorICAgIDsvLyAgICAgICAgICAgICBvciBlcXVhbCB0byB0aGUgZGF0YSBsb2NhdGlvbgorICAgIDsvLworICAgIDsvLyAkc3JjU3RlcCAgICBUaGUgc3RyaWRlIG9uIHNvdXJjZQorICAgIDsvLworICAgIDsvLyAkb2Zmc2V0ICAgICBEaWZmZXJlbmNlIG9mIHNvdXJjZSBkYXRhIGxvY2F0aW9uIHRvIHRoZSBzb3VyY2UgcG9pbnRlcgorICAgIDsvLyAgICAgICAgICAgICBVc2Ugd2hlbiAkb2Zmc2V0ICE9IDAgKHVuYWxpZ25lZCBsb2FkKQorICAgIDsvLworICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkcFNyYyAgICAgICBJbmNyZW1lbnRlZCBieSAkc3JjU3RlcAorICAgIDsvLworICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIG91dHB1dHMgYmFzZWQgb24gdGhlICRvZmZzZXQgcGFyYW1ldGVyLiAKKyAgICA7Ly8gICAgICAgICAgICAgVGhlIG91dHB1dHMgYXJlIHNwZWNpZmljYWxseSBnZW5lcmF0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4gRm9sbG93aW5nIGlzIHRoZSBpbGx1c3RyYXRpb24gdG8gc2hvdyAKKyAgICA7Ly8gICAgICAgICAgICAgaG93IHRoZSBuaW5lIGJ5dGVzIGFyZSBzcGFubmVkIGZvciBkaWZmZXJlbnQgb2Zmc2V0cyBmcm9tIAorICAgIDsvLyAgICAgICAgICAgICBub3RUcnVuY2F0ZWRGb3JBbGlnbm1lbnRTb3VyY2VQb2ludGVyLgorICAgIDsvLworICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgT2Zmc2V0IHwgQWxpZ25lZCBQdHIgfCB3b3JkMCB8IHdvcmQxIHwgd29yZDIgfCB3b3JkMyB8CisgICAgOy8vICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMCAgIHwgICAgICAgMCAgICAgfCAwMTIzICB8IDQ1NjcgIHwgOHh4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMSAgIHwgICAgICAtMSAgICAgfCB4MDEyICB8IDM0NTYgIHwgNzh4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMiAgIHwgICAgICAtMiAgICAgfCB4eDAxICB8IDIzNDUgIHwgNjc4eCAgfCAgICAgICB8CisgICAgOy8vICAgICAgICAgICAgIHwgICAgMyAgIHwgICAgICAtMyAgICAgfCB4eHgwICB8ICAgICAgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7Ly8gCisgICAgOy8vICAgICAgICAgICAgIHdoZXJlIHRoZSBudW1iZXJpbmcgKDAtOCkgaXMgdG8gZGVzaWduYXRlIHRoZSA5IGJ5dGVzIGZyb20KKyAgICA7Ly8gICAgICAgICAgICAgc3RhcnQgb2YgYSBwYXJ0aWN1bGFyIHJvdy4gVGhlIGlsbHVzdHJhdGlvbiBkb2Vzbid0IHRha2UgaW4gCisgICAgOy8vICAgICAgICAgICAgIGFjY291bnQgdGhlIHBvc2l0aW9uaW5nIG9mIGJ5dGVzIHdpdGggaW4gdGhlIHdvcmQgYW5kIHRoZSAKKyAgICA7Ly8gICAgICAgICAgICAgbWFjcm8gY29tYmluYXRpb24gd2l0aCBNX0VYVF9YSU5UIHdpbGwgd29yayBvbmx5IGluIGxpdHRsZSAKKyAgICA7Ly8gICAgICAgICAgICAgZW5kaWFuIGVudmlyb25zCisgICAgOy8vIAorICAgIDsvLyBOb3RlOiB7JHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzfSBzaG91bGQgYmUgcmVnaXN0ZXJzIHdpdGggYXNjZW5kaW5nCisgICAgOy8vIHJlZ2lzdGVyIG51bWJlcmluZworCisgICAgTUFDUk8KKyAgICBNX0xPQURfWElOVCAkcFNyYywgJHNyY1N0ZXAsICRvZmZzZXQsICR3b3JkMCwgJHdvcmQxLCAkd29yZDIsICR3b3JkMworICAgICAgICBJRiAkb2Zmc2V0IC89IDMKKyAgICAgICAgICAgIExETSAgICAgICAgICRwU3JjLCB7JHdvcmQwLCAkd29yZDEsICR3b3JkMn0KKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTERNICAgICAgICAgJHBTcmMsIHskd29yZDAsICR3b3JkMiwgJHdvcmQzfQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICAgICAkcFNyYywgJHBTcmMsICRzcmNTdGVwCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBFeHRyYWN0IGZvdXIgcmVnaXN0ZXJzIG9mIGZvdXIgcGl4ZWxzIGZvciBYIGludGVycG9sYXRpb24gCisgICAgOy8vIAorICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRvZmZzZXQgICAgIERpZmZlcmVuY2Ugb2Ygc291cmNlIGRhdGEgbG9jYXRpb24gdG8gdGhlIHNvdXJjZSBwb2ludGVyCisgICAgOy8vICAgICAgICAgICAgIFVzZSB3aGVuICRvZmZzZXQgIT0gMCAodW5hbGlnbmVkIGxvYWQpCisgICAgOy8vIAorICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgVGhyZWUgb2YgdGhlc2UgYXJlIGlucHV0cyBiYXNlZCBvbiB0aGUgJG9mZnNldCBwYXJhbWV0ZXIuIAorICAgIDsvLyAgICAgICAgICAgICBUaGUgaW5wdXRzIGFyZSBzcGVjaWZpY2FsbHkgc2VsZWN0ZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IAorICAgIDsvLyAgICAgICAgICAgICB0aGUgTV9FWFRfWElOVCBtYWNyby4KKyAgICA7Ly8KKyAgICA7Ly8gICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsvLyAgICAgICAgICAgICB8IE9mZnNldCB8IEFsaWduZWQgUHRyIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDAgICB8ICAgICAgIDAgICAgIHwgMDEyMyAgfCA0NTY3ICB8IDh4eHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDEgICB8ICAgICAgLTEgICAgIHwgeDAxMiAgfCAzNDU2ICB8IDc4eHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDIgICB8ICAgICAgLTIgICAgIHwgeHgwMSAgfCAyMzQ1ICB8IDY3OHggIHwgeXl5eSAgfAorICAgIDsvLyAgICAgICAgICAgICB8ICAgIDMgICB8ICAgICAgLTMgICAgIHwgeHh4MCAgfCB5eXl5ICB8IDEyMzQgIHwgNTY3OCAgfAorICAgIDsvLyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDMKKyAgICA7Ly8gICAgICAgICAgICAgQnl0ZXMgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIHBvaW50ZXIgKG5vdCB0cnVuY2F0ZWQgZm9yCisgICAgOy8vICAgICAgICAgICAgIDQgYnl0ZSBhbGlnbm1lbnQpIGFzIHNob3duIGluIHRoZSB0YWJsZS4gCisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vICAgICAgICAgICAgIHwgd29yZDAgfCB3b3JkMSB8IHdvcmQyIHwgd29yZDMgfAorICAgIDsvLyAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICA7Ly8gICAgICAgICAgICAgfCAwMTIzICB8IDQ1NjcgIHwgMTIzNCAgfCA1Njc4ICB8CisgICAgOy8vICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOy8vCisgICAgOy8vIE5vdGU6IHskd29yZDAsICR3b3JkMSwgJHdvcmQyLCAkd29yZDN9IHNob3VsZCBiZSByZWdpc3RlcnMgd2l0aCBhc2NlbmRpbmcKKyAgICA7Ly8gcmVnaXN0ZXIgbnVtYmVyaW5nCisKKyAgICBNQUNSTworICAgIE1fRVhUX1hJTlQgJG9mZnNldCwgJHdvcmQwLCAkd29yZDEsICR3b3JkMiwgJHdvcmQzCisgICAgICAgIElGICRvZmZzZXQgPSAwCisgICAgICAgICAgICA7ICR3b3JkMCBhbmQgJHdvcmQxIGFyZSBvaworICAgICAgICAgICAgOyAkd29yZDIsICR3b3JkMyBhcmUganVzdCA4IHNoaWZ0ZWQgdmVyc2lvbnMKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjMjQKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMiwgJHdvcmQwLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMiwgJHdvcmQyLCAkd29yZDEsIExTTCAjMjQKKyAgICAgICAgRUxJRiAkb2Zmc2V0ID0gMworICAgICAgICAgICAgOyAkd29yZDIgYW5kICR3b3JkMyBhcmUgb2sgKHRha2VuIGNhcmUgd2hpbGUgbG9hZGluZyBpdHNlbGYpCisgICAgICAgICAgICA7IHNldCAkd29yZDAgJiAkd29yZDEKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMCwgJHdvcmQwLCBMU1IgIzI0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDAsICR3b3JkMCwgJHdvcmQyLCBMU0wgIzgKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQyLCBMU1IgIzI0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQzLCBMU0wgIzgKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTU9WICAgICAgICAgJHdvcmQwLCAkd29yZDAsIExTUiAjOCAqICRvZmZzZXQKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMCwgJHdvcmQwLCAkd29yZDEsIExTTCAjKDMyIC0gOCAqICgkb2Zmc2V0KSkKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMSwgJHdvcmQxLCBMU1IgIzggKiAkb2Zmc2V0CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDEsICR3b3JkMSwgJHdvcmQyLCBMU0wgIygzMiAtIDggKiAoJG9mZnNldCkpCisKKyAgICAgICAgICAgIE1PViAgICAgICAgICR3b3JkMywgJHdvcmQxLCBMU1IgIzgKKyAgICAgICAgICAgIE9SUiAgICAgICAgICR3b3JkMywgJHdvcmQzLCAkd29yZDIsIExTTCAjKDMyIC0gOCAqICgoJG9mZnNldCkrMSkpCisgICAgICAgICAgICBNT1YgICAgICAgICAkd29yZDIsICR3b3JkMCwgTFNSICM4CisgICAgICAgICAgICBPUlIgICAgICAgICAkd29yZDIsICR3b3JkMiwgJHdvcmQxLCBMU0wgIzI0CisgICAgICAgIEVORElGCisgICAgTUVORAorCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBDb21wdXRlcyBoYWxmLXN1bSBhbmQgeG9yIG9mIHR3byBpbnB1dHMgYW5kIHB1dHMgdGhlbSBpbiB0aGUgaW5wdXQgCisgICAgOy8vIHJlZ2lzdGVycyBpbiB0aGF0IG9yZGVyCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICR2MCAgICAgICAgIGEsIGZpcnN0IGlucHV0CisgICAgOy8vICR2MSAgICAgICAgIGIsIHNlY29uZCBpbnB1dAorICAgIDsvLyAkdG1wICAgICAgICBzY3JhdGNoIHJlZ2lzdGVyCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyAkdjAgICAgICAgICAoYSArIGIpLzIKKyAgICA7Ly8gJHYxICAgICAgICAgYSBeIGIKKworICAgIE1BQ1JPCisgICAgTV9IU1VNX1hPUiAgICAgICR2MCwgJHYxLCAkdG1wCisgICAgICAgIFVIQUREOCAgICAgICR0bXAsICR2MCwgJHYxICAgICA7Ly8gczAgPSBhICsgYgorICAgICAgICBFT1IgICAgICAgICAkdjEsICR2MCwgJHYxICAgICAgOy8vIGwwID0gYSBeIGIKKyAgICAgICAgTU9WICAgICAgICAgJHYwLCAkdG1wICAgICAgICAgIDsvLyBzMAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICA7Ly8gRGVzY3JpcHRpb246CisgICAgOy8vIENhbGN1bGF0ZXMgYXZlcmFnZSBvZiA0IHZhbHVlcyAoYSxiLGMsZCkgZm9yIEhhbGZQaXhlbFhZIHByZWRpY3QgdHlwZSBpbiAKKyAgICA7Ly8gbWNSZWNvbkJsb2NrIG1vZHVsZS4gVmVyeSBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgCisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZIGRvbmUgaGVyZS4gVXNlcyAidG1wIiBhcyBzY3JhdGNoIHJlZ2lzdGVyIGFuZCAKKyAgICA7Ly8gInlNYXNrIiBmb3IgbWFzayB2YXJpYWJsZSAiMHgxMDEwMTAxeCIgc2V0IGluIGl0LiBJbiB5TWFzayA0IGxzYnMgYXJlIAorICAgIDsvLyBub3Qgc2lnbmlmaWNhbnQgYW5kIGFyZSB1c2VkIGJ5IHRoZSBjYWxsZWUgZm9yIHJvdyBjb3VudGVyICh5KQorICAgIDsvLworICAgIDsvLyBTb21lIHBvaW50cyB0byBub3RlIGFyZToKKyAgICA7Ly8gMS4gSW5wdXQgaXMgcGFpciBvZiBwYWlyLWF2ZXJhZ2VzIGFuZCBYb3JzCisgICAgOy8vIDIuICRzdW0xIGFuZCAkbHNiMSBhcmUgbm90IG1vZGlmaWVkIGFuZCBoZW5jZSBjYW4gYmUgcmV1c2VkIGluIGFub3RoZXIgCisgICAgOy8vICAgIHJ1bm5pbmcgYXZlcmFnZQorICAgIDsvLyAzLiBPdXRwdXQgaXMgaW4gdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9BVkc0ICAgICAgICAgJHN1bTAsICRsc2IwLCAkc3VtMSwgJGxzYjEsICRybmRWYWwKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiKSA+PiAxLCB3aGVyZSBhIGFuZCBiIGFyZSAxc3QgYW5kIDJuZCBpbnB1dHMgdG8gYmUgYXZlcmFnZWQKKyAgICA7Ly8gJGxzYjAgICAgICAgKGEgXiBiKQorICAgIDsvLyAkc3VtMSAgICAgICAoYyArIGQpID4+IDEuIE5vdCBtb2RpZmllZAorICAgIDsvLyAkbHNiMSAgICAgICAoYyBeIGQpICAgICAgIE5vdCBtb2RpZmllZAorICAgIDsvLyAkcm5kVmFsICAgICBBc3NlbWJsZXIgVmFyaWFibGUuIDAgZm9yIHJvdW5kaW5nLCAxIGZvciBubyByb3VuZGluZworICAgIDsvLyAKKyAgICA7Ly8gT3V0cHV0czoKKyAgICA7Ly8gJHN1bTAgICAgICAgKGEgKyBiICsgYyArIGQgKyAxKSAvIDQgOiBJZiBubyByb3VuZGluZworICAgIDsvLyAgICAgICAgICAgICAoYSArIGIgKyBjICsgZCArIDIpIC8gNCA6IElmIHJvdW5kaW5nCisKKyAgICBNQUNSTworICAgIE1fQVZHNCAgICAgICAgICAkc3VtMCwgJGxzYjAsICRzdW0xLCAkbHNiMSwgJHJuZFZhbAorICAgICAgICBMQ0xTIE9QMQorICAgICAgICBMQ0xTIE9QMgorICAgICAgICBJRiAkcm5kVmFsID0gMCA7Ly8gcm91bmRpbmcgY2FzZQorT1AxIFNFVFMgIkFORCIKK09QMiBTRVRTICJPUlIiCisgICAgICAgIEVMU0UgICAgICAgICAgIDsvLyBOb3Qgcm91bmRpbmcgY2FzZQorT1AxIFNFVFMgIk9SUiIKK09QMiBTRVRTICJBTkQiCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBMQ0xTIGxzYjIKKyAgICAgICAgTENMUyBzdW0yCisgICAgICAgIExDTFMgZGVzdAorICAgIAorbHNiMiAgU0VUUyAidG1wIgorc3VtMiAgU0VUUyAiJGxzYjAiCitkZXN0ICBTRVRTICIkc3VtMCIKKworICAgICAgICAkT1AxICAgICAgICAkbHNiMCwgJGxzYjAsICRsc2IxICAgICAgICAgIDsvLyBlMCA9IGUwICYgZTEKKyAgICAgICAgRU9SICAgICAgICAgJGxzYjIsICRzdW0wLCAkc3VtMSAgICAgICAgICA7Ly8gZTIgPSBzMCBeIHMxCisgICAgICAgICRPUDIgICAgICAgICRsc2IyLCAkbHNiMiwgJGxzYjAgICAgICAgICAgOy8vIGUyID0gZTIgfCBlMAorICAgICAgICBBTkQgICAgICAgICAkbHNiMiwgJGxzYjIsIHlNYXNrLCBMU1IgIyA0IDsvLyBlMiA9IGUyICYgbWFzaworICAgICAgICBVSEFERDggICAgICAkc3VtMiwgJHN1bTAsICRzdW0xICAgICAgICAgIDsvLyBzMiA9IChzMCArIHMxKS8yCisgICAgICAgIFVBREQ4ICAgICAgICRkZXN0LCAkc3VtMiwgJGxzYjIgICAgICAgICAgOy8vIGRlc3QgPSAgczIgKyBlMgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBJbXBsZW1lbnQgbW90aW9uIGNvbXBlbnNhdGlvbiByb3V0aW5lcyB1c2luZyB0aGUgbmFtZWQgcmVnaXN0ZXJzIGluIAorICAgIDsvLyBjYWxsZWUgZnVuY3Rpb24uIEVhY2ggb2YgdGhlIGZvbGxvd2luZyA0IGltcGxlbWVudCB0aGUgNCBwcmVkaWN0IHR5cGUKKyAgICA7Ly8gRWFjaCBoYW5kbGVzIDggY2FzZXMgZWFjaCBpZSBhbGwgdGhlIGNvbWJpbmF0aW9ucyBvZiA0IHR5cGVzIG9mIHNvdXJjZSAKKyAgICA7Ly8gYWxpZ25tZW50IG9mZnNldHMgYW5kIDIgdHlwZXMgb2Ygcm91bmRpbmcgZmxhZworICAgIDsvLworICAgIDsvLyBTeW50YXg6CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0ludGVnZXJQaXhlbCAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFhZICAkcm5kVmFsLCAkb2Zmc2V0CisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRybmRWYWwgICAgIEFzc2VtYmxlciBWYXJpYWJsZS4gMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vICRvZmZzZXQgICAgICRwU3JjIE1PRCA0IHZhbHVlLiBPZmZzZXQgZnJvbSA0IGJ5dGUgYWxpZ25lZCBsb2NhdGlvbi4KKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIE91dHB1dHMgY29tZSBpbiB0aGUgbmFtZWQgcmVnaXN0ZXJzIG9mIHRoZSBjYWxsZWUgZnVuY3Rpb25zCisgICAgOy8vIFRoZSBtYWNybyBsb2FkcyB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgcG9pbnRlciwgcHJvY2Vzc2VzIGl0IGFuZCAKKyAgICA7Ly8gc3RvcmVzIGluIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyLiBEb2VzIHRoZSB3aG9sZSBwcmVkaWN0aW9uIGN5Y2xlCisgICAgOy8vIG9mIE1vdGlvbiBDb21wZW5zYXRpb24gcm91dGluZSBmb3IgYSBwYXJ0aWN1bGFyIHByZWRpY3RUeXBlCisgICAgOy8vIEFmdGVyIHRoaXMgb25seSByZXNpZHVlIGFkZGl0aW9uIHRvIHRoZSBwcmVkaWN0ZWQgdmFsdWVzIHJlbWFpbgorCisgICAgTUFDUk8KKyAgICBNX01DUkVDT05CTE9DS19JbnRlZ2VyUGl4ZWwgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEludGVnZXJQaXhlbCBwcmVkaWN0VHlwZS4gQm90aAorICAgIDsvLyByb3VuZGluZyBjYXNlcyBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlIGJhc2UuIEl0IGlzIGp1c3QgYSBjb3B5CisgICAgOy8vIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLiBUd28gbGluZXMgYXJlIGRvbmUgcGVyIGxvb3AgdG8gcmVkdWNlIAorICAgIDsvLyBzdGFsbHMuIExvb3AgaGFzIGJlZW4gc29mdHdhcmUgcGlwZWxpbmVkIGFzIHdlbGwgZm9yIHRoYXQgcHVycG9zZS4KKyAgICA7Ly8gCisgICAgOy8vIE1fTE9BRF9YIGxvYWRzIGEgd2hvbGUgcm93IGluIHR3byByZWdpc3RlcnMgYW5kIHRoZW4gdGhleSBhcmUgc3RvcmVkCisgICAgCitDYXNlSW50ZWdlclBpeGVsUm5kME9mZnNldCRvZmZzZXQKK0Nhc2VJbnRlZ2VyUGl4ZWxSbmQxT2Zmc2V0JG9mZnNldAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CitZbG9vcEludGVnZXJQaXhlbE9mZnNldCRvZmZzZXQKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMgorICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAorICAgIFNUUkQgICAgICAgIHRtcDMsIHRtcDQsIFtwRHN0XSwgZHN0U3RlcAorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDMsICRvZmZzZXQKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CisgICAgQkdUICAgICAgICAgWWxvb3BJbnRlZ2VyUGl4ZWxPZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFggJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFggcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gTG9vcCBoYXMgYmVlbiBzb2Z0d2FyZSBwaXBlbGluZWQgdG8gcmVkdWNlIAorICAgIDsvLyBzdGFsbHMuCisgICAgOy8vIAorICAgIDsvLyBGaWx0ZXJpbmcgaW52b2x2ZXMgYXZlcmFnaW5nIGEgcGl4ZWwgd2l0aCB0aGUgbmV4dCBob3Jpem9udGFsIHBpeGVsLgorICAgIDsvLyBNX0xPQURfWElOVCBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZSA0IHJlZ2lzdGVycywgMiB3aXRoIAorICAgIDsvLyBhbGwgcGl4ZWxzIGluIGEgcm93IHdpdGggNCBwaXhlbCBpbiBlYWNoIHJlZ2lzdGVyIGFuZCBhbm90aGVyIDIKKyAgICA7Ly8gcmVnaXN0ZXJzIHdpdGggcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gb25lIGhvcml6b250YWxseSBzaGlmdGVkIHBpeGVsCisgICAgOy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluaXRpYWwgcm93IHBpeGVscy4gVGhlc2UgYXJlIHNldCBvZiBwYWNrZWQgCisgICAgOy8vIHJlZ2lzdGVycyBhcHByb3ByaWF0ZSB0byBkbyA0IGxhbmUgU0lNRC4KKyAgICA7Ly8gQWZ0ZXIgdGhhdCBNX1VIQUREOFIgbWFjcm8gZG9lcyB0aGUgYXZlcmFnaW5nIHRha2luZyBjYXJlIG9mIHRoZSAKKyAgICA7Ly8gcm91bmRpbmcgYXMgcmVxdWlyZWQKKyAgICAKK0Nhc2VIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisgICAgSUYgJHJuZFZhbCA9IDAKKyAgICAgICAgTERSIG1hc2ssID0weDgwODA4MDgwCisgICAgRU5ESUYKKworICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKK1lsb29wSGFsZlBpeGVsWFJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMxCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgIE1fVUhBREQ4UiAgIHRtcDUsIHRtcDEsIHRtcDMsICgxLSRybmRWYWwpLCBtYXNrCisgICAgTV9VSEFERDhSICAgdG1wNiwgdG1wMiwgdG1wNCwgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBTVFJEICAgICAgICB0bXA1LCB0bXA2LCBbcERzdF0sIGRzdFN0ZXAKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgQkdUICAgICAgICAgWWxvb3BIYWxmUGl4ZWxYUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBCICAgICAgICAgICBTd2l0Y2hQcmVkaWN0VHlwZUVuZAorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBNQUNSTworICAgIE1fTUNSRUNPTkJMT0NLX0hhbGZQaXhlbFkgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFkgcHJlZGljdFR5cGUuIFRoZSB0d28KKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRpZmZlcmVudCBjb2RlIGJhc2UgYW5kIHNwYW5uZWQgYnkgCisgICAgOy8vIGRpZmZlcmVudCBtYWNybyBjYWxscy4gUHJlTG9hZGluZyBpcyB1c2VkIHRvIGF2b2lkIHJlbG9hZCBvZiBzYW1lIGRhdGEuIAorICAgIDsvLyAKKyAgICA7Ly8gRmlsdGVyaW5nIGludm9sdmVzIGF2ZXJhZ2luZyBhIHBpeGVsIHdpdGggdGhlIG5leHQgdmVydGljYWwgcGl4ZWwuCisgICAgOy8vIE1fTE9BRF9YIGdlbmVyYXRlcyAyIHJlZ2lzdGVycyB3aXRoIGFsbCBwaXhlbHMgaW4gYSByb3cgd2l0aCA0IHBpeGVsIGluIAorICAgIDsvLyBlYWNoIHJlZ2lzdGVyLiBUaGVzZSBhcmUgc2V0IG9mIHBhY2tlZCByZWdpc3RlcnMgYXBwcm9wcmlhdGUgdG8gZG8gCisgICAgOy8vIDQgbGFuZSBTSU1ELiBBZnRlciB0aGF0IE1fVUhBREQ4UiBtYWNybyBkb2VzIHRoZSBhdmVyYWdpbmcgdGFraW5nIGNhcmUgCisgICAgOy8vIG9mIHRoZSByb3VuZGluZyBhcyByZXF1aXJlZAorICAgIAorQ2FzZUhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBJRiAkcm5kVmFsID0gMAorICAgICAgICBMRFIgbWFzaywgPTB4ODA4MDgwODAKKyAgICBFTkRJRgorCisgICAgTV9MT0FEX1ggICAgcFNyYywgc3JjU3RlcCwgdG1wMSwgdG1wMiwgdG1wNSwgJG9mZnNldCA7Ly8gUHJlLWxvYWQKK1lsb29wSGFsZlBpeGVsWVJuZCRybmRWYWwuT2Zmc2V0JG9mZnNldAorICAgIFNVQlMgICAgICAgIHksIHksICMyCisgICAgOy8vIFByb2Nlc3Npbmcgb25lIGxpbmUKKyAgICBNX0xPQURfWCAgICBwU3JjLCBzcmNTdGVwLCB0bXAzLCB0bXA0LCB0bXA1LCAkb2Zmc2V0CisgICAgTV9VSEFERDhSICAgdG1wMSwgdG1wMSwgdG1wMywgKDEtJHJuZFZhbCksIG1hc2sKKyAgICBNX1VIQUREOFIgICB0bXAyLCB0bXAyLCB0bXA0LCAoMS0kcm5kVmFsKSwgbWFzaworICAgIFNUUkQgICAgICAgIHRtcDEsIHRtcDIsIFtwRHN0XSwgZHN0U3RlcAorICAgIDsvLyBQcm9jZXNzaW5nIGFub3RoZXIgbGluZQorICAgIE1fTE9BRF9YICAgIHBTcmMsIHNyY1N0ZXAsIHRtcDEsIHRtcDIsIHRtcDUsICRvZmZzZXQKKyAgICBNX1VIQUREOFIgICB0bXAzLCB0bXAzLCB0bXAxLCAoMS0kcm5kVmFsKSwgbWFzaworICAgIE1fVUhBREQ4UiAgIHRtcDQsIHRtcDQsIHRtcDIsICgxLSRybmRWYWwpLCBtYXNrCisgICAgU1RSRCAgICAgICAgdG1wMywgdG1wNCwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKworICAgIEIgICAgICAgICAgIFN3aXRjaFByZWRpY3RUeXBlRW5kCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0tfSGFsZlBpeGVsWFkgJHJuZFZhbCwgJG9mZnNldAorICAgIDsvLyBBbGdvcml0aG1pYyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gVGhpcyBoYW5kbGVzIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIEhhbGZQaXhlbFhZIHByZWRpY3RUeXBlLiBUaGUgdHdvCisgICAgOy8vIHJvdW5kaW5nIGNhc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBkaWZmZXJlbnQgY29kZSBiYXNlIGFuZCBzcGFubmVkIGJ5IAorICAgIDsvLyBkaWZmZXJlbnQgbWFjcm8gY2FsbHMuIFByZUxvYWRpbmcgaXMgdXNlZCB0byBhdm9pZCByZWxvYWQgb2Ygc2FtZSBkYXRhLiAKKyAgICA7Ly8gCisgICAgOy8vIEZpbHRlcmluZyBpbnZvbHZlcyBhdmVyYWdpbmcgYSBwaXhlbCB3aXRoIHRoZSBuZXh0IHZlcnRpY2FsLCBob3Jpem9udGFsIAorICAgIDsvLyBhbmQgcmlnaHQtZG93biBkaWFnb25hbCBwaXhlbHMuIEp1c3QgYXMgaW4gSGFsZlBpeGVsWCBjYXNlLCBNX0xPQURfWElOVAorICAgIDsvLyBhbmQgTV9FWFRfWElOVCBjb21iaW5hdGlvbiBnZW5lcmF0ZXMgNCByZWdpc3RlcnMgd2l0aCBhIHJvdyBhbmQgaXRzCisgICAgOy8vIDEgcGl4ZWwgcmlnaHQgc2hpZnRlZCB2ZXJzaW9uLCB3aXRoIDQgcGl4ZWxzIGluIG9uZSByZWdpc3Rlci4gQW5vdGhlciAKKyAgICA7Ly8gY2FsbCBvZiB0aGF0IG1hY3JvLWNvbWJpbmF0aW9uIGdldHMgYW5vdGhlciByb3cuIFRoZW4gTV9IU1VNX1hPUiBpcyAKKyAgICA7Ly8gY2FsbGVkIHRvIGdldCBtdXR1YWwgaGFsZi1zdW0gYW5kIHhvciBjb21iaW5hdGlvbnMgb2YgYSByb3cgd2l0aCBpdHMKKyAgICA7Ly8gc2hpZnRlZCB2ZXJzaW9uIGFzIHRoZXkgYXJlIGlucHV0cyB0byB0aGUgTV9BVkc0IG1hY3JvIHdoaWNoIGNvbXB1dGVzCisgICAgOy8vIHRoZSA0IGVsZW1lbnQgYXZlcmFnZSB3aXRoIHJvdW5kaW5nLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGhhbGYtc3VtL3hvciAKKyAgICA7Ly8gdmFsdWVzIHRoYXQgYXJlIHByZXNlcnZlZCBmb3IgbmV4dCByb3cgYXMgdGhleSBjYW4gYmUgcmUtdXNlZCBpbiB0aGUgCisgICAgOy8vIG5leHQgY2FsbCB0byB0aGUgTV9BVkc0IGFuZCBzYXZlcyByZWNvbXB1dGF0aW9uLgorICAgIDsvLyBEdWUgdG8gbGFjayBvZiByZWdpc3RlciwgdGhlIHJvdyBjb3VudGVyIGFuZCBhIG1hc2tpbmcgdmFsdWUgcmVxdWlyZWQgCisgICAgOy8vIGluIE1fQVZHNCBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgcmVnaXN0ZXIgeU1hc2sgd2hlcmUgdGhlIGxhc3QgbmliYmxlCisgICAgOy8vIGhvbGRzIHRoZSByb3cgY291bnRlciB2YWx1ZXMgYW5kIHJlc3QgaG9sZHMgdGhlIG1hc2tpbmcgdmFyaWFibGUgbGVmdCAKKyAgICA7Ly8gc2hpZnRlZCBieSA0CisgICAgCitDYXNlSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICBMRFIgICAgICAgICB5TWFzaywgPSgoMHgwMTAxMDEwMSA8PCA0KSArIDgpCisKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCisgICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMCwgbDAKKyAgICBNX0hTVU1fWE9SICB0MDEsIHQxMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMwJywgbDAnCisKK1lsb29wSGFsZlBpeGVsWFlSbmQkcm5kVmFsLk9mZnNldCRvZmZzZXQKKyAgICA7Ly8gUHJvY2Vzc3Npbmcgb25lIGxpbmUKKyAgICA7Ly8gdDAwLCB0MDEsIHQxMCwgdDExIHJlcXVpcmVkIGZyb20gcHJldmlvdXMgbG9vcAorICAgIE1fTE9BRF9YSU5UIHBTcmMsIHNyY1N0ZXAsICRvZmZzZXQsIHQyMCwgdDIxLCB0MzAsIHQzMSA7Ly8gTG9hZCBjLCBjJywgZCwgZCcKKyAgICBTVUIgICAgICAgICB5TWFzaywgeU1hc2ssICMyCisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDIwLCB0MjEsIHQzMCwgdDMxCisgICAgTV9IU1VNX1hPUiAgdDIwLCB0MzAsIHRtcCAgICAgICAgICAgICAgIDsvLyBzMSwgbDEKKyAgICBNX0hTVU1fWE9SICB0MjEsIHQzMSwgdG1wICAgICAgICAgICAgICAgOy8vIHMxJywgbDEnCisgICAgTV9BVkc0ICAgICAgdDAwLCB0MTAsIHQyMCwgdDMwLCAkcm5kVmFsIDsvLyBzMCwgbDAsIHMxLCBsMQorICAgIE1fQVZHNCAgICAgIHQwMSwgdDExLCB0MjEsIHQzMSwgJHJuZFZhbCA7Ly8gczAnLCBsMCcsIHMxJywgbDEnCisgICAgU1RSRCAgICAgICAgdDAwLCB0MDEsIFtwRHN0XSwgZHN0U3RlcCAgIDsvLyBzdG9yZSB0aGUgYXZlcmFnZQorICAgIAorICAgIDsvLyBQcm9jZXNzc2luZyBhbm90aGVyIGxpbmUKKyAgICA7Ly8gdDIwLCB0MjEsIHQzMCwgdDMxIHJlcXVpcmVkIGZyb20gYWJvdmUKKyAgICBNX0xPQURfWElOVCBwU3JjLCBzcmNTdGVwLCAkb2Zmc2V0LCB0MDAsIHQwMSwgdDEwLCB0MTEgOy8vIExvYWQgYSwgYScsIGIsIGInCisgICAgVFNUICAgICAgICAgeU1hc2ssICM3CisgICAgTV9FWFRfWElOVCAgJG9mZnNldCwgdDAwLCB0MDEsIHQxMCwgdDExCisgICAgTV9IU1VNX1hPUiAgdDAwLCB0MTAsIHRtcAorICAgIE1fSFNVTV9YT1IgIHQwMSwgdDExLCB0bXAKKyAgICBNX0FWRzQgICAgICB0MjAsIHQzMCwgdDAwLCB0MTAsICRybmRWYWwKKyAgICBNX0FWRzQgICAgICB0MjEsIHQzMSwgdDAxLCB0MTEsICRybmRWYWwKKyAgICBTVFJEICAgICAgICB0MjAsIHQyMSwgW3BEc3RdLCBkc3RTdGVwCisKKyAgICBCR1QgICAgICAgICBZbG9vcEhhbGZQaXhlbFhZUm5kJHJuZFZhbC5PZmZzZXQkb2Zmc2V0CisKKyAgICBJRiAkb2Zmc2V0Lz0zIDpMT1I6ICRybmRWYWwvPTEKKyAgICAgICAgQiAgICAgICAgICAgU3dpdGNoUHJlZGljdFR5cGVFbmQKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGhhbmRsZXIgbWFjcm9zIGVuZCBoZXJlCis7Ly8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgOy8vIERlc2NyaXB0aW9uOgorICAgIDsvLyBQb3B1bGF0ZXMgYWxsIDQga2luZHMgb2Ygb2Zmc2V0cyAiY2FzZXMiIGZvciBlYWNoIHByZWRpY3RUeXBlIGFuZCBybmRWYWwKKyAgICA7Ly8gY29tYmluYXRpb24gaW4gdGhlICJzd2l0Y2giIHRvIHByZWRpY3Rpb24gcHJvY2Vzc2luZyBjb2RlIHNlZ21lbnQKKyAgICA7Ly8KKyAgICA7Ly8gU3ludGF4OgorICAgIDsvLyBNX0NBU0VfT0ZGU0VUICRybmQsICRwcmVkaWN0VHlwZQorICAgIDsvLyAKKyAgICA7Ly8gSW5wdXRzOgorICAgIDsvLyAkcm5kICAgICAgICAgICAgMCBmb3Igcm91bmRpbmcsIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9DQVNFInMgZm9yIHRoZSAiTV9TV0lUQ0giIG1hY3JvCisKKyAgICBNQUNSTworICAgIE1fQ0FTRV9PRkZTRVQgJHJuZCwgJHByZWRpY3RUeXBlCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQwCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQxCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQyCisgICAgICAgIE1fQ0FTRSAgICAgIENhc2UkcHJlZGljdFR5cGUuUm5kJHJuZC5PZmZzZXQzCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCAyIGtpbmRzIG9mIHJvdW5kaW5nICJjYXNlcyIgZm9yIGVhY2ggcHJlZGljdFR5cGUgaW4gdGhlIAorICAgIDsvLyAic3dpdGNoIiB0byBwcmVkaWN0aW9uIHByb2Nlc3NpbmcgY29kZSBzZWdtZW50CisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9DQVNFX09GRlNFVCAkcHJlZGljdFR5cGUKKyAgICA7Ly8gCisgICAgOy8vIElucHV0czoKKyAgICA7Ly8gJHByZWRpY3RUeXBlICAgIFRoZSBwcmVkaWN0aW9uIG1vZGUKKyAgICA7Ly8gCisgICAgOy8vIE91dHB1dHM6CisgICAgOy8vIFBvcHVsYXRlZCBsaXN0IG9mICJNX0NBU0VfT0ZGU0VUIiBtYWNyb3MKKworICAgIE1BQ1JPCisgICAgTV9DQVNFX01DUkVDT05CTE9DSyAkcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFX09GRlNFVCAgMCwgJHByZWRpY3RUeXBlIDsvLyAwIGZvciByb3VuZGluZworICAgICAgICBNX0NBU0VfT0ZGU0VUICAxLCAkcHJlZGljdFR5cGUgOy8vIDEgZm9yIG5vIHJvdW5kaW5nCisgICAgTUVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBEZXNjcmlwdGlvbjoKKyAgICA7Ly8gUG9wdWxhdGVzIGFsbCA4IGtpbmRzIG9mIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb25zIGhhbmRsaW5nIG1hY3JvcyAKKyAgICA7Ly8gZm9yIHRoZSBzcGVjaWZpZWQgcHJlZGljdFR5cGUuIEluIGNhc2Ugb2YgIkludGVnZXJQaXhlbCIgcHJlZGljdFR5cGUsIAorICAgIDsvLyByb3VuZGluZyBpcyBub3QgcmVxdWlyZWQgc28gc2FtZSBjb2RlIHNlZ21lbnQgaGFuZGxlcyBib3RoIGNhc2VzCisgICAgOy8vCisgICAgOy8vIFN5bnRheDoKKyAgICA7Ly8gTV9NQ1JFQ09OQkxPQ0sgICAgJHByZWRpY3RUeXBlCisgICAgOy8vIAorICAgIDsvLyBJbnB1dHM6CisgICAgOy8vICRwcmVkaWN0VHlwZSAgICBUaGUgcHJlZGljdGlvbiBtb2RlCisgICAgOy8vIAorICAgIDsvLyBPdXRwdXRzOgorICAgIDsvLyBQb3B1bGF0ZWQgbGlzdCBvZiAiTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiIgbWFjcm9zIGZvciBzcGVjaWZpZWQgCisgICAgOy8vIHByZWRpY3RUeXBlLiBFYWNoIAorICAgIDsvLyAgICAgICAgICAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfPHByZWRpY3RUeXBlPiAkcm5kLCAkb2Zmc2V0IAorICAgIDsvLyBpcyBhbiBjb2RlIHNlZ21lbnQgKHN0YXJ0aW5nIHdpdGggYSBsYWJlbCBpbmRpY2F0aW5nIHRoZSBwcmVkaWN0VHlwZSwgCisgICAgOy8vIHJvdW5kaW5nIGFuZCBvZmZzZXQgY29tYmluYXRpb24pCisgICAgOy8vIEZvdXIgY2FsbHMgb2YgdGhpcyBtYWNybyB3aXRoIHRoZSA0IHByZWRpY3Rpb24gbW9kZXMgcG9wdWxhdGUgYWxsIHRoZSAzMiAKKyAgICA7Ly8gaGFuZGxlcnMKKworICAgIE1BQ1JPCisgICAgTV9NQ1JFQ09OQkxPQ0sgJHByZWRpY3RUeXBlCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAwCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAxCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAyCisgICAgICAgIE1fTUNSRUNPTkJMT0NLXyRwcmVkaWN0VHlwZSAwLCAzCisgICAgSUYgIiRwcmVkaWN0VHlwZSIgLz0gIkludGVnZXJQaXhlbCIgOy8vIElmIG5vdCBJbnRlZ2VyUGl4ZWwgdGhlbiByb3VuZGluZyBtYWtlcyBhIGRpZmZlcmVuY2UKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDAKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDEKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDIKKyAgICAgICAgTV9NQ1JFQ09OQkxPQ0tfJHByZWRpY3RUeXBlIDEsIDMKKyAgICBFTkRJRgorICAgIE1FTkQKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBJbnB1dC9PdXRwdXQgUmVnaXN0ZXJzCitwU3JjICAgICAgICAgICAgICAgICAgUk4gMAorc3JjU3RlcCAgICAgICAgICAgICAgIFJOIDEKK2FyZ19wU3JjUmVzaWR1ZSAgICAgICBSTiAyCitwU3JjUmVzaWR1ZSAgICAgICAgICAgUk4gMTIKK3BEc3QgICAgICAgICAgICAgICAgICBSTiAzCitkc3RTdGVwICAgICAgICAgICAgICAgUk4gMgorcHJlZGljdFR5cGUgICAgICAgICAgIFJOIDEwCitybmRWYWwgICAgICAgICAgICAgICAgUk4gMTEKK21hc2sgICAgICAgICAgICAgICAgICBSTiAxMQorCis7Ly8gTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKK3plcm8gICAgICAgICAgICAgICAgICBSTiAxMgoreSAgICAgICAgICAgICAgICAgICAgIFJOIDE0CisKK3RtcDEgICAgICAgICAgICAgICAgICBSTiA0Cit0bXAyICAgICAgICAgICAgICAgICAgUk4gNQordG1wMyAgICAgICAgICAgICAgICAgIFJOIDYKK3RtcDQgICAgICAgICAgICAgICAgICBSTiA3Cit0bXA1ICAgICAgICAgICAgICAgICAgUk4gOAordG1wNiAgICAgICAgICAgICAgICAgIFJOIDkKK3RtcDcgICAgICAgICAgICAgICAgICBSTiAxMAordG1wOCAgICAgICAgICAgICAgICAgIFJOIDExCit0bXA5ICAgICAgICAgICAgICAgICAgUk4gMTIKKwordDAwICAgICAgICAgICAgICAgICAgIFJOIDQKK3QwMSAgICAgICAgICAgICAgICAgICBSTiA1Cit0MTAgICAgICAgICAgICAgICAgICAgUk4gNgordDExICAgICAgICAgICAgICAgICAgIFJOIDcKK3QyMCAgICAgICAgICAgICAgICAgICBSTiA4Cit0MjEgICAgICAgICAgICAgICAgICAgUk4gOQordDMwICAgICAgICAgICAgICAgICAgIFJOIDEwCit0MzEgICAgICAgICAgICAgICAgICAgUk4gMTEKK3RtcCAgICAgICAgICAgICAgICAgICBSTiAxMgorCit5TWFzayAgICAgICAgICAgICAgICAgUk4gMTQKKworZHN0ICAgICAgICAgICAgICAgICAgIFJOIDEKK3JldHVybiAgICAgICAgICAgICAgICBSTiAwCisKKyAgICA7Ly8gQWxsb2NhdGUgbWVtb3J5IG9uIHN0YWNrCisgICAgTV9BTExPQzQgICAgU3RrX3BEc3QsICAgICAgICAgICA0CisgICAgTV9BTExPQzQgICAgU3RrX3BTcmNSZXNpZHVlLCAgICA0CisgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgIE1fU1RBUlQgICAgIG9teFZDTTRQMl9NQ1JlY29uQmxvY2ssIHIxMQorICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgTV9BUkcgICAgICAgQXJnX2RzdFN0ZXAsICAgICAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3ByZWRpY3RUeXBlLCAgICA0CisgICAgTV9BUkcgICAgICAgQXJnX3JuZFZhbCwgICAgICAgICA0CisgICAgOy8vIFNhdmUgb24gc3RhY2sKKyAgICBNX1NUUiAgICAgICBwRHN0LCBTdGtfcERzdAorICAgIE1fU1RSICAgICAgIGFyZ19wU3JjUmVzaWR1ZSwgU3RrX3BTcmNSZXNpZHVlCisgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICBNX0xEUiAgICAgICBkc3RTdGVwLCBBcmdfZHN0U3RlcAorICAgIE1fTERSICAgICAgIHByZWRpY3RUeXBlLCBBcmdfcHJlZGljdFR5cGUKKyAgICBNX0xEUiAgICAgICBybmRWYWwsIEFyZ19ybmRWYWwKKyAgICAKKyAgICBNT1YgICAgICAgICB5LCAjOAorICAgIAorICAgIEFORCAgICAgICAgIHRtcDEsIHBTcmMsICMzCisgICAgT1JSICAgICAgICAgcHJlZGljdFR5cGUsIHRtcDEsIHByZWRpY3RUeXBlLCBMU0wgIzMKKyAgICBPUlIgICAgICAgICBwcmVkaWN0VHlwZSwgcHJlZGljdFR5cGUsIHJuZFZhbCwgTFNMICMyCisgICAgOy8vIFRydW5jYXRpbmcgc291cmNlIHBvaW50ZXIgdG8gYWxpZ24gdG8gNCBieXRlIGxvY2F0aW9uCisgICAgQklDICAgICAgICAgcFNyYywgcFNyYywgIzMKKworICAgIDsvLyBJbXBsZW1lbnRhdGlvbiB0YWtlcyBjYXJlIG9mIGFsbCBjb21iaW5hdGlvbnMgb2YgZGlmZmVyZW50IAorICAgIDsvLyBwcmVkaWN0VHlwZXMsIHJvdW5kaW5nIGNhc2VzIGFuZCBzb3VyY2UgcG9pbnRlciBvZmZzZXRzIHRvIGFsaWdubWVudCAKKyAgICA7Ly8gb2YgNCBieXRlcyBpbiBkaWZmZXJlbnQgY29kZSBiYXNlcyB1bmxlc3Mgb25lIG9mIHRoZXNlIHBhcmFtZXRlciB3YXNuJ3QgCisgICAgOy8vIG1ha2luZyBhbnkgZGlmZmVyZW5jZSB0byB0aGUgaW1wbGVtZW50YXRpb24uIEJlbG93IE1fQ0FTRV9NQ1JFQ09OQkxPQ0sKKyAgICA7Ly8gbWFjcm9zIGJyYW5jaCBpbnRvIDggTV9DQVNFIG1hY3JvcyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgMiAKKyAgICA7Ly8gcm91bmRpbmcgY2FzZXMgYW5kIDQgb2Zmc2V0cyBvZiB0aGUgcFNyYyBwb2ludGVyIHRvIHRoZSA0IGJ5dGUgCisgICAgOy8vIGFsaWdubWVudC4gCisgICAgTV9TV0lUQ0ggICAgcHJlZGljdFR5cGUKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBJbnRlZ2VyUGl4ZWwKKyAgICAgICAgTV9DQVNFX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYCisgICAgICAgIE1fQ0FTRV9NQ1JFQ09OQkxPQ0sgSGFsZlBpeGVsWQorICAgICAgICBNX0NBU0VfTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFhZCisgICAgTV9FTkRTV0lUQ0gKKworICAgIDsvLyBUaGUgTV9NQ1JFQ09OQkxPQ0sgbWFjcm9zIHBvcHVsYXRlIHRoZSBjb2RlIGJhc2VzIGJ5IGNhbGxpbmcgYWxsIDggCisgICAgOy8vIHBhcnRpY3VsYXIgbWFjcm9zICg0IGluIGNhc2Ugb2YgSW50ZWdlclBpeGVsIGFzIHJvdW5kaW5nIG1ha2VzIG5vIAorICAgIDsvLyBkaWZmZXJlbmNlIHRoZXJlKSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgYWxsIGNhc2VzIG9mIHJvdW5kaW5nIGFuZCAKKyAgICA7Ly8gb2Zmc2V0cy4gTFRPUkcgaXMgdXNlZCB0byBzZWdtZW50IHRoZSBjb2RlIGFzIGNvZGUgc2l6ZSBibG9hdGVkIGJleW9uZCAKKyAgICA7Ly8gNEtCLgorICAgIE1fTUNSRUNPTkJMT0NLIEludGVnZXJQaXhlbAorICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFgKKyAgICBMVE9SRworICAgIE1fTUNSRUNPTkJMT0NLIEhhbGZQaXhlbFkKKyAgICBNX01DUkVDT05CTE9DSyBIYWxmUGl4ZWxYWQorU3dpdGNoUHJlZGljdFR5cGVFbmQKKworICAgIDsvLyBSZXNpZHVlIEFkZGl0aW9uCisgICAgOy8vIFRoaXMgaXMgZG9uZSBpbiAyIGxhbmUgU0lNRCB0aG91Z2ggbG9hZHMgYXJlIGZ1cnRoZXIgb3B0aW1pemVkIGFuZAorICAgIDsvLyA0IGJ5dGVzIGFyZSBsb2FkZWQgaW4gY2FzZSBvZiBkZXN0aW5hdGlvbiBidWZmZXIuIEFsZ29yaXRobWljIAorICAgIDsvLyBkZXRhaWxzIGFyZSBpbiBpbmxpbmVkIGNvbW1lbnRzCisgICAgTV9MRFIgICAgICAgcFNyY1Jlc2lkdWUsIFN0a19wU3JjUmVzaWR1ZQorICAgIENNUCAgICAgICAgIHBTcmNSZXNpZHVlLCAjMAorICAgIEJFUSAgICAgICAgIHBTcmNSZXNpZHVlQ29uZGl0aW9uRW5kCitwU3JjUmVzaWR1ZU5vdE51bGwgICAgCisgICAgTV9MRFIgICAgICAgcERzdCwgU3RrX3BEc3QKKyAgICBNT1YgICAgICAgICB5LCAjOAorICAgIFNVQiAgICAgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsICM0CitZbG9vcF9wU3JjUmVzaWR1ZU5vdE51bGwKKyAgICBTVUJTICAgICAgICB5LCB5LCAjMQorICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdICAgICAgICAgICAgICAgIDsvLyBkc3QgPSBbZGNiYV0KKyAgICBMRE1JQSAgICAgICBwU3JjUmVzaWR1ZSEsIHt0bXAxLCB0bXAyfSA7Ly8gdG1wMT1bRENdIHRtcDI9W0JBXQorICAgIFBLSEJUICAgICAgIHRtcDMsIHRtcDEsIHRtcDIsIExTTCAjMTYgIDsvLyBEZWx0YXZhbDEgPSBbQyBBXQorICAgIFBLSFRCICAgICAgIHRtcDQsIHRtcDIsIHRtcDEsIEFTUiAjMTYgIDsvLyBEZWx0YVZhbDIgPSBbRCBCXQorICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdCAgICAgICAgICAgICAgICAgIDsvLyB0bXAxID0gWzBjMGFdCisgICAgVVhUQjE2ICAgICAgdG1wMiwgZHN0LCBST1IgIzggICAgICAgICAgOy8vIHRtcDIgPSBbMGQwYl0KKyAgICBRQUREMTYgICAgICB0bXAxLCB0bXAxLCB0bXAzICAgICAgICAgICA7Ly8gQWRkIGFuZCBzYXR1cmF0ZSB0byAxNiBiaXRzCisgICAgUUFERDE2ICAgICAgdG1wMiwgdG1wMiwgdG1wNAorICAgIFVTQVQxNiAgICAgIHRtcDEsICM4LCB0bXAxCisgICAgVVNBVDE2ICAgICAgdG1wMiwgIzgsIHRtcDIgICAgICAgICAgICAgOy8vIGFybUNsaXAoMCwgMjU1LCB0bXAyKQorICAgIE9SUiAgICAgICAgIHRtcDEsIHRtcDEsIHRtcDIsIExTTCAjOCAgIDsvLyB0bXAxID0gW2RjYmFdCisgICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCAjNAorICAgIAorICAgIExEUiAgICAgICAgIGRzdCwgW3BEc3RdCisgICAgTERNSUEgICAgICAgcFNyY1Jlc2lkdWUhLCB7dG1wMSwgdG1wMn0KKyAgICBQS0hCVCAgICAgICB0bXAzLCB0bXAxLCB0bXAyLCBMU0wgIzE2CisgICAgUEtIVEIgICAgICAgdG1wNCwgdG1wMiwgdG1wMSwgQVNSICMxNgorICAgIFVYVEIxNiAgICAgIHRtcDEsIGRzdAorICAgIFVYVEIxNiAgICAgIHRtcDIsIGRzdCwgUk9SICM4CisgICAgUUFERDE2ICAgICAgdG1wMSwgdG1wMSwgdG1wMworICAgIFFBREQxNiAgICAgIHRtcDIsIHRtcDIsIHRtcDQKKyAgICBVU0FUMTYgICAgICB0bXAxLCAjOCwgdG1wMQorICAgIFVTQVQxNiAgICAgIHRtcDIsICM4LCB0bXAyCisgICAgT1JSICAgICAgICAgdG1wMSwgdG1wMSwgdG1wMiwgTFNMICM4CisgICAgU1RSICAgICAgICAgdG1wMSwgW3BEc3RdLCBkc3RTdGVwCisgICAgCisgICAgQkdUICAgICAgICAgWWxvb3BfcFNyY1Jlc2lkdWVOb3ROdWxsCitwU3JjUmVzaWR1ZUNvbmRpdGlvbkVuZAorCisgICAgTU9WICAgICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorCisgICAgTV9FTkQKKyAgICBFTkRJRiA7Ly8gQVJNMTEzNkpTCisKKzsvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsvLyBDb3J0ZXhBOCBpbXBsZW1lbnRhdGlvbgorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEVORAorOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIG9teFZDTTRQMl9NQ1JlY29uQmxvY2sgZW5kcworOy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMzQ0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKQEAgLTAsMCArMSwyODMgQEAKKzsgKioqKioqKioqKgorOyAqIAorOyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmFfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgOTY0MQorOyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4Cis7ICogCis7ICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7ICogCis7ICogCis7ICogCis7ICogRGVzY3JpcHRpb246Cis7ICogQ29udGFpbnMgbW9kdWxlIGZvciBEQy9BQyBjb2VmZmljaWVudCBwcmVkaWN0aW9uCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suIFByaW9yCis7ICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKzsgKiBhcyBzcGVjaWZpZWQgaW4gc3ViY2xhdXNlIDcuNC4zLjEgb2YgSVNPL0lFQyAxNDQ5Ni0yLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucyB0aGUgCis7ICogICAgICAgICAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudCByZXNpZHVhbHMgKFBRRikgb2YgdGhlIGN1cnJlbnQgCis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFRoZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIHRvIHRoZSByYW5nZSAKKzsgKiAgICAgICAgICAgICAgICAgICAgWy0yMDQ4LCAyMDQ3XS4KKzsgKiBbaW5dICBwUHJlZEJ1ZlJvdyAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkCis7ICogICAgICAgICAgICAgICAgICAgIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb2x1bW4gYnVmZmVyOyBtdXN0IGJlIAorOyAqICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LgorOyAqIFtpbl0gIGN1clFQICAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUCBtYXkgCis7ICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHByZWRRUCBlc3BlY2lhbGx5IHdoZW4gdGhlIGN1cnJlbnQgYmxvY2sgYW5kIAorOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcHJlZGljdG9yIGJsb2NrIGFyZSBpbiB0aGUgc2FtZSBtYWNyb2Jsb2NrLgorOyAqIFtpbl0gIHByZWRRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sKKzsgKiBbaW5dICBwcmVkRGlyICAgICAgaW5kaWNhdGVzIHRoZSBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCB0YWtlcyBvbmUKKzsgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5Cis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19WRVJUSUNBTCAgICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5Cis7ICogW2luXSAgQUNQcmVkRmxhZyAgIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlCis7ICogICAgICAgICAgICAgICAgICAgIHBlcmZvcm1lZC4gSXQgaXMgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIGluIHRoZSBiaXQKKzsgKiAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKzsgKiBbaW5dICB2aWRlb0NvbXAgICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKzsgKiAgICAgICAgICAgICAgICAgICAgYWxwaGEpIG9mIHRoZSBjdXJyZW50IGJsb2NrCis7ICogW291dF0gcFNyY0RzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworOyAqICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyAoUUYpIG9mIHRoZSBjdXJyZW50Cis7ICogICAgICAgICAgICAgICAgICAgIGJsb2NrCis7ICogW291dF0gcFByZWRCdWZSb3cgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorOyAqIFtvdXRdIHBQcmVkQnVmQ29sICBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKzsgKiBSZXR1cm4gVmFsdWU6Cis7ICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCis7ICogT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzIAorOyAqIC0gQXQgbGVhc3Qgb25lIG9mIHRoZSBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wuCis7ICogLSBBdCBsZWFzdCBvbmUgdGhlIGZvbGxvd2luZyBjYXNlczogY3VyUVAgPD0gMCwgcHJlZFFQIDw9IDAsIGN1clFQID4zMSwgCis7ICogICBwcmVkUVAgPiAzMSwgcHJlRGlyIGV4Y2VlZHMgWzEsMl0uCis7ICogLSBBdCBsZWFzdCBvbmUgb2YgdGhlIHBvaW50ZXJzIHBTcmNEc3QsIHBQcmVkQnVmUm93LCBvciBwUHJlZEJ1ZkNvbCBpcyBub3QgCis7ICogICA0LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqKioqKioqKioKKyAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKyAgICAgICAKKyAgICAgICAgICAgICAKKworICAgICAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX1JlY2lwcm9jYWxfUVBfUzMyCisgICAgICAgSU1QT1JUICAgICAgICBhcm1WQ000UDJfUmVjaXByb2NhbF9RUF9TMTYKKyAgICAgICBJTVBPUlQgICAgICAgIGFybVZDTTRQMl9EQ1NjYWxlcgorICAgICAgIAorCisKKyAgICAgICAgSUYgQVJNMTEzNkpTCisKKworOy8vIElucHV0IEFyZ3VtZW50cworCitwU3JjRHN0ICAgICAgICAgIFJOIDAKK3BQcmVkQnVmUm93ICAgICAgUk4gMQorcFByZWRCdWZDb2wgICAgICBSTiAyCitjdXJRUCAgICAgICAgICAgIFJOIDMKK1FQICAgICAgICAgICAgICAgUk4gMworcHJlZFFQICAgICAgICAgICBSTiA0CitwcmVkRGlyICAgICAgICAgIFJOIDUKK0FDUHJlZEZsYWcgICAgICAgUk4gNgordmlkZW9Db21wICAgICAgICBSTiA3ICAKKworOy8vIExvY2FsIFZhcmlhYmxlcworCit0ZW1wMiAgICAgICAgICAgIFJOIDUKK25lZ0N1clFQICAgICAgICAgUk4gNworbmVnZGNTY2FsZXIgICAgICBSTiA3Cit0ZW1wUHJlZCAgICAgICAgIFJOIDgKKworZGNTY2FsZXIgICAgICAgICBSTiA0CitDb2VmZlRhYmxlICAgICAgIFJOIDkKK2Fic0NvZWZmREMgICAgICAgUk4gOQordGVtcDMgICAgICAgICAgICBSTiA2CithYnNDb2VmZkFDICAgICAgIFJOIDYKKworc2hvcnRWaWRlb0hlYWRlciBSTiA5CitwcmVkQ29lZmZUYWJsZSAgIFJOIDEwCitDb3VudCAgICAgICAgICAgIFJOIDEwCit0ZW1wMSAgICAgICAgICAgIFJOIDEyCitpbmRleCAgICAgICAgICAgIFJOIDEyCitSZW0gICAgICAgICAgICAgIFJOIDE0Cit0ZW1wICAgICAgICAgICAgIFJOIDExCitSZXR1cm4gICAgICAgICAgIFJOIDAKKworICAgICAgIAorCisgICAgICAgTV9TVEFSVCAgIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEscjEyCisgICAgICAgCisgICAgICAgOy8vIEFzc2lnbmluZyBwb2ludGVycyB0byBJbnB1dCBhcmd1bWVudHMgb24gU3RhY2sKKyAgICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZFFQb25TdGFjayw0ICAKKyAgICAgICBNX0FSRyAgICAgICAgICAgcHJlZERpcm9uU3RhY2ssNAorICAgICAgIE1fQVJHICAgICAgICAgICBBQ1ByZWRGbGFnb25TdGFjayw0CisgICAgICAgTV9BUkcgICAgICAgICAgIHZpZGVvQ29tcG9uU3RhY2ssNAorICAgICAgIAorICAgICAgIDsvLyBEQyBQcmVkaWN0aW9uCisKKyAgICAgICBNX0xEUiAgICAgICAgICAgdmlkZW9Db21wLHZpZGVvQ29tcG9uU3RhY2sgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2aWRlb0NvbXAgRnJvbSBTdGFjayAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgIE1fTERSICAgICAgICAgICBwcmVkRGlyLHByZWREaXJvblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIFByZWRpY3Rpb24gZGlyZWN0aW9uCisgICAgICAgCisgICAgICAgOy8vIGRjU2NhbGVyIENhbGN1bGF0aW9uCisKKyAgICAgICBMRFIgICAgICAgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgICBBREQgICAgICAgICAgICAgaW5kZXgsaW5kZXgsdmlkZW9Db21wLExTTCAjNQorICAgICAgIExEUkIgICAgICAgICAgICBkY1NjYWxlcixbaW5kZXgsUVBdCisgICAgICAgICAgIAorICAgIAorY2FsRENWYWwKKyAgICAgIAorICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MxNiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMzI3NjcvKDEgdG8gNjMpIAorICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIHByZWREaXIsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyB2ZXJ0aWNhbAorCisgICAgICAgOy8vIENhdWx1Y2F0ZSB0ZW1wIHByZWQgYnkgcGVyZm9ybWluZyBEaXZpc2lvbgorICAgICAgICAgICAgCisgICAgICAgTERSRVFTSCAgICAgICAgIGFic0NvZWZmREMsW3BQcmVkQnVmUm93XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHZldGljYWwgbG9hZCB0aGUgY29lZmYgZnJvbSBSb3cgUHJlZGljdGlvbiBCdWZmZXIKKyAgICAgICBMRFJORVNIICAgICAgICAgYWJzQ29lZmZEQyxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgaG9yaXpvbnRhbCBsb2FkIHRoZSBjb2VmZiBmcm9tIGNvbHVtbiBQcmVkaWN0aW9uIEJ1ZmZlcgorICAgICAgIAorICAgICAgIFJTQiAgICAgICAgICAgICBuZWdkY1NjYWxlcixkY1NjYWxlciwjMCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZWdkY1NjYWxlcj0tZGNTY2FsZXIgIAorICAgICAgIAorICAgICAgIE1PViAgICAgICAgICAgICB0ZW1wMSxhYnNDb2VmZkRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wMT1wcmVkaWN0aW9uIGNvZWZmCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIGFic0NvZWZmREMsdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vYWJzQ29lZmZEQz1hYnModGVtcDEpCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsZGNTY2FsZXIsZGNTY2FsZXIKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcHJlZENvZWZmVGFibGUsdGVtcF0gICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCB2YWx1ZSBmcm9tIGNvZWZmIHRhYmxlIGZvciBwZXJmb3JtaW5nIGRpdmlzaW9uIHVzaW5nIG11bHRpcGxpY2F0aW9uCisgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIHRlbXBQcmVkLHRlbXAsYWJzQ29lZmZEQyAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93KENvbClbMF0qMzI3NjcvZGNTY2FsZXIKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcDMsZGNTY2FsZXIsIzEKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcFByZWQsdGVtcFByZWQsIzE1ICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9cFByZWRCdWZSb3coQ29sKVswXS9kY1NjYWxlciAgICAgICAgICAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDMsdGVtcDMsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDM9cm91bmQoZGNTY2FsZXIvMikKKyAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ2RjU2NhbGVyLHRlbXBQcmVkLGFic0NvZWZmREMgICAgICAgICAgICA7Ly8gUmVtID0gcFByZWRCdWZSb3coQ29sKVswXS10ZW1wUHJlZCpkY1NjYWxlciAgICAgIAorICAgICAgIAorICAgICAgIAorICAgICAgIExEUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbF0KKyAgICAgICBDTVAgICAgICAgICAgICAgUmVtLHRlbXAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSWYgUmVtPj1yb3VuZChkY1NjYWxlci8yKTt0ZW1wUHJlZD10ZW1wUHJlZCsxCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvIGlmIHBQcmVkQnVmUm93KENvbClbMF08MDsgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgICAgICAgCisgICAgICAgCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LCMtMTZdICAgICAgCisKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdCisgICAgICAgTV9MRFIgICAgICAgICAgIEFDUHJlZEZsYWcsQUNQcmVkRmxhZ29uU3RhY2sKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0WzBdK3RlbXBQcmVkCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgdGVtcDEsdGVtcCxkY1NjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9Y2xpcHBlZChwU3JjRHN0WzBdKSpkY1NjYWxlciAgICAgICAgICAgCisgICAgICAgTV9MRFIgICAgICAgICAgIHByZWRRUCxwcmVkUVBvblN0YWNrCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3RdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIEFDUHJlZEZsYWcsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIGlmIHRoZSBBQyBwcmVkaWN0aW9uIGZsYWcgaXMgc2V0IG9yIG5vdAorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wMSxbcFByZWRCdWZDb2xdICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSB0ZW1wMSB0byBwUHJlZEJ1ZkNvbAorIAorICAgICAgIDsvLyBBQyBQcmVkaWN0aW9uCisKKyAgICAgICAgICAgICAgCisgICAgICAgQk5FICAgICAgICAgICAgIEV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIG5vdCBzZXQgRXhpdAorICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBwcmVkQ29lZmZUYWJsZSwgPWFybVZDTTRQMl9SZWNpcHJvY2FsX1FQX1MzMiAgIDsvLyBMb2FkaW5nIHRoZSB0YWJsZSB3aXRoIGVudHJpZXMgMHgxZmZmZi8oMSB0byA2MykKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsIzQKKyAgICAgICBNVUwgICAgICAgICAgICAgdGVtcDEsY3VyUVAsdGVtcDEKKyAgICAgICBDTVAgICAgICAgICAgICAgcHJlZERpciwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ2hlY2sgdGhlIFByZWRpY3Rpb24gZGlyZWN0aW9uCisgICAgICAgUlNCICAgICAgICAgICAgIG5lZ0N1clFQLGN1clFQLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIExEUiAgICAgICAgICAgICBDb2VmZlRhYmxlLFtwcmVkQ29lZmZUYWJsZSx0ZW1wMV0gICAgICAgICAgICAgIDsvLyBDb2VmZlRhYmxlPTB4MWZmZmYvY3VyUVAKKyAgICAgICBBREQgICAgICAgICAgICAgY3VyUVAsY3VyUVAsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY3VyUVA9Y3VyUVArMQorICAgICAgIExTUiAgICAgICAgICAgICBjdXJRUCxjdXJRUCwjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjdXJRUD1yb3VuZChjdXJRUC8yKSAgICAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6aW5nIHRoZSBMb29wIENvdW50CisgICAgICAgQk5FICAgICAgICAgICAgIEhvcml6b250YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIElmIHRoZSBQcmVkaWN0aW9uIGRpcmVjdGlvbiBpcyBob3Jpem9udGFsIGJyYW5jaCB0byBIb3Jpem9udGFsCisKKyAgICAgICAKKworbG9vcDEgICAgICAgCisgICAgICAgOy8vIENhbGN1bGF0ZSB0ZW1wUHJlZAorICAgICAgIAorICAgICAgIExEUlNIICAgICAgICAgICBhYnNDb2VmZkFDLFtwUHJlZEJ1ZlJvdyxDb3VudF0gICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPXBQcmVkQnVmUm93W2ldLCAxPTxpPD03CisgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLGFic0NvZWZmQUMKKyAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBwUHJlZEJ1ZlJvd1tpXSB3aXRoIHplcm8sIDE9PGk8PTcKKyAgICAgICBSU0JMVCAgICAgICAgICAgYWJzQ29lZmZBQyx0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZmZBQz0gYWJzKHBQcmVkQnVmUm93W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBTTVVMQkIgICAgICAgICAgYWJzQ29lZmZBQyxhYnNDb2VmZkFDLHByZWRRUCAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDE9cFByZWRCdWZSb3dbaV0qcHJlZFFQCisgICAgICAgTVVMICAgICAgICAgICAgIHRlbXBQcmVkLGFic0NvZWZmQUMsQ29lZmZUYWJsZSAgICAgICAgICAgICAgICAgOy8vIHRlbXBQcmVkPXBQcmVkQnVmUm93W2ldKnByZWRRUCoweDFmZmZmL2N1clFQCisgICAgICAgTFNSICAgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMxNyAgICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMgICAgICAgICAgICAgICA7Ly8gUmVtPWFicyhwUHJlZEJ1ZlJvd1tpXSktdGVtcFByZWQqY3VyUVAKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldLDE8PWk8OAorICAgICAgIAorICAgICAgIENNUCAgICAgICAgICAgICBSZW0sY3VyUVAKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaWYgUmVtPj1yb3VuZChjdXJRUC8yKTsgdGVtcFByZWQ9dGVtcFByZWQrMQorICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMAorICAgICAgIFJTQkxUICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiBwUHJlZEJ1ZlJvd1tpXTwwIDsgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgICAgICAgIAorICAgICAgIDsvLyBVcGRhdGUgc291cmNlIGFuZCBSb3cgUHJlZGljdGlvbiBidWZmZXJzCisgICAgICAgCisgICAgICAgQUREICAgICAgICAgICAgIHRlbXAsdGVtcCx0ZW1wUHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXA9dGVtcFByZWQrcFNyY0RzdFtpXQorICAgICAgIFNTQVQxNiAgICAgICAgICB0ZW1wLCMxMix0ZW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBDbGlwIHRlbXAgdG8gWy0yMDQ4LDIwNDddCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BTcmNEc3QsQ291bnRdCisgICAgICAgU1RSSCAgICAgICAgICAgIHRlbXAsW3BQcmVkQnVmUm93LENvdW50XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBQcmVkQnVmUm93W2ldPXRlbXAKKyAgICAgICBBREQgICAgICAgICAgICAgQ291bnQsQ291bnQsIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gaT1pKzEKKyAgICAgICBDTVAgICAgICAgICAgICAgQ291bnQsIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY29tcGFyZSBpZiBpPTgKKyAgICAgICBCTFQgICAgICAgICAgICAgbG9vcDEKKyAgICAgICBCICAgICAgICAgICAgICAgRXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQKKworSG9yaXpvbnRhbAorCisgICAgICAgTU9WICAgICAgICAgICAgIENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEluaXRpYWxpemluZyBpPTgKKworbG9vcDIgIAorICAgICAKKyAgICAgICBMU1IgICAgICAgICAgICAgdGVtcDIsQ291bnQsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcDI9aT4+MworICAgICAgIAorICAgICAgIDsvLyBDYWxjdWxhdGUgdGVtcFByZWQKKyAgICAgICAKKyAgICAgICBMRFJIICAgICAgICAgICAgYWJzQ29lZmZBQyxbcFByZWRCdWZDb2wsdGVtcDJdICAgICAgICAgICAgICAgICA7Ly8gYWJzQ29lZkFDPXBQcmVkQnVmQ29sW2k+PjNdICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICBNT1YgICAgICAgICAgICAgdGVtcDEsYWJzQ29lZmZBQworICAgICAgIENNUCAgICAgICAgICAgICB0ZW1wMSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb21wYXJlIHBQcmVkQnVmUm93W2ldIHdpdGggemVybywgMT08aTw9NworICAgICAgIFJTQkxUICAgICAgICAgICBhYnNDb2VmZkFDLHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBhYnNDb2VmZkFDPWFicyhwUHJlZEJ1ZkNvbFtpPj4zXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgU01VTEJCICAgICAgICAgIGFic0NvZWZmQUMsYWJzQ29lZmZBQyxwcmVkUVAgICAgICAgICAgICAgICAgICAgOy8vIHRlbXAxPXBQcmVkQnVmQ29sW2k+PjNdKnByZWRRUAorICAgICAgIE1VTCAgICAgICAgICAgICB0ZW1wUHJlZCxhYnNDb2VmZkFDLENvZWZmVGFibGUgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAqMHgxZmZmZi9jdXJRUAorICAgICAgIExTUiAgICAgICAgICAgICB0ZW1wUHJlZCx0ZW1wUHJlZCwjMTcgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyB0ZW1wUHJlZD1wUHJlZEJ1ZkNvbFtpPj4zXSpwcmVkUVAvY3VyUVAKKyAgICAgICAKKyAgICAgICBNTEEgICAgICAgICAgICAgUmVtLG5lZ0N1clFQLHRlbXBQcmVkLGFic0NvZWZmQUMKKyAgICAgICBMRFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldCisgICAgICAgCisgICAgICAgQ01QICAgICAgICAgICAgIFJlbSxjdXJRUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXBhcmUgUmVtIHdpdGggcm91bmQoY3VyUVAvMikKKyAgICAgICBBRERHRSAgICAgICAgICAgdGVtcFByZWQsIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcFByZWQ9dGVtcFByZWQrMSBpZiBSZW0+PXJvdW5kKGN1clFQLzIpCisgICAgICAgQ01QICAgICAgICAgICAgIHRlbXAxLCMwCisgICAgICAgUlNCTFQgICAgICAgICAgIHRlbXBQcmVkLHRlbXBQcmVkLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGlmIHBQcmVkQnVmQ29sW2k+PjMgPDAgdGVtcFByZWQ9LXRlbXBQcmVkCisgICAgICAgCisgICAgICAgOy8vIFVwZGF0ZSBzb3VyY2UgYW5kIFJvdyBQcmVkaWN0aW9uIGJ1ZmZlcnMKKyAgICAgICAKKyAgICAgICBBREQgICAgICAgICAgICAgdGVtcCx0ZW1wLHRlbXBQcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gdGVtcD1wU3JjRHN0W2ldK3RlbXBQcmVkCisgICAgICAgU1NBVDE2ICAgICAgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENsaXAgdGVtcCB0byBbLTIwNDgsMjA0N10KKyAgICAgICBTVFJIICAgICAgICAgICAgdGVtcCxbcFNyY0RzdCxDb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0RzdFswXT0gY2xpcHBlZCB2YWx1ZQorICAgICAgIFNUUkggICAgICAgICAgICB0ZW1wLFtwUHJlZEJ1ZkNvbCx0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIDsvLyBwUHJlZEJ1ZkNvbFtpPj4zXT10ZW1wCisgICAgICAgQUREICAgICAgICAgICAgIENvdW50LENvdW50LCMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGk9aSs4CisgICAgICAgQ01QICAgICAgICAgICAgIENvdW50LCMxMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNvbXBhcmUgaSB3aXRoIDY0CisgICAgICAgQkxUICAgICAgICAgICAgIGxvb3AyCisKKyAgICAgICAgICAgICAKK0V4aXQKKyAgCisgICAgICAgTU9WICAgICAgICAgICAgIFJldHVybiwjT01YX1N0c19Ob0VyciAKKworICAgICAgIE1fRU5ECisgICAgICAgRU5ESUYKKyAgICAgICBFTkQKKworCisgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm0xMS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUXVhbnRJbnZJbnRlcl9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTU5MWNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCkBAIC0wLDAgKzEsMTQxIEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKzsgKiBPcGVuTUFYIERMOiB2MS4wLjIKKzsgKiBSZXZpc2lvbjogICA5NjQxCis7ICogRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciBpbnRlciByZWNvbnN0cnVjdGlvbgorOyAqIAorOyAqCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9RdWFudEludkludGVyX0kKKzsgKgorOyAqIERlc2NyaXB0aW9uOgorOyAqIFBlcmZvcm1zIGludmVyc2UgcXVhbnRpemF0aW9uIG9uIGludHJhL2ludGVyIGNvZGVkIGJsb2NrLgorOyAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgYml0c19wZXJfcGl4ZWwgPSA4LiBNaXNtYXRjaCBjb250cm9sCis7ICogaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgTVBFRy00IG1vZGUgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqIFRoZSBvdXRwdXQgY29lZmZpY2llbnRzIGFyZSBjbGlwcGVkIHRvIHRoZSByYW5nZTogWy0yMDQ4LCAyMDQ3XS4KKzsgKiBNaXNtYXRjaCBjb250cm9sIGlzIHBlcmZvcm1lZCBmb3IgdGhlIGZpcnN0IGludmVyc2UgcXVhbnRpemF0aW9uIG1ldGhvZC4KKzsgKgorOyAqIFJlbWFya3M6Cis7ICoKKzsgKiBQYXJhbWV0ZXJzOgorOyAqIFtpbl0gcFNyY0RzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSBRUCAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpc2VyX3NjYWxlKQorOyAqIFtpbl0gdmlkZW9Db21wICAgICAgKEludHJhIHZlcnNpb24gb25seS4pIFZpZGVvIGNvbXBvbmVudCB0eXBlIG9mIHRoZQorOyAqICAgICAgICAgICAgICAgICAgY3VycmVudCBibG9jay4gVGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZmxhZ3M6Cis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICBPTVhfVkNfQUxQSEEuCis7ICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyBtb2RlLAorOyAqICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2suICBNdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4KKzsgKgorOyAqIFJldHVybiBWYWx1ZToKKzsgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKzsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKzsgKiAgICAtIElmIHBTcmNEc3QgaXMgTlVMTCBvciBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLgorOyAqICAgICAgb3IKKzsgKiAgICAtIElmIFFQIDw9IDAuCis7ICogICAgICBvcgorOyAqICAgIC0gdmlkZW9Db21wIGlzIG5vbmUgb2YgT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIGFuZCBPTVhfVkNfQUxQSEEuCis7ICoKKzsgKi8KKworICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKworICAgTV9WQVJJQU5UUyBBUk0xMTM2SlMKKworICAgICAgICAgCisKKyAgICAgSUYgQVJNMTEzNkpTCisKKzsvL0lucHV0IEFyZ3VtZW50cworcFNyY0RzdCAgICAgICAgICAgIFJOIDAKK1FQICAgICAgICAgICAgICAgICBSTiAxCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICAgICAgICAgICAgIFJOIDAKK0NvdW50ICAgICAgICAgICAgICBSTiA0ICAgICAgCit0ZW1wVmFsMjEgICAgICAgICAgUk4gMgordGVtcFZhbDQzICAgICAgICAgIFJOIDMKK1FQMSAgICAgICAgICAgICAgICBSTiA1CitYMiAgICAgICAgICAgICAgICAgUk4gNgorWDMgICAgICAgICAgICAgICAgIFJOIDE0CitSZXN1bHQxICAgICAgICAgICAgUk4gOAorUmVzdWx0MiAgICAgICAgICAgIFJOIDkKK3R3byAgICAgICAgICAgICAgICBSTiA3CisKKyAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludGVyX0kscjkKKyAgICAgICAKKyAgICAgICAgTU9WICAgICAgQ291bnQsIzY0CisgICAgICAgIFRTVCAgICAgIFFQLCMxCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdF0gICAgICA7Ly8gTG9hZHMgZmlyc3QgdHdvIHZhbHVlcyBvZiBwU3JjRHN0IHRvIHRlbXBWYWwyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBuZXh0IHR3byB2YWx1ZXMgdG8gdGVtcFZhbDQzCisgICAgICAgIFNVQkVRICAgIFFQMSxRUCwjMSAgICAgICAgICAgICAgICA7Ly8gUVAxPVFQIGlmIFFQIGlzIG9kZCAsIFFQMT1RUC0xIGlmIFFQIGlzIGV2ZW4KKyAgICAgICAgTU9WTkUgICAgUVAxLFFQCisgICAgICAgIE1PViAgICAgIHR3bywjMgorICAgICAgICAKKyAgICAgICAgCisKK0xvb3AKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTTVVMQkIgICBYMix0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwobG93ZXIgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwICAgICAgICAgICAgICAgICA7Ly8gWDI9YWJzb2x1dGV2YWwoZmlyc3QgdmFsKQorICAgICAgICBTTUxBQkJORSBYMixRUCxYMixRUDEgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAgaWYgUVAgaXMgb2RkIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFgyPTIqYWJzdmFsKGZpcnN0IHZhbCkqUVArUVAtMSBpZiBRUCBpcyBldmVuIAorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsMjEsdHdvICAgICAgICAgOy8vIFgzPSBzZWNvbmQgdmFsKHRvcCAxNiBiaXRzIG9mIHRhbXBWYWwyMSkqMgorICAgICAgICBSU0JMVCAgICBYMixYMiwjMAorICAgICAgICAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBTTUxBQkJORSBYMyxRUCxYMyxRUDEKKyAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDEsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MVswLTE1XT1YMlswLTE1XSxSZXN1bHQxWzE2LTMxXT1YM1sxNi0zMV0KKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDQzLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDQzKSoyCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDEsIzEyLFJlc3VsdDEgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgQ01QICAgICAgWDIsIzAKKyAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTEUgICAgWDIsWDIsIzAKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxCisgICAgICAgIFNNVUxUQiAgIFgzLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgQ01QICAgICAgWDMsIzAKKyAgICAgICAgCisgICAgICAgIExEUkQgICAgIHRlbXBWYWwyMSxbcFNyY0RzdCwjOF0gICA7Ly8gTG9hZCBuZXh0IGZvdXIgVmFsdWVzIHRvIHRlbXBWYWwyMSx0ZW1wVmFsNDMKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFBLSEJUICAgIFJlc3VsdDIsWDIsWDMsTFNMICMxNiAgICA7Ly8gUmVzdWx0MlswLTE1XT1YMlswLTE1XSxSZXN1bHQyWzE2LTMxXT1YM1swLTE1XQorICAgICAgICBTU0FUMTYgICBSZXN1bHQyLCMxMixSZXN1bHQyICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIAorICAgICAgICBTVUJTICAgICBDb3VudCxDb3VudCwjNCAgICAgICAgICAgOy8vIERlY3JlbWVudCBDb3VudCBieSA0IGFuZCBjb250aW51ZSBpZiBpdCBoYXMgbm90IHJlYWNoZWQgMCAgICAgICAgIAorICAgICAgICBTVFJEICAgICBSZXN1bHQxLFtwU3JjRHN0XSwjOCAgICAgOy8vIFN0b3JlIERvdWJsZSB3b3JkcyBhbmQgaW5jcmVtZW50IHRoZSBwb2ludGVyIHRvIHBvaW50IHRoZSBuZXh0IHN0b3JlIGFkZHJlc3MKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIEJHVCAgICAgIExvb3AKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjhlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKQEAgLTAsMCArMSwxODggQEAKKzsvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDJfUXVhbnRJbnZJbnRyYV9JX3MucworOyAqIE9wZW5NQVggREw6IHYxLjAuMgorOyAqIFJldmlzaW9uOiAgIDk2NDEKKzsgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorOyAqIAorOyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOyAqIAorOyAqIAorOyAqCis7ICogRGVzY3JpcHRpb246IAorOyAqIENvbnRhaW5zIG1vZHVsZXMgZm9yIGludGVyIHJlY29uc3RydWN0aW9uCis7ICogCis7ICoKKzsgKgorOyAqCis7ICoKKzsgKiAKKzsgKiBGdW5jdGlvbjogb214VkNNNFAyX1F1YW50SW52SW50cmFfSQorOyAqCis7ICogRGVzY3JpcHRpb246Cis7ICogUGVyZm9ybXMgaW52ZXJzZSBxdWFudGl6YXRpb24gb24gaW50cmEvaW50ZXIgY29kZWQgYmxvY2suCis7ICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBiaXRzX3Blcl9waXhlbCA9IDguIE1pc21hdGNoIGNvbnRyb2wKKzsgKiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCBNUEVHLTQgbW9kZSBpbnZlcnNlIHF1YW50aXphdGlvbiBtZXRob2QuCis7ICogVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gdGhlIHJhbmdlOiBbLTIwNDgsIDIwNDddLgorOyAqIE1pc21hdGNoIGNvbnRyb2wgaXMgcGVyZm9ybWVkIGZvciB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGl6YXRpb24gbWV0aG9kLgorOyAqCis7ICogUmVtYXJrczoKKzsgKgorOyAqIFBhcmFtZXRlcnM6Cis7ICogW2luXSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCAocXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gTXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuCis7ICogW2luXSAgICBRUCAgICAgICAgICAgIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXNlcl9zY2FsZSkKKzsgKiBbaW5dICAgIHZpZGVvQ29tcCAgICAgICAgICAoSW50cmEgdmVyc2lvbiBvbmx5LikgVmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlCis7ICogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZsYWdzOgorOyAqICAgICAgICAgICAgICAgICAgICBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UsCis7ICogICAgICAgICAgICAgICAgICAgIE9NWF9WQ19BTFBIQS4KKzsgKiBbaW5dICAgIHNob3J0VmlkZW9IZWFkZXIgIGEgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsKKzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwKKzsgKiAgICAgICAgICAgICAgICAgICAgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub25saW5lYXIgaW50cmEgREMgbW9kZS4KKzsgKiBbb3V0XSAgICBwU3JjRHN0ICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgKGRlcXVhbnRpemVkKSBpbnRyYS9pbnRlciBibG9jay4gIE11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLgorOyAqCis7ICogUmV0dXJuIFZhbHVlOgorOyAqIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvcgorOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworOyAqICAgIC0gICAgSWYgcFNyY0RzdCBpcyBOVUxMIG9yIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuCis7ICogICAgICBvcgorOyAqICAgIC0gSWYgUVAgPD0gMC4KKzsgKiAgICAgIG9yCis7ICogICAgLSB2aWRlb0NvbXAgaXMgbm9uZSBvZiBPTVhfVkNfTFVNSU5BTkNFLCBPTVhfVkNfQ0hST01JTkFOQ0UgYW5kIE9NWF9WQ19BTFBIQS4KKzsgKgorIAorCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgCisgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgCisgICAKKyAgIElNUE9SVCAgICAgICAgYXJtVkNNNFAyX0RDU2NhbGVyCisgCisgICAgICAgICAKKworICAgICBJRiBBUk0xMTM2SlMKKworOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjRHN0ICAgICAgICAgICAgUk4gMAorUVAgICAgICAgICAgICAgICAgIFJOIDEKK3ZpZGVvQ29tcCAgICAgICAgICBSTiAyCitzaG9ydFZpZGVvSGVhZGVyICAgUk4gMworCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK1JldHVybiAgICAgICAgICAgICBSTiAwCitkY1NjYWxlciAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgIFJOIDEyCitpbmRleCAgICAgICAgICAgICAgUk4gNgorICAgICAgCit0ZW1wVmFsMjEgICAgICAgICAgUk4gNAordGVtcFZhbDQzICAgICAgICAgIFJOIDUKK1FQMSAgICAgICAgICAgICAgICBSTiA2CitYMiAgICAgICAgICAgICAgICAgUk4gNworWDMgICAgICAgICAgICAgICAgIFJOIDE0CitSZXN1bHQxICAgICAgICAgICAgUk4gOAorUmVzdWx0MiAgICAgICAgICAgIFJOIDkKK3R3byAgICAgICAgICAgICAgICBSTiAxMAorQ291bnQgICAgICAgICAgICAgIFJOIDExCisKKworCisgICAKKyAgICBNX1NUQVJUIG9teFZDTTRQMl9RdWFudEludkludHJhX0kscjExCisKKworICAgICAgICAKKyAgICAgICAgOy8vIFBlcmZvcm0gSW52ZXJzZSBRdWFudGl6YXRpb24gZm9yIERDIGNvZWZmaWNpZW50CisKKyAgICAgICAgVEVRICAgICAgIHNob3J0VmlkZW9IZWFkZXIsIzAgICAgICA7Ly8gVGVzdCBpZiBzaG9ydCBWaWRlbyBIZWFkZXIgZmxhZyA9MCAgICAgICAgICAgICAKKyAgICAgICAgTU9WTkUgICAgIGRjU2NhbGVyLCM4ICAgICAgICAgICAgICA7Ly8gaWYgc2hvcnRWaWRlb0hlYWRlciBpcyBub24gemVybyBkY1NjYWxlcj04CisgICAgICAgIEJORSAgICAgICBjYWxEQ1ZhbAorICAgICAgICBMRFIgICAgICAgaW5kZXgsID1hcm1WQ000UDJfRENTY2FsZXIKKyAgICAgIEFERCAgICAgICBpbmRleCxpbmRleCx2aWRlb0NvbXAsTFNMICM1CisgICAgICBMRFJCICAgICAgZGNTY2FsZXIsW2luZGV4LFFQXQorCisKKyAgICAgICAgOy8vTV9DYWxEQ1NjYWxhciAgc2hvcnRWaWRlb0hlYWRlcix2aWRlb0NvbXAsIFFQCisKK2NhbERDVmFsCisKKyAgICAgICAgTERSSCAgICAgdGVtcCxbcFNyY0RzdF0KKyAgICAgICAgU01VTEJCICAgdGVtcCx0ZW1wLGRjU2NhbGVyICAgICAgIDsvLyBkY0NvZWZmID0gZGNTY2FsZXIgKiBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQoZnJvbSBtZW1vcnkpCisgICAgICAgIFNTQVQgICAgIHRlbXAsIzEyLHRlbXAgICAgICAgICAgICA7Ly8gU2F0dXJhdGluZyB0byAxMiBiaXRzCisgICAgICAgIAorCisgICAgICAgIE1PViAgICAgIENvdW50LCM2NAorICAgICAgICBUU1QgICAgICBRUCwjMQorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3RdICAgICAgOy8vIExvYWRzIGZpcnN0IHR3byB2YWx1ZXMgb2YgcFNyY0RzdCB0byB0ZW1wVmFsMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbmV4dCB0d28gdmFsdWVzIHRvIHRlbXBWYWw0MworICAgICAgICBTVUJFUSAgICBRUDEsUVAsIzEgICAgICAgICAgICAgICAgOy8vIFFQMT1RUCBpZiBRUCBpcyBvZGQgLCBRUDE9UVAtMSBpZiBRUCBpcyBldmVuCisgICAgICAgIE1PVk5FICAgIFFQMSxRUAorICAgICAgICBNT1YgICAgICB0d28sIzIKKworCisgICAgICAgICAgICAgICAgCisgICAgICAgIAorCitMb29wCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU01VTEJCICAgWDIsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMj0gZmlyc3QgdmFsKGxvd2VyIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMixYMiwjMCAgICAgICAgICAgICAgICAgOy8vIFgyPWFic29sdXRldmFsKGZpcnN0IHZhbCkKKyAgICAgICAgU01MQUJCTkUgWDIsUVAsWDIsUVAxICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQIGlmIFFQIGlzIG9kZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBYMj0yKmFic3ZhbChmaXJzdCB2YWwpKlFQK1FQLTEgaWYgUVAgaXMgZXZlbiAKKyAgICAgICAgU01VTFRCICAgWDMsdGVtcFZhbDIxLHR3byAgICAgICAgIDsvLyBYMz0gc2Vjb25kIHZhbCh0b3AgMTYgYml0cyBvZiB0YW1wVmFsMjEpKjIKKyAgICAgICAgUlNCTFQgICAgWDIsWDIsIzAKKyAgICAgICAgCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgICAgICAgICAKKyAgICAgICAgUlNCTFQgICAgWDMsWDMsIzAKKyAgICAgICAgU01MQUJCTkUgWDMsUVAsWDMsUVAxCisgICAgICAgIAorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQxLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDFbMC0xNV09WDJbMC0xNV0sUmVzdWx0MVsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNNVUxCQiAgIFgyLHRlbXBWYWw0Myx0d28gICAgICAgICA7Ly8gWDI9IGZpcnN0IHZhbChsb3dlciAxNiBiaXRzIG9mIHRhbXBWYWw0MykqMgorICAgICAgICBTU0FUMTYgICBSZXN1bHQxLCMxMixSZXN1bHQxICAgICAgOy8vIGNsaXAgdG8gcmFuZ2UgWy0yMDQ4LDIwNDddCisgICAgICAgIENNUCAgICAgIFgyLCMwCisgICAgICAgCisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxFICAgIFgyLFgyLCMwCisgICAgICAgIFNNTEFCQk5FIFgyLFFQLFgyLFFQMQorICAgICAgICBTTVVMVEIgICBYMyx0ZW1wVmFsNDMsdHdvICAgICAgICAgOy8vIFgyPSBmaXJzdCB2YWwodG9wIDE2IGJpdHMgb2YgdGFtcFZhbDIxKSoyCisgICAgICAgIFJTQkxUICAgIFgyLFgyLCMwCisgICAgICAgIENNUCAgICAgIFgzLCMwCisgICAgICAgIAorICAgICAgICBMRFJEICAgICB0ZW1wVmFsMjEsW3BTcmNEc3QsIzhdICAgOy8vIExvYWQgbmV4dCBmb3VyIFZhbHVlcyB0byB0ZW1wVmFsMjEsdGVtcFZhbDQzCisgICAgICAgICAgICAgICAgCisgICAgICAgIFJTQkxUICAgIFgzLFgzLCMwCisgICAgICAgIFNNTEFCQk5FIFgzLFFQLFgzLFFQMQorICAgICAgICBSU0JMVCAgICBYMyxYMywjMAorICAgICAgICBQS0hCVCAgICBSZXN1bHQyLFgyLFgzLExTTCAjMTYgICAgOy8vIFJlc3VsdDJbMC0xNV09WDJbMC0xNV0sUmVzdWx0MlsxNi0zMV09WDNbMTYtMzFdCisgICAgICAgIFNTQVQxNiAgIFJlc3VsdDIsIzEyLFJlc3VsdDIgICAgICA7Ly8gY2xpcCB0byByYW5nZSBbLTIwNDgsMjA0N10KKyAgICAgICAgCisgICAgICAgIFNVQlMgICAgIENvdW50LENvdW50LCM0ICAgICAgICAgICA7Ly8gRGVjcmVtZW50IENvdW50IGJ5IDQgYW5kIGNvbnRpbnVlIGlmIGl0IGhhcyBub3QgcmVhY2hlZCAwICAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFJlc3VsdDEsW3BTcmNEc3RdLCM4ICAgICA7Ly8gU3RvcmUgRG91YmxlIHdvcmRzIGFuZCBpbmNyZW1lbnQgdGhlIHBvaW50ZXIgdG8gcG9pbnQgdGhlIG5leHQgc3RvcmUgYWRkcmVzcworICAgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgQkdUICAgICAgTG9vcAorCisgICAgICAgIFNVQiAgICAgIHBTcmNEc3QscFNyY0RzdCwjMTI4CisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmluZyB0aGUgSW52ZXJzZSBRdWFudGl6ZWQgREMgY29lZmZpY2llbnQKKworICAgICAgICBTVFJIICAgICB0ZW1wLFtwU3JjRHN0XSwjMgorICAgICAgICAKKyAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICBSZXR1cm4sI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBFTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtMTEvdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzNjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybTExL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKQEAgLTAsMCArMSw2IEBACisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NX1ZlcnNpb24uaCIKKworI2lmZGVmIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCitjb25zdCBjaGFyICogY29uc3Qgb214VkNfVmVyc2lvbkRlc2NyaXB0aW9uID0gIkFSTSBPcGVuTUFYIERMIHYiIEFSTV9WRVJTSU9OX1NUUklORyAiICAgUmVsPSIgT01YX0FSTV9SRUxFQVNFX1RBRyAiICAgQXJjaD0iIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICIgICBUb29scz0iICBPTVhfQVJNX0JVSUxEX1RPT0xDSEFJTiA7CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9ERUxJVkVSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2MyZDcwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fREVMSVZFUlkuVFhUCkBAIC0wLDAgKzEsNjMgQEAKK1RoZSBjb250ZW50cyBvZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjcmVhdGVkIGJ5IEhlZGxleSBGcmFuY2lzCitvZiBBUk0gb24gMTktRmViLTIwMDguCisKK0l0IGNvbnRhaW5zIHRoZSBBUk0gZGF0YSB2ZXJzaW9ucyBsaXN0ZWQgYmVsb3cuCisKK1RoaXMgZGF0YSwgdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQsIGlzIEFSTSBQcm9wcmlldGFyeSBhbmQgYWNjZXNzIHRvIGl0CitpcyBzdWJqZWN0IHRvIHRoZSBhZ3JlZW1lbnRzIGluZGljYXRlZCBiZWxvdy4KKworSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgd2l0aCB0aGlzIGRhdGEsIHBsZWFzZSBjb250YWN0IEFSTSBzdXBwb3J0CitxdW90aW5nIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSA8OTc0MTQ+LgorCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKKy0gT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEKKyAgVmlkZW8gY29kZWNzIC0gb3B0aW1pc2VkIGNvZGUKKyAgVjcgY29kZSByZWxlYXNlIGZvciBIYW50cm8gKFZlciAxLjAuMikKKyAgaW50ZXJuYWwgYWNjZXNzCisKKyAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworVGhpcyB0cmFuc2FjdGlvbiBjb250YWlucyBkZWxpdmVyYWJsZXMgd2hpY2ggYXJlIGRlc2lnbmF0ZWQgYXMgYmVpbmcgb2YKK2JldGEgcmVsZWFzZSBzdGF0dXMgKEJFVCkuCisKK0JldGEgcmVsZWFzZSBzdGF0dXMgaGFzIGEgcGFydGljdWxhciBtZWFuaW5nIHRvIEFSTSBvZiB3aGljaCB0aGUgcmVjaXBpZW50CittdXN0IGJlIGF3YXJlLiBCZXRhIGlzIGEgcHJlLXJlbGVhc2Ugc3RhdHVzIGluZGljYXRpbmcgdGhhdCB0aGUgZGVsaXZlcmFibGUKK3NvIGRlc2NyaWJlZCBpcyBiZWxpZXZlZCB0byByb2J1c3RseSBkZW1vbnN0cmF0ZSBzcGVjaWZpZWQgYmVoYXZpb3VyLCB0byBiZQorY29uc2lzdGVudCBhY3Jvc3MgaXRzIGluY2x1ZGVkIGFzcGVjdHMgYW5kIGJlIHJlYWR5IGZvciBnZW5lcmFsIGRlcGxveW1lbnQuCitCdXQgQmV0YSBhbHNvIGluZGljYXRlcyB0aGF0IHByZS1yZWxlYXNlIHJlbGlhYmlsaXR5IHRyaWFscyBhcmUgb25nb2luZyBhbmQKK3RoYXQgaXQgaXMgcG9zc2libGUgcmVzaWR1YWwgZGVmZWN0cyBvciBlcnJvcnMgaW4gb3BlcmF0aW9uLCBjb25zaXN0ZW5jeQorYW5kIGRvY3VtZW50YXRpb24gbWF5IHN0aWxsIGJlIGVuY291bnRlcmVkLiBUaGUgcmVjaXBpZW50IHNob3VsZCBjb25zaWRlcgordGhpcyBwb3NpdGlvbiB3aGVuIHVzaW5nIHRoaXMgQmV0YSBtYXRlcmlhbCBzdXBwbGllZC4gQVJNIHdpbGwgbm9ybWFsbHkKK2F0dGVtcHQgdG8gcHJvdmlkZSBmaXhlcyBvciBhIHdvcmstYXJvdW5kIGZvciBkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlCityZWNpcGllbnQsIGJ1dCB0aGUgcHJvdmlzaW9uIG9yIHRpbWVsaW5lc3Mgb2YgdGhpcyBzdXBwb3J0IGNhbm5vdCBiZQorZ3VhcmFudGVlZC4gQVJNIHNoYWxsIG5vdCBiZSByZXNwb25zaWJsZSBmb3IgZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwKK2RhbWFnZXMgYXMgYSByZXN1bHQgb2YgZW5jb3VudGVyaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlc2lkdWFsIGRlZmVjdHMuCitCeSBhY2NlcHRpbmcgYSBCZXRhIHJlbGVhc2UsIHRoZSByZWNpcGllbnQgYWdyZWVzIHRvIHRoZXNlIGNvbnN0cmFpbnRzIGFuZAordG8gcHJvdmlkaW5nIHJlYXNvbmFibGUgaW5mb3JtYXRpb24gdG8gQVJNIHRvIGVuYWJsZSB0aGUgcmVwbGljYXRpb24gb2YgdGhlCitkZWZlY3RzIGlkZW50aWZpZWQgYnkgdGhlIHJlY2lwaWVudC4gVGhlIHNwZWNpZmljIEJldGEgdmVyc2lvbiBzdXBwbGllZAord2lsbCBub3QgYmUgc3VwcG9ydGVkIGFmdGVyIHJlbGVhc2Ugb2YgYSBsYXRlciBvciBoaWdoZXIgc3RhdHVzIHZlcnNpb24uCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBTdXBwb3J0IGZvciB0aGUgQmV0YSByZWxlYXNlIG9mIHRoZSBkZWxpdmVyYWJsZQord2lsbCBvbmx5IGJlIHByb3ZpZGVkIGJ5IEFSTSB0byBhIHJlY2lwaWVudCB3aG8gaGFzIGEgY3VycmVudCBzdXBwb3J0IGFuZAorbWFpbnRlbmFuY2UgY29udHJhY3QgZm9yIHRoZSBkZWxpdmVyYWJsZS4KKworCisgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0luIGFkZGl0aW9uIHRvIHRoZSBkYXRhIHZlcnNpb25zIGxpc3RlZCBhYm92ZSwgdGhpcyB0cmFuc2FjdGlvbiBjb250YWlucwordHdvIGFkZGl0aW9uYWwgZmlsZXMgYXQgdGhlIHRvcCBsZXZlbC4KKworVGhlIGZpcnN0IGlzIHRoaXMgZmlsZSwgQVJNX0RFTElWRVJZXzk3NDE0LlRYVCwgd2hpY2ggaXMgdGhlIGRlbGl2ZXJ5Citub3RlLgorCitUaGUgc2Vjb25kIGlzIEFSTV9NQU5JRkVTVF85NzQxNC5UWFQgd2hpY2ggY29udGFpbnMgYSBtYW5pZmVzdCBvZiBhbGwgdGhlCitmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIGNoZWNrc3Vtcy4KKworVGhlIGNoZWNrc3VtcyBwcm92aWRlZCBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KK01ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0uCisKK1RoZSBjaGVja3N1bXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhpcyBkYXRhIHVzaW5nIHRoZQorIm1kNXN1bSIgdG9vbCAod2hpY2ggaXMgcGFydCBvZiB0aGUgR05VICJ0ZXh0dXRpbHMiIHBhY2thZ2UpIGJ5IHJ1bm5pbmc6CisKKyAgJSBtZDVzdW0gLS1jaGVjayBBUk1fTUFOSUZFU1RfOTc0MTQuVFhUCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL0FSTV9NQU5JRkVTVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODMxMGY2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9BUk1fTUFOSUZFU1QuVFhUCkBAIC0wLDAgKzEsOTEgQEAKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpLworZTA0OTc5MWNmYWI2MDYwYTA4Y2JhYzdiM2FkNzY3ZDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX3MuaAorZWQ3OThmYWNlMjU0OTdiMjcwM2VkZTczNmQ2ZDUyYjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9vbXh0eXBlc19zLmgKKzRlZWJkNjNhZjA4NzM3NjgxMWQ2NzQ5ZjA2NDZiODY0ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCis0M2NmNDZjMmNmMmZlMWY5M2M2MTViNTdiY2JlNDgwOSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU0uaAorOGYyNDhjZWFhYzhmNjAyZTI3N2E1MjFiNjc5ZGNiYmUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCis4YWM1ZmE4MGVhOThlMzkxZjU3MzBhMzc1MjgwYjViZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fVmVyc2lvbi5oCiszYTJmNDIwZGRmNmExYjk1MDQ3MGJkMGY1ZWJkNWM2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybUNPTU1fSURDVF9zLmgKKzUxMWMwYmI1MzRmZTIyMzU5OWUyYzg0ZWZmMjRjOWVkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9hcGkvYXJtQ09NTV9NYXNrVGFibGUuaAorODk3MTkzMmQ1NmVlZDZiMWFkMWJhNTA3ZjBiZmY1ZjAgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCitmODdmZWRkOWNhNDMyZmVmYTc1NzAwODE3Njg2NGVmOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL2FybU9NWC5oCis4ZTQ5ODk5YTQyODgyMmMzNmVmOWRkOTRlMGUwNWYxOCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvYXBpL29teHR5cGVzLmgKKzMyMzAwOGI3MmU5ZjA0MDk5YThjYjQyZTk5YTFmYWNlICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS9idWlsZF92Yy5wbAorZTcyZDk2YzBhNDE1NDU5NzQ4ZGY5ODA3ZjNkYWU3MmYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL2ZpbGVsaXN0X3ZjLnR4dAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjLworNWVlYWU2NTlhMjk0NzdmNWM1MjI5NmQyNGFmZmZkM2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCitkNjRjZGNmMzhmNzc0OWRjN2Y3NzQ2NWU1YjdkMzU2ZCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvCitlN2UwYzMyMDk3ODU2NGE3YzliMmM3MjM3NDlhOThkNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuYworNGFkY2QwZGYwODE5OTBiZGZjNDcyOTA0MWEyYTkxNTIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKKzg1MmUwNDA0MTQyOTY1ZGMxZjNhYTdmMDBlZTUxMjdiICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzcwNTQxNTFjNWJmZWE2YjVlNzRmZWVlODZiMmQ3YjAxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCis1ZjcyMTNhNGYzNzYyN2IzYzU4ZjYyOTRiYTQ3N2UzMCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVxdWFudFRhYmxlc19zLnMKKzMyZmY0YjhiZTYyZTJmMGYzZTc2NGI4M2MxZTVlMmZkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYworZDA2NmUzYzgxZDgyNjE2ZjM3ZWMxODEwZWE0OWU3YjcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKK2ZlNjI5YTNlOWQ1NTM5NWE2MDk4YmRmMjQzMWI1ZjAyICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzViMTNmYjk1NGI3Njc5ZGUyMDA3NmJiNmE3ZjRlZTFkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCiswMWJhNjBlZmY2NmVhNDlhNGY4MzNjZTYyNzlmOGUyZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5jCitmYTEwNzJjZjFkMTdlOTY2NmM5ZjFlMjE1ZmEzMDJiMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MucworZGIzODdiOWU2NmQzMjc4N2Y0N2VmOWNmMDM0N2RhMmEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCitlYTUzN2U0ZTJhZDAzYTE5NDA5ODEwNTVmYTNhY2UwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworMjlhNDI4Mzg4NWI5NDczYTM1NTBhODFlZmYyNTU5ZDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworMmRkY2FmNjBhOGVhMWU2ZTZiNzc3MzdmNzY4YmZiOWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworYzMwMDJhYWQ1NjAwZjg3MmI3MGE1ZDdmZTM5MTU4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCithMjkwMGYyYzQ3ZjFjNjFkMjBiZDZjMWVkYTMzZDZkNCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworYzkyMWRmNzMzOTdhMzJjOTQ3ZGM5OTZiYTY4NTg1NTMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5zCiszNzY5ZTE0ZjJmYzNmNTE0ZDAyNWZlNmFiNzNmZjY3YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MucworYzAyOWQxY2ViZWEwYTA5ZTFkMjM1YTM3ZTIxNTUwMDIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucworMDc2YTAzM2Y4MTYxNzUwYTY4NTc1NmY5ZjUxZjA0YzkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5zCitjNWI1ZDIyODQyODIyZTZlNWUzMTA5NDg4MmNiZWI0NiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucworZjZiZGY2ZDkxNGE0YTE0NzlmNTI0OTUxYTM0MDk4NDYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworZWJlYjA3MTNhOWIyZWEyNTk4NjM2MGVmMjYyMTM4YzQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKKzc4ZWQ5ZWEyMDBmYWE3YmU2NjU0NDVhNzEzODU5YWYxICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5zCitjMmQ5OTVmNzg3YjZmNDRlZjEwYzc1MWMxMmQxOTM1ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKzQwYmVkNjc5YTlmNmUwZDNlZmUyMTZiN2Q0YTljZjQ1ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MucworNGE1MmIzZTllMjY4YjhhOGYwNzgyOWJmNTAwZDAzYWYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKKzExMjQ5ZjhhOThjNWQ0Yjg0Y2I1NTc1YjBlMzdjYTljICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMKKzI1MTNiNjA1NTliYTcxYWU0OTVjNjA1M2ZiNzc5ZmE5ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisyZmIxZWUxN2MzNmUzYzE0NjljMTcwZjZkYWMxMWJmMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zCitjYzRhNmYzMmRiMGI3MmE5MWQzZjI3OGY2ODU1ZGY2OSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAxMC9hcGkvCis2ZTUzMGRkYWE3YzJiNTdmZmU4ODE2MmMwMjBjYjY2MiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMTAvYXBpL2FybVZDTTRQMTBfQ0FWTENUYWJsZXMuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi8KKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjLworYmVjNmRlMzQ4YjExMzQzODQ5ODg2N2I4NjkwMDE2MjIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKK2RiYTk4MjRlOTU5YjIxZDQwMWNhYzkyNWU2OGExMWE2ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyX3MucworZGZhN2U1YjU4MDI3YmUzNTQyZGRhMDU5M2I3N2IyZDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludHJhX0lfcy5zCis0ZmJhNGM0MzFhNzgzYTc4YTJlYjY0OTdhOTRhYzk2NyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1ppZ3phZ19UYWJsZXMuYworMzk5OTE5NjExNzljYTAzYjYzODFiNmU2NTNiMWYxNGIgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9NQ1JlY29uQmxvY2tfcy5zCisxYjBiMjk5MGMyNjY5ZGZiODdjZjZiODEwNjExYzAxYiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisxYzliODdhYmYzMjgzZTk1NzgxNmIzOTM3YzY4MDcwMSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVBhZE1WX1BWT1Bfcy5zCis0ZmUxYWZjYTY1OWE5MDU1ZmMxMTcyZTU4Zjc4YTUwNiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRyYS5jCisyZWEwNjdmMDQzNmY5MWJhMTM1MWVkYWY0MTFjYjRlYSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0xvb2t1cF9UYWJsZXMuYworNmNlMzYzYWFkYzlkNjVjMzA4YjQwY2NhODkwMmU0ZjYgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9JRENUOHg4YmxrX3MucworYmYyMTJmNzg2NzcyYWVkMmJjNzA1ZDIyZmY0ZTc0ZjUgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworMjkzYTQ4YTY0OGEzMDg1NDU2ZTY2NjViYjczNjZmYWQgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9TZXRQcmVkRGlyX3MucworMmJiNDdlZDljOWUyNWM1NzA5YzZkOWI0YWQzOWEzOGEgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9RdWFudEludkludGVyX0lfcy5zCis0MzdkZmEyMDQ1MDg4NTBkNjFkNGI4NzA5MTQ0NmU5ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworYmM5Nzc4ODk4ZGQ0MTEwMWRjMGZiMDEzOWVhZjgzY2MgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQ19zLnMKK2ZjMTkxZWVhZTQzZjhjZTczNWRiZDMxMWNjN2JjYjhkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9tNHAyL3NyYy9vbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhX3MucworYTBkODVmNGY1MTdjOTQ1YTRjOTMxN2FjMDIxZjJkMDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL2FybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlX3MucworMzg2MDIwZGVlOGI3MjVjN2ZlMjUyNmYxZmMyMTFkN2QgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIuYworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvCis0NjI0ZTdjODM4ZTEwYTI0OWFiY2MzZDNmNGY0MDc0OCAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCis2NWUxMDU3ZDA0ZTJjYjg0NDU1OWRjOWY2ZTA5Nzk1YSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaAorCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvc3JjLworZTYyN2IzMzQ2YjBkYzlhZmYxNDQ0NjAwNWNlMGZhNDMgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL3NyYy9hcm1WQ19WZXJzaW9uLmMKKwkJCQkgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS8KKzdjYTk0YjFjMzNhYzAyMTFlMTdkMzhiYWFkZDdkMWRkICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9hcGkvYXJtVkMuaAorMTJjZjc1OTZlZGJiZjYwNDhiNjI2ZDE1ZThkMGVkNDggIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9vbXhWQy5oCisxMTcyNmUyODZhODEyNTdjYjQ1ZjU1NDdmYjRkMzc0YyAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvYXBpL29teFZDX3MuaAorYTViMmFmNjA1YzMxOWNkMjQ5MTMxOWU0MzA3NDEzNzcgIE9YMDAyLVNXLTk4MDEwLXIwcDAtMDBiZXQxL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCisJCQkJICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tLworCQkJCSAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvCisxZjgxMTg3YjQ4NDg3YThlYTZkYmMzMjc2NDhlM2U0ZiAgT1gwMDItU1ctOTgwMTAtcjBwMC0wMGJldDEvdmMvY29tbS9zcmMvb214VkNDT01NX0NvcHkxNngxNl9zLnMKKzkzNmQzZjIwMzhhNmY4NjEzZWMyNWU1MGNjNjAxZmU4ICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKzhmNjcwOGEyNDkxMzA5NjJlMGJjNWMwNDRhYzZkZDkzICBPWDAwMi1TVy05ODAxMC1yMHAwLTAwYmV0MS92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKK2FhYjc3MTM0MTQ0MjhlOTVkZTBiYTc5OWEyNjc5YjM2ICBBUk1fREVMSVZFUllfOTc0MTQuVFhUCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY0YzE5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU0uaApAQCAtMCwwICsxLDc4NSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU0uaAorICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqICAgCisgKiBGaWxlOiBhcm1DT01NLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBDb21tb24gQVBJcy9EYXRhIFR5cGVzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqCisgKi8KKyAKKyAgCisjaWZuZGVmIF9hcm1Db21tb25fSF8KKyNkZWZpbmUgX2FybUNvbW1vbl9IXworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0YzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkMzMjsgLyoqIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX0Y2NCBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfRjY0IEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisgICAgICAgIAorfSBPTVhfRkM2NDsgLyoqIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBVc2VkIGJ5IGJvdGggSVAgYW5kIElDIGRvbWFpbnMgZm9yIDh4OCBKUEVHIGJsb2Nrcy4gKi8KK3R5cGVkZWYgT01YX1MxNiBBUk1fQkxPQ0s4eDhbNjRdOworCisKKyNpbmNsdWRlICJhcm1PTVguaCIKKworI2RlZmluZSAgYXJtUEkgKE9NWF9GNjQpKDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb21waWxlciBleHRlbnNpb25zICovCisjaWZkZWYgQVJNX0RFQlVHCisvKiBkZWJ1ZyB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgYXJtRXJyb3Ioc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpOyBleGl0KC0xKTt9CisjZGVmaW5lIGFybVdhcm4oc3RyKSB7cHJpbnRmKChzdHIpKTsgcHJpbnRmKCJcbiIpO30KKyNkZWZpbmUgYXJtSWdub3JlKGEpICgodm9pZClhKQorI2RlZmluZSBhcm1Bc3NlcnQoYSkgYXNzZXJ0KGEpCisjZWxzZSAKKy8qIHJlbGVhc2UgdmVyc2lvbiAqLworI2RlZmluZSBhcm1FcnJvcihzdHIpICgodm9pZCkgKHN0cikpCisjZGVmaW5lIGFybVdhcm4oc3RyKSAgKCh2b2lkKSAoc3RyKSkKKyNkZWZpbmUgYXJtSWdub3JlKGEpICAoKHZvaWQpIChhKSkKKyNkZWZpbmUgYXJtQXNzZXJ0KGEpICAoKHZvaWQpIChhKSkKKyNlbmRpZiAvKiBBUk1fREVCVUcgKi8KKworLyogQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKyNkZWZpbmUgYXJtTWluKGEsYikgICAgICAgICAgICAgKCAoYSkgPiAoYikgPyAgKGIpOihhKSApCisjZGVmaW5lIGFybU1heChhLGIpICAgICAgICAgICAgICggKGEpID4gKGIpID8gIChhKTooYikgKQorI2RlZmluZSBhcm1BYnMoYSkgICAgICAgICAgICAgICAoIChhKSA8ICAwICA/IC0oYSk6KGEpICkKKworLyogQWxpZ25tZW50IG9wZXJhdGlvbiAqLworCisjZGVmaW5lIGFybUFsaWduVG9CeXRlcyhQdHIsTikgICAgICAoUHRyICsgKCAoKE4tKGludClQdHIpJihOLTEpKSAvIHNpemVvZigqUHRyKSApKQorI2RlZmluZSBhcm1BbGlnblRvMkJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwyKQorI2RlZmluZSBhcm1BbGlnblRvNEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw0KQorI2RlZmluZSBhcm1BbGlnblRvOEJ5dGVzKFB0cikgICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciw4KQorI2RlZmluZSBhcm1BbGlnblRvMTZCeXRlcyhQdHIpICAgICAgYXJtQWxpZ25Ub0J5dGVzKFB0ciwxNikKKworLyogRXJyb3IgYW5kIEFsaWdubWVudCBjaGVjayAqLworCisjZGVmaW5lIGFybVJldEFyZ0VycklmKGNvbmRpdGlvbiwgY29kZSkgIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisjZGVmaW5lIGFybVJldERhdGFFcnJJZihjb25kaXRpb24sIGNvZGUpIGlmKGNvbmRpdGlvbikgeyByZXR1cm4gKGNvZGUpOyB9CisKKyNpZm5kZWYgQUxJR05NRU5UX0RPRVNOVF9NQVRURVIKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgoKChpbnQpKFB0cikpICUgTik9PTApCisjZGVmaW5lIGFybU5vdEJ5dGVBbGlnbmVkKFB0cixOKSAgICAoKCgoaW50KShQdHIpKSAlIE4pIT0wKQorI2Vsc2UKKyNkZWZpbmUgYXJtSXNCeXRlQWxpZ25lZChQdHIsTikgICAgICgxKQorI2RlZmluZSBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsTikgICAgKDApCisjZW5kaWYKKworI2RlZmluZSBhcm1JczJCeXRlQWxpZ25lZChQdHIpICAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMikKKyNkZWZpbmUgYXJtSXM0Qnl0ZUFsaWduZWQoUHRyKSAgICAgIGFybUlzQnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybUlzOEJ5dGVBbGlnbmVkKFB0cikgICAgICBhcm1Jc0J5dGVBbGlnbmVkKFB0ciw4KQorI2RlZmluZSBhcm1JczE2Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtSXNCeXRlQWxpZ25lZChQdHIsMTYpCisKKyNkZWZpbmUgYXJtTm90MkJ5dGVBbGlnbmVkKFB0cikgICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwyKQorI2RlZmluZSBhcm1Ob3Q0Qnl0ZUFsaWduZWQoUHRyKSAgICAgYXJtTm90Qnl0ZUFsaWduZWQoUHRyLDQpCisjZGVmaW5lIGFybU5vdDhCeXRlQWxpZ25lZChQdHIpICAgICBhcm1Ob3RCeXRlQWxpZ25lZChQdHIsOCkKKyNkZWZpbmUgYXJtTm90MTZCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwxNikKKyNkZWZpbmUgYXJtTm90MzJCeXRlQWxpZ25lZChQdHIpICAgIGFybU5vdEJ5dGVBbGlnbmVkKFB0ciwzMikKKworLyoqCisgKiBGdW5jdGlvbjogYXJtUm91bmRGbG9hdFRvUzE2X3JlZi9hcm1Sb3VuZEZsb2F0VG9TMzJfcmVmL2FybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSBzaG9ydCBpbnQvaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNi9PTVhfUzMyIGZvcm1hdAorICoKKyAqLworCitPTVhfUzE2IGFybVJvdW5kRmxvYXRUb1MxNiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzMyIGFybVJvdW5kRmxvYXRUb1MzMiAoT01YX0Y2NCBWYWx1ZSk7CitPTVhfUzY0IGFybVJvdW5kRmxvYXRUb1M2NCAoT01YX0Y2NCBWYWx1ZSk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1MxNl9yZWYvYXJtU2F0Um91bmRGbG9hdFRvUzMyCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludC9pbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfUzE2L09NWF9TMzIgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKTsKK09NWF9TMzIgYXJtU2F0Um91bmRGbG9hdFRvUzMyIChPTVhfRjY0IFZhbHVlKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvVTE2X3JlZi9hcm1TYXRSb3VuZEZsb2F0VG9VMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgdW5zaWduZWQgc2hvcnQgaW50L2ludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9VMTYvT01YX1UzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1UxNiBhcm1TYXRSb3VuZEZsb2F0VG9VMTYgKE9NWF9GNjQgVmFsdWUpOworT01YX1UzMiBhcm1TYXRSb3VuZEZsb2F0VG9VMzIgKE9NWF9GNjQgVmFsdWUpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorIAorT01YX0lOVCBhcm1TaWduQ2hlY2sgKE9NWF9TMTYgdmFyKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQ2xpcAorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9TMzIgYXJtQ2xpcCAoCisgICAgICAgIE9NWF9JTlQgbWluLAorICAgICAgICBPTVhfSU5UIG1heCwgCisgICAgICAgIE9NWF9TMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybUNsaXBfRjMyCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0YzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX0YzMiBhcm1DbGlwX0YzMiAoCisgICAgICAgIE9NWF9GMzIgbWluLAorICAgICAgICBPTVhfRjMyIG1heCwgCisgICAgICAgIE9NWF9GMzIgc3JjCisgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMigKKyAgICAgICAgT01YX0YzMiB2LCAKKyAgICAgICAgT01YX0lOVCBzaGlmdCwgCisgICAgICAgIE9NWF9JTlQgc2F0Qml0cworICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uczogYXJtU3dhcEVsZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gc3dhcHMgdHdvIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsb2NhdGlvbnMuCisgKiBUaGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQgY291bGQgYmUgYW55dGhpbmcgYXMgc3BlY2lmaWVkIGJ5IDxlbGVtU2l6ZT4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhSZXN1bHQgLS0gRXJyb3Igc3RhdHVzIGZyb20gdGhlIGZ1bmN0aW9uCisgKi8KK09NWFJlc3VsdCBhcm1Td2FwRWxlbShPTVhfVTggKnBCdWYxLCBPTVhfVTggKnBCdWYyLCBPTVhfSU5UIGVsZW1TaXplKTsKKworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1NZWRpYW5PZjMKKyAqCisgKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gZkVudHJ5ICAgICBGaXJzdCBlbnRyeQorICogW2luXSBzRW50cnkgICAgIHNlY29uZCBlbnRyeQorICogW2luXSB0RW50cnkgICAgIFRoaXJkIGVudHJ5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgdGhlIG1lZGlhbiB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1NZWRpYW5PZjMgKAorICAgIE9NWF9TMzIgZkVudHJ5LAorICAgIE9NWF9TMzIgc0VudHJ5LCAKKyAgICBPTVhfUzMyIHRFbnRyeSAKKyAgICApOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb2dTaXplCisgKgorICogRGVzY3JpcHRpb246IEZpbmRzIHRoZSBzaXplIG9mIGEgcG9zaXRpdmUgdmFsdWUgYW5kIHJldHVybnMgdGhlIHNhbWUKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSB2YWx1ZSAgICBQb3NpdGl2ZSB2YWx1ZQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9VOCAtLSAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBvc2l0aXZlIHZhbHVlCisgKi8gCisgCitPTVhfVTggYXJtTG9nU2l6ZSAoCisgICAgT01YX1UxNiB2YWx1ZSAKKyAgICApOyAgICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRBZGRfUzMyKAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUyCisgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0QWRkX1M2NCgpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIGFkZGl0aW9uIG9mIHRoZSB0d28gaW5wdXRzIFZhbHVlMSwgVmFsdWUyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBWYWx1ZTEgICAgICAgRmlyc3QgT3BlcmFuZAorICogW2luXSBWYWx1ZTIgICAgICAgU2Vjb25kIE9wZXJhbmQKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAKKyAqICAgIAorICoqLworCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTEsCisgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZTIKKyAgICAgICAgICAgICAgICApOworCisvKiogRnVuY3Rpb24gOmFybVNhdFN1Yl9TMzIoKQorICogCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBzdWJzdHJhY3Rpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICoqLworCitPTVhfUzMyIGFybVNhdFN1Yl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlMgorICAgICAgICAgICAgICAgICAgICApOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIE1hYywKKyAgICAgICAgICAgICAgICAgICAgT01YX1MxNiBWYWx1ZTEsCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgVmFsdWUyCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE1hY19TMTZTMzJfUzMyCisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIE1BQyBvcGVyYXRpb24gb2YgdGhlIHRocmVlIGlucHV0cyBkZWxheUVsZW0sIGZpbFRhcCAsIG1hYworICoKKyAqICAgbWFjID0gbWFjICsgU2F0dXJhdGVfaW5fMzJCaXRzKGRlbGF5RWxlbSAqIGZpbFRhcCkKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGRlbGF5RWxlbSAgICBGaXJzdCAzMiBiaXQgT3BlcmFuZAorICogW2luXSBmaWxUYXAgICAgICAgU2Vjb25kIDE2IGJpdCBPcGVyYW5kCisgKiBbaW5dIG1hYyAgICAgICAgICBSZXN1bHQgb2YgTUFDIG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICBtYWMgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRNYWNfUzE2UzMyX1MzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgbWFjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMzIgZGVsYXlFbGVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgZmlsVGFwICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHRTaGlmdCggKFJvdW5kKGlucHV0KSAsIHNjYWxlRmFjdG9yICkgKQorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQgICAgICAgVGhlIGlucHV0IHRvIGJlIG9wZXJhdGVkIG9uCisgKiBbaW5dIHNjYWxlRmFjdG9yIFRoZSBzaGlmdCBudW1iZXIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCisKK09NWF9TMTYgYXJtU2F0Um91bmRSaWdodFNoaWZ0X1MzMl9TMTYoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2NhbGVGYWN0b3IpOworCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGluZyBsZWZ0LXNoaWZ0IG9wZXJhdGlvbiBvbiBpbnB1dAorICogICAgIE9yIHJvdW5kZWQgUmlnaHQgc2hpZnQgaWYgdGhlIGlucHV0IFNoaWZ0IGlzIG5lZ2F0aXZlLgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gc2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworIAorT01YX1MzMiBhcm1TYXRSb3VuZExlZnRTaGlmdF9TMzIoCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX0lOVCBzaGlmdAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KAorICAgICAgICAgICAgICAgICAgICAgICAgT01YX1M2NCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JTlQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMxNlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMTYgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworCitPTVhfUzMyIGFybVNhdE11bFMxNlMzMl9TMzIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9TMTYgaW5wdXQxLAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0Mik7CisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdE11bFMzMlMzMl9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYSBTMzIgZGF0YSB0eXBlIG11bHRpcGxpZWQgd2l0aCBhbiBTMzIgZGF0YSB0eXBlCisgKiAgICAgaW4gYSBTMzIgY29udGFpbmVyCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dDEgICAgICAgT3BlcmFuZCAxCisgKiBbaW5dIGlucHV0MiAgICAgICBPcGVyYW5kIDIKKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKworT01YX1MzMiBhcm1TYXRNdWxTMzJTMzJfUzMyKAorICAgICAgICAgICAgICAgICAgICBPTVhfUzMyIGlucHV0MSwKKyAgICAgICAgICAgICAgICAgICAgT01YX1MzMiBpbnB1dDIpOworCisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIERlYnVnZ2luZyBtYWNyb3MKKyAqCisgKi8KKworCisvKgorICogRGVmaW5pdGlvbiBvZiBvdXRwdXQgc3RyZWFtIC0gY2hhbmdlIHRvIHN0ZGVyciBpZiBuZWNlc3NhcnkKKyAqLworI2RlZmluZSBERUJVR19TVFJFQU0gc3Rkb3V0CisKKy8qCisgKiBEZWJ1ZyBwcmludGYgbWFjcm9zLCBvbmUgZm9yIGVhY2ggYXJndW1lbnQgY291bnQuCisgKiBBZGQgbW9yZSBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBERUJVR19PTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzAoYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhKQorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIpCisjZGVmaW5lIERFQlVHX1BSSU5URl8yKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYykKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzMoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkKQorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUpCisjZGVmaW5lIERFQlVHX1BSSU5URl81KGEsIGIsIGMsIGQsIGUsIGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZikKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzYoYSwgYiwgYywgZCwgZSwgZiwgZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnKQorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpCisjZGVmaW5lIERFQlVHX1BSSU5URl84KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGkpICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzkoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaikgICAgICAgICAgICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqKQorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgICAgICAgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGspCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIGZwcmludGYoREVCVUdfU1RSRUFNLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtKQorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAgZnByaW50ZihERUJVR19TVFJFQU0sIGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4pCisjZGVmaW5lIERFQlVHX1BSSU5URl8xNChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsLCBtLCBuLCBvKSAgICBmcHJpbnRmKERFQlVHX1NUUkVBTSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbiwgbykKKyNlbHNlIC8qIERFQlVHX09OICovCisjZGVmaW5lIERFQlVHX1BSSU5URl8wKGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8zKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNChhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzUoYSwgYiwgYywgZCwgZSwgZikgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl82KGEsIGIsIGMsIGQsIGUsIGYsIGcpICAgICAgICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfNyhhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzgoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSkgICAgICAgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl85KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGopICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaykgICAgCisjZGVmaW5lIERFQlVHX1BSSU5URl8xMShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSAgICAgICAgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzEyKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0pICAgICAgICAgIAorI2RlZmluZSBERUJVR19QUklOVEZfMTMoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCwgbSwgbikgICAgICAKKyNkZWZpbmUgREVCVUdfUFJJTlRGXzE0KGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwsIG0sIG4sIG8pICAgCisjZW5kaWYgLyogREVCVUdfT04gKi8KKworCisvKgorICogRG9tYWluIGFuZCBzdWIgZG9tYWluIGRlZmluaXRpb25zCisgKgorICogSW4gb3JkZXIgdG8gdHVybiBvbiBkZWJ1ZyBmb3IgYW4gZW50aXJlIGRvbWFpbiBvciBzdWItZG9tYWluCisgKiBhdCBjb21waWxlIHRpbWUsIG9uZSBvZiB0aGUgREVCVUdfRE9NQUlOXyogYmVsb3cgbWF5IGJlIGRlZmluZWQsCisgKiB3aGljaCB3aWxsIGFjdGl2YXRlIGRlYnVnIGluIGFsbCBvZiB0aGUgZGVmaW5lcyBpdCBjb250YWlucy4KKyAqLworCisjaWZkZWYgREVCVUdfRE9NQUlOX0FDCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUX01QRUc0CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUNIQU5QQUlSRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERURBVFNUUkVMVAorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVGSUxMRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERUlTU1RFUkVPX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUNPREVNU1BOU19TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFTVNTVEVSRU9fUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfREVDT0RFUFJHQ0ZHRUxUCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0RFQ09ERVROU19TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19ERUlOVEVSTEVBVkVTUEVDVFJVTV9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfRU5DT0RFVE5TX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX0xPTkdURVJNUFJFRElDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTE9OR1RFUk1SRUNPTlNUUlVDVF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVEZXRF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNBQUNfTURDVElOVl9TMzJfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDQUFDX05PSVNFTEVTU0RFQ09ERQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19RVUFOVElOVl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ0FBQ19VTlBBQ0tBRElGSEVBREVSCisjZGVmaW5lIERFQlVHX09NWEFDQUFDX1VOUEFDS0FEVFNGUkFNRUhFQURFUgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCTUJQX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFU0ZCX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19IVUZGTUFOREVDT0RFX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19NRENUSU5WX1MzMgorI2RlZmluZSBERUJVR19PTVhBQ01QM19SRVFVQU5USVpFU0ZCX1MzMl9JCisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1JFUVVBTlRJWkVfUzMyX0kKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfU1lOVEhQUU1GX1MzMl9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLRlJBTUVIRUFERVIKKyNkZWZpbmUgREVCVUdfT01YQUNNUDNfVU5QQUNLU0NBTEVGQUNUT1JTX1M4CisjZGVmaW5lIERFQlVHX09NWEFDTVAzX1VOUEFDS1NJREVJTkZPCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0FDICovCisKKworI2lmZGVmIERFQlVHX0RPTUFJTl9WQworI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfMTZYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfQVZFUkFHRV80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0FWRVJBR0VfOFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLQ0hST01BX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9ERUJMT0NLTFVNQV9VOF9DMUlSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVDT0RFQ0hST01BRENDT0VGRlNUT1BBSVJDQVZMQ19VOAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0RFQ09ERUNPRUZGU1RPUEFJUkNBVkxDX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfREVRVUFOVFRSQU5TRk9STUFDRlJPTVBBSVJfVThfUzE2X0MxX0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0VYUEFOREZSQU1FCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfRklMVEVSREVCTE9DS0lOR0NIUk9NQV9IT1JFREdFX1U4X0MxSVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9GSUxURVJERUJMT0NLSU5HQ0hST01BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX0hPUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX0ZJTFRFUkRFQkxPQ0tJTkdMVU1BX1ZFUkVER0VfVThfQzFJUgorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1BSRURJQ1RJTlRSQUNIUk9NQThYOF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9QUkVESUNUSU5UUkFfMTZYMTZfVThfQzFSCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfUFJFRElDVElOVFJBXzRYNF9VOF9DMVIKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRFFVQVJfNFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAxMF9TQURRVUFSXzhYCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfU0FEXzE2WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF80WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBRF84WAorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1NBVERfNFg0CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVENIUk9NQURDRlJPTVBBSVJfVThfUzE2X0MxCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNREVRVUFOVExVTUFEQ0ZST01QQUlSX1U4X1MxNl9DMQorI2RlZmluZSBERUJVR19PTVhWQ000UDEwX1RSQU5TRk9STVFVQU5UX0NIUk9NQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMTBfVFJBTlNGT1JNUVVBTlRfTFVNQURDCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9CTE9DS01BVENIX0hBTEZfMTZYMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSEFMRl84WDgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0JMT0NLTUFUQ0hfSU5URUdFUl8xNlgxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQkxPQ0tNQVRDSF9JTlRFR0VSXzhYOAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfQ09NUFVURVRFWFRVUkVFUlJPUkJMT0NLX1NBRF9VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0NPTVBVVEVURVhUVVJFRVJST1JCTE9DS19VOF9TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0RDVDhYOEJMS0RMWAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFQkxPQ0tDT0VGX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFUEFETVZfUFZPUAorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfREVDT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9ERUNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0VOQ09ERU1WX1U4X1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVEVSX1MxNgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfRU5DT0RFVkxDWklHWkFHX0lOVFJBQUNWTENfUzE2CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9FTkNPREVWTENaSUdaQUdfSU5UUkFEQ1ZMQ19TMTYKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0ZJTkRNVlBSRUQKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0lEQ1Q4WDhCTEtETFgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX0xJTUlUTVZUT1JFQ1QKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX01PVElPTkVTVElNQVRJT05NQgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfUEFETUJHUkFZX1U4CisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9QQURNQkhPUklaT05UQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1CVkVSVElDQUxfVTgKKyNkZWZpbmUgREVCVUdfT01YVkNNNFAyX1BBRE1WCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVEVSX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9RVUFOVElOVklOVFJBX1MxNl9JCisjZGVmaW5lIERFQlVHX09NWFZDTTRQMl9UUkFOU1JFQ0JMT0NLQ0VPRl9JTlRFUgorI2RlZmluZSBERUJVR19PTVhWQ000UDJfVFJBTlNSRUNCTE9DS0NFT0ZfSU5UUkEKKyNlbmRpZiAvKiBERUJVR19ET01BSU5fVkMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX0lDCisvKiBUbyBiZSBmaWxsZWQgaW4gKi8KKyNlbmRpZiAvKiBERUJVR19ET01BSU5fSUMgKi8KKworCisjaWZkZWYgREVCVUdfRE9NQUlOX1NQCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMTYKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9CTE9DS0VYUF9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9DT1BZX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0RPVFBST0RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRE9UUFJPRF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZURldEX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRGV0RfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzE2UzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEZXRF9SVE9DQ1NfUzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfQ19TQzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUR0VUQlVGU0laRV9DX1NDMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRHRVRCVUZTSVpFX1JfUzE2X1MzMgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVEdFVEJVRlNJWkVfUl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX0NfU0MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZGVElOSVRfQ19TQzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5JVF9SX1MxNl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTklUX1JfUzMyCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJTMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NDU1RPUl9TMzJfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRkZUSU5WX0NUT0NfU0MxNl9TRlMKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GRlRJTlZfQ1RPQ19TQzMyX1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzJfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJTFRFUk1FRElBTl9TMzIKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJPTkVfRElSRUNUX1MxNl9JU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfSQorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUk9ORV9ESVJFQ1RfUzE2CisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklST05FX0RJUkVDVF9TMTZfU0ZTCisjZGVmaW5lIERFQlVHX09NWEFDU1BfRklSX0RJUkVDVF9TMTZfSVNGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9GSVJfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0ZJUl9ESVJFQ1RfUzE2X1NGUworI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUk9ORV9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJPTkVfRElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9CSVFVQURESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfQklRVUFERElSRUNUX1MxNgorI2RlZmluZSBERUJVR19PTVhBQ1NQX0lJUl9ESVJFQ1RfUzE2X0kKKyNkZWZpbmUgREVCVUdfT01YQUNTUF9JSVJfRElSRUNUX1MxNgorI2VuZGlmIC8qIERFQlVHX0RPTUFJTl9TUCAqLworCisKKyNpZmRlZiBERUJVR19ET01BSU5fSVAKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9BRERDX1U4X0MxUl9TRlMKKyNkZWZpbmUgREVCVUdfT01YSVBCTV9DT1BZX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX0NPUFlfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQk1fTUlSUk9SX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUEJNX01VTENfVThfQzFSX1NGUworI2RlZmluZSBERUJVR19PTVhJUENTX0NPTE9SVFdJU1RRMTRfVThfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQyMkxTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCNTY1VE9ZQ0JDUjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfUkdCVE9ZQ0JDUjQyMExTX01DVV9VOF9TMTZfQzNQM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19SR0JUT1lDQkNSNDIyTFNfTUNVX1U4X1MxNl9DM1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1JHQlRPWUNCQ1I0NDRMU19NQ1VfVThfUzE2X0MzUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBSU1pST1RfVThfUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjBUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMFRPUkdCTFNfTUNVX1MxNl9VOF9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaQ1NDUk9UUkdCX1U4X0MyUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyUlNaUk9UX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDIyVE9SR0I1NjVfVThfVTE2X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1JHQkxTX01DVV9TMTZfVThfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUjQyMlRPUkdCX1U4X0MyQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X0MyUDNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1I0MjJUT1lDQkNSNDIwUk9UQVRFX1U4X1AzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0I1NjVMU19NQ1VfUzE2X1UxNl9QM0MzUgorI2RlZmluZSBERUJVR19PTVhJUENTX1lDQkNSNDQ0VE9SR0JMU19NQ1VfUzE2X1U4X1AzQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfQzNSCisjZGVmaW5lIERFQlVHX09NWElQQ1NfWUNCQ1JUT1JHQjU2NV9VOF9VMTZfUDNDM1IKKyNkZWZpbmUgREVCVUdfT01YSVBDU19ZQ0JDUlRPUkdCX1U4X0MzUgorI2RlZmluZSBERUJVR19PTVhJUFBQX0dFVENFTlRSQUxNT01FTlRfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfR0VUU1BBVElBTE1PTUVOVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRHRVRTVEFURVNJWkVfUzY0CisjZGVmaW5lIERFQlVHX09NWElQUFBfTU9NRU5USU5JVF9TNjQKKyNkZWZpbmUgREVCVUdfT01YSVBQUF9NT01FTlRTNjRTX1U4X0MxUgorI2RlZmluZSBERUJVR19PTVhJUFBQX01PTUVOVFM2NFNfVThfQzNSCisjZW5kaWYgLyogREVCVUdfRE9NQUlOX0lQICovCisKKworI2VuZGlmIC8qIF9hcm1Db21tb25fSF8gKi8KKworLypFbmQgb2YgRmlsZSovCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0JpdERlY19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzczOGY3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCkBAIC0wLDAgKzEsNjcwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX0JpdERlY19zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vIAorOy8vIE9wZW5NQVggb3B0aW1pemVkIGJpdHN0cmVhbSBkZWNvZGUgbW9kdWxlCis7Ly8KKzsvLyBZb3UgbXVzdCBpbmNsdWRlIGFybUNPTU1fcy5oIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBmaWxlCis7Ly8KKzsvLyBUaGlzIG1vZHVsZSBwcm92aWRlcyBtYWNyb3MgdG8gcGVyZm9ybSBhc3NlbWJseSBvcHRpbWl6ZWQgZml4ZWQgYW5kCis7Ly8gdmFyaWFibGUgbGVuZ3RoIGRlY29kaW5nIGZyb20gYSByZWFkLW9ubHkgYml0c3RyZWFtLiBUaGUgdmFyaWFibGUKKzsvLyBsZW5ndGggZGVjb2RlIG1vZHVsZXMgdGFrZSBhcyBpbnB1dCBhIHBvaW50ZXIgdG8gYSB0YWJsZSBvZiAxNi1iaXQKKzsvLyBlbnRyaWVzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgorOy8vCis7Ly8gVkxEIFRhYmxlIEVudHJ5IGZvcm1hdAorOy8vCis7Ly8gICAgICAgIDE1IDE0IDEzIDEyIDExIDEwIDA5IDA4IDA3IDA2IDA1IDA0IDAzIDAyIDAxIDAwCis7Ly8gICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKzsvLyAgICAgICB8ICBMZW4gICB8ICAgICAgICAgICAgICAgU3ltYm9sICAgICAgICAgICAgICB8IDEgfAorOy8vICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCis7Ly8gICAgICAgfCAgICAgICAgICAgICAgICBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgfCAwIHwKKzsvLyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGEgbGVhZiBlbnRyeSB0aGVuIGJpdCAwIHNldDoKKzsvLyAgICBMZW4gICAgPSBOdW1iZXIgb2YgYml0cyBvdmVycmVhZCAoMCB0byA3KQorOy8vICAgIFN5bWJvbCA9IFN5bWJvbCBwYXlsb2FkICh1bnNpZ25lZCAxMiBiaXRzKQorOy8vCis7Ly8gSWYgdGhlIHRhYmxlIGVudHJ5IGlzIGFuIGludGVybmFsIG5vZGUgdGhlbiBiaXQgMCBpcyBjbGVhcjoKKzsvLyAgICBPZmZzZXQgPSBOdW1iZXIgb2YgKDE2LWJpdCkgaGFsZiB3b3JkcyBmcm9tIHRoZSB0YWJsZQorOy8vICAgICAgICAgICAgIHN0YXJ0IHRvIHRoZSBuZXh0IHRhYmxlIG5vZGUKKzsvLworOy8vIFRoZSB0YWJsZSBpcyBhY2Nlc3NlZCBieSBzdWNjZXNzaXZlIGxvb2t1cCB1cCBvbiB0aGUKKzsvLyBuZXh0IFN0ZXAgYml0cyBvZiB0aGUgaW5wdXQgYml0c3RyZWFtIHVudGlsIGEgbGVhZiBub2RlCis7Ly8gaXMgb2J0YWluZWQuIFRoZSBTdGVwIHNpemVzIGFyZSBzdXBwbGllZCB0byB0aGUgVkxEIG1hY3JvLgorOy8vCis7Ly8gVVNBR0U6Cis7Ly8KKzsvLyBUbyB1c2UgYW55IG9mIHRoZSBtYWNyb3MgaW4gdGhpcyBwYWNrYWdlLCBmaXJzdCBjYWxsOgorOy8vCis7Ly8gICAgTV9CRF9JTklUIHBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwQml0U3RyZWFtLCBSQml0QnVmZmVyLCBSQml0Q291bnQsIFRtcAorOy8vCis7Ly8gVGhpcyBjYWNoZXMgdGhlIGN1cnJlbnQgYml0c3RyZWFtIHBvc2l0aW9uIGFuZCBuZXh0IGF2YWlsYWJsZQorOy8vIGJpdHMgaW4gcmVnaXN0ZXJzIHBCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudC4gVGhlc2UgcmVnaXN0ZXJzCis7Ly8gYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGJpdHN0cmVhbSBkZWNvZGUgcGFja2FnZSB1bnRpbCB5b3UKKzsvLyBjYWxsIE1fQkRfRklOSS4KKzsvLworOy8vIE5leHQgY2FsbCB0aGUgZm9sbG93aW5nIG1hY3JvKHMpIGFzIG1hbnkgdGltZXMgYXMgeW91IG5lZWQ6Cis7Ly8KKzsvLyAgICBNX0JEX0xPT0s4ICAgICAgIC0gTG9vayBhaGVhZCBjb25zdGFudCAxPD1OPD04ICBiaXRzIGludG8gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfTE9PSzE2ICAgICAgLSBMb29rIGFoZWFkIGNvbnN0YW50IDE8PU48PTE2IGJpdHMgaW50byB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9SRUFEOCAgICAgICAtIFJlYWQgY29uc3RhbnQgMTw9Tjw9OCAgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1JFQUQxNiAgICAgIC0gUmVhZCBjb25zdGFudCAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbQorOy8vICAgIE1fQkRfVlJFQUQ4ICAgICAgLSBSZWFkIHZhcmlhYmxlIDE8PU48PTggIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCis7Ly8gICAgTV9CRF9WUkVBRDE2ICAgICAtIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKzsvLyAgICBNX0JEX1ZMRCAgICAgICAgIC0gUGVyZm9ybSB2YXJpYWJsZSBsZW5ndGggZGVjb2RlIHVzaW5nIGxvb2t1cCB0YWJsZQorOy8vCis7Ly8gRmluYWxseSBjYWxsIHRoZSBtYWNybzoKKzsvLworOy8vICAgIE1fQkRfRklOSSBwcEJpdFN0cmVhbSwgcEJpdE9mZnNldAorOy8vCis7Ly8gVGhpcyB3cml0ZXMgdGhlIGJpdHN0cmVhbSBzdGF0ZSBiYWNrIHRvIG1lbW9yeS4KKzsvLworOy8vIFRoZSB0aHJlZSBiaXRzdHJlYW0gY2FjaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBmb2xsb3dpbmcgZ2xvYmFsCis7Ly8gdmFyaWFibGVzOgorOy8vCisKKyAgICAgICAgR0JMUyAgICBwQml0U3RyZWFtICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgcEJpdFN0cmVhbQorICAgICAgICBHQkxTICAgIEJpdEJ1ZmZlciAgIDsvLyBSZWdpc3RlciBuYW1lIGZvciBCaXRCdWZmZXIKKyAgICAgICAgR0JMUyAgICBCaXRDb3VudCAgICA7Ly8gUmVnaXN0ZXIgbmFtZSBmb3IgQml0Q291bnQKKyAgIAorOy8vICAgICAgICAKKzsvLyBUaGVzZSByZWdpc3RlciB2YXJpYWJsZXMgbXVzdCBoYXZlIGEgY2VydGFpbiBkZWZpbmVkIHN0YXRlIG9uIGVudHJ5IHRvIGV2ZXJ5IGJpdHN0cmVhbQorOy8vIG1hY3JvIChleGNlcHQgTV9CRF9JTklUKSBhbmQgb24gZXhpdCBmcm9tIGV2ZXJ5IGJpdHN0cmVhbSBtYWNybyAoZXhjZXB0IE1fQkRfRklOSSkuCis7Ly8gVGhlIHN0YXRlIG1heSBkZXBlbmQgb24gaW1wbGVtZW50YXRpb24uCis7Ly8KKzsvLyBGb3IgdGhlIGRlZmF1bHQgKEFSTTExKSBpbXBsZW1lbnRhdGlvbiB0aGUgZm9sbG93aW5nIGhvbGQ6Cis7Ly8gICAgcEJpdFN0cmVhbSAtIHBvaW50cyB0byB0aGUgZmlyc3QgYnl0ZSBub3QgaGVsZCBpbiB0aGUgQml0QnVmZmVyCis7Ly8gICAgQml0QnVmZmVyICAtIGlzIGEgY2FjaGUgb2YgKDQgYnl0ZXMpIDMyIGJpdHMsIGJpdCAzMSB0aGUgZmlyc3QgYml0Cis7Ly8gICAgQml0Q291bnQgICAtIGlzIG9mZnNldCAoZnJvbSB0aGUgdG9wIGJpdCkgdG8gdGhlIG5leHQgdW51c2VkIGJpdHN0cmVhbSBiaXQKKzsvLyAgICAwPD1CaXRDb3VudDw9MTUgKHNvIEJpdEJ1ZmZlciBob2xkcyBhdCBsZWFzdCAxNyB1bnVzZWQgYml0cykKKzsvLworOy8vCisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgaW5pdGlhbGlzZQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEluaXRpYWxpc2VzIHRoZSBiaXRzdHJlYW0gZGVjb2RlIGdsb2JhbCByZWdpc3RlcnMgZnJvbQorICAgICAgICA7Ly8gYml0c3RyZWFtIHBvaW50ZXJzLiBUaGlzIG1hY3JvIGlzIHNwbGl0IGludG8gMyBwYXJ0cyB0byBlbmFibGUKKyAgICAgICAgOy8vIHNjaGVkdWxpbmcuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwcEJpdFN0cmVhbSAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbmV4dCBiaXRzdHJlYW0gYnl0ZQorICAgICAgICA7Ly8gJHBCaXRPZmZzZXQgICAgIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBieXRlICgwLi43KQorICAgICAgICA7Ly8gJFJCaXRTdHJlYW0gICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBwQml0U3RyZWFtIChjYW4gYmUgJHBwQml0U3RyZWFtKQorICAgICAgICA7Ly8gJFJCaXRCdWZmZXIgICAgIC0gcmVnaXN0ZXIgdG8gdXNlIGZvciBCaXRCdWZmZXIKKyAgICAgICAgOy8vICRSQml0Q291bnQgICAgICAtIHJlZ2lzdGVyIHRvIHVzZSBmb3IgQml0Q291bnQgICAoY2FuIGJlICRwQml0T2Zmc2V0KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFQxLCRUMiwkVDMgICAgIC0gcmVnaXN0ZXJzIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0bworICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgTV9CRF9JTklUMSBhbmQgTV9CRF9JTklUMgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQwICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0LCAkUkJpdFN0cmVhbSwgJFJCaXRCdWZmZXIsICRSQml0Q291bnQKKworcEJpdFN0cmVhbSAgU0VUUyAiJFJCaXRTdHJlYW0iCitCaXRCdWZmZXIgICBTRVRTICIkUkJpdEJ1ZmZlciIKK0JpdENvdW50ICAgIFNFVFMgIiRSQml0Q291bnQiICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBsb2FkIGlucHV0cworICAgICAgICBMRFIgICAgICRwQml0U3RyZWFtLCBbJHBwQml0U3RyZWFtXQorICAgICAgICBMRFIgICAgICRCaXRDb3VudCwgWyRwQml0T2Zmc2V0XQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0lOSVQxICAkVDEsICRUMiwgJFQzCisgICAgICAgIExEUkIgICAgJFQyLCBbJHBCaXRTdHJlYW0sICMyXQorICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtLCAjMV0KKyAgICAgICAgTERSQiAgICAkQml0QnVmZmVyLCAgWyRwQml0U3RyZWFtXSwgIzMKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9JTklUMiAgJFQxLCAkVDIsICRUMworICAgICAgICBPUlIgICAgICRUMiwgJFQyLCAkVDEsIExTTCAjOAorICAgICAgICBPUlIgICAgICRCaXRCdWZmZXIsICRUMiwgJEJpdEJ1ZmZlciwgTFNMICMxNgorICAgICAgICBNRU5EICAgIAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBMb29rIGFoZWFkIGZpeGVkIDE8PU48PTggYml0cyB3aXRob3V0IGNvbnN1bWluZyBhbnkgYml0cworICAgICAgICA7Ly8gVGhlIG5leHQgYml0cyB3aWxsIGJlIHBsYWNlZCBhdCBiaXQgMzEuLjI0IG9mIGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIGxvb2sKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfTE9PSzggICRTeW1ib2wsICROCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTG9vayBhaGVhZCBmaXhlZCAxPD1OPD0xNiBiaXRzIHdpdGhvdXQgY29uc3VtaW5nIGFueSBiaXRzCisgICAgICAgIDsvLyBUaGUgbmV4dCBiaXRzIHdpbGwgYmUgcGxhY2VkIGF0IGJpdCAzMS4uMTYgb2YgZGVzdGluYXRpb24gcmVnaXN0ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMgdG8gbG9vaworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG5leHQgTiBiaXRzIG9mIHRoZSBiaXRzdHJlYW0KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9MT09LMTYgICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4gPj0gMSk6TEFORDooJE4gPD0gMTYpCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFNraXBzIGZpeGVkIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9TS0lQOCAkTiwgJFQxCisgICAgICAgIEFTU0VSVCAgKCROPj0xKTpMQU5EOigkTjw9OCkgICAgICAgIAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDgtJE4pCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgZml4ZWQgMTw9Tjw9OCBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1JFQUQ4ICRTeW1ib2wsICROLCAkVDEKKyAgICAgICAgQVNTRVJUICAoJE4+PTEpOkxBTkQ6KCROPD04KSAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIyg4LSROKQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkU3ltYm9sLCBMU1IgIygzMi0kTikKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBSZWFkIGZpeGVkIDE8PU48PTE2IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIHRoZSBuZXh0IE4gYml0cyBvZiB0aGUgYml0c3RyZWFtCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfUkVBRDE2ICRTeW1ib2wsICROLCAkVDEsICRUMgorICAgICAgICBBU1NFUlQgICgkTj49MSk6TEFORDooJE48PTE2KQorICAgICAgICBBU1NFUlQgICRTeW1ib2w8PiRUMQorICAgICAgICBJRiAoJE48PTgpCisgICAgICAgICAgICBNX0JEX1JFQUQ4ICAkU3ltYm9sLCAkTiwgJFQxCisgICAgICAgIEVMU0UgICAgICAgIAorICAgICAgICAgICAgOy8vIE4+OCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gcmVmaWxsIGF0IGxlYXN0IG9uZSBieXRlICAgICAgICAgICAgCisgICAgICAgICAgICBMRFJCICAgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PVlMgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICAgICAgT1JSICAgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOCAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjKDE2LSROKQorICAgICAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAgICAgCisgICAgICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAjKDMyLSROKQorICAgICAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBTa2lwIHZhcmlhYmxlIDE8PU48PTggYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVA4ICROLCAkVDEKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgQUREQ0MgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLworICAgICAgICA7Ly8gU2tpcCB2YXJpYWJsZSAxPD1OPD0xNiBiaXRzIGZyb20gdGhlIGJpdHN0cmVhbSwgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlci4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJE4gICAgICAgICAgICAgIC0gbnVtYmVyIG9mIGJpdHMuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkVDEgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkVDIgICAgICAgICAgICAgLSBjb3JydXB0ZWQgdGVtcC9zY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfVlNLSVAxNiAkTiwgJFQxLCAkVDIKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gUmVhZCB2YXJpYWJsZSAxPD1OPD04IGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtLCBhZHZhbmNpbmcgdGhlIGJpdHN0cmVhbSBwb2ludGVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTiAgICAgICAgICAgICAgLSBudW1iZXIgb2YgYml0cyB0byByZWFkLiAxPD1OPD04CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEOCAkU3ltYm9sLCAkTiwgJFQxLCAkVDIKKyAgICAgICAgTU9WICAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50ICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJE4KKyAgICAgICAgU1VCUyAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzgKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxICAgICAgICAKKyAgICAgICAgUlNCICAgICAkVDIsICROLCAjMzIgICAgICAgIAorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFJlYWQgdmFyaWFibGUgMTw9Tjw9MTYgYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0sIGFkdmFuY2luZyB0aGUgYml0c3RyZWFtIHBvaW50ZXIuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICROICAgICAgICAgICAgICAtIG51bWJlciBvZiBiaXRzIHRvIHJlYWQuIDE8PU48PTE2CisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbmV4dCBOIGJpdHMgb2YgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZSRUFEMTYgJFN5bWJvbCwgJE4sICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICAgCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICROCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgCisgICAgICAgIFJTQiAgICAgJFQyLCAkTiwgIzMyICAgICAgICAKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBNT1YgICAgICRTeW1ib2wsICRTeW1ib2wsIExTUiAkVDIKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBNRU5ECisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlY29kZSBhIGNvZGUgb2YgdGhlIGZvcm0gMDAwMC4uLjAwMSB3aGVyZSB0aGVyZQorICAgICAgICA7Ly8gYXJlIE4gemVyb3MgYmVmb3JlIHRoZSAxIGFuZCBOPD0xNSAoY29kZSBsZW5ndGg8PTE2KQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcEJpdFN0cmVhbSAgICAgXCAKKyAgICAgICAgOy8vICRCaXRCdWZmZXIgICAgICAgfSBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCisgICAgICAgIDsvLyAkQml0Q291bnQgICAgICAgLyAKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkU3ltYm9sICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHplcm9zIGJlZm9yZSB0aGUgbmV4dCAxCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICA+PTE2IGlzIGFuIGlsbGVnYWwgY29kZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQ0xaMTYgJFN5bWJvbCwgJFQxLCAkVDIKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAkQml0QnVmZmVyLCBMU0wgJEJpdENvdW50CisgICAgICAgIENMWiAgICAgJFN5bWJvbCwgJFN5bWJvbCAgICAgICAgICAgICAgICAKKyAgICAgICAgQUREICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbAorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjNyAgICAgICAgOy8vIGxlbmd0aCBpcyBTeW1ib2wrMQorICAgICAgICBMRFJDU0IgICRUMSwgWyRwQml0U3RyZWFtXSwgIzEKKyAgICAgICAgT1JSQ1MgICAkQml0QnVmZmVyLCAkVDEsICRCaXRCdWZmZXIsIExTTCAjOAorICAgICAgICBTVUJDU1MgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBBRERDQyAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIE1FTkQgIAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlIGEgY29kZSBvZiB0aGUgZm9ybSAxMTExLi4uMTEwIHdoZXJlIHRoZXJlCisgICAgICAgIDsvLyBhcmUgTiBvbmVzIGJlZm9yZSB0aGUgMCBhbmQgTjw9MTUgKGNvZGUgbGVuZ3RoPD0xNikKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLyAKKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJFN5bWJvbCAgICAgICAgIC0gdGhlIG51bWJlciBvZiB6ZXJvcyBiZWZvcmUgdGhlIG5leHQgMQorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgPj0xNiBpcyBhbiBpbGxlZ2FsIGNvZGUKKyAgICAgICAgOy8vICRUMSAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRUMiAgICAgICAgICAgICAtIGNvcnJ1cHRlZCB0ZW1wL3NjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0JEX0NMTzE2ICRTeW1ib2wsICRUMSwgJFQyCisgICAgICAgIE1PViAgICAgJFN5bWJvbCwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudAorICAgICAgICBNVk4gICAgICRTeW1ib2wsICRTeW1ib2wKKyAgICAgICAgQ0xaICAgICAkU3ltYm9sLCAkU3ltYm9sICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAkU3ltYm9sCisgICAgICAgIFNVQlMgICAgJEJpdENvdW50LCAkQml0Q291bnQsICM3ICAgICAgICA7Ly8gbGVuZ3RoIGlzIFN5bWJvbCsxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMQorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4CisgICAgICAgIFNVQkNTUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAKKyAgICAgICAgTERSQ1NCICAkVDEsIFskcEJpdFN0cmVhbV0sICMxCisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgIE9SUkNTICAgJEJpdEJ1ZmZlciwgJFQxLCAkQml0QnVmZmVyLCBMU0wgIzgKKyAgICAgICAgTUVORCAgCisKKworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFZhcmlhYmxlIExlbmd0aCBEZWNvZGUgbW9kdWxlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gRGVjb2RlcyBvbmUgVkxEIFN5bWJvbCBmcm9tIGEgYml0c3RyZWFtIGFuZCByZWZpbGwgdGhlIGJpdHN0cmVhbQorICAgICAgICA7Ly8gYnVmZmVyLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcFZMRFRhYmxlICAgICAgLSBwb2ludGVyIHRvIFZMRCBkZWNvZGUgdGFibGUgb2YgMTYtYml0IGVudHJpZXMuCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIGRlc2NyaWJlZCBhYm92ZSBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAgOy8vICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZS4KKyAgICAgICAgOy8vICRTMCAgICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYml0cyB0byBsb29rIHVwIGZvciB0aGUgZmlyc3Qgc3RlcAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgMTw9JFMwPD04CisgICAgICAgIDsvLyAkUzEgICAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJpdHMgdG8gbG9vayB1cCBmb3IgZWFjaCBzdWJzZXF1ZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBzdGVwIDE8PSRTMTw9JFMwLgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRTeW1ib2wgICAgICAgICAtIGRlY29kZWQgVkxEIHN5bWJvbCB2YWx1ZQorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJFQyICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX1ZMRCAkU3ltYm9sLCAkVDEsICRUMiwgJHBWTERUYWJsZSwgJFMwLCAkUzEKKyAgICAgICAgQVNTRVJUICgxPD0kUzApOkxBTkQ6KCRTMDw9OCkKKyAgICAgICAgQVNTRVJUICgxPD0kUzEpOkxBTkQ6KCRTMTw9JFMwKQorICAgICAgICAKKyAgICAgICAgOy8vIE5vdGUgMDw9Qml0Q291bnQ8PTE1IG9uIGVudHJ5IGFuZCBleGl0CisgICAgICAgIAorICAgICAgICBNT1ZTICAgICRUMSwgJEJpdEJ1ZmZlciwgTFNMICRCaXRDb3VudCAgICAgICA7Ly8gbGVmdCBhbGlnbiBuZXh0IGJpdHMKKyAgICAgICAgTU9WUyAgICAkU3ltYm9sLCAjKDI8PCRTMCktMiAgICAgICAgICAgICAgICAgOy8vIGNyZWF0ZSBtYXNrCisgICAgICAgIEFORCAgICAgJFN5bWJvbCwgJFN5bWJvbCwgJFQxLCBMU1IgIygzMS0kUzApIDsvLyAyKihuZXh0ICRTMCBiaXRzKQorICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCAgICAgICAgICAgICA7Ly8gQ1MgaWYgYnVmZmVyIGNhbiBiZSBmaWxsZWQKKzAxCisgICAgICAgIExEUkNTQiAgJFQxLCBbJHBCaXRTdHJlYW1dLCAjMSAgICAgICAgICAgICAgIDsvLyBsb2FkIHJlZmlsbCBieXRlCisgICAgICAgIExEUkggICAgJFN5bWJvbCwgWyRwVkxEVGFibGUsICRTeW1ib2xdICAgICAgIDsvLyBsb2FkIHRhYmxlIGVudHJ5CisgICAgICAgIEFERENDICAgJEJpdENvdW50LCAkQml0Q291bnQsICM4ICAgICAgICAgICAgIDsvLyByZWZpbGwgbm90IHBvc3NpYmxlCisgICAgICAgIEFERCAgICAgJEJpdENvdW50LCAkQml0Q291bnQsICMkUzAgICAgICAgICAgIDsvLyBhc3N1bWUgJFMwIGJpdHMgdXNlZAorICAgICAgICBPUlJDUyAgICRCaXRCdWZmZXIsICRUMSwgJEJpdEJ1ZmZlciwgTFNMICM4ICA7Ly8gbWVyZ2UgaW4gcmVmaWxsIGJ5dGUKKyAgICAgICAgTU9WUyAgICAkVDEsICRTeW1ib2wsIExTUiAjMSAgICAgICAgICAgICAgICAgOy8vIENTPWxlYWYgZW50cnkKKyAgICAgICAgQkNTICAgICAlRlQwMgorICAgICAgICAKKyAgICAgICAgTU9WUyAgICAkVDEsICRCaXRCdWZmZXIsIExTTCAkQml0Q291bnQgICAgICAgOy8vIGxlZnQgYWxpZ24gbmV4dCBiaXQKKyAgICAgICAgSUYgKDIqJFMwLSRTMTw9OCkKKyAgICAgICAgICAgIDsvLyBDYW4gY29tYmluZSByZWZpbGwgY2hlY2sgYW5kIC1TMCtTMSBhbmQga2VlcCAkQml0Q291bnQ8PTE1CisgICAgICAgICAgICBTVUJTICAgICRCaXRDb3VudCwgJEJpdENvdW50LCAjOCsoJFMwLSRTMSkKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgOy8vIFNlcGFyYXRlIHJlZmlsbCBjaGVjayBhbmQgLVMwK1MxIG9mZnNldAorICAgICAgICAgICAgU1VCUyAgJEJpdENvdW50LCAkQml0Q291bnQsICM4CisgICAgICAgICAgICBTVUIgICAkQml0Q291bnQsICRCaXRDb3VudCwgIygkUzAtJFMxKQorICAgICAgICBFTkRJRgorICAgICAgICBBREQgICAgICRTeW1ib2wsICRTeW1ib2wsICRUMSwgTFNSICMoMzEtJFMxKSA7Ly8gYWRkIDIqKG5leHQgJFMxIGJpdHMpIHRvCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFN5bWJvbCwgIzEgICAgICAgICAgICAgICAgIDsvLyAgIHRhYmxlIG9mZnNldAorICAgICAgICBCICAgICAgICVCVDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gbG9hZCBuZXh0IHRhYmxlIGVudHJ5CiswMgorICAgICAgICA7Ly8gQml0Q291bnQgcmFuZ2Ugbm93IGRlcGVuZCBvbiB0aGUgcm91dGUgaGVyZQorICAgICAgICA7Ly8gaWYgKGZpcnN0IHN0ZXApICAgICAgIFMwIDw9IEJpdENvdW50IDw9IDcrUzAgICAgICAgIDw9MTUKKyAgICAgICAgOy8vIGVsc2UgaWYgKDIqUzAtUzE8PTgpICBTMCA8PSBCaXRDb3VudCA8PSA3KygyKlMwLVMxKSA8PTE1CisgICAgICAgIDsvLyBlbHNlICAgICAgICAgICAgICAgICAgUzEgPD0gQml0Q291bnQgPD0gNytTMSAgICAgICAgPD0xNQorICAgICAgICAKKyAgICAgICAgU1VCICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgJFN5bWJvbCwgTFNSIzEzCisgICAgICAgIEJJQyAgICAgJFN5bWJvbCwgJFQxLCAjMHhGMDAwCisgICAgICAgIE1FTkQKKyAgICAgICAgCisKKyAgICAgICAgOy8vIEFkZCBhbiBvZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXRzIGRlc3RpbmF0aW9uIGJ5dGUgYW5kIGJpdCBpbmRleCB2YWx1ZXMgd2hpY2ggY29ycmVzcG9uZHMgdG8gYW4gb2Zmc2V0IG51bWJlciBvZiBiaXRzIAorICAgICAgICA7Ly8gZnJvbSB0aGUgY3VycmVudCBsb2NhdGlvbi4gVGhpcyBpcyB1c2VkIHRvIGNvbXBhcmUgYml0c3RyZWFtIHBvc2l0aW9ucyB1c2luZy4gTV9CRF9DTVAuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRPZmZzZXQgICAgICAgICAtIE9mZnNldCB0byBiZSBhZGRlZCBpbiBiaXRzLgorICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIgYWZ0ZXIgYWRkaW5nIHRoZSBPZmZzZXQuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLiBCdXQgZm9yIHVzaW5nIHdpdGggTV9CRF9DTVAgc3VidHJhY3QgaXMgbm90IG5lZWRlZC4KKyAgICAgICAgOy8vICRCaXRJbmRleCAgICAgICAtIERlc3RpbmF0aW9uIEJpdENvdW50IGFmdGVyIHRoZSBhZGRpdGlvbiBvZiBPZmZzZXQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgOy8vCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQkRfQUREICAkQnl0ZUluZGV4LCAkQml0SW5kZXgsICRPZmZzZXQKKworICAgICAgICA7Ly8gKCRCeXRlSW5kZXgsJEJpdEluZGV4KSA9IEN1cnJlbnQgcG9zaXRpb24gKyAkT2Zmc2V0IGJpdHMKKyAgICAgICAgQUREICAgICAkT2Zmc2V0LCAkT2Zmc2V0LCAkQml0Q291bnQKKyAgICAgICAgQU5EICAgICAkQml0SW5kZXgsICRPZmZzZXQsICM3CisgICAgICAgIEFERCAgICAgJEJ5dGVJbmRleCwgJHBCaXRTdHJlYW0sICRPZmZzZXQsIEFTUiAjMyAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTW92ZSBiaXRzdHJlYW0gcG9pbnRlcnMgdG8gdGhlIGxvY2F0aW9uIGdpdmVuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0cyBkZXN0aW5hdGlvbiBieXRlIGFuZCBiaXQgaW5kZXggdmFsdWVzIHdoaWNoIGNvcnJlc3BvbmRzIHRvICAKKyAgICAgICAgOy8vIHRoZSBjdXJyZW50IGxvY2F0aW9uIGdpdmVuIChjYWxjdWxhdGVkIHVzaW5nIE1fQkRfQUREKS4gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW5wdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8gJEJ5dGVJbmRleCAgICAgIC0gRGVzdGluYXRpb24gcEJpdFN0cmVhbSBwb2ludGVyIGFmdGVyIG1vdmUuIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSB3aWxsIGJlIDQgYnl0ZSBhaGVhZCBhbmQgbmVlZHMgdG8gc3VidHJhY3QgYnkgNCB0byBnZXQgZXhhY3QgCisgICAgICAgIDsvLyAgICAgICAgICAgICAgICAgICBwb2ludGVyIChhcyBpbiBNX0JEX0ZJTkkpLgorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQgYWZ0ZXIgdGhlIG1vdmUKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gICAgICAgICAgICAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4gIAorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICBNQUNSTworICAgICAgICBNX0JEX01PViAgJEJ5dGVJbmRleCwgJEJpdEluZGV4CisKKyAgICAgICAgOy8vICgkcEJpdFN0cmVhbSwgJE9mZnNldCkgPSAoJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIE1PViAgICAgJEJpdENvdW50LCAkQml0SW5kZXgKKyAgICAgICAgTU9WICAgICAkcEJpdFN0cmVhbSwgJEJ5dGVJbmRleAorICAgICAgICBNRU5ECisKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBDb21wYXJlCisgICAgICAgIDsvLworICAgICAgICA7Ly8gQ29tcGFyZXMgYml0c3RyZWFtIHBvc2l0aW9uIHdpdGggdGhhdCBvZiBhIGRlc3RpbmF0aW9uIHBvc2l0aW9uLiBEZXN0aW5hdGlvbiBwb3NpdGlvbiAKKyAgICAgICAgOy8vIGlzIGhlbGQgaW4gdHdvIGlucHV0IHJlZ2lzdGVycyB3aGljaCBhcmUgY2FsY3VsYXRlZCB1c2luZyBNX0JEX0FERCBtYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkQnl0ZUluZGV4ICAgICAgLSBEZXN0aW5hdGlvbiBwQml0U3RyZWFtIHBvaW50ZXIsICg0IGJ5dGUgYWhlYWQgYXMgZGVzY3JpYmVkIGluIE1fQkRfQUREKQorICAgICAgICA7Ly8gJEJpdEluZGV4ICAgICAgIC0gRGVzdGluYXRpb24gQml0Q291bnQKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IFNlZSBkZXNjcmlwdGlvbiBhYm92ZS4KKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gRkxBR1MgICAgICAgICAgIC0gR0UgaWYgZGVzdGluYXRpb24gaXMgcmVhY2hlZCwgTFQgPSBpcyBkZXN0aW5hdGlvbiBpcyBhaGVhZAorICAgICAgICA7Ly8gJFQxICAgICAgICAgICAgIC0gY29ycnVwdGVkIHRlbXAvc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9DTVAgICRCeXRlSW5kZXgsICRCaXRJbmRleCwgJFQxCisgICAgICAgIAorICAgICAgICA7Ly8gUmV0dXJuIGZsYWdzIHNldCBieSAoY3VycmVudCBwb3NpdG9uKS0oJEJ5dGVJbmRleCwkQml0SW5kZXgpCisgICAgICAgIDsvLyBzbyBHRSBtZWFucyB0aGF0IHdlIGhhdmUgcmVhY2hlZCB0aGUgaW5kaWNhdGVkIHBvc2l0aW9uCisKKyAgICAgICAgQUREICAgICAgICAgJFQxLCAkcEJpdFN0cmVhbSwgJEJpdENvdW50LCBMU1IgIzMKKyAgICAgICAgQ01QICAgICAgICAgJFQxLCAkQnl0ZUluZGV4CisgICAgICAgIEFORCAgICAgICAgICRUMSwgJEJpdENvdW50LCAjNworICAgICAgICBDTVBFUSAgICAgICAkVDEsICRCaXRJbmRleCAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICAKKyAgICAgICAgOy8vIEJpdHN0cmVhbSBEZWNvZGUgZmluYWxpc2UKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBXcml0ZXMgYmFjayB0aGUgYml0c3RyZWFtIHN0YXRlIHRvIHRoZSBiaXRzdHJlYW0gcG9pbnRlcnMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHBCaXRTdHJlYW0gICAgIFwgCisgICAgICAgIDsvLyAkQml0QnVmZmVyICAgICAgIH0gU2VlIGRlc2NyaXB0aW9uIGFib3ZlLgorICAgICAgICA7Ly8gJEJpdENvdW50ICAgICAgIC8gCisgICAgICAgIDsvLworICAgICAgICA7Ly8gT3V0cHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkcHBCaXRTdHJlYW0gICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIG5leHQgYml0c3RyZWFtIGJ5dGUKKyAgICAgICAgOy8vICRwQml0T2Zmc2V0ICAgICAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgYnl0ZSAoMC4uNykKKyAgICAgICAgOy8vICRwQml0U3RyZWFtICAgICBcIAorICAgICAgICA7Ly8gJEJpdEJ1ZmZlciAgICAgICB9IHRoZXNlIHJlZ2lzdGVyIGFyZSBjb3JydXB0ZWQKKyAgICAgICAgOy8vICRCaXRDb3VudCAgICAgICAvIAorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9CRF9GSU5JICAkcHBCaXRTdHJlYW0sICRwQml0T2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8gQWR2YW5jZSBwb2ludGVyIGJ5IHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzIGluIHRoZSBidWZmZXIKKyAgICAgICAgQUREICAgICAkcEJpdFN0cmVhbSwgJHBCaXRTdHJlYW0sICRCaXRDb3VudCwgTFNSIzMKKyAgICAgICAgQU5EICAgICAkQml0Q291bnQsICRCaXRDb3VudCwgIzcKKyAgICAgICAgCisgICAgICAgIDsvLyBOb3cgbW92ZSBiYWNrIDMyIGJpdHMgdG8gcmVhY2ggdGhlIGZpcnN0IHVzdWVkIGJpdAorICAgICAgICBTVUIgICAgICRwQml0U3RyZWFtLCAkcEJpdFN0cmVhbSwgIzQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBvdXQgYml0c3RyZWFtIHN0YXRlCisgICAgICAgIFNUUiAgICAgJEJpdENvdW50LCBbJHBCaXRPZmZzZXRdCisgICAgICAgIFNUUiAgICAgJHBCaXRTdHJlYW0sIFskcHBCaXRTdHJlYW1dCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIEVORAorICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fQml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjY5OTAzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9CaXRzdHJlYW0uaApAQCAtMCwwICsxLDIxMiBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fQml0c3RyZWFtLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZTogYXJtQ09NTV9CaXRzdHJlYW0uaAorICogQnJpZWY6IERlY2xhcmVzIGNvbW1vbiBBUEkncy9EYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTWF4IEVuY29kZXJzL0RlY29kZXJzLgorICoKKyAqLworCisjaWZuZGVmIF9hcm1Db2RlY19IXworI2RlZmluZSBfYXJtQ29kZWNfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfVTggICBjb2RlTGVuOworICAgIE9NWF9VMzIJIGNvZGVXb3JkOworfSBBUk1fVkxDMzI7CisKKy8qIFRoZSBhYm92ZSBzaG91bGQgYmUgcmVuYW1lZCBhcyAiQVJNX1ZMQzMyIiAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtR2V0Qml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBSZWFkIE4gYml0cyBmcm9tIHRoZSBiaXRzdHJlYW0KKyAqICAgIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE49MS4uMzIKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtQnl0ZUFsaWduKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsaWduIHRoZSBwb2ludGVyICpwcEJpdFN0cmVhbSB0byB0aGUgbmV4dCBieXRlIGJvdW5kYXJ5CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworIAorT01YVm9pZCBhcm1CeXRlQWxpZ24oY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCk7CisKKy8qKiAKKyAqIEZ1bmN0aW9uOiBhcm1Ta2lwQml0cygpCisgKgorICogRGVzY3JpcHRpb246CisgKiBTa2lwIE4gYml0cyBmcm9tIHRoZSB2YWx1ZSBhdCAqcHBCaXRTdHJlYW0KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTgorICoKKyAqIFtvdXRdICAgICpwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiovCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpYWJsZSBiaXQgbGVuZ3RoIERlY29kZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBGdW5jdGlvbjogYXJtVW5QYWNrVkxDMzIoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVmFyaWFibGUgbGVuZ3RoIGRlY29kZSBvZiB2YXJpYWJsZSBsZW5ndGggc3ltYm9sIChtYXggc2l6ZSAzMiBiaXRzKSByZWFkIGZyb20KKyAqIHRoZSBiaXQgc3RyZWFtIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIGF0ICpwT2Zmc2V0IGJ5IHVzaW5nIHRoZSB0YWJsZQorICogcG9pbnRlZCBieSBwQ29kZUJvb2sKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICoqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKipwcEJpdFN0cmVhbQorICogW291dF0gICAgKnBPZmZzZXQKKyAqCisgKiBSZXR1cm5zIDogQ29kZSBCb29rIEluZGV4IGlmIHN1Y2Nlc3NmdWxsLiAKKyAqICAgICAgICAgOiAiQVJNX05PX0NPREVCT09LX0lOREVYID0gMHhGRkZGIiBpZiBzZWFyY2ggZmFpbHMuCisgKiovCisKKyNkZWZpbmUgQVJNX05PX0NPREVCT09LX0lOREVYIChPTVhfVTE2KSgweEZGRkYpCisKK09NWF9VMTYgYXJtVW5QYWNrVkxDMzIoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBjb25zdCBBUk1fVkxDMzIgKnBDb2RlQm9vaworKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRml4ZWQgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tCaXRzCisgKgorICogRGVzY3JpcHRpb246CisgKiBQYWNrIGEgVkxDIGNvZGUgd29yZCBpbnRvIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYml0IHN0cmVhbS4KKyAqIFtpbl0JcE9mZnNldAkgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JY29kZVdvcmQJCUNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiBbaW5dCWNvZGVMZW5ndGgJCUxlbmd0aCBvZiB0aGUgY29kZSB3b3JkIHZhbGlkIHJhbmdlIDEuLi4zMgorICoKKyAqIFtvdXRdIHBwQml0U3RyZWFtCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICoJICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJCWN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqCQkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispOworIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgYml0IGxlbmd0aCBFbmNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogRnVuY3Rpb246IGFybVBhY2tWTEMzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dCXBCaXRPZmZzZXQJICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMAorICogICAgICAgICAgICAgICAgICAgICAgdG8gNy4KKyAqIFtpbl0JIGNvZGUgICAgIAkJVkxDIGNvZGUgd29yZCB0aGF0IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZW5jb2RlZCwKKyAqCSAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKgkJCQkJCXN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0CQkqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICoJCQkJCQljdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKgkJCQkJCSpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja1ZMQzMyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBBUk1fVkxDMzIgY29kZSAKKyk7CisKKyNlbmRpZiAgICAgIC8qX2FybUNvZGVjX0hfKi8KKworLypFbmQgb2YgRmlsZSovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTBjZmRhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9JRENUVGFibGUuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRmlsZSAgICAgICAgIDogYXJtQ09NTV9JRENUVGFibGUuaAorICogRGVzY3JpcHRpb24gIDogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHRhYmxlcyBmb3IgSURDVCBjYWxjdWxhdGlvbi4KKyAqCisgKi8KKyAgCisjaWZuZGVmIF9hcm1DT01NX0lEQ1RUYWJsZV9IXworI2RlZmluZSBfYXJtQ09NTV9JRENUVGFibGVfSF8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisKKyAgICAgLyogIFRhYmxlIG9mIHModSkqQSh1KSpBKHYpLzE2IGF0IFExNQorICAgICAgKiAgcyh1KT0xLjAgMCA8PSB1IDw9IDUKKyAgICAgICogIHMoNik9Mi4wCisgICAgICAqICBzKDcpPTQuMAorICAgICAgKiAgQSgwKSA9IDIqc3FydCgyKQorICAgICAgKiAgQSh1KSA9IDQqY29zKHUqcGkvMTYpICBmb3IgKHUhPTApCisJICAqLworZXh0ZXJuIGNvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUUHJlU2NhbGUgWzY0XTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fSURDVENvZWYgWzRdOworCisjZW5kaWYgLyogX2FybUNPTU1fSURDVFRhYmxlX0hfICovCisKKworLyogRW5kIG9mIEZpbGUgKi8KKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiYWEwODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fSURDVF9zLmgKQEAgLTAsMCArMSwxNDUxIEBACis7Ly8KKzsvLyBUaGlzIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgc29mdHdhcmUgbWF5IGJlIHVzZWQgb25seSBhcworOy8vIGF1dGhvcmlzZWQgYnkgYSBsaWNlbnNpbmcgYWdyZWVtZW50IGZyb20gQVJNIExpbWl0ZWQKKzsvLyAgIChDKSBDT1BZUklHSFQgMjAwNCBBUk0gTGltaXRlZAorOy8vICAgICAgIEFMTCBSSUdIVFMgUkVTRVJWRUQKKzsvLyBUaGUgZW50aXJlIG5vdGljZSBhYm92ZSBtdXN0IGJlIHJlcHJvZHVjZWQgb24gYWxsIGF1dGhvcmlzZWQKKzsvLyBjb3BpZXMgYW5kIGNvcGllcyBtYXkgb25seSBiZSBtYWRlIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkCis7Ly8gYnkgYSBsaWNlbnNpbmcgYWdyZWVtZW50IGZyb20gQVJNIExpbWl0ZWQuCis7Ly8KKzsvLyBJRENUX3MucworOy8vCis7Ly8gSW52ZXJzZSBEQ1QgbW9kdWxlCis7Ly8KKzsvLyAKKzsvLyBBTEdPUklUSE0gREVTQ1JJUFRJT04KKzsvLworOy8vIFRoZSA4eDggMkQgSURDVCBpcyBwZXJmb3JtZWQgYnkgY2FsY3VsYXRpbmcgYSAxRCBJRENUIGZvciBlYWNoCis7Ly8gY29sdW1uIGFuZCB0aGVuIGEgMUQgSURDVCBmb3IgZWFjaCByb3cuCis7Ly8KKzsvLyBUaGUgOC1wb2ludCAxRCBJRENUIGlzIGRlZmluZWQgYnkKKzsvLyAgIGYoeCkgPSAoQygwKSpUKDApKmMoMCx4KSArIC4uLiArIEMoNykqVCg3KSpjKDcseCkpLzIKKzsvLworOy8vICAgQyh1KSA9IDEvc3FydCgyKSBpZiB1PTAgb3IgMSBpZiB1IT0wCis7Ly8gICBjKHUseCkgPSBjb3MoICgyeCsxKSp1KnBpLzE2ICkKKzsvLworOy8vIFdlIGNvbXB1dGUgdGhlIDgtcG9pbnQgMUQgSURDVCB1c2luZyB0aGUgcmV2ZXJzZSBvZgorOy8vIHRoZSBBcmFpLUFndWktTmFrYWppbWEgZmxvdyBncmFwaCB3aGljaCB3ZSBzcGxpdCBpbnRvCis7Ly8gNSBzdGFnZXMgbmFtZWQgaW4gcmV2ZXJzZSBvcmRlciB0byBpZGVudGlmeSB3aXRoIHRoZQorOy8vIGZvcndhcmQgRENULiBEaXJlY3QgaW52ZXJzaW9uIG9mIHRoZSBmb3J3YXJkIGZvcm11bGFlCis7Ly8gaW4gZmlsZSBGRENUX3MucyBnaXZlczoKKzsvLworOy8vIElTdGFnZSA1OiAgIGoodSkgPSBUKHUpKkEodSkgIFsgQSh1KT00KkModSkqYyh1LDApIF0KKzsvLyAgICAgICAgICAgICBbIEEoMCkgPSAyKnNxcnQoMikKKzsvLyAgICAgICAgICAgICAgIEEodSkgPSA0KmNvcyh1KnBpLzE2KSAgZm9yICh1IT0wKSBdCis7Ly8KKzsvLyBJU3RhZ2UgNDogICBpMCA9IGowICAgICAgICAgICAgIGkxID0gajQKKzsvLyAgICAgICAgICAgICBpMyA9IChqMitqNikvMiAgICAgIGkyID0gKGoyLWo2KS8yCis7Ly8gICAgICAgICAgICAgaTcgPSAoajUrajMpLzIgICAgICBpNCA9IChqNS1qMykvMgorOy8vICAgICAgICAgICAgIGk1ID0gKGoxK2o3KS8yICAgICAgaTYgPSAoajEtajcpLzIKKzsvLworOy8vIElTdGFnZSAzOiAgIGgwID0gKGkwK2kxKS8yICAgICAgaDEgPSAoaTAtaTEpLzIKKzsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKKzsvLyAgICAgICAgICAgICBoNCA9ICBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYKKzsvLyAgICAgICAgICAgICBoNiA9IC1zaW4ocGkvOCkqaTQgKyBjb3MocGkvOCkqaTYKKzsvLyAgICAgICAgICAgICBbIFRoZSBhYm92ZSB0d28gbGluZXMgcm90YXRlIGJ5IC0ocGkvOCkgXQorOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KS9zcXJ0MiAgaDcgPSAoaTUraTcpLzIgCis7Ly8gICAgICAgICAgICAgCis7Ly8gSVN0YWdlIDI6ICAgZzAgPSAoaDAraDMpLzIgICAgICBnMyA9IChoMC1oMykvMgorOy8vICAgICAgICAgICAgIGcxID0gKGgxK2gyKS8yICAgICAgZzIgPSAoaDEtaDIpLzIKKzsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNworOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Cis7Ly8KKzsvLyBJU3RhZ2UgMTogICBmMCA9IChnMCtnNykvMiAgICAgIGY3ID0gKGcwLWc3KS8yCis7Ly8gICAgICAgICAgICAgZjEgPSAoZzErZzYpLzIgICAgICBmNiA9IChnMS1nNikvMgorOy8vICAgICAgICAgICAgIGYyID0gKGcyK2c1KS8yICAgICAgZjUgPSAoZzItZzUpLzIKKzsvLyAgICAgICAgICAgICBmMyA9IChnMytnNCkvMiAgICAgIGY0ID0gKGczLWc0KS8yCis7Ly8KKzsvLyBOb3RlIHRoYXQgbW9zdCBjb2VmZmljaWVudHMgYXJlIGhhbHZlZCAzIHRpbWVzIGR1cmluZyB0aGUKKzsvLyBhYm92ZSBjYWxjdWxhdGlvbi4gV2UgY2FuIHJlc2NhbGUgdGhlIGFsZ29yaXRobSBkaXZpZGluZworOy8vIHRoZSBpbnB1dCBieSA4IHRvIHJlbW92ZSB0aGUgaGFsdmluZ3MuCis7Ly8KKzsvLyBJU3RhZ2UgNTogICBqKHUpID0gVCh1KSpBKHUpLzgKKzsvLworOy8vIElTdGFnZSA0OiAgIGkwID0gajAgICAgICAgICAgICAgaTEgPSBqNAorOy8vICAgICAgICAgICAgIGkzID0gajIgKyBqNiAgICAgICAgaTIgPSBqMiAtIGo2Cis7Ly8gICAgICAgICAgICAgaTcgPSBqNSArIGozICAgICAgICBpNCA9IGo1IC0gajMKKzsvLyAgICAgICAgICAgICBpNSA9IGoxICsgajcgICAgICAgIGk2ID0gajEgLSBqNworOy8vCis7Ly8gSVN0YWdlIDM6ICAgaDAgPSBpMCArIGkxICAgICAgICBoMSA9IGkwIC0gaTEKKzsvLyAgICAgICAgICAgICBoMiA9IChpMipzcXJ0MiktaTMgIGgzID0gaTMKKzsvLyAgICAgICAgICAgICBoNCA9IDIqKCBjb3MocGkvOCkqaTQgKyBzaW4ocGkvOCkqaTYpCis7Ly8gICAgICAgICAgICAgaDYgPSAyKigtc2luKHBpLzgpKmk0ICsgY29zKHBpLzgpKmk2KQorOy8vICAgICAgICAgICAgIGg1ID0gKGk1LWk3KSpzcXJ0MiAgaDcgPSBpNSArIGk3IAorOy8vICAgICAgICAgICAgIAorOy8vIElTdGFnZSAyOiAgIGcwID0gaDAgKyBoMyAgICAgICAgZzMgPSBoMCAtIGgzCis7Ly8gICAgICAgICAgICAgZzEgPSBoMSArIGgyICAgICAgICBnMiA9IGgxIC0gaDIKKzsvLyAgICAgICAgICAgICBnNyA9IGg3ICAgICAgICAgICAgIGc2ID0gaDYgLSBoNworOy8vICAgICAgICAgICAgIGc1ID0gaDUgLSBnNiAgICAgICAgZzQgPSBoNCAtIGc1Cis7Ly8KKzsvLyBJU3RhZ2UgMTogICBmMCA9IGcwICsgZzcgICAgICAgIGY3ID0gZzAgLSBnNworOy8vICAgICAgICAgICAgIGYxID0gZzEgKyBnNiAgICAgICAgZjYgPSBnMSAtIGc2Cis7Ly8gICAgICAgICAgICAgZjIgPSBnMiArIGc1ICAgICAgICBmNSA9IGcyIC0gZzUKKzsvLyAgICAgICAgICAgICBmMyA9IGczICsgZzQgICAgICAgIGY0ID0gZzMgLSBnNAorOy8vCis7Ly8gTm90ZToKKzsvLyAxLiBUaGUgc2NhbGluZyBieSBBKHUpLzggY2FuIG9mdGVuIGJlIGNvbWJpbmVkIHdpdGggaW52ZXJzZQorOy8vICAgIHF1YW50aXphdGlvbi4gVGhlIGNvbHVtbiBhbmQgcm93IHNjYWxpbmdzIGNhbiBiZSBjb21iaW5lZC4KKzsvLyAyLiBUaGUgZmxvd2dyYXBoIGluIHRoZSBBQU4gcGFwZXIgaGFzIGg0LGc2IG5lZ2F0ZWQgY29tcGFyZWQKKzsvLyAgICB0byB0aGUgYWJvdmUgY29kZSBidXQgaXMgb3RoZXJ3aXNlIGlkZW50aWNhbC4KKzsvLyAzLiBUaGUgcm90YXRpb24gYnkgLXBpLzggY2FuIGJlIHBlZm9ybWVkIHVzaW5nIHRocmVlIG11bHRpcGxpZXMKKzsvLyAgICBFZyAgYyppNCtzKmk2ID0gKGk2LWk0KSpzICsgKGMrcykqaTQKKzsvLyAgICAgICAtcyppNCtjKmk2ID0gKGk2LWk0KSpzICsgKGMtcykqaTYKKzsvLyA0LiBJZiB8VCh1KXw8PTEgdGhlbiBmcm9tIHRoZSBJRENUIGRlZmluaXRpb24sCis7Ly8gICAgfGYoeCl8IDw9ICgoMS9zcXJ0MikgKyB8YygxLHgpfCArIC4uICsgfGMoNyx4KXwpLzIKKzsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIGNvcyhwaS8xNikgKyAuLi4gKyBjb3MoNypwaS8xNikpLzIKKzsvLyAgICAgICAgICAgID0gKCgxL3NxcnQyKSArIChjb3QocGkvMzIpLTEpLzIpLzIKKzsvLyAgICAgICAgICAgID0gKDEgKyBjb3MocGkvMTYpICsgY29zKDJwaS8xNikgKyBjb3MoM3BpLzE2KSkvc3FydCgyKQorOy8vICAgICAgICAgICAgPSAoYXBwcm94KTIuNjQKKzsvLyAgICBTbyB0aGUgbWF4IGdhaW4gb2YgdGhlIDJEIElEQ1QgaXMgfng3LjAgPSAzIGJpdHMuCis7Ly8gICAgVGhlIHRhYmxlIGJlbG93IHNob3dzIGlucHV0IHBhdHRlcm5zIGdlbmVyYXRpbmcgdGhlIG1heGltdW0KKzsvLyAgICB2YWx1ZSBvZiB8Zih1KXwgZm9yIGlucHV0IGluIHRoZSByYW5nZSB8VCh4KXw8PTEuIE09LTEsIFA9KzEKKzsvLyAgICBJbnB1dFBhdHRlcm4gICAgICBNYXggfGYoeCl8Cis7Ly8gICAgICBQUFBQUFBQUCAgICAgICAgfGYwfCA9ICAyLjY0Cis7Ly8gICAgICBQUFBNTU1NTSAgICAgICAgfGYxfCA9ICAyLjY0Cis7Ly8gICAgICBQUE1NTVBQUCAgICAgICAgfGYyfCA9ICAyLjY0Cis7Ly8gICAgICBQUE1NUFBNTSAgICAgICAgfGYzfCA9ICAyLjY0Cis7Ly8gICAgICBQTU1QUE1NUCAgICAgICAgfGY0fCA9ICAyLjY0Cis7Ly8gICAgICBQTU1QTU1QTSAgICAgICAgfGY1fCA9ICAyLjY0Cis7Ly8gICAgICBQTVBQTVBNUCAgICAgICAgfGY2fCA9ICAyLjY0Cis7Ly8gICAgICBQTVBNUE1QTSAgICAgICAgfGY3fCA9ICAyLjY0Cis7Ly8gICBOb3RlIHRoYXQgdGhpcyBpbnB1dCBwYXR0ZXJuIGlzIHRoZSB0cmFuc3Bvc2Ugb2YgdGhlCis7Ly8gICBjb3JyZXNwb25kaW5nIG1heCBpbnB1dCBwYXR0ZXIgZm9yIHRoZSBGRENULgorCis7Ly8gQXJndW1lbnRzCisKK3BTcmMgICAgUk4gMCAgICA7Ly8gc291cmNlIGRhdGEgYnVmZmVyCitTdHJpZGUgIFJOIDEgICAgOy8vIGRlc3RpbmF0aW9uIHN0cmlkZSBpbiBieXRlcworcERlc3QgICBSTiAyICAgIDsvLyBkZXN0aW5hdGlvbiBkYXRhIGJ1ZmZlcgorcFNjYWxlICBSTiAzICAgIDsvLyBwb2ludGVyIHRvIHNjYWxpbmcgdGFibGUKKworCisgICAgICAgIDsvLyBEQ1QgSW52ZXJzZSBNYWNybworICAgICAgICA7Ly8gVGhlIERDVCBjb2RlIHNob3VsZCBiZSBwYXJhbWV0cml6ZWQgYWNjb3JkaW5nCisgICAgICAgIDsvLyB0byB0aGUgZm9sbG93aW5nIGlucHV0czoKKyAgICAgICAgOy8vICRvdXRzaXplID0gInU4IiAgOiAgOC1iaXQgdW5zaWduZWQgZGF0YSBzYXR1cmF0ZWQgKDAgdG8gKzI1NSkKKyAgICAgICAgOy8vICAgICAgICAgICAgInM5IiAgOiAxNi1iaXQgc2lnbmVkIGRhdGEgc2F0dXJhdGVkIHRvIDktYml0ICgtMjU2IHRvICsyNTUpCisgICAgICAgIDsvLyAgICAgICAgICAgICJzMTYiIDogMTYtYml0IHNpZ25lZCBkYXRhIG5vdCBzYXR1cmF0ZWQgKG1heCBzaXplIH4rLy0xNDI3MykKKyAgICAgICAgOy8vICRpbnNjYWxlID0gInMxNiIgOiBzaWduZWQgMTYtYml0IGFhbi1zY2FsZSB0YWJsZSwgUTE1IGZvcm1hdCwgd2l0aCA0IGJ5dGUgYWxpZ25tZW50CisgICAgICAgIDsvLyAgICAgICAgICAgICJzMzIiIDogc2lnbmVkIDMyLWJpdCBhYW4tc2NhbGUgdGFibGUsIFEyMyBmb3JtYXQsIHdpdGggNCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0czoKKyAgICAgICAgOy8vIHBTcmMgICA9IHIwID0gUG9pbnRlciB0byBpbnB1dCBkYXRhCisgICAgICAgIDsvLyAgICAgICAgICAgICAgIFJhbmdlIGlzIC0yNTYgdG8gKzI1NSAoOS1iaXQpCisgICAgICAgIDsvLyBTdHJpZGUgPSByMSA9IFN0cmlkZSBiZXR3ZWVuIGlucHV0IGxpbmVzCisgICAgICAgIDsvLyBwRGVzdCAgPSByMiA9IFBvaW50ZXIgdG8gb3V0cHV0IGRhdGEKKyAgICAgICAgOy8vIHBTY2FsZSA9IHIzID0gUG9pbnRlciB0byBhYW4tc2NhbGUgdGFibGUgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGJ5ICRpbnNjYWxlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fSURDVCAgJG91dHNpemUsICRpbnNjYWxlLCAkc3RyaWRlCisgICAgICAgIExDTEEgICAgU0hJRlQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBJRiBBUk0xMTM2SlMKKyAgICAgICAgCis7Ly8gUkVHSVNURVIgQUxMT0NBVElPTgorOy8vIFRoaXMgaXMgaGFyZCBzaW5jZSB3ZSBoYXZlIDggdmFsdWVzLCA5IGZyZWUgcmVnaXN0ZXJzIGFuZCBlYWNoCis7Ly8gYnV0dGVyZmx5IHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyLiBXZSBhbHNvIHdhbnQgdG8gCis7Ly8gbWFpbnRhaW4gcmVnaXN0ZXIgb3JkZXIgc28gd2UgY2FuIHVzZSBMRE0vU1RNLiBUaGUgdGFibGUgYmVsb3cKKzsvLyBzdW1tYXJpc2VzIHRoZSByZWdpc3RlciBhbGxvY2F0aW9uIHRoYXQgbWVldHMgYWxsIHRoZXNlIGNyaXRlcmlhLgorOy8vIGE9MXN0Y29sLCBiPTJuZGNvbCwgZixnLGgsaSBhcmUgZGF0YWZsb3cgcG9pbnRzIGRlc2NyaWJlZCBhYm92ZS4KKzsvLworOy8vIHIxICBhMDEgICAgIGcwICBoMAorOy8vIHI0ICBiMDEgZjAgIGcxICBoMSAgaTAKKzsvLyByNSAgYTIzIGYxICBnMiAgICAgIGkxCis7Ly8gcjYgIGIyMyBmMiAgZzMgIGgyICBpMgorOy8vIHI3ICBhNDUgZjMgICAgICBoMyAgaTMKKzsvLyByOCAgYjQ1IGY0ICBnNCAgaDQgIGk0Cis7Ly8gcjkgIGE2NyBmNSAgZzUgIGg1ICBpNQorOy8vIHIxMCBiNjcgZjYgIGc2ICBoNiAgaTYKKzsvLyByMTEgICAgIGY3ICBnNyAgaDcgIGk3Cis7Ly8KK3JhMDEgICAgUk4gMQorcmIwMSAgICBSTiA0CityYTIzICAgIFJOIDUKK3JiMjMgICAgUk4gNgorcmE0NSAgICBSTiA3CityYjQ1ICAgIFJOIDgKK3JhNjcgICAgUk4gOQorcmI2NyAgICBSTiAxMAorcnRtcCAgICBSTiAxMQorY3NQaUJ5OCBSTiAxMiAgIDsvLyBbIChTaW4ocGkvOClAUTE1KSwgKENvcyhwaS84KUBRMTUpIF0KK0xvb3BSUjIgUk4gMTQgICA7Ly8gWyBMb29wTnVtYmVyPDwxMyAsICgxL1NxcnQoMikpQFExNSBdCis7Ly8gVHJhbnNwb3NlIGFsbG9jYXRpb24KK3hmdCAgICAgUk4gcmEwMQoreGYwICAgICBSTiByYjAxCit4ZjEgICAgIFJOIHJhMjMKK3hmMiAgICAgUk4gcmIyMworeGYzICAgICBSTiByYTQ1Cit4ZjQgICAgIFJOIHJiNDUKK3hmNSAgICAgUk4gcmE2NworeGY2ICAgICBSTiByYjY3Cit4ZjcgICAgIFJOIHJ0bXAKKzsvLyBJU3RhZ2UgMSBhbGxvY2F0aW9uCit4ZzAgICAgIFJOIHhmdAoreGcxICAgICBSTiB4ZjAKK3hnMiAgICAgUk4geGYxCit4ZzMgICAgIFJOIHhmMgoreGd0ICAgICBSTiB4ZjMKK3hnNCAgICAgUk4geGY0Cit4ZzUgICAgIFJOIHhmNQoreGc2ICAgICBSTiB4ZjYKK3hnNyAgICAgUk4geGY3Cis7Ly8gSVN0YWdlIDIgYWxsb2NhdGlvbgoreGgwICAgICBSTiB4ZzAKK3hoMSAgICAgUk4geGcxCit4aHQgICAgIFJOIHhnMgoreGgyICAgICBSTiB4ZzMKK3hoMyAgICAgUk4geGd0Cit4aDQgICAgIFJOIHhnNAoreGg1ICAgICBSTiB4ZzUKK3hoNiAgICAgUk4geGc2Cit4aDcgICAgIFJOIHhnNworOy8vIElTdGFnZSAzLDQgYWxsb2NhdGlvbgoreGl0ICAgICBSTiB4aDAKK3hpMCAgICAgUk4geGgxCit4aTEgICAgIFJOIHhodAoreGkyICAgICBSTiB4aDIKK3hpMyAgICAgUk4geGgzCit4aTQgICAgIFJOIHhoNAoreGk1ICAgICBSTiB4aDUKK3hpNiAgICAgUk4geGg2Cit4aTcgICAgIFJOIHhoNworICAgICAgICAKKyAgICAgICAgTV9TVFIgICBwRGVzdCwgIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX1NUUiAgIFN0cmlkZSwgcFN0cmlkZQorICAgICAgICBFTkRJRgorICAgICAgICBNX0FEUiAgIHBEZXN0LCAgcEJsaworICAgICAgICBMRFIgICAgIGNzUGlCeTgsID0weDMwZmM3NjQyCisgICAgICAgIExEUiAgICAgTG9vcFJSMiwgPTB4MDAwMDVhODIKKyAgCit2Nl9pZGN0X2NvbCRfRgorICAgICAgICA7Ly8gTG9hZCBldmVuIHZhbHVlcworICAgICAgICBMRFIgICAgIHhpNCwgW3BTcmNdLCAjNCAgOy8vIGowCisgICAgICAgIExEUiAgICAgeGk1LCBbcFNyYywgIzQqMTYtNF0gIDsvLyBqNAorICAgICAgICBMRFIgICAgIHhpNiwgW3BTcmMsICMyKjE2LTRdICA7Ly8gajIKKyAgICAgICAgTERSICAgICB4aTcsIFtwU3JjLCAjNioxNi00XSAgOy8vIGo2CisgICAgICAgIAorICAgICAgICA7Ly8gU2NhbGUgRXZlbiBWYWx1ZXMKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiA7Ly8gMTZ4MTYgbXVsCitTSElGVCAgICAgICBTRVRBICAgIDEyCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM0CisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzQqMTYtNF0gICAgICAgIAorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICMyKjE2LTRdCisgICAgICAgICAgICBNT1YgICAgIHhpdCwgIzE8PChTSElGVC0xKQorICAgICAgICAgICAgU01MQUJCICB4aTMsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGk0LCB4aTAsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBQkIgIHhpMCwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTUsIHhpMSwgeGk1LCB4aXQKKyAgICAgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTMsIHhpNCwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMTYtNF0KKyAgICAgICAgICAgIFNNTEFCQiAgeGkxLCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNiwgeGkyLCB4aTYsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTAsIHhpMCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTUsIHhpMCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIFNNTEFCQiAgeGkyLCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpNywgeGkzLCB4aTcsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTEsIHhpMSwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTYsIHhpMSwgeGk2LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk3LCB4aTIsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkaW5zY2FsZSI9InMzMiIgOy8vIDMyeDE2IG11bAorU0hJRlQgICAgICAgU0VUQSAgICAoMTIrOC0xNikKKyAgICAgICAgICAgIE1PViAgICAgeGl0LCAjMTw8KFNISUZULTEpCisgICAgICAgICAgICBMRFIgICAgIHhpMCwgW3BTY2FsZV0sICM4CisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzAqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM0KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzQqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNCwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTUsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk1LCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk0LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpNSwgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTERSICAgICB4aTAsIFtwU2NhbGUsICMyKjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMSwgW3BTY2FsZSwgIzIqMzIrNC04XQorICAgICAgICAgICAgTERSICAgICB4aTIsIFtwU2NhbGUsICM2KjMyLThdCisgICAgICAgICAgICBMRFIgICAgIHhpMywgW3BTY2FsZSwgIzYqMzIrNC04XSAgICAgICAgICAgIAorICAgICAgICAgICAgU01MQVdCICB4aTAsIHhpMCwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFXVCAgeGkxLCB4aTEsIHhpNiwgeGl0CisgICAgICAgICAgICBTTUxBV0IgIHhpMiwgeGkyLCB4aTcsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTMsIHhpMywgeGk3LCB4aXQgICAgICAgICAgICAKKyAgICAgICAgICAgIE1PViAgICAgeGkwLCB4aTAsIEFTUiAjU0hJRlQKKyAgICAgICAgICAgIFBLSEJUICAgeGk2LCB4aTAsIHhpMSwgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBNT1YgICAgIHhpMiwgeGkyLCBBU1IgI1NISUZUICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHhpNywgeGkyLCB4aTMsIExTTCAjKDE2LVNISUZUKQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBvZGQgdmFsdWVzCisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTYtNF0gICAgICA7Ly8gajEKKyAgICAgICAgTERSICAgICB4aTEsIFtwU3JjLCAjNyoxNi00XSAgICAgIDsvLyBqNworICAgICAgICBMRFIgICAgIHhpMiwgW3BTcmMsICM1KjE2LTRdICAgICAgOy8vIGo1CisgICAgICAgIExEUiAgICAgeGkzLCBbcFNyYywgIzMqMTYtNF0gICAgICA7Ly8gajMKKyAgICAgICAgCisgICAgICAgIElGICB7VFJVRX0KKyAgICAgICAgICAgIDsvLyBzaG9ydGN1dCBpZiBvZGQgdmFsdWVzIDAKKyAgICAgICAgICAgIFRFUSAgICAgeGkwLCAjMAorICAgICAgICAgICAgVEVRRVEgICB4aTEsICMwCisgICAgICAgICAgICBURVFFUSAgIHhpMiwgIzAKKyAgICAgICAgICAgIFRFUUVRICAgeGkzLCAjMAorICAgICAgICAgICAgQkVRICAgICB2Nk9kZFplcm8kX0YKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBzY2FsZWQgZXZlbiB2YWx1ZXMKKyAgICAgICAgU1RNSUEgICBwRGVzdCwge3hpNCwgeGk1LCB4aTYsIHhpN30KKyAgICAgICAgCisgICAgICAgIDsvLyBTY2FsZSBvZGQgdmFsdWVzCisgICAgICAgIElGICIkaW5zY2FsZSI9InMxNiIKKyAgICAgICAgICAgIDsvLyBQZXJmb3JtIEFBTiBTY2FsZQorICAgICAgICAgICAgTERSICAgICB4aTQsIFtwU2NhbGUsICMxKjE2LTRdCisgICAgICAgICAgICBMRFIgICAgIHhpNSwgW3BTY2FsZSwgIzcqMTYtNF0gICAgICAgIAorICAgICAgICAgICAgTERSICAgICB4aTYsIFtwU2NhbGUsICM1KjE2LTRdCisgICAgICAgICAgICBTTUxBQkIgIHhpNywgeGkwLCB4aTQsIHhpdAorICAgICAgICAgICAgU01MQVRUICB4aTAsIHhpMCwgeGk0LCB4aXQKKyAgICAgICAgICAgIFNNTEFCQiAgeGk0LCB4aTEsIHhpNSwgeGl0CisgICAgICAgICAgICBTTUxBVFQgIHhpMSwgeGkxLCB4aTUsIHhpdAorICAgICAgICAgICAgTU9WICAgICB4aTcsIHhpNywgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNywgeGkwLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyoxNi00XQorICAgICAgICAgICAgU01MQUJCICB4aTUsIHhpMiwgeGk2LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkyLCB4aTIsIHhpNiwgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNCwgeGk0LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMSwgeGk0LCB4aTEsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgU01MQUJCICB4aTYsIHhpMywgeGk3LCB4aXQKKyAgICAgICAgICAgIFNNTEFUVCAgeGkzLCB4aTMsIHhpNywgeGl0CisgICAgICAgICAgICBNT1YgICAgIHhpNSwgeGk1LCBBU1IgI1NISUZUCisgICAgICAgICAgICBQS0hCVCAgIHhpMiwgeGk1LCB4aTIsIExTTCAjKDE2LVNISUZUKQorICAgICAgICAgICAgTU9WICAgICB4aTYsIHhpNiwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTMsIHhpNiwgeGkzLCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiA7Ly8gMzJ4MTYgbXVsCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzEqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjMSozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzcqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjNyozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTAsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkwLCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMSwgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTEsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTAsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGkxLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgICAgICBMRFIgICAgIHhpNCwgW3BTY2FsZSwgIzUqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk1LCBbcFNjYWxlLCAjNSozMis0LThdCisgICAgICAgICAgICBMRFIgICAgIHhpNiwgW3BTY2FsZSwgIzMqMzItOF0KKyAgICAgICAgICAgIExEUiAgICAgeGk3LCBbcFNjYWxlLCAjMyozMis0LThdICAgICAgICAgICAgCisgICAgICAgICAgICBTTUxBV0IgIHhpNCwgeGk0LCB4aTIsIHhpdAorICAgICAgICAgICAgU01MQVdUICB4aTUsIHhpNSwgeGkyLCB4aXQKKyAgICAgICAgICAgIFNNTEFXQiAgeGk2LCB4aTYsIHhpMywgeGl0CisgICAgICAgICAgICBTTUxBV1QgIHhpNywgeGk3LCB4aTMsIHhpdCAgICAgICAgICAgIAorICAgICAgICAgICAgTU9WICAgICB4aTQsIHhpNCwgQVNSICNTSElGVAorICAgICAgICAgICAgUEtIQlQgICB4aTIsIHhpNCwgeGk1LCBMU0wgIygxNi1TSElGVCkKKyAgICAgICAgICAgIE1PViAgICAgeGk2LCB4aTYsIEFTUiAjU0hJRlQgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgeGkzLCB4aTYsIHhpNywgTFNMICMoMTYtU0hJRlQpCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHhpdCwgPTB4MDAwMTAwMDEgICAgICAgIDsvLyByb3VuZGluZyBjb25zdGFudAorICAgICAgICBTQUREMTYgeGk1LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBTSEFERDE2IHhpNSwgeGk1LCB4aXQKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGk2LCB4aTAsIHhpMSAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIFNBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFNIQUREMTYgeGk3LCB4aTcsIHhpdAorICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTQsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gajUtajMKKyAgICAgICAgCisgICAgICAgIFNTVUIxNiAgeGkzLCB4aTUsIHhpNyAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICB4aTAsIHhpNiwgeGk0LCBMU0wjMTYgICA7Ly8gW2k0LGk2XSByb3cgYQorICAgICAgICBQS0hUQiAgIHhpMSwgeGk0LCB4aTYsIEFTUiMxNiAgIDsvLyBbaTQsaTZdIHJvdyBiCisgICAgICAgIAorICAgICAgICBTTVVBRFggIHhpMiwgeGkwLCBjc1BpQnk4ICAgICAgIDsvLyByb3dhIGJ5IFtjLHNdCisgICAgICAgIFNNVUFEWCAgeGk0LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgW2Msc10KKyAgICAgICAgU01VU0QgICB4aTAsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbLXMsY10gICAKKyAgICAgICAgU01VU0QgICB4aTYsIHhpMSwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YiBieSBbLXMsY10KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU01VTEJCICB4aTEsIHhpMywgTG9vcFJSMgorICAgICAgICBTTVVMVEIgIHhpMywgeGkzLCBMb29wUlIyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSFRCICAgeGg0LCB4aTQsIHhpMiwgQVNSIzE2ICAgOy8vIGg0LzQKKyAgICAgICAgUEtIVEIgICB4aDYsIHhpNiwgeGkwLCBBU1IjMTYgICA7Ly8gaDYvNAorICAgICAgICBTSEFERDE2IHhoNywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIHhpMCx4aTEseGkyLHhpMyBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMywgcm93cyAydG8zIHgxLzIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkzLCB4aTMsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoNSwgeGkzLCB4aTEsIEFTUiMxNSAgIDsvLyBoNS80CisgICAgICAgIExEUkQgICAgeGkwLCBbcERlc3QsICM4XSAgICAgICAgOy8vIGoyLGo2IHNjYWxlZAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhnNCwgeGg0LCB4ZzUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICBQS0hUQiAgIHhoMiwgeGkyLCB4aTAsIEFTUiMxNSAgIDsvLyBpMipzcXJ0KDIpLzQKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgTERSRCAgICB4aTAsIFtwRGVzdF0gICAgICAgICAgICA7Ly8gajAsIGo0IHNjYWxlZAorICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTAsIHhpMQorICAgICAgICBTSFNVQjE2IHhoMSwgeGkwLCB4aTEgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFNBREQxNiAgeGYzLCB4ZzMsIHhnNAorICAgICAgICBTU1VCMTYgIHhmNCwgeGczLCB4ZzQKKyAgICAgICAgU0FERDE2ICB4ZjIsIHhnMiwgeGc1CisgICAgICAgIFNTVUIxNiAgeGY1LCB4ZzIsIHhnNQorICAgICAgICBTQUREMTYgIHhmMSwgeGcxLCB4ZzYKKyAgICAgICAgU1NVQjE2ICB4ZjYsIHhnMSwgeGc2CisgICAgICAgIFNBREQxNiAgeGYwLCB4ZzAsIHhnNworICAgICAgICBTU1VCMTYgIHhmNywgeGcwLCB4ZzcKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UsIHN0b3JlIGFuZCBsb29wCisgICAgICAgIFBLSEJUICAgcmEwMSwgeGYwLCB4ZjEsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjAxLCB4ZjEsIHhmMCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMjMsIHhmMywgeGYyLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmI0NSwgeGY1LCB4ZjQsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYTAxLCByYTIzLCByYTQ1LCByYTY3fSAgICAgIAorICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgorICAgICAgICAKKyAgICAgICAgU1VCICAgICBwU3JjLCBwRGVzdCwgIyg2NCoyKQorICAgICAgICBNX0xEUiAgIHBEZXN0LCBwcERlc3QKKyAgICAgICAgSUYgIiRzdHJpZGUiPSJzIgorICAgICAgICAgICAgTV9MRFIgICBwU2NhbGUsIHBTdHJpZGUgCisgICAgICAgIEVORElGCisgICAgICAgIEIgICAgICAgdjZfaWRjdF9yb3ckX0YKKyAgICAgICAgCit2Nk9kZFplcm8kX0YKKyAgICAgICAgU1NVQjE2ICB4aTIsIHhpNiwgeGk3ICAgICAgICAgICA7Ly8gKGoyLWo2KQorICAgICAgICBTSEFERDE2IHhpMywgeGk2LCB4aTcgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkwLCB4aTIsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTIsIHhpMiwgTG9vcFJSMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICB4aTIsIHhpMiwgTFNMICMxCisgICAgICAgIFBLSFRCICAgeGgyLCB4aTIsIHhpMCwgQVNSIzE1ICAgOy8vIGkyKnNxcnQoMikvNAorICAgICAgICBTU1VCMTYgIHhoMiwgeGgyLCB4aTMKKyAgICAgICAgCisgICAgICAgIDsvLyB4aTAsIHhpMSBub3cgZnJlZQorICAgICAgICA7Ly8gSVN0YWdlIDQsMyByb3dzIDB0bzEgeCAxLzIKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGgwLCB4aTQsIHhpNQorICAgICAgICBTSFNVQjE2IHhoMSwgeGk0LCB4aTUgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIgcm93cyAwdG8zIHggMS8yCisgICAgICAgIFNIU1VCMTYgeGcyLCB4aDEsIHhoMgorICAgICAgICBTSEFERDE2IHhnMSwgeGgxLCB4aDIKKyAgICAgICAgU0hTVUIxNiB4ZzMsIHhoMCwgeGgzCisgICAgICAgIFNIQUREMTYgeGcwLCB4aDAsIHhoMworICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMSBhbGwgcm93cworICAgICAgICBNT1YgIHhmMywgeGczCisgICAgICAgIE1PViAgeGY0LCB4ZzMKKyAgICAgICAgTU9WICB4ZjIsIHhnMgorICAgICAgICBNT1YgIHhmNSwgeGcyCisgICAgICAgIE1PViAgeGYxLCB4ZzEKKyAgICAgICAgTU9WICB4ZjYsIHhnMQorICAgICAgICBNT1YgIHhmMCwgeGcwCisgICAgICAgIE1PViAgeGY3LCB4ZzAKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UKKyAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMSwgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICBQS0hCVCAgIHJhMjMsIHhmMiwgeGYzLCBMU0wgIzE2CisgICAgICAgIFBLSFRCICAgcmIyMywgeGYzLCB4ZjIsIEFTUiAjMTYKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgcmE0NSwgeGY0LCB4ZjUsIExTTCAjMTYKKyAgICAgICAgUEtIVEIgICByYjQ1LCB4ZjUsIHhmNCwgQVNSICMxNgorICAgICAgICAKKyAgICAgICAgUEtIQlQgICByYTY3LCB4ZjYsIHhmNywgTFNMICMxNgorICAgICAgICBQS0hUQiAgIHJiNjcsIHhmNywgeGY2LCBBU1IgIzE2CisgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTUlBICAgcERlc3QhLCB7cmEwMSwgcmEyMywgcmE0NSwgcmE2N30gICAgICAKKyAgICAgICAgQUREUyAgICBMb29wUlIyLCBMb29wUlIyLCAjMjw8MjkgICAgOy8vIGRvbmUgdHdvIHJvd3MKKyAgICAgICAgU1RNSUEgICBwRGVzdCEsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAKKyAgICAgICAgQkNDICAgICB2Nl9pZGN0X2NvbCRfRgorICAgICAgICBTVUIgICAgIHBTcmMsIHBEZXN0LCAjKDY0KjIpCisgICAgICAgIE1fTERSICAgcERlc3QsIHBwRGVzdAorICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICBNX0xEUiAgIHBTY2FsZSwgcFN0cmlkZSAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgIAorICAgICAgICAKK3Y2X2lkY3Rfcm93JF9GCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzLCByb3dzNHRvNyB4MS80CisgICAgICAgIExEUiAgICAgeGl0LCA9MHgwMDAxMDAwMSAgICAgICAgOy8vIHJvdW5kaW5nIGNvbnN0YW50CisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyYywgIzEqMTZdICAgICAgOy8vIGoxCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzcqMTZdICAgICAgOy8vIDQqajcKKyAgICAgICAgTERSICAgICB4aTIsIFtwU3JjLCAjNSoxNl0gICAgICA7Ly8gajUKKyAgICAgICAgTERSICAgICB4aTMsIFtwU3JjLCAjMyoxNl0gICAgICA7Ly8gajMKKyAgICAgICAgCisgICAgICAgIFNIQUREMTYgeGkxLCB4aTEsIHhpdCAgICAgICAgICAgOy8vIDIqajcKKyAgICAgICAgU0hBREQxNiB4aTEsIHhpMSwgeGl0ICAgICAgICAgICA7Ly8gajcgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpNSwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgU1NVQjE2ICB4aTYsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gajEtajcKKyAgICAgICAgU0hBREQxNiB4aTcsIHhpMiwgeGkzICAgICAgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgIFNTVUIxNiAgeGk0LCB4aTIsIHhpMyAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIAorICAgICAgICBTU1VCMTYgIHhpMywgeGk1LCB4aTcgICAgICAgICAgIDsvLyAoaTUtaTcpLzIKKyAgICAgICAgCisgICAgICAgIFBLSEJUICAgeGkwLCB4aTYsIHhpNCwgTFNMIzE2ICAgOy8vIFtpNCxpNl0gcm93IGEKKyAgICAgICAgUEtIVEIgICB4aTEsIHhpNCwgeGk2LCBBU1IjMTYgICA7Ly8gW2k0LGk2XSByb3cgYgorICAgICAgICAKKyAgICAgICAgU01VQURYICB4aTIsIHhpMCwgY3NQaUJ5OCAgICAgICA7Ly8gcm93YSBieSBbYyxzXQorICAgICAgICBTTVVBRFggIHhpNCwgeGkxLCBjc1BpQnk4ICAgICAgIDsvLyByb3diIGJ5IFtjLHNdCisgICAgICAgIFNNVVNEICAgeGkwLCB4aTAsIGNzUGlCeTggICAgICAgOy8vIHJvd2EgYnkgWy1zLGNdICAgCisgICAgICAgIFNNVVNEICAgeGk2LCB4aTEsIGNzUGlCeTggICAgICAgOy8vIHJvd2IgYnkgWy1zLGNdCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNNVUxCQiAgeGkxLCB4aTMsIExvb3BSUjIKKyAgICAgICAgU01VTFRCICB4aTMsIHhpMywgTG9vcFJSMgorICAgICAgICAgICAgICAgIAorICAgICAgICBQS0hUQiAgIHhoNCwgeGk0LCB4aTIsIEFTUiMxNiAgIDsvLyBoNC80CisgICAgICAgIFBLSFRCICAgeGg2LCB4aTYsIHhpMCwgQVNSIzE2ICAgOy8vIGg2LzQKKyAgICAgICAgU0hBREQxNiB4aDcsIHhpNSwgeGk3ICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIAorICAgICAgICBNT1YgICAgIHhpMywgeGkzLCBMU0wgIzEKKyAgICAgICAgUEtIVEIgICB4aDUsIHhpMywgeGkxLCBBU1IjMTUgICA7Ly8gaDUvNAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyB4aTAseGkxLHhpMix4aTMgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMsIHJvd3MgMnRvMyB4MS8yCisgICAgICAgIAorICAgICAgICBMRFIgICAgIHhpMCwgW3BTcmMsICMyKjE2XSAgICAgIDsvLyBqMgorICAgICAgICBMRFIgICAgIHhpMSwgW3BTcmMsICM2KjE2XSAgICAgIDsvLyAyKmo2CisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDIsIHJvd3M0dG83CisgICAgICAgIFNTVUIxNiAgeGc2LCB4aDYsIHhoNworICAgICAgICBTU1VCMTYgIHhnNSwgeGg1LCB4ZzYKKyAgICAgICAgU1NVQjE2ICB4ZzQsIHhoNCwgeGc1CisgICAgICAgIAorICAgICAgICBTSEFERDE2IHhpMSwgeGkxLCB4aXQgICAgICAgICAgIDsvLyBqNgorICAgICAgICBTU1VCMTYgIHhpMiwgeGkwLCB4aTEgICAgICAgICAgIDsvLyAoajItajYpICAgICAgICAKKyAgICAgICAgU0hBREQxNiB4aTMsIHhpMCwgeGkxICAgICAgICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgIAorICAgICAgICBTTVVMQkIgIHhpMCwgeGkyLCBMb29wUlIyCisgICAgICAgIFNNVUxUQiAgeGkyLCB4aTIsIExvb3BSUjIKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgeGkyLCB4aTIsIExTTCAjMQorICAgICAgICAKKyAgICAgICAgUEtIVEIgICB4aDIsIHhpMiwgeGkwLCBBU1IjMTUgICA7Ly8gaTIqc3FydCgyKS80CisgICAgICAgIAorICAgICAgICA7Ly8geGkwLCB4aTEgbm93IGZyZWUKKyAgICAgICAgOy8vIElTdGFnZSA0LDMgcm93cyAwdG8xIHggMS8yCisgICAgICAgIExEUiAgICAgeGkxLCBbcFNyYywgIzQqMTZdICAgICAgOy8vIGo0CisgICAgICAgIExEUiAgICAgeGkwLCBbcFNyY10sICM0ICAgICAgICAgOy8vIGowCisKKyAgICAgICAgU1NVQjE2ICB4aDIsIHhoMiwgeGkzCisgICAgICAgIEFERFMgICAgTG9vcFJSMiwgTG9vcFJSMiwgIzI8PDI5ICAgIDsvLyBkb25lIHR3byByb3dzCisgICAgICAgIAorICAgICAgICBBREQgICAgIHhpMCwgeGkwLCB4aXQsIExTTCAjMiAgIDsvLyBlbnN1cmUgY29ycmVjdCByb3VuZAorICAgICAgICBTSEFERDE2IHhoMCwgeGkwLCB4aTEgICAgICAgICAgIDsvLyBvZiBEQyByZXN1bHQKKyAgICAgICAgU0hTVUIxNiB4aDEsIHhpMCwgeGkxCisgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgU0hTVUIxNiB4ZzIsIHhoMSwgeGgyCisgICAgICAgIFNIQUREMTYgeGcxLCB4aDEsIHhoMgorICAgICAgICBTSFNVQjE2IHhnMywgeGgwLCB4aDMKKyAgICAgICAgU0hBREQxNiB4ZzAsIHhoMCwgeGgzCisgICAgICAgIAorICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgU0hBREQxNiB4ZjMsIHhnMywgeGc0CisgICAgICAgIFNIU1VCMTYgeGY0LCB4ZzMsIHhnNAorICAgICAgICBTSEFERDE2IHhmMiwgeGcyLCB4ZzUKKyAgICAgICAgU0hTVUIxNiB4ZjUsIHhnMiwgeGc1CisgICAgICAgIFNIQUREMTYgeGYxLCB4ZzEsIHhnNgorICAgICAgICBTSFNVQjE2IHhmNiwgeGcxLCB4ZzYKKyAgICAgICAgU0hBREQxNiB4ZjAsIHhnMCwgeGc3CisgICAgICAgIFNIU1VCMTYgeGY3LCB4ZzAsIHhnNworICAgICAgICAKKyAgICAgICAgOy8vIFNhdHVyYXRlCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICBVU0FUMTYgIHhmMCwgIzgsIHhmMAorICAgICAgICAgICAgVVNBVDE2ICB4ZjEsICM4LCB4ZjEKKyAgICAgICAgICAgIFVTQVQxNiAgeGYyLCAjOCwgeGYyCisgICAgICAgICAgICBVU0FUMTYgIHhmMywgIzgsIHhmMworICAgICAgICAgICAgVVNBVDE2ICB4ZjQsICM4LCB4ZjQKKyAgICAgICAgICAgIFVTQVQxNiAgeGY1LCAjOCwgeGY1CisgICAgICAgICAgICBVU0FUMTYgIHhmNiwgIzgsIHhmNgorICAgICAgICAgICAgVVNBVDE2ICB4ZjcsICM4LCB4ZjcgICAgICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgU1NBVDE2ICB4ZjAsICM5LCB4ZjAKKyAgICAgICAgICAgIFNTQVQxNiAgeGYxLCAjOSwgeGYxCisgICAgICAgICAgICBTU0FUMTYgIHhmMiwgIzksIHhmMgorICAgICAgICAgICAgU1NBVDE2ICB4ZjMsICM5LCB4ZjMKKyAgICAgICAgICAgIFNTQVQxNiAgeGY0LCAjOSwgeGY0CisgICAgICAgICAgICBTU0FUMTYgIHhmNSwgIzksIHhmNQorICAgICAgICAgICAgU1NBVDE2ICB4ZjYsICM5LCB4ZjYKKyAgICAgICAgICAgIFNTQVQxNiAgeGY3LCAjOSwgeGY3ICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdG8gUm93LCBQYWNrIGFuZCBzdG9yZQorICAgICAgICBJRiAoIiRvdXRzaXplIj0idTgiKQorICAgICAgICAgICAgT1JSICAgICB4ZjAsIHhmMCwgeGYxLCBMU0wgIzggOy8vIFsgYjEgYjAgYTEgYTAgXQorICAgICAgICAgICAgT1JSICAgICB4ZjIsIHhmMiwgeGYzLCBMU0wgIzggOy8vIFsgYjMgYjIgYTMgYTIgXQorICAgICAgICAgICAgT1JSICAgICB4ZjQsIHhmNCwgeGY1LCBMU0wgIzggOy8vIFsgYjUgYjQgYTUgYTQgXQorICAgICAgICAgICAgT1JSICAgICB4ZjYsIHhmNiwgeGY3LCBMU0wgIzggOy8vIFsgYjcgYjYgYTcgYTYgXQorICAgICAgICAgICAgUEtIQlQgICByYTAxLCB4ZjAsIHhmMiwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjAxLCB4ZjIsIHhmMCwgQVNSICMxNgorICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjQsIHhmNiwgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjYsIHhmNCwgQVNSICMxNgorICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjN9CisgICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzfQorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyM30KKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgKCIkb3V0c2l6ZSI9InM5Iik6TE9SOigiJG91dHNpemUiPSJzMTYiKSAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhMDEsIHhmMCwgeGYxLCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiMDEsIHhmMSwgeGYwLCBBU1IgIzE2CisgICAgICAgIAorICAgICAgICAgICAgUEtIQlQgICByYTIzLCB4ZjIsIHhmMywgTFNMICMxNgorICAgICAgICAgICAgUEtIVEIgICByYjIzLCB4ZjMsIHhmMiwgQVNSICMxNgorICAgICAgICAgICAgCisgICAgICAgICAgICBQS0hCVCAgIHJhNDUsIHhmNCwgeGY1LCBMU0wgIzE2CisgICAgICAgICAgICBQS0hUQiAgIHJiNDUsIHhmNSwgeGY0LCBBU1IgIzE2CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFBLSEJUICAgcmE2NywgeGY2LCB4ZjcsIExTTCAjMTYKKyAgICAgICAgICAgIFBLSFRCICAgcmI2NywgeGY3LCB4ZjYsIEFTUiAjMTYKKyAgICAgICAgICAgIAorICAgICAgICAgICAgU1RNSUEgICBwRGVzdCwge3JhMDEsIHJhMjMsIHJhNDUsIHJhNjd9ICAgICAgCisgICAgICAgICAgICBJRiAiJHN0cmlkZSI9InMiCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsIHBTY2FsZQorICAgICAgICAgICAgICAgIFNUTUlBICAgcERlc3QsIHtyYjAxLCByYjIzLCByYjQ1LCByYjY3fSAgICAgIAorICAgICAgICAgICAgICAgIEFERCAgICAgcERlc3QsIHBEZXN0LCBwU2NhbGUKKyAgICAgICAgICAgIEVMU0UgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQUREICAgICBwRGVzdCwgcERlc3QsICMoJHN0cmlkZSkKKyAgICAgICAgICAgICAgICBTVE1JQSAgIHBEZXN0LCB7cmIwMSwgcmIyMywgcmI0NSwgcmI2N30gICAgICAKKyAgICAgICAgICAgICAgICBBREQgICAgIHBEZXN0LCBwRGVzdCwgIygkc3RyaWRlKQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEJDQyAgICAgdjZfaWRjdF9yb3ckX0YKKyAgICAgICAgRU5ESUYgOy8vIEFSTTExMzZKUworCisKKyAgICAgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCitTcmMwICAgICAgICAgICAgRVFVICA3ICAgICAgICAgICAgICAKK1NyYzEgICAgICAgICAgICBFUVUgIDggICAgICAgICAgICAgIAorU3JjMiAgICAgICAgICAgIEVRVSAgOSAgICAgICAgICAgICAgCitTcmMzICAgICAgICAgICAgRVFVICAxMCAgICAgICAgICAgICAgCitTcmM0ICAgICAgICAgICAgRVFVICAxMSAgICAgICAgICAgICAgCitTcmM1ICAgICAgICAgICAgRVFVICAxMiAgICAgICAgICAgICAgCitTcmM2ICAgICAgICAgICAgRVFVICAxMworU3JjNyAgICAgICAgICAgIEVRVSAgMTQKK1RtcCAgICAgICAgICAgICBFUVUgIDE1CisKK3FYajAgICAgICAgICAgICBRTiBTcmMwLlMxNiAKK3FYajEgICAgICAgICAgICBRTiBTcmMxLlMxNgorcVhqMiAgICAgICAgICAgIFFOIFNyYzIuUzE2CitxWGozICAgICAgICAgICAgUU4gU3JjMy5TMTYKK3FYajQgICAgICAgICAgICBRTiBTcmM0LlMxNgorcVhqNSAgICAgICAgICAgIFFOIFNyYzUuUzE2CitxWGo2ICAgICAgICAgICAgUU4gU3JjNi5TMTYKK3FYajcgICAgICAgICAgICBRTiBTcmM3LlMxNgorcVhqdCAgICAgICAgICAgIFFOIFRtcC5TMTYKKworZFhqMGxvICAgICAgICAgIEROIChTcmMwKjIpLlMxNgorZFhqMGhpICAgICAgICAgIEROIChTcmMwKjIrMSkuUzE2CitkWGoxbG8gICAgICAgICAgRE4gKFNyYzEqMikuUzE2CitkWGoxaGkgICAgICAgICAgRE4gKFNyYzEqMisxKS5TMTYKK2RYajJsbyAgICAgICAgICBETiAoU3JjMioyKS5TMTYKK2RYajJoaSAgICAgICAgICBETiAoU3JjMioyKzEpLlMxNgorZFhqM2xvICAgICAgICAgIEROIChTcmMzKjIpLlMxNgorZFhqM2hpICAgICAgICAgIEROIChTcmMzKjIrMSkuUzE2CitkWGo0bG8gICAgICAgICAgRE4gKFNyYzQqMikuUzE2CitkWGo0aGkgICAgICAgICAgRE4gKFNyYzQqMisxKS5TMTYKK2RYajVsbyAgICAgICAgICBETiAoU3JjNSoyKS5TMTYKK2RYajVoaSAgICAgICAgICBETiAoU3JjNSoyKzEpLlMxNgorZFhqNmxvICAgICAgICAgIEROIChTcmM2KjIpLlMxNgorZFhqNmhpICAgICAgICAgIEROIChTcmM2KjIrMSkuUzE2CitkWGo3bG8gICAgICAgICAgRE4gKFNyYzcqMikuUzE2CitkWGo3aGkgICAgICAgICAgRE4gKFNyYzcqMisxKS5TMTYKK2RYanRsbyAgICAgICAgICBETiAoVG1wKjIpLlMxNgorZFhqdGhpICAgICAgICAgIEROIChUbXAqMisxKS5TMTYKKworcVhpMCAgICAgICAgICAgIFFOIHFYajAKK3FYaTEgICAgICAgICAgICBRTiBxWGo0CitxWGkyICAgICAgICAgICAgUU4gcVhqMgorcVhpMyAgICAgICAgICAgIFFOIHFYajcKK3FYaTQgICAgICAgICAgICBRTiBxWGo1CitxWGk1ICAgICAgICAgICAgUU4gcVhqdAorcVhpNiAgICAgICAgICAgIFFOIHFYajEKK3FYaTcgICAgICAgICAgICBRTiBxWGo2CitxWGl0ICAgICAgICAgICAgUU4gcVhqMworCitkWGkwbG8gICAgICAgICAgRE4gZFhqMGxvCitkWGkwaGkgICAgICAgICAgRE4gZFhqMGhpCitkWGkxbG8gICAgICAgICAgRE4gZFhqNGxvCitkWGkxaGkgICAgICAgICAgRE4gZFhqNGhpCitkWGkybG8gICAgICAgICAgRE4gZFhqMmxvCitkWGkyaGkgICAgICAgICAgRE4gZFhqMmhpCitkWGkzbG8gICAgICAgICAgRE4gZFhqN2xvCitkWGkzaGkgICAgICAgICAgRE4gZFhqN2hpCitkWGk0bG8gICAgICAgICAgRE4gZFhqNWxvCitkWGk0aGkgICAgICAgICAgRE4gZFhqNWhpCitkWGk1bG8gICAgICAgICAgRE4gZFhqdGxvCitkWGk1aGkgICAgICAgICAgRE4gZFhqdGhpCitkWGk2bG8gICAgICAgICAgRE4gZFhqMWxvCitkWGk2aGkgICAgICAgICAgRE4gZFhqMWhpCitkWGk3bG8gICAgICAgICAgRE4gZFhqNmxvCitkWGk3aGkgICAgICAgICAgRE4gZFhqNmhpCitkWGl0bG8gICAgICAgICAgRE4gZFhqM2xvCitkWGl0aGkgICAgICAgICAgRE4gZFhqM2hpCisKK3FYaDAgICAgICAgICAgICBRTiBxWGl0CitxWGgxICAgICAgICAgICAgUU4gcVhpMAorcVhoMiAgICAgICAgICAgIFFOIHFYaTIKK3FYaDMgICAgICAgICAgICBRTiBxWGkzCitxWGg0ICAgICAgICAgICAgUU4gcVhpNworcVhoNSAgICAgICAgICAgIFFOIHFYaTUKK3FYaDYgICAgICAgICAgICBRTiBxWGk0CitxWGg3ICAgICAgICAgICAgUU4gcVhpMQorcVhodCAgICAgICAgICAgIFFOIHFYaTYKKworZFhoMGxvICAgICAgICAgIEROIGRYaXRsbworZFhoMGhpICAgICAgICAgIEROIGRYaXRoaQorZFhoMWxvICAgICAgICAgIEROIGRYaTBsbworZFhoMWhpICAgICAgICAgIEROIGRYaTBoaQorZFhoMmxvICAgICAgICAgIEROIGRYaTJsbworZFhoMmhpICAgICAgICAgIEROIGRYaTJoaQorZFhoM2xvICAgICAgICAgIEROIGRYaTNsbworZFhoM2hpICAgICAgICAgIEROIGRYaTNoaQorZFhoNGxvICAgICAgICAgIEROIGRYaTdsbworZFhoNGhpICAgICAgICAgIEROIGRYaTdoaQorZFhoNWxvICAgICAgICAgIEROIGRYaTVsbworZFhoNWhpICAgICAgICAgIEROIGRYaTVoaQorZFhoNmxvICAgICAgICAgIEROIGRYaTRsbworZFhoNmhpICAgICAgICAgIEROIGRYaTRoaQorZFhoN2xvICAgICAgICAgIEROIGRYaTFsbworZFhoN2hpICAgICAgICAgIEROIGRYaTFoaQorZFhodGxvICAgICAgICAgIEROIGRYaTZsbworZFhodGhpICAgICAgICAgIEROIGRYaTZoaQorCitxWGcwICAgICAgICAgICAgUU4gcVhoMgorcVhnMSAgICAgICAgICAgIFFOIHFYaHQKK3FYZzIgICAgICAgICAgICBRTiBxWGgxCitxWGczICAgICAgICAgICAgUU4gcVhoMAorcVhnNCAgICAgICAgICAgIFFOIHFYaDQKK3FYZzUgICAgICAgICAgICBRTiBxWGg1CitxWGc2ICAgICAgICAgICAgUU4gcVhoNgorcVhnNyAgICAgICAgICAgIFFOIHFYaDcKK3FYZ3QgICAgICAgICAgICBRTiBxWGgzCisKK3FYZjAgICAgICAgICAgICBRTiBxWGc2CitxWGYxICAgICAgICAgICAgUU4gcVhnNQorcVhmMiAgICAgICAgICAgIFFOIHFYZzQKK3FYZjMgICAgICAgICAgICBRTiBxWGd0CitxWGY0ICAgICAgICAgICAgUU4gcVhnMworcVhmNSAgICAgICAgICAgIFFOIHFYZzIKK3FYZjYgICAgICAgICAgICBRTiBxWGcxCitxWGY3ICAgICAgICAgICAgUU4gcVhnMAorcVhmdCAgICAgICAgICAgIFFOIHFYZzcKKworCitxWHQwICAgICAgICAgICAgUU4gMS5TMzIKK3FYdDEgICAgICAgICAgICBRTiAyLlMzMgorcVQwbG8gICAgICAgICAgIFFOIDEuUzMyICAgICAgICAgCitxVDBoaSAgICAgICAgICAgUU4gMi5TMzIgICAgICAgICAKK3FUMWxvICAgICAgICAgICBRTiAzLlMzMiAgICAgICAgIAorcVQxaGkgICAgICAgICAgIFFOIDQuUzMyICAgICAgICAgCitxU2NhbGVsbyAgICAgICAgUU4gNS5TMzIgICAgICAgIDsvLyB1c2VkIHRvIHJlYWQgcG9zdCBzY2FsZSB2YWx1ZXMKK3FTY2FsZWhpICAgICAgICBRTiA2LlMzMgorcVRlbXAwICAgICAgICAgIFFOIDUuUzMyICAgICAgICAgCitxVGVtcDEgICAgICAgICAgUU4gNi5TMzIgICAgCisKKworU2NhbGUxICAgICAgICAgIEVRVSA2CitTY2FsZTIgICAgICAgICAgRVFVIDE1CitxU2NhbGUxICAgICAgICAgUU4gU2NhbGUxLlMxNiAgICAgCitxU2NhbGUyICAgICAgICAgUU4gU2NhbGUyLlMxNiAgICAgCitkU2NhbGUxbG8gICAgICAgRE4gKFNjYWxlMSoyKS5TMTYgICAgIAorZFNjYWxlMWhpICAgICAgIEROIChTY2FsZTEqMisxKS5TMTYKK2RTY2FsZTJsbyAgICAgICBETiAoU2NhbGUyKjIpLlMxNiAgICAgCitkU2NhbGUyaGkgICAgICAgRE4gKFNjYWxlMioyKzEpLlMxNgorCitkQ29lZnMgICAgICAgICAgRE4gMC5TMTYgICAgICAgIDsvLyBTY2FsZSBjb2VmZmljaWVudHMgaW4gZm9ybWF0IHtbMF0gW0NdIFtTXSBbSW52U3FydDJdfQorSW52U3FydDIgICAgICAgIEROIGRDb2Vmc1swXSAgICA7Ly8gMS9zcXJ0KDIpIGluIFExNQorUyAgICAgICAgICAgICAgIEROIGRDb2Vmc1sxXSAgICA7Ly8gU2luKFBJLzgpIGluIFExNQorQyAgICAgICAgICAgICAgIEROIGRDb2Vmc1syXSAgICA7Ly8gQ29zKFBJLzgpIGluIFExNQorCitwVGVtcCAgICAgICAgICAgUk4gMTIKKworICAgICAgICAgICAgICAgIAorICAgICAgICBJTVBPUlQgIGFybUNPTU1fSURDVENvZWYKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtxWGowLHFYajF9LCBbcFNyYyBANjRdIQorICAgICAgICBWTEQxICAgICAgICB7cVhqMixxWGozfSwgW3BTcmMgQDY0XSEKKyAgICAgICAgVkxEMSAgICAgICAge3FYajQscVhqNX0sIFtwU3JjIEA2NF0hCisgICAgICAgIFZMRDEgICAgICAgIHtxWGo2LHFYajd9LCBbcFNyYyBANjRdIQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgUHJlU2NhbGUgYW5kIG11bHRpcGx5IHdpdGggU3JjCisgICAgICAgIDsvLyBJU3RhZ2UgNAorICAgICAgICAKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczE2IiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMTZYMTYgTXVsCisgICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUxNgorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgICAgSUYgIiRpbnNjYWxlIj0iczMyIiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMzJYMzIgLHVsCisgICAgICAgICAgICBNX0lEQ1RfUFJFU0NBTEUzMgorICAgICAgICBFTkRJRgorCisgICAgICAgIDsvLyBJU3RhZ2UgMworICAgICAgICBWUURNVUxIICAgICBxWGkyLCBxWGkyLCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIFZIQUREICAgICAgIHFYaDAsIHFYaTAsIHFYaTEgICAgICAgICAgICAgICAgOy8vIChpMCtpMSkvMgorICAgICAgICBWSFNVQiAgICAgICBxWGgxLCBxWGkwLCBxWGkxICAgICAgICAgICAgICAgIDsvLyAoaTAtaTEpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhoNywgcVhpNSwgcVhpNyAgICAgICAgICAgICAgICA7Ly8gKGk1K2k3KS80CisgICAgICAgIFZTVUIgICAgICAgIHFYaDUsIHFYaTUsIHFYaTcgICAgICAgICAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWUURNVUxIICAgICBxWGg1LCBxWGg1LCBJbnZTcXJ0MiAgICAgICAgICAgIDsvLyBoNS9zcXJ0KDIpCisgICAgICAgIFZTVUIgICAgICAgIHFYaDIsIHFYaTIsIHFYaTMgICAgICAgICAgICAgICAgOy8vIGgyLCBoMworCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTRsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFhpNmxvLCBTICAgICAgICAgICAgICAgICA7Ly8gYyppNCtzKmk2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTRoaSwgQworICAgICAgICBWTUxBTCAgICAgICBxWHQxLCBkWGk2aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDQKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNGhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgICAgIHFYdDAsIGRYaTZsbywgQyAgICAgICAgICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFhpNGxvLCBTICAgICAgICAgICAgICAgICA7Ly8gLXMqaTQgKyBjKmg2CisgICAgICAgIFZNVUxMICAgICAgIHFYdDEsIGRYaTZoaSwgQworICAgICAgICBWTUxTTCAgICAgICBxWHQxLCBkWGk0aGksIFMKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmxvLCBxWHQwLCAjMTYgICAgICAgICAgICAgICA7Ly8gaDYKKyAgICAgICAgVlNIUk4gICAgICAgZFhoNmhpLCBxWHQxLCAjMTYKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMgorICAgICAgICBWU1VCICAgICAgICBxWGc2LCBxWGg2LCBxWGg3CisgICAgICAgIFZTVUIgICAgICAgIHFYZzUsIHFYaDUsIHFYZzYKKyAgICAgICAgVlNVQiAgICAgICAgcVhnNCwgcVhoNCwgcVhnNQorICAgICAgICBWSEFERCAgICAgICBxWGcxLCBxWGgxLCBxWGgyICAgICAgICA7Ly8gKGgxK2gyKS8yCisgICAgICAgIFZIU1VCICAgICAgIHFYZzIsIHFYaDEsIHFYaDIgICAgICAgIDsvLyAoaDEtaDIpLzIKKyAgICAgICAgVkhBREQgICAgICAgcVhnMCwgcVhoMCwgcVhoMyAgICAgICAgOy8vIChoMCtoMykvMgorICAgICAgICBWSFNVQiAgICAgICBxWGczLCBxWGgwLCBxWGgzICAgICAgICA7Ly8gKGgwLWgzKS8yCisKKyAgICAgICAgOy8vIElTdGFnZSAxIGFsbCByb3dzCisgICAgICAgIFZBREQgICAgICAgIHFYZjMsIHFYZzMsIHFYZzQgICAgICAgIAorICAgICAgICBWU1VCICAgICAgICBxWGY0LCBxWGczLCBxWGc0ICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgcVhmMiwgcVhnMiwgcVhnNSAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIHFYZjUsIHFYZzIsIHFYZzUgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYxLCBxWGcxLCBxWGc2CisgICAgICAgIFZTVUIgICAgICAgIHFYZjYsIHFYZzEsIHFYZzYgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBxWGYwLCBxWGcwLCBxWGc3CisgICAgICAgIFZTVUIgICAgICAgIHFYZjcsIHFYZzAsIHFYZzcgICAgICAKKworICAgICAgICA7Ly8gVHJhbnNwb3NlLCBzdG9yZSBhbmQgbG9vcAorWFRSMCAgICAgICAgICAgIEVRVSBTcmM1CitYVFIxICAgICAgICAgICAgRVFVIFRtcAorWFRSMiAgICAgICAgICAgIEVRVSBTcmM2CitYVFIzICAgICAgICAgICAgRVFVIFNyYzcKK1hUUjQgICAgICAgICAgICBFUVUgU3JjMworWFRSNSAgICAgICAgICAgIEVRVSBTcmMwCitYVFI2ICAgICAgICAgICAgRVFVIFNyYzEKK1hUUjcgICAgICAgICAgICBFUVUgU3JjMgorWFRSdCAgICAgICAgICAgIEVRVSBTcmM0CisgICAgICAgICAgICAgICAgCitxQTAgICAgICAgICAgICAgUU4gIFhUUjAuUzMyICA7Ly8gZm9yIFhUUnBvc2UKK3FBMSAgICAgICAgICAgICBRTiAgWFRSMS5TMzIKK3FBMiAgICAgICAgICAgICBRTiAgWFRSMi5TMzIKK3FBMyAgICAgICAgICAgICBRTiAgWFRSMy5TMzIKK3FBNCAgICAgICAgICAgICBRTiAgWFRSNC5TMzIKK3FBNSAgICAgICAgICAgICBRTiAgWFRSNS5TMzIKK3FBNiAgICAgICAgICAgICBRTiAgWFRSNi5TMzIKK3FBNyAgICAgICAgICAgICBRTiAgWFRSNy5TMzIKKworZEIwICAgICAgICAgICAgIEROICBYVFIwKjIrMSAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEIxICAgICAgICAgICAgIEROICBYVFIxKjIrMQorZEIyICAgICAgICAgICAgIEROICBYVFIyKjIrMQorZEIzICAgICAgICAgICAgIEROICBYVFIzKjIrMQorZEI0ICAgICAgICAgICAgIEROICBYVFI0KjIKK2RCNSAgICAgICAgICAgICBETiAgWFRSNSoyCitkQjYgICAgICAgICAgICAgRE4gIFhUUjYqMgorZEI3ICAgICAgICAgICAgIEROICBYVFI3KjIKKworICAgICAgICAgIAorICAgICAgICBWVFJOICAgICAgICBxWGYwLCBxWGYxCisgICAgICAgIFZUUk4gICAgICAgIHFYZjIsIHFYZjMKKyAgICAgICAgVlRSTiAgICAgICAgcVhmNCwgcVhmNQorICAgICAgICBWVFJOICAgICAgICBxWGY2LCBxWGY3CisgICAgICAgIFZUUk4gICAgICAgIHFBMCwgcUEyCisgICAgICAgIFZUUk4gICAgICAgIHFBMSwgcUEzCisgICAgICAgIFZUUk4gICAgICAgIHFBNCwgcUE2CisgICAgICAgIFZUUk4gICAgICAgIHFBNSwgcUE3ICAgICAgICAKKyAgICAgICAgVlNXUCAgICAgICAgZEIwLCBkQjQKKyAgICAgICAgVlNXUCAgICAgICAgZEIxLCBkQjUKKyAgICAgICAgVlNXUCAgICAgICAgZEIyLCBkQjYKKyAgICAgICAgVlNXUCAgICAgICAgZEIzLCBkQjcKKyAgICAgICAgCisKK3FZajAgICAgICAgICAgICBRTiBxWGYwCitxWWoxICAgICAgICAgICAgUU4gcVhmMQorcVlqMiAgICAgICAgICAgIFFOIHFYZjIKK3FZajMgICAgICAgICAgICBRTiBxWGYzCitxWWo0ICAgICAgICAgICAgUU4gcVhmNAorcVlqNSAgICAgICAgICAgIFFOIHFYZjUKK3FZajYgICAgICAgICAgICBRTiBxWGY2CitxWWo3ICAgICAgICAgICAgUU4gcVhmNworcVlqdCAgICAgICAgICAgIFFOIHFYZnQKKworZFlqMGxvICAgICAgICAgIEROIChYVFIwKjIpLlMxNgorZFlqMGhpICAgICAgICAgIEROIChYVFIwKjIrMSkuUzE2CitkWWoxbG8gICAgICAgICAgRE4gKFhUUjEqMikuUzE2CitkWWoxaGkgICAgICAgICAgRE4gKFhUUjEqMisxKS5TMTYKK2RZajJsbyAgICAgICAgICBETiAoWFRSMioyKS5TMTYKK2RZajJoaSAgICAgICAgICBETiAoWFRSMioyKzEpLlMxNgorZFlqM2xvICAgICAgICAgIEROIChYVFIzKjIpLlMxNgorZFlqM2hpICAgICAgICAgIEROIChYVFIzKjIrMSkuUzE2CitkWWo0bG8gICAgICAgICAgRE4gKFhUUjQqMikuUzE2CitkWWo0aGkgICAgICAgICAgRE4gKFhUUjQqMisxKS5TMTYKK2RZajVsbyAgICAgICAgICBETiAoWFRSNSoyKS5TMTYKK2RZajVoaSAgICAgICAgICBETiAoWFRSNSoyKzEpLlMxNgorZFlqNmxvICAgICAgICAgIEROIChYVFI2KjIpLlMxNgorZFlqNmhpICAgICAgICAgIEROIChYVFI2KjIrMSkuUzE2CitkWWo3bG8gICAgICAgICAgRE4gKFhUUjcqMikuUzE2CitkWWo3aGkgICAgICAgICAgRE4gKFhUUjcqMisxKS5TMTYKK2RZanRsbyAgICAgICAgICBETiAoWFRSdCoyKS5TMTYKK2RZanRoaSAgICAgICAgICBETiAoWFRSdCoyKzEpLlMxNgorCitxWWkwICAgICAgICAgICAgUU4gcVlqMAorcVlpMSAgICAgICAgICAgIFFOIHFZajQKK3FZaTIgICAgICAgICAgICBRTiBxWWoyCitxWWkzICAgICAgICAgICAgUU4gcVlqNworcVlpNCAgICAgICAgICAgIFFOIHFZajUKK3FZaTUgICAgICAgICAgICBRTiBxWWp0CitxWWk2ICAgICAgICAgICAgUU4gcVlqMQorcVlpNyAgICAgICAgICAgIFFOIHFZajYKK3FZaXQgICAgICAgICAgICBRTiBxWWozCisKK2RZaTBsbyAgICAgICAgICBETiBkWWowbG8KK2RZaTBoaSAgICAgICAgICBETiBkWWowaGkKK2RZaTFsbyAgICAgICAgICBETiBkWWo0bG8KK2RZaTFoaSAgICAgICAgICBETiBkWWo0aGkKK2RZaTJsbyAgICAgICAgICBETiBkWWoybG8KK2RZaTJoaSAgICAgICAgICBETiBkWWoyaGkKK2RZaTNsbyAgICAgICAgICBETiBkWWo3bG8KK2RZaTNoaSAgICAgICAgICBETiBkWWo3aGkKK2RZaTRsbyAgICAgICAgICBETiBkWWo1bG8KK2RZaTRoaSAgICAgICAgICBETiBkWWo1aGkKK2RZaTVsbyAgICAgICAgICBETiBkWWp0bG8KK2RZaTVoaSAgICAgICAgICBETiBkWWp0aGkKK2RZaTZsbyAgICAgICAgICBETiBkWWoxbG8KK2RZaTZoaSAgICAgICAgICBETiBkWWoxaGkKK2RZaTdsbyAgICAgICAgICBETiBkWWo2bG8KK2RZaTdoaSAgICAgICAgICBETiBkWWo2aGkKK2RZaXRsbyAgICAgICAgICBETiBkWWozbG8KK2RZaXRoaSAgICAgICAgICBETiBkWWozaGkKKworcVloMCAgICAgICAgICAgIFFOIHFZaXQKK3FZaDEgICAgICAgICAgICBRTiBxWWkwCitxWWgyICAgICAgICAgICAgUU4gcVlpMgorcVloMyAgICAgICAgICAgIFFOIHFZaTMKK3FZaDQgICAgICAgICAgICBRTiBxWWk3CitxWWg1ICAgICAgICAgICAgUU4gcVlpNQorcVloNiAgICAgICAgICAgIFFOIHFZaTQKK3FZaDcgICAgICAgICAgICBRTiBxWWkxCitxWWh0ICAgICAgICAgICAgUU4gcVlpNgorCitkWWgwbG8gICAgICAgICAgRE4gZFlpdGxvCitkWWgwaGkgICAgICAgICAgRE4gZFlpdGhpCitkWWgxbG8gICAgICAgICAgRE4gZFlpMGxvCitkWWgxaGkgICAgICAgICAgRE4gZFlpMGhpCitkWWgybG8gICAgICAgICAgRE4gZFlpMmxvCitkWWgyaGkgICAgICAgICAgRE4gZFlpMmhpCitkWWgzbG8gICAgICAgICAgRE4gZFlpM2xvCitkWWgzaGkgICAgICAgICAgRE4gZFlpM2hpCitkWWg0bG8gICAgICAgICAgRE4gZFlpN2xvCitkWWg0aGkgICAgICAgICAgRE4gZFlpN2hpCitkWWg1bG8gICAgICAgICAgRE4gZFlpNWxvCitkWWg1aGkgICAgICAgICAgRE4gZFlpNWhpCitkWWg2bG8gICAgICAgICAgRE4gZFlpNGxvCitkWWg2aGkgICAgICAgICAgRE4gZFlpNGhpCitkWWg3bG8gICAgICAgICAgRE4gZFlpMWxvCitkWWg3aGkgICAgICAgICAgRE4gZFlpMWhpCitkWWh0bG8gICAgICAgICAgRE4gZFlpNmxvCitkWWh0aGkgICAgICAgICAgRE4gZFlpNmhpCisKK3FZZzAgICAgICAgICAgICBRTiBxWWgyCitxWWcxICAgICAgICAgICAgUU4gcVlodAorcVlnMiAgICAgICAgICAgIFFOIHFZaDEKK3FZZzMgICAgICAgICAgICBRTiBxWWgwCitxWWc0ICAgICAgICAgICAgUU4gcVloNAorcVlnNSAgICAgICAgICAgIFFOIHFZaDUKK3FZZzYgICAgICAgICAgICBRTiBxWWg2CitxWWc3ICAgICAgICAgICAgUU4gcVloNworcVlndCAgICAgICAgICAgIFFOIHFZaDMKKworcVlmMCAgICAgICAgICAgIFFOIHFZZzYKK3FZZjEgICAgICAgICAgICBRTiBxWWc1CitxWWYyICAgICAgICAgICAgUU4gcVlnNAorcVlmMyAgICAgICAgICAgIFFOIHFZZ3QKK3FZZjQgICAgICAgICAgICBRTiBxWWczCitxWWY1ICAgICAgICAgICAgUU4gcVlnMgorcVlmNiAgICAgICAgICAgIFFOIHFZZzEKK3FZZjcgICAgICAgICAgICBRTiBxWWcwCitxWWZ0ICAgICAgICAgICAgUU4gcVlnNworCisgICAgICAgIFZSU0hSICAgICAgIHFZajcsIHFZajcsICMyCisgICAgICAgIFZSU0hSICAgICAgIHFZajYsIHFZajYsICMxCisgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWWk1LCBxWWoxLCBxWWo3ICAgICAgICA7Ly8gaTUgPSAoajErajcpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVlpNiwgcVlqMSwgcVlqNyAgICAgICAgOy8vIGk2ID0gajEtajcKKyAgICAgICAgVkhBREQgICAgICAgcVlpMywgcVlqMiwgcVlqNiAgICAgICAgOy8vIGkzID0gKGoyK2o2KS8yCisgICAgICAgIFZTVUIgICAgICAgIHFZaTIsIHFZajIsIHFZajYgICAgICAgIDsvLyBpMiA9IGoyLWo2CisgICAgICAgIFZIQUREICAgICAgIHFZaTcsIHFZajUsIHFZajMgICAgICAgIDsvLyBpNyA9IChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWWk0LCBxWWo1LCBxWWozICAgICAgICA7Ly8gaTQgPSBqNS1qMworCisgICAgICAgIFZRRE1VTEggICAgIHFZaTIsIHFZaTIsIEludlNxcnQyICAgIDsvLyBpMi9zcXJ0KDIpCisgICAgICAgIDsvLyBJU3RhZ2UgNCwzIHJvd3MgMHRvMSB4IDEvMgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcFRlbXAsICMweDQgICAgICAgICAgICAgOy8vIGVuc3VyZSBjb3JyZWN0IHJvdW5kCisgICAgICAgIFZEVVAgICAgICAgIHFTY2FsZTEsIHBUZW1wICAgICAgICAgICA7Ly8gb2YgREMgcmVzdWx0CisgICAgICAgIFZBREQgICAgICAgIHFZaTAsIHFZaTAsIHFTY2FsZTEKKyAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgIHFZaDAsIHFZaTAsIHFZaTEgICAgICAgIDsvLyAoaTAraTEpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVloMSwgcVlpMCwgcVlpMSAgICAgICAgOy8vIChpMC1pMSkvMgorCisgICAgICAgIFZIQUREICAgICAgIHFZaDcsIHFZaTUsIHFZaTcgICAgICAgIDsvLyAoaTUraTcpLzQKKyAgICAgICAgVlNVQiAgICAgICAgcVloNSwgcVlpNSwgcVlpNyAgICAgICAgOy8vIChpNS1pNykvMgorICAgICAgICBWU1VCICAgICAgICBxWWgyLCBxWWkyLCBxWWkzICAgICAgICA7Ly8gaDIsIGgzCisgICAgICAgIFZRRE1VTEggICAgIHFZaDUsIHFZaDUsIEludlNxcnQyICAgIDsvLyBoNS9zcXJ0KDIpCisKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNGxvLCBDICAgICAgICAgOy8vIGMqaTQKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MCwgZFlpNmxvLCBTICAgICAgICAgOy8vIGMqaTQrcyppNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk0aGksIEMKKyAgICAgICAgVk1MQUwgICAgICAgcVh0MSwgZFlpNmhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDRsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNAorICAgICAgICBWU0hSTiAgICAgICBkWWg0aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgICAgcVh0MCwgZFlpNmxvLCBDICAgICAgICAgOy8vIGMqaTYKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MCwgZFlpNGxvLCBTICAgICAgICAgOy8vIC1zKmk0ICsgYypoNgorICAgICAgICBWTVVMTCAgICAgICBxWHQxLCBkWWk2aGksIEMKKyAgICAgICAgVk1MU0wgICAgICAgcVh0MSwgZFlpNGhpLCBTCisgICAgICAgIFZTSFJOICAgICAgIGRZaDZsbywgcVh0MCwgIzE2ICAgICAgIDsvLyBoNgorICAgICAgICBWU0hSTiAgICAgICBkWWg2aGksIHFYdDEsICMxNgorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgcVlnNiwgcVloNiwgcVloNworICAgICAgICBWU1VCICAgICAgICBxWWc1LCBxWWg1LCBxWWc2CisgICAgICAgIFZTVUIgICAgICAgIHFZZzQsIHFZaDQsIHFZZzUKKyAgICAgICAgCisgICAgICAgIDsvLyBJU3RhZ2UgMiByb3dzIDB0bzMgeCAxLzIKKyAgICAgICAgVkhBREQgICAgICAgcVlnMSwgcVloMSwgcVloMiAgICAgICAgOy8vIChoMStoMikvMgorICAgICAgICBWSFNVQiAgICAgICBxWWcyLCBxWWgxLCBxWWgyICAgICAgICA7Ly8gKGgxLWgyKS8yCisgICAgICAgIFZIQUREICAgICAgIHFZZzAsIHFZaDAsIHFZaDMgICAgICAgIDsvLyAoaDAraDMpLzIKKyAgICAgICAgVkhTVUIgICAgICAgcVlnMywgcVloMCwgcVloMyAgICAgICAgOy8vIChoMC1oMykvMgorICAgICAgICAKKworICAgICAgICA7Ly8gSVN0YWdlIDEgYWxsIHJvd3MKKyAgICAgICAgVkhBREQgICAgICAgIHFZZjMsIHFZZzMsIHFZZzQgICAgICAgIAorICAgICAgICBWSFNVQiAgICAgICAgcVlmNCwgcVlnMywgcVlnNCAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYyLCBxWWcyLCBxWWc1ICAgICAgICAKKyAgICAgICAgVkhTVUIgICAgICAgIHFZZjUsIHFZZzIsIHFZZzUgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICAgcVlmMSwgcVlnMSwgcVlnNgorICAgICAgICBWSFNVQiAgICAgICAgcVlmNiwgcVlnMSwgcVlnNiAgICAgICAgCisgICAgICAgIFZIQUREICAgICAgICBxWWYwLCBxWWcwLCBxWWc3CisgICAgICAgIFZIU1VCICAgICAgICBxWWY3LCBxWWcwLCBxWWc3ICAgICAgCisKK1lUUjAgICAgICAgICAgICBFUVUgU3JjMAorWVRSMSAgICAgICAgICAgIEVRVSBTcmM0CitZVFIyICAgICAgICAgICAgRVFVIFNyYzEKK1lUUjMgICAgICAgICAgICBFUVUgU3JjMgorWVRSNCAgICAgICAgICAgIEVRVSBTcmM3CitZVFI1ICAgICAgICAgICAgRVFVIFNyYzUKK1lUUjYgICAgICAgICAgICBFUVUgVG1wCitZVFI3ICAgICAgICAgICAgRVFVIFNyYzYKK1lUUnQgICAgICAgICAgICBFUVUgU3JjMworCitxQzAgICAgICAgICAgICAgUU4gIFlUUjAuUzMyICAgICAgICAgICAgICAgIDsvLyBmb3IgWVRScG9zZQorcUMxICAgICAgICAgICAgIFFOICBZVFIxLlMzMgorcUMyICAgICAgICAgICAgIFFOICBZVFIyLlMzMgorcUMzICAgICAgICAgICAgIFFOICBZVFIzLlMzMgorcUM0ICAgICAgICAgICAgIFFOICBZVFI0LlMzMgorcUM1ICAgICAgICAgICAgIFFOICBZVFI1LlMzMgorcUM2ICAgICAgICAgICAgIFFOICBZVFI2LlMzMgorcUM3ICAgICAgICAgICAgIFFOICBZVFI3LlMzMgorCitkRDAgICAgICAgICAgICAgRE4gIFlUUjAqMisxICAgICAgICAgICAgICAgIDsvLyBmb3IgdXNpbmcgVlNXUAorZEQxICAgICAgICAgICAgIEROICBZVFIxKjIrMQorZEQyICAgICAgICAgICAgIEROICBZVFIyKjIrMQorZEQzICAgICAgICAgICAgIEROICBZVFIzKjIrMQorZEQ0ICAgICAgICAgICAgIEROICBZVFI0KjIKK2RENSAgICAgICAgICAgICBETiAgWVRSNSoyCitkRDYgICAgICAgICAgICAgRE4gIFlUUjYqMgorZEQ3ICAgICAgICAgICAgIEROICBZVFI3KjIKKyAgICAgICAgICAKKyAgICAgICAgVlRSTiAgICAgICAgcVlmMCwgcVlmMQorICAgICAgICBWVFJOICAgICAgICBxWWYyLCBxWWYzCisgICAgICAgIFZUUk4gICAgICAgIHFZZjQsIHFZZjUKKyAgICAgICAgVlRSTiAgICAgICAgcVlmNiwgcVlmNworICAgICAgICBWVFJOICAgICAgICBxQzAsIHFDMgorICAgICAgICBWVFJOICAgICAgICBxQzEsIHFDMworICAgICAgICBWVFJOICAgICAgICBxQzQsIHFDNgorICAgICAgICBWVFJOICAgICAgICBxQzUsIHFDNyAgICAgICAgCisgICAgICAgIFZTV1AgICAgICAgIGREMCwgZEQ0CisgICAgICAgIFZTV1AgICAgICAgIGREMSwgZEQ1CisgICAgICAgIFZTV1AgICAgICAgIGREMiwgZEQ2CisgICAgICAgIFZTV1AgICAgICAgIGREMywgZEQ3CisKKyAgICAgICAgCitkWWYwVTggICAgICAgICAgRE4gWVRSMCoyLlU4CitkWWYxVTggICAgICAgICAgRE4gWVRSMSoyLlU4CitkWWYyVTggICAgICAgICAgRE4gWVRSMioyLlU4CitkWWYzVTggICAgICAgICAgRE4gWVRSMyoyLlU4CitkWWY0VTggICAgICAgICAgRE4gWVRSNCoyLlU4CitkWWY1VTggICAgICAgICAgRE4gWVRSNSoyLlU4CitkWWY2VTggICAgICAgICAgRE4gWVRSNioyLlU4CitkWWY3VTggICAgICAgICAgRE4gWVRSNyoyLlU4CisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERvIHNhdHVyYXRpb24gaWYgb3V0c2l6ZSBpcyBvdGhlciB0aGFuIFMxNgorICAgICAgICA7Ly8KKyAgICAgICAgCisgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICA7Ly8gT3V0cHV0IHJhbmdlIFswLTI1NV0KKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjBVOCwgcVlmMAorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmMVU4LCBxWWYxCisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWYyVTgsIHFZZjIKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjNVOCwgcVlmMworICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmNFU4LCBxWWY0CisgICAgICAgICAgICBWUU1PVk4gICAgICAgICAgICBkWWY1VTgsIHFZZjUKKyAgICAgICAgICAgIFZRTU9WTiAgICAgICAgICAgIGRZZjZVOCwgcVlmNgorICAgICAgICAgICAgVlFNT1ZOICAgICAgICAgICAgZFlmN1U4LCBxWWY3CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICBJRiAoIiRvdXRzaXplIj0iczkiKQorICAgICAgICAgICAgOy8vIE91dHB1dCByYW5nZSBbLTI1NiB0byArMjU1XQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYwLCBxWWYwLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYxLCBxWWYxLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYyLCBxWWYyLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWYzLCBxWWYzLCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY0LCBxWWY0LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY1LCBxWWY1LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY2LCBxWWY2LCAjMTYtOQorICAgICAgICAgICAgVlFTSEwgICAgICAgICAgICBxWWY3LCBxWWY3LCAjMTYtOQorICAgICAgICAgICAgCisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjAsIHFZZjAsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjEsIHFZZjEsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjIsIHFZZjIsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjMsIHFZZjMsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjQsIHFZZjQsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjUsIHFZZjUsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjYsIHFZZjYsICMxNi05CisgICAgICAgICAgICBWU0hSICAgICAgICAgICAgIHFZZjcsIHFZZjcsICMxNi05CisgICAgICAgIEVORElGCisKKyAgICAgICAgOy8vIFN0b3JlIG91dHB1dCBkZXBlbmRpbmcgb24gdGhlIFN0cmlkZSBzaXplCisgICAgICAgIElGICIkc3RyaWRlIj0icyIKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjEsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjIsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjQsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjUsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCBTdHJpZGUKKyAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjcsIFtwRGVzdCBANjRdICAgICAgICAgICAgCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIElGICgiJG91dHNpemUiPSJ1OCIpCisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmMFU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWYxVTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjJVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmM1U4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY0VTgsIFtwRGVzdCBANjRdLCAjOAorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIGRZZjVVOCwgW3BEZXN0IEA2NF0sICM4CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgZFlmNlU4LCBbcERlc3QgQDY0XSwgIzgKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBkWWY3VTgsIFtwRGVzdCBANjRdCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgOy8vICgiJG91dHNpemUiPSJzOSIpIG9yICgiJG91dHNpemUiPSJzMTYiKQorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjAsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWYxLCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmMiwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjMsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY0LCBbcERlc3QgQDY0XSwgIzE2CisgICAgICAgICAgICAgICAgVlNUMSAgICAgICAgcVlmNSwgW3BEZXN0IEA2NF0sICMxNgorICAgICAgICAgICAgICAgIFZTVDEgICAgICAgIHFZZjYsIFtwRGVzdCBANjRdLCAjMTYKKyAgICAgICAgICAgICAgICBWU1QxICAgICAgICBxWWY3LCBbcERlc3QgQDY0XQorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIEVORElGCisKKworCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorCisKKworICAgICAgICBNRU5EICAgICAgICAKKworICAgICAgICA7Ly8gU2NhbGUgVFdPIGlucHV0IHJvd3Mgd2l0aCBUV08gcm93cyBvZiAxNiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIGJ5IE1fSURDVF9QUkVTQ0FMRTE2IHRvIHByZS1zY2FsZSBvbmUgcm93CisgICAgICAgIDsvLyBpbnB1dCAoRWlnaHQgaW5wdXQgdmFsdWVzKSB3aXRoIG9uZSByb3cgb2Ygc2NhbGUgdmFsdWVzLiBBbHNvIAorICAgICAgICA7Ly8gTG9hZHMgbmV4dCBzY2FsZSB2YWx1ZXMgZnJvbSBwU2NhbGUsIGlmICRMYXN0Um93IGZsYWcgaXMgbm90IHNldC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gJGRBbG8gICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbgorICAgICAgICA7Ly8gJGRBaGkgICAgICAgICAgIC0gSW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuCisgICAgICAgIDsvLyAkZEJsbyAgICAgICAgICAgLSBJbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzIG9mIHJvdyBuKzEKKyAgICAgICAgOy8vICRkQmhpICAgICAgICAgICAtIElucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcyBvZiByb3cgbisxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8gcVQwbG8gICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIHFUMGhpICAgICAgICAgICAtIFRlbXBvcmFyeSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgICAgIDsvLyBxVDFsbyAgICAgICAgICAgLSBUZW1wb3Jhcnkgc2NyYXRjaCByZWdpc3RlcgorICAgICAgICA7Ly8gcVQxaGkgICAgICAgICAgIC0gVGVtcG9yYXJ5IHNjcmF0Y2ggcmVnaXN0ZXIKKyAgICAgICAgOy8vIGRTY2FsZTFsbyAgICAgICAtIFNjYWxlIHZhbHVlIG9mIHJvdyBuCisgICAgICAgIDsvLyBkU2NhbGUxaGkgICAgICAgLSBTY2FsZSB2YWx1ZSBvZiByb3cgbgorICAgICAgICA7Ly8gZFNjYWxlMmxvICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8gZFNjYWxlMmhpICAgICAgIC0gU2NhbGUgdmFsdWUgb2Ygcm93IG4rMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IEZsYWcKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyAkTGFzdFJvdyAgICAgICAgLSBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY3VycmVudCByb3cgaXMgbGFzdCByb3cKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPdXRwdXQgUmVnaXN0ZXJzOgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vICRkQWxvICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChmaXJzdCBmb3VyIFMxNiBvZiByb3cgbikKKyAgICAgICAgOy8vICRkQWhpICAgICAgICAgICAtIFNjYWxlZCBvdXRwdXQgdmFsdWVzIChuZXh0IGZvdXIgUzE2IG9mIHJvdyBuKQorICAgICAgICA7Ly8gJGRCbG8gICAgICAgICAgIC0gU2NhbGVkIG91dHB1dCB2YWx1ZXMgKGZpcnN0IGZvdXIgUzE2IG9mIHJvdyBuKzEpCisgICAgICAgIDsvLyAkZEJoaSAgICAgICAgICAgLSBTY2FsZWQgb3V0cHV0IHZhbHVlcyAobmV4dCBmb3VyIFMxNiBvZiByb3cgbisxKQorICAgICAgICA7Ly8gcVNjYWxlMSAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdworICAgICAgICA7Ly8gcVNjYWxlMiAgICAgICAgIC0gU2NhbGUgdmFsdWVzIGZvciBuZXh0IHJvdysxCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIG5leHQgcm93IG9mIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1NDQUxFMTYgJGRBbG8sICRkQWhpLCAkZEJsbywgJGRCaGksICRMYXN0Um93CisgICAgICAgIFZNVUxMICAgICAgIHFUMGxvLCAkZEFsbywgZFNjYWxlMWxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMGhpLCAkZEFoaSwgZFNjYWxlMWhpCisgICAgICAgIFZNVUxMICAgICAgIHFUMWxvLCAkZEJsbywgZFNjYWxlMmxvCisgICAgICAgIFZNVUxMICAgICAgIHFUMWhpLCAkZEJoaSwgZFNjYWxlMmhpCisgICAgICAgIElGICIkTGFzdFJvdyI9IjAiCisgICAgICAgICAgICBWTEQxICAgICAgICBxU2NhbGUxLCBbcFNjYWxlXSwgIzE2ICA7Ly8gTG9hZCBzY2FsZSBmb3Igcm93IG4rMQorICAgICAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgOy8vIExvYWQgc2NhbGUgZm9yIHJvdyBuKzIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEFsbywgcVQwbG8sICMxMiAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgICAgJGRBaGksIHFUMGhpLCAjMTIgICAgICAgIAorICAgICAgICBWUVJTSFJOICAgICAgICRkQmxvLCBxVDFsbywgIzEyICAgICAgICAKKyAgICAgICAgVlFSU0hSTiAgICAgICAkZEJoaSwgcVQxaGksICMxMiAgICAgICAgCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU2NhbGUgOHg4IGJsb2NrIGlucHV0IHZhbHVlcyB3aXRoIDE2IGJpdCBzY2FsZSB2YWx1ZXMKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gcHJlLXNjYWxlIGJsb2NrIG9mIDh4OCBpbnB1dC4KKyAgICAgICAgOy8vIFRoaXMgYWxzbyBkbyB0aGUgSXN0IHN0YWdlIHRyYW5zZm9ybWF0aW9ucyBvZiBJRENULgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIElucHV0IFJlZ2lzdGVyczoKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBkWGpubG8gICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBmaXJzdCBmb3VyIFMxNiB2YWx1ZXMKKyAgICAgICAgOy8vIGRYam5oaSAgICAgICAgICAtIG4gdGggaW5wdXQgRCByZWdpc3RlciB3aXRoIG5leHQgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBxWGpuICAgICAgICAgICAgLSBuIHRoIGlucHV0IFEgcmVnaXN0ZXIgd2l0aCBlaWdodCBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBwU2NhbGUgICAgICAgICAgLSBQb2ludGVyIHRvIHNjYWxlIHZhbHVlcworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gcVhpbiAgICAgICAgICAgIC0gbiB0aCBvdXRwdXQgUSByZWdpc3RlciB3aXRoIGVpZ2h0IFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMTYKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMSwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgVkxEMSAgICAgICAgcVNjYWxlMiwgW3BTY2FsZV0sICMxNiAgICAgIDsvLyBMb2FkIFByZSBzY2FsZSBmb3Igcm93IDAKKyAgICAgICAgTV9JRENUX1NDQUxFMTYgZFhqMGxvLCBkWGowaGksIGRYajFsbywgZFhqMWhpLCAwICAgICAgICA7Ly8gUHJlIHNjYWxlIHJvdyAwICYgMQorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGoybG8sIGRYajJoaSwgZFhqM2xvLCBkWGozaGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo0bG8sIGRYajRoaSwgZFhqNWxvLCBkWGo1aGksIDAgICAgICAgIAorICAgICAgICBNX0lEQ1RfU0NBTEUxNiBkWGo2bG8sIGRYajZoaSwgZFhqN2xvLCBkWGo3aGksIDEgICAgICAgIAorICAgICAgICBWSEFERCAgICAgICBxWGk1LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIChqMStqNykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk2LCBxWGoxLCBxWGo3ICAgICAgICAgICAgOy8vIGoxLWo3CisgICAgICAgIExEUiAgICAgICAgIHBTcmMsID1hcm1DT01NX0lEQ1RDb2VmIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgVkhBREQgICAgICAgcVhpMywgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgVlNVQiAgICAgICAgcVhpMiwgcVhqMiwgcVhqNiAgICAgICAgICAgIDsvLyBqMi1qNgorICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgOy8vIExvYWQgRENUIGludmVyc2UgQUFOIGNvbnN0YW50cworICAgICAgICBWSEFERCAgICAgICBxWGk3LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIChqNStqMykvMgorICAgICAgICBWU1VCICAgICAgICBxWGk0LCBxWGo1LCBxWGozICAgICAgICAgICAgOy8vIGo1LWozCisgICAgICAgIE1FTkQgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNjYWxlIDh4OCBibG9jayBpbnB1dCB2YWx1ZXMgd2l0aCAzMiBiaXQgc2NhbGUgdmFsdWVzCisgICAgICAgIDsvLworICAgICAgICA7Ly8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHByZS1zY2FsZSBibG9jayBvZiA4eDggaW5wdXQuCisgICAgICAgIDsvLyBUaGlzIGFsc28gZG8gdGhlIElzdCBzdGFnZSB0cmFuc2Zvcm1hdGlvbnMgb2YgSURDVC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBJbnB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhqbmxvICAgICAgICAgIC0gbiB0aCBpbnB1dCBEIHJlZ2lzdGVyIHdpdGggZmlyc3QgZm91ciBTMTYgdmFsdWVzCisgICAgICAgIDsvLyBkWGpuaGkgICAgICAgICAgLSBuIHRoIGlucHV0IEQgcmVnaXN0ZXIgd2l0aCBuZXh0IGZvdXIgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcVhqbiAgICAgICAgICAgIC0gbiB0aCBpbnB1dCBRIHJlZ2lzdGVyIHdpdGggZWlnaHQgUzE2IHZhbHVlcworICAgICAgICA7Ly8gcFNjYWxlICAgICAgICAgIC0gUG9pbnRlciB0byAzMmJpdCBzY2FsZSB2YWx1ZXMgaW4gUTIzIGZvcm1hdAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE91dHB1dCBSZWdpc3RlcnM6CisgICAgICAgIDsvLworICAgICAgICA7Ly8gZFhpbmxvICAgICAgICAgIC0gbiB0aCBvdXRwdXQgRCByZWdpc3RlciB3aXRoIGZpcnN0IGZvdXIgUzE2IG91dHB1dCB2YWx1ZXMgb2YgMXN0IHN0YWdlCisgICAgICAgIDsvLyBkWGluaGkgICAgICAgICAgLSBuIHRoIG91dHB1dCBEIHJlZ2lzdGVyIHdpdGggbmV4dCBmb3VyIFMxNiBvdXRwdXQgdmFsdWVzIG9mIDFzdCBzdGFnZQorICAgICAgICA7Ly8KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9JRENUX1BSRVNDQUxFMzIKK3FTY2FsZTBsbyAgICAgICBRTiAwLlMzMgorcVNjYWxlMGhpICAgICAgIFFOIDEuUzMyCitxU2NhbGUxbG8gICAgICAgUU4gMi5TMzIKK3FTY2FsZTFoaSAgICAgICBRTiAzLlMzMgorcVNjYWxlMmxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlMmhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlM2xvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlM2hpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNGxvICAgICAgIFFOIHFTY2FsZTFsbworcVNjYWxlNGhpICAgICAgIFFOIHFTY2FsZTFoaQorcVNjYWxlNWxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNWhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlNmxvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlNmhpICAgICAgIFFOIHFTY2FsZTBoaQorcVNjYWxlN2xvICAgICAgIFFOIHFTY2FsZTBsbworcVNjYWxlN2hpICAgICAgIFFOIHFTY2FsZTBoaQorCitxU3JjMGxvICAgICAgICAgUU4gNC5TMzIKK3FTcmMwaGkgICAgICAgICBRTiA1LlMzMgorcVNyYzFsbyAgICAgICAgIFFOIDYuUzMyCitxU3JjMWhpICAgICAgICAgUU4gU3JjNC5TMzIKK3FTcmMybG8gICAgICAgICBRTiBxU3JjMGxvCitxU3JjMmhpICAgICAgICAgUU4gcVNyYzBoaQorcVNyYzNsbyAgICAgICAgIFFOIHFTcmMwbG8KK3FTcmMzaGkgICAgICAgICBRTiBxU3JjMGhpCitxU3JjNGxvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzRoaSAgICAgICAgIFFOIHFTcmMwaGkKK3FTcmM1bG8gICAgICAgICBRTiBxU3JjMWxvCitxU3JjNWhpICAgICAgICAgUU4gcVNyYzFoaQorcVNyYzZsbyAgICAgICAgIFFOIHFTcmMxbG8KK3FTcmM2aGkgICAgICAgICBRTiBxU3JjMWhpCitxU3JjN2xvICAgICAgICAgUU4gcVNyYzBsbworcVNyYzdoaSAgICAgICAgIFFOIHFTcmMwaGkKKworcVJlczE3bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczE3aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczI2bG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczI2aGkgICAgICAgIFFOIHFTY2FsZTBoaQorcVJlczUzbG8gICAgICAgIFFOIHFTY2FsZTBsbworcVJlczUzaGkgICAgICAgIFFOIHFTY2FsZTBoaQorCisgICAgICAgICAgICBBREQgICAgICAgICBwVGVtcCwgcFNjYWxlLCAjNCo4KjcgICAgICAgICAgIDsvLyBBZGRyZXNzIG9mICBwU2NhbGVbN10KKyAgICAgICAgICAgIAorICAgICAgICAgICAgOy8vIFJvdyAwCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMGxvLCBxU2NhbGUwaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmMwbG8sIGRYajBsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzBoaSwgZFhqMGhpLCAjKDEyLTEpICAgICAgICAgICAgCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMWxvLCBxU2NhbGUxaGl9LCBbcFNjYWxlXSEKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmMwbG8sIHFTY2FsZTBsbywgcVNyYzBsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzBoaSwgcVNjYWxlMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlN2xvLCBxU2NhbGU3aGl9LCBbcFRlbXBdIQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzFsbywgZFhqMWxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMWhpLCBkWGoxaGksICMoMTItMSkgICAgICAgICAgICAKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTBsbywgcVNyYzBsbyAgICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMGhpLCBxU3JjMGhpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjN2xvLCBkWGo3bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM3aGksIGRYajdoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzFsbywgcVNjYWxlMWxvLCBxU3JjMWxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMWhpLCBxU2NhbGUxaGksIHFTcmMxaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM3bG8sIHFTY2FsZTdsbywgcVNyYzdsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzdoaSwgcVNjYWxlN2hpLCBxU3JjN2hpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlMmxvLCBxU2NhbGUyaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAxICYgNworICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczE3bG8sIHFTcmMxbG8sIHFTcmM3bG8gICAgICA7Ly8gKGoxK2o3KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMTdoaSwgcVNyYzFoaSwgcVNyYzdoaSAgICAgIDsvLyAoajErajcpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTVsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNQorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNWhpLCBxUmVzMTdoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMTdsbywgcVNyYzFsbywgcVNyYzdsbyAgICAgIDsvLyBqMS1qNworICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczE3aGksIHFTcmMxaGksIHFTcmM3aGkgICAgICA7Ly8gajEtajcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTZsbywgcVJlczE3bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpNgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpNmhpLCBxUmVzMTdoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzJsbywgZFhqMmxvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjMmhpLCBkWGoyaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU2bG8sIHFTY2FsZTZoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNmxvLCBkWGo2bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM2aGksIGRYajZoaSwgIygxMi0xKQorICAgICAgICAgICAgU1VCICAgICAgICAgcFRlbXAsIHBUZW1wLCAjKCgxNioyKSsoNCo4KjEpKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzJsbywgcVNjYWxlMmxvLCBxU3JjMmxvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjMmhpLCBxU2NhbGUyaGksIHFTcmMyaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM2bG8sIHFTY2FsZTZsbywgcVNyYzZsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzZoaSwgcVNjYWxlNmhpLCBxU3JjNmhpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlM2xvLCBxU2NhbGUzaGl9LCBbcFNjYWxlXSEKKworICAgICAgICAgICAgOy8vIFJvdyAyICYgNgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczI2bG8sIHFTcmMybG8sIHFTcmM2bG8gICAgICA7Ly8gKGoyK2o2KS8yCisgICAgICAgICAgICBWSEFERCAgICAgICBxUmVzMjZoaSwgcVNyYzJoaSwgcVNyYzZoaSAgICAgIDsvLyAoajIrajYpLzIKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTNsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMworICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpM2hpLCBxUmVzMjZoaSAgICAgICAgICAgICAgCisgICAgICAgICAgICBWU1VCICAgICAgICBxUmVzMjZsbywgcVNyYzJsbywgcVNyYzZsbyAgICAgIDsvLyBqMi1qNgorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczI2aGksIHFTcmMyaGksIHFTcmM2aGkgICAgICA7Ly8gajItajYKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTJsbywgcVJlczI2bG8gICAgICAgICAgICAgICAgOy8vIE91dHB1dCBpMgorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMmhpLCBxUmVzMjZoaSAgICAgIAorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzNsbywgZFhqM2xvLCAjKDEyLTEpCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjM2hpLCBkWGozaGksICMoMTItMSkKKyAgICAgICAgICAgIFZMRDEgICAgICAgIHtxU2NhbGU1bG8sIHFTY2FsZTVoaX0sIFtwVGVtcF0hCisgICAgICAgICAgICBWU0hMTCAgICAgICBxU3JjNWxvLCBkWGo1bG8sICMoMTItMSkKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM1aGksIGRYajVoaSwgIygxMi0xKQorICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzNsbywgcVNjYWxlM2xvLCBxU3JjM2xvCisgICAgICAgICAgICBWUVJETVVMSCAgICBxU3JjM2hpLCBxU2NhbGUzaGksIHFTcmMzaGkKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM1bG8sIHFTY2FsZTVsbywgcVNyYzVsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzVoaSwgcVNjYWxlNWhpLCBxU3JjNWhpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIDsvLyBSb3cgMyAmIDUKKyAgICAgICAgICAgIFZIQUREICAgICAgIHFSZXM1M2xvLCBxU3JjNWxvLCBxU3JjM2xvICAgICAgOy8vIChqNStqMykvMgorICAgICAgICAgICAgVkhBREQgICAgICAgcVJlczUzaGksIHFTcmM1aGksIHFTcmMzaGkgICAgICA7Ly8gKGo1K2ozKS8yCisgICAgICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMTYqMioyCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk3bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTcKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTdoaSwgcVJlczUzaGkgICAgICAgICAgICAgIAorICAgICAgICAgICAgVlNVQiAgICAgICAgcVJlczUzbG8sIHFTcmM1bG8sIHFTcmMzbG8gICAgICA7Ly8gajUtajMKKyAgICAgICAgICAgIFZTVUIgICAgICAgIHFSZXM1M2hpLCBxU3JjNWhpLCBxU3JjM2hpICAgICAgOy8vIGo1LWozCisgICAgICAgICAgICBWTEQxICAgICAgICBxWGo0LCBbcFNyYyBANjRdCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGk0bG8sIHFSZXM1M2xvICAgICAgICAgICAgICAgIDsvLyBPdXRwdXQgaTQKKyAgICAgICAgICAgIFZNT1ZOICAgICAgIGRYaTRoaSwgcVJlczUzaGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIFZTSExMICAgICAgIHFTcmM0bG8sIGRYajRsbywgIygxMi0xKQorICAgICAgICAgICAgVlNITEwgICAgICAgcVNyYzRoaSwgZFhqNGhpLCAjKDEyLTEpCisgICAgICAgICAgICBWTEQxICAgICAgICB7cVNjYWxlNGxvLCBxU2NhbGU0aGl9LCBbcFNjYWxlXSAgICAgICAgICAgIAorICAgICAgICAgICAgTERSICAgICAgICAgcFNyYywgPWFybUNPTU1fSURDVENvZWYgICAgIDsvLyBBZGRyZXNzIG9mIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIFZRUkRNVUxIICAgIHFTcmM0bG8sIHFTY2FsZTRsbywgcVNyYzRsbworICAgICAgICAgICAgVlFSRE1VTEggICAgcVNyYzRoaSwgcVNjYWxlNGhpLCBxU3JjNGhpCisgICAgICAgICAgICBWTERSICAgICAgICBkQ29lZnMsIFtwU3JjXSAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIERDVCBpbnZlcnNlIEFBTiBjb25zdGFudHMKKyAgICAgICAgICAgIDsvLyBSb3cgNAorICAgICAgICAgICAgVk1PVk4gICAgICAgZFhpMWxvLCBxU3JjNGxvICAgICAgICAgICAgICAgICA7Ly8gT3V0cHV0IGkxCisgICAgICAgICAgICBWTU9WTiAgICAgICBkWGkxaGksIHFTcmM0aGkgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUxMTE4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fTWFza1RhYmxlLmgKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fTWFza1RhYmxlLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogTWFzayBUYWJsZSB0byBtYXNrIHRoZSBlbmQgb2YgYXJyYXkKKyAqLworIAorCisKKyNpZm5kZWYgX0FSTUNPTU1fTUFTS1RBQkxFX0hfCisjZGVmaW5lIF9BUk1DT01NX01BU0tUQUJMRV9IXworCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKyAgCisvKiBNYXNrIHRhYmxlICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybUNPTU1fcU1hc2tUYWJsZTE2W01hc2tUYWJsZVNpemVdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1DT01NX3FNYXNrVGFibGU4W01hc2tUYWJsZVNpemVdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9WZXJzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYjNlMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybUNPTU1fVmVyc2lvbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIEd1YXJkIHRoZSBoZWFkZXIgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICovCisjaWZuZGVmIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18KKyNkZWZpbmUgX19BUk1fQ09NTV9WRVJTSU9OX0hfXworCisKKy8qIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgYmUgaW4gb214dHlwZXMuaCBidXQgaGFzbid0IGJlZW4gYXBwcm92ZWQgYnkgT3Blbk1BWCB5ZXQgKi8KKyNkZWZpbmUgT01YX1ZFUlNJT04gMTAyCisKKy8qIFdlIG5lZWQgdG8gZGVmaW5lIHRoZXNlIG1hY3JvcyBpbiBvcmRlciB0byBjb252ZXJ0IGEgI2RlZmluZSBudW1iZXIgaW50byBhICNkZWZpbmUgc3RyaW5nLiAqLworI2RlZmluZSBBUk1fUVVPVEUoYSkgI2EKKyNkZWZpbmUgQVJNX0lORElSRUNUKEEpIEFSTV9RVU9URShBKQorCisvKiBDb252ZXJ0IHRoZSBPTVhfVkVSU0lPTiBudW1iZXIgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcHJpbnQgaXQgb3V0LiAqLworI2RlZmluZSBBUk1fVkVSU0lPTl9TVFJJTkcgQVJNX0lORElSRUNUKE9NWF9WRVJTSU9OKQorCisKKy8qIERlZmluZSB0aGlzIGluIG9yZGVyIHRvIHR1cm4gb24gQVJNIHZlcnNpb24vcmVsZWFzZS9idWlsZCBzdHJpbmdzIGluIGVhY2ggZG9tYWluICovCisjZGVmaW5lIEFSTV9JTkNMVURFX1ZFUlNJT05fREVTQ1JJUFRJT05TCisKKyNpZmRlZiBBUk1fSU5DTFVERV9WRVJTSU9OX0RFU0NSSVBUSU9OUworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teEFDX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhJQ19WZXJzaW9uRGVzY3JpcHRpb247CisgIGV4dGVybiBjb25zdCBjaGFyICogY29uc3Qgb214SVBfVmVyc2lvbkRlc2NyaXB0aW9uOworICBleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IG9teFNQX1ZlcnNpb25EZXNjcmlwdGlvbjsKKyAgZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBvbXhWQ19WZXJzaW9uRGVzY3JpcHRpb247CisjZW5kaWYgLyogQVJNX0lOQ0xVREVfVkVSU0lPTl9ERVNDUklQVElPTlMgKi8KKworCisvKiBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBieSB0aGUgcmVsZWFzZSBzY3JpcHQgKi8KKy8qIFRoZXkgYXJlIHVzZWQgaW4gdGhlIEFSTSB2ZXJzaW9uIHN0cmluZ3MgZGVmaW5lZCBmb3IgZWFjaCBkb21haW4uICAgICAgICAgICAgICovCisKKy8qIFRoZSByZWxlYXNlIHRhZyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5LiAtIHVzZWQgZm9yIHNvdXJjZSBhbmQgb2JqZWN0IHJlbGVhc2VzICovCisjZGVmaW5lIE9NWF9BUk1fUkVMRUFTRV9UQUcgICJyMXAwLTAwYmV0MCIKKworLyogVGhlIEFSTSBhcmNoaXRlY3R1cmUgdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfQVJDSElURUNUVVJFICJBUk0gQXJjaGl0ZWN0dXJlIFY3IHdpdGggTkVPTiIKKworLyogVGhlIEFSTSBUb29sY2hhaW4gdXNlZCB0byBidWlsZCBhbnkgb2JqZWN0cyBvciBleGVjdXRhYmxlcyBpbiB0aGlzIHJlbGVhc2UuICovCisjZGVmaW5lIE9NWF9BUk1fQlVJTERfVE9PTENIQUlOICAgICJBUk0gUlZDVCAzLjEiCisKKworI2VuZGlmIC8qIF9fQVJNX0NPTU1fVkVSU0lPTl9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9hcm1DT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk1NmJkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtQ09NTV9zLmgKQEAgLTAsMCArMSwxMTU3IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1DT01NX3MuaAorOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBBUk0gb3B0aW1pemVkIE9wZW5NQVggY29tbW9uIGhlYWRlciBmaWxlCis7Ly8KKworOy8vIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24KKyBJRiA6TE5PVDo6REVGOkFSTUNPTU1fU19ICisgR0JMTCBBUk1DT01NX1NfSAorCisgICAgICAgIFJFUVVJUkU4ICAgICAgICAgICAgOy8vIFJlcXVpcmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgUFJFU0VSVkU4ICAgICAgICAgICA7Ly8gUHJlc2VydmVzIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKKyAgICAgICAgCisgICAgICAgIEdCTEwgICAgQVJNX0VSUk9SQ0hFQ0sKK0FSTV9FUlJPUkNIRUNLICBTRVRMIHtGQUxTRX0KKworOy8vIEdsb2JhbHMKKworICAgICAgICBHQkxTICAgIF9SUmVnTGlzdCAgIDsvLyBSIHNhdmVkIHJlZ2lzdGVyIGxpc3QKKyAgICAgICAgR0JMUyAgICBfRFJlZ0xpc3QgICA7Ly8gRCBzYXZlZCByZWdpc3RlciBsaXN0CisgICAgICAgIEdCTFMgICAgX1ZhcmlhbnQgICAgOy8vIFNlbGVjdGVkIHByb2Nlc3NvciB2YXJpYW50CisgICAgICAgIEdCTFMgICAgX0NQVSAgICAgICAgOy8vIENQVSBuYW1lCisgICAgICAgIEdCTFMgICAgX1N0cnVjdCAgICAgOy8vIFN0cnVjdHVyZSBuYW1lCisgICAgICAgIAorICAgICAgICBHQkxMICAgIF9JbkZ1bmMgICAgIDsvLyBJbnNpZGUgZnVuY3Rpb24gYXNzZW1ibHkgZmxhZworICAgICAgICBHQkxMICAgIF9Td0xvbmcgICAgIDsvLyBMb25nIHN3aXRjaCBmbGFnCisgICAgICAgIAorICAgICAgICBHQkxBICAgIF9SQnl0ZXMgICAgIDsvLyBOdW1iZXIgb2YgcmVnaXN0ZXIgYnl0ZXMgb24gc3RhY2sKKyAgICAgICAgR0JMQSAgICBfU0J5dGVzICAgICA7Ly8gTnVtYmVyIG9mIHNjcmF0Y2ggYnl0ZXMgb24gc3RhY2sgCisgICAgICAgIEdCTEEgICAgX0FCeXRlcyAgICAgOy8vIFN0YWNrIG9mZnNldCBvZiBuZXh0IGFyZ3VtZW50CisgICAgICAgIEdCTEEgICAgX1dvcmtzcGFjZSAgOy8vIFN0YWNrIG9mZnNldCBvZiBzY3JhdGNoIHdvcmtzcGFjZQorICAgICAgICBHQkxBICAgIF9GICAgICAgICAgIDsvLyBGdW5jdGlvbiBudW1iZXIKKyAgICAgICAgR0JMQSAgICBfU3RPZmYgICAgICA7Ly8gU3RydWN0IG9mZnNldAorICAgICAgICBHQkxBICAgIF9Td051bSAgICAgIDsvLyBTd2l0Y2ggbnVtYmVyCisgICAgICAgIEdCTFMgICAgXzMyICAgICAgICAgOy8vIFN1ZmZpeCBmb3IgMzIgYnl0ZSBhbGlnbm1uZXQKKyAgICAgICAgR0JMUyAgICBfMTYgICAgICAgICA7Ly8gU3VmZml4IGZvciAxNiBieXRlIGFsaWdubW5ldAorICAgICAgICAKK19JbkZ1bmMgICAgICAgICBTRVRMICAgIHtGQUxTRX0KK19TQnl0ZXMgICAgICAgICBTRVRBICAgIDAKK19GICAgICAgICAgICAgICBTRVRBICAgIDAKK19Td051bSAgICAgICAgICBTRVRBICAgIDAKK18zMiAgICAgICAgICAgICBTRVRTICAgICJBTElHTjMyIgorXzE2ICAgICAgICAgICAgIFNFVFMgICAgIkFMSUdOMTYiCisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBPdmVycmlkZSB0aGUgdG9vbHMgc2V0dGluZ3Mgb2YgdGhlIENQVSBpZiB0aGUgI2RlZmluZQorOy8vIFVTRUNQVSBpcyBzZXQsIG90aGVyd2lzZSB1c2UgdGhlIENQVSBkZWZpbmVkIGJ5IHRoZQorOy8vIGFzc2VtYmxlciBzZXR0aW5ncy4KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgIElGIDpERUY6IE9WRVJSSURFQ1BVCitfQ1BVICAgICAgIFNFVFMgIE9WRVJSSURFQ1BVCisgICAgICAgRUxTRQorX0NQVSAgICAgICBTRVRTICAgIHtDUFV9ICAgICAgIAorICAgICAgIEVORElGCisKKworCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gV29yayBvdXQgd2hpY2ggY29kZSB0byBidWlsZAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIElGIDpERUY6QVJNMTEzNkpTOkxPUjo6REVGOkNvcnRleEE4OkxPUjo6REVGOkFSTV9HRU5FUklDCisgICAgICAgICAgICBJTkZPIDEsIlBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgTV9WQVJJQU5UUyIKKyAgICAgICAgRU5ESUYKKworICAgICAgICA7Ly8gRGVmaW5lIGFuZCByZXNldCBhbGwgb2ZmaWNpYWxseSByZWNvbmduaXNlZCB2YXJpYW50cworICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVFMKKyAgICAgICAgX01fREVGX1ZBUklBTlQgQVJNOTI2RUpTCisgICAgICAgIF9NX0RFRl9WQVJJQU5UIEFSTTExMzZKUworICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk0xMTM2SlNfVQorICAgICAgICBfTV9ERUZfVkFSSUFOVCBDb3J0ZXhBOAorICAgICAgICBfTV9ERUZfVkFSSUFOVCBBUk03VERNSQorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9ERUZfVkFSSUFOVCAkdmFyCisgICAgICAgIEdCTEwgJHZhcgorICAgICAgICBHQkxMIF9vayR2YXIKKyR2YXIgICAgU0VUTCB7RkFMU0V9CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKworICAgICAgICA7Ly8gVmFyaWFudCBkZWNsYXJhdGlvbgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIERlZmluZSBhIGxpc3Qgb2YgY29kZSB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAgICA7Ly8gc291cmNlIGZpbGUuIFRoaXMgbWFjcm8gdGhlbiBjaG9vc2VzIHRoZSBtb3N0CisgICAgICAgIDsvLyBhcHByb3ByaWF0ZSB2YXJpYW50IHRvIGJ1aWxkIGZvciB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKKyAgICAgICAgOy8vIGNvcmUuCisgICAgICAgIDsvLyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVkFSSUFOVFMgJHYwLCR2MSwkdjIsJHYzLCR2NCwkdjUsJHY2LCR2NyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgdG8gVFJVRSB2YXJpYW50cyB0aGF0IGFyZSBzdXBwb3J0ZWQKKyAgICAgICAgX01fREVGX1ZBUklBTlRTCisgICAgICAgIF9NX1ZBUklBTlQgJHYwCisgICAgICAgIF9NX1ZBUklBTlQgJHYxCisgICAgICAgIF9NX1ZBUklBTlQgJHYyCisgICAgICAgIF9NX1ZBUklBTlQgJHYzCisgICAgICAgIF9NX1ZBUklBTlQgJHY0CisgICAgICAgIF9NX1ZBUklBTlQgJHY1CisgICAgICAgIF9NX1ZBUklBTlQgJHY2CisgICAgICAgIF9NX1ZBUklBTlQgJHY3CisgICAgICAgIAorICAgICAgICA7Ly8gTG9vayBmb3IgZmlyc3QgYXZhaWxhYmxlIHZhcmlhbnQgdG8gbWF0Y2ggYSBDUFUKKyAgICAgICAgOy8vIF9NX1RSWSBjcHUsIHZhcmlhbnQgZmFsbCBiYWNrIGxpc3QKK19WYXJpYW50IFNFVFMgIiIgICAgICAgICAgICAgICAgCisgICAgICAgIF9NX1RSWSBBUk05MjZFSi1TLCAgIEFSTTkyNkVKUworICAgICAgICBfTV9UUlkgQVJNMTE3NkpaLVMsICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExNzZKWkYtUywgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTU2VDItUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgQVJNMTE1NlQyRi1TLCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIEFSTTExMzZKLVMsICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk0xMTM2SkYtUywgIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgTVBDb3JlLCAgICAgICBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIGZhbGNvbi12ZnAsIEFSTTExMzZKUworICAgICAgICBfTV9UUlkgZmFsY29uLWZ1bGwtbmVvbiwgQ29ydGV4QTgKKyAgICAgICAgX01fVFJZIENvcnRleC1BOE5vTmVvbiwgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBDb3J0ZXgtQTgsICAgIENvcnRleEE4LCBBUk0xMTM2SlMKKyAgICAgICAgX01fVFJZIENvcnRleC1SNCwgICAgQVJNMTEzNkpTCisgICAgICAgIF9NX1RSWSBBUk03VERNSQorICAgICAgICAKKyAgICAgICAgOy8vIFNlbGVjdCB0aGUgY29ycmVjdCB2YXJpYW50CisgICAgICAgIF9NX0RFRl9WQVJJQU5UUworICAgICAgICBJRiBfVmFyaWFudD0iIgorICAgICAgICAgICAgSU5GTyAxLCAiTm8gbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTFNFCiskX1ZhcmlhbnQgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gUmVnaXN0ZXIgYSB2YXJpYW50IGFzIGF2YWlsYWJsZQorICAgICAgICBNQUNSTworICAgICAgICBfTV9WQVJJQU5UICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiA6TE5PVDo6REVGOl9vayR2YXIKKyAgICAgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCB2YXJpYW50ICckdmFyJyIKKyAgICAgICAgRU5ESUYKKyR2YXIgICAgU0VUTCB7VFJVRX0KKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEZvciBhIGdpdmVuIENQVSwgc2VlIGlmIGFueSBvZiB0aGUgdmFyaWFudHMgc3VwcG9ydGluZworICAgICAgICA7Ly8gdGhpcyBDUFUgYXJlIGF2YWlsYWJsZS4gVGhlIGZpcnN0IGF2YWlsYWJsZSB2YXJpYW50IGlzCisgICAgICAgIDsvLyBjaG9zZW4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fVFJZICRjcHUsICR2MCwkdjEsJHYyLCR2MywkdjQsJHY1LCR2NiwkdjcKKyAgICAgICAgSUYgIiRjcHUiPD5fQ1BVCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBfTV9UUlkxICR2MAorICAgICAgICBfTV9UUlkxICR2MQorICAgICAgICBfTV9UUlkxICR2MgorICAgICAgICBfTV9UUlkxICR2MworICAgICAgICBfTV9UUlkxICR2NAorICAgICAgICBfTV9UUlkxICR2NQorICAgICAgICBfTV9UUlkxICR2NgorICAgICAgICBfTV9UUlkxICR2NworICAgICAgICA7Ly8gQ2hlY2sgYSBtYXRjaCB3YXMgZm91bmQKKyAgICAgICAgSUYgX1ZhcmlhbnQ9IiIKKyAgICAgICAgICAgIElORk8gMSwgIk5vIHZhcmlhbnQgbWF0Y2ggZm91bmQgZm9yIENQVSAnJF9DUFUnIgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9UUlkxICR2YXIKKyAgICAgICAgSUYgIiR2YXIiPSIiCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAoX1ZhcmlhbnQ9IiIpOkxBTkQ6JHZhcgorX1ZhcmlhbnQgU0VUUyAiJHZhciIKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworOy8vIFN0cnVjdHVyZSBkZWZpbml0aW9uCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBvZiBnaXZlbiBuYW1lCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSVUNUICRzbmFtZQorX1N0cnVjdCBTRVRTICIkc25hbWUiCitfU3RPZmYgIFNFVEEgMAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gRGVjbGFyZSBhIHN0cnVjdHVyZSBmaWVsZAorICAgICAgICA7Ly8gVGhlIGZpZWxkIGlzIGNhbGxlZCAkc25hbWVfJGZuYW1lCisgICAgICAgIDsvLyAkc2l6ZSAgID0gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSwgbXVzdCBiZSBwb3dlciBvZiAyIAorICAgICAgICA7Ly8gJG51bWJlciA9IChpZiBwcm92aWRlZCkgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZvciBhbiBhcnJheQorICAgICAgICBNQUNSTworICAgICAgICBNX0ZJRUxEICRmbmFtZSwgJHNpemUsICRudW1iZXIKKyAgICAgICAgSUYgKF9TdE9mZjpBTkQ6KCRzaXplLTEpKSE9MAorX1N0T2ZmICAgICAgU0VUQSBfU3RPZmYgKyAoJHNpemUgLSAoX1N0T2ZmOkFORDooJHNpemUtMSkpKQorICAgICAgICBFTkRJRgorJF9TdHJ1Y3QuXyRmbmFtZSBFUVUgX1N0T2ZmCisgICAgICAgIElGICIkbnVtYmVyIjw+IiIKK19TdE9mZiAgICAgIFNFVEEgX1N0T2ZmICsgJHNpemUqJG51bWJlcgorICAgICAgICBFTFNFCitfU3RPZmYgICAgICBTRVRBIF9TdE9mZiArICRzaXplCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNUUlVDVAorc2l6ZW9mXyRfU3RydWN0IEVRVSBfU3RPZmYKK19TdHJ1Y3QgU0VUUyAiIgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gU3dpdGNoIGFuZCB0YWJsZSBtYWNyb3MKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgOy8vIFN0YXJ0IGEgcmVsYXRpdmUgc3dpdGNoIHRhYmxlIHdpdGggcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLworICAgICAgICA7Ly8gJHYgPSB0aGUgcmVnaXN0ZXIgdG8gc3dpdGNoIG9uCisgICAgICAgIDsvLyAkcyA9IGlmIHNwZWNpZmllZCBtdXN0IGJlICJMIiB0byBpbmRpY2F0ZSBsb25nCisgICAgICAgIDsvLyAgICAgIHRoaXMgYWxsb3dzIGEgZ3JlYXRlciByYW5nZSB0byB0aGUgY2FzZSBjb2RlCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1dJVENIICR2LCAkcworICAgICAgICBBU1NFUlQgIiRzIj0iIjpMT1I6IiRzIj0iTCIKK19Td0xvbmcgU0VUTCB7RkFMU0V9CisgICAgICAgIElGICIkcyI9IkwiCitfU3dMb25nICAgICBTRVRMIHtUUlVFfQorICAgICAgICBFTkRJRgorX1N3TnVtICBTRVRBIF9Td051bSsxICAgICAgICAKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIFRCSCBbcGMsICR2LCBMU0wjMV0KKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBUQkIgW3BjLCAkdl0KKyAgICAgICAgICAgIEVORElGCitfU3dpdGNoJF9Td051bQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBBREQgcGMsIHBjLCAkdiwgTFNMICMyCisgICAgICAgICAgICBOT1AKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEFkZCBhIGNhc2UgdG8gdGhlIHN3aXRjaCBzdGF0ZW1lbnQKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9DQVNFICAkbGFiZWwKKyAgICAgICAgSUYge0NPTkZJR309MTYKKyAgICAgICAgICAgIDsvLyBUaHVtYgorICAgICAgICAgICAgSUYgX1N3TG9uZworICAgICAgICAgICAgICAgIERDVyAoJGxhYmVsIC0gX1N3aXRjaCRfU3dOdW0pLzIKKyAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICBEQ0IgKCRsYWJlbCAtIF9Td2l0Y2gkX1N3TnVtKS8yCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJNCisgICAgICAgICAgICBCICAgJGxhYmVsCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBFbmQgb2Ygc3dpdGNoIHN0YXRlbWVudAorICAgICAgICBNQUNSTworICAgICAgICBNX0VORFNXSVRDSAorICAgICAgICBBTElHTiAyCisgICAgICAgIE1FTkQgICAgICAgCisKKworOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRGF0YSBhcmVhIGFsbG9jYXRpb24KKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgICAgIDsvLyBDb25zdGFudCB0YWJsZSBhbGxvY2F0b3IgbWFjcm8KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDcmVhdGVzIGEgbmV3IHNlY3Rpb24gZm9yIGVhY2ggY29uc3RhbnQgdGFibGUKKyAgICAgICAgOy8vICRuYW1lIGlzIHN5bWJvbCB0aHJvdWdoIHdoaWNoIHRoZSB0YWJsZSBjYW4gYmUgYWNjZXNzZWQuCisgICAgICAgIDsvLyAkYWxpZ24gaXMgdGhlIG9wdGlvbmFsIGFsaWdubWVudCBvZiB0aGUgdGFibGUsIGxvZzIgb2YgCisgICAgICAgIDsvLyAgdGhlIGJ5dGUgYWxpZ25tZW50IC0gJGFsaWduPTQgaXMgMTYgYnl0ZSBhbGlnbmVkCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fVEFCTEUgICRuYW1lLCAkYWxpZ24KKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgIiRhbGlnbiI9IiIKKyAgICAgICAgICAgIEFSRUEgfC5jb25zdGRhdGF8LCBSRUFET05MWSwgREFUQQorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQVJFQXMgaW5oZXJpdCB0aGUgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDsvLyBUaGVyZWZvcmUgZm9yIGVhY2ggYWxpZ25tZW50IHNpemUgd2UgbXVzdCBoYXZlIGFuIGFyZWEKKyAgICAgICAgICAgIDsvLyBvZiBhIGRpZmZlcmVudCBuYW1lLgorICAgICAgICAgICAgQVJFQSBjb25zdGRhdGFfYSRhbGlnbiwgUkVBRE9OTFksIERBVEEsIEFMSUdOPSRhbGlnbgorICAgICAgICAgICAgCisgICAgICAgICAgICA7Ly8gV2UgYWxzbyBmb3JjZSBhbGlnbm1lbnQgaW5jYXNlIHdlIGFyZSB0YWdnaW5nIG9udG8KKyAgICAgICAgICAgIDsvLyBhbiBhbHJlYWR5IHN0YXJ0ZWQgYXJlYS4KKyAgICAgICAgICAgIEFMSUdOICgxPDwkYWxpZ24pCisgICAgICAgIEVORElGCiskbmFtZQorICAgICAgICBNRU5ECisgICAgICAgIAorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gTWFjcm9zIHRvIGFsbG9jYXRlIHNwYWNlIG9uIHRoZSBzdGFjaworOy8vCis7Ly8gVGhlc2UgYWxsIGFzc3VtZSB0aGF0IHRoZSBzdGFjayBpcyA4LWJ5dGUgYWxpZ25lZAorOy8vIGF0IGVudHJ5IHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgCis7Ly8gMzItYnl0ZSBhbGlnbm1lbnQgbWFjcm8gbmVlZHMgdG8gd29yayBpbiBhCis7Ly8gYml0IG1vcmUgb2YgYSBzcGVjaWFsIHdheS4uLgorOy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgCisKKworICAgICAgICA7Ly8gQWxsb2NhdGUgMS1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMSAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORAorICAgICAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSAyLWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgJHNpemUgYnl0ZXMuCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQUxMT0MyICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjEpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoMiAtIChfU0J5dGVzOkFORDoxKSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GICAgRVFVIF9TQnl0ZXMKK19TQnl0ZXMgU0VUQSBfU0J5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5ECisgICAgICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDQtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAkc2l6ZSBieXRlcy4KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzQgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6MykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg0IC0gKF9TQnl0ZXM6QU5EOjMpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YgICBFUVUgX1NCeXRlcworX1NCeXRlcyBTRVRBIF9TQnl0ZXMgKyAoJHNpemUpCisgICAgICAgIE1FTkQKKyAgICAgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgOC1ieXRlIGFsaWduZWQgYXJlYSBvZiBuYW1lCisgICAgICAgIDsvLyAkbmFtZSBzaXplICRzaXplIGJ5dGVzLgorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DOCAgJG5hbWUsICRzaXplCisgICAgICAgIEFTU0VSVCA6TE5PVDpfSW5GdW5jCisgICAgICAgIElGIChfU0J5dGVzOkFORDo3KSE9MAorX1NCeXRlcyAgICAgU0VUQSBfU0J5dGVzICsgKDggLSAoX1NCeXRlczpBTkQ6NykpCisgICAgICAgIEVORElGCiskbmFtZSRfRiAgIEVRVSBfU0J5dGVzCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkKKyAgICAgICAgTUVORCAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBBbGxvY2F0ZSA4LWJ5dGUgYWxpZ25lZCBhcmVhIG9mIG5hbWUKKyAgICAgICAgOy8vICRuYW1lIHNpemUgKCRzaXplKzE2KSBieXRlcy4KKyAgICAgICAgOy8vIFRoZSBleHRyYSAxNiBieXRlcyBhcmUgbGF0ZXIgdXNlZCB0byBhbGlnbiB0aGUgcG9pbnRlciB0byAxNiBieXRlcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BTExPQzE2ICAkbmFtZSwgJHNpemUKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgSUYgKF9TQnl0ZXM6QU5EOjcpIT0wCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyRuYW1lJF9GJF8xNiAgIEVRVSAoX1NCeXRlcyArIDgpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyA4CisgICAgICAgIE1FTkQgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEFsbG9jYXRlIDgtYnl0ZSBhbGlnbmVkIGFyZWEgb2YgbmFtZQorICAgICAgICA7Ly8gJG5hbWUgc2l6ZSAoJHNpemUrMzIpIGJ5dGVzLgorICAgICAgICA7Ly8gVGhlIGV4dHJhIDMyIGJ5dGVzIGFyZSBsYXRlciB1c2VkIHRvIGFsaWduIHRoZSBwb2ludGVyIHRvIDMyIGJ5dGVzCisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBNX0FMTE9DMzIgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgOkxOT1Q6X0luRnVuYworICAgICAgICBJRiAoX1NCeXRlczpBTkQ6NykhPTAKK19TQnl0ZXMgICAgIFNFVEEgX1NCeXRlcyArICg4IC0gKF9TQnl0ZXM6QU5EOjcpKQorICAgICAgICBFTkRJRgorJG5hbWUkX0YkXzMyICAgRVFVIChfU0J5dGVzICsgMjQpCitfU0J5dGVzIFNFVEEgX1NCeXRlcyArICgkc2l6ZSkgKyAyNAorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBBcmd1bWVudCBEZWNsYXJhdGlvbiBNYWNybworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIEFsbG9jYXRlIGFuIGFyZ3VtZW50IG5hbWUgJG5hbWUKKyAgICAgICAgOy8vIHNpemUgJHNpemUgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BUkcgICAgICRuYW1lLCAkc2l6ZQorICAgICAgICBBU1NFUlQgX0luRnVuYworJG5hbWUkX0YgICAgRVFVIF9BQnl0ZXMKK19BQnl0ZXMgU0VUQSBfQUJ5dGVzICsgKCRzaXplKQorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKzsvLyBNYWNyb3MgdG8gYWNjZXNzIHN0YWNrZWQgdmFyaWFibGVzCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24KKyAgICAgICAgOy8vIHdpdGggYSBjb25zdGFudCBzZWNvbmQgb3BlcmFuZAorICAgICAgICBNQUNSTworICAgICAgICBfTV9PUEMgJG9wLCRyZCwkcm4sJGNvbnN0CisgICAgICAgIExDTEEgICAgX3NoCisgICAgICAgIExDTEEgICAgX2NzdAorX3NoICAgICBTRVRBICAgIDAKK19jc3QgICAgU0VUQSAgICAkY29uc3QKKyAgICAgICAgSUYgX2NzdD0wCisgICAgICAgICRvcCAkcmQsICRybiwgI19jc3QKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIFdISUxFIChfY3N0OkFORDozKT0wCitfY3N0ICAgICAgICBTRVRBIF9jc3Q+PjIKK19zaCAgICAgICAgIFNFVEEgX3NoKzIKKyAgICAgICAgV0VORAorICAgICAgICAkb3AgJHJkLCAkcm4sICMoX2NzdDpBTkQ6MHgwMDAwMDBGRik8PF9zaAorICAgICAgICBJRiBfY3N0Pj0yNTYKKyAgICAgICAgICAgICRvcCAkcmQsICRyZCwgIyhfY3N0OkFORDoweEZGRkZGRjAwKTw8X3NoCisgICAgICAgIEVORElGCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gTWFjcm8gdG8gcGVyZm9ybSBhIGRhdGEgYWNjZXNzIG9wZXJhdGlvbgorICAgICAgICA7Ly8gU3VjaCBhcyBMRFIgb3IgU1RSCisgICAgICAgIDsvLyBUaGUgYWRkcmVzc2luZyBtb2RlIGlzIG1vZGlmaWVkIHN1Y2ggdGhhdAorICAgICAgICA7Ly8gMS4gSWYgbm8gYWRkcmVzcyBpcyBnaXZlbiB0aGVuIHRoZSBuYW1lIGlzIHRha2VuCisgICAgICAgIDsvLyAgICBhcyBhIHN0YWNrIG9mZnNldAorICAgICAgICA7Ly8gMi4gSWYgdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUKKyAgICAgICAgOy8vICAgIHN0YXRlIGJlaW5nIGFzc2VtYmxlZCBmb3IgKGVnIFRodW1iKSB0aGVuIGEgc3VpdGFibGUKKyAgICAgICAgOy8vICAgIGFkZHJlc3NpbmcgbW9kZSBpcyBzdWJzdGl0dXRlZC4KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBPbiBFbnRyeToKKyAgICAgICAgOy8vICRpID0gSW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSAoZWcgIkxEUkIiKQorICAgICAgICA7Ly8gJGEgPSBSZXF1aXJlZCBieXRlIGFsaWdubWVudAorICAgICAgICA7Ly8gJHIgPSBSZWdpc3RlcihzKSB0byB0cmFuc2ZlciAoZWcgInIxIikKKyAgICAgICAgOy8vICRhMCwkYTEsJGEyLiBBZGRyZXNzaW5nIG1vZGUgYW5kIGNvbmRpdGlvbi4gT25lIG9mOgorICAgICAgICA7Ly8gICAgIGxhYmVsIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdICAgICAgICAgICAgICAgICAgICB7LCwsY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2UsIG9mZnNldF17IX0gICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZSwgb2Zmc2V0LCBzaGlmdF17IX0gIHssY2N9CisgICAgICAgIDsvLyAgICAgW2Jhc2VdLCBvZmZzZXQgICAgICAgICAgICB7LCxjY30KKyAgICAgICAgOy8vICAgICBbYmFzZV0sIG9mZnNldCwgc2hpZnQgICAgIHssY2N9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0RBVEEgJGksJGEsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIElGICIkYTAiOkxFRlQ6MT0iWyIKKyAgICAgICAgICAgIElGICIkYTEiPSIiCisgICAgICAgICAgICAgICAgJGkkYTMgICAkciwgJGEwCisgICAgICAgICAgICBFTFNFCisgICAgICAgICAgICAgICAgSUYgIiRhMCI6UklHSFQ6MT0iXSIKKyAgICAgICAgICAgICAgICAgICAgSUYgIiRhMiI9IiIKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgJGExCisgICAgICAgICAgICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIF9NX1BPU1RJTkQgJGkkYTMsICIkciIsICRhMCwgIiRhMSwkYTIiCisgICAgICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICBJRiAiJGEyIj0iIgorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAkYTEKKyAgICAgICAgICAgICAgICAgICAgRUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgX01fUFJFSU5EICAkaSRhMywgIiRyIiwgJGEwLCAiJGExLCRhMiIKKyAgICAgICAgICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgICAgICAgICBFTkRJRgorICAgICAgICAgICAgRU5ESUYKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgTENMQSAgICBfT2Zmc2V0CitfT2Zmc2V0ICAgICBTRVRBICAgIF9Xb3Jrc3BhY2UgKyAkYTAkX0YKKyAgICAgICAgICAgIEFTU0VSVCAgKF9PZmZzZXQ6QU5EOigkYS0xKSk9MAorICAgICAgICAgICAgJGkkYTEgICAkciwgW3NwLCAjX09mZnNldF0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEhhbmRsZSBwb3N0IGluZGV4ZWQgbG9hZC9zdG9yZXMKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlXSwgb2Zmc2V0CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BPU1RJTkQgJGksJHIsJGEwLCRhMQorICAgICAgICBMQ0xTIF9iYXNlCisgICAgICAgIExDTFMgX29mZnNldAorICAgICAgICBJRiB7Q09ORklHfT0xNiA7Ly8gVGh1bWIKK19iYXNlICAgICAgIFNFVFMgKCIkYTAiOkxFRlQ6KDpMRU46IiRhMCItMSkpOlJJR0hUOig6TEVOOiIkYTAiLTIpICAgOy8vIHJlbW92ZSBbXQorX29mZnNldCAgICAgU0VUUyAiJGExIgorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9IisiCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICAkaSAgJHIsICRhMAorICAgICAgICAgICAgSUYgX29mZnNldDpMRUZUOjE9Ii0iCitfb2Zmc2V0ICAgICAgICAgU0VUUyBfb2Zmc2V0OlJJR0hUOig6TEVOOl9vZmZzZXQtMSkKKyAgICAgICAgICAgICAgICBTVUIgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgICAgICBFTFNFICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEFERCAkX2Jhc2UsICRfYmFzZSwgJF9vZmZzZXQKKyAgICAgICAgICAgIEVORElGCisgICAgICAgIEVMU0UgOy8vIEFSTQorICAgICAgICAgICAgJGkgICRyLCAkYTAsICRhMQorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gSGFuZGxlIHByZSBpbmRleGVkIGxvYWQvc3RvcmUKKyAgICAgICAgOy8vIG9wICByZWcsIFtiYXNlLCBvZmZzZXRdeyF9CisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX1BSRUlORCAkaSwkciwkYTAsJGExCisgICAgICAgIExDTFMgX2Jhc2UKKyAgICAgICAgTENMUyBfb2Zmc2V0CisgICAgICAgIElGICh7Q09ORklHfT0xNik6TEFORDooKCIkYTEiOlJJR0hUOjIpPSJdISIpCitfYmFzZSAgICAgICBTRVRTICIkYTAiOlJJR0hUOig6TEVOOigiJGEwIiktMSkKK19vZmZzZXQgICAgIFNFVFMgIiRhMSI6TEVGVDooOkxFTjooIiRhMSIpLTIpCisgICAgICAgICAgICAkaSAkciwgWyRfYmFzZSwgJF9vZmZzZXRdCisgICAgICAgICAgICBBREQgJF9iYXNlLCAkX2Jhc2UsICRfb2Zmc2V0CisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICRpICAkciwgJGEwLCAkYTEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHVuc2lnbmVkIGJ5dGUgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgYnl0ZSBmcm9tIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fTERSU0IgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIkxEUlNCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgYnl0ZSB0byBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX1NUUkIgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJCIiwxLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCB1bnNpZ25lZCBoYWxmIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUkggICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJIIiwyLCRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBzaWduZWQgaGFsZiB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJTSCAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiTERSU0giLDIsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBoYWxmIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJIICAkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgX01fREFUQSAiU1RSSCIsMiwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIHdvcmQgZnJvbSBzdGFjaworICAgICAgICBNQUNSTworICAgICAgICBNX0xEUiAgICRyLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFIiLDQsJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSB3b3JkIHRvIHN0YWNrCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fU1RSICAgJHIsJGEwLCRhMSwkYTIsJGEzCisgICAgICAgIF9NX0RBVEEgIlNUUiIsNCwkciwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorCisgICAgICAgIDsvLyBMb2FkIGRvdWJsZSB3b3JkIGZyb20gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9MRFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJMRFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU3RvcmUgZG91YmxlIHdvcmQgdG8gc3RhY2sKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVFJEICAkcjAsJHIxLCRhMCwkYTEsJGEyLCRhMworICAgICAgICBfTV9EQVRBICJTVFJEIiw4LCIkcjAsJHIxIiwkYTAsJGExLCRhMiwkYTMKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbgorICAgICAgICBNQUNSTworICAgICAgICBNX0FEUiAgICRhLCAkYiwgJGNjCisgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YpCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBHZXQgYWJzb2x1dGUgYWRkcmVzcyBvZiBzdGFjayBhbGxvY2F0ZWQgbG9jYXRpb24gYW5kIGFsaWduIHRoZSBhZGRyZXNzIHRvIDE2IGJ5dGVzCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fQURSMTYgJGEsICRiLCAkY2MKKyAgICAgICAgICAgIF9NX09QQyAgQUREJGNjLCAkYSwgc3AsIChfV29ya3NwYWNlICsgJGIkX0YkXzE2KQorICAgICAgICAKKyAgICAgICAgICAgIDsvLyBOb3cgYWxpZ24gJGEgdG8gMTYgYnl0ZXMKKyAgICAgICAgICAgIEJJQyRjYyAgJGEsJGEsIzB4MEYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIEdldCBhYnNvbHV0ZSBhZGRyZXNzIG9mIHN0YWNrIGFsbG9jYXRlZCBsb2NhdGlvbiBhbmQgYWxpZ24gdGhlIGFkZHJlc3MgdG8gMzIgYnl0ZXMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9BRFIzMiAkYSwgJGIsICRjYworICAgICAgICAgICAgX01fT1BDICBBREQkY2MsICRhLCBzcCwgKF9Xb3Jrc3BhY2UgKyAkYiRfRiRfMzIpCisgICAgICAgIAorICAgICAgICAgICAgOy8vIE5vdyBhbGlnbiAkYSB0byAzMiBieXRlcworICAgICAgICAgICAgQklDJGNjICAkYSwkYSwjMHgxRgorICAgICAgICBNRU5ECisKKzsvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCis7Ly8gRnVuY3Rpb24gaGVhZGVyIGFuZCBmb290ZXIgbWFjcm9zCis7Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIEhlYWRlciBNYWNybyAgICAKKyAgICAgICAgOy8vIEdlbmVyYXRlcyB0aGUgZnVuY3Rpb24gcHJvbG9ndWUKKyAgICAgICAgOy8vIE5vdGUgdGhhdCBmdW5jdGlvbnMgc2hvdWxkIGFsbCBiZSAic3RhY2stbW92ZXMtb25jZSIKKyAgICAgICAgOy8vIFRoZSBGTlNUQVJUIGFuZCBGTkVORCBtYWNyb3Mgc2hvdWxkIGJlIHRoZSBvbmx5IHBsYWNlcworICAgICAgICA7Ly8gd2hlcmUgdGhlIHN0YWNrIG1vdmVzLgorICAgICAgICA7Ly8gICAgCisgICAgICAgIDsvLyAkbmFtZSAgPSBmdW5jdGlvbiBuYW1lCisgICAgICAgIDsvLyAkcnJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSByZWdpc3RlcnMKKyAgICAgICAgOy8vICAgICAgICAgICJsciIgc3RhY2sgImxyIiBvbmx5CisgICAgICAgIDsvLyAgICAgICAgICAick4iIHN0YWNrIHJlZ2lzdGVycyAicjQtck4sbHIiCisgICAgICAgIDsvLyAkZHJlZyAgPSAiIiAgIGRvbid0IHN0YWNrIGFueSBEIHJlZ2lzdGVycworICAgICAgICA7Ly8gICAgICAgICAgImROIiBzdGFjayByZWdpc3RlcnMgImQ4LWROIgorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIE5vdGU6IEFSTSBBcmNoaWN0dXJlIHByb2NlZHVyZSBjYWxsIHN0YW5kYXJkIEFBUENTCisgICAgICAgIDsvLyBzdGF0ZXMgdGhhdCByNC1yMTEsIHNwLCBkOC1kMTUgbXVzdCBiZSBwcmVzZXJ2ZWQgYnkKKyAgICAgICAgOy8vIGEgY29tcGxpYW50IGZ1bmN0aW9uLgorICAgICAgICBNQUNSTworICAgICAgICBNX1NUQVJUICRuYW1lLCAkcnJlZywgJGRyZWcKKyAgICAgICAgQVNTRVJUIDpMTk9UOl9JbkZ1bmMKKyAgICAgICAgQVNTRVJUICIkbmFtZSIhPSIiCitfSW5GdW5jIFNFVEwge1RSVUV9CitfUkJ5dGVzIFNFVEEgMAorX1dvcmtzcGFjZSBTRVRBIDAKKworICAgICAgICA7Ly8gQ3JlYXRlIGFuIGFyZWEgZm9yIHRoZSBmdW5jdGlvbiAgICAgICAgCisgICAgICAgIEFSRUEgICAgfC50ZXh0fCwgQ09ERQorICAgICAgICBFWFBPUlQgICRuYW1lCiskbmFtZSAgIEZVTkNUSU9OCisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBSIHJlZ2lzdGVycworICAgICAgICBfTV9HRVRSUkVHTElTVCAkcnJlZworICAgICAgICBJRiBfUlJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBTVE1GRCAgIHNwISwgeyRfUlJlZ0xpc3QsIGxyfQorICAgICAgICBFTkRJRgorICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSBEIHJlZ2lzdGVycworICAgICAgICBfTV9HRVREUkVHTElTVCAgJGRyZWcgICAgICAgIAorICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWU1RNRkQgIHNwISwgeyRfRFJlZ0xpc3R9CisgICAgICAgIEVORElGICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBFbnN1cmUgc2l6ZSBjbGFpbWVkIG9uIHN0YWNrIGlzIDgtYnl0ZSBhbGlnbmVkCisgICAgICAgIElGICgoX1NCeXRlczpBTkQ6NykhPTApCitfU0J5dGVzICAgICBTRVRBIF9TQnl0ZXMgKyAoOCAtIChfU0J5dGVzOkFORDo3KSkKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisgICAgICAgIElGIChfU0J5dGVzIT0wKQorICAgICAgICAgICAgX01fT1BDIFNVQiwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICAKK19BQnl0ZXMgU0VUQSBfU0J5dGVzICsgX1JCeXRlcyAtIF9Xb3Jrc3BhY2UKKworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBQcmludCBmdW5jdGlvbiBuYW1lIGlmIGRlYnVnIGVuYWJsZWQKKyAgICAgICAgTV9QUklOVEYgIiRuYW1lXG4iLAorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gV29yayBvdXQgYSBsaXN0IG9mIFIgc2F2ZWQgcmVnaXN0ZXJzCisgICAgICAgIE1BQ1JPCisgICAgICAgIF9NX0dFVFJSRUdMSVNUICRycmVnCisgICAgICAgIElGICIkcnJlZyI9IiIKK19SUmVnTGlzdCAgIFNFVFMgIiIKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGICAgICAgICAKKyAgICAgICAgSUYgIiRycmVnIj0ibHIiOkxPUjoiJHJyZWciPSJyNCIKK19SUmVnTGlzdCAgIFNFVFMgInI0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkcnJlZyI9InI1IjpMT1I6IiRycmVnIj0icjYiCitfUlJlZ0xpc3QgICBTRVRTICJyNC1yNiIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysxNgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjciOkxPUjoiJHJyZWciPSJyOCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXI4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzI0CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJHJyZWciPSJyOSI6TE9SOiIkcnJlZyI9InIxMCIKK19SUmVnTGlzdCAgIFNFVFMgInI0LXIxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcyszMgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRycmVnIj0icjExIjpMT1I6IiRycmVnIj0icjEyIgorX1JSZWdMaXN0ICAgU0VUUyAicjQtcjEyIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzQwCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJTkZPIDEsICJVbnJlY29nbml6ZWQgc2F2ZWQgciByZWdpc3RlciBsaW1pdCAnJHJyZWcnIgorICAgICAgICBNRU5EICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBXb3JrIG91dCBhIGxpc3Qgb2YgRCBzYXZlZCByZWdpc3RlcnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fR0VURFJFR0xJU1QgJGRyZWcKKyAgICAgICAgSUYgIiRkcmVnIj0iIgorX0RSZWdMaXN0ICAgU0VUUyAiIgorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYgICAgICAgIAorICAgICAgICBJRiAiJGRyZWciPSJkOCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzgKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQ5IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDkiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrMTYKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMCIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMCIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcysyNAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDExIgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDExIgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzMyCisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTIiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTIiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNDAKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkZHJlZyI9ImQxMyIKK19EUmVnTGlzdCAgIFNFVFMgImQ4LWQxMyIKK19SQnl0ZXMgICAgIFNFVEEgX1JCeXRlcys0OAorICAgICAgICAgICAgTUVYSVQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiRkcmVnIj0iZDE0IgorX0RSZWdMaXN0ICAgU0VUUyAiZDgtZDE0IgorX1JCeXRlcyAgICAgU0VUQSBfUkJ5dGVzKzU2CisgICAgICAgICAgICBNRVhJVAorICAgICAgICBFTkRJRgorICAgICAgICBJRiAiJGRyZWciPSJkMTUiCitfRFJlZ0xpc3QgICBTRVRTICJkOC1kMTUiCitfUkJ5dGVzICAgICBTRVRBIF9SQnl0ZXMrNjQKKyAgICAgICAgICAgIE1FWElUCisgICAgICAgIEVORElGCisgICAgICAgIElORk8gMSwgIlVucmVjb2duaXplZCBzYXZlZCBkIHJlZ2lzdGVyIGxpbWl0ICckZHJlZyciCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBQcm9kdWNlIGZ1bmN0aW9uIHJldHVybiBpbnN0cnVjdGlvbnMKKyAgICAgICAgTUFDUk8KKyAgICAgICAgX01fUkVUICRjYworICAgICAgICBJRiBfRFJlZ0xpc3Q8PiIiCisgICAgICAgICAgICBWUE9QJGNjIHskX0RSZWdMaXN0fQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBfUlJlZ0xpc3Q9IiIKKyAgICAgICAgICAgIEJYJGNjIGxyCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgIExETSRjYy5GRCBzcCEsIHskX1JSZWdMaXN0LCBwY30KKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORCAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRWFybHkgRnVuY3Rpb24gRXhpdCBNYWNybworICAgICAgICA7Ly8gJGNjID0gY29uZGl0aW9uIHRvIGV4aXQgd2l0aAorICAgICAgICA7Ly8gKEV4YW1wbGU6IE1fRVhJVCBFUSkKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9FWElUICAkY2MKKyAgICAgICAgQVNTRVJUICBfSW5GdW5jCisgICAgICAgIElGICBfU0J5dGVzIT0wCisgICAgICAgICAgICA7Ly8gUmVzdG9yZSBzdGFjayBmcmFtZSBhbmQgZXhpdAorICAgICAgICAgICAgQiRjYyAgX0VuZCRfRgorICAgICAgICBFTFNFCisgICAgICAgICAgICA7Ly8gQ2FuIHJldHVybiBkaXJlY3RseQorICAgICAgICAgICAgX01fUkVUICRjYworICAgICAgICBFTkRJRiAgICAgICAgCisgICAgICAgIE1FTkQgICAgICAgIAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBGb290ZXIgTWFjcm8gICAgICAgIAorICAgICAgICA7Ly8gR2VuZXJhdGVzIHRoZSBmdW5jdGlvbiBlcGlsb2d1ZQorICAgICAgICBNQUNSTworICAgICAgICBNX0VORAorICAgICAgICBBU1NFUlQgX0luRnVuYworX0luRnVuYyBTRVRMIHtGQUxTRX0KK19FbmQkX0YKKworICAgICAgICA7Ly8gUmVzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciB0byBpdHMgb3JpZ2luYWwgdmFsdWUgb24gZnVuY3Rpb24gZW50cnkKKyAgICAgICAgSUYgX1NCeXRlcyE9MAorICAgICAgICAgICAgX01fT1BDIEFERCwgc3AsIHNwLCBfU0J5dGVzCisgICAgICAgIEVORElGCisgICAgICAgIF9NX1JFVAorICAgICAgICBFTkRGVU5DCisKKyAgICAgICAgOy8vIFJlc2V0IHRoZSBnbG9iYWwgc3RhY2sgdHJhY2tpbmcgdmFyaWFibGVzIGJhY2sgdG8gdGhlaXIgCisgICAgICAgIDsvLyBpbml0aWFsIHZhbHVlcywgYW5kIGluY3JlbWVudCB0aGUgZnVuY3Rpb24gY291bnQKK19TQnl0ZXMgICAgICAgIFNFVEEgMAorX0YgICAgICAgICAgICAgU0VUQSBfRisxCisgICAgICAgIE1FTkQKKworICAgICAgICAgICAgICAgIAorOy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzsvLyBEZWJ1ZyBNYWNyb3MKKzsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgR0JMTCAgICBERUJVR19PTgorREVCVUdfT04gU0VUTCAgIHtGQUxTRX0KKyAgICAgICAgR0JMTCAgICBERUJVR19TVEFMTFNfT04KK0RFQlVHX1NUQUxMU19PTiBTRVRMIHtGQUxTRX0KKyAgICAgICAgCisgICAgICAgIDsvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIDsvLyBEZWJ1ZyBjYWxsIHRvIHByaW50ZgorICAgICAgICA7Ly8gIE1fUFJJTlRGICRmb3JtYXQsICR2YWwwLCAkdmFsMSwgJHZhbDIKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBFeGFtcGxlczoKKyAgICAgICAgOy8vICBNX1BSSU5URiAieD0lMDh4XG4iLCByMAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIFRoaXMgbWFjcm8gcHJlc2VydmVzIHRoZSB2YWx1ZSBvZiBhbGwgcmVnaXN0ZXJzIGluY2x1ZGluZyB0aGUKKyAgICAgICAgOy8vIGZsYWdzLgorICAgICAgICA7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIE1fUFJJTlRGICAkZm9ybWF0LCAkdmFsMCwgJHZhbDEsICR2YWwyCisgICAgICAgIElGIERFQlVHX09OCisgICAgICAgIAorICAgICAgICBJTVBPUlQgIHByaW50ZgorICAgICAgICBMQ0xBICAgIG5BcmdzCituQXJncwlTRVRBICAgIDAKKyAgICAgICAgCisgICAgICAgIDsvLyBzYXZlIHJlZ2lzdGVycyBzbyB3ZSBkb24ndCBjb3JydXB0IHRoZW0KKyAgICAgICAgU1RNRkQgICBzcCEsIHtyMC1yMTIsIGxyfQorICAgICAgICAKKyAgICAgICAgOy8vIERyb3Agc3RhY2sgdG8gZ2l2ZSB1cyBzb21lIHdvcmtzcGFjZQorICAgICAgICBTVUIgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgd2UgbmVlZCB0byBwcmludCB0byB0aGUgc3RhY2sKKyAgICAgICAgSUYgIiR2YWwyIiA8PiAiIgorICAgICAgICAgICAgQVNTRVJUICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMiwgW3NwLCAjOF0KK25BcmdzICAgICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIElGICIkdmFsMSIgPD4gIiIKKyAgICAgICAgICAgIEFTU0VSVCAiJHZhbDAiIDw+ICIiCisgICAgICAgICAgICBTVFIgICAgJHZhbDEsIFtzcCwgIzRdCituQXJncwkgICAgU0VUQSAgIG5BcmdzKzEKKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgIiR2YWwwIjw+IiIKKyAgICAgICAgICAgIFNUUiAgICAkdmFsMCwgW3NwXQorbkFyZ3MJICAgIFNFVEEgICBuQXJncysxCisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gTm93IHdlIGFyZSBzYWZlIHRvIGNvcnJ1cHQgcmVnaXN0ZXJzCisgICAgICAgIEFEUiAgICAgcjAsICVGVDAwCisgICAgICAgIElGIG5BcmdzPTEKKyAgICAgICAgICBMRFIgICByMSwgW3NwXQorICAgICAgICBFTkRJRgorICAgICAgICBJRiBuQXJncz0yCisgICAgICAgICAgTERNSUEgc3AsIHtyMSxyMn0KKyAgICAgICAgRU5ESUYKKyAgICAgICAgSUYgbkFyZ3M9MworICAgICAgICAgIExETUlBIHNwLCB7cjEscjIscjN9CisgICAgICAgIEVORElGCisgICAgICAgIAorICAgICAgICA7Ly8gcHJpbnQgdGhlIHZhbHVlcworICAgICAgICBNUlMgICAgIHI0LCBjcHNyICAgICAgICA7Ly8gcHJlc2VydmUgZmxhZ3MKKyAgICAgICAgQkwgICAgICBwcmludGYKKyAgICAgICAgTVNSICAgICBjcHNyX2YsIHI0ICAgICAgOy8vIHJlc3RvcmUgZmxhZ3MKKyAgICAgICAgQiAgICAgICAlRlQwMQorMDAgICAgICA7Ly8gc3RyaW5nIHRvIHByaW50CisgICAgICAgIERDQiAgICAgIiRmb3JtYXQiLCAwCisgICAgICAgIEFMSUdOCiswMSAgICAgIDsvLyBGaW5pc2hlZAorICAgICAgICBBREQgICAgIHNwLCBzcCwgIzE2CisgICAgICAgIDsvLyBSZXN0b3JlIHJlZ2lzdGVycworICAgICAgICBMRE1GRAlzcCEsIHtyMC1yMTIsbHJ9CisKKyAgICAgICAgRU5ESUYgICA7Ly8gREVCVUdfT04KKyAgICAgICAgTUVORAorCisKKyAgICAgICAgOy8vIFN0YWxsIFNpbXVsYXRpb24gTWFjcm8KKyAgICAgICAgOy8vIEluc2VydHMgYSBnaXZlbiBudW1iZXIgb2YgTk9QcyBmb3IgdGhlIGN1cnJlbnRseQorICAgICAgICA7Ly8gIGRlZmluZWQgcGxhdGZvcm0KKyAgICAgICAgTUFDUk8KKyAgICAgICAgTV9TVEFMTCAkcGxhdDFzdGFsbCwgJHBsYXQyc3RhbGwsICRwbGF0M3N0YWxsLCAkcGxhdDRzdGFsbCwgJHBsYXQ1c3RhbGwsICRwbGF0NnN0YWxsCisgICAgICAgIElGIERFQlVHX1NUQUxMU19PTgorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0MnN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0M3N0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NHN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NXN0YWxsICAgIAorICAgICAgICAgICAgX01fU1RBTExfU1VCICRwbGF0NnN0YWxsICAgIAorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBfTV9TVEFMTF9TVUIgJHBsYXRzdGFsbAorICAgICAgICBJRiAiJHBsYXRzdGFsbCIhPSIiCisgICAgICAgICAgICBMQ0xBIF9wbGxlbgorICAgICAgICAgICAgTENMUyBfcGwKKyAgICAgICAgICAgIExDTEwgX3BsbG9nCitfcGxsZW4gICAgICBTRVRBIDpMRU46IiRwbGF0c3RhbGwiCitfcGwgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpMRUZUOihfcGxsZW4gLSAyKQorICAgICAgICAgICAgSUYgOkRFRjokX3BsCisgICAgICAgICAgICAgICAgSUYgJF9wbAorICAgICAgICAgICAgICAgICAgICBMQ0xTIF9zdAorICAgICAgICAgICAgICAgICAgICBMQ0xBIF9zdG51bQorX3N0ICAgICAgICAgICAgICAgICBTRVRTICIkcGxhdHN0YWxsIjpSSUdIVDoxICAgICAgICAKK19zdG51bSAgICAgICAgICAgICAgU0VUQSAkX3N0CisgICAgICAgICAgICAgICAgICAgIFdISUxFIF9zdG51bT4wCisJCQlNT1Ygc3AsIHNwCitfc3RudW0gICAgICAgICAgICAgICAgICBTRVRBIF9zdG51bSAtIDEKKyAgICAgICAgICAgICAgICAgICAgV0VORAorICAgICAgICAgICAgICAgIEVORElGCisgICAgICAgICAgICBFTkRJRgorICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOy8vIEVuZGlhbiBJbnZhcmllbmNlIE1hY3JvcworOy8vIAorOy8vIFRoZSBpZGVhIGJlaGluZCB0aGVzZSBtYWNyb3MgaXMgdGhhdCBpZiBhbiBhcnJheSBpcworOy8vIGxvYWRlZCBhcyB3b3JkcyB0aGVuIHRoZSBTTVVMMDAgbWFjcm8gd2lsbCBtdWx0aXBseQorOy8vIGFycmF5IGVsZW1lbnRzIDAgcmVnYXJkbGVzcyBvZiB0aGUgZW5kaWFuZXNzIG9mIHRoZQorOy8vIHN5c3RlbS4gRm9yIGxpdHRsZSBlbmRpYW4gU01VTDAwPVNNVUxCQiwgZm9yIGJpZworOy8vIGVuZGlhbiBTTVVMMDA9U01VTFRUIGFuZCBzaW1pbGFybHkgZm9yIG90aGVyIHBhY2tlZCBvcGVyYXRpb25zLgorOy8vCis7Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgICAgIE1BQ1JPCisgICAgICAgIExJQkk0ICAgJGNvbWxpLCAkY29tYmksICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgSUYge0VORElBTn09ImJpZyIKKyAgICAgICAgJGNvbWJpLiRjYyAkYSwgJGIsICRjLCAkZAorICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYywgJGQKKyAgICAgICAgRU5ESUYKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgTElCSTMgICAkY29tbGksICRjb21iaSwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIElGIHtFTkRJQU59PSJiaWciCisgICAgICAgICRjb21iaS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTFNFCisgICAgICAgICRjb21saS4kY2MgJGEsICRiLCAkYworICAgICAgICBFTkRJRgorICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICA7Ly8gU01MQXh5IG1hY3JvcworICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTAwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCQiwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEEwMSAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBQlQsIFNNTEFUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMEIgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTBUICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQVRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQTFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFUQiwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEExVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVFQsIFNNTEFCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUJCLCBTTUxBQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFCVCwgU01MQUJCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBVEIsIFNNTEFUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVRULCBTTUxBVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgOy8vIFNNVUx4eSBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwMCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCQiwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDAxICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTEJULCBTTVVMVEIsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMEIgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwwVCAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTFRULCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDEwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMMTEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxCQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUwxQiAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxUQiwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTDFUICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRULCBTTVVMQlQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMQjAgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMQkIsIFNNVUxCVCwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNVUxCMSAgJGEsICRiLCAkYywgJGNjCisgICAgICAgIExJQkkzIFNNVUxCVCwgU01VTEJCLCAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFQwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFRCLCBTTVVMVFQsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVDEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMVFQsIFNNVUxUQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIDsvLyBTTUxBV3gsIFNNVUxXeCBtYWNyb3MKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFXMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBV0IsIFNNTEFXVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBVzEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQVdULCBTTUxBV0IsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01VTFcwICAkYSwgJGIsICRjLCAkY2MKKyAgICAgICAgTElCSTMgU01VTFdCLCBTTVVMV1QsICRhLCAkYiwgJGMsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTVVMVzEgICRhLCAkYiwgJGMsICRjYworICAgICAgICBMSUJJMyBTTVVMV1QsIFNNVUxXQiwgJGEsICRiLCAkYywgJGNjCisgICAgICAgIE1FTkQKKworICAgICAgICA7Ly8gU01MQUx4eSBtYWNyb3MKKworCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMDAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDAxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMVEIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwwQiAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTEJCLCBTTUxBTFRCLCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMFQgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCVCwgU01MQUxUVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDEwICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQlQsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMMTEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxCQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTDFCICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMVEIsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUwxVCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRULCBTTUxBTEJULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMQjAgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxCQiwgU01MQUxCVCwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICAgICAgICBNQUNSTworICAgICAgICBTTUxBTEIxICAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIExJQkk0IFNNTEFMQlQsIFNNTEFMQkIsICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTUVORAorICAgICAgICAKKyAgICAgICAgTUFDUk8KKyAgICAgICAgU01MQUxUMCAgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBMSUJJNCBTTUxBTFRCLCBTTUxBTFRULCAkYSwgJGIsICRjLCAkZCwgJGNjCisgICAgICAgIE1FTkQKKyAgICAgICAgCisgICAgICAgIE1BQ1JPCisgICAgICAgIFNNTEFMVDEgICRhLCAkYiwgJGMsICRkLCAkY2MKKyAgICAgICAgTElCSTQgU01MQUxUVCwgU01MQUxUQiwgJGEsICRiLCAkYywgJGQsICRjYworICAgICAgICBNRU5ECisgICAgICAgIAorICBFTkRJRiA7Ly8gQVJNQ09NTV9TX0gKKyAgICAgICAgICAgIAorICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvYXJtT01YLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhNjhkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL2FybU9NWC5oCkBAIC0wLDAgKzEsMjc0IEBACisvKiAKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtT01YX1JlbGVhc2VWZXJzaW9uLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogVGhpcyBmaWxlIGFsbG93cyBhIHZlcnNpb24gb2YgdGhlIE9NWCBETCBsaWJyYXJpZXMgdG8gYmUgYnVpbHQgd2hlcmUgc29tZSBvcgorICogYWxsIG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBjYW4gYmUgZ2l2ZW4gYSB1c2VyIHNwZWNpZmllZCBzdWZmaXguIAorICoKKyAqIFlvdSBtaWdodCB3YW50IHRvIHVzZSBpdCB3aGVyZToKKyAqCisgKiAtIHlvdSB3YW50IHRvIHJlbmFtZSBhIGZ1bmN0aW9uICJvdXQgb2YgdGhlIHdheSIgc28gdGhhdCB5b3UgY291bGQgcmVwbGFjZQorICogICBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbiAodGhlIG9yaWdpbmFsIHZlcnNpb24gd291bGQgc3RpbGwgYmUKKyAqICAgaW4gdGhlIGxpYnJhcnkganVzdCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgLSBzbyB5b3UgY291bGQgZGVidWcgdGhlIG5ldworICogICB2ZXJzaW9uIGJ5IGNvbXBhcmluZyBpdCB0byB0aGUgb3V0cHV0IG9mIHRoZSBvbGQpCisgKgorICogLSB5b3Ugd2FudCB0byByZW5hbWUgYWxsIHRoZSBmdW5jdGlvbnMgdG8gdmVyc2lvbnMgd2l0aCBhIHN1ZmZpeCBzbyB0aGF0IAorICogICB5b3UgY2FuIGluY2x1ZGUgdHdvIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGFuZCBjaG9vc2UgYmV0d2VlbiBmdW5jdGlvbnMKKyAqICAgYXQgcnVudGltZS4KKyAqCisgKiAgICAgZS5nLiBvbXhJUEJNX0NvcHlfVThfQzFSIGNvdWxkIGJlIHJlbmFtZWQgb214SVBCTV9Db3B5X1U4X0MxUl9Db3J0ZXhBOAorICogCisgKi8KKworICAKKyNpZm5kZWYgX2FybU9NWF9IXworI2RlZmluZSBfYXJtT01YX0hfCisKKworLyogV2UgbmVlZCB0byBkZWZpbmUgdGhlc2UgdHdvIG1hY3JvcyBpbiBvcmRlciB0byBleHBhbmQgYW5kIGNvbmNhdGVuYXRlIHRoZSBuYW1lcyAqLworI2RlZmluZSBPTVhDQVQyQkFSKEEsIEIpIG9teCAjIyBBICMjIEIKKyNkZWZpbmUgT01YQ0FUQkFSKEEsIEIpIE9NWENBVDJCQVIoQSwgQikKKworLyogRGVmaW5lIHRoZSBzdWZmaXggdG8gYWRkIHRvIGFsbCBmdW5jdGlvbnMgLSB0aGUgZGVmYXVsdCBpcyBubyBzdWZmaXggKi8KKyNkZWZpbmUgQkFSRV9TVUZGSVggCisKKworCisvKiBEZWZpbmUgd2hhdCBoYXBwZW5zIHRvIHRoZSBiYXJlIHN1ZmZpeC1sZXNzIGZ1bmN0aW9ucywgZG93biB0byB0aGUgc3ViLWRvbWFpbiBhY2N1cmFjeSAqLworI2RlZmluZSBPTVhBQ0FBQ19TVUZGSVggICAgQkFSRV9TVUZGSVggICAKKyNkZWZpbmUgT01YQUNNUDNfU1VGRklYICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElDSlBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhJUEJNX1NVRkZJWCAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YSVBDU19TVUZGSVggICAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWElQUFBfU1VGRklYICAgICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhTUF9TVUZGSVggICAgICAgQkFSRV9TVUZGSVgKKyNkZWZpbmUgT01YVkNDT01NX1NVRkZJWCAgIEJBUkVfU1VGRklYCisjZGVmaW5lIE9NWFZDTTRQMTBfU1VGRklYICBCQVJFX1NVRkZJWAorI2RlZmluZSBPTVhWQ000UDJfU1VGRklYICAgQkFSRV9TVUZGSVgKKworCisKKworLyogRGVmaW5lIHdoYXQgdGhlIGVhY2ggYmFyZSwgdW4tc3VmZml4ZWQgT3Blbk1BWCBBUEkgZnVuY3Rpb24gbmFtZXMgaXMgdG8gYmUgcmVuYW1lZCAqLworI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVDaGFuUGFpckVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVEYXRTdHJFbHQgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVEYXRTdHJFbHQsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlRmlsbEVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlRmlsbEVsdCwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWNvZGVJc1N0ZXJlb19TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNQTlNfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNQTlNfUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0kgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlTXNTdGVyZW9fUzMyX0ksIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRGVjb2RlUHJnQ2ZnRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRGVjb2RlUHJnQ2ZnRWx0LCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0RlY29kZVROU19TMzJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0RlY29kZVROU19TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19EZWludGVybGVhdmVTcGVjdHJ1bV9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfRW5jb2RlVE5TX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfRW5jb2RlVE5TX1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX0xvbmdUZXJtUHJlZGljdF9TMzIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTG9uZ1Rlcm1SZWNvbnN0cnVjdF9TMzJfSSwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENURndkX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENURndkX1MzMiwgT01YQUNBQUNfU1VGRklYKQorI2RlZmluZSBvbXhBQ0FBQ19NRENUSW52X1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ0FBQ19NRENUSW52X1MzMl9TMTYsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfTm9pc2VsZXNzRGVjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfTm9pc2VsZXNzRGVjb2RlLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1F1YW50SW52X1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1F1YW50SW52X1MzMl9JLCBPTVhBQ0FBQ19TVUZGSVgpCisjZGVmaW5lIG9teEFDQUFDX1VucGFja0FESUZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDQUFDX1VucGFja0FESUZIZWFkZXIsIE9NWEFDQUFDX1NVRkZJWCkKKyNkZWZpbmUgb214QUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNBQUNfVW5wYWNrQURUU0ZyYW1lSGVhZGVyLCBPTVhBQ0FBQ19TVUZGSVgpCisKKworI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19IdWZmbWFuRGVjb2RlU2ZiTWJwX1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19NRENUSW52X1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19NRENUSW52X1MzMiwgT01YQUNNUDNfU1VGRklYKQorI2RlZmluZSBvbXhBQ01QM19SZVF1YW50aXplX1MzMl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihBQ01QM19SZVF1YW50aXplX1MzMl9JLCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1JlUXVhbnRpemVTZmJfUzMyX0ksIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfU3ludGhQUU1GX1MzMl9TMTYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfU3ludGhQUU1GX1MzMl9TMTYsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrRnJhbWVIZWFkZXIsIE9NWEFDTVAzX1NVRkZJWCkKKyNkZWZpbmUgb214QUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4ICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoQUNNUDNfVW5wYWNrU2NhbGVGYWN0b3JzX1M4LCBPTVhBQ01QM19TVUZGSVgpCisjZGVmaW5lIG9teEFDTVAzX1VucGFja1NpZGVJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKEFDTVAzX1VucGFja1NpZGVJbmZvLCBPTVhBQ01QM19TVUZGSVgpCisKKyNkZWZpbmUgb214SUNKUF9Db3B5RXhwYW5kX1U4X0MzICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9Db3B5RXhwYW5kX1U4X0MzLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RGd2RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RGd2RfUzE2X0ksIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVEludl9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVEludl9TMTZfSSwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRGd2RfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZF9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50RndkX1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50RndkX1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEZ3ZFRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRENUUXVhbnRJbnZfTXVsdGlwbGVfUzE2LCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludl9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludl9TMTYsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RDVFF1YW50SW52X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RDVFF1YW50SW52X1MxNl9JLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EQ1RRdWFudEludlRhYmxlSW5pdCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxICAgICAgICAgICAgT01YQ0FUQkFSKElDSlBfRGVjb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9EZWNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0RlY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisjZGVmaW5lIG9teElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxICAgICAgICAgT01YQ0FUQkFSKElDSlBfRW5jb2RlSHVmZm1hbjh4OF9EaXJlY3RfUzE2X1UxX0MxLCBPTVhJQ0pQX1NVRkZJWCkKKyNkZWZpbmUgb214SUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTggICAgICAgICAgICBPTVhDQVRCQVIoSUNKUF9FbmNvZGVIdWZmbWFuU3BlY0dldEJ1ZlNpemVfVTgsIE9NWElDSlBfU1VGRklYKQorI2RlZmluZSBvbXhJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJQ0pQX0VuY29kZUh1ZmZtYW5TcGVjSW5pdF9VOCwgT01YSUNKUF9TVUZGSVgpCisKKyNkZWZpbmUgb214SVBCTV9BZGRDX1U4X0MxUl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9BZGRDX1U4X0MxUl9TZnMsIE9NWElQQk1fU1VGRklYKQorI2RlZmluZSBvbXhJUEJNX0NvcHlfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUEJNX0NvcHlfVThfQzFSLCBPTVhJUEJNX1NVRkZJWCkKKyNkZWZpbmUgb214SVBCTV9Db3B5X1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBCTV9Db3B5X1U4X0MzUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTWlycm9yX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTWlycm9yX1U4X0MxUiwgT01YSVBCTV9TVUZGSVgpCisjZGVmaW5lIG9teElQQk1fTXVsQ19VOF9DMVJfU2ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQk1fTXVsQ19VOF9DMVJfU2ZzLCBPTVhJUEJNX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX0NvbG9yVHdpc3RRMTRfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IgICAgICBPTVhDQVRCQVIoSVBDU19CR1I1NjVUb1lDYkNyNDIwTFNfTUNVX1UxNl9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiAgICAgIE9NWENBVEJBUihJUENTX0JHUjU2NVRvWUNiQ3I0MjJMU19NQ1VfVTE2X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSNTY1VG9ZQ2JDcjQ0NExTX01DVV9VMTZfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiAgICAgICBPTVhDQVRCQVIoSVBDU19CR1I4ODhUb1lDYkNyNDIwTFNfTUNVX1U4X1MxNl9DM1AzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfQkdSODg4VG9ZQ2JDcjQyMkxTX01DVV9VOF9TMTZfQzNQM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSICAgICAgIE9NWENBVEJBUihJUENTX0JHUjg4OFRvWUNiQ3I0NDRMU19NQ1VfVThfUzE2X0MzUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFJzekNzY1JvdEJHUl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBSc3pSb3RfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSNTY1X1U4X1UxNl9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjBUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMFRvQkdSODg4TFNfTUNVX1MxNl9VOF9QM0MzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IgICAgICAgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJSc3pDc2NSb3RCR1JfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSICAgICAgICAgIE9NWENBVEJBUihJUENTX0NiWUNyWTQyMlJzekNzY1JvdEJHUl9VOF9VMTZfQzJSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlJzelJvdF9VOF9QM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYllDcjQyMlRvQkdSNTY1X1U4X1UxNl9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjU2NUxTX01DVV9TMTZfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JZQ3I0MjJUb0JHUjg4OF9VOF9DMkMzUiwgT01YSVBDU19TVUZGSVgpCisjZGVmaW5lIG9teElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IgICAgICAgT01YQ0FUQkFSKElQQ1NfWUNiQ3I0MjJUb0JHUjg4OExTX01DVV9TMTZfVThfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDIyVG9CR1I4ODhMU19NQ1VfUzE2X1U4X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSICAgICAgICBPTVhDQVRCQVIoSVBDU19DYllDclk0MjJUb1lDYkNyNDIwUm90YXRlX1U4X0MyUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQyMlRvWUNiQ3I0MjBSb3RhdGVfVThfUDNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1X1U4X1UxNl9DM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I1NjVfVThfVTE2X1AzQzNSLCBPTVhJUENTX1NVRkZJWCkKKyNkZWZpbmUgb214SVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IgICAgICBPTVhDQVRCQVIoSVBDU19ZQ2JDcjQ0NFRvQkdSNTY1TFNfTUNVX1MxNl9VMTZfUDNDM1IsIE9NWElQQ1NfU1VGRklYKQorI2RlZmluZSBvbXhJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUENTX1lDYkNyNDQ0VG9CR1I4ODhfVThfQzNSLCBPTVhJUENTX1NVRkZJWCkKKworI2RlZmluZSBvbXhJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0RlYmxvY2tfSG9yRWRnZV9VOF9JLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9EZWJsb2NrX1ZlckVkZ2VfVThfSSwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyRklSX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyRklSX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfRmlsdGVyTWVkaWFuX1U4X0MxUiwgT01YSVBQUF9TVUZGSVgpCisjZGVmaW5lIG9teElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKElQUFBfR2V0Q2VudHJhbE1vbWVudF9TNjQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0ICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX0dldFNwYXRpYWxNb21lbnRfUzY0LCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRHZXRTdGF0ZVNpemUsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudEluaXQsIE9NWElQUFBfU1VGRklYKQorI2RlZmluZSBvbXhJUFBQX01vbWVudHNfVThfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihJUFBQX01vbWVudHNfVThfQzFSLCBPTVhJUFBQX1NVRkZJWCkKKyNkZWZpbmUgb214SVBQUF9Nb21lbnRzX1U4X0MzUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoSVBQUF9Nb21lbnRzX1U4X0MzUiwgT01YSVBQUF9TVUZGSVgpCisKKyNkZWZpbmUgb214U1BfQmxvY2tFeHBfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfQmxvY2tFeHBfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0Jsb2NrRXhwX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0Jsb2NrRXhwX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Db3B5X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Db3B5X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9Eb3RQcm9kX1MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9Eb3RQcm9kX1MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZURndkX1JUb0NDU19TMTZTMzJfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEZ3ZF9SVG9DQ1NfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX0NfU0MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRHZXRCdWZTaXplX1JfUzE2UzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEdldEJ1ZlNpemVfUl9TMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9DX1NDMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9DX1NDMzIsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW5pdF9SX1MxNlMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW5pdF9SX1MxNlMzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbml0X1JfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbml0X1JfUzMyLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcyAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZGVEludl9DQ1NUb1JfUzMyX1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GRlRJbnZfQ0NTVG9SX1MzMlMxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MxNl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MxNl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRkZUSW52X0NUb0NfU0MzMl9TZnMgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRkZUSW52X0NUb0NfU0MzMl9TZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRmlsdGVyTWVkaWFuX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRmlsdGVyTWVkaWFuX1MzMiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GaWx0ZXJNZWRpYW5fUzMyX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GaWx0ZXJNZWRpYW5fUzMyX0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJfRGlyZWN0X1MxNl9JU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUl9EaXJlY3RfUzE2X1NmcyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUl9EaXJlY3RfUzE2X1NmcywgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9GSVJPbmVfRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9GSVJPbmVfRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0ZJUk9uZV9EaXJlY3RfUzE2X0lTZnMsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfRklST25lX0RpcmVjdF9TMTZfU2ZzICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfRklST25lX0RpcmVjdF9TMTZfU2ZzLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUl9CaVF1YWREaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTYsIE9NWFNQX1NVRkZJWCkKKyNkZWZpbmUgb214U1BfSUlSX0RpcmVjdF9TMTZfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoU1BfSUlSX0RpcmVjdF9TMTZfSSwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNiwgT01YU1BfU1VGRklYKQorI2RlZmluZSBvbXhTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihTUF9JSVJPbmVfQmlRdWFkRGlyZWN0X1MxNl9JLCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2LCBPTVhTUF9TVUZGSVgpCisjZGVmaW5lIG9teFNQX0lJUk9uZV9EaXJlY3RfUzE2X0kgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFNQX0lJUk9uZV9EaXJlY3RfUzE2X0ksIE9NWFNQX1NVRkZJWCkKKworI2RlZmluZSBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQXZlcmFnZV8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9BdmVyYWdlXzh4LCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHkxNngxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHkxNngxNiwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX0NvcHk4eDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX0NvcHk4eDgsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9FeHBhbmRGcmFtZV9JLCBPTVhWQ0NPTU1fU1VGRklYKQorI2RlZmluZSBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ0NPTU1fTGltaXRNVlRvUmVjdCwgT01YVkNDT01NX1NVRkZJWCkKKyNkZWZpbmUgb214VkNDT01NX1NBRF8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNDT01NX1NBRF8xNngsIE9NWFZDQ09NTV9TVUZGSVgpCisjZGVmaW5lIG9teFZDQ09NTV9TQURfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDQ09NTV9TQURfOHgsIE9NWFZDQ09NTV9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAxMF9BdmVyYWdlXzR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9BdmVyYWdlXzR4LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9CbG9ja01hdGNoX0hhbGYsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9EZWJsb2NrQ2hyb21hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlYmxvY2tMdW1hX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCBPTVhDQVRCQVIoVkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0ksIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfR2V0VkxDSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfR2V0VkxDSW5mbywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0Nocm9tYURDLCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfSW52VHJhbnNmb3JtUmVzaWR1YWxBbmRBZGQsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfTUVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfTUVJbml0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9Nb3Rpb25Fc3RpbWF0aW9uTUIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRF80eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRF80eCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfU0FEUXVhcl8xNngsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfNHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfNHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBRFF1YXJfOHgsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1NBVERfNHg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1NBVERfNHg0LCBPTVhWQ000UDEwX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciwgT01YVkNNNFAxMF9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMsIE9NWFZDTTRQMTBfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQywgT01YVkNNNFAxMF9TVUZGSVgpCisKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDgsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4ICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXJfOHg4LCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRENUOHg4YmxrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRENUOHg4YmxrLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlUGFkTVZfUFZPUCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9FbmNvZGVNViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9FbmNvZGVNViwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRlciwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIE9NWFZDTTRQMl9TVUZGSVgpCisjZGVmaW5lIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YQ0FUQkFSKFZDTTRQMl9GaW5kTVZwcmVkLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfSURDVDh4OGJsayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfSURDVDh4OGJsaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01DUmVjb25CbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01DUmVjb25CbG9jaywgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FR2V0QnVmU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FR2V0QnVmU2l6ZSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01FSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01FSW5pdCwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX01vdGlvbkVzdGltYXRpb25NQiwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50ZXJfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50ZXJfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1F1YW50SW52SW50cmFfSSAgICAgICAgICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1F1YW50SW52SW50cmFfSSwgT01YVkNNNFAyX1NVRkZJWCkKKyNkZWZpbmUgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICAgICAgICAgICAgICAgICBPTVhDQVRCQVIoVkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyLCBPTVhWQ000UDJfU1VGRklYKQorI2RlZmluZSBvbXhWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEgICAgICAgICAgICAgICAgIE9NWENBVEJBUihWQ000UDJfVHJhbnNSZWNCbG9ja0NvZWZfaW50cmEsIE9NWFZDTTRQMl9TVUZGSVgpCisKKworI2VuZGlmIC8qIF9hcm1PTVhfaF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9hcGkvb214dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjI5NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlcy5oCkBAIC0wLDAgKzEsMjUyIEBACisvKioKKyAqIEZpbGU6IG9teHR5cGVzLmgKKyAqIEJyaWVmOiBEZWZpbmVzIGJhc2ljIERhdGEgdHlwZXMgdXNlZCBpbiBPcGVuTUFYIHYxLjAuMiBoZWFkZXIgZmlsZXMuCisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworICAKKyNpZm5kZWYgX09NWFRZUEVTX0hfCisjZGVmaW5lIF9PTVhUWVBFU19IXworCisjaW5jbHVkZSA8bGltaXRzLmg+IAorCisjZGVmaW5lIE9NWF9JTgorI2RlZmluZSBPTVhfT1VUCisjZGVmaW5lIE9NWF9JTk9VVAorCisKK3R5cGVkZWYgZW51bSB7CisgICAgCisgICAgLyogTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gKi8KKyAgICBPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICA9ICAwLCAgICAvKiBObyBlcnJvciwgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBPTVhfU3RzX0VyciAgICAgICAgICAgICAgICAgICAgICA9IC0yLCAgICAvKiBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICovICAgIAorICAgIE9NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgID0gLTE4MiwgIC8qIEludmFsaWQgdmFsdWUgZGV0ZWN0ZWQgZHVyaW5nIGJpdHN0cmVhbSBwcm9jZXNzaW5nICovICAgIAorICAgIE9NWF9TdHNfTWVtQWxsb2NFcnIgICAgICAgICAgICAgID0gLTksICAgIC8qIE5vdCBlbm91Z2ggbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIE9NWF9TdHNBQ0FBQ19HYWluQ3RyRXJyICAgIAkgICAgID0gLTE1OSwgIC8qIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgKi8KKyAgICBPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICA9IC0xNjcsICAvKiBBQUM6IEludmFsaWQgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciBvbmUgcHJvZ3JhbSAgICovCisgICAgT01YX1N0c0FDQUFDX0NvZWZWYWxFcnIgICAgICAgICAgPSAtMTYzLCAgLyogQUFDOiBJbnZhbGlkIHF1YW50aXplZCBjb2VmZmljaWVudCB2YWx1ZSAgICAgICAgICAqLyAgICAgCisgICAgT01YX1N0c0FDQUFDX01heFNmYkVyciAgICAgICAgICAgPSAtMTYyLCAgLyogQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgKi8gICAgCisJT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgPSAtMTYwLCAgLyogQUFDOiBwdWxzZSBlc2NhcGUgc2VxdWVuY2UgZGF0YSBlcnJvciAqLworCisgICAgLyogT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbiovCisgICAgT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgPSAtNSwgICAgLyogQmFkIEFyZ3VtZW50cyAqLworCisgICAgT01YX1N0c0FDQUFDX1Ruc051bUZpbHRFcnIgICAgICAgPSAtMTU3LCAgLyogQUFDOiBJbnZhbGlkIG51bWJlciBvZiBUTlMgZmlsdGVycyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zTGVuRXJyICAgICAgICAgICA9IC0xNTYsICAvKiBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICovICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgPSAtMTU1LCAgLyogQUFDOiBJbnZhbGlkIG9yZGVyIG9mIFROUyBmaWx0ZXIgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0NvZWZSZXNFcnIgICAgICAgPSAtMTU0LCAgLyogQUFDOiBJbnZhbGlkIGJpdC1yZXNvbHV0aW9uIGZvciBUTlMgZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8KKyAgICBPTVhfU3RzQUNBQUNfVG5zQ29lZkVyciAgICAgICAgICA9IC0xNTMsICAvKiBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICovICAgICAgICAgICAgICAgICAgCisgICAgT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgPSAtMTUyLCAgLyogQUFDOiBJbnZhbGlkIFROUyBmaWx0ZXIgZGlyZWN0aW9uICAqLyAgCisKKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyRXJyICAgICAgICA9IC0xODMsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZCB3aXRoaW4gYW4gZW50cm9weS1jb2RlZCBibG9jazsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIdWZmbWFuIGRlY29kaW5nIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgKi8KKyAgICBPTVhfU3RzSUNKUF9KUEVHTWFya2VyICAgICAgICAgICA9IC0xODEsICAvKiBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgID0gLTE3LCAgIC8qIENvbnRleHQgcGFyYW1ldGVyIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIG9wZXJhdGlvbiAqLworCisgICAgT01YX1N0c1NQX0V2ZW5NZWRpYW5NYXNrU2l6ZUVyciAgPSAtMTgwLCAgLyogRXZlbiBzaXplIG9mIHRoZSBNZWRpYW4gRmlsdGVyIG1hc2sgd2FzIHJlcGxhY2VkIGJ5IHRoZSBvZGQgb25lICovCisKKyAgICBPTVhfU3RzX01heGltdW1FbnVtZXJhdGlvbiAgICAgICA9IElOVF9NQVggIC8qUGxhY2Vob2xkZXIsIGZvcmNlcyBlbnVtIG9mIHNpemUgT01YX0lOVCovCisgICAgCisgfSBPTVhSZXN1bHQ7ICAgICAgICAgIC8qKiBSZXR1cm4gdmFsdWUgb3IgZXJyb3IgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uLiBJZGVudGljYWwgdG8gT01YX0lOVCAqLworCisgCisvKiBPTVhfVTggKi8KKyNpZiBVQ0hBUl9NQVggPT0gMHhmZgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKKyNlbGlmIFVTSFJUX01BWCA9PSAweGZmIAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgT01YX1U4OyAKKyNlbHNlCisjZXJyb3IgT01YX1U4IHVuZGVmaW5lZAorI2VuZGlmIAorCisgCisvKiBPTVhfUzggKi8KKyNpZiBTQ0hBUl9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OworI2VsaWYgU0hSVF9NQVggPT0gMHg3ZiAKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludCBPTVhfUzg7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzggdW5kZWZpbmVkCisjZW5kaWYKKyAKKyAKKy8qIE9NWF9VMTYgKi8KKyNpZiBVU0hSVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBPTVhfVTE2OworI2VsaWYgVUlOVF9NQVggPT0gMHhmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGludCBPTVhfVTE2OyAKKyNlbHNlCisjZXJyb3IgT01YX1UxNiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9TMTYgKi8KKyNpZiBTSFJUX01BWCA9PSAweDdmZmYgCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgT01YX1MxNjsKKyNlbGlmIElOVF9NQVggPT0gMHg3ZmZmIAordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMTY7IAorI2Vsc2UKKyNlcnJvciBPTVhfUzE2IHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1UzMiAqLworI2lmIFVJTlRfTUFYID09IDB4ZmZmZmZmZmYKK3R5cGVkZWYgdW5zaWduZWQgaW50IE9NWF9VMzI7CisjZWxpZiBMT05HX01BWCA9PSAweGZmZmZmZmZmCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IE9NWF9VMzI7IAorI2Vsc2UKKyNlcnJvciBPTVhfVTMyIHVuZGVmaW5lZAorI2VuZGlmCisKKworLyogT01YX1MzMiAqLworI2lmIElOVF9NQVggPT0gMHg3ZmZmZmZmZgordHlwZWRlZiBzaWduZWQgaW50IE9NWF9TMzI7CisjZWxpZiBMT05HX01BWCA9PSAweDdmZmZmZmZmCit0eXBlZGVmIGxvbmcgc2lnbmVkIGludCBPTVhfUzMyOyAKKyNlbHNlCisjZXJyb3IgT01YX1MzMiB1bmRlZmluZWQKKyNlbmRpZgorCisKKy8qIE9NWF9VNjQgJiBPTVhfUzY0ICovCisjaWYgZGVmaW5lZCggX1dJTjMyICkgfHwgZGVmaW5lZCAoIF9XSU42NCApCisgICAgdHlwZWRlZiBfX2ludDY0IE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgT01YX1U2NDsgLyoqIFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgI2RlZmluZSBPTVhfTUlOX1M2NAkJCSgweDgwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUlOX1U2NAkJCSgweDAwMDAwMDAwMDAwMDAwMDBpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZpNjQpCisgICAgI2RlZmluZSBPTVhfTUFYX1U2NAkJCSgweEZGRkZGRkZGRkZGRkZGRkZpNjQpCisjZWxzZQorICAgIHR5cGVkZWYgbG9uZyBsb25nIE9NWF9TNjQ7IC8qKiBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBPTVhfVTY0OyAvKiogVW5zaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICAjZGVmaW5lIE9NWF9NSU5fUzY0CQkJKDB4ODAwMDAwMDAwMDAwMDAwMExMKQorICAgICNkZWZpbmUgT01YX01JTl9VNjQJCQkoMHgwMDAwMDAwMDAwMDAwMDAwTEwpCisgICAgI2RlZmluZSBPTVhfTUFYX1M2NAkJCSgweDdGRkZGRkZGRkZGRkZGRkZMTCkKKyAgICAjZGVmaW5lIE9NWF9NQVhfVTY0CQkJKDB4RkZGRkZGRkZGRkZGRkZGRkxMKQorI2VuZGlmCisKKworLyogT01YX1NDOCAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1M4IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TOCBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0M4OyAvKiogU2lnbmVkIDgtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX1NDMTYgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgIE9NWF9TMTYgUmU7IC8qKiBSZWFsIHBhcnQgKi8KKyAgT01YX1MxNiBJbTsgLyoqIEltYWdpbmFyeSBwYXJ0ICovCQorCQorfSBPTVhfU0MxNjsgLyoqIFNpZ25lZCAxNi1iaXQgY29tcGxleCBudW1iZXIgKi8KKworCisvKiBPTVhfU0MzMiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgT01YX1MzMiBSZTsgLyoqIFJlYWwgcGFydCAqLworICBPTVhfUzMyIEltOyAvKiogSW1hZ2luYXJ5IHBhcnQgKi8JCisJCit9IE9NWF9TQzMyOyAvKiogU2lnbmVkIDMyLWJpdCBjb21wbGV4IG51bWJlciAqLworCisKKy8qIE9NWF9TQzY0ICovCit0eXBlZGVmIHN0cnVjdAoreworICBPTVhfUzY0IFJlOyAvKiogUmVhbCBwYXJ0ICovCisgIE9NWF9TNjQgSW07IC8qKiBJbWFnaW5hcnkgcGFydCAqLwkKKwkKK30gT01YX1NDNjQ7IC8qKiBTaWduZWQgNjQtYml0IGNvbXBsZXggbnVtYmVyICovCisKKworLyogT01YX0YzMiAqLwordHlwZWRlZiBmbG9hdCBPTVhfRjMyOyAvKiogU2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCxJRUVFIDc1NCAqLworCisKKy8qIE9NWF9GNjQgKi8KK3R5cGVkZWYgZG91YmxlIE9NWF9GNjQ7IC8qKiBEb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LElFRUUgNzU0ICovCisKKworLyogT01YX0lOVCAqLwordHlwZWRlZiBpbnQgT01YX0lOVDsgLyoqIHNpZ25lZCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gbWFjaGluZSB3b3JkIGxlbmd0aCwgaGFzIG1heGltdW0gc2lnbmVkIHZhbHVlIElOVF9NQVgqLworCisKKyNkZWZpbmUgT01YX01JTl9TOCAgCSAgIAkoLTEyOCkKKyNkZWZpbmUgT01YX01JTl9VOCAgCQkwCisjZGVmaW5lIE9NWF9NSU5fUzE2CQkgCSgtMzI3NjgpCisjZGVmaW5lIE9NWF9NSU5fVTE2CQkJMAorI2RlZmluZSBPTVhfTUlOX1MzMgkJCSgtMjE0NzQ4MzY0Ny0xKQorI2RlZmluZSBPTVhfTUlOX1UzMgkJCTAKKworI2RlZmluZSBPTVhfTUFYX1M4CQkJKDEyNykKKyNkZWZpbmUgT01YX01BWF9VOAkJCSgyNTUpCisjZGVmaW5lIE9NWF9NQVhfUzE2CQkJKDMyNzY3KQorI2RlZmluZSBPTVhfTUFYX1UxNgkJCSgweEZGRkYpCisjZGVmaW5lIE9NWF9NQVhfUzMyCQkJKDIxNDc0ODM2NDcpCisjZGVmaW5lIE9NWF9NQVhfVTMyCQkJKDB4RkZGRkZGRkYpCisKK3R5cGVkZWYgdm9pZCBPTVhWb2lkOworCisjaWZuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAoKHZvaWQqKTApCisjZW5kaWYKKworLyoqIERlZmluZXMgdGhlIGdlb21ldHJpYyBwb3NpdGlvbiBhbmQgc2l6ZSBvZiBhIHJlY3RhbmdsZSwgCisgICogd2hlcmUgeCx5IGRlZmluZXMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIKKyAgKiBvZiB0aGUgcmVjdGFuZ2xlLCB3aXRoIGRpbWVuc2lvbnMgd2lkdGggaW4gdGhlIHgtZGlyZWN0aW9uIAorICAqIGFuZCBoZWlnaHQgaW4gdGhlIHktZGlyZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisJT01YX0lOVCB4OyAgICAgIC8qKiB4LWNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZSAqLworCU9NWF9JTlQgeTsgICAgICAvKiogeS1jb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUgKi8KKwlPTVhfSU5UIHdpZHRoOyAgLyoqIFdpZHRoIGluIHRoZSB4LWRpcmVjdGlvbi4gKi8KKwlPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBpbiB0aGUgeS1kaXJlY3Rpb24uICovCit9T01YUmVjdDsKKworCisvKiogRGVmaW5lcyB0aGUgZ2VvbWV0cmljIHBvc2l0aW9uIG9mIGEgcG9pbnQsICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKyBPTVhfSU5UIHg7IC8qKiB4LWNvb3JkaW5hdGUgKi8KKyBPTVhfSU5UIHk7CS8qKiB5LWNvb3JkaW5hdGUgKi8KKwkKK30gT01YUG9pbnQ7CisKKworLyoqIERlZmluZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSByZWN0YW5nbGUsIG9yIHJlZ2lvbiBvZiBpbnRlcmVzdCBpbiBhbiBpbWFnZSAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisgT01YX0lOVCB3aWR0aDsgIC8qKiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeC1kaXJlY3Rpb24gKi8KKyBPTVhfSU5UIGhlaWdodDsgLyoqIEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiB0aGUgeS1kaXJlY3Rpb24gKi8KKwkKK30gT01YU2l6ZTsKKworI2VuZGlmIC8qIF9PTVhUWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vYXBpL29teHR5cGVzX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODcwM2QxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2FwaS9vbXh0eXBlc19zLmgKQEAgLTAsMCArMSw3NyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214dHlwZXNfcy5oCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gTWFuZGF0b3J5IHJldHVybiBjb2RlcyAtIHVzZSBjYXNlcyBhcmUgZXhwbGljaXRseSBkZXNjcmliZWQgZm9yIGVhY2ggZnVuY3Rpb24gCitPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICBFUVUgIDAgICAgOy8vIE5vIGVycm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IAorT01YX1N0c19FcnIgICAgICAgICAgICAgICAgICAgICAgRVFVIC0yICAgIDsvLyBVbmtub3duL3Vuc3BlY2lmaWVkIGVycm9yICAgICAKK09NWF9TdHNfSW52YWxpZEJpdHN0cmVhbVZhbEVyciAgIEVRVSAtMTgyICA7Ly8gSW52YWxpZCB2YWx1ZSBkZXRlY3RlZCBkdXJpbmcgYml0c3RyZWFtIHByb2Nlc3NpbmcgICAgIAorT01YX1N0c19NZW1BbGxvY0VyciAgICAgICAgICAgICAgRVFVIC05ICAgIDsvLyBOb3QgZW5vdWdoIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvcGVyYXRpb24gCitPTVhfU3RzQUNBQUNfR2FpbkN0ckVyciAgICAJICAgICBFUVUgLTE1OSAgOy8vIEFBQzogVW5zdXBwb3J0ZWQgZ2FpbiBjb250cm9sIGRhdGEgZGV0ZWN0ZWQgCitPTVhfU3RzQUNBQUNfUHJnTnVtRXJyICAgICAgICAgICBFUVUgLTE2NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgZWxlbWVudHMgZm9yIG9uZSBwcm9ncmFtICAgCitPTVhfU3RzQUNBQUNfQ29lZlZhbEVyciAgICAgICAgICBFUVUgLTE2MyAgOy8vIEFBQzogSW52YWxpZCBxdWFudGl6ZWQgY29lZmZpY2llbnQgdmFsdWUgICAgICAgICAgICAgICAKK09NWF9TdHNBQ0FBQ19NYXhTZmJFcnIgICAgICAgICAgIEVRVSAtMTYyICA7Ly8gQUFDOiBJbnZhbGlkIG1heFNmYiB2YWx1ZSBpbiByZWxhdGlvbiB0byBudW1Td2IgICAgIAorT01YX1N0c0FDQUFDX1Bsc0RhdGFFcnIJCSAgICAgRVFVIC0xNjAgIDsvLyBBQUM6IHB1bHNlIGVzY2FwZSBzZXF1ZW5jZSBkYXRhIGVycm9yIAorCis7Ly8gT3B0aW9uYWwgcmV0dXJuIGNvZGVzIC0gdXNlIGNhc2VzIGFyZSBleHBsaWNpdGx5IGRlc2NyaWJlZCBmb3IgZWFjaCBmdW5jdGlvbgorT01YX1N0c19CYWRBcmdFcnIgICAgICAgICAgICAgICAgRVFVIC01ICAgIDsvLyBCYWQgQXJndW1lbnRzIAorCitPTVhfU3RzQUNBQUNfVG5zTnVtRmlsdEVyciAgICAgICBFUVUgLTE1NyAgOy8vIEFBQzogSW52YWxpZCBudW1iZXIgb2YgVE5TIGZpbHRlcnMgIAorT01YX1N0c0FDQUFDX1Ruc0xlbkVyciAgICAgICAgICAgRVFVIC0xNTYgIDsvLyBBQUM6IEludmFsaWQgVE5TIHJlZ2lvbiBsZW5ndGggICAgIAorT01YX1N0c0FDQUFDX1Ruc09yZGVyRXJyICAgICAgICAgRVFVIC0xNTUgIDsvLyBBQUM6IEludmFsaWQgb3JkZXIgb2YgVE5TIGZpbHRlciAgICAgICAgICAgICAgICAgICAgCitPTVhfU3RzQUNBQUNfVG5zQ29lZlJlc0VyciAgICAgICBFUVUgLTE1NCAgOy8vIEFBQzogSW52YWxpZCBiaXQtcmVzb2x1dGlvbiBmb3IgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgIAorT01YX1N0c0FDQUFDX1Ruc0NvZWZFcnIgICAgICAgICAgRVFVIC0xNTMgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgIAorT01YX1N0c0FDQUFDX1Ruc0RpcmVjdEVyciAgICAgICAgRVFVIC0xNTIgIDsvLyBBQUM6IEludmFsaWQgVE5TIGZpbHRlciBkaXJlY3Rpb24gICAgCisKK09NWF9TdHNJQ0pQX0pQRUdNYXJrZXJFcnIgICAgICAgIEVRVSAtMTgzICA7Ly8gSlBFRyBtYXJrZXIgZW5jb3VudGVyZWQgd2l0aGluIGFuIGVudHJvcHktY29kZWQgYmxvY2s7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSHVmZm1hbiBkZWNvZGluZyBvcGVyYXRpb24gdGVybWluYXRlZCBlYXJseS4gICAgICAgICAgIAorT01YX1N0c0lDSlBfSlBFR01hcmtlciAgICAgICAgICAgRVFVIC0xODEgIDsvLyBKUEVHIG1hcmtlciBlbmNvdW50ZXJlZDsgSHVmZm1hbiBkZWNvZGluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIG9wZXJhdGlvbiB0ZXJtaW5hdGVkIGVhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAKK09NWF9TdHNJUFBQX0NvbnRleHRNYXRjaEVyciAgICAgIEVRVSAtMTcgICA7Ly8gQ29udGV4dCBwYXJhbWV0ZXIgZG9lc24ndCBtYXRjaCB0byB0aGUgb3BlcmF0aW9uIAorCitPTVhfU3RzU1BfRXZlbk1lZGlhbk1hc2tTaXplRXJyICBFUVUgLTE4MCAgOy8vIEV2ZW4gc2l6ZSBvZiB0aGUgTWVkaWFuIEZpbHRlciBtYXNrIHdhcyByZXBsYWNlZCBieSB0aGUgb2RkIG9uZSAKKworT01YX1N0c19NYXhpbXVtRW51bWVyYXRpb24gICAgICAgRVFVIDB4N0ZGRkZGRkYKKworCisKK09NWF9NSU5fUzggICAgICBFUVUgCSAgIAkoLTEyOCkKK09NWF9NSU5fVTggIAlFUVUgICAgIAkwCitPTVhfTUlOX1MxNgkJRVFVICAgICAgCSgtMzI3NjgpCitPTVhfTUlOX1UxNgkJRVFVCSAgICAgICAgMAorCisKK09NWF9NSU5fUzMyCQlFUVUJKC0yMTQ3NDgzNjQ3LTEpCitPTVhfTUlOX1UzMgkJRVFVCTAKKworT01YX01BWF9TOAkJRVFVCSgxMjcpCitPTVhfTUFYX1U4CQlFUVUJKDI1NSkKK09NWF9NQVhfUzE2CQlFUVUJKDMyNzY3KQorT01YX01BWF9VMTYJCUVRVQkoMHhGRkZGKQorT01YX01BWF9TMzIJCUVRVQkoMjE0NzQ4MzY0NykKK09NWF9NQVhfVTMyCQlFUVUJKDB4RkZGRkZGRkYpCisKK09NWF9WQ19VUFBFUiAgICBFUVUgMHgxICAgICAgICAgICAgICAgICA7Ly8gVXNlZCBieSB0aGUgUHJlZGljdEludHJhIGZ1bmN0aW9ucyAgIAorT01YX1ZDX0xFRlQgICAgIEVRVSAweDIgICAgICAgICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zIAorT01YX1ZDX1VQUEVSX1JJR0hUICAgIEVRVSAweDQwICAgICAgICAgIDsvLyBVc2VkIGJ5IHRoZSBQcmVkaWN0SW50cmEgZnVuY3Rpb25zICAgCisKK05VTEwgICAgRVFVIDAKKworOy8vIFN0cnVjdHVyZXMKKworICAgIElOQ0xVREUgICAgIGFybUNPTU1fcy5oCisKKyAgICBNX1NUUlVDVCAgICBPTVhQb2ludAorICAgIE1fRklFTEQgICAgIHgsIDQKKyAgICBNX0ZJRUxEICAgICB5LCA0CisgICAgTV9FTkRTVFJVQ1QKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9idWlsZF92Yy5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDllNzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL2J1aWxkX3ZjLnBsCkBAIC0wLDAgKzEsMTEzIEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgCisjIEZpbGUgTmFtZTogIGJ1aWxkX3ZjLnBsCisjIE9wZW5NQVggREw6IHYxLjAuMgorIyBSZXZpc2lvbjogICAxMjI5MAorIyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyMgCisjIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyAKKyMgCisjCisjIFRoaXMgZmlsZSBidWlsZHMgdGhlIE9wZW5NQVggREwgdmMgZG9tYWluIGxpYnJhcnkgb214VkMuby4KKyMKKwordXNlIEZpbGU6OlNwZWM7Cit1c2Ugc3RyaWN0OworCitteSAoJENDLCAkQ0NfT1BUUywgJEFTLCAkQVNfT1BUUywgJExJQiwgJExJQl9PUFRTLCAkTElCX1RZUEUpOworCiskQ0MgICAgICAgPSAnYXJtY2MnOworJENDX09QVFMgID0gJy0tbm9fdW5hbGlnbmVkX2FjY2VzcyAtLWNwdSBDb3J0ZXgtQTggLWMnOworJEFTICAgICAgID0gJ2FybWFzbSc7CiskQVNfT1BUUyAgPSAnLS1ub191bmFsaWduZWRfYWNjZXNzIC0tY3B1IENvcnRleC1BOCc7CisjICRMSUIgICAgICA9ICdhcm1saW5rJzsKKyMgJExJQl9PUFRTID0gJy0tcGFydGlhbCAtbyc7CisjICRMSUJfVFlQRSA9ICcubyc7CiskTElCICAgICAgPSAnYXJtYXInOworJExJQl9PUFRTID0gJy0tY3JlYXRlIC1yJzsKKyRMSUJfVFlQRSA9ICcuYSc7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbXkgKEBoZWFkZXJsaXN0LCBAZmlsZWxpc3QsICRoZCwgJGZpbGUsICRvZmlsZSwgJGNvbW1hbmQsICRvYmpsaXN0LCAkbGliZmlsZSwgJGgpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGluY2x1ZGVkIGhlYWRlciBmaWxlcy4KK0BoZWFkZXJsaXN0ID0gcXcoYXBpIHZjL2FwaSB2Yy9tNHAyL2FwaSB2Yy9tNHAxMC9hcGkpOworCisjIERlZmluZSB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4KK29wZW4oRklMRVMsICc8ZmlsZWxpc3RfdmMudHh0Jykgb3IgZGllKCJDYW4ndCBvcGVuIHNvdXJjZSBmaWxlIGxpc3RcbiIpOworQGZpbGVsaXN0ID0gPEZJTEVTPjsKK2Nsb3NlKEZJTEVTKTsKKworIyBGaXggdGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgaGVhZGVyIHBhdGhzCitmb3JlYWNoICRoIChAaGVhZGVybGlzdCkKK3sKKyAgICAgICAgJGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGgpOworfQorCisjIENyZWF0ZSB0aGUgaW5jbHVkZSBwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyRoZCA9ICctSScgLiBqb2luKCcgLUknLCBAaGVhZGVybGlzdCk7CisKKyMgQ3JlYXRlIHRoZSBidWlsZCBkaXJlY3RvcmllcyAiL2xpYi8iIGFuZCAiL29iai8iIChpZiB0aGV5IGFyZSBub3QgdGhlcmUgYWxyZWFkeSkKK21rZGlyICJvYmoiLCAwNzc3IGlmICghIC1kICJvYmoiKTsKK21rZGlyICJsaWIiLCAwNzc3IGlmICghIC1kICJsaWIiKTsKKworJG9iamxpc3QgPSAnJzsKKworIyBDb21waWxlIGVhY2ggZmlsZQorZm9yZWFjaCAkZmlsZSAoQGZpbGVsaXN0KQoreworCW15ICRmOworCW15ICRiYXNlOworCW15ICRleHQ7CisJbXkgJG9iamZpbGU7CisKKwljaG9tcCgkZmlsZSk7CisJJGZpbGUgPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoJGZpbGUpOworCisJKHVuZGVmLCB1bmRlZiwgJGYpID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCRmaWxlKTsKKyAgICAkZj1+cy9bXG5cZlxyXS8vZzsgIyBSZW1vdmUgYW55IGVuZC1vZi1saW5lIGNoYXJhY3RlcnMKKworCWlmKCgkYmFzZSwgJGV4dCkgPSAkZiA9fiAvKC4rKVwuKFx3KSQvKQorCXsKKwkJJG9iamZpbGUgPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCdvYmonLCAkYmFzZS4nLm8nKTsKKworCQlpZigkZXh0IGVxICdjJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRDQy4nICcuJENDX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNpZigkZXh0IGVxICdzJykKKwkJeworCQkJJG9iamxpc3QgLj0gIiRvYmpmaWxlICI7CisJCQkkY29tbWFuZCA9ICRBUy4nICcuJEFTX09QVFMuJyAnLiRoZC4nIC1vICcuJG9iamZpbGUuJyAnLiRmaWxlOworCQkJcHJpbnQgIiRjb21tYW5kXG4iOworCQkJc3lzdGVtKCRjb21tYW5kKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXByaW50ICJJZ25vcmluZyBmaWxlOiAkZlxuIjsKKwkJfQorCX0KKwllbHNlCisJeworCQlkaWUgIk5vIGZpbGUgZXh0ZW5zaW9uIGZvdW5kOiAkZlxuIjsKKwl9Cit9CisKKyMgRG8gdGhlIGZpbmFsIGxpbmsgc3RhZ2UgdG8gY3JlYXRlIHRoZSBsaWJyYXJpZXMuCiskbGliZmlsZSA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJ2xpYicsICdvbXhWQycuJExJQl9UWVBFKTsKKyRjb21tYW5kID0gJExJQi4nICcuJExJQl9PUFRTLicgJy4kbGliZmlsZS4nICcuJG9iamxpc3Q7CitwcmludCAiJGNvbW1hbmRcbiI7Cisoc3lzdGVtKCRjb21tYW5kKSA9PSAwKSBhbmQgcHJpbnQgIkJ1aWxkIHN1Y2Nlc3NmdWxcbiI7CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9maWxlbGlzdF92Yy50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkYjhlZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vZmlsZWxpc3RfdmMudHh0CkBAIC0wLDAgKzEsNzUgQEAKKy4vYXBpL2FybUNPTU0uaAorLi9hcGkvYXJtQ09NTV9CaXREZWNfcy5oCisuL2FwaS9hcm1DT01NX0JpdHN0cmVhbS5oCisuL2FwaS9hcm1DT01NX0lEQ1Rfcy5oCisuL2FwaS9hcm1DT01NX0lEQ1RUYWJsZS5oCisuL2FwaS9hcm1DT01NX01hc2tUYWJsZS5oCisuL2FwaS9hcm1DT01NX3MuaAorLi9hcGkvYXJtQ09NTV9WZXJzaW9uLmgKKy4vYXBpL2FybU9NWF9SZWxlYXNlVmVyc2lvbi5oCisuL2FwaS9vbXh0eXBlcy5oCisuL2FwaS9vbXh0eXBlc19zLmgKKy4vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKKy4vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKKy4vdmMvYXBpL2FybVZDLmgKKy4vdmMvYXBpL2FybVZDQ09NTV9zLmgKKy4vdmMvYXBpL29teFZDLmgKKy4vdmMvYXBpL29teFZDX3MuaAorLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucworLi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKKy4vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCisuL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCisuL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MucworLi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDLmMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworLi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNl9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKy4vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCisuL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKy4vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCisuL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucworLi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9Mb29rdXBfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX1NldFByZWREaXJfcy5zCisuL3ZjL200cDIvc3JjL2FybVZDTTRQMl9aaWd6YWdfVGFibGVzLmMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlci5jCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEuYworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlUGFkTVZfUFZPUF9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRlcl9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTENfcy5zCisuL3ZjL200cDIvc3JjL29teFZDTTRQMl9GaW5kTVZwcmVkX3MucworLi92Yy9tNHAyL3NyYy9vbXhWQ000UDJfSURDVDh4OGJsa19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX01DUmVjb25CbG9ja19zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1ByZWRpY3RSZWNvbkNvZWZJbnRyYV9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50ZXJfSV9zLnMKKy4vdmMvbTRwMi9zcmMvb214VkNNNFAyX1F1YW50SW52SW50cmFfSV9zLnMKKy4vdmMvc3JjL2FybVZDX1ZlcnNpb24uYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU3MmE4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTS5jCkBAIC0wLDAgKzEsOTM2IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDk2NDEKKyAqIERhdGU6ICAgICAgIFRodXJzZGF5LCBGZWJydWFyeSA3LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBEZWZpbmVzIENvbW1vbiBBUElzIHVzZWQgYWNyb3NzIE9wZW5NQVggQVBJJ3MKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIEFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMTYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgc2hvcnQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MxNiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MxNiBhcm1Sb3VuZEZsb2F0VG9TMTYgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MxNikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Sb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1Sb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1MzMikoVmFsdWUgLSAuNSk7CisgICAgfQorfQorLyoqCisgKiBGdW5jdGlvbjogYXJtU2F0Um91bmRGbG9hdFRvUzE2CisgKgorICogRGVzY3JpcHRpb246CisgKiBDb252ZXJ0cyBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgaW50byBhIHNob3J0IGludCBhZnRlciByb3VuZGluZyBhbmQgc2F0dXJhdGlvbgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBWYWx1ZSAgICAgICAgICAgICAgICAgRmxvYXQgdmFsdWUgdG8gYmUgY29udmVydGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogW291dF0gY29udmVydGVkIHZhbHVlIGluIE9NWF9TMTYgZm9ybWF0CisgKgorICovCisKK09NWF9TMTYgYXJtU2F0Um91bmRGbG9hdFRvUzE2IChPTVhfRjY0IFZhbHVlKQoreworICAgIGlmIChWYWx1ZSA+IDApCisgICAgeworICAgICAgICBWYWx1ZSArPSAwLjU7CisgICAgICAgIAorICAgICAgICBpZihWYWx1ZSA+IChPTVhfUzE2KU9NWF9NQVhfUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFZhbHVlIC09IDAuNTsKKworICAgICAgICBpZihWYWx1ZSA8IChPTVhfUzE2KU9NWF9NSU5fUzE2ICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChPTVhfUzE2KVZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbnZlcnRzIGEgZG91YmxlIHByZWNpc2lvbiB2YWx1ZSBpbnRvIGEgaW50IGFmdGVyIHJvdW5kaW5nIGFuZCBzYXR1cmF0aW9uCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1MzMiBmb3JtYXQKKyAqCisgKi8KKworT01YX1MzMiBhcm1TYXRSb3VuZEZsb2F0VG9TMzIgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIFZhbHVlICs9IDAuNTsKKyAgICAgICAgCisgICAgICAgIGlmKFZhbHVlID4gKE9NWF9TMzIpT01YX01BWF9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01BWF9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgVmFsdWUgLT0gMC41OworCisgICAgICAgIGlmKFZhbHVlIDwgKE9NWF9TMzIpT01YX01JTl9TMzIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpT01YX01JTl9TMzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKE9NWF9TMzIpVmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UxNgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBzaG9ydCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTE2IGZvcm1hdAorICoKKyAqLworCitPTVhfVTE2IGFybVNhdFJvdW5kRmxvYXRUb1UxNiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UxNilPTVhfTUFYX1UxNiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMTYpT01YX01BWF9VMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UxNilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNhdFJvdW5kRmxvYXRUb1UzMgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSB1bnNpZ25lZCBpbnQgYWZ0ZXIgcm91bmRpbmcgYW5kIHNhdHVyYXRpb24KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgVmFsdWUgICAgICAgICAgICAgICAgIEZsb2F0IHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFtvdXRdIGNvbnZlcnRlZCB2YWx1ZSBpbiBPTVhfVTMyIGZvcm1hdAorICoKKyAqLworCitPTVhfVTMyIGFybVNhdFJvdW5kRmxvYXRUb1UzMiAoT01YX0Y2NCBWYWx1ZSkKK3sKKyAgICBWYWx1ZSArPSAwLjU7CisgICAgCisgICAgaWYoVmFsdWUgPiAoT01YX1UzMilPTVhfTUFYX1UzMiApCisgICAgeworICAgICAgICByZXR1cm4gKE9NWF9VMzIpT01YX01BWF9VMzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1UzMilWYWx1ZTsKKyAgICB9Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVJvdW5kRmxvYXRUb1M2NAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29udmVydHMgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlIGludG8gYSA2NCBiaXQgaW50IGFmdGVyIHJvdW5kaW5nCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIFZhbHVlICAgICAgICAgICAgICAgICBGbG9hdCB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBbb3V0XSBjb252ZXJ0ZWQgdmFsdWUgaW4gT01YX1M2NCBmb3JtYXQKKyAqCisgKi8KKworT01YX1M2NCBhcm1Sb3VuZEZsb2F0VG9TNjQgKE9NWF9GNjQgVmFsdWUpCit7CisgICAgaWYgKFZhbHVlID4gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgKyAuNSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAoT01YX1M2NCkoVmFsdWUgLSAuNSk7CisgICAgfQorfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1TaWduQ2hlY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgc2lnbiBvZiBhIHZhcmlhYmxlOgorICogcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiByZXR1cm5zIDAgaWYgaXQgaXMgMAorICogcmV0dXJucyAtMSBpZiBpdCBpcyBOZWdhdGl2ZSAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSAgICB2YXIgICAgIFZhcmlhYmxlIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfSU5UIC0tICAgcmV0dXJucyAxIGlmIGl0IGlzIFBvc2l0aXZlCisgKiAgICAgICAgICAgICAgcmV0dXJucyAwIGlmIGl0IGlzIDAKKyAqICAgICAgICAgICAgICByZXR1cm5zIC0xIGlmIGl0IGlzIE5lZ2F0aXZlIAorICovIAorCitPTVhfSU5UIGFybVNpZ25DaGVjayAoCisgICAgT01YX1MxNiB2YXIKKykKKworeworICAgIE9NWF9JTlQgU2lnbjsKKyAgICAKKyAgICBpZiAodmFyIDwgMCkKKyAgICB7CisgICAgICAgIFNpZ24gPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHZhciA+IDApCisgICAgeworICAgICAgICBTaWduID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU2lnbiA9IDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBTaWduOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwCisgKgorICogRGVzY3JpcHRpb246IENsaXBzIHRoZSBpbnB1dCBiZXR3ZWVuIE1BWCBhbmQgTUlOIHZhbHVlCisgKiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIE1pbiAgICAgbG93ZXIgYm91bmQKKyAqIFtpbl0gTWF4ICAgICB1cHBlciBib3VuZAorICogW2luXSBzcmMgICAgIHZhcmlhYmxlIHRvIHRoZSBjbGlwcGVkCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1MzMiAtLSAgIHJldHVybnMgY2xpcHBlZCB2YWx1ZQorICovIAorIAorT01YX1MzMiBhcm1DbGlwICgKKyAgICBPTVhfSU5UIG1pbiwKKyAgICBPTVhfSU5UIG1heCwgCisgICAgT01YX1MzMiBzcmMgCispCisgCit7CisgICAgaWYgKHNyYyA+IG1heCkKKyAgICB7CisgICAgICAgIHNyYyA9IG1heDsKKyAgICB9CisgICAgZWxzZSBpZiAoc3JjIDwgbWluKQorICAgIHsKKyAgICAgICAgc3JjID0gbWluOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3JjOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1DbGlwX0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBDbGlwcyB0aGUgaW5wdXQgYmV0d2VlbiBNQVggYW5kIE1JTiB2YWx1ZQorICogCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBNaW4gICAgIGxvd2VyIGJvdW5kCisgKiBbaW5dIE1heCAgICAgdXBwZXIgYm91bmQKKyAqIFtpbl0gc3JjICAgICB2YXJpYWJsZSB0byB0aGUgY2xpcHBlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9GMzIgLS0gICByZXR1cm5zIGNsaXBwZWQgdmFsdWUKKyAqLyAKKyAKK09NWF9GMzIgYXJtQ2xpcF9GMzIgKAorICAgIE9NWF9GMzIgbWluLAorICAgIE9NWF9GMzIgbWF4LCAKKyAgICBPTVhfRjMyIHNyYyAKKykKKyAKK3sKKyAgICBpZiAoc3JjID4gbWF4KQorICAgIHsKKyAgICAgICAgc3JjID0gbWF4OworICAgIH0KKyAgICBlbHNlIGlmIChzcmMgPCBtaW4pCisgICAgeworICAgICAgICBzcmMgPSBtaW47CisgICAgfQorICAgIAorICAgIHJldHVybiBzcmM7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybVNoaWZ0U2F0X0YzMgorICoKKyAqIERlc2NyaXB0aW9uOiBEaXZpZGVzIGEgZmxvYXQgdmFsdWUgYnkgMl5zaGlmdCBhbmQgCisgKiBzYXR1cmF0ZXMgaXQgZm9yIHVuc2lnbmVkIHZhbHVlIHJhbmdlIGZvciBzYXRCaXRzLgorICogU2Vjb25kIHBhcmFtZXRlciBpcyBsaWtlICJzaGlmdGluZyIgdGhlIGNvcnJlc3BvbmRpbmcgCisgKiBpbnRlZ2VyIHZhbHVlLiBUYWtlcyBjYXJlIG9mIHJvdW5kaW5nIHdoaWxlIGNsaXBwaW5nIHRoZSBmaW5hbCAKKyAqIHZhbHVlLgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHYgICAgICAgICAgTnVtYmVyIHRvIGJlIG9wZXJhdGVkIHVwb24KKyAqIFtpbl0gc2hpZnQgICAgICBEaXZpZGVzIHRoZSBpbnB1dCAidiIgYnkgIjJec2hpZnQiCisgKiBbaW5dIHNhdEJpdHMgICAgRmluYWwgcmFuZ2UgaXMgWzAsIDJec2F0Qml0cykKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyAic2hpZnRlZCIgc2F0dXJhdGVkIHZhbHVlCisgKi8gCisgCitPTVhfVTMyIGFybVNoaWZ0U2F0X0YzMihPTVhfRjMyIHYsIE9NWF9JTlQgc2hpZnQsIE9NWF9JTlQgc2F0Qml0cykgCit7CisgICAgT01YX1UzMiBhbGxPbmVzID0gKE9NWF9VMzIpKC0xKTsKKyAgICBPTVhfVTMyIG1heFYgPSBhbGxPbmVzID4+ICgzMi1zYXRCaXRzKTsKKyAgICBPTVhfRjMyIHZTaGlmdGVkLCB2Um91bmRlZCwgc2hpZnREaXYgPSAoT01YX0YzMikoMSA8PCBzaGlmdCk7CisgICAgT01YX1UzMiB2SW50OworICAgIE9NWF9VMzIgdkludFNhdDsKKyAgICAKKyAgICBpZih2IDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHZTaGlmdGVkID0gdiAvIHNoaWZ0RGl2OworICAgIHZSb3VuZGVkID0gKE9NWF9GMzIpKHZTaGlmdGVkICsgMC41KTsKKyAgICB2SW50ID0gKE9NWF9VMzIpdlJvdW5kZWQ7CisgICAgdkludFNhdCA9IHZJbnQ7CisgICAgaWYodkludFNhdCA+IG1heFYpIAorICAgICAgICB2SW50U2F0ID0gbWF4VjsKKyAgICByZXR1cm4gdkludFNhdDsKK30KKworLyoqCisgKiBGdW5jdGlvbnM6IGFybVN3YXBFbGVtCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGVzZSBmdW5jdGlvbiBzd2FwcyB0d28gZWxlbWVudHMgYXQgdGhlIHNwZWNpZmllZCBwb2ludGVyIGxvY2F0aW9ucy4KKyAqIFRoZSBzaXplIG9mIGVhY2ggZWxlbWVudCBjb3VsZCBiZSBhbnl0aGluZyBhcyBzcGVjaWZpZWQgYnkgPGVsZW1TaXplPgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWFJlc3VsdCAtLSBFcnJvciBzdGF0dXMgZnJvbSB0aGUgZnVuY3Rpb24KKyAqLworT01YUmVzdWx0IGFybVN3YXBFbGVtKAorICAgICAgICBPTVhfVTggKnBCdWYxLAorICAgICAgICBPTVhfVTggKnBCdWYyLAorICAgICAgICBPTVhfSU5UIGVsZW1TaXplCisgICAgICAgKQoreworICAgIE9NWF9JTlQgaTsKKyAgICBPTVhfVTggdGVtcDsKKyAgICBhcm1SZXRBcmdFcnJJZighcEJ1ZjEgfHwgIXBCdWYyLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgCisgICAgZm9yKGkgPSAwOyBpIDwgZWxlbVNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHBCdWYxICsgaSk7CisgICAgICAgICoocEJ1ZjEgKyBpKSA9ICoocEJ1ZjIgKyBpKTsKKyAgICAgICAgKihwQnVmMiArIGkpID0gdGVtcDsKKyAgICB9CisgICAgcmV0dXJuIE9NWF9TdHNfTm9FcnI7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybU1lZGlhbk9mMworICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgbWVkaWFuIG9mIHRocmVlIG51bWJlcnMKKyAqIAorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBmRW50cnkgICAgIEZpcnN0IGVudHJ5CisgKiBbaW5dIHNFbnRyeSAgICAgc2Vjb25kIGVudHJ5CisgKiBbaW5dIHRFbnRyeSAgICAgVGhpcmQgZW50cnkKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfUzMyIC0tICAgcmV0dXJucyB0aGUgbWVkaWFuIHZhbHVlCisgKi8gCisgCitPTVhfUzMyIGFybU1lZGlhbk9mMyAoCisgICAgT01YX1MzMiBmRW50cnksCisgICAgT01YX1MzMiBzRW50cnksIAorICAgIE9NWF9TMzIgdEVudHJ5IAorKQoreworICAgIE9NWF9TMzIgYSwgYiwgYzsKKyAgICAKKyAgICBhID0gYXJtTWluIChmRW50cnksIHNFbnRyeSk7CisgICAgYiA9IGFybU1heCAoZkVudHJ5LCBzRW50cnkpOworICAgIGMgPSBhcm1NaW4gKGIsIHRFbnRyeSk7CisgICAgcmV0dXJuIChhcm1NYXggKGEsIGMpKTsKK30KKworLyoqCisgKiBGdW5jdGlvbjogYXJtTG9nU2l6ZQorICoKKyAqIERlc2NyaXB0aW9uOiBGaW5kcyB0aGUgc2l6ZSBvZiBhIHBvc2l0aXZlIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBzYW1lCisgKiAKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gdmFsdWUgICAgUG9zaXRpdmUgdmFsdWUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfVTggLS0gICAgIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBwb3NpdGl2ZSB2YWx1ZS4gCisgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNtYWxsZXN0IGs+PTAgc3VjaCB0aGF0IHRoYXQgdmFsdWUgaXMgbGVzcyB0aGFuICgxPDxrKS4KKyAqLyAKKyAKK09NWF9VOCBhcm1Mb2dTaXplICgKKyAgICBPTVhfVTE2IHZhbHVlIAorKQoreworICAgIE9NWF9VOCBpOyAgICAKKyAgICBmb3IgKCBpID0gMDsgdmFsdWUgPiAwOyB2YWx1ZSA9IHZhbHVlID4+IDEpIAorICAgIHsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgQXJpdGhtZXRpYyBvcGVyYXRpb25zICovCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdEFkZF9TMzIoKQorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBhZGRpdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0QWRkX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgKyBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpID49IDApCisgICAgeworICAgICAgICAvKlNhbWUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRBZGRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzYXR1cmF0ZWQgYWRkaXRpb24gb2YgdGhlIHR3byBpbnB1dHMgVmFsdWUxLCBWYWx1ZTIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlMSAgICAgICBGaXJzdCBPcGVyYW5kCisgKiBbaW5dIFZhbHVlMiAgICAgICBTZWNvbmQgT3BlcmFuZAorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqIAorICogICAgCisgKiovCisgCitPTVhfUzY0IGFybVNhdEFkZF9TNjQoT01YX1M2NCBWYWx1ZTEsT01YX1M2NCBWYWx1ZTIpCit7CisgICAgT01YX1M2NCBSZXN1bHQ7CisgICAgCisgICAgUmVzdWx0ID0gVmFsdWUxICsgVmFsdWUyOworCisgICAgaWYoIChWYWx1ZTFeVmFsdWUyKSA+PSAwKQorICAgIHsKKyAgICAgICAgLypTYW1lIHNpZ24qLworICAgICAgICBpZiggKFJlc3VsdF5WYWx1ZTEpID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBub3Qgc2F0dXJhdGVkKi8KKyAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihWYWx1ZTEgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKlJlc3VsdCBoYXMgc2F0dXJhdGVkIGluIHBvc2l0aXZlIHNpZGUqLworICAgICAgICAgICAgICAgIFJlc3VsdCA9IE9NWF9NQVhfUzY0OworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLypSZXN1bHQgaGFzIHNhdHVyYXRlZCBpbiBuZWdhdGl2ZSBzaWRlKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX01JTl9TNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICB9CisgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9CisgICAgCit9CisKKy8qKiBGdW5jdGlvbiA6YXJtU2F0U3ViX1MzMigpCisgKiAKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2F0dXJhdGVkIHN1YnN0cmFjdGlvbiBvZiB0aGUgdHdvIGlucHV0cyBWYWx1ZTEsIFZhbHVlMgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogCisgKiovCisKK09NWF9TMzIgYXJtU2F0U3ViX1MzMihPTVhfUzMyIFZhbHVlMSxPTVhfUzMyIFZhbHVlMikKK3sKKyAgICBPTVhfUzMyIFJlc3VsdDsKKyAgICAKKyAgICBSZXN1bHQgPSBWYWx1ZTEgLSBWYWx1ZTI7CisKKyAgICBpZiggKFZhbHVlMV5WYWx1ZTIpIDwgMCkKKyAgICB7CisgICAgICAgIC8qT3Bwb3NpdGUgc2lnbiovCisgICAgICAgIGlmKCAoUmVzdWx0XlZhbHVlMSkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLypSZXN1bHQgaGFzIG5vdCBzYXR1cmF0ZWQqLworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFZhbHVlMSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gcG9zaXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NQVhfUzMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qUmVzdWx0IGhhcyBzYXR1cmF0ZWQgaW4gbmVnYXRpdmUgc2lkZSovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9NSU5fUzMyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIE11bHRpcGxpY2F0aW9uIG9mIFZhbHVlMSBhbmQgVmFsdWUyIGFuZCBzdWJlc3F1ZW50IHNhdHVyYXRlZAorICogICAgIGFjY3VtdWxhdGlvbiB3aXRoIE1hYworICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUxICAgICAgIEZpcnN0IE9wZXJhbmQKKyAqIFtpbl0gVmFsdWUyICAgICAgIFNlY29uZCBPcGVyYW5kCisgKiBbaW5dIE1hYyAgICAgICAgICBBY2N1bXVsYXRvcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqKi8KKworT01YX1MzMiBhcm1TYXRNYWNfUzMyKE9NWF9TMzIgTWFjLE9NWF9TMTYgVmFsdWUxLE9NWF9TMTYgVmFsdWUyKQoreworICAgIE9NWF9TMzIgUmVzdWx0OworICAgIAorICAgIFJlc3VsdCA9IChPTVhfUzMyKShWYWx1ZTEqVmFsdWUyKTsKKyAgICBSZXN1bHQgPSBhcm1TYXRBZGRfUzMyKCBNYWMgLCBSZXN1bHQgKTsKKworICAgIHJldHVybiBSZXN1bHQ7ICAgIAorfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNYWNfUzE2UzMyX1MzMgorICoKKyAqIERlc2NyaXB0aW9uIDoKKyAqICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRlZCBNQUMgb3BlcmF0aW9uIG9mIHRoZSB0aHJlZSBpbnB1dHMgZGVsYXlFbGVtLCBmaWxUYXAgLCBtYWMKKyAqCisgKiAgIG1hYyA9IG1hYyArIFNhdHVyYXRlX2luXzMyQml0cyhkZWxheUVsZW0gKiBmaWxUYXApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBkZWxheUVsZW0gICAgRmlyc3QgMzIgYml0IE9wZXJhbmQKKyAqIFtpbl0gZmlsVGFwICAgICAgIFNlY29uZCAxNiBiaXQgT3BlcmFuZAorICogW2luXSBtYWMgICAgICAgICAgUmVzdWx0IG9mIE1BQyBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgbWFjICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TMzIgYXJtU2F0TWFjX1MxNlMzMl9TMzIoT01YX1MzMiBtYWMsIE9NWF9TMzIgZGVsYXlFbGVtLCBPTVhfUzE2IGZpbFRhcCApCit7CisgICAgCisgICAgT01YX1MzMiByZXN1bHQ7CisKKyAgICByZXN1bHQgPSBhcm1TYXRNdWxTMTZTMzJfUzMyKGZpbFRhcCxkZWxheUVsZW0pOyAKKworICAgIGlmICggcmVzdWx0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gT01YX01BWF9TMzI7CisgICAgfQorICAgIGVsc2UgaWYoIHJlc3VsdCA8IE9NWF9NSU5fUzE2ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IE9NWF9NSU5fUzMyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSBkZWxheUVsZW0gKiBmaWxUYXA7CisgICAgfQorCisgICAgbWFjID0gYXJtU2F0QWRkX1MzMihtYWMscmVzdWx0KTsKKyAgICAKKyAgICByZXR1cm4gbWFjOworfQorCisKKy8qKgorICogRnVuY3Rpb24gOmFybVNhdFJvdW5kUmlnaHRTaGlmdF9TMzJfUzE2CisgKgorICogRGVzY3JpcHRpb24gOgorICogICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygcm91bmRlZCByaWdodCBzaGlmdCBvcGVyYXRpb24gb2YgaW5wdXQgYnkgdGhlIHNjYWxlZmFjdG9yCisgKgorICogICBvdXRwdXQgPSBTYXR1cmF0ZV9pbl8xNkJpdHMoICggUmlnaHQvTGVmdFNoaWZ0KCAoUm91bmQoaW5wdXQpICwgc2hpZnQgKSApCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBpbnB1dCAgICAgICBUaGUgaW5wdXQgdG8gYmUgb3BlcmF0ZWQgb24KKyAqIFtpbl0gc2hpZnQgVGhlIHNoaWZ0IG51bWJlcgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MxNiBhcm1TYXRSb3VuZFJpZ2h0U2hpZnRfUzMyX1MxNihPTVhfUzMyIGlucHV0LCBPTVhfSU5UIHNoaWZ0KQoreworICAgIGlucHV0ID0gYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKGlucHV0LC1zaGlmdCk7CisKKyAgICBpZiAoIGlucHV0ID4gT01YX01BWF9TMTYgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NQVhfUzE2OworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA8IE9NWF9NSU5fUzE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChPTVhfUzE2KU9NWF9NSU5fUzE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgIHJldHVybiAoT01YX1MxNilpbnB1dDsKKyAgICB9CisKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqICAgICAKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gVmFsdWUgICAgICAgIE9wZXJhbmQKKyAqIFtpbl0gU2hpZnQgICAgICAgIE9wZXJhbmQgZm9yIHNoaWZ0IG9wZXJhdGlvbgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdFJvdW5kTGVmdFNoaWZ0X1MzMihPTVhfUzMyIFZhbHVlLCBPTVhfSU5UIFNoaWZ0KQoreworICAgIE9NWF9JTlQgaTsKKyAgICAKKyAgICBpZiAoU2hpZnQgPCAwKQorICAgIHsKKyAgICAgICAgU2hpZnQgPSAtU2hpZnQ7CisgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgKDEgPDwgKFNoaWZ0IC0gMSkpKTsKKyAgICAgICAgVmFsdWUgPSBWYWx1ZSA+PiBTaGlmdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFNoaWZ0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlID0gYXJtU2F0QWRkX1MzMihWYWx1ZSwgVmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWYWx1ZTsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHNhdHVyYXRpbmcgbGVmdC1zaGlmdCBvcGVyYXRpb24gb24gaW5wdXQKKyAqICAgICBPciByb3VuZGVkIFJpZ2h0IHNoaWZ0IGlmIHRoZSBpbnB1dCBTaGlmdCBpcyBuZWdhdGl2ZS4KKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIFZhbHVlICAgICAgICBPcGVyYW5kCisgKiBbaW5dIHNoaWZ0ICAgICAgICBPcGVyYW5kIGZvciBzaGlmdCBvcGVyYXRpb24KKyAqCisgKiBSZXR1cm46CisgKiBbb3V0XSAgICAgICAgICAgICBSZXN1bHQgb2Ygb3BlcmF0aW9uCisgKiAgICAKKyAqKi8KKyAKK09NWF9TNjQgYXJtU2F0Um91bmRMZWZ0U2hpZnRfUzY0KE9NWF9TNjQgVmFsdWUsIE9NWF9JTlQgU2hpZnQpCit7CisgICAgT01YX0lOVCBpOworICAgIAorICAgIGlmIChTaGlmdCA8IDApCisgICAgeworICAgICAgICBTaGlmdCA9IC1TaGlmdDsKKyAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCAoKE9NWF9TNjQpMSA8PCAoU2hpZnQgLSAxKSkpOworICAgICAgICBWYWx1ZSA9IFZhbHVlID4+IFNoaWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU2hpZnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWUgPSBhcm1TYXRBZGRfUzY0KFZhbHVlLCBWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZhbHVlOworfQorCisvKioKKyAqIEZ1bmN0aW9uIDphcm1TYXRNdWxTMTZTMzJfUzMyKCkKKyAqCisgKiBEZXNjcmlwdGlvbiA6CisgKiAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGEgUzE2IGRhdGEgdHlwZSBtdWx0aXBsaWVkIHdpdGggYW4gUzMyIGRhdGEgdHlwZQorICogICAgIGluIGEgUzMyIGNvbnRhaW5lcgorICoKKyAqIFBhcmFtZXRyczoKKyAqIFtpbl0gaW5wdXQxICAgICAgIE9wZXJhbmQgMQorICogW2luXSBpbnB1dDIgICAgICAgT3BlcmFuZCAyCisgKgorICogUmV0dXJuOgorICogW291dF0gICAgICAgICAgICAgUmVzdWx0IG9mIG9wZXJhdGlvbgorICogICAgCisgKiovCisKKworT01YX1MzMiBhcm1TYXRNdWxTMTZTMzJfUzMyKE9NWF9TMTYgaW5wdXQxLE9NWF9TMzIgaW5wdXQyKQoreworICAgIE9NWF9TMTYgaGkyLGxvMTsKKyAgICBPTVhfVTE2IGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyOworICAgIE9NWF9TMzIgcmVzdWx0OworICAgIAorICAgIGxvMSAgPSBpbnB1dDE7CisKKyAgICBoaTIgID0gKCBpbnB1dDIgPj4gIDE2ICk7CisgICAgbG8yICA9ICggKE9NWF9VMzIpKCBpbnB1dDIgPDwgMTYgKSA+PiAxNiApOworICAgIAorICAgIHRlbXAxID0gaGkyICogbG8xOworICAgIHRlbXAyID0gKCBsbzIqIGxvMSApID4+IDE2OworCisgICAgcmVzdWx0ID0gIGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBGdW5jdGlvbiA6YXJtU2F0TXVsUzMyUzMyX1MzMigpCisgKgorICogRGVzY3JpcHRpb24gOgorICogICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBhIFMzMiBkYXRhIHR5cGUgbXVsdGlwbGllZCB3aXRoIGFuIFMzMiBkYXRhIHR5cGUKKyAqICAgICBpbiBhIFMzMiBjb250YWluZXIKKyAqCisgKiBQYXJhbWV0cnM6CisgKiBbaW5dIGlucHV0MSAgICAgICBPcGVyYW5kIDEKKyAqIFtpbl0gaW5wdXQyICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24KKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybVNhdE11bFMzMlMzMl9TMzIoT01YX1MzMiBpbnB1dDEsT01YX1MzMiBpbnB1dDIpCit7CisgICAgT01YX1MxNiBoaTEsaGkyOworICAgIE9NWF9VMTYgbG8xLGxvMjsKKyAgICAKKyAgICBPTVhfUzMyIHRlbXAxLHRlbXAyLHRlbXAzOworICAgIE9NWF9TMzIgcmVzdWx0OworCisgICAgaGkxICA9ICggaW5wdXQxID4+ICAxNiApOworICAgIGxvMSAgPSAoIChPTVhfVTMyKSggaW5wdXQxIDw8IDE2ICkgPj4gMTYgKTsKKworICAgIGhpMiAgPSAoIGlucHV0MiA+PiAgMTYgKTsKKyAgICBsbzIgID0gKCAoT01YX1UzMikoIGlucHV0MiA8PCAxNiApID4+IDE2ICk7CisgICAgCisgICAgdGVtcDEgPSAgIGhpMSAqIGhpMjsKKyAgICB0ZW1wMiA9ICggaGkxKiBsbzIgKSA+PiAxNjsKKyAgICB0ZW1wMyA9ICggaGkyKiBsbzEgKSA+PiAxNjsKKworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIodGVtcDEsdGVtcDIpOworICAgIHJlc3VsdCA9IGFybVNhdEFkZF9TMzIocmVzdWx0LHRlbXAzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogRnVuY3Rpb24gOmFybUludERpdkF3YXlGcm9tWmVybygpCisgKgorICogRGVzY3JpcHRpb24gOiBJbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gCisgKiAgICAgICAgICAgICAgIEhhbGYtaW50ZWdlciB2YWx1ZXMgYXJlIHJvdW5kZWQgYXdheSBmcm9tIHplcm8KKyAqICAgICAgICAgICAgICAgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlIDMvLzIgaXMgcm91bmRlZCAKKyAqICAgICAgICAgICAgICAgdG8gMiwgYW5kIC0zLy8yIGlzIHJvdW5kZWQgdG8gLTIuCisgKgorICogUGFyYW1ldHJzOgorICogW2luXSBOdW0gICAgICAgIE9wZXJhbmQgMQorICogW2luXSBEZW5vICAgICAgIE9wZXJhbmQgMgorICoKKyAqIFJldHVybjoKKyAqIFtvdXRdICAgICAgICAgICAgIFJlc3VsdCBvZiBvcGVyYXRpb24gaW5wdXQxLy9pbnB1dDIKKyAqICAgIAorICoqLworCitPTVhfUzMyIGFybUludERpdkF3YXlGcm9tWmVybyAoT01YX1MzMiBOdW0sIE9NWF9TMzIgRGVubykKK3sKKyAgICBPTVhfRjY0IHJlc3VsdDsKKyAgICAKKyAgICByZXN1bHQgPSAoKE9NWF9GNjQpTnVtKS8oKE9NWF9GNjQpRGVubyk7CisgICAgCisgICAgaWYgKHJlc3VsdCA+PSAwKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9IDAuNTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0IC09IDAuNTsKKyAgICB9CisKKyAgICByZXR1cm4gKE9NWF9TMzIpKHJlc3VsdCk7Cit9CisKKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9CaXRzdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZWY5MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0JpdHN0cmVhbS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKioKKyAqIAorICogRmlsZSBOYW1lOiAgYXJtQ09NTV9CaXRzdHJlYW0uYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICA5NjQxCisgKiBEYXRlOiAgICAgICBUaHVyc2RheSwgRmVicnVhcnkgNywgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogRGVmaW5lcyBiaXRzdHJlYW0gZW5jb2RlIGFuZCBkZWNvZGUgZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgY29kZWNzCisgKi8KKworI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybUNPTU1fQml0c3RyZWFtLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1Mb29rQWhlYWRCaXRzKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEdldCB0aGUgbmV4dCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBiaXRzdHJlYW0gcG9pbnRlcgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqKnBwQml0U3RyZWFtCisgKiBbaW5dICAgICAqcE9mZnNldAorICogW2luXSAgICAgTj0xLi4uMzIKKyAqCisgKiBSZXR1cm5zICBWYWx1ZQorICovCisKK09NWF9VMzIgYXJtTG9va0FoZWFkQml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisKKyAgICBhcm1Bc3NlcnQoT2Zmc2V0Pj0wICYmIE9mZnNldDw9Nyk7CisgICAgYXJtQXNzZXJ0KE4+PTEgJiYgTjw9MzIpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFJldHVybiBOIGJpdHMgKi8KKyAgICByZXR1cm4gVmFsdWUgPj4gKDMyLU4pOworfQorCisKKy8qKgorICogRnVuY3Rpb246IGFybUdldEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVhZCBOIGJpdHMgZnJvbSB0aGUgYml0c3RyZWFtCisgKiAgICAKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBOPTEuLjMyCisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICogUmV0dXJucyAgVmFsdWUKKyAqLworCisKK09NWF9VMzIgYXJtR2V0Qml0cyhjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwgT01YX0lOVCAqcE9mZnNldCwgT01YX0lOVCBOKQoreworICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgCisgICAgaWYoTiA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFybUFzc2VydChPZmZzZXQ+PTAgJiYgT2Zmc2V0PD03KTsKKyAgICBhcm1Bc3NlcnQoTj49MSAmJiBOPD0zMik7CisKKyAgICAvKiBSZWFkIG5leHQgMzIgYml0cyBmcm9tIHN0cmVhbSAqLworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPDwgMjQgKSB8ICggcEJpdFN0cmVhbVsxXSA8PCAxNikgIHwgKHBCaXRTdHJlYW1bMl0gPDwgOCApIHwgKHBCaXRTdHJlYW1bM10pIDsKKyAgICBWYWx1ZSA9IChWYWx1ZSA8PCBPZmZzZXQgKSB8IChwQml0U3RyZWFtWzRdID4+ICg4LU9mZnNldCkpOworCisgICAgLyogQWR2YW5jZSBiaXRzdHJlYW0gcG9pbnRlciBieSBOIGJpdHMgKi8KKyAgICBPZmZzZXQgKz0gTjsKKyAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldD4+Myk7CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgJiA3OworCisgICAgLyogUmV0dXJuIE4gYml0cyAqLworICAgIHJldHVybiBWYWx1ZSA+PiAoMzItTik7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGFybUJ5dGVBbGlnbigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbGlnbiB0aGUgcG9pbnRlciAqcHBCaXRTdHJlYW0gdG8gdGhlIG5leHQgYnl0ZSBib3VuZGFyeQorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICAqcHBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKgorICogW291dF0gICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICAqcE9mZnNldAorICoKKyAqKi8KKyAKK09NWFZvaWQgYXJtQnl0ZUFsaWduKGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLE9NWF9JTlQgKnBPZmZzZXQpCit7CisgICAgaWYoKnBPZmZzZXQgPiAwKQorICAgIHsKKyAgICAgICAgKnBwQml0U3RyZWFtICs9IDE7CisgICAgICAgICpwT2Zmc2V0ID0gMDsKKyAgICB9ICAgIAorfQorCisvKiogCisgKiBGdW5jdGlvbjogYXJtU2tpcEJpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogU2tpcCBOIGJpdHMgZnJvbSB0aGUgdmFsdWUgYXQgKnBwQml0U3RyZWFtCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gICAgICpwcEJpdFN0cmVhbQorICogW2luXSAgICAgKnBPZmZzZXQKKyAqIFtpbl0gICAgIE4KKyAqCisgKiBbb3V0XSAgICAqcHBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICoqLworCisKK09NWFZvaWQgYXJtU2tpcEJpdHMoY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sT01YX0lOVCAqcE9mZnNldCxPTVhfSU5UIE4pCit7CisgICAgT01YX0lOVCBPZmZzZXQgPSAqcE9mZnNldDsKKyAgICBjb25zdCBPTVhfVTggKnBCaXRTdHJlYW0gPSAqcHBCaXRTdHJlYW07CisgICAKKyAgICAvKiBBZHZhbmNlIGJpdHN0cmVhbSBwb2ludGVyIGJ5IE4gYml0cyAqLworICAgIE9mZnNldCArPSBOOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW0gKyAoT2Zmc2V0Pj4zKTsKKyAgICAqcE9mZnNldCA9IE9mZnNldCAmIDc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRGVjb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1VblBhY2tWTEMzMigpCisgKgorICogRGVzY3JpcHRpb246CisgKiBWYXJpYWJsZSBsZW5ndGggZGVjb2RlIG9mIHZhcmlhYmxlIGxlbmd0aCBzeW1ib2wgKG1heCBzaXplIDMyIGJpdHMpIHJlYWQgZnJvbQorICogdGhlIGJpdCBzdHJlYW0gcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gYXQgKnBPZmZzZXQgYnkgdXNpbmcgdGhlIHRhYmxlCisgKiBwb2ludGVkIGJ5IHBDb2RlQm9vaworICogCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgICAgKnBCaXRTdHJlYW0KKyAqIFtpbl0gICAgICpwT2Zmc2V0CisgKiBbaW5dICAgICBwQ29kZUJvb2sKKyAqIAorICogW291dF0gICAgKnBCaXRTdHJlYW0KKyAqIFtvdXRdICAgICpwT2Zmc2V0CisgKgorICogUmV0dXJucyA6IENvZGUgQm9vayBJbmRleCBpZiBzdWNjZXNzZnVsbC4gCisgKiAgICAgICAgIDogQVJNX05PX0NPREVCT09LX0lOREVYID0gLTEgaWYgc2VhcmNoIGZhaWxzLgorICoqLworI2lmbmRlZiBDX09QVElNSVpFRF9JTVBMRU1FTlRBVElPTiAKKworT01YX1UxNiBhcm1VblBhY2tWTEMzMigKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwT2Zmc2V0LAorICAgIGNvbnN0IEFSTV9WTEMzMiAqcENvZGVCb29rCispCit7ICAgIAorICAgIGNvbnN0IE9NWF9VOCAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgT01YX0lOVCBJbmRleDsKKyAgICAgICAgCisgICAgYXJtQXNzZXJ0KE9mZnNldD49MCAmJiBPZmZzZXQ8PTcpOworCisgICAgLyogUmVhZCBuZXh0IDMyIGJpdHMgZnJvbSBzdHJlYW0gKi8KKyAgICBWYWx1ZSA9IChwQml0U3RyZWFtWzBdIDw8IDI0ICkgfCAoIHBCaXRTdHJlYW1bMV0gPDwgMTYpICB8IChwQml0U3RyZWFtWzJdIDw8IDggKSB8IChwQml0U3RyZWFtWzNdKSA7CisgICAgVmFsdWUgPSAoVmFsdWUgPDwgT2Zmc2V0ICkgfCAocEJpdFN0cmVhbVs0XSA+PiAoOC1PZmZzZXQpKTsKKworICAgIC8qIFNlYXJjaCB0aHJvdWdoIHRoZSBjb2RlYm9vayAqLyAgICAKKyAgICBmb3IgKEluZGV4PTA7IHBDb2RlQm9vay0+Y29kZUxlbiAhPSAwOyBJbmRleCsrKQorICAgIHsKKyAgICAgICAgaWYgKHBDb2RlQm9vay0+Y29kZVdvcmQgPT0gKFZhbHVlID4+ICgzMiAtIHBDb2RlQm9vay0+Y29kZUxlbikpKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgICAgICAgPSBPZmZzZXQgKyBwQ29kZUJvb2stPmNvZGVMZW47CisgICAgICAgICAgICAqcHBCaXRTdHJlYW0gPSBwQml0U3RyZWFtICsgKE9mZnNldCA+PiAzKSA7CisgICAgICAgICAgICAqcE9mZnNldCAgICAgPSBPZmZzZXQgJiA3OworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gSW5kZXg7CisgICAgICAgIH0gICAgICAgIAorICAgICAgICBwQ29kZUJvb2srKzsKKyAgICB9CisKKyAgICAvKiBObyBjb2RlIG1hdGNoIGZvdW5kICovCisgICAgcmV0dXJuIEFSTV9OT19DT0RFQk9PS19JTkRFWDsKK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpeGVkIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrQml0cworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGFjayBhIFZMQyBjb2RlIHdvcmQgaW50byB0aGUgYml0c3RyZWFtCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGJpdCBzdHJlYW0uCisgKiBbaW5dIHBPZmZzZXQgICAgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dIGNvZGVXb3JkICAgICAgICBDb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogW2luXSBjb2RlTGVuZ3RoICAgICAgTGVuZ3RoIG9mIHRoZSBjb2RlIHdvcmQgdmFsaWQgcmFuZ2UgMS4uLjMyCisgKgorICogW291dF0gcHBCaXRTdHJlYW0gICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdIHBCaXRPZmZzZXQgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhfUkVTVUxUIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisgCitPTVhSZXN1bHQgYXJtUGFja0JpdHMgKAorICAgIE9NWF9VOCAgKipwcEJpdFN0cmVhbSwgCisgICAgT01YX0lOVCAqcE9mZnNldCwKKyAgICBPTVhfVTMyIGNvZGVXb3JkLCAKKyAgICBPTVhfSU5UIGNvZGVMZW5ndGggCispCit7CisgICAgT01YX1U4ICAqcEJpdFN0cmVhbSA9ICpwcEJpdFN0cmVhbTsKKyAgICBPTVhfSU5UIE9mZnNldCA9ICpwT2Zmc2V0OworICAgIE9NWF9VMzIgVmFsdWU7CisgICAgICAgIAorICAgIC8qIGNoZWNraW5nIGFyZ3VtZW50IHZhbGlkaXR5ICovCisgICAgYXJtUmV0QXJnRXJySWYoT2Zmc2V0IDwgMCwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKE9mZnNldCA+IDcsIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihjb2RlTGVuZ3RoIDwgMSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGNvZGVMZW5ndGggPiAzMiwgT01YX1N0c19CYWRBcmdFcnIpOworCisgICAgLyogUHJlcGFyZSB0aGUgZmlyc3QgYnl0ZSAqLworICAgIGNvZGVXb3JkID0gY29kZVdvcmQgPDwgKDMyLWNvZGVMZW5ndGgpOworICAgIFZhbHVlID0gKHBCaXRTdHJlYW1bMF0gPj4gKDgtT2Zmc2V0KSkgPDwgKDgtT2Zmc2V0KTsKKyAgICBWYWx1ZSA9IFZhbHVlIHwgKGNvZGVXb3JkID4+ICgyNCtPZmZzZXQpKTsKKworICAgIC8qIFdyaXRlIG91dCB3aG9sZSBieXRlcyAqLworICAgIHdoaWxlICg4LU9mZnNldCA8PSBjb2RlTGVuZ3RoKQorICAgIHsKKyAgICAgICAgKnBCaXRTdHJlYW0rKyA9IChPTVhfVTgpVmFsdWU7CisgICAgICAgIGNvZGVXb3JkICAgPSBjb2RlV29yZCAgPDwgKDgtT2Zmc2V0KTsKKyAgICAgICAgY29kZUxlbmd0aCA9IGNvZGVMZW5ndGggLSAoOC1PZmZzZXQpOworICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICBWYWx1ZSA9IGNvZGVXb3JkID4+IDI0OworICAgIH0KKworICAgIC8qIFdyaXRlIG91dCBmaW5hbCBwYXJ0aWFsIGJ5dGUgKi8KKyAgICAqcEJpdFN0cmVhbSAgPSAoT01YX1U4KVZhbHVlOworICAgICpwcEJpdFN0cmVhbSA9IHBCaXRTdHJlYW07CisgICAgKnBPZmZzZXQgPSBPZmZzZXQgKyBjb2RlTGVuZ3RoOworICAgIAorICAgIHJldHVybiAgT01YX1N0c19Ob0VycjsKK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIGJpdCBsZW5ndGggRW5jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1QYWNrVkxDMzIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBhY2sgYSBWTEMgY29kZSB3b3JkIGludG8gdGhlIGJpdHN0cmVhbQorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCXBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSAKKyAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtLgorICogW2luXQlwQml0T2Zmc2V0CSAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgCisgKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIDcuCisgKiBbaW5dCSBjb2RlICAgICAJCVZMQyBjb2RlIHdvcmQgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGluIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKgorICogW291dF0gcHBCaXRTdHJlYW0JKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsCisgKgkgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdAorICoJCQkJCQlzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldAkJKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKyAqCQkJCQkJY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICoJCQkJCQkqcHBCaXRTdHJlYW0uCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YX1JFU1VMVCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworIAorT01YUmVzdWx0IGFybVBhY2tWTEMzMiAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sIAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgQVJNX1ZMQzMyIGNvZGUgCispCit7CisgICAgcmV0dXJuIChhcm1QYWNrQml0cyhwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgY29kZS5jb2RlV29yZCwgY29kZS5jb2RlTGVuKSk7Cit9CisKKy8qRW5kIG9mIEZpbGUqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3NyYy9hcm1DT01NX0lEQ1RUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmNWUyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fSURDVFRhYmxlLmMKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybUNPTU1fSURDVFRhYmxlLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAgIAorICogRmlsZTogYXJtQ09NTV9JRENUVGFibGUuYworICogQnJpZWY6IERlZmluZXMgVGFibGVzIHVzZWQgaW4gSURDVCBjb21wdXRhdGlvbgorICoKKyAqLworCisjaW5jbHVkZSAiYXJtQ09NTV9JRENUVGFibGUuaCIKKworICAgICAvKiAgVGFibGUgb2Ygcyh1KSpBKHUpKkEodikvMTYgYXQgUTE1CisgICAgICAqICBzKHUpPTEuMCAwIDw9IHUgPD0gNQorICAgICAgKiAgcyg2KT0yLjAKKyAgICAgICogIHMoNyk9NC4wCisgICAgICAqICBBKDApID0gMipzcXJ0KDIpCisgICAgICAqICBBKHUpID0gNCpjb3ModSpwaS8xNikgIGZvciAodSE9MCkKKwkgICovCisJICAKK19fYWxpZ24oNCkgY29uc3QgT01YX1UxNiBhcm1DT01NX0lEQ1RQcmVTY2FsZSBbNjRdID0KK3sKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDU4YzUsIDB4N2IyMSwgMHg3M2ZjLCAweDY4NjIsIDB4NThjNSwgMHg0NWJmLCAweDYwMTYsIDB4NjFmOCwKKyAgICAweDUzOWYsIDB4NzNmYywgMHg2ZDQxLCAweDYyNTQsIDB4NTM5ZiwgMHg0MWIzLCAweDVhODIsIDB4NWM0OCwKKyAgICAweDRiNDIsIDB4Njg2MiwgMHg2MjU0LCAweDU4N2UsIDB4NGI0MiwgMHgzYjIxLCAweDUxNzUsIDB4NTMwZCwKKyAgICAweDQwMDAsIDB4NThjNSwgMHg1MzlmLCAweDRiNDIsIDB4NDAwMCwgMHgzMjQ5LCAweDQ1NDYsIDB4NDZhMSwKKyAgICAweDMyNDksIDB4NDViZiwgMHg0MWIzLCAweDNiMjEsIDB4MzI0OSwgMHgyNzgyLCAweDM2NmQsIDB4Mzc3ZSwKKyAgICAweDIyYTMsIDB4MzAwYiwgMHgyZDQxLCAweDI4YmEsIDB4MjJhMywgMHgxYjM3LCAweDI1N2UsIDB4MjYzYSwKKyAgICAweDExYTgsIDB4MTg3ZSwgMHgxNzEyLCAweDE0YzMsIDB4MTFhOCwgMHgwZGUwLCAweDEzMWQsIDB4MTM3ZCAgICAKK307CisgICAgLyogQWJvdmUgYXJyYXkgYXJtQ09NTV9JRENUUHJlU2NhbGUsICBpbiBRMjMgZm9ybWF0ICovCitjb25zdCBPTVhfVTMyIGFybUNPTU1fSURDVFByZVNjYWxlVTMyIFs2NF0gPQoreworICAgIDB4NDAwMDAwLCAweDU4YzU0MywgMHg1MzllYmEsIDB4NGI0MThjLCAweDQwMDAwMCwgMHgzMjQ4ZDQsIDB4NDU0NWVhLCAweDQ2YTE1NywKKyAgICAweDU4YzU0MywgMHg3YjIwZDgsIDB4NzNmYmZjLCAweDY4NjIxNCwgMHg1OGM1NDMsIDB4NDViZjFmLCAweDYwMTVhNSwgMHg2MWY3OGIsCisgICAgMHg1MzllYmEsIDB4NzNmYmZjLCAweDZkNDEzZCwgMHg2MjUzYTYsIDB4NTM5ZWJhLCAweDQxYjMyOCwgMHg1YTgyN2EsIDB4NWM0ODY5LAorICAgIDB4NGI0MThjLCAweDY4NjIxNCwgMHg2MjUzYTYsIDB4NTg3ZGUzLCAweDRiNDE4YywgMHgzYjIwZDgsIDB4NTE3NGUwLCAweDUzMGQ2OSwKKyAgICAweDQwMDAwMCwgMHg1OGM1NDMsIDB4NTM5ZWJhLCAweDRiNDE4YywgMHg0MDAwMDAsIDB4MzI0OGQ0LCAweDQ1NDVlYSwgMHg0NmExNTcsCisgICAgMHgzMjQ4ZDQsIDB4NDViZjFmLCAweDQxYjMyOCwgMHgzYjIwZDgsIDB4MzI0OGQ0LCAweDI3ODIxZCwgMHgzNjZkNzIsIDB4Mzc3ZTZiLAorICAgIDB4MjJhMmY1LCAweDMwMGFkMywgMHgyZDQxM2QsIDB4MjhiYTcwLCAweDIyYTJmNSwgMHgxYjM2YjksIDB4MjU3ZDg2LCAweDI2Mzk4ZCwKKyAgICAweDExYTg1NiwgMHgxODdkZTMsIDB4MTcxMjFhLCAweDE0YzM1YSwgMHgxMWE4NTYsIDB4MGRkZjliLCAweDEzMWNjNywgMHgxMzdjYTIKK307CisgICAKK2NvbnN0IE9NWF9VMTYgYXJtQ09NTV9JRENUQ29lZiBbNF0gPQoreworICAgIDB4NWE4MiwgLyogSW52U3FydDIgKi8KKyAgICAweDMwZmMsIC8qIFNpblBJQnk4ICovCisgICAgMHg3NjQyLCAvKiBDb3NQSUJ5OCAqLworICAgIDB4MDAwMCAgICAKK307CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vc3JjL2FybUNPTU1fTWFza1RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDlmODhjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi9zcmMvYXJtQ09NTV9NYXNrVGFibGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1DT01NX01hc2tUYWJsZS5jCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIE1hc2sgVGFibGUgdG8gbWFzayB0aGUgZW5kIG9mIGFycmF5LgorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjZGVmaW5lIE1hc2tUYWJsZVNpemUgNzIKKworY29uc3QgT01YX1UxNiBhcm1DT01NX3FNYXNrVGFibGUxNltNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHgwMDAwLCAweDAwMDAsIAorICAgICAgICAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYgICAgCit9OworCitjb25zdCBPTVhfVTggYXJtQ09NTV9xTWFza1RhYmxlOFtNYXNrVGFibGVTaXplXSA9IAoreworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgCisgICAgICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsICAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgIAorICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAKKyAgICAgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgICAKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL2FybVZDLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzViNTEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkMuaApAQCAtMCwwICsxLDExNTMgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQy5oCisgKiBPcGVuTUFYIERMOiB2MS4wLjIKKyAqIFJldmlzaW9uOiAgIDEyMjkwCisgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKyAqIAorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIAorICoKKyAqIEZpbGU6IGFybVZpZGVvLmgKKyAqIEJyaWVmOiBEZWNsYXJlcyBBUEkncy9CYXNpYyBEYXRhIHR5cGVzIHVzZWQgYWNyb3NzIHRoZSBPcGVuTUFYIFZpZGVvIGRvbWFpbgorICoKKyAqLworCisKKyNpZm5kZWYgX2FybVZpZGVvX0hfCisjZGVmaW5lIF9hcm1WaWRlb19IXworCisjaW5jbHVkZSAib214VkMuaCIKKyNpbmNsdWRlICJhcm1DT01NX0JpdHN0cmVhbS5oIgorCisvKioKKyAqIEFSTSBzcGVjaWZpYyBzdGF0ZSBzdHJ1Y3R1cmUgdG8gaG9sZCBNb3Rpb24gRXN0aW1hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworIAorc3RydWN0IG00cDJfTUVTcGVjCit7CisgICAgT01YVkNNNFAyTUVQYXJhbXMgTUVQYXJhbXM7CisgICAgT01YVkNNNFAyTUVNb2RlICAgTUVNb2RlOworfTsKKworc3RydWN0IG00cDEwX01FU3BlYworeworICAgIE9NWFZDTTRQMTBNRVBhcmFtcyBNRVBhcmFtczsKKyAgICBPTVhWQ000UDEwTUVNb2RlICAgTUVNb2RlOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbTRwMl9NRVNwZWMgIEFSTVZDTTRQMl9NRVNwZWM7Cit0eXBlZGVmIHN0cnVjdCBtNHAxMF9NRVNwZWMgQVJNVkNNNFAxMF9NRVNwZWM7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9Db21wYXJlTVYKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNvbXBhcmlzaW9uIG9mIG1vdGlvbiB2ZWN0b3JzIGFuZCBTQUQncyB0byBkZWNpZGUgdGhlCisgKiBiZXN0IE1WIGFuZCBTQUQKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICAgICBtdlggICAgIHggY29vcmRpbmF0ZSBvZiB0aGUgY2FuZGlkYXRlIG1vdGlvbiB2ZWN0b3IKKyAqIFtpbl0gICAgIG12WSAgICAgeSBjb29yZGluYXRlIG9mIHRoZSBjYW5kaWRhdGUgbW90aW9uIHZlY3RvcgorICogW2luXSAgICAgY2FuZFNBRCBDYW5kaWRhdGUgU0FECisgKiBbaW5dICAgICBiZXN0TVZYIHggY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0TVZZIHkgY29vcmRpbmF0ZSBvZiB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yCisgKiBbaW5dICAgICBiZXN0U0FEIGJlc3QgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX0lOVCAtLSAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgc2FkIGlzIHRoZSBiZXN0CisgKiAgICAgICAgICAgIDAgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBOT1QgdGhlIGJlc3QgU0FECisgKi8KKworT01YX0lOVCBhcm1WQ000UDJfQ29tcGFyZU1WICgKKyAgICBPTVhfUzE2IG12WCwKKyAgICBPTVhfUzE2IG12WSwKKyAgICBPTVhfSU5UIGNhbmRTQUQsCisgICAgT01YX1MxNiBiZXN0TVZYLAorICAgIE9NWF9TMTYgYmVzdE1WWSwKKyAgICBPTVhfSU5UIGJlc3RTQUQpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQUNEQ1ByZWRpY3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFkYXB0aXZlIERDL0FDIGNvZWZmaWNpZW50IHByZWRpY3Rpb24gZm9yIGFuIGludHJhIGJsb2NrLiBQcmlvcgorICogdG8gdGhlIGZ1bmN0aW9uIGNhbGwsIHByZWRpY3Rpb24gZGlyZWN0aW9uIChwcmVkRGlyKSBzaG91bGQgYmUgc2VsZWN0ZWQKKyAqIGFzIHNwZWNpZmllZCBpbiBzdWJjbGF1c2UgNy40LjMuMSBvZiBJU08vSUVDIDE0NDk2LTIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwU3JjRHN0ICAgICBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcXVhbnRpemVkIGNvZWZmaWNpZW50IHJlc2lkdWFscyAoUFFGKSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJsb2NrCisgKiBbaW5dIHBQcmVkQnVmUm93IHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXIKKyAqIFtpbl0gcFByZWRCdWZDb2wgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlcgorICogW2luXSBjdXJRUCAgICAgICBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGJsb2NrLiBjdXJRUAorICogICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBlcXVhbCB0byBwcmVkUVAgZXNwZWNpYWxseSB3aGVuIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgYW5kIHRoZSBwcmVkaWN0b3IgYmxvY2sgYXJlIGluIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jay4KKyAqIFtpbl0gcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbaW5dIHByZWREaXIgICAgIGluZGljYXRlcyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24gd2hpY2ggdGFrZXMgb25lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX0hPUklaT05UQUwgICAgcHJlZGljdCBob3Jpem9udGFsbHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBwcmVkaWN0IHZlcnRpY2FsbHkKKyAqIFtpbl0gQUNQcmVkRmxhZyAgYSBmbGFnIGluZGljYXRpbmcgaWYgQUMgcHJlZGljdGlvbiBzaG91bGQgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtZWQuIEl0IGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIHN5bnRheCBvZiBNUEVHLTQKKyAqIFtpbl0gdmlkZW9Db21wICAgdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSwgY2hyb21pbmFuY2Ugb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gZmxhZyAgICAgICAgVGhpcyBmbGFnIGRlZmluZXMgdGhlIGlmIG9uZSB3YW50cyB0byB1c2UgdGhpcyBmdW5jdGlvbnMgdG8KKyAqICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlIFBRRiAoc2V0IDEsIHByZWRpY3Rpb24pIG9yIFFGIChzZXQgMCwgcmVjb25zdHJ1Y3Rpb24pCisgKiBbb3V0XSAgICBwUHJlQUNQcmVkaWN0ICAgcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIGNvZWZmaWNpZW50cyBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbGVkIE9OTFkgaWYgaXQgaXMgbm90IE5VTEwKKyAqIFtvdXRdICAgIHBTcmNEc3QgICAgIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGljaCBjb250YWlucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBxdWFudGl6ZWQgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaworICogW291dF0gICAgcFByZWRCdWZSb3cgcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyCisgKiBbb3V0XSAgICBwUHJlZEJ1ZkNvbCBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIKKyAqIFtvdXRdICAgIHBTdW1FcnIgICAgIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgc3VtIG9mIHRoZSBkaWZmZXJlbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgdW5wcmVkaWN0ZWQgY29lZmZpY2llbnRzCisgKiAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwsIGRvIG5vdCB1cGRhdGUKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9BQ0RDUHJlZGljdCgKKyAgICAgT01YX1MxNiAqIHBTcmNEc3QsCisgICAgIE9NWF9TMTYgKiBwUHJlQUNQcmVkaWN0LAorICAgICBPTVhfUzE2ICogcFByZWRCdWZSb3csCisgICAgIE9NWF9TMTYgKiBwUHJlZEJ1ZkNvbCwKKyAgICAgT01YX0lOVCBjdXJRUCwKKyAgICAgT01YX0lOVCBwcmVkUVAsCisgICAgIE9NWF9JTlQgcHJlZERpciwKKyAgICAgT01YX0lOVCBBQ1ByZWRGbGFnLAorICAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCAgdmlkZW9Db21wLAorICAgICBPTVhfVTggZmxhZywKKyAgICAgT01YX0lOVCAqcFN1bUVycgorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1NldFByZWREaXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGRldGVjdGluZyB0aGUgcHJlZGljdGlvbiBkaXJlY3Rpb24KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIGJsb2NrSW5kZXggIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFzIGRlZmluZWQgaW4gc3ViY2xhdXNlIDYuMS4zLjgsIG9mIElTTy9JRUMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5Ni0yLiBGdXJ0aGVybW9yZSwgaW5kZXhlcyA2IHRvIDkgaW5kaWNhdGUgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgYmxvY2tzIHNwYXRpYWxseSBjb3JyZXNwb25kaW5nIHRvIGx1bWluYW5jZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcyAwIHRvIDMgaW4gdGhlIHNhbWUgbWFjcm9ibG9jay4KKyAqIFtpbl0gcENvZWZCdWZSb3cgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcgorICogW2luXSBwUXBCdWYgICAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlcgorICogW291dF0gICAgcHJlZFFQICAgICAgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcHJlZGljdG9yIGJsb2NrCisgKiBbb3V0XSAgICBwcmVkRGlyICAgICBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIHByZWRpY3QgaG9yaXpvbnRhbGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1ZJREVPX1ZFUlRJQ0FMICAgICAgcHJlZGljdCB2ZXJ0aWNhbGx5CisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfU2V0UHJlZERpcigKKyAgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICAgT01YX1MxNiAqcENvZWZCdWZDb2wsCisgICAgIE9NWF9JTlQgKnByZWREaXIsCisgICAgIE9NWF9JTlQgKnByZWRRUCwKKyAgICAgY29uc3QgT01YX1U4ICpwUXBCdWYKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHppZ3phZyBzY2FubmluZyBhbmQgVkxDIGVuY29kaW5nIGZvciBvbmUgaW50cmEgYmxvY2suCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSBwcEJpdFN0cmVhbSAgICAgcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dIHBCaXRPZmZzZXQgICAgICBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuCisgKiBbaW5dIHBRRGN0QmxrQ29lZiAgICBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50CisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiwgd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHppZ3phZyBzY2FuIHBhdHRlcm4uIFRoaXMgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgICAgICAgICBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9WSURFT19IT1JJWk9OVEFMICAgIEhvcml6b250YWwgcHJlZGljdGlvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWcgc2Nhbi4KKyAqIFtpbl0gcGF0dGVybiAgICAgICAgIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJsb2NrIGlzIGVuY29kZWQKKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlci4KKyAqIFtvdXRdICAgIHBCaXRPZmZzZXQgICAgICAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmEoCisgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgICBjb25zdCBPTVhfUzE2ICpwUURjdEJsa0NvZWYsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfVTggcGF0dGVybiwKKyAgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorICAgICBPTVhfVTggc3RhcnQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBmb3Igb25lIGludHJhIGNvZGVkIGJsb2NrLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcHBCaXRTdHJlYW0gICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICogW2luXSBwQml0T2Zmc2V0ICAgICAgcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYnkgKnBwQml0U3RyZWFtLiAqcEJpdE9mZnNldCBpcyB2YWxpZCB3aXRoaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAtN10uCisgKiBbaW5dIHByZWREaXIgICAgICAgICBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgemlnemFnIHNjYW4gcGF0dGVybi4gSXQgdGFrZXMgb25lIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fTk9ORSAgQUMgcHJlZGljdGlvbiBub3QgdXNlZDsKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gY2xhc3NpY2FsIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fSE9SSVpPTlRBTCAgICBIb3Jpem9udGFsIHByZWRpY3Rpb247CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm0gYWx0ZXJuYXRlLXZlcnRpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppZ3phZyBzY2FuOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfVklERU9fVkVSVElDQUwgICAgICBWZXJ0aWNhbCBwcmVkaWN0aW9uOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVzIHBlcmZvcm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlLWhvcml6b250YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlnemFnIHNjYW4uCisgKiBbaW5dIHZpZGVvQ29tcCAgICAgICB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSkgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAwdGggZWxlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgb3IgMXN0LgorICogW291dF0gICAgcHBCaXRTdHJlYW0gICAgICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW291dF0gICAgcEJpdE9mZnNldCAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtCisgKiBbb3V0XSAgICBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suIFNob3VsZCBiZSAzMi1iaXQgYWxpZ25lZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCitPTVhSZXN1bHQgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYSgKKyAgICAgY29uc3QgT01YX1U4ICoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgT01YX1MxNiAqIHBEc3QsCisgICAgIE9NWF9VOCBwcmVkRGlyLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsIAorICAgICBPTVhfVTggIHN0YXJ0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMREJ1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgZmlsbGluZyBvZiB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgcnVuLCBsZXZlbAorICogYW5kIHNpZ24sIGFsc28gdXBkYXRlcyB0aGUgaW5kZXgKKyAqIAorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gIHN0b3JlUnVuICAgICAgICBTdG9yZWQgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgICAKKyAqIFtpbl0gIHN0b3JlTGV2ZWwgICAgICBTdG9yZWQgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKQorICogW2luXSAgc2lnbiAgICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyB0aGUgc2lnbiBvZiBsZXZlbAorICogW2luXSAgbGFzdCAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgbGFzdCBmbGFnCisgKiBbaW5dICBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byBjb2VmZmljaWVudCBpbmRleCBpbiA4eDggbWF0cml4CisgKiBbb3V0XSBwSW5kZXggICAgICAgICAgcG9pbnRlciB0byB1cGRhdGVkIGNvZWZmaWNpZW50IGluZGV4IGluIDh4OCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgKKyAqIFtpbl0gIHBaaWd6YWdUYWJsZSAgICBwb2ludGVyIHRvIHRoZSB6aWd6YWcgdGFibGVzCisgKiBbb3V0XSBwRHN0ICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICBibG9jay4gU2hvdWxkIGJlIDMyLWJpdCBhbGlnbmVkCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyKAorICAgIE9NWF9VMzIgc3RvcmVSdW4sCisgICAgT01YX1MxNiAqIHBEc3QsCisgICAgT01YX1MxNiBzdG9yZUxldmVsLAorICAgIE9NWF9VOCAgc2lnbiwKKyAgICBPTVhfVTggIGxhc3QsCisgICAgT01YX1U4ICAqIGluZGV4LAorICAgIGNvbnN0IE9NWF9VOCAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX0dldFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGVzY2FwZSBtb2RlIGRlY2lzaW9uIGJhc2VkIG9uIHRoZSBydW4sIHJ1bissIGxldmVsLCBsZXZlbCsgYW5kIAorICogbGFzdCBjb21iaW5hdGlvbnMuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkJCQkJCQkJdGhlIGJpdCBzdHJlYW0KKyAqIFtpbl0JcEJpdE9mZnNldAkJcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQlieSAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcKKyAqIFtpbl0gc2hvcnRWaWRlb0hlYWRlciBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiBzaG9ydFZpZGVvSGVhZGVyPT0wLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MS4KKyAqIFtpbl0gc3RhcnQgICAgICAgICAgIHN0YXJ0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBlbmNvZGluZyBiZWdpbnMgd2l0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbi9vdXRdIHBMYXN0ICAgICAgIHBvaW50ZXIgdG8gbGFzdCBzdGF0dXMgZmxhZworICogW2luXSBydW5CZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgICAgVGhlIHJ1biB2YWx1ZSBmcm9tIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiBsYXN0ID09IDAKKyAqIFtpbl0gSW5kZXhCZWdpblNpbmdsZUxldmVsRW50cmllc0wwICAgIEFycmF5IGluZGV4IGluIHRoZSBWTEMgdGFibGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGUgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCAKKyAqIFtpbl0gcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICAgIFRoZSBydW4gdmFsdWUgZnJvbSB3aGljaCBsZXZlbCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogbGFzdCA9PSAxCisgKiBbaW5dIEluZGV4QmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMSAgICBBcnJheSBpbmRleCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhlICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZ2luU2luZ2xlTGV2ZWxFbnRyaWVzTDAgCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlTDAgICAgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gcFZsY1RhYmxlTDAgICAgICAgICBWTEMgdGFibGUgZm9yIGxhc3QgPT0gMAorICogW2luXSBwUnVuSW5kZXhUYWJsZUwxICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBWbGNUYWJsZUwxICAgICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gcExNQVhUYWJsZUwwICAgICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSBwTE1BWFRhYmxlTDEgICAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dIHBSTUFYVGFibGVMMCAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAwCisgKiBbaW5dIHBSTUFYVGFibGVMMSAgICAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XXBEc3QJCQkgICAgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQKKyAqCQkJCQkJCWJsb2NrLiBTaG91bGQgYmUgMzItYml0IGFsaWduZWQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9HZXRWTENCaXRzICgKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorCQkJICBPTVhfUzE2ICogcERzdCwKKwkJCSAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyLAorCQkJICBPTVhfVTggICAgc3RhcnQsCQkJICAKKwkJCSAgT01YX1U4ICAqIHBMYXN0LAorCQkJICBPTVhfVTggICAgcnVuQmVnaW5TaW5nbGVMZXZlbEVudHJpZXNMMCwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDAsCisJCQkgIE9NWF9VOCAgICBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXNMMSwKKwkJCSAgT01YX1U4ICAgIG1heEluZGV4Rm9yTXVsdGlwbGVFbnRyaWVzTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUnVuSW5kZXhUYWJsZUwwLAorICAgICAgICAgICAgICBjb25zdCBBUk1fVkxDMzIgKnBWbGNUYWJsZUwwLAorCQkJICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBMTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBSTUFYVGFibGVMMSwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqIHBaaWd6YWdUYWJsZQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1B1dFZMQ0JpdHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENoZWNrcyB0aGUgdHlwZSBvZiBFc2NhcGUgTW9kZSBhbmQgcHV0IGVuY29kZWQgYml0cyBmb3IgCisgKiBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbSAgICAgIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbgorICoJCQkJCQkgIHRoZSBiaXQgc3RyZWFtCisgKiBbaW5dCSBwQml0T2Zmc2V0ICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICpwcEJpdFN0cmVhbS4gVmFsaWQgd2l0aGluIDAgdG8gNworICogW2luXSBzaG9ydFZpZGVvSGVhZGVyIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIHNob3J0VmlkZW9IZWFkZXI9PTAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0xLgorICogW2luXSAgc3RhcnQgICAgICAgICAgICBzdGFydCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5jb2RpbmcgYmVnaW5zIHdpdGggCisgKiAgICAgICAgICAgICAgICAgICAgICAgIDB0aCBlbGVtZW50IG9yIDFzdC4KKyAqIFtpbl0gIG1heFN0b3JlUnVuTDAgICAgTWF4IHN0b3JlIHBvc3NpYmxlIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGxhc3QgPSAwCisgKiBbaW5dICBtYXhTdG9yZVJ1bkwxICAgIE1heCBzdG9yZSBwb3NzaWJsZSAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsYXN0ID0gMQorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMAorICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzTDEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZXF1YWwgdG8gMTogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpIGZvciBsYXN0ID0gMQorICogW2luXSAgcFJ1bkluZGV4VGFibGVMMCBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBWbGNUYWJsZUwwICAgICAgVkxDIHRhYmxlIGZvciBsYXN0ID09IDAKKyAqIFtpbl0gIHBSdW5JbmRleFRhYmxlTDEgUnVuIEluZGV4IHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwVmxjVGFibGVMMSAgICAgIFZMQyB0YWJsZSBmb3IgbGFzdCA9PSAxCisgKiBbaW5dICBwTE1BWFRhYmxlTDAgICAgIExldmVsIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcExNQVhUYWJsZUwxICAgICBMZXZlbCBNQVggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5jIGZvciBsYXN0ID09IDEKKyAqIFtpbl0gIHBSTUFYVGFibGVMMCAgICAgUnVuIE1BWCB0YWJsZSBkZWZpbmVkIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmMgZm9yIGxhc3QgPT0gMAorICogW2luXSAgcFJNQVhUYWJsZUwxICAgICBSdW4gTUFYIHRhYmxlIGRlZmluZWQgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYyBmb3IgbGFzdCA9PSAxCisgKiBbb3V0XSBwUURjdEJsa0NvZWYgICAgIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQKKyAqIFtvdXRdIHBwQml0U3RyZWFtICAgICAgKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuCisgKiBbb3V0XSBwQml0T2Zmc2V0ICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorICoKKyAqLworCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUHV0VkxDQml0cyAoCisgICAgICAgICAgICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgICAgICAgICAgICBPTVhfSU5UICogcEJpdE9mZnNldCwKKyAgICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgICAgICAgICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgICAgICAgICAgIE9NWF9VOCBzdGFydCwKKyAgICAgICAgICAgICAgT01YX1U4IG1heFN0b3JlUnVuTDAsCisgICAgICAgICAgICAgIE9NWF9VOCBtYXhTdG9yZVJ1bkwxLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wwLAorICAgICAgICAgICAgICBPTVhfVTggIG1heFJ1bkZvck11bHRpcGxlRW50cmllc0wxLAorICAgICAgICAgICAgICBjb25zdCBPTVhfVTggICogcFJ1bkluZGV4VGFibGVMMCwKKyAgICAgICAgICAgICAgY29uc3QgQVJNX1ZMQzMyICpwVmxjVGFibGVMMCwKKwkJCSAgY29uc3QgT01YX1U4ICAqIHBSdW5JbmRleFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwTE1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDAsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwUk1BWFRhYmxlTDEsCisgICAgICAgICAgICAgIGNvbnN0IE9NWF9VOCAgKiBwWmlnemFnVGFibGUKKyk7CisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfRmlsbFZMQ0J1ZmZlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgY2FsY3VsYXRpbmcgdGhlIFZMQyBiaXRzIGRlcGVuZGluZyBvbiB0aGUgZXNjYXBlIHR5cGUgYW5kIGluc2VydCAKKyAqIHRoZSBzYW1lIGluIHRoZSBiaXRzdHJlYW0KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCSBwcEJpdFN0cmVhbQkJcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluCisgKgkgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0IHN0cmVhbQorICogW2luXQkgcEJpdE9mZnNldCAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3CisgKiBbaW5dICBydW4gICAgICAgICAgICAgICAgUnVuIHZhbHVlIChjb3VudCBvZiB6ZXJvcykgdG8gYmUgZW5jb2RlZCAgCisgKiBbaW5dICBsZXZlbCAgICAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dICBydW5QbHVzICAgICAgICAgICAgQ2FsY3VsYXRlZCBhcyBydW5QbHVzID0gcnVuIC0gKFJNQVggKyAxKSAgCisgKiBbaW5dICBsZXZlbFBsdXMgICAgICAgICAgQ2FsY3VsYXRlZCBhcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dICBmTW9kZSAgICAgICAgICAgICAgRmxhZyBpbmRpY2F0aW5nIHRoZSBlc2NhcGUgbW9kZXMKKyAqIFtpbl0gIGxhc3QgICAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGxhc3QgZmxhZworICogW2luXSAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW4gdmFsdWUgYWZ0ZXIgd2hpY2ggbGV2ZWwgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc2lkZXJpbmcgbGFzdCBhbmQgaW50ZXIvaW50cmEgc3RhdHVzKQorICogW2luXSAgcFJ1bkluZGV4VGFibGUgICAgIFJ1biBJbmRleCB0YWJsZSBkZWZpbmVkIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbaW5dICBwVmxjVGFibGUgICAgICAgICAgVkxDIHRhYmxlIGRlZmluZWQgaW4gYXJtVkNNNFAyX0h1ZmZfdGFibGVzX1ZMQy5oCisgKiBbb3V0XSBwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVyLgorICogW291dF0gcEJpdE9mZnNldCAgICAgICAgICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieQorICogICAgICAgICAgICAgICAgICAgICAgICAgICpwcEJpdFN0cmVhbS4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMl9GaWxsVkxDQnVmZmVyICgKKyAgICAgICAgICAgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgICAgICAgICAgIE9NWF9JTlQgKiBwQml0T2Zmc2V0LAorICAgICAgICAgICAgICBPTVhfVTMyIHJ1biwKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbCwgCisJCQkgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgICAgICAgICAgT01YX1MxNiBsZXZlbFBsdXMsIAorICAgICAgICAgICAgICBPTVhfVTggIGZNb2RlLAorCQkJICBPTVhfVTggIGxhc3QsCisgICAgICAgICAgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLCAKKyAgICAgICAgICAgICAgY29uc3QgT01YX1U4ICAqcFJ1bkluZGV4VGFibGUsCisgICAgICAgICAgICAgIGNvbnN0IEFSTV9WTEMzMiAqcFZsY1RhYmxlCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQ2hlY2tWTENFc2NhcGVNb2RlCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBlc2NhcGUgbW9kZSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgcnVuLCBydW4rLCBsZXZlbCwgbGV2ZWwrIGFuZCAKKyAqIGxhc3QgY29tYmluYXRpb25zLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0gcnVuICAgICAgICAgICAgIFJ1biB2YWx1ZSAoY291bnQgb2YgemVyb3MpIHRvIGJlIGVuY29kZWQgIAorICogW2luXSBsZXZlbCAgICAgICAgICAgTGV2ZWwgdmFsdWUgKG5vbi16ZXJvIHZhbHVlKSB0byBiZSBlbmNvZGVkCisgKiBbaW5dIHJ1blBsdXMgICAgICAgICBDYWxjdWxhdGVkIGFzIHJ1blBsdXMgPSBydW4gLSAoUk1BWCArIDEpICAKKyAqIFtpbl0gbGV2ZWxQbHVzICAgICAgIENhbGN1bGF0ZWQgYXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFBsdXMgPSBzaWduKGxldmVsKSpbYWJzKGxldmVsKSAtIExNQVhdCisgKiBbaW5dIG1heFN0b3JlUnVuICAgICBNYXggc3RvcmUgcG9zc2libGUgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhKQorICogW2luXSBtYXhSdW5Gb3JNdWx0aXBsZUVudHJpZXMgCisgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcnVuIHZhbHVlIGFmdGVyIHdoaWNoIGxldmVsIAorICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlcXVhbCB0byAxOiAKKyAqICAgICAgICAgICAgICAgICAgICAgIChjb25zaWRlcmluZyBsYXN0IGFuZCBpbnRlci9pbnRyYSBzdGF0dXMpCisgKiBbaW5dIHNob3J0VmlkZW9IZWFkZXIgYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgc2hvcnRWaWRlb0hlYWRlcj09MCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIHNob3J0VmlkZW9IZWFkZXI9PTEuCisgKiBbaW5dIHBSdW5JbmRleFRhYmxlICBSdW4gSW5kZXggdGFibGUgZGVmaW5lZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgIGFybVZDTTRQMl9IdWZmX1RhYmxlc19WTEMuYworICogICAgICAgICAgICAgICAgICAgICAgKGNvbnNpZGVyaW5nIGxhc3QgYW5kIGludGVyL2ludHJhIHN0YXR1cykKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAKKyAqIFJldHVybiBWYWx1ZToKKyAqIFJldHVybnMgYW4gRXNjYXBlIG1vZGUgd2hpY2ggY2FuIHRha2UgdmFsdWVzIGZyb20gMCB0byAzCisgKiAwIC0tPiBubyBlc2NhcGUgbW9kZSwgMSAtLT4gZXNjYXBlIHR5cGUgMSwKKyAqIDEgLS0+IGVzY2FwZSB0eXBlIDIsIDMgLS0+IGVzY2FwZSB0eXBlIDMsIGNoZWNrIHNlY3Rpb24gNy40LjEuMworICogaW4gdGhlIE1QRUcgSVNPIHN0YW5kYXJkLgorICoKKyAqLworCitPTVhfVTggYXJtVkNNNFAyX0NoZWNrVkxDRXNjYXBlTW9kZSgKKyAgICAgT01YX1UzMiBydW4sCisgICAgIE9NWF9VMzIgcnVuUGx1cywKKyAgICAgT01YX1MxNiBsZXZlbCwKKyAgICAgT01YX1MxNiBsZXZlbFBsdXMsCisgICAgIE9NWF9VOCAgbWF4U3RvcmVSdW4sCisgICAgIE9NWF9VOCAgbWF4UnVuRm9yTXVsdGlwbGVFbnRyaWVzLAorICAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgIGNvbnN0IE9NWF9VOCAgKnBSdW5JbmRleFRhYmxlCispOworCisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMl9CbG9ja01hdGNoX0ludGVnZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIAorICogQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgdXNpbmcgaGFsZi1waXhlbCB1bml0cywgYW5kIAorICogdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgcmVxdWlyZWQsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2ggdGhlIAorICogaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVpdGhlciBnZW5lcmF0ZSBvdXRwdXQgTVZzIG9yIGV4cGVjdCAKKyAqIGlucHV0IE1WcyByZXByZXNlbnRlZCB1c2luZyBpbnRlZ2VyIHBpeGVsIHVuaXRzLiAKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBTcmNSZWZCdWYJCXBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSBNQiB0aGF0IAorICogICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICAgICAgICAgIHBsYW5lLgorICogW2luXQlyZWZXaWR0aAkJICB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lCisgKiBbaW5dCXBSZWZSZWN0CQkgIHBvaW50ZXIgdG8gdGhlIHZhbGlkIHJlY3Rhbmd1bGFyIGluIHJlZmVyZW5jZSBwbGFuZS4gUmVsYXRpdmUgdG8gaW1hZ2Ugb3JpZ2luLiAKKyAqICAgICAgICAgICAgICAgICAgICBJdCdzIG5vdCBsaW1pdGVkIHRvIHRoZSBpbWFnZSBib3VuZGFyeSwgYnV0IGRlcGVuZGVkIG9uIHRoZSBwYWRkaW5nLiBGb3IgZXhhbXBsZSwgCisgKiAgICAgICAgICAgICAgICAgICAgaWYgeW91IHBhZCA0IHBpeGVscyBvdXRzaWRlIHRoZSBpbWFnZSBib3JkZXIsIHRoZW4gdGhlIHZhbHVlIGZvciBsZWZ0IGJvcmRlciAKKyAqICAgICAgICAgICAgICAgICAgICBjYW4gYmUgLTQKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAKKyAqICAgICAgICAgICAgICAgICAgICAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgKiBbaW5dIHBDdXJyUG9pbnRQb3MJcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZQorICogW2luXSBwU3JjUHJlTVYJCSAgcG9pbnRlciB0byBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcjsgTlVMTCBpbmRpY2F0ZXMgbm8gcHJlZGljdGVkIE1WCisgKiBbaW5dIHBTcmNQcmVTQUQJCXBvaW50ZXIgdG8gU0FEIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZGljdGVkIE1WIChyZWZlcmVuY2VkIGJ5IHBTcmNQcmVNVikKKyAqIFtpbl0gc2VhcmNoUmFuZ2UJCXNlYXJjaCByYW5nZSBmb3IgMTZYMTYgaW50ZWdlciBibG9jayx0aGUgdW5pdHMgb2YgaXQgaXMgZnVsbCBwaXhlbCx0aGUgc2VhcmNoIHJhbmdlIAorICogICAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGluIGFsbCBkaXJlY3Rpb25zLkl0IGlzIGluIGluY2x1c2l2ZSBvZiB0aGUgYm91bmRhcnkgYW5kIHNwZWNpZmllZCBpbiAKKyAqICAgICAgICAgICAgICAgICAgICB0ZXJtcyBvZiBpbnRlZ2VyIHBpeGVsIHVuaXRzLgorICogW2luXSBwTUVTcGVjCQkJICB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKKyAqICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhlIGJsb2NrIG1hdGNoaW5nIAorICogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogW2luXSBCbG9ja1NpemUgICAgIE1hY3JvQmxvY2sgU2l6ZSBpLmUgZWl0aGVyIDE2eDE2IG9yIDh4OC4KKyAqIFtvdXRdCXBEc3RNVgkJCXBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WCisgKiBbb3V0XQlwRHN0U0FECQkJcG9pbnRlciB0byBtaW5pbXVtIFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE9NWF9TdHNfTm9FcnIgqEMgbm8gZXJyb3IuCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY1ByZU1WLAorICAgICBjb25zdCBPTVhfSU5UICpwU3JjUHJlU0FELAorICAgICB2b2lkICpwTUVTcGVjLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIDE2eDE2IGJsb2NrIG1hdGNoIHdpdGggaGFsZi1waXhlbCByZXNvbHV0aW9uLiAgUmV0dXJucyB0aGUgZXN0aW1hdGVkIAorICogbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIHRoZSBoYWxmLXBpeGVsIAorICogbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciByZWZlcmVuY2VkIAorICogYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIHRoZSBpbml0aWFsIGludGVnZXIgTVYgaXMgZ2VuZXJhdGVkIAorICogZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIHBTcmNSZWZCdWYgYW5kIHBTZWFyY2hQb2ludFJlZlBvcyBzaG91bGQgYmUgCisgKiBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIDE2eDE2IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzE2eDE2LiAgCisgKiBUaGUgZnVuY3Rpb24gQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY1JlZkJ1ZgkJcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIE1CIAorICogICAgICAgICAgICAgICAgICAgIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gCisgKiAgICAgICAgICAgICAgICAgICAgdGhlCWN1cnJlbnQgcGxhbmUuCisgKiBbaW5dCXJlZldpZHRoCQkgIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUKKyAqIFtpbl0JcFJlZlJlY3QJCSAgcmVmZXJlbmNlIHBsYW5lIHZhbGlkIHJlZ2lvbiByZWN0YW5nbGUKKyAqIFtpbl0JcFNyY0N1cnJCdWYJCXBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBleHRyYWN0ZWQgZnJvbSBvcmlnaW5hbCBwbGFuZSAKKyAqICAgICAgICAgICAgICAgICAgICAobGluZWFyIGFycmF5LCAyNTYgZW50cmllcyk7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogW2luXQlwU2VhcmNoUG9pbnRSZWZQb3MJcG9zaXRpb24gb2YgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBoYWxmIHBpeGVsIHNlYXJjaCAoc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSByZWZlcmVuY2UgcGxhbmUuCisgKiBbaW5dCXJuZFZhbAkJCSAgcm91bmRpbmcgY29udHJvbCBiaXQgZm9yIGhhbGYgcGl4ZWwgbW90aW9uIGVzdGltYXRpb247IAorICogICAgICAgICAgICAgICAgICAgIDA9cm91bmRpbmcgY29udHJvbCBkaXNhYmxlZDsgMT1yb3VuZGluZyBjb250cm9sIGVuYWJsZWQKKyAqIFtpbl0JcFNyY0RzdE1WCQlwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIGR1cmluZyBhIHByaW9yIAorICogICAgICAgICAgICAgICAgICAxNlgxNiBpbnRlZ2VyIHNlYXJjaCBhbmQgaXRzIHVuaXQgaXMgaGFsZiBwaXhlbC4KKyAqIFtpbl0gQmxvY2tTaXplICAgICBNYWNyb0Jsb2NrIFNpemUgaS5lIGVpdGhlciAxNngxNiBvciA4eDguCisgKiBbb3V0XXBTcmNEc3RNVgkJcG9pbnRlciB0byBlc3RpbWF0ZWQgTVYKKyAqIFtvdXRdcERzdFNBRAkJCXBvaW50ZXIgdG8gbWluaW11bSBTQUQKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIKhDIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciCoQyBiYWQgYXJndW1lbnRzCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfQmxvY2tNYXRjaF9IYWxmKAorICAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgIE9NWF9JTlQgcm5kVmFsLAorICAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0RzdE1WLAorICAgICBPTVhfSU5UICpwRHN0U0FELAorICAgICBPTVhfVTggQmxvY2tTaXplCispOworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAyX1BhZE1WCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gdmVjdG9yIHBhZGRpbmcgZm9yIGEgbWFjcm9ibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dIHBTcmNEc3RNViAgICAgICBwb2ludGVyIHRvIG1vdGlvbiB2ZWN0b3IgYnVmZmVyIG9mIHRoZSBjdXJyZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvYmxvY2sKKyAqIFtpbl0gcFRyYW5zcCAgICAgICAgIHBvaW50ZXIgdG8gdHJhbnNwYXJlbnQgc3RhdHVzIGJ1ZmZlciBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBbb3V0XSAgICBwU3JjRHN0TVYgICAgICAgcG9pbnRlciB0byBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgaGF2ZSBiZWVuIHBhZGRlZAorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBhcm1WQ000UDJfUGFkTVYoCisgICAgIE9NWFZDTW90aW9uVmVjdG9yICogcFNyY0RzdE1WLAorICAgICBPTVhfVTggKiBwVHJhbnNwCispOworCisvKiAKKyAqIEguMjY0IFNwZWNpZmljIERlY2xhcmF0aW9ucyAKKyAqLworLyogRGVmaW5lcyAqLworI2RlZmluZSBBUk1fTTRQMTBfUV9PRkZTRVQgICAgICAgICgxNSkKKworCisvKiBEZXF1YW50IHRhYmxlcyAqLworCitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0WzE2XTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDJbNF07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfVk1hdHJpeFs2XVszXTsKK2V4dGVybiBjb25zdCBPTVhfVTMyIGFybVZDTTRQMTBfTUZNYXRyaXhbNl1bM107CisKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHRoZSB3b3JrIHJlcXVpcmVkIGJ5IHRoZSBPcGVuTUFYCisgKiBEZWNvZGVDb2VmZnNUb1BhaXIgZnVuY3Rpb24gYW5kIERlY29kZUNocm9tYURDQ29lZmZzVG9QYWlyLgorICogU2luY2UgbW9zdCBvZiB0aGUgY29kZSBpcyBjb21tb24gd2Ugc2hhcmUgaXQgaGVyZS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcEJpdFN0cmVhbQkJRG91YmxlIHBvaW50ZXIgdG8gY3VycmVudCBieXRlIGluIGJpdCBzdHJlYW0gYnVmZmVyCisgKiBbaW5dCXBPZmZzZXQJCQlQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQKKyAqCQkJCQkJCQl0byBieSAqcHBCaXRTdHJlYW0KKyAqIFtpbl0Jc01heE51bUNvZWZmCU1heGltdW0gbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBpbiBjdXJyZW50CisgKgkJCQkJCQkJYmxvY2sgKDQsMTUgb3IgMTYpCisgKiBbaW5dCW5UYWJsZSAgICAgICAgICBUYWJsZSBudW1iZXIgKDAgdG8gNCkgYWNjb3JkaW5nIHRvIHRoZSBmaXZlIGNvbHVtbnMKKyAqICAgICAgICAgICAgICAgICAgICAgIG9mIFRhYmxlIDktNSBpbiB0aGUgSC4yNjQgc3BlYworICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBpbgorICoJCQkJCQkJCXRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBvbXhFcnJvciByZXN1bHQuIFNlZSBlbnVtZXJhdGlvbiBmb3IgcG9zc2libGUgcmVzdWx0IGNvZGVzLgorCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIG5UYWJsZSwKKyAgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYgICAgICAgIAorICk7CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gREMgc3R5bGUgaW50cmEgcHJlZGljdGlvbiwgYXZlcmFnaW5nIHVwcGVyIGFuZCBsZWZ0IGJsb2NrCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFNyY0xlZnQJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBsZWZ0IGNvZWZmaWNpZW50czoKKyAqCQkJCQkJCQlwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKQorICogW2luXQlwU3JjQWJvdmUJCVBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBjb2VmZmljaWVudHM6CisgKgkJCQkJCQkJcFt4LHldICh4ID0gMC4uMywgeSA9IC0xKQorICogW2luXQlsZWZ0U3RlcAkJU3RlcCBvZiBsZWZ0IGNvZWZmaWNpZW50IGJ1ZmZlcgorICogW2luXQlkc3RTdGVwCQkJU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiBbaW5dCWF2YWlsYWJpbGl0eQlOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZworICogW291dF0JcERzdAkJCVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIE5vbmUKKyAqLworCit2b2lkIGFybVZDTTRQMTBfUHJlZGljdEludHJhREM0eDQoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyY0xlZnQsCisgICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9JTlQgbGVmdFN0ZXAsCisgICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkgICAgICAgIAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uCisgKiBVbnBhY2sgYSA0eDQgYmxvY2sgb2YgY29lZmZpY2llbnQtcmVzaWR1YWwgcGFpciB2YWx1ZXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwcFNyYwlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyCisgKgkJCQkJCWJ1ZmZlciBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcKKyAqIFtvdXRdCXBwU3JjCSpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jaworICogW291dF0JcERzdAlQb2ludGVyIHRvIHVucGFja2VkIDR4NCBibG9jaworICovCisKK3ZvaWQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCgKKyAgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYqIHBEc3QKKyk7CisKKy8qCisgKiBEZXNjcmlwdGlvbgorICogVW5wYWNrIGEgMngyIGJsb2NrIG9mIGNvZWZmaWNpZW50LXJlc2lkdWFsIHBhaXIgdmFsdWVzCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBTcmMJRG91YmxlIHBvaW50ZXIgdG8gcmVzaWR1YWwgY29lZmZpY2llbnQtcG9zaXRpb24gcGFpcgorICoJCQkJCQlidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbb3V0XQlwcFNyYwkqcHBTcmMgaXMgdXBkYXRlZCB0byB0aGUgc3RhcnQgb2YgbmV4dCBub24gZW1wdHkgYmxvY2sKKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB1bnBhY2tlZCA0eDQgYmxvY2sKKyAqLworCit2b2lkIGFybVZDTTRQMTBfVW5wYWNrQmxvY2syeDIoCisgICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgICBPTVhfUzE2KiBwRHN0CispOworCisvKgorICogRGVzY3JpcHRpb24KKyAqIERlYmxvY2sgb25lIGJvdW5kYXJ5IHBpeGVsCisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcFEwICAgICAgICAgUG9pbnRlciB0byBwaXhlbCBxMAorICogW2luXSBTdGVwICAgICAgICBTdGVwIGJldHdlZW4gcGl4ZWxzIHEwIGFuZCBxMQorICogW2luXSB0QzAgICAgICAgICBFZGdlIHRocmVzaG9sZCB2YWx1ZQorICogW2luXSBhbHBoYSAgICAgICBhbHBoYSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYmV0YSAgICAgICAgYmV0YSB0aHJlc2hvbGQgdmFsdWUKKyAqIFtpbl0gYlMgICAgICAgICAgZGVibG9ja2luZyBzdHJlbmd0aAorICogW2luXSBDaHJvbWFGbGFnICBUcnVlIGZvciBjaHJvbWEgYmxvY2tzCisgKiBbb3V0XSBwUTAgICAgICAgIERlYmxvY2tlZCBwaXhlbHMKKyAqIAorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9EZUJsb2NrUGl4ZWwoCisgICAgT01YX1U4ICpwUTAsICAgIC8qIHBvaW50ZXIgdG8gdGhlIHBpeGVsIHEwICovCisgICAgaW50IFN0ZXAsICAgICAgIC8qIHN0ZXAgYmV0d2VlbiBwaXhlbHMgcTAgYW5kIHExICovCisgICAgaW50IHRDMCwgICAgICAgIC8qIGVkZ2UgdGhyZXNob2xkIHZhbHVlICovCisgICAgaW50IGFscGhhLCAgICAgIC8qIGFscGhhICovCisgICAgaW50IGJldGEsICAgICAgIC8qIGJldGEgKi8KKyAgICBpbnQgYlMsICAgICAgICAgLyogZGVibG9ja2luZyBzdHJlbmd0aCAqLworICAgIGludCBDaHJvbWFGbGFnCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMKKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFNyYwkJCVBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgCisgCQkJCQkJCQkJCQkJCWluIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lCisgKglbaW5dCWlTcmNTdGVwCVN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKglbaW5dCWlEc3RTdGVwCVN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqCVtpbl0JaVdpZHRoCQlXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICoJW2luXQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtvdXRdCXBEc3QJICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyIG9mIHRoZSAxLzItcGVsIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmSG9yX0x1bWEoCisgICAgICAgIGNvbnN0IE9NWF9VOCoJCXBTcmMsIAorCQlPTVhfVTMyIAlpU3JjU3RlcCwgCisJCU9NWF9VOCogCXBEc3QsIAorCQlPTVhfVTMyIAlpRHN0U3RlcCwgCisJCU9NWF9VMzIgCWlXaWR0aCwgCisJCU9NWF9VMzIgCWlIZWlnaHQKKyk7CisKKy8qKgorICogRnVuY3Rpb246IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEKKyAqIAorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludGVycG9sYXRpb24gZm9yIHZlcnRpY2FsIDEvMi1wZWwgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKglbaW5dCXBTcmMJCQlQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICoJCQkJCQkJCQkJCQlpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICoJW2luXQlpU3JjU3RlcAlTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLgorICoJW2luXQlpRHN0U3RlcAlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKglbaW5dCWlXaWR0aAkJV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqCVtpbl0JaUhlaWdodAkJSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKglbb3V0XQlwRHN0ICAgIAlQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgMS8yLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEoCQorCSBjb25zdCBPTVhfVTgqIAlwU3JjLCAKKwkgT01YX1UzMiAJaVNyY1N0ZXAsIAorIAkgT01YX1U4KiAJcERzdCwKKyAJIE9NWF9VMzIgCWlEc3RTdGVwLCAKKyAJIE9NWF9VMzIgCWlXaWR0aCwgCisgCSBPTVhfVTMyIAlpSGVpZ2h0CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlSGFsZkRpYWdfTHVtYQorICogCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgKDEvMiwgMS8yKSAgcG9zaXRpb25zIAorICogYXJvdW5kIGEgZnVsbC1wZWwgcG9zaXRpb24uCisgKgorICogUmVtYXJrczoKKyAqCisgKiAgW2luXSAgICBwU3JjICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIGludGVycG9sYXRlIAorICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW291dF0gICBwRHN0ICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgKDEvMiwxLzIpLXBlbAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmRGlhZ19MdW1hKCAgCisgICAgICAgIGNvbnN0IE9NWF9VOCogICAgIHBTcmMsIAorICAgICAgICBPTVhfVTMyICAgICBpU3JjU3RlcCwgCisgICAgICAgIE9NWF9VOCogICAgIHBEc3QsIAorICAgICAgICBPTVhfVTMyICAgICBpRHN0U3RlcCwKKyAgICAgICAgT01YX1UzMiAgICAgaVdpZHRoLCAKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodAorKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXSAgcFNyYwkJU291cmNlIDR4NCBibG9jaworICogW291dF0gcERzdAkJRGVzdGluYXRpb24gNHg0IGJsb2NrCisgKgorICovCisKK3ZvaWQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NChPTVhfUzE2KiBwRHN0LCBPTVhfUzE2ICpwU3JjKTsKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogRm9yd2FyZCBUcmFuc2Zvcm0gUmVzaWR1YWwgNHg0IENvZWZmaWNpZW50cworICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dICBwU3JjCQlTb3VyY2UgNHg0IGJsb2NrCisgKiBbb3V0XSBwRHN0CQlEZXN0aW5hdGlvbiA0eDQgYmxvY2sKKyAqCisgKi8KKwordm9pZCBhcm1WQ000UDEwX0Z3ZFRyYW5zZm9ybVJlc2lkdWFsNHg0KE9NWF9TMTYqIHBEc3QsIE9NWF9TMTYgKnBTcmMpOworCitPTVhfSU5UIGFybVZDTTRQMTBfQ29tcGFyZU1vdGlvbkNvc3RUb01WICgKKyAgICBPTVhfUzE2ICBtdlgsCisgICAgT01YX1MxNiAgbXZZLAorICAgIE9NWFZDTW90aW9uVmVjdG9yIGRpZmZNViwgCisgICAgT01YX0lOVCBjYW5kU0FELCAKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqYmVzdE1WLCAKKyAgICBPTVhfVTMyIG5MYW1kYSwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QpOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ0NPTU1fU0FECisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgU0FEIGZvciBOeE0gYmxvY2tzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyY09yZwkJUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2sKKyAqIFtpbl0JCWlTdGVwT3JnCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJcFNyY1JlZgkJUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrCisgKiBbaW5dCQlpU3RlcFJlZglTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyCisgKiBbaW5dCQlpSGVpZ2h0CQlIZWlnaHQgb2YgdGhlIGJsb2NrCisgKiBbaW5dCQlpV2lkdGgJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJUG9pbnRlciBvZiByZXN1bHQgU0FECisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworT01YUmVzdWx0IGFybVZDQ09NTV9TQUQoCQorCWNvbnN0IE9NWF9VOCogCXBTcmNPcmcsCisJT01YX1UzMiAJaVN0ZXBPcmcsCisJY29uc3QgT01YX1U4KiAJcFNyY1JlZiwKKwlPTVhfVTMyIAlpU3RlcFJlZiwKKwlPTVhfUzMyKglwRHN0U0FELAorCU9NWF9VMzIJCWlIZWlnaHQsCisJT01YX1UzMgkJaVdpZHRoKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNDT01NX0F2ZXJhZ2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gYmxvY2tzIGFuZCBzdG9yZXMgdGhlIHJlc3VsdC4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqCVtpbl0JcFByZWQwCQkJUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCXBQcmVkMQkJCVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMQorICoJW2luXQlpUHJlZFN0ZXAwCSAgICBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwCisgKglbaW5dCWlQcmVkU3RlcDEJICAgIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEKKyAqCVtpbl0JaURzdFN0ZXAgCQlTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCVtpbl0JaVdpZHRoCQkJV2lkdGggb2YgdGhlIGJsb2NrcworICoJW2luXQlpSGVpZ2h0CQkJSGVpZ2h0IG9mIHRoZSBibG9ja3MKKyAqCVtvdXRdCXBEc3RQcmVkCQlQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBTdGFuZGFyZCBPTVhSZXN1bHQgdmFsdWUuCisgKgorICovCisgT01YUmVzdWx0IGFybVZDQ09NTV9BdmVyYWdlICgKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMCwKKwkgY29uc3QgT01YX1U4KiAJICAgIHBQcmVkMSwJCisJIE9NWF9VMzIJCWlQcmVkU3RlcDAsCisJIE9NWF9VMzIJCWlQcmVkU3RlcDEsCisJIE9NWF9VOCoJCXBEc3RQcmVkLAorCSBPTVhfVTMyCQlpRHN0U3RlcCwgCisJIE9NWF9VMzIJCWlXaWR0aCwKKwkgT01YX1UzMgkJaUhlaWdodAorKTsKKworLyoqCisgKiBGdW5jdGlvbjogYXJtVkNNNFAxMF9TQURRdWFyCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBiZXR3ZWVuIG9uZSBibG9jayAocFNyYykgYW5kIHRoZSAKKyAqIGF2ZXJhZ2Ugb2YgdGhlIG90aGVyIHR3byAocFNyY1JlZjAgYW5kIHBTcmNSZWYxKQorICoKKyAqIFJlbWFya3M6CisgKgorICogW2luXQkJcFNyYwkJCQlQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jaworICogW2luXQkJcFNyY1JlZjAJCVBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDAKKyAqIFtpbl0JCXBTcmNSZWYxCQlQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxCisgKiBbaW5dCQlpU3JjU3RlcCAJCVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcgorICogW2luXQkJaVJlZlN0ZXAwCQlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogW2luXQkJaVJlZlN0ZXAxIAlTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogW2luXQkJaUhlaWdodAkJCUhlaWdodCBvZiB0aGUgYmxvY2sKKyAqIFtpbl0JCWlXaWR0aAkJCVdpZHRoIG9mIHRoZSBibG9jaworICogW291dF0JcERzdFNBRAkJCVBvaW50ZXIgb2YgcmVzdWx0IFNBRAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIE9NWFJlc3VsdCB2YWx1ZS4KKyAqCisgKi8KK09NWFJlc3VsdCBhcm1WQ000UDEwX1NBRFF1YXIoCisJY29uc3QgT01YX1U4KiAJcFNyYywKKyAgICBjb25zdCBPTVhfVTgqIAlwU3JjUmVmMCwKKwljb25zdCBPTVhfVTgqIAlwU3JjUmVmMSwJCisgICAgT01YX1UzMiAJaVNyY1N0ZXAsCisgICAgT01YX1UzMgkJaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIJCWlSZWZTdGVwMSwKKyAgICBPTVhfVTMyKglwRHN0U0FELAorICAgIE9NWF9VMzIgICAgIGlIZWlnaHQsCisgICAgT01YX1UzMiAgICAgaVdpZHRoCispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciBjaHJvbWEgY29tcG9uZW50cy4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqICBbaW5dICAgIHBTcmMgICAgICAgICAgICBQb2ludGVyIHRvIHRvcC1sZWZ0IGNvcm5lciBvZiBibG9jayB1c2VkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgaW4gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgcGxhbmUKKyAqICBbaW5dICAgIGlTcmNTdGVwICAgIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiAgW2luXSAgICBpRHN0U3RlcCAgICBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXIuCisgKiAgW2luXSAgICBpV2lkdGggICAgICBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jaworICogIFtpbl0gICAgaUhlaWdodCAgICAgSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBkeCAgICAgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIGhvcml6b250YWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KSAKKyAqICBbaW5dICAgIGR5ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiAxLzggcGl4ZWwgdW5pdCAoMH43KQorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworIE9NWFJlc3VsdCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSgKKyAgICAgICAgT01YX1U4ICAgICAgKnBTcmMsCisgICAgICAgIE9NWF9VMzIgICAgIGlTcmNTdGVwLAorICAgICAgICBPTVhfVTggICAgICAqcERzdCwKKyAgICAgICAgT01YX1UzMiAgICAgaURzdFN0ZXAsCisgICAgICAgIE9NWF9VMzIgICAgIGlXaWR0aCwKKyAgICAgICAgT01YX1UzMiAgICAgaUhlaWdodCwKKyAgICAgICAgT01YX1UzMiAgICAgZHgsCisgICAgICAgIE9NWF9VMzIgICAgIGR5CispOworCisvKioKKyAqIEZ1bmN0aW9uOiBhcm1WQ000UDEwX0ludGVycG9sYXRlX0x1bWEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgbHVtYSBjb21wb25lbnRzLgorICoKKyAqIFJlbWFya3M6CisgKgorICogIFtpbl0gICAgcFNyYyAgICAgICAgICAgIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0ZSBpbiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBwbGFuZQorICogIFtpbl0gICAgaVNyY1N0ZXAgICAgU3RlcCBvZiB0aGUgc291cmNlIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlEc3RTdGVwICAgIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uKGludGVycG9sYXRpb24pIGJ1ZmZlci4KKyAqICBbaW5dICAgIGlXaWR0aCAgICAgIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrCisgKiAgW2luXSAgICBpSGVpZ2h0ICAgICBIZWlnaHQgb2YgdGhlIGN1cnJlbnQgYmxvY2sKKyAqICBbaW5dICAgIGR4ICAgICAgICAgICAgICBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtpbl0gICAgZHkgICAgICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIDEvNCBwaXhlbCB1bml0ICgwfjMpIAorICogIFtvdXRdICAgcERzdCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGludGVycG9sYXRpb24gYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgT01YUmVzdWx0IHZhbHVlLgorICoKKyAqLworCisgT01YUmVzdWx0IGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfTHVtYSgKKyAgICAgY29uc3QgT01YX1U4ICAgICAqcFNyYywKKyAgICAgT01YX1UzMiAgICBpU3JjU3RlcCwKKyAgICAgT01YX1U4ICAgICAqcERzdCwKKyAgICAgT01YX1UzMiAgICBpRHN0U3RlcCwKKyAgICAgT01YX1UzMiAgICBpV2lkdGgsCisgICAgIE9NWF9VMzIgICAgaUhlaWdodCwKKyAgICAgT01YX1UzMiAgICBkeCwKKyAgICAgT01YX1UzMiAgICBkeQorKTsKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNIMjY0X0RlcXVhbnRUcmFuc2Zvcm1BQ0Zyb21QYWlyX1U4X1MxNl9DMV9ETHgKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwKKyAqIHBlcmZvcm0gZGVxdWFudGlzYXRpb24gYW5kIGludGVnZXIgaW52ZXJzZSB0cmFuc2Zvcm1hdGlvbiBmb3IgNHg0IGJsb2NrIG9mCisgKiByZXNpZHVhbHMgYW5kIHVwZGF0ZSB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byBuZXh0IG5vbi1lbXB0eSBibG9jay4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwU3JjCQlEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbgorICoJCQkJCQkJcGFpciBidWZmZXIgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nCisgKiBbaW5dCXBEQwkJCVBvaW50ZXIgdG8gdGhlIERDIGNvZWZmaWNpZW50IG9mIHRoaXMgYmxvY2ssIE5VTEwKKyAqCQkJCQkJCWlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAqIFtpbl0JUVAJCQlRdWFudGl6YXRpb24gcGFyYW1ldGVyCisgKiBbaW5dIEFDICAgICAgICAgIEZsYWcgaW5kaWNhdGluZyBpZiBhdCBsZWFzdCBvbmUgbm9uLXplcm8gY29lZmZpY2llbnQgZXhpc3RzCisgKiBbb3V0XQlwRHN0CQlwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IGFybVZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybUFDRnJvbVBhaXJfVThfUzE2X0MxX0RMeCgKKyAgICAgT01YX1U4ICoqcHBTcmMsCisgICAgIE9NWF9TMTYgKnBEc3QsCisgICAgIE9NWF9JTlQgUVAsCisgICAgIE9NWF9TMTYqIHBEQywKKyAgICAgaW50IEFDCispOworCisjZW5kaWYgIC8qX2FybVZpZGVvX0hfKi8KKworLypFbmQgb2YgRmlsZSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvYXJtVkNDT01NX3MuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMmEwMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9hcm1WQ0NPTU1fcy5oCkBAIC0wLDAgKzEsNzIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDQ09NTV9zLmgKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gQVJNIG9wdGltaXplZCBPcGVuTUFYIEFDIGhlYWRlciBmaWxlCis7Ly8gCis7Ly8gRm9ybXVsYSB1c2VkOgorOy8vIE1BQ1JPIGZvciBjYWxjdWxhdGluZyBtZWRpYW4gZm9yIHRocmVlIHZhbHVlcy4KKworCisKKyAgICBJRiA6TE5PVDo6REVGOkFSTVZDQ09NTV9TX0gKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgIE1fVkFSSUFOVFMgICAgICBDb3J0ZXhBOCwgQVJNMTEzNkpTCisgICAgCisgICAgSUYgQVJNMTEzNkpTIDpMT1I6IENvcnRleEE4IAorICAgICAKKyAgICAgOy8vLyoKKyAgICAgOy8vICogTWFjcm86IE1fTUVESUFOMworICAgICA7Ly8gKgorICAgICA7Ly8gKiBEZXNjcmlwdGlvbjogRmluZHMgdGhlIG1lZGlhbiBvZiB0aHJlZSBudW1iZXJzCisgICAgIDsvLyAqIAorICAgICA7Ly8gKiBSZW1hcmtzOgorICAgICA7Ly8gKgorICAgICA7Ly8gKiBQYXJhbWV0ZXJzOgorICAgICA7Ly8gKiBbaW5dIHggICAgIEZpcnN0IGVudHJ5IGZvciB0aGUgbGlzdCBvZiB0aHJlZSBudW1iZXJzLgorICAgICA7Ly8gKiBbaW5dIHkgICAgIFNlY29uZCBlbnRyeSBmb3IgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBtYXkgYmUgY29ycnVwdGVkIGF0IHRoZSBlbmQgb2YKKyAgICAgOy8vICogICAgICAgICAgICB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0geiAgICAgVGhpcmQgZW50cnkgb2YgdGhlIGxpc3Qgb2YgdGhyZWUgbnVtYmVycy4KKyAgICAgOy8vICogICAgICAgICAgICBJbnB1dCB2YWx1ZSBjb3JydXB0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgCisgICAgIDsvLyAqICAgICAgICAgICAgZXhlY3V0aW9uIG9mIHRoaXMgbWFjcm8uCisgICAgIDsvLyAqIFtpbl0gdCAgICAgVGVtcG9yYXJ5IHNjcmF0Y2ggIHJlZ2lzdGVyLgorICAgICA7Ly8gKiBbb3V0XXogICAgIE1lZGlhbiBvZiB0aGUgdGhyZWUgbnVtYmVycy4gICAgICAgCisgICAgIDsvLyAqLworICAgICAKKyAgICAgTUFDUk8KKworICAgICBNX01FRElBTjMgJHgsICR5LCAkeiwgJHQgCisgICAgIAorICAgICBTVUJTICAkdCwgJHksICR6OyAvLyBpZiAoeSA8IHopCisgICAgIEFERExUICR6LCAkeiwgJHQ7IC8vICBzd2FwIHkgYW5kIHoKKyAgICAgU1VCTFQgJHksICR5LCAkdDsKKworICAgICA7Ly8gTm93IHonIDw9IHknLCBzbyB0aGVyZSBhcmUgdGhyZWUgY2FzZXMgZm9yIHRoZQorICAgICA7Ly8gbWVkaWFuIHZhbHVlLCBkZXBlbmRpbmcgb24geC4KKworICAgICA7Ly8gMSkgeCA8PSB6JyAgICAgIDw9IHknICAgICAgOiBtZWRpYW4gdmFsdWUgaXMgeicKKyAgICAgOy8vIDIpICAgICAgeicgPD0geCA8PSB5JyAgICAgIDogbWVkaWFuIHZhbHVlIGlzIHgKKyAgICAgOy8vIDMpICAgICAgeicgICAgICA8PSB5JyA8PSB4IDogbWVkaWFuIHZhbHVlIGlzIHknCisKKyAgICAgQ01QICAgJHosICR4OyAgICAgLy8gaWYgKCB4ID4gbWluKHkseikgKQorICAgICBNT1ZMVCAkeiwgJHg7ICAgICAvLyBhbnMgPSB4IAorCisgICAgIENNUCAgICR4LCAkeTsgICAgIC8vIGlmICggeCA+IG1heCh5LHopICkKKyAgICAgTU9WR1QgJHosICR5OyAgICAgLy8gYW5zID0gbWF4KHkseikKKyAgICAgCisgICAgIE1FTkQKKyAgICBFTkRJRiAgICAgIAorICAgIAorICAgIAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQVJNQUNDT01NX1NfSAorCisgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiM2NjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvYXBpL29teFZDLmgKQEAgLTAsMCArMSw0MzgxIEBACisvKioKKyAqIEZpbGU6IG9teFZDLmgKKyAqIEJyaWVmOiBPcGVuTUFYIERMIHYxLjAuMiAtIFZpZGVvIENvZGluZyBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IKkgMjAwNS0yMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCisgKgorICogVGhlc2UgbWF0ZXJpYWxzIGFyZSBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IGxhd3MgYW5kIGNvbnRhaW4gbWF0ZXJpYWwgCisgKiBwcm9wcmlldGFyeSB0byB0aGUgS2hyb25vcyBHcm91cCwgSW5jLiAgWW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIAorICogZm9yIGltcGxlbWVudGluZyBLaHJvbm9zIHNwZWNpZmljYXRpb25zLCB3aXRob3V0IGFsdGVyaW5nIG9yIHJlbW92aW5nIAorICogYW55IHRyYWRlbWFyaywgY29weXJpZ2h0IG9yIG90aGVyIG5vdGljZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uLgorICogCisgKiBLaHJvbm9zIEdyb3VwIG1ha2VzIG5vLCBhbmQgZXhwcmVzc2x5IGRpc2NsYWltcyBhbnksIHJlcHJlc2VudGF0aW9ucyAKKyAqIG9yIHdhcnJhbnRpZXMsIGV4cHJlc3Mgb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZXNlIG1hdGVyaWFscywgaW5jbHVkaW5nLCAKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgb3IgZml0bmVzcyAKKyAqIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBvciBub24taW5mcmluZ2VtZW50IG9mIGFueSBpbnRlbGxlY3R1YWwgcHJvcGVydHkuIAorICogS2hyb25vcyBHcm91cCBtYWtlcyBubywgYW5kIGV4cHJlc3NseSBkaXNjbGFpbXMgYW55LCB3YXJyYW50aWVzLCBleHByZXNzIAorICogb3IgaW1wbGllZCwgcmVnYXJkaW5nIHRoZSBjb3JyZWN0bmVzcywgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgdGltZWxpbmVzcywgCisgKiBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlc2UgbWF0ZXJpYWxzLiAKKyAqCisgKiBVbmRlciBubyBjaXJjdW1zdGFuY2VzIHdpbGwgdGhlIEtocm9ub3MgR3JvdXAsIG9yIGFueSBvZiBpdHMgUHJvbW90ZXJzLCAKKyAqIENvbnRyaWJ1dG9ycyBvciBNZW1iZXJzIG9yIHRoZWlyIHJlc3BlY3RpdmUgcGFydG5lcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIAorICogZW1wbG95ZWVzLCBhZ2VudHMgb3IgcmVwcmVzZW50YXRpdmVzIGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsIHdoZXRoZXIgCisgKiBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBmb3IgbG9zdCByZXZlbnVlcywgCisgKiBsb3N0IHByb2ZpdHMsIG9yIG90aGVyd2lzZSwgYXJpc2luZyBmcm9tIG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGVzZSAKKyAqIG1hdGVyaWFscy4KKyAqIAorICogS2hyb25vcyBhbmQgT3Blbk1BWCBhcmUgdHJhZGVtYXJrcyBvZiB0aGUgS2hyb25vcyBHcm91cCBJbmMuIAorICoKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfT01YVkNfSF8KKyNkZWZpbmUgX09NWFZDX0hfCisKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogNi4xLjEuMSBNb3Rpb24gVmVjdG9ycyAgKi8KKy8qIEluIG9teFZDLCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBPTVhfUzE2IGR4OworICAgIE9NWF9TMTYgZHk7Cit9IE9NWFZDTW90aW9uVmVjdG9yOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9BdmVyYWdlXzh4ICAgKDYuMS4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gOHg0LCA4eDgsIG9yIDh4MTYgYmxvY2tzLiAgVGhlIAorICogcmVzdWx0IGlzIHJvdW5kZWQgYWNjb3JkaW5nIHRvIChhK2IrMSkvMi4gIFRoZSBibG9jayBhdmVyYWdlIGZ1bmN0aW9uIGNhbiAKKyAqIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBoYWxmLXBpeGVsIGludGVycG9sYXRpb24gdG8gb2J0YWluIHF1YXJ0ZXIgCisgKiBwaXhlbCBtb3Rpb24gZXN0aW1hdGVzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTEwXSwgc3ViY2xhdXNlIDguNC4yLjIuMS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFByZWQwICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFByZWQxICAgICAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAgIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAKKyAqICAgaUhlaWdodCAgICAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gOC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBQcmVkMCwgcFByZWQxLCBvciAKKyAqICAgICAgICAgICAgICBwRHN0UHJlZC4gCisgKiAgICAtICAgcERzdFByZWQgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICBpRHN0U3RlcCAgIDw9IDAgb3IgaURzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgaUhlaWdodCBpcyBub3QgNCwgOCwgb3IgMTYuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9BdmVyYWdlXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0F2ZXJhZ2VfMTZ4ICAgKDYuMS4zLjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgYXZlcmFnZSBvZiB0d28gMTZ4MTYgb3IgMTZ4OCBibG9ja3MuICBUaGUgCisgKiByZXN1bHQgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAgVGhlIGJsb2NrIGF2ZXJhZ2UgZnVuY3Rpb24gY2FuIAorICogYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGhhbGYtcGl4ZWwgaW50ZXJwb2xhdGlvbiB0byBvYnRhaW4gcXVhcnRlciAKKyAqIHBpeGVsIG1vdGlvbiBlc3RpbWF0ZXMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMTBdLCBzdWJjbGF1c2UgOC40LjIuMi4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlQcmVkU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gMTYtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwUHJlZDAsIHBQcmVkMSwgb3IgCisgKiAgICAgICAgICAgICAgcERzdFByZWQuIAorICogICAgLSAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgICAtICAgaVByZWRTdGVwMCA8PSAwIG9yIGlQcmVkU3RlcDAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgLSAgIGlQcmVkU3RlcDEgPD0gMCBvciBpUHJlZFN0ZXAxIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIC0gICBpSGVpZ2h0IGlzIG5vdCA4IG9yIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQXZlcmFnZV8xNnggKAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQwLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQxLAorICAgIE9NWF9VMzIgaVByZWRTdGVwMCwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDEsCisgICAgT01YX1U4ICpwRHN0UHJlZCwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSSAgICg2LjEuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgYSByZWNvbnN0cnVjdGVkIGZyYW1lIGluLXBsYWNlLiAgVGhlIHVuZXhwYW5kZWQgCisgKiBzb3VyY2UgZnJhbWUgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBsYW5lIGJ1ZmZlciB3aXRoIHN1ZmZpY2llbnQgc3BhY2UgCisgKiBwcmUtYWxsb2NhdGVkIGZvciBlZGdlIGV4cGFuc2lvbiwgYW5kIHRoZSBpbnB1dCBmcmFtZSBzaG91bGQgYmUgbG9jYXRlZCBpbiAKKyAqIHRoZSBwbGFuZSBidWZmZXIgY2VudGVyLiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcGl4ZWwgZXhwYW5zaW9uIGJ5IAorICogcmVwbGljYXRpbmcgc291cmNlIGZyYW1lIGVkZ2UgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gdGhlIGVtcHR5IHBpeGVsIAorICogbG9jYXRpb25zIChleHBhbnNpb24gcmVnaW9uKSBiZXR3ZWVuIHRoZSBzb3VyY2UgZnJhbWUgZWRnZSBhbmQgdGhlIHBsYW5lIAorICogYnVmZmVyIGVkZ2UuICBUaGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBleHBhbnNpb24gcmVnaW9ucyBvbiB0aGUgCisgKiBob3Jpem9udGFsL3ZlcnRpY2FsIGVkZ2VzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmFtZXRlciBpRXhwYW5kUGVscy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdFBsYW5lIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBmcmFtZSB0byBiZSAKKyAqICAgICAgICAgICAgZXhwYW5kZWQ7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBpRnJhbWVXaWR0aCAtIGZyYW1lIHdpZHRoOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlGcmFtZUhlaWdodCAtZnJhbWUgaGVpZ2h0OyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGlFeHBhbmRQZWxzIC0gbnVtYmVyIG9mIHBpeGVscyB0byBiZSBleHBhbmRlZCBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiAgICAgICAgICAgIHZlcnRpY2FsIGRpcmVjdGlvbnM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgaVBsYW5lU3RlcCAtIGRpc3RhbmNlLCBpbiBieXRlcywgYmV0d2VlbiB0aGUgc3RhcnQgb2YgY29uc2VjdXRpdmUgbGluZXMgCisgKiAgICAgICAgICAgIGluIHRoZSBwbGFuZSBidWZmZXI7IG11c3QgYmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gCisgKiAgICAgICAgICAgIChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0UGxhbmUgLVBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgKE5PVCB0aGUgCisgKiAgICAgICAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcGxhbmUpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnM6IAorICogICAgLSAgICBwU3JjRHN0UGxhbmUgaXMgTlVMTC4gCisgKiAgICAtICAgIHBTcmNEc3RQbGFuZSBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGVpdGhlciBlcXVhbCB0byB6ZXJvIG9yIGlzIGEgCisgKiAgICAgICAgICAgICAgbm9uLW11bHRpcGxlIG9mIDg6IGlGcmFtZUhlaWdodCwgaUZyYW1lV2lkdGgsIGlQbGFuZVN0ZXAsIG9yIAorICogICAgICAgICAgICAgIGlFeHBhbmRQZWxzLiAKKyAqICAgIC0gICAgaVBsYW5lU3RlcCA8IChpRnJhbWVXaWR0aCArIDIgKiBpRXhwYW5kUGVscykuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9FeHBhbmRGcmFtZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3RQbGFuZSwKKyAgICBPTVhfVTMyIGlGcmFtZVdpZHRoLAorICAgIE9NWF9VMzIgaUZyYW1lSGVpZ2h0LAorICAgIE9NWF9VMzIgaUV4cGFuZFBlbHMsCisgICAgT01YX1UzMiBpUGxhbmVTdGVwCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDQ09NTV9Db3B5OHg4ICAgKDYuMS4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvcGllcyB0aGUgcmVmZXJlbmNlIDh4OCBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiAKKyAqICAgICAgICAgICAgb3IgZXF1YWwgdG8gOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnk6IHBTcmMsIHBEc3QgCisgKiAgICAtICAgIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHN0ZXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvcHkxNngxNiAgICg2LjEuMy4zLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBtYWNyb2Jsb2NrIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgbWFjcm9ibG9jayBpbiB0aGUgc291cmNlIGZyYW1lOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHN0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydHMgb2YgY29uc2VjdXRpdmUgbGluZXMgaW4gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgZnJhbWUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgYW5kIG11c3QgYmUgbGFyZ2VyIAorICogICAgICAgICAgICB0aGFuIG9yIGVxdWFsIHRvIDE2LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hY3JvYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjLCBwRHN0IAorICogICAgLSAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICAgIGJvdW5kYXJ5OiBwU3JjLCBwRHN0IAorICogICAgLSAgICBzdGVwIDwxNiBvciBzdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fQ29weTE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fQ29tcHV0ZVRleHR1cmVFcnJvckJsb2NrX1NBRCAgICg2LjEuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0ZXh0dXJlIGVycm9yIG9mIHRoZSBibG9jazsgYWxzbyByZXR1cm5zIFNBRC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBzcmNTdGVwIC0gc3RlcCBvZiB0aGUgc291cmNlIHBsYW5lIAorICogICBwU3JjUmVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJ1ZmZlciwgYW4gOHg4IGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byB0aGUgU3VtIG9mIEFic29sdXRlIERpZmZlcmVuY2VzIChTQUQpIHZhbHVlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZiwgcERzdCBhbmQgcERzdFNBRC4gCisgKiAgICAtICAgIHBTcmMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgU3JjU3RlcCA8PSAwIG9yIHNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBTcmNSZWYgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcERzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2tfU0FEICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZiwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgKnBEc3RTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0NvbXB1dGVUZXh0dXJlRXJyb3JCbG9jayAgICg2LjEuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyB0aGUgdGV4dHVyZSBlcnJvciBvZiB0aGUgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgcGxhbmUuIFRoaXMgc2hvdWxkIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1N0ZXAgLSBzdGVwIG9mIHRoZSBzb3VyY2UgcGxhbmUgCisgKiAgIHBTcmNSZWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYnVmZmVyLCBhbiA4eDggYmxvY2suIFRoaXMgc2hvdWxkIGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIGFuIDh4OCBibG9jay4gVGhpcyBzaG91bGQgYmUgCisgKiAgICAgICAgICAgIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmMsIHBTcmNSZWYsIHBEc3QuIAorICogICAgLSAgICBwU3JjIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFNyY1N0ZXAgPD0gMCBvciBzcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgLSAgICBwU3JjUmVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDQ09NTV9Db21wdXRlVGV4dHVyZUVycm9yQmxvY2sgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfSU5UIHNyY1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9TMTYgKnBEc3QKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX0xpbWl0TVZUb1JlY3QgICAoNi4xLjQuMS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogTGltaXRzIHRoZSBtb3Rpb24gdmVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBibG9jay9tYWNyb2Jsb2NrIHRvIAorICogcHJldmVudCB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGJsb2NrL21hY3JvYmxvY2sgZnJvbSBtb3Zpbmcgb3V0c2lkZSBhIAorICogYm91bmRpbmcgcmVjdGFuZ2xlIGFzIHNob3duIGluIEZpZ3VyZSA2LTEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNViAtIHBvaW50ZXIgdG8gdGhlIG1vdGlvbiB2ZWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBvciBtYWNyb2Jsb2NrIAorICogICBwUmVjdFZPUFJlZiAtIHBvaW50ZXIgdG8gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSAKKyAqICAgWGNvb3JkLCBZY29vcmQgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jayAKKyAqICAgc2l6ZSAtIHNpemUgb2YgdGhlIGN1cnJlbnQgYmxvY2sgb3IgbWFjcm9ibG9jazsgbXVzdCBiZSBlcXVhbCB0byA4IG9yIAorICogICAgICAgICAgICAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gdGhlIGxpbWl0ZWQgbW90aW9uIHZlY3RvciAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNNViwgcERzdE1WLCBvciBwUmVjdFZPUFJlZi4gCisgKiAgICAtICAgIHNpemUgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2LiAKKyAqICAgIC0gICAgdGhlIHdpZHRoIG9yIGhlaWdodCBvZiB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIGlzIGxlc3MgdGhhbiAKKyAqICAgICAgICAgdHdpY2UgdGhlIGJsb2NrIHNpemUuCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fTGltaXRNVlRvUmVjdCAoCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNNViwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWN0Vk9QUmVmLAorICAgIE9NWF9JTlQgWGNvb3JkLAorICAgIE9NWF9JTlQgWWNvb3JkLAorICAgIE9NWF9JTlQgc2l6ZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ0NPTU1fU0FEXzE2eCAgICg2LjEuNC4xLjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgMTZ4MTYgYW5kIDE2eDggYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyIAorICogICBwU3JjUmVmICAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jayAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0ICAtIEhlaWdodCBvZiB0aGUgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RTQUQgLSBQb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICogICAgLSAgICBpU3RlcE9yZyAgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaVN0ZXBSZWYgPD0gMCBvciBpU3RlcFJlZiBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNDT01NX1NBRF84eCAgICg2LjEuNC4xLjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBRCBmb3IgOHgxNiwgOHg4LCA4eDQgYmxvY2tzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnICAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA4LWJ5dGUgCisgKiAgICAgICAgICAgICAgYm91bmRhcnkuIAorICogICBpU3RlcE9yZyAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlciAKKyAqICAgcFNyY1JlZiAgLSBQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC0gU3RlcCBvZiB0aGUgcmVmZXJlbmNlIGJsb2NrIGJ1ZmZlciAKKyAqICAgaUhlaWdodCAgLSBIZWlnaHQgb2YgdGhlIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb3IgbW9yZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjT3JnLCBwRHN0U0FELCBvciBwU3JjUmVmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGlTdGVwT3JnICA8PSAwIG9yIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDggCisgKiAgICAtICAgIGlTdGVwUmVmIDw9IDAgb3IgaVN0ZXBSZWYgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgNCwgOCBvciAxNiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ0NPTU1fU0FEXzh4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmcsCisgICAgT01YX1UzMiBpU3RlcE9yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYsCisgICAgT01YX1UzMiBpU3RlcFJlZiwKKyAgICBPTVhfUzMyKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyogNi4yLjEuMSBEaXJlY3Rpb24gICovCisvKiBUaGUgZGlyZWN0aW9uIGVudW1lcmF0b3IgaXMgdXNlZCB3aXRoIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gQUMvREMgcHJlZGljdGlvbiBhbmQgemlnLXphZyBzY2FuLiAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX05PTkUgICAgICAgPSAwLAorICAgIE9NWF9WQ19IT1JJWk9OVEFMID0gMSwKKyAgICBPTVhfVkNfVkVSVElDQUwgICA9IDIgCit9OworCisKKworLyogNi4yLjEuMiBCaWxpbmVhciBJbnRlcnBvbGF0aW9uICAqLworLyogVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gZW51bWVyYXRvciBpcyB1c2VkIHdpdGggbW90aW9uIGVzdGltYXRpb24sIG1vdGlvbiBjb21wZW5zYXRpb24sIGFuZCByZWNvbnN0cnVjdGlvbiBmdW5jdGlvbnMuICAqLworCitlbnVtIHsKKyAgICBPTVhfVkNfSU5URUdFUl9QSVhFTCA9IDAsIC8qIGNhc2UgYSAqLworICAgIE9NWF9WQ19IQUxGX1BJWEVMX1ggID0gMSwgLyogY2FzZSBiICovCisgICAgT01YX1ZDX0hBTEZfUElYRUxfWSAgPSAyLCAvKiBjYXNlIGMgKi8KKyAgICBPTVhfVkNfSEFMRl9QSVhFTF9YWSA9IDMgIC8qIGNhc2UgZCAqLyAKK307CisKKworCisvKiA2LjIuMS4zIE5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5ICAqLworLyogTmVpZ2hib3JpbmcgbWFjcm9ibG9jayBhdmFpbGFiaWxpdHkgaXMgaW5kaWNhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgZmxhZ3M6ICAgKi8KKworZW51bSB7CisgICAgT01YX1ZDX1VQUEVSID0gMSwgICAgICAgIC8qKiBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MRUZUID0gMiwgICAgICAgICAvKiogbGVmdCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19DRU5URVIgPSA0LAorICAgIE9NWF9WQ19SSUdIVCA9IDgsCisgICAgT01YX1ZDX0xPV0VSID0gMTYsCisgICAgT01YX1ZDX1VQUEVSX0xFRlQgPSAzMiwgIC8qKiBhYm92ZS1sZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCisgICAgT01YX1ZDX1VQUEVSX1JJR0hUID0gNjQsIC8qKiBhYm92ZS1yaWdodCBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworICAgIE9NWF9WQ19MT1dFUl9MRUZUID0gMTI4LAorICAgIE9NWF9WQ19MT1dFUl9SSUdIVCA9IDI1NiAKK307CisKKworCisvKiA2LjIuMS40IFZpZGVvIENvbXBvbmVudHMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgdmlkZW8gY29tcG9uZW50cyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19MVU1JTkFOQ0UsICAgIC8qKiBMdW1pbmFuY2UgY29tcG9uZW50ICovCisgICAgT01YX1ZDX0NIUk9NSU5BTkNFICAgLyoqIGNocm9taW5hbmNlIGNvbXBvbmVudCAqLyAKK30gT01YVkNNNFAyVmlkZW9Db21wb25lbnQ7CisKKworCisvKiA2LjIuMS41IE1hY3JvYmxvY2tUeXBlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtYWNyb2Jsb2NrIHR5cGVzIGlzIGRlZmluZWQgYXMgZm9sbG93czogICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgT01YX1ZDX0lOVEVSICAgICA9IDAsIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVJfUSAgID0gMSwgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRFUjRWICAgPSAyLCAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCisgICAgT01YX1ZDX0lOVFJBICAgICA9IDMsIC8qKiBJIGFuZCBQIHBpY3R1cmUsIEktIGFuZCBQLVZPUCAqLworICAgIE9NWF9WQ19JTlRSQV9RICAgPSA0LCAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KKyAgICBPTVhfVkNfSU5URVI0Vl9RID0gNSAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAoSC4yNjMpKi8KK30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKworCisvKiA2LjIuMS42IENvb3JkaW5hdGVzICAqLworLyogQ29vcmRpbmF0ZXMgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCB4OworICAgIE9NWF9JTlQgeTsKK30gT01YVkNNNFAyQ29vcmRpbmF0ZTsKKworCisKKy8qIDYuMi4xLjcgTW90aW9uIEVzdGltYXRpb24gQWxnb3JpdGhtcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBtb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggbWV0aG9kcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAyX0ZBU1RfU0VBUkNIID0gMCwgIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMl9GVUxMX1NFQVJDSCA9IDEgICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDJNRU1vZGU7CisKKworCisvKiA2LjIuMS44IE1vdGlvbiBFc3RpbWF0aW9uIFBhcmFtZXRlcnMgICovCisvKiBBIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgY29udHJvbCBwYXJhbWV0ZXJzIGZvciAKKyAqIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAKKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX0lOVCBzZWFyY2hFbmFibGU4eDg7ICAgICAvKiogZW5hYmxlcyA4eDggc2VhcmNoICovCisgICAgT01YX0lOVCBoYWxmUGVsU2VhcmNoRW5hYmxlOyAvKiogZW5hYmxlcyBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgT01YX0lOVCBzZWFyY2hSYW5nZTsgICAgICAgICAvKiogc2VhcmNoIHJhbmdlICovCisgICAgT01YX0lOVCBybmRWYWw7ICAgICAgICAgICAgICAvKiogcm91bmRpbmcgY29udHJvbDsgMC1kaXNhYmxlZCwgMS1lbmFibGVkKi8KK30gT01YVkNNNFAyTUVQYXJhbXM7CisKKworCisvKiA2LjIuMS45IE1hY3JvYmxvY2sgSW5mb3JtYXRpb24gICAqLworLyogQSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIG1hY3JvYmxvY2sgcGFyYW1ldGVycyBmb3IgCisgKiBtb3Rpb24gZXN0aW1hdGlvbiBmdW5jdGlvbnMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIG1iVHlwZTsgIC8qIE1CIHR5cGU6IE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciBPTVhfVkNfSU5URVI0ICovCisgICAgT01YX1MzMiBxcDsgICAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIHBhcmFtZXRlciovCisgICAgT01YX1UzMiBjYnB5OyAgICAgICAgICAgICAgICAgICAgLyogQ0JQIEx1bWEgKi8KKyAgICBPTVhfVTMyIGNicGM7ICAgICAgICAgICAgICAgICAgICAvKiBDQlAgQ2hyb21hICovCisgICAgT01YVkNNb3Rpb25WZWN0b3IgcE1WMFsyXVsyXTsgICAgLyogbW90aW9uIHZlY3RvciwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WMFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0wfjEpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbMl1bMl07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgcmVwcmVzZW50ZWQgdXNpbmcgMS8yLXBlbCB1bml0cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MSwgYmxvY2t4ID0gMH4xKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBPTVhfVTggcFByZWREaXJbMl1bMl07ICAgICAgICAgICAvKiBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBPTVhfVkNfTk9ORSwgT01YX1ZDX1ZFUlRJQ0FMLCBPTVhfVkNfSE9SSVpPTlRBTCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gT01YVkNNNFAyTUJJbmZvLCAqT01YVkNNNFAyTUJJbmZvUHRyOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9GaW5kTVZwcmVkICAgKDYuMi4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgdXNpbmcgdGhlIHByb2NlZHVyZSAKKyAqIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuNS4gIFRoZSByZXN1bHRpbmcgcHJlZGljdGVkIE1WIGlzIAorICogcmV0dXJuZWQgaW4gcERzdE1WUHJlZC4gSWYgdGhlIHBhcmFtZXRlciBwRHN0TVZQcmVkTUUgaWYgaXMgbm90IE5VTEwgdGhlbiAKKyAqIHRoZSBzZXQgb2YgdGhyZWUgTVYgY2FuZGlkYXRlcyB1c2VkIGZvciBwcmVkaWN0aW9uIGlzIGFsc28gcmV0dXJuZWQsIAorICogb3RoZXJ3aXNlIHBEc3RNVlByZWRNRWlzIE5VTEwgdXBvbiByZXR1cm4uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgTVYgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBZIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBhIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgcFNyY0NhbmRNVjEgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCB0byB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgCisgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIE1CIHRvIHRoZSBsZWZ0LiAKKyAqICAgcFNyY0NhbmRNVjIgLSBwb2ludGVyIHRvIHRoZSBNViBidWZmZXIgY29udGFpbmluZyB0aGUgNCBNVnMgYXNzb2NpYXRlZCAKKyAqICAgICAgICAgICAgd2l0aCB0aGUgTUIgbG9jYXRlZCBhYm92ZSB0aGUgY3VycmVudCBNQjsgc2V0IHRvIE5VTEwgaWYgdGhlcmUgCisgKiAgICAgICAgICAgIGlzIG5vIE1CIGxvY2F0ZWQgYWJvdmUgdGhlIGN1cnJlbnQgTUIuIAorICogICBwU3JjQ2FuZE1WMyAtIHBvaW50ZXIgdG8gdGhlIE1WIGJ1ZmZlciBjb250YWluaW5nIHRoZSA0IE1WcyBhc3NvY2lhdGVkIAorICogICAgICAgICAgICB3aXRoIHRoZSBNQiBsb2NhdGVkIHRvIHRoZSByaWdodCBhbmQgYWJvdmUgdGhlIGN1cnJlbnQgTUI7IHNldCAKKyAqICAgICAgICAgICAgdG8gTlVMTCBpZiB0aGVyZSBpcyBubyBNQiBsb2NhdGVkIHRvIHRoZSBhYm92ZS1yaWdodC4gCisgKiAgIGlCbGsgLSB0aGUgaW5kZXggb2YgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgcERzdE1WUHJlZE1FIC0gTVYgY2FuZGlkYXRlIHJldHVybiBidWZmZXI7ICBpZiBzZXQgdG8gTlVMTCB0aGVuIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIGNhbmRpZGF0ZSBNVnMgYXJlIG5vdCByZXR1cm5lZCBhbmQgcERzdE1WUHJlZE1FIHdpbGwgCisgKiAgICAgICAgICAgIGJlIE5VTEwgdXBvbiBmdW5jdGlvbiByZXR1cm47IGlmIHBEc3RNVlByZWRNRSBpcyBub24tTlVMTCB0aGVuIGl0IAorICogICAgICAgICAgICBtdXN0IHBvaW50IHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhyZWUgCisgKiAgICAgICAgICAgIHJldHVybiBNVnMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVZQcmVkIC0gcG9pbnRlciB0byB0aGUgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgCisgKiAgIHBEc3RNVlByZWRNRSAtIGlmIG5vbi1OVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgIHBvaW50cyB1cG9uIAorICogICAgICAgICAgICByZXR1cm4gdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgdGhyZWUgbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzIAorICogICAgICAgICAgICB1c2VkIGZvciBwcmVkaWN0aW9uIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSAKKyAqICAgICAgICAgICAgNy42LjUsIG90aGVyd2lzZSBpZiBOVUxMIHVwb24gaW5wdXQgdGhlbiBwRHN0TVZQcmVkTUUgaXMgTlVMTCAKKyAqICAgICAgICAgICAgdXBvbiBvdXRwdXQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCB1bmRlciBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zOiAKKyAqICAgIC0gICAgdGhlIHBvaW50ZXIgcERzdE1WUHJlZCBpcyBOVUxMIAorICogICAgLSAgICB0aGUgcGFyYW1ldGVyIGlCbGsgZG9lcyBub3QgZmFsbCBpbnRvIHRoZSByYW5nZSAwIDw9IGlCbGs8PTMgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0ZpbmRNVnByZWQgKAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZDdXJNQiwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcFNyY0NhbmRNVjEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNDYW5kTVYyLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjQ2FuZE1WMywKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZCwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcERzdE1WUHJlZE1FLAorICAgIE9NWF9JTlQgaUJsaworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfSURDVDh4OGJsayAgICg2LjIuMy4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGludmVyc2UgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgSURDVCBpbnB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgQWNjb3JkaW5nIHRvIAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMl0sIHRoZSBpbnB1dCBjb2VmZmljaWVudCB2YWx1ZXMgc2hvdWxkIGxpZSB3aXRoaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbLTIwNDgsIDIwNDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lYXJseSBhcnJhbmdlZCBJRENUIG91dHB1dCBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwU3JjIG9yIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0lEQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTUVHZXRCdWZTaXplICAgKDYuMi40LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIENvbXB1dGVzIHRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBzcGVjaWZpY2F0aW9uIAorICogc3RydWN0dXJlIGZvciB0aGUgZm9sbG93aW5nIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9uczogCisgKiBCbG9ja01hdGNoX0ludGVnZXJfOHg4LCBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDJNRU1vZGUgCisgKiAgIHBNRVBhcmFtcyAtIG1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtZXRlcnMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTaXplIC0gcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiAKKyAqICAgICAgICAgICAgc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbnZhbGlkIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBwYXJhbWV0ZXIgTUVtb2RlIAorICogICAgLSAgICBhIG5lZ2F0aXZlIG9yIHplcm8gdmFsdWUgd2FzIHNwZWNpZmllZCBmb3IgdGhlIAorICogICAgICAgICBwYXJhbWV0ZXIgcE1FUGFyYW1zLT5zZWFyY2hSYW5nZSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUVHZXRCdWZTaXplICgKKyAgICBPTVhWQ000UDJNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMk1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgT01YX1UzMiAqcFNpemUKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01FSW5pdCAgICg2LjIuNC4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbml0aWFsaXplcyB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHJlcXVpcmVkIGZvciB0aGUgCisgKiBmb2xsb3dpbmcgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCwgCisgKiBCbG9ja01hdGNoX0ludGVnZXJfMTZ4MTYsIGFuZCBNb3Rpb25Fc3RpbWF0aW9uTUIuIE1lbW9yeSBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSBhbGxvY2F0ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGUgCisgKiBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgRm9sbG93aW5nIAorICogaW5pdGlhbGl6YXRpb24gYnkgdGhpcyBmdW5jdGlvbiwgdGhlIHZlbmRvci1zcGVjaWZpYyBzdHJ1Y3R1cmUgKnBNRVNwZWMgCisgKiBzaG91bGQgY29udGFpbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBhbGwgbW90aW9uIAorICogZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIHJlY2VpdmVkIHZpYSB0aGUgc3RydWN0dXJlIHBNRVBhcmFtcywgZm9yIGV4YW1wbGUgIAorICogcm5kVmFsLCBzZWFyY2hSYW5nZSwgZXRjLiAgVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIAorICogc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIGJlIGRldGVybWluZWQgdXNpbmcgdGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAyX01FR2V0QnVmU2l6ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgTUVtb2RlIC0gbW90aW9uIGVzdGltYXRpb24gbW9kZTsgYXZhaWxhYmxlIG1vZGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAKKyAqICAgICAgICAgICAgZW51bWVyYXRlZCB0eXBlIE9NWFZDTTRQMk1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC0gbW90aW9uIGVzdGltYXRpb24gcGFyYW1ldGVycyAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHVuaW5pdGlhbGl6ZWQgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBNRVNwZWMgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgcGFyYW1ldGVyIHBNRVBhcmFtcy0+c2VhcmNoUmFuZ2UgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX01FSW5pdCAoCisgICAgT01YVkNNNFAyTUVNb2RlIE1FbW9kZSwKKyAgICBjb25zdCBPTVhWQ000UDJNRVBhcmFtcypwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICAgKDYuMi40LjIuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiBCb3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IG1vdGlvbiB2ZWN0b3JzIGFyZSByZXByZXNlbnRlZCB1c2luZyAKKyAqIGhhbGYtcGl4ZWwgdW5pdHMsIGFuZCB0aGVyZWZvcmUgYSBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IDEgYml0IG1heSBiZSAKKyAqIHJlcXVpcmVkLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoIHRoZSBpbnB1dCBvciBvdXRwdXQgTVZzIHdpdGggb3RoZXIgCisgKiBmdW5jdGlvbnMgdGhhdCBlaXRoZXIgZ2VuZXJhdGUgb3V0cHV0IE1WcyBvciBleHBlY3QgaW5wdXQgTVZzIHJlcHJlc2VudGVkIAorICogdXNpbmcgaW50ZWdlciBwaXhlbCB1bml0cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgTUIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAgRm9yIGV4YW1wbGUsIGlmIHBhZGRpbmcgZXh0ZW5kcyA0IHBpeGVscyBiZXlvbmQgCisgKiAgICAgICAgICAgIGZyYW1lIGJvcmRlciwgdGhlbiB0aGUgdmFsdWUgZm9yIHRoZSBsZWZ0IGJvcmRlciBjb3VsZCBiZSBzZXQgdG8gCisgKiAgICAgICAgICAgIC00LiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMjU2IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2LiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGN1cnJlbnQgcGxhbmUgCisgKiAgIHBTcmNQcmVNViAtIHBvaW50ZXIgdG8gcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3I7IE5VTEwgaW5kaWNhdGVzIG5vIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgTVYgCisgKiAgIHBTcmNQcmVTQUQgLSBwb2ludGVyIHRvIFNBRCBhc3NvY2lhdGVkIHdpdGggdGhlIHByZWRpY3RlZCBNViAocmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgcFNyY1ByZU1WKTsgbWF5IGJlIHNldCB0byBOVUxMIGlmIHVuYXZhaWxhYmxlLiAKKyAqICAgcE1FU3BlYyAtIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgCisgKiAgICAgICAgICAgIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgdGhlbiBpbml0aWFsaXplZCB1c2luZyAKKyAqICAgICAgICAgICAgb214VkNNNFAyX01FSW5pdCBwcmlvciB0byBjYWxsaW5nIHRoZSBibG9jayBtYXRjaGluZyBmdW5jdGlvbi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICAgICAgIHBSZWZSZWN0LCBwU3JjQ3VyckJ1ZmYsIHBDdXJyUG9pbnRQb3MsIHBEc3RNViwgcERzdFNBRCBvciAKKyAqICAgICAgICAgICAgICBwTUVTcGVjLCBvciAKKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX0lOVCByZWZXaWR0aCwKKyAgICBjb25zdCBPTVhSZWN0ICpwUmVmUmVjdCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNDdXJyQnVmLAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY1ByZU1WLAorICAgIGNvbnN0IE9NWF9JTlQgKnBTcmNQcmVTQUQsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBPTVhWQ01vdGlvblZlY3RvcipwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAgICg2LjIuNC4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhbiA4eDggYmxvY2sgc2VhcmNoOyBlc3RpbWF0ZXMgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCAKKyAqIG1pbmltdW0gU0FELiAgQm90aCB0aGUgaW5wdXQgYW5kIG91dHB1dCBtb3Rpb24gdmVjdG9ycyBhcmUgcmVwcmVzZW50ZWQgCisgKiB1c2luZyBoYWxmLXBpeGVsIHVuaXRzLCBhbmQgdGhlcmVmb3JlIGEgc2hpZnQgbGVmdCBvciByaWdodCBieSAxIGJpdCBtYXkgYmUgCisgKiByZXF1aXJlZCwgcmVzcGVjdGl2ZWx5LCB0byBtYXRjaCB0aGUgaW5wdXQgb3Igb3V0cHV0IE1WcyB3aXRoIG90aGVyIAorICogZnVuY3Rpb25zIHRoYXQgZWl0aGVyIGdlbmVyYXRlIG91dHB1dCBNVnMgb3IgZXhwZWN0IGlucHV0IE1WcyByZXByZXNlbnRlZCAKKyAqIHVzaW5nIGludGVnZXIgcGl4ZWwgdW5pdHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIGJsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IDh4OCBibG9jayAKKyAqICAgICAgICAgICAgaW4gdGhlIGN1cnJlbnQgcGxhbmUuIAorICogICByZWZXaWR0aCAtIHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGxhbmUgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHBsYW5lIHJlY3RhbmdsZTsgY29vcmRpbmF0ZXMgCisgKiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgcmVsYXRpdmUgdG8gdGhlIGltYWdlIG9yaWdpbi4gIFJlY3RhbmdsZSAKKyAqICAgICAgICAgICAgYm91bmRhcmllcyBtYXkgZXh0ZW5kIGJleW9uZCBpbWFnZSBib3VuZGFyaWVzIGlmIHRoZSBpbWFnZSBoYXMgCisgKiAgICAgICAgICAgIGJlZW4gcGFkZGVkLiAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4gIFRoZSBudW1iZXIgb2YgCisgKiAgICAgICAgICAgIGJ5dGVzIGJldHdlZW4gbGluZXMgKHN0ZXApIGlzIDE2IGJ5dGVzLiAKKyAqICAgcEN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBwU3JjUHJlTVYgLSBwb2ludGVyIHRvIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yOyBOVUxMIGluZGljYXRlcyBubyAKKyAqICAgICAgICAgICAgcHJlZGljdGVkIE1WIAorICogICBwU3JjUHJlU0FEIC0gcG9pbnRlciB0byBTQUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVkaWN0ZWQgTVYgKHJlZmVyZW5jZWQgCisgKiAgICAgICAgICAgIGJ5IHBTcmNQcmVNVik7IG1heSBiZSBzZXQgdG8gTlVMTCBpZiB1bmF2YWlsYWJsZS4gCisgKiAgIHBNRVNwZWMgLSB2ZW5kb3Itc3BlY2lmaWMgbW90aW9uIGVzdGltYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmU7IAorICogICAgICAgICAgICBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgYW5kIHRoZW4gaW5pdGlhbGl6ZWQgdXNpbmcgCisgKiAgICAgICAgICAgIG9teFZDTTRQMl9NRUluaXQgcHJpb3IgdG8gY2FsbGluZyB0aGUgYmxvY2sgbWF0Y2hpbmcgZnVuY3Rpb24uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TVYgLSBwb2ludGVyIHRvIGVzdGltYXRlZCBNViAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gbWluaW11bSBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMuICBSZXR1cm5lZCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjUmVmQnVmLCAKKyAqICAgICAgICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwQ3VyclBvaW50UG9zLCBwRHN0TVYsIHBEc3RTQUQgb3IgCisgKiAgICAgICAgICAgICAgcE1FU3BlYywgb3IgCisgKiAgICAtICAgIHBTcmNDdXJyQnVmIGlzIG5vdCA4LWJ5dGUgYWxpZ25lZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwQ3VyclBvaW50UG9zLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjUHJlTVYsCisgICAgY29uc3QgT01YX0lOVCAqcFNyY1ByZVNBRCwKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfQmxvY2tNYXRjaF9IYWxmXzE2eDE2ICAgKDYuMi40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGEgMTZ4MTYgYmxvY2sgbWF0Y2ggd2l0aCBoYWxmLXBpeGVsIHJlc29sdXRpb24uICBSZXR1cm5zIHRoZSAKKyAqIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yIGFuZCBhc3NvY2lhdGVkIG1pbmltdW0gU0FELiAgVGhpcyBmdW5jdGlvbiAKKyAqIGVzdGltYXRlcyB0aGUgaGFsZi1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGludGVnZXIgCisgKiByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlZCBieSB0aGUgaW5wdXQgcGFyYW1ldGVyIHBTcmNEc3RNViwgaS5lLiwgCisgKiB0aGUgaW5pdGlhbCBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGlucHV0IHBhcmFtZXRlcnMgCisgKiBwU3JjUmVmQnVmIGFuZCBwU2VhcmNoUG9pbnRSZWZQb3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgYnkgdGhlIHdpbm5pbmcgTVYgb2YgCisgKiAxNngxNiBpbnRlZ2VyIHNlYXJjaCBwcmlvciB0byBjYWxsaW5nIEJsb2NrTWF0Y2hfSGFsZl8xNngxNi4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzE2eDE2IG1heSBiZSB1c2VkIGZvciBpbnRlZ2VyIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUmVmQnVmIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIFkgcGxhbmU7IHBvaW50cyB0byB0aGUgcmVmZXJlbmNlIAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgcmVmV2lkdGggLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBsYW5lIAorICogICBwUmVmUmVjdCAtIHJlZmVyZW5jZSBwbGFuZSB2YWxpZCByZWdpb24gcmVjdGFuZ2xlIAorICogICBwU3JjQ3VyckJ1ZiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayAKKyAqICAgICAgICAgICAgYnVmZmVyIGV4dHJhY3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBwbGFuZSAobGluZWFyIGFycmF5LCAyNTYgCisgKiAgICAgICAgICAgIGVudHJpZXMpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLCBpLmUuLCB0aGUgcmVmZXJlbmNlIHBvc2l0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIAorICogICAgICAgICAgICBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvci4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqICAgcFNyY0RzdE1WIC0gcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBlc3RpbWF0ZTsgdHlwaWNhbGx5IGdlbmVyYXRlZCAKKyAqICAgICAgICAgICAgZHVyaW5nIGEgcHJpb3IgMTZYMTYgaW50ZWdlciBzZWFyY2g7IHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNSZWZCdWYsIAorICogICAgICAgICBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVi4KKyAqICAgIC0gICAgcFNyY0N1cnJCdWYgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZCwgb3IgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl8xNngxNiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmQnVmLAorICAgIE9NWF9JTlQgcmVmV2lkdGgsCisgICAgY29uc3QgT01YUmVjdCAqcFJlZlJlY3QsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBjb25zdCBPTVhWQ000UDJDb29yZGluYXRlICpwU2VhcmNoUG9pbnRSZWZQb3MsCisgICAgT01YX0lOVCBybmRWYWwsCisgICAgT01YVkNNb3Rpb25WZWN0b3IgKnBTcmNEc3RNViwKKyAgICBPTVhfSU5UICpwRHN0U0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9CbG9ja01hdGNoX0hhbGZfOHg4ICAgKDYuMi40LjIuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGFuIDh4OCBibG9jayBtYXRjaCB3aXRoIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbi4gUmV0dXJucyB0aGUgCisgKiBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvciBhbmQgYXNzb2NpYXRlZCBtaW5pbXVtIFNBRC4gIFRoaXMgZnVuY3Rpb24gCisgKiBlc3RpbWF0ZXMgdGhlIGhhbGYtcGl4ZWwgbW90aW9uIHZlY3RvciBieSBpbnRlcnBvbGF0aW5nIHRoZSBpbnRlZ2VyIAorICogcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0TVYsIGkuZS4sIAorICogdGhlIGluaXRpYWwgaW50ZWdlciBNViBpcyBnZW5lcmF0ZWQgZXh0ZXJuYWxseS4gIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIAorICogcFNyY1JlZkJ1ZiBhbmQgcFNlYXJjaFBvaW50UmVmUG9zIHNob3VsZCBiZSBzaGlmdGVkIGJ5IHRoZSB3aW5uaW5nIE1WIG9mIAorICogOHg4IGludGVnZXIgc2VhcmNoIHByaW9yIHRvIGNhbGxpbmcgQmxvY2tNYXRjaF9IYWxmXzh4OC4gVGhlIGZ1bmN0aW9uIAorICogQmxvY2tNYXRjaF9JbnRlZ2VyXzh4OCBtYXkgYmUgdXNlZCBmb3IgaW50ZWdlciBtb3Rpb24gZXN0aW1hdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY1JlZkJ1ZiAtIHBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBZIHBsYW5lOyBwb2ludHMgdG8gdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgYmxvY2sgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgOHg4IGJsb2NrIAorICogICAgICAgICAgICBpbiB0aGUgY3VycmVudCBwbGFuZS4gCisgKiAgIHJlZldpZHRoIC0gd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBwbGFuZSAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSAKKyAqICAgcFNyY0N1cnJCdWYgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgCisgKiAgICAgICAgICAgIGJ1ZmZlciBleHRyYWN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgcGxhbmUgKGxpbmVhciBhcnJheSwgMTI4IAorICogICAgICAgICAgICBlbnRyaWVzKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG51bWJlciBvZiAKKyAqICAgICAgICAgICAgYnl0ZXMgYmV0d2VlbiBsaW5lcyAoc3RlcCkgaXMgMTYuIAorICogICBwU2VhcmNoUG9pbnRSZWZQb3MgLSBwb3NpdGlvbiBvZiB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGhhbGYgcGl4ZWwgCisgKiAgICAgICAgICAgIHNlYXJjaCAoc3BlY2lmaWVkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWwgdW5pdHMpIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBsYW5lLiAKKyAqICAgcm5kVmFsIC0gcm91bmRpbmcgY29udHJvbCBwYXJhbWV0ZXI6IDAgLSBkaXNhYmxlZDsgMSAtIGVuYWJsZWQuIAorICogICBwU3JjRHN0TVYgLSBwb2ludGVyIHRvIHRoZSBpbml0aWFsIE1WIGVzdGltYXRlOyB0eXBpY2FsbHkgZ2VuZXJhdGVkIAorICogICAgICAgICAgICBkdXJpbmcgYSBwcmlvciA4eDggaW50ZWdlciBzZWFyY2gsIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiAKKyAqICAgICAgICAgICAgaGFsZi1waXhlbCB1bml0cy4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3RNViAtIHBvaW50ZXIgdG8gZXN0aW1hdGVkIE1WIAorICogICBwRHN0U0FEIC0gcG9pbnRlciB0byBtaW5pbXVtIFNBRCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwU3JjUmVmQnVmLCBwUmVmUmVjdCwgcFNyY0N1cnJCdWZmLCBwU2VhcmNoUG9pbnRSZWZQb3MsIHBTcmNEc3RNVgorICogICAgLSAgICBwU3JjQ3VyckJ1ZiBpcyBub3QgOC1ieXRlIGFsaWduZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0Jsb2NrTWF0Y2hfSGFsZl84eDggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1ZiwKKyAgICBPTVhfSU5UIHJlZldpZHRoLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcFNlYXJjaFBvaW50UmVmUG9zLAorICAgIE9NWF9JTlQgcm5kVmFsLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0TVYsCisgICAgT01YX0lOVCAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfTW90aW9uRXN0aW1hdGlvbk1CICAgKDYuMi40LjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIG1vdGlvbiBzZWFyY2ggZm9yIGEgMTZ4MTYgbWFjcm9ibG9jay4gIFNlbGVjdHMgYmVzdCBtb3Rpb24gc2VhcmNoIAorICogc3RyYXRlZ3kgZnJvbSBhbW9uZyBpbnRlci0xTVYsIGludGVyLTRNViwgYW5kIGludHJhIG1vZGVzLiAgU3VwcG9ydHMgCisgKiBpbnRlZ2VyIGFuZCBoYWxmIHBpeGVsIHJlc29sdXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gcG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IE1CIGluIHRoZSAKKyAqICAgICAgICAgICAgb3JpZ2luYWwgcGljdHVyZSBwbGFuZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIAorICogICAgICAgICAgICBUaGUgZnVuY3Rpb24gZG9lcyBub3QgZXhwZWN0IHNvdXJjZSBkYXRhIG91dHNpZGUgdGhlIHJlZ2lvbiAKKyAqICAgICAgICAgICAgYm91bmRlZCBieSB0aGUgTUIgdG8gYmUgYXZhaWxhYmxlOyBmb3IgZXhhbXBsZSBpdCBpcyBub3QgCisgKiAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBndWFyYW50ZWUgdGhlIGF2YWlsYWJpbGl0eSBvZiAKKyAqICAgICAgICAgICAgcFNyY0N1cnJCdWZbLVNyY0N1cnJTdGVwXSwgaS5lLiwgdGhlIHJvdyBvZiBwaXhlbHMgYWJvdmUgdGhlIE1CIAorICogICAgICAgICAgICB0byBiZSBwcm9jZXNzZWQuIAorICogICBzcmNDdXJyU3RlcCAtIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBTcmNSZWZCdWYgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgWSBwbGFuZTsgcG9pbnRzIHRvIHRoZSByZWZlcmVuY2UgCisgKiAgICAgICAgICAgIHBsYW5lIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHNyY1JlZlN0ZXAgLSB3aWR0aCBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSByZWZlcmVuY2UgcGxhbmUgdmFsaWQgcmVnaW9uIHJlY3RhbmdsZSwgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIAorICogICAgICAgICAgICB0aGUgaW1hZ2Ugb3JpZ2luIAorICogICBwQ3VyclBvaW50UG9zIC0gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBpbiB0aGUgY3VycmVudCBwbGFuZSAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIHZlbmRvci1zcGVjaWZpYyBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIAorICogICAgICAgICAgICBzdHJ1Y3R1cmU7IG11c3QgYmUgYWxsb2NhdGVkIGFuZCB0aGVuIGluaXRpYWxpemVkIHVzaW5nIAorICogICAgICAgICAgICBvbXhWQ000UDJfTUVJbml0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gCisgKiAgIHBNQkluZm8gLSBhcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIG5lYXJieSBNQnM6IAorICogICAgICAgICAgICAtICAgcE1CSW5mb1swXSAtIHBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMV0gLSBwb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgIHBNQkluZm9bMl0gLSBwb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICAgcE1CSW5mb1szXSAtIHBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBBbnkgcG9pbnRlciBpbiB0aGUgYXJyYXkgbWF5IGJlIHNldCBlcXVhbCB0byBOVUxMIGlmIHRoZSAKKyAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyBNQiBkb2Vzbid0IGV4aXN0LiAgRm9yIGVhY2ggTUIsIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIAorICogICAgICAgICAgICBtZW1iZXJzIGFyZSB1c2VkOiAgICAKKyAqICAgICAgICAgICAgLSAgIG1iVHlwZSAtIG1hY3JvYmxvY2sgdHlwZSwgZWl0aGVyIE9NWF9WQ19JTlRSQSwgT01YX1ZDX0lOVEVSLCBvciAKKyAqICAgICAgICAgICAgICAgIE9NWF9WQ19JTlRFUjRWIAorICogICAgICAgICAgICAtICAgcE1WMFsyXVsyXSAtIGVzdGltYXRlZCBtb3Rpb24gdmVjdG9yczsgcmVwcmVzZW50ZWQgCisgKiAgICAgICAgICAgICAgICBpbiAxLzIgcGl4ZWwgdW5pdHMgCisgKiAgICAgICAgICAgIC0gICBzbGljZUlEIC0gbnVtYmVyIG9mIHRoZSBzbGljZSB0byB3aGljaCB0aGUgTUIgYmVsb25ncyAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBNQi4gIAorICogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVudHJpZXMgc2hvdWxkIGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb246IHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuICBUaGUgc3RydWN0dXJlIGVsZW1lbnRzIGNicHkgYW5kIGNicGMgYXJlIAorICogICAgICAgICAgICBpZ25vcmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdE1CQ3VyciAtIHBvaW50ZXIgdG8gdXBkYXRlZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBNQiBhZnRlciBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQuICBUaGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUgbWVtYmVycyBhcmUgdXBkYXRlZCBieSB0aGUgTUUgZnVuY3Rpb246ICAgCisgKiAgICAgICAgICAgICAgLSAgbWJUeXBlIC0gbWFjcm9ibG9jayB0eXBlOiBPTVhfVkNfSU5UUkEsIE9NWF9WQ19JTlRFUiwgb3IgCisgKiAgICAgICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYuIAorICogICAgICAgICAgICAgIC0gIHBNVjBbMl1bMl0gLSBlc3RpbWF0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIGluIAorICogICAgICAgICAgICAgICAgIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICAgIC0gIHBNVlByZWRbMl1bMl0gLSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcnM7IHJlcHJlc2VudGVkIAorICogICAgICAgICAgICAgICAgIGluIHRlcm1zIG9mIDEvMiBwZWwgdW5pdHMuIAorICogICAgICAgICAgICBUaGUgc3RydWN0dXJlIG1lbWJlcnMgY2JweSBhbmQgY2JwYyBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uLiAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIG1pbmltdW0gU0FEIGZvciBJTlRFUjFWLCBvciBzdW0gb2YgbWluaW11bSBTQURzIAorICogICAgICAgICAgICBmb3IgSU5URVI0ViAKKyAqICAgcERzdEJsb2NrU0FEIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBTQUQgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBmb3VyIAorICogICAgICAgICAgICA4eDggbHVtYSBibG9ja3MgaW4gdGhlIE1CLiAgVGhlIGJsb2NrIFNBRHMgYXJlIGluIHNjYW4gb3JkZXIgZm9yIAorICogICAgICAgICAgICBlYWNoIE1CLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cy4gIFJldHVybmVkIGlmIG9uZSBvciBtb3JlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgICAgIHBTcmNSZWZCdWYsIHBSZWZSZWN0LCBwQ3VyclBvaW50UG9zLCBwTUJJbnRlciwgcE1CSW50cmEsIAorICogICAgICAgICAgICAgIHBTcmNEc3RNQkN1cnIsIG9yIHBEc3RTQUQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9Nb3Rpb25Fc3RpbWF0aW9uTUIgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0N1cnJCdWYsCisgICAgT01YX1MzMiBzcmNDdXJyU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWZCdWYsCisgICAgT01YX1MzMiBzcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QqcFJlZlJlY3QsCisgICAgY29uc3QgT01YVkNNNFAyQ29vcmRpbmF0ZSAqcEN1cnJQb2ludFBvcywKKyAgICB2b2lkICpwTUVTcGVjLAorICAgIGNvbnN0IE9NWFZDTTRQMk1CSW5mb1B0ciAqcE1CSW5mbywKKyAgICBPTVhWQ000UDJNQkluZm8gKnBTcmNEc3RNQkN1cnIsCisgICAgT01YX1UxNiAqcERzdFNBRCwKKyAgICBPTVhfVTE2ICpwRHN0QmxvY2tTQUQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RDVDh4OGJsayAgICg2LjIuNC40LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBDb21wdXRlcyBhIDJEIGZvcndhcmQgRENUIGZvciBhIHNpbmdsZSA4eDggYmxvY2ssIGFzIGRlZmluZWQgaW4gCisgKiBbSVNPMTQ0OTYtMl0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZWFybHkgYXJyYW5nZWQgaW5wdXQgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gIElucHV0IHZhbHVlcyAocGl4ZWwgCisgKiAgICAgICAgICAgIGludGVuc2l0aWVzKSBhcmUgdmFsaWQgaW4gdGhlIHJhbmdlIFstMjU1LDI1NV0uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmVhcmx5IGFycmFuZ2VkIG91dHB1dCBidWZmZXI7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgcmV0dXJuZWQgaWY6CisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EQ1Q4eDhibGsgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfUXVhbnRJbnRyYV9JICAgKDYuMi40LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIHF1YW50aXphdGlvbiBvbiBpbnRyYSBibG9jayBjb2VmZmljaWVudHMuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgCisgKiBiaXRzX3Blcl9waXhlbCA9PSA4LiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgaW50cmEgYmxvY2sgY29lZmZpY2llbnRzOyBtdXN0IGJlIGFsaWduZWQgCisgKiAgICAgICAgICAgIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKS4gCisgKiAgIGJsb2NrSW5kZXggLSBibG9jayBpbmRleCBpbmRpY2F0aW5nIHRoZSBjb21wb25lbnQgdHlwZSBhbmQgcG9zaXRpb24sIAorICogICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1LCBhcyBkZWZpbmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIAorICogICAgICAgICAgICA2LjEuMy44LiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgc2hvcnRWaWRlb0hlYWRlcj09MSBzZWxlY3RzIGxpbmVhciBpbnRyYSBEQyAKKyAqICAgICAgICAgICAgbW9kZSwgYW5kIHNob3J0VmlkZW9IZWFkZXI9PTAgc2VsZWN0cyBub24gbGluZWFyIGludHJhIERDIG1vZGUuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChxdWFudGl6ZWQpIGludGVyYmxvY2sgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIFdoZW4gc2hvcnRWaWRlb0hlYWRlcj09MSwgQUMgY29lZmZpY2llbnRzIGFyZSBzYXR1cmF0ZWQgb24gdGhlIAorICogICAgICAgICAgICBpbnRlcnZhbCBbLTEyNywgMTI3XSwgYW5kIERDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWzEsIDI1NF0uICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTAsIEFDIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgYXJlIHNhdHVyYXRlZCBvbiB0aGUgaW50ZXJ2YWwgWy0yMDQ3LCAyMDQ3XS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIGJsb2NrSW5kZXggPCAwIG9yIGJsb2NrSW5kZXggPj0gMTAgCisgKiAgICAtICAgIFFQIDw9IDAgb3IgUVAgPj0gMzIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1U4IFFQLAorICAgIE9NWF9JTlQgYmxvY2tJbmRleCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1F1YW50SW50ZXJfSSAgICg2LjIuNC40LjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBxdWFudGl6YXRpb24gb24gYW4gaW50ZXIgY29lZmZpY2llbnQgYmxvY2s7IHN1cHBvcnRzIAorICogYml0c19wZXJfcGl4ZWwgPT0gOC4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IGludGVyIGJsb2NrIGNvZWZmaWNpZW50czsgbXVzdCBiZSBhbGlnbmVkIAorICogICAgICAgICAgICBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKHF1YW50aXplcl9zY2FsZSkgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlcjsgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCAocXVhbnRpemVkKSBpbnRlcmJsb2NrIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICBXaGVuIHNob3J0VmlkZW9IZWFkZXI9PTEsIEFDIGNvZWZmaWNpZW50cyBhcmUgc2F0dXJhdGVkIG9uIHRoZSAKKyAqICAgICAgICAgICAgaW50ZXJ2YWwgWy0xMjcsIDEyN10sIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIHNhdHVyYXRlZCBvbiB0aGUgCisgKiAgICAgICAgICAgIGludGVydmFsIFsxLCAyNTRdLiAgV2hlbiBzaG9ydFZpZGVvSGVhZGVyPT0wLCBBQyBjb2VmZmljaWVudHMgCisgKiAgICAgICAgICAgIGFyZSBzYXR1cmF0ZWQgb24gdGhlIGludGVydmFsIFstMjA0NywgMjA0N10uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOgorICogICAgLSAgICBwU3JjRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBRUCA8PSAwIG9yIFFQID49IDMyLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUXVhbnRJbnRlcl9JICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9VOCBRUCwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludHJhICAgKDYuMi40LjQuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cywgaW1wbGVtZW50cyBpbnRyYSBibG9jayBBQy9EQyBjb2VmZmljaWVudCAKKyAqIHByZWRpY3Rpb24sIGFuZCByZWNvbnN0cnVjdHMgdGhlIGN1cnJlbnQgaW50cmEgYmxvY2sgdGV4dHVyZSBmb3IgcHJlZGljdGlvbiAKKyAqIG9uIHRoZSBuZXh0IGZyYW1lLiAgUXVhbnRpemVkIHJvdyBhbmQgY29sdW1uIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gCisgKiB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCBidWZmZXJzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgcGl4ZWxzIG9mIGN1cnJlbnQgaW50cmEgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZSb3cgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCByb3cgYnVmZmVyIGNvbnRhaW5pbmcgCisgKiAgICAgICAgICAgICgobnVtX21iX3Blcl9yb3cgKiAyICsgMSkgKiA4KSBlbGVtZW50cyBvZiB0eXBlIE9NWF9TMTYuIAorICogICAgICAgICAgICBDb2VmZmljaWVudHMgYXJlIG9yZ2FuaXplZCBpbnRvIGJsb2NrcyBvZiBlaWdodCBhcyBkZXNjcmliZWQgCisgKiAgICAgICAgICAgIGJlbG93IChJbnRlcm5hbCBQcmVkaWN0aW9uIENvZWZmaWNpZW50IFVwZGF0ZSBQcm9jZWR1cmVzKS4gIFRoZSAKKyAqICAgICAgICAgICAgREMgY29lZmZpY2llbnQgaXMgZmlyc3QsIGFuZCB0aGUgcmVtYWluaW5nIGJ1ZmZlciBsb2NhdGlvbnMgCisgKiAgICAgICAgICAgIGNvbnRhaW4gdGhlIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMuIEVhY2ggZ3JvdXAgb2YgZWlnaHQgcm93IAorICogICAgICAgICAgICBidWZmZXIgZWxlbWVudHMgY29tYmluZWQgd2l0aCBvbmUgZWxlbWVudCBlaWdodCBlbGVtZW50cyBhaGVhZCAKKyAqICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IHByZWRpY3RvcnMgb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrIAorICogICAgICAgICAgICB0aGF0IGlzIHNwYXRpYWxseSBhYm92ZSBvciB0byB0aGUgbGVmdCBvZiB0aGUgYmxvY2sgY3VycmVudGx5IHRvIAorICogICAgICAgICAgICBiZSBkZWNvZGVkLiBBIG5lZ2F0aXZlLXZhbHVlZCBEQyBjb2VmZmljaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIAorICogICAgICAgICAgICBuZWlnaGJvcmluZyBibG9jayBpcyBub3QgSU5UUkEtY29kZWQgb3Igb3V0IG9mIGJvdW5kcywgYW5kIAorICogICAgICAgICAgICB0aGVyZWZvcmUgdGhlIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgYXJlIGludmFsaWQuICBQb2ludGVyIG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFByZWRCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgCisgKiAgICAgICAgICAgIGNvbnRhaW5pbmcgMTYgZWxlbWVudHMgb2YgdHlwZSBPTVhfUzE2LiBDb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBvcmdhbml6ZWQgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gNi4yLjIuNS4gIFBvaW50ZXIgbXVzdCBiZSAKKyAqICAgICAgICAgICAgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwU3VtRXJyIC0gcG9pbnRlciB0byBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBBQyBwcmVkaWN0aW9uIGlzIAorICogICAgICAgICAgICByZXF1aXJlZDsgQUMgcHJlZGljdGlvbiBpcyBlbmFibGVkIGlmICpwU3VtRXJyID49MCwgYnV0IHRoZSAKKyAqICAgICAgICAgICAgdmFsdWUgaXMgbm90IHVzZWQgZm9yIGNvZWZmaWNpZW50IHByZWRpY3Rpb24sIGkuZS4sIHRoZSBzdW0gb2YgCisgKiAgICAgICAgICAgIGFic29sdXRlIGRpZmZlcmVuY2VzIHN0YXJ0cyBmcm9tIDAgZm9yIGVhY2ggY2FsbCB0byB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gIE90aGVyd2lzZSBBQyBwcmVkaWN0aW9uIGlzIGRpc2FibGVkIGlmICpwU3VtRXJyIDwgMCAuIAorICogICBibG9ja0luZGV4IC0gYmxvY2sgaW5kZXggaW5kaWNhdGluZyB0aGUgY29tcG9uZW50IHR5cGUgYW5kIHBvc2l0aW9uLCBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LiAKKyAqICAgY3VyUXAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHRvIHdoaWNoIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBibG9jayBiZWxvbmdzIAorICogICBwUXBCdWYgLSBwb2ludGVyIHRvIGEgMi1lbGVtZW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgYnVmZmVyOyBwUXBCdWZbMF0gCisgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgOHg4IAorICogICAgICAgICAgICBibG9jayBsZWZ0IG9mIHRoZSBjdXJyZW50IGJsb2NrIChRUGEpLCBhbmQgcFFwQnVmWzFdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBhc3NvY2lhdGVkIHdpdGggdGhlIDh4OCBibG9jayBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgYmxvY2sgKFFQYykuICBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyAKKyAqICAgICAgICAgICAgYmxvY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk9QIGJvdW5kLCB0aGUgUXAgdmFsdWUgd2lsbCBub3QgYWZmZWN0IAorICogICAgICAgICAgICB0aGUgaW50cmEgcHJlZGljdGlvbiBwcm9jZXNzLCBhcyBkZXNjcmliZWQgaW4gW0lTTzE0NDk2LTJdLCAKKyAqICAgICAgICAgICAgc3ViLWNsYXVzZSA3LjQuMy4zLCAgQWRhcHRpdmUgQUMgQ29lZmZpY2llbnQgUHJlZGljdGlvbi4gIAorICogICBzcmNTdGVwIC0gd2lkdGggb2YgdGhlIHNvdXJjZSBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIHdpZHRoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIHF1YW50aXplZCBEQ1QgY29lZmZpY2llbnQgYnVmZmVyOyBwRHN0WzBdIGNvbnRhaW5zIAorICogICAgICAgICAgICB0aGUgcHJlZGljdGVkIERDIGNvZWZmaWNpZW50OyB0aGUgcmVtYWluaW5nIGVudHJpZXMgY29udGFpbiB0aGUgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBBQyBjb2VmZmljaWVudHMgKHdpdGhvdXQgcHJlZGljdGlvbikuICBUaGUgcG9pbnRlciAKKyAqICAgICAgICAgICAgcERzdG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuIAorICogICBwUmVjIC0gcG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCB0ZXh0dXJlOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gCisgKiAgICAgICAgICAgIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAKKyAqICAgcFByZUFDUHJlZGljdCAtIGlmIHByZWRpY3Rpb24gaXMgZW5hYmxlZCwgdGhlIHBhcmFtZXRlciBwb2ludHMgdG8gdGhlIAorICogICAgICAgICAgICBzdGFydCBvZiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGNvZWZmaWNpZW50IGRpZmZlcmVuY2VzIGZvciAKKyAqICAgICAgICAgICAgVkxDIGVuY29kaW5nLiBUaGUgZW50cnkgcFByZUFDUHJlZGljdFswXWluZGljYXRlcyBwcmVkaWN0aW9uIAorICogICAgICAgICAgICBkaXJlY3Rpb24gZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgdmFsdWVzOiBPTVhfVkNfTk9ORSAocHJlZGljdGlvbiBkaXNhYmxlZCksIE9NWF9WQ19IT1JJWk9OVEFMLCBvciAKKyAqICAgICAgICAgICAgT01YX1ZDX1ZFUlRJQ0FMLiAgVGhlIGVudHJpZXMgCisgKiAgICAgICAgICAgIHBQcmVBQ1ByZWRpY3RbMV0tcFByZUFDUHJlZGljdFs3XWNvbnRhaW4gcHJlZGljdGVkIEFDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMuICBJZiBwcmVkaWN0aW9uIGlzIGRpc2FibGVkICgqcFN1bUVycjwwKSB0aGVuIHRoZSAKKyAqICAgICAgICAgICAgY29udGVudHMgb2YgdGhpcyBidWZmZXIgYXJlIHVuZGVmaW5lZCB1cG9uIHJldHVybiBmcm9tIHRoZSAKKyAqICAgICAgICAgICAgZnVuY3Rpb24gCisgKiAgIHBTdW1FcnIgLSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgYWNjdW11bGF0ZWQgQUMgY29lZmZpY2llbnQgZXJyb3JzLCAKKyAqICAgICAgICAgICAgaS5lLiwgc3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgCisgKiAgICAgICAgICAgIHVucHJlZGljdGVkIEFDIGNvZWZmaWNpZW50cyAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcERzdCwgcFJlYywgCisgKiAgICAgICAgIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgcFFwQnVmLCBwUHJlQUNQcmVkaWN0LCBwU3VtRXJyLiAKKyAqICAgIC0gICAgYmxvY2tJbmRleCA8IDAgb3IgYmxvY2tJbmRleCA+PSAxMDsgCisgKiAgICAtICAgIGN1clFQIDw9IDAgb3IgY3VyUVAgPj0gMzIuIAorICogICAgLSAgICBzcmNTdGVwLCBvciBkc3RTdGVwIDw9IDAgb3Igbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZDogLiAKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IDgtYnl0ZSBhbGlnbmVkOiAKKyAqICAgICAgICAgcFNyYywgcFJlYy4gIAorICoKKyAqICBOb3RlOiBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICB1cGRhdGUgcHJvY2VkdXJlcyBkZWZpbmVkIGluIHNlY3Rpb24gaW4gNi4yLjIuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRyYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4ICpwUmVjLAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9TMTYgKnBQcmVBQ1ByZWRpY3QsCisgICAgT01YX0lOVCAqcFN1bUVyciwKKyAgICBPTVhfSU5UIGJsb2NrSW5kZXgsCisgICAgT01YX1U4IGN1clFwLAorICAgIGNvbnN0IE9NWF9VOCAqcFFwQnVmLAorICAgIE9NWF9JTlQgc3JjU3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9UcmFuc1JlY0Jsb2NrQ29lZl9pbnRlciAgICg2LjIuNC40LjUpCisgKgorICogRGVzY3JpcHRpb246CisgKiBJbXBsZW1lbnRzIERDVCwgYW5kIHF1YW50aXplcyB0aGUgRENUIGNvZWZmaWNpZW50cyBvZiB0aGUgaW50ZXIgYmxvY2sgCisgKiB3aGlsZSByZWNvbnN0cnVjdGluZyB0aGUgdGV4dHVyZSByZXNpZHVhbC4gVGhlcmUgaXMgbm8gYm91bmRhcnkgY2hlY2sgZm9yIAorICogdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1wb2ludGVyIHRvIHRoZSByZXNpZHVhbHMgdG8gYmUgZW5jb2RlZDsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIAorICogICAgICAgICAgICAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygc2hvcnRfdmlkZW9faGVhZGVyOyAKKyAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgbW9kZSwgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFJlYyAtIHBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgdGV4dHVyZSByZXNpZHVhbHM7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgZWl0aGVyIE5VTEwgb3IgCisgKiAgICAgICAgIG5vdCAxNi1ieXRlIGFsaWduZWQ6IAorICogICAgICAgICAgICAtIHBTcmMgCisgKiAgICAgICAgICAgIC0gcERzdAorICogICAgICAgICAgICAtIHBSZWMKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PSAzMi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX1RyYW5zUmVjQmxvY2tDb2VmX2ludGVyICgKKyAgICBjb25zdCBPTVhfUzE2ICpwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1MxNiAqcFJlYywKKyAgICBPTVhfVTggUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICJJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmciLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBkb3VibGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXRzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3LiAKKyAqICAgcFFEY3RCbGtDb2VmIC0gcG9pbnRlciB0byB0aGUgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudCAKKyAqICAgcHJlZERpciAtIEFDIHByZWRpY3Rpb24gZGlyZWN0aW9uLCB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB0aGUgemlnemFnIAorICogICAgICAgICAgICBzY2FuIHBhdHRlcm47IHRha2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19OT05FIC0gQUMgcHJlZGljdGlvbiBub3QgdXNlZC4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLXZlcnRpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgcHJlZGljdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgcGF0dGVybiAtIGJsb2NrIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCB0byBkZWNpZGUgd2hldGhlciB0aGlzIGJsb2NrIGlzIAorICogICAgICAgICAgICBlbmNvZGVkIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlLCBjaHJvbWluYW5jZSkgb2YgdGhlIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBlbmNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIuIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gQmFkIGFyZ3VtZW50czoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgICpwcEJpdFN0cmVhbSwgcEJpdE9mZnNldCwgcFFEY3RCbGtDb2VmLiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgUHJlZERpciBpcyBub3Qgb25lIG9mOiBPTVhfVkNfTk9ORSwgT01YX1ZDX0hPUklaT05UQUwsIG9yIAorICogICAgICAgICBPTVhfVkNfVkVSVElDQUwuIAorICogICAgLSAgICBWaWRlb0NvbXAgaXMgbm90IG9uZSBjb21wb25lbnQgb2YgZW51bSBPTVhWQ000UDJWaWRlb0NvbXBvbmVudC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0VuY29kZVZMQ1ppZ3phZ19JbnRyYURDVkxDICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcHJlZERpciwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIsCisgICAgT01YVkNNNFAyVmlkZW9Db21wb25lbnQgdmlkZW9Db21wCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9FbmNvZGVWTENaaWd6YWdfSW50cmFBQ1ZMQyAgICg2LjIuNC41LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyB6aWd6YWcgc2NhbiBhbmQgVkxDIGVuY29kaW5nIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgZm9yIG9uZSAKKyAqIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgcHJvdmlkZWQgCisgKiBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uIFZhbGlkIHdpdGhpbiAwIHRvIDcuIAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb24sIHdoaWNoIGlzIHVzZWQgdG8gZGVjaWRlIHRoZSB6aWd6YWcgCisgKiAgICAgICAgICAgIHNjYW4gcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX05PTkUgLSBBQyBwcmVkaWN0aW9uIG5vdCB1c2VkLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgY2xhc3NpY2FsIHppZ3phZyBzY2FuLiAKKyAqICAgICAgICAgICAgLSAgT01YX1ZDX0hPUklaT05UQUwgLSBIb3Jpem9udGFsIHByZWRpY3Rpb24uICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uLiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyZm9ybXMgYWx0ZXJuYXRlLWhvcml6b250YWwgemlnemFnIHNjYW4uIAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlci4gCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0uIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBCYWQgYXJndW1lbnRzOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwcEJpdFN0cmVhbSwgCisgKiAgICAgICAgICAgICAgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwUURjdEJsa0NvZWYuIAorICogICAgLSAgICpwQml0T2Zmc2V0IDwgMCwgb3IgKnBCaXRPZmZzZXQgPjcuIAorICogICAgLSAgICBQcmVkRGlyIGlzIG5vdCBvbmUgb2Y6IE9NWF9WQ19OT05FLCBPTVhfVkNfSE9SSVpPTlRBTCwgb3IgCisgKiAgICAgICAgIE9NWF9WQ19WRVJUSUNBTC4gCisgKiAgICAtICAgIFZpZGVvQ29tcCBpcyBub3Qgb25lIGNvbXBvbmVudCBvZiBlbnVtIE9NWFZDTTRQMlZpZGVvQ29tcG9uZW50LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludHJhQUNWTEMgKAorICAgIE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgY29uc3QgT01YX1MxNiAqcFFEY3RCbGtDb2VmLAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9VOCBwYXR0ZXJuLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlcgorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICAgKDYuMi40LjUuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBlbmNvZGluZyBmb3Igb25lIGludGVyIGJsb2NrLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IAorICogICAgICAgICAgICBzdHJlYW0gCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtLiBWYWxpZCB3aXRoaW4gMCB0byA3IAorICogICBwUURjdEJsa0NvZWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50IAorICogICBwYXR0ZXJuIC0gYmxvY2sgcGF0dGVybiB3aGljaCBpcyB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoaXMgYmxvY2sgaXMgCisgKiAgICAgICAgICAgIGVuY29kZWQgCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGVuY29kZWQgc28gdGhhdCAKKyAqICAgICAgICAgICAgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIEJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnM6IGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIAorICogICAgICAgICAgICAgIHBCaXRPZmZzZXQsIHBRRGN0QmxrQ29lZiAKKyAqICAgIC0gICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRW5jb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIGNvbnN0IE9NWF9TMTYgKnBRRGN0QmxrQ29lZiwKKyAgICBPTVhfVTggcGF0dGVybiwKKyAgICBPTVhfSU5UIHNob3J0VmlkZW9IZWFkZXIKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0VuY29kZU1WICAgKDYuMi40LjUuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFByZWRpY3RzIGEgbW90aW9uIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgZW5jb2RlcyB0aGUgCisgKiBkaWZmZXJlbmNlLCBhbmQgd3JpdGVzIHRoZSBvdXRwdXQgdG8gdGhlIHN0cmVhbSBidWZmZXIuIFRoZSBpbnB1dCBNVnMgCisgKiBwTVZDdXJNQiwgcFNyY01WTGVmdE1CLCBwU3JjTVZVcHBlck1CLCBhbmQgcFNyY01WVXBwZXJSaWdodE1CIHNob3VsZCBsaWUgCisgKiB3aXRoaW4gdGhlIHJhbmdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGlucHV0IHBhcmFtZXRlciBmY29kZUZvcndhcmQsIGFzIAorICogZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4zLiAgVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBhIAorICogc3VwZXJzZXQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAKKyAqIG9teFZDTTRQMl9GaW5kTVZwcmVkLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBpbmRleCBvZiB0aGUgZmlyc3QgZnJlZSAobmV4dCBhdmFpbGFibGUpIGJpdCBpbiB0aGUgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0sIHZhbGlkIGluIHRoZSByYW5nZSAwIHRvIDcuIAorICogICBwTVZDdXJNQiAtIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIHZhbHVlIG9mIAorICogICAgICAgICAgICBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVkxlZnRNQiAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBsZWZ0IG1hY3JvYmxvY2sgbW90aW9uIHZlY3RvcjsgYSAKKyAqICAgICAgICAgICAgdmFsdWUgb2YgIE5VTExpbmRpY2F0ZXMgdW5hdmFpbGFiaWxpdHkuIAorICogICBwU3JjTVZVcHBlck1CIC0gcG9pbnRlciB0byBzb3VyY2UgdXBwZXIgbWFjcm9ibG9jayBtb3Rpb24gdmVjdG9yOyBhIAorICogICAgICAgICAgICB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gCisgKiAgIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXIgdG8gc291cmNlIHVwcGVyIHJpZ2h0IE1CIG1vdGlvbiB2ZWN0b3I7IGEgCisgKiAgICAgICAgICAgIHZhbHVlIG9mIE5VTEwgaW5kaWNhdGVzIHVuYXZhaWxhYmlsaXR5LiAKKyAqICAgZmNvZGVGb3J3YXJkIC0gYW4gaW50ZWdlciB3aXRoIHZhbHVlcyBmcm9tIDEgdG8gNzsgdXNlZCBpbiBlbmNvZGluZyAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvcnMgcmVsYXRlZCB0byBzZWFyY2ggcmFuZ2UsIGFzIGRlc2NyaWJlZCBpbiAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjMuIAorICogICBNQlR5cGUgLSBtYWNybyBibG9jayB0eXBlLCB2YWxpZCBpbiB0aGUgcmFuZ2UgMCB0byA1IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHVwZGF0ZWQgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSB1cGRhdGVkIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgcG9zaXRpb24gaW4gc3RyZWFtIAorICogICAgICAgICAgICBidWZmZXIgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAKKyAqICAgICAgICAgICAgICAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBNVkN1ck1CIAorICogICAgLSAgICAqcEJpdE9mZnNldCA8IDAsIG9yICpwQml0T2Zmc2V0ID43LiAKKyAqICAgIC0gICAgZmNvZGVGb3J3YXJkIDw9IDAsIG9yIGZjb2RlRm9yd2FyZCA+IDcsIG9yIE1CVHlwZSA8IDAuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9FbmNvZGVNViAoCisgICAgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBjb25zdCBPTVhWQ01vdGlvblZlY3RvciAqcE1WQ3VyTUIsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WTGVmdE1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlck1CLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZVcHBlclJpZ2h0TUIsCisgICAgT01YX0lOVCBmY29kZUZvcndhcmQsCisgICAgT01YVkNNNFAyTWFjcm9ibG9ja1R5cGUgTUJUeXBlCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICAgKDYuMi41LjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgYW5kIHBhZHMgdGhlIGZvdXIgbW90aW9uIHZlY3RvcnMgYXNzb2NpYXRlZCB3aXRoIGEgbm9uLWludHJhIFAtVk9QIAorICogbWFjcm9ibG9jay4gIEZvciBtYWNyb2Jsb2NrcyBvZiB0eXBlIE9NWF9WQ19JTlRFUjRWLCB0aGUgb3V0cHV0IE1WIGlzIAorICogcGFkZGVkIGFzIHNwZWNpZmllZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjYuMS42LiBPdGhlcndpc2UsIGZvciAKKyAqIG1hY3JvYmxvY2tzIG9mIHR5cGVzIG90aGVyIHRoYW4gT01YX1ZDX0lOVEVSNFYsIHRoZSBkZWNvZGVkIE1WIGlzIGNvcGllZCB0byAKKyAqIGFsbCBmb3VyIG91dHB1dCBNViBidWZmZXIgZW50cmllcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCAKKyAqICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHBTcmNNVkxlZnRNQiwgcFNyY01WVXBwZXJNQiwgYW5kIHBTcmNNVlVwcGVyUmlnaHRNQiAtIHBvaW50ZXJzIHRvIHRoZSAKKyAqICAgICAgICAgICAgbW90aW9uIHZlY3RvciBidWZmZXJzIG9mIHRoZSBtYWNyb2Jsb2NrcyBzcGVjaWFsbHkgYXQgdGhlIGxlZnQsIAorICogICAgICAgICAgICB1cHBlciwgYW5kIHVwcGVyLXJpZ2h0IHNpZGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jaywgCisgKiAgICAgICAgICAgIHJlc3BlY3RpdmVseTsgYSB2YWx1ZSBvZiBOVUxMIGluZGljYXRlcyB1bmF2YWlsYWJpbGl0eS4gIE5vdGU6IAorICogICAgICAgICAgICBBbnkgbmVpZ2hib3Job29kIG1hY3JvYmxvY2sgb3V0c2lkZSB0aGUgY3VycmVudCBWT1Agb3IgdmlkZW8gCisgKiAgICAgICAgICAgIHBhY2tldCBvciBvdXRzaWRlIHRoZSBjdXJyZW50IEdPQiAod2hlbiBzaG9ydF92aWRlb19oZWFkZXIgaXMgCisgKiAgICAgICAgICAgICAxICkgZm9yIHdoaWNoIGdvYl9oZWFkZXJfZW1wdHkgaXMgIDAgIGlzIHRyZWF0ZWQgYXMgCisgKiAgICAgICAgICAgIHRyYW5zcGFyZW50LCBhY2NvcmRpbmcgdG8gW0lTTzE0NDk2LTJdLCBzdWJjbGF1c2UgNy42LjUuIAorICogICBmY29kZUZvcndhcmQgLSBhIGNvZGUgZXF1YWwgdG8gdm9wX2Zjb2RlX2ZvcndhcmQgaW4gTVBFRy00IGJpdCBzdHJlYW0gCisgKiAgICAgICAgICAgIHN5bnRheCAKKyAqICAgTUJUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4gSWYgTUJUeXBlIGlzIG5vdCBlcXVhbCB0byAKKyAqICAgICAgICAgICAgT01YX1ZDX0lOVEVSNFYsIHRoZSBkZXN0aW5hdGlvbiBtb3Rpb24gdmVjdG9yIGJ1ZmZlciBpcyBzdGlsbCAKKyAqICAgICAgICAgICAgZmlsbGVkIHdpdGggdGhlIHNhbWUgZGVjb2RlZCB2ZWN0b3IuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkLCBzbyAKKyAqICAgICAgICAgICAgdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJpdCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3RNVkN1ck1CIC0gcG9pbnRlciB0byB0aGUgbW90aW9uIHZlY3RvciBidWZmZXIgZm9yIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBtYWNyb2Jsb2NrOyBjb250YWlucyBmb3VyIGRlY29kZWQgbW90aW9uIHZlY3RvcnMgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0TVZDdXJNQiAKKyAqICAgIC0gICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgLSAgICBmY29kZUZvcndhcmQgZXhjZWVkcyAoMCw3XQorICogICAgLSAgICBNQlR5cGUgbGVzcyB0aGFuIHplcm8KKyAqICAgIC0gICAgbW90aW9uIHZlY3RvciBidWZmZXIgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIE9NWF9TdHNfRXJyIC0gc3RhdHVzIGVycm9yIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVQYWRNVl9QVk9QICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjTVZMZWZ0TUIsCisgICAgT01YVkNNb3Rpb25WZWN0b3IqcFNyY01WVXBwZXJNQiwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcFNyY01WVXBwZXJSaWdodE1CLAorICAgIE9NWFZDTW90aW9uVmVjdG9yKnBEc3RNVkN1ck1CLAorICAgIE9NWF9JTlQgZmNvZGVGb3J3YXJkLAorICAgIE9NWFZDTTRQMk1hY3JvYmxvY2tUeXBlIE1CVHlwZQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMgICAoNi4yLjUuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIG9mIEFDIGFuZCBEQyBjb2VmZmljaWVudHMgCisgKiBmb3Igb25lIGludHJhIGJsb2NrLiAgVHdvIHZlcnNpb25zIG9mIHRoZSBmdW5jdGlvbiAoRENWTEMgYW5kIEFDVkxDKSBhcmUgCisgKiBwcm92aWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSB0d28gZGlmZmVyZW50IG1ldGhvZHMgb2YgcHJvY2Vzc2luZyBEQyAKKyAqIGNvZWZmaWNpZW50cywgYXMgZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4xLjQsICBJbnRyYSBEQyAKKyAqIENvZWZmaWNpZW50IERlY29kaW5nIGZvciB0aGUgQ2FzZSBvZiBTd2l0Y2hlZCBWTEMgRW5jb2RpbmcuICAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgCisgKiAgICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSBwb2ludGVyIHRvIHRoZSBiaXQgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgYnl0ZSByZWZlcmVuY2VkIAorICogICAgICAgICAgICBieSAqcHBCaXRTdHJlYW0uICBUaGUgcGFyYW1ldGVyICpwQml0T2Zmc2V0IGlzIHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAtN10uIAorICogICAgICAgICAgICBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCAgICAgIExlYXN0fCAKKyAqICAgICAgICAgICAgICAgICAgICAqcEJpdE9mZnNldCAgICAgICAgfDAgMSAyIDMgNCA1IDYgN3wgCisgKiAgIHByZWREaXIgLSBBQyBwcmVkaWN0aW9uIGRpcmVjdGlvbjsgdXNlZCB0byBzZWxlY3QgdGhlIHppZ3phZyBzY2FuIAorICogICAgICAgICAgICBwYXR0ZXJuOyB0YWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IAorICogICAgICAgICAgICAtICBPTVhfVkNfTk9ORSAtIEFDIHByZWRpY3Rpb24gbm90IHVzZWQ7IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGNsYXNzaWNhbCB6aWd6YWcgc2Nhbi4gCisgKiAgICAgICAgICAgIC0gIE9NWF9WQ19IT1JJWk9OVEFMIC0gSG9yaXpvbnRhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtdmVydGljYWwgemlnemFnIHNjYW47IAorICogICAgICAgICAgICAtICBPTVhfVkNfVkVSVElDQUwgLSBWZXJ0aWNhbCBwcmVkaWN0aW9uOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtcyBhbHRlcm5hdGUtaG9yaXpvbnRhbCB6aWd6YWcgc2Nhbi4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IGVzY2FwZSBtb2RlcyAwLTMgYXJlIHVzZWQgaWYgCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTAsIGFuZCBlc2NhcGUgbW9kZSA0IGlzIHVzZWQgd2hlbiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MS4gCisgKiAgIHZpZGVvQ29tcCAtIHZpZGVvIGNvbXBvbmVudCB0eXBlIChsdW1pbmFuY2Ugb3IgY2hyb21pbmFuY2UpIG9mIHRoZSAKKyAqICAgICAgICAgICAgY3VycmVudCBibG9jayAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCBzdWNoIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc3VjaCB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgYnVmZmVyIG9mIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgCisgKiAgICAgICAgICAgIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cywgaWY6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10KKyAqICAgIC0gICAgcHJlRGlyIGV4Y2VlZHMgWzAsMl0KKyAqICAgIC0gICAgcERzdCBpcyBub3QgNC1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIGlmOgorICogICAgLSAgICBJbiBEZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQywgZGNfc2l6ZSA+IDEyIAorICogICAgLSAgICBBdCBsZWFzdCBvbmUgb2YgbWFyayBiaXRzIGVxdWFscyB6ZXJvIAorICogICAgLSAgICBJbGxlZ2FsIHN0cmVhbSBlbmNvdW50ZXJlZDsgY29kZSBjYW5ub3QgYmUgbG9jYXRlZCBpbiBWTEMgdGFibGUgCisgKiAgICAtICAgIEZvcmJpZGRlbiBjb2RlIGVuY291bnRlcmVkIGluIHRoZSBWTEMgRkxDIHRhYmxlLiAKKyAqICAgIC0gICAgVGhlIG51bWJlciBvZiBjb2VmZmljaWVudHMgaXMgZ3JlYXRlciB0aGFuIDY0IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50cmFEQ1ZMQyAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VOCBwcmVkRGlyLAorICAgIE9NWF9JTlQgc2hvcnRWaWRlb0hlYWRlciwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICAgKDYuMi41LjIuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIFZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSB6aWd6YWcgc2NhbiBvZiBBQyBhbmQgREMgY29lZmZpY2llbnRzIAorICogZm9yIG9uZSBpbnRyYSBibG9jay4gIFR3byB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb24gKERDVkxDIGFuZCBBQ1ZMQykgYXJlIAorICogcHJvdmlkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgdHdvIGRpZmZlcmVudCBtZXRob2RzIG9mIHByb2Nlc3NpbmcgREMgCisgKiBjb2VmZmljaWVudHMsIGFzIGRlc2NyaWJlZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA3LjQuMS40LCAgSW50cmEgREMgCisgKiBDb2VmZmljaWVudCBEZWNvZGluZyBmb3IgdGhlIENhc2Ugb2YgU3dpdGNoZWQgVkxDIEVuY29kaW5nLiAgCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIAorICogICAgICAgICAgICBiaXRzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gcG9pbnRlciB0byB0aGUgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJ5dGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgICAgYnkgKnBwQml0U3RyZWFtLiAgVGhlIHBhcmFtZXRlciAqcEJpdE9mZnNldCBpcyB2YWxpZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHJhbmdlIFswLTddLiBCaXQgUG9zaXRpb24gaW4gb25lIGJ5dGU6ICB8TW9zdCBMZWFzdHwgKnBCaXRPZmZzZXQgCisgKiAgICAgICAgICAgIHwwIDEgMiAzIDQgNSA2IDd8IAorICogICBwcmVkRGlyIC0gQUMgcHJlZGljdGlvbiBkaXJlY3Rpb247IHVzZWQgdG8gc2VsZWN0IHRoZSB6aWd6YWcgc2NhbiAKKyAqICAgICAgICAgICAgcGF0dGVybjsgdGFrZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBPTVhfVkNfTk9ORSAtIEFDIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIG5vdCB1c2VkOyBwZXJmb3JtcyBjbGFzc2ljYWwgemlnemFnIHNjYW4uIAorICogICAgICAgICAgICBPTVhfVkNfSE9SSVpPTlRBTCAtIEhvcml6b250YWwgcHJlZGljdGlvbjsgcGVyZm9ybXMgCisgKiAgICAgICAgICAgIGFsdGVybmF0ZS12ZXJ0aWNhbCB6aWd6YWcgc2NhbjsgT01YX1ZDX1ZFUlRJQ0FMIC0gVmVydGljYWwgCisgKiAgICAgICAgICAgIHByZWRpY3Rpb247IHBlcmZvcm1zIGFsdGVybmF0ZS1ob3Jpem9udGFsIHppZ3phZyBzY2FuLiAKKyAqICAgc2hvcnRWaWRlb0hlYWRlciAtIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgcHJlc2VuY2Ugb2YgCisgKiAgICAgICAgICAgIHNob3J0X3ZpZGVvX2hlYWRlcjsgZXNjYXBlIG1vZGVzIDAtMyBhcmUgdXNlZCBpZiAKKyAqICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlcj09MCwgYW5kIGVzY2FwZSBtb2RlIDQgaXMgdXNlZCB3aGVuIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0xLiAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgKGx1bWluYW5jZSBvciBjaHJvbWluYW5jZSkgb2YgdGhlIAorICogICAgICAgICAgICBjdXJyZW50IGJsb2NrIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzdWNoIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IAorICogICAgICAgICAgICBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCBieSAqcHBCaXRTdHJlYW0gCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgb2YgY3VycmVudCBibG9jazsgbXVzdCBiZSAKKyAqICAgICAgICAgICAgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIHBvaW50ZXJzIGlzIE5VTEw6IHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBEc3QsIAorICogICAgICAgICAgICAgIG9yIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XSwgcHJlRGlyIGV4Y2VlZHMgWzAsMl0sIG9yIHBEc3QgaXMgCisgKiAgICAgICAgICAgICAgbm90IDQtYnl0ZSBhbGlnbmVkIAorICogICAgT01YX1N0c19FcnIgSW4gRGVjb2RlVkxDWmlnemFnX0ludHJhRENWTEMsIGRjX3NpemUgPiAxMiBBdCBsZWFzdCBvbmUgb2YgCisgKiAgICAgICAgICAgICAgbWFyayBiaXRzIGVxdWFscyB6ZXJvIElsbGVnYWwgc3RyZWFtIGVuY291bnRlcmVkOyBjb2RlIGNhbm5vdCAKKyAqICAgICAgICAgICAgICBiZSBsb2NhdGVkIGluIFZMQyB0YWJsZSBGb3JiaWRkZW4gY29kZSBlbmNvdW50ZXJlZCBpbiB0aGUgVkxDIAorICogICAgICAgICAgICAgIEZMQyB0YWJsZSBUaGUgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBpcyBncmVhdGVyIHRoYW4gNjQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19JbnRyYUFDVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX1U4IHByZWREaXIsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfSW50ZXIgICAoNi4yLjUuMi4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgVkxDIGRlY29kaW5nIGFuZCBpbnZlcnNlIHppZ3phZyBzY2FuIGZvciBvbmUgaW50ZXItY29kZWQgYmxvY2suIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gZG91YmxlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYnl0ZSBpbiB0aGUgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIG5leHQgYXZhaWxhYmxlIGJpdCBpbiB0aGUgY3VycmVudCBzdHJlYW0gCisgKiAgICAgICAgICAgIGJ5dGUgcmVmZXJlbmNlZCBieSAqcHBCaXRTdHJlYW0uIFRoZSBwYXJhbWV0ZXIgKnBCaXRPZmZzZXQgaXMgCisgKiAgICAgICAgICAgIHZhbGlkIHdpdGhpbiB0aGUgcmFuZ2UgWzAtN10uIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBlc2NhcGUgbW9kZXMgMC0zIGFyZSB1c2VkIGlmIAorICogICAgICAgICAgICBzaG9ydFZpZGVvSGVhZGVyPT0wLCBhbmQgZXNjYXBlIG1vZGUgNCBpcyB1c2VkIHdoZW4gCisgKiAgICAgICAgICAgIHNob3J0VmlkZW9IZWFkZXI9PTEuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIHRoZSBibG9jayBpcyBkZWNvZGVkIHN1Y2ggCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIHN0cmVhbSBidWZmZXIgCisgKiAgIHBCaXRPZmZzZXQgLSAqcEJpdE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGRlY29kaW5nIHN1Y2ggdGhhdCBpdCBwb2ludHMgCisgKiAgICAgICAgICAgIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBiaXQgaW4gdGhlIHN0cmVhbSBieXRlIHJlZmVyZW5jZWQgYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBvZiBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6CisgKiAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICBwcEJpdFN0cmVhbSwgKnBwQml0U3RyZWFtLCBwQml0T2Zmc2V0LCBwRHN0CisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkCisgKiAgICAtICAgKnBCaXRPZmZzZXQgZXhjZWVkcyBbMCw3XQorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IsIGlmOgorICogICAgLSAgICBBdCBsZWFzdCBvbmUgbWFyayBiaXQgaXMgZXF1YWwgdG8gemVybyAKKyAqICAgIC0gICAgRW5jb3VudGVyZWQgYW4gaWxsZWdhbCBzdHJlYW0gY29kZSB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgVkxDIHRhYmxlIAorICogICAgLSAgICBFbmNvdW50ZXJlZCBhbiBpbGxlZ2FsIGNvZGUgaW4gdGhlIFZMQyBGTEMgdGFibGUgCisgKiAgICAtICAgIFRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGlzIGdyZWF0ZXIgdGhhbiA2NCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfRGVjb2RlVkxDWmlnemFnX0ludGVyICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfSU5UICpwQml0T2Zmc2V0LAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludHJhX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludHJhX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUCwKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9RdWFudEludkludGVyX0kgICAoNi4yLjUuMy4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgdGhlIHNlY29uZCBpbnZlcnNlIHF1YW50aXphdGlvbiBtb2RlIG9uIGFuIGludHJhL2ludGVyIGNvZGVkIAorICogYmxvY2suIFN1cHBvcnRzIGJpdHNfcGVyX3BpeGVsID0gOC4gVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIGNsaXBwZWQgdG8gCisgKiB0aGUgcmFuZ2UgWy0yMDQ4LCAyMDQ3XS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IChxdWFudGl6ZWQpIGludHJhL2ludGVyIGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgMTYtYnl0ZSBib3VuZGFyeS4gCisgKiAgIFFQIC0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAocXVhbnRpemVyX3NjYWxlKSAKKyAqICAgdmlkZW9Db21wIC0gdmlkZW8gY29tcG9uZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgYmxvY2suIFRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyBmbGFnczogT01YX1ZDX0xVTUlOQU5DRSwgT01YX1ZDX0NIUk9NSU5BTkNFIChpbnRyYSAKKyAqICAgICAgICAgICAgdmVyc2lvbiBvbmx5KS4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIHNob3J0X3ZpZGVvX2hlYWRlciAKKyAqICAgICAgICAgICAgKGludHJhIHZlcnNpb24gb25seSkuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IChkZXF1YW50aXplZCkgaW50cmEvaW50ZXIgYmxvY2sgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgaXMgCisgKiAgICAgICAgICAgICAgdHJ1ZTogCisgKiAgICAtICAgIHBTcmNEc3QgaXMgTlVMTCAKKyAqICAgIC0gICAgUVAgPD0gMCBvciBRUCA+PTMxIAorICogICAgLSAgICB2aWRlb0NvbXAgaXMgbmVpdGhlciBPTVhfVkNfTFVNSU5BTkNFIG5vciBPTVhfVkNfQ0hST01JTkFOQ0UuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9RdWFudEludkludGVyX0kgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDJfRGVjb2RlQmxvY2tDb2VmX0ludHJhICAgKDYuMi41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIERlY29kZXMgdGhlIElOVFJBIGJsb2NrIGNvZWZmaWNpZW50cy4gSW52ZXJzZSBxdWFudGl6YXRpb24sIGludmVyc2VseSAKKyAqIHppZ3phZyBwb3NpdGlvbmluZywgYW5kIElEQ1QsIHdpdGggYXBwcm9wcmlhdGUgY2xpcHBpbmcgb24gZWFjaCBzdGVwLCBhcmUgCisgKiBwZXJmb3JtZWQgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBvdXRwdXQgCisgKiBmcmFtZS9wbGFuZSBvbiBhIHBpeGVsIGJhc2lzLiAgTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQgb25seSB3aGVuIAorICogYXQgbGVhc3Qgb25lIG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50IG9mIGN1cnJlbnQgYmxvY2sgZXhpc3RzIGluIHRoZSBiaXQgCisgKiBzdHJlYW0uIFRoZSBEQyBvbmx5IGNvbmRpdGlvbiB3aWxsIGJlIGhhbmRsZWQgaW4gYW5vdGhlciBmdW5jdGlvbi4gCisgKgorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XS4gCisgKiAgIHN0ZXAgLSB3aWR0aCBvZiB0aGUgZGVzdGluYXRpb24gcGxhbmUgCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgcm93IGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIAorICogICAgICAgICAgICBhbiA4LWJ5dGUgYm91bmRhcnkuIAorICogICBwQ29lZkJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgY3VyUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtYWNyb2Jsb2NrIHdoaWNoIHRoZSBjdXJyZW50IGJsb2NrIAorICogICAgICAgICAgICBiZWxvbmdzIHRvIAorICogICBwUVBCdWYgLSBwb2ludGVyIHRvIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGJ1ZmZlciAKKyAqICAgYmxvY2tJbmRleCAtIGJsb2NrIGluZGV4IGluZGljYXRpbmcgdGhlIGNvbXBvbmVudCB0eXBlIGFuZCBwb3NpdGlvbiBhcyAKKyAqICAgICAgICAgICAgZGVmaW5lZCBpbiBbSVNPMTQ0OTYtMl0sIHN1YmNsYXVzZSA2LjEuMy44LCBGaWd1cmUgNi01LiAKKyAqICAgaW50cmFEQ1ZMQyAtIGEgY29kZSBkZXRlcm1pbmVkIGJ5IGludHJhX2RjX3ZsY190aHIgYW5kIFFQLiBUaGlzIGFsbG93cyBhIAorICogICAgICAgICAgICBtZWNoYW5pc20gdG8gc3dpdGNoIGJldHdlZW4gdHdvIFZMQyBmb3IgY29kaW5nIG9mIEludHJhIERDIAorICogICAgICAgICAgICBjb2VmZmljaWVudHMgYXMgcGVyIFtJU08xNDQ5Ni0yXSwgVGFibGUgNi0yMS4gCisgKiAgIEFDUHJlZEZsYWcgLSBhIGZsYWcgZXF1YWwgdG8gYWNfcHJlZF9mbGFnIChvZiBsdW1pbmFuY2UpIGluZGljYXRpbmcgaWYgCisgKiAgICAgICAgICAgIHRoZSBhYyBjb2VmZmljaWVudHMgb2YgdGhlIGZpcnN0IHJvdyBvciBmaXJzdCBjb2x1bW4gYXJlIAorICogICAgICAgICAgICBkaWZmZXJlbnRpYWxseSBjb2RlZCBmb3IgaW50cmEgY29kZWQgbWFjcm9ibG9jay4gCisgKiAgIHNob3J0VmlkZW9IZWFkZXIgLSBiaW5hcnkgZmxhZyBpbmRpY2F0aW5nIHByZXNlbmNlIG9mIAorICogICAgICAgICAgICBzaG9ydF92aWRlb19oZWFkZXI7IHNob3J0VmlkZW9IZWFkZXI9PTEgc2VsZWN0cyBsaW5lYXIgaW50cmEgREMgCisgKiAgICAgICAgICAgIG1vZGUsIGFuZCBzaG9ydFZpZGVvSGVhZGVyPT0wIHNlbGVjdHMgbm9uIGxpbmVhciBpbnRyYSBEQyBtb2RlLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciB0aGUgYmxvY2sgaXMgZGVjb2RlZCwgc28gCisgKiAgICAgICAgICAgIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBjdXJyZW50IGJ5dGUgaW4gdGhlIGJpdCBzdHJlYW0gYnVmZmVyIAorICogICBwQml0T2Zmc2V0IC0gKnBCaXRPZmZzZXQgaXMgdXBkYXRlZCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBiaXQgCisgKiAgICAgICAgICAgIHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgYnkgKnBwQml0U3RyZWFtIAorICogICBwRHN0IC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIGRlc3RpbmF0aW9uIHBsYW5lOyBtdXN0IGJlIGFsaWduZWQgb24gCisgKiAgICAgICAgICAgIGFuIDgtYnl0ZSBib3VuZGFyeS4gCisgKiAgIHBDb2VmQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyLiAKKyAqICAgcENvZWZCdWZDb2wgLSBwb2ludGVyIHRvIHRoZSB1cGRhdGVkIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXIgIE5vdGU6IAorICogICAgICAgICAgICBUaGUgY29lZmZpY2llbnQgYnVmZmVycyBtdXN0IGJlIHVwZGF0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSAKKyAqICAgICAgICAgICAgdXBkYXRlIHByb2NlZHVyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4yLjIuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIHBDb2VmQnVmUm93LCBwQ29lZkJ1ZkNvbCwgCisgKiAgICAgICAgIHBRUEJ1ZiwgcERzdC4gCisgKiAgICAtICAgICpwQml0T2Zmc2V0IGV4Y2VlZHMgWzAsN10gCisgKiAgICAtICAgIGN1clFQIGV4Y2VlZHMgKDEsIDMxKQorICogICAgLSAgICBibG9ja0luZGV4IGV4Y2VlZHMgWzAsNV0KKyAqICAgIC0gICAgc3RlcCBpcyBub3QgdGhlIG11bHRpcGxlIG9mIDgKKyAqICAgIC0gICAgYSBwb2ludGVyIGFsaWdubWVudCByZXF1aXJlbWVudCB3YXMgdmlvbGF0ZWQuIAorICogICAgT01YX1N0c19FcnIgLSBzdGF0dXMgZXJyb3IuIFJlZmVyIHRvIE9NWF9TdHNfRXJyIG9mIERlY29kZVZMQ1ppZ3phZ19JbnRyYS4gIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50cmEgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwQml0U3RyZWFtLAorICAgIE9NWF9JTlQgKnBCaXRPZmZzZXQsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9JTlQgc3RlcCwKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZlJvdywKKyAgICBPTVhfUzE2ICpwQ29lZkJ1ZkNvbCwKKyAgICBPTVhfVTggY3VyUVAsCisgICAgY29uc3QgT01YX1U4ICpwUVBCdWYsCisgICAgT01YX0lOVCBibG9ja0luZGV4LAorICAgIE9NWF9JTlQgaW50cmFEQ1ZMQywKKyAgICBPTVhfSU5UIEFDUHJlZEZsYWcsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9EZWNvZGVCbG9ja0NvZWZfSW50ZXIgICAoNi4yLjUuNC4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGVjb2RlcyB0aGUgSU5URVIgYmxvY2sgY29lZmZpY2llbnRzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgCisgKiBxdWFudGl6YXRpb24sIGludmVyc2UgemlnemFnIHBvc2l0aW9uaW5nLCBhbmQgSURDVCAod2l0aCBhcHByb3ByaWF0ZSAKKyAqIGNsaXBwaW5nIG9uIGVhY2ggc3RlcCkgb24gdGhlIGNvZWZmaWNpZW50cy4gVGhlIHJlc3VsdHMgKHJlc2lkdWFscykgYXJlIAorICogcGxhY2VkIGluIGEgY29udGlndW91cyBhcnJheSBvZiA2NCBlbGVtZW50cy4gRm9yIElOVEVSIGJsb2NrLCB0aGUgb3V0cHV0IAorICogYnVmZmVyIGhvbGRzIHRoZSByZXNpZHVhbHMgZm9yIGZ1cnRoZXIgcmVjb25zdHJ1Y3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gcG9pbnRlciB0byB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgCisgKiAgICAgICAgICAgIHN0cmVhbSBidWZmZXIuIFRoZXJlIGlzIG5vIGJvdW5kYXJ5IGNoZWNrIGZvciB0aGUgYml0IHN0cmVhbSAKKyAqICAgICAgICAgICAgYnVmZmVyLiAKKyAqICAgcEJpdE9mZnNldCAtIHBvaW50ZXIgdG8gdGhlIGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIHRvIGJ5IAorICogICAgICAgICAgICAqcHBCaXRTdHJlYW0uICpwQml0T2Zmc2V0IGlzIHZhbGlkIHdpdGhpbiBbMC03XSAKKyAqICAgUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIAorICogICBzaG9ydFZpZGVvSGVhZGVyIC0gYmluYXJ5IGZsYWcgaW5kaWNhdGluZyBwcmVzZW5jZSBvZiAKKyAqICAgICAgICAgICAgc2hvcnRfdmlkZW9faGVhZGVyOyBzaG9ydFZpZGVvSGVhZGVyPT0xIHNlbGVjdHMgbGluZWFyIGludHJhIERDIAorICogICAgICAgICAgICBtb2RlLCBhbmQgc2hvcnRWaWRlb0hlYWRlcj09MCBzZWxlY3RzIG5vbiBsaW5lYXIgaW50cmEgREMgbW9kZS4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBwQml0U3RyZWFtIC0gKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgdGhlIGJsb2NrIGlzIGRlY29kZWQsIHNvIAorICogICAgICAgICAgICB0aGF0IGl0IHBvaW50cyB0byB0aGUgY3VycmVudCBieXRlIGluIHRoZSBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcEJpdE9mZnNldCAtICpwQml0T2Zmc2V0IGlzIHVwZGF0ZWQgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYml0IAorICogICAgICAgICAgICBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkIGJ5ICpwcEJpdFN0cmVhbSAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgcmVzaWR1YWwgYnVmZmVyIChhIGNvbnRpZ3VvdXMgYXJyYXkgb2YgNjQgCisgKiAgICAgICAgICAgIGVsZW1lbnRzIG9mIE9NWF9TMTYgZGF0YSB0eXBlKTsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgIC0gICAgQXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTnVsbDogCisgKiAgICAgICAgIHBwQml0U3RyZWFtLCAqcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQgLCBwRHN0IAorICogICAgLSAgICAqcEJpdE9mZnNldCBleGNlZWRzIFswLDddCisgKiAgICAtICAgIFFQIDw9IDAuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCAxNi1ieXRlIGFsaWduZWQgCisgKiAgICBPTVhfU3RzX0VyciAtIHN0YXR1cyBlcnJvci4gUmVmZXIgdG8gT01YX1N0c19FcnIgb2YgRGVjb2RlVkxDWmlnemFnX0ludGVyIC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAyX0RlY29kZUJsb2NrQ29lZl9JbnRlciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBCaXRTdHJlYW0sCisgICAgT01YX0lOVCAqcEJpdE9mZnNldCwKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9JTlQgUVAsCisgICAgT01YX0lOVCBzaG9ydFZpZGVvSGVhZGVyCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMl9QcmVkaWN0UmVjb25Db2VmSW50cmEgICAoNi4yLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgYWRhcHRpdmUgREMvQUMgY29lZmZpY2llbnQgcHJlZGljdGlvbiBmb3IgYW4gaW50cmEgYmxvY2suICBQcmlvciAKKyAqIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCBwcmVkaWN0aW9uIGRpcmVjdGlvbiAocHJlZERpcikgc2hvdWxkIGJlIHNlbGVjdGVkIGFzIAorICogc3BlY2lmaWVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNC4zLjEuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnQgcmVzaWR1YWxzIChQUUYpIG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIAorICogICAgICAgICAgICBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgVGhlIG91dHB1dCBjb2VmZmljaWVudHMgYXJlIAorICogICAgICAgICAgICBzYXR1cmF0ZWQgdG8gdGhlIHJhbmdlIFstMjA0OCwgMjA0N10uIAorICogICBwUHJlZEJ1ZlJvdyAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHJvdyBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiAKKyAqICAgICAgICAgICAgYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvbHVtbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICBjdXJRUCAtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIGN1cnJlbnQgYmxvY2suIGN1clFQIG1heSBlcXVhbCB0byAKKyAqICAgICAgICAgICAgcHJlZFFQIGVzcGVjaWFsbHkgd2hlbiB0aGUgY3VycmVudCBibG9jayBhbmQgdGhlIHByZWRpY3RvciBibG9jayAKKyAqICAgICAgICAgICAgYXJlIGluIHRoZSBzYW1lIG1hY3JvYmxvY2suIAorICogICBwcmVkUVAgLSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBwcmVkaWN0b3IgYmxvY2sgCisgKiAgIHByZWREaXIgLSBpbmRpY2F0ZXMgdGhlIHByZWRpY3Rpb24gZGlyZWN0aW9uIHdoaWNoIHRha2VzIG9uZSBvZiB0aGUgCisgKiAgICAgICAgICAgIGZvbGxvd2luZyB2YWx1ZXM6IE9NWF9WQ19IT1JJWk9OVEFMIC0gcHJlZGljdCBob3Jpem9udGFsbHkgCisgKiAgICAgICAgICAgIE9NWF9WQ19WRVJUSUNBTCAtIHByZWRpY3QgdmVydGljYWxseSAKKyAqICAgQUNQcmVkRmxhZyAtIGEgZmxhZyBpbmRpY2F0aW5nIGlmIEFDIHByZWRpY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gSXQgCisgKiAgICAgICAgICAgIGlzIGVxdWFsIHRvIGFjX3ByZWRfZmxhZyBpbiB0aGUgYml0IHN0cmVhbSBzeW50YXggb2YgTVBFRy00IAorICogICB2aWRlb0NvbXAgLSB2aWRlbyBjb21wb25lbnQgdHlwZSAobHVtaW5hbmNlIG9yIGNocm9taW5hbmNlKSBvZiB0aGUgCisgKiAgICAgICAgICAgIGN1cnJlbnQgYmxvY2sgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBidWZmZXIgd2hpY2ggY29udGFpbnMgdGhlIHF1YW50aXplZCAKKyAqICAgICAgICAgICAgY29lZmZpY2llbnRzIChRRikgb2YgdGhlIGN1cnJlbnQgYmxvY2sgCisgKiAgIHBQcmVkQnVmUm93IC0gcG9pbnRlciB0byB0aGUgdXBkYXRlZCBjb2VmZmljaWVudCByb3cgYnVmZmVyIAorICogICBwUHJlZEJ1ZkNvbCAtIHBvaW50ZXIgdG8gdGhlIHVwZGF0ZWQgY29lZmZpY2llbnQgY29sdW1uIGJ1ZmZlciAgTm90ZTogCisgKiAgICAgICAgICAgIEJ1ZmZlciB1cGRhdGU6IFVwZGF0ZSB0aGUgQUMgcHJlZGljdGlvbiBidWZmZXIgKGJvdGggcm93IGFuZCAKKyAqICAgICAgICAgICAgY29sdW1uIGJ1ZmZlcikuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzLCBpZjoKKyAqICAgICAgICAtICAgIEF0IGxlYXN0IG9uZSBvZiB0aGUgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICAgcFNyY0RzdCwgcFByZWRCdWZSb3csIG9yIHBQcmVkQnVmQ29sLiAKKyAqICAgICAgICAtICAgIGN1clFQIDw9IDAsIAorICogICAgICAgIC0gICAgcHJlZFFQIDw9IDAsIAorICogICAgICAgIC0gICAgY3VyUVAgPjMxLCAKKyAqICAgICAgICAtICAgIHByZWRRUCA+IDMxLCAKKyAqICAgICAgICAtICAgIHByZURpciBleGNlZWRzIFsxLDJdCisgKiAgICAgICAgLSAgICBwU3JjRHN0LCBwUHJlZEJ1ZlJvdywgb3IgcFByZWRCdWZDb2wgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfUHJlZGljdFJlY29uQ29lZkludHJhICgKKyAgICBPTVhfUzE2ICpwU3JjRHN0LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmUm93LAorICAgIE9NWF9TMTYgKnBQcmVkQnVmQ29sLAorICAgIE9NWF9JTlQgY3VyUVAsCisgICAgT01YX0lOVCBwcmVkUVAsCisgICAgT01YX0lOVCBwcmVkRGlyLAorICAgIE9NWF9JTlQgQUNQcmVkRmxhZywKKyAgICBPTVhWQ000UDJWaWRlb0NvbXBvbmVudCB2aWRlb0NvbXAKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAyX01DUmVjb25CbG9jayAgICg2LjIuNS41LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBtb3Rpb24gY29tcGVuc2F0aW9uIHByZWRpY3Rpb24gZm9yIGFuIDh4OCBibG9jayB1c2luZyAKKyAqIGludGVycG9sYXRpb24gZGVzY3JpYmVkIGluIFtJU08xNDQ5Ni0yXSwgc3ViY2xhdXNlIDcuNi4yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gcG9pbnRlciB0byB0aGUgYmxvY2sgaW4gdGhlIHJlZmVyZW5jZSBwbGFuZS4gCisgKiAgIHNyY1N0ZXAgLSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiBjb25zZWN1dGl2ZSBsaW5lcyBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlZmVyZW5jZSBwbGFuZSwgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgZHN0U3RlcCAtIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSAKKyAqICAgICAgICAgICAgZGVzdGluYXRpb24gcGxhbmUsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBTcmNSZXNpZHVlIC0gcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSAxNi1iaXQgcHJlZGljdGlvbiAKKyAqICAgICAgICAgICAgcmVzaWR1YWxzOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gSWYgdGhlIHBvaW50ZXIgaXMgTlVMTCwgdGhlbiAKKyAqICAgICAgICAgICAgbm8gcHJlZGljdGlvbiBpcyBkb25lLCBvbmx5IG1vdGlvbiBjb21wZW5zYXRpb24sIGkuZS4sIHRoZSBibG9jayAKKyAqICAgICAgICAgICAgaXMgbW92ZWQgd2l0aCBpbnRlcnBvbGF0aW9uLiAKKyAqICAgcHJlZGljdFR5cGUgLSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIHR5cGUsIGFzIGRlZmluZWQgaW4gc2VjdGlvbiAKKyAqICAgICAgICAgICAgNi4yLjEuMi4gCisgKiAgIHJuZFZhbCAtIHJvdW5kaW5nIGNvbnRyb2wgcGFyYW1ldGVyOiAwIC0gZGlzYWJsZWQ7IDEgLSBlbmFibGVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gIElmIAorICogICAgICAgICAgICBwcmVkaWN0aW9uIHJlc2lkdWFscyBhcmUgYWRkZWQgdGhlbiBvdXRwdXQgaW50ZW5zaXRpZXMgYXJlIAorICogICAgICAgICAgICBjbGlwcGVkIHRvIHRoZSByYW5nZSBbMCwyNTVdLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9uczogCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDgtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcFNyY1Jlc2lkdWUgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyBvciBwRHN0LiAKKyAqICAgIC0gICAgZWl0aGVyIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIC0gICAgaW52YWxpZCB0eXBlIHNwZWNpZmllZCBmb3IgdGhlIHBhcmFtZXRlciBwcmVkaWN0VHlwZS4gCisgKiAgICAtICAgIHRoZSBwYXJhbWV0ZXIgcm5kVmFsIGlzIG5vdCBlcXVhbCBlaXRoZXIgdG8gMCBvciAxLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDJfTUNSZWNvbkJsb2NrICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX0lOVCBzcmNTdGVwLAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmNSZXNpZHVlLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YX0lOVCBwcmVkaWN0VHlwZSwKKyAgICBPTVhfSU5UIHJuZFZhbAorKTsKKworCisKKy8qIDYuMy4xLjEgSW50cmEgMTZ4MTYgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYV8xNngxNiBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gbW9kZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfMTZYMTZfVkVSVCA9IDAsICAvKiogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBPTVhfVkNfMTZYMTZfSE9SID0gMSwgICAvKiogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ18xNlgxNl9EQyA9IDIsICAgIC8qKiBJbnRyYV8xNngxNl9EQyAqLworICAgIE9NWF9WQ18xNlgxNl9QTEFORSA9IDMgIC8qKiBJbnRyYV8xNngxNl9QbGFuZSAqLyAKK30gT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZTsKKworCisKKy8qIDYuMy4xLjIgSW50cmEgNHg0IFByZWRpY3Rpb24gTW9kZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgaW50cmFfNHg0IG1hY3JvYmxvY2sgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ180WDRfVkVSVCA9IDAsICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsICovCisgICAgT01YX1ZDXzRYNF9IT1IgPSAxLCAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ180WDRfREMgPSAyLCAgICAgICAvKiogSW50cmFfNHg0X0RDICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RMID0gMywgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9MZWZ0ICovCisgICAgT01YX1ZDXzRYNF9ESUFHX0RSID0gNCwgIC8qKiBJbnRyYV80eDRfRGlhZ29uYWxfRG93bl9SaWdodCAqLworICAgIE9NWF9WQ180WDRfVlIgPSA1LCAgICAgICAvKiogSW50cmFfNHg0X1ZlcnRpY2FsX1JpZ2h0ICovCisgICAgT01YX1ZDXzRYNF9IRCA9IDYsICAgICAgIC8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duICovCisgICAgT01YX1ZDXzRYNF9WTCA9IDcsICAgICAgIC8qKiBJbnRyYV80eDRfVmVydGljYWxfTGVmdCAqLworICAgIE9NWF9WQ180WDRfSFUgPSA4ICAgICAgICAvKiogSW50cmFfNHg0X0hvcml6b250YWxfVXAgKi8gCit9IE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlOworCisKKworLyogNi4zLjEuMyBDaHJvbWEgUHJlZGljdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19DSFJPTUFfREMgPSAwLCAgICAvKiogSW50cmFfQ2hyb21hX0RDICovCisgICAgT01YX1ZDX0NIUk9NQV9IT1IgPSAxLCAgIC8qKiBJbnRyYV9DaHJvbWFfSG9yaXpvbnRhbCAqLworICAgIE9NWF9WQ19DSFJPTUFfVkVSVCA9IDIsICAvKiogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgT01YX1ZDX0NIUk9NQV9QTEFORSA9IDMgIC8qKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8gCit9IE9NWFZDTTRQMTBJbnRyYUNocm9tYVByZWRNb2RlOworCisKKworLyogNi4zLjEuNCBNb3Rpb24gRXN0aW1hdGlvbiBNb2RlcyAgKi8KKy8qIEEgZGF0YSB0eXBlIHRoYXQgZW51bWVyYXRlcyBILjI2NCBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAqLworCit0eXBlZGVmIGVudW0geworICAgIE9NWF9WQ19NNFAxMF9GQVNUX1NFQVJDSCA9IDAsIC8qKiBGYXN0IG1vdGlvbiBzZWFyY2ggKi8KKyAgICBPTVhfVkNfTTRQMTBfRlVMTF9TRUFSQ0ggPSAxICAvKiogRnVsbCBtb3Rpb24gc2VhcmNoICovIAorfSBPTVhWQ000UDEwTUVNb2RlOworCisKKworLyogNi4zLjEuNSBNYWNyb2Jsb2NrIFR5cGVzICAqLworLyogQSBkYXRhIHR5cGUgdGhhdCBlbnVtZXJhdGVzIEguMjY0IG1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfUF8xNngxNiAgPSAwLCAvKiBkZWZpbmVkIGJ5IFtJU08xNDQ5Ni0xMF0gKi8KKyAgICBPTVhfVkNfUF8xNng4ICA9IDEsCisgICAgT01YX1ZDX1BfOHgxNiAgPSAyLAorICAgIE9NWF9WQ19QXzh4OCAgPSAzLAorICAgIE9NWF9WQ19QUkVGMF84eDggID0gNCwKKyAgICBPTVhfVkNfSU5URVJfU0tJUCAgPSA1LAorICAgIE9NWF9WQ19JTlRSQV80eDQgID0gOCwKKyAgICBPTVhfVkNfSU5UUkFfMTZ4MTYgID0gOSwKKyAgICBPTVhfVkNfSU5UUkFfUENNID0gMTAgCit9IE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjYgU3ViLU1hY3JvYmxvY2sgVHlwZXMgICovCisvKiBBIGRhdGEgdHlwZSB0aGF0IGVudW1lcmF0ZXMgSC4yNjQgc3ViLW1hY3JvYmxvY2sgdHlwZXMgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOiAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBPTVhfVkNfU1VCX1BfOHg4ID0gMCwgLyogZGVmaW5lZCBieSBbSVNPMTQ0OTYtMTBdICovCisgICAgT01YX1ZDX1NVQl9QXzh4NCA9IDEsCisgICAgT01YX1ZDX1NVQl9QXzR4OCA9IDIsCisgICAgT01YX1ZDX1NVQl9QXzR4NCA9IDMgCit9IE9NWFZDTTRQMTBTdWJNYWNyb2Jsb2NrVHlwZTsKKworCisKKy8qIDYuMy4xLjcgVmFyaWFibGUgTGVuZ3RoIENvZGluZyAoVkxDKSBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9VOCB1VHJhaWxpbmdfT25lczsgICAgICAvKiBUcmFpbGluZyBvbmVzOyAzIGF0IG1vc3QgKi8KKyAgICBPTVhfVTggdVRyYWlsaW5nX09uZV9TaWduczsgLyogVHJhaWxpbmcgb25lcyBzaWduYWwgKi8KKyAgICBPTVhfVTggdU51bUNvZWZmczsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZzLCBpbmNsdWRpbmcgdHJhaWxpbmcgb25lcyAqLworICAgIE9NWF9VOCB1VG90YWxaZXJvczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgemVybyBjb2VmcyAqLworICAgIE9NWF9TMTYgaUxldmVsc1sxNl07ICAgICAgICAvKiBMZXZlbHMgb2Ygbm9uLXplcm8gY29lZnMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworICAgIE9NWF9VOCB1UnVuc1sxNl07ICAgICAgICAgICAvKiBSdW5zIGZvciBsZXZlbHMgYW5kIHRyYWlsaW5nIG9uZXMsIGluIHJldmVyc2UgemlnLXphZyBvcmRlciAqLworfSBPTVhWQ000UDEwVkxDSW5mbzsKKworCisKKy8qIDYuMy4xLjggTWFjcm9ibG9jayBJbmZvcm1hdGlvbiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIE9NWF9TMzIgc2xpY2VJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNsaWNlIG51bWJlciAqLworICAgIE9NWFZDTTRQMTBNYWNyb2Jsb2NrVHlwZSBtYlR5cGU7ICAgICAgICAgIC8qIE1CIHR5cGUgKi8KKyAgICBPTVhWQ000UDEwU3ViTWFjcm9ibG9ja1R5cGUgc3ViTUJUeXBlWzRdOyAvKiBzdWItYmxvY2sgdHlwZSAqLworICAgIE9NWF9TMzIgcXB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHFwIGZvciBsdW1hICovCisgICAgT01YX1MzMiBxcGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcXAgZm9yIGNocm9tYSAqLworICAgIE9NWF9VMzIgY2JweTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENCUCBMdW1hICovCisgICAgT01YX1UzMiBjYnBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ0JQIENocm9tYSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVjBbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IsIHJlcHJlc2VudGVkIHVzaW5nIDEvNC1wZWwgdW5pdHMsIHBNVjBbYmxvY2t5XVtibG9ja3hdIChibG9ja3kgPSAwfjMsIGJsb2NreCA9MH4zKSAqLworICAgIE9NWFZDTW90aW9uVmVjdG9yIHBNVlByZWRbNF1bNF07IC8qIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbiwgUmVwcmVzZW50ZWQgdXNpbmcgMS80LXBlbCB1bml0cywgcE1WUHJlZFtibG9ja3ldW2Jsb2NreF0gKGJsb2NreSA9IDB+MywgYmxvY2t4ID0gMH4zKSAqLworICAgIE9NWF9VOCBwUmVmTDBJZHhbNF07ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSBwaWN0dXJlIGluZGljZXMgKi8KKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIEludHJhMTZ4MTZQcmVkTW9kZTsgLyogYmVzdCBpbnRyYSAxNngxNiBwcmVkaWN0aW9uIG1vZGUgKi8KKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwSW50cmE0eDRQcmVkTW9kZVsxNl07IC8qIGJlc3QgaW50cmEgNHg0IHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jaywgcE1WMCBpbmRleGVkIGFzIGFib3ZlICovCit9IE9NWFZDTTRQMTBNQkluZm8sICpPTVhWQ000UDEwTUJJbmZvUHRyOworCisKKworLyogNi4zLjEuOSBNb3Rpb24gRXN0aW1hdGlvbiBQYXJhbWV0ZXJzICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT01YX1MzMiBibG9ja1NwbGl0RW5hYmxlOHg4OyAvKiBlbmFibGVzIDE2eDgsIDh4MTYsIDh4OCAqLworICAgIE9NWF9TMzIgYmxvY2tTcGxpdEVuYWJsZTR4NDsgLyogZW5hYmxlIHNwbGl0dGluZyBvZiA4eDQsIDR4OCwgNHg0IGJsb2NrcyAqLworICAgIE9NWF9TMzIgaGFsZlNlYXJjaEVuYWJsZTsKKyAgICBPTVhfUzMyIHF1YXJ0ZXJTZWFyY2hFbmFibGU7CisgICAgT01YX1MzMiBpbnRyYUVuYWJsZTR4NDsgICAgICAvKiAxPWVuYWJsZSwgMD1kaXNhYmxlICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTE2eDE2OyAgICAvKiBpbnRlZ2VyIHBpeGVsIHVuaXRzICovCisgICAgT01YX1MzMiBzZWFyY2hSYW5nZTh4ODsKKyAgICBPTVhfUzMyIHNlYXJjaFJhbmdlNHg0OworfSBPTVhWQ000UDEwTUVQYXJhbXM7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0ICAgKDYuMy4zLjEuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm0gSW50cmFfNHg0IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIGlzIAorICogbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uIAorICogVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSAgUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDQgbGVmdCBwaXhlbHM6IAorICogICAgICAgICAgICAgICAgICBwW3gsIHldICh4ID0gLTEsIHkgPSAwLi4zKSAKKyAqICAgcFNyY0Fib3ZlIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIG9mIDggYWJvdmUgcGl4ZWxzOiAKKyAqICAgICAgICAgICAgICAgICAgcFt4LHldICh4ID0gMC4uNywgeSA9LTEpOyAKKyAqICAgICAgICAgICAgICAgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYV80eDQgcHJlZGljdGlvbiBtb2RlLiAKKyAqICAgYXZhaWxhYmlsaXR5IC0gTmVpZ2hib3JpbmcgNHg0IGJsb2NrIGF2YWlsYWJpbGl0eSBmbGFnLCByZWZlciB0byAKKyAqICAgICAgICAgICAgICJOZWlnaGJvcmluZyBNYWNyb2Jsb2NrIEF2YWlsYWJpbGl0eSIgLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLiAKKyAqICAgIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgCisgKiAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnI6IAorICogICAgcERzdCBpcyBOVUxMLiAKKyAqICAgIGRzdFN0ZXAgPCA0LCBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgbGVmdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgICBwcmVkTW9kZSBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGVudW1lcmF0aW9uIAorICogICAgICAgICAgICAgIE9NWFZDTTRQMTBJbnRyYTR4NFByZWRNb2RlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfVkVSVCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfVVBQRVIgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwW3gsLTFdICh4ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X0hPUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCBPTVhfVkNfTEVGVCAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbLTEseV0gKHkgPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfRElBR19ETCwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVIgaW5kaWNhdGluZyBwW3gsIC0xXSAoeCA9IDAuLjMpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9ESUFHX0RSLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0gKHggPSAwLi4zKSwgb3IgcFstMSx5XSAoeSA9IDAuLjMpIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDXzR4NF9WUiwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdICh4ID0gMC4uMyksIG9yIHBbLTEseV0gKHkgPSAwLi4zKSBvciBwWy0xLC0xXSBpcyBub3QgCisgKiAgICAgICAgICAgICAgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSEQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSX0xFRlQgb3IgT01YX1ZDX1VQUEVSIG9yIE9NWF9WQ19MRUZUIGluZGljYXRpbmcgCisgKiAgICAgICAgICAgICAgcFt4LC0xXSAoeCA9IDAuLjMpLCBvciBwWy0xLHldICh5ID0gMC4uMykgb3IgcFstMSwtMV0gaXMgbm90IAorICogICAgICAgICAgICAgIGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfNHg0X1ZMLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19VUFBFUiAKKyAqICAgICAgICAgICAgICBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4zKSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ180eDRfSFUsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uMykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfVVBQRVIsIGJ1dCBwU3JjQWJvdmUgaXMgTlVMTC4gCisgKiAgICBhdmFpbGFiaWxpdHkgc2V0cyBPTVhfVkNfTEVGVCwgYnV0IHBTcmNMZWZ0IGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSX0xFRlQsIGJ1dCBwU3JjQWJvdmVMZWZ0IGlzIE5VTEwuIAorICogICAgZWl0aGVyIHBTcmNBYm92ZSBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAgCisgKgorICogTm90ZTogCisgKiAgICAgcFNyY0Fib3ZlLCBwU3JjQWJvdmUsIHBTcmNBYm92ZUxlZnQgbWF5IGJlIGludmFsaWQgcG9pbnRlcnMgaWYgCisgKiAgICAgdGhleSBhcmUgbm90IHVzZWQgYnkgaW50cmEgcHJlZGljdGlvbiBhcyBpbXBsaWVkIGluIHByZWRNb2RlLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmE0eDRQcmVkTW9kZSBwcmVkTW9kZSwKKyAgICBPTVhfUzMyIGF2YWlsYWJpbGl0eQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiAgICg2LjMuMy4xLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gZm9yIGx1bWEgc2FtcGxlcy4gSWYgdGhlIHVwcGVyLXJpZ2h0IGJsb2NrIAorICogaXMgbm90IGF2YWlsYWJsZSwgdGhlbiBkdXBsaWNhdGlvbiB3b3JrIHNob3VsZCBiZSBoYW5kbGVkIGluc2lkZSB0aGUgCisgKiBmdW5jdGlvbi4gVXNlcnMgbmVlZCBub3QgZGVmaW5lIHRoZW0gb3V0c2lkZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgMTYgbGVmdCBwaXhlbHM6IHBbeCwgeV0gKHggPSAtMSwgeSA9IAorICogICAgICAgICAgICAwLi4xNSkgCisgKiAgIHBTcmNBYm92ZSAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiAxNiBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjE1LCAKKyAqICAgICAgICAgICAgeT0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYSAxNi1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBkc3RTdGVwIC0gU3RlcCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuIAorICogICBwcmVkTW9kZSAtIEludHJhXzE2eDE2IHByZWRpY3Rpb24gbW9kZSwgcGxlYXNlIHJlZmVyIHRvIHNlY3Rpb24gMy40LjEuIAorICogICBhdmFpbGFiaWxpdHkgLSBOZWlnaGJvcmluZyAxNngxNiBNQiBhdmFpbGFiaWxpdHkgZmxhZy4gUmVmZXIgdG8gCisgKiAgICAgICAgICAgICAgICAgIHNlY3Rpb24gMy40LjQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0IC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDE2LiBvciBkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgIHByZWRNb2RlIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgZW51bWVyYXRpb24gCisgKiAgICAgICAgICAgICAgT01YVkNNNFAxMEludHJhMTZ4MTZQcmVkTW9kZSAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9WRVJULCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUiBpbmRpY2F0aW5nIHBbeCwtMV0gKHggPSAwLi4xNSkgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfMTZYMTZfSE9SLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IE9NWF9WQ19MRUZUIAorICogICAgICAgICAgICAgIGluZGljYXRpbmcgcFstMSx5XSAoeSA9IDAuLjE1KSBpcyBub3QgYXZhaWxhYmxlLiAKKyAqICAgIHByZWRNb2RlIGlzIE9NWF9WQ18xNlgxNl9QTEFORSwgYnV0IGF2YWlsYWJpbGl0eSBkb2Vzbid0IHNldCAKKyAqICAgICAgICAgICAgICBPTVhfVkNfVVBQRVJfTEVGVCBvciBPTVhfVkNfVVBQRVIgb3IgT01YX1ZDX0xFRlQgaW5kaWNhdGluZyAKKyAqICAgICAgICAgICAgICBwW3gsLTFdKHggPSAwLi4xNSksIG9yIHBbLTEseV0gKHkgPSAwLi4xNSksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkuICAKKyAqCisgKiBOb3RlOiAKKyAqICAgICBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVycyBpZiAKKyAqICAgICB0aGV5IGFyZSBub3QgdXNlZCBieSBpbnRyYSBwcmVkaWN0aW9uIGltcGxpZWQgaW4gcHJlZE1vZGUuIAorICogTm90ZTogCisgKiAgICAgT01YX1ZDX1VQUEVSX1JJR0hUIGlzIG5vdCB1c2VkIGluIGludHJhXzE2eDE2IGx1bWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0xlZnQsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmUsCisgICAgY29uc3QgT01YX1U4ICpwU3JjQWJvdmVMZWZ0LAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIGxlZnRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhWQ000UDEwSW50cmExNngxNlByZWRNb2RlIHByZWRNb2RlLAorICAgIE9NWF9TMzIgYXZhaWxhYmlsaXR5CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCAgICg2LjMuMy4xLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIGZvciBjaHJvbWEgc2FtcGxlcy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0xlZnQgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBsZWZ0IHBpeGVsczogcFt4LCB5XSAoeCA9IC0xLCB5PSAKKyAqICAgICAgICAgICAgMC4uNykuIAorICogICBwU3JjQWJvdmUgLSBQb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgOCBhYm92ZSBwaXhlbHM6IHBbeCx5XSAoeCA9IDAuLjcsIHkgCisgKiAgICAgICAgICAgID0gLTEpOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgcFNyY0Fib3ZlTGVmdCAtIFBvaW50ZXIgdG8gdGhlIGFib3ZlIGxlZnQgcGl4ZWxzOiBwW3gseV0gKHggPSAtMSwgeSA9IC0xKSAKKyAqICAgbGVmdFN0ZXAgLSBTdGVwIG9mIGxlZnQgcGl4ZWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIGRzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcHJlZE1vZGUgLSBJbnRyYSBjaHJvbWEgcHJlZGljdGlvbiBtb2RlLCBwbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAzLjQuMy4gCisgKiAgIGF2YWlsYWJpbGl0eSAtIE5laWdoYm9yaW5nIGNocm9tYSBibG9jayBhdmFpbGFiaWxpdHkgZmxhZywgcGxlYXNlIHJlZmVyIAorICogICAgICAgICAgICB0byAgIk5laWdoYm9yaW5nIE1hY3JvYmxvY2sgQXZhaWxhYmlsaXR5Ii4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwRHN0IGlzIE5VTEwuIAorICogICAgZHN0U3RlcCA8IDggb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgIGxlZnRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDguIAorICogICAgcHJlZE1vZGUgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSBvZiBlbnVtZXJhdGlvbiAKKyAqICAgICAgICAgICAgICBPTVhWQ000UDEwSW50cmFDaHJvbWFQcmVkTW9kZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1ZFUlQsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgCisgKiAgICAgICAgICAgICAgT01YX1ZDX1VQUEVSIGluZGljYXRpbmcgcFt4LC0xXSAoeCA9IDAuLjcpIGlzIG5vdCBhdmFpbGFibGUuIAorICogICAgcHJlZE1vZGUgaXMgT01YX1ZDX0NIUk9NQV9IT1IsIGJ1dCBhdmFpbGFiaWxpdHkgZG9lc24ndCBzZXQgT01YX1ZDX0xFRlQgCisgKiAgICAgICAgICAgICAgaW5kaWNhdGluZyBwWy0xLHldICh5ID0gMC4uNykgaXMgbm90IGF2YWlsYWJsZS4gCisgKiAgICBwcmVkTW9kZSBpcyBPTVhfVkNfQ0hST01BX1BMQU5FLCBidXQgYXZhaWxhYmlsaXR5IGRvZXNuJ3Qgc2V0IAorICogICAgICAgICAgICAgIE9NWF9WQ19VUFBFUl9MRUZUIG9yIE9NWF9WQ19VUFBFUiBvciBPTVhfVkNfTEVGVCBpbmRpY2F0aW5nIAorICogICAgICAgICAgICAgIHBbeCwtMV0oeCA9IDAuLjcpLCBvciBwWy0xLHldICh5ID0gMC4uNyksIG9yIHBbLTEsLTFdIGlzIG5vdCAKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX1VQUEVSLCBidXQgcFNyY0Fib3ZlIGlzIE5VTEwuIAorICogICAgYXZhaWxhYmlsaXR5IHNldHMgT01YX1ZDX0xFRlQsIGJ1dCBwU3JjTGVmdCBpcyBOVUxMLiAKKyAqICAgIGF2YWlsYWJpbGl0eSBzZXRzIE9NWF9WQ19VUFBFUl9MRUZULCBidXQgcFNyY0Fib3ZlTGVmdCBpcyBOVUxMLiAKKyAqICAgIGVpdGhlciBwU3JjQWJvdmUgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDgtYnl0ZSBib3VuZGFyeS4gIAorICoKKyAqICBOb3RlOiBwU3JjQWJvdmUsIHBTcmNBYm92ZSwgcFNyY0Fib3ZlTGVmdCBtYXkgYmUgaW52YWxpZCBwb2ludGVyIGlmIAorICogIHRoZXkgYXJlIG5vdCB1c2VkIGJ5IGludHJhIHByZWRpY3Rpb24gaW1wbGllZCBpbiBwcmVkTW9kZS4gCisgKgorICogIE5vdGU6IE9NWF9WQ19VUFBFUl9SSUdIVCBpcyBub3QgdXNlZCBpbiBpbnRyYSBjaHJvbWEgcHJlZGljdGlvbi4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4ICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNMZWZ0LAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY0Fib3ZlTGVmdCwKKyAgICBPTVhfVTggKnBEc3QsCisgICAgT01YX0lOVCBsZWZ0U3RlcCwKKyAgICBPTVhfSU5UIGRzdFN0ZXAsCisgICAgT01YVkNNNFAxMEludHJhQ2hyb21hUHJlZE1vZGUgcHJlZE1vZGUsCisgICAgT01YX1MzMiBhdmFpbGFiaWxpdHkKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgICAoNi4zLjMuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgcXVhcnRlci1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBsdW1hIE1CLiBJdCBpcyBhc3N1bWVkIHRoYXQgCisgKiB0aGUgZnJhbWUgaXMgYWxyZWFkeSBwYWRkZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtIHJlZmVyZW5jZSBmcmFtZSBzdGVwLCBpbiBieXRlczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHJvaS53aWR0aCAKKyAqICAgZHN0U3RlcCAtIGRlc3RpbmF0aW9uIGZyYW1lIHN0ZXAsIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgCisgKiAgICAgICAgICAgIHJvaS53aWR0aCAKKyAqICAgZHggLSBGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgZHkgLSBGcmFjdGlvbmFsIHBhcnQgb2YgdmVydGljYWwgbW90aW9uIHZlY3RvciB5IGNvbXBvbmVudCBpbiAxLzQgcGl4ZWwgCisgKiAgICAgICAgICAgIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXSAKKyAqICAgcm9pIC0gRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjsgdGhlIHBhcmFtZXRlcnMgcm9pLndpZHRoIGFuZCAKKyAqICAgICAgICAgICAgcm9pLmhlaWdodCBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmcmFtZSBidWZmZXI6IAorICogICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgIGlmIHJvaS53aWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgICAgICAgICBpZiByb2kud2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBJZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLCBpdCByZXR1cm5zIE9NWF9TdHNfTm9FcnIuIAorICogICAgSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAKKyAqICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0VycjogCisgKiAgICBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgPCByb2kud2lkdGguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLDNdLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7NCwgOCwgMTZ9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBidXQgcERzdCBpcyBub3QgNCBieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDggb3IgMTYsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICBzcmNTdGVwIG9yIGRzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBPTVhfUzMyIHNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0LAorICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICBPTVhfUzMyIGR4LAorICAgIE9NWF9TMzIgZHksCisgICAgT01YU2l6ZSByb2kKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAgICg2LjMuMy4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyAxLzgtcGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgaW50ZXIgY2hyb21hIE1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC1Qb2ludGVyIHRvIHRoZSBzb3VyY2UgcmVmZXJlbmNlIGZyYW1lIGJ1ZmZlciAKKyAqICAgc3JjU3RlcCAtUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZXMgCisgKiAgIGRzdFN0ZXAgLURlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAKKyAqICAgICAgICAgICAgcm9pLndpZHRoLiAKKyAqICAgZHggLUZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICBkeSAtRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IgY29tcG9uZW50IGluIDEvOCBwaXhlbCAKKyAqICAgICAgICAgICAgdW5pdDsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddIAorICogICByb2kgLURpbWVuc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvbiByZWdpb247IHRoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgCisgKiAgICAgICAgICAgIHJvaS5oZWlnaHQgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLVBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlcjoKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZCAKKyAqICAgICAgICAgaWYgcm9pLndpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIHBTcmMgb3IgcERzdCBpcyBOVUxMLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguIAorICogICAgZHggb3IgZHkgaXMgb3V0IG9mIHJhbmdlIFswLTddLiAKKyAqICAgIHJvaS53aWR0aCBvciByb2kuaGVpZ2h0IGlzIG91dCBvZiByYW5nZSB7Miw0LDh9LiAKKyAqICAgIHJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuIAorICogICAgcm9pLndpZHRoIGlzIGVxdWFsIHRvIDQsIGJ1dCBwRHN0IGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICByb2kud2lkdGggaXMgZXF1YWwgdG8gOCwgYnV0IHBEc3QgaXMgbm90IDggYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1MzMiBzcmNTdGVwLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfUzMyIGRzdFN0ZXAsCisgICAgT01YX1MzMiBkeCwKKyAgICBPTVhfUzMyIGR5LAorICAgIE9NWFNpemUgcm9pCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JICAgKDYuMy4zLjMuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgdmVydGljYWwgZWRnZXMgb2YgdGhlIGx1bWEgCisgKiBtYWNyb2Jsb2NrICgxNngxNikuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLSBQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrOyBtdXN0IGJlIDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLVN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC1BcnJheSBvZiBzaXplIDIgb2YgYWxwaGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGFscGhhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIAorICogICAgICAgICAgICBmb3IgdGhlIGludGVybmFsIHZlcnRpY2FsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgCisgKiAgICAgICAgICAgIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtQXJyYXkgb2Ygc2l6ZSAxNiBvZiBUaHJlc2hvbGRzIChUQzApICh2YWx1ZXMgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcik7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuLiAgUGVyIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgCisgKiAgICAgICAgICAgIGJlIGluIHRoZSByYW5nZSBbMCwyNV0uIAorICogICBwQlMgLUFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgCisgKiAgICAgICAgICAgIG9yZGVyKTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgCisgKiAgICAgICAgICAgIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4gCisgKiAgICBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIAorICogICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyOiAKKyAqICAgIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRocmVzaG9sZHMsIG9yIHBCUyAKKyAqICAgICAgICAgICAgICBpcyBOVUxMLiAKKyAqICAgIEVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuIAorICogICAgcEFscGhhWzBdIGFuZC9vciBwQWxwaGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIE9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgdGhlIAorICogICAgICAgICAgICAgIHJhbmdlIFswLDI1XS4gCisgKiAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAocEJTW2ldPT00ICYmIAorICogICAgICAgICAgICAgIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIGZvdXIgaG9yaXpvbnRhbCBlZGdlcyBvZiB0aGUgbHVtYSAKKyAqIG1hY3JvYmxvY2sgKDE2eDE2KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgc3JjZHN0U3RlcCAtIHN0ZXAgb2YgdGhlIGFycmF5czsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcEFscGhhIC0gYXJyYXkgb2Ygc2l6ZSAyIG9mIGFscGhhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgYW5kIHRoZSBzZWNvbmQgaXRlbSBpcyAKKyAqICAgICAgICAgICAgZm9yIHRoZSBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UpOyBwZXIgW0lTTzE0NDk2LTEwXSBhbHBoYSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIGFycmF5IG9mIHNpemUgMiBvZiBiZXRhIHRocmVzaG9sZHMgKHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBiZXRhIAorICogICAgICAgICAgICB0aHJlc2hvbGQgZm9yIHRoZSBleHRlcm5hbCBob3Jpem9udGFsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gCisgKiAgICAgICAgICAgIGlzIGZvciB0aGUgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlKS4gUGVyIFtJU08xNDQ5Ni0xMF0gYmV0YSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDE4XS4gCisgKiAgIHBUaHJlc2hvbGRzIC0gYXJyYXkgb2Ygc2l6ZSAxNiBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDR4NCBibG9jaywgYXJyYW5nZWQgaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXI7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeS4gIFBlciBbSVNPMTQ0OTYgMTBdIAorICogICAgICAgICAgICB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNiBvZiBCUyBwYXJhbWV0ZXJzIChhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIAorICogICAgICAgICAgICBvcmRlcik7IHZhbGlkIGluIHRoZSByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC1Qb2ludGVyIHRvIGZpbHRlcmVkIG91dHB1dCBtYWNyb2Jsb2NrLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyLCBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBlaXRoZXIgcFRocmVzaG9sZHMgb3IgcEJTIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LiAKKyAqICAgIC0gICAgcFNyY0RzdCBpcyBub3QgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uMTVdIGlzIAorICogICAgICAgICBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwyNV0uIAorICogICAgLSAgICBwQlMgaXMgb3V0IG9mIHJhbmdlLCBpLmUuLCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGlzIHRydWU6IAorICogICAgICAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgICAocEJTW2ldPT00ICYmIHBCU1tpXjNdIT00KSBmb3IgMDw9aTw9My4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0kgICAoNi4zLjMuMy4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgaW4tcGxhY2UgZGVibG9jayBmaWx0ZXJpbmcgb24gZm91ciB2ZXJ0aWNhbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoOHg4KS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2s7IG11c3QgYmUgOC1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gU3RlcCBvZiB0aGUgYXJyYXlzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIEFycmF5IG9mIHNpemUgMiBvZiBhbHBoYSB0aHJlc2hvbGRzICh0aGUgZmlyc3QgaXRlbSBpcyBhbHBoYSAKKyAqICAgICAgICAgICAgdGhyZXNob2xkIGZvciBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIGZvciAKKyAqICAgICAgICAgICAgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGFscGhhIHZhbHVlcyBtdXN0IGJlIAorICogICAgICAgICAgICBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gQXJyYXkgb2Ygc2l6ZSAyIG9mIGJldGEgdGhyZXNob2xkcyAodGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGJldGEgCisgKiAgICAgICAgICAgIHRocmVzaG9sZCBmb3IgdGhlIGV4dGVybmFsIHZlcnRpY2FsIGVkZ2UsIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgCisgKiAgICAgICAgICAgIGZvciB0aGUgaW50ZXJuYWwgdmVydGljYWwgZWRnZSk7IHBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIAorICogICAgICAgICAgICBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIEFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSBsZWZ0IAorICogICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlIG9mIGVhY2ggNHgyIGNocm9tYSBibG9jaywgYXJyYW5nZWQgaW4gdmVydGljYWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIEFycmF5IG9mIHNpemUgMTYgb2YgQlMgcGFyYW1ldGVycyAodmFsdWVzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCBibG9jayBvcmRlcikuIFRoaXMgcGFyYW1ldGVyIGlzIHRoZSAKKyAqICAgICAgICAgICAgc2FtZSBhcyB0aGUgcEJTIHBhcmFtZXRlciBwYXNzZWQgaW50byBGaWx0ZXJEZWJsb2NrTHVtYV9WZXJFZGdlOyAKKyAqICAgICAgICAgICAgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIAorICogICAgICAgICAgICBwQlNbaV09PSA0IG1heSBvY2N1ciBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgCisgKiAgICAgICAgICAgIG9ubHkgaWYgcEJTW2leM109PSA0LiAgTXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4gCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNEc3QgLVBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgIHBCU1tpXTwwLCBwQlNbaV0+NCwgcEJTW2ldPT00IGZvciBpPj00LCBvciAKKyAqICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICAgKDYuMy4zLjMuNCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2sgZmlsdGVyaW5nIG9uIHRoZSBob3Jpem9udGFsIGVkZ2VzIG9mIHRoZSBjaHJvbWEgCisgKiBtYWNyb2Jsb2NrICg4eDgpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBhcnJheSBzdGVwOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgIHBBbHBoYSAtIGFycmF5IG9mIHNpemUgMiBjb250YWluaW5nIGFscGhhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciBpbnRlcm5hbCBob3Jpem9udGFsIAorICogICAgICAgICAgICBlZGdlLiAgUGVyIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIAorICogICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgcEJldGEgLSBhcnJheSBvZiBzaXplIDIgY29udGFpbmluZyBiZXRhIHRocmVzaG9sZHM7IHRoZSBmaXJzdCBlbGVtZW50IAorICogICAgICAgICAgICBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBhbmQgdGhlIAorICogICAgICAgICAgICBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgdGhyZXNob2xkIGZvciB0aGUgaW50ZXJuYWwgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZS4gIFBlciBbSVNPMTQ0OTYtMTBdIGJldGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOCBjb250YWluaW5nIHRocmVzaG9sZHMsIFRDMCwgZm9yIHRoZSB0b3AgCisgKiAgICAgICAgICAgIGhvcml6b250YWwgZWRnZSBvZiBlYWNoIDJ4NCBjaHJvbWEgYmxvY2ssIGFycmFuZ2VkIGluIGhvcml6b250YWwgCisgKiAgICAgICAgICAgIGJsb2NrIG9yZGVyOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIGFycmF5IG9mIHNpemUgMTYgY29udGFpbmluZyBCUyBwYXJhbWV0ZXJzIGZvciBlYWNoIDJ4MiBjaHJvbWEgCisgKiAgICAgICAgICAgIGJsb2NrLCBhcnJhbmdlZCBpbiBob3Jpem9udGFsIGJsb2NrIG9yZGVyOyB2YWxpZCBpbiB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgIFswLDRdIHdpdGggdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6IGkpIHBCU1tpXT09IDQgbWF5IG9jY3VyIAorICogICAgICAgICAgICBvbmx5IGZvciAwPD1pPD0zLCBpaSkgcEJTW2ldPT0gNCBpZiBhbmQgb25seSBpZiBwQlNbaV4zXT09IDQuIAorICogICAgICAgICAgICBNdXN0IGJlIDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtUG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciwgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNEc3QsIHBBbHBoYSwgcEJldGEsIHBUaHJlc2hvbGRzLCBvciBwQlMuIAorICogICAgLSAgICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKiAgICAtICAgIHBUaHJlc2hvbGRzIGlzIG5vdCA0LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIHBBbHBoYVswXSBhbmQvb3IgcEFscGhhWzFdIGlzIG91dHNpZGUgdGhlIHJhbmdlIFswLDI1NV0uIAorICogICAgLSAgICBwQmV0YVswXSBhbmQvb3IgcEJldGFbMV0gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAsMThdLiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgZW50cmllcyBpbiB0aGUgdGFibGUgcFRocmVzaG9sZHNbMC4uN10gaXMgb3V0c2lkZSAKKyAqICAgICAgICAgb2YgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgIChwQlNbaV09PTQgJiYgcEJTW2leM10hPTQpIGZvciAwPD1pPD0zLgorICogICAgLSAgICBwQlMgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JICgKKyAgICBPTVhfVTggKnBTcmNEc3QsCisgICAgT01YX1MzMiBzcmNkc3RTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcEFscGhhLAorICAgIGNvbnN0IE9NWF9VOCAqcEJldGEsCisgICAgY29uc3QgT01YX1U4ICpwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgICAoNi4zLjMuMy41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbi1wbGFjZSBkZWJsb2NrIGZpbHRlcmluZyB0aGUgaG9yaXpvbnRhbCBhbmQgCisgKiB2ZXJ0aWNhbCBlZGdlcyBvZiBhIGx1bWEgbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBzcmNkc3RTdGVwIC0gaW1hZ2Ugd2lkdGg7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIHBBbHBoYSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYWxwaGEgdGhyZXNob2xkcywgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7ZXh0ZXJuYWwgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgCisgKiAgICAgICAgICAgIGV4dGVybmFsIGhvcml6b250YWwgZWRnZSwgaW50ZXJuYWwgaG9yaXpvbnRhbCBlZGdlIH0uICBQZXIgCisgKiAgICAgICAgICAgIFtJU08xNDQ5Ni0xMF0gYWxwaGEgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIAorICogICBwQmV0YSAtIHBvaW50ZXIgdG8gYSAyeDIgdGFibGUgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogCisgKiAgICAgICAgICAgIHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIHRocmVzaG9sZCAoVEMwKSwgb3JnYW5pemVkIGFzIAorICogICAgICAgICAgICBmb2xsb3dzOiB7dmFsdWVzIGZvciB0aGUgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCAKKyAqICAgICAgICAgICAgYXJyYW5nZWQgaW4gdmVydGljYWwgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXJ9OyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuICBQZXIgW0lTTzE0NDk2LTEwXSAKKyAqICAgICAgICAgICAgdmFsdWVzIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgIHBCUyAtIHBvaW50ZXIgdG8gYSAxNngyIHRhYmxlIG9mIEJTIHBhcmFtZXRlcnMgYXJyYW5nZWQgaW4gc2NhbiBibG9jayAKKyAqICAgICAgICAgICAgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7IHZhbGlkIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgCisgKiAgICAgICAgICAgIG9jY3VyIG9ubHkgZm9yIDA8PWk8PTMsIGlpKSBwQlNbaV09PSA0IGlmIGFuZCBvbmx5IGlmIHBCU1tpXjNdPT0gCisgKiAgICAgICAgICAgIDQuIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QsIHBBbHBoYSwgCisgKiAgICAgICAgICAgICAgcEJldGEsIHBUaHJlc2hvbGRzIG9yIHBCUy4gCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IDE2LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIGVpdGhlciBwVGhyZXNob2xkcyBvciBwQlMgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICogICAgLSAgICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQWxwaGFbMC4uM10gaXMgb3V0c2lkZSB0aGUgcmFuZ2UgCisgKiAgICAgICAgICAgICAgWzAsMjU1XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBCZXRhWzAuLjNdIGlzIG91dHNpZGUgdGhlIHJhbmdlIAorICogICAgICAgICAgICAgIFswLDE4XS4gCisgKiAgICAtICAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjMxXWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogCisgKiAgICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIAorICogICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgICBzcmNkc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JICAgKDYuMy4zLjMuNikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIGluLXBsYWNlIGRlYmxvY2tpbmcgZmlsdGVyaW5nIG9uIGFsbCBlZGdlcyBvZiB0aGUgY2hyb21hIAorICogbWFjcm9ibG9jayAoMTZ4MTYpLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jazsgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgIHNyY2RzdFN0ZXAgLSBzdGVwIG9mIHRoZSBhcnJheXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAKKyAqICAgcEFscGhhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgCisgKiAgICAgICAgICAgIGZvbGxvd3M6IHtleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCAKKyAqICAgICAgICAgICAgZXh0ZXJuYWwgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciAKKyAqICAgICAgICAgICAgW0lTTzE0NDk2LTEwXSBhbHBoYSB2YWx1ZXMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsMjU1XS4gCisgKiAgIHBCZXRhIC0gcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBCZXRhIFRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiAKKyAqICAgICAgICAgICAgeyBleHRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAKKyAqICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfS4gIFBlciBbSVNPMTQ0OTYtMTBdIAorICogICAgICAgICAgICBiZXRhIHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSBbMCwxOF0uIAorICogICBwVGhyZXNob2xkcyAtIGFycmF5IG9mIHNpemUgOHgyIG9mIFRocmVzaG9sZHMgKFRDMCkgKHZhbHVlcyBmb3IgdGhlIGxlZnQgCisgKiAgICAgICAgICAgIG9yIGFib3ZlIGVkZ2Ugb2YgZWFjaCA0eDIgb3IgMng0IGJsb2NrLCBhcnJhbmdlZCBpbiB2ZXJ0aWNhbCAKKyAqICAgICAgICAgICAgYmxvY2sgb3JkZXIgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcik7IG11c3QgYmUgYWxpZ25lZCAKKyAqICAgICAgICAgICAgb24gYSA0LWJ5dGUgYm91bmRhcnkuIFBlciBbSVNPMTQ0OTYtMTBdIHZhbHVlcyBtdXN0IGJlIGluIHRoZSAKKyAqICAgICAgICAgICAgcmFuZ2UgWzAsMjVdLiAKKyAqICAgcEJTIC0gYXJyYXkgb2Ygc2l6ZSAxNngyIG9mIEJTIHBhcmFtZXRlcnMgKGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgCisgKiAgICAgICAgICAgIGZvciB2ZXJ0aWNhbCBlZGdlcyBhbmQgdGhlbiBob3Jpem9udGFsIGVkZ2VzKTsgdmFsaWQgaW4gdGhlIAorICogICAgICAgICAgICByYW5nZSBbMCw0XSB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOiBpKSBwQlNbaV09PSA0IG1heSAKKyAqICAgICAgICAgICAgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leM109PSAKKyAqICAgICAgICAgICAgNC4gIE11c3QgYmUgNC1ieXRlIGFsaWduZWQuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gcG9pbnRlciB0byBmaWx0ZXJlZCBvdXRwdXQgbWFjcm9ibG9jay4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMgCisgKiAgICAtICAgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiBwU3JjRHN0LCBwQWxwaGEsIAorICogICAgICAgICAgICAgIHBCZXRhLCBwVGhyZXNob2xkcywgb3IgcEJTLiAKKyAqICAgIC0gICBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBBbHBoYVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwyNTVdLiAKKyAqICAgIC0gICBvbmUgb3IgbW9yZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBwQmV0YVswLi4zXSBpcyBvdXRzaWRlIHRoZSByYW5nZSAKKyAqICAgICAgICAgICAgICBbMCwxOF0uIAorICogICAgLSAgIG9uZSBvciBtb3JlIGVudHJpZXMgaW4gdGhlIHRhYmxlIHBUaHJlc2hvbGRzWzAuLjE1XWlzIG91dHNpZGUgb2YgCisgKiAgICAgICAgICAgICAgdGhlIHJhbmdlIFswLDI1XS4gCisgKiAgICAtICAgcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiAKKyAqICAgICAgICAgICAgcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgIGZvciBpPj00LCBvciAKKyAqICAgICAgICAgICAgKHBCU1tpXT09NCAmJiBwQlNbaV4zXSE9NCkgZm9yIDA8PWk8PTMuIAorICogICAgLSAgIHNyY2RzdFN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kgKAorICAgIE9NWF9VOCAqcFNyY0RzdCwKKyAgICBPTVhfUzMyIHNyY2RzdFN0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwQWxwaGEsCisgICAgY29uc3QgT01YX1U4ICpwQmV0YSwKKyAgICBjb25zdCBPTVhfVTggKnBUaHJlc2hvbGRzLAorICAgIGNvbnN0IE9NWF9VOCAqcEJTCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAgICg2LjMuNC4xLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgYSAyeDIgYmxvY2sgb2YgCisgKiBDaHJvbWFEQ0xldmVsLiAgVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgcG9zaXRpb24tY29lZmZpY2llbnQgCisgKiBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSBmaXJzdCBidWZmZXIgZWxlbWVudCAKKyAqIGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiB0aGUgYmxvY2suIFdpdGhpbiAKKyAqIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IGluZGljYXRlcyB0aGUgCisgKiByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSBjb2VmZmljaWVudCBlbnRyeSAKKyAqIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSBEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbSBidWZmZXIgCisgKiAgIHBPZmZzZXQgLSBQb2ludGVyIHRvIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluIHRoZSBieXRlIHBvaW50ZWQgdG8gYnkgCisgKiAgICAgICAgICAgICpwcEJpdFN0cmVhbTsgdmFsaWQgaW4gdGhlIHJhbmdlIFswLDddLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLSAqcHBCaXRTdHJlYW0gaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQgCisgKiAgIHBPZmZzZXQgLSAqcE9mZnNldCBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZCAKKyAqICAgcE51bUNvZWZmIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoaXMgYmxvY2sgCisgKiAgIHBwUG9zQ29lZkJ1ZiAtIERvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsIAorICogICAgICAgICAgICBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlci4gIEJ1ZmZlciBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyB0aGVyZSBhcmUgb25seSAKKyAqICAgICAgICAgICAgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAgSW4gdGhpcyBjYXNlIAorICogICAgICAgICAgICB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgdHJhbnNmb3JtL2RlcXVhbnRpemF0aW9uIG9mIAorICogICAgICAgICAgICB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcEJpdFN0cmVhbSBvciBwT2Zmc2V0IGlzIE5VTEwuIAorICogICAgLSAgICBwcFBvc0NvZWZCdWYgb3IgcE51bUNvZWZmIGlzIE5VTEwuIAorICogICAgT01YX1N0c19FcnIgLSBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOiAKKyAqICAgIC0gICAgYW4gaWxsZWdhbCBjb2RlIGlzIGVuY291bnRlcmVkIGluIHRoZSBiaXRzdHJlYW0gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyKnBPZmZzZXQsCisgICAgT01YX1U4ICpwTnVtQ29lZmYsCisgICAgT01YX1U4ICoqcHBQb3NDb2VmYnVmCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMgICAoNi4zLjQuMS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCwgTHVtYUxldmVsLCBhbmQgQ2hyb21hQUNMZXZlbC4gSW52ZXJzZSAKKyAqIGZpZWxkIHNjYW4gaXMgbm90IHN1cHBvcnRlZC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHRoZSBwYWNrZWQgCisgKiBwb3NpdGlvbi1jb2VmZmljaWVudCBidWZmZXIgYXJlIHN0b3JlZCBpbiByZXZlcnNlIHppZy16YWcgb3JkZXIsIGkuZS4sIHRoZSAKKyAqIGZpcnN0IGJ1ZmZlciBlbGVtZW50IGNvbnRhaW5zIHRoZSBsYXN0IG5vbi16ZXJvIHBvc3Rpb24tY29lZmZpY2llbnQgcGFpciBvZiAKKyAqIHRoZSBibG9jay4gV2l0aGluIGVhY2ggcG9zaXRpb24tY29lZmZpY2llbnQgcGFpciwgdGhlIHBvc2l0aW9uIGVudHJ5IAorICogaW5kaWNhdGVzIHRoZSByYXN0ZXItc2NhbiBwb3NpdGlvbiBvZiB0aGUgY29lZmZpY2llbnQsIHdoaWxlIHRoZSAKKyAqIGNvZWZmaWNpZW50IGVudHJ5IGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCB2YWx1ZS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBCaXRTdHJlYW0gLURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlciAKKyAqICAgcE9mZnNldCAtIFBvaW50ZXIgdG8gY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGJ5dGUgcG9pbnRlZCB0byBieSAKKyAqICAgICAgICAgICAgKnBwQml0U3RyZWFtOyB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10uIAorICogICBzTWF4TnVtQ29lZmYgLSBNYXhpbXVtIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGluIGN1cnJlbnQgCisgKiAgICAgICAgICAgIGJsb2NrIAorICogICBzVkxDU2VsZWN0IC0gVkxDIHRhYmxlIHNlbGVjdG9yLCBvYnRhaW5lZCBmcm9tIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50cyBjb250YWluZWQgaW4gdGhlIGFib3ZlIGFuZCBsZWZ0IDR4NCBibG9ja3MuICBJdCBpcyAKKyAqICAgICAgICAgICAgZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIHRhYmxlIAorICogICAgICAgICAgICA5IDUsIGV4Y2VwdCBpdHMgdmFsdWUgY2FuIHQgYmUgbGVzcyB0aGFuIHplcm8uIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcEJpdFN0cmVhbSAtICpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZC4gIAorICogICAgICAgICAgICBCdWZmZXIgcG9zaXRpb24gKCpwcFBvc0NvZWZCdWYpIGlzIHVwZGF0ZWQgdXBvbiByZXR1cm4sIHVubGVzcyAKKyAqICAgICAgICAgICAgdGhlcmUgYXJlIG9ubHkgemVybyBjb2VmZmljaWVudHMgaW4gdGhlIGN1cnJlbnRseSBkZWNvZGVkIGJsb2NrLiAKKyAqICAgICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGJ5cGFzcyB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybS9kZXF1YW50aXphdGlvbiBvZiB0aGUgZW1wdHkgYmxvY2tzLiAKKyAqICAgcE9mZnNldCAtICpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkIAorICogICBwTnVtQ29lZmYgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgaW4gdGhpcyBibG9jayAKKyAqICAgcHBQb3NDb2VmQnVmIC0gRG91YmxlIHBvaW50ZXIgdG8gZGVzdGluYXRpb24gcmVzaWR1YWwgCisgKiAgICAgICAgICAgIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgcHBCaXRTdHJlYW0gb3IgcE9mZnNldCBpcyBOVUxMLiAKKyAqICAgIC0gICAgcHBQb3NDb2VmQnVmIG9yIHBOdW1Db2VmZiBpcyBOVUxMLiAKKyAqICAgIC0gICAgc01heE51bUNvZWZmIGlzIG5vdCBlcXVhbCB0byBlaXRoZXIgMTUgb3IgMTYuIAorICogICAgLSAgICBzVkxDU2VsZWN0IGlzIGxlc3MgdGhhbiAwLiAKKyAqCisgKiAgICBPTVhfU3RzX0VyciAtIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6IAorICogICAgLSAgICBhbiBpbGxlZ2FsIGNvZGUgaXMgZW5jb3VudGVyZWQgaW4gdGhlIGJpdHN0cmVhbSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDICgKKyAgICBjb25zdCBPTVhfVTggKipwcEJpdFN0cmVhbSwKKyAgICBPTVhfUzMyICpwT2Zmc2V0LAorICAgIE9NWF9VOCAqcE51bUNvZWZmLAorICAgIE9NWF9VOCAqKnBwUG9zQ29lZmJ1ZiwKKyAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgT01YX0lOVCBzTWF4TnVtQ29lZmYKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXIgICAoNi4zLjQuMi4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3RzIHRoZSA0eDQgTHVtYURDIGJsb2NrIGZyb20gdGhlIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgCisgKiBidWZmZXIsIHBlcmZvcm1zIGludGVnZXIgaW52ZXJzZSwgYW5kIGRlcXVhbnRpemF0aW9uIGZvciA0eDQgTHVtYURDIAorICogY29lZmZpY2llbnRzLCBhbmQgdXBkYXRlcyB0aGUgcGFpciBidWZmZXIgcG9pbnRlciB0byB0aGUgbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBZIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgNHg0IEx1bWFEQyBjb2VmZmljaWVudHMgYnVmZmVyOyBtdXN0IAorICogICAgICAgICAgICBiZSBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5LiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwcFNyYyBvciBwRHN0IGlzIE5VTEwuIAorICogICAgLSAgICBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4gCisgKiAgICAtICAgIFFQIGlzIG5vdCBpbiB0aGUgcmFuZ2Ugb2YgWzAtNTFdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpciAoCisgICAgY29uc3QgT01YX1U4ICoqcHBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfSU5UIFFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgICAoNi4zLjQuMi4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogUmVjb25zdHJ1Y3QgdGhlIDJ4MiBDaHJvbWFEQyBibG9jayBmcm9tIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyLCAKKyAqIHBlcmZvcm0gaW50ZWdlciBpbnZlcnNlIHRyYW5zZm9ybWF0aW9uLCBhbmQgZGVxdWFudGl6YXRpb24gZm9yIDJ4MiBjaHJvbWEgCisgKiBEQyBjb2VmZmljaWVudHMsIGFuZCB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgCisgKiBibG9jay4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcHBTcmMgLSBEb3VibGUgcG9pbnRlciB0byByZXNpZHVhbCBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciAKKyAqICAgICAgICAgICAgb3V0cHV0IGJ5IENBTFZDIGRlY29kaW5nIAorICogICBRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIgUXBDIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtICpwcFNyYyBpcyB1cGRhdGVkIHRvIHRoZSBzdGFydCBvZiBuZXh0IG5vbiBlbXB0eSBibG9jayAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgMngyIENocm9tYURDIGNvZWZmaWNpZW50cyBidWZmZXI7IAorICogICAgICAgICAgICBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBwU3JjIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgUVAgaXMgbm90IGluIHRoZSByYW5nZSBvZiBbMC01MV0uIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXIgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIE9NWF9TMTYgKnBEc3QsCisgICAgT01YX0lOVCBRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkICAgKDYuMy40LjIuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFJlY29uc3RydWN0IHRoZSA0eDQgcmVzaWR1YWwgYmxvY2sgZnJvbSBjb2VmZmljaWVudC1wb3NpdGlvbiBwYWlyIGJ1ZmZlciwgCisgKiBwZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnRlZ2VyIGludmVyc2UgdHJhbnNmb3JtYXRpb24gZm9yIDR4NCBibG9jayBvZiAKKyAqIHJlc2lkdWFscyB3aXRoIHByZXZpb3VzIGludHJhIHByZWRpY3Rpb24gb3IgbW90aW9uIGNvbXBlbnNhdGlvbiBkYXRhLCBhbmQgCisgKiB1cGRhdGUgdGhlIHBhaXIgYnVmZmVyIHBvaW50ZXIgdG8gbmV4dCBub24tZW1wdHkgYmxvY2suIElmIHBEQyA9PSBOVUxMLCAKKyAqIHRoZXJlIHJlIDE2IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50cyBhdCBtb3N0IGluIHRoZSBwYWNrZWQgYnVmZmVyIHN0YXJ0aW5nIAorICogZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gMDsgSWYgcERDICE9IE5VTEwsIHRoZXJlIHJlIDE1IG5vbi16ZXJvIEFDIAorICogY29lZmZpY2llbnRzIGF0IG1vc3QgaW4gdGhlIHBhY2tldCBidWZmZXIgc3RhcnRpbmcgZnJvbSA0eDQgYmxvY2sgcG9zaXRpb24gCisgKiAxLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwcFNyYyAtIERvdWJsZSBwb2ludGVyIHRvIHJlc2lkdWFsIGNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyIAorICogICAgICAgICAgICBvdXRwdXQgYnkgQ0FMVkMgZGVjb2RpbmcgCisgKiAgIHBQcmVkIC0gUG9pbnRlciB0byB0aGUgcHJlZGljdGVkIDR4NCBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgcHJlZFN0ZXAgLSBQcmVkaWN0ZWQgZnJhbWUgc3RlcCBzaXplIGluIGJ5dGVzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgZHN0U3RlcCAtIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZXM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IAorICogICBwREMgLSBQb2ludGVyIHRvIHRoZSBEQyBjb2VmZmljaWVudCBvZiB0aGlzIGJsb2NrLCBOVUxMIGlmIGl0IGRvZXNuJ3QgCisgKiAgICAgICAgICAgIGV4aXN0IAorICogICBRUCAtIFFQIFF1YW50aXphdGlvbiBwYXJhbWV0ZXIuICBJdCBzaG91bGQgYmUgUXBDIGluIGNocm9tYSA0eDQgYmxvY2sgCisgKiAgICAgICAgICAgIGRlY29kaW5nLCBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIFFwWS4gCisgKiAgIEFDIC0gRmxhZyBpbmRpY2F0aW5nIGlmIGF0IGxlYXN0IG9uZSBub24temVybyBBQyBjb2VmZmljaWVudCBleGlzdHMgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3QgLSBwb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIDR4NCBibG9jayBkYXRhOyBtdXN0IGJlIGFsaWduZWQgb24gYSAKKyAqICAgICAgICAgICAgNC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgTlVMTC4gCisgKiAgICAtICAgIHBQcmVkIG9yIHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLiAKKyAqICAgIC0gICAgcHJlZFN0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgIC0gICAgQUMgIT0wIGFuZCBRcCBpcyBub3QgaW4gdGhlIHJhbmdlIG9mIFswLTUxXSBvciBwcFNyYyA9PSBOVUxMLiAKKyAqICAgIC0gICAgQUMgPT0wICYmIHBEQyA9PU5VTEwuIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgKAorICAgIGNvbnN0IE9NWF9VOCAqKnBwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFByZWQsCisgICAgY29uc3QgT01YX1MxNiAqcERDLAorICAgIE9NWF9VOCAqcERzdCwKKyAgICBPTVhfSU5UIHByZWRTdGVwLAorICAgIE9NWF9JTlQgZHN0U3RlcCwKKyAgICBPTVhfSU5UIFFQLAorICAgIE9NWF9JTlQgQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgICAoNi4zLjUuMS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQ29tcHV0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdmVuZG9yLXNwZWNpZmljIHNwZWNpZmljYXRpb24gCisgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBvbXhWQ000UDEwIG1vdGlvbiBlc3RpbWF0aW9uIGZ1bmN0aW9ucyBCbG9ja01hdGNoX0ludGVnZXIgCisgKiBhbmQgTW90aW9uRXN0aW1hdGlvbk1CLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBNRW1vZGUgLSBtb3Rpb24gZXN0aW1hdGlvbiBtb2RlOyBhdmFpbGFibGUgbW9kZXMgYXJlIGRlZmluZWQgYnkgdGhlIAorICogICAgICAgICAgICBlbnVtZXJhdGVkIHR5cGUgT01YVkNNNFAxME1FTW9kZSAKKyAqICAgcE1FUGFyYW1zIC1tb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU2l6ZSAtIHBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgdGhlIG1vdGlvbiAKKyAqICAgICAgICAgICAgZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgICBwTUVQYXJhbXMgb3IgcFNpemUgaXMgTlVMTC4gCisgKiAgICAtICAgIGFuIGludmFsaWQgTUVNb2RlIGlzIHNwZWNpZmllZC4gCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9NRUdldEJ1ZlNpemUgKAorICAgIE9NWFZDTTRQMTBNRU1vZGUgTUVtb2RlLAorICAgIGNvbnN0IE9NWFZDTTRQMTBNRVBhcmFtcyAqcE1FUGFyYW1zLAorICAgIE9NWF9VMzIgKnBTaXplCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfTUVJbml0ICAgKDYuMy41LjEuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEluaXRpYWxpemVzIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZWQgZm9yIHRoZSAKKyAqIG9teFZDTTRQMTAgbW90aW9uIGVzdGltYXRpb24gZnVuY3Rpb25zOiAgQmxvY2tNYXRjaF9JbnRlZ2VyIGFuZCAKKyAqIE1vdGlvbkVzdGltYXRpb25NQi4gTWVtb3J5IGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgKnBNRVNwZWMgbXVzdCBiZSAKKyAqIGFsbG9jYXRlZCBwcmlvciB0byBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYW5kIHNob3VsZCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogYm91bmRhcnkuICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgY2FuIAorICogYmUgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZnVuY3Rpb24gb214VkNNNFAxMF9NRUdldEJ1ZlNpemUuIEZvbGxvd2luZyAKKyAqIGluaXRpYWxpemF0aW9uIGJ5IHRoaXMgZnVuY3Rpb24sIHRoZSB2ZW5kb3Itc3BlY2lmaWMgc3RydWN0dXJlICpwTUVTcGVjIAorICogc2hvdWxkIGNvbnRhaW4gYW4gaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYWxsIG1vdGlvbiAKKyAqIGVzdGltYXRpb24gcGFyYW1ldGVycyByZWNlaXZlZCB2aWEgdGhlIHN0cnVjdHVyZSBwTUVQYXJhbXMsIGZvciBleGFtcGxlICAKKyAqIHNlYXJjaFJhbmdlMTZ4MTYsIHNlYXJjaFJhbmdlOHg4LCBldGMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIE1FbW9kZSAtIG1vdGlvbiBlc3RpbWF0aW9uIG1vZGU7IGF2YWlsYWJsZSBtb2RlcyBhcmUgZGVmaW5lZCBieSB0aGUgCisgKiAgICAgICAgICAgIGVudW1lcmF0ZWQgdHlwZSBPTVhWQ000UDEwTUVNb2RlIAorICogICBwTUVQYXJhbXMgLSBtb3Rpb24gZXN0aW1hdGlvbiBwYXJhbWV0ZXJzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgdW5pbml0aWFsaXplZCBNRSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcE1FU3BlYyAtIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIE1FIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIHBNRVBhcmFtcyBvciBwU2l6ZSBpcyBOVUxMLiAKKyAqICAgIC0gICAgYW4gaW52YWxpZCB2YWx1ZSB3YXMgc3BlY2lmaWVkIGZvciB0aGUgcGFyYW1ldGVyIE1FbW9kZSAKKyAqICAgIC0gICAgYSBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlIHdhcyBzcGVjaWZpZWQgZm9yIG9uZSBvZiB0aGUgc2VhcmNoIHJhbmdlcyAKKyAqICAgICAgICAgKGUuZy4sICBwTUJQYXJhbXMgPnNlYXJjaFJhbmdlOHg4LCBwTUVQYXJhbXMtPnNlYXJjaFJhbmdlMTZ4MTYsIGV0Yy4pIAorICogICAgLSAgICBlaXRoZXIgaW4gaXNvbGF0aW9uIG9yIGluIGNvbWJpbmF0aW9uLCBvbmUgb3IgbW9yZSBvZiB0aGUgZW5hYmxlcyBvciAKKyAqICAgICAgICAgc2VhcmNoIHJhbmdlcyBpbiB0aGUgc3RydWN0dXJlICpwTUVQYXJhbXMgd2VyZSBjb25maWd1cmVkIHN1Y2ggCisgKiAgICAgICAgIHRoYXQgdGhlIHJlcXVlc3RlZCBiZWhhdmlvciBmYWlscyB0byBjb21wbHkgd2l0aCBbSVNPMTQ0OTYtMTBdLiAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01FSW5pdCAoCisgICAgT01YVkNNNFAxME1FTW9kZSBNRW1vZGUsCisgICAgY29uc3QgT01YVkNNNFAxME1FUGFyYW1zICpwTUVQYXJhbXMsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSW50ZWdlciAgICg2LjMuNS4yLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBpbnRlZ2VyIGJsb2NrIG1hdGNoLiAgUmV0dXJucyBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjdXJyZW50IGJsb2NrOgorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogCisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIGludGVnZXIgcGl4ZWxzOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgaUJsb2NrV2lkdGguIAorICogICBuU3JjUmVmU3RlcCAtIFN0cmlkZSBvZiB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgcGxhbmUsIGV4cHJlc3NlZCBpbiB0ZXJtcyAKKyAqICAgICAgICAgICAgb2YgaW50ZWdlciBwaXhlbHMgCisgKiAgIHBSZWZSZWN0IC0gcG9pbnRlciB0byB0aGUgdmFsaWQgcmVmZXJlbmNlIHJlY3RhbmdsZSBpbnNpZGUgdGhlIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZSBwbGFuZSAKKyAqICAgbkN1cnJQb2ludFBvcyAtIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lIAorICogICBpQmxvY2tXaWR0aCAtIFdpZHRoIG9mIHRoZSBjdXJyZW50IGJsb2NrLCBleHByZXNzZWQgaW4gdGVybXMgb2YgaW50ZWdlciAKKyAqICAgICAgICAgICAgcGl4ZWxzOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jaywgZXhwcmVzc2VkIGluIHRlcm1zIG9mIAorICogICAgICAgICAgICBpbnRlZ2VyIHBpeGVsczsgbXVzdCBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3I7IHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNVjsgdXNlZCB0byBjb21wdXRlIG1vdGlvbiBjb3N0LCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBNVkNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBNVjsgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb3Rpb24gc2VhcmNoLCAKKyAqICAgICAgICAgICAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGludGVnZXIgcGl4ZWxzIAorICogICBwTUVTcGVjIC0gcG9pbnRlciB0byB0aGUgTUUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RCZXN0TVYgLSBCZXN0IE1WIHJlc3VsdGluZyBmcm9tIGludGVnZXIgc2VhcmNoLCBleHByZXNzZWQgaW4gdGVybXMgCisgKiAgICAgICAgICAgIG9mIDEvNC1wZWwgdW5pdHMgCisgKiAgIHBCZXN0Q29zdCAtIE1vdGlvbiBjb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYmVzdCBNVjsgY29tcHV0ZWQgYXMgCisgKiAgICAgICAgICAgIFNBRCtMYW1kYSpCaXRzVXNlZEJ5TVYgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIE5VTEw6CisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFJlZlJlY3QsIHBNVlByZWQsIHBNVkNhbmRpZGF0ZSwgb3IgcE1FU3BlYy4gCisgKiAgICAtICAgIEVpdGhlciBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9JbnRlZ2VyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1U4IGlCbG9ja1dpZHRoLAorICAgIE9NWF9VOCBpQmxvY2tIZWlnaHQsCisgICAgT01YX1UzMiBuTGFtZGEsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVlByZWQsCisgICAgY29uc3QgT01YVkNNb3Rpb25WZWN0b3IgKnBNVkNhbmRpZGF0ZSwKKyAgICBPTVhWQ01vdGlvblZlY3RvciAqcEJlc3RNViwKKyAgICBPTVhfUzMyICpwQmVzdENvc3QsCisgICAgdm9pZCAqcE1FU3BlYworKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfSGFsZiAgICg2LjMuNS4yLjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIGhhbGYtcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLiAKKyAqICBSZXR1cm5zIHRoZSBiZXN0IE1WIGFuZCBhc3NvY2lhdGVkIGNvc3QuICBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgCisgKiBoYWxmLXBpeGVsIG1vdGlvbiB2ZWN0b3IgYnkgaW50ZXJwb2xhdGluZyB0aGUgaW50ZWdlciByZXNvbHV0aW9uIG1vdGlvbiAKKyAqIHZlY3RvciByZWZlcmVuY2VkIGJ5IHRoZSBpbnB1dCBwYXJhbWV0ZXIgcFNyY0RzdEJlc3RNViwgaS5lLiwgdGhlIGluaXRpYWwgCisgKiBpbnRlZ2VyIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0ludGVnZXIgbWF5IGJlIHVzZWQgZm9yIGludGVnZXIgbW90aW9uIGVzdGltYXRpb24uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmdZIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOgorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcFNyY1JlZlkgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIGNvLWxvY2F0ZWQgYmxvY2sgaW4gdGhlIAorICogICAgICAgICAgICByZWZlcmVuY2UgcGljdHVyZTogIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBuU3JjT3JnU3RlcCAtIFN0cmlkZSBvZiB0aGUgb3JpZ2luYWwgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiBpQmxvY2tXaWR0aC4gCisgKiAgIG5TcmNSZWZTdGVwIC0gU3RyaWRlIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHMgCisgKiAgIGlCbG9ja1dpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2sgaW4gdGVybXMgb2YgZnVsbCBwaXhlbHM7IG11c3QgCisgKiAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgIGlCbG9ja0hlaWdodCAtIEhlaWdodCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgbkxhbWRhIC0gTGFtZGEgZmFjdG9yLCB1c2VkIHRvIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBNVlByZWQgLSBQcmVkaWN0ZWQgTVYsIHJlcHJlc2VudGVkIGluIHRlcm1zIG9mIDEvNC1wZWwgdW5pdHM7IHVzZWQgdG8gCisgKiAgICAgICAgICAgIGNvbXB1dGUgbW90aW9uIGNvc3QgCisgKiAgIHBTcmNEc3RCZXN0TVYgLSBUaGUgYmVzdCBNViByZXN1bHRpbmcgZnJvbSBhIHByaW9yIGludGVnZXIgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIGhhbGYtcGVsIHNlYXJjaCwgZXhwcmVzc2VkIGluIAorICogICAgICAgICAgICB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNPcmdZLCBwU3JjUmVmWSwgCisgKiAgICAgICAgICAgICAgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9IYWxmICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0Jsb2NrTWF0Y2hfUXVhcnRlciAgICg2LjMuNS4yLjMpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBhIHF1YXJ0ZXItcGVsIGJsb2NrIG1hdGNoIHVzaW5nIHJlc3VsdHMgZnJvbSBhIHByaW9yIGhhbGYtcGVsIAorICogc2VhcmNoLiAgUmV0dXJucyB0aGUgYmVzdCBNViBhbmQgYXNzb2NpYXRlZCBjb3N0LiAgVGhpcyBmdW5jdGlvbiBlc3RpbWF0ZXMgCisgKiB0aGUgcXVhcnRlci1waXhlbCBtb3Rpb24gdmVjdG9yIGJ5IGludGVycG9sYXRpbmcgdGhlIGhhbGYtcGVsIHJlc29sdXRpb24gCisgKiBtb3Rpb24gdmVjdG9yIHJlZmVyZW5jZWQgYnkgdGhlIGlucHV0IHBhcmFtZXRlciBwU3JjRHN0QmVzdE1WLCBpLmUuLCB0aGUgCisgKiBpbml0aWFsIGhhbGYtcGVsIE1WIGlzIGdlbmVyYXRlZCBleHRlcm5hbGx5LiAgVGhlIGZ1bmN0aW9uIAorICogb214VkNNNFAxMF9CbG9ja01hdGNoX0hhbGYgbWF5IGJlIHVzZWQgZm9yIGhhbGYtcGVsIG1vdGlvbiBlc3RpbWF0aW9uLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnWSAtIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gb3JpZ2luYWwgcGljdHVyZSBwbGFuZToKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTgsICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNSZWZZIC0gUG9pbnRlciB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBjby1sb2NhdGVkIGJsb2NrIGluIHRoZSAKKyAqICAgICAgICAgICAgcmVmZXJlbmNlIHBpY3R1cmU6CisgKiAgICAgICAgICAgIElmIGlCbG9ja1dpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gIAorICogICAgICAgICAgICBJZiBpQmxvY2tXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuICAKKyAqICAgICAgICAgICAgSWYgaUJsb2NrV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIG5TcmNPcmdTdGVwIC0gU3RyaWRlIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGlCbG9ja1dpZHRoLiAKKyAqICAgblNyY1JlZlN0ZXAgLSBTdHJpZGUgb2YgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVscyAKKyAqICAgaUJsb2NrV2lkdGggLSBXaWR0aCBvZiB0aGUgY3VycmVudCBibG9jayBpbiB0ZXJtcyBvZiBmdWxsIHBpeGVsczsgbXVzdCAKKyAqICAgICAgICAgICAgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2LiAKKyAqICAgaUJsb2NrSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrIGluIHRlcm1zIG9mIGZ1bGwgcGl4ZWxzOyBtdXN0IAorICogICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICogICBuTGFtZGEgLSBMYW1kYSBmYWN0b3IsIHVzZWQgdG8gY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcE1WUHJlZCAtIFByZWRpY3RlZCBNViwgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80LXBlbCB1bml0czsgdXNlZCB0byAKKyAqICAgICAgICAgICAgY29tcHV0ZSBtb3Rpb24gY29zdCAKKyAqICAgcFNyY0RzdEJlc3RNViAtIFRoZSBiZXN0IE1WIHJlc3VsdGluZyBmcm9tIGEgcHJpb3IgaGFsZi1wZWwgc2VhcmNoLCAKKyAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGVybXMgb2YgMS80IHBlbCB1bml0cyAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdEJlc3RNViAtIEJlc3QgTVYgcmVzdWx0aW5nIGZyb20gdGhlIHF1YXJ0ZXItcGVsIHNlYXJjaCwgZXhwcmVzc2VkIAorICogICAgICAgICAgICBpbiB0ZXJtcyBvZiAxLzQtcGVsIHVuaXRzIAorICogICBwQmVzdENvc3QgLSBNb3Rpb24gY29zdCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlc3QgTVY7IGNvbXB1dGVkIGFzIAorICogICAgICAgICAgICBTQUQrTGFtZGEqQml0c1VzZWRCeU1WIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgIHBTcmNPcmdZLCBwU3JjUmVmWSwgcFNyY0RzdEJlc3RNViwgcE1WUHJlZCwgcEJlc3RDb3N0IAorICogICAgLSAgICBpQmxvY2tXaWR0aCBvciBpQmxvY2tIZWlnaHQgYXJlIGVxdWFsIHRvIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2LiAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfQmxvY2tNYXRjaF9RdWFydGVyICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNPcmdZLAorICAgIE9NWF9TMzIgblNyY09yZ1N0ZXAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmWSwKKyAgICBPTVhfUzMyIG5TcmNSZWZTdGVwLAorICAgIE9NWF9VOCBpQmxvY2tXaWR0aCwKKyAgICBPTVhfVTggaUJsb2NrSGVpZ2h0LAorICAgIE9NWF9VMzIgbkxhbWRhLAorICAgIGNvbnN0IE9NWFZDTW90aW9uVmVjdG9yICpwTVZQcmVkLAorICAgIE9NWFZDTW90aW9uVmVjdG9yICpwU3JjRHN0QmVzdE1WLAorICAgIE9NWF9TMzIgKnBCZXN0Q29zdAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAgICg2LjMuNS4zLjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBNQi1sZXZlbCBtb3Rpb24gZXN0aW1hdGlvbiBhbmQgc2VsZWN0cyBiZXN0IG1vdGlvbiBlc3RpbWF0aW9uIAorICogc3RyYXRlZ3kgZnJvbSB0aGUgc2V0IG9mIG1vZGVzIHN1cHBvcnRlZCBpbiBiYXNlbGluZSBwcm9maWxlIFtJU08xNDQ5Ni0xMF0uIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNDdXJyQnVmIC0gUG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lOyAKKyAqICAgICAgICAgICAgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQgCisgKiAgIHBTcmNSZWZCdWZMaXN0IC0gUG9pbnRlciB0byBhbiBhcnJheSB3aXRoIDE2IGVudHJpZXMuICBFYWNoIGVudHJ5IHBvaW50cyAKKyAqICAgICAgICAgICAgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiBhIHJlZmVyZW5jZSAKKyAqICAgICAgICAgICAgcGljdHVyZS4gIFRoZSBhcnJheSBpcyBmaWxsZWQgZnJvbSBsb3ctdG8taGlnaCB3aXRoIHZhbGlkIAorICogICAgICAgICAgICByZWZlcmVuY2UgZnJhbWUgcG9pbnRlcnM7IHRoZSB1bnVzZWQgaGlnaCBlbnRyaWVzIHNob3VsZCBiZSBzZXQgCisgKiAgICAgICAgICAgIHRvIE5VTEwuICBPcmRlcmluZyBvZiB0aGUgcmVmZXJlbmNlIGZyYW1lcyBzaG91bGQgZm9sbG93IAorICogICAgICAgICAgICBbSVNPMTQ0OTYtMTBdIHN1YmNsYXVzZSA4LjIuNCAgRGVjb2RpbmcgUHJvY2VzcyBmb3IgUmVmZXJlbmNlIAorICogICAgICAgICAgICBQaWN0dXJlIExpc3RzLiAgIFRoZSBlbnRyaWVzIG11c3QgYmUgMTYtYnl0ZSBhbGlnbmVkLiAKKyAqICAgcFNyY1JlY0J1ZiAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY28tbG9jYXRlZCBNQiBpbiB0aGUgCisgKiAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgcGljdHVyZTsgbXVzdCBiZSAxNi1ieXRlIGFsaWduZWQuIAorICogICBTcmNDdXJyU3RlcCAtIFdpZHRoIG9mIHRoZSBvcmlnaW5hbCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgU3JjUmVmU3RlcCAtIFdpZHRoIG9mIHRoZSByZWZlcmVuY2UgcGljdHVyZSBwbGFuZSBpbiB0ZXJtcyBvZiBmdWxsIAorICogICAgICAgICAgICBwaXhlbHM7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4gCisgKiAgIFNyY1JlY1N0ZXAgLSBXaWR0aCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBwaWN0dXJlIHBsYW5lIGluIHRlcm1zIG9mIGZ1bGwgCisgKiAgICAgICAgICAgIHBpeGVsczsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LiAKKyAqICAgcFJlZlJlY3QgLSBQb2ludGVyIHRvIHRoZSB2YWxpZCByZWZlcmVuY2UgcmVjdGFuZ2xlOyByZWxhdGl2ZSB0byB0aGUgCisgKiAgICAgICAgICAgIGltYWdlIG9yaWdpbi4gCisgKiAgIHBDdXJyUG9pbnRQb3MgLSBQb3NpdGlvbiBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBjdXJyZW50IHBsYW5lLiAKKyAqICAgTGFtYmRhIC0gTGFncmFuZ2UgZmFjdG9yIGZvciBjb21wdXRpbmcgdGhlIGNvc3QgZnVuY3Rpb24gCisgKiAgIHBNRVNwZWMgLSBQb2ludGVyIHRvIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZTsgbXVzdCAKKyAqICAgICAgICAgICAgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gY2FsbGluZyB0aGlzIAorICogICAgICAgICAgICBmdW5jdGlvbi4gCisgKiAgIHBNQkludGVyIC0gQXJyYXksIG9mIGRpbWVuc2lvbiBmb3VyLCBjb250YWluaW5nIHBvaW50ZXJzIHRvIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZm91ciBhZGphY2VudCB0eXBlIElOVEVSIE1CcyAoTGVmdCwgVG9wLCAKKyAqICAgICAgICAgICAgVG9wLUxlZnQsIFRvcC1SaWdodCkuIEFueSBwb2ludGVyIGluIHRoZSBhcnJheSBtYXkgYmUgc2V0IGVxdWFsIAorICogICAgICAgICAgICB0byBOVUxMIGlmIHRoZSBjb3JyZXNwb25kaW5nIE1CIGRvZXNuIHQgZXhpc3Qgb3IgaXMgbm90IG9mIHR5cGUgCisgKiAgICAgICAgICAgIElOVEVSLiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbMF0gLSBQb2ludGVyIHRvIGxlZnQgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzFdIC0gUG9pbnRlciB0byB0b3AgTUIgaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIC0gIHBNQkludGVyWzJdIC0gUG9pbnRlciB0byB0b3AtbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50ZXJbM10gLSBQb2ludGVyIHRvIHRvcC1yaWdodCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgcE1CSW50cmEgLSBBcnJheSwgb2YgZGltZW5zaW9uIGZvdXIsIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gaW5mb3JtYXRpb24gCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBmb3VyIGFkamFjZW50IHR5cGUgSU5UUkEgTUJzIChMZWZ0LCBUb3AsIAorICogICAgICAgICAgICBUb3AtTGVmdCwgVG9wLVJpZ2h0KS4gQW55IHBvaW50ZXIgaW4gdGhlIGFycmF5IG1heSBiZSBzZXQgZXF1YWwgCisgKiAgICAgICAgICAgIHRvIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgTUIgZG9lc24gdCBleGlzdCBvciBpcyBub3Qgb2YgdHlwZSAKKyAqICAgICAgICAgICAgSU5UUkEuIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVswXSAtIFBvaW50ZXIgdG8gbGVmdCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMV0gLSBQb2ludGVyIHRvIHRvcCBNQiBpbmZvcm1hdGlvbiAKKyAqICAgICAgICAgICAgLSAgcE1CSW50cmFbMl0gLSBQb2ludGVyIHRvIHRvcC1sZWZ0IE1CIGluZm9ybWF0aW9uIAorICogICAgICAgICAgICAtICBwTUJJbnRyYVszXSAtIFBvaW50ZXIgdG8gdG9wLXJpZ2h0IE1CIGluZm9ybWF0aW9uIAorICogICBwU3JjRHN0TUJDdXJyIC0gUG9pbnRlciB0byBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IE1CLiAgCisgKiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZW50cmllcyBzaG91bGQgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhlIAorICogICAgICAgICAgICBmdW5jdGlvbjogIHNsaWNlSUQgLSB0aGUgbnVtYmVyIG9mIHRoZSBzbGljZSB0aGUgdG8gd2hpY2ggdGhlIAorICogICAgICAgICAgICBjdXJyZW50IE1CIGJlbG9uZ3MuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0Q29zdCAtIFBvaW50ZXIgdG8gdGhlIG1pbmltdW0gbW90aW9uIGNvc3QgZm9yIHRoZSBjdXJyZW50IE1CLiAKKyAqICAgcERzdEJsb2NrU0FEIC0gUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgU0FEcyBmb3IgZWFjaCBvZiB0aGUgc2l4dGVlbiBsdW1hIAorICogICAgICAgICAgICA0eDQgYmxvY2tzIGluIGVhY2ggTUIuICBUaGUgYmxvY2sgU0FEcyBhcmUgaW4gc2NhbiBvcmRlciBmb3IgCisgKiAgICAgICAgICAgIGVhY2ggTUIuICBGb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgY2Fubm90IGNvbXB1dGUgdGhlIFNBRCB2YWx1ZXMgCisgKiAgICAgICAgICAgIGluZGl2aWR1YWxseSwgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgKDB4ZmZmZikgaXMgcmV0dXJuZWQgCisgKiAgICAgICAgICAgIGZvciBlYWNoIG9mIHRoZSAxNiBibG9jayBTQUQgZW50cmllcy4gCisgKiAgIHBTcmNEc3RNQkN1cnIgLSBQb2ludGVyIHRvIHVwZGF0ZWQgaW5mb3JtYXRpb24gc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCAKKyAqICAgICAgICAgICAgTUIgYWZ0ZXIgTUItbGV2ZWwgbW90aW9uIGVzdGltYXRpb24gaGFzIGJlZW4gY29tcGxldGVkLiAgVGhlIAorICogICAgICAgICAgICBmb2xsb3dpbmcgZmllbGRzIGFyZSB1cGRhdGVkIGJ5IHRoZSBNRSBmdW5jdGlvbi4gICBUaGUgZm9sbG93aW5nIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHF1YW50aWZpZXMgdGhlIE1CLWxldmVsIE1FIHNlYXJjaCByZXN1bHRzOiAKKyAqICAgICAgICAgICAgLSAgTWJUeXBlIAorICogICAgICAgICAgICAtICBzdWJNQlR5cGVbNF0gCisgKiAgICAgICAgICAgIC0gIHBNVjBbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBNVlByZWRbNF1bNF0gCisgKiAgICAgICAgICAgIC0gIHBSZWZMMElkeFs0XSAKKyAqICAgICAgICAgICAgLSAgSW50cmExNngxNlByZWRNb2RlIAorICogICAgICAgICAgICAtICBwSW50cmE0eDRQcmVkTW9kZVs0XVs0XSAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICBPTVhfU3RzX05vRXJyLCBpZiB0aGUgZnVuY3Rpb24gcnVucyB3aXRob3V0IGVycm9yLgorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOiBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBvY2N1cnM6IAorICogICAgLSAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyY0N1cnJCdWYsIAorICogICAgICAgICAgIHBTcmNSZWZCdWZMaXN0LCBwU3JjUmVjQnVmLCBwUmVmUmVjdCwgcEN1cnJQb2ludFBvcywgcE1FU3BlYywgCisgKiAgICAgICAgICAgcE1CSW50ZXIsIHBNQkludHJhLHBTcmNEc3RNQkN1cnIsIHBEc3RDb3N0LCBwU3JjUmVmQnVmTGlzdFswXSAKKyAqICAgIC0gICAgU3JjUmVmU3RlcCwgU3JjUmVjU3RlcCBhcmUgbm90IG11bHRpcGxlcyBvZiAxNiAKKyAqICAgIC0gICAgaUJsb2NrV2lkdGggb3IgaUJsb2NrSGVpZ2h0IGFyZSB2YWx1ZXMgb3RoZXIgdGhhbiA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX01vdGlvbkVzdGltYXRpb25NQiAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjQ3VyckJ1ZiwKKyAgICBPTVhfUzMyIFNyY0N1cnJTdGVwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZkJ1Zkxpc3RbMTVdLAorICAgIE9NWF9TMzIgU3JjUmVmU3RlcCwKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWNCdWYsCisgICAgT01YX1MzMiBTcmNSZWNTdGVwLAorICAgIGNvbnN0IE9NWFJlY3QgKnBSZWZSZWN0LAorICAgIGNvbnN0IE9NWFZDTTRQMkNvb3JkaW5hdGUgKnBDdXJyUG9pbnRQb3MsCisgICAgT01YX1UzMiBMYW1iZGEsCisgICAgdm9pZCAqcE1FU3BlYywKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRlciwKKyAgICBjb25zdCBPTVhWQ000UDEwTUJJbmZvUHRyICpwTUJJbnRyYSwKKyAgICBPTVhWQ000UDEwTUJJbmZvUHRyIHBTcmNEc3RNQkN1cnIsCisgICAgT01YX0lOVCAqcERzdENvc3QsCisgICAgT01YX1UxNiAqcERzdEJsb2NrU0FECispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEXzR4ICAgKDYuMy41LjQuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGZvciA0eDggYW5kIDR4NCBibG9ja3MuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLVBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgaVN0ZXBPcmcgLVN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQuIAorICogICBwU3JjUmVmIC1Qb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgCisgKiAgIGlTdGVwUmVmIC1TdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyIAorICogICBpSGVpZ2h0IC1IZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgT25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDQgb3IgOC4gCisgKiAgICAtICAgIGlTdGVwT3JnIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRF80eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1MzMiAqcERzdFNBRCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TQURRdWFyXzR4ICAgKDYuMy41LjQuMikKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FEIGJldHdlZW4gb25lIGJsb2NrIChwU3JjKSBhbmQgdGhlIGF2ZXJhZ2UgCisgKiBvZiB0aGUgb3RoZXIgdHdvIChwU3JjUmVmMCBhbmQgcFNyY1JlZjEpIGZvciA0eDggb3IgNHg0IGJsb2Nrcy4gIFJvdW5kaW5nIAorICogaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYSA0LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4gCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDguIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIEFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1NBRFF1YXJfNHggKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyYywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNSZWYwLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjEsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMCwKKyAgICBPTVhfVTMyIGlSZWZTdGVwMSwKKyAgICBPTVhfVTMyICpwRHN0U0FELAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1NBRFF1YXJfOHggICAoNi4zLjUuNC4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDh4MTYsIDh4OCwgb3IgOHg0IGJsb2Nrcy4gIAorICogUm91bmRpbmcgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZlbnRpb24gKGErYisxKT4+MS4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrOyBtdXN0IGJlIGFsaWduZWQgb24gYW4gOC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeS4gCisgKiAgIHBTcmNSZWYwIC0gUG9pbnRlciB0byByZWZlcmVuY2UgYmxvY2sgMCAKKyAqICAgcFNyY1JlZjEgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIG9yaWdpbmFsIGJsb2NrIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguIAorICogICBpUmVmU3RlcDAgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAwIAorICogICBpUmVmU3RlcDEgLSBTdGVwIG9mIHJlZmVyZW5jZSBibG9jayAxIAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBibG9jazsgbXVzdCBiZSBlcXVhbCBlaXRoZXIgNCwgOCwgb3IgMTYuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC0gUG9pbnRlciBvZiByZXN1bHQgU0FEIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIE9NWF9TdHNfTm9FcnIsIGlmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IuCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM6IGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VyczogCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4gCisgKiAgICAtICAgIE9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYywgcFNyY1JlZjAsIAorICogICAgICAgICAgICAgIHBTcmNSZWYxLCBwRHN0U0FELiAKKyAqICAgIC0gICAgaVNyY1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgOCAKKyAqICAgIC0gICAgQW55IGFsaWdubWVudCByZXN0cmljdGlvbnMgYXJlIHZpb2xhdGVkIAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU0FEUXVhcl84eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FEUXVhcl8xNnggICAoNi4zLjUuNC40KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBTQUQgYmV0d2VlbiBvbmUgYmxvY2sgKHBTcmMpIGFuZCB0aGUgYXZlcmFnZSAKKyAqIG9mIHRoZSBvdGhlciB0d28gKHBTcmNSZWYwIGFuZCBwU3JjUmVmMSkgZm9yIDE2eDE2IG9yIDE2eDggYmxvY2tzLiAgCisgKiBSb3VuZGluZyBpcyBhcHBsaWVkIGFjY29yZGluZyB0byB0aGUgY29udmVudGlvbiAoYStiKzEpPj4xLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgCisgKiAgICAgICAgICAgIGJvdW5kYXJ5LiAKKyAqICAgcFNyY1JlZjAgLSBQb2ludGVyIHRvIHJlZmVyZW5jZSBibG9jayAwIAorICogICBwU3JjUmVmMSAtIFBvaW50ZXIgdG8gcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlTcmNTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYgCisgKiAgIGlSZWZTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIGlSZWZTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDEgCisgKiAgIGlIZWlnaHQgLSBIZWlnaHQgb2YgdGhlIGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA4IG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0U0FEIC1Qb2ludGVyIG9mIHJlc3VsdCBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgT01YX1N0c19Ob0VyciwgaWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvci4KKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czogaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgb2NjdXJzOiAKKyAqICAgIC0gICAgaUhlaWdodCBpcyBub3QgZXF1YWwgdG8gZWl0aGVyIDggb3IgMTYuIAorICogICAgLSAgICBPbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMsIHBTcmNSZWYwLCAKKyAqICAgICAgICAgICAgICBwU3JjUmVmMSwgcERzdFNBRC4gCisgKiAgICAtICAgIGlTcmNTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2IAorICogICAgLSAgICBBbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBhcmUgdmlvbGF0ZWQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQURRdWFyXzE2eCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY1JlZjAsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmMSwKKyAgICBPTVhfVTMyIGlTcmNTdGVwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAwLAorICAgIE9NWF9VMzIgaVJlZlN0ZXAxLAorICAgIE9NWF9VMzIgKnBEc3RTQUQsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfU0FURF80eDQgICAoNi4zLjUuNC41KQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdW0gb2YgYWJzb2x1dGUgdHJhbnNmb3JtIGRpZmZlcmVuY2VzIChTQVREKSAKKyAqIGZvciBhIDR4NCBibG9jayBieSBhcHBseWluZyBhIEhhZGFtYXJkIHRyYW5zZm9ybSB0byB0aGUgZGlmZmVyZW5jZSBibG9jayAKKyAqIGFuZCB0aGVuIGNhbGN1bGF0aW5nIHRoZSBzdW0gb2YgYWJzb2x1dGUgY29lZmZpY2llbnQgdmFsdWVzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjT3JnIC0gUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtYnl0ZSAKKyAqICAgICAgICAgICAgYm91bmRhcnkgCisgKiAgIGlTdGVwT3JnIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgcFNyY1JlZiAtIFBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIAorICogICAgICAgICAgICBib3VuZGFyeSAKKyAqICAgaVN0ZXBSZWYgLSBTdGVwIG9mIHRoZSByZWZlcmVuY2UgYmxvY2sgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFNBRCAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBTQUQgCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgcFNyY09yZywgcFNyY1JlZiwgb3IgcERzdFNBRCBlaXRoZXIgcFNyY09yZyAKKyAqICAgIC0gICAgcFNyY1JlZiBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVN0ZXBPcmcgPD0gMCBvciBpU3RlcE9yZyBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpU3RlcFJlZiA8PSAwIG9yIGlTdGVwUmVmIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9TQVREXzR4NCAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjT3JnLAorICAgIE9NWF9VMzIgaVN0ZXBPcmcsCisgICAgY29uc3QgT01YX1U4ICpwU3JjUmVmLAorICAgIE9NWF9VMzIgaVN0ZXBSZWYsCisgICAgT01YX1UzMiAqcERzdFNBRAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICAgKDYuMy41LjUuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50ZXJwb2xhdGlvbiBmb3IgdHdvIGhvcml6b250YWwgMS8yLXBlbCBwb3NpdGlvbnMgCisgKiAoLTEvMiwwKSBhbmQgKDEvMiwgMCkgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgYmxvY2sgdXNlZCB0byBpbnRlcnBvbGF0ZSBpbiAKKyAqICAgICAgICAgICAgdGhlIHJlY29uc3RydWN0aW9uIGZyYW1lIHBsYW5lLiAKKyAqICAgaVNyY1N0ZXAgLSBTdGVwIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbihpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIDQsIDgsIG9yIDE2IAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0TGVmdCAtUG9pbnRlciB0byB0aGUgaW50ZXJwb2xhdGlvbiBidWZmZXIgb2YgdGhlIGxlZnQgLXBlbCBwb3NpdGlvbiAKKyAqICAgICAgICAgICAgKC0xLzIsIDApIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09NCwgIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdFJpZ2h0IC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgcmlnaHQgLXBlbCAKKyAqICAgICAgICAgICAgcG9zaXRpb24gKDEvMiwgMCkgCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICAgSWYgaVdpZHRoPT0xNiwgMTYtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgICBwU3JjLCBwRHN0TGVmdCwgb3IgcERzdFJpZ2h0IAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RMZWZ0IGFuZC9vciBwRHN0UmlnaHQgaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0TGVmdCBhbmQvb3IgcERzdFJpZ2h0IGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGFueSBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zIGFyZSB2aW9sYXRlZCAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludGVycG9sYXRlSGFsZkhvcl9MdW1hICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmMsCisgICAgT01YX1UzMiBpU3JjU3RlcCwKKyAgICBPTVhfVTggKnBEc3RMZWZ0LAorICAgIE9NWF9VOCAqcERzdFJpZ2h0LAorICAgIE9NWF9VMzIgaURzdFN0ZXAsCisgICAgT01YX1UzMiBpV2lkdGgsCisgICAgT01YX1UzMiBpSGVpZ2h0CispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVIYWxmVmVyX0x1bWEgICAoNi4zLjUuNS4yKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRlcnBvbGF0aW9uIGZvciB0d28gdmVydGljYWwgMS8yLXBlbCBwb3NpdGlvbnMgLSAKKyAqICgwLCAtMS8yKSBhbmQgKDAsIDEvMikgLSBhcm91bmQgYSBmdWxsLXBlbCBwb3NpdGlvbi4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdG9wLWxlZnQgY29ybmVyIG9mIGJsb2NrIHVzZWQgdG8gaW50ZXJwb2xhdGUgaW4gdGhlIAorICogICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyYW1lIHBsYW5lIAorICogICBpU3JjU3RlcCAtIFN0ZXAgb2YgdGhlIHNvdXJjZSBidWZmZXIuIAorICogICBpRHN0U3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIChpbnRlcnBvbGF0aW9uKSBidWZmZXI7IG11c3QgYmUgYSAKKyAqICAgICAgICAgICAgbXVsdGlwbGUgb2YgaVdpZHRoLiAKKyAqICAgaVdpZHRoIC0gV2lkdGggb2YgdGhlIGN1cnJlbnQgYmxvY2s7IG11c3QgYmUgZXF1YWwgdG8gZWl0aGVyIDQsIDgsIG9yIDE2IAorICogICBpSGVpZ2h0IC0gSGVpZ2h0IG9mIHRoZSBjdXJyZW50IGJsb2NrOyBtdXN0IGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFVwIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBhYm92ZSAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIC0xLzIpIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT00LCA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09OCwgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTE2LCAxNi1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBEc3REb3duIC1Qb2ludGVyIHRvIHRoZSBpbnRlcnBvbGF0aW9uIGJ1ZmZlciBvZiB0aGUgLXBlbCBwb3NpdGlvbiBiZWxvdyAKKyAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24gKDAsIDEvMikgCisgKiAgICAgICAgICAgICAgICBJZiBpV2lkdGg9PTQsIDQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICAgICAgICAgICAgICAgSWYgaVdpZHRoPT04LCA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgICAgICAgICAgICAgIElmIGlXaWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjLCBwRHN0VXAsIG9yIHBEc3REb3duIAorICogICAgLSAgICBpV2lkdGggb3IgaUhlaWdodCBoYXZlIHZhbHVlcyBvdGhlciB0aGFuIDQsIDgsIG9yIDE2IAorICogICAgLSAgICBpV2lkdGg9PTQgYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTggYnV0IHBEc3RVcCBhbmQvb3IgcERzdERvd24gaXMvYXJlIG5vdCBhbGlnbmVkIG9uIGEgOC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpV2lkdGg9PTE2IGJ1dCBwRHN0VXAgYW5kL29yIHBEc3REb3duIGlzL2FyZSBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUhhbGZWZXJfTHVtYSAoCisgICAgY29uc3QgT01YX1U4ICpwU3JjLAorICAgIE9NWF9VMzIgaVNyY1N0ZXAsCisgICAgT01YX1U4ICpwRHN0VXAsCisgICAgT01YX1U4ICpwRHN0RG93biwKKyAgICBPTVhfVTMyIGlEc3RTdGVwLAorICAgIE9NWF9VMzIgaVdpZHRoLAorICAgIE9NWF9VMzIgaUhlaWdodAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0F2ZXJhZ2VfNHggICAoNi4zLjUuNS4zKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBhdmVyYWdlIG9mIHR3byA0eDQsIDR4OCBibG9ja3MuICBUaGUgcmVzdWx0IAorICogaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gKGErYisxKS8yLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwUHJlZDAgLSBQb2ludGVyIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgcmVmZXJlbmNlIGJsb2NrIDAgCisgKiAgIHBQcmVkMSAtIFBvaW50ZXIgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiByZWZlcmVuY2UgYmxvY2sgMSAKKyAqICAgaVByZWRTdGVwMCAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDA7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaVByZWRTdGVwMSAtIFN0ZXAgb2YgcmVmZXJlbmNlIGJsb2NrIDE7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFN0ZXAgLSBTdGVwIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaUhlaWdodCAtIEhlaWdodCBvZiB0aGUgYmxvY2tzOyBtdXN0IGJlIGVpdGhlciA0IG9yIDguIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0UHJlZCAtIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICBwUHJlZDAsIHBQcmVkMSwgb3IgcERzdFByZWQgCisgKiAgICAtICAgIHBEc3RQcmVkIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBpUHJlZFN0ZXAwIDw9IDAgb3IgaVByZWRTdGVwMCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpUHJlZFN0ZXAxIDw9IDAgb3IgaVByZWRTdGVwMSBpcyBub3QgYSBtdWx0aXBsZSBvZiA0IAorICogICAgLSAgICBpRHN0U3RlcCA8PSAwIG9yIGlEc3RTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIGlIZWlnaHQgaXMgbm90IGVxdWFsIHRvIGVpdGhlciA0IG9yIDggCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9BdmVyYWdlXzR4ICgKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMCwKKyAgICBjb25zdCBPTVhfVTggKnBQcmVkMSwKKyAgICBPTVhfVTMyIGlQcmVkU3RlcDAsCisgICAgT01YX1UzMiBpUHJlZFN0ZXAxLAorICAgIE9NWF9VOCAqcERzdFByZWQsCisgICAgT01YX1UzMiBpRHN0U3RlcCwKKyAgICBPTVhfVTMyIGlIZWlnaHQKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9UcmFuc2Zvcm1RdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIDJ4MiBIYWRhbWFyZCB0cmFuc2Zvcm0gb2YgY2hyb21hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgMngyIGFycmF5IG9mIGNocm9tYSBEQyBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlRUCAtIFF1YW50aXphdGlvbiBwYXJhbWV0ZXI7IG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLDUxXS4gCisgKiAgIGJJbnRyYSAtIEluZGljYXRlIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jay4gMS1JTlRSQSwgMC1JTlRFUiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgIHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfVHJhbnNmb3JtUXVhbnRfQ2hyb21hREMgKAorICAgIE9NWF9TMTYgKnBTcmNEc3QsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAgICg2LjMuNS42LjIpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgNHg0IEhhZGFtYXJkIHRyYW5zZm9ybSBvZiBsdW1hIERDIGNvZWZmaWNpZW50cyAKKyAqIGFuZCB0aGVuIHF1YW50aXplcyB0aGUgY29lZmZpY2llbnRzLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjRHN0IC0gUG9pbnRlciB0byB0aGUgNHg0IGFycmF5IG9mIGx1bWEgREMgY29lZmZpY2llbnRzLiAgMTYtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyY0RzdCAtIFBvaW50ZXIgdG8gdHJhbnNmb3JtZWQgYW5kIHF1YW50aXplZCBjb2VmZmljaWVudHMuICAxNi1ieXRlIAorICogICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmNEc3QgCisgKiAgICAtICAgIHBTcmNEc3QgaXMgbm90IGFsaWduZWQgb24gYW4gMTYtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX1RyYW5zZm9ybVF1YW50X0x1bWFEQyAoCisgICAgT01YX1MxNiAqcFNyY0RzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfTHVtYURDICAgKDYuMy41LjYuMykKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSA0eDQgSGFkYW1hcmQgdHJhbnNmb3JtIGFuZCB0aGVuIGRlcXVhbnRpemVzIAorICogdGhlIGNvZWZmaWNpZW50cy4gCisgKgorICogSW5wdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcFNyYyAtIFBvaW50ZXIgdG8gdGhlIDR4NCBhcnJheSBvZiB0aGUgNHg0IEhhZGFtYXJkLXRyYW5zZm9ybWVkIGFuZCAKKyAqICAgICAgICAgICAgcXVhbnRpemVkIGNvZWZmaWNpZW50cy4gIDE2IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IHBTcmMgCisgKiAgICAtICAgIHBTcmMgb3IgcERzdCBpcyBub3QgYWxpZ25lZCBvbiBhIDE2LWJ5dGUgYm91bmRhcnkgCisgKgorICovCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50X0x1bWFEQyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyYywKKyAgICBPTVhfUzE2ICpwRHN0LAorICAgIE9NWF9VMzIgaVFQCispOworCisKKworLyoqCisgKiBGdW5jdGlvbjogIG9teFZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudF9DaHJvbWFEQyAgICg2LjMuNS42LjQpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGludmVyc2UgMngyIEhhZGFtYXJkIHRyYW5zZm9ybSBhbmQgdGhlbiBkZXF1YW50aXplcyAKKyAqIHRoZSBjb2VmZmljaWVudHMuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmMgLSBQb2ludGVyIHRvIHRoZSAyeDIgYXJyYXkgb2YgdGhlIDJ4MiBIYWRhbWFyZC10cmFuc2Zvcm1lZCBhbmQgCisgKiAgICAgICAgICAgIHF1YW50aXplZCBjb2VmZmljaWVudHMuICA4IGJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdCAtIFBvaW50ZXIgdG8gaW52ZXJzZS10cmFuc2Zvcm1lZCBhbmQgZGVxdWFudGl6ZWQgY29lZmZpY2llbnRzLiAgCisgKiAgICAgICAgICAgIDgtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogcFNyYyAKKyAqICAgIC0gICAgcFNyYyBvciBwRHN0IGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRfQ2hyb21hREMgKAorICAgIGNvbnN0IE9NWF9TMTYgKnBTcmMsCisgICAgT01YX1MxNiAqcERzdCwKKyAgICBPTVhfVTMyIGlRUAorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICAgKDYuMy41LjcuMSkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW52ZXJzZSBhbiA0eDQgaW50ZWdlciB0cmFuc2Zvcm1hdGlvbiB0byBwcm9kdWNlIAorICogdGhlIGRpZmZlcmVuY2Ugc2lnbmFsIGFuZCB0aGVuIGFkZHMgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIHByZWRpY3Rpb24gdG8gZ2V0IAorICogdGhlIHJlY29uc3RydWN0ZWQgc2lnbmFsLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjUHJlZCAtIFBvaW50ZXIgdG8gcHJlZGljdGlvbiBzaWduYWwuICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERlcXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIDgtYnl0ZSAKKyAqICAgICAgICAgICAgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBidWZmZXI7IG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0LiAKKyAqICAgaURzdFJlY29uU3RlcCAtIFN0ZXAgb2YgdGhlIGRlc3RpbmF0aW9uIHJlY29uc3RydWN0aW9uIGJ1ZmZlcjsgbXVzdCBiZSBhIAorICogICAgICAgICAgICBtdWx0aXBsZSBvZiA0LiAKKyAqICAgYkFDIC0gSW5kaWNhdGUgd2hldGhlciB0aGVyZSBpcyBBQyBjb2VmZmljaWVudHMgaW4gdGhlIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgbWF0cml4LiAKKyAqCisgKiBPdXRwdXQgQXJndW1lbnRzOgorICogICAKKyAqICAgcERzdFJlY29uIC1Qb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWNvbnN0cnVjdGlvbiBidWZmZXIuICA0LWJ5dGUgCisgKiAgICAgICAgICAgIGFsaWdubWVudCByZXF1aXJlZC4gCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgCisgKiAgICBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IgCisgKiAgICBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIAorICogICAgICAgICAgICAgIGNvbmRpdGlvbnMgYXJlIHRydWU6IAorICogICAgLSAgICBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAKKyAqICAgICAgICAgICAgcFNyY1ByZWQsIHBEZXF1YW50Q29lZmYsIHBEc3RSZWNvbiAKKyAqICAgIC0gICAgcFNyY1ByZWQgaXMgbm90IGFsaWduZWQgb24gYSA0LWJ5dGUgYm91bmRhcnkgCisgKiAgICAtICAgIGlTcmNQcmVkU3RlcCBvciBpRHN0UmVjb25TdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQuIAorICogICAgLSAgICBwRGVxdWFudENvZWZmIGlzIG5vdCBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeSAKKyAqCisgKi8KK09NWFJlc3VsdCBvbXhWQ000UDEwX0ludlRyYW5zZm9ybVJlc2lkdWFsQW5kQWRkICgKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIGNvbnN0IE9NWF9TMTYgKnBEZXF1YW50Q29lZmYsCisgICAgT01YX1U4ICpwRHN0UmVjb24sCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1UzMiBpRHN0UmVjb25TdGVwLAorICAgIE9NWF9VOCBiQUMKKyk7CisKKworCisvKioKKyAqIEZ1bmN0aW9uOiAgb214VkNNNFAxMF9TdWJBbmRUcmFuc2Zvcm1RRFFSZXNpZHVhbCAgICg2LjMuNS44LjEpCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIGZ1bmN0aW9uIHN1YnRyYWN0cyB0aGUgcHJlZGljdGlvbiBzaWduYWwgZnJvbSB0aGUgb3JpZ2luYWwgc2lnbmFsIHRvIAorICogcHJvZHVjZSB0aGUgZGlmZmVyZW5jZSBzaWduYWwgYW5kIHRoZW4gcGVyZm9ybXMgYSA0eDQgaW50ZWdlciB0cmFuc2Zvcm0gYW5kIAorICogcXVhbnRpemF0aW9uLiBUaGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyBhcmUgc3RvcmVkIGFzIAorICogcERzdFF1YW50Q29lZmYuIFRoaXMgZnVuY3Rpb24gY2FuIGFsc28gb3V0cHV0IGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBvciAKKyAqIHVucXVhbnRpemVkIERDIGNvZWZmaWNpZW50cyBvcHRpb25hbGx5IGJ5IHNldHRpbmcgdGhlIHBvaW50ZXJzIAorICogcERzdERlUXVhbnRDb2VmZiwgcERDQ29lZmYuIAorICoKKyAqIElucHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBTcmNPcmcgLSBQb2ludGVyIHRvIG9yaWdpbmFsIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIHBTcmNQcmVkIC0gUG9pbnRlciB0byBwcmVkaWN0aW9uIHNpZ25hbC4gNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZC4gCisgKiAgIGlTcmNPcmdTdGVwIC0gU3RlcCBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsIGJ1ZmZlcjsgbXVzdCBiZSBhIG11bHRpcGxlIG9mIAorICogICAgICAgICAgICA0LiAKKyAqICAgaVNyY1ByZWRTdGVwIC0gU3RlcCBvZiB0aGUgcHJlZGljdGlvbiBzaWduYWwgYnVmZmVyOyBtdXN0IGJlIGEgbXVsdGlwbGUgCisgKiAgICAgICAgICAgIG9mIDQuIAorICogICBwTnVtQ29lZmYgLU51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgYWZ0ZXIgcXVhbnRpemF0aW9uLiBJZiB0aGlzIAorICogICAgICAgICAgICBwYXJhbWV0ZXIgaXMgbm90IHJlcXVpcmVkLCBpdCBpcyBzZXQgdG8gTlVMTC4gCisgKiAgIG5UaHJlc2hTQUQgLSBaZXJvLWJsb2NrIGVhcmx5IGRldGVjdGlvbiB0aHJlc2hvbGQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIAorICogICAgICAgICAgICBub3QgcmVxdWlyZWQsIGl0IGlzIHNldCB0byAwLiAKKyAqICAgaVFQIC0gUXVhbnRpemF0aW9uIHBhcmFtZXRlcjsgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsNTFdLiAKKyAqICAgYkludHJhIC0gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhbiBJTlRSQSBibG9jaywgZWl0aGVyIDEtSU5UUkEgb3IgCisgKiAgICAgICAgICAgIDAtSU5URVIgCisgKgorICogT3V0cHV0IEFyZ3VtZW50czoKKyAqICAgCisgKiAgIHBEc3RRdWFudENvZWZmIC0gUG9pbnRlciB0byB0aGUgcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4gIAorICogICAgICAgICAgICA4LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkLiAKKyAqICAgcERzdERlUXVhbnRDb2VmZiAtIFBvaW50ZXIgdG8gdGhlIGRlcXVhbnRpemVkIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cyAKKyAqICAgICAgICAgICAgaWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVxdWFsIHRvIE5VTEwuICA4LWJ5dGUgYWxpZ25tZW50IAorICogICAgICAgICAgICByZXF1aXJlZC4gCisgKiAgIHBEQ0NvZWZmIC0gUG9pbnRlciB0byB0aGUgdW5xdWFudGl6ZWQgREMgY29lZmZpY2llbnQgaWYgdGhpcyBwYXJhbWV0ZXIgCisgKiAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byBOVUxMLiAKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAKKyAqICAgIE9NWF9TdHNfTm9FcnIgLSBubyBlcnJvciAKKyAqICAgIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgCisgKiAgICAgICAgICAgICAgY29uZGl0aW9ucyBhcmUgdHJ1ZTogCisgKiAgICAtICAgIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6IAorICogICAgICAgICAgICBwU3JjT3JnLCBwU3JjUHJlZCwgcE51bUNvZWZmLCBwRHN0UXVhbnRDb2VmZiwgCisgKiAgICAgICAgICAgIHBEc3REZVF1YW50Q29lZmYsIHBEQ0NvZWZmIAorICogICAgLSAgICBwU3JjT3JnIGlzIG5vdCBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IAorICogICAgLSAgICBwU3JjUHJlZCBpcyBub3QgYWxpZ25lZCBvbiBhIDQtYnl0ZSBib3VuZGFyeSAKKyAqICAgIC0gICAgaVNyY09yZ1N0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgNCAKKyAqICAgIC0gICAgaVNyY1ByZWRTdGVwIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgCisgKiAgICAtICAgIHBEc3RRdWFudENvZWZmIG9yIHBEc3REZVF1YW50Q29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfU3ViQW5kVHJhbnNmb3JtUURRUmVzaWR1YWwgKAorICAgIGNvbnN0IE9NWF9VOCAqcFNyY09yZywKKyAgICBjb25zdCBPTVhfVTggKnBTcmNQcmVkLAorICAgIE9NWF9VMzIgaVNyY09yZ1N0ZXAsCisgICAgT01YX1UzMiBpU3JjUHJlZFN0ZXAsCisgICAgT01YX1MxNiAqcERzdFF1YW50Q29lZmYsCisgICAgT01YX1MxNiAqcERzdERlUXVhbnRDb2VmZiwKKyAgICBPTVhfUzE2ICpwRENDb2VmZiwKKyAgICBPTVhfUzggKnBOdW1Db2VmZiwKKyAgICBPTVhfVTMyIG5UaHJlc2hTQUQsCisgICAgT01YX1UzMiBpUVAsCisgICAgT01YX1U4IGJJbnRyYQorKTsKKworCisKKy8qKgorICogRnVuY3Rpb246ICBvbXhWQ000UDEwX0dldFZMQ0luZm8gICAoNi4zLjUuOS4xKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBydW4tbGVuZ3RoIGVuY29kaW5nIChSTEUpIGluZm9ybWF0aW9uIGZyb20gdGhlIAorICogY29lZmZpY2llbnQgbWF0cml4LiAgVGhlIHJlc3VsdHMgYXJlIHJldHVybmVkIGluIGFuIE9NWFZDTTRQMTBWTENJbmZvIAorICogc3RydWN0dXJlLiAKKyAqCisgKiBJbnB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwU3JjQ29lZmYgLSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnQgbWF0cml4LiAgOC1ieXRlIAorICogICAgICAgICAgICBhbGlnbm1lbnQgcmVxdWlyZWQuIAorICogICBwU2Nhbk1hdHJpeCAtIHBvaW50ZXIgdG8gdGhlIHNjYW4gb3JkZXIgZGVmaW5pdGlvbiBtYXRyaXguICBGb3IgYSBsdW1hIAorICogICAgICAgICAgICBibG9jayB0aGUgc2NhbiBtYXRyaXggc2hvdWxkIGZvbGxvdyBbSVNPMTQ0OTYtMTBdIHNlY3Rpb24gOC41LjQsIAorICogICAgICAgICAgICBhbmQgc2hvdWxkIGNvbnRhaW4gdGhlIHZhbHVlcyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIAorICogICAgICAgICAgICAxMCwgNywgMTEsIDE0LCAxNS4gIEZvciBhIGNocm9tYSBibG9jaywgdGhlIHNjYW4gbWF0cml4IHNob3VsZCAKKyAqICAgICAgICAgICAgY29udGFpbiB0aGUgdmFsdWVzIDAsIDEsIDIsIDMuIAorICogICBiQUMgLSBpbmRpY2F0ZXMgcHJlc2VuY2Ugb2YgYSBEQyBjb2VmZmljaWVudDsgMCA9IERDIGNvZWZmaWNpZW50IAorICogICAgICAgICAgICBwcmVzZW50LCAxPSBEQyBjb2VmZmljaWVudCBhYnNlbnQuIAorICogICBNYXhOdW1Db2VmIC0gc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY29lZmZpY2llbnRzIGNvbnRhaW5lZCBpbiB0aGUgCisgKiAgICAgICAgICAgIHRyYW5zZm9ybSBjb2VmZmljaWVudCBtYXRyaXgsIHBTcmNDb2VmZi4gVGhlIHZhbHVlIHNob3VsZCBiZSAxNiAKKyAqICAgICAgICAgICAgZm9yIGJsb2NrcyBvZiB0eXBlIExVTUFEQywgTFVNQUFDLCBMVU1BTEVWRUwsIGFuZCBDSFJPTUFBQy4gVGhlIAorICogICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgNCBmb3IgYmxvY2tzIG9mIHR5cGUgQ0hST01BREMuIAorICoKKyAqIE91dHB1dCBBcmd1bWVudHM6CisgKiAgIAorICogICBwRHN0VkxDSW5mbyAtIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRoYXQgc3RvcmVzIGluZm9ybWF0aW9uIGZvciAKKyAqICAgICAgICAgICAgcnVuLWxlbmd0aCBjb2RpbmcuIAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgIAorICogICAgT01YX1N0c19Ob0VyciAtIG5vIGVycm9yIAorICogICAgT01YX1N0c19CYWRBcmdFcnIgLSBiYWQgYXJndW1lbnRzOyByZXR1cm5lZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyAKKyAqICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSB0cnVlOiAKKyAqICAgIC0gICAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgTlVMTDogCisgKiAgICAgICAgICAgIHBTcmNDb2VmZiwgcFNjYW5NYXRyaXgsIHBEc3RWTENJbmZvIAorICogICAgLSAgICBwU3JjQ29lZmYgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IAorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfR2V0VkxDSW5mbyAoCisgICAgY29uc3QgT01YX1MxNiAqcFNyY0NvZWZmLAorICAgIGNvbnN0IE9NWF9VOCAqcFNjYW5NYXRyaXgsCisgICAgT01YX1U4IGJBQywKKyAgICBPTVhfVTMyIE1heE51bUNvZWYsCisgICAgT01YVkNNNFAxMFZMQ0luZm8qcERzdFZMQ0luZm8KKyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyoqIGVuZCBvZiAjZGVmaW5lIF9PTVhWQ19IXyAqLworCisvKiogRU9GICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2FwaS9vbXhWQ19zLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODlmMzA0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9hcGkvb214VkNfcy5oCkBAIC0wLDAgKzEsMTI5IEBACis7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOy8vIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsvLworOy8vCis7Ly8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKzsvKiogPT09PT09PT09PT09PT09IFN0cnVjdHVyZSBEZWZpbml0aW9uIGZvciBTYW1wbGUgR2VuZXJhdGlvbiA9PT09PT09PT09PT09PSAqLworOy8qKiB0cmFuc3BhcmVudCBzdGF0dXMgKi8KKworO2VudW0geworT01YX1ZJREVPX1RSQU5TUEFSRU5UCUVRVSAwOwkvKiogV2hvbGx5IHRyYW5zcGFyZW50ICovCitPTVhfVklERU9fUEFSVElBTAkJRVFVIDE7CS8qKiBQYXJ0aWFsbHkgdHJhbnNwYXJlbnQgKi8KK09NWF9WSURFT19PUEFRVUUJCUVRVSAyOwkvKiogT3BhcXVlICovCis7fQorCis7LyoqIGRpcmVjdGlvbiAqLworO2VudW0geworT01YX1ZJREVPX05PTkUJCQlFUVUgMDsKK09NWF9WSURFT19IT1JJWk9OVEFMCUVRVSAxOworT01YX1ZJREVPX1ZFUlRJQ0FMCQlFUVUgMjsKKzt9CisKKzsvKiogYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiB0eXBlICovCis7ZW51bSB7CitPTVhfVklERU9fSU5URUdFUl9QSVhFTCBFUVUgMDsJLyoqIGNhc2UgYSAqLworT01YX1ZJREVPX0hBTEZfUElYRUxfWCAgRVFVIDE7CS8qKiBjYXNlIGIgKi8KK09NWF9WSURFT19IQUxGX1BJWEVMX1kgIEVRVSAyOwkvKiogY2FzZSBjICovCitPTVhfVklERU9fSEFMRl9QSVhFTF9YWSBFUVUgMzsJLyoqIGNhc2UgZCAqLworO30KKworO2VudW0geworT01YX1VQUEVSICAJCQkJRVFVIDE7CQkvKiogc2V0IGlmIHRoZSBhYm92ZSBtYWNyb2Jsb2NrIGlzIGF2YWlsYWJsZSAqLworT01YX0xFRlQgICAJCQkJRVFVIDI7CQkvKiogc2V0IGlmIHRoZSBsZWZ0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfQ0VOVEVSIAkJCQlFUVUgNDsKK09NWF9SSUdIVAkJCQlFUVUgODsKK09NWF9MT1dFUiAgCQkJCUVRVQkxNjsKK09NWF9VUFBFUl9MRUZUICAJCUVRVSAzMjsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLWxlZnQgbWFjcm9ibG9jayBpcyBhdmFpbGFibGUgKi8KK09NWF9VUFBFUl9SSUdIVCAJCUVRVSA2NDsJCS8qKiBzZXQgaWYgdGhlIGFib3ZlLXJpZ2h0IG1hY3JvYmxvY2sgaXMgYXZhaWxhYmxlICovCitPTVhfTE9XRVJfTEVGVCAgCQlFUVUgMTI4OworT01YX0xPV0VSX1JJR0hUIAkJRVFVIDI1NgorO30KKworO2VudW0geworT01YX1ZJREVPX0xVTUlOQU5DRSAgCUVRVSAwOwkvKiogTHVtaW5hbmNlIGNvbXBvbmVudCAqLworT01YX1ZJREVPX0NIUk9NSU5BTkNFICAJRVFVIDE7CS8qKiBjaHJvbWluYW5jZSBjb21wb25lbnQgKi8KK09NWF9WSURFT19BTFBIQSAgCQlFUVUgMjsJLyoqIEFscGhhIGNvbXBvbmVudCAqLworO30KKworO2VudW0geworT01YX1ZJREVPX0lOVEVSCQkJRVFVIDA7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WSURFT19JTlRFUl9RCQlFUVUgMTsJLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSNFYJCUVRVSAyOwkvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVklERU9fSU5UUkEJCQlFUVUgMzsJLyoqIEkgYW5kIFAgcGljdHVyZTsgSS0gYW5kIFAtVk9QICovCitPTVhfVklERU9fSU5UUkFfUQkJRVFVIDQ7CS8qKiBJIGFuZCBQIHBpY3R1cmU7IEktIGFuZCBQLVZPUCAqLworT01YX1ZJREVPX0lOVEVSNFZfUQkJRVFVIDU7CS8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKEguMjYzKSovCitPTVhfVklERU9fRElSRUNUCQlFUVUgNjsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAoTVBFRy00IG9ubHkpICovCitPTVhfVklERU9fSU5URVJQT0xBVEUJRVFVIDc7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19CQUNLV0FSRAkJRVFVIDg7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KK09NWF9WSURFT19GT1JXQVJECQlFUVUgOTsJLyoqIEIgcGljdHVyZSBvciBCLVZPUCAqLworT01YX1ZJREVPX05PVENPREVECQlFUVUgMTA7CS8qKiBCIHBpY3R1cmUgb3IgQi1WT1AgKi8KKzt9CisKKztlbnVtIHsKK09NWF8xNlgxNl9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzE2eDE2X1ZlcnRpY2FsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfMTZYMTZfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhXzE2eDE2X0hvcml6b250YWwgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF8xNlgxNl9EQyAJCQlFUVUgMjsJCS8qKiBJbnRyYV8xNngxNl9EQyAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzE2WDE2X1BMQU5FIAkJRVFVIDM7CS8qKiBJbnRyYV8xNngxNl9QbGFuZSAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO2VudW0geworT01YXzR4NF9WRVJUIAkJCUVRVSAwOwkJLyoqIEludHJhXzR4NF9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YXzR4NF9IT1IgIAkJCUVRVSAxOwkJLyoqIEludHJhXzR4NF9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RDICAgCQkJRVFVIDI7CQkvKiogSW50cmFfNHg0X0RDIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X0RJQUdfREwgCQlFUVUgMzsJLyoqIEludHJhXzR4NF9EaWFnb25hbF9Eb3duX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfRElBR19EUiAJCUVRVSA0OwkvKiogSW50cmFfNHg0X0RpYWdvbmFsX0Rvd25fUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfVlIgCQkJCUVRVSA1OwkJCS8qKiBJbnRyYV80eDRfVmVydGljYWxfUmlnaHQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSEQgCQkJCUVRVSA2OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9Eb3duIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfNHg0X1ZMIAkJCQlFUVUgNzsJCQkvKiogSW50cmFfNHg0X1ZlcnRpY2FsX0xlZnQgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF80eDRfSFUgCQkJCUVRVSA4OwkJCS8qKiBJbnRyYV80eDRfSG9yaXpvbnRhbF9VcCAocHJlZGljdGlvbiBtb2RlKSAqLworO30KKworO2VudW0geworT01YX0NIUk9NQV9EQyAJCQlFUVUgMDsJCS8qKiBJbnRyYV9DaHJvbWFfREMgKHByZWRpY3Rpb24gbW9kZSkgKi8KK09NWF9DSFJPTUFfSE9SIAkJCUVRVSAxOwkJLyoqIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsIChwcmVkaWN0aW9uIG1vZGUpICovCitPTVhfQ0hST01BX1ZFUlQgCQlFUVUgMjsJLyoqIEludHJhX0Nocm9tYV9WZXJ0aWNhbCAocHJlZGljdGlvbiBtb2RlKSAqLworT01YX0NIUk9NQV9QTEFORSAJCUVRVSAzOwkvKiogSW50cmFfQ2hyb21hX1BsYW5lIChwcmVkaWN0aW9uIG1vZGUpICovCis7fQorCis7dHlwZWRlZglzdHJ1Y3QgewkKK3gJRVFVCTA7Cit5CUVRVQk0OworO31PTVhDb29yZGluYXRlOworCis7dHlwZWRlZiBzdHJ1Y3QgeworZHgJRVFVCTA7CitkeQlFUVUJMjsKKzt9T01YTW90aW9uVmVjdG9yOworCis7dHlwZWRlZiBzdHJ1Y3QgeworeHgJCUVRVQkwOworeXkJCUVRVQk0Oword2lkdGgJRVFVCTg7CitoZWlnaHQJRVFVCTEyOworO31PTVhpUmVjdDsKKworO3R5cGVkZWYgZW51bSB7CitPTVhfVkNfSU5URVIgICAgICAgICBFUVUgMDsgICAgICAgIC8qKiBQIHBpY3R1cmUgb3IgUC1WT1AgKi8KK09NWF9WQ19JTlRFUl9RICAgICAgIEVRVSAxOyAgICAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QICovCitPTVhfVkNfSU5URVI0ViAgICAgICBFUVUgMjsgICAgICAgLyoqIFAgcGljdHVyZSBvciBQLVZPUCAqLworT01YX1ZDX0lOVFJBICAgICAgICAgRVFVIDM7ICAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KK09NWF9WQ19JTlRSQV9RICAgICAgIEVRVSA0OyAgICAgICAvKiogSSBhbmQgUCBwaWN0dXJlLCBJLSBhbmQgUC1WT1AgKi8KK09NWF9WQ19JTlRFUjRWX1EgICAgIEVRVSA1OyAgICAvKiogUCBwaWN0dXJlIG9yIFAtVk9QIChILjI2MykqLworO30gT01YVkNNNFAyTWFjcm9ibG9ja1R5cGU7CisKKztlbnVtIHsKK09NWF9WQ19OT05FICAgICAgICAgIEVRVSAwCitPTVhfVkNfSE9SSVpPTlRBTCAgICBFUVUgMQorT01YX1ZDX1ZFUlRJQ0FMICAgICAgRVFVIDIgCis7fTsKKworCisJRU5ECisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTE2eDE2X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTZkNTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5MTZ4MTZfcy5zCkBAIC0wLDAgKzEsOTUgQEAKKyA7LyoqCisgOyAqIEZ1bmN0aW9uOiBvbXhWQ0NPTU1fQ29weTE2eDE2CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSAxNngxNiBibG9jayB0byB0aGUgY3VycmVudCBibG9jay4KKyA7ICogUGFyYW1ldGVyczoKKyA7ICogW2luXSBwU3JjICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgYmxvY2sgaW4gdGhlIHNvdXJjZSBmcmFtZTsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDE2LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiBhbmQgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAxNi4KKyA7ICogW291dF0gcERzdCAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBibG9jazsgbXVzdCBiZSBhbGlnbmVkIG9uIGFuIDgtYnl0ZSBib3VuZGFyeS4KKyA7ICogUmV0dXJuIFZhbHVlOgorIDsgKiBPTVhfU3RzX05vRXJyICAgICAtIG5vIGVycm9yCisgOyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50czsgcmV0dXJuZWQgdW5kZXIgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyA7ICogICAgICAgICAgICAgICAgICAgLSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGlzIE5VTEw6ICBwU3JjLCBwRHN0CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBub3QgYWxpZ25lZCBvbiBhbiAxNi1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDE2IG9yIHN0ZXAgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYuICAKKyA7ICovCisKKyAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAKKyAgICAgCisgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgICAgIElGIENvcnRleEE4CisgICAgIAorICAgICAKKyA7Ly9JbnB1dCBBcmd1bWVudHMKK3BTcmMgICAgUk4gMCAgICAgICAgCitwRHN0ICAgIFJOIDEgICAgICAgIAorc3RlcCAgICBSTiAyCisKKzsvL0xvY2FsIFZhcmlhYmxlcworUmV0dXJuICBSTiAwCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworWDAgICAgICBETiBEMC5TOCAKK1gxICAgICAgRE4gRDEuUzggCitYMiAgICAgIEROIEQyLlM4CitYMyAgICAgIEROIEQzLlM4CitYNCAgICAgIEROIEQ0LlM4CitYNSAgICAgIEROIEQ1LlM4CitYNiAgICAgIEROIEQ2LlM4CitYNyAgICAgIEROIEQ3LlM4IAorIAorICAgICBNX1NUQVJUIG9teFZDQ09NTV9Db3B5MTZ4MTYKKyAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwLFgxfSxbcFNyY0AxMjhdLHN0ZXAgICAgICAgOy8vIExvYWQgMTYgYnl0ZXMgZnJvbSAxNiBieXRlIGFsaWduZWQgcFNyYyBhbmQgcFNyYz1wU3JjICsgc3RlcCBhZnRlciBsb2FkaW5nCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hICAgICA7Ly8gU3RvcmUgMzIgYnl0ZXMgdG8gMTYgYnl0ZSBhbGlnbmVkIHBEc3QgICAKKyAgICAgICAgVlNUMSAge1g0LFg1LFg2LFg3fSxbcERzdEAxMjhdISAgICAgICAgCisgICAgICAgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdIQorICAgICAgICBWU1QxICB7WDQsWDUsWDYsWDd9LFtwRHN0QDEyOF0hCisgICAgICAgICAKKyAgICAgIAorICAgICAgICBWTEQxICB7WDAsWDF9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDIsWDN9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDQsWDV9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICBWTEQxICB7WDYsWDd9LFtwU3JjQDEyOF0sc3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAge1gwLFgxLFgyLFgzfSxbcERzdEAxMjhdISAgICAgICAgICAgICAgCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZMRDEgIHtYMCxYMX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYMixYM30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNCxYNX0sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIFZMRDEgIHtYNixYN30sW3BTcmNAMTI4XSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDEsWDIsWDN9LFtwRHN0QDEyOF0hCisgICAgICAgIFZTVDEgIHtYNCxYNSxYNixYN30sW3BEc3RAMTI4XSEKKworICAgICAgICAKKyAgICAgICAgTU9WICAgUmV0dXJuLCNPTVhfU3RzX05vRXJyCisKKyAgICAgCisgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL2NvbW0vc3JjL29teFZDQ09NTV9Db3B5OHg4X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI5ZTVlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fQ29weTh4OF9zLnMKQEAgLTAsMCArMSw3MCBAQAorIDsvKioKKyA7ICogRnVuY3Rpb246IG9teFZDQ09NTV9Db3B5OHg4CisgOyAqCisgOyAqIERlc2NyaXB0aW9uOgorIDsgKiBDb3BpZXMgdGhlIHJlZmVyZW5jZSA4eDggYmxvY2sgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgOyAqIFBhcmFtZXRlcnM6CisgOyAqIFtpbl0gcFNyYyAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGJsb2NrIGluIHRoZSBzb3VyY2UgZnJhbWU7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFtpbl0gc3RlcCAgICAgICAgIC0gZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnRzIG9mIGNvbnNlY3V0aXZlIGxpbmVzIGluIHRoZSByZWZlcmVuY2UgZnJhbWUsIGluIGJ5dGVzOworIDsgKiAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4IGFuZCBtdXN0IGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIDguCisgOyAqIFtvdXRdIHBEc3QgICAgICAgIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gYmxvY2s7IG11c3QgYmUgYWxpZ25lZCBvbiBhbiA4LWJ5dGUgYm91bmRhcnkuCisgOyAqIFJldHVybiBWYWx1ZToKKyA7ICogT01YX1N0c19Ob0VyciAgICAgLSBubyBlcnJvcgorIDsgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHM7IHJldHVybmVkIHVuZGVyIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgOyAqICAgICAgICAgICAgICAgICAgIC0gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBwb2ludGVycyBpcyBOVUxMOiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgaXMgbm90IGFsaWduZWQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5OiAgcFNyYywgcERzdAorIDsgKiAgICAgICAgICAgICAgICAgICAtIHN0ZXAgPDggb3Igc3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LiAgCisgOyAqLworCisgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgCisgICAgIAorICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgIAorICAgICBJRiBDb3J0ZXhBOAorICAgICAKKyAgICAgCisgOy8vSW5wdXQgQXJndW1lbnRzCitwU3JjICAgIFJOIDAgICAgICAgIAorcERzdCAgICBSTiAxICAgICAgICAKK3N0ZXAgICAgUk4gMgorCis7Ly9Mb2NhbCBWYXJpYWJsZXMKK0NvdW50ICAgUk4gMworUmV0dXJuICBSTiAwCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworWDAgICAgICBETiBEMC5TOCAKK1gxICAgICAgRE4gRDEuUzgKK1gyICAgICAgRE4gRDIuUzgKK1gzICAgICAgRE4gRDMuUzgKKyAgICAgTV9TVEFSVCBvbXhWQ0NPTU1fQ29weTh4OAorICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkxEMSAge1gwfSxbcFNyY10sc3RlcCAgICAgICAgICAgIDsvLyBMb2FkIDggYnl0ZXMgZnJvbSA4IGJ5dGUgYWxpZ25lZCBwU3JjLCBwU3JjPXBTcmMrc3RlcCBhZnRlciBsb2FkCisgICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICA7Ly8gU3RvcmUgMTYgYnl0ZXMgdG8gOCBieXRlIGFsaWduZWQgcERzdCAgCisgICAgICAgIFZTVDEgIHtYMixYM30sW3BEc3RdISAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTEQxICB7WDB9LFtwU3JjXSxzdGVwCisgICAgICAgIFZMRDEgIHtYMX0sW3BTcmNdLHN0ZXAKKyAgICAgICAgVkxEMSAge1gyfSxbcFNyY10sc3RlcAorICAgICAgICBWTEQxICB7WDN9LFtwU3JjXSxzdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICB7WDAsWDF9LFtwRHN0XSEgICAgICAgICAgICAgIAorICAgICAgICBWU1QxICB7WDIsWDN9LFtwRHN0XSEgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgIFJldHVybiwjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorCisKKworICAgICAgICAKKyAgICAgICAgRU5ECisgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9jb21tL3NyYy9vbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjNWI3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvY29tbS9zcmMvb214VkNDT01NX0V4cGFuZEZyYW1lX0lfcy5zCkBAIC0wLDAgKzEsMjM2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ0NPTU1fRXhwYW5kRnJhbWVfSV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVGhpcyBmdW5jdGlvbiB3aWxsIEV4cGFuZCBGcmFtZSBib3VuZGFyeSBwaXhlbHMgaW50byBQbGFuZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCis7Ly8gSW1wb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbSBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgCisgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKworICAgIAorICAgIElGIENvcnRleEE4CisgICAgCisgICAgICAgIE1fU1RBUlQgb214VkNDT01NX0V4cGFuZEZyYW1lX0kscjExCisKKzsvL0lucHV0IHJlZ2lzdGVycworCitwU3JjRHN0UGxhbmUgICAgUk4gIDAKK2lGcmFtZVdpZHRoICAgICBSTiAgMQoraUZyYW1lSGVpZ2h0ICAgIFJOICAyICAgIAoraUV4cGFuZFBlbHMgICAgIFJOICAzCitpUGxhbmVTdGVwICAgICAgUk4gIDQKK3BUb3AgICAgICAgICAgICBSTiAgNQorcEJvdCAgICAgICAgICAgIFJOICA2CitwRHN0VG9wICAgICAgICAgUk4gIDcKK3BEc3RCb3QgICAgICAgICBSTiAgOAorcExlZnQgICAgICAgICAgIFJOICA1CitwUmlnaHQgICAgICAgICAgUk4gIDYKK3BEc3RMZWZ0ICAgICAgICBSTiAgOQorcERzdFJpZ2h0ICAgICAgIFJOICAxMAorT2Zmc2V0ICAgICAgICAgIFJOICAxMQorVGVtcCAgICAgICAgICAgIFJOICAxNAorQ291bnRlciAgICAgICAgIFJOICAxMgorVG1wICAgICAgICAgICAgIFJOICA3Cis7Ly9PdXRwdXQgcmVnaXN0ZXJzCisKK3Jlc3VsdCAgICAgICAgICBSTiAgMAorOy8vIE5lb24gcmVnaXN0ZXJzCitxRGF0YTAgICAgICAgICAgUU4gIDAuVTgKK3FEYXRhMSAgICAgICAgICBRTiAgMS5VOAorZERhdGEwICAgICAgICAgIEROICAwLlU4CitkRGF0YTEgICAgICAgICAgRE4gIDEuVTgKK2REYXRhMiAgICAgICAgICBETiAgMi5VOAorZERhdGEzICAgICAgICAgIEROICAzLlU4CisKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgICAgcFBsYW5lU3RlcCwgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgICAgaVBsYW5lU3RlcCwgcFBsYW5lU3RlcAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFRvcCwgcFNyY0RzdFBsYW5lLCAjMCAgICAgICAgICAgICAgOy8vIFRvcCByb3cgcG9pbnRlciBvZiB0aGUgZnJhbWUKKyAgICAgICAgTVVMICAgICAgICAgT2Zmc2V0LCBpRXhwYW5kUGVscywgaVBsYW5lU3RlcCAgICAgOy8vIEUqU3RlcCAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIFRlbXAsIGlGcmFtZUhlaWdodCwgIzEgICAgICAgICAgICAgIDsvLyBILTEKKyAgICAgICAgTVVMICAgICAgICAgVGVtcCwgaVBsYW5lU3RlcCwgVGVtcCAgICAgICAgICAgICAgOy8vIChILTEpKlN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcEJvdCwgVGVtcCwgcFNyY0RzdFBsYW5lICAgICAgICAgICAgOy8vIEJQdHIgPSBUUHRyICsgKEgtMSkqU3RlcAorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRnJhbWVXaWR0aCAgICAgICAgICAgICAgICAgICA7Ly8gT3V0ZXIgbG9vcCBjb3VudGVyCisgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgaWYgcFNyY0RzdFBsYW5lIGFuZCBpUGxhbmVTdGVwIGFyZSAxNiBieXRlIGFsaWduZWQKKyAgICAgICAgVFNUICAgICAgICAgcFNyY0RzdFBsYW5lLCAjMHhmCisgICAgICAgIFRTVEVRICAgICAgIGlQbGFuZVN0ZXAsICMweGYgICAgICAgIAorICAgICAgICBCTkUgICAgICAgICBIb3I4TG9vcDAwCisgICAgICAgIAorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgdG9wIGFuZCBib3R0b20gcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyB0b3AgcmVnaW9uID0gdG9wIHJvdyBlbGVtZW50cyBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gYm90dG9tIHJlZ2lvbiA9IGxhc3Qgcm93IGVsZW1lbnRzIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworCisgICAgICAgIDsvLyBDYXNlIGZvciAxNiBieXRlIGFsaWdubWVudAorSG9yMTZMb29wMDAKKyAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0CisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDEyOF0hCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzICAgICAgICAgICAgICAgIDsvLyBJbm5lciBsb29wIGNvdW50ZXIKKyAgICAgICAgQUREICAgICAgICAgcERzdEJvdCwgcEJvdCwgaVBsYW5lU3RlcAorICAgICAgICBWTEQxICAgICAgICBxRGF0YTEsIFtwQm90IEAxMjhdIQorVmVyMTZMb29wMAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDEyOF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBAMTI4XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEAxMjhdLCBpUGxhbmVTdGVwICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyMTZMb29wMAorCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxNgorICAgICAgICBCR1QgICAgICAgICBIb3IxNkxvb3AwMAorICAgICAgICBCICAgICAgICAgICBFbmRBbGlnbmVkTG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIENhc2UgZm9yIDggYnl0ZSBhbGlnbm1lbnQKK0hvcjhMb29wMDAKKyAgICAgICAgU1VCICAgICAgICAgcERzdFRvcCwgcFRvcCwgT2Zmc2V0CisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMCwgW3BUb3AgQDY0XSEKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMgICAgICAgICAgICAgICAgOy8vIElubmVyIGxvb3AgY291bnRlcgorICAgICAgICBBREQgICAgICAgICBwRHN0Qm90LCBwQm90LCBpUGxhbmVTdGVwCisgICAgICAgIFZMRDEgICAgICAgIHFEYXRhMSwgW3BCb3QgQDY0XSEKK1ZlcjhMb29wMAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMCwgW3BEc3RUb3AgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTAsIFtwRHN0VG9wIEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGEwLCBbcERzdFRvcCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgcURhdGExLCBbcERzdEJvdCBANjRdLCBpUGxhbmVTdGVwCisgICAgICAgIFZTVDEgICAgICAgIHFEYXRhMSwgW3BEc3RCb3QgQDY0XSwgaVBsYW5lU3RlcAorICAgICAgICBWU1QxICAgICAgICBxRGF0YTEsIFtwRHN0Qm90IEA2NF0sIGlQbGFuZVN0ZXAgICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXI4TG9vcDAKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMTYKKyAgICAgICAgQkdUICAgICAgICAgSG9yOExvb3AwMAorCitFbmRBbGlnbmVkTG9vcAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjRHN0UGxhbmUsIGlGcmFtZVdpZHRoCisgICAgICAgIFNVQiAgICAgICAgIHBEc3RSaWdodCwgVGVtcCwgT2Zmc2V0CisgICAgICAgIFNVQiAgICAgICAgIHBSaWdodCwgVGVtcCwgIzEKKyAgICAgICAgU1VCICAgICAgICAgcERzdExlZnQsIHBTcmNEc3RQbGFuZSwgT2Zmc2V0ICAgIAorICAgICAgICBTVUIgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIGlFeHBhbmRQZWxzICAgIAorICAgICAgICBBREQgICAgICAgICBwTGVmdCwgcFNyY0RzdFBsYW5lLCAjMAorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2REYXRhMCBbXX0sIFtwTGVmdF0sIGlQbGFuZVN0ZXAgICAgICAgIDsvLyBUb3AtTGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSBmcmFtZSBkdXBsaWNhdGVkIGluIGREYXRhMAorICAgICAgICBTVUIgICAgICAgICBPZmZzZXQsIGlQbGFuZVN0ZXAsIGlFeHBhbmRQZWxzCisgICAgICAgIFZMRDEgICAgICAgIHtkRGF0YTEgW119LCBbcFJpZ2h0XSwgaVBsYW5lU3RlcCAgICAgICA7Ly8gVG9wLVJpZ2h0IGNvcm5lciBwaXhlbCBmcm9tIGZyYW1lIGR1cGxpY2F0ZWQgaW4gZERhdGExCisgICAgICAgIE1PViAgICAgICAgIFRlbXAsIGlFeHBhbmRQZWxzCisKKyAgICAgICAgOy8vCisgICAgICAgIDsvLyBDb3B5IHRvcC1sZWZ0IGFuZCB0b3AtcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyB0b3AtbGVmdCByZWdpb24gPSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIHRvcC1yaWdodCByZWdpb24gPSB0b3AtcmlnaHQgY29ybmVyIHBpeGVsIGZyb20gdGhlIGZyYW1lCisgICAgICAgIDsvLworSG9yTG9vcDExCisgICAgICAgIE1PViAgICAgICAgIENvdW50ZXIsIGlFeHBhbmRQZWxzCitWZXJMb29wMQorICAgICAgICBWU1QxICAgICAgICBkRGF0YTAsIFtwRHN0TGVmdF0sICM4CisgICAgICAgIFNVQlMgICAgICAgIENvdW50ZXIsIENvdW50ZXIsICM4CisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMSwgW3BEc3RSaWdodF0sICM4ICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgVmVyTG9vcDEKKworICAgICAgICBTVUJTICAgICAgICBUZW1wLCBUZW1wLCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJQTCAgICAgICAgIEhvckxvb3AxMQorCisgICAgICAgIFNVQiAgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQorICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgbGVmdCBhbmQgcmlnaHQgcmVnaW9uIG9mIHRoZSBwbGFuZSBhcyBmb2xsb3dzCisgICAgICAgIDsvLyBMZWZ0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIGxlZnQgc3RhcnQgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vIFJpZ2h0IHJlZ2lvbiA9IGNvcHkgdGhlIHJvdyB3aXRoIHJpZ2h0IGVuZCBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8KK0hvckxvb3AyMgorICAgICAgICBWTEQxICAgICAgICB7ZERhdGEwIFtdfSwgW3BMZWZ0XSwgaVBsYW5lU3RlcAorICAgICAgICBNT1YgICAgICAgICBDb3VudGVyLCBpRXhwYW5kUGVscworICAgICAgICBWTEQxICAgICAgICB7ZERhdGExIFtdfSwgW3BSaWdodF0sIGlQbGFuZVN0ZXAKK1Zlckxvb3AyCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMgorCisgICAgICAgIFNVQlMgICAgICAgIGlGcmFtZUhlaWdodCwgaUZyYW1lSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgICAgICBwRHN0TGVmdCwgcERzdExlZnQsIE9mZnNldAorICAgICAgICBBREQgICAgICAgICBwRHN0UmlnaHQsIHBEc3RSaWdodCwgT2Zmc2V0CisgICAgICAgIEJHVCAgICAgICAgIEhvckxvb3AyMgorICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBUZW1wLCBpRXhwYW5kUGVscworICAgICAgICA7Ly8KKyAgICAgICAgOy8vIENvcHkgYm90dG9tLWxlZnQgYW5kIGJvdHRvbS1yaWdodCByZWdpb24gb2YgdGhlIHBsYW5lIGFzIGZvbGxvd3MKKyAgICAgICAgOy8vIGJvdHRvbS1sZWZ0IHJlZ2lvbiA9IGJvdHRvbS1sZWZ0IGNvcm5lciBwaXhlbCBmcm9tIHRoZSBmcmFtZQorICAgICAgICA7Ly8gYm90dG9tLXJpZ2h0IHJlZ2lvbiA9IGJvdHRvbS1yaWdodCBjb3JuZXIgcGl4ZWwgZnJvbSB0aGUgZnJhbWUKKyAgICAgICAgOy8vCitIb3JMb29wMzMKKyAgICAgICAgTU9WICAgICAgICAgQ291bnRlciwgaUV4cGFuZFBlbHMKK1Zlckxvb3AzCisgICAgICAgIFZTVDEgICAgICAgIGREYXRhMCwgW3BEc3RMZWZ0XSwgIzgKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnRlciwgQ291bnRlciwgIzgKKyAgICAgICAgVlNUMSAgICAgICAgZERhdGExLCBbcERzdFJpZ2h0XSwgIzggICAgICAgIAorICAgICAgICBCR1QgICAgICAgICBWZXJMb29wMworCisgICAgICAgIFNVQlMgICAgICAgIFRlbXAsIFRlbXAsICMxCisgICAgICAgIEFERCAgICAgICAgIHBEc3RMZWZ0LCBwRHN0TGVmdCwgT2Zmc2V0CisgICAgICAgIEFERCAgICAgICAgIHBEc3RSaWdodCwgcERzdFJpZ2h0LCBPZmZzZXQKKyAgICAgICAgQkdUICAgICAgICAgSG9yTG9vcDMzCitFbmQKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX0VORCAgICAKKyAgICAKKyAgICBFTkRJRgorCisKKworICAgICAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAKKyAgICAgICAgICAgIAorICAgIEVORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL2FwaS9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQ3YTJkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9hcGkvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIAorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIEhlYWRlciBmaWxlIGZvciBvcHRpbWl6ZWQgSC4yNjQgQ0FMVkMgdGFibGVzCisgKiAKKyAqLworIAorI2lmbmRlZiBBUk1WQ000UDEwX0NBVkxDVEFCTEVTX0gKKyNkZWZpbmUgQVJNVkNNNFAxMF9DQVZMQ1RBQkxFU19ICisgIAorLyogQ0FWTEMgdGFibGVzICovCisKK2V4dGVybiBjb25zdCBPTVhfVTE2ICphcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNbM107CitleHRlcm4gY29uc3QgT01YX1UxNiAqYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzR4NFsxNl07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMTBfWmlnWmFnXzJ4Mls0XTsKK2V4dGVybiBjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9BdmVyYWdlXzR4X0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMDg5MmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMjIyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworCis7Ly8gRnVuY3Rpb25zOgorOy8vICAgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduPEFMSUdOTUVOVD5fdW5zYWZlICAKKzsvLworOy8vIEltcGxlbWVudHMgQXZlcmFnZSBvZiA0eDQgd2l0aCBlcXVhdGlvbiBjID0gKGErYisxKT4+MS4KKzsvLyBGaXJzdCBvcGVyYW5kIHdpbGwgYmUgYXQgb2Zmc2V0IEFMSUdOTUVOVCBmcm9tIGFsaWduZWQgYWRkcmVzcworOy8vIFNlY29uZCBvcGVyYW5kIHdpbGwgYmUgYXQgYWxpZ25lZCBsb2NhdGlvbiBhbmQgd2lsbCBiZSB1c2VkIGFzIG91dHB1dC4KKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjIscjMgd2hlcmUgcjIgY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjMgc3RlcCBzaXplCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByNCxyNSxyNixyOCxyOSxyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIyIC0gcG9pbnRlciB0byB0aGUgYWxpZ25lZCBsb2NhdGlvbgorOy8vIHIzIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFByZWQwICAgICAgICAgIFJOIDAKK2lQcmVkU3RlcDAgICAgICBSTiAxCitwUHJlZDEgICAgICAgICAgUk4gMgoraVByZWRTdGVwMSAgICAgIFJOIDMKK3BEc3RQcmVkICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgUk4gMworCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpUHJlZEEwICAgICAgICAgUk4gMTAKK2lQcmVkQTEgICAgICAgICBSTiAxMQoraVByZWRCMCAgICAgICAgIFJOIDEyCitpUHJlZEIxICAgICAgICAgUk4gMTQKK1RlbXAxICAgICAgICAgICBSTiA0CitUZW1wMiAgICAgICAgICAgUk4gNQorUmVzdWx0QSAgICAgICAgIFJOIDUKK1Jlc3VsdEIgICAgICAgICBSTiA0CityMHg4MDgwODA4MCAgICAgUk4gNworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMCBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgOy8vIChhK2IrMSkvMiA9IChhKzI1Ni0oMjU1LWIpKS8yID0gKGEtKDI1NS1iKSkvMiArIDEyOAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMSwgaVByZWRCMQorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwICAgICAgICAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QSwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRCLCBSZXN1bHRCLCByMHg4MDgwODA4MAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRCLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgICAgICAgICAKK0VuZDAKKyAgICAgICAgTV9FTkQKKworICAgICAgICA7Ly8gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIGF2ZXJhZ2Ugb2YgNHg0IGJsb2NrIAorICAgICAgICA7Ly8gcFByZWQwIGlzIGF0IGFsaWdubWVudCBvZmZzZXQgMiBhbmQgcFByZWQxIGlzIGFsaWdubWVudCA0CisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZSwgcjYKKworICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDgwODA4MDgwLCA9MHg4MDgwODA4MAorCisgICAgICAgIDsvLyAxc3QgbG9hZAorICAgICAgICBMRFIgICAgICAgICBUZW1wMSwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTAsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMCwgW3BQcmVkMV0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRCMSwgW3BQcmVkMSwgaVByZWRTdGVwMV0KKyAgICAgICAgTV9MRFIgICAgICAgVGVtcDIsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIFRlbXAxLCBMU0wgIzE2ICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBUZW1wMiwgTFNMICMxNgorCisgICAgICAgIDsvLyAoYStiKzEpLzIgPSAoYSsyNTYtKDI1NS1iKSkvMiA9IChhLSgyNTUtYikpLzIgKyAxMjgKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgICBpUHJlZEExLCBbcFByZWQwXSwgaVByZWRTdGVwMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMxNgorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICMxNiAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjMTYKKworICAgICAgICBVSFNVQjggICAgICBSZXN1bHRBLCBpUHJlZEEwLCBpUHJlZEIwCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEIsIGlQcmVkQTEsIGlQcmVkQjEKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QSwgUmVzdWx0QSwgcjB4ODA4MDgwODAgICAgICAgIAorICAgICAgICBNX1NUUiAgICAgICBSZXN1bHRBLCBbcERzdFByZWRdLCBpRHN0U3RlcCAgICAgICAgCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEIsIFJlc3VsdEIsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEIsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAgICAgICAgIAorRW5kMgorICAgICAgICBNX0VORAorCisKKyAgICAgICAgOy8vIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhdmVyYWdlIG9mIDR4NCBibG9jayAKKyAgICAgICAgOy8vIHBQcmVkMCBpcyBhdCBhbGlnbm1lbnQgb2Zmc2V0IDMgYW5kIHBQcmVkMSBpcyBhbGlnbm1lbnQgNAorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmUsIHI2CisKKyAgICAgICAgOy8vIENvZGUgc3RhcnQgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICByMHg4MDgwODA4MCwgPTB4ODA4MDgwODAKKworICAgICAgICA7Ly8gMXN0IGxvYWQKKyAgICAgICAgTERSICAgICAgICAgVGVtcDEsIFtwUHJlZDAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBpUHJlZEEwLCBbcFByZWQwXSwgaVByZWRTdGVwMCAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjAsIFtwUHJlZDFdCisgICAgICAgIExEUiAgICAgICAgIGlQcmVkQjEsIFtwUHJlZDEsIGlQcmVkU3RlcDFdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMSwgW3BQcmVkMF0sIGlQcmVkU3RlcDAKKworICAgICAgICBNVk4gICAgICAgICBpUHJlZEIwLCBpUHJlZEIwCisgICAgICAgIE1WTiAgICAgICAgIGlQcmVkQjEsIGlQcmVkQjEKKyAgICAgICAgTU9WICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgTFNSICMyNAorICAgICAgICBPUlIgICAgICAgICBpUHJlZEEwLCBpUHJlZEEwLCBUZW1wMSwgTFNMICM4ICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBpUHJlZEExLCBpUHJlZEExLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIFRlbXAyLCBMU0wgIzgKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QSwgaVByZWRBMCwgaVByZWRCMAorICAgICAgICBVSFNVQjggICAgICBSZXN1bHRCLCBpUHJlZEExLCBpUHJlZEIxCisgICAgICAgIEVPUiAgICAgICAgIFJlc3VsdEEsIFJlc3VsdEEsIHIweDgwODA4MDgwCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIDJuZCBsb2FkCisgICAgICAgIExEUiAgICAgICAgIFRlbXAxLCBbcFByZWQwLCAjNF0KKyAgICAgICAgTV9MRFIgICAgICAgaVByZWRBMCwgW3BQcmVkMF0sIGlQcmVkU3RlcDAgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIwLCBbcFByZWQxXQorICAgICAgICBMRFIgICAgICAgICBpUHJlZEIxLCBbcFByZWQxLCBpUHJlZFN0ZXAxXQorICAgICAgICBMRFIgICAgICAgICBUZW1wMiwgW3BQcmVkMCwgIzRdCisgICAgICAgIE1fTERSICAgICAgIGlQcmVkQTEsIFtwUHJlZDBdLCBpUHJlZFN0ZXAwCisKKyAgICAgICAgTVZOICAgICAgICAgaVByZWRCMCwgaVByZWRCMAorICAgICAgICBNVk4gICAgICAgICBpUHJlZEIxLCBpUHJlZEIxCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTAsIGlQcmVkQTAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMCwgaVByZWRBMCwgVGVtcDEsIExTTCAjOCAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIGlQcmVkQTEsIGlQcmVkQTEsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICAgICAgaVByZWRBMSwgaVByZWRBMSwgVGVtcDIsIExTTCAjOAorCisgICAgICAgIFVIU1VCOCAgICAgIFJlc3VsdEEsIGlQcmVkQTAsIGlQcmVkQjAKKyAgICAgICAgVUhTVUI4ICAgICAgUmVzdWx0QiwgaVByZWRBMSwgaVByZWRCMQorICAgICAgICBFT1IgICAgICAgICBSZXN1bHRBLCBSZXN1bHRBLCByMHg4MDgwODA4MCAgICAgICAgCisgICAgICAgIE1fU1RSICAgICAgIFJlc3VsdEEsIFtwRHN0UHJlZF0sIGlEc3RTdGVwICAgICAgICAKKyAgICAgICAgRU9SICAgICAgICAgUmVzdWx0QiwgUmVzdWx0QiwgcjB4ODA4MDgwODAKKyAgICAgICAgTV9TVFIgICAgICAgUmVzdWx0QiwgW3BEc3RQcmVkXSwgaURzdFN0ZXAgICAgICAgICAgICAgICAgCitFbmQzCisgICAgICAgIE1fRU5ECisKKyAgICBFTkRJRgorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTM3NDk1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9DQVZMQ1RhYmxlcy5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0NBVkxDVGFibGVzLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKiAKKyAqIE9wdGltaXplZCBDQVZMQyB0YWJsZXMgZm9yIEguMjY0CisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisKKyNpbmNsdWRlICJhcm1WQ000UDEwX0NBVkxDVGFibGVzLmgiCisKKy8qIDR4NCBEZVppZ1phZyB0YWJsZSAqLworCitjb25zdCBPTVhfVTggYXJtVkNNNFAxMF9aaWdaYWdfNHg0WzE2XSA9Cit7CisgICAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLyogMngyIERlWmlnWmFnIHRhYmxlICovCisKK2NvbnN0IE9NWF9VOCBhcm1WQ000UDEwX1ppZ1phZ18yeDJbNF0gPQoreworICAgIDAsIDEsIDIsIDMKK307CisKKworLyoKKyAqIFN1ZmZpeCBUbyBMZXZlbCB0YWJsZQorICogV2UgaW5jcmVtZW50IHRoZSBzdWZmaXggbGVuZ3RoIGlmIAorICogKChMZXZlbENvZGU+PjEpKzEpPigzPDwoU3VmZml4TGVuZ3RoLTEpKSAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZT4+MSk+PSgzPDwoU3VmZml4TGVuZ3RoLTEpKSAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogIExldmVsQ29kZSAgICA+PSAzPDxTdWZmaXhMZW5ndGggICAgICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICogKExldmVsQ29kZSsyKSA+PSAoMzw8U3VmZml4TGVuZ3RoKSsyICAgICAmJiBTdWZmaXhMZW5ndGg8NgorICovCitjb25zdCBPTVhfUzggYXJtVkNNNFAxMF9TdWZmaXhUb0xldmVsWzddID0KK3sKKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTEgKi8KKyAgICAoMzw8MikrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTIgKi8KKyAgICAoMzw8MykrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTMgKi8KKyAgICAoMzw8NCkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTQgKi8KKyAgICAoMzw8NSkrMiwgICAgICAgLyogU3VmZml4TGVuZ3RoPTUgKi8KKyAgICAtMSAgICAgICAgICAgICAgLyogU3VmZml4TGVuZ3RoPTYgLSBuZXZlciBpbmNyZW1lbnQgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzBbMTMyXSA9IHsKKyAgICAweDAwMjAsIDB4MDEwMCwgMHgyMDE1LCAweDIwMTUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDAwMjgsIDB4MDBmMCwgMHgwMGY4LCAweDAwMjcsIDB4MDAzMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDBlOCwKKyAgICAweDAwMzgsIDB4MDBhMCwgMHgwMGM4LCAweDAwZDAsIDB4MDA0MCwgMHgwMDY4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwNDgsIDB4MDA1MCwgMHgwMDU4LCAweDAwNjAsIDB4MjdmZiwgMHgyN2ZmLCAweDIwNmIsIDB4MjA2YiwKKyAgICAweDAwODEsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA4NywgMHgwMDdkLCAweDAwN2IsIDB4MDA3MSwKKyAgICAweDAwN2YsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MDA4OCwKKyAgICAweDIwNzcsIDB4MjA3NywgMHgyMDZkLCAweDIwNmQsIDB4MjA2MywgMHgyMDYzLCAweDIwNjEsIDB4MjA2MSwKKyAgICAweDIwNmYsIDB4MjA2ZiwgMHgyMDY1LCAweDIwNjUsIDB4MjA1YiwgMHgyMDViLCAweDIwNTksIDB4MjA1OSwKKyAgICAweDAwNjcsIDB4MDA1ZCwgMHgwMDUzLCAweDAwNTEsIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0OSwKKyAgICAweDAwYTgsIDB4MDBiMCwgMHgwMGI4LCAweDAwYzAsIDB4MjA0MSwgMHgyMDQxLCAweDIwNGQsIDB4MjA0ZCwKKyAgICAweDIwNDMsIDB4MjA0MywgMHgyMDM5LCAweDIwMzksIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwKKyAgICAweDIwM2IsIDB4MjAzYiwgMHgyMDMxLCAweDIwMzEsIDB4MjA0ZiwgMHgyMDRmLCAweDIwM2QsIDB4MjAzZCwKKyAgICAweDIwMzMsIDB4MjAzMywgMHgyMDI5LCAweDIwMjksIDB4MDA0NywgMHgwMDM1LCAweDAwMmIsIDB4MDAyMSwKKyAgICAweDIwM2YsIDB4MjAzZiwgMHgyMDJkLCAweDIwMmQsIDB4MjAyMywgMHgyMDIzLCAweDIwMTksIDB4MjAxOSwKKyAgICAweDAwMzcsIDB4MDAyNSwgMHgwMDFiLCAweDAwMTEsIDB4MjAyZiwgMHgyMDJmLCAweDIwMWQsIDB4MjAxZCwKKyAgICAweDAwMTMsIDB4MDAwOSwgMHgyMDFmLCAweDIwMWYKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzFbMTI4XSA9IHsKKyAgICAweDAwMjAsIDB4MDBlOCwgMHgwMGYwLCAweDAwZjgsIDB4MDAyNywgMHgwMDFmLCAweDIwMTUsIDB4MjAxNSwKKyAgICAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwKKyAgICAweDAwMjgsIDB4MDBkMCwgMHgwMGQ4LCAweDAwZTAsIDB4MDAzMCwgMHgwMDk4LCAweDAwYzAsIDB4MDBjOCwKKyAgICAweDAwMzgsIDB4MDA2MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDI3ZmYsIDB4MjdmZiwgMHgyMDdmLCAweDIwN2YsIDB4MDA4NywgMHgwMDg1LCAweDAwODMsIDB4MDA4MSwKKyAgICAweDAwN2IsIDB4MDA3OSwgMHgwMDdkLCAweDAwNzMsIDB4MjA3NSwgMHgyMDc1LCAweDIwNzEsIDB4MjA3MSwKKyAgICAweDAwNjgsIDB4MDA3MCwgMHgwMDc4LCAweDAwODAsIDB4MjA3NywgMHgyMDc3LCAweDIwNmQsIDB4MjA2ZCwKKyAgICAweDIwNmIsIDB4MjA2YiwgMHgyMDY5LCAweDIwNjksIDB4MjA2ZiwgMHgyMDZmLCAweDIwNjUsIDB4MjA2NSwKKyAgICAweDIwNjMsIDB4MjA2MywgMHgyMDYxLCAweDIwNjEsIDB4MDA1OSwgMHgwMDVkLCAweDAwNWIsIDB4MDA1MSwKKyAgICAweDAwNjcsIDB4MDA1NSwgMHgwMDUzLCAweDAwNDksIDB4MDBhMCwgMHgwMGE4LCAweDAwYjAsIDB4MDBiOCwKKyAgICAweDIwNWYsIDB4MjA1ZiwgMHgyMDRkLCAweDIwNGQsIDB4MjA0YiwgMHgyMDRiLCAweDIwNDEsIDB4MjA0MSwKKyAgICAweDIwNTcsIDB4MjA1NywgMHgyMDQ1LCAweDIwNDUsIDB4MjA0MywgMHgyMDQzLCAweDIwMzksIDB4MjAzOSwKKyAgICAweDIwNGYsIDB4MjA0ZiwgMHgyMDNkLCAweDIwM2QsIDB4MjAzYiwgMHgyMDNiLCAweDIwMzEsIDB4MjAzMSwKKyAgICAweDAwMjksIDB4MDAzNSwgMHgwMDMzLCAweDAwMjEsIDB4MjA0NywgMHgyMDQ3LCAweDIwMmQsIDB4MjAyZCwKKyAgICAweDIwMmIsIDB4MjAyYiwgMHgyMDE5LCAweDIwMTksIDB4MDAzZiwgMHgwMDI1LCAweDAwMjMsIDB4MDAxMSwKKyAgICAweDAwMzcsIDB4MDAxZCwgMHgwMDFiLCAweDAwMDksIDB4MjAyZiwgMHgyMDJmLCAweDIwMTMsIDB4MjAxMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMlsxMTJdID0geworICAgIDB4MDAyMCwgMHgwMDg4LCAweDAwYjAsIDB4MDBiOCwgMHgwMGMwLCAweDAwYzgsIDB4MDBkMCwgMHgwMGQ4LAorICAgIDB4MDAzZiwgMHgwMDM3LCAweDAwMmYsIDB4MDAyNywgMHgwMDFmLCAweDAwMTUsIDB4MDAwYiwgMHgwMDAxLAorICAgIDB4MDAyOCwgMHgwMDUwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LAorICAgIDB4MDdmZiwgMHgwMDgxLCAweDAwODcsIDB4MDA4NSwgMHgwMDgzLCAweDAwNzksIDB4MDA3ZiwgMHgwMDdkLAorICAgIDB4MDA3YiwgMHgwMDcxLCAweDAwNzcsIDB4MDA3NSwgMHgwMDczLCAweDAwNjksIDB4MjA2YiwgMHgyMDZiLAorICAgIDB4MDA1OCwgMHgwMDYwLCAweDAwNjgsIDB4MDA3MCwgMHgyMDYxLCAweDIwNjEsIDB4MjA2ZCwgMHgyMDZkLAorICAgIDB4MjA2MywgMHgyMDYzLCAweDIwNTksIDB4MjA1OSwgMHgyMDZmLCAweDIwNmYsIDB4MjA2NSwgMHgyMDY1LAorICAgIDB4MjA1YiwgMHgyMDViLCAweDIwNTEsIDB4MjA1MSwgMHgwMDY3LCAweDAwNWQsIDB4MDA1MywgMHgwMDQ5LAorICAgIDB4MDA1ZiwgMHgwMDU1LCAweDAwNGIsIDB4MDA0MSwgMHgwMDkwLCAweDAwOTgsIDB4MDBhMCwgMHgwMGE4LAorICAgIDB4MjAzOSwgMHgyMDM5LCAweDIwMzEsIDB4MjAzMSwgMHgyMDRkLCAweDIwNGQsIDB4MjAyOSwgMHgyMDI5LAorICAgIDB4MjA1NywgMHgyMDU3LCAweDIwNDUsIDB4MjA0NSwgMHgyMDQzLCAweDIwNDMsIDB4MjAyMSwgMHgyMDIxLAorICAgIDB4MDAxOSwgMHgwMDNkLCAweDAwM2IsIDB4MDAxMSwgMHgwMDRmLCAweDAwMzUsIDB4MDAzMywgMHgwMDA5LAorICAgIDB4MjAyYiwgMHgyMDJiLCAweDIwMmQsIDB4MjAyZCwgMHgyMDIzLCAweDIwMjMsIDB4MjAyNSwgMHgyMDI1LAorICAgIDB4MjAxYiwgMHgyMDFiLCAweDIwNDcsIDB4MjA0NywgMHgyMDFkLCAweDIwMWQsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zWzgwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAyOCwgMHgwMDMwLCAweDAwMzgsIDB4MDA0MCwgMHgwMDQ4LCAweDAwNTAsIDB4MDA1OCwKKyAgICAweDAwNjAsIDB4MDA2OCwgMHgwMDcwLCAweDAwNzgsIDB4MDA4MCwgMHgwMDg4LCAweDAwOTAsIDB4MDA5OCwKKyAgICAweDAwMDksIDB4MDAwYiwgMHgwN2ZmLCAweDAwMDEsIDB4MDAxMSwgMHgwMDEzLCAweDAwMTUsIDB4MDdmZiwKKyAgICAweDAwMTksIDB4MDAxYiwgMHgwMDFkLCAweDAwMWYsIDB4MDAyMSwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywKKyAgICAweDAwMjksIDB4MDAyYiwgMHgwMDJkLCAweDAwMmYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzUsIDB4MDAzNywKKyAgICAweDAwMzksIDB4MDAzYiwgMHgwMDNkLCAweDAwM2YsIDB4MDA0MSwgMHgwMDQzLCAweDAwNDUsIDB4MDA0NywKKyAgICAweDAwNDksIDB4MDA0YiwgMHgwMDRkLCAweDAwNGYsIDB4MDA1MSwgMHgwMDUzLCAweDAwNTUsIDB4MDA1NywKKyAgICAweDAwNTksIDB4MDA1YiwgMHgwMDVkLCAweDAwNWYsIDB4MDA2MSwgMHgwMDYzLCAweDAwNjUsIDB4MDA2NywKKyAgICAweDAwNjksIDB4MDA2YiwgMHgwMDZkLCAweDAwNmYsIDB4MDA3MSwgMHgwMDczLCAweDAwNzUsIDB4MDA3NywKKyAgICAweDAwNzksIDB4MDA3YiwgMHgwMDdkLCAweDAwN2YsIDB4MDA4MSwgMHgwMDgzLCAweDAwODUsIDB4MDA4NworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNFszMl0gPSB7CisgICAgMHgwMDIwLCAweDAwMzgsIDB4MjAxNSwgMHgyMDE1LCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsCisgICAgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsIDB4NjAwYiwgMHg2MDBiLCAweDYwMGIsCisgICAgMHgwMDI4LCAweDAwMzAsIDB4MDAyMSwgMHgwMDE5LCAweDIwMjcsIDB4MjAyNywgMHgwMDI1LCAweDAwMjMsCisgICAgMHgyMDFkLCAweDIwMWQsIDB4MjAxYiwgMHgyMDFiLCAweDAwMTEsIDB4MDAxZiwgMHgwMDEzLCAweDAwMDkKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc1sxOF0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMCwgLyogbkM9MCAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzAsIC8qIG5DPTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18xLCAvKiBuQz0yICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMSwgLyogbkM9MyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18yLCAvKiBuQz01ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMiwgLyogbkM9NiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzIsIC8qIG5DPTcgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9OSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEwICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xMiAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTEzICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfMywgLyogbkM9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDQ29lZmZUb2tlblRhYmxlc18zLCAvKiBuQz0xNSAqLworICAgIGFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzXzMsIC8qIG5DPTE2ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXNfNCAgLyogbkM9LTEgKi8KK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMFs0MF0gPSB7CisgICAgMHgwMDIwLCAweDAwNDgsIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsCisgICAgMHgwMDI4LCAweDAwNDAsIDB4MDAxMSwgMHgwMDBmLCAweDAwMzAsIDB4MDAzOCwgMHgwMDE5LCAweDAwMTcsCisgICAgMHgyN2ZmLCAweDI3ZmYsIDB4MjAxZiwgMHgyMDFmLCAweDIwMWQsIDB4MjAxZCwgMHgyMDFiLCAweDIwMWIsCisgICAgMHgyMDE1LCAweDIwMTUsIDB4MjAxMywgMHgyMDEzLCAweDIwMGQsIDB4MjAwZCwgMHgyMDBiLCAweDIwMGIKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMVsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBmLCAweDAwMGQsIDB4MDAwYiwgMHgyMDA5LCAweDIwMDksCisgICAgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEsCisgICAgMHgwMDFkLCAweDAwMWIsIDB4MDAxOSwgMHgwMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMlsyNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMSwgMHgwMDBiLCAweDAwMDksIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgwMDFiLCAweDAwMTcsIDB4MjAxOSwgMHgyMDE5LCAweDIwMTUsIDB4MjAxNSwgMHgyMDEzLCAweDIwMTMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfM1syNF0gPSB7CisgICAgMHgwMDIwLCAweDAwMjgsIDB4MDAxMywgMHgwMDBmLCAweDAwMDcsIDB4MDAwNSwgMHgyMDExLCAweDIwMTEsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDAzLCAweDIwMDMsCisgICAgMHgyMDE5LCAweDIwMTksIDB4MjAxNywgMHgyMDE3LCAweDIwMTUsIDB4MjAxNSwgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNFsyMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMTUsIDB4MDAxMSwgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwgMHgyMDBmLCAweDIwMGYsCisgICAgMHgyMDBkLCAweDIwMGQsIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsCisgICAgMHgyMDE3LCAweDIwMTcsIDB4MjAxMywgMHgyMDEzCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzVbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDExLCAweDIwMTMsIDB4MjAxMywgMHgyMDBmLCAweDIwMGYsIDB4MjAwZCwgMHgyMDBkLAorICAgIDB4MjAwYiwgMHgyMDBiLCAweDIwMDksIDB4MjAwOSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwNSwgMHgyMDA1LAorICAgIDB4MDAxNSwgMHgwMDAxLCAweDIwMDMsIDB4MjAwMworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc182WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZiwgMHgyMDExLCAweDIwMTEsIDB4MjAwZCwgMHgyMDBkLCAweDIwMDksIDB4MjAwOSwKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDAwMTMsIDB4MDAwMSwgMHgyMDAzLCAweDIwMDMKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfN1syMF0gPSB7CisgICAgMHgwMDIwLCAweDAwMDMsIDB4MjAwZiwgMHgyMDBmLCAweDIwMGQsIDB4MjAwZCwgMHgyMDA3LCAweDIwMDcsCisgICAgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwgMHg0MDBiLCAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksCisgICAgMHgwMDExLCAweDAwMDEsIDB4MjAwNSwgMHgyMDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzhbMjBdID0geworICAgIDB4MDAyMCwgMHgwMDA1LCAweDIwMGIsIDB4MjAwYiwgMHg0MDBkLCAweDQwMGQsIDB4NDAwZCwgMHg0MDBkLAorICAgIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwOSwgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LAorICAgIDB4MDAwMywgMHgwMDAxLCAweDIwMGYsIDB4MjAwZgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc185WzIwXSA9IHsKKyAgICAweDAwMjAsIDB4MDAwZCwgMHgyMDA1LCAweDIwMDUsIDB4NDAwYiwgMHg0MDBiLCAweDQwMGIsIDB4NDAwYiwKKyAgICAweDQwMDksIDB4NDAwOSwgMHg0MDA5LCAweDQwMDksIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsIDB4NDAwNywKKyAgICAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTBbMTZdID0geworICAgIDB4MDAwMSwgMHgwMDAzLCAweDIwMDUsIDB4MjAwNSwgMHgyMDA3LCAweDIwMDcsIDB4MjAwYiwgMHgyMDBiLAorICAgIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5LCAweDYwMDksIDB4NjAwOSwgMHg2MDA5Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzExWzE2XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgyMDA5LCAweDIwMDksIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwNSwKKyAgICAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNywgMHg2MDA3LCAweDYwMDcsIDB4NjAwNworfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMlsxNl0gPSB7CisgICAgMHgyMDAxLCAweDIwMDEsIDB4MjAwMywgMHgyMDAzLCAweDQwMDcsIDB4NDAwNywgMHg0MDA3LCAweDQwMDcsCisgICAgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTNbMTZdID0geworICAgIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1LCAweDYwMDUsIDB4NjAwNSwgMHg2MDA1Cit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzE0WzE2XSA9IHsKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwKKyAgICAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMworfTsKKworY29uc3QgT01YX1UxNiAqIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNbMTVdID0geworICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMCwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc181LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfNiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzcsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc184LAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfOSwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEwLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb1RhYmxlc18xMiwKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzXzEzLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXNfMTQKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzBbMTZdID0geworICAgIDB4MjAwNywgMHgyMDA3LCAweDIwMDUsIDB4MjAwNSwgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAzLAorICAgIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18xWzE2XSA9IHsKKyAgICAweDQwMDUsIDB4NDAwNSwgMHg0MDA1LCAweDQwMDUsIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywKKyAgICAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMlsxNl0gPSB7CisgICAgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsIDB4NjAwMywgMHg2MDAzLCAweDYwMDMsCisgICAgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEsIDB4NjAwMSwgMHg2MDAxLCAweDYwMDEKK307CisKK2NvbnN0IE9NWF9VMTYgKiBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc1szXSA9IHsKKyAgICBhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlc18wLAorICAgIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXNfMgorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wWzhdID0geworICAgIDB4NDAwMywgMHg0MDAzLCAweDQwMDMsIDB4NDAwMywgMHg0MDAxLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzFbOF0gPSB7CisgICAgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDQwMDEsIDB4NDAwMSwgMHg0MDAxLCAweDQwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMls4XSA9IHsKKyAgICAweDIwMDcsIDB4MjAwNywgMHgyMDA1LCAweDIwMDUsIDB4MjAwMywgMHgyMDAzLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18zWzhdID0geworICAgIDB4MDAwOSwgMHgwMDA3LCAweDIwMDUsIDB4MjAwNSwgMHgyMDAzLCAweDIwMDMsIDB4MjAwMSwgMHgyMDAxCit9OworCitzdGF0aWMgY29uc3QgT01YX1UxNiBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzRbOF0gPSB7CisgICAgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDIwMDMsIDB4MjAwMywgMHgyMDAxLCAweDIwMDEKK307CisKK3N0YXRpYyBjb25zdCBPTVhfVTE2IGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNVs4XSA9IHsKKyAgICAweDAwMDMsIDB4MDAwNSwgMHgwMDA5LCAweDAwMDcsIDB4MDAwZCwgMHgwMDBiLCAweDIwMDEsIDB4MjAwMQorfTsKKworc3RhdGljIGNvbnN0IE9NWF9VMTYgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182WzI0XSA9IHsKKyAgICAweDAwMTAsIDB4MDAwZCwgMHgwMDBiLCAweDAwMDksIDB4MDAwNywgMHgwMDA1LCAweDAwMDMsIDB4MDAwMSwKKyAgICAweDAwMTgsIDB4MDAxMSwgMHgyMDBmLCAweDIwMGYsIDB4MDAyMCwgMHgwMDE1LCAweDIwMTMsIDB4MjAxMywKKyAgICAweDAwMjgsIDB4MDAxOSwgMHgyMDE3LCAweDIwMTcsIDB4MDdmZiwgMHgwMDFkLCAweDIwMWIsIDB4MjAxYgorfTsKKworLyogVGFibGVzIDcgdG8gMTQgYXJlIGR1cGxpY2F0ZXMgb2YgdGFibGUgNiAqLworCitjb25zdCBPTVhfVTE2ICogYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc1sxNV0gPSB7CisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18wLCAgLyogWmVyb3NMZWZ0PTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzEsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc18yLAorICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfMywKKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzQsCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc181LCAgLyogWmVyb3NMZWZ0PTYgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9NyAqLworICAgIGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXNfNiwgIC8qIFplcm9zTGVmdD04ICovCisgICAgYXJtVkNNNFAxMF9DQVZMQ1J1bkJlZm9yZVRhYmxlc182LCAgLyogWmVyb3NMZWZ0PTkgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTAgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTEgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTIgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTMgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYsICAvKiBaZXJvc0xlZnQ9MTQgKi8KKyAgICBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzXzYgICAvKiBaZXJvc0xlZnQ9MTUgKi8KK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YzNhNzdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MucwpAQCAtMCwwICsxLDE5OCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAgICAgCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMzIxMCAgICAgIFJOIDYKKworOy8vIFBpeGVscworZFBfMCAgICAgICAgRE4gRDQuVTgKK2RQXzEgICAgICAgIEROIEQ1LlU4ICAKK2RQXzIgICAgICAgIEROIEQ2LlU4ICAKK2RQXzMgICAgICAgIEROIEQ3LlU4ICAKK2RRXzAgICAgICAgIEROIEQ4LlU4ICAKK2RRXzEgICAgICAgIEROIEQ5LlU4ICAKK2RRXzIgICAgICAgIEROIEQxMC5VOCAKK2RRXzMgICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CisKKzsvLyBiU0xUNAorZFRDMzIxMCAgICAgRE4gRDE4LlU4ICAgCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKK2RNYXNrXzQgICAgIEROIEQyNi5VMTYKKworZFRlbXAgICAgICAgRE4gRDI4LlU4CitkRHVtbXkgICAgICBETiBEMTcuVTgKKworOy8vIENvbXB1dGluZyBQMCxRMAorcURxMHAwICAgICAgUU4gUTEwLlMxNgorcURwMXExICAgICAgUU4gUTExLlMxNgorcURlbHRhICAgICAgUU4gUTEwLlMxNiAgOyByZXVzZSBxRHEwcDAKK2REZWx0YSAgICAgIEROIEQyMC5TOAorCisKKzsvLyBDb21wdXRpbmcgUDEsUTEKK3FQXzBuICAgICAgIFFOIFExNC5TMTYKK3FRXzBuICAgICAgIFFOIFExMi5TMTYKKworZFFfMG4gICAgICAgRE4gRDI0LlU4CitkUF8wbiAgICAgICBETiBEMjkuVTgKKworOy8vIGJTR0U0CisKK2RIU3AwcTEgICAgIEROIEQxMy5VOAorZEhTcTBwMSAgICAgRE4gRDMxLlU4ICAgCisKK2RCUzMyMTAgICAgIEROIEQyOC5VMTYKKworZFBfMHQgICAgICAgRE4gRDEzLlU4ICAgO2RIU3AwcTEgICAgICAgIAorZFFfMHQgICAgICAgRE4gRDMxLlU4ICAgO1RlbXAxICAgICAgICAKKworZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUV8wbiAgICAgICBETiBEMjQuVTggICA7VGVtcDIgICAgICAgIAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gcFRocmVzaG9sZHM6IHI1Cis7Ly8gICAgICAgICAKKzsvLyBPdXRwdXRzIC0gUGl4ZWxzICAgICAgICAgICAgLSBQMC1QMTogRDI5LUQzMCwgUTAtUTE6IEQyNC1EMjUKKzsvLyAgICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgLSBwVGhyZXNob2xkczogcjUKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgCisgICAgICAgIDtkVEMzMjEwIC0xOAorICAgICAgICA7ZFRlbXAtMjgKKworICAgICAgICBWTEQxICAgICAgICBkMTguVTMyWzBdLCBbcFRocmVzaG9sZHNdISA7aGVyZQorCisgICAgICAgIDsvLyBkZWx0YSA9ICgoKHEwLXAwKTw8MikgKyAocDEtcTEpICsgNCkgPj4gMzsKKyAgICAgICAgOy8vIGREZWx0YSA9IChxRHAxcTEgPj4gMiArIHFEcTBwMCArIDEpPj4gMQorCisgICAgICAgIDsvLyBxRHAxcTEtMTEKKyAgICAgICAgOy8vIHFEcTBwMC0xMAorICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZFRlbXAsIGRUQzMyMTAKKyAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZTSFIgICAgICAgIHFEcDFxMSwgcURwMXExLCAjMiAgICAgIAorICAgICAgICBWWklQLjggICAgICBkVEMzMjEwLCBkVGVtcAorICAgIAorICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAorCisgICAgICAgIDsvLyBkVEMgPSBkVEMwMSArIChkQXBsZyAmIDEpICsgKGRBcWZsZyAmIDEpCisKKyAgICAgICAgOy8vIGRUQzMyMTAtMTgKKyAgICAgICAgOy8vIGRUZW1wLTI4CisgICAgICAgIDsvLyBkVEMtMzEKKyAgICAgICAgVkJJRiAgICAgICAgZFRDMzIxMCwgZE1hc2tfMCwgZEZpbHQKKyAgICAgICAgVlJIQUREICAgICAgcURlbHRhLCBxRHAxcTEsIHFEcTBwMCAgCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMzIxMCwgZE1hc2tfMQorICAgICAgICBWUU1PVk4gICAgICBkRGVsdGEsIHFEZWx0YQorICAgICAgICA7Ly8gZERlbHRhLWQyMAorCisgICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgVk1JTiAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKyAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcworICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKyAgICAgICAgOzEKKyAgICAgICAgVk1BWCAgICAgICAgZERlbHRhLCBkRGVsdGEsIGRUQ3MKKworICAgICAgICA7Ly8gZFBfMG4gLSAyOQorICAgICAgICA7Ly8gZFFfMG4gLSAyNAorCisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZGVsdGEpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUV8wIC0gZGVsdGEpOworCisgICAgICAgIDsvLyBkUF8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICA7Ly8gZFFfMG4gPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBkUF8wIC0gZERlbHRhKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBxUF8wbiAtIDE0CisgICAgICAgIDsvLyBxUV8wbiAtIDEyCisgICAgICAgIAorICAgICAgICBWTU9WTCAgICAgICBxUF8wbiwgZFBfMAorICAgICAgICBWTU9WTCAgICAgICBxUV8wbiwgZFFfMAorCisgICAgICAgIDsxCisgICAgICAgIFZBRERXICAgICAgIHFQXzBuLCBxUF8wbiwgZERlbHRhCisgICAgICAgIFZTVUJXICAgICAgIHFRXzBuLCBxUV8wbiwgZERlbHRhCisgICAgICAgIAorICAgICAgICBWUU1PVlVOICAgICBkUF8wbiwgcVBfMG4KKyAgICAgICAgVlFNT1ZVTiAgICAgZFFfMG4sIHFRXzBuCisKKyAgICAgICAgTV9FTkQKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUoKQorOy8vCis7Ly8gSW5wdXRzIC0gUGl4ZWxzICAgICAgICAgICAgIC0gcDAtcDM6IEQ0LUQ3LCBxMC1xMzogRDgtRDExCis7Ly8gICAgICAgIC0gRmlsdGVyIG1hc2tzICAgICAgIC0gZmlsdDogRDE2LCBhcWZsZzogRDEyLCBhcGZsZzogRDE3Cis7Ly8gICAgICAgIC0gQWRkaXRpb25hbCBQYXJhbXMgIC0gYWxwaGE6IEQwLCBkTWFza18xOiBEMTUKKzsvLyAgICAgICAgIAorOy8vIE91dHB1dHMgLSBQaXhlbHMgICAgICAgICAgICAtIFAwLVAyOiBEMjktRDMxLCBRMC1RMjogRDI0LEQyNSxEMjgKKworOy8vIFJlZ2lzdGVycyBDb3JydXB0ZWQgICAgICAgICAtIEQxOC1EMzEKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIAorICAgICAgICA7ZEhTcTBwMSAtIDMxCisgICAgICAgIDtkSFNwMHExIC0gMTMKKyAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCisgICAgICAgIFZIQUREICAgICAgIGRIU3EwcDEsIGRRXzAsIGRQXzEgICAgICAgICAKKworICAgICAgICA7Ly8gUHJlcGFyZSB0aGUgYlMgbWFzaworCisgICAgICAgIDsvLyBkSFNwMHExLTEzCisgICAgICAgIDsvLyBkUF8wdC1kSFNwMHExLTEzCisgICAgICAgIDsvLyBkSFNxMHAxLTMxCisgICAgICAgIDsvLyBkUV8wdC1UZW1wMS0zMQorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXQorCisgICAgICAgIFZSSEFERCAgICAgIGRQXzB0LCBkSFNwMHExLCBkUF8xICAgIAorICAgICAgICBWUkhBREQgICAgICBkUV8wdCwgZEhTcTBwMSwgZFFfMQorICAgICAgICAKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGICAKKworICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFmZTRmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisKKyAgICBJRiAgQ29ydGV4QTgKKyAgICAgICAgCitwVGhyZXNob2xkcyBSTiA1CisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CisKKzsvLyBiU0xUNAorZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCitkVEMxICAgICAgICBETiBEMTkuVTggICAKK2RUQzAxICAgICAgIEROIEQxOC5VOCAgIAorCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBDb21wdXRpbmcgUDAsUTAKK3FEcTBwMCAgICAgIFFOIFExMC5TMTYKK3FEcDFxMSAgICAgIFFOIFExMS5TMTYKK3FEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCitkRGVsdGEgICAgICBETiBEMjAuUzgKKworCis7Ly8gQ29tcHV0aW5nIFAxLFExCitkUnAwcTAgICAgICBETiBEMjQuVTgKKworZE1heFAgICAgICAgRE4gRDIzLlU4CitkTWluUCAgICAgICBETiBEMjIuVTgKKworZE1heFEgICAgICAgRE4gRDE5LlU4CitkTWluUSAgICAgICBETiBEMjEuVTgKKworZERlbHRhUCAgICAgRE4gRDI2LlU4CitkRGVsdGFRICAgICBETiBEMjcuVTgKKworcVBfMG4gICAgICAgUU4gUTE0LlMxNgorcVFfMG4gICAgICAgUU4gUTEyLlMxNgorCitkUV8wbiAgICAgICBETiBEMjQuVTgKK2RRXzFuICAgICAgIEROIEQyNS5VOAorZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKKworOy8vIGJTR0U0CisKK3FTcDBxMCAgICAgIFFOIFExMC5VMTYKKworcVNwMnExICAgICAgUU4gUTExLlUxNgorcVNwMHEwcDEgICAgUU4gUTEyLlUxNgorcVNwM3AyICAgICAgUU4gUTEzLlUxNgorZEhTcDBxMSAgICAgRE4gRDI4LlU4CisKK3FTcTJwMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHExICAgIFFOIFExMi5VMTYKK3FTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQorZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCisKK3FUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCitxVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAorCitkUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCitkUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorZFBfMm4gICAgICAgRE4gRDMxLlU4CisKK2RRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKworOy8vIFJlZ2lzdGVyIHVzYWdlIGZvciAtIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKzsvLworOy8vIElucHV0cyAtIFBpeGVscyAgICAgICAgICAgICAtIHAwLXAzOiBENC1ENywgcTAtcTM6IEQ4LUQxMQorOy8vICAgICAgICAtIEZpbHRlciBtYXNrcyAgICAgICAtIGZpbHQ6IEQxNiwgYXFmbGc6IEQxMiwgYXBmbGc6IEQxNworOy8vICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zICAtIHBUaHJlc2hvbGRzOiByNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDE6IEQyOS1EMzAsIFEwLVExOiBEMjQtRDI1Cis7Ly8gICAgICAgICAtIEFkZGl0aW9uYWwgUGFyYW1zIC0gcFRocmVzaG9sZHM6IHI1CisKKzsvLyBSZWdpc3RlcnMgQ29ycnVwdGVkICAgICAgICAgLSBEMTgtRDMxCisKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKworICAgICAgICAKKyAgICAgICAgOy8vIHFEcTBwMC0xMAorICAgICAgICBWU1VCTCAgICAgICBxRHAxcTEsIGRQXzEsIGRRXzEgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAge2RUQzBbXX0sIFtwVGhyZXNob2xkc10hCisgICAgICAgIDsvLyBxRHAxcTEtMTEKKyAgICAgICAgVlNVQkwgICAgICAgcURxMHAwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkVEMxW119LCBbcFRocmVzaG9sZHNdIQorCisgICAgICAgIDsvLyBkUnAwcTAtMjQKKyAgICAgICAgVlNIUiAgICAgICAgcURwMXExLCBxRHAxcTEsICMyICAgICAgCisgICAgCisgICAgICAgIDsvLyBkVEMwMSA9IChkVEMxIDw8IDQpIHwgZFRDMAorICAgICAgICA7Ly8gZFRDMDEtMTgKKyAgICAgICAgVkVYVCAgICAgICAgZFRDMDEsIGRUQzAsIGRUQzEsICM0CisgICAgICAgIDsvLyBkVGVtcC0xOQorICAgICAgICBWQU5EICAgICAgICBkVGVtcCwgZEFwZmxnLCBkTWFza18xCisgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkVEMwMSwgZE1hc2tfMCwgZEZpbHQKKyAgICAKKworICAgICAgICA7Ly8gZGVsdGEgPSAoKChxMC1wMCk8PDIpICsgKHAxLXExKSArIDQpID4+IDM7CisgICAgICAgIDsvLyBkRGVsdGEgPSAocURwMXExID4+IDIgKyBxRHEwcDAgKyAxKT4+IDEKKworICAgICAgICA7Ly8gcURlbHRhLXFEcTBwMC0xMAorICAgICAgICBWUkhBREQgICAgICBxRGVsdGEsIHFEcDFxMSwgcURxMHAwICAKKyAgICAgICAgVlJIQUREICAgICAgZFJwMHEwLCBkUF8wLCBkUV8wICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDMDEsIGRUZW1wCisKKyAgICAgICAgOy8vIGRUQyA9IGRUQzAxICsgKGRBcGxnICYgMSkgKyAoZEFxZmxnICYgMSkKKyAgICAgICAgCisgICAgICAgIFZBTkQgICAgICAgIGRUZW1wLCBkQXFmbGcsIGRNYXNrXzEKKyAgICAgICAgVlFBREQgICAgICAgZE1heFAsIGRQXzEsIGRUQzAxICAgICAgCisgICAgICAgIFZRTU9WTiAgICAgIGREZWx0YSwgcURlbHRhCisgICAgICAgIFZBREQgICAgICAgIGRUQywgZFRDLCBkVGVtcAorCisgICAgICAgIDsvLyBkTWF4UCA9IFFBREQoZFBfMSwgZFRDMDEpCisgICAgICAgIDsvLyBkTWluUCA9IFFTVUIoZFBfMSwgZFRDMDEpCisgCisgICAgICAgIDsvLyBkTWF4UC1kMjMKKyAgICAgICAgOy8vIGRNaW5QLWQyMgorICAgICAgICBWUVNVQiAgICAgICBkTWluUCwgZFBfMSwgZFRDMDEgICAgICAKKworICAgICAgICA7Ly8gZERlbHRhLWQyMAorCisgICAgICAgIDsvLyBkTWF4USA9IFFBREQoZFFfMSwgZFRDMDEpCisgICAgICAgIDsvLyBkTWluUSA9IFFTVUIoZFFfMSwgZFRDMDEpCisgCisgICAgICAgIDsvLyBkTWF4US0xOQorICAgICAgICA7Ly8gZE1pblEtMjEKKyAgICAgICAgVlFBREQgICAgICAgZE1heFEsIGRRXzEsIGRUQzAxCisgICAgICAgIFZIQUREICAgICAgIGREZWx0YVAsIGRScDBxMCwgZFBfMiAgIAorICAgICAgICBWTUlOICAgICAgICBkRGVsdGEsIGREZWx0YSwgZFRDcworCisgICAgICAgIDsvLyBkRGVsdGEgPSAoT01YX1U4KWFybUNsaXAoMCwgMjU1LCBxMCAtIGRlbHRhKTsKKyAgICAgICAgVk5FRyAgICAgICAgZFRDcywgZFRDcworICAgICAgICAKKyAgICAgICAgVlFTVUIgICAgICAgZE1pblEsIGRRXzEsIGRUQzAxCisKKyAgICAgICAgOy8vIGRlbHRhID0gKHAyICsgKChwMCtxMCsxKT4+MSkgLSAocDE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGRlbHRhID0gYXJtQ2xpcCgtdEMwLCB0QzAsIGRlbHRhKTsKKyAgICAgICAgOy8vIHBRMFstMipTdGVwXSA9IChPTVhfVTgpKHAxICsgZGVsdGEpOworCisgICAgICAgIDsvLyBkRGVsdGFQID0gKGRQXzIgKyBkUnAwcTApPj4xOworICAgICAgICA7Ly8gZFBfMW4gPSBhcm1DbGlwKGRQXzEgLSBkVEMwMSwgZFBfMSArIGRUQzAxLCBkRGVsdGFQKTsKKyAgICAgICAgOy8vIGRQXzFuID0gYXJtQ2xpcChNaW5QLCBNYXhQLCBkRGVsdGFQKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkZWx0YSA9IChxMiArICgocDArcTArMSk+PjEpIC0gKHExPDwxKSk+PjE7CisgICAgICAgIDsvLyBkZWx0YSA9IGFybUNsaXAoLXRDMCwgdEMwLCBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMSpTdGVwXSA9IChPTVhfVTgpKHExICsgZGVsdGEpOworCisgICAgICAgIDsvLyBkRGVsdGFRID0gKGRRXzIgKyBkUnAwcTApPj4xOworICAgICAgICA7Ly8gZFFfMW4gPSBhcm1DbGlwKGRRXzEgLSBkVEMwMSwgZFFfMSArIGRUQzAxLCBkRGVsdGFRKTsKKyAgICAgICAgOy8vIGRRXzFuID0gYXJtQ2xpcChNaW5RLCBNYXhRLCBkRGVsdGFRKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBkRGVsdGFQLTI2CisgICAgICAgIFZIQUREICAgICAgIGREZWx0YVEsIGRScDBxMCwgZFFfMiAgIAorCisgICAgICAgIDsvLyBkRGVsdGFRLTI3CisgICAgICAgIAorICAgICAgICA7Ly8gZFBfMG4gLSAyOQorICAgICAgICA7Ly8gZFBfMW4gLSAzMAorICAgICAgICA7Ly8gZFFfMG4gLSAyNAorICAgICAgICA7Ly8gZFFfMW4gLSAyNQorICAgICAgICAKKyAgICAgICAgOy8vIGRlbHRhID0gKHEyICsgKChwMCtxMCsxKT4+MSkgLSAocTE8PDEpKT4+MTsKKyAgICAgICAgOy8vIGREZWx0YVEgPSAoZFFfMiArIGRScDBxMCk+PjE7CisKKyAgICAgICAgVk1BWCAgICAgICAgZFBfMW4sIGREZWx0YVAsIGRNaW5QICAgCisgICAgICAgIFZNQVggICAgICAgIGREZWx0YSwgZERlbHRhLCBkVENzCisKKyAgICAgICAgOy8vIHBRMFstMSpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkZWx0YSk7CisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRRXzAgLSBkZWx0YSk7CisKKyAgICAgICAgOy8vIGRQXzBuID0gKE9NWF9VOClhcm1DbGlwKDAsIDI1NSwgZFBfMCAtIGREZWx0YSk7CisgICAgICAgIDsvLyBkUV8wbiA9IChPTVhfVTgpYXJtQ2xpcCgwLCAyNTUsIGRQXzAgLSBkRGVsdGEpOworICAgICAgICAKKyAgICAgICAgOy8vIHFQXzBuIC0gMTQKKyAgICAgICAgOy8vIHFRXzBuIC0gMTIKKyAgICAgICAgCisgICAgICAgIFZNT1ZMICAgICAgIHFQXzBuLCBkUF8wCisgICAgICAgIFZNT1ZMICAgICAgIHFRXzBuLCBkUV8wCisKKyAgICAgICAgVkFERFcgICAgICAgcVBfMG4sIHFQXzBuLCBkRGVsdGEKKyAgICAgICAgVlNVQlcgICAgICAgcVFfMG4sIHFRXzBuLCBkRGVsdGEKKyAgICAgICAgCisgICAgICAgIFZRTU9WVU4gICAgIGRQXzBuLCBxUF8wbgorICAgICAgICBWUU1PVlVOICAgICBkUV8wbiwgcVFfMG4KKyAgICAgICAgCisgICAgICAgIFZNQVggICAgICAgIGRRXzFuLCBkRGVsdGFRLCBkTWluUQorCisgICAgICAgIFZNSU4gICAgICAgIGRQXzFuLCBkUF8xbiwgZE1heFAKKyAgICAgICAgVk1JTiAgICAgICAgZFFfMW4sIGRRXzFuLCBkTWF4UQorICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKKworICAgICAgICBWQklGICAgICAgICBkUF8xbiwgZFBfMSwgZEFwZmxnCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdCAgCisgICAgICAgIFZCSUYgICAgICAgIGRRXzFuLCBkUV8xLCBkQXFmbGcKKworICAgICAgICBNX0VORAorCis7Ly8gUmVnaXN0ZXIgdXNhZ2UgZm9yIC0gYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZSgpCis7Ly8KKzsvLyBJbnB1dHMgLSBQaXhlbHMgICAgICAgICAgICAgLSBwMC1wMzogRDQtRDcsIHEwLXEzOiBEOC1EMTEKKzsvLyAgICAgICAgLSBGaWx0ZXIgbWFza3MgICAgICAgLSBmaWx0OiBEMTYsIGFxZmxnOiBEMTIsIGFwZmxnOiBEMTcKKzsvLyAgICAgICAgLSBBZGRpdGlvbmFsIFBhcmFtcyAgLSBhbHBoYTogRDAsIGRNYXNrXzE6IEQxNQorOy8vICAgICAgICAgCis7Ly8gT3V0cHV0cyAtIFBpeGVscyAgICAgICAgICAgIC0gUDAtUDI6IEQyOS1EMzEsIFEwLVEyOiBEMjQsRDI1LEQyOAorCis7Ly8gUmVnaXN0ZXJzIENvcnJ1cHRlZCAgICAgICAgIC0gRDE4LUQzMQorCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorICAgIAorCisgICAgICAgIDsvLyBhcDxiZXRhICYmIGFybUFicyhwMC1xMCk8KChhbHBoYT4+MikrMikgICAgICAgIAorICAgICAgICA7Ly8gYXE8YmV0YSAmJiBhcm1BYnMocDAtcTApPCgoYWxwaGE+PjIpKzIpICAgICAgICAKKworICAgICAgICA7Ly8gKCBkQXBmbGcgJiBkQXAwcTAgPCAoZEFscGhhID4+IDIgKyAyKSApCisgICAgICAgIDsvLyAoIGRBcWZsZyAmIGRBcDBxMCA8IChkQWxwaGEgPj4gMiArIDIpICkKKworICAgICAgICA7Ly8gKCBkQXBmbGcgPSBkQXBmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQorICAgICAgICA7Ly8gKCBkQXFmbGcgPSBkQXFmbGcgJiBkQXAwcTAgPCAoZFRlbXAgKyBkTWFza18xICsgZE1hc2tfMSkgKQorCisgICAgICAgIDsvLyBQIEZpbHRlcgorCisgICAgICAgIFZTSFIgICAgICAgIGRUZW1wLCBkQWxwaGEsICMyCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQorCisgICAgICAgIDsvLyBxU3AwcTAtMTAKKyAgICAgICAgVkFEREwgICAgICAgcVNwMHEwLCBkUV8wLCBkUF8wICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wLCBkVGVtcCwgZE1hc2tfMQorCisgICAgICAgIDsvLyBxU3AycTEtMTEKKyAgICAgICAgOy8vIHFTcDBxMHAxLTEyCisgICAgICAgIFZBRERMICAgICAgIHFTcDJxMSwgZFBfMiwgZFFfMSAgICAgIAorICAgICAgICBWQUREVyAgICAgICBxU3AwcTBwMSwgcVNwMHEwLCBkUF8xICAKKworICAgICAgICBWQ0dUICAgICAgICBkVGVtcCwgZFRlbXAsIGRBcDBxMAorICAgICAgICBWU0hSICAgICAgICBxU3AycTEsICMxICAgICAgICAgICAgICAKKworICAgICAgICA7Ly8gcFEwWy0xKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgMipwMSArIDIqcDAgKyAyKnEwICsgcTEgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbLTEqU3RlcF0gPSAoICggKHAwICsgcTAgKyBwMSkgKyAocDIgKyBxMSk+PjEgKSA+PiAxICsgMSApID4+IDEKKworICAgICAgICA7Ly8gZFBfMG4gPSAoICggKHFTcDBxMCArIGRQXzEpICsgcVNwMnExPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUF8wbiA9ICggKCBxU3AwcTBwMSArIHFTcDJxMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFBfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWy0yKlN0ZXBdID0gKE9NWF9VOCkoKHAyICsgcDEgKyBwMCArIHEwICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKGRQXzIgKyBxU3AwcTBwMSArIDIpPj4yKTsKKyAgICAgICAgOy8vIGRQXzFuID0gKE9NWF9VOCkoKHFUZW1wMiArIDIpPj4yKTsKKyAgICAgICAgCisgICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoMipwMyArIDMqcDIgKyBwMSArIHAwICsgcTAgKyA0KT4+Myk7CisgICAgICAgIDsvLyBwUTBbLTMqU3RlcF0gPSAoT01YX1U4KSgoIChwMyArIHAyKSArIChwMSArIHAwICsgcTAgKyBwMikgPj4gMSArIDIpPj4yKTsKKworICAgICAgICA7Ly8gZFBfMm4gPSAoT01YX1U4KSgoIHFTcDNwMiArIChkUF8yICsgcVNwMHEwcDEpID4+IDEgKyAyKSA+PiAyKTsKKyAgICAgICAgOy8vIGRQXzJuID0gKE9NWF9VOCkoKCBxU3AzcDIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOworCisgICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBwMSwgcVNwMnExCisgICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcDEsIGRQXzIgIAorICAgICAgICAKKyAgICAgICAgOy8vIHFTcDNwMi0xMworICAgICAgICBWQURETCAgICAgICBxU3AzcDIsIGRQXzMsIGRQXzIgICAgICAKKworICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRBcGZsZywgZFRlbXAKKyAgICAgICAgVkhBREQgICAgICAgZEhTcDBxMSwgZFBfMCwgZFFfMSAgICAgCisgICAgICAgIFZTUkEgICAgICAgIHFTcDNwMiwgcVRlbXAyLCAjMSAgICAgIAorICAgICAgICA7Ly8gZEhTcDBxMS0yOAorICAgICAgICBWQU5EICAgICAgICBkQXFmbGcsIGRBcWZsZywgZFRlbXAKKworICAgICAgICA7Ly8gZFBfMG4tMjkKKyAgICAgICAgOy8vIGRQXzB0LWRIU3AwcTEtMjgKKyAgICAgICAgVlFSU0hSTiAgICAgZFBfMG4sIHFUZW1wMSwgIzEKKyAgICAgICAgVlJIQUREICAgICAgZFBfMHQsIGRIU3AwcTEsIGRQXzEgICAgCisKKyAgICAgICAgOy8vIGRQXzFuLTMwCisgICAgICAgIFZRUlNIUk4gICAgIGRQXzFuLCBxVGVtcDIsICMyCisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3EycDEsIGRRXzIsIGRQXzEgICAgICAgICAgCisgICAgICAgIFZBRERXICAgICAgIHFTcDBxMHExLCBxU3AwcTAsIGRRXzEgICAgICAKKyAgICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wdCwgZEFwZmxnICAgIAorCisgICAgICAgIDsvLyBRIEZpbHRlcgorCisgICAgICAgIDsvLyBwUTBbMCpTdGVwXSA9IChPTVhfVTgpKChxMiArIDIqcTEgKyAyKnEwICsgMipwMCArIHAxICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWzAqU3RlcF0gPSAoICggKHAwICsgcTAgKyBxMSkgKyAocTIgKyBwMSk+PjEgKSA+PiAxICsgMSApID4+IDEKKworICAgICAgICA7Ly8gZFFfMG4gPSAoICggKHFTcDBxMCArIGRRXzEpICsgcVNxMnAxPj4xICkgPj4gMSArIDEgKSA+PiAxCisgICAgICAgIDsvLyBkUV8wbiA9ICggKCBxU3AwcTBxMSArIHFTcTJwMT4+MSApID4+IDEgKyAxICkgPj4gMQorICAgICAgICA7Ly8gZFFfMG4gPSAoIHFUZW1wMSArIDEgKSA+PiAxCisgICAgICAgIAorICAgICAgICA7Ly8gcFEwWzEqU3RlcF0gPSAoT01YX1U4KSgocTIgKyBxMSArIHEwICsgcTAgKyAyKT4+Mik7CisgICAgICAgIAorICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgoZFFfMiArIHFTcDBxMHExICsgMik+PjIpOworICAgICAgICA7Ly8gZFFfMW4gPSAoT01YX1U4KSgocVRlbXAyICsgMik+PjIpOworICAgICAgICAKKyAgICAgICAgOy8vIHBRMFsyKlN0ZXBdID0gKE9NWF9VOCkoKDIqcTMgKyAzKnEyICsgcTEgKyBxMCArIHAwICsgNCk+PjMpOworICAgICAgICA7Ly8gcFEwWzIqU3RlcF0gPSAoT01YX1U4KSgoIChxMyArIHEyKSArIChxMSArIHAwICsgcTAgKyBxMikgPj4gMSArIDIpPj4yKTsKKworICAgICAgICA7Ly8gZFFfMm4gPSAoT01YX1U4KSgoIHFTcTNxMiArIChkUV8yICsgcVNwMHEwcTEpID4+IDEgKyAyKSA+PiAyKTsKKyAgICAgICAgOy8vIGRRXzJuID0gKE9NWF9VOCkoKCBxU3EzcTIgKyBxVGVtcDIgPj4gMSArIDIpID4+IDIpOworCisgICAgICAgIDsvLyBxVGVtcDEtcVNwMnExLTExCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgOy8vIHFTcTJwMS0xMQorICAgICAgICA7Ly8gcVNwMHEwcTEtMTIKKworCisgICAgICAgIDsvLyBxVGVtcDItcVNwMHEwcDEtMTIKKyAgICAgICAgOy8vIHFUZW1wMS1xU3EycDEtMTEKKyAgICAgICAgOy8vIHFTcTNxMi0xMworICAgICAgICA7Ly8gZFBfMm4tMzEKKyAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgIGRQXzJuLCBxU3AzcDIsICMyCisgICAgICAgIFZBRERMICAgICAgIHFTcTNxMiwgZFFfMywgZFFfMiAgICAgICAgICAKKworICAgICAgICBWU0hSICAgICAgICBxU3EycDEsICMxICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgVkhBREQgICAgICAgcVRlbXAxLCBxU3AwcTBxMSwgcVNxMnAxCisgICAgICAgIFZBRERXICAgICAgIHFUZW1wMiwgcVNwMHEwcTEsIGRRXzIgICAgICAKKworICAgICAgICA7Ly8gZEhTcTBwMS0yOAorICAgICAgICBWSEFERCAgICAgICBkSFNxMHAxLCBkUV8wLCBkUF8xICAgICAgICAgCisKKyAgICAgICAgVkJJRiAgICAgICAgZFBfMG4sIGRQXzAsIGRGaWx0CisgICAgICAgIFZCSUYgICAgICAgIGRQXzFuLCBkUF8xLCBkQXBmbGcKKworICAgICAgICBWU1JBICAgICAgICBxU3EzcTIsIHFUZW1wMiwgIzEgICAgICAgICAgCisKKyAgICAgICAgOy8vIGRRXzEtVGVtcDItMjUKKyAgICAgICAgOy8vIGRRXzAtVGVtcDItMjQKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMW4sIHFUZW1wMiwgIzIKKyAgICAgICAgVlFSU0hSTiAgICAgZFFfMG4sIHFUZW1wMSwgIzEKKworICAgICAgICA7Ly8gZFFfMHQtVGVtcDEtMjIKKyAgICAgICAgVlJIQUREICAgICAgZFFfMHQsIGRIU3EwcDEsIGRRXzEKKyAgICAgICAgVkJJRiAgICAgICAgZFFfMW4sIGRRXzEsIGRBcWZsZyAgICAgICAgIAorCisgICAgICAgIFZCSUYgICAgICAgIGRQXzJuLCBkUF8yLCBkQXBmbGcgICAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMHQsIGRBcWZsZyAgICAgICAgCisgICAgICAgIFZRUlNIUk4gICAgIGRRXzJuLCBxU3EzcTIsICMyCisgICAgICAgIFZCSUYgICAgICAgIGRRXzBuLCBkUV8wLCBkRmlsdAorICAgICAgICBWQklGICAgICAgICBkUV8ybiwgZFFfMiwgZEFxZmxnICAgICAgIAorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAKKworCisgICAgICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMGE4OWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLnMKQEAgLTAsMCArMSwzMjUgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9CaXREZWNfcy5oCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9DQVZMQ0NvZWZmVG9rZW5UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9zMngyVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfWmlnWmFnXzR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9aaWdaYWdfMngyCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworICAgICAgICAKKzsvL0RFQlVHX09OICAgIFNFVEwge1RSVUV9CisgICAgICAgIAorTEFTVF9DT0VGRiAgICAgICAgICAgICAgIEVRVSAweDIwICAgICAgICA7Ly8gRW5kIG9mIGJsb2NrIGZsYWcKK1RXT19CWVRFX0NPRUZGICAgICAgICAgICBFUVUgMHgxMAorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKKworcHBCaXRTdHJlYW0gICAgIFJOIDAKK3BPZmZzZXQgICAgICAgICBSTiAxCitwTnVtQ29lZmYgICAgICAgUk4gMgorcHBQb3NDb2VmYnVmICAgIFJOIDMKK25DICAgICAgICAgICAgICBSTiA0IDsvLyBudW1iZXIgb2YgY29lZmZzIG9yIDE3IGZvciBjaHJvbWEKK3NNYXhOdW1Db2VmZiAgICBSTiA1CisKKzsvLyBEZWNsYXJlIGlubmVyIGxvb3AgcmVnaXN0ZXJzCisKKzsvLyBMZXZlbCBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorVHJhaWxpbmdPbmVzICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitMZXZlbFN1ZmZpeCAgICAgUk4gMworU3VmZml4TGVuZ3RoICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIFJ1biBsb29wCitDb3VudCAgICAgICAgICAgUk4gMAorWmVyb3NMZWZ0ICAgICAgIFJOIDEKK3BMZXZlbCAgICAgICAgICBSTiAyCitwcFJ1blRhYmxlICAgICAgUk4gMworcFJ1biAgICAgICAgICAgIFJOIDQKK1RvdGFsQ29lZmYgICAgICBSTiA1CisKK3BWTERUYWJsZSAgICAgICBSTiA2CitTeW1ib2wgICAgICAgICAgUk4gNworVDEgICAgICAgICAgICAgIFJOIDgKK1QyICAgICAgICAgICAgICBSTiA5CitSQml0U3RyZWFtICAgICAgUk4gMTAKK1JCaXRCdWZmZXIgICAgICBSTiAxMQorUkJpdENvdW50ICAgICAgIFJOIDEyCitsciAgICAgICAgICAgICAgUk4gMTQKKworOy8vIEZpbGwgaW4gY29lZmZpY2llbnRzIGxvb3AKK3BQb3NDb2VmYnVmICAgICBSTiAwCit0ZW1wICAgICAgICAgICAgUk4gMQorcExldmVsICAgICAgICAgIFJOIDIKK3BwUG9zQ29lZmJ1ZiAgICBSTiAzCitwUnVuICAgICAgICAgICAgUk4gNAorVG90YWxDb2VmZiAgICAgIFJOIDUKK3BaaWdaYWcgICAgICAgICBSTiA2CisKK1QxICAgICAgICAgICAgICBSTiA4CitUMiAgICAgICAgICAgICAgUk4gOQorUkJpdFN0cmVhbSAgICAgIFJOIDEwCitSQml0QnVmZmVyICAgICAgUk4gMTEKK1JCaXRDb3VudCAgICAgICBSTiAxMgorQ29lZmZOdW0gICAgICAgIFJOIDE0CisKKworCisgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICBNX0FMTE9DNCBwcHBCaXRTdHJlYW0sIDQKKyAgICAgICAgTV9BTExPQzQgcHBPZmZzZXQsIDQKKyAgICAgICAgTV9BTExPQzQgcHBwUG9zQ29lZmJ1ZiwgNAorICAgICAgICBNX0FMTE9DNCBwcExldmVsLCAxNioyCisgICAgICAgIE1fQUxMT0M0IHBwUnVuLCAxNgorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyLCByMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgcE5DLCA0CisgICAgICAgIE1fQVJHICAgcFNNYXhOdW1Db2VmZiw0CisgICAgICAgIAorICAgICAgICA7Ly8gQ29kZSBzdGFydCAgICAgICAgCisgICAgICAgIE1fQkRfSU5JVDAgcHBCaXRTdHJlYW0sIHBPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudAorICAgICAgICBMRFIgICAgICAgIHBWTERUYWJsZSwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgICAgIE1fTERSICAgICAgbkMsIHBOQworICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMSBUMSwgVDIsIGxyCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBuQywgTFNMICMyXSAgOy8vIEZpbmQgVkxEIHRhYmxlICAgIAorICAgICAgICAKKyAgICAgICAgTV9CRF9JTklUMiBUMSwgVDIsIGxyCisKKyAgICAgICAgOy8vIERlY29kZSBTeW1ib2wgPSBUb3RhbENvZWZmKjQgKyBUcmFpbGluZ09uZXMKKyAgICAgICAgTV9CRF9WTEQgIFN5bWJvbCwgVDEsIFQyLCBwVkxEVGFibGUsIDQsIDIKKyAgICAKKyAgICAgICAgTU9WUyAgICBUb3RhbENvZWZmLCBTeW1ib2wsIExTUiAjMiAgICAKKyAgICAgICAgU1RSQiAgICBUb3RhbENvZWZmLCBbcE51bUNvZWZmXSAgICAKKyAgICAgICAgTV9QUklOVEYgIlRvdGFsQ29lZmY9JWRcbiIsIFRvdGFsQ29lZmYKKyAgICAgICAgQkVRLlcgICBFbmROb0Vycm9yICAgICAgICAgICAgICAgICAgOy8vIEZpbmlzaGVkIGlmIG5vIGNvZWZmaWNpZW50cworCisgICAgICAgIENNUCAgICAgU3ltYm9sLCAjMTcqNAorICAgICAgICBCR0UuVyAgIEVuZEJhZFN5bWJvbCAgICAgICAgICAgICAgICA7Ly8gRXJyb3IgaWYgYmFkIHN5bWJvbAorICAgICAgICAKKyAgICAgICAgOy8vIFNhdmUgYml0c3RyZWFtIHBvaW50ZXJzCisgICAgICAgIE1fU1RSICAgcHBCaXRTdHJlYW0sICBwcHBCaXRTdHJlYW0KKyAgICAgICAgTV9TVFIgICBwT2Zmc2V0LCAgICAgIHBwT2Zmc2V0CisgICAgICAgIE1fU1RSICAgcHBQb3NDb2VmYnVmLCBwcHBQb3NDb2VmYnVmICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIERlY29kZSBUcmFpbGluZyBPbmVzCisgICAgICAgIEFORFMgICAgVHJhaWxpbmdPbmVzLCBTeW1ib2wsICMzCisgICAgICAgIE1fQURSICAgcExldmVsLCBwcExldmVsICAgICAgICAgICAgCisgICAgICAgIE1fUFJJTlRGICJUcmFpbGluZ09uZXM9JWRcbiIsIFRyYWlsaW5nT25lcworICAgICAgICBCRVEgICAgIFRyYWlsaW5nT25lc0RvbmUgICAgCisgICAgICAgIE1PViAgICAgQ291bnQsIFRyYWlsaW5nT25lcworVHJhaWxpbmdPbmVzTG9vcCAgICAKKyAgICAgICAgTV9CRF9SRUFEOCBTeW1ib2wsIDEsIFQxCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNT1YgICAgIFQxLCAjMQorICAgICAgICBTVUIgICAgIFQxLCBUMSwgU3ltYm9sLCBMU0wgIzEKKyAgICAgICAgTV9QUklOVEYgIkxldmVsPSVkXG4iLCBUMQorICAgICAgICBTVFJIICAgIFQxLCBbcExldmVsXSwgIzIKKyAgICAgICAgQkdUICAgICBUcmFpbGluZ09uZXNMb29wCitUcmFpbGluZ09uZXNEb25lICAgIAorICAgIAorICAgICAgICA7Ly8gRGVjb2RlIGxldmVsIHZhbHVlcyAgICAKKyAgICAgICAgU1VCUyAgICBDb3VudCwgVG90YWxDb2VmZiwgVHJhaWxpbmdPbmVzICAgICA7Ly8gTnVtYmVyIG9mIGxldmVscyB0byByZWFkCisgICAgICAgIEJFUSAgICAgRGVjb2RlUnVucyAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE5vbmUgbGVmdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTdWZmaXhMZW5ndGgsICMxCisgICAgICAgIENNUCAgICAgVG90YWxDb2VmZiwgIzEwCisgICAgICAgIE1PVkxFICAgU3VmZml4TGVuZ3RoLCAjMAorICAgICAgICBDTVAgICAgIFRyYWlsaW5nT25lcywgIzMgICAgOy8vIGlmIChUcmFpbGluZ09uZXM8MykKKyAgICAgICAgTU9WTFQgICBUcmFpbGluZ09uZXMsICM0ICAgIDsvLyB0aGVuIFRyYWlsaW5nT25lcyA9ICs0CisgICAgICAgIE1PVkdFICAgVHJhaWxpbmdPbmVzLCAjMiAgICA7Ly8gZWxzZSBUcmFpbGluZ09uZXMgPSArMgorICAgICAgICBNT1ZHRSAgIFN1ZmZpeExlbmd0aCwgIzAgICAgOy8vICAgICAgU3VmZml4TGVuZ3RoID0gMAorICAgICAgICAKK0xldmVsTG9vcAorICAgICAgICBNX0JEX0NMWjE2IFN5bWJvbCwgVDEsIFQyICAgOy8vIFN5bWJvbD1MZXZlbFByZWZpeAorICAgICAgICBDTVAgICAgIFN5bWJvbCwjMTYKKyAgICAgICAgQkdFICAgICBFbmRCYWRTeW1ib2wKKyAgICAgICAgCisgICAgICAgIE1PVlMgICAgbHIsIFN1ZmZpeExlbmd0aCAgICA7Ly8gaWYgTGV2ZWxTdWZmaXhTaXplPT0wCisgICAgICAgIFRFUUVRICAgU3ltYm9sLCAjMTQgICAgICAgICA7Ly8gICBhbmQgIExldmVsUHJlZml4PT0xNAorICAgICAgICBNT1ZFUSAgIGxyLCAjNCAgICAgICAgICAgICAgOy8vICAgdGhlbiBMZXZlbFN1ZmZpeFNpemU9NAorICAgICAgICBURVEgICAgIFN5bWJvbCwgIzE1ICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MTUKKyAgICAgICAgTU9WRVEgICBsciwgIzEyICAgICAgICAgICAgIDsvLyAgIHRoZW4gTGV2ZWxTdWZmaXhTaXplPTEyCisgICAgICAgIAorICAgICAgICBURVFFUSAgIFN1ZmZpeExlbmd0aCwjMAorICAgICAgICBBRERFUSAgIFN5bWJvbCxTeW1ib2wsIzE1CisgICAgICAgIAorICAgICAgICBURVEgICAgIGxyLCAjMCAgICAgICAgICAgICAgOy8vIGlmIExldmVsU3VmZml4U2l6ZT09MAorICAgICAgICBCRVEgICAgIExldmVsQ29kZVJlYWQgICAgICAgOy8vIExldmVsQ29kZSA9IExldmVsUHJlZml4CisgICAgICAgIAorICAgICAgICBNX0JEX1ZSRUFEMTYgTGV2ZWxTdWZmaXgsIGxyLCBUMSwgVDIgIDsvLyBSZWFkIExldmVsIFN1ZmZpeAorICAgICAgICAKKyAgICAgICAgTU9WICAgICBTeW1ib2wsIFN5bWJvbCwgTFNMIFN1ZmZpeExlbmd0aAorICAgICAgICBBREQgICAgIFN5bWJvbCwgTGV2ZWxTdWZmaXgsIFN5bWJvbAorICAgICAgICAgICAgIAorTGV2ZWxDb2RlUmVhZCAgICAgICAgCisgICAgICAgIDsvLyBTeW1ib2wgPSBMZXZlbENvZGUKKyAgICAgICAgQUREICAgICBTeW1ib2wsIFN5bWJvbCwgVHJhaWxpbmdPbmVzIDsvLyArNCBpZiBsZXZlbCBjYW5ub3QgYmUgKy8tMSwgKzIgby93CisgICAgICAgIE1PViAgICAgVHJhaWxpbmdPbmVzLCAjMgorICAgICAgICBNT1ZTICAgIFQxLCBTeW1ib2wsIExTUiAjMQorICAgICAgICBSU0JDUyAgIFQxLCBUMSwgIzAgICAgICAgICAgICAgICAgICA7Ly8gSWYgU3ltYm9sIG9kZCB0aGVuIG5lZ2F0ZQorICAgICAgICBNX1BSSU5URiAiTGV2ZWw9JWRcbiIsIFQxCisgICAgICAgIFNUUkggICAgVDEsIFtwTGV2ZWxdLCAjMiAgICAgICAgICAgIDsvLyBTdG9yZSBsZXZlbC4KKyAgICAgICAgCisgICAgICAgIExEUiAgICAgVDIsID1hcm1WQ000UDEwX1N1ZmZpeFRvTGV2ZWwKKyAgICAgICAgTERSU0IgICBUMSwgW1QyLCBTdWZmaXhMZW5ndGhdICAgICAgOy8vIEZpbmQgaW5jcmVtZW50IGxldmVsICAgICAgICAKKyAgICAgICAgVEVRICAgICBTdWZmaXhMZW5ndGgsICMwCisgICAgICAgIE1PVkVRICAgU3VmZml4TGVuZ3RoLCAjMQorICAgICAgICBDTVAgICAgIFN5bWJvbCwgVDEKKyAgICAgICAgQUREQ1MgICBTdWZmaXhMZW5ndGgsIFN1ZmZpeExlbmd0aCwgIzEgICAgICAgIAorICAgICAgICBTVUJTICAgIENvdW50LCBDb3VudCwgIzEgICAgICAgIAorICAgICAgICBCR1QgICAgIExldmVsTG9vcAorICAgICAgICAKK0RlY29kZVJ1bnMgICAgICAgIAorICAgICAgICA7Ly8gRmluZCBudW1iZXIgb2YgemVyb3MKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBTVUIgICAgIENvdW50LCBUb3RhbENvZWZmLCAjMSAgICAgICA7Ly8gTnVtYmVyIG9mIHJ1bnMgZXhjbHVkaW5nIGxhc3QKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFQxLCBUb3RhbENvZWZmICAgOy8vIE1heGltdW0gbnVtYmVyIG9mIHplcm9zIHRoZXJlIGNvdWxkIGJlCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WICAgICBDb2VmZk51bSxUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgQ29lZmZOdW0sQ29lZmZOdW0sIzEKKyAgICAgICAgQkVRICAgICBOb1plcm9zTGVmdAorICAgICAgICAKKyAgICAgICAgOy8vIFVucGFjayBudW1iZXIgb2YgemVyb3MgZnJvbSBiaXRzdHJlYW0KKyAgICAgICAgVEVRICAgICBUMSwgIzQgICAgICAgIAorICAgICAgICBMRFJFUSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvczJ4MlRhYmxlcy00KQorICAgICAgICBMRFJORSAgIHBWTERUYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDVG90YWxaZXJvVGFibGVzLTQpCisgICAgICAgIExEUiAgICAgcFZMRFRhYmxlLCBbcFZMRFRhYmxlLCBUb3RhbENvZWZmLCBMU0wgIzJdCisgICAgICAgIAorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgNCwgMiA7Ly8gU3ltYm9sID0gWmVyb3NMZWZ0CisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNgorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbAorCisgICAgICAgIExEUiAgICAgcHBSdW5UYWJsZSwgPShhcm1WQ000UDEwX0NBVkxDUnVuQmVmb3JlVGFibGVzLTQpCisgICAgICAgIE1fQURSICAgcFJ1biwgcHBSdW4KKyAgICAgICAgTU9WUyAgICBaZXJvc0xlZnQsIFN5bWJvbAorCisgICAgICAgIEFERCAgICAgQ29lZmZOdW0sQ29lZmZOdW0sWmVyb3NMZWZ0ICAgICAgICAKKworICAgICAgICBCRVEgICAgIE5vWmVyb3NMZWZ0CisgICAgICAgIAorICAgICAgICA7Ly8gRGVjb2RlIHJ1bnMgd2hpbGUgemVyb3MgYXJlIGxlZnQgYW5kIG1vcmUgdGhhbiBvbmUgY29lZmZpY2llbnQKK1J1bkxvb3AgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBMRFIgICAgIHBWTERUYWJsZSwgW3BwUnVuVGFibGUsIFplcm9zTGVmdCwgTFNMIzJdCisgICAgICAgIEJMVCAgICAgTGFzdFJ1bgorICAgICAgICBNX0JEX1ZMRCAgU3ltYm9sLCBUMSwgVDIsIHBWTERUYWJsZSwgMywgMiA7Ly8gU3ltYm9sID0gUnVuCisgICAgICAgIENNUCAgICAgU3ltYm9sLCMxNSAgICAgICAgIAorICAgICAgICBCR0UgICAgIEVuZEJhZFN5bWJvbCAgICAgICAgCisKKyAgICAgICAgU1VCUyAgICBaZXJvc0xlZnQsIFplcm9zTGVmdCwgU3ltYm9sCisgICAgICAgIE1fUFJJTlRGICJSdW49JWRcbiIsIFN5bWJvbAorICAgICAgICBTVFJCICAgIFN5bWJvbCwgW3BSdW5dLCAjMQorICAgICAgICBCR1QgICAgIFJ1bkxvb3AKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWNvZGUgcnVucyB3aGlsZSBubyB6ZXJvcyBhcmUgbGVmdAorTm9aZXJvc0xlZnQgCisgICAgICAgIFNVQlMgICAgQ291bnQsIENvdW50LCAjMQorICAgICAgICBNX1BSSU5URiAiUnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSR0VCICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEKKyAgICAgICAgQkdUICAgICBOb1plcm9zTGVmdAorCitMYXN0UnVuICAgICAgICAKKyAgICAgICAgOy8vIEZpbmFsIHJ1biBsZW5ndGggaXMgcmVtYWluaW5nIHplcm9zCisgICAgICAgIE1fUFJJTlRGICJMYXN0UnVuPSVkXG4iLCBaZXJvc0xlZnQKKyAgICAgICAgU1RSQiAgICBaZXJvc0xlZnQsIFtwUnVuXSwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGNvZWZmaWNpZW50cyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgTV9MRFIgICBUMSwgcFNNYXhOdW1Db2VmZiAgICAgICAgICAgICAgICAgICAgOy8vIHNNYXhOdW1Db2VmZgorICAgICAgICBURVEgICAgIFQxLCAjMTUKKyAgICAgICAgQURERVEgICBDb2VmZk51bSxDb2VmZk51bSwjMQorICAgICAgICAKKworICAgICAgICBTVUIgICAgIHBSdW4scFJ1bixUb3RhbENvZWZmCisgICAgICAgIFNVQiAgICAgcExldmVsLHBMZXZlbCxUb3RhbENvZWZmICAKKyAgICAgICAgU1VCICAgICBwTGV2ZWwscExldmVsLFRvdGFsQ29lZmYgICAKKworICAgICAgICBNX0xEUiAgIHBwUG9zQ29lZmJ1ZiwgcHBwUG9zQ29lZmJ1ZgorICAgICAgICBMRFIgICAgIHBQb3NDb2VmYnVmLCBbcHBQb3NDb2VmYnVmXQorICAgICAgICBURVEgICAgIFQxLCAjNAorICAgICAgICBMRFJFUSAgIHBaaWdaYWcsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICAgICAgTERSTkUgICBwWmlnWmFnLCA9YXJtVkNNNFAxMF9aaWdaYWdfNHg0CisKKyAgICAgICAgCisgICAgICAgIAorT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgTERSQiAgICBUMiwgW3BSdW5dLCMxCisgICAgICAgIExEUkIgICAgVDEsIFtwWmlnWmFnLCBDb2VmZk51bV0KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sICMxICAgICAgOy8vIFNraXAgTm9uIHplcm8KKyAgICAgICAgU1VCICAgICBDb2VmZk51bSwgQ29lZmZOdW0sIFQyICAgICAgOy8vIFNraXAgWmVybyBydW4KKyAgICAgICAgCisgICAgICAgIExEUlNIICAgVDIsIFtwTGV2ZWxdLCMyCisgICAgICAgIAorICAgICAgICBTVUJTICAgIFRvdGFsQ29lZmYsIFRvdGFsQ29lZmYsICMxICAgICAgIAorICAgICAgICBPUlJFUSAgIFQxLCBUMSwgI0xBU1RfQ09FRkYKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgdGVtcCwgVDIsICMxMjgKKyAgICAgICAgQ01QICAgICB0ZW1wLCAjMjU2CisgICAgICAgIE9SUkNTICAgVDEsIFQxLCAjVFdPX0JZVEVfQ09FRkYKKworICAgICAgICAKKyAgICAgICAgVEVRICAgICBUb3RhbENvZWZmLCAjMCAgICAgICAgICAgICAgOy8vIFByZXNlcnZlcyBjYXJyeSAgICAgICAgCisgICAgICAgIAorICAgICAgICBNX1BSSU5URiAiT3V0cHV0PSUwMnggJTA0eFxuIiwgVDEsIFQyCisgICAgICAgIFNUUkIgICAgVDEsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIFNUUkIgICAgVDIsIFtwUG9zQ29lZmJ1Zl0sICMxCisgICAgICAgIE1PViAgICAgVDIsIFQyLCBMU1IgIzgKKyAgICAgICAgU1RSQ1NCICBUMiwgW3BQb3NDb2VmYnVmXSwgIzEgICAgICAgICAgICAgICAgCisgICAgICAgIEJORSAgICAgT3V0cHV0TG9vcAorICAgICAgICAKKyAgICAgICAgOy8vIEZpbmlzaGVkCisgICAgICAgIFNUUiAgICAgcFBvc0NvZWZidWYsIFtwcFBvc0NvZWZidWZdCisgICAgICAgIE1fTERSICAgcHBCaXRTdHJlYW0sIHBwcEJpdFN0cmVhbQorICAgICAgICBNX0xEUiAgIHBPZmZzZXQsIHBwT2Zmc2V0CisgICAgICAgIEIgICAgICAgRW5kTm9FcnJvcgorICAgICAgICAgICAgCitFbmRCYWRTeW1ib2wKKyAgICAgICAgTU9WICAgICByMCwgI09NWF9TdHNfRXJyCisgICAgICAgIEIgICAgICAgRW5kICAgIAorICAgICAgICAKK0VuZE5vRXJyb3IKKyAgICAgICAgOy8vIEZpbmlzaGVkIHJlYWRpbmcgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0ZJTkkgcHBCaXRTdHJlYW0sIHBPZmZzZXQKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIE1PViAgICAgcjAsICNPTVhfU3RzX05vRXJyICAgIAorRW5kCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzYxNjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsMTIzIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIAorCisgICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1Bvc1RvVkNvbDJ4MgorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfVk1hdHJpeCAKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAgICAKKyAgICAgICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgICAgCisgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sNHg0CisgICAgICAgICBEQ0IgIDAsIDIsIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMSwgMiwgMQorICAgICAgICAgRENCICAwLCAyLCAwLCAyCisgICAgICAgICBEQ0IgIDIsIDEsIDIsIDEKKworCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfUG9zVG9WQ29sMngyCisgICAgICAgICBEQ0IgIDAsIDIKKyAgICAgICAgIERDQiAgMiwgMQorCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9WTWF0cml4CisgICAgICAgICBEQ0IgIDEwLCAxNiwgMTMKKyAgICAgICAgIERDQiAgMTEsIDE4LCAxNAorICAgICAgICAgRENCICAxMywgMjAsIDE2CisgICAgICAgICBEQ0IgIDE0LCAyMywgMTgKKyAgICAgICAgIERDQiAgMTYsIDI1LCAyMAorICAgICAgICAgRENCICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICAgICAgIERDQiAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICBEQ0IgIDEsICAxLCAgMSwgIDEsICAxLCAgMQorICAgICAgICAgRENCICAyLCAgMiwgIDIsICAyLCAgMiwgIDIKKyAgICAgICAgIERDQiAgMywgIDMsICAzLCAgMywgIDMsICAzCisgICAgICAgICBEQ0IgIDQsICA0LCAgNCwgIDQsICA0LCAgNAorICAgICAgICAgRENCICA1LCAgNSwgIDUsICA1LCAgNSwgIDUKKyAgICAgICAgIERDQiAgNiwgIDYsICA2LCAgNiwgIDYsICA2CisgICAgICAgICBEQ0IgIDcsICA3LCAgNywgIDcsICA3LCAgNworICAgICAgICAgRENCICA4LCAgOCwgIDgsICA4LCAgOCwgIDgKKyAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAgTV9UQUJMRSBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgICAgICBEQ0IgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgICAgICAgRENCIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAgICAgIERDQiAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgICBEQ0IgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAgICAgIERDQiAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgICAgICAgRENCIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIGludmlkdWFsIGJ5dGUgdmFsdWVzIHN0b3JlZCBhcworOy8vIGhhbGZ3b3Jkcy4gVGhpcyBhdm9pZHMgdW5wYWNraW5nIGluc2lkZSB0aGUgZnVuY3Rpb24KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgICBNX1RBQkxFIGFybVZDTTRQMTBfVk1hdHJpeFUxNgorICAgICAgICAgRENXIDEwLCAxNiwgMTMgCisgICAgICAgICBEQ1cgMTEsIDE4LCAxNAorICAgICAgICAgRENXIDEzLCAyMCwgMTYKKyAgICAgICAgIERDVyAxNCwgMjMsIDE4CisgICAgICAgICBEQ1cgMTYsIDI1LCAyMAorICAgICAgICAgRENXIDE4LCAyOSwgMjMgCisgICAgICAgICAKKyAgICBFTkRJRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vQVJNMTEzNkpTICAgICAgICAgICAgCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgCisgICAgICAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU5MTJkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucwpAQCAtMCwwICsxLDIzNiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQWxpZ25fdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisKKyAgICBJRiBBUk0xMTM2SlMgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gOAoraUhlaWdodCAgICAgICAgIFJOIDkKKworOy8vIERlY2xhcmUgaW5uZXIgbG9vcCByZWdpc3RlcnMKK3ggICAgICAgICAgICAgICBSTiA3Cit4MCAgICAgICAgICAgICAgUk4gNworeDEgICAgICAgICAgICAgIFJOIDEwCit4MiAgICAgICAgICAgICAgUk4gMTEKK1NjcmF0Y2ggICAgICAgICBSTiAxMgorCis7Ly8gRnVuY3Rpb246IAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorOy8vCis7Ly8gSW1wbGVtZW50cyBjb3B5IGZyb20gYW4gYXJiaXRyYXJ5IGFsaWduZWQgc291cmNlIG1lbW9yeSBsb2NhdGlvbiAocFNyYykgdG8gYSA0IGJ5dGUgYWxpZ25lZAorOy8vIGRlc3RpbmF0aW9uIHBvaW50ZWQgYnkgKHBEc3QpIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24uCis7Ly8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjb3B5IDkgYnl0ZXMgaW4gaG9yaXpvbnRhbCBkaXJlY3Rpb24uIAorOy8vCis7Ly8gUmVnaXN0ZXJzIHVzZWQgYXMgaW5wdXQgZm9yIHRoaXMgZnVuY3Rpb24KKzsvLyByMCxyMSxyOCxyOSB3aGVyZSByOCBjb250YWluaW5ncyBhbGlnbmVkIG1lbW9yeSBwb2ludGVyIGFuZCByOSBubyByb3dzIHRvIGNvcHkKKzsvLworOy8vIFJlZ2lzdGVycyBwcmVzZXJ2ZWQgZm9yIHRvcCBsZXZlbCBmdW5jdGlvbgorOy8vIHIyLHIzLHI0LHI1LHI2Cis7Ly8KKzsvLyBSZWdpc3RlcnMgbW9kaWZpZWQgYnkgdGhlIGZ1bmN0aW9uCis7Ly8gcjcscjgscjkscjEwLHIxMSxyMTIKKzsvLworOy8vIE91dHB1dCByZWdpc3RlcnMKKzsvLyByMCAtIHBvaW50ZXIgdG8gdGhlIG5ldyBhbGlnbmVkIGxvY2F0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBwU3JjCis7Ly8gcjEgLSBzdGVwIHNpemUgdG8gdGhpcyBhbGlnbmVkIGxvY2F0aW9uCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBDb3B5IHBEc3QgdG8gc2NyYXRjaAorICAgICAgICBNT1YgICAgIFNjcmF0Y2gsIHBEc3QKKworU3RhcnRBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMworICAgICAgICAKKyAgICAgICAgTV9TV0lUQ0ggeAorICAgICAgICBNX0NBU0UgICBDb3B5MHRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5M3RvQWxpZ25lZAorICAgICAgICBNX0VORFNXSVRDSAorCitDb3B5MHRvQWxpZ25lZCAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgU1RNICAgICBwRHN0ISwge3gwLCB4MSwgeDJ9ICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9BbGlnbmVkCisgICAgICAgIEIgICAgICAgQ29weUVuZCAgCisgICAgICAKK0NvcHkxdG9BbGlnbmVkICAgICAgICAKKyAgICAgICAgTERNICAgICBwU3JjLCB7eDAsIHgxLCB4Mn0KKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMQorICAgICAgICBBREQgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBNT1YgICAgIHgwLCB4MCwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgxLCB4MSwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMyNAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlFbmQgIAorCitDb3B5MnRvQWxpZ25lZCAgICAgICAgCisgICAgICAgIExETSAgICAgcFNyYywge3gwLCB4MSwgeDJ9CisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgQUREICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICMxNgorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBTVE0gICAgIHBEc3QhLCB7eDAsIHgxLCB4Mn0gICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgYWxpZ25lZCBvdXRwdXQgcm93CisgICAgICAgIEJHVCAgICAgQ29weTJ0b0FsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5RW5kICAKKworQ29weTN0b0FsaWduZWQgICAgICAgIAorICAgICAgICBMRE0gICAgIHBTcmMsIHt4MCwgeDEsIHgyfQorICAgICAgICBTVUJTICAgIGlIZWlnaHQsIGlIZWlnaHQsICMxCisgICAgICAgIEFERCAgICAgcFNyYywgcFNyYywgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDEsIHgxLCB4MiwgTFNMICM4CisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIFNUTSAgICAgcERzdCEsIHt4MCwgeDEsIHgyfSAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvQWxpZ25lZAorCitDb3B5RW5kICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcFNyYywgU2NyYXRjaAorICAgICAgICBNT1YgICAgIHNyY1N0ZXAsICMxMgorCisgICAgICAgIE1fRU5ECisgICAgCisKKzsvLyBGdW5jdGlvbjoKKzsvLyAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KSBmb3IgdmVydGljYWwgaW50ZXJwb2xhdGlvbi4KKzsvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNvcHkgNCBieXRlcyBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiAKKzsvLworOy8vIFJlZ2lzdGVycyB1c2VkIGFzIGlucHV0IGZvciB0aGlzIGZ1bmN0aW9uCis7Ly8gcjAscjEscjgscjkgd2hlcmUgcjggY29udGFpbmluZ3MgYWxpZ25lZCBtZW1vcnkgcG9pbnRlciBhbmQgcjkgbm8gb2Ygcm93cyB0byBjb3B5Cis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByMixyMyxyNCxyNSxyNgorOy8vCis7Ly8gUmVnaXN0ZXJzIG1vZGlmaWVkIGJ5IHRoZSBmdW5jdGlvbgorOy8vIHI3LHI4LHI5LHIxMCxyMTEscjEyCis7Ly8KKzsvLyBPdXRwdXQgcmVnaXN0ZXJzCis7Ly8gcjAgLSBwb2ludGVyIHRvIHRoZSBuZXcgYWxpZ25lZCBsb2NhdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgYXMgcFNyYworOy8vIHIxIC0gc3RlcCBzaXplIHRvIHRoaXMgYWxpZ25lZCBsb2NhdGlvbgorCisgICAgICAgIDsvLyBGdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZSAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gQ29weSBwU3JjIHRvIHN0YWNrCitTdGFydFZBbGlnbmVkU3RhY2tDb3B5CisgICAgICAgIEFORCAgICAgeCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1fU1dJVENIIHgKKyAgICAgICAgTV9DQVNFICAgQ29weTB0b1ZBbGlnbmVkCisgICAgICAgIE1fQ0FTRSAgIENvcHkxdG9WQWxpZ25lZAorICAgICAgICBNX0NBU0UgICBDb3B5MnRvVkFsaWduZWQKKyAgICAgICAgTV9DQVNFICAgQ29weTN0b1ZBbGlnbmVkCisgICAgICAgIE1fRU5EU1dJVENICisgICAgICAgIAorQ29weTB0b1ZBbGlnbmVkICAKKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEKKyAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKworICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkwdG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKyAgICAgIAorQ29weTF0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDEsIHgwLCBMU1IgIzgKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5MXRvVkFsaWduZWQKKyAgICAgICAgQiAgICAgICBDb3B5VkVuZCAgCisKK0NvcHkydG9WQWxpZ25lZCAgICAgICAgCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzEgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE9uZSBjeWNsZSBzdGFsbAorCisgICAgICAgIE1PViAgICAgeDEsIHgxLCBMU0wgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgxLCB4MCwgTFNSICMxNgorICAgICAgICBTVFIgICAgIHgwLCBbcERzdF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIGFsaWduZWQgb3V0cHV0IHJvdworICAgICAgICBCR1QgICAgIENvcHkydG9WQWxpZ25lZAorICAgICAgICBCICAgICAgIENvcHlWRW5kICAKKworQ29weTN0b1ZBbGlnbmVkICAgICAgICAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMSAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisKKyAgICAgICAgTU9WICAgICB4MSwgeDEsIExTTCAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MSwgeDAsIExTUiAjMjQKKyAgICAgICAgU1RSICAgICB4MCwgW3BEc3RdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBhbGlnbmVkIG91dHB1dCByb3cKKyAgICAgICAgQkdUICAgICBDb3B5M3RvVkFsaWduZWQKKworQ29weVZFbmQgIAorCisgICAgICAgIFNVQiAgICAgcFNyYywgcERzdCwgIzI4CisgICAgICAgIE1PViAgICAgc3JjU3RlcCwgIzQKKworICAgICAgICBNX0VORAorCisKKyAgICBFTkRJRgorCisgICAgRU5ECisgICAgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyNzU4OTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwxNDkgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworOy8vIEZ1bmN0aW9uOgorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSAKKzsvLworOy8vIEltcGxlbWVudHMgY29weSBmcm9tIGFuIGFyYml0cmFyeSBhbGlnbmVkIHNvdXJjZSBtZW1vcnkgbG9jYXRpb24gKHBTcmMpIHRvIGFuIGFsaWduZWQKKzsvLyBkZXN0aW5hdGlvbiBwb2ludGVkIGJ5IChwRHN0KQorOy8vCis7Ly8gUmVnaXN0ZXJzIHByZXNlcnZlZCBmb3IgdG9wIGxldmVsIGZ1bmN0aW9uCis7Ly8gcjEscjMscjQscjUscjYscjcscjEwLHIxMSxyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByMCxyMixyOCxyOSxyMTIKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIEFSTTExMzZKUworCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorICAgICAgICAKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgb3RoZXIgaW50ZXJtZWRpYXRlIHJlZ2lzdGVycworeDAgICAgICAgICAgICAgIFJOIDQKK3gxICAgICAgICAgICAgICBSTiA1Cit4MiAgICAgICAgICAgICAgUk4gOAoreDMgICAgICAgICAgICAgIFJOIDkKK1RlbXAgICAgICAgICAgICBSTiAxMgorCisgICAgSUYgQVJNMTEzNkpTCisKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZSwgcjYKKworQ29weTR4NFN0YXJ0CisgICAgICAgIDsvLyBEbyBDb3B5IGFuZCBicmFuY2ggdG8gRW5kT2ZJbnRlcnBvbGF0aW9uCisgICAgICAgIEFORCAgICAgVGVtcCwgcFNyYywgIzMKKyAgICAgICAgQklDICAgICBwU3JjLCBwU3JjLCAjMyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgIE1fU1dJVENIIFRlbXAKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24wCisgICAgICAgIE1fQ0FTRSAgQ29weTR4NEFsaWduMQorICAgICAgICBNX0NBU0UgIENvcHk0eDRBbGlnbjIKKyAgICAgICAgTV9DQVNFICBDb3B5NHg0QWxpZ24zCisgICAgICAgIE1fRU5EU1dJVENICisKK0NvcHk0eDRBbGlnbjAKKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fTERSICAgeDEsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1fU1RSICAgeDEsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNX0xEUiAgIHgzLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1fU1RSICAgeDMsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorCitDb3B5NHg0QWxpZ24xCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICM4CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICMyNAorICAgICAgICBMRFIgICAgIHgxLCBbcFNyYywgIzRdCisgICAgICAgIE1fTERSICAgeDAsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjOAorICAgICAgICBPUlIgICAgIHgwLCB4MCwgeDEsIExTTCAjMjQKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzgKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzI0CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBCICAgICAgIENvcHk0eDRFbmQgIAorICAgICAgCitDb3B5NHg0QWxpZ24yCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzE2CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICMxNgorICAgICAgICBNX1NUUiAgIHgwLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgTU9WICAgICB4MiwgeDIsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MiwgeDIsIHgzLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcCAgICAgICAgCisKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMTYKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzE2CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMxNgorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjMTYKKyAgICAgICAgTV9TVFIgICB4MiwgW3BEc3RdLCBkc3RTdGVwICAgICAgICAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEFsaWduMyAKKyAgICAgICAgTERSICAgICB4MSwgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgwLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTERSICAgICB4MywgW3BTcmMsICM0XQorICAgICAgICBNX0xEUiAgIHgyLCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgTU9WICAgICB4MCwgeDAsIExTUiAjMjQKKyAgICAgICAgT1JSICAgICB4MCwgeDAsIHgxLCBMU0wgIzgKKyAgICAgICAgTV9TVFIgICB4MCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIE1PViAgICAgeDIsIHgyLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDIsIHgyLCB4MywgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDIsIFtwRHN0XSwgZHN0U3RlcAorCisgICAgICAgIExEUiAgICAgeDEsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIExEUiAgICAgeDMsIFtwU3JjLCAjNF0KKyAgICAgICAgTV9MRFIgICB4MiwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIE1PViAgICAgeDAsIHgwLCBMU1IgIzI0CisgICAgICAgIE9SUiAgICAgeDAsIHgwLCB4MSwgTFNMICM4CisgICAgICAgIE1fU1RSICAgeDAsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBNT1YgICAgIHgyLCB4MiwgTFNSICMyNAorICAgICAgICBPUlIgICAgIHgyLCB4MiwgeDMsIExTTCAjOAorICAgICAgICBNX1NUUiAgIHgyLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgQiAgICAgICBDb3B5NHg0RW5kICAKKworQ29weTR4NEVuZAorICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKworICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTVhMzlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTc4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9EaWFnQ29weV91bnNhZmVfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCisKKzsvLyBGdW5jdGlvbnM6IAorOy8vICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmUgYW5kCis7Ly8gICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSAKKzsvLworOy8vIEltcGxlbWVudHMgcmUtYXJyYW5nZW1lbnQgb2YgZGF0YSBmcm9tIHRlbXBvcmFyeSBidWZmZXIgdG8gYSBidWZmZXIgcG9pbnRlZCBieSBwQnVmLgorOy8vIFRoaXMgd2lsbCBkbyB0aGUgY29udmVydGlvbiBvZiBkYXRhIGZyb20gMTYgYml0IHRvIDggYml0IGFuZCBpdCBhbHNvCis7Ly8gcmVtb3ZlIG9mZnNldCBhbmQgY2hlY2sgZm9yIHNhdHVyYXRpb24uCis7Ly8KKzsvLyBSZWdpc3RlcnMgdXNlZCBhcyBpbnB1dCBmb3IgdGhpcyBmdW5jdGlvbgorOy8vIHIwLHIxLHI3IHdoZXJlIHIwIGlzIGlucHV0IHBvaW50ZXIgYW5kIHIyIGl0cyBzdGVwIHNpemUsIHI3IGlzIG91dHB1dCBwb2ludGVyCis7Ly8KKzsvLyBSZWdpc3RlcnMgcHJlc2VydmVkIGZvciB0b3AgbGV2ZWwgZnVuY3Rpb24KKzsvLyByNCxyNSxyNixyOCxyOSxyMTQKKzsvLworOy8vIFJlZ2lzdGVycyBtb2RpZmllZCBieSB0aGUgZnVuY3Rpb24KKzsvLyByNyxyMTAscjExLHIxMgorOy8vCis7Ly8gT3V0cHV0IHJlZ2lzdGVycworOy8vIHIwIC0gcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbG9jYXRpb24KKzsvLyByMSAtIHN0ZXAgc2l6ZSB0byB0aGlzIGRlc3RpbmF0aW9uIGxvY2F0aW9uCisKKworREVCVUdfT04gICAgU0VUTCB7RkFMU0V9CisgICAgICAgIAorTUFTSyAgICAgICAgICAgIEVRVSAweDgwODA4MDgwICA7Ly8gTWFzayBpcyB1c2VkIHRvIGltcGxlbWVudCAoYStiKzEpLzIKKworOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCisKK3BTcmMwICAgICAgICAgICBSTiAwCitzcmNTdGVwMCAgICAgICAgUk4gMQorCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitUZW1wMSAgICAgICAgICAgUk4gNAorVGVtcDIgICAgICAgICAgIFJOIDUKK1RlbXAzICAgICAgICAgICBSTiAxMAorVGVtcDQgICAgICAgICAgIFJOIDExCitwQnVmICAgICAgICAgICAgUk4gNworcjB4MGZlMDBmZTAgICAgIFJOIDYKK3IweDAwZmYwMGZmICAgICBSTiAxMgorQ291bnQgICAgICAgICAgIFJOIDE0CitWYWx1ZUEwICAgICAgICAgUk4gMTAKK1ZhbHVlQTEgICAgICAgICBSTiAxMQorCisgICAgSUYgQVJNMTEzNkpTCisKKworICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlLCByNgorCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAKKyAgICAgICAgTU9WICAgICAgICAgQ291bnQsICM0ICAgCisgICAgICAgIExEUiAgICAgICAgIHIweDBmZTAwZmUwLCA9MHgwZmUwMGZlMAorICAgICAgICBMRFIgICAgICAgICByMHgwMGZmMDBmZiwgPTB4MDBmZjAwZmYgICAgICAgIAorTG9vcFN0YXJ0MQorICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAgICAgICAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wNCwgVGVtcDQsIHIweDBmZTAwZmUwICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDMsIFRlbXAzLCByMHgwZmUwMGZlMCAgICAgICAgICAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAyLCBUZW1wMiwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMSwgVGVtcDEsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgorICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDQsIHIweDAwZmYwMGZmLCBUZW1wNCwgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAzLCByMHgwMGZmMDBmZiwgVGVtcDMsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMiwgcjB4MDBmZjAwZmYsIFRlbXAyLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDEsIHIweDAwZmYwMGZmLCBUZW1wMSwgTFNSICM1ICAgICAgICAgCisgICAgICAgIE9SUiAgICAgICAgIFZhbHVlQTEsIFRlbXAzLCBUZW1wNCwgTFNMICM4ICAgICAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgICAgICAKKyAgICAgICAgU1VCUyAgICAgICAgQ291bnQsIENvdW50LCAjMSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgU1RSRCAgICAgICAgVmFsdWVBMCwgW3BCdWZdLCAjOCAKKyAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0MQorRW5kMQorICAgICAgICBTVUIgICAgICAgIHBTcmMwLCBwQnVmLCAjMzIKKyAgICAgICAgTU9WICAgICAgICBzcmNTdGVwMCwgIzgKKworICAgICAgICBNX0VORAorCisKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZSwgcjYKKyAgICAgICAgCisgICAgICAgIDsvLyBDb2RlIHN0YXJ0ICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgcjB4MGZlMDBmZTAsID0weDBmZTAwZmUwCisgICAgICAgIExEUiAgICAgICAgIHIweDAwZmYwMGZmLCA9MHgwMGZmMDBmZgorICAgICAgICBNT1YgICAgICAgICBDb3VudCwgIzIKKworTG9vcFN0YXJ0ICAgIAorICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKKyAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgorICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQorCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAorICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KKyAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIy00ICAKKworICAgICAgICBMRFIgICAgICAgICBUZW1wNCwgW3BTcmMwLCAjMTJdCisgICAgICAgIExEUiAgICAgICAgIFRlbXAzLCBbcFNyYzAsICM4XSAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIFRlbXAyLCBbcFNyYzAsICM0XQorICAgICAgICBNX0xEUiAgICAgICBUZW1wMSwgW3BTcmMwXSwgc3JjU3RlcDAKKyAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXA0LCBUZW1wNCwgcjB4MGZlMDBmZTAgICAgICAgIAorICAgICAgICBVUVNVQjE2ICAgICBUZW1wMywgVGVtcDMsIHIweDBmZTAwZmUwICAgICAgICAgICAgICAgICAKKyAgICAgICAgVVFTVUIxNiAgICAgVGVtcDIsIFRlbXAyLCByMHgwZmUwMGZlMCAgICAgICAgCisgICAgICAgIFVRU1VCMTYgICAgIFRlbXAxLCBUZW1wMSwgcjB4MGZlMDBmZTAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDQsICMxMywgVGVtcDQKKyAgICAgICAgVVNBVDE2ICAgICAgVGVtcDMsICMxMywgVGVtcDMgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBVU0FUMTYgICAgICBUZW1wMiwgIzEzLCBUZW1wMgorICAgICAgICBVU0FUMTYgICAgICBUZW1wMSwgIzEzLCBUZW1wMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wNCwgcjB4MDBmZjAwZmYsIFRlbXA0LCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgQU5EICAgICAgICAgVGVtcDMsIHIweDAwZmYwMGZmLCBUZW1wMywgTFNSICM1ICAgICAgICAgCisgICAgICAgIEFORCAgICAgICAgIFRlbXAyLCByMHgwMGZmMDBmZiwgVGVtcDIsIExTUiAjNSAgICAgICAgIAorICAgICAgICBBTkQgICAgICAgICBUZW1wMSwgcjB4MDBmZjAwZmYsIFRlbXAxLCBMU1IgIzUgICAgICAgICAKKyAgICAgICAgT1JSICAgICAgICAgVmFsdWVBMSwgVGVtcDMsIFRlbXA0LCBMU0wgIzggICAgICAgIDsvLyBbZDIgYzIgZDAgYzBdICAgICAgICAgICAgIAorICAgICAgICBPUlIgICAgICAgICBWYWx1ZUEwLCBUZW1wMSwgVGVtcDIsIExTTCAjOCAgICAgICAgOy8vIFtiMiBhMiBiMCBhMF0gICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFBLSEJUICAgICAgIFRlbXAxLCBWYWx1ZUEwLCBWYWx1ZUExLCBMU0wgIzE2ICAgICA7Ly8gW2QwIGMwIGIwIGEwXQorICAgICAgICBTVUJTICAgICAgICBDb3VudCwgQ291bnQsICMxCisgICAgICAgIFNUUiAgICAgICAgIFRlbXAxLCBbcEJ1Zl0sICM4IAorICAgICAgICBQS0hUQiAgICAgICBUZW1wMiwgVmFsdWVBMSwgVmFsdWVBMCwgQVNSICMxNiAgICAgOy8vIFtkMiBjMiBiMiBhMl0KKyAgICAgICAgU1RSICAgICAgICAgVGVtcDIsIFtwQnVmXSwgIzQgIAorICAgICAgICAKKyAgICAgICAgQkdUICAgICAgICAgTG9vcFN0YXJ0CitFbmQyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMwLCBwQnVmLCAjMzItOAorICAgICAgICBNT1YgICAgICAgICBzcmNTdGVwMCwgIzQKKworICAgICAgICBNX0VORAorCisgICAgRU5ESUYKKyAgICAKKyAgICBFTkQKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDE2ODRjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucwpAQCAtMCwwICsxLDMxMyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgSUYgQ29ydGV4QTgKKworICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZSwgcjExCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RDb2VmZjUgICAgICAgICBETiAzMC5TMTYKK2RDb2VmZjIwICAgICAgICBETiAzMS5TMTYKK3FDb2VmZjUgICAgICAgICBRTiAxNC5TMzIKK3FDb2VmZjIwICAgICAgICBRTiAxNS5TMzIKKyAgICAgICAgCitxU3JjMDEgICAgICAgICAgUU4gMC5VOAorZFNyYzAgICAgICAgICAgIEROIDAuVTgKK2RTcmMxICAgICAgICAgICBETiAxLlU4ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorZFNyY2IgICAgICAgICAgIEROIDQuVTgKK2RTcmNjICAgICAgICAgICBETiAyLlU4CitkU3JjZCAgICAgICAgICAgRE4gMy5VOAorZFNyY2UgICAgICAgICAgIEROIDUuVTgKK2RTcmNmICAgICAgICAgICBETiAxLlU4CisKK3FTcmNiICAgICAgICAgICBRTiAyLlMxNgorcVNyY2MgICAgICAgICAgIFFOIDEuUzE2CitkU3JjQiAgICAgICAgICAgRE4gNC5TMTYKK2RTcmNDICAgICAgICAgICBETiAyLlMxNgorCitxUmVzMCAgICAgICAgICAgUU4gNS5TMTYKK3FSZXMxICAgICAgICAgICBRTiA2LlMxNgorcVJlczIgICAgICAgICAgIFFOIDcuUzE2CitxUmVzMyAgICAgICAgICAgUU4gOC5TMTYKK3FSZXM0ICAgICAgICAgICBRTiA5LlMxNgorcVJlczUgICAgICAgICAgIFFOIDEwLlMxNgorcVJlczYgICAgICAgICAgIFFOIDExLlMxNgorcVJlczcgICAgICAgICAgIFFOIDEyLlMxNgorcVJlczggICAgICAgICAgIFFOIDEzLlMxNgorICAgIAorZFJlczAgICAgICAgICAgIEROIDEwLlMxNgorZFJlczEgICAgICAgICAgIEROIDEyLlMxNgorZFJlczIgICAgICAgICAgIEROIDE0LlMxNgorZFJlczMgICAgICAgICAgIEROIDE2LlMxNgorZFJlczQgICAgICAgICAgIEROIDE4LlMxNgorZFJlczUgICAgICAgICAgIEROIDIwLlMxNgorZFJlczYgICAgICAgICAgIEROIDIyLlMxNgorZFJlczcgICAgICAgICAgIEROIDI0LlMxNgorZFJlczggICAgICAgICAgIEROIDI2LlMxNgorICAgIAorcUFjYzAxICAgICAgICAgIFFOIDUuUzMyCitxQWNjMjMgICAgICAgICAgUU4gNi5TMzIKK3FBY2M0NSAgICAgICAgICBRTiAyLlMzMgorcUFjYzY3ICAgICAgICAgIFFOIDMuUzMyCitxU3VtQkUgICAgICAgICAgUU4gMC5TMzIKK3FTdW1DRCAgICAgICAgICBRTiAxLlMzMgorCitkVGVtcEFjYzAgICAgICAgRE4gMC5VMTYKK2RUZW1wQWNjMSAgICAgICBETiAyLlUxNgorZFRlbXBBY2MyICAgICAgIEROIDQuVTE2CitkVGVtcEFjYzMgICAgICAgRE4gNi5VMTYKKworcVRBY2MwICAgICAgICAgIFFOIDAuVTE2CitxVEFjYzEgICAgICAgICAgUU4gMS5VMTYKK3FUQWNjMiAgICAgICAgICBRTiAyLlUxNgorcVRBY2MzICAgICAgICAgIFFOIDMuVTE2CisKK2RBY2MwICAgICAgICAgICBETiAwLlU4CitkQWNjMSAgICAgICAgICAgRE4gMi5VOAorZEFjYzIgICAgICAgICAgIEROIDQuVTgKK2RBY2MzICAgICAgICAgICBETiA2LlU4CisKK2RUbXAwICAgICAgICAgICBETiA4LlMxNgorZFRtcDEgICAgICAgICAgIEROIDkuUzE2CitxVG1wMCAgICAgICAgICAgUU4gNC5TMzIKKworICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAorICAgICAgICBWTU9WICAgICAgICBkQ29lZmY1LCAjNQorCisgICAgICAgIDsvLyBSb3cwCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczAsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorICAgICAgICBWTUxBICAgICAgICBkUmVzMCwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIAorICAgICAgICA7Ly8gUm93MQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXMxLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMwLCBkUmVzMCwgZFRtcDAgOy8vIFRlUmkKKyAgICAgICAgCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMxLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMSwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93MgorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXMyLCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgCisgICAgICAgIFZTVUIgICAgICAgIGRSZXMxLCBkUmVzMSwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzMiwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczIsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzMywgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczIsIGRSZXMyLCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMzLCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMywgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93NAorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM0LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzMywgZFJlczMsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczQsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM0LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c1CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczUsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisgICAgICAgIFZMRDEgICAgICAgIHFTcmMwMSwgW3BTcmNdLCBzcmNTdGVwICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uXQorCisgICAgICAgIFZTVUIgICAgICAgIGRSZXM0LCBkUmVzNCwgZFRtcDAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNSwgZFNyY0MsIGRDb2VmZjIwICAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczUsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgOy8vIFJvdzYKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2IsIGRTcmMwLCBkU3JjMSwgIzEgICAgIDsvLyBbYjAgYjEgYjIgYjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNjLCBkU3JjMCwgZFNyYzEsICMyCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNkLCBkU3JjMCwgZFNyYzEsICMzCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNlLCBkU3JjMCwgZFNyYzEsICM0CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjMCwgZFNyYzEsICM1ICAgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWQURETCAgICAgICBxU3JjYywgZFNyY2MsIGRTcmNkICAgICAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVNyY2IsIGRTcmNiLCBkU3JjZSAgICAgICAgIDsvLyBiK2UgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxUmVzNiwgZFNyYzAsIGRTcmNmICAgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkxEMSAgICAgICAgcVNyYzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgIDsvLyBbYTAgYTEgYTIgYTMgLi5dCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczUsIGRSZXM1LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM2LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzNiwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICA7Ly8gUm93NworICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyYzAsIGRTcmMxLCAjMSAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2MsIGRTcmMwLCBkU3JjMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2QsIGRTcmMwLCBkU3JjMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmMwLCBkU3JjMSwgIzQKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmMwLCBkU3JjMSwgIzUgICAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZBRERMICAgICAgIHFTcmNjLCBkU3JjYywgZFNyY2QgICAgICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3JjYiwgZFNyY2IsIGRTcmNlICAgICAgICAgOy8vIGIrZSAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFSZXM3LCBkU3JjMCwgZFNyY2YgICAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICBWTEQxICAgICAgICBxU3JjMDEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLl0KKworICAgICAgICBWU1VCICAgICAgICBkUmVzNiwgZFJlczYsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczcsIGRTcmNDLCBkQ29lZmYyMCAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXM3LCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDAsIGRTcmNCLCBkQ29lZmY1ICAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorCisgICAgICAgIDsvLyBSb3c4CisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjMCwgZFNyYzEsICMxICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYywgZFNyYzAsIGRTcmMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjZCwgZFNyYzAsIGRTcmMxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyYzAsIGRTcmMxLCAjNAorICAgICAgICBWRVhUICAgICAgICBkU3JjZiwgZFNyYzAsIGRTcmMxLCAjNSAgICAgOy8vIFtmMCBmMSBmMiBmMyAuLl0KKyAgICAgICAgVkFEREwgICAgICAgcVNyY2MsIGRTcmNjLCBkU3JjZCAgICAgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFTcmNiLCBkU3JjYiwgZFNyY2UgICAgICAgICA7Ly8gYitlICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVJlczgsIGRTcmMwLCBkU3JjZiAgICAgICAgIDsvLyBBY2M9YStmCisKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczcsIGRSZXM3LCBkVG1wMAorCisgICAgICAgIFZNTEEgICAgICAgIGRSZXM4LCBkU3JjQywgZENvZWZmMjAgICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzOCwgZFNyY0IsIGRDb2VmZjUgICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAwLCBkU3JjQiwgZENvZWZmNSAgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKworICAgICAgICBWTU9WICAgICAgICBxQ29lZmYyMCwgIzIwCisgICAgICAgIFZNT1YgICAgICAgIHFDb2VmZjUsICM1CisKKyAgICAgICAgOy8vIENvbDAKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzAxLCBkUmVzMCwgZFJlczUgICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzMiwgZFJlczMgICAgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMSwgZFJlczQgICAgICAgIDsvLyBiK2UKKworICAgICAgICBWU1VCICAgICAgICBkUmVzOCwgZFJlczgsIGRUbXAwCisKKyAgICAgICAgVk1MQSAgICAgICAgcUFjYzAxLCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIHFBY2MwMSwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgVk1VTCAgICAgICAgcVRtcDAsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisKKyAgICAgICAgOy8vIENvbDEKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzIzLCBkUmVzMSwgZFJlczYgICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzMywgZFJlczQgICAgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzMiwgZFJlczUgICAgICAgIDsvLyBiK2UKKyAgICAgICAgVk1MQSAgICAgICAgcUFjYzIzLCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworICAgICAgICBWU1VCICAgICAgICBxQWNjMDEsIHFBY2MwMSwgcVRtcDAKKworOyAgICAgICAgVk1MUyAgICAgICAgcUFjYzIzLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICBWTVVMICAgICAgICBxVG1wMCwgcVN1bUJFLCBxQ29lZmY1ICAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKworICAgICAgICA7Ly8gQ29sMgorICAgICAgICBWQURETCAgICAgICBxQWNjNDUsIGRSZXMyLCBkUmVzNyAgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWQURETCAgICAgICBxU3VtQ0QsIGRSZXM0LCBkUmVzNSAgICAgICAgOy8vIGMrZAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUsIGRSZXMzLCBkUmVzNiAgICAgICAgOy8vIGIrZQorICAgICAgICBWTUxBICAgICAgICBxQWNjNDUsIHFTdW1DRCwgcUNvZWZmMjAgICAgOy8vIEFjYyArPSAyMCooYytkKQorCisgICAgICAgIFZTVUIgICAgICAgIHFBY2MyMywgcUFjYzIzLCBxVG1wMAorCis7ICAgICAgICBWTUxTICAgICAgICBxQWNjNDUsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisgICAgICAgIFZNVUwgICAgICAgIHFUbXAwLCBxU3VtQkUsIHFDb2VmZjUgICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIENvbDMKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzY3LCBkUmVzMywgZFJlczggICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNELCBkUmVzNSwgZFJlczYgICAgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUJFLCBkUmVzNCwgZFJlczcgICAgICAgIDsvLyBiK2UKKyAgICAgICAgVk1MQSAgICAgICAgcUFjYzY3LCBxU3VtQ0QsIHFDb2VmZjIwICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworICAgICAgICBWU1VCICAgICAgICBxQWNjNDUsIHFBY2M0NSwgcVRtcDAKKworICAgICAgICBWTUxTICAgICAgICBxQWNjNjcsIHFTdW1CRSwgcUNvZWZmNSAgICAgOy8vIEFjYyAtPSAyMCooYitlKSAgICAgICAgCisKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MwLCBxQWNjMDEsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzEsIHFBY2MyMywgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMiwgcUFjYzQ1LCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MzLCBxQWNjNjcsICMxMAorICAgICAgICAKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzAsIHFUQWNjMAorICAgICAgICBWUU1PVk4gICAgICBkQWNjMSwgcVRBY2MxCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MyLCBxVEFjYzIKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzMsIHFUQWNjMworICAgICAgICAgICAgICAgIAorICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisKKworICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiYzA5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwyNjYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKworICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICBNX1NUQVJUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZSwgcjExCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKKworOy8vIERlY2xhcmUgTmVvbiByZWdpc3RlcnMKK2RUQ29lZmY1ICAgICAgICBETiAzMC5VOAorZFRDb2VmZjIwICAgICAgIEROIDMxLlU4CitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CisKK3FTcmNBMDEgICAgICAgICBRTiAwLlU4CitxU3JjQjIzICAgICAgICAgUU4gMS5VOAorcVNyY0M0NSAgICAgICAgIFFOIDIuVTgKK3FTcmNENjcgICAgICAgICBRTiAzLlU4CitxU3JjRTg5ICAgICAgICAgUU4gNC5VOAorcVNyY0YxMDExICAgICAgIFFOIDUuVTgKK3FTcmNHMTIxMyAgICAgICBRTiA2LlU4CitxU3JjSDE0MTUgICAgICAgUU4gNy5VOAorcVNyY0kxNjE3ICAgICAgIFFOIDguVTgKKworZFNyY0EwICAgICAgICAgIEROIDAuVTgKK2RTcmNCMiAgICAgICAgICBETiAyLlU4CitkU3JjQzQgICAgICAgICAgRE4gNC5VOAorZFNyY0Q2ICAgICAgICAgIEROIDYuVTgKK2RTcmNFOCAgICAgICAgICBETiA4LlU4CitkU3JjRjEwICAgICAgICAgRE4gMTAuVTgKK2RTcmNHMTIgICAgICAgICBETiAxMi5VOAorZFNyY0gxNCAgICAgICAgIEROIDE0LlU4CitkU3JjSTE2ICAgICAgICAgRE4gMTYuVTgKKworZFNyY0ExICAgICAgICAgIEROIDEuVTgKK2RTcmNCMyAgICAgICAgICBETiAzLlU4CitkU3JjQzUgICAgICAgICAgRE4gNS5VOAorZFNyY0Q3ICAgICAgICAgIEROIDcuVTgKK2RTcmNFOSAgICAgICAgICBETiA5LlU4CitkU3JjRjExICAgICAgICAgRE4gMTEuVTgKK2RTcmNHMTMgICAgICAgICBETiAxMy5VOAorZFNyY0gxNSAgICAgICAgIEROIDE1LlU4CitkU3JjSTE3ICAgICAgICAgRE4gMTcuVTgKKworcVRlbXBQMDEgICAgICAgIFFOIDkuUzE2CitxVGVtcFEwMSAgICAgICAgUU4gMTAuUzE2CitxVGVtcFIwMSAgICAgICAgUU4gMTEuUzE2CitxVGVtcFMwMSAgICAgICAgUU4gMTIuUzE2CisKK3FUZW1wUDIzICAgICAgICBRTiAwLlMxNgorcVRlbXBRMjMgICAgICAgIFFOIDEuUzE2CitxVGVtcFIyMyAgICAgICAgUU4gMi5TMTYKK3FUZW1wUzIzICAgICAgICBRTiAzLlMxNgorCitkVGVtcFAwICAgICAgICAgRE4gMTguUzE2CitkVGVtcFAxICAgICAgICAgRE4gMTkuUzE2CitkVGVtcFAyICAgICAgICAgRE4gMC5TMTYKKworZFRlbXBRMCAgICAgICAgIEROIDIwLlMxNgorZFRlbXBRMSAgICAgICAgIEROIDIxLlMxNgorZFRlbXBRMiAgICAgICAgIEROIDIuUzE2CisKK2RUZW1wUjAgICAgICAgICBETiAyMi5TMTYKK2RUZW1wUjEgICAgICAgICBETiAyMy5TMTYKK2RUZW1wUjIgICAgICAgICBETiA0LlMxNgorCitkVGVtcFMwICAgICAgICAgRE4gMjQuUzE2CitkVGVtcFMxICAgICAgICAgRE4gMjUuUzE2CitkVGVtcFMyICAgICAgICAgRE4gNi5TMTYKKyAKK2RUZW1wQjAgICAgICAgICBETiAyNi5TMTYKK2RUZW1wQzAgICAgICAgICBETiAyNy5TMTYKK2RUZW1wRDAgICAgICAgICBETiAyOC5TMTYKK2RUZW1wRjAgICAgICAgICBETiAyOS5TMTYKKworZFRlbXBBY2MwICAgICAgIEROIDAuVTE2CitkVGVtcEFjYzEgICAgICAgRE4gMi5VMTYKK2RUZW1wQWNjMiAgICAgICBETiA0LlUxNgorZFRlbXBBY2MzICAgICAgIEROIDYuVTE2CisKK2RBY2MwICAgICAgICAgICBETiAwLlU4CitkQWNjMSAgICAgICAgICAgRE4gMi5VOAorZEFjYzIgICAgICAgICAgIEROIDQuVTgKK2RBY2MzICAgICAgICAgICBETiA2LlU4CisKK3FBY2MwICAgICAgICAgICBRTiAwLlMzMgorcUFjYzEgICAgICAgICAgIFFOIDEuUzMyCitxQWNjMiAgICAgICAgICAgUU4gMi5TMzIKK3FBY2MzICAgICAgICAgICBRTiAzLlMzMgorCitxVEFjYzAgICAgICAgICAgUU4gMC5VMTYKK3FUQWNjMSAgICAgICAgICBRTiAxLlUxNgorcVRBY2MyICAgICAgICAgIFFOIDIuVTE2CitxVEFjYzMgICAgICAgICAgUU4gMy5VMTYgICAgICAgICAgICAgICAgCisKK3FUbXAgICAgICAgICAgICBRTiA0LlMxNgorZFRtcCAgICAgICAgICAgIEROIDguUzE2CisKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0EwMSwgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2EwIGExIGEyIGEzIC4uIGExNV0gICAKKyAgICAgICAgQUREICAgICAgICAgcjEyLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKyAgICAgICAgVk1PViAgICAgICAgZFRDb2VmZjUsICM1CisgICAgICAgIFZNT1YgICAgICAgIGRUQ29lZmYyMCwgIzIwCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNGMTAxMSwgW3IxMl0sIHNyY1N0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0IyMywgW3BTcmNdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2IwIGIxIGIyIGIzIC4uIGIxNV0KKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNHMTIxMywgW3IxMl0sIHNyY1N0ZXAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBQMDEsIGRTcmNBMCwgZFNyY0YxMCAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNDNDUsIFtwU3JjXSwgc3JjU3RlcCAgICAgICAgICAgICAgICAgOy8vIFtjMCBjMSBjMiBjMyAuLiBjMTVdCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUDIzLCBkU3JjQTEsIGRTcmNGMTEgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0Q2NywgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUTAxLCBkU3JjQjIsIGRTcmNHMTIgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHFTcmNFODksIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICAKKyAgICAgICAgOy8vdDAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMDEsIGRTcmNDNCwgZFRDb2VmZjIwCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjSDE0MTUsIFtyMTJdLCBzcmNTdGVwCisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBQMjMsIGRTcmNDNSwgZFRDb2VmZjIwCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjSTE2MTcsIFtyMTJdLCBzcmNTdGVwICAgICAgICAgICAgICAgICA7Ly8gW2kwIGkxIGkyIGkzIC4uIF0KKyAgICAgICAgCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDAxLCBkU3JjRDYsIGRUQ29lZmYyMAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEwMSwgZFNyY0Q2LCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBQMjMsIGRTcmNCMywgZFRDb2VmZjUKKyAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUjAxLCBkU3JjQzQsIGRTcmNIMTQgICAKKyAgICAgICAgCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUDAxLCBkU3JjQjIsIGRUQ29lZmY1CisKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXBRMjMsIGRTcmNCMywgZFNyY0cxMyAgIAorCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUDIzLCBkU3JjRDcsIGRUQ29lZmYyMAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEwMSwgZFNyY0U4LCBkVENvZWZmMjAKKworICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAwMSwgZFNyY0U4LCBkVENvZWZmNQorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEyMywgZFNyY0Q3LCBkVENvZWZmMjAKKworICAgICAgICBWTUxTTCAgICAgICBxVGVtcFAyMywgZFNyY0U5LCBkVENvZWZmNQorCisgICAgICAgIDsvL3QxCisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMDEsIGRTcmNFOCwgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTAxLCBkU3JjQzQsIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTIzLCBkU3JjQzUsIGRUQ29lZmY1CisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUjIzLCBkU3JjQzUsIGRTcmNIMTUgICAKKworICAgICAgICBWTUxBTCAgICAgICBxVGVtcFIwMSwgZFNyY0YxMCwgZFRDb2VmZjIwCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTAxLCBkU3JjRjEwLCBkVENvZWZmNQorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFEyMywgZFNyY0U5LCBkVENvZWZmMjAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBSMjMsIGRTcmNFOSwgZFRDb2VmZjIwCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUzAxLCBkU3JjRDYsIGRTcmNJMTYgICAKKworCisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUjAxLCBkU3JjRDYsIGRUQ29lZmY1CisgICAgICAgIFZNTFNMICAgICAgIHFUZW1wUTIzLCBkU3JjRjExLCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIyMywgZFNyY0Q3LCBkVENvZWZmNQorCisgICAgICAgIDsvL3QyCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wUzIzLCBkU3JjRDcsIGRTcmNJMTcgICAKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMDEsIGRTcmNGMTAsIGRUQ29lZmYyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFIwMSwgZFNyY0cxMiwgZFRDb2VmZjUKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBSMjMsIGRTcmNHMTMsIGRUQ29lZmY1CisKKyAgICAgICAgVk1MQUwgICAgICAgcVRlbXBTMjMsIGRTcmNGMTEsIGRUQ29lZmYyMAorICAgICAgICBWTUxBTCAgICAgICBxVGVtcFMwMSwgZFNyY0cxMiwgZFRDb2VmZjIwCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUDAsIGRUZW1wUDEsICMxCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUjIzLCBkU3JjRjExLCBkVENvZWZmMjAKKworCisgICAgICAgIDsvL3QzCisgICAgICAgIFZNTEFMICAgICAgIHFUZW1wUzIzLCBkU3JjRzEzLCBkVENvZWZmMjAKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMDEsIGRTcmNFOCwgZFRDb2VmZjUKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzIKKyAgICAgICAgVk1PViAgICAgICAgZENvZWZmMjAsICMyMAorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMyMywgZFNyY0U5LCBkVENvZWZmNQorICAgICAgICBWTUxTTCAgICAgICBxVGVtcFMwMSwgZFNyY0gxNCwgZFRDb2VmZjUKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBQMSwgZFRlbXBQMiwgIzEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzMKKyAgICAgICAgVk1MU0wgICAgICAgcVRlbXBTMjMsIGRTcmNIMTUsIGRUQ29lZmY1CisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxQWNjMCwgZFRlbXBQMCwgZFRlbXBGMAorICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCisgICAgICAgIDsvL2ggCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1CisgICAgICAgIAorICAgICAgICA7Ly8gcmVzMAorICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFAxCisgICAgICAgIFZNTEFMICAgICAgIHFBY2MwLCBkVGVtcEMwLCBkQ29lZmYyMAorICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFEwLCBkVGVtcFExLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFEwLCBkVGVtcFExLCAjMworICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFExLCBkVGVtcFEyLCAjMQorICAgICAgICBWTUxTTCAgICAgICBxQWNjMCwgZFRlbXBCMCwgZENvZWZmNQorCisgICAgICAgIDsvLyByZXMxCisgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUTAsIGRUZW1wUTEsICMxCisgICAgICAgIFZBRERMICAgICAgIHFBY2MxLCBkVGVtcFEwLCBkVGVtcEYwCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKKyAgICAgICAgVkFERCAgICAgICAgZFRlbXBCMCwgZFRlbXBCMCwgZFRlbXBRMQorICAgICAgICBWRVhUICAgICAgICBkVGVtcEQwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMworICAgICAgICBWTUxBTCAgICAgICBxQWNjMSwgZFRlbXBDMCwgZENvZWZmMjAKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBGMCwgZFRlbXBSMSwgZFRlbXBSMiwgIzEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBDMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRtcCwgZFRlbXBSMCwgZFRlbXBSMSwgIzEKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzIsIGRUZW1wUjAsIGRUZW1wRjAKKyAgICAgICAgVk1MU0wgICAgICAgcUFjYzEsIGRUZW1wQjAsIGRDb2VmZjUKKzsgICAgICAgIFZFWFQgICAgICAgIGRUZW1wQjAsIGRUZW1wUjAsIGRUZW1wUjEsICMxCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQzAsIGRUZW1wQzAsIGRUZW1wRDAKKyAgICAgICAgCisgICAgICAgIDsvLyByZXMyCisgICAgICAgIFZBREQgICAgICAgIGRUZW1wQjAsIGRUbXAsIGRUZW1wUjEKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBEMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzMKKyAgICAgICAgVk1MQUwgICAgICAgcUFjYzIsIGRUZW1wQzAsIGRDb2VmZjIwCis7ICAgICAgICBWQUREICAgICAgICBkVGVtcEIwLCBkVGVtcEIwLCBkVGVtcFIxCisgICAgICAgIAorICAgICAgICA7Ly8gcmVzMworICAgICAgICBWRVhUICAgICAgICBkVGVtcEMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkVGVtcEYwLCBkVGVtcFMxLCBkVGVtcFMyLCAjMQorICAgICAgICBWQUREICAgICAgICBkVGVtcEMwLCBkVGVtcEMwLCBkVGVtcEQwCisgICAgICAgIFZFWFQgICAgICAgIGRUbXAsIGRUZW1wUzAsIGRUZW1wUzEsICMxCisgICAgICAgIFZBRERMICAgICAgIHFBY2MzLCBkVGVtcFMwLCBkVGVtcEYwCisgICAgICAgIFZNTFNMICAgICAgIHFBY2MyLCBkVGVtcEIwLCBkQ29lZmY1CisgICAgICAgIFZNTEFMICAgICAgIHFBY2MzLCBkVGVtcEMwLCBkQ29lZmYyMAorICAgICAgICBWQUREICAgICAgICBkVG1wLCBkVG1wLCBkVGVtcFMxCisgICAgICAgIFZNTFNMICAgICAgIHFBY2MzLCBkVG1wLCBkQ29lZmY1CisgICAgICAgICAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMCwgcUFjYzAsICMxMAorICAgICAgICBWUVJTSFJVTiAgICBkVGVtcEFjYzEsIHFBY2MxLCAjMTAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRlbXBBY2MyLCBxQWNjMiwgIzEwCisgICAgICAgIFZRUlNIUlVOICAgIGRUZW1wQWNjMywgcUFjYzMsICMxMAorCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MwLCBxVEFjYzAKKyAgICAgICAgVlFNT1ZOICAgICAgZEFjYzEsIHFUQWNjMQorICAgICAgICBWUU1PVk4gICAgICBkQWNjMiwgcVRBY2MyCisgICAgICAgIFZRTU9WTiAgICAgIGRBY2MzLCBxVEFjYzMKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKyAgICAKKyAgICAKKyAgICAKKworICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYWJlOGFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZV9zLnMKQEAgLTAsMCArMSwyMjggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisKK0RFQlVHX09OICAgIFNFVEwge0ZBTFNFfQorCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUsIHIxMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CisKK3FTcmNBMDEgICAgICAgICBRTiAxMS5VOAorcVNyY0IwMSAgICAgICAgIFFOIDEyLlU4CitxU3JjQzAxICAgICAgICAgUU4gMTMuVTgKK3FTcmNEMDEgICAgICAgICBRTiAxNC5VOAorCitkU3JjQTAgICAgICAgICAgRE4gMjIuVTgKK2RTcmNBMSAgICAgICAgICBETiAyMy5VOAorZFNyY0IwICAgICAgICAgIEROIDI0LlU4CitkU3JjQjEgICAgICAgICAgRE4gMjUuVTgKK2RTcmNDMCAgICAgICAgICBETiAyNi5VOAorZFNyY0MxICAgICAgICAgIEROIDI3LlU4CitkU3JjRDAgICAgICAgICAgRE4gMjguVTgKK2RTcmNEMSAgICAgICAgICBETiAyOS5VOAorCitkU3JjYiAgICAgICAgICAgRE4gMTIuVTgKK2RTcmNlICAgICAgICAgICBETiAxMy5VOAorZFNyY2YgICAgICAgICAgIEROIDEwLlU4CisKK2RTcmMwYyAgICAgICAgICBETiAxNC5VOAorZFNyYzFjICAgICAgICAgIEROIDE2LlU4CitkU3JjMmMgICAgICAgICAgRE4gMTguVTgKK2RTcmMzYyAgICAgICAgICBETiAyMC5VOAorICAgICAgICAgICAgICAgICAgIAorZFNyYzBkICAgICAgICAgIEROIDE1LlU4CitkU3JjMWQgICAgICAgICAgRE4gMTcuVTgKK2RTcmMyZCAgICAgICAgICBETiAxOS5VOAorZFNyYzNkICAgICAgICAgIEROIDIxLlU4CisKK3FUZW1wMDEgICAgICAgICBRTiA0LlMxNgorcVRlbXAyMyAgICAgICAgIFFOIDYuUzE2CitkVGVtcDAgICAgICAgICAgRE4gOC5TMTYKK2RUZW1wMiAgICAgICAgICBETiAxMi5TMTYKKworcVJlczAxICAgICAgICAgIFFOIDExLlMxNgorcVJlczIzICAgICAgICAgIFFOIDEyLlMxNgorcVJlczQ1ICAgICAgICAgIFFOIDEzLlMxNgorcVJlczY3ICAgICAgICAgIFFOIDE0LlMxNgorCitkUmVzMCAgICAgICAgICAgRE4gMjIuUzE2CitkUmVzMiAgICAgICAgICAgRE4gMjQuUzE2CitkUmVzNCAgICAgICAgICAgRE4gMjYuUzE2CitkUmVzNiAgICAgICAgICAgRE4gMjguUzE2CisKK2RBY2MwICAgICAgICAgICBETiAyMi5VOAorZEFjYzIgICAgICAgICAgIEROIDI0LlU4CitkQWNjNCAgICAgICAgICAgRE4gMjYuVTgKK2RBY2M2ICAgICAgICAgICBETiAyOC5VOAorCitkUmVzdWx0MCAgICAgICAgRE4gMjIuVTMyCitkUmVzdWx0MiAgICAgICAgRE4gMjQuVTMyCitkUmVzdWx0NCAgICAgICAgRE4gMjYuVTMyCitkUmVzdWx0NiAgICAgICAgRE4gMjguVTMyCisKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0EwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEEgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXQorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQTAsIGRTcmNBMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0EwLCBkU3JjQTEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKzsgICAgICAgIFZMRDEgICAgICAgIHFTcmNCMDEsIFtwU3JjXSwgc3JjU3RlcCAgICA7Ly8gTG9hZCBCIHJlZ2lzdGVyIFthMCBhMSBhMiBhMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzBjLCBkU3JjQTAsIGRTcmNBMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzBkLCBkU3JjQTAsIGRTcmNBMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNBMCwgZFNyY0ExLCAjNAorICAgICAgICBWQURETCAgICAgICBxUmVzMDEsIGRTcmNBMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAwMSwgZFNyYzBjLCBkU3JjMGQgICAgIDsvLyBjK2QgICAgICAgICAgICAgICAgCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMjMsIGRTcmNiLCBkU3JjZSAgICAgICA7Ly8gYitlCisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBxU3JjQjAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQiByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dCis7ICAgICAgICBWTEQxICAgICAgICBxU3JjQzAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgQyByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAgICAgICAgICAKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRUZW1wMCwgZENvZWZmMjAgICAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKzsgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkVGVtcDIsIGRDb2VmZjUgICAgICA7Ly8gQWNjIC09IDUqKGIrZSkKKyAgICAgICAgVk1VTCAgICAgICAgZFRlbXAwLCBkVGVtcDIsIGRDb2VmZjUgOy8vIFRlUmkKKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjQjAsIGRTcmNCMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0IwLCBkU3JjQjEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzFjLCBkU3JjQjAsIGRTcmNCMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzFkLCBkU3JjQjAsIGRTcmNCMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNCMCwgZFNyY0IxLCAjNAorICAgICAgICBWQURETCAgICAgICBxUmVzMjMsIGRTcmNCMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKKworICAgICAgICBWU1VCICAgICAgICBkUmVzMCwgZFJlczAsIGRUZW1wMCAgICA7Ly8gVGVSaQorCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMxYywgZFNyYzFkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQorICAgICAgICAKKyAgICAgICAgVkxEMSAgICAgICAgcVNyY0MwMSwgW3BTcmNdLCBzcmNTdGVwICAgIDsvLyBMb2FkIEMgcmVnaXN0ZXIgW2EwIGExIGEyIGEzIC4uXSAgICAgICAgICAgCis7ICAgICAgICBWTEQxICAgICAgICBxU3JjRDAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgRCByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAKKyAgICAgICAgCisgICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkVGVtcDAsIGRDb2VmZjIwICAgICA7Ly8gQWNjICs9IDIwKihjK2QpCis7ICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisgICAgICAgIFZNVUwgICAgICAgIGRUZW1wMCwgZFRlbXAyLCBkQ29lZmY1IDsvLyBUZVJpCisKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2YsIGRTcmNDMCwgZFNyY0MxLCAjNSAgIDsvLyBbZjAgZjEgZjIgZjMgLi5dCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNiLCBkU3JjQzAsIGRTcmNDMSwgIzEgICA7Ly8gW2IwIGIxIGIyIGIzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjMmMsIGRTcmNDMCwgZFNyY0MxLCAjMgorICAgICAgICBWRVhUICAgICAgICBkU3JjMmQsIGRTcmNDMCwgZFNyY0MxLCAjMworICAgICAgICBWRVhUICAgICAgICBkU3JjZSwgZFNyY0MwLCBkU3JjQzEsICM0CisgICAgICAgIFZBRERMICAgICAgIHFSZXM0NSwgZFNyY0MwLCBkU3JjZiAgICAgICA7Ly8gQWNjPWErZgorICAgICAgICAKKyAgICAgICAgVlNVQiAgICAgICAgZFJlczIsIGRSZXMyLCBkVGVtcDAgIDsvLyBUZVJpCisgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDAxLCBkU3JjMmMsIGRTcmMyZCAgICAgOy8vIGMrZCAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFEREwgICAgICAgcVRlbXAyMywgZFNyY2IsIGRTcmNlICAgICAgIDsvLyBiK2UKKworICAgICAgICBWTEQxICAgICAgICBxU3JjRDAxLCBbcFNyY10sIHNyY1N0ZXAgICAgOy8vIExvYWQgRCByZWdpc3RlciBbYTAgYTEgYTIgYTMgLi5dICAKKworICAgICAgICBWTUxBICAgICAgICBkUmVzNCwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1MUyAgICAgICAgZFJlczQsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKQorICAgICAgICBWTVVMICAgICAgICBkVGVtcDAsIGRUZW1wMiwgZENvZWZmNSAgICAgIDsvLyBBY2MgLT0gNSooYitlKSBUZVJpCisgICAgICAgIAorCisgICAgICAgIFZFWFQgICAgICAgIGRTcmNmLCBkU3JjRDAsIGRTcmNEMSwgIzUgICA7Ly8gW2YwIGYxIGYyIGYzIC4uXQorICAgICAgICBWRVhUICAgICAgICBkU3JjYiwgZFNyY0QwLCBkU3JjRDEsICMxICAgOy8vIFtiMCBiMSBiMiBiMyAuLl0KKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzNjLCBkU3JjRDAsIGRTcmNEMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFNyYzNkLCBkU3JjRDAsIGRTcmNEMSwgIzMKKyAgICAgICAgVkVYVCAgICAgICAgZFNyY2UsIGRTcmNEMCwgZFNyY0QxLCAjNAorICAgICAgICBWQURETCAgICAgICBxUmVzNjcsIGRTcmNEMCwgZFNyY2YgICAgICAgOy8vIEFjYz1hK2YKKworICAgICAgICBWU1VCICAgICAgICBkUmVzNCwgZFJlczQsIGRUZW1wMCA7Ly8gVGVSaQorCisgICAgICAgIFZBRERMICAgICAgIHFUZW1wMDEsIGRTcmMzYywgZFNyYzNkICAgICA7Ly8gYytkICAgICAgICAgICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxVGVtcDIzLCBkU3JjYiwgZFNyY2UgICAgICAgOy8vIGIrZQorICAgICAgICBWTUxBICAgICAgICBkUmVzNiwgZFRlbXAwLCBkQ29lZmYyMCAgICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICBWTUxTICAgICAgICBkUmVzNiwgZFRlbXAyLCBkQ29lZmY1ICAgICAgOy8vIEFjYyAtPSA1KihiK2UpCisKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzAsIHFSZXMwMSwgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzIsIHFSZXMyMywgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzQsIHFSZXM0NSwgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzYsIHFSZXM2NywgIzUgICAgICAgICAgIDsvLyBBY2MgPSBTYXQgKChBY2MgKyAxNikgLyAzMikKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgCisgICAgRU5ESUYKKworCisgICAgRU5ECisgICAgCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODljOTBhYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5zCkBAIC0wLDAgKzEsMTM0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUsIHIxMQorCis7Ly8gRGVjbGFyZSBpbnB1dCByZWdpc3RlcnMKK3BTcmMgICAgICAgICAgICBSTiAwCitzcmNTdGVwICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgIFJOIDIKK2RzdFN0ZXAgICAgICAgICBSTiAzCisKK1RlbXAgICAgICAgICAgICBSTiAxMgorCis7Ly8gRGVjbGFyZSBOZW9uIHJlZ2lzdGVycworZENvZWZmNSAgICAgICAgIEROIDMwLlMxNgorZENvZWZmMjAgICAgICAgIEROIDMxLlMxNgorCitkU3JjMCAgICAgICAgICAgRE4gNy5VOAorZFNyYzEgICAgICAgICAgIEROIDguVTgKK2RTcmMyICAgICAgICAgICBETiA5LlU4CitkU3JjMyAgICAgICAgICAgRE4gMTAuVTgKK2RTcmM0ICAgICAgICAgICBETiAxMS5VOAorZFNyYzUgICAgICAgICAgIEROIDEyLlU4CitkU3JjNiAgICAgICAgICAgRE4gMTMuVTgKK2RTcmM3ICAgICAgICAgICBETiAxNC5VOAorZFNyYzggICAgICAgICAgIEROIDE1LlU4CisKK3FTdW1CRTAxICAgICAgICBRTiA4LlMxNgorcVN1bUNEMDEgICAgICAgIFFOIDkuUzE2CitkU3VtQkUwICAgICAgICAgRE4gMTYuUzE2CitkU3VtQ0QwICAgICAgICAgRE4gMTguUzE2CisKK3FBY2MwMSAgICAgICAgICBRTiAwLlMxNgorcUFjYzIzICAgICAgICAgIFFOIDEuUzE2CitxQWNjNDUgICAgICAgICAgUU4gMi5TMTYKK3FBY2M2NyAgICAgICAgICBRTiAzLlMxNgorCitkUmVzMCAgICAgICAgICAgRE4gMC5TMTYKK2RSZXMxICAgICAgICAgICBETiAyLlMxNgorZFJlczIgICAgICAgICAgIEROIDQuUzE2CitkUmVzMyAgICAgICAgICAgRE4gNi5TMTYKKworZEFjYzAgICAgICAgICAgIEROIDAuVTgKK2RBY2MxICAgICAgICAgICBETiAyLlU4CitkQWNjMiAgICAgICAgICAgRE4gNC5VOAorZEFjYzMgICAgICAgICAgIEROIDYuVTggICAgICAgIAorICAgICAgICAKKworZFRtcDAgICAgICAgICAgIEROIDIwLlMxNgorZFRtcDEgICAgICAgICAgIEROIDIxLlMxNgorZFRtcDIgICAgICAgICAgIEROIDIyLlMxNgorZFRtcDMgICAgICAgICAgIEROIDIzLlMxNgorCisKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzAsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFthMCBhMSBhMiBhMyAuLiBdIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzIKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzEsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFtiMCBiMSBiMiBiMyAuLiBdCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzUsIFtUZW1wXSwgc3JjU3RlcCAgICAgICAgCisgICAgICAgIDsvLyBPbmUgY3ljbGUgc3RhbGwKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzIsIFtwU3JjXSwgc3JjU3RlcCAgICAgOy8vIFtjMCBjMSBjMiBjMyAuLiBdCisgICAgICAgIFZBRERMICAgICAgIHFBY2MwMSwgZFNyYzAsIGRTcmM1ICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzMsIFtwU3JjXSwgc3JjU3RlcAorICAgICAgICA7Ly8gT25lIGN5Y2xlIHN0YWxsCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM2LCBbVGVtcF0sIHNyY1N0ZXAgOy8vIFRlUmkKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIGRTcmM0LCBbcFNyY10sIHNyY1N0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzcsIFtUZW1wXSwgc3JjU3RlcCA7Ly8gVGVSaQorICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzEsIGRTcmM0ICAgICA7Ly8gYitlCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjMiwgZFNyYzMgICAgIDsvLyBjK2QgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBkU3JjOCwgW1RlbXBdLCBzcmNTdGVwIDsvLyBUZVJpCisgICAgICAgIFZNTFMgICAgICAgIGRSZXMwLCBkU3VtQkUwLCBkQ29lZmY1ICAgIDsvLyBBY2MgLT0gMjAqKGIrZSkgICAgICAgIAorOyAgICAgICAgVk1MQSAgICAgICAgZFJlczAsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorICAgICAgICBWTVVMICAgICAgICBkVG1wMCwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIAorOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzYsIFtUZW1wXSwgc3JjU3RlcAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzIsIGRTcmM1ICAgICA7Ly8gYitlCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjMywgZFNyYzQgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzIzLCBkU3JjMSwgZFNyYzYgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWTUxTICAgICAgICBkUmVzMSwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpCis7ICAgICAgICBWTUxBICAgICAgICBkUmVzMSwgZFN1bUNEMCwgZENvZWZmMjAgICA7Ly8gQWNjICs9IDIwKihjK2QpCisgICAgICAgIFZNVUwgICAgICAgIGRUbXAxLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKworOyAgICAgICAgVkxEMSAgICAgICAgZFNyYzcsIFtUZW1wXSwgc3JjU3RlcAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzMsIGRTcmM2ICAgICA7Ly8gYitlCisgICAgICAgIFZBRERMICAgICAgIHFTdW1DRDAxLCBkU3JjNCwgZFNyYzUgICAgIDsvLyBjK2QKKyAgICAgICAgVkFEREwgICAgICAgcUFjYzQ1LCBkU3JjMiwgZFNyYzcgICAgICAgOy8vIEFjYyA9IGErZgorICAgICAgICBWTUxTICAgICAgICBkUmVzMiwgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKzsgICAgICAgIFZNTEEgICAgICAgIGRSZXMyLCBkU3VtQ0QwLCBkQ29lZmYyMCAgIDsvLyBBY2MgKz0gMjAqKGMrZCkKKyAgICAgICAgVk1VTCAgICAgICAgZFRtcDIsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorCis7ICAgICAgICBWTEQxICAgICAgICBkU3JjOCwgW1RlbXBdLCBzcmNTdGVwICAgICA7Ly8gW2kwIGkxIGkyIGkzIC4uIF0gICAgICAgIAorICAgICAgICBWQURETCAgICAgICBxU3VtQkUwMSwgZFNyYzQsIGRTcmM3ICAgICA7Ly8gYitlCisgICAgICAgIFZBRERMICAgICAgIHFBY2M2NywgZFNyYzMsIGRTcmM4ICAgICAgIDsvLyBBY2MgPSBhK2YKKyAgICAgICAgVkFEREwgICAgICAgcVN1bUNEMDEsIGRTcmM1LCBkU3JjNiAgICAgOy8vIGMrZAorICAgICAgICBWTUxTICAgICAgICBkUmVzMywgZFN1bUJFMCwgZENvZWZmNSAgICA7Ly8gQWNjIC09IDIwKihiK2UpICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZFJlczAsIGRSZXMwLCBkVG1wMAorICAgICAgICBWQUREICAgICAgICBkUmVzMSwgZFJlczEsIGRUbXAxCisgICAgICAgIFZBREQgICAgICAgIGRSZXMyLCBkUmVzMiwgZFRtcDIKKyAgICAgICAgVk1MQSAgICAgICAgZFJlczMsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVk1VTCAgICAgICAgZFRtcDMsIGRTdW1DRDAsIGRDb2VmZjIwICAgOy8vIEFjYyArPSAyMCooYytkKQorOyAgICAgICAgVkFERCAgICAgICAgZFJlczMsIGRSZXMzLCBkVG1wMworCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MwLCBxQWNjMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZEFjYzEsIHFBY2MyMywgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkQWNjMiwgcUFjYzQ1LCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRBY2MzLCBxQWNjNjcsICM1ICAgICAgICAKKworICAgICAgICBNX0VORAorICAgIAorICAgIEVORElGCisKKyAgICAKKyAgICAKKyAgICBFTkQKKyAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGYwZWM3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfcy5zCkBAIC0wLDAgKzEsMzE4IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICA5NjQxCis7Ly8gRGF0ZTogICAgICAgVGh1cnNkYXksIEZlYnJ1YXJ5IDcsIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAgICAKKworICAgIElGIENvcnRleEE4CisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvICAgICAgCisgICAgCisgICAgRENEICAgV2lkdGhJczJNVklzTm90WmVybywgV2lkdGhJczJNVklzTm90WmVybworICAgIERDRCAgIFdpZHRoSXM0TVZJc05vdFplcm8sIFdpZHRoSXM0TVZJc05vdFplcm8KKyAgICBEQ0QgICBXaWR0aElzOE1WSXNOb3RaZXJvCisgICAgCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybyAgICAgIAorICAgIAorICAgIERDRCAgIFdpZHRoSXMyTVZJc1plcm8sIFdpZHRoSXMyTVZJc1plcm8KKyAgICBEQ0QgICBXaWR0aElzNE1WSXNaZXJvLCBXaWR0aElzNE1WSXNaZXJvCisgICAgRENEICAgV2lkdGhJczhNVklzWmVybworICAgIAorICAgIAorOy8vIGlucHV0IHJlZ2lzdGVycworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitpU3JjU3RlcCAgICAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgICAgICBSTiAyCitpRHN0U3RlcCAgICAgICAgICAgICBSTiAzCitpV2lkdGggICAgICAgICAgICAgICBSTiA0CitpSGVpZ2h0ICAgICAgICAgICAgICBSTiA1CitkeCAgICAgICAgICAgICAgICAgICBSTiA2CitkeSAgICAgICAgICAgICAgICAgICBSTiA3CisKKzsvLyBsb2NhbCB2YXJpYWJsZSByZWdpc3RlcnMKK3BjICAgICAgICAgICAgICAgICAgIFJOIDE1CityZXR1cm4gICAgICAgICAgICAgICBSTiAwCitFaWdodE1pbnVzZHggICAgICAgICBSTiA4IAorRWlnaHRNaW51c2R5ICAgICAgICAgUk4gOQorCitBQ29lZmYgICAgICAgICAgICAgICBSTiAxMgorQkNvZWZmICAgICAgICAgICAgICAgUk4gOQorQ0NvZWZmICAgICAgICAgICAgICAgUk4gOAorRENvZWZmICAgICAgICAgICAgICAgUk4gNgorCitwVGFibGUgICAgICAgICAgICAgICBSTiAxMQorCitTdGVwMSAgICAgICAgICAgICAgICBSTiAxMAorU3JjU3RlcE1pbnVzMSAgICAgICAgUk4gMTQKKworZEFDb2VmZiAgICAgICAgICAgICAgRE4gRDEyLlU4CitkQkNvZWZmICAgICAgICAgICAgICBETiBEMTMuVTgKK2RDQ29lZmYgICAgICAgICAgICAgIEROIEQxNC5VOAorZERDb2VmZiAgICAgICAgICAgICAgRE4gRDE1LlU4CisKK2RSb3cwYSAgICAgICAgICAgICAgIEROIEQwLlU4CitkUm93MGIgICAgICAgICAgICAgICBETiBEMS5VOAorZFJvdzFhICAgICAgICAgICAgICAgRE4gRDIuVTgKK2RSb3cxYiAgICAgICAgICAgICAgIEROIEQzLlU4CisKK3FSb3cwYSAgICAgICAgICAgICAgIFFOIFEyLlMxNgorcVJvdzBiICAgICAgICAgICAgICAgUU4gUTMuUzE2CisKKzsvL2RJbmRleCAgICAgICAgICAgICAgIEROICAgIEQxNi5VOCAgICAgICAgICAgICAgICAgCitxUm93MWEgICAgICAgICAgICAgICBRTiBRMTEuUzE2CitxUm93MWIgICAgICAgICAgICAgICBRTiBRMTIuUzE2CisKK2RSb3cyYSAgICAgICAgICAgICAgIEROIEQxNi5VOAorZFJvdzJiICAgICAgICAgICAgICAgRE4gRDE3LlU4CitkUm93M2EgICAgICAgICAgICAgICBETiBEMTguVTgKK2RSb3czYiAgICAgICAgICAgICAgIEROIEQxOS5VOAorCitxT3V0Um93MiAgICAgICAgICAgICBRTiBRMTEuVTE2CitxT3V0Um93MyAgICAgICAgICAgICBRTiBRMTIuVTE2CitkT3V0Um93MiAgICAgICAgICAgICBETiBEMjAuVTgKK2RPdXRSb3czICAgICAgICAgICAgIEROIEQyMS5VOAorZE91dFJvdzJVNjQgICAgICAgICAgRE4gRDIwLlU2NAorZE91dFJvdzNVNjQgICAgICAgICAgRE4gRDIxLlU2NAorCitxT3V0Um93MCAgICAgICAgICAgICBRTiBRMi5VMTYKK3FPdXRSb3cxICAgICAgICAgICAgIFFOIFEzLlUxNgorZE91dFJvdzAgICAgICAgICAgICAgRE4gRDguVTgKK2RPdXRSb3cxICAgICAgICAgICAgIEROIEQ5LlU4CisKK2RPdXRSb3cwVTY0ICAgICAgICAgIEROIEQ4LlU2NAorZE91dFJvdzFVNjQgICAgICAgICAgRE4gRDkuVTY0CisKK2RPdXRSb3cwVTMyICAgICAgICAgIEROIEQ4LlUzMgorZE91dFJvdzFVMzIgICAgICAgICAgRE4gRDkuVTMyCisKK2RPdXRSb3cwVTE2ICAgICAgICAgIEROIEQ4LlUxNgorZE91dFJvdzFVMTYgICAgICAgICAgRE4gRDkuVTE2CisKKworZE91dDBVNjQgICAgICAgICAgICAgRE4gRDAuVTY0CitkT3V0MVU2NCAgICAgICAgICAgICBETiBEMS5VNjQKKworZE91dDAwVTMyICAgICAgICAgICAgRE4gRDAuVTMyCitkT3V0MDFVMzIgICAgICAgICAgICBETiBEMS5VMzIKK2RPdXQxMFUzMiAgICAgICAgICAgIEROIEQyLlUzMgorZE91dDExVTMyICAgICAgICAgICAgRE4gRDMuVTMyCisKK2RPdXQwVTE2ICAgICAgICAgICAgIEROIEQwLlUxNgorZE91dDFVMTYgICAgICAgICAgICAgRE4gRDEuVTE2CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYSwgcjExLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgV2lkdGgsICAgICAgNAorICAgICAgICBNX0FSRyAgIEhlaWdodCwgICAgIDQKKyAgICAgICAgTV9BUkcgICBEeCwgICAgICAgICA0CisgICAgICAgIE1fQVJHICAgRHksICAgICAgICAgNAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIE1fTERSRCAgIGR4LCBkeSwgRHgKKyAgICAgICAgTV9MRFJEICAgaVdpZHRoLCBpSGVpZ2h0LCBXaWR0aAorICAgICAgICAKKyAgICAgICAgOy8vIEVpZ2h0TWludXNkeCA9IDggLSBkeAorICAgICAgICA7Ly8gRWlnaHRNaW51c2R5ID0gOCAtIGR5CisgICAgICAgIAorICAgICAgICA7Ly8gQUNvZWZmID0gRWlnaHRNaW51c2R4ICogRWlnaHRNaW51c2R5CisgICAgICAgIDsvLyBCQ29lZmYgPSBkeCAqIEVpZ2h0TWludXNkeQorICAgICAgICA7Ly8gQ0NvZWZmID0gRWlnaHRNaW51c2R4ICogZHkKKyAgICAgICAgOy8vIERDb2VmZiA9IGR4ICogZHkKKyAgICAgICAgCisgICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R4LCBkeCwgIzggCisgICAgICAgIFJTQiAgICAgRWlnaHRNaW51c2R5LCBkeSwgIzgKKyAgICAgICAgQ01OICAgICBkeCxkeQorICAgICAgICBNT1YgICAgIFN0ZXAxLCAjMQorICAgICAgICBMRFJFUSAgIHBUYWJsZSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvCisgICAgICAgIFNVQiAgICAgU3JjU3RlcE1pbnVzMSwgaVNyY1N0ZXAsIFN0ZXAxCisgICAgICAgIExEUk5FICAgcFRhYmxlLCA9YXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm8KKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgZFJvdzBhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgICAgICAgIDsvLyAwYQorICAgICAgICAKKyAgICAgICAgU01VTEJCICBBQ29lZmYsIEVpZ2h0TWludXNkeCwgRWlnaHRNaW51c2R5CisgICAgICAgIFNNVUxCQiAgQkNvZWZmLCBkeCwgRWlnaHRNaW51c2R5CisgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgICAgICAgIDsvLyAwYgorICAgICAgICBTTVVMQkIgIENDb2VmZiwgRWlnaHRNaW51c2R4LCBkeQorICAgICAgICBTTVVMQkIgIERDb2VmZiwgZHgsIGR5CisgICAgICAgIAorICAgICAgICBWRFVQICAgIGRBQ29lZmYsIEFDb2VmZgorICAgICAgICBWRFVQICAgIGRCQ29lZmYsIEJDb2VmZgorICAgICAgICBWRFVQICAgIGRDQ29lZmYsIENDb2VmZgorICAgICAgICBWRFVQICAgIGREQ29lZmYsIERDb2VmZgorICAgICAgICAKKyAgICAgICAgTERSICAgICBwYywgW3BUYWJsZSwgaVdpZHRoLCBMU0wgIzFdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBpV2lkdGgKKyAgICAgICAgCis7Ly8gUGl4ZWwgbGF5b3V0OgorOy8vCis7Ly8gICB4MDAgeDAxIHgwMgorOy8vICAgeDEwIHgxMSB4MTIKKzsvLyAgIHgyMCB4MjEgeDIyCisKKzsvLyBJZiBmcmFjdGlvbmwgbXYgaXMgbm90ICgwLCAwKQorV2lkdGhJczhNVklzTm90WmVybworCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAxYQorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMWIKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzBiLCBkUm93MWEsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzJhLCBbcFNyY10sIFN0ZXAxICAgICAgICAgICAgOy8vIDJhCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYSwgZFJvdzBiLCBkQkNvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cyYiwgW3BTcmNdLCBTcmNTdGVwTWludXMxICAgIDsvLyAyYgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MWEsIGRSb3cyYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93M2EsIFtwU3JjXSwgU3RlcDEgICAgICAgICAgICA7Ly8gM2EKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93MmIsIGRCQ29lZmYKKyAgICAgICAgICAgICAgICBWTVVMTCAgcVJvdzFiLCBkUm93M2EsIGRBQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzNiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEgICAgOy8vIDNiCisgICAgICAgICAgICAgICAgVk1MQUwgIHFSb3cwYiwgZFJvdzJhLCBkQ0NvZWZmCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cwYSwgW3BTcmNdLCBTdGVwMSAgICAgICAgICAgIDsvLyAwYQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWIsIGRSb3czYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MWEsIGRSb3czYSwgZENDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cxYiwgZERDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMSAgICA7Ly8gMGIKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93MGEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MmIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFhLCBkUm93M2IsIGREQ29lZmYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzQKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzFiLCBkUm93MGIsIGREQ29lZmYKKworICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzAsIHFPdXRSb3cwLCAjNgorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzEsIHFPdXRSb3cxLCAjNgorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzIsIHFPdXRSb3cyLCAjNgorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MFU2NCwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIFZRUlNIUk4gZE91dFJvdzMsIHFPdXRSb3czLCAjNgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICBkT3V0Um93MVU2NCwgW3BEc3RdLCBpRHN0U3RlcCAgCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3cyVTY0LCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVlNUMSAgIGRPdXRSb3czVTY0LCBbcERzdF0sIGlEc3RTdGVwICAKKyAgICAgICAgICAgICAgICAKKworICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczhNVklzTm90WmVybworICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKworV2lkdGhJczRNVklzTm90WmVybworCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMQorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKKyAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVMzJbMF0sIFtwRHN0XSwgaURzdFN0ZXAgIAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczRNVklzTm90WmVybworICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQKKworV2lkdGhJczJNVklzTm90WmVybworCisgICAgICAgICAgICAgICAgVkxEMSAgIGRSb3cxYSwgW3BTcmNdLCBTdGVwMQorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGEsIGRSb3cwYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZNVUxMICBxUm93MGIsIGRSb3cxYSwgZEFDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MWIsIFtwU3JjXSwgU3JjU3RlcE1pbnVzMQorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGEsIGRSb3cwYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZNTEFMICBxUm93MGIsIGRSb3cxYiwgZEJDb2VmZgorICAgICAgICAgICAgICAgIFZMRDEgICBkUm93MGEsIFtwU3JjXSwgU3RlcDEKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGEsIGRDQ29lZmYKKyAgICAgICAgICAgICAgICBWTEQxICAgZFJvdzBiLCBbcFNyY10sIFNyY1N0ZXBNaW51czEKKyAgICAgICAgICAgICAgICBTVUJTICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBiLCBkUm93MGIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICBWTUxBTCAgcVJvdzBhLCBkUm93MWIsIGREQ29lZmYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cxLCBxT3V0Um93MSwgIzYKKyAgICAgICAgICAgICAgICBWUVJTSFJOIGRPdXRSb3cwLCBxT3V0Um93MCwgIzYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzBVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgZE91dFJvdzFVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAgIAorCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzMk1WSXNOb3RaZXJvIAorICAgICAgICAgICAgICAgIE1PViAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgICAgICAgICBNX0VYSVQgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCis7Ly8gSWYgZnJhY3Rpb25sIG12IGlzICgwLCAwKQorV2lkdGhJczhNVklzWmVybworICAgICAgICAgICAgICAgIFNVQiAgICAgcFNyYywgcFNyYywgaVNyY1N0ZXAKKworV2lkdGhJczhMb29wTVZJc1plcm8KKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFNVQlMgICAgaUhlaWdodCwgaUhlaWdodCwgIzIKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYiwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDBVNjQsIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQxVTY0LCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgQkdUICAgICBXaWR0aElzOExvb3BNVklzWmVybworCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VycgorICAgICAgICAgICAgICAgIE1fRVhJVAorCitXaWR0aElzNE1WSXNaZXJvICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDAwVTMyWzBdLCBbcERzdF0sIGlEc3RTdGVwCisgICAgICAgICAgICAgICAgVkxEMSAgICBkUm93MGEsIFtwU3JjXSwgaVNyY1N0ZXAKKyAgICAgICAgICAgICAgICBWU1QxICAgIGRPdXQwMVUzMlswXSwgW3BEc3RdLCBpRHN0U3RlcAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIEJHVCAgICAgV2lkdGhJczRNVklzWmVybyAKKyAgICAgICAgICAgICAgICBNT1YgICAgIHJldHVybiwgICNPTVhfU3RzX05vRXJyCisgICAgICAgICAgICAgICAgTV9FWElUCisgICAgICAgICAgICAgICAgCitXaWR0aElzMk1WSXNaZXJvICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZMRDEgICAgZFJvdzBiLCBbcFNyY10sIGlTcmNTdGVwCisgICAgICAgICAgICAgICAgU1VCUyAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDBVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICBWTEQxICAgIGRSb3cwYSwgW3BTcmNdLCBpU3JjU3RlcAorICAgICAgICAgICAgICAgIFZTVDEgICAgZE91dDFVMTZbMF0sIFtwRHN0XSwgaURzdFN0ZXAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBCR1QgICAgIFdpZHRoSXMyTVZJc1plcm8gCisgICAgICAgICAgICAgICAgTU9WICAgICByZXR1cm4sICAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgTV9FTkQKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEVORElGIDsvLyBDb3J0ZXhBOAorICAgICAgICAKKyAgICAgICAgRU5ECisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWFfYXNtIGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlMjY0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCkBAIC0wLDAgKzEsNzQgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIGFybVZDTTRQMTBfUXVhbnRUYWJsZXNfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBUaGlzIGZpbGUgY29udGFpbnMgcXVhbnRpemF0aW9uIHRhYmxlcworOy8vIAorOy8vIAorCisgICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAKKyAgICAgICAgIAorICAgICAgICAgRVhQT1JUIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCisgICAgICAgICBFWFBPUlQgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUKKyAgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX1FQRGl2UGx1c09uZVRhYmxlICAKKyAgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdIGVudGlyZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGUKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIERDVyAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgICAgICBEQ1cgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgICAgICAgRENXIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyBBUk1fTTRQMTBfUV9PRkZTRVQgKyAxICsgKGlRUCAvIDYpIHZhbHVlcywKKzsvLyBmb3IgdmFsdWVzIG9mIGlRUCBmcm9tIDAgdG8gNTEgKGluY2x1c2l2ZSkuIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZQorICAgICAgICAgRENCIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyAgICAgICAgIERDQiAxNywgMTcsIDE3LCAxNywgMTcsIDE3CisgICAgICAgICBEQ0IgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOAorICAgICAgICAgRENCIDE5LCAxOSwgMTksIDE5LCAxOSwgMTkKKyAgICAgICAgIERDQiAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwCisgICAgICAgICBEQ0IgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMQorICAgICAgICAgRENCIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIKKyAgICAgICAgIERDQiAyMywgMjMsIDIzLCAyMywgMjMsIDIzCisgICAgICAgICBEQ0IgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzIFZhbHVlcyAoSW50cmEgY2FzZSkgLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4gCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAKKyAgICAgICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9RUERpdkludHJhVGFibGUsIDIKKyAgICAgICAgIERDRCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1CisgICAgICAgICBEQ0QgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MAorICAgICAgICAgRENEIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEKKyAgICAgICAgIERDRCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyCisgICAgICAgICBEQ0QgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNQorICAgICAgICAgRENEIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAKKyAgICAgICAgIERDRCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxLCAxMzk4MTAxCisgICAgICAgICBEQ0QgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMiwgMjc5NjIwMgorICAgICAgICAgRENEIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUsIDU1OTI0MDUgICAgICAgICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgRU5ECisgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTljMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1RyYW5zZm9ybVJlc2lkdWFsNHg0X3MucwpAQCAtMCwwICsxLDE4NiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gVHJhbnNmb3JtIFJlc2lkdWFsIDR4NCBDb2VmZmljaWVudHMKKzsvLyAKKzsvLyAKKworICAgICAgICAKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorICAgICAgICBNX1ZBUklBTlRTIENvcnRleEE4CisgICAgICAgIAorOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorOy8vIFNldCBkZWJ1Z2dpbmcgbGV2ZWwgICAgICAgIAorOy8vREVCVUdfT04gICAgU0VUTCB7VFJVRX0KKworCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKyAgICAKKworCisKKworCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIENvcnRleEE4CisKKzsvLyBBUk0gUmVnaXN0ZXJzCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BEc3QgICAgICAgICAgICAgICAgUk4gIDAKK3BTcmMgICAgICAgICAgICAgICAgUk4gIDEKKworCis7Ly8gTmVvbiBSZWdpc3RlcnMKKyAgICAgIAorOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2RJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNiAgICAgICAKK2RJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNiAgICAgICAKK2RJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNiAgICAgICAKK2RJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAgICAgICAKK2RaZXJvICAgICAgICAgICAgICAgRE4gIEQ0LlMxNgorZGUwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitkZTEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2RlMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGUzICAgICAgICAgICAgICAgICBETiAgRDguUzE2CitkSW4xUlMgICAgICAgICAgICAgIEROICBENy5TMTYKK2RJbjNSUyAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZGYwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkZjEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RmMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZGYzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CitxZjAxICAgICAgICAgICAgICAgIFFOICBRMC4zMgorcWYyMyAgICAgICAgICAgICAgICBRTiAgUTEuMzIKK2RnMCAgICAgICAgICAgICAgICAgRE4gIEQ1LlMxNgorZGcxICAgICAgICAgICAgICAgICBETiAgRDYuUzE2CitkZzIgICAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RnMyAgICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorZGYxUlMgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZjNSUyAgICAgICAgICAgICAgIEROICBEOC5TMTYKKworOy8vIE91dHB1dCBwaXhlbHMKK2RoMCAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZGgxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkaDIgICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RoMyAgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NCwgLGQ4CisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKKyAgICAgICAgOy8vIExvYWQgdGhlIDR4NCBibG9jayBpbnRvIDggcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIDR4NCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIAorICAgICAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKKyAgICAgICAgOy8vIFRyYW5zcG9zZSB0aGUgNHg0IHJlc3VsdCBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsvLyBQZXJmb3JtIHRoZSBjb2xvdW1uIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgOy8vIFN0b3JlIHRoZSA0eDQgYmxvY2sgYXQgb25lIGdvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICAgICA7Ly8gTG9hZCBhbGwgdGhlIDR4NCBwaXhlbHMgaW4gdHJhbnNwb3NlZCBmb3JtCisgICAgICAgIAorICAgICAgICBWTEQ0ICAgIHtkSW4wLGRJbjEsZEluMixkSW4zfSxbcFNyY10KKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgZFplcm8sIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVXNlZCB0byByaWdodCBzaGlmdCBieSAxIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkZTAsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgVlNVQiAgICAgICAgZGUxLGRJbjAsZEluMiAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAorICAgICAgICBWSEFERCAgICAgICBkSW4xUlMsZEluMSxkWmVybyAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgVkhBREQgICAgICAgZEluM1JTLGRJbjMsZFplcm8KKyAgICAgICAgVlNVQiAgICAgICAgZGUyLGRJbjFSUyxkSW4zICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKKyAgICAgICAgVkFERCAgICAgICAgZGUzLGRJbjEsZEluM1JTICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMyA9IGQxICsgKGQzPj4xKSAKKyAgICAgICAgVkFERCAgICAgICAgZGYwLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMCA9IGUwICsgZTMKKyAgICAgICAgVkFERCAgICAgICAgZGYxLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMSA9IGUxICsgZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGYyLGRlMSxkZTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMiA9IGUxIC0gZTIKKyAgICAgICAgVlNVQiAgICAgICAgZGYzLGRlMCxkZTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBmMyA9IGUwIC0gZTMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWVFJOICAgIGRmMCxkZjEKKyAgICAgICAgVlRSTiAgICBkZjIsZGYzCisgICAgICAgIFZUUk4gICAgcWYwMSxxZjIzIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gQ29sb3VtbiBPcGVyYXRpb25zIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICAgICBkZzAsZGYwLGRmMiAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUwID0gZDAgKyBkMiAKKyAgICAgICAgVlNVQiAgICAgICAgZGcxLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCisgICAgICAgIFZIQUREICAgICAgIGRmMVJTLGRmMSxkWmVybyAgICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBWSEFERCAgICAgICBkZjNSUyxkZjMsZFplcm8KKyAgICAgICAgVlNVQiAgICAgICAgZGcyLGRmMVJTLGRmMyAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMiA9IChkMT4+MSkgLSBkMyAKKyAgICAgICAgVkFERCAgICAgICAgZGczLGRmMSxkZjNSUyAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTMgPSBkMSArIChkMz4+MSkgCisgICAgICAgIFZBREQgICAgICAgIGRoMCxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjAgPSBlMCArIGUzCisgICAgICAgIFZBREQgICAgICAgIGRoMSxkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjEgPSBlMSArIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRoMixkZzEsZGcyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjIgPSBlMSAtIGUyCisgICAgICAgIFZTVUIgICAgICAgIGRoMyxkZzAsZGczICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZjMgPSBlMCAtIGUzCisgICAgICAgIAorICAgICAgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42CisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZSU0hSICAgICAgIGRoMCwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDEsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgyLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMywjNgorICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gU3RvcmUgYWxsIHRoZSA0eDQgcGl4ZWxzCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZTVDEgICB7ZGgwLGRoMSxkaDIsZGgzfSxbcERzdF0KKyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIFNldCByZXR1cm4gdmFsdWUKKyAgICAgICAgCitFbmQgICAgICAgICAgICAgICAgCisKKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9Db3J0ZXhBOCAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGM1MmUyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKQEAgLTAsMCArMSw5MiBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgICAgICAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCis7Ly8gRGVmaW5lIHRoZSBwcm9jZXNzb3IgdmFyaWFudHMgc3VwcG9ydGVkIGJ5IHRoaXMgZmlsZQorCisgICAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgSUYgQVJNMTEzNkpTCisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBJbnB1dCBBcmd1bWVudHMgYW5kIHRoZWlyIHNjb3BlL3VzYWdlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHBTcmMgICAgICAgICAgIFJOIDAgICAgOy8vIFBlcnNpc3RlbnQgdmFyaWFibGUKK3BEc3QgICAgICAgICAgICBSTiAxICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVmFyaWFibGVzIGFuZCB0aGVpciBzY29wZS91c2FnZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmMgICAgICAgICAgICBSTiAyICAgIDsvLyBQZXJzaXN0ZW50IHZhcmlhYmxlcworRmxhZyAgICAgICAgICAgIFJOIDMgICAgCitWYWx1ZSAgICAgICAgICAgUk4gNCAgICAKK1ZhbHVlMiAgICAgICAgICBSTiA1ICAgIAorc3RyT2Zmc2V0ICAgICAgIFJOIDYgICAgCitjc3RPZmZzZXQgICAgICAgUk4gNyAgICAKKworICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0LCByNworICAgICAgICAKKyAgICAgICAgTERSICAgICBwU3JjLCBbcHBTcmNdICAgICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBwU3JjCisgICAgICAgIE1PViAgICAgY3N0T2Zmc2V0LCAjMzEgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7IEZpcnN0bHksIGZpbGwgYWxsIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgb24gdGhlIDxwRHN0PiBidWZmZXIgYnkgemVybworICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgVmFsdWUsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSW5pdGlhbGl6ZSB0aGUgemVybyB2YWx1ZQorICAgICAgICBNT1YgICAgICBWYWx1ZTIsICMwICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSB6ZXJvIHZhbHVlCisgICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgOy8vIFByZWxvYWQgPEZsYWc+IGJlZm9yZSA8dW5wYWNrTG9vcD4KKyAgICAgICAgCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzBdICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMF0gID0gcERzdFsxXSAgPSBwRHN0WzJdICA9IHBEc3RbM10gID0gMAorICAgICAgICBTVFJEICAgICBWYWx1ZSwgW3BEc3QsICM4XSAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzRdICA9IHBEc3RbNV0gID0gcERzdFs2XSAgPSBwRHN0WzddICA9IDAKKyAgICAgICAgU1RSRCAgICAgVmFsdWUsIFtwRHN0LCAjMTZdICAgICAgICAgICAgICAgICA7Ly8gcERzdFs4XSAgPSBwRHN0WzldICA9IHBEc3RbMTBdID0gcERzdFsxMV0gPSAwCisgICAgICAgIFNUUkQgICAgIFZhbHVlLCBbcERzdCwgIzI0XSAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMTJdID0gcERzdFsxM10gPSBwRHN0WzE0XSA9IHBEc3RbMTVdID0gMAorICAgICAgICAKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gVGhlIGxvb3AgYmVsb3cgcGFyc2VzIGFuZCB1bnBhY2tzIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBDLW1vZGVsIGhhcyAKKyAgICAgICAgOy8vIGEgc29tZXdoYXQgY29tcGxpY2F0ZWQgbG9naWMgZm9yIHNpZ24gZXh0ZW5zaW9uLiAgQnV0IGluIHRoZSB2NiB2ZXJzaW9uLAorICAgICAgICA7Ly8gdGhhdCBjYW4gYmUgZWFzaWx5IHRha2VuIGNhcmUgYnkgbG9hZGluZyB0aGUgZGF0YSBmcm9tIDxwU3JjPiBzdHJlYW0gYXMgCisgICAgICAgIDsvLyBTSUdORUQgYnl0ZS9oYWxmd29yZC4gU28sIGJhc2VkIG9uIHRoZSBmaXJzdCBUU1QgaW5zdHJ1Y3Rpb24sIDgtYml0cyBvciAKKyAgICAgICAgOy8vIDE2LWJpdHMgYXJlIHJlYWQuCisgICAgICAgIDsvLworICAgICAgICA7Ly8gTmV4dCwgdG8gY29tcHV0ZSB0aGUgb2Zmc2V0LCB3aGVyZSB0aGUgdW5wYWNrZWQgdmFsdWUgbmVlZHMgdG8gYmUgc3RvcmVkLAorICAgICAgICA7Ly8gd2UgbW9kaWZ5IHRoZSBjb21wdXRhdGlvbiB0byBwZXJmb3JtIFsoRmxhZyAmIDE1KSA8IDFdIGFzIFsoRmxhZyA8IDEpICYgMzFdCisgICAgICAgIDsvLyBUaGlzIHJlc3VsdHMgaW4gYSBzYXZpbmcgb2Ygb25lIGN5Y2xlLgorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAordW5wYWNrTG9vcAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKKyAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgYnl0ZSB3aXNlIHRvIGF2b2lkIHVuYWxpZ25lZCBhY2Nlc3MgICAKKyAgICAgICAgTERSQk5FICAgVmFsdWUsIFtwU3JjXSwgIzIgICAgICAgICAgICAgICAgICAgCisgICAgICAgIEFORCAgICAgIHN0ck9mZnNldCwgY3N0T2Zmc2V0LCBGbGFnLCBMU0wgIzEgIDsvLyBzdHJPZmZzZXQgPSAoRmxhZyAmIDE1KSA8IDE7CisgICAgICAgIExEUlNCRVEgIFZhbHVlLCBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTgpICAqcFNyYysrCisgICAgICAgIE9SUk5FICAgIFZhbHVlLFZhbHVlLFZhbHVlMiwgTFNMICM4ICAgICAgICAgIDsvLyBWYWx1ZSA9IChPTVhfVTE2KSAqcFNyYysrCisgICAgICAgIAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MjAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgyMCkgdG8gY2hlY2ssIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgTERSQkVRICAgRmxhZywgIFtwU3JjXSwgIzEgICAgICAgICAgICAgICAgICAgOy8vIEZsYWcgID0gKE9NWF9VOCkgKnBTcmMrKywgZm9yIG5leHQgaXRlcmF0aW9uCisgICAgICAgIFNUUkggICAgIFZhbHVlLCBbcERzdCwgc3RyT2Zmc2V0XSAgICAgICAgICAgIDsvLyBTdG9yZSA8VmFsdWU+IGF0IG9mZnNldCA8c3RyT2Zmc2V0PgorICAgICAgICBCRVEgICAgICB1bnBhY2tMb29wICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIHRoZSBsb29wIGJlZ2lubmluZworICAgICAgICAKKyAgICAgICAgU1RSICAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVwZGF0ZSB0aGUgYml0c3RyZWFtIHBvaW50ZXIKKyAgICAgICAgTV9FTkQKKyAgICAKKyAgICBFTkRJRgorICAgIAorICAgIAorICAgIAorICAgIEVORAorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrQ2hyb21hX0kuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGQ0ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tDaHJvbWFfSS5jCkBAIC0wLDAgKzEsODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgaW50cmEgY2hyb21hIGRlYmxvY2sKKyAqIAorICovCisgCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtQ09NTS5oIgorI2luY2x1ZGUgImFybVZDLmgiCisKKy8qKgorICogRnVuY3Rpb246IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBkZWJsb2NraW5nIGZpbHRlcmluZyBvbiBhbGwgZWRnZXMgb2YgdGhlIGNocm9tYSBtYWNyb2Jsb2NrICgxNngxNikuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIFN0ZXAgb2YgdGhlIGFycmF5cworICogW2luXQlwQWxwaGEgICAgICAgICAgcG9pbnRlciB0byBhIDJ4MiBhcnJheSBvZiBhbHBoYSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsICB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBlZGdlLCBpbnRlcm5hbCBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwQmV0YQkJCXBvaW50ZXIgdG8gYSAyeDIgYXJyYXkgb2YgYmV0YSB0aHJlc2hvbGRzLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyBleHRlcm5hbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBlZGdlLCBpbnRlcm5hbCB2ZXJ0aWNhbCBlZGdlLCBleHRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCAgaG9yaXpvbnRhbCBlZGdlIH0KKyAqIFtpbl0JcFRocmVzaG9sZHMJCUFBcnJheSBvZiBzaXplICA4eDIgb2YgVGhyZXNob2xkcyAoVEMwKSAodmFsdWVzIGZvciB0aGUgbGVmdCBvcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgZWRnZSBvZiBlYWNoIDR4MiBvciAyeDQgYmxvY2ssIGFycmFuZ2VkIGluICB2ZXJ0aWNhbCBibG9jayBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gIGhvcml6b250YWwgYmxvY2sgb3JkZXIpCisgKiBbaW5dCXBCUwkJCQlhcnJheSBvZiBzaXplIDE2eDIgb2YgQlMgcGFyYW1ldGVycyAoYXJyYW5nZWQgaW4gc2NhbiBibG9jayBvcmRlciBmb3IgdmVydGljYWwgZWRnZXMgYW5kIHRoZW4gaG9yaXpvbnRhbCBlZGdlcyk7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2sKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiBPTVhfU3RzX05vRXJyIC0gbm8gZXJyb3IKKyAqIE9NWF9TdHNfQmFkQXJnRXJyIC0gYmFkIGFyZ3VtZW50cworICogICAtIEVpdGhlciBvZiB0aGUgcG9pbnRlcnMgaW4gcFNyY0RzdCwgcEFscGhhLCBwQmV0YSwgcFRyZXNob2xkcywgb3IgcEJTIGlzIE5VTEwuCisgKiAgIC0gcFNyY0RzdCBpcyBub3QgOC1ieXRlIGFsaWduZWQuCisgKiAgIC0gZWl0aGVyIHBUaHJlc2hvbGRzIG9yIHBCUyBpcyBub3QgNC1ieXRlIGFsaWduZWQuCisgKiAgIC0gcEJTIGlzIG91dCBvZiByYW5nZSwgaS5lLiwgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlOiBwQlNbaV08MCwgcEJTW2ldPjQsIHBCU1tpXT09NCBmb3IgaT49NCwgb3IgKHBCU1tpXT09NCAmJiBwQlNbaV4xXSE9NCkgZm9yIDA8PWk8PTMuCisgKiAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICoKKyAqLworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVibG9ja0Nocm9tYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywKKyAgICBjb25zdCBPTVhfVTggKnBCUworKQoreworICAgIE9NWFJlc3VsdCBlcnJvckNvZGU7CisgICAgCisgICAgYXJtUmV0QXJnRXJySWYocFNyY0RzdCA9PSBOVUxMLCAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihzcmNkc3RTdGVwICYgNywgICAgICAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEFscGhhID09IE5VTEwsICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCZXRhID09IE5VTEwsICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYoYXJtTm90NEJ5dGVBbGlnbmVkKHBUaHJlc2hvbGRzKSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHBCUyA9PSBOVUxMLCAgICAgICAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocEJTKSwgICAgICAgICBPTVhfU3RzX0JhZEFyZ0Vycik7CisKKyAgICBlcnJvckNvZGUgPSBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSgKKyAgICAgICAgcFNyY0RzdCwgc3JjZHN0U3RlcCwgcEFscGhhKzIsIHBCZXRhKzIsIHBUaHJlc2hvbGRzKzgsIHBCUysxNik7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE5MzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKQEAgLTAsMCArMSw5MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIAorICogRmlsZSBOYW1lOiAgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JLmMKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICogSC4yNjQgbHVtYSBkZWJsb2NrCisgKiAKKyAqLworIAorI2luY2x1ZGUgIm9teHR5cGVzLmgiCisjaW5jbHVkZSAiYXJtT01YLmgiCisjaW5jbHVkZSAib214VkMuaCIKKworI2luY2x1ZGUgImFybUNPTU0uaCIKKyNpbmNsdWRlICJhcm1WQy5oIgorIAorCisvKioKKyAqIEZ1bmN0aW9uOiBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgZGVibG9jayBmaWx0ZXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGVkZ2VzIG9mIGEgbHVtYSBtYWNyb2Jsb2NrCisgKigxNngxNikuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjRHN0ICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5wdXQgbWFjcm9ibG9jay4gTXVzdCBiZSA4LWJ5dGUgYWxpZ25lZC4KKyAqIFtpbl0Jc3JjZHN0U3RlcCAgICAgIGltYWdlIHdpZHRoCisgKiBbaW5dCXBBbHBoYSAgICAgICAgICBwb2ludGVyIHRvIGEgMngyIHRhYmxlIG9mIGFscGhhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgZWRnZSwgaW50ZXJuYWwgdmVydGljYWwgZWRnZSwgZXh0ZXJuYWwgaG9yaXpvbnRhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UsIGludGVybmFsIGhvcml6b250YWwgZWRnZSB9CisgKiBbaW5dCXBCZXRhCQkJcG9pbnRlciB0byBhIDJ4MiB0YWJsZSBvZiBiZXRhIHRocmVzaG9sZHMsIG9yZ2FuaXplZCBhcyBmb2xsb3dzOiB7IGV4dGVybmFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIGVkZ2UsIGludGVybmFsIHZlcnRpY2FsIGVkZ2UsIGV4dGVybmFsICBob3Jpem9udGFsIGVkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsICBob3Jpem9udGFsIGVkZ2UgfQorICogW2luXQlwVGhyZXNob2xkcwkJcG9pbnRlciB0byBhIDE2eDIgdGFibGUgb2YgdGhyZXNob2xkIChUQzApLCBvcmdhbml6ZWQgYXMgZm9sbG93czogeyB2YWx1ZXMgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAgbGVmdCBvciBhYm92ZSBlZGdlIG9mIGVhY2ggNHg0IGJsb2NrLCBhcnJhbmdlZCBpbiAgdmVydGljYWwgYmxvY2sgb3JkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZW4gaW4gaG9yaXpvbnRhbCBibG9jayBvcmRlcikKKyAqIFtpbl0JcEJTCQkJCSBwb2ludGVyIHRvIGEgMTZ4MiB0YWJsZSBvZiBCUyBwYXJhbWV0ZXJzIGFycmFuZ2VkIGluIHNjYW4gYmxvY2sgb3JkZXIgZm9yIHZlcnRpY2FsIGVkZ2VzIGFuZCB0aGVuIGhvcml6b250YWwgZWRnZXM7CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsNF0gd2l0aCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczogaSkgcEJTW2ldPT0gNCBtYXkgb2NjdXIgb25seSBmb3IgMDw9aTw9MywgaWkpIHBCU1tpXT09IDQgaWYgYW5kIG9ubHkgaWYgcEJTW2leMV09PSA0LiAgTXVzdCBiZSA0LWJ5dGUgYWxpZ25lZC4KKyAqIFtvdXRdCXBTcmNEc3QJCXBvaW50ZXIgdG8gZmlsdGVyZWQgb3V0cHV0IG1hY3JvYmxvY2suCisgKgorICogUmV0dXJuIFZhbHVlOgorICogT01YX1N0c19Ob0VyciAtIG5vIGVycm9yCisgKiBPTVhfU3RzX0JhZEFyZ0VyciAtIGJhZCBhcmd1bWVudHMKKyAqICAgIC0gRWl0aGVyIG9mIHRoZSBwb2ludGVycyBpbiBwU3JjRHN0LCBwQWxwaGEsIHBCZXRhLCBwVHJlc2hvbGRzIG9yIHBCUyBpcyBOVUxMLgorICogICAgLSBwU3JjRHN0IGlzIG5vdCA4LWJ5dGUgYWxpZ25lZC4KKyAqICAgIC0gc3JjZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4CisgKiAgICAtIHBCUyBpcyBvdXQgb2YgcmFuZ2UsIGkuZS4sIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZTogcEJTW2ldPDAsIHBCU1tpXT40LCBwQlNbaV09PTQgZm9yIGk+PTQsIG9yIChwQlNbaV09PTQgJiYgcEJTW2leMV0hPTQpIGZvciAwPD1pPD0zLgorLgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JKAorCU9NWF9VOCogcFNyY0RzdCwgCisJT01YX1MzMiBzcmNkc3RTdGVwLCAKKwljb25zdCBPTVhfVTgqIHBBbHBoYSwgCisJY29uc3QgT01YX1U4KiBwQmV0YSwgCisJY29uc3QgT01YX1U4KiBwVGhyZXNob2xkcywgCisJY29uc3QgT01YX1U4ICpwQlMKKykKK3sKKyAgICBPTVhSZXN1bHQgZXJyb3JDb2RlOworICAgIAorICAgIGFybVJldEFyZ0VycklmKHBTcmNEc3QgPT0gTlVMTCwgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDhCeXRlQWxpZ25lZChwU3JjRHN0KSwgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKHNyY2RzdFN0ZXAgJiA3LCAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOyAgICAKKyAgICBhcm1SZXRBcmdFcnJJZihwQWxwaGEgPT0gTlVMTCwgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwQmV0YSA9PSBOVUxMLCAgICAgICAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihwVGhyZXNob2xkcyA9PSBOVUxMLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKyAgICBhcm1SZXRBcmdFcnJJZihhcm1Ob3Q0Qnl0ZUFsaWduZWQocFRocmVzaG9sZHMpLCBPTVhfU3RzX0JhZEFyZ0Vycik7CisgICAgYXJtUmV0QXJnRXJySWYocEJTID09IE5VTEwsICAgICAgICAgICAgICAgICAgICAgT01YX1N0c19CYWRBcmdFcnIpOworICAgIGFybVJldEFyZ0VycklmKGFybU5vdDRCeXRlQWxpZ25lZChwQlMpLCAgICAgICAgIE9NWF9TdHNfQmFkQXJnRXJyKTsKKworICAgIGVycm9yQ29kZSA9IG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JKAorICAgICAgICBwU3JjRHN0LCBzcmNkc3RTdGVwLCBwQWxwaGEsIHBCZXRhLCBwVGhyZXNob2xkcywgcEJTKTsKKworICAgIGFybVJldEFyZ0VycklmKGVycm9yQ29kZSAhPSBPTVhfU3RzX05vRXJyLCBlcnJvckNvZGUpCisgICAgCisgICAgZXJyb3JDb2RlID0gb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0koCisgICAgICAgIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIHBBbHBoYSsyLCBwQmV0YSsyLCBwVGhyZXNob2xkcysxNiwgcEJTKzE2KTsKKworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTg3MWJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYwpAQCAtMCwwICsxLDYyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogCisgKiBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlY29kZUNocm9tYURjQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDaHJvbWFEY0NvZWZmc1RvUGFpckNBVkxDCisgKgorICogRGVzY3JpcHRpb246CisgKiBQZXJmb3JtcyBDQVZMQyBkZWNvZGluZyBhbmQgaW52ZXJzZSByYXN0ZXIgc2NhbiBmb3IgMngyIGJsb2NrIG9mIAorICogQ2hyb21hRENMZXZlbC4gVGhlIGRlY29kZWQgY29lZmZpY2llbnRzIGluIHBhY2tlZCBwb3NpdGlvbi1jb2VmZmljaWVudCAKKyAqIGJ1ZmZlciBhcmUgc3RvcmVkIGluIGluY3JlYXNpbmcgcmFzdGVyIHNjYW4gb3JkZXIsIG5hbWVseSBwb3NpdGlvbiBvcmRlci4KKyAqCisgKiBSZW1hcmtzOgorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBbaW5dCXBwQml0U3RyZWFtCQlEb3VibGUgcG9pbnRlciB0byBjdXJyZW50IGJ5dGUgaW4gYml0IHN0cmVhbQorICoJCQkJCQkJCWJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSAKKyAqCQkJCQkJCQlwb2ludGVkIHRvIGJ5ICpwcEJpdFN0cmVhbQorICogW291dF0JcHBCaXRTdHJlYW0JCSpwcEJpdFN0cmVhbSBpcyB1cGRhdGVkIGFmdGVyIGVhY2ggYmxvY2sgaXMgZGVjb2RlZAorICogW291dF0JcE9mZnNldAkJCSpwT2Zmc2V0IGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwTnVtQ29lZmYJCVBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cworICoJCQkJCQkJCWluIHRoaXMgYmxvY2sKKyAqIFtvdXRdCXBwUG9zQ29lZmJ1ZglEb3VibGUgcG9pbnRlciB0byBkZXN0aW5hdGlvbiByZXNpZHVhbAorICoJCQkJCQkJCWNvZWZmaWNpZW50LXBvc2l0aW9uIHBhaXIgYnVmZmVyCisgKgorICogUmV0dXJuIFZhbHVlOgorICogU3RhbmRhcmQgb214RXJyb3IgcmVzdWx0LiBTZWUgZW51bWVyYXRpb24gZm9yIHBvc3NpYmxlIHJlc3VsdCBjb2Rlcy4KKyAqCisgKi8KKworT01YUmVzdWx0IG9teFZDTTRQMTBfRGVjb2RlQ2hyb21hRGNDb2VmZnNUb1BhaXJDQVZMQyAoCisgICAgIGNvbnN0IE9NWF9VOCoqIHBwQml0U3RyZWFtLAorICAgICBPTVhfUzMyKiBwT2Zmc2V0LAorICAgICBPTVhfVTgqIHBOdW1Db2VmZiwKKyAgICAgT01YX1U4KiogcHBQb3NDb2VmYnVmICAgICAgICAKKyApCisKK3sKKyAgICByZXR1cm4gYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXIocHBCaXRTdHJlYW0sIHBPZmZzZXQsIHBOdW1Db2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBQb3NDb2VmYnVmLCAxNywgNCk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjI5ZTU3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQy5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyQ0FWTEMuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqCisgKiBILjI2NCBkZWNvZGUgY29lZmZpY2llbnRzIG1vZHVsZQorICogCisgKi8KKyAKKyNpbmNsdWRlICJvbXh0eXBlcy5oIgorI2luY2x1ZGUgImFybU9NWC5oIgorI2luY2x1ZGUgIm9teFZDLmgiCisKKyNpbmNsdWRlICJhcm1DT01NLmgiCisjaW5jbHVkZSAiYXJtVkMuaCIKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJDQVZMQworICoKKyAqIERlc2NyaXB0aW9uOgorICogUGVyZm9ybXMgQ0FWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gZm9yIDR4NCBibG9jayBvZiAKKyAqIEludHJhMTZ4MTZEQ0xldmVsLCBJbnRyYTE2eDE2QUNMZXZlbCxMdW1hTGV2ZWwsIGFuZCBDaHJvbWFBQ0xldmVsLiAKKyAqIEludmVyc2UgZmllbGQgc2NhbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGVjb2RlZCBjb2VmZmljaWVudHMgaW4gcGFja2VkIAorICogcG9zaXRpb24tY29lZmZpY2llbnQgYnVmZmVyIGFyZSBzdG9yZWQgaW4gaW5jcmVhc2luZyB6aWd6YWcgb3JkZXIgaW5zdGVhZCAKKyAqIG9mIHBvc2l0aW9uIG9yZGVyLgorICoKKyAqIFJlbWFya3M6CisgKgorICogUGFyYW1ldGVyczoKKyAqIFtpbl0JcHBCaXRTdHJlYW0JCURvdWJsZSBwb2ludGVyIHRvIGN1cnJlbnQgYnl0ZSBpbiBiaXQgc3RyZWFtIGJ1ZmZlcgorICogW2luXQlwT2Zmc2V0CQkJUG9pbnRlciB0byBjdXJyZW50IGJpdCBwb3NpdGlvbiBpbiB0aGUgYnl0ZSBwb2ludGVkCisgKgkJCQkJCQkJdG8gYnkgKnBwQml0U3RyZWFtCisgKiBbaW5dCXNNYXhOdW1Db2VmZglNYXhpbXVtIG51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMgaW4gY3VycmVudAorICoJCQkJCQkJCWJsb2NrCisgKiBbaW5dCXNWTENTZWxlY3QJCVZMQyB0YWJsZSBzZWxlY3Rvciwgb2J0YWluZWQgZnJvbSBudW1iZXIgb2Ygbm9uLXplcm8KKyAqCQkJCQkJCQlBQyBjb2VmZmljaWVudHMgb2YgYWJvdmUgYW5kIGxlZnQgNHg0IGJsb2Nrcy4gSXQgaXMgCisgKgkJCQkJCQkJZXF1aXZhbGVudCB0byB0aGUgdmFyaWFibGUgbkMgZGVzY3JpYmVkIGluIEguMjY0IHN0YW5kYXJkIAorICoJCQkJCQkJCXRhYmxlIDktNSwgZXhjZXB0IGl0cyB2YWx1ZSBjYW6hr3QgYmUgbGVzcyB0aGFuIHplcm8uCisgKiBbb3V0XQlwcEJpdFN0cmVhbQkJKnBwQml0U3RyZWFtIGlzIHVwZGF0ZWQgYWZ0ZXIgZWFjaCBibG9jayBpcyBkZWNvZGVkCisgKiBbb3V0XQlwT2Zmc2V0CQkJKnBPZmZzZXQgaXMgdXBkYXRlZCBhZnRlciBlYWNoIGJsb2NrIGlzIGRlY29kZWQKKyAqIFtvdXRdCXBOdW1Db2VmZgkJUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIG5vbnplcm8gY29lZmZpY2llbnRzIGluCisgKgkJCQkJCQkJdGhpcyBibG9jaworICogW291dF0JcHBQb3NDb2VmYnVmCURvdWJsZSBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIHJlc2lkdWFsCisgKgkJCQkJCQkJY29lZmZpY2llbnQtcG9zaXRpb24gcGFpciBidWZmZXIKKyAqIFJldHVybiBWYWx1ZToKKyAqIFN0YW5kYXJkIG9teEVycm9yIHJlc3VsdC4gU2VlIGVudW1lcmF0aW9uIGZvciBwb3NzaWJsZSByZXN1bHQgY29kZXMuCisgKgorICovCisKK09NWFJlc3VsdCBvbXhWQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpckNBVkxDKAorICAgICBjb25zdCBPTVhfVTgqKiBwcEJpdFN0cmVhbSwKKyAgICAgT01YX1MzMiogcE9mZnNldCwKKyAgICAgT01YX1U4KiBwTnVtQ29lZmYsCisgICAgIE9NWF9VOCoqcHBQb3NDb2VmYnVmLAorICAgICBPTVhfSU5UIHNWTENTZWxlY3QsCisgICAgIE9NWF9JTlQgc01heE51bUNvZWZmICAgICAgICAKKyApCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyKHBwQml0U3RyZWFtLCBwT2Zmc2V0LCBwTnVtQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwUG9zQ29lZmJ1Ziwgc1ZMQ1NlbGVjdCwgc01heE51bUNvZWZmKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4NWE0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5zCkBAIC0wLDAgKzEsMzk2IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKzsvLyBEZXNjcmlwdGlvbjoKKzsvLyBILjI2NCBpbnZlcnNlIHF1YW50aXplIGFuZCB0cmFuc2Zvcm0gbW9kdWxlCis7Ly8gCis7Ly8gCisKKyAgICAgICAgCisKKzsvLyBJbmNsdWRlIHN0YW5kYXJkIGhlYWRlcnMKKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICAgIAorOy8vIEltcG9ydCBzeW1ib2xzIHJlcXVpcmVkIGZyb20gb3RoZXIgZmlsZXMKKzsvLyAoRm9yIGV4YW1wbGUgdGFibGVzKQorICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBNb2R1bG9UYWJsZSAKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgCisKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKworCisKKworCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQgICAgICAgICAgICAKKyAgICAKKzsvLyBHdWFyZGluZyBpbXBsZW1lbnRhdGlvbiBieSB0aGUgcHJvY2Vzc29yIG5hbWUKKyAgICAKKyAgICAKKyAgICAKKzsvLyBGdW5jdGlvbjogb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZCAgICAgICAgICAgIAorICAgIAorOy8vIEd1YXJkaW5nIGltcGxlbWVudGF0aW9uIGJ5IHRoZSBwcm9jZXNzb3IgbmFtZQorICAgIAorICAgIElGICBDb3J0ZXhBOAorICAgIAorCis7Ly8gQVJNIFJlZ2lzdGVycworCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BwU3JjICAgICAgIFJOICAwCitwUHJlZCAgICAgICBSTiAgMQorcERDICAgICAgICAgUk4gIDIKK3BEc3QgICAgICAgIFJOICAzCisgICAKKworOy8vT3V0cHV0IFJlZ2lzdGVycworcmVzdWx0ICAgICAgUk4gIDAKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworOy8vUmVnaXN0ZXJzIHVzZWQgaW4gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CitwUVBkaXYgICAgICBSTiAgMTAKK3BRUG1vZCAgICAgIFJOICAxMQorcFZSb3cgICAgICAgUk4gIDIKK1FQbW9kICAgICAgIFJOICAxMgorc2hpZnQgICAgICAgUk4gIDE0CitpbmRleDAgICAgICBSTiAgMSAKK2luZGV4MSAgICAgIFJOICAxMCAKKworOy8vUmVnaXN0ZXJzIHVzZWQgaW4gRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKK3BEZWx0YSAgICAgIFJOICA0CitwRGVsdGFUbXAgICBSTiAgNgorQUMgICAgICAgICAgUk4gIDUgICAgICAgICAgICAgICAgICAgOy8vTG9hZCBmcm9tIHN0YWNrCitwUHJlZFRlbXAgICBSTiAgNworcERDVGVtcCAgICAgUk4gIDgKK3BEc3RUZW1wICAgIFJOICA5CitwRGVsdGFBcmcxICBSTiAgMQorcERlbHRhQXJnMCAgUk4gIDAKK1FQICAgICAgICAgIFJOICAxICAgICAgICAgICAgICAgICAgIDsvL0xvYWQgZnJvbSBzdGFjaworREN2YWwgICAgICAgUk4gIDEwICAKK3ByZWRzdGVwICAgIFJOICAxCitkc3RTdGVwICAgICBSTiAgMTAKK1ByZWRWYWwxICAgIFJOICAzCitQcmVkVmFsMiAgICBSTiAgNQorCisKKworCis7Ly8gTmVvbiBSZWdpc3RlcnMKKworOy8vIFJlZ2lzdGVycyB1c2VkIGluIGFybVZDTTRQMTBfRGVxdWFudEx1bWFBQzR4NAorCitkVm1hdHJpeCAgICAgICAgICAgIEROICBENi44ICAKK2RpbmRleFJvdzAgICAgICAgICAgRE4gIEQ3LjMyIAorZGluZGV4Um93MSAgICAgICAgICBETiAgRDkuMzIgCitkQnl0ZUluZGV4Um93MCAgICAgIEROICBENy44CitkQnl0ZUluZGV4Um93MSAgICAgIEROICBEOS44CitkVlJvdzAgICAgICAgICAgICAgIEROICBEOC44ICAKK2RWUm93MSAgICAgICAgICAgICAgRE4gIEQ0LjgKK2RWUm93MFUxNiAgICAgICAgICAgRE4gIEQ4LlUxNgorZFZSb3cxVTE2ICAgICAgICAgICBETiAgRDQuVTE2CitkVlJvdzJVMTYgICAgICAgICAgIEROICBEOC5VMTYKK2RWUm93M1UxNiAgICAgICAgICAgRE4gIEQ0LlUxNgorCitkU2hpZnQgICAgICAgICAgICAgIEROICBENS5VMTYKK2RTcmNSb3cwICAgICAgICAgICAgRE4gIEQwLkkxNgorZFNyY1JvdzEgICAgICAgICAgICBETiAgRDEuSTE2CitkU3JjUm93MiAgICAgICAgICAgIEROICBEMi5JMTYgICAgCitkU3JjUm93MyAgICAgICAgICAgIEROICBEMy5JMTYKK2REcW50Um93MCAgICAgICAgICAgRE4gIEQwLkkxNiAgCitkRHFudFJvdzEgICAgICAgICAgIEROICBEMS5JMTYgCitkRHFudFJvdzIgICAgICAgICAgIEROICBEMi5JMTYgCitkRHFudFJvdzMgICAgICAgICAgIEROICBEMy5JMTYgIAorCis7Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gVHJhbnNmb3JtUmVzaWR1YWw0eDQKKworOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2RJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNiAgICAgICAKK2RJbjEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNiAgICAgICAKK2RJbjIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNiAgICAgICAKK2RJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorcUluMDEgICAgICAgICAgICAgICBRTiAgUTAuMzIKK3FJbjIzICAgICAgICAgICAgICAgUU4gIFExLjMyCisKKzsvLyBJbnRlcm1lZGlhdGUgY2FsY3VsYXRpb25zICAgICAgIAorZFplcm8gICAgICAgICAgICAgICBETiAgRDQuUzE2CitkZTAgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK2RlMSAgICAgICAgICAgICAgICAgRE4gIEQ2LlMxNgorZGUyICAgICAgICAgICAgICAgICBETiAgRDcuUzE2CitkZTMgICAgICAgICAgICAgICAgIEROICBEOC5TMTYKK2RJbjFSUyAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZEluM1JTICAgICAgICAgICAgICBETiAgRDguUzE2CitkZjAgICAgICAgICAgICAgICAgIEROICBEMC5TMTYKK2RmMSAgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZGYyICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkZjMgICAgICAgICAgICAgICAgIEROICBEMy5TMTYKK3FmMDEgICAgICAgICAgICAgICAgUU4gIFEwLjMyCitxZjIzICAgICAgICAgICAgICAgIFFOICBRMS4zMgorZGcwICAgICAgICAgICAgICAgICBETiAgRDUuUzE2CitkZzEgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2RnMiAgICAgICAgICAgICAgICAgRE4gIEQ3LlMxNgorZGczICAgICAgICAgICAgICAgICBETiAgRDguUzE2CitkZjFSUyAgICAgICAgICAgICAgIEROICBENy5TMTYKK2RmM1JTICAgICAgICAgICAgICAgRE4gIEQ4LlMxNgorCis7Ly8gT3V0cHV0IHBpeGVscworZGgwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkaDEgICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RoMiAgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZGgzICAgICAgICAgICAgICAgICBETiAgRDMuUzE2IAorCis7Ly8gUmVnaXN0ZXJzIHVzZWQgaW4gRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQKKworZERlbHRhUm93MCAgICAgICAgICBETiAgRDAuUzE2CitkRGVsdGFSb3cxICAgICAgICAgIEROICBEMS5TMTYKK2REZWx0YVJvdzIgICAgICAgICAgRE4gIEQyLlMxNgorZERlbHRhUm93MyAgICAgICAgICBETiAgRDMuUzE2CitxRGVsdGFSb3cwMSAgICAgICAgIFFOICBRMC5TMTYKK3FEZWx0YVJvdzIzICAgICAgICAgUU4gIFExLlMxNgorCitkUHJlZFZhbFJvdzAxICAgICAgIEROICBENC5VOAorZFByZWRWYWxSb3cyMyAgICAgICBETiAgRDUuVTgKKworcVN1bVJvdzAxICAgICAgICAgICBRTiAgUTMuUzE2CitxU3VtUm93MjMgICAgICAgICAgIFFOICBRNC5TMTYKK2REc3RSb3cwMSAgICAgICAgICAgRE4gIEQwLlU4CitkRHN0Um93MjMgICAgICAgICAgIEROICBEMS5VOAorZERzdFJvdzAgICAgICAgICAgICBETiAgRDAuMzJbMF0KK2REc3RSb3cxICAgICAgICAgICAgRE4gIEQwLjMyWzFdCitkRHN0Um93MiAgICAgICAgICAgIEROICBEMS4zMlswXQorZERzdFJvdzMgICAgICAgICAgICBETiAgRDEuMzJbMV0KKyAgICAKKyAgICAgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgTV9BTExPQzggcEJ1ZmZlciwgMzIKKyAgICAgICAgICAgICAgIAorCisgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGQscjExLGQ5CisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgIHByZWRTdGVwT25TdGFjaywgNAorICAgICAgICBNX0FSRyAgIGRzdFN0ZXBPblN0YWNrLDQKKyAgICAgICAgTV9BUkcgICBRUE9uU3RhY2ssIDQKKyAgICAgICAgTV9BUkcgICBBQ09uU3RhY2ssNAorICAKKyAgICAgICAgCisgICAgICAgIE1fQURSICAgcERlbHRhLHBCdWZmZXIgCisgICAgICAgIE1fTERSICAgQUMsQUNPblN0YWNrIAorICAgICAgICAKKyAgICAgICAgIAorICAgICAgICA7Ly8gU2F2ZSByZWdpc3RlcnMgcjEscjIscjMgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgICAgCisgICAgICAgIE1PViAgICAgcFByZWRUZW1wLHBQcmVkCisgICAgICAgIE1PViAgICAgcERDVGVtcCxwREMKKyAgICAgICAgTU9WICAgICBwRHN0VGVtcCxwRHN0CisgICAgICAgIAorICAgICAgICBDTVAgICAgIEFDLCMwCisgICAgICAgIEJFUSAgICAgRENjYXNlCisgICAgICAgIE1PViAgICAgcERlbHRhQXJnMSxwRGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgCisgICAgICAgIEJMICAgICAgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NAorICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0IDogc3RhdGljIGZ1bmN0aW9uIGlubGluZWQKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvL0JMICAgICAgYXJtVkNNNFAxMF9EZXF1YW50THVtYUFDNHg0CisgICAgICAgIE1fTERSICAgUVAsUVBPblN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHVwIHIxIGZvciBhcm1WQ000UDEwX0RlcXVhbnRMdW1hQUM0eDQKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSICAgIHBRUG1vZCw9YXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgICAgIExEUiAgICBwUVBkaXYsPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgCisgICAgICAgIExEUiAgICBwVlJvdyw9YXJtVkNNNFAxMF9WTWF0cml4VTE2CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSU0IgIFFQbW9kLFtwUVBtb2QsUVBdICAgICAgICAgICAgICAgICAgICA7Ly8gKFFQJTYpICogNgorICAgICAgICBMRFJTQiAgc2hpZnQsW3BRUGRpdixRUF0gICAgICAgICAgICAgICAgICAgIDsvLyBTaGlmdCA9IFFQIC8gNgorICAgICAgICAgICAgICAgIAorICAgICAgICBMRFIgICAgaW5kZXgxLD0weDAzMDIwNTA0IAorICAgICAgICBMRFIgICAgaW5kZXgwLD0weDA1MDQwMTAwICAgICAgICAgICAgICAgICAgIDsvLyBJbmRleGVzIGludG8gZFZtYXRyaXgKKyAgICAgICAgQUREICAgIHBWUm93LHBWUm93LFFQbW9kCisgICAgICAgIFZEVVAgICBkaW5kZXhSb3cwLGluZGV4MCAKKyAgICAgICAgVkRVUCAgIGRpbmRleFJvdzEsaW5kZXgxCisgICAgICAgIFZEVVAgICBkU2hpZnQsc2hpZnQgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhbGwgNHg0IHBWUm93W10gdmFsdWVzCisgICAgICAgIFZMRDEgICBkVm1hdHJpeCxbcFZSb3ddICAgICAgICAgICAgICAgICAgICAgOy8vIGRWbWF0cml4ID0gWzBkfDBjfDBifDBhXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZUQkwgICBkVlJvdzAsZFZtYXRyaXgsZEJ5dGVJbmRleFJvdzAgICAgICAgOy8vIHJvdzAgPSByb3cyID0gW3BWUm93WzJdIHwgcFZSb3dbMF0gfCBwVlJvd1syXSB8IHBWUm93WzBdXQorICAgICAgICBWVEJMICAgZFZSb3cxLGRWbWF0cml4LGRCeXRlSW5kZXhSb3cxICAgICAgIDsvLyByb3cxID0gcm93MyA9IFtwVlJvd1sxXSB8IHBWUm93WzJdIHwgcFZSb3dbMV0gfCBwVlJvd1syXV0KKyAgICAgICAgQ01QICAgICBwRENUZW1wLCMwCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0ICdzcmMnIHZhbHVlcyAgCisgICAgICAgIFZMRDEgICB7IGRTcmNSb3cwLGRTcmNSb3cxLGRTcmNSb3cyLGRTcmNSb3czIH0sW3BEZWx0YV0gCisgICAgICAgIAorICAgICAgICBWU0hMICAgZFZSb3cwVTE2LGRWUm93MFUxNixkU2hpZnQgCisgICAgICAgIFZTSEwgICBkVlJvdzFVMTYsZFZSb3cxVTE2LGRTaGlmdCAKKyAgICAgICAgTERSU0hORSBEQ3ZhbCxbcERDVGVtcF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTXVsdGlwbHkgc3JjW10gd2l0aCBwVlJvd1tdCisgICAgICAgIFZNVUwgICAgZERxbnRSb3cwLGRTcmNSb3cwLGRWUm93MFUxNgorICAgICAgICBWTVVMICAgIGREcW50Um93MSxkU3JjUm93MSxkVlJvdzFVMTYKKyAgICAgICAgVk1VTCAgICBkRHFudFJvdzIsZFNyY1JvdzIsZFZSb3cyVTE2CisgICAgICAgIFZNVUwgICAgZERxbnRSb3czLGRTcmNSb3czLGRWUm93M1UxNgorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvLyBUcmFuc2Zvcm1SZXNpZHVhbDR4NCA6IElubGluZWQgdG8gYXZvaWQgTG9hZC9TdG9yZXMKKyAgICAgICAgOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvL0JMICAgICAgYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NAorICAgICAgICA7Ly9TVFJITkUgIERDdmFsLFtwRGVsdGFdCisgICAgICAgIFZNT1ZORSAgICBkSW4wWzBdLERDdmFsCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIGlucHV0IHBpeGVscyA6IHBlcmZvcm0gUm93IG9wcyBhcyBDb2wgb3BzCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWVFJOICAgIGRJbjAsZEluMQorICAgICAgICBWVFJOICAgIGRJbjIsZEluMworICAgICAgICBWVFJOICAgIHFJbjAxLHFJbjIzIAorICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTU9WICAgIGRaZXJvLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFVzZWQgdG8gcmlnaHQgc2hpZnQgYnkgMSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgICAgIGRlMCxkSW4wLGRJbjIgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTAgPSBkMCArIGQyIAorICAgICAgICBWU1VCICAgICAgICBkZTEsZEluMCxkSW4yICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMSA9IGQwIC0gZDIgCisgICAgICAgIFZIQUREICAgICAgIGRJbjFSUyxkSW4xLGRaZXJvICAgICAgICAgICAgICAgICAgIDsvLyAoZjE+PjEpIGNvbnN0WmVybyBpcyBhIHJlZ2lzdGVyIGhvbGRpbmcgMAorICAgICAgICBWSEFERCAgICAgICBkSW4zUlMsZEluMyxkWmVybworICAgICAgICBWU1VCICAgICAgICBkZTIsZEluMVJTLGRJbjMgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUyID0gKGQxPj4xKSAtIGQzIAorICAgICAgICBWQUREICAgICAgICBkZTMsZEluMSxkSW4zUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAorICAgICAgICBWQUREICAgICAgICBkZjAsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMworICAgICAgICBWQUREICAgICAgICBkZjEsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgorICAgICAgICBWU1VCICAgICAgICBkZjIsZGUxLGRlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgorICAgICAgICBWU1VCICAgICAgICBkZjMsZGUwLGRlMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICA7Ly8gVHJhbnNwb3NlIHRoZSByZXN1bHRhbnQgbWF0cml4CisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWVFJOICAgIGRmMCxkZjEKKyAgICAgICAgVlRSTiAgICBkZjIsZGYzCisgICAgICAgIFZUUk4gICAgcWYwMSxxZjIzIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIDsvLyBDb2xvdW1uIE9wZXJhdGlvbnMgCisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkFERCAgICAgICAgZGcwLGRmMCxkZjIgICAgICAgICAgICAgICAgICAgICAgICAgOy8vICBlMCA9IGQwICsgZDIgCisgICAgICAgIFZTVUIgICAgICAgIGRnMSxkZjAsZGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTEgPSBkMCAtIGQyIAorICAgICAgICBWSEFERCAgICAgICBkZjFSUyxkZjEsZFplcm8gICAgICAgICAgICAgICAgICAgICA7Ly8gKGYxPj4xKSBjb25zdFplcm8gaXMgYSByZWdpc3RlciBob2xkaW5nIDAKKyAgICAgICAgVkhBREQgICAgICAgZGYzUlMsZGYzLGRaZXJvCisgICAgICAgIFZTVUIgICAgICAgIGRnMixkZjFSUyxkZjMgICAgICAgICAgICAgICAgICAgICAgIDsvLyAgZTIgPSAoZDE+PjEpIC0gZDMgCisgICAgICAgIFZBREQgICAgICAgIGRnMyxkZjEsZGYzUlMgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGUzID0gZDEgKyAoZDM+PjEpIAorICAgICAgICBWQUREICAgICAgICBkaDAsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYwID0gZTAgKyBlMworICAgICAgICBWQUREICAgICAgICBkaDEsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYxID0gZTEgKyBlMgorICAgICAgICBWU1VCICAgICAgICBkaDIsZGcxLGRnMiAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYyID0gZTEgLSBlMgorICAgICAgICBWU1VCICAgICAgICBkaDMsZGcwLGRnMyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIGYzID0gZTAgLSBlMworICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgOy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBDYWxjdWxhdGUgZmluYWwgdmFsdWUgKGNvbE9wW2ldW2pdICsgMzIpPj42CisgICAgICAgIDsvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgICAgZGgwLCM2CisgICAgICAgIFZSU0hSICAgICAgIGRoMSwjNgorICAgICAgICBWUlNIUiAgICAgICBkaDIsIzYKKyAgICAgICAgVlJTSFIgICAgICAgZGgzLCM2CisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIEIgICAgICAgT3V0RENjYXNlIAorICAgICAgICAKKworRENjYXNlCisgICAgICAgIDsvLyBDYWxjdWxhdGUgdGhlIFRyYW5zZm9ybWVkIERDdmFsdWUgOiAoREN2YWwrMzIpPj42CisgICAgICAgIExEUlNIICAgREN2YWwsW3BEQ1RlbXBdIAorICAgICAgICBBREQgICAgIERDdmFsLERDdmFsLCMzMiAKKyAgICAgICAgQVNSICAgICBEQ3ZhbCxEQ3ZhbCwjNgorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cwLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEZWx0YVswXSAgPSBwRGVsdGFbMV0gID0gcERlbHRhWzJdICA9IHBEZWx0YVszXSA9IERDdmFsCisgICAgICAgIFZEVVAgICAgZERlbHRhUm93MSwgREN2YWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERlbHRhWzRdICA9IHBEZWx0YVs1XSAgPSBwRGVsdGFbNl0gID0gcERlbHRhWzddID0gREN2YWwKKyAgICAgICAgVkRVUCAgICBkRGVsdGFSb3cyLCBEQ3ZhbCAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRGVsdGFbOF0gID0gcERlbHRhWzldICA9IHBEZWx0YVsxMF0gPSBwRGVsdGFbMTFdID0gREN2YWwKKyAgICAgICAgVkRVUCAgICBkRGVsdGFSb3czLCBEQ3ZhbAorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCitPdXREQ2Nhc2UgICAgICAKKyAgICAgICAgTV9MRFIgICBwcmVkc3RlcCxwcmVkU3RlcE9uU3RhY2sKKyAgICAgICAgTV9MRFIgICBkc3RTdGVwLGRzdFN0ZXBPblN0YWNrCisgICAgICAgIAorICAgICAgICBMRFIgICAgIFByZWRWYWwxLFtwUHJlZFRlbXBdLHByZWRzdGVwCisgICAgICAgIExEUiAgICAgUHJlZFZhbDIsW3BQcmVkVGVtcF0scHJlZHN0ZXAKKyAgICAgICAgVk1PViAgICBkUHJlZFZhbFJvdzAxLFByZWRWYWwxLFByZWRWYWwyCisgICAgICAgIAorICAgICAgICBMRFIgICAgIFByZWRWYWwxLFtwUHJlZFRlbXBdLHByZWRzdGVwCisgICAgICAgIExEUiAgICAgUHJlZFZhbDIsW3BQcmVkVGVtcF0KKyAgICAgICAgVk1PViAgICBkUHJlZFZhbFJvdzIzLFByZWRWYWwxLFByZWRWYWwyCisgCisgICAgICAgIAorICAgICAgICBWQUREVyAgIHFTdW1Sb3cwMSxxRGVsdGFSb3cwMSxkUHJlZFZhbFJvdzAxCisgICAgICAgIFZBRERXICAgcVN1bVJvdzIzLHFEZWx0YVJvdzIzLGRQcmVkVmFsUm93MjMKKyAgICAgICAgVlFNT1ZVTiBkRHN0Um93MDEscVN1bVJvdzAxCisgICAgICAgIFZRTU9WVU4gZERzdFJvdzIzLHFTdW1Sb3cyMworICAgICAgICAKKyAKKyAgICAgICAgVlNUMSAgICBkRHN0Um93MCxbcERzdFRlbXBdLGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICBkRHN0Um93MSxbcERzdFRlbXBdLGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICBkRHN0Um93MixbcERzdFRlbXBdLGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICBkRHN0Um93MyxbcERzdFRlbXBdCisgICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VycgorICAgICAgICAKK0VuZCAgICAgICAgICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIHRhaWwKKyAgICAgICAgCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0NPUlRFWEE4ICAgCisgICAgCisgICAgICAgICAKKyAgICAgICAgICAgIAorICAgIEVORApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfSG9yRWRnZV9JX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwNjE5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwyMDIgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBJRiBDb3J0ZXhBOAorCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgICAgIAorTE9PUF9DT1VOVCAgRVFVIDB4NDAwMDAwMDAKK01BU0tfMyAgICAgIEVRVSAweDAzMDMwMzAzCitNQVNLXzQgICAgICBFUVUgMHgwNDA0MDQwNAorCis7Ly8gRnVuY3Rpb24gYXJndW1lbnRzCisKK3BTcmNEc3QgICAgIFJOIDAKK3NyY2RzdFN0ZXAgIFJOIDEKK3BBbHBoYSAgICAgIFJOIDIKK3BCZXRhICAgICAgIFJOIDMKKworcFRocmVzaG9sZHMgUk4gNQorcEJTICAgICAgICAgUk4gNAorYlMzMjEwICAgICAgUk4gNgorCis7Ly8gTG9vcCAKKworWFkgICAgICAgICAgUk4gNworCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CitkQXAxcDAgICAgICBETiBEMTIuVTgKK2RBcTFxMCAgICAgIEROIEQxOC5VOAorZEFwMnAwICAgICAgRE4gRDE5LlU4CitkQXEycTAgICAgICBETiBEMTcuVTgKKworcUJTMzIxMCAgICAgUU4gUTEzLlUxNgorZEJTMzIxMCAgICAgRE4gRDI2CitkTWFza19icyAgICBETiBEMjcKK2RGaWx0X2JzICAgIEROIEQyNi5VMTYKKworOy8vIGJTTFQ0CitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKK2RNYXNrXzQgICAgIEROIEQxLlUxNgorCitNYXNrXzQgICAgICBSTiA4CitNYXNrXzMgICAgICBSTiA5CisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gUmVzdWx0CitkUF8wdCAgICAgICBETiBEMTMuVTggICAKK2RRXzB0ICAgICAgIEROIEQzMS5VOCAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RRXzBuICAgICAgIEROIEQyNC5VOAorCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSSwgcjksIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAorICAgICAgICBNX0FSRyAgIHBwQlMsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBkMC1kQWxwaGFfMAorICAgICAgICA7Ly8gZDItZEJldGFfMAorCisgICAgICAgIDtsb2FkIGFscGhhMSxiZXRhMSBzb21ld2hlcmUgdG8gYXZvaWQgbW9yZSBsb2FkcworICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXSEKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxIDs/CisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdISAKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgIHBCUywgcHBCUworICAgICAgICBNX0xEUiAgICAgICBwVGhyZXNob2xkcywgcHBUaHJlc2hvbGRzIAorCisgICAgICAgIExEUiAgICAgICAgIE1hc2tfMywgPU1BU0tfMworICAgICAgICBMRFIgICAgICAgICBNYXNrXzQsID1NQVNLXzQKKworICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfNCwgIzQgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgWFksID1MT09QX0NPVU5UCisKKyAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKKyAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCitMb29wWSAgICAgICAgCisgICAgICAgIExEUiAgICAgICAgIGJTMzIxMCwgW3BCU10sICM4CisgICAgICAgIAorICAgICAgICBWTEQxICAgICAgICBkUF8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgOzEKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMSwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIENNUCAgICAgICAgIGJTMzIxMCwgIzAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMCwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIDsxCisgICAgICAgIFZMRDEgICAgICAgIGRRXzAsIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBWQUJEICAgICAgICBkQXAycDAsIGRQXzIsIGRQXzAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMSwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAorICAgICAgICBWTEQxICAgICAgICBkUV8yLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCisKKyAgICAgICAgVkNHVCAgICAgICAgZEZpbHQsIGRBbHBoYSwgZEFwMHEwCisgICAgICAgIFZNT1YuVTMyICAgIGRCUzMyMTBbMF0sIGJTMzIxMAorICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCisgICAgICAgIFZNT1ZMICAgICAgIHFCUzMyMTAsIGRCUzMyMTAuVTgKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCisgICAgICAgIFZDR1QgICAgICAgIGRNYXNrX2JzLlMxNiwgZEJTMzIxMC5TMTYsICMwCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwIAorICAgICAgICBWQ0dUICAgICAgICBkQXAycDAsIGRCZXRhLCBkQXAycDAKKyAgICAgICAgCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkTWFza19icy5VOAorCisgICAgICAgIFRTVCAgICAgICAgIGJTMzIxMCwgTWFza18zCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCisKKyAgICAgICAgVkFORCAgICAgICAgZEFxZmxnLCBkRmlsdCwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRBcGZsZywgZEZpbHQsIGRBcDJwMAorICAgICAgICAKKyAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKKyAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgVFNUICAgICAgICAgYlMzMjEwLCBNYXNrXzQgICAgICAgIAorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBWVFNUICAgICAgICBkRmlsdF9icywgZEZpbHRfYnMsIGRNYXNrXzQKKworICAgICAgICA7Ly8gYlMgPT0gNCBGaWx0ZXJpbmcKKyAgICAgICAgQkxORSAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWQklUICAgICAgICBkUF8wbiwgZFBfMHQsIGRGaWx0X2JzCisgICAgICAgIFZCSVQgICAgICAgIGRRXzBuLCBkUV8wdCwgZEZpbHRfYnMKKyAgICAgICAgCisgICAgICAgIFZCSUYgICAgICAgIGRQXzBuLCBkUF8wLCBkRmlsdCAgICAgIAorICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAorCisgICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQorICAgICAgICBWU1QxICAgICAgICBkUF8wbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorCisgICAgICAgIEJORSAgICAgICAgIExvb3BZICAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRVhJVAorICAgICAgICAKK05vRmlsdGVyQlMwCisKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0KKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMxCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFdCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzQKKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAorCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYKKyAgICAgICAgCisKKyAgICAgICAgRU5ECisgICAgICAgIAorICAgICAgICAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTZjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5zCkBAIC0wLDAgKzEsMjgyIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElGIENvcnRleEE4CisKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICAgICAgSU1QT1JUICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICAgICAgCitMT09QX0NPVU5UICBFUVUgMHg0MDAwMDAwMAorTUFTS18zICAgICAgRVFVIDB4MDMwMzAzMDMKK01BU0tfNCAgICAgIEVRVSAweDA0MDQwNDA0CisKKzsvLyBGdW5jdGlvbiBhcmd1bWVudHMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzMyMTAgICAgICBSTiA2CitwU3JjRHN0X1AgICBSTiAxMAorcFNyY0RzdF9RICAgUk4gMTIKKworcFRtcCAgICAgICAgUk4gMTAKK3BUbXAyICAgICAgIFJOIDEyCitzdGVwICAgICAgICBSTiAxNAorCis7Ly8gTG9vcCAKKworWFkgICAgICAgICAgUk4gNworCis7Ly8gUm93cyBpbnB1dAorZFJvdzAgICAgICAgRE4gRDcuVTgKK2RSb3cxICAgICAgIEROIEQ4LlU4ICAKK2RSb3cyICAgICAgIEROIEQ1LlU4ICAKK2RSb3czICAgICAgIEROIEQxMC5VOCAgCitkUm93NCAgICAgICBETiBENi5VOCAgCitkUm93NSAgICAgICBETiBEOS5VOCAgCitkUm93NiAgICAgICBETiBENC5VOCAKK2RSb3c3ICAgICAgIEROIEQxMS5VOCAKKworCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorCis7Ly8gRmlsdGVyaW5nIERlY2lzaW9uCitkQWxwaGEgICAgICBETiBEMC5VOAorZEJldGEgICAgICAgRE4gRDIuVTgKKworZEZpbHQgICAgICAgRE4gRDE2LlU4CitkQXFmbGcgICAgICBETiBEMTIuVTgKK2RBcGZsZyAgICAgIEROIEQxNy5VOCAKKworZEFwMHEwICAgICAgRE4gRDEzLlU4CitkQXAxcDAgICAgICBETiBEMTIuVTgKK2RBcTFxMCAgICAgIEROIEQxOC5VOAorZEFwMnAwICAgICAgRE4gRDE5LlU4CitkQXEycTAgICAgICBETiBEMTcuVTgKKworcUJTMzIxMCAgICAgUU4gUTEzLlUxNgorZEJTMzIxMCAgICAgRE4gRDI2CitkTWFza19icyAgICBETiBEMjcKK2RGaWx0X2JzICAgIEROIEQyNi5VMTYKKworOy8vIGJTTFQ0CitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKK2RNYXNrXzQgICAgIEROIEQxLlUxNgorCitNYXNrXzQgICAgICBSTiA4CitNYXNrXzMgICAgICBSTiA5CisKK2RUZW1wICAgICAgIEROIEQxOS5VOAorCis7Ly8gUmVzdWx0CitkUF8wdCAgICAgICBETiBEMTMuVTggICAKK2RRXzB0ICAgICAgIEROIEQzMS5VOCAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RRXzBuICAgICAgIEROIEQyNC5VOAorCisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSSwgcjEyLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvL0FyZ3VtZW50cyBvbiB0aGUgc3RhY2sKKyAgICAgICAgTV9BUkcgICBwcFRocmVzaG9sZHMsIDQKKyAgICAgICAgTV9BUkcgICBwcEJTLCA0CisgICAgICAgIAorICAgICAgICA7Ly8gZDAtZEFscGhhXzAKKyAgICAgICAgOy8vIGQyLWRCZXRhXzAKKworICAgICAgICA7bG9hZCBhbHBoYTEsYmV0YTEgc29tZXdoZXJlIHRvIGF2b2lkIG1vcmUgbG9hZHMKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV0hCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXSEgCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKKworICAgICAgICBMRFIgICAgICAgICBNYXNrXzQsID1NQVNLXzQKKyAgICAgICAgTERSICAgICAgICAgTWFza18zLCA9TUFTS18zCisKKyAgICAgICAgO2RNYXNrXzAtMTQKKyAgICAgICAgO2RNYXNrXzEtMTUKKyAgICAgICAgO2RNYXNrXzQtMTkKKworICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfNCwgIzQgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgICAgWFksID1MT09QX0NPVU5UCisKKyAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKKyAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCisKKworTG9vcFkgICAgICAgIAorICAgICAgICBMRFIgICAgICAgICBiUzMyMTAsIFtwQlNdLCAjOAorICAgICAgICBBREQgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwCisgICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIDsxCisgICAgICAgIFZMRDEgICAgICAgIGRSb3cwLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgOzEKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzEsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3czLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93NSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzcsIFtwVG1wXSwgc3RlcAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBkUm93MCA9IFtxM3IwIHEycjAgcTFyMCBxMHIwIHAwcjAgcDFyMCBwMnIwIHAzcjBdCisgICAgICAgIDsvLyBkUm93MSA9IFtxM3IxIHEycjEgcTFyMSBxMHIxIHAwcjEgcDFyMSBwMnIxIHAzcjFdCisgICAgICAgIDsvLyBkUm93MiA9IFtxM3IyIHEycjIgcTFyMiBxMHIyIHAwcjIgcDFyMiBwMnIyIHAzcjJdCisgICAgICAgIDsvLyBkUm93MyA9IFtxM3IzIHEycjMgcTFyMyBxMHIzIHAwcjMgcDFyMyBwMnIzIHAzcjNdCisgICAgICAgIDsvLyBkUm93NCA9IFtxM3I0IHEycjQgcTFyNCBxMHI0IHAwcjQgcDFyNCBwMnI0IHAzcjRdCisgICAgICAgIDsvLyBkUm93NSA9IFtxM3I1IHEycjUgcTFyNSBxMHI1IHAwcjUgcDFyNSBwMnI1IHAzcjVdCisgICAgICAgIDsvLyBkUm93NiA9IFtxM3I2IHEycjYgcTFyNiBxMHI2IHAwcjYgcDFyNiBwMnI2IHAzcjZdCisgICAgICAgIDsvLyBkUm93NyA9IFtxM3I3IHEycjcgcTFyNyBxMHI3IHAwcjcgcDFyNyBwMnI3IHAzcjddCisKKyAgICAgICAgOy8vIDh4OCBUcmFuc3Bvc2UKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzAsIGRSb3cxCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3cyLCBkUm93MworICAgICAgICBWWklQLjggICAgICBkUm93NCwgZFJvdzUKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzYsIGRSb3c3CisKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzAsIGRSb3cyCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3cxLCBkUm93MworICAgICAgICBWWklQLjE2ICAgICBkUm93NCwgZFJvdzYKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzUsIGRSb3c3CisKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzAsIGRSb3c0CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cyLCBkUm93NgorICAgICAgICBWWklQLjMyICAgICBkUm93MywgZFJvdzcKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzEsIGRSb3c1CisKKworICAgICAgICA7UmVhbGlnbiB0aGUgcG9pbnRlcnMKKworICAgICAgICBDTVAgICAgICAgICBiUzMyMTAsICMwCisgICAgICAgIFZBQkQgICAgICAgIGRBcDJwMCwgZFBfMiwgZFBfMAorICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRQXzAsIGRRXzAKKyAgICAgICAgQkVRICAgICAgICAgTm9GaWx0ZXJCUzAKKworICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMXEwLCBkUV8xLCBkUV8wCisKKyAgICAgICAgVk1PVi5VMzIgICAgZEJTMzIxMFswXSwgYlMzMjEwCisgICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAorICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCisgICAgICAgIFZNT1ZMICAgICAgIHFCUzMyMTAsIGRCUzMyMTAuVTgKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCisgICAgICAgIFZDR1QgICAgICAgIGRNYXNrX2JzLlMxNiwgZEJTMzIxMC5TMTYsICMwCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMXAwLCBkQmV0YSwgZEFwMXAwCisgICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZE1hc2tfYnMuVTgKKworICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfMworCisgICAgICAgIFZDR1QgICAgICAgIGRBcTJxMCwgZEJldGEsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkRmlsdCwgZEZpbHQsIGRBcDFwMAorCisgICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKKworICAgICAgICA7Ly8gYlMgPCA0IEZpbHRlcmluZworICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKworICAgICAgICBUU1QgICAgICAgICBiUzMyMTAsIE1hc2tfNCAgICAgICAgCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIFZUU1QgICAgICAgIGRGaWx0X2JzLCBkRmlsdF9icywgZE1hc2tfNAorCisgICAgICAgIDsvLyBiUyA9PSA0IEZpbHRlcmluZworICAgICAgICBCTE5FICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKworICAgICAgICBWQklUICAgICAgICBkUF8wbiwgZFBfMHQsIGRGaWx0X2JzCisgICAgICAgIFZCSVQgICAgICAgIGRRXzBuLCBkUV8wdCwgZEZpbHRfYnMKKworICAgICAgICA7Ly8gUmVzdWx0IFN0b3JhZ2UKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdF9QLCBwU3JjRHN0LCAjMworICAgICAgICBWQklGICAgICAgICBkUF8wbiwgZFBfMCwgZEZpbHQgICAgICAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBUbXAyLCBwU3JjRHN0X1AsIHNyY2RzdFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgc3RlcCwgc3JjZHN0U3RlcCwgc3JjZHN0U3RlcAorICAgICAgICBWQklGICAgICAgICBkUV8wbiwgZFFfMCwgZEZpbHQgIAorCisgICAgICAgIEFERFMgICAgICAgIFhZLCBYWSwgWFkKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wblswXX0sIFtwU3JjRHN0X1BdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wblsxXX0sIFtwVG1wMl0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzJdfSwgW3BTcmNEc3RfUF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RQXzBuWzNdfSwgW3BUbXAyXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNF19LCBbcFNyY0RzdF9QXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFBfMG5bNV19LCBbcFRtcDJdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls2XX0sIFtwU3JjRHN0X1BdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUF8wbls3XX0sIFtwVG1wMl0sIHN0ZXAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3RfUSwgcFNyY0RzdCwgIzQKKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdF9RLCBzcmNkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMF19LCBbcFNyY0RzdF9RXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bMV19LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzJdfSwgW3BTcmNEc3RfUV0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAge2RRXzBuWzNdfSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls0XX0sIFtwU3JjRHN0X1FdLCBzdGVwCisgICAgICAgIFZTVDEgICAgICAgIHtkUV8wbls1XX0sIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bNl19LCBbcFNyY0RzdF9RXSwgc3RlcAorICAgICAgICBWU1QxICAgICAgICB7ZFFfMG5bN119LCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsICM0CisKKyAgICAgICAgQk5FICAgICAgICAgTG9vcFkgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisgICAgICAgIAorICAgICAgICBNX0VYSVQKKyAgICAgICAgCitOb0ZpbHRlckJTMAorICAgICAgICBWTEQxICAgICAgICB7ZEFscGhhW119LCBbcEFscGhhXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgQUREUyAgICAgICAgWFksIFhZLCBYWQorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV0KKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBCTkUgICAgICAgICBMb29wWSAgICAgICAgCisKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgICAgIEVORElGCisKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYzNmNGYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLnMKQEAgLTAsMCArMSwyODggQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKworICAgICAgICBJRiBDb3J0ZXhBOAorCitMT09QX0NPVU5UICBFUVUgMHg1NTAwMDAwMAorCisKKzsvLyBGdW5jdGlvbiBhcmd1bWVudHMKKworcFNyY0RzdCAgICAgUk4gMAorc3JjZHN0U3RlcCAgUk4gMQorcEFscGhhICAgICAgUk4gMgorcEJldGEgICAgICAgUk4gMworCitwVGhyZXNob2xkcyBSTiA1CitwQlMgICAgICAgICBSTiA0CitiUzEwICAgICAgICBSTiAxMgorCitwQWxwaGFfMCAgICBSTiAyCitwQmV0YV8wICAgICBSTiAzCisKK3BBbHBoYV8xICAgIFJOIDcKK3BCZXRhXzEgICAgIFJOIDgKKworCisKKzsvLyBMb29wIAorCitYWSAgICAgICAgICBSTiA5CisKK3BUbXAgICAgICAgIFJOIDYKK3N0ZXAgICAgICAgIFJOIDEwCisKKzsvLyBQaXhlbHMKK2RQXzAgICAgICAgIEROIEQ0LlU4CitkUF8xICAgICAgICBETiBENS5VOCAgCitkUF8yICAgICAgICBETiBENi5VOCAgCitkUF8zICAgICAgICBETiBENy5VOCAgCitkUV8wICAgICAgICBETiBEOC5VOCAgCitkUV8xICAgICAgICBETiBEOS5VOCAgCitkUV8yICAgICAgICBETiBEMTAuVTggCitkUV8zICAgICAgICBETiBEMTEuVTggCisKKworOy8vIEZpbHRlcmluZyBEZWNpc2lvbgorZEFscGhhICAgICAgRE4gRDAuVTgKK2RCZXRhICAgICAgIEROIEQyLlU4CisKK2RGaWx0ICAgICAgIEROIEQxNi5VOAorZEFxZmxnICAgICAgRE4gRDEyLlU4CitkQXBmbGcgICAgICBETiBEMTcuVTggCisKK2RBcDBxMCAgICAgIEROIEQxMy5VOAorZEFwMXAwICAgICAgRE4gRDEyLlU4CitkQXExcTAgICAgICBETiBEMTguVTgKK2RBcDJwMCAgICAgIEROIEQxOS5VOAorZEFxMnEwICAgICAgRE4gRDE3LlU4CisKKzsvLyBiU0xUNAorZFRDMCAgICAgICAgRE4gRDE4LlU4ICAgCitkVEMxICAgICAgICBETiBEMTkuVTggICAKK2RUQzAxICAgICAgIEROIEQxOC5VOCAgIAorCitkVENzICAgICAgICBETiBEMzEuUzgKK2RUQyAgICAgICAgIEROIEQzMS5VOAorCitkTWFza18wICAgICBETiBEMTQuVTgKK2RNYXNrXzEgICAgIEROIEQxNS5VOCAgICAKKworTWFza18wICAgICAgUk4gMTEKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBDb21wdXRpbmcgUDAsUTAKK3FEcTBwMCAgICAgIFFOIFExMC5TMTYKK3FEcDFxMSAgICAgIFFOIFExMS5TMTYKK3FEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCitkRGVsdGEgICAgICBETiBEMjAuUzgKKworCis7Ly8gQ29tcHV0aW5nIFAxLFExCitkUnAwcTAgICAgICBETiBEMjQuVTgKKworZE1heFAgICAgICAgRE4gRDIzLlU4CitkTWluUCAgICAgICBETiBEMjIuVTgKKworZE1heFEgICAgICAgRE4gRDE5LlU4CitkTWluUSAgICAgICBETiBEMjEuVTgKKworZERlbHRhUCAgICAgRE4gRDI2LlU4CitkRGVsdGFRICAgICBETiBEMjcuVTgKKworcVBfMG4gICAgICAgUU4gUTE0LlMxNgorcVFfMG4gICAgICAgUU4gUTEyLlMxNgorCitkUV8wbiAgICAgICBETiBEMjQuVTgKK2RRXzFuICAgICAgIEROIEQyNS5VOAorZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKKworOy8vIGJTR0U0CisKK3FTcDBxMCAgICAgIFFOIFExMC5VMTYKKworcVNwMnExICAgICAgUU4gUTExLlUxNgorcVNwMHEwcDEgICAgUU4gUTEyLlUxNgorcVNwM3AyICAgICAgUU4gUTEzLlUxNgorZEhTcDBxMSAgICAgRE4gRDI4LlU4CisKK3FTcTJwMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHExICAgIFFOIFExMi5VMTYKK3FTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQorZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCisKK3FUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCitxVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAorCitkUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCitkUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorZFBfMm4gICAgICAgRE4gRDMxLlU4CisKK2RRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JLCByMTEsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAorICAgICAgICBNX0FSRyAgIHBwQlMsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBkMC1kQWxwaGFfMAorICAgICAgICA7Ly8gZDItZEJldGFfMAorCisgICAgICAgIEFERCAgICAgICAgIHBBbHBoYV8xLCBwQWxwaGFfMCwgIzEKKyAgICAgICAgQUREICAgICAgICAgcEJldGFfMSwgcEJldGFfMCwgIzEKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzBdIAorICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgICAgcEJTLCBwcEJTCisgICAgICAgIE1fTERSICAgICAgIHBUaHJlc2hvbGRzLCBwcFRocmVzaG9sZHMgCisKKyAgICAgICAgTU9WICAgICAgICAgTWFza18wLCMwCisKKyAgICAgICAgO2RNYXNrXzAtMTQKKyAgICAgICAgO2RNYXNrXzEtMTUKKworICAgICAgICBWTU9WICAgICAgICBkTWFza18wLCAjMCAgICAgCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzEsICMxICAgICAKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHN0ZXAsIHNyY2RzdFN0ZXAsIHNyY2RzdFN0ZXAKKworICAgICAgICBMRFIgICAgICAgICBYWSw9TE9PUF9DT1VOVAorCisgICAgICAgIDsvLyBwMC1wMyAtIGQ0LWQ3CisgICAgICAgIDsvLyBxMC1xMyAtIGQ4LWQxMQorTG9vcFkgICAgICAgIAorTG9vcFggICAgICAgIAorICAgICAgICBMRFJIICAgICAgICBiUzEwLCBbcEJTXSwgIzIKKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBDTVAgICAgICAgICBiUzEwLCAjMAorICAgICAgICBCRVEgICAgICAgICBOb0ZpbHRlckJTMAorCisgICAgICAgIFZMRDEgICAgICAgIGRQXzMsIFtwU3JjRHN0XSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUF8yLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFBfMSwgW3BTcmNEc3RdLCBzdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRQXzAsIFtwVG1wXSwgc3RlcAorICAgICAgICBWTEQxICAgICAgICBkUV8wLCBbcFNyY0RzdF0sIHN0ZXAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMXAwLCBkUF8wLCBkUF8xCisgICAgICAgIFZMRDEgICAgICAgIGRRXzEsIFtwVG1wXQorICAgICAgICBWQUJEICAgICAgICBkQXAwcTAsIGRRXzAsIGRQXzAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCisgICAgICAgIFZDR1QgICAgICAgIGRGaWx0LCBkQWxwaGEsIGRBcDBxMAorCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICMweGZmCisgICAgICAgIFZNQVggICAgICAgIGRBcDFwMCwgZEFxMXEwLCBkQXAxcDAKKyAgICAgICAgVkFCRCAgICAgICAgZEFxMnEwLCBkUV8yLCBkUV8wCisKKyAgICAgICAgVk1PVkVRLlUzMiAgZEZpbHRbMF0sIE1hc2tfMAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZjAwCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFwMnAwLCBkQmV0YSwgZEFwMnAwCisgICAgICAgIFZDR1QgICAgICAgIGRBcDFwMCwgZEJldGEsIGRBcDFwMAorCisgICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzFdLCBNYXNrXzAKKworICAgICAgICBWQ0dUICAgICAgICBkQXEycTAsIGRCZXRhLCBkQXEycTAKKyAgICAgICAgVkxEMSAgICAgICAgZFFfMywgW3BTcmNEc3RdCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICM0IAorCisgICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKKyAgICAKKyAgICAgICAgQk5FICAgICAgICAgYlNHRTQgICAgICAgIAorYlNMVDQKKyAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMyCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAKKworICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgOy8vIFJlc3VsdCBTdG9yYWdlCisgICAgICAgIFZTVDEgICAgICAgIGRQXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBTVUIgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZTVDEgICAgICAgIGRRXzFuLCBbcFNyY0RzdF0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFRtcCwgIzgKKworICAgICAgICBCQ0MgICAgICAgICBMb29wWAorICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAorCitOb0ZpbHRlckJTMAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjOAorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKyAgICAgICAgQiAgICAgICAgICAgRXhpdExvb3BZICAgICAgICAKK2JTR0U0ICAgICAgICAKKyAgICAgICAgOy8vIGJTID49IDQgRmlsdGVyaW5nCisgICAgICAgIFNVQiAgICAgICAgIHBTcmNEc3QsIHBTcmNEc3QsIHNyY2RzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzEKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTR0U0X3Vuc2FmZQorCisgICAgICAgIDsvLyBSZXN1bHQgU3RvcmFnZQorICAgICAgICBWU1QxICAgICAgICBkUF8ybiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRQXzFuLCBbcFNyY0RzdF0sIHNyY2RzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFBfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBTVUIgICAgICAgICBwVG1wLCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMG4sIFtwU3JjRHN0XSwgc3JjZHN0U3RlcAorICAgICAgICBBRERTICAgICAgICBYWSxYWSxYWQorICAgICAgICBWU1QxICAgICAgICBkUV8xbiwgW3BTcmNEc3RdLCBzcmNkc3RTdGVwCisgICAgICAgIEFERCAgICAgICAgIHBUaHJlc2hvbGRzLCBwVGhyZXNob2xkcywgIzIKKyAgICAgICAgVlNUMSAgICAgICAgZFFfMm4sIFtwU3JjRHN0XQorICAgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFRtcCwgIzgKKyAgICAgICAgQkNDICAgICAgICAgTG9vcFgKKworRXhpdExvb3BZICAgICAgICAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjMTYKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzIgCisgICAgICAgIFZMRDEgICAgICAgIHtkQmV0YVtdfSwgW3BCZXRhXzFdCisgICAgICAgIEJORSAgICAgICAgIExvb3BZCisKKyAgICAgICAgTU9WICAgICAgICAgcjAsICNPTVhfU3RzX05vRXJyCisKKyAgICAgICAgTV9FTkQKKyAgICAgICAgCisgICAgRU5ESUYKKyAgICAKKworICAgICAgICAKKworICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNmZiYjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSV9zLnMKQEAgLTAsMCArMSw0MzYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCisgICAgICAgIElNUE9SVCAgYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYWJTTFQ0X3Vuc2FmZQorICAgICAgICBJTVBPUlQgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAgICAgCisgICAgICAgIElGIENvcnRleEE4CisKK0xPT1BfQ09VTlQgIEVRVSAweDExMDAwMDAwCisKKworOy8vIEZ1bmN0aW9uIGFyZ3VtZW50cworCitwU3JjRHN0ICAgICBSTiAwCitzcmNkc3RTdGVwICBSTiAxCitwQWxwaGEgICAgICBSTiAyCitwQmV0YSAgICAgICBSTiAzCisKK3BUaHJlc2hvbGRzIFJOIDUKK3BCUyAgICAgICAgIFJOIDQKK2JTMTAgICAgICAgIFJOIDEyCisKK3BBbHBoYV8wICAgIFJOIDIKK3BCZXRhXzAgICAgIFJOIDMKKworcEFscGhhXzEgICAgUk4gNworcEJldGFfMSAgICAgUk4gOAorCitwVG1wICAgICAgICBSTiAxMAorcFRtcFN0ZXAgICAgUk4gMTEKKworOy8vIExvb3AgCisKK1hZICAgICAgICAgIFJOIDkKKworOy8vIFJvd3MgaW5wdXQKK2RSb3cwICAgICAgIEROIEQ3LlU4CitkUm93MSAgICAgICBETiBEOC5VOCAgCitkUm93MiAgICAgICBETiBENS5VOCAgCitkUm93MyAgICAgICBETiBEMTAuVTggIAorZFJvdzQgICAgICAgRE4gRDYuVTggIAorZFJvdzUgICAgICAgRE4gRDkuVTggIAorZFJvdzYgICAgICAgRE4gRDQuVTggCitkUm93NyAgICAgICBETiBEMTEuVTggCisKKzsvLyBkUm93MCAtIGRQXzMsIGRSb3cxIC0gZFFfMCwgZFJvdzIgLSBkUF8xLCBkUm93MyAtIGRRXzIKKzsvLyBkUm93NCAtIGRQXzIsIGRSb3c1IC0gZFFfMSwgZFJvdzYgLSBkUF8wLCBkUm93NyAtIGRRXzMKKworOy8vIFJvd3Mgb3V0cHV0CitkUm93bjAgICAgICBETiBENy5VOAorZFJvd24xICAgICAgRE4gRDI0LlU4CitkUm93bjIgICAgICBETiBEMzAuVTgKK2RSb3duMyAgICAgIEROIEQxMC5VOAorZFJvd240ICAgICAgRE4gRDYuVTgKK2RSb3duNSAgICAgIEROIEQyNS5VOAorZFJvd242ICAgICAgRE4gRDI5LlU4CitkUm93bjcgICAgICBETiBEMTEuVTgKKworOy8vIGRQXzBuICAgICAgIEROIEQyOS5VOAorOy8vIGRQXzFuICAgICAgIEROIEQzMC5VOAorOy8vIGRQXzJuICAgICAgIEROIEQzMS5VOAorOy8vIAorOy8vIGRRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCis7Ly8gZFFfMW4gICAgICAgRE4gRDI1LlU4ICAgOyEhO1RlbXAyICAgICAgICAKKzsvLyBkUV8ybiAgICAgICBETiBEMjguVTggICA7ISE7ZFFfMHQgICAgICAgIAorOy8vIAorOy8vIGRSb3duMCAtIGRQXzMsICBkUm93bjEgLSBkUV8wbgorOy8vIGRSb3duMiAtIGRQXzFuLCBkUm93bjMgLSBkUV8yCis7Ly8gZFJvd240IC0gZFBfMiwgIGRSb3duNSAtIGRRXzFuCis7Ly8gZFJvd242IC0gZFBfMG4sIGRSb3duNyAtIGRRXzMKKworZFJvdzBuICAgICAgRE4gRDcuVTgKK2RSb3cxbiAgICAgIEROIEQyNC5VOAorZFJvdzJuICAgICAgRE4gRDMwLlU4CitkUm93M24gICAgICBETiBEMjguVTgKK2RSb3c0biAgICAgIEROIEQzMS5VOAorZFJvdzVuICAgICAgRE4gRDI1LlU4CitkUm93Nm4gICAgICBETiBEMjkuVTgKK2RSb3c3biAgICAgIEROIEQxMS5VOAorCis7Ly8gZFJvdzBuIC0gZFBfMywgZFJvdzFuIC0gZFFfMG4sIGRSb3cybiAtIGRQXzFuLCBkUm93M24gLSBkUV8ybgorOy8vIGRSb3c0biAtIGRQXzIsIGRSb3c1biAtIGRRXzFuLCBkUm93Nm4gLSBkUF8wbiwgZFJvdzduIC0gZFFfMworCis7Ly8gUGl4ZWxzCitkUF8wICAgICAgICBETiBENC5VOAorZFBfMSAgICAgICAgRE4gRDUuVTggIAorZFBfMiAgICAgICAgRE4gRDYuVTggIAorZFBfMyAgICAgICAgRE4gRDcuVTggIAorZFFfMCAgICAgICAgRE4gRDguVTggIAorZFFfMSAgICAgICAgRE4gRDkuVTggIAorZFFfMiAgICAgICAgRE4gRDEwLlU4IAorZFFfMyAgICAgICAgRE4gRDExLlU4IAorCisKKzsvLyBGaWx0ZXJpbmcgRGVjaXNpb24KK2RBbHBoYSAgICAgIEROIEQwLlU4CitkQmV0YSAgICAgICBETiBEMi5VOAorCitkRmlsdCAgICAgICBETiBEMTYuVTgKK2RBcWZsZyAgICAgIEROIEQxMi5VOAorZEFwZmxnICAgICAgRE4gRDE3LlU4IAorCitkQXAwcTAgICAgICBETiBEMTMuVTgKK2RBcDFwMCAgICAgIEROIEQxMi5VOAorZEFxMXEwICAgICAgRE4gRDE4LlU4CitkQXAycDAgICAgICBETiBEMTkuVTgKK2RBcTJxMCAgICAgIEROIEQxNy5VOAorCis7Ly8gYlNMVDQKK2RUQzAgICAgICAgIEROIEQxOC5VOCAgIAorZFRDMSAgICAgICAgRE4gRDE5LlU4ICAgCitkVEMwMSAgICAgICBETiBEMTguVTggICAKKworZFRDcyAgICAgICAgRE4gRDMxLlM4CitkVEMgICAgICAgICBETiBEMzEuVTgKKworZE1hc2tfMCAgICAgRE4gRDE0LlU4CitkTWFza18xICAgICBETiBEMTUuVTggICAgCisKK01hc2tfMCAgICAgIFJOIDYKKworZFRlbXAgICAgICAgRE4gRDE5LlU4CisKKzsvLyBDb21wdXRpbmcgUDAsUTAKK3FEcTBwMCAgICAgIFFOIFExMC5TMTYKK3FEcDFxMSAgICAgIFFOIFExMS5TMTYKK3FEZWx0YSAgICAgIFFOIFExMC5TMTYgIDsgcmV1c2UgcURxMHAwCitkRGVsdGEgICAgICBETiBEMjAuUzgKKworCis7Ly8gQ29tcHV0aW5nIFAxLFExCitkUnAwcTAgICAgICBETiBEMjQuVTgKKworZE1heFAgICAgICAgRE4gRDIzLlU4CitkTWluUCAgICAgICBETiBEMjIuVTgKKworZE1heFEgICAgICAgRE4gRDE5LlU4CitkTWluUSAgICAgICBETiBEMjEuVTgKKworZERlbHRhUCAgICAgRE4gRDI2LlU4CitkRGVsdGFRICAgICBETiBEMjcuVTgKKworcVBfMG4gICAgICAgUU4gUTE0LlMxNgorcVFfMG4gICAgICAgUU4gUTEyLlMxNgorCitkUV8wbiAgICAgICBETiBEMjQuVTgKK2RRXzFuICAgICAgIEROIEQyNS5VOAorZFBfMG4gICAgICAgRE4gRDI5LlU4CitkUF8xbiAgICAgICBETiBEMzAuVTgKKworOy8vIGJTR0U0CisKK3FTcDBxMCAgICAgIFFOIFExMC5VMTYKKworcVNwMnExICAgICAgUU4gUTExLlUxNgorcVNwMHEwcDEgICAgUU4gUTEyLlUxNgorcVNwM3AyICAgICAgUU4gUTEzLlUxNgorZEhTcDBxMSAgICAgRE4gRDI4LlU4CisKK3FTcTJwMSAgICAgIFFOIFExMS5VMTYKK3FTcDBxMHExICAgIFFOIFExMi5VMTYKK3FTcTNxMiAgICAgIFFOIFExMy5VMTYgIDshIQorZEhTcTBwMSAgICAgRE4gRDI4LlU4ICAgOyEhCisKK3FUZW1wMSAgICAgIFFOIFExMS5VMTYgIDshITtxU3AycTEgCitxVGVtcDIgICAgICBRTiBRMTIuVTE2ICA7ISE7cVNwMHEwcDEgICAgICAgIAorCitkUF8wdCAgICAgICBETiBEMjguVTggICA7ISE7ZEhTcDBxMSAgICAgICAgCitkUV8wdCAgICAgICBETiBEMjIuVTggICA7ISE7VGVtcDEgICAgICAgIAorCitkUF8wbiAgICAgICBETiBEMjkuVTgKK2RQXzFuICAgICAgIEROIEQzMC5VOAorZFBfMm4gICAgICAgRE4gRDMxLlU4CisKK2RRXzBuICAgICAgIEROIEQyNC5VOCAgIDshITtUZW1wMiAgICAgICAgCitkUV8xbiAgICAgICBETiBEMjUuVTggICA7ISE7VGVtcDIgICAgICAgIAorZFFfMm4gICAgICAgRE4gRDI4LlU4ICAgOyEhO2RRXzB0ICAgICAgICAKKworICAgICAgICAKKyAgICAgICAgOy8vIEZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JLCByMTEsIGQxNQorICAgICAgICAKKyAgICAgICAgOy8vQXJndW1lbnRzIG9uIHRoZSBzdGFjaworICAgICAgICBNX0FSRyAgIHBwVGhyZXNob2xkcywgNAorICAgICAgICBNX0FSRyAgIHBwQlMsIDQKKyAgICAgICAgCisgICAgICAgIDsvLyBkMC1kQWxwaGFfMAorICAgICAgICA7Ly8gZDItZEJldGFfMAorCisgICAgICAgIEFERCAgICAgICAgIHBBbHBoYV8xLCBwQWxwaGFfMCwgIzEKKyAgICAgICAgQUREICAgICAgICAgcEJldGFfMSwgcEJldGFfMCwgIzEKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMF0gCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICBwQlMsIHBwQlMKKyAgICAgICAgTV9MRFIgICAgICAgcFRocmVzaG9sZHMsIHBwVGhyZXNob2xkcyAKKworICAgICAgICBNT1YgICAgICAgICBNYXNrXzAsIzAKKworICAgICAgICA7ZE1hc2tfMC0xNAorICAgICAgICA7ZE1hc2tfMS0xNQorCisgICAgICAgIFZNT1YgICAgICAgIGRNYXNrXzAsICMwICAgICAKKyAgICAgICAgVk1PViAgICAgICAgZE1hc2tfMSwgIzEgICAgIAorCisgICAgICAgIExEUiAgICAgICAgIFhZLD1MT09QX0NPVU5UCisgICAgCisgICAgICAgIEFERCAgICAgICAgIHBUbXBTdGVwLCBzcmNkc3RTdGVwLCBzcmNkc3RTdGVwCisKKyAgICAgICAgOy8vIHAwLXAzIC0gZDQtZDcKKyAgICAgICAgOy8vIHEwLXEzIC0gZDgtZDExCitMb29wWSAgICAgICAgCitMb29wWCAgICAgICAgCisgICAgICAgIExEUkggICAgICAgIGJTMTAsIFtwQlNdLCAjNAorCisgICAgICAgIENNUCAgICAgICAgIGJTMTAsICMwCisgICAgICAgIEJFUSAgICAgICAgIE5vRmlsdGVyQlMwCisKKyAgICAgICAgOy8vIExvYWQgOCByb3dzIG9mIGRhdGEKKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93MCwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93MSwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBWTEQxICAgICAgICBkUm93MiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWWklQLjggICAgICBkUm93MCwgZFJvdzEKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzMsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFJvdzQsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzIsIGRSb3czCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c1LCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c2LCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRSb3c3LCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZaSVAuOCAgICAgIGRSb3c0LCBkUm93NQorICAgICAgICBWWklQLjE2ICAgICBkUm93MSwgZFJvdzMKKyAgICAKKworICAgICAgICA7Ly8gZFJvdzAgPSBbcTNyMCBxMnIwIHExcjAgcTByMCBwMHIwIHAxcjAgcDJyMCBwM3IwXQorICAgICAgICA7Ly8gZFJvdzEgPSBbcTNyMSBxMnIxIHExcjEgcTByMSBwMHIxIHAxcjEgcDJyMSBwM3IxXQorICAgICAgICA7Ly8gZFJvdzIgPSBbcTNyMiBxMnIyIHExcjIgcTByMiBwMHIyIHAxcjIgcDJyMiBwM3IyXQorICAgICAgICA7Ly8gZFJvdzMgPSBbcTNyMyBxMnIzIHExcjMgcTByMyBwMHIzIHAxcjMgcDJyMyBwM3IzXQorICAgICAgICA7Ly8gZFJvdzQgPSBbcTNyNCBxMnI0IHExcjQgcTByNCBwMHI0IHAxcjQgcDJyNCBwM3I0XQorICAgICAgICA7Ly8gZFJvdzUgPSBbcTNyNSBxMnI1IHExcjUgcTByNSBwMHI1IHAxcjUgcDJyNSBwM3I1XQorICAgICAgICA7Ly8gZFJvdzYgPSBbcTNyNiBxMnI2IHExcjYgcTByNiBwMHI2IHAxcjYgcDJyNiBwM3I2XQorICAgICAgICA7Ly8gZFJvdzcgPSBbcTNyNyBxMnI3IHExcjcgcTByNyBwMHI3IHAxcjcgcDJyNyBwM3I3XQorCisgICAgICAgIDsvLyA4eDggVHJhbnNwb3NlCisKKyAgICAgICAgVlpJUC44ICAgICAgZFJvdzYsIGRSb3c3CisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIFZaSVAuMTYgICAgIGRSb3cwLCBkUm93MgorICAgICAgICBWWklQLjE2ICAgICBkUm93NSwgZFJvdzcKKyAgICAgICAgCisKKyAgICAgICAgVlpJUC4xNiAgICAgZFJvdzQsIGRSb3c2CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cxLCBkUm93NQorICAgICAgICBWWklQLjMyICAgICBkUm93MiwgZFJvdzYKKyAgICAgICAgVlpJUC4zMiAgICAgZFJvdzMsIGRSb3c3CisgICAgICAgIFZaSVAuMzIgICAgIGRSb3cwLCBkUm93NAorICAgICAgICAKKworICAgICAgICA7Ly8gZFJvdzAgLSBkUF8zLCBkUm93MSAtIGRRXzAsIGRSb3cyIC0gZFBfMSwgZFJvdzMgLSBkUV8yCisgICAgICAgIDsvLyBkUm93NCAtIGRQXzIsIGRSb3c1IC0gZFFfMSwgZFJvdzYgLSBkUF8wLCBkUm93NyAtIGRRXzMKKworICAgICAgICA7Ly8gZFFfMCA9IFtxMHI3IHEwcjYgcTByNSBxMHI0IHEwcjMgcTByMiBxMHIxIHEwcjBdCisgICAgICAgIDsvLyBkUV8xID0gW3ExcjcgcTFyNiBxMXI1IHExcjQgcTFyMyBxMXIyIHExcjEgcTFyMF0KKyAgICAgICAgOy8vIGRRXzIgPSBbcTJyNyBxMnI2IHEycjUgcTJyNCBxMnIzIHEycjIgcTJyMSBxMnIwXQorICAgICAgICA7Ly8gZFFfMyA9IFtxM3I3IHEzcjYgcTNyNSBxM3I0IHEzcjMgcTNyMiBxM3IxIHEzcjBdCisKKyAgICAgICAgOy8vIGRQXzAgPSBbcDByNyBwMHI2IHAwcjUgcDByNCBwMHIzIHAwcjIgcDByMSBwMHIwXQorICAgICAgICA7Ly8gZFBfMSA9IFtwMXI3IHAxcjYgcDFyNSBwMXI0IHAxcjMgcDFyMiBwMXIxIHAxcjBdCisgICAgICAgIDsvLyBkUF8yID0gW3AycjcgcDJyNiBwMnI1IHAycjQgcDJyMyBwMnIyIHAycjEgcDJyMF0KKyAgICAgICAgOy8vIGRQXzMgPSBbcDNyNyBwM3I2IHAzcjUgcDNyNCBwM3IzIHAzcjIgcDNyMSBwM3IwXQorCisgICAgICAgIFZBQkQgICAgICAgIGRBcDBxMCwgZFBfMCwgZFFfMAorICAgICAgICBWQUJEICAgICAgICBkQXAxcDAsIGRQXzEsIGRQXzAKKworICAgICAgICBWQUJEICAgICAgICBkQXExcTAsIGRRXzEsIGRRXzAKKyAgICAgICAgVkFCRCAgICAgICAgZEFwMnAwLCBkUF8yLCBkUF8wCisgICAgICAgIAorICAgICAgICBUU1QgICAgICAgICBiUzEwLCAjMHhmZgorICAgICAgICBWQ0dUICAgICAgICBkRmlsdCwgZEFscGhhLCBkQXAwcTAKKworICAgICAgICBWTUFYICAgICAgICBkQXAxcDAsIGRBcTFxMCwgZEFwMXAwCisgICAgICAgIFZBQkQgICAgICAgIGRBcTJxMCwgZFFfMiwgZFFfMAorCisgICAgICAgIFZNT1ZFUS5VMzIgIGRGaWx0WzBdLCBNYXNrXzAKKyAgICAgICAgVFNUICAgICAgICAgYlMxMCwgIzB4ZmYwMAorCisgICAgICAgIFZDR1QgICAgICAgIGRBcDJwMCwgZEJldGEsIGRBcDJwMAorICAgICAgICBWQ0dUICAgICAgICBkQXAxcDAsIGRCZXRhLCBkQXAxcDAKKworICAgICAgICBWTU9WRVEuVTMyICBkRmlsdFsxXSwgTWFza18wCisKKyAgICAgICAgVkNHVCAgICAgICAgZEFxMnEwLCBkQmV0YSwgZEFxMnEwCisgICAgICAgIFZBTkQgICAgICAgIGRGaWx0LCBkRmlsdCwgZEFwMXAwCisgICAgICAgIFRTVCAgICAgICAgIGJTMTAsICM0IAorCisgICAgICAgIFZBTkQgICAgICAgIGRBcWZsZywgZEZpbHQsIGRBcTJxMAorICAgICAgICBWQU5EICAgICAgICBkQXBmbGcsIGRGaWx0LCBkQXAycDAKKyAgICAKKyAgICAgICAgQk5FICAgICAgICAgYlNHRTQgICAgICAgIAorYlNMVDQKKyAgICAgICAgOy8vIGJTIDwgNCBGaWx0ZXJpbmcKKworICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisKKyAgICAgICAgOy8vIFRyYW5zcG9zZQorCisgICAgICAgIFZaSVAuOCAgICAgIGRQXzMsICBkUF8yICAKKyAgICAgICAgVlpJUC44ICAgICAgZFBfMW4sIGRQXzBuCisgICAgICAgIFZaSVAuOCAgICAgIGRRXzBuLCBkUV8xbgorICAgICAgICBWWklQLjggICAgICBkUV8yLCAgZFFfMworCisgICAgICAgIAorICAgICAgICBWWklQLjE2ICAgICBkUF8zLCAgZFBfMW4KKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBWWklQLjE2ICAgICBkUV8wbiwgZFFfMgorICAgICAgICBWWklQLjE2ICAgICBkUV8xbiwgZFFfMworICAgICAgICBWWklQLjE2ICAgICBkUF8yLCAgZFBfMG4KKworICAgICAgICBWWklQLjMyICAgICBkUF8zLCAgZFFfMG4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMW4sIGRRXzIKKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMiwgIGRRXzFuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzBuLCBkUV8zCisKKyAgICAgICAgOy8vIGRSb3duMCAtIGRQXzMsICBkUm93bjEgLSBkUV8wbgorICAgICAgICA7Ly8gZFJvd24yIC0gZFBfMW4sIGRSb3duMyAtIGRRXzIKKyAgICAgICAgOy8vIGRSb3duNCAtIGRQXzIsICBkUm93bjUgLSBkUV8xbgorICAgICAgICA7Ly8gZFJvd242IC0gZFBfMG4sIGRSb3duNyAtIGRRXzMKKworICAgICAgICBWU1QxICAgICAgICBkUm93bjAsIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd24xLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duMiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93bjMsIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgOzEKKyAgICAgICAgVlNUMSAgICAgICAgZFJvd240LCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duNSwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duNiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBBREQgICAgICAgICBwVGhyZXNob2xkcywgcFRocmVzaG9sZHMsICMyCisgICAgICAgIFZTVDEgICAgICAgIGRSb3duNywgW3BUbXBdLCBzcmNkc3RTdGVwCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzQKKyAgICAgICAgVkxEMSAgICAgICAge2RCZXRhW119LCBbcEJldGFfMV0KKworICAgICAgICBCQ0MgICAgICAgICBMb29wWAorICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAorCitOb0ZpbHRlckJTMAorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBBRERTICAgICAgICBYWSwgWFksIFhZCisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMV0KKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQorICAgICAgICBCQ0MgICAgICAgICBMb29wWAorICAgICAgICBCICAgICAgICAgICBFeGl0TG9vcFkgICAgICAgIAorYlNHRTQgICAgICAgIAorICAgICAgICA7Ly8gYlMgPj0gNCBGaWx0ZXJpbmcKKyAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKworICAgICAgICA7Ly8gVHJhbnNwb3NlCisKKyAgICAgICAgVlpJUC44ICAgICAgZFBfMywgIGRQXzJuICAgCisgICAgICAgIFZaSVAuOCAgICAgIGRQXzFuLCBkUF8wbgorICAgICAgICBWWklQLjggICAgICBkUV8wbiwgZFFfMW4KKyAgICAgICAgVlpJUC44ICAgICAgZFFfMm4sIGRRXzMKKworICAgICAgICBWWklQLjE2ICAgICBkUF8zLCAgZFBfMW4KKyAgICAgICAgQUREICAgICAgICAgcFRtcCwgcFNyY0RzdCwgc3JjZHN0U3RlcAorICAgICAgICBWWklQLjE2ICAgICBkUV8wbiwgZFFfMm4KKyAgICAgICAgVlpJUC4xNiAgICAgZFFfMW4sIGRRXzMKKyAgICAgICAgVlpJUC4xNiAgICAgZFBfMm4sIGRQXzBuCisKKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMywgIGRRXzBuCisgICAgICAgIFZaSVAuMzIgICAgIGRQXzFuLCBkUV8ybgorICAgICAgICBWWklQLjMyICAgICBkUF8ybiwgZFFfMW4KKyAgICAgICAgVlpJUC4zMiAgICAgZFBfMG4sIGRRXzMKKworICAgICAgICA7Ly8gZFJvdzBuIC0gZFBfMywgZFJvdzFuIC0gZFFfMG4sIGRSb3cybiAtIGRQXzFuLCBkUm93M24gLSBkUV8ybgorICAgICAgICA7Ly8gZFJvdzRuIC0gZFBfMiwgZFJvdzVuIC0gZFFfMW4sIGRSb3c2biAtIGRQXzBuLCBkUm93N24gLSBkUV8zCisgICAgICAgIAorICAgICAgICBWU1QxICAgICAgICBkUm93MG4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzFuLCBbcFRtcF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3cybiwgW3BTcmNEc3RdLCBwVG1wU3RlcAorICAgICAgICBWU1QxICAgICAgICBkUm93M24sIFtwVG1wXSwgcFRtcFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJvdzRuLCBbcFNyY0RzdF0sIHBUbXBTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSb3c1biwgW3BUbXBdLCBwVG1wU3RlcAorICAgICAgICBBRERTICAgICAgICBYWSxYWSxYWQorICAgICAgICBWU1QxICAgICAgICBkUm93Nm4sIFtwU3JjRHN0XSwgcFRtcFN0ZXAKKyAgICAgICAgQUREICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjNAorICAgICAgICBWU1QxICAgICAgICBkUm93N24sIFtwVG1wXSwgcFRtcFN0ZXAKKworICAgICAgICBTVUIgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCBzcmNkc3RTdGVwLCBMU0wgIzMKKyAgICAgICAgVkxEMSAgICAgICAge2RBbHBoYVtdfSwgW3BBbHBoYV8xXQorICAgICAgICBBREQgICAgICAgICBwU3JjRHN0LCBwU3JjRHN0LCAjNAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8xXQorCisgICAgICAgIEJDQyAgICAgICAgIExvb3BYCisKK0V4aXRMb29wWSAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgIHBCUywgcEJTLCAjMTQKKyAgICAgICAgU1VCICAgICAgICAgcFRocmVzaG9sZHMsIHBUaHJlc2hvbGRzLCAjMTQKKyAgICAgICAgU1VCICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgIzE2CisgICAgICAgIFZMRDEgICAgICAgIHtkQWxwaGFbXX0sIFtwQWxwaGFfMF0KKyAgICAgICAgQUREICAgICAgICAgcFNyY0RzdCwgcFNyY0RzdCwgc3JjZHN0U3RlcCwgTFNMICMzIAorICAgICAgICBWTEQxICAgICAgICB7ZEJldGFbXX0sIFtwQmV0YV8wXQorICAgICAgICBCTkUgICAgICAgICBMb29wWQorCisgICAgICAgIE1PViAgICAgICAgIHIwLCAjT01YX1N0c19Ob0VycgorCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgIEVORElGCisgICAgCisgICAgICAgIAorICAgICAgICBFTkQKKyAgICAgICAgCisgICAgICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zY2U0MWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX0ludGVycG9sYXRlQ2hyb21hLmMKQEAgLTAsMCArMSw3OSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVDaHJvbWEuYworICogT3Blbk1BWCBETDogdjEuMC4yCisgKiBSZXZpc2lvbjogICAxMjI5MAorICogRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4CisgKiAKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiAKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhbGN1bGF0ZSAxLzggUGl4ZWwgaW50ZXJwb2xhdGlvbiBmb3IgQ2hyb21hIEJsb2NrCisgKiAKKyAqLworCisjaW5jbHVkZSAib214dHlwZXMuaCIKKyNpbmNsdWRlICJhcm1PTVguaCIKKyNpbmNsdWRlICJvbXhWQy5oIgorCisjaW5jbHVkZSAiYXJtVkMuaCIKKyNpbmNsdWRlICJhcm1DT01NLmgiCisKKworLyoqCisgKiBGdW5jdGlvbjogb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFBlcmZvcm1zIDEvOC1waXhlbCBpbnRlcnBvbGF0aW9uIGZvciBpbnRlciBjaHJvbWEgTUIuCisgKgorICogUmVtYXJrczoKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogW2luXQlwU3JjCVBvaW50ZXIgdG8gdGhlIHNvdXJjZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyCisgKiBbaW5dCXNyY1N0ZXAgUmVmZXJlbmNlIGZyYW1lIHN0ZXAgaW4gYnl0ZQorICogW2luXQlkc3RTdGVwIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGguCisgKiBbaW5dCWR4CQlGcmFjdGlvbmFsIHBhcnQgb2YgaG9yaXpvbnRhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0JZHkJCUZyYWN0aW9uYWwgcGFydCBvZiB2ZXJ0aWNhbCBtb3Rpb24gdmVjdG9yIGNvbXBvbmVudAorICoJCQkJCQlpbiAxLzggcGl4ZWwgdW5pdDt2YWxpZCBpbiB0aGUgcmFuZ2UgWzAsN10KKyAqIFtpbl0Jcm9pCQlEaW1lbnNpb24gb2YgdGhlIGludGVycG9sYXRpb24gcmVnaW9uO3RoZSBwYXJhbWV0ZXJzIHJvaS53aWR0aCBhbmQgcm9pLmhlaWdodCBtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBlcXVhbCB0byBlaXRoZXIgMiwgNCwgb3IgOC4KKyAqIFtvdXRdCXBEc3QJUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gZnJhbWUgYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT0yLCAgMi1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT00LCAgNC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICogICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqIElmIHRoZSBmdW5jdGlvbiBydW5zIHdpdGhvdXQgZXJyb3IsIGl0IHJldHVybnMgT01YX1N0c19Ob0Vyci4KKyAqIElmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIG9jY3VycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgT01YX1N0c19CYWRBcmdFcnI6CisgKglwU3JjIG9yIHBEc3QgaXMgTlVMTC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCA8IDguCisgKglkeCBvciBkeSBpcyBvdXQgb2YgcmFuZ2UgWzAtN10uCisgKglyb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBvdXQgb2YgcmFuZ2UgezIsNCw4fS4KKyAqCXJvaS53aWR0aCBpcyBlcXVhbCB0byAyLCBidXQgcERzdCBpcyBub3QgMi1ieXRlIGFsaWduZWQuCisgKglyb2kud2lkdGggaXMgZXF1YWwgdG8gNCwgYnV0IHBEc3QgaXMgbm90IDQtYnl0ZSBhbGlnbmVkLgorICoJcm9pLndpZHRoIGlzIGVxdWFsIHRvIDgsIGJ1dCBwRHN0IGlzIG5vdCA4IGJ5dGUgYWxpZ25lZC4KKyAqCXNyY1N0ZXAgb3IgZHN0U3RlcCBpcyBub3QgYSBtdWx0aXBsZSBvZiA4LgorICoKKyAqLworCitPTVhSZXN1bHQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUNocm9tYSAoCisgICAgIGNvbnN0IE9NWF9VOCogcFNyYywKKyAgICAgT01YX1MzMiBzcmNTdGVwLAorICAgICBPTVhfVTgqIHBEc3QsCisgICAgIE9NWF9TMzIgZHN0U3RlcCwKKyAgICAgT01YX1MzMiBkeCwKKyAgICAgT01YX1MzMiBkeSwKKyAgICAgT01YU2l6ZSByb2kKKyApCit7CisgICAgcmV0dXJuIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hIAorICAgICAgICAoKE9NWF9VOCopcFNyYywgc3JjU3RlcCwgcERzdCwgZHN0U3RlcCwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCBkeCwgZHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkQgT0YgRklMRQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk0MmViYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MucwpAQCAtMCwwICsxLDU1MyBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCis7Ly8gRnVuY3Rpb246Cis7Ly8gICAgIG9teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hCis7Ly8KKzsvLyBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEgaW4gdjYgYXNzZW1ibHkuCis7Ly8gUGVyZm9ybXMgcXVhcnRlciBwZWwgaW50ZXJwb2xhdGlvbiBvZiBpbnRlciBsdW1hIE1CLgorOy8vIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZSBpcyBhbHJlYWR5IHBhZGRlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKzsvLyBQYXJhbWV0ZXJzOgorOy8vIFtpbl0gICAgcFNyYyAgICAgICAgUG9pbnRlciB0byB0aGUgc291cmNlIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIKKzsvLyBbaW5dICAgIHNyY1N0ZXAgICAgIFJlZmVyZW5jZSBmcmFtZSBzdGVwIGluIGJ5dGUKKzsvLyBbaW5dICAgIGRzdFN0ZXAgICAgIERlc3RpbmF0aW9uIGZyYW1lIHN0ZXAgaW4gYnl0ZS4gTXVzdCBiZSBtdWx0aXBsZSBvZiByb2kud2lkdGgKKzsvLyBbaW5dICAgIGR4ICAgICAgICAgIEZyYWN0aW9uYWwgcGFydCBvZiBob3Jpem9udGFsIG1vdGlvbiB2ZWN0b3IKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQorOy8vIFtpbl0gICAgZHkgICAgICAgICAgRnJhY3Rpb25hbCBwYXJ0IG9mIHZlcnRpY2FsIG1vdGlvbiB2ZWN0b3IKKzsvLyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gMS80IHBpeGVsIHVuaXQ7IHZhbGlkIGluIHRoZSByYW5nZSBbMCwzXQorOy8vIFtpbl0gICAgcm9pICAgICAgICAgRGltZW5zaW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHJlZ2lvbjt0aGUgcGFyYW1ldGVycyByb2kud2lkdGggYW5kIHJvaS5oZWlnaHQgbXVzdAorOy8vICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGVxdWFsIHRvIGVpdGhlciA0LCA4LCBvciAxNi4KKzsvLyBbb3V0XSAgIHBEc3QgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGZyYW1lIGJ1ZmZlci4KKzsvLyAgICAgICAgICAgICAgICAgICBpZiByb2kud2lkdGg9PTQsICA0LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8gICAgICAgICAgICAgICAgICAgaWYgcm9pLndpZHRoPT04LCAgOC1ieXRlIGFsaWdubWVudCByZXF1aXJlZAorOy8vICAgICAgICAgICAgICAgICAgIGlmIHJvaS53aWR0aD09MTYsIDE2LWJ5dGUgYWxpZ25tZW50IHJlcXVpcmVkCis7Ly8KKzsvLyBSZXR1cm4gVmFsdWU6Cis7Ly8gSWYgdGhlIGZ1bmN0aW9uIHJ1bnMgd2l0aG91dCBlcnJvciwgaXQgcmV0dXJucyBPTVhfU3RzX05vRXJyLgorOy8vIEl0IGlzIGFzc3VlZCB0aGF0IGZvbGxvd2luZyBjYXNlcyBhcmUgc2F0aXNmaWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246Cis7Ly8gIHBTcmMgb3IgcERzdCBpcyBub3QgTlVMTC4KKzsvLyAgc3JjU3RlcCBvciBkc3RTdGVwID49IHJvaS53aWR0aC4KKzsvLyAgICAgZHggb3IgZHkgaXMgaW4gdGhlIHJhbmdlIFswLTNdLgorOy8vICAgICByb2kud2lkdGggb3Igcm9pLmhlaWdodCBpcyBub3Qgb3V0IG9mIHJhbmdlIHs0LCA4LCAxNn0uCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA0LCBEc3QgaXMgNCBieXRlIGFsaWduZWQuCis7Ly8gICAgIElmIHJvaS53aWR0aCBpcyBlcXVhbCB0byA4LCBwRHN0IGlzIDggYnl0ZSBhbGlnbmVkLgorOy8vICAgICBJZiByb2kud2lkdGggaXMgZXF1YWwgdG8gMTYsIHBEc3QgaXMgMTYgYnl0ZSBhbGlnbmVkLgorOy8vICAgICBzcmNTdGVwIGFuZCBkc3RTdGVwIGlzIG11bHRpcGxlIG9mIDguCis7Ly8KKzsvLworCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgICBFWFBPUlQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKKyAgICAgICAgCisKKyAgICBJRiBDb3J0ZXhBOAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIElNUE9SVCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEVORElGCisgICAgCisgICAgCisKKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworcFNyYyAgICAgICAgICAgIFJOIDAKK3NyY1N0ZXAgICAgICAgICBSTiAxCitwRHN0ICAgICAgICAgICAgUk4gMgorZHN0U3RlcCAgICAgICAgIFJOIDMKK2lIZWlnaHQgICAgICAgICBSTiA0CitpV2lkdGggICAgICAgICAgUk4gNQorCis7Ly8gRGVjbGFyZSBvdGhlciBpbnRlcm1lZGlhdGUgcmVnaXN0ZXJzCitpZHggICAgICAgICAgICAgUk4gNgoraWR5ICAgICAgICAgICAgIFJOIDcKK2luZGV4ICAgICAgICAgICBSTiA2CitUZW1wICAgICAgICAgICAgUk4gMTIKK3BBcmdzICAgICAgICAgICBSTiAxMQorCisKKyAgICBJRiBDb3J0ZXhBOAorCisgICAgICAgIDsvLworICAgICAgICA7Ly8gSW50ZXJwb2xhdGlvbiBvZiBsdW1hIGlzIGltcGxlbWVudGVkIGJ5IHByb2Nlc3NpbmcgYmxvY2sgb2YgcGl4ZWxzLCBzaXplIDR4NCBhdCBhIHRpbWUuCisgICAgICAgIDsvLworICAgICAgICBNX0FMTE9DNCAgICBwcEFyZ3MsIDE2CisgICAgICAgIAorICAgICAgICA7Ly8gRnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEsIHIxMSwgZDE1CisKK3BTcmNCSyAgICAgICAgICBSTiA4CisKKzsvLyBEZWNsYXJlIE5lb24gcmVnaXN0ZXJzCitkQ29lZmY1ICAgICAgICAgRE4gMzAuUzE2CitkQ29lZmYyMCAgICAgICAgRE4gMzEuUzE2CisKKzsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIEhvcml6b250YWwgaW50ZXJwb2xhdGlvbgorZFNyYzBjICAgICAgICAgIEROIDE0LlU4CitkU3JjMWMgICAgICAgICAgRE4gMTYuVTgKK2RTcmMyYyAgICAgICAgICBETiAxOC5VOAorZFNyYzNjICAgICAgICAgIEROIDIwLlU4ICAgICAgICAgICAgICAgICAgIAorZFNyYzBkICAgICAgICAgIEROIDE1LlU4CitkU3JjMWQgICAgICAgICAgRE4gMTcuVTgKK2RTcmMyZCAgICAgICAgICBETiAxOS5VOAorZFNyYzNkICAgICAgICAgIEROIDIxLlU4CitkQWNjSDAgICAgICAgICAgRE4gMjIuVTgKK2RBY2NIMSAgICAgICAgICBETiAyNC5VOAorZEFjY0gyICAgICAgICAgIEROIDI2LlU4CitkQWNjSDMgICAgICAgICAgRE4gMjguVTgKK2RSZXN1bHRIMCAgICAgICBETiAyMi5VMzIKK2RSZXN1bHRIMSAgICAgICBETiAyNC5VMzIKK2RSZXN1bHRIMiAgICAgICBETiAyNi5VMzIKK2RSZXN1bHRIMyAgICAgICBETiAyOC5VMzIKKworOy8vIFJlZ2lzdGVycyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgVmVydGljYWwgaW50ZXJwb2xhdGlvbgorZFNyYzAgICAgICAgICAgIEROIDkuVTgKK2RTcmMxICAgICAgICAgICBETiAxMC5VOAorZFNyYzIgICAgICAgICAgIEROIDExLlU4CitkU3JjMyAgICAgICAgICAgRE4gMTIuVTgKK2RTcmM0ICAgICAgICAgICBETiAxMy5VOAorZEFjY1YwICAgICAgICAgIEROIDAuVTgKK2RBY2NWMSAgICAgICAgICBETiAyLlU4CitkQWNjVjIgICAgICAgICAgRE4gNC5VOAorZEFjY1YzICAgICAgICAgIEROIDYuVTgKK2RSZXN1bHRWMCAgICAgICBETiAwLlUzMgorZFJlc3VsdFYxICAgICAgIEROIDIuVTMyCitkUmVzdWx0VjIgICAgICAgRE4gNC5VMzIKK2RSZXN1bHRWMyAgICAgICBETiA2LlUzMgorICAgICAgICAKKzsvLyBSZWdpc3RlcnMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIERpYWdvbmFsIGludGVycG9sYXRpb24KK2RUQWNjMCAgICAgICAgICBETiAwLlU4CitkVEFjYzEgICAgICAgICAgRE4gMi5VOAorZFRBY2MyICAgICAgICAgIEROIDQuVTgKK2RUQWNjMyAgICAgICAgICBETiA2LlU4CitkVFJlczAgICAgICAgICAgRE4gMC4zMgorZFRSZXMxICAgICAgICAgIEROIDIuMzIKK2RUUmVzMiAgICAgICAgICBETiA0LjMyCitkVFJlczMgICAgICAgICAgRE4gNi4zMgorZFRSZXN1bHQwICAgICAgIEROIDE0LlU4CitkVFJlc3VsdDEgICAgICAgRE4gMTYuVTgKK2RUUmVzdWx0MiAgICAgICBETiAxOC5VOAorZFRSZXN1bHQzICAgICAgIEROIDIwLlU4CitkVGVtcFAwICAgICAgICAgRE4gMTguUzE2CitkVGVtcFAxICAgICAgICAgRE4gMTkuUzE2CitkVGVtcFEwICAgICAgICAgRE4gMjAuUzE2CitkVGVtcFExICAgICAgICAgRE4gMjEuUzE2CitkVGVtcFIwICAgICAgICAgRE4gMjIuUzE2CitkVGVtcFIxICAgICAgICAgRE4gMjMuUzE2CitkVGVtcFMwICAgICAgICAgRE4gMjQuUzE2CitkVGVtcFMxICAgICAgICAgRE4gMjUuUzE2CitxVGVtcFAwMSAgICAgICAgUU4gOS5TMTYKK3FUZW1wUTAxICAgICAgICBRTiAxMC5TMTYKK3FUZW1wUjAxICAgICAgICBRTiAxMS5TMTYKK3FUZW1wUzAxICAgICAgICBRTiAxMi5TMTYKKworOy8vIEludGVybWVkaWF0ZSB2YWx1ZXMgZm9yIGF2ZXJhZ2luZworcVJlczIgICAgICAgICAgIFFOIDcuUzE2CitxUmVzMyAgICAgICAgICAgUU4gOC5TMTYKK3FSZXM0ICAgICAgICAgICBRTiA5LlMxNgorcVJlczUgICAgICAgICAgIFFOIDEwLlMxNgorcVJlczYgICAgICAgICAgIFFOIDExLlMxNgorICAgICAgIAorOy8vIEZvciBpbXBsZW1lbnRpbmcgY29weQorZERzdDAgICAgICAgICAgICBETiA5LjMyCitkRHN0MSAgICAgICAgICAgIEROIDEwLjMyCitkRHN0MiAgICAgICAgICAgIEROIDExLjMyCitkRHN0MyAgICAgICAgICAgIEROIDEyLjMyCisKKyAgICAgICAgOy8vIERlZmluZSBzdGFjayBhcmd1bWVudHMKKyAgICAgICAgTV9BUkcgICAgICAgcHRyaWR4LCA0CisgICAgICAgIE1fQVJHICAgICAgIHB0cmlkeSwgNCAgICAgICAgCisgICAgICAgIE1fQVJHICAgICAgIHB0cldpZHRoLCA0CisgICAgICAgIE1fQVJHICAgICAgIHB0ckhlaWdodCwgNCAgICAgICAgCisKKyAgICAgICAgOy8vIExvYWQgc3RydWN0dXJlIGVsZW1lbnRzIG9mIHJvaSAKKyAgICAgICAgTV9MRFIgICAgICAgaWR4LCBwdHJpZHgKKyAgICAgICAgTV9MRFIgICAgICAgaWR5LCBwdHJpZHkKKyAgICAgICAgTV9MRFIgICAgICAgaVdpZHRoLCBwdHJXaWR0aAorICAgICAgICBNX0xEUiAgICAgICBpSGVpZ2h0LCBwdHJIZWlnaHQKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIGluZGV4LCBpZHgsIGlkeSwgTFNMICMyICAgICAgICAgICAgICAgICA7Ly8gIFtpbmRleF0gPSBbaWR5XVtpZHhdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBNb3ZlIGNvZWZmaWNpZW50cyBOZW9uIHJlZ2lzdGVycworICAgICAgICBWTU9WICAgICAgICBkQ29lZmYyMCwgIzIwCisgICAgICAgIFZNT1YgICAgICAgIGRDb2VmZjUsICM1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitCbG9jazR4NFdpZHRoTG9vcAorQmxvY2s0eDRIZWlnaHRMb29wCisKKyAgICAgICAgU1RNICAgICAgICAgcEFyZ3MsIHtwU3JjLHNyY1N0ZXAscERzdCxkc3RTdGVwfSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gc3dpdGNoIHRhYmxlIHVzaW5nIG1vdGlvbiB2ZWN0b3IgYXMgaW5kZXgKKyAgICAgICAgQUREICAgICAgICAgcGMsIHBjLCBpbmRleCwgTFNMICMyCisgICAgICAgIEIgICAgICAgICAgIENhc2VfZgorICAgICAgICBCICAgICAgICAgICBDYXNlXzAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzEgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzIgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzMgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzQgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzUgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzYgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzcgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzggICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlXzkgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlX2EgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlX2IgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlX2MgICAgICAgIAorICAgICAgICBCICAgICAgICAgICBDYXNlX2QKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9lICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgQ2FzZV9mCisgICAgICAgICAgICAgICAgICAgIAorQ2FzZV8wICAgICAgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2FzZSBHCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDAgXG4iCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZHMgYSA0eDQgYmxvY2sgb2YgLjggYW5kIHN0b3JlcyBhcyAuMzIKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcFNyYywgc3JjU3RlcCwgTFNMICMxIAorICAgICAgICBWTEQxICAgICAgICBkU3JjMCwgW3BTcmNdLCBzcmNTdGVwCisgICAgICAgIFZMRDEgICAgICAgIGRTcmMyLCBbVGVtcF0sIHNyY1N0ZXAKKyAgICAgICAgVkxEMSAgICAgICAgZFNyYzEsIFtwU3JjXQorICAgICAgICBWTEQxICAgICAgICBkU3JjMywgW1RlbXBdCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGREc3QwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZERzdDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkRHN0MVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGREc3QzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfMQorICAgICAgICA7Ly8gQ2FzZSBhCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDEgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUgICAgICAgIAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDAsIGRBY2NIMCwgZFNyYzBjCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMiwgZEFjY0gyLCBkU3JjMmMKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gxLCBkQWNjSDEsIGRTcmMxYworICAgICAgICBWUkhBREQgICAgICBkQWNjSDMsIGRBY2NIMywgZFNyYzNjCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV8yCisgICAgICAgIDsvLyBDYXNlIGIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMiBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMiAgICAgICAgCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdEgzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQgICAgICAgIAorQ2FzZV8zCisgICAgICAgIDsvLyBDYXNlIGMKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgMyBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkU3JjMGQKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRTcmMyZAorICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZFNyYzFkCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkU3JjM2QKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkUmVzdWx0SDNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzQKKyAgICAgICAgOy8vIENhc2UgZAorICAgICAgICBNX1BSSU5URiAiQ2FzZSA0IFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMCwgZEFjY1YwLCBkU3JjMAorICAgICAgICBWUkhBREQgICAgICBkQWNjVjIsIGRBY2NWMiwgZFNyYzIKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YxLCBkQWNjVjEsIGRTcmMxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMywgZEFjY1YzLCBkU3JjMworICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfNQorICAgICAgICA7Ly8gQ2FzZSBlCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDUgXG4iCisgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyY0JLLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgorICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIAorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kICAgICAgICAKK0Nhc2VfNgorICAgICAgICA7Ly8gQ2FzZSBmCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDYgXG4iCisKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDAsIHFSZXMyLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MSwgcVJlczMsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQyLCBxUmVzNCwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDMsIHFSZXM1LCAjNSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgorICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICAKKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZCAgICAgICAgCitDYXNlXzcKKyAgICAgICAgOy8vIENhc2UgZworICAgICAgICBNX1BSSU5URiAiQ2FzZSA3IFxuIgorICAgICAgICBNT1YgICAgICAgICBwU3JjQkssIHBTcmMKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyY0JLLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgorICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIAorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlXzgKKyAgICAgICAgOy8vIENhc2UgaAorICAgICAgICBNX1BSSU5URiAiQ2FzZSA4IFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFJlc3VsdFYzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfOQorICAgICAgICA7Ly8gQ2FzZSBpCisgICAgICAgIE1fUFJJTlRGICJDYXNlIDkgXG4iCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmUKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBQMCwgZFRlbXBQMCwgZFRlbXBQMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBRMCwgZFRlbXBRMCwgZFRlbXBRMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBSMCwgZFRlbXBSMCwgZFRlbXBSMSwgIzIKKyAgICAgICAgVkVYVCAgICAgICAgZFRlbXBTMCwgZFRlbXBTMCwgZFRlbXBTMSwgIzIKKyAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVRlbXBQMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxVGVtcFEwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFUZW1wUjAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVRlbXBTMDEsICM1ICAgICAgICAKKworICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQorICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9hCisgICAgICAgIDsvLyBDYXNlIGoKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYSBcbiIKKworICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9iCisgICAgICAgIDsvLyBDYXNlIGsKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgYiBcbiIKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsICMyCisgICAgICAgIEJMICAgICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgICAgICBWRVhUICAgICAgICBkVGVtcFAwLCBkVGVtcFAwLCBkVGVtcFAxLCAjMworICAgICAgICBWRVhUICAgICAgICBkVGVtcFEwLCBkVGVtcFEwLCBkVGVtcFExLCAjMworICAgICAgICBWRVhUICAgICAgICBkVGVtcFIwLCBkVGVtcFIwLCBkVGVtcFIxLCAjMworICAgICAgICBWRVhUICAgICAgICBkVGVtcFMwLCBkVGVtcFMwLCBkVGVtcFMxLCAjMworICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQwLCBxVGVtcFAwMSwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDEsIHFUZW1wUTAxLCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MiwgcVRlbXBSMDEsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQzLCBxVGVtcFMwMSwgIzUgICAgICAgIAorCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMCwgZFRBY2MwLCBkVFJlc3VsdDAKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MyLCBkVEFjYzIsIGRUUmVzdWx0MgorICAgICAgICBWUkhBREQgICAgICBkVEFjYzEsIGRUQWNjMSwgZFRSZXN1bHQxCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMywgZFRBY2MzLCBkVFJlc3VsdDMKKyAgICAgICAgQUREICAgICAgICAgVGVtcCwgcERzdCwgZHN0U3RlcCwgTFNMICMxIAorICAgICAgICBWU1QxICAgICAgICBkVFJlczBbMF0sIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczJbMF0sIFtUZW1wXSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICAgICBkVFJlczFbMF0sIFtwRHN0XQorICAgICAgICBWU1QxICAgICAgICBkVFJlczNbMF0sIFtUZW1wXQorICAgICAgICBNX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIEIgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2MKKyAgICAgICAgOy8vIENhc2UgbgorICAgICAgICBNX1BSSU5URiAiQ2FzZSBjIFxuIgorCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMCwgZEFjY1YwLCBkU3JjMQorICAgICAgICBWUkhBREQgICAgICBkQWNjVjIsIGRBY2NWMiwgZFNyYzMKKyAgICAgICAgVlJIQUREICAgICAgZEFjY1YxLCBkQWNjVjEsIGRTcmMyCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NWMywgZEFjY1YzLCBkU3JjNAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRWM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICAgICAgQmxvY2s0eDRMb29wRW5kCitDYXNlX2QKKyAgICAgICAgOy8vIENhc2UgcAorICAgICAgICBNX1BSSU5URiAiQ2FzZSBkIFxuIgorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmNCSywgc3JjU3RlcAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgorICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQiAgICAgICBCbG9jazR4NExvb3BFbmQKK0Nhc2VfZQorICAgICAgICA7Ly8gQ2FzZSBxCisgICAgICAgIE1fUFJJTlRGICJDYXNlIGUgXG4iCisgICAgICAgIAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBzcmNTdGVwLCBMU0wgIzEKKyAgICAgICAgU1VCICAgICAgICAgcFNyYywgcFNyYywgIzIKKyAgICAgICAgQkwgICAgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MCwgcVJlczMsICM1ICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gICAgZFRSZXN1bHQxLCBxUmVzNCwgIzUgICAgICAgIAorICAgICAgICBWUVJTSFJVTiAgICBkVFJlc3VsdDIsIHFSZXM1LCAjNSAgICAgICAgCisgICAgICAgIFZRUlNIUlVOICAgIGRUUmVzdWx0MywgcVJlczYsICM1ICAgICAgICAKKworICAgICAgICBWUkhBREQgICAgICBkVEFjYzAsIGRUQWNjMCwgZFRSZXN1bHQwCisgICAgICAgIFZSSEFERCAgICAgIGRUQWNjMiwgZFRBY2MyLCBkVFJlc3VsdDIKKyAgICAgICAgVlJIQUREICAgICAgZFRBY2MxLCBkVEFjYzEsIGRUUmVzdWx0MQorICAgICAgICBWUkhBREQgICAgICBkVEFjYzMsIGRUQWNjMywgZFRSZXN1bHQzCisgICAgICAgIEFERCAgICAgICAgIFRlbXAsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMSAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMwWzBdLCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMyWzBdLCBbVGVtcF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMxWzBdLCBbcERzdF0KKyAgICAgICAgVlNUMSAgICAgICAgZFRSZXMzWzBdLCBbVGVtcF0KKyAgICAgICAgTV9BRFIgICAgICAgcEFyZ3MsIHBwQXJncworICAgICAgICBCICAgICAgIEJsb2NrNHg0TG9vcEVuZAorQ2FzZV9mCisgICAgICAgIDsvLyBDYXNlIHIKKyAgICAgICAgTV9QUklOVEYgIkNhc2UgZiBcbiIKKyAgICAgICAgTU9WICAgICAgICAgcFNyY0JLLCBwU3JjCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmMsICMxCisgICAgICAgIFNVQiAgICAgICAgIHBTcmMsIHBTcmMsIHNyY1N0ZXAsIExTTCAjMQorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBTcmMsIHBTcmNCSywgc3JjU3RlcAorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCAjMgorICAgICAgICBCTCAgICAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZSAgICAgICAgCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMCwgZEFjY0gwLCBkQWNjVjAKKyAgICAgICAgVlJIQUREICAgICAgZEFjY0gyLCBkQWNjSDIsIGRBY2NWMgorICAgICAgICBWUkhBREQgICAgICBkQWNjSDEsIGRBY2NIMSwgZEFjY1YxCisgICAgICAgIFZSSEFERCAgICAgIGRBY2NIMywgZEFjY0gzLCBkQWNjVjMgICAgICAgIAorICAgICAgICBBREQgICAgICAgICBUZW1wLCBwRHN0LCBkc3RTdGVwLCBMU0wgIzEgCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMFswXSwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMlswXSwgW1RlbXBdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIMVswXSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgICAgIGRSZXN1bHRIM1swXSwgW1RlbXBdCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKworCitCbG9jazR4NExvb3BFbmQKKworICAgICAgICA7Ly8gV2lkdGggTG9vcAorICAgICAgICA7Ly9NX0FEUiAgICAgICBwQXJncywgcHBBcmdzCisgICAgICAgIExETSAgICAgICAgIHBBcmdzLCB7cFNyYyxzcmNTdGVwLHBEc3QsZHN0U3RlcH0gIDsvLyBMb2FkIGFyZ3VtZW50cworICAgICAgICBTVUJTICAgICAgICBpV2lkdGgsIGlXaWR0aCwgIzQKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgIzQgICAgICAKKyAgICAgICAgQUREICAgICAgICAgcERzdCwgcERzdCwgIzQKKyAgICAgICAgQkdUICAgICAgICAgQmxvY2s0eDRXaWR0aExvb3AKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBIZWlnaHQgTG9vcAorICAgICAgICBTVUJTICAgICAgICBpSGVpZ2h0LCBpSGVpZ2h0LCAjNAorICAgICAgICBNX0xEUiAgICAgICBpV2lkdGgsIHB0cldpZHRoCisgICAgICAgIE1fQURSICAgICAgIHBBcmdzLCBwcEFyZ3MKKyAgICAgICAgQUREICAgICAgICAgcFNyYywgcFNyYywgc3JjU3RlcCwgTFNMICMyICAgICAgCisgICAgICAgIEFERCAgICAgICAgIHBEc3QsIHBEc3QsIGRzdFN0ZXAsIExTTCAjMgorICAgICAgICBTVUIgICAgICAgICBwU3JjLCBwU3JjLCBpV2lkdGgKKyAgICAgICAgU1VCICAgICAgICAgcERzdCwgcERzdCwgaVdpZHRoCisgICAgICAgIEJHVCAgICAgICAgIEJsb2NrNHg0SGVpZ2h0TG9vcAorCitFbmRPZkludGVycG9sYXRpb24KKyAgICAgICAgTU9WICAgICAgICAgcjAsICMwCisgICAgICAgIE1fRU5EICAgICAgIAorCisgICAgRU5ESUYgIAorICAgICAgICA7Ly8gRW5kIG9mIENvcnRleEE4CisgICAgICAgICAgICAgICAgICAgIAorICAgIEVORAorICAgIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhNjA3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKQEAgLTAsMCArMSw0MzYgQEAKKzsvLworOy8vIAorOy8vIEZpbGUgTmFtZTogIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OF9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCisKKyAgCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIEVYUE9SVCBhcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4CisgICAgICAgIAorOy8vIERlZmluZSB0aGUgcHJvY2Vzc29yIHZhcmlhbnRzIHN1cHBvcnRlZCBieSB0aGlzIGZpbGUKKyAgICAgICAgIAorICAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorICAgICAKKyAgICAgQVJFQSB0YWJsZSwgREFUQSAgICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGZvciBpbXBsZW1lbnRpbmcgc3dpdGNoIGNhc2Ugb2YgQyBpbiBhc20gYnkKKzsvLyB0aGUgbWVodG9kIG9mIHR3byBsZXZlbHMgb2YgaW5kZXhpbmcuCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfcEluZGV4VGFibGU4eDgKKyAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUiAKKyAgICBEQ0QgIE9NWF9WQ19DSFJPTUFfVkVSVCwgICBPTVhfVkNfQ0hST01BX1BMQU5FICAKKyAgICAKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlQ2hyb21hOHg4LDEKKyAgICBEQ1cgICAzLCAyLCAxLDQgCisgICAgRENXICAtMywtMiwtMSwwCisgICAgRENXICAgMSwgMiwgMyw0CisgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICBJRiBDb3J0ZXhBOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCitwYyAgICAgICAgICAgICAgUk4gMTUgICAKK3JldHVybiAgICAgICAgICBSTiAwICAKK3BUYWJsZSAgICAgICAgICBSTiA4IAorICAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gSW5wdXQgQXJndW1lbnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcFNyY0xlZnQgICAgICAgIFJOIDAgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BTcmNBYm92ZSAgICAgICBSTiAxICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmVMZWZ0ICAgUk4gMiAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcERzdCAgICAgICAgICAgIFJOIDMgICAgOy8vIG91dHB1dCBwb2ludGVyCitsZWZ0U3RlcCAgICAgICAgUk4gNCAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK2RzdFN0ZXAgICAgICAgICBSTiA1ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorcHJlZE1vZGUgICAgICAgIFJOIDYgICAgOy8vIGlucHV0IHZhcmlhYmxlCithdmFpbGFiaWxpdHkgICAgUk4gNyAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3BNdWx0aXBsaWVyVGFibGUgICAgUk4gIDIgICAgIAorCitwVG1wICAgICAgICAgICAgUk4gOQorc3RlcCAgICAgICAgICAgIFJOIDEwCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIE5lb24gUmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworOy8vIE9NWF9WQ19DSFJPTUFfSE9SCisKK2RMZWZ0VmFsMCAgICAgICBETiAgRDAuOAorZExlZnRWYWwxICAgICAgIEROICBEMS44CitkTGVmdFZhbDIgICAgICAgRE4gIEQyLjgKK2RMZWZ0VmFsMyAgICAgICBETiAgRDMuOAorZExlZnRWYWw0ICAgICAgIEROICBENC44CitkTGVmdFZhbDUgICAgICAgRE4gIEQ1LjgKK2RMZWZ0VmFsNiAgICAgICBETiAgRDYuOAorZExlZnRWYWw3ICAgICAgIEROICBENy44CisKKzsvLyBPTVhfVkNfQ0hST01BX1ZFUlQKKworZEFib3ZlVmFsICAgICAgIEROICBEMC5VOAorCis7Ly8gT01YX1ZDX0NIUk9NQV9EQworCitkTGVmdFZhbCAgICAgICAgRE4gIEQxLlU4CitkU3VtQWJvdmVWYWxVMTYgRE4gIEQyLlUxNgorZFN1bUFib3ZlVmFsVTMyIEROICBEMy5VMzIKK2RTdW1BYm92ZVZhbFU4ICBETiAgRDMuVTgKK2RTdW1MZWZ0VmFsVTE2ICBETiAgRDIuVTE2CitkU3VtTGVmdFZhbFUzMiAgRE4gIEQxLlUzMgorZFN1bUxlZnRWYWxVOCAgIEROICBEMS5VOAorZFN1bUFib3ZlTGVmdCAgIEROICBEMi5VMzIKK2RTdW1BYm92ZUxlZnRVOCBETiAgRDIuVTgKK2RJbmRleFJvdzBVOCAgICBETiAgRDUuVTgKK2RJbmRleFJvdzAgICAgICBETiAgRDUuVTY0CitkSW5kZXhSb3c0VTggICAgRE4gIEQ2LlU4CitkSW5kZXhSb3c0ICAgICAgRE4gIEQ2LlU2NAorZERzdFJvdzAgICAgICAgIEROICBEMC5VOAorZERzdFJvdzQgICAgICAgIEROICBENC5VOAorZENvbnN0MTI4VTggICAgIEROICBEMC5VOAorCis7Ly8gT01YX1ZDX0NIUk9NQV9QTEFORQorCitkUmV2QWJvdmVWYWwgICAgRE4gIEQzLlU4ICAKK2RSZXZBYm92ZVZhbFU2NCBETiAgRDMuVTY0ICAKK2RBYm92ZUxlZnRWYWwgICBETiAgRDIuVTgKK3FBYm92ZTdtaW51czAgICBRTiAgUTMuUzE2IAorcUFib3ZlRGlmZiAgICAgIFFOICBRMi5TMTYgCitkSW5kZXggICAgICAgICAgRE4gIEQ4LlU4ICAKK2REaWZmQWJvdmVVOCAgICBETiAgRDkuVTggIAorZERpZmZBYm92ZVMxNiAgIEROICBEOS5TMTYgCitkQWJvdmVEaWZmMFU4ICAgRE4gIEQ0LlU4ICAKK2RBYm92ZURpZmYwVTY0ICBETiAgRDQuVTY0CitkQWJvdmU3bWludXMwVTggRE4gIEQ2LlU4ICAKK2RNdWx0aXBsaWVyICAgICBETiAgRDEwLlMxNiAKK2RIb3JQcmVkICAgICAgICBETiAgRDExLlMxNiAKK2RSZXZMZWZ0VmFsICAgICBETiAgRDMuVTgKK2RSZXZMZWZ0VmFsVTY0ICBETiAgRDMuVTY0CitxTGVmdDdtaW51czAgICAgUU4gIFE3LlMxNgorcUxlZnREaWZmICAgICAgIFFOICBRNi5TMTYKK2REaWZmTGVmdFU4ICAgICBETiAgRDE2LlU4CitkRGlmZkxlZnRTMTYgICAgRE4gIEQxNi5TMTYKK2RMZWZ0RGlmZjBVOCAgICBETiAgRDEyLlU4CitkTGVmdERpZmYwVTY0ICAgRE4gIEQxMi5VNjQKK2RMZWZ0N21pbnVzMFU4ICBETiAgRDE0LlU4CitkVmVyUHJlZCAgICAgICAgRE4gIEQzLlMxNiAKK2RIVlZhbFMxNiAgICAgICBETiAgRDMuUzE2CitkSFZWYWxTMzIgICAgICAgRE4gIEQzLlMzMgorZEhWVGVtcFMzMiAgICAgIEROICBEMi5TMzIKK3FBICAgICAgICAgICAgICBRTiAgUTAuUzE2CitxQiAgICAgICAgICAgICAgUU4gIFEyLlMxNgorcUMgICAgICAgICAgICAgIFFOICBRMy5TMTYKK3FNdWx0aXBsaWVyICAgICBRTiAgUTUuUzE2CitkTXVsdGlwbGllcjAgICAgRE4gIEQxMC5TMTYKK2RNdWx0aXBsaWVyMSAgICBETiAgRDExLlMxNgorcUMwICAgICAgICAgICAgIFFOICBRMC5TMTYKK3FDMSAgICAgICAgICAgICBRTiAgUTEuUzE2CitxQzIgICAgICAgICAgICAgUU4gIFE0LlMxNgorcUMzICAgICAgICAgICAgIFFOICBRNS5TMTYKK3FDNCAgICAgICAgICAgICBRTiAgUTYuUzE2CitxQzUgICAgICAgICAgICAgUU4gIFE3LlMxNgorcUM2ICAgICAgICAgICAgIFFOICBROC5TMTYKK3FDNyAgICAgICAgICAgICBRTiAgUTkuUzE2CitxU3VtMCAgICAgICAgICAgUU4gIFEwLlMxNgorcVN1bTEgICAgICAgICAgIFFOICBRMS5TMTYKK3FTdW0yICAgICAgICAgICBRTiAgUTQuUzE2CitxU3VtMyAgICAgICAgICAgUU4gIFE1LlMxNgorcVN1bTQgICAgICAgICAgIFFOICBRNi5TMTYKK3FTdW01ICAgICAgICAgICBRTiAgUTcuUzE2CitxU3VtNiAgICAgICAgICAgUU4gIFE4LlMxNgorcVN1bTcgICAgICAgICAgIFFOICBROS5TMTYKK2RTdW0wICAgICAgICAgICBETiAgRDAuVTgKK2RTdW0xICAgICAgICAgICBETiAgRDEuVTgKK2RTdW0yICAgICAgICAgICBETiAgRDIuVTgKK2RTdW0zICAgICAgICAgICBETiAgRDMuVTgKK2RTdW00ICAgICAgICAgICBETiAgRDQuVTgKK2RTdW01ICAgICAgICAgICBETiAgRDUuVTgKK2RTdW02ICAgICAgICAgICBETiAgRDYuVTgKK2RTdW03ICAgICAgICAgICBETiAgRDcuVTgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDggc3RhcnRzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAKKyAgICAgICAgOy8vIFdyaXRlIGZ1bmN0aW9uIGhlYWRlcgorICAgICAgICBNX1NUQVJUIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OCwgcjEwLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcFRhYmxlLD1hcm1WQ000UDEwX3BJbmRleFRhYmxlOHg4ICAgOy8vIExvYWQgaW5kZXggdGFibGUgZm9yIHN3aXRjaCBjYXNlCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhcmd1bWVudCBmcm9tIHRoZSBzdGFjaworICAgICAgICBNX0xEUiAgICBwcmVkTW9kZSwgUHJlZE1vZGUgICAgICAgICAgICAgICAgICA7Ly8gQXJnIHByZWRNb2RlIGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFIgICAgbGVmdFN0ZXAsIExlZnRTdGVwICAgICAgICAgICAgICAgICAgOy8vIEFyZyBsZWZ0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGRzdFN0ZXAsICBEc3RTdGVwICAgICAgICAgICAgICAgICAgIDsvLyBBcmcgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgICAgICAgICAKKyAgICAgICAgTV9MRFIgICAgYXZhaWxhYmlsaXR5LCBBdmFpbGFiaWxpdHkgICAgICAgICAgOy8vIEFyZyBhdmFpbGFiaWxpdHkgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBjLCBbcFRhYmxlLCBwcmVkTW9kZSwgTFNMICMyXSAgICAgIDsvLyBCcmFuY2ggdG8gdGhlIGNhc2UgYmFzZWQgb24gcHJlTW9kZQorCitPTVhfVkNfQ0hST01BX0RDCisgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgRENDaHJvbWE4eDhMZWZ0Tm90QXZhaWxhYmxlCisKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKworICAgICAgICA7Ly8gTG9hZCBMZWZ0IEVkZ2UKKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsxXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzJdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbM119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs0XX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzQqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzVdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNl19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs3XX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzcqbGVmdFN0ZXBdICAgICAgCisgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgorICAgICAgICBCRVEgICAgIERDQ2hyb21hOHg4TGVmdE9ubHlBdmFpbGFibGUKKworICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIGFsc28KKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVmFsLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byA3XSAgCisgICAgICAgIAorICAgICAgICBNT1YgICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDQrNSs2KzcgfCAgMCsxKzIrMyBdIAorICAgICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA2KzcgfCA0KzUgfCAyKzMgfCAwKzEgXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNCs1KzYrNyB8ICAwKzErMiszIF0gICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWQUREICAgICBkU3VtQWJvdmVMZWZ0LGRTdW1BYm92ZVZhbFUzMixkU3VtTGVmdFZhbFUzMgorICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVMZWZ0LGRTdW1BYm92ZUxlZnQsIzMgICAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyA0KSA+PiAzCisgICAgICAgIFZSU0hSICAgIGRTdW1BYm92ZVZhbFUzMixkU3VtQWJvdmVWYWxVMzIsIzIgICAgICAgICA7Ly8gU3VtID0gKFN1bSArIDIpID4+IDIKKyAgICAgICAgVlJTSFIgICAgZFN1bUxlZnRWYWxVMzIsZFN1bUxlZnRWYWxVMzIsIzIgICAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICAKKyAgICAgICAgVk1PViAgICAgZEluZGV4Um93MFU4LCMweDBjICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWTU9WICAgICBkSW5kZXhSb3c0VTgsIzB4MDQKKyAgICAgICAgVlNITCAgICAgZEluZGV4Um93MCxkSW5kZXhSb3cwLCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleDAgPSAweDBjMGMwYzBjMDAwMDAwMDAgCisgICAgICAgIFZTSFIgICAgIGRJbmRleFJvdzQsZEluZGV4Um93NCwjMzIgICAgICAgICAgICAgICAgICA7Ly8gaW5kZXg0ID0gMHgwMDAwMDAwMDA0MDQwNDA0CisgICAgICAgIFZBREQgICAgIGRJbmRleFJvdzRVOCxkSW5kZXhSb3c0VTgsZEluZGV4Um93MFU4ICAgICA7Ly8gaW5kZXg0ID0gMHgwYzBjMGMwYzA0MDQwNDA0CisgICAgICAgIFZUQkwgICAgIGREc3RSb3cwLHtkU3VtQWJvdmVMZWZ0VTgsZFN1bUFib3ZlVmFsVTh9LGRJbmRleFJvdzBVOAorICAgICAgICBWVEJMICAgICBkRHN0Um93NCx7ZFN1bUxlZnRWYWxVOCxkU3VtQWJvdmVMZWZ0VTh9LGRJbmRleFJvdzRVOAorIAorRENDaHJvbWE4eDhMZWZ0U3RvcmUgICAgICAgCisgICAgICAgIEFERCAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFszKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93NCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3c0LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs2KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzQsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworCisgICAgICAgIE1fRVhJVAorICAgICAgICAKKworRENDaHJvbWE4eDhMZWZ0T25seUF2YWlsYWJsZQorCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1MZWZ0VmFsVTE2LCBkTGVmdFZhbCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbIDYrNyB8IDQrNSB8IDIrMyB8IDArMSBdICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUzMiwgZFN1bUxlZnRWYWxVMTYgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WyA0KzUrNis3IHwgIDArMSsyKzMgXSAgIAorICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIAorICAgICAgICBWRFVQICAgICBkRHN0Um93MCxkU3VtTGVmdFZhbFU4WzBdCisgICAgICAgIFZEVVAgICAgIGREc3RSb3c0LGRTdW1MZWZ0VmFsVThbNF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4TGVmdFN0b3JlICAKKyAgICAgICAgCisKK0RDQ2hyb21hOHg4TGVmdE5vdEF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKKyAgICAgICAgQkVRICAgICBEQ0Nocm9tYTh4OE5vbmVBdmFpbGFibGUKKworICAgICAgICA7Ly8gTG9hZCBVcHBlciBFZGdlIAorICAgICAgICBWTEQxICAgICBkQWJvdmVWYWwsW3BTcmNBYm92ZV0gICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVswIHRvIDddICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVWYWxVMTYsIGRBYm92ZVZhbCAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNis3IHwgNCs1IHwgMiszIHwgMCsxIF0gICAgICAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUzMiwgZFN1bUFib3ZlVmFsVTE2ICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWyA0KzUrNis3IHwgIDArMSsyKzMgXSAKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICBWTU9WICAgICBkSW5kZXhSb3cwVTgsIzB4MDQKKyAgICAgICAgVlNITCAgICAgZEluZGV4Um93MCxkSW5kZXhSb3cwLCMzMiAgICAgICAgICAgICAgICAgIDsvLyBpbmRleCA9IDB4MDQwNDA0MDQwMDAwMDAwMAorICAgICAgICBWVEJMICAgICBkRHN0Um93MCx7ZFN1bUFib3ZlVmFsVTh9LGRJbmRleFJvdzBVOCAKKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4VXBwZXJTdG9yZQorICAgICAgICAKKworRENDaHJvbWE4eDhOb25lQXZhaWxhYmxlICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgIGRDb25zdDEyOFU4LCMweDgwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MDgwODA4MDgwIGlmKGNvdW50ID09IDApCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIgICAgICAgICAgICAgICAgICAgICA7Ly8gcmV0dXJuTm9FcnJvcgorCitEQ0Nocm9tYTh4OFVwcGVyU3RvcmUgICAgICAgIAorICAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzAqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMSpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzMqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgIGREc3RSb3cwLFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICAgZERzdFJvdzAsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzYqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgICBkRHN0Um93MCxbcFRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIAorICAgICAgICBNX0VYSVQKKworCitPTVhfVkNfQ0hST01BX1ZFUlQKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENDaHJvbWE4eDhVcHBlclN0b3JlCisgICAgICAgIAorCitPTVhfVkNfQ0hST01BX0hPUgorICAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwU3JjTGVmdCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMFtdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFswKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDFbXX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwyW119LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsM1tdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFszKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDRbXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWw1W119LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsNltdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs2KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDdbXX0sW3BUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIERDQ2hyb21hOHg4UGxhbmVTdG9yZQorICAgICAgICAKKyAgICAgICAgCitPTVhfVkNfQ0hST01BX1BMQU5FCisgICAgICAgIEFERCAgICAgcFRtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBWTEQxICAgIGRBYm92ZVZhbCxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVt4XSAgICAgIDowPD0geCA8PSA3ICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlTGVmdFZhbFswXSxbcFNyY0Fib3ZlTGVmdF0KKyAgICAgICAgCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzBdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMV19LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFsyXX0sW3BTcmNMZWZ0XSxzdGVwICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzIqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzNdfSxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbNF19LFtwU3JjTGVmdF0sc3RlcCAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs0KmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFs1XX0sW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzUqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzZdfSxbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbN119LFtwVG1wXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs3KmxlZnRTdGVwXSAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWUkVWNjQgIGRSZXZBYm92ZVZhbCxkQWJvdmVWYWwgICAgICAgICAgICAgICAgICAgICAgOy8vIFJldmVyc2Ugb3JkZXIgb2YgYnl0ZXMgPSBwU3JjQWJvdmVbMDoxOjI6Mzo0OjU6Njo3XQorICAgICAgICBWU1VCTCAgIHFBYm92ZTdtaW51czAsZFJldkFib3ZlVmFsLGRBYm92ZUxlZnRWYWwgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjQWJvdmVbN10gLSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIFZTSFIgICAgZFJldkFib3ZlVmFsVTY0LGRSZXZBYm92ZVZhbFU2NCwjOCAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW1g6MDoxOjI6Mzo0OjU6Nl0KKyAgICAgICAgVlNVQkwgICBxQWJvdmVEaWZmLGRSZXZBYm92ZVZhbCxkQWJvdmVWYWwgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNl0gLSBwU3JjQWJvdmVbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNV0gLSBwU3JjQWJvdmVbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbNF0gLSBwU3JjQWJvdmVbMl0KKyAgICAgICAgCisgICAgICAgIFZSRVY2NCAgZFJldkxlZnRWYWwsZExlZnRWYWwgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gUmV2ZXJzZSBvcmRlciBvZiBieXRlcyA9IHBTcmNMZWZ0WzA6MToyOjM6NDo1OjY6N10KKyAgICAgICAgVlNVQkwgICBxTGVmdDdtaW51czAsZFJldkxlZnRWYWwsZEFib3ZlTGVmdFZhbCAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0xlZnRbN10gLSBwU3JjQWJvdmVMZWZ0WzBdCisgICAgICAgIFZTSFIgICAgZFJldkxlZnRWYWxVNjQsZFJldkxlZnRWYWxVNjQsIzggICAgICAgICAgICA7Ly8gcFNyY0xlZnRbWDowOjE6MjozOjQ6NTo2XQorICAgICAgICBWU1VCTCAgIHFMZWZ0RGlmZixkUmV2TGVmdFZhbCxkTGVmdFZhbCAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzZdIC0gcFNyY0xlZnRbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFs1XSAtIHBTcmNMZWZ0WzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbNF0gLSBwU3JjTGVmdFsyXQorICAgICAgICAKKyAgICAgICAgTERSICAgICBwTXVsdGlwbGllclRhYmxlLD1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OCAgIDsvLyBVc2VkIHRvIGNhbGN1bGF0ZSBIdmFsICYgVnZhbCAgCisgICAgICAgIFZTSEwgICAgZEFib3ZlRGlmZjBVNjQsZEFib3ZlRGlmZjBVNjQsIzE2ICAKKyAgICAgICAgVkVYVCAgICBkRGlmZkFib3ZlVTgsZEFib3ZlRGlmZjBVOCxkQWJvdmU3bWludXMwVTgsIzIgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbIDctMCB8IDQtMiB8IDUtMSB8IDYtMCBdCisgICAgICAgIFZMRDEgICAgZE11bHRpcGxpZXIsW3BNdWx0aXBsaWVyVGFibGVdISAKKyAgICAgICAgVlNITCAgICBkTGVmdERpZmYwVTY0LGRMZWZ0RGlmZjBVNjQsIzE2ICAKKyAgICAgICAgVkVYVCAgICBkRGlmZkxlZnRVOCxkTGVmdERpZmYwVTgsZExlZnQ3bWludXMwVTgsIzIgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsgNy0wIHwgNC0yIHwgNS0xIHwgNi0wIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTVVMICAgIGRIb3JQcmVkLGREaWZmQWJvdmVTMTYsZE11bHRpcGxpZXIgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsgNCooNy0wKSB8IDEqKDQtMikgfCAyKig1LTEpIHwgMyooNi0wKSBdCisgICAgICAgIFZNVUwgICAgZFZlclByZWQsZERpZmZMZWZ0UzE2LGRNdWx0aXBsaWVyCisgICAgICAgIFZQQUREICAgZEhWVmFsUzE2LGRIb3JQcmVkLGRWZXJQcmVkCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlBBRERMICBkSFZWYWxTMzIsZEhWVmFsUzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVnxIXSBpbiAzMiBiaXRzIGVhY2gKKyAgICAgICAgVlNITCAgICBkSFZUZW1wUzMyLGRIVlZhbFMzMiwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyAxNypIID0gMTYqSCArIEggPSAoSDw8NCkrSAorICAgICAgICBWQUREICAgIGRIVlZhbFMzMixkSFZWYWxTMzIsZEhWVGVtcFMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFsgMTcqViAgfCAxNypIIF1pbiAzMiBiaXRzIGVhY2gKKyAgICAgICAgVkxEMSAgICB7ZE11bHRpcGxpZXIwLGRNdWx0aXBsaWVyMX0sW3BNdWx0aXBsaWVyVGFibGVdICAgICAgICAgIDsvLyBxTXVsdGlwbGllciA9IFsgNHwzfDJ8MXwwfC0xfC0yfC0zIF0gIAorICAgICAgICBWUlNIUiAgIGRIVlZhbFMzMixkSFZWYWxTMzIsIzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtjfGJdIGluIDE2Yml0cyBlYWNoCisgICAgICAgIFZBRERMICAgcUEsZEFib3ZlVmFsLGRMZWZ0VmFsCisgICAgICAgIFZEVVAgICAgcUEscUFbN10KKyAgICAgICAgVlNITCAgICBxQSxxQSwjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbYXxhfGF8YXxhfGF8YXxhXQorICAgICAgICBWRFVQICAgIHFCLGRIVlZhbFMxNlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFtifGJ8YnxifGJ8YnxifGJdCisgICAgICAgIFZEVVAgICAgcUMsZEhWVmFsUzE2WzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW2N8Y3xjfGN8Y3xjfGN8Y10KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWTVVMICAgIHFCLHFCLHFNdWx0aXBsaWVyCisgICAgICAgIFZNVUwgICAgcUMscUMscU11bHRpcGxpZXIKKyAgICAgICAgVkFERCAgICBxQixxQixxQSAKKyAgICAgICAgCisgICAgICAgIFZEVVAgICAgcUMwLHFDWzBdCisgICAgICAgIFZEVVAgICAgcUMxLHFDWzFdCisgICAgICAgIFZEVVAgICAgcUMyLHFDWzJdCisgICAgICAgIFZEVVAgICAgcUMzLHFDWzNdCisgICAgICAgIFZEVVAgICAgcUM0LHFDWzRdCisgICAgICAgIFZEVVAgICAgcUM1LHFDWzVdCisgICAgICAgIFZEVVAgICAgcUM2LHFDWzZdCisgICAgICAgIFZEVVAgICAgcUM3LHFDWzddCisgICAgICAgIAorICAgICAgICBWQUREICAgIHFTdW0wLHFCLHFDMAorICAgICAgICBWQUREICAgIHFTdW0xLHFCLHFDMQorICAgICAgICBWQUREICAgIHFTdW0yLHFCLHFDMgorICAgICAgICBWQUREICAgIHFTdW0zLHFCLHFDMworICAgICAgICBWQUREICAgIHFTdW00LHFCLHFDNAorICAgICAgICBWQUREICAgIHFTdW01LHFCLHFDNQorICAgICAgICBWQUREICAgIHFTdW02LHFCLHFDNgorICAgICAgICBWQUREICAgIHFTdW03LHFCLHFDNworICAgICAgICAKKyAgICAgICAgVlFSU0hSVU4gZFN1bTAscVN1bTAsIzUgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIChPTVhfVTgpYXJtQ2xpcCgwLDI1NSwoU3VtKzE2KT4+NSkKKyAgICAgICAgVlFSU0hSVU4gZFN1bTEscVN1bTEsIzUKKyAgICAgICAgVlFSU0hSVU4gZFN1bTIscVN1bTIsIzUKKyAgICAgICAgVlFSU0hSVU4gZFN1bTMscVN1bTMsIzUKKyAgICAgICAgVlFSU0hSVU4gZFN1bTQscVN1bTQsIzUKKyAgICAgICAgVlFSU0hSVU4gZFN1bTUscVN1bTUsIzUKKyAgICAgICAgVlFSU0hSVU4gZFN1bTYscVN1bTYsIzUKKyAgICAgICAgVlFSU0hSVU4gZFN1bTcscVN1bTcsIzUgICAgICAKKworRENDaHJvbWE4eDhQbGFuZVN0b3JlICAgICAgICAKKyAgICAgICAgQUREICAgICBwVG1wLCBwRHN0LCBkc3RTdGVwCisgICAgICAgIEFERCAgICAgc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkU3VtMCxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTEsW3BUbXBdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzEqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW0yLFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFsyKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtMyxbcFRtcF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTQsW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzQqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRTdW01LFtwVG1wXSxzdGVwICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFs1KmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkU3VtNixbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbNipkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZFN1bTcsW3BUbXBdICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzcqZHN0U3RlcCt4XSA6MDw9IHggPD0gNyAgICAgICAKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgICAgIAorICAgICAgICBFTkQKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4IGVuZHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5YzBlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MucwpAQCAtMCwwICsxLDQyNCBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5zCis7Ly8gT3Blbk1BWCBETDogdjEuMC4yCis7Ly8gUmV2aXNpb246ICAgMTIyOTAKKzsvLyBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsvLyAKKzsvLyAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsvLyAKKzsvLyAKKzsvLworCisgICAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICAgIElOQ0xVREUgYXJtQ09NTV9zLmgKKyAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgCisgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE1fVEFCTEUgYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2CisgICAgRENEICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUiAKKyAgICBEQ0QgIE9NWF9WQ18xNlgxNl9EQywgICBPTVhfVkNfMTZYMTZfUExBTkUKKyAgICAKKworICAgIElGIENvcnRleEE4CisKKyAgICBNX1RBQkxFIGFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYsMQorICAgIERDVyAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICA4IAorICAgIERDVyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3CisgICAgRENXICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIENvbnN0YW50cyAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKK0JMS19TSVpFICAgICAgICBFUVUgMHgxMAorTVVMX0NPTlNUMCAgICAgIEVRVSAweDAxMDEwMTAxCitNVUxfQ09OU1QxICAgICAgRVFVIDB4MDAwNjAwMDQKK01VTF9DT05TVDIgICAgICBFUVUgMHgwMDA3MDAwNQorTVVMX0NPTlNUMyAgICAgIEVRVSAweDAwMDMwMDAxCitNQVNLX0NPTlNUICAgICAgRVFVIDB4MDBGRjAwRkYKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoreSAgICAgICAgICAgICAgIFJOIDEyICAgCitwYyAgICAgICAgICAgICAgUk4gMTUgICAKKworcmV0dXJuICAgICAgICAgIFJOIDAgICAgCitwVGFibGUgICAgICAgICAgUk4gOSAgICAKK2NvdW50ICAgICAgICAgICBSTiAxMSAgIAorcE11bHRUYWJsZSAgICAgIFJOIDkKKzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBOZW9uIHJlZ2lzdGVycworOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitxQWJvdmUgICAgICAgICAgUU4gUTAuVTgKK3FMZWZ0ICAgICAgICAgICBRTiBRMS5VOAorcVN1bTggICAgICAgICAgIFFOIFEwLlUxNgorZFN1bTgwICAgICAgICAgIEROIEQwLlUxNgorZFN1bTgxICAgICAgICAgIEROIEQxLlUxNgorZFN1bTQgICAgICAgICAgIEROIEQwLlUxNgorZFN1bTIgICAgICAgICAgIEROIEQwLlUzMgorZFN1bTEgICAgICAgICAgIEROIEQwLlU2NAorcU91dCAgICAgICAgICAgIFFOIFEzLlU4CitkU3VtTGVmdCAgICAgICAgRE4gRDYuVTY0CitkU3VtQWJvdmUgICAgICAgRE4gRDcuVTY0CitkU3VtICAgICAgICAgICAgRE4gRDguVTY0CitkU3VtMCAgICAgICAgICAgRE4gRDguVThbMF0KKworcUggICAgICAgICAgICAgIFFOIFExMS5TMzIKK3FWICAgICAgICAgICAgICBRTiBRMTIuUzMyCitxQSAgICAgICAgICAgICAgUU4gUTExLlMxNgorcUIgICAgICAgICAgICAgIFFOIFE2LlMxNgorcUMgICAgICAgICAgICAgIFFOIFE3LlMxNgorCitxQjAgICAgICAgICAgICAgUU4gUTUuUzE2CitxQjEgICAgICAgICAgICAgUU4gUTYuUzE2CitkQTEgICAgICAgICAgICAgRE4gRDIzLlMxNgorCitkSDAgICAgICAgICAgICAgRE4gRDIyLlMzMgorZEgxICAgICAgICAgICAgIEROIEQyMy5TMzIKK2RWMCAgICAgICAgICAgICBETiBEMjQuUzMyCitkVjEgICAgICAgICAgICAgRE4gRDI1LlMzMgorCitxSFYgICAgICAgICAgICAgUU4gUTExLlM2NAorcUhWMCAgICAgICAgICAgIFFOIFExMS5TMzIKK3FIVjEgICAgICAgICAgICBRTiBRMTIuUzY0CisKK2RIVjAwICAgICAgICAgICBETiBEMjIuUzMyCitkSFYwMSAgICAgICAgICAgRE4gRDIzLlMzMgorCitkSFYwICAgICAgICAgICAgRE4gRDIyLlMxNlswXQorZEhWMSAgICAgICAgICAgIEROIEQyMy5TMTZbMF0KK2RIVjEwICAgICAgICAgICBETiBEMjQuUzY0CitkSFYxMSAgICAgICAgICAgRE4gRDI1LlM2NAorCitxU3VtMCAgICAgICAgICAgUU4gUTAuUzE2CitxU3VtMSAgICAgICAgICAgUU4gUTEuUzE2CisKK2RPdXQwICAgICAgICAgICBETiBENi5VOAorZE91dDEgICAgICAgICAgIEROIEQ3LlU4CisKK2RMZWZ0MCAgICAgICAgICBETiBEMi5VOAorZExlZnQxICAgICAgICAgIEROIEQzLlU4CitxQ29uc3QgICAgICAgICAgUU4gUTEzLlMxNgorCitkQWJvdmUwICAgICAgICAgRE4gRDAuVTgKK2RBYm92ZTEgICAgICAgICBETiBEMS5VOAorCitkUmV2TGVmdDY0ICAgICAgRE4gRDEyLlU2NAorZFJldkxlZnQgICAgICAgIEROIEQxMi5VOAorZFJldkFib3ZlNjQgICAgIEROIEQ1LlU2NAorZFJldkFib3ZlICAgICAgIEROIEQ1LlU4CitxTGVmdERpZmYgICAgICAgUU4gUTguUzE2CitkTGVmdERpZmYxICAgICAgRE4gRDE3LlMxNgorZExlZnREaWZmNjQgICAgIEROIEQxNy5TNjQKK3FEaWZmTGVmdCAgICAgICBRTiBROC5TMTYKK3FEaWZmQWJvdmUgICAgICBRTiBRNC5TMTYKK2RBYm92ZURpZmYxICAgICBETiBEOS5TMTYKK2RBYm92ZURpZmY2NCAgICBETiBEOS5TNjQKK3FBYm92ZURpZmYgICAgICBRTiBRNC5TMTYKKworZEFib3ZlTGVmdCAgICAgIEROIEQ0LlU4CisKK2REaWZmTGVmdDAgICAgICBETiBEMTYuUzE2CitkRGlmZkxlZnQxICAgICAgRE4gRDE3LlMxNgorZERpZmZBYm92ZTAgICAgIEROIEQ4LlMxNgorZERpZmZBYm92ZTEgICAgIEROIEQ5LlMxNgorCitxTGVmdDE1bWludXMwICAgUU4gUTcuUzE2CitkTGVmdDE1bWludXMwICAgRE4gRDE0LlMxNgorcUFib3ZlMTVtaW51czAgIFFOIFEzLlMxNgorZEFib3ZlMTVtaW51czAgIEROIEQ2LlMxNgorCitxTXVsdGlwbGllciAgICAgUU4gUTEwLlMxNgorcU11bHRpcGxpZXIwICAgIFFOIFExMC5TMTYKK3FNdWx0aXBsaWVyMSAgICBRTiBRMTIuUzE2CitkTXVsdGlwbGllcjAgICAgRE4gRDIwLlMxNgorZE11bHRpcGxpZXIxICAgIEROIEQyMS5TMTYKKworZEJQbHVzQ011bHQ3ICAgIEROIEQxLlM2NAorZEJQbHVzQ011bHQ3UzE2IEROIEQxLlMxNgorCitxVG1wICAgICAgICAgICAgUU4gUTAuVTgKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCisKK3BUbXAgICAgICAgICAgICBSTiA4CitzdGVwICAgICAgICAgICAgUk4gMTAKK3BUbXAyICAgICAgICAgICBSTiAxMQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2IHN0YXJ0cworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNiwgcjExLCBkMTUKKyAgICAgICAgCisgICAgICAgIDsvLyBEZWZpbmUgc3RhY2sgYXJndW1lbnRzCisgICAgICAgIE1fQVJHICAgIExlZnRTdGVwLCAgICAgNAorICAgICAgICBNX0FSRyAgICBEc3RTdGVwLCAgICAgIDQKKyAgICAgICAgTV9BUkcgICAgUHJlZE1vZGUsICAgICA0CisgICAgICAgIE1fQVJHICAgIEF2YWlsYWJpbGl0eSwgNAorICAgICAgICAKKyAgICAgICAgOy8vIE1fU1RBTEwgQVJNMTEzNkpTPTQKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2IDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFIgICAgcHJlZE1vZGUsIFByZWRNb2RlICAgICAgICAgICAgICAgICAgOy8vIEFyZyBwcmVkTW9kZSBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIE1fTERSICAgIGxlZnRTdGVwLCBMZWZ0U3RlcCAgICAgICAgICAgICAgICAgIDsvLyBBcmcgbGVmdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnIAorICAgICAgICBNX0xEUiAgICBkc3RTdGVwLCAgRHN0U3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gQXJnIGRzdFN0ZXAgbG9hZGVkIGZyb20gc3RhY2sgdG8gcmVnICAgICAgICAgCisgICAgICAgIE1fTERSICAgIGF2YWlsYWJpbGl0eSwgQXZhaWxhYmlsaXR5ICAgICAgICAgIDsvLyBBcmcgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZworICAgICAgICAKKyAgICAgICAgTU9WICAgICAgeSwgI0JMS19TSVpFICAgICAgICAgICAgICAgICAgICAgICAgOy8vIE91dGVyIExvb3AgQ291bnQKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisgICAgICAgIAorT01YX1ZDXzE2WDE2X1ZFUlQKKyAgICAgICAgVkxEMSAgICBxQWJvdmUsICBbcFNyY0Fib3ZlXQorICAgICAgICBBREQgICAgIHBUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BUbXBdLCBzdGVwCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcERzdF0sIHN0ZXAKKyAgICAgICAgVlNUMSAgICBxQWJvdmUsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFBYm92ZSwgW3BEc3RdCisgICAgICAgIFZTVDEgICAgcUFib3ZlLCBbcFRtcF0KKyAgICAgICAgTU9WICAgICByZXR1cm4sICNPTVhfU3RzX05vRXJyICAgICAgICAgICAgICAgOy8vIHJldHVybk5vRXJyb3IKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorT01YX1ZDXzE2WDE2X0hPUgorICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIGxlZnRTdGVwLCBsZWZ0U3RlcCwgbGVmdFN0ZXAKKyAgICAgICAgQUREICAgICBwVG1wMiwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdFN0ZXAsIGRzdFN0ZXAsIGRzdFN0ZXAKK0xvb3BIb3IgCisgICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBTVUJTICAgICB5LCB5LCAjOAorICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKKyAgICAgICAgVkxEMSAgICAge3FMZWZ0W119LCBbcFNyY0xlZnRdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVkxEMSAgICAge3FUbXBbXX0sIFtwVG1wXSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZTVDEgICAgIHFMZWZ0LCBbcERzdF0sIGRzdFN0ZXAKKyAgICAgICAgVlNUMSAgICAgcVRtcCwgW3BUbXAyXSwgZHN0U3RlcAorICAgICAgICBWTEQxICAgICB7cUxlZnRbXX0sIFtwU3JjTGVmdF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWTEQxICAgICB7cVRtcFtdfSwgW3BUbXBdLCBsZWZ0U3RlcCAgICAgICAKKyAgICAgICAgVlNUMSAgICAgcUxlZnQsIFtwRHN0XSwgZHN0U3RlcAorICAgICAgICBWU1QxICAgICBxVG1wLCBbcFRtcDJdLCBkc3RTdGVwCisgICAgICAgIFZMRDEgICAgIHtxTGVmdFtdfSwgW3BTcmNMZWZ0XSwgbGVmdFN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAgIHtxVG1wW119LCBbcFRtcF0sIGxlZnRTdGVwICAgICAgIAorICAgICAgICBWU1QxICAgICBxTGVmdCwgW3BEc3RdLCBkc3RTdGVwCisgICAgICAgIFZTVDEgICAgIHFUbXAsIFtwVG1wMl0sIGRzdFN0ZXAKKyAgICAgICAgCisgICAgICAgIEJORSAgICAgIExvb3BIb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvb3AgZm9yIDE2IHRpbWVzCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisgICAgICAgIAorT01YX1ZDXzE2WDE2X0RDCisgICAgICAgIE1PViAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBjb3VudCA9IDAKKyAgICAgICAgVFNUICAgICAgYXZhaWxhYmlsaXR5LCAjT01YX1ZDX0xFRlQKKyAgICAgICAgQkVRICAgICAgVXBwZXJPck5vbmVBdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIEp1bXAgdG8gVXBwZXIgaWYgbm90IGxlZnQKKworICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzBdfSwgW3BTcmNMZWZ0XSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxXX0sIFtwVG1wXSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzJdfSwgW3BTcmNMZWZ0XSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzNdfSwgW3BUbXBdLHN0ZXAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNF19LCBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbNV19LCBbcFRtcF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs2XX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbN119LCBbcFRtcF0sc3RlcAorICAgICAgICBWTEQxICAgIHtxTGVmdFs4XX0sIFtwU3JjTGVmdF0sc3RlcCAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbOV19LCBbcFRtcF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMF19LFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMV19LFtwVG1wXSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxMl19LFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxM119LFtwVG1wXSxzdGVwICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzE0XX0sW3BTcmNMZWZ0XSxzdGVwICAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxNV19LFtwVG1wXSAKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIHFTdW04LCBxTGVmdAorICAgICAgICBBREQgICAgIGNvdW50LCBjb3VudCwgIzEgICAgCisgICAgICAgIFZQQUREICAgIGRTdW00LCBkU3VtODAsIGRTdW04MQorICAgICAgICBWUEFEREwgICBkU3VtMiwgZFN1bTQKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnQsIGRTdW0yCisgICAgICAgIFZSU0hSICAgIGRTdW0sIGRTdW1MZWZ0LCAjNAorICAgICAgICAKK1VwcGVyT3JOb25lQXZhaWxhYmxlCisgICAgICAgIFRTVCAgICAgIGF2YWlsYWJpbGl0eSwgICNPTVhfVkNfVVBQRVIgICAgICAgICAgICAgIDsvLyBpZihhdmFpbGFiaWxpdHkgJiAjT01YX1ZDX1VQUEVSKQorICAgICAgICBCRVEgICAgICBCb3RoT3JOb25lQXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgICA7Ly8gSnVtcCB0byBMZWZ0IGlmIG5vdCB1cHBlcgorICAgICAgICBWTEQxICAgICBxQWJvdmUsIFtwU3JjQWJvdmVdCisgICAgICAgIEFERCAgICAgIGNvdW50LCBjb3VudCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBpZiB1cHBlciBpbmMgY291bnQgYnkgMQorICAgICAgICBWUEFEREwgICBxU3VtOCwgcUFib3ZlCisgICAgICAgIFZQQUREICAgIGRTdW00LCBkU3VtODAsIGRTdW04MQorICAgICAgICBWUEFEREwgICBkU3VtMiwgZFN1bTQKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlLCBkU3VtMgorICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtQWJvdmUsICM0CisgICAgICAgIAorQm90aE9yTm9uZUF2YWlsYWJsZQorICAgICAgICBDTVAgICAgICBjb3VudCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGNoZWNrIGlmIGJvdGggYXZhaWxhYmxlCisgICAgICAgIEJORSAgICAgIE5vbmVBdmFpbGFibGUKKyAgICAgICAgVkFERCAgICAgZFN1bSwgZFN1bUFib3ZlLCBkU3VtTGVmdAorICAgICAgICBWUlNIUiAgICBkU3VtLCBkU3VtLCAjNQorICAgICAgICAKKworTm9uZUF2YWlsYWJsZQorICAgICAgICBWRFVQICAgICBxT3V0LCBkU3VtMCAgICAgICAgCisgICAgICAgIENNUCAgICAgIGNvdW50LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgaWYgbm9uZSBhdmFpbGFibGUKKyAgICAgICAgQUREICAgICAgcFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgICBzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIEJORSAgICAgIExvb3BEQworICAgICAgICBWTU9WICAgICBxT3V0LCAjMTI4CitMb29wREMgICAgICAgIAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwRHN0XSwgc3RlcAorICAgICAgICBWU1QxICAgIHFPdXQsIFtwVG1wXSwgc3RlcAorICAgICAgICBNT1YgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FWElUCisKK09NWF9WQ18xNlgxNl9QTEFORQorICAgICAgICBMRFIgICAgIHBNdWx0VGFibGUsID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2CisgICAgICAgIFZMRDEgICAgcUFib3ZlLCBbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlW3hdICAgICAgOjA8PSB4IDw9IDcgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlTGVmdFswXSxbcFNyY0Fib3ZlTGVmdF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgIHBUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHN0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorICAgICAgICBWTEQxICAgIHtxTGVmdFswXX0sICBbcFNyY0xlZnRdLHN0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMV19LCAgW3BUbXBdLHN0ZXAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMl19LCAgW3BTcmNMZWZ0XSxzdGVwICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbM119LCAgW3BUbXBdLHN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzRdfSwgIFtwU3JjTGVmdF0sc3RlcCAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzVdfSwgIFtwVG1wXSxzdGVwICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzZdfSwgIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFs3XX0sICBbcFRtcF0sc3RlcAorICAgICAgICBWTEQxICAgIHtxTGVmdFs4XX0sICBbcFNyY0xlZnRdLHN0ZXAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbOV19LCAgW3BUbXBdLHN0ZXAgICAgICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTBdfSwgW3BTcmNMZWZ0XSxzdGVwICAKKyAgICAgICAgVkxEMSAgICB7cUxlZnRbMTFdfSwgW3BUbXBdLHN0ZXAgICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEyXX0sIFtwU3JjTGVmdF0sc3RlcCAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzEzXX0sIFtwVG1wXSxzdGVwICAgICAgCisgICAgICAgIFZMRDEgICAge3FMZWZ0WzE0XX0sIFtwU3JjTGVmdF0sc3RlcCAgIAorICAgICAgICBWTEQxICAgIHtxTGVmdFsxNV19LCBbcFRtcF0gICAKKworICAgICAgICBWUkVWNjQgIGRSZXZBYm92ZSwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNBYm92ZVsxNToxNDoxMzoxMjoxMToxMDo5OjhdIAorICAgICAgICBWU1VCTCAgIHFBYm92ZTE1bWludXMwLCBkUmV2QWJvdmUsIGRBYm92ZUxlZnQgICAgICAgOy8vIHFBYm92ZTdtaW51czBbMF0gPSBwU3JjQWJvdmVbMTVdIC0gcFNyY0Fib3ZlTGVmdFswXSAKKyAgICAgICAgVlNIUiAgICBkUmV2QWJvdmU2NCwgZFJldkFib3ZlNjQsICM4ICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMTQ6MTM6MTI6MTE6MTA6OTo4OlhdIAorICAgICAgICBWU1VCTCAgIHFBYm92ZURpZmYsIGRSZXZBYm92ZSwgZEFib3ZlMCAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU0hMICAgIGRBYm92ZURpZmY2NCwgZEFib3ZlRGlmZjY0LCAjMTYgCisgICAgICAgIFZFWFQgICAgZERpZmZBYm92ZTEsIGRBYm92ZURpZmYxLCBkQWJvdmUxNW1pbnVzMCwgIzEgIAorCisgICAgICAgIFZSRVY2NCAgZFJldkxlZnQsZExlZnQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMTU6MTQ6MTM6MTI6MTE6MTA6OTo4XSAKKyAgICAgICAgVlNVQkwgICBxTGVmdDE1bWludXMwLGRSZXZMZWZ0LCBkQWJvdmVMZWZ0ICAgICAgICAgIDsvLyBxQWJvdmU3bWludXMwWzBdID0gcFNyY0xlZnRbN10gLSBwU3JjQWJvdmVMZWZ0WzBdIAorICAgICAgICBWU0hSICAgIGRSZXZMZWZ0NjQsIGRSZXZMZWZ0NjQsICM4ICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzE0OjEzOjEyOjExOjEwOjk6ODpYXSAKKyAgICAgICAgVlNVQkwgICBxTGVmdERpZmYsZFJldkxlZnQsIGRMZWZ0MCAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIE11bHRpcGxpZXIgPSBbOHwxfDJ8Li4ufDZ8N10KKyAgICAgICAgVkxEMSAgICBxTXVsdGlwbGllciwgW3BNdWx0VGFibGVdISAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNITCAgICBkTGVmdERpZmY2NCwgZExlZnREaWZmNjQsICMxNgorICAgICAgICBWRVhUICAgIGREaWZmTGVmdDEsIGRMZWZ0RGlmZjEsIGRMZWZ0MTVtaW51czAsICMxICAgICAKKyAgICAgICAgCisgICAgICAgIFZNVUxMICAgcUgsZERpZmZBYm92ZTAsIGRNdWx0aXBsaWVyMCAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1VTEwgICBxVixkRGlmZkxlZnQwLCAgZE11bHRpcGxpZXIwICAgICAgICAgICAgICAgIAorICAgICAgICBWTUxBTCAgIHFILGREaWZmQWJvdmUxLCBkTXVsdGlwbGllcjEgCisgICAgICAgIFZNTEFMICAgcVYsZERpZmZMZWZ0MSwgIGRNdWx0aXBsaWVyMQorICAgICAgICAKKyAgICAgICAgVlBBREQgICBkSFYwMCxkSDEsZEgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZQQUREICAgZEhWMDEsZFYxLGRWMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWUEFEREwgIHFIViwgcUhWMAorICAgICAgICBWU0hMICAgIHFIVjEscUhWLCMyCisgICAgICAgIFZBREQgICAgcUhWLHFIVixxSFYxIAorICAgICAgICAKKyAgICAgICAgOy8vIEhWID0gW2MgPSAoKDUqViszMik+PjYpIHwgYiA9ICgoNSpIKzMyKT4+NildCisgICAgICAgIFZSU0hSICAgcUhWLHFIViwjNgorICAgICAgICAKKyAgICAgICAgOy8vIEhWMSA9IFtjKjd8Yio3XQorICAgICAgICBWU0hMICAgIHFIVjEscUhWLCMzCisgICAgICAgIFZTVUIgICAgcUhWMSxxSFYxLHFIViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTXVsdGlwbGllcjEgPSBbMHwxfDJ8Li4ufDddCisgICAgICAgIFZMRDEgICAgcU11bHRpcGxpZXIwLCBbcE11bHRUYWJsZV0hICAgIAorICAgICAgICBWRFVQICAgIHFCLCBkSFYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWRFVQICAgIHFDLCBkSFYxIAorICAgICAgICAKKyAgICAgICAgVkFEREwgICBxQSxkQWJvdmUxLGRMZWZ0MQorICAgICAgICBWU0hMICAgIHFBLHFBLCAjNAorICAgICAgICBWRFVQICAgIHFBLGRBMVszXSAgCisgICAgICAgIFZBREQgICAgZEJQbHVzQ011bHQ3LCBkSFYxMCwgZEhWMTEKKyAgICAgICAgCisgICAgICAgIDsvLyBNdWx0aXBsaWVyMSA9IFs4fDl8MTB8Li4ufDE1XQorICAgICAgICBWTEQxICAgIHFNdWx0aXBsaWVyMSwgW3BNdWx0VGFibGVdCisgICAgICAgIDsvLyBDb25zdCA9IGEgLSA3KihiK2MpCisgICAgICAgIFZEVVAgICAgcUNvbnN0LCBkQlBsdXNDTXVsdDdTMTZbMF0KKyAgICAgICAgVlNVQiAgICBxQ29uc3QsIHFBLCBxQ29uc3QKKyAgICAgICAgCisgICAgICAgIDsvLyBCMCA9IFswKmJ8MSpifDIqYnwzKmJ8Li4uLi4ufDcqYl0KKyAgICAgICAgVk1VTCAgICBxQjAscUIscU11bHRpcGxpZXIwCisgICAgICAgIAorICAgICAgICA7Ly8gQjAgPSBbOCpifDkqYnwxMCpifDExKmJ8Li4uLnwxNSpiXQorICAgICAgICBWTVVMICAgIHFCMSxxQixxTXVsdGlwbGllcjEKKyAgICAgICAgCisgICAgICAgIFZBREQgICAgcVN1bTAsIHFCMCwgcUNvbnN0CisgICAgICAgIFZBREQgICAgcVN1bTEsIHFCMSwgcUNvbnN0ICAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb29wcyBmb3IgMTYgdGltZXMKK0xvb3BQbGFuZSAgICAgICAKKyAgICAgICAgOy8vIChiKnggKyBjKnkgKyBDKT4+NQorICAgICAgICBWUVJTSFJVTiBkT3V0MCwgcVN1bTAsIzUKKyAgICAgICAgVlFSU0hSVU4gZE91dDEsIHFTdW0xLCM1ICAgICAgCisgICAgICAgIFNVQlMgICAgIHksIHksICMxCisgICAgICAgIFZTVDEgICAgIHFPdXQsW3BEc3RdLGRzdFN0ZXAKKyAgICAgICAgVkFERCAgICAgcVN1bTAscVN1bTAscUMgCisgICAgICAgIFZBREQgICAgIHFTdW0xLHFTdW0xLHFDIAorICAgICAgICBCTkUgICAgICBMb29wUGxhbmUKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKworICAgICAgICBNX0VORAorICAgICAgICAKKyAgICAgICAgRU5ESUYgOy8vIENvcnRleEE4CisgICAgICAgICAgICAKKyAgICAgICAgRU5ECis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYgZW5kcworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzllYjhhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucwpAQCAtMCwwICsxLDUzMSBAQAorOy8vCis7Ly8gCis7Ly8gRmlsZSBOYW1lOiAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0X3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBEZWZpbmUgdGhlIHByb2Nlc3NvciB2YXJpYW50cyBzdXBwb3J0ZWQgYnkgdGhpcyBmaWxlCisgICAgICAgICAKKyAgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAgICAgCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHN3aXRjaCBjYXNlIG9mIEMgaW4gYXNtIGJ5Cis7Ly8gdGhlIG1laHRvZCBvZiB0d28gbGV2ZWxzIG9mIGluZGV4aW5nLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTV9UQUJMRSBhcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAorICAgIERDRCAgT01YX1ZDXzR4NF9WRVJULCAgICAgT01YX1ZDXzR4NF9IT1IgCisgICAgRENEICBPTVhfVkNfNHg0X0RDLCAgICAgICBPTVhfVkNfNHg0X0RJQUdfREwKKyAgICBEQ0QgIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKKyAgICBEQ0QgIE9NWF9WQ180eDRfSEQsICAgICAgIE9NWF9WQ180eDRfVkwKKyAgICBEQ0QgIE9NWF9WQ180eDRfSFUgICAKKyAgICAKKyAgICAgICAgCisgICAgICAgIElGIENvcnRleEE4CisgICAgICAgIAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBTY3JhdGNoIHZhcmlhYmxlCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcmV0dXJuICAgICAgICAgIFJOIDAKK3BUYWJsZSAgICAgICAgICBSTiA4CitwYyAgICAgICAgICAgICAgUk4gMTUKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBEZWNsYXJlIGlucHV0IHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BTcmNMZWZ0ICAgICAgICBSTiAwICAgIDsvLyBpbnB1dCBwb2ludGVyCitwU3JjQWJvdmUgICAgICAgUk4gMSAgICA7Ly8gaW5wdXQgcG9pbnRlcgorcFNyY0Fib3ZlTGVmdCAgIFJOIDIgICAgOy8vIGlucHV0IHBvaW50ZXIKK3BEc3QgICAgICAgICAgICBSTiAzICAgIDsvLyBvdXRwdXQgcG9pbnRlcgorbGVmdFN0ZXAgICAgICAgIFJOIDQgICAgOy8vIGlucHV0IHZhcmlhYmxlCitkc3RTdGVwICAgICAgICAgUk4gNSAgICA7Ly8gaW5wdXQgdmFyaWFibGUKK3ByZWRNb2RlICAgICAgICBSTiA2ICAgIDsvLyBpbnB1dCB2YXJpYWJsZQorYXZhaWxhYmlsaXR5ICAgIFJOIDcgICAgOy8vIGlucHV0IHZhcmlhYmxlCitwRHN0MSAgICAgICAgICAgUk4gMSAKK3BEc3QyICAgICAgICAgICBSTiA0IAorcERzdDMgICAgICAgICAgIFJOIDYgCisKK3BTcmNUbXAgICAgICAgICBSTiA5CitzcmNTdGVwICAgICAgICAgUk4gMTAKK3BEc3RUbXAgICAgICAgICBSTiAxMQorZHN0ZXAgICAgICAgICAgIFJOIDEyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBOZW9uIHJlZ2lzdGVycworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLQorCis7Ly8gT01YX1ZDX0NIUk9NQV9WRVJUCitkQWJvdmVVMzIgICAgICAgRE4gIEQwLlUzMgorCis7Ly8gT01YX1ZDX0NIUk9NQV9IT1IKK2RMZWZ0VmFsMCAgICAgICBETiAgRDAuOAorZExlZnRWYWwxICAgICAgIEROICBEMS44CitkTGVmdFZhbDIgICAgICAgRE4gIEQyLjgKK2RMZWZ0VmFsMyAgICAgICBETiAgRDMuOAorZExlZnRWYWwwVTMyICAgIEROICBEMC5VMzIKK2RMZWZ0VmFsMVUzMiAgICBETiAgRDEuVTMyCitkTGVmdFZhbDJVMzIgICAgRE4gIEQyLlUzMgorZExlZnRWYWwzVTMyICAgIEROICBEMy5VMzIKKworOy8vIE9NWF9WQ180eDRfREMKK2RMZWZ0VmFsICAgICAgICBETiAgRDAuVTgKK2RMZWZ0VmFsVTMyICAgICBETiAgRDAuVTMyCitkU3VtQWJvdmVMZWZ0VTE2ICBETiAgRDEuVTE2CitkU3VtQWJvdmVMZWZ0VTMyICBETiAgRDEuVTMyCitkU3VtQWJvdmVMZWZ0VTY0ICBETiAgRDEuVTY0CitkU3VtQWJvdmVMZWZ0VTggRE4gIEQxLlU4CitkU3VtICAgICAgICAgICAgRE4gIEQwLlU4CisKK2RTdW1MZWZ0VmFsVTE2ICBETiAgRDEuVTE2CitkU3VtTGVmdFZhbFUzMiAgRE4gIEQxLlUzMgorZFN1bUxlZnRWYWxVNjQgIEROICBEMS5VNjQKK2RTdW1MZWZ0VmFsVTggICBETiAgRDEuVTgKKworZEFib3ZlVmFsICAgICAgIEROICBEMC5VOAorZFN1bUFib3ZlVmFsVTE2ICBETiAgRDEuVTE2CitkU3VtQWJvdmVWYWxVMzIgIEROICBEMS5VMzIKK2RTdW1BYm92ZVZhbFU2NCAgRE4gIEQxLlU2NAorZFN1bUFib3ZlVmFsVTggICBETiAgRDEuVTgKK2RDb25zdDEyOFU4ICAgICBETiAgRDAuVTgKKworCis7Ly9PTVhfVkNfNHg0X0RJQUdfREwKKworZEFib3ZlICAgICAgICAgIEROICBEMC5VOAorZFU3ICAgICAgICAgICAgIEROICBEMi5VOAorZFUzICAgICAgICAgICAgIEROICBEMi5VOAorZEFib3ZlMCAgICAgICAgIEROICBEMy5VOAorZEFib3ZlMSAgICAgICAgIEROICBENC5VOAorZEFib3ZlMiAgICAgICAgIEROICBENS5VOAorZFRtcCAgICAgICAgICAgIEROICBENi5VOAorZFRtcDAgICAgICAgICAgIEROICBENy5VOAorZFRtcDEgICAgICAgICAgIEROICBEOC5VOAorZFRtcDIgICAgICAgICAgICBETiAgRDkuVTgKK2RUbXAzICAgICAgICAgICAgRE4gIEQxMC5VOAorZFRtcFUzMiAgICAgICAgIEROICBENi5VMzIKKworCis7Ly9PTVhfVkNfNHg0X0RJQUdfRFIKK2RMZWZ0ICAgICAgICAgICBETiAgRDEuVTgKK2RVTCAgICAgICAgICAgICBETiAgRDIuVTgKKworOy8vT01YX1ZDXzR4NF9WUgorZExlZnQwICAgICAgICAgIEROICBEMS5VOAorZExlZnQxICAgICAgICAgIEROICBEMi5VOAorZEV2ZW4wICAgICAgICAgIEROICBEMy5VOAorZEV2ZW4xICAgICAgICAgIEROICBENC5VOAorZEV2ZW4yICAgICAgICAgIEROICBENS5VOAorZE9kZDAgICAgICAgICAgIEROICBENi5VOAorZE9kZDEgICAgICAgICAgIEROICBEMTEuVTgKK2RPZGQyICAgICAgICAgICBETiAgRDEyLlU4CitkVG1wM1UzMiAgICAgICAgRE4gIEQxMC5VMzIgICAgCitkVG1wMlUzMiAgICAgICAgRE4gIEQ5LlUzMgorCisKKzsvL09NWF9WQ180eDRfSEQKK2RUbXAxVTY0ICAgICAgICBETiAgRDguVTY0CitkVG1wMFU2NCAgICAgICAgRE4gIEQ3LlU2NAorZFRtcFU2NCAgICAgICAgIEROICBENi5VNjQKK2RUbXBVMzIgICAgICAgICBETiAgRDYuVTMyCitkVG1wMVUzMiAgICAgICAgRE4gIEQ4LlUzMgorCis7Ly9PTVhfVkNfNHg0X0hVCitkTDMgICAgICAgICAgICAgRE4gIEQyLlU4CitkTGVmdEhVMCAgICAgICAgRE4gIEQzLlU4CitkTGVmdEhVMSAgICAgICAgRE4gIEQ0LlU4CitkTGVmdEhVMiAgICAgICAgRE4gIEQ1LlU4CitkVG1wMFUzMiAgICAgICAgRE4gIEQ3LlUzMgorCisKKworCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NCBzdGFydHMKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0LCByMTIsZDEyCisgICAgICAgIAorICAgICAgICA7Ly8gRGVmaW5lIHN0YWNrIGFyZ3VtZW50cworICAgICAgICBNX0FSRyAgICBMZWZ0U3RlcCwgICAgIDQKKyAgICAgICAgTV9BUkcgICAgRHN0U3RlcCwgICAgICA0CisgICAgICAgIE1fQVJHICAgIFByZWRNb2RlLCAgICAgNAorICAgICAgICBNX0FSRyAgICBBdmFpbGFiaWxpdHksIDQKKyAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIExEUiAgICAgIHBUYWJsZSw9YXJtVkNNNFAxMF9wU3dpdGNoVGFibGU0eDQgIDsvLyBMb2FkIGluZGV4IHRhYmxlIGZvciBzd2l0Y2ggY2FzZQorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgYXJndW1lbnQgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgTV9MRFJEICAgcHJlZE1vZGUsYXZhaWxhYmlsaXR5LFByZWRNb2RlICAgICA7Ly8gQXJnIHByZWRNb2RlICYgYXZhaWxhYmlsaXR5IGxvYWRlZCBmcm9tIHN0YWNrIHRvIHJlZyAKKyAgICAgICAgTV9MRFJEICAgbGVmdFN0ZXAsZHN0U3RlcCxMZWZ0U3RlcCAgICAgICAgICA7Ly8gQXJnIGxlZnRTdGVwICYgZHN0U3RlcCBsb2FkZWQgZnJvbSBzdGFjayB0byByZWcgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgTERSICAgICAgcGMsIFtwVGFibGUsIHByZWRNb2RlLCBMU0wgIzJdICAgICAgOy8vIEJyYW5jaCB0byB0aGUgY2FzZSBiYXNlZCBvbiBwcmVNb2RlCisKKworT01YX1ZDXzR4NF9IT1IKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDBbXX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWwxW119LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsMltdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbDNbXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRMZWZ0VmFsMFUzMlswXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMCpkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIFZTVDEgICAgZExlZnRWYWwxVTMyWzBdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICA7Ly8gcERzdFsxKmRzdFN0ZXAreF0gOjA8PSB4IDw9IDcKKyAgICAgICAgVlNUMSAgICBkTGVmdFZhbDJVMzJbMF0sW3BEc3RdICAgICAgICAgICAgICAgICAgICAgIDsvLyBwRHN0WzIqZHN0U3RlcCt4XSA6MDw9IHggPD0gNworICAgICAgICBWU1QxICAgIGRMZWZ0VmFsM1UzMlswXSxbcERzdFRtcF0gICAgICAgICAgICAgICAgICAgOy8vIHBEc3RbMypkc3RTdGVwK3hdIDowPD0geCA8PSA3CisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byBleGl0IGNvZGUKKyAgICAgICAgCitPTVhfVkNfNHg0X1ZFUlQKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFVwcGVyIEVkZ2UKKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIAorRENQcmVkaWN0NHg0VmVydFN0b3JlICAgICAgICAgCisgICAgICAgIAorICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RdLGRzdGVwCisgICAgICAgIFZTVDEgICAgIGRBYm92ZVUzMlswXSxbcERzdFRtcF0sZHN0ZXAKKyAgICAgICAgVlNUMSAgICAgZEFib3ZlVTMyWzBdLFtwRHN0XQorICAgICAgICBWU1QxICAgICBkQWJvdmVVMzJbMF0sW3BEc3RUbXBdCisKKyAgICAgICAgQiAgICAgICAgRXhpdFByZWRpY3Q0eDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisKK09NWF9WQ180eDRfREMKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19MRUZUCisgICAgICAgIEJFUSAgICAgRENQcmVkaWN0NHg0TGVmdE5vdEF2YWlsYWJsZQorCisgICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFswXX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0VmFsWzFdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgICA7Ly8gICAgcFNyY0xlZnRbMSpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRWYWxbMl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICAgIDsvLyAgICBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFZhbFszXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICAgOy8vICAgIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUgorICAgICAgICBCRVEgICAgIERDUHJlZGljdDR4NExlZnRPbmx5QXZhaWxhYmxlCisKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSBhbHNvCisgICAgICAgIFZMRDEgICAgIGRMZWZ0VmFsVTMyWzFdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICA7Ly8gcFNyY0Fib3ZlWzAgdG8gM10KKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyB8IDArMV0gfCBwU3JjTGVmdFsyKzMgfCAwKzFdXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlTGVmdFUzMiwgZFN1bUFib3ZlTGVmdFUxNiAgICAgICAgIDsvLyBbcFNyY0Fib3ZlWzIrMyswKzFdIHwgcFNyY0xlZnRbMiszKzArMV1dIAorICAgICAgICBWUEFEREwgICBkU3VtQWJvdmVMZWZ0VTY0LCBkU3VtQWJvdmVMZWZ0VTMyICAgICAgICAgOy8vIFtwU3JjQWJvdmVbMiszKzArMV0gKyBwU3JjTGVmdFsyKzMrMCsxXV0gICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBWUlNIUiAgICBkU3VtQWJvdmVMZWZ0VTY0LGRTdW1BYm92ZUxlZnRVNjQsIzMgICAgICAgOy8vIFN1bSA9IChTdW0gKyA0KSA+PiAzCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUFib3ZlTGVmdFU4WzBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgIAorICAgICAgICAKK0RDUHJlZGljdDR4NExlZnRPbmx5QXZhaWxhYmxlCisKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VyciAgICAgICAgICAgICAgICAgICAgIDsvLyByZXR1cm5Ob0Vycm9yCisgICAgICAgIAorICAgICAgICBWUEFEREwgICBkU3VtTGVmdFZhbFUxNiwgZExlZnRWYWwgICAgICAgICAgICAgICAgICAgOy8vIFsgWFggfCBwU3JjTGVmdFsyKzMgfCAwKzFdXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUxlZnRWYWxVMzIsIGRTdW1MZWZ0VmFsVTE2ICAgICAgICAgICAgIDsvLyBbIFhYWFggfCBwU3JjTGVmdFsyKzMrMCsxXV0gCisgICAgICAgIAorICAgICAgICBWUlNIUiAgICBkU3VtTGVmdFZhbFUzMixkU3VtTGVmdFZhbFUzMiwjMiAgICAgICAgICAgOy8vIFN1bSA9IChTdW0gKyAyKSA+PiAyCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIFZEVVAgICAgIGRTdW0sZFN1bUxlZnRWYWxVOFswXQorICAgICAgICAKKyAgICAgICAgQiAgICAgICAgRENQcmVkaWN0NHg0VmVydFN0b3JlICAgCisgICAgICAgIAorRENQcmVkaWN0NHg0TGVmdE5vdEF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAKKyAgICAgICAgVFNUICAgICBhdmFpbGFiaWxpdHksICNPTVhfVkNfVVBQRVIKKyAgICAgICAgQkVRICAgICBEQ1ByZWRpY3Q0eDROb25lQXZhaWxhYmxlCisKKyAgICAgICAgOy8vIExvYWQgVXBwZXIgRWRnZSAKKyAgICAgICAgVkxEMSAgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjQWJvdmVbMCB0byAzXSAgCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIFZQQURETCAgIGRTdW1BYm92ZVZhbFUxNiwgZEFib3ZlVmFsICAgICAgICAgICAgICAgICA7Ly8gWyBYWCB8IHBTcmNBYm92ZVsyKzMgfCAwKzFdXSAgICAgICAgICAgICAKKyAgICAgICAgVlBBRERMICAgZFN1bUFib3ZlVmFsVTMyLCBkU3VtQWJvdmVWYWxVMTYgICAgICAgICAgIDsvLyBbIFhYWFggfCBwU3JjQWJvdmVbMiszKzArMV1dIAorICAgICAgICAKKyAgICAgICAgVlJTSFIgICAgZFN1bUFib3ZlVmFsVTMyLGRTdW1BYm92ZVZhbFUzMiwjMiAgICAgICAgIDsvLyBTdW0gPSAoU3VtICsgMikgPj4gMgorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRFVQICAgICBkU3VtLGRTdW1BYm92ZVZhbFU4WzBdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBEQ1ByZWRpY3Q0eDRWZXJ0U3RvcmUgICAKKyAgICAgICAgCitEQ1ByZWRpY3Q0eDROb25lQXZhaWxhYmxlICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZNT1YgICAgIGRDb25zdDEyOFU4LCMweDgwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gMHg4MDgwODA4MDgwODA4MDgwIGlmKGNvdW50ID09IDApCisgICAgICAgIE1PViAgICAgIHJldHVybiwgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgCisgICAgICAgIEFERCAgICAgcERzdFRtcCwgcERzdCwgZHN0U3RlcAorICAgICAgICBBREQgICAgIGRzdGVwLCBkc3RTdGVwLCBkc3RTdGVwCisgICAgICAgIEIgICAgICAgIERDUHJlZGljdDR4NFZlcnRTdG9yZSAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorT01YX1ZDXzR4NF9ESUFHX0RMCisgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVAorICAgICAgICBCRVEgICAgIERpYWdETFVwcGVyUmlnaHROb3RBdmFpbGFibGUKKyAgICAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmUwLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgOy8vIFtVN3xVNnxVNXxVNHxVM3xVMnxVMXxVMF0gCisgICAgICAgIFZEVVAgICAgZFU3LCBkQWJvdmUwWzddICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTd8VTd8VTd8VTd8VTd8VTd8VTddCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSwgZEFib3ZlMCwgZFU3LCAjMSAgICAgICAgICAgICAgIDsvLyBbVTd8VTd8VTZ8VTV8VTR8VTN8VTJ8VTFdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlMCwgZFU3LCAjMiAgICAgICAgICAgICAgIDsvLyBbVTd8VTd8VTd8VTZ8VTV8VTR8VTN8VTJdIAorICAgICAgICBCICAgICAgIERpYWdETFByZWRpY3Q0eDRTdG9yZSAgICAgICAgIAorICAgICAgIAorRGlhZ0RMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQorICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICA7Ly8gW1UzfFUyfFUxfFUwfC18LXwtfC1dIAorICAgICAgICBWRFVQICAgIGRVMywgZEFib3ZlWzddICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUzIFUzXQorCisgICAgICAgIFZFWFQgICAgZEFib3ZlMCwgZEFib3ZlLCBkVTMsICM0ICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTIgVTEgVTBdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSwgZEFib3ZlLCBkVTMsICM1ICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTIgVTFdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMiwgZEFib3ZlLCBkVTMsICM2ICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTJdCisgICAgICAgCitEaWFnRExQcmVkaWN0NHg0U3RvcmUgIAorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wLCBkQWJvdmUwLCBkQWJvdmUyCisgICAgICAgIFZSSEFERCAgZFRtcCwgZFRtcCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICAgIDsvLyAoYSsyKmIrYysyKT4+MgorICAgICAgICAKKworICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdLGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdLGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdLGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3RdCisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorICAgICAgICAKKworT01YX1ZDXzR4NF9ESUFHX0RSCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVTAsVTEsVTIsVTMKKyAgICAgICAgCisgICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgIDsvLyBbWHxYfFh8WHxVM3xVMnxVMXxVMF0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIExvYWQgVUwsTDAsTDEsTDIsTDMgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRMZWZ0ID0gW1VMfEwwfEwxfEwyfEwzfFh8WHxYXSAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgCisgICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgcERzdDEscERzdCxkc3RTdGVwCisgICAgICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFs2XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFszXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRBYm92ZTAsZExlZnQsZEFib3ZlLCMzICAgICAgICAgICAgICAgICA7Ly8gW1UyfFUxfFUwfFVMfEwwfEwxfEwyfEwzXSAgIAorICAgICAgICBBREQgICAgIHBEc3QyLHBEc3QxLGRzdFN0ZXAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUxLGRMZWZ0LGRBYm92ZSwjNCAgICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHxVTHxMMHxMMXxMMl0gICAKKyAgICAgICAgQUREICAgICBwRHN0MyxwRHN0Mixkc3RTdGVwCisgICAgICAgIFZFWFQgICAgZEFib3ZlMixkTGVmdCxkQWJvdmUsIzUgICAgICAgICAgICAgICAgIDsvLyBbIFh8VTN8VTJ8VTF8VTB8VUx8TDB8TDFdICAgCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAsIGRBYm92ZTAsIGRBYm92ZTIKKyAgICAgICAgVlJIQUREICBkVG1wLCBkVG1wLCBkQWJvdmUxICAgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0M10gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMF0sWzFdLFsyXSxbM10gQCBwRHN0MworICAgICAgICBWRVhUICAgIGRUbXAsZFRtcCxkVG1wLCMxCisgICAgICAgIFZTVDEgICAgZFRtcFUzMlswXSxbcERzdDJdICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwVG1wWzFdLFsyXSxbM10sWzRdIEAgcERzdDIKKyAgICAgICAgVkVYVCAgICBkVG1wLGRUbXAsZFRtcCwjMQorICAgICAgICBWU1QxICAgIGRUbXBVMzJbMF0sW3BEc3QxXSAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcFRtcFsyXSxbM10sWzRdLFs1XSBAIHBEc3QxCisgICAgICAgIFZFWFQgICAgZFRtcCxkVG1wLGRUbXAsIzEKKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbM10sWzRdLFs1XSxbNl0gQCBwRHN0CisgICAgICAgIAorICAgICAgICBCICAgICAgICBFeGl0UHJlZGljdDR4NCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQnJhbmNoIHRvIGV4aXQgY29kZQorCitPTVhfVkNfNHg0X1ZSCisKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFVMLFUwLFUxLFUyLFUzCisgICAgICAgIFZMRDEgICAgZEFib3ZlVTMyWzBdLFtwU3JjQWJvdmVdCisgICAgICAgIFZMRDEgICAgZEFib3ZlWzddLFtwU3JjQWJvdmVMZWZ0XSAgICAgICAgICAgICAgIDsvLyBbVUx8WHxYfFh8VTN8VTJ8VTF8VTBdCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBMMCxMMSxMMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQwID0gW0wwfEwyfFh8WHxYfFh8WHxYXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQxID0gW0wxfCBYfFh8WHxYfFh8WHxYXSAgICAKKyAgICAgICAgVkxEMSAgICB7ZExlZnQwWzddfSxbcFNyY0xlZnRdLGxlZnRTdGVwICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0MVs3XX0sW3BTcmNMZWZ0XSxsZWZ0U3RlcCAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdDBbNl19LFtwU3JjTGVmdF0gICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBWRVhUICAgIGRPZGQyLGRBYm92ZSxkQWJvdmUsIzcgICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBVTCBdCisgICAgICAgIFZFWFQgICAgZEV2ZW4wLGRMZWZ0MCxkT2RkMiwjNiAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUxIFUwIFVMIEwwIEwyIF0KKyAgICAgICAgVkVYVCAgICBkRXZlbjEsZExlZnQxLGRPZGQyLCM3ICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTIgVTEgVTAgVUwgTDEgXQorICAgICAgICBWRVhUICAgIGRFdmVuMixkTGVmdDAsZEFib3ZlLCM3ICAgICAgICAgICAgICAgICA7Ly8gWyB4IHggeCBVMyBVMiBVMSBVMCBMMCBdCisgICAgICAgIFZFWFQgICAgZE9kZDAsZExlZnQxLGRBYm92ZSwjNyAgICAgICAgICAgICAgICAgIDsvLyBbIHggeCB4IFUzIFUyIFUxIFUwIEwxIF0KKyAgICAgICAgVkVYVCAgICBkT2RkMSxkTGVmdDAsZE9kZDIsIzcgICAgICAgICAgICAgICAgICAgOy8vIFsgeCB4IHggVTIgVTEgVTAgVUwgTDAgXQorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMSwgZE9kZDAsIGRPZGQyCisgICAgICAgIFZSSEFERCAgZFRtcDEsIGRUbXAxLCBkT2RkMSAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IDkgNyA1IDMgMSBdCisgICAgICAgIAorICAgICAgICBWSEFERCAgIGRUbXAwLCBkRXZlbjAsIGRFdmVuMgorICAgICAgICBWUkhBREQgIGRUbXAwLCBkVG1wMCwgZEV2ZW4xICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCA4IDYgNCAyIDAgXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZFRtcDMsZFRtcDEsZFRtcDEsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIHggeCB4IHggOSA3IDUgMyBdIAorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAyLGRUbXAwLGRUbXAwLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyB4IHggeCB4IDggNiA0IDIgXQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcDNVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbOV0sWzddLFs1XSxbM10KKyAgICAgICAgVlNUMSAgICBkVG1wMlUzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIFRtcFs4XSxbNl0sWzRdLFsyXQorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RlcCAgICAgICAgICAgICAgICA7Ly8gVG1wWzddLFs1XSxbM10sWzFdCisgICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbNl0sWzRdLFsyXSxbMF0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorT01YX1ZDXzR4NF9IRAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIFUwLFUxLFUyLFUzCisgICAgICAgIFZMRDEgICAgZEFib3ZlLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvL2RBYm92ZUxlZnRWYWwgPSBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBVTCxMMCxMMSxMMixMMyAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZExlZnQgPSBbVUx8TDB8TDF8TDJ8TDN8WHxYfFhdIAorICAgICAgICBWTEQxICAgIHtkTGVmdFs3XX0sW3BTcmNBYm92ZUxlZnRdICAgCisgICAgICAgIEFERCAgICAgcFNyY1RtcCwgcFNyY0xlZnQsIGxlZnRTdGVwCisgICAgICAgIEFERCAgICAgc3JjU3RlcCwgbGVmdFN0ZXAsIGxlZnRTdGVwCisgICAgICAgIAorICAgICAgICBWTEQxICAgIHtkTGVmdFs2XX0sW3BTcmNMZWZ0XSxzcmNTdGVwICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMCpsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNV19LFtwU3JjVG1wXSxzcmNTdGVwICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzEqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzRdfSxbcFNyY0xlZnRdICAgICAgICAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsyKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFszXX0sW3BTcmNUbXBdICAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMypsZWZ0U3RlcF0KKyAgICAgICAgCisgICAgICAgIFZFWFQgICAgZEFib3ZlMCxkTGVmdCxkQWJvdmUsIzMgICAgICAgICAgICAgICAgIDsvLyBbIFUyfFUxfFUwfFVMfEwwfEwxfEwyfEwzIF0gIAorICAgICAgICBWRVhUICAgIGRBYm92ZTEsZExlZnQsZEFib3ZlLCMyICAgICAgICAgICAgICAgICA7Ly8gWyBVMXxVMHxVTHxMMHxMMXxMMnxMM3xYIF0gICAKKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRMZWZ0LGRBYm92ZSwjMSAgICAgICAgICAgICAgICAgOy8vIFsgVTB8VUx8TDB8TDF8TDJ8TDN8WHxYIF0gICAgIAorICAgICAgICAKKyAgICAgICAgVkhBREQgICBkVG1wMCwgZEFib3ZlMCwgZEFib3ZlMgorICAgICAgICBWUkhBREQgIGRUbXAwLCBkVG1wMCwgZEFib3ZlMSAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyAwIHwgMSB8IDIgfCA0IHwgNiB8IDggfCBYIHwgWCBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlJIQUREICBkVG1wMSwgZEFib3ZlMSwgZEFib3ZlMCAgICAgICAgICAgICAgICAgOy8vIChhK2IrMSk+PjEKKyAgICAgICAgVlNITCAgICBkVG1wMVU2NCxkVG1wMVU2NCwjMjQgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgM3w1fCA3IHw5IHwgWCB8IFggfCBYIHwgWCBdCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNITCAgICBkVG1wVTY0LGRUbXAwVTY0LCMxNiAgICAgICAgICAgICAgICAgICAgOy8vIFRtcFsgMnw0fDZ8OHwgWCB8IFggfCBYIHwgWCBdCisgICAgICAgIFZaSVAgICAgZFRtcDEsZFRtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkVG1wID0gWyAyIHwgMyB8IDQgfCA1IHwgNiB8IDcgfCA4IHwgOSBdCisgICAgICAgIFZFWFQgICAgZFRtcDAsZFRtcDAsZFRtcDAsIzYgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbICBYfCBYfCBYfCBYfCBYfCBYfCAwIHwgMSBdCisgICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcCxkVG1wMCwjMiAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfDcgXQorICAgICAgIAorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlsxXSxbcERzdF0sZHN0ZXAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMHwxfDJ8M10KKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzFdLFtwRHN0VG1wXSxkc3RlcCAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbMnwzfDR8NV0KKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0gICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbNHw1fDZ8N10KKyAgICAgICAgVlNUMSAgICBkVG1wVTMyWzBdLFtwRHN0VG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIHBUbXBbNnw3fDh8OV0KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorT01YX1ZDXzR4NF9WTAorCisgICAgICAgIAorICAgICAgICBUU1QgICAgIGF2YWlsYWJpbGl0eSwgI09NWF9WQ19VUFBFUl9SSUdIVAorICAgICAgICBCRVEgICAgIERpYWdWTFVwcGVyUmlnaHROb3RBdmFpbGFibGUKKyAgICAgICAKKyAgICAgICAgVkxEMSAgICBkQWJvdmUwLFtwU3JjQWJvdmVdICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTd8VTZ8VTV8VTR8VTN8VTJ8VTF8VTBdIAorICAgICAgICBWRVhUICAgIGRBYm92ZTEsZEFib3ZlMCxkQWJvdmUwLCMxICAgICAgICAgICAgICAgOy8vIFsgWHxVN3xVNnxVNXxVNHxVM3xVMnxVMV0KKyAgICAgICAgVkVYVCAgICBkQWJvdmUyLGRBYm92ZTEsZEFib3ZlMSwjMSAgICAgICAgICAgICAgIDsvLyBbIFh8IFh8VTd8VTZ8VTV8VTR8VTN8VTJdCisgICAgICAgIAorICAgICAgICBCICAgICAgIERpYWdWTFByZWRpY3Q0eDRTdG9yZSAgICAgICAgIAorICAgICAgIAorRGlhZ1ZMVXBwZXJSaWdodE5vdEF2YWlsYWJsZQorICAgICAgICBWTEQxICAgIGRBYm92ZVUzMlsxXSxbcFNyY0Fib3ZlXSAgICAgICAgICAgICAgICAgOy8vIFtVM3xVMnxVMXxVMHwtfC18LXwtXSAKKyAgICAgICAgVkRVUCAgICBkVTMsIGRBYm92ZVs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTMgVTMgVTNdCisKKyAgICAgICAgVkVYVCAgICBkQWJvdmUwLCBkQWJvdmUsIGRVMywgIzQgICAgICAgICAgICAgICAgIDsvLyBbVTMgVTMgVTMgVTMgVTMgVTIgVTEgVTBdCisgICAgICAgIFZFWFQgICAgZEFib3ZlMSwgZEFib3ZlLCBkVTMsICM1ICAgICAgICAgICAgICAgICA7Ly8gW1UzIFUzIFUzIFUzIFUzIFUzIFUyIFUxXQorICAgICAgICBWRVhUICAgIGRBYm92ZTIsIGRBYm92ZSwgZFUzLCAjNiAgICAgICAgICAgICAgICAgOy8vIFtVMyBVMyBVMyBVMyBVMyBVMyBVMyBVMl0KKyAgICAgICAKK0RpYWdWTFByZWRpY3Q0eDRTdG9yZSAgCisgICAgICAgIAorICAgICAgICBWUkhBREQgIGRUbXAwLCBkQWJvdmUxLCBkQWJvdmUwICAgICAgICAgICAgICAgICA7Ly8gKGErYisxKT4+MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCA4fCA2fCA0fCAyfCAwIF0KKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDMsIGRBYm92ZTAsIGRBYm92ZTIKKyAgICAgICAgVlJIQUREICBkVG1wMywgZFRtcDMsIGRBYm92ZTEgICAgICAgICAgICAgICAgICAgOy8vIChhKzIqYitjKzIpPj4yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IDl8IDd8IDV8IDN8IDEgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZFWFQgICAgZFRtcDEsZFRtcDAsZFRtcDAsIzEgICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbIFh8IFh8IFh8IFh8IDh8IDZ8IDR8IDIgXQorICAgICAgICBBREQgICAgIHBEc3RUbXAsIHBEc3QsIGRzdFN0ZXAKKyAgICAgICAgQUREICAgICBkc3RlcCwgZHN0U3RlcCwgZHN0U3RlcAorICAgICAgICBWRVhUICAgIGRUbXAyLGRUbXAzLGRUbXAxLCMxICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBYfCBYfCBYfCBYfCA5fCA3fCA1fCAzIF0KKyAgICAgICAgCisgICAgICAgIFZTVDEgICAgZFRtcDBVMzJbMF0sW3BEc3RdLGRzdGVwICAgICAgICAgICAgICAgIDsvLyBUbXBbNl0sWzRdLFsyXSxbMF0KKyAgICAgICAgVlNUMSAgICBkVG1wM1UzMlswXSxbcERzdFRtcF0sZHN0ZXAgICAgICAgICAgICAgOy8vIFRtcFs3XSxbNV0sWzNdLFsxXQorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gVG1wWzhdLFs2XSxbNF0sWzJdCisgICAgICAgIFZTVDEgICAgZFRtcDJVMzJbMF0sW3BEc3RUbXBdICAgICAgICAgICAgICAgICAgIDsvLyBUbXBbOV0sWzddLFs1XSxbM10KKyAgICAgICAgCisgICAgICAgIEIgICAgICAgIEV4aXRQcmVkaWN0NHg0ICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBCcmFuY2ggdG8gZXhpdCBjb2RlCisgICAgICAgIAorT01YX1ZDXzR4NF9IVQorICAgICAgICBBREQgICAgIHBTcmNUbXAsIHBTcmNMZWZ0LCBsZWZ0U3RlcAorICAgICAgICBBREQgICAgIHNyY1N0ZXAsIGxlZnRTdGVwLCBsZWZ0U3RlcAorCisgICAgICAgIDsvLyBMb2FkIExlZnQgRWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBbTDN8TDJ8TDF8TDB8WHxYfFh8WF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbNF19LFtwU3JjTGVmdF0sc3JjU3RlcCAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzAqbGVmdFN0ZXBdCisgICAgICAgIFZMRDEgICAge2RMZWZ0WzVdfSxbcFNyY1RtcF0sc3JjU3RlcCAgICAgICAgICAgIDsvLyBwU3JjTGVmdFsxKmxlZnRTdGVwXQorICAgICAgICBWTEQxICAgIHtkTGVmdFs2XX0sW3BTcmNMZWZ0XSAgICAgICAgICAgICAgICAgICA7Ly8gcFNyY0xlZnRbMipsZWZ0U3RlcF0KKyAgICAgICAgVkxEMSAgICB7ZExlZnRbN119LFtwU3JjVG1wXSAgICAgICAgICAgICAgICAgICAgOy8vIHBTcmNMZWZ0WzMqbGVmdFN0ZXBdCisgICAgICAgIAorICAgICAgICBWRFVQICAgIGRMMyxkTGVmdFs3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwzXQorICAgICAgICAKKyAgICAgICAgVkVYVCAgICBkTGVmdEhVMCxkTGVmdCxkTDMsIzQgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMMnxMMXxMMF0KKyAgICAgICAgVkVYVCAgICBkTGVmdEhVMSxkTGVmdCxkTDMsIzUgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMMnxMMV0KKyAgICAgICAgVkVYVCAgICBkTGVmdEhVMixkTGVmdCxkTDMsIzYgICAgICAgICAgICAgICAgICAgOy8vIFtMM3xMM3xMM3xMM3xMM3xMM3xMM3xMMl0KKyAgICAgICAgCisgICAgICAgIFZIQUREICAgZFRtcDAsIGRMZWZ0SFUwLCBkTGVmdEhVMgorICAgICAgICBWUkhBREQgIGRUbXAwLCBkVG1wMCwgZExlZnRIVTEgICAgICAgICAgICAgICAgICA7Ly8gVG1wWyBMMyB8IEwzIHwgTDMgfCBMMyB8IEwzIHwgNSB8IDMgfCAxIF0KKyAgICAgICAgCisgICAgICAgIFZSSEFERCAgZFRtcDEsIGRMZWZ0SFUxLCBkTGVmdEhVMCAgICAgICAgICAgICAgIDsvLyAoYStiKzEpPj4xIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gIFRtcFsgTDMgfCBMMyB8IEwzIHwgTDMgfCBMMyB8IDQgfCAyIHwgMCBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVlpJUCAgICBkVG1wMSxkVG1wMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAxID0gVG1wWzd8IDZ8IDV8IDR8IDN8IDJ8IDF8IDBdICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRUbXAwID0gW0wzfEwzfEwzfEwzfEwzfEwzfEwzfEwzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICBkVG1wMVUzMlswXSxbcERzdF0sZHN0U3RlcCAgICAgICAgICAgICAgOy8vIFszfDJ8MXwwXSAKKyAgICAgICAgVkVYVCAgICBkVG1wMSxkVG1wMSxkVG1wMSwjMgorICAgICAgICBWU1QxICAgIGRUbXAxVTMyWzBdLFtwRHN0XSxkc3RTdGVwICAgICAgICAgICAgICA7Ly8gWzV8NHwzfDJdIAorICAgICAgICBWRVhUICAgIGRUbXAxLGRUbXAxLGRUbXAxLCMyCisgICAgICAgIFZTVDEgICAgZFRtcDFVMzJbMF0sW3BEc3RdLGRzdFN0ZXAgICAgICAgICAgICAgIDsvLyBbN3w2fDV8NF0gIAorICAgICAgICBWU1QxICAgIGRUbXAwVTMyWzBdLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICA7Ly8gWzl8OHw3fDZdIAorICAgICAgICAKKyAgICAgICAgCitFeGl0UHJlZGljdDR4NAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAgI09NWF9TdHNfTm9FcnIKKyAgICAgICAgTV9FTkQKKworICAgICAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAgICAgCisgICAgICAgIEVORAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQgZW5kcworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpcl9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzOTQzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5zCkBAIC0wLDAgKzEsMTQwIEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MucworOy8vIE9wZW5NQVggREw6IHYxLjAuMgorOy8vIFJldmlzaW9uOiAgIDEyMjkwCis7Ly8gRGF0ZTogICAgICAgV2VkbmVzZGF5LCBBcHJpbCA5LCAyMDA4Cis7Ly8gCis7Ly8gKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCis7Ly8gCis7Ly8gCis7Ly8KKworICAgICAgICAKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAgICAgCisgICAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKyAgICAKKworICAgIAorICAgIAorICAgIElGIENvcnRleEE4CisKKzsvLyBBUk0gUmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIERlY2xhcmUgaW5wdXQgcmVnaXN0ZXJzCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHBTcmMgICAgICAgUk4gMAorcERzdCAgICAgICAgUk4gMQorUVAgICAgICAgICAgUk4gMgorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFNjcmF0Y2ggdmFyaWFibGUgZm9yIFVucGFjazJ4MiAKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwU3JjICAgICAgICBSTiA5CitWYWx1ZSAgICAgICBSTiA0CitWYWx1ZTIgICAgICBSTiA1CitGbGFnICAgICAgICBSTiA2CitzdHJPZmZzZXQgICBSTiA3Citjc3RPZmZzZXQgICBSTiA4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gU2NyYXRjaCB2YXJpYWJsZQorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3IwdzAgICAgICAgIFJOICAzCityMHcxICAgICAgICBSTiAgNAorCitjMHcwICAgICAgICBSTiAgNQorYzF3MCAgICAgICAgUk4gIDYKKworcmV0dXJuICAgICAgUk4gIDAKK3BRUERpdlRhYmxlIFJOICA1CitwUVBNb2RUYWJsZSAgICBSTiAgNgorU2hpZnQgICAgICAgIFJOICA5CitTY2FsZSAgICAgICAgUk4gIDIKKworCisKKzsvLyBOZW9uIFJlZ2lzdGVycworCitkWmVybyAgICAgICBETiAgRDAuVTE2CitkSW52VHJDb2VmZiBETiAgRDAuUzE2CitkU2NhbGUgICAgICBETiAgRDEuUzE2CitxRHFudENvZWZmICBRTiAgUTEuUzMyCitkRHFudENvZWZmICBETiAgRDIuUzE2CisKKworICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgICAgIE1fU1RBUlQgb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50Q2hyb21hRENGcm9tUGFpciwgcjkKKyAgICAgICAgCisgICAgICAgIExEUiAgICAgcFNyYywgW3BwU3JjXSAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBMb2FkIHBTcmMKKyAgICAgICAgVk1PViAgICBkWmVybywgIzAKKyAgICAgICAgTU9WICAgICBjc3RPZmZzZXQsICMzMSAgICAgICAgICAgICAgICAgICAgICAgOy8vIFRvIGJlIHVzZWQgaW4gdGhlIGxvb3AsIHRvIGNvbXB1dGUgb2Zmc2V0CisgICAgICAgIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICA7Ly8gRmlyc3RseSwgZmlsbCBhbGwgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyBvbiB0aGUgPHBEc3Q+IGJ1ZmZlciBieSB6ZXJvCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBWU1QxICAgIGRaZXJvLFtwRHN0XSAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFswXSAgPSBwRHN0WzFdICA9IHBEc3RbMl0gID0gcERzdFszXSAgPSAwICAgCisgICAgICAgIExEUkIgICAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBQcmVsb2FkIDxGbGFnPiBiZWZvcmUgPHVucGFja0xvb3A+CisKKwordW5wYWNrTG9vcAorICAgICAgICBUU1QgICAgICBGbGFnLCAgIzB4MTAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gQ29tcHV0aW5nIChGbGFnICYgMHgxMCkKKyAgICAgICAgTERSU0JORSAgVmFsdWUyLFtwU3JjLCMxXSAgICAgICAgICAgICAgICAgIAorICAgICAgICBMRFJCTkUgICBWYWx1ZSwgW3BTcmNdLCAjMiAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBieXRlIHdpc2UgdG8gYXZvaWQgdW5hbGlnbmVkIGFjY2VzcworICAgICAgICBBTkQgICAgICBzdHJPZmZzZXQsIGNzdE9mZnNldCwgRmxhZywgTFNMICMxICA7Ly8gc3RyT2Zmc2V0ID0gKEZsYWcgJiAxNSkgPCAxOworICAgICAgICBMRFJTQkVRICBWYWx1ZSwgW3BTcmNdLCAjMSAgICAgICAgICAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1U4KSAgKnBTcmMrKworICAgICAgICBPUlJORSAgICBWYWx1ZSxWYWx1ZSxWYWx1ZTIsIExTTCAjOCAgICAgICAgICA7Ly8gVmFsdWUgPSAoT01YX1UxNikgKnBTcmMrKworICAgICAgICAKKyAgICAgICAgVFNUICAgICAgRmxhZywgICMweDIwICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENvbXB1dGluZyAoRmxhZyAmIDB4MjApIHRvIGNoZWNrLCBpZiB3ZSdyZSBkb25lCisgICAgICAgIExEUkJFUSAgIEZsYWcsICBbcFNyY10sICMxICAgICAgICAgICAgICAgICAgIDsvLyBGbGFnICA9IChPTVhfVTgpICpwU3JjKyssIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgICBTVFJIICAgICBWYWx1ZSwgW3BEc3QsIHN0ck9mZnNldF0gICAgICAgICAgICA7Ly8gU3RvcmUgPFZhbHVlPiBhdCBvZmZzZXQgPHN0ck9mZnNldD4KKyAgICAgICAgQkVRICAgICAgdW5wYWNrTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCB0byB0aGUgbG9vcCBiZWdpbm5pbmcKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIDsvL0ludlRyYW5zZm9ybURDMngyOiBJbmxpbmVkIChJbXBsZW1lbnRlZCBpbiBBUk0gVjYpCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBMRE1JQSAgICBwRHN0LCB7cjB3MCwgcjB3MX0gICAgICAgICAgICAgICAgICA7Ly8gcjB3MCA9IHxjMXxjMHwgJiByMHcxID0gfGMzfGMyfAorCisgICAgICAgIFNUUiAgICAgIHBTcmMsIFtwcFNyY10gICAgICAgICAgICAgICAgICAgICAgIDsvLyBVcGRhdGUgdGhlIGJpdHN0cmVhbSBwb2ludGVyCisgICAgICAgIAorICAgICAgICBMRFIgICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSA7Ly8gUVAgRGl2aXNpb24gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgTERSICAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIFNBRERTVUJYIHIwdzAsIHIwdzAsICByMHcwICAgICAgICAgICAgICAgICAgIDsvLyBbIGMwMCtjMDEsIGMwMC1jMDEgXQorICAgICAgICBTQUREU1VCWCByMHcxLCByMHcxLCAgcjB3MSAgICAgICAgICAgICAgICAgICA7Ly8gWyBjMTArYzExLCBjMTAtYzExIF0KKyAgICAgICAgCisgICAgICAgIExEUlNCICAgIFNoaWZ0LCBbcFFQRGl2VGFibGUsIFFQXSAgICAgICAgICAgIDsvLyBTaGlmdCA9IHBRUERpdlRhYmxlW1FQXQorICAgICAgICBMRFJTQiAgICBTY2FsZSwgW3BRUE1vZFRhYmxlLCBRUF0gICAgICAgICAgICA7Ly8gU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0KKyAgICAgICAgCisgICAgICAgIFNBREQxNiAgIGMwdzAsIHIwdzAsIHIwdzEgICAgICAgICAgICAgICAgICAgIDsvLyBbIGQwMCtkMTAsIGQwMStkMTEgXQorICAgICAgICBTU1VCMTYgICBjMXcwLCByMHcwLCByMHcxICAgICAgICAgICAgICAgICAgICA7Ly8gWyBkMDAtZDEwLCBkMDEtZDExIF0KKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vRGVxdWFudENocm9tYURDMngyOiBJbmxpbmVkIChOZW9uIEltcGxlbWVudGF0aW9uKQorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICBMU0wgICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICA7Ly8gU2NhbGUgPSBTY2FsZSA8PCBTaGlmdAorICAgICAgICBWTU9WICAgICBkSW52VHJDb2VmZiwgYzB3MCwgYzF3MCAgCisgICAgICAgIFZSRVYzMiAgIGRJbnZUckNvZWZmLGRJbnZUckNvZWZmICAKKyAgICAgICAgVkRVUCAgICAgZFNjYWxlLFNjYWxlIAorICAgICAgICAKKyAgICAgICAgVk1VTEwgICAgcURxbnRDb2VmZixkSW52VHJDb2VmZixkU2NhbGUKKyAgICAgICAgVlNIUk4gICAgZERxbnRDb2VmZixxRHFudENvZWZmLCMxCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVlNUMSAgICAgZERxbnRDb2VmZixbcERzdF0gICAgICAgICAgICAgICAgICAgOy8vIFN0b3JpbmcgYWxsIHRoZSBjb2VmZmljaWVudHMgYXQgb25jZQorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgcmV0dXJuLCAjT01YX1N0c19Ob0VycgorICAgICAgICBNX0VORAorICAgICAgICAKKyAgICBFTkRJRiA7Ly8gQ29ydGV4QTgKKyAgICAKKyAgICAKKyAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjUyOTk1OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmMvb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXJfcy5zCkBAIC0wLDAgKzEsMjY0IEBACis7Ly8KKzsvLyAKKzsvLyBGaWxlIE5hbWU6ICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLnMKKzsvLyBPcGVuTUFYIERMOiB2MS4wLjIKKzsvLyBSZXZpc2lvbjogICAxMjI5MAorOy8vIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorOy8vIAorOy8vIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorOy8vIAorOy8vIAorOy8vCis7Ly8gRGVzY3JpcHRpb246Cis7Ly8gSC4yNjQgaW52ZXJzZSBxdWFudGl6ZSBhbmQgdHJhbnNmb3JtIG1vZHVsZQorOy8vIAorOy8vIAorCis7Ly8gSW5jbHVkZSBzdGFuZGFyZCBoZWFkZXJzCisKKyAgICAgICAgSU5DTFVERSBvbXh0eXBlc19zLmgKKyAgICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgICAKKzsvLyBJbXBvcnQvRXhwb3J0IHN5bWJvbHMgcmVxdWlyZWQgZnJvbS90byBvdGhlciBmaWxlcworOy8vIChGb3IgZXhhbXBsZSB0YWJsZXMpCisgICAgICAgIAorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9VbnBhY2tCbG9jazR4NCAKKyAgICAgICAgSU1QT1JUIGFybVZDTTRQMTBfUVBEaXZUYWJsZQorICAgICAgICBJTVBPUlQgYXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgICAgICAKKyAgICAgICAgTV9WQVJJQU5UUyBDb3J0ZXhBOAorCis7Ly8gU2V0IGRlYnVnZ2luZyBsZXZlbCAgICAgICAgCis7Ly9ERUJVR19PTiAgICBTRVRMIHtUUlVFfQorCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgIAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgCisKKzsvLyBTdGF0aWMgRnVuY3Rpb246IGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgIENvcnRleEE4CisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BEYXRhICAgICAgICAgICAgICAgUk4gIDAKK1FQICAgICAgICAgICAgICAgICAgUk4gIDEgICAgCisKKworOy8vTG9jYWwgU2NyYXRjaCBSZWdpc3RlcnMKKworOy8vIEFSTSBSZWdpc3RlcnMKKworcFFQRGl2VGFibGUgICAgICAgICBSTiAgMgorcFFQTW9kVGFibGUgICAgICAgICBSTiAgMworU2hpZnQgICAgICAgICAgICAgICBSTiAgNAorU2NhbGUgICAgICAgICAgICAgICBSTiAgNQorCis7Ly8gTkVPTiBSZWdpc3RlcnMKKworOy8vIFBhY2tlZCBJbnB1dCBwaXhlbHMKK2RJbjAgICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZEluMSAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitkSW4yICAgICAgICAgICAgICAgIEROICBEMi5TMTYKK2RJbjMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNiAgIAorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworZFJvd1N1bTEgICAgICAgICAgICBETiAgRDQuUzE2CitkUm93U3VtMiAgICAgICAgICAgIEROICBENS5TMTYKK2RSb3dEaWZmMSAgICAgICAgICAgRE4gIEQ2LlMxNgorZFJvd0RpZmYyICAgICAgICAgICBETiAgRDcuUzE2CisKKzsvLyBSb3cgb3BlcmF0ZWQgcGl4ZWxzCitkUm93T3AwICAgICAgICAgICAgIEROICBEMC5TMTYKK2RSb3dPcDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZFJvd09wMiAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkUm93T3AzICAgICAgICAgICAgICAgIEROICBEMy5TMTYKK3FSb3dPcDAxICAgICAgICAgICAgUU4gIFEwLjMyCitxUm93T3AyMyAgICAgICAgICAgIFFOICBRMS4zMgorCis7Ly8gSW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucworZENvbFN1bTEgICAgICAgICAgICBETiAgRDQuUzE2CitkQ29sU3VtMiAgICAgICAgICAgIEROICBENS5TMTYKK2RDb2xEaWZmMSAgICAgICAgICAgRE4gIEQ2LlMxNgorZENvbERpZmYyICAgICAgICAgICBETiAgRDcuUzE2CisKKzsvLyBDb2xvdW1uIG9wZXJhdGVkIHBpeGVscworZENvbE9wMCAgICAgICAgICAgICBETiAgRDAuUzE2CitkQ29sT3AxICAgICAgICAgICAgICAgIEROICBEMS5TMTYKK2RDb2xPcDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZENvbE9wMyAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKKzsvLyBUZW1wb3Jhcnkgc2NyYXRjaCB2YXJhaWJsZXMKKworZFNjYWxlICAgICAgICAgICAgICBETiAgRDUuUzE2CitxUm91bmQwICAgICAgICAgICAgIFFOICBRMy5TMzIKK3FSb3VuZDEgICAgICAgICAgICAgUU4gIFE0LlMzMgorcVJvdW5kMiAgICAgICAgICAgICBRTiAgUTUuUzMyCitxUm91bmQzICAgICAgICAgICAgIFFOICBRNi5TMzIKKworOy8vIEludlRyYW5zZm9ybWVkIGFuZCBEZXF1YW50aXplZCBwaXhlbHMKK2RPdXQwICAgICAgICAgICAgICAgRE4gIEQwLlMxNgorZE91dDEgICAgICAgICAgICAgICAgRE4gIEQxLlMxNgorZE91dDIgICAgICAgICAgICAgICAgRE4gIEQyLlMxNgorZE91dDMgICAgICAgICAgICAgICAgRE4gIEQzLlMxNgorCisgICAgICAgCisgICAgOy8vIEFsbG9jYXRlIHN0YWNrIG1lbW9yeSByZXF1aXJlZCBieSB0aGUgZnVuY3Rpb24KKyAgICAgICAgCisKKyAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gaGVhZGVyCisgICAgTV9TVEFSVCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQscjUsZDEzCisgICAgCisgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDsvLyBUaGUgc3RyYXRlZ3kgdXNlZCBpbiBpbXBsZW1lbnRpbmcgdGhlIHRyYW5zZm9ybSBpcyBhcyBmb2xsb3dzOioKKyAgICA7Ly8gTG9hZCB0aGUgNHg0IGJsb2NrIGludG8gNCBELXJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICA7Ly8gUGVyZm9ybSB0aGUgcm93IG9wZXJhdGlvbnMgKG9uIGNvbHVtbnMpIHVzaW5nIFNJTUQgICAgICAgICAgICAqICAKKyAgICA7Ly8gVHJhbnNwb3NlIHRoZSA0eDQgcmVzdWx0IG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAKKyAgICA7Ly8gUGVyZm9ybSB0aGUgY29sb3VtbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgIDsvLyBMb2FkIGFsbCB0aGUgNHg0IHBpeGVscyBpbiBUcmFuc3Bvc2VkIGZvcm0KKyAgICAgICAgCisgICAgICAgIFZMRDQgICAge2RJbjAsZEluMSxkSW4yLGRJbjN9LFtwRGF0YV0KKyAgICAgICAgTERSICAgICBwUVBEaXZUYWJsZSwgPWFybVZDTTRQMTBfUVBEaXZUYWJsZSAgICAgICAgOy8vIFFQIERpdmlzaW9uIGxvb2stdXAtdGFibGUgYmFzZSBwb2ludGVyCisgICAgICAgIExEUiAgICAgcFFQTW9kVGFibGUsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlIDsvLyBRUCBNb2R1bG8gbG9vay11cC10YWJsZSBiYXNlIHBvaW50ZXIKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICAgICAgICA7Ly8gUm93IE9wZXJhdGlvbnMgKFBlcmZvcm1lZCBvbiBjb2x1bW5zKQorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIFNjYWxlIGZhY3RvciBjYWxjdWxhdGlvbiBpcyBkb25lIHVzaW5nIEFSTSBpbnN0cnVjdGlvbnMKKyAgICAgICAgOy8vIEludGVybGVhdmVkIHdpdGggTkVPTiBpbnN0cnVjdGlvbnMgaW5vcmRlciB0byBEdWFsIGlzc3VlCisgICAgICAgIAorICAgICAgICBWQUREICAgIGRSb3dTdW0xLGRJbjAsZEluMQorICAgICAgICBWQUREICAgIGRSb3dTdW0yLGRJbjIsZEluMworICAgICAgICBWU1VCICAgIGRSb3dEaWZmMSxkSW4wLGRJbjEKKyAgICAgICAgTERSU0IgICBTaGlmdCwgW3BRUERpdlRhYmxlLCBRUF0gICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNoaWZ0ID0gcFFQRGl2VGFibGVbUVBdCisgICAgICAgIFZTVUIgICAgZFJvd0RpZmYyLGRJbjIsZEluMworICAgICAgICBMRFJTQiAgIFNjYWxlLCBbcFFQTW9kVGFibGUsIFFQXSAgICAgICAgICAgICAgIDsvLyBBUk0gQ09ERTogU2NhbGUgPSBwUVBNb2RUYWJsZVtRUF0gCisgICAgICAgIFZBREQgICAgZFJvd09wMCxkUm93U3VtMSxkUm93U3VtMgorICAgICAgICBWU1VCICAgIGRSb3dPcDEsZFJvd1N1bTEsZFJvd1N1bTIKKyAgICAgICAgVlNVQiAgICBkUm93T3AyLGRSb3dEaWZmMSxkUm93RGlmZjIKKyAgICAgICAgTFNMICAgICBTY2FsZSwgU2NhbGUsIFNoaWZ0ICAgICAgICAgICAgICAgICAgICA7Ly8gQVJNIENPREU6IFNjYWxlID0gU2NhbGUgPDwgU2hpZnQKKyAgICAgICAgVkFERCAgICBkUm93T3AzLGRSb3dEaWZmMSxkUm93RGlmZjIKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIDsvLyBUcmFuc3Bvc2UgdGhlIHJlc3VsdGFudCBtYXRyaXgKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgCisgICAgICAgIFZUUk4gICAgZFJvd09wMCxkUm93T3AxCisgICAgICAgIFZUUk4gICAgZFJvd09wMixkUm93T3AzCisgICAgICAgIFZUUk4gICAgcVJvd09wMDEscVJvd09wMjMgCisgICAgICAgIAorICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAgICAgICAgOy8vIENvbG91bW4gT3BlcmF0aW9ucyAKKyAgICAgICAgOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgICAgICAgIAorICAgICAgICBWQUREICAgIGRDb2xTdW0xLGRSb3dPcDAsZFJvd09wMQorICAgICAgICBWQUREICAgIGRDb2xTdW0yLGRSb3dPcDIsZFJvd09wMworICAgICAgICBWU1VCICAgIGRDb2xEaWZmMSxkUm93T3AwLGRSb3dPcDEKKyAgICAgICAgVlNVQiAgICBkQ29sRGlmZjIsZFJvd09wMixkUm93T3AzCisgICAgICAgIFZBREQgICAgZENvbE9wMCxkQ29sU3VtMSxkQ29sU3VtMgorICAgICAgICBWU1VCICAgIGRDb2xPcDEsZENvbFN1bTEsZENvbFN1bTIKKyAgICAgICAgVlNVQiAgICBkQ29sT3AyLGRDb2xEaWZmMSxkQ29sRGlmZjIKKyAgICAgICAgVkFERCAgICBkQ29sT3AzLGRDb2xEaWZmMSxkQ29sRGlmZjIKKyAgICAgICAgCisgICAgICAgIDsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgOy8vCisgICAgICAgIDsvLyA8RGVxdWFudGl6ZT4gaW1wcm92ZXMgb24gdGhlIGMtcmVmZXJlbmNlIGNvZGUKKyAgICAgICAgOy8vIEJvdGggdGhlICBjYXNlcyBpLmUuLCBTaGlmdD49MCBhbmQgU2hpZnQ8MCBjYXNlcyBhcmUgY292ZXJlZCB0b2dldGhlcgorICAgICAgICA7Ly8gV2UgZG8gbm90IHN1YnRyYWN0IDIgZnJvbSBTaGlmdCBhcyBpbiBDIHJlZmVyZW5jZSwgaW5zdGVhZCBwZXJmb3JtIGEKKyAgICAgICAgOy8vIFNjYWxlIDw8IFNoaWZ0IG9uY2UgaW4gdGhlIGJlZ2lubmluZyBhbmQgZG8gYSByaWdodCBzaGlmdCBieSBhIAorICAgICAgICA7Ly8gY29uc3RhbnQgMiBhZnRlciB0aGUgTXVsdGlwbGljYXRpb24uIFRoZSB2YWx1ZSBvZiBSb3VuZCB3b3VsZCBiZSAyIAorICAgICAgICA7Ly8gCisgICAgICAgIDsvLyBCeSBkb2luZyB0aGlzIHdlIGF2aW9kIHRoZSBCcmFuY2hlcyByZXF1aXJlZCBhbmQgYWxzbyAKKyAgICAgICAgOy8vIHJlZHVjZSB0aGUgY29kZSBzaXplIHN1YnN0YW50aWFsbHkKKyAgICAgICAgOy8vIAorICAgICAgICA7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgVkRVUCAgICBkU2NhbGUsIFNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBBUk0gLT4gTkVPTiAgY29weSAnc2NhbGUnIHRvIHZlY3RvcgorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgIFZNT1YgICAgcVJvdW5kMCwjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0IHRoZSBSb3VuZCBWYWx1ZSAKKyAgICAgICAgVk1PViAgICBxUm91bmQxLCMyCisgICAgICAgIFZNT1YgICAgcVJvdW5kMiwjMgorICAgICAgICBWTU9WICAgIHFSb3VuZDMsIzIKKyAgICAgICAgCisgICAgICAgIFZNTEFMICAgcVJvdW5kMCxkQ29sT3AwLGRTY2FsZSAgICAgICAgICAgICAgICAgICA7Ly8gcERzdFtpXSAqIFNjYWxlICsgUm91bmQgCisgICAgICAgIFZNTEFMICAgcVJvdW5kMSxkQ29sT3AxLGRTY2FsZQorICAgICAgICBWTUxBTCAgIHFSb3VuZDIsZENvbE9wMixkU2NhbGUKKyAgICAgICAgVk1MQUwgICBxUm91bmQzLGRDb2xPcDMsZFNjYWxlCisgICAgICAgIAorICAgICAgICBWU0hSTiAgIGRPdXQwLHFSb3VuZDAsIzIgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSaWdodCBzaGlmdCBieSAyICYgKE9NWF9TMTYpVmFsdWUKKyAgICAgICAgVlNIUk4gICBkT3V0MSxxUm91bmQxLCMyCisgICAgICAgIFZTSFJOICAgZE91dDIscVJvdW5kMiwjMgorICAgICAgICBWU0hSTiAgIGRPdXQzLHFSb3VuZDMsIzIKKyAgICAgICAgCisgICAgICAgIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgOy8vIFN0b3JlIGFsbCB0aGUgNHg0IHBpeGVscworICAgICAgICA7KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIAorICAgICAgICBWU1QxICB7ZE91dDAsZE91dDEsZE91dDIsZE91dDN9LCBbcERhdGFdCisKKyAgICAgICAgCisgICAgICAgIDsvLyBTZXQgcmV0dXJuIHZhbHVlCisgICAgICAgIAorICAgICAgICA7Ly8gV3JpdGUgZnVuY3Rpb24gdGFpbAorICAgICAgICBNX0VORCAgICAgICAgCisgICAgICAgIAorICAgIEVORElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly9DT1JURVhBOCAgIAorICAgICAgICAKKworCis7Ly8gRnVuY3Rpb246IG9teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyCisgICAgCis7Ly9JbnB1dCBSZWdpc3RlcnMKK3BwU3JjICAgICAgICAgICAgICAgUk4gIDAKK3BEc3QgICAgICAgICAgICAgICAgUk4gIDEKK1FQUjIgICAgICAgICAgICAgICAgUk4gIDIKKworOy8vT3V0cHV0IFJlZ2lzdGVycworcmVzdWx0ICAgICAgICAgICAgICBSTiAgMAorCis7Ly9Mb2NhbCBTY3JhdGNoIFJlZ2lzdGVycworcERzdFI0ICAgICAgICAgICAgICBSTiAgNAorcERzdFIwICAgICAgICAgICAgICBSTiAgMAorUVBSMSAgICAgICAgICAgICAgICBSTiAgMQorUVBSNSAgICAgICAgICAgICAgICBSTiAgNQorCis7Ly8gR3VhcmRpbmcgaW1wbGVtZW50YXRpb24gYnkgdGhlIHByb2Nlc3NvciBuYW1lCisgICAgCisgICAgSUYgQ29ydGV4QTgKKyAgICAgICAKKyAgICA7Ly8gQWxsb2NhdGUgc3RhY2sgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbgorICAgICAgICAKKworICAgIDsvLyBXcml0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgTV9TVEFSVCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcixyNQorICAgICAgICAKKyAgICAgICAgTU9WICAgICBwRHN0UjQscERzdCAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2F2aW5nIHJlZ2lzdGVyIHIxCisgICAgICAgIE1PViAgICAgUVBSNSxRUFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNhdmluZyByZWdpc3RlciByMgorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQKKyAgICAgICAgCisgICAgICAgIE1PViAgICAgcERzdFIwLHBEc3RSNCAgICAgICAgICAgICAgICAgICAgICAgOy8vIFNldHRpbmcgdXAgcmVnaXN0ZXIgcjAKKyAgICAgICAgTU9WICAgICBRUFIxLFFQUjUgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2V0dGluZyB1cCByZWdpc3RlciByMQorICAgICAgICBCTCAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgICAgICA7Ly8gU2V0IHJldHVybiB2YWx1ZQorICAgICAgICBNT1YgICAgIHJlc3VsdCwjT01YX1N0c19Ob0VyciAgICAgICAgCisgICAgICAgCisgICAgICAgIDsvLyBXcml0ZSBmdW5jdGlvbiB0YWlsCisgICAgICAgIE1fRU5ECisgICAgICAgIAorICAgICAgICAgICAgCisgICAgRU5ESUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvL0FSTTExMzZKUyAgCisgICAgCisKKyAgICBFTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfQXZlcmFnZV80eF9BbGlnbl91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTJkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0F2ZXJhZ2VfNHhfQWxpZ25fdW5zYWZlX3MuUwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjBfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMF91bnNhZmUKK2FybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24wX3Vuc2FmZToKKyAgICBQVVNIICAgICB7cjQtcjYsbHJ9CisgICAgTERSICAgICAgcjcsID0weDgwODA4MDgwCisgICAgTERSICAgICAgcjEyLFtyMiwjMF0KKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBVSFNVQjggICByNCxyMTEsbHIKKyAgICBFT1IgICAgICByNSxyNSxyNworICAgIFNUUiAgICAgIHI1LFtyMl0scjMKKyAgICBFT1IgICAgICByNCxyNCxyNworICAgIFNUUiAgICAgIHI0LFtyMl0scjMKKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBMRFIgICAgICBscixbcjIscjNdCisgICAgTVZOICAgICAgcjEyLHIxMgorICAgIFVIU1VCOCAgIHI1LHIxMCxyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduMl91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24yX3Vuc2FmZQorYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjJfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBMRFIgICAgICByNywgPTB4ODA4MDgwODAKKyAgICBMRFIgICAgICByNCxbcjAsIzRdCisgICAgTERSICAgICAgcjEwLFtyMF0scjEKKyAgICBMRFIgICAgICByMTIsW3IyLCMwXQorICAgIExEUiAgICAgIGxyLFtyMixyM10KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjExLFtyMF0scjEKKyAgICBNVk4gICAgICByMTIscjEyCisgICAgTVZOICAgICAgbHIsbHIKKyAgICBMU1IgICAgICByMTAscjEwLCMxNgorICAgIE9SUiAgICAgIHIxMCxyMTAscjQsTFNMICMxNgorICAgIExTUiAgICAgIHIxMSxyMTEsIzE2CisgICAgT1JSICAgICAgcjExLHIxMSxyNSxMU0wgIzE2CisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExEUiAgICAgIHI0LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIExTUiAgICAgIHIxMCxyMTAsIzE2CisgICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzE2CisgICAgTFNSICAgICAgcjExLHIxMSwjMTYKKyAgICBPUlIgICAgICByMTEscjExLHI1LExTTCAjMTYKKyAgICBVSFNVQjggICByNSxyMTAscjEyCisgICAgVUhTVUI4ICAgcjQscjExLGxyCisgICAgRU9SICAgICAgcjUscjUscjcKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgRU9SICAgICAgcjQscjQscjcKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfQXZlcmFnZV80eDRfQWxpZ24zX3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9BdmVyYWdlXzR4NF9BbGlnbjNfdW5zYWZlCithcm1WQ000UDEwX0F2ZXJhZ2VfNHg0X0FsaWduM191bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIExEUiAgICAgIHI3LCA9MHg4MDgwODA4MAorICAgIExEUiAgICAgIHI0LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIExTUiAgICAgIHIxMCxyMTAsIzI0CisgICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzgKKyAgICBMU1IgICAgICByMTEscjExLCMyNAorICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICM4CisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExEUiAgICAgIHI0LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTAsW3IwXSxyMQorICAgIExEUiAgICAgIHIxMixbcjIsIzBdCisgICAgTERSICAgICAgbHIsW3IyLHIzXQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByMTEsW3IwXSxyMQorICAgIE1WTiAgICAgIHIxMixyMTIKKyAgICBNVk4gICAgICBscixscgorICAgIExTUiAgICAgIHIxMCxyMTAsIzI0CisgICAgT1JSICAgICAgcjEwLHIxMCxyNCxMU0wgIzgKKyAgICBMU1IgICAgICByMTEscjExLCMyNAorICAgIE9SUiAgICAgIHIxMSxyMTEscjUsTFNMICM4CisgICAgVUhTVUI4ICAgcjUscjEwLHIxMgorICAgIFVIU1VCOCAgIHI0LHIxMSxscgorICAgIEVPUiAgICAgIHI1LHI1LHI3CisgICAgU1RSICAgICAgcjUsW3IyXSxyMworICAgIEVPUiAgICAgIHI0LHI0LHI3CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIFBPUCAgICAgIHtyNC1yNixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYV91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZWUyMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFfdW5zYWZlX3MuUwpAQCAtMCwwICsxLDU0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTTFQ0X3Vuc2FmZQorYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlOgorICAgIFZMRDEuMzIgIHtkMThbMF19LFtyNV0hCisgICAgVlNVQkwuVTggcTExLGQ1LGQ5CisgICAgVk1PViAgICAgZDI4LGQxOAorICAgIFZTVUJMLlU4IHExMCxkOCxkNAorICAgIFZTSFIuUzE2IHExMSxxMTEsIzIKKyAgICBWWklQLjggICBkMTgsZDI4CisgICAgVkJJRiAgICAgZDE4LGQxNCxkMTYKKyAgICBWUkhBREQuUzE2IHExMCxxMTEscTEwCisgICAgVkFERC5JOCAgZDMxLGQxOCxkMTUKKyAgICBWUU1PVk4uUzE2IGQyMCxxMTAKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIFZNSU4uUzggIGQyMCxkMjAsZDMxCisgICAgVk5FRy5TOCAgZDMxLGQzMQorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgVk1BWC5TOCAgZDIwLGQyMCxkMzEKKyAgICBWTU9WTC5VOCBxMTQsZDQKKyAgICBWTU9WTC5VOCBxMTIsZDgKKyAgICBWQUREVy5TOCBxMTQscTE0LGQyMAorICAgIFZTVUJXLlM4IHExMixxMTIsZDIwCisgICAgVlFNT1ZVTi5TMTYgZDI5LHExNAorICAgIFZRTU9WVU4uUzE2IGQyNCxxMTIKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0Nocm9tYWJTR0U0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCithcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmU6CisgICAgVkhBREQuVTggZDEzLGQ0LGQ5CisgICAgVkhBREQuVTggZDMxLGQ4LGQ1CisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgVlJIQURELlU4IGQxMyxkMTMsZDUKKyAgICBWUkhBREQuVTggZDMxLGQzMSxkOQorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWJsb2NraW5nTHVtYV91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjNkNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hX3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKK2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmU6CisgICAgVlNVQkwuVTggcTExLGQ1LGQ5CisgICAgVkxEMS44ICAge2QxOFtdfSxbcjVdIQorICAgIFZTVUJMLlU4IHExMCxkOCxkNAorICAgIFZMRDEuOCAgIHtkMTlbXX0sW3I1XSEKKyAgICBWU0hSLlMxNiBxMTEscTExLCMyCisgICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzQKKyAgICBWQU5EICAgICBkMTksZDE3LGQxNQorICAgIFZCSUYgICAgIGQxOCxkMTQsZDE2CisgICAgVlJIQURELlMxNiBxMTAscTExLHExMAorICAgIFZSSEFERC5VOCBkMjQsZDQsZDgKKyAgICBWQURELkk4ICBkMzEsZDE4LGQxOQorICAgIFZBTkQgICAgIGQxOSxkMTIsZDE1CisgICAgVlFBREQuVTggZDIzLGQ1LGQxOAorICAgIFZRTU9WTi5TMTYgZDIwLHExMAorICAgIFZBREQuSTggIGQzMSxkMzEsZDE5CisgICAgVlFTVUIuVTggZDIyLGQ1LGQxOAorICAgIFZRQURELlU4IGQxOSxkOSxkMTgKKyAgICBWSEFERC5VOCBkMjYsZDI0LGQ2CisgICAgVk1JTi5TOCAgZDIwLGQyMCxkMzEKKyAgICBWTkVHLlM4ICBkMzEsZDMxCisgICAgVlFTVUIuVTggZDIxLGQ5LGQxOAorICAgIFZIQURELlU4IGQyNyxkMjQsZDEwCisgICAgVk1BWC5VOCAgZDMwLGQyNixkMjIKKyAgICBWTUFYLlM4ICBkMjAsZDIwLGQzMQorICAgIFZNT1ZMLlU4IHExNCxkNAorICAgIFZNT1ZMLlU4IHExMixkOAorICAgIFZBRERXLlM4IHExNCxxMTQsZDIwCisgICAgVlNVQlcuUzggcTEyLHExMixkMjAKKyAgICBWUU1PVlVOLlMxNiBkMjkscTE0CisgICAgVlFNT1ZVTi5TMTYgZDI0LHExMgorICAgIFZNQVguVTggIGQyNSxkMjcsZDIxCisgICAgVk1JTi5VOCAgZDMwLGQzMCxkMjMKKyAgICBWTUlOLlU4ICBkMjUsZDI1LGQxOQorICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKKyAgICBWQklGICAgICBkMzAsZDUsZDE3CisgICAgVkJJRiAgICAgZDI0LGQ4LGQxNgorICAgIFZCSUYgICAgIGQyNSxkOSxkMTIKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKK2FybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmU6CisgICAgVlNIUi5VOCAgZDE5LGQwLCMyCisgICAgVkFERC5JOCAgZDE5LGQxOSxkMTUKKyAgICBWQURETC5VOCBxMTAsZDgsZDQKKyAgICBWQURELkk4ICBkMTksZDE5LGQxNQorICAgIFZBRERMLlU4IHExMSxkNixkOQorICAgIFZBRERXLlU4IHExMixxMTAsZDUKKyAgICBWQ0dULlU4ICBkMTksZDE5LGQxMworICAgIFZTSFIuVTE2IHExMSxxMTEsIzEKKyAgICBWSEFERC5VMTYgcTExLHExMixxMTEKKyAgICBWQUREVy5VOCBxMTIscTEyLGQ2CisgICAgVkFEREwuVTggcTEzLGQ3LGQ2CisgICAgVkFORCAgICAgZDE3LGQxNyxkMTkKKyAgICBWSEFERC5VOCBkMjgsZDQsZDkKKyAgICBWU1JBLlUxNiBxMTMscTEyLCMxCisgICAgVkFORCAgICAgZDEyLGQxMixkMTkKKyAgICBWUVJTSFJOLlUxNiBkMjkscTExLCMxCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDUKKyAgICBWUVJTSFJOLlUxNiBkMzAscTEyLCMyCisgICAgVkFEREwuVTggcTExLGQxMCxkNQorICAgIFZBRERXLlU4IHExMixxMTAsZDkKKyAgICBWQklGICAgICBkMjksZDI4LGQxNworICAgIFZRUlNIUk4uVTE2IGQzMSxxMTMsIzIKKyAgICBWQURETC5VOCBxMTMsZDExLGQxMAorICAgIFZTSFIuVTE2IHExMSxxMTEsIzEKKyAgICBWSEFERC5VMTYgcTExLHExMixxMTEKKyAgICBWQUREVy5VOCBxMTIscTEyLGQxMAorICAgIFZIQURELlU4IGQyOCxkOCxkNQorICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKKyAgICBWQklGICAgICBkMzAsZDUsZDE3CisgICAgVlNSQS5VMTYgcTEzLHExMiwjMQorICAgIFZRUlNIUk4uVTE2IGQyNSxxMTIsIzIKKyAgICBWUVJTSFJOLlUxNiBkMjQscTExLCMxCisgICAgVlJIQURELlU4IGQyMixkMjgsZDkKKyAgICBWQklGICAgICBkMjUsZDksZDEyCisgICAgVkJJRiAgICAgZDMxLGQ2LGQxNworICAgIFZCSUYgICAgIGQyNCxkMjIsZDEyCisgICAgVlFSU0hSTi5VMTYgZDI4LHExMywjMgorICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKKyAgICBWQklGICAgICBkMjgsZDEwLGQxMgorICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXJfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OGJkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcl9zLlMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfRGVjb2RlQ29lZmZzVG9QYWlyCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0RlY29kZUNvZWZmc1RvUGFpcgorYXJtVkNNNFAxMF9EZWNvZGVDb2VmZnNUb1BhaXI6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBTVUIgICAgICBzcCxzcCwjMHg0MAorICAgIExEUiAgICAgIHIxMCxbcjAsIzBdCisgICAgTERSICAgICAgcjEyLFtyMSwjMF0KKyAgICBMRFIgICAgICByNiwgPWFybVZDTTRQMTBfQ0FWTENDb2VmZlRva2VuVGFibGVzCisgICAgTERSICAgICAgcjQsW3NwLCMweDY4XQorICAgIExEUkIgICAgIHI5LFtyMTAsIzJdCisgICAgTERSQiAgICAgcjgsW3IxMCwjMV0KKyAgICBMRFJCICAgICByMTEsW3IxMF0sIzMKKyAgICBBREQgICAgICByMTIscjEyLCM4CisgICAgTERSICAgICAgcjYsW3I2LHI0LExTTCAjMl0KKyAgICBPUlIgICAgICByOSxyOSxyOCxMU0wgIzgKKyAgICBPUlIgICAgICByMTEscjkscjExLExTTCAjMTYKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgTU9WUyAgICAgcjcsIzB4MWUKKyAgICBBTkQgICAgICByNyxyNyxyOCxMU1IgIzI3CisgICAgU1VCUyAgICAgcjEyLHIxMiwjOAorTDB4NDQ6CisgICAgQkNDICAgICAgTDEKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDE6CisgICAgTERSSCAgICAgcjcsW3I2LHI3XQorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBBREQgICAgICByMTIscjEyLCM0CisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBMU1JTICAgICByOCxyNywjMQorICAgIEJDUyAgICAgIEwweDc0CisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIFNVQlMgICAgIHIxMixyMTIsIzB4YQorICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKKyAgICBCSUMgICAgICByNyxyNywjMQorICAgIEIgICAgICAgIEwweDQ0CitMMHg3NDoKKyAgICBTVUIgICAgICByMTIscjEyLHI3LExTUiAjMTMKKyAgICBCSUMgICAgICByNyxyOCwjMHhmMDAwCisgICAgTFNSUyAgICAgcjUscjcsIzIKKyAgICBTVFJCICAgICByNSxbcjIsIzBdCisgICAgQkVRICAgICAgTDB4MzQ0CisgICAgQ01QICAgICAgcjcsIzB4NDQKKyAgICBCR0UgICAgICBMMHgzM2MKKyAgICBTVFIgICAgICByMCxbc3AsIzBdCisgICAgU1RSICAgICAgcjEsW3NwLCM0XQorICAgIFNUUiAgICAgIHIzLFtzcCwjOF0KKyAgICBBTkRTICAgICByMSxyNywjMworICAgIEFERCAgICAgIHIyLHNwLCMweGMKKyAgICBCRVEgICAgICBMMHhkOAorICAgIE1PViAgICAgIHIwLHIxCitMMHhhYzoKKyAgICBMU0xTICAgICByNyxyMTEscjEyCisgICAgU1VCUyAgICAgcjEyLHIxMiwjNworICAgIEJDQyAgICAgIEwyCisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKK0wyOgorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBMU1IgICAgICByNyxyNywjMzEKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIFNVQlMgICAgIHIwLHIwLCMxCisgICAgTU9WICAgICAgcjgsIzEKKyAgICBTVUIgICAgICByOCxyOCxyNyxMU0wgIzEKKyAgICBTVFJIICAgICByOCxbcjJdLCMyCisgICAgQkdUICAgICAgTDB4YWMKK0wweGQ4OgorICAgIFNVQlMgICAgIHIwLHI1LHIxCisgICAgQkVRICAgICAgTDB4MWI4CisgICAgTU9WICAgICAgcjQsIzEKKyAgICBDTVAgICAgICByNSwjMHhhCisgICAgTU9WTEUgICAgcjQsIzAKKyAgICBDTVAgICAgICByMSwjMworICAgIE1PVkxUICAgIHIxLCM0CisgICAgTU9WR0UgICAgcjEsIzIKKyAgICBNT1ZHRSAgICByNCwjMAorTDB4ZmM6CisgICAgTFNMUyAgICAgcjcscjExLHIxMgorICAgIENMWiAgICAgIHI3LHI3CisgICAgQUREICAgICAgcjEyLHIxMixyNworICAgIFNVQlMgICAgIHIxMixyMTIsIzcKKyAgICBCQ0MgICAgICBMMworICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCisgICAgT1JSICAgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBTVUJTICAgICByMTIscjEyLCM4CisgICAgQkNDICAgICAgTDMKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDM6CisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIE9SUkNTICAgIHIxMSxyOCxyMTEsTFNMICM4CisgICAgQ01QICAgICAgcjcsIzB4MTAKKyAgICBCR0UgICAgICBMMHgzM2MKKyAgICBNT1ZTICAgICBscixyNAorICAgIFRFUUVRICAgIHI3LCMweGUKKyAgICBNT1ZFUSAgICBsciwjNAorICAgIFRFUSAgICAgIHI3LCMweGYKKyAgICBNT1ZFUSAgICBsciwjMHhjCisgICAgVEVRRVEgICAgcjQsIzAKKyAgICBBRERFUSAgICByNyxyNywjMHhmCisgICAgVEVRICAgICAgbHIsIzAKKyAgICBCRVEgICAgICBMMHgxODQKKyAgICBMU0wgICAgICByMyxyMTEscjEyCisgICAgQUREICAgICAgcjEyLHIxMixscgorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBSU0IgICAgICByOSxsciwjMHgyMAorICAgIEJDQyAgICAgIEw0CisgICAgTERSQiAgICAgcjgsW3IxMF0sIzEKKyAgICBPUlIgICAgICByMTEscjgscjExLExTTCAjOAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBCQ0MgICAgICBMNAorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMNDoKKyAgICBBRERDQyAgICByMTIscjEyLCM4CisgICAgTFNSICAgICAgcjMscjMscjkKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIExTTCAgICAgIHI3LHI3LHI0CisgICAgQUREICAgICAgcjcscjMscjcKK0wweDE4NDoKKyAgICBBREQgICAgICByNyxyNyxyMQorICAgIE1PViAgICAgIHIxLCMyCisgICAgTFNSUyAgICAgcjgscjcsIzEKKyAgICBSU0JDUyAgICByOCxyOCwjMAorICAgIFNUUkggICAgIHI4LFtyMl0sIzIKKyAgICBMRFIgICAgICByOSwgPWFybVZDTTRQMTBfU3VmZml4VG9MZXZlbAorICAgIExEUlNCICAgIHI4LFtyOSxyNF0KKyAgICBURVEgICAgICByNCwjMAorICAgIE1PVkVRICAgIHI0LCMxCisgICAgQ01QICAgICAgcjcscjgKKyAgICBBRERDUyAgICByNCxyNCwjMQorICAgIFNVQlMgICAgIHIwLHIwLCMxCisgICAgQkdUICAgICAgTDB4ZmMKK0wweDFiODoKKyAgICBMRFIgICAgICByOCxbc3AsIzB4NmNdCisgICAgU1VCICAgICAgcjAscjUsIzEKKyAgICBTVUJTICAgICByMSxyOCxyNQorICAgIEFERCAgICAgIHI0LHNwLCMweDJjCisgICAgTU9WICAgICAgbHIscjUKKyAgICBTVUIgICAgICBscixsciwjMQorICAgIEJFUSAgICAgIEwweDJiMAorICAgIFRFUSAgICAgIHI4LCM0CisgICAgTERSRVEgICAgcjYsID0oYXJtVkNNNFAxMF9DQVZMQ1RvdGFsWmVyb3MyeDJUYWJsZXMgLSA0KQorICAgIExEUk5FICAgIHI2LCA9KGFybVZDTTRQMTBfQ0FWTENUb3RhbFplcm9UYWJsZXMgLSA0KQorICAgIExEUiAgICAgIHI2LFtyNixyNSxMU0wgIzJdCisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIE1PVlMgICAgIHI3LCMweDFlCisgICAgQU5EICAgICAgcjcscjcscjgsTFNSICMyNworICAgIFNVQlMgICAgIHIxMixyMTIsIzgKK0wweDFmNDoKKyAgICBCQ0MgICAgICBMNQorICAgIExEUkIgICAgIHI4LFtyMTBdLCMxCitMNToKKyAgICBMRFJIICAgICByNyxbcjYscjddCisgICAgQUREQ0MgICAgcjEyLHIxMiwjOAorICAgIEFERCAgICAgIHIxMixyMTIsIzQKKyAgICBPUlJDUyAgICByMTEscjgscjExLExTTCAjOAorICAgIExTUlMgICAgIHI4LHI3LCMxCisgICAgQkNTICAgICAgTDB4MjI0CisgICAgTFNMUyAgICAgcjgscjExLHIxMgorICAgIFNVQlMgICAgIHIxMixyMTIsIzB4YQorICAgIEFERCAgICAgIHI3LHI3LHI4LExTUiAjMjkKKyAgICBCSUMgICAgICByNyxyNywjMQorICAgIEIgICAgICAgIEwweDFmNAorTDB4MjI0OgorICAgIFNVQiAgICAgIHIxMixyMTIscjcsTFNSICMxMworICAgIEJJQyAgICAgIHI3LHI4LCMweGYwMDAKKyAgICBDTVAgICAgICByNywjMHgxMAorICAgIEJHRSAgICAgIEwweDMzYworICAgIExEUiAgICAgIHIzLCA9KGFybVZDTTRQMTBfQ0FWTENSdW5CZWZvcmVUYWJsZXMgLSA0KQorICAgIEFERCAgICAgIHI0LHNwLCMweDJjCisgICAgTU9WUyAgICAgcjEscjcKKyAgICBBREQgICAgICBscixscixyMQorICAgIEJFUSAgICAgIEwweDJiMAorTDB4MjQ4OgorICAgIFNVQlMgICAgIHIwLHIwLCMxCisgICAgTERSICAgICAgcjYsW3IzLHIxLExTTCAjMl0KKyAgICBCTFQgICAgICBMMHgyYmMKKyAgICBMU0xTICAgICByOCxyMTEscjEyCisgICAgTU9WUyAgICAgcjcsIzB4ZQorICAgIEFORCAgICAgIHI3LHI3LHI4LExTUiAjMjgKKyAgICBTVUJTICAgICByMTIscjEyLCM4CitMMHgyNjQ6CisgICAgQkNDICAgICAgTDYKKyAgICBMRFJCICAgICByOCxbcjEwXSwjMQorTDY6CisgICAgTERSSCAgICAgcjcsW3I2LHI3XQorICAgIEFERENDICAgIHIxMixyMTIsIzgKKyAgICBBREQgICAgICByMTIscjEyLCMzCisgICAgT1JSQ1MgICAgcjExLHI4LHIxMSxMU0wgIzgKKyAgICBMU1JTICAgICByOCxyNywjMQorICAgIEJDUyAgICAgIEwweDI5NAorICAgIExTTFMgICAgIHI4LHIxMSxyMTIKKyAgICBTVUJTICAgICByMTIscjEyLCM5CisgICAgQUREICAgICAgcjcscjcscjgsTFNSICMyOQorICAgIEJJQyAgICAgIHI3LHI3LCMxCisgICAgQiAgICAgICAgTDB4MjY0CitMMHgyOTQ6CisgICAgU1VCICAgICAgcjEyLHIxMixyNyxMU1IgIzEzCisgICAgQklDICAgICAgcjcscjgsIzB4ZjAwMAorICAgIENNUCAgICAgIHI3LCMweGYKKyAgICBCR0UgICAgICBMMHgzM2MKKyAgICBTVUJTICAgICByMSxyMSxyNworICAgIFNUUkIgICAgIHI3LFtyNF0sIzEKKyAgICBCR1QgICAgICBMMHgyNDgKK0wweDJiMDoKKyAgICBTVUJTICAgICByMCxyMCwjMQorICAgIEJMVCAgICAgIEw3CisgICAgU1RSQiAgICAgcjEsW3I0XSwjMQorTDc6CisgICAgQkdUICAgICAgTDB4MmIwCitMMHgyYmM6CisgICAgU1RSQiAgICAgcjEsW3I0XSwjMQorICAgIExEUiAgICAgIHI4LFtzcCwjMHg2Y10KKyAgICBURVEgICAgICByOCwjMHhmCisgICAgQURERVEgICAgbHIsbHIsIzEKKyAgICBTVUIgICAgICByNCxyNCxyNQorICAgIFNVQiAgICAgIHIyLHIyLHI1CisgICAgU1VCICAgICAgcjIscjIscjUKKyAgICBMRFIgICAgICByMyxbc3AsIzhdCisgICAgTERSICAgICAgcjAsW3IzLCMwXQorICAgIFRFUSAgICAgIHI4LCM0CisgICAgTERSRVEgICAgcjYsID1hcm1WQ000UDEwX1ppZ1phZ18yeDIKKyAgICBMRFJORSAgICByNiwgPWFybVZDTTRQMTBfWmlnWmFnXzR4NAorTDB4MmVjOgorICAgIExEUkIgICAgIHI5LFtyNF0sIzEKKyAgICBMRFJCICAgICByOCxbcjYsbHJdCisgICAgU1VCICAgICAgbHIsbHIsIzEKKyAgICBTVUIgICAgICBscixscixyOQorICAgIExEUlNIICAgIHI5LFtyMl0sIzIKKyAgICBTVUJTICAgICByNSxyNSwjMQorICAgIE9SUkVRICAgIHI4LHI4LCMweDIwCisgICAgQUREICAgICAgcjEscjksIzB4ODAKKyAgICBDTVAgICAgICByMSwjMHgxMDAKKyAgICBPUlJDUyAgICByOCxyOCwjMHgxMAorICAgIFRFUSAgICAgIHI1LCMwCisgICAgU1RSQiAgICAgcjgsW3IwXSwjMQorICAgIFNUUkIgICAgIHI5LFtyMF0sIzEKKyAgICBMU1IgICAgICByOSxyOSwjOAorICAgIEJDQyAgICAgIEw4CisgICAgU1RSQiAgICAgcjksW3IwXSwjMQorTDg6CisgICAgQk5FICAgICAgTDB4MmVjCisgICAgU1RSICAgICAgcjAsW3IzLCMwXQorICAgIExEUiAgICAgIHIwLFtzcCwjMF0KKyAgICBMRFIgICAgICByMSxbc3AsIzRdCisgICAgQiAgICAgICAgTDB4MzQ0CitMMHgzM2M6CisgICAgTVZOICAgICAgcjAsIzEKKyAgICBCICAgICAgICBMMHgzNWMKK0wweDM0NDoKKyAgICBBREQgICAgICByMTAscjEwLHIxMixMU1IgIzMKKyAgICBBTkQgICAgICByMTIscjEyLCM3CisgICAgU1VCICAgICAgcjEwLHIxMCwjNAorICAgIFNUUiAgICAgIHIxMixbcjEsIzBdCisgICAgU1RSICAgICAgcjEwLFtyMCwjMF0KKyAgICBNT1YgICAgICByMCwjMAorTDB4MzVjOgorICAgIEFERCAgICAgIHNwLHNwLCMweDQwCisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0RlcXVhbnRUYWJsZXNfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGViNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9EZXF1YW50VGFibGVzX3MuUwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1Bvc1RvVkNvbDR4NAorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDIKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVk1hdHJpeAorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1ZNYXRyaXhVMTYKKworYXJtVkNNNFAxMF9Qb3NUb1ZDb2w0eDQ6CisgICAgLmJ5dGUgIDAsIDIsIDAsIDIKKyAgICAuYnl0ZSAgMiwgMSwgMiwgMQorICAgIC5ieXRlICAwLCAyLCAwLCAyCisgICAgLmJ5dGUgIDIsIDEsIDIsIDEKKworYXJtVkNNNFAxMF9Qb3NUb1ZDb2wyeDI6CisgICAgLmJ5dGUgIDAsIDIKKyAgICAuYnl0ZSAgMiwgMQorCithcm1WQ000UDEwX1ZNYXRyaXg6CisgICAgLmJ5dGUgIDEwLCAxNiwgMTMKKyAgICAuYnl0ZSAgMTEsIDE4LCAxNAorICAgIC5ieXRlICAxMywgMjAsIDE2CisgICAgLmJ5dGUgIDE0LCAyMywgMTgKKyAgICAuYnl0ZSAgMTYsIDI1LCAyMAorICAgIC5ieXRlICAxOCwgMjksIDIzCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBbKElOVCkoUVAvNildLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1FQRGl2VGFibGU6CisgICAgLmJ5dGUgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorICAgIC5ieXRlICAxLCAgMSwgIDEsICAxLCAgMSwgIDEKKyAgICAuYnl0ZSAgMiwgIDIsICAyLCAgMiwgIDIsICAyCisgICAgLmJ5dGUgIDMsICAzLCAgMywgIDMsICAzLCAgMworICAgIC5ieXRlICA0LCAgNCwgIDQsICA0LCAgNCwgIDQKKyAgICAuYnl0ZSAgNSwgIDUsICA1LCAgNSwgIDUsICA1CisgICAgLmJ5dGUgIDYsICA2LCAgNiwgIDYsICA2LCAgNgorICAgIC5ieXRlICA3LCAgNywgIDcsICA3LCAgNywgIDcKKyAgICAuYnl0ZSAgOCwgIDgsICA4LCAgOCwgIDgsICA4CisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfVk1hdHJpeFtRUCU2XVswXSBlbnRpcmVzLAorOy8vIGZvciB2YWx1ZXMgb2YgUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlOgorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorICAgIC5ieXRlIDEwLCAxMSwgMTMsIDE0LCAxNiwgMTgKKyAgICAuYnl0ZSAxMCwgMTEsIDEzLCAxNCwgMTYsIDE4CisgICAgLmJ5dGUgMTAsIDExLCAxMywgMTQsIDE2LCAxOAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBldmFsdWF0ZXMgdGhlIG1vZHVsdXMgZXhwcmVzc2lvbiBbUVAlNl0qNiwKKzsvLyBmb3IgdmFsdWVzIG9mIFFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9RUE1vZHVsb1RhYmxlOgorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorICAgIC5ieXRlIDAsIDYsIDEyLCAxOCwgMjQsIDMwCisgICAgLmJ5dGUgMCwgNiwgMTIsIDE4LCAyNCwgMzAKKyAgICAuYnl0ZSAwLCA2LCAxMiwgMTgsIDI0LCAzMAorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Ly8gVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW52aWR1YWwgYnl0ZSB2YWx1ZXMgc3RvcmVkIGFzCis7Ly8gaGFsZndvcmRzLiBUaGlzIGF2b2lkcyB1bnBhY2tpbmcgaW5zaWRlIHRoZSBmdW5jdGlvbgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithcm1WQ000UDEwX1ZNYXRyaXhVMTY6CisgICAgLmh3b3JkIDEwLCAxNiwgMTMKKyAgICAuaHdvcmQgMTEsIDE4LCAxNAorICAgIC5od29yZCAxMywgMjAsIDE2CisgICAgLmh3b3JkIDE0LCAyMywgMTgKKyAgICAuaHdvcmQgMTYsIDI1LCAyMAorICAgIC5od29yZCAxOCwgMjksIDIzCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0FsaWduX3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YmM2OWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9BbGlnbl91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JBbGlnbjl4X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yQWxpZ245eF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckFsaWduOXhfdW5zYWZlOgorICAgIE1PViAgICAgIHIxMixyOAorICAgIEFORCAgICAgIHI3LHIwLCMzCisgICAgQklDICAgICAgcjAscjAsIzMKKyAgICBBREQgICAgICBwYyxwYyxyNyxMU0wgIzIKKyAgICBOT1AKKyAgICBCICAgICAgICBDb3B5MHRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHkxdG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weTJ0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5M3RvQWxpZ25lZAorQ29weTB0b0FsaWduZWQ6CisgICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9CisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBBREQgICAgICByMCxyMCxyMQorICAgIFNUTSAgICAgIHI4ISx7cjcscjEwLHIxMX0KKyAgICBCR1QgICAgICBDb3B5MHRvQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlFbmQKK0NvcHkxdG9BbGlnbmVkOgorICAgIExETSAgICAgIHIwLHtyNyxyMTAscjExfQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgQUREICAgICAgcjAscjAscjEKKyAgICBMU1IgICAgICByNyxyNywjOAorICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzI0CisgICAgTFNSICAgICAgcjEwLHIxMCwjOAorICAgIE9SUiAgICAgIHIxMCxyMTAscjExLExTTCAjMjQKKyAgICBMU1IgICAgICByMTEscjExLCM4CisgICAgU1RNICAgICAgcjghLHtyNyxyMTAscjExfQorICAgIEJHVCAgICAgIENvcHkxdG9BbGlnbmVkCisgICAgQiAgICAgICAgQ29weUVuZAorQ29weTJ0b0FsaWduZWQ6CisgICAgTERNICAgICAgcjAse3I3LHIxMCxyMTF9CisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBBREQgICAgICByMCxyMCxyMQorICAgIExTUiAgICAgIHI3LHI3LCMxNgorICAgIE9SUiAgICAgIHI3LHI3LHIxMCxMU0wgIzE2CisgICAgTFNSICAgICAgcjEwLHIxMCwjMTYKKyAgICBPUlIgICAgICByMTAscjEwLHIxMSxMU0wgIzE2CisgICAgTFNSICAgICAgcjExLHIxMSwjMTYKKyAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9CisgICAgQkdUICAgICAgQ29weTJ0b0FsaWduZWQKKyAgICBCICAgICAgICBDb3B5RW5kCitDb3B5M3RvQWxpZ25lZDoKKyAgICBMRE0gICAgICByMCx7cjcscjEwLHIxMX0KKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIEFERCAgICAgIHIwLHIwLHIxCisgICAgTFNSICAgICAgcjcscjcsIzI0CisgICAgT1JSICAgICAgcjcscjcscjEwLExTTCAjOAorICAgIExTUiAgICAgIHIxMCxyMTAsIzI0CisgICAgT1JSICAgICAgcjEwLHIxMCxyMTEsTFNMICM4CisgICAgTFNSICAgICAgcjExLHIxMSwjMjQKKyAgICBTVE0gICAgICByOCEse3I3LHIxMCxyMTF9CisgICAgQkdUICAgICAgQ29weTN0b0FsaWduZWQKK0NvcHlFbmQ6CisgICAgTU9WICAgICAgcjAscjEyCisgICAgTU9WICAgICAgcjEsIzB4YworICAgIEJYICAgICAgIGxyCisgICAgLmVuZGZ1bmMKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyQWxpZ240eF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckFsaWduNHhfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJBbGlnbjR4X3Vuc2FmZToKKyAgICBBTkQgICAgICByNyxyMCwjMworICAgIEJJQyAgICAgIHIwLHIwLCMzCisgICAgQUREICAgICAgcGMscGMscjcsTFNMICMyCisgICAgTk9QCisgICAgQiAgICAgICAgQ29weTB0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weTF0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weTN0b1ZBbGlnbmVkCitDb3B5MHRvVkFsaWduZWQ6CisgICAgTERSICAgICAgcjcsW3IwXSxyMQorICAgIFNVQlMgICAgIHI5LHI5LCMxCisgICAgU1RSICAgICAgcjcsW3I4XSwjNAorICAgIEJHVCAgICAgIENvcHkwdG9WQWxpZ25lZAorICAgIEIgICAgICAgIENvcHlWRW5kCitDb3B5MXRvVkFsaWduZWQ6CisgICAgTERSICAgICAgcjEwLFtyMCwjNF0KKyAgICBMRFIgICAgICByNyxbcjBdLHIxCisgICAgU1VCUyAgICAgcjkscjksIzEKKyAgICBMU0wgICAgICByMTAscjEwLCMyNAorICAgIE9SUiAgICAgIHI3LHIxMCxyNyxMU1IgIzgKKyAgICBTVFIgICAgICByNyxbcjhdLCM0CisgICAgQkdUICAgICAgQ29weTF0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weVZFbmQKK0NvcHkydG9WQWxpZ25lZDoKKyAgICBMRFIgICAgICByMTAsW3IwLCM0XQorICAgIExEUiAgICAgIHI3LFtyMF0scjEKKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIExTTCAgICAgIHIxMCxyMTAsIzE2CisgICAgT1JSICAgICAgcjcscjEwLHI3LExTUiAjMTYKKyAgICBTVFIgICAgICByNyxbcjhdLCM0CisgICAgQkdUICAgICAgQ29weTJ0b1ZBbGlnbmVkCisgICAgQiAgICAgICAgQ29weVZFbmQKK0NvcHkzdG9WQWxpZ25lZDoKKyAgICBMRFIgICAgICByMTAsW3IwLCM0XQorICAgIExEUiAgICAgIHI3LFtyMF0scjEKKyAgICBTVUJTICAgICByOSxyOSwjMQorICAgIExTTCAgICAgIHIxMCxyMTAsIzgKKyAgICBPUlIgICAgICByNyxyMTAscjcsTFNSICMyNAorICAgIFNUUiAgICAgIHI3LFtyOF0sIzQKKyAgICBCR1QgICAgICBDb3B5M3RvVkFsaWduZWQKK0NvcHlWRW5kOgorICAgIFNVQiAgICAgIHIwLHI4LCMweDFjCisgICAgTU9WICAgICAgcjEsIzQKKyAgICBCWCAgICAgICBscgorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHlfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkyMjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weV91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Db3B5NHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfQ29weTR4NF91bnNhZmUKK2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0NvcHk0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBBTkQgICAgICByMTIscjAsIzMKKyAgICBCSUMgICAgICByMCxyMCwjMworICAgIEFERCAgICAgIHBjLHBjLHIxMixMU0wgIzIKKyAgICBOT1AKKyAgICBCICAgICAgICBDb3B5NHg0QWxpZ24wCisgICAgQiAgICAgICAgQ29weTR4NEFsaWduMQorICAgIEIgICAgICAgIENvcHk0eDRBbGlnbjIKKyAgICBCICAgICAgICBDb3B5NHg0QWxpZ24zCitDb3B5NHg0QWxpZ24wOgorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByNSxbcjBdLHIxCisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBTVFIgICAgICByNSxbcjJdLHIzCisgICAgTERSICAgICAgcjksW3IwXSxyMQorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBTVFIgICAgICByOSxbcjJdLHIzCisgICAgQiAgICAgICAgQ29weTR4NEVuZAorQ29weTR4NEFsaWduMToKKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzgKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzI0CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCM4CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICMyNAorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIExEUiAgICAgIHI5LFtyMCwjNF0KKyAgICBMRFIgICAgICByOCxbcjBdLHIxCisgICAgTFNSICAgICAgcjQscjQsIzgKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzI0CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCM4CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICMyNAorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBCICAgICAgICBDb3B5NHg0RW5kCitDb3B5NHg0QWxpZ24yOgorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjMTYKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzE2CisgICAgU1RSICAgICAgcjQsW3IyXSxyMworICAgIExTUiAgICAgIHI4LHI4LCMxNgorICAgIE9SUiAgICAgIHI4LHI4LHI5LExTTCAjMTYKKyAgICBTVFIgICAgICByOCxbcjJdLHIzCisgICAgTERSICAgICAgcjUsW3IwLCM0XQorICAgIExEUiAgICAgIHI0LFtyMF0scjEKKyAgICBMRFIgICAgICByOSxbcjAsIzRdCisgICAgTERSICAgICAgcjgsW3IwXSxyMQorICAgIExTUiAgICAgIHI0LHI0LCMxNgorICAgIE9SUiAgICAgIHI0LHI0LHI1LExTTCAjMTYKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzE2CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICMxNgorICAgIFNUUiAgICAgIHI4LFtyMl0scjMKKyAgICBCICAgICAgICBDb3B5NHg0RW5kCitDb3B5NHg0QWxpZ24zOgorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjMjQKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzgKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzI0CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICM4CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgTERSICAgICAgcjksW3IwLCM0XQorICAgIExEUiAgICAgIHI4LFtyMF0scjEKKyAgICBMU1IgICAgICByNCxyNCwjMjQKKyAgICBPUlIgICAgICByNCxyNCxyNSxMU0wgIzgKKyAgICBTVFIgICAgICByNCxbcjJdLHIzCisgICAgTFNSICAgICAgcjgscjgsIzI0CisgICAgT1JSICAgICAgcjgscjgscjksTFNMICM4CisgICAgU1RSICAgICAgcjgsW3IyXSxyMworQ29weTR4NEVuZDoKKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfRGlhZ0NvcHlfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0YWJlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0RpYWdDb3B5X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hvckRpYWdDb3B5X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSG9yRGlhZ0NvcHlfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9Ib3JEaWFnQ29weV91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIE1PViAgICAgIGxyLCM0CisgICAgTERSICAgICAgcjYsID0weGZlMDBmZTAKKyAgICBMRFIgICAgICByMTIsID0weGZmMDBmZgorTG9vcFN0YXJ0MToKKyAgICBMRFIgICAgICByMTEsW3IwLCMweGNdCisgICAgTERSICAgICAgcjEwLFtyMCwjOF0KKyAgICBMRFIgICAgICByNSxbcjAsIzRdCisgICAgTERSICAgICAgcjQsW3IwXSxyMQorICAgIFVRU1VCMTYgIHIxMSxyMTEscjYKKyAgICBVUVNVQjE2ICByMTAscjEwLHI2CisgICAgVVFTVUIxNiAgcjUscjUscjYKKyAgICBVUVNVQjE2ICByNCxyNCxyNgorICAgIFVTQVQxNiAgIHIxMSwjMTMscjExCisgICAgVVNBVDE2ICAgcjEwLCMxMyxyMTAKKyAgICBVU0FUMTYgICByNSwjMTMscjUKKyAgICBVU0FUMTYgICByNCwjMTMscjQKKyAgICBBTkQgICAgICByMTEscjEyLHIxMSxMU1IgIzUKKyAgICBBTkQgICAgICByMTAscjEyLHIxMCxMU1IgIzUKKyAgICBBTkQgICAgICByNSxyMTIscjUsTFNSICM1CisgICAgQU5EICAgICAgcjQscjEyLHI0LExTUiAjNQorICAgIE9SUiAgICAgIHIxMSxyMTAscjExLExTTCAjOAorICAgIE9SUiAgICAgIHIxMCxyNCxyNSxMU0wgIzgKKyAgICBTVUJTICAgICBscixsciwjMQorICAgIFNUUkQgICAgIHIxMCxyMTEsW3I3XSwjOAorICAgIEJHVCAgICAgIExvb3BTdGFydDEKKyAgICBTVUIgICAgICByMCxyNywjMHgyMAorICAgIE1PViAgICAgIHIxLCM4CisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX1ZlckRpYWdDb3B5X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfVmVyRGlhZ0NvcHlfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9WZXJEaWFnQ29weV91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIExEUiAgICAgIHI2LCA9MHhmZTAwZmUwCisgICAgTERSICAgICAgcjEyLCA9MHhmZjAwZmYKKyAgICBNT1YgICAgICBsciwjMgorTG9vcFN0YXJ0OgorICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KKyAgICBMRFIgICAgICByMTAsW3IwLCM4XQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgVVFTVUIxNiAgcjExLHIxMSxyNgorICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKKyAgICBVUVNVQjE2ICByNSxyNSxyNgorICAgIFVRU1VCMTYgIHI0LHI0LHI2CisgICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKKyAgICBVU0FUMTYgICByMTAsIzEzLHIxMAorICAgIFVTQVQxNiAgIHI1LCMxMyxyNQorICAgIFVTQVQxNiAgIHI0LCMxMyxyNAorICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQorICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQorICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKKyAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1CisgICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4CisgICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAorICAgIFBLSEJUICAgIHI0LHIxMCxyMTEsTFNMICMxNgorICAgIFNUUiAgICAgIHI0LFtyN10sIzgKKyAgICBQS0hUQiAgICByNSxyMTEscjEwLEFTUiAjMTYKKyAgICBTVFIgICAgICByNSxbcjddLCMtNAorICAgIExEUiAgICAgIHIxMSxbcjAsIzB4Y10KKyAgICBMRFIgICAgICByMTAsW3IwLCM4XQorICAgIExEUiAgICAgIHI1LFtyMCwjNF0KKyAgICBMRFIgICAgICByNCxbcjBdLHIxCisgICAgVVFTVUIxNiAgcjExLHIxMSxyNgorICAgIFVRU1VCMTYgIHIxMCxyMTAscjYKKyAgICBVUVNVQjE2ICByNSxyNSxyNgorICAgIFVRU1VCMTYgIHI0LHI0LHI2CisgICAgVVNBVDE2ICAgcjExLCMxMyxyMTEKKyAgICBVU0FUMTYgICByMTAsIzEzLHIxMAorICAgIFVTQVQxNiAgIHI1LCMxMyxyNQorICAgIFVTQVQxNiAgIHI0LCMxMyxyNAorICAgIEFORCAgICAgIHIxMSxyMTIscjExLExTUiAjNQorICAgIEFORCAgICAgIHIxMCxyMTIscjEwLExTUiAjNQorICAgIEFORCAgICAgIHI1LHIxMixyNSxMU1IgIzUKKyAgICBBTkQgICAgICByNCxyMTIscjQsTFNSICM1CisgICAgT1JSICAgICAgcjExLHIxMCxyMTEsTFNMICM4CisgICAgT1JSICAgICAgcjEwLHI0LHI1LExTTCAjOAorICAgIFBLSEJUICAgIHI0LHIxMCxyMTEsTFNMICMxNgorICAgIFNVQlMgICAgIGxyLGxyLCMxCisgICAgU1RSICAgICAgcjQsW3I3XSwjOAorICAgIFBLSFRCICAgIHI1LHIxMSxyMTAsQVNSICMxNgorICAgIFNUUiAgICAgIHI1LFtyN10sIzQKKyAgICBCR1QgICAgICBMb29wU3RhcnQKKyAgICBTVUIgICAgICByMCxyNywjMHgxOAorICAgIE1PViAgICAgIHIxLCM0CisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzA5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmVfcy5TCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdIb3JWZXI0eDRfdW5zYWZlOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVk1PVi5JMTYgZDMxLCMweDE0CisgICAgVk1PVi5JMTYgZDMwLCMweDUKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHE1LGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVk1MQS5JMTYgZDEwLGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTYsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMTAsZDEwLGQ4CisgICAgVk1MQS5JMTYgZDEyLGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTcsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMTIsZDEyLGQ4CisgICAgVk1MQS5JMTYgZDE0LGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTgsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMTQsZDE0LGQ4CisgICAgVk1MQS5JMTYgZDE2LGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTksZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMTYsZDE2LGQ4CisgICAgVk1MQS5JMTYgZDE4LGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTEwLGQwLGQxCisgICAgVkxEMS44ICAge2QwLGQxfSxbcjBdLHIxCisgICAgVlNVQi5JMTYgZDE4LGQxOCxkOAorICAgIFZNTEEuSTE2IGQyMCxkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWRVhULjggICBkNCxkMCxkMSwjMQorICAgIFZFWFQuOCAgIGQyLGQwLGQxLCMyCisgICAgVkVYVC44ICAgZDMsZDAsZDEsIzMKKyAgICBWRVhULjggICBkNSxkMCxkMSwjNAorICAgIFZFWFQuOCAgIGQxLGQwLGQxLCM1CisgICAgVkFEREwuVTggcTEsZDIsZDMKKyAgICBWQURETC5VOCBxMixkNCxkNQorICAgIFZBRERMLlU4IHExMSxkMCxkMQorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IwXSxyMQorICAgIFZTVUIuSTE2IGQyMCxkMjAsZDgKKyAgICBWTUxBLkkxNiBkMjIsZDIsZDMxCisgICAgVk1VTC5JMTYgZDgsZDQsZDMwCisgICAgVkVYVC44ICAgZDQsZDAsZDEsIzEKKyAgICBWRVhULjggICBkMixkMCxkMSwjMgorICAgIFZFWFQuOCAgIGQzLGQwLGQxLCMzCisgICAgVkVYVC44ICAgZDUsZDAsZDEsIzQKKyAgICBWRVhULjggICBkMSxkMCxkMSwjNQorICAgIFZBRERMLlU4IHExLGQyLGQzCisgICAgVkFEREwuVTggcTIsZDQsZDUKKyAgICBWQURETC5VOCBxMTIsZDAsZDEKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBWU1VCLkkxNiBkMjIsZDIyLGQ4CisgICAgVk1MQS5JMTYgZDI0LGQyLGQzMQorICAgIFZNVUwuSTE2IGQ4LGQ0LGQzMAorICAgIFZFWFQuOCAgIGQ0LGQwLGQxLCMxCisgICAgVkVYVC44ICAgZDIsZDAsZDEsIzIKKyAgICBWRVhULjggICBkMyxkMCxkMSwjMworICAgIFZFWFQuOCAgIGQ1LGQwLGQxLCM0CisgICAgVkVYVC44ICAgZDEsZDAsZDEsIzUKKyAgICBWQURETC5VOCBxMSxkMixkMworICAgIFZBRERMLlU4IHEyLGQ0LGQ1CisgICAgVkFEREwuVTggcTEzLGQwLGQxCisgICAgVlNVQi5JMTYgZDI0LGQyNCxkOAorICAgIFZNTEEuSTE2IGQyNixkMixkMzEKKyAgICBWTVVMLkkxNiBkOCxkNCxkMzAKKyAgICBWTU9WLkkzMiBxMTUsIzB4MTQKKyAgICBWTU9WLkkzMiBxMTQsIzB4NQorICAgIFZBRERMLlMxNiBxNSxkMTAsZDIwCisgICAgVkFEREwuUzE2IHExLGQxNCxkMTYKKyAgICBWQURETC5TMTYgcTAsZDEyLGQxOAorICAgIFZTVUIuSTE2IGQyNixkMjYsZDgKKyAgICBWTUxBLkkzMiBxNSxxMSxxMTUKKyAgICBWTVVMLkkzMiBxNCxxMCxxMTQKKyAgICBWQURETC5TMTYgcTYsZDEyLGQyMgorICAgIFZBRERMLlMxNiBxMSxkMTYsZDE4CisgICAgVkFEREwuUzE2IHEwLGQxNCxkMjAKKyAgICBWTUxBLkkzMiBxNixxMSxxMTUKKyAgICBWU1VCLkkzMiBxNSxxNSxxNAorICAgIFZNVUwuSTMyIHE0LHEwLHExNAorICAgIFZBRERMLlMxNiBxMixkMTQsZDI0CisgICAgVkFEREwuUzE2IHExLGQxOCxkMjAKKyAgICBWQURETC5TMTYgcTAsZDE2LGQyMgorICAgIFZNTEEuSTMyIHEyLHExLHExNQorICAgIFZTVUIuSTMyIHE2LHE2LHE0CisgICAgVk1VTC5JMzIgcTQscTAscTE0CisgICAgVkFEREwuUzE2IHEzLGQxNixkMjYKKyAgICBWQURETC5TMTYgcTEsZDIwLGQyMgorICAgIFZBRERMLlMxNiBxMCxkMTgsZDI0CisgICAgVk1MQS5JMzIgcTMscTEscTE1CisgICAgVlNVQi5JMzIgcTIscTIscTQKKyAgICBWTUxTLkkzMiBxMyxxMCxxMTQKKyAgICBWUVJTSFJVTi5TMzIgZDAscTUsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQyLHE2LCMxMAorICAgIFZRUlNIUlVOLlMzMiBkNCxxMiwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDYscTMsIzEwCisgICAgVlFNT1ZOLlUxNiBkMCxxMAorICAgIFZRTU9WTi5VMTYgZDIscTEKKyAgICBWUU1PVk4uVTE2IGQ0LHEyCisgICAgVlFNT1ZOLlUxNiBkNixxMworICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxYzMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZV9zLlMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgIC5mdW5jICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCithcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ1ZlckhvcjR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMF0scjEKKyAgICBBREQgICAgICByMTIscjAscjEsTFNMICMyCisgICAgVk1PVi5JOCAgZDMwLCMweDUKKyAgICBWTU9WLkk4ICBkMzEsIzB4MTQKKyAgICBWTEQxLjggICB7ZDEwLGQxMX0sW3IxMl0scjEKKyAgICBWTEQxLjggICB7ZDIsZDN9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDEyLGQxM30sW3IxMl0scjEKKyAgICBWQURETC5VOCBxOSxkMCxkMTAKKyAgICBWTEQxLjggICB7ZDQsZDV9LFtyMF0scjEKKyAgICBWQURETC5VOCBxMCxkMSxkMTEKKyAgICBWTEQxLjggICB7ZDYsZDd9LFtyMF0scjEKKyAgICBWQURETC5VOCBxMTAsZDIsZDEyCisgICAgVkxEMS44ICAge2Q4LGQ5fSxbcjBdLHIxCisgICAgVk1MQUwuVTggcTksZDQsZDMxCisgICAgVkxEMS44ICAge2QxNCxkMTV9LFtyMTJdLHIxCisgICAgVk1MQUwuVTggcTAsZDUsZDMxCisgICAgVkxEMS44ICAge2QxNixkMTd9LFtyMTJdLHIxCisgICAgVk1MQUwuVTggcTksZDYsZDMxCisgICAgVk1MQUwuVTggcTEwLGQ2LGQzMQorICAgIFZNTFNMLlU4IHEwLGQzLGQzMAorICAgIFZBRERMLlU4IHExMSxkNCxkMTQKKyAgICBWTUxTTC5VOCBxOSxkMixkMzAKKyAgICBWQURETC5VOCBxMSxkMyxkMTMKKyAgICBWTUxBTC5VOCBxMCxkNyxkMzEKKyAgICBWTUxBTC5VOCBxMTAsZDgsZDMxCisgICAgVk1MU0wuVTggcTksZDgsZDMwCisgICAgVk1MQUwuVTggcTEsZDcsZDMxCisgICAgVk1MU0wuVTggcTAsZDksZDMwCisgICAgVk1MQUwuVTggcTExLGQ4LGQzMQorICAgIFZNTFNMLlU4IHExMCxkNCxkMzAKKyAgICBWTUxTTC5VOCBxMSxkNSxkMzAKKyAgICBWQURETC5VOCBxMixkNSxkMTUKKyAgICBWTUxBTC5VOCBxMTEsZDEwLGQzMQorICAgIFZNTFNMLlU4IHExMCxkMTAsZDMwCisgICAgVk1MQUwuVTggcTEsZDksZDMxCisgICAgVk1MQUwuVTggcTIsZDksZDMxCisgICAgVkFEREwuVTggcTEyLGQ2LGQxNgorICAgIFZNTFNMLlU4IHExMSxkNixkMzAKKyAgICBWTUxTTC5VOCBxMSxkMTEsZDMwCisgICAgVk1MU0wuVTggcTIsZDcsZDMwCisgICAgVkFEREwuVTggcTMsZDcsZDE3CisgICAgVk1MQUwuVTggcTEyLGQxMCxkMzEKKyAgICBWTUxTTC5VOCBxMTEsZDEyLGQzMAorICAgIFZNTFNMLlU4IHEyLGQxMyxkMzAKKyAgICBWTUxBTC5VOCBxMyxkMTEsZDMxCisgICAgVk1MQUwuVTggcTEyLGQxMixkMzEKKyAgICBWRVhULjggICBkMjYsZDE4LGQxOSwjMgorICAgIFZNTEFMLlU4IHEyLGQxMSxkMzEKKyAgICBWTUxBTC5VOCBxMyxkMTMsZDMxCisgICAgVk1MU0wuVTggcTEyLGQ4LGQzMAorICAgIFZFWFQuOCAgIGQyNyxkMTgsZDE5LCM0CisgICAgVk1PVi5JMTYgZDMxLCMweDE0CisgICAgVk1MU0wuVTggcTMsZDksZDMwCisgICAgVk1MU0wuVTggcTEyLGQxNCxkMzAKKyAgICBWRVhULjggICBkMjksZDE5LGQwLCMyCisgICAgVkVYVC44ICAgZDI4LGQxOCxkMTksIzYKKyAgICBWTUxTTC5VOCBxMyxkMTUsZDMwCisgICAgVkFEREwuUzE2IHEwLGQxOCxkMjkKKyAgICBWQURELkkxNiBkMjcsZDI3LGQyOAorICAgIFZNT1YuSTE2IGQzMCwjMHg1CisgICAgVkFERC5JMTYgZDI2LGQyNixkMTkKKyAgICBWTUxBTC5TMTYgcTAsZDI3LGQzMQorICAgIFZFWFQuOCAgIGQyNyxkMjAsZDIxLCM0CisgICAgVkVYVC44ICAgZDI4LGQyMCxkMjEsIzYKKyAgICBWRVhULjggICBkMjksZDIxLGQyLCMyCisgICAgVk1MU0wuUzE2IHEwLGQyNixkMzAKKyAgICBWRVhULjggICBkMjYsZDIwLGQyMSwjMgorICAgIFZBRERMLlMxNiBxMSxkMjAsZDI5CisgICAgVkFERC5JMTYgZDI3LGQyNyxkMjgKKyAgICBWQURELkkxNiBkMjYsZDI2LGQyMQorICAgIFZFWFQuOCAgIGQyOCxkMjIsZDIzLCM2CisgICAgVk1MQUwuUzE2IHExLGQyNyxkMzEKKyAgICBWRVhULjggICBkMjksZDIzLGQ0LCMyCisgICAgVkVYVC44ICAgZDI3LGQyMixkMjMsIzQKKyAgICBWRVhULjggICBkOCxkMjIsZDIzLCMyCisgICAgVkFEREwuUzE2IHEyLGQyMixkMjkKKyAgICBWTUxTTC5TMTYgcTEsZDI2LGQzMAorICAgIFZBREQuSTE2IGQyNyxkMjcsZDI4CisgICAgVkFERC5JMTYgZDI2LGQ4LGQyMworICAgIFZFWFQuOCAgIGQyOCxkMjQsZDI1LCM2CisgICAgVk1MQUwuUzE2IHEyLGQyNyxkMzEKKyAgICBWRVhULjggICBkMjcsZDI0LGQyNSwjNAorICAgIFZFWFQuOCAgIGQyOSxkMjUsZDYsIzIKKyAgICBWQURELkkxNiBkMjcsZDI3LGQyOAorICAgIFZFWFQuOCAgIGQ4LGQyNCxkMjUsIzIKKyAgICBWQURETC5TMTYgcTMsZDI0LGQyOQorICAgIFZNTFNMLlMxNiBxMixkMjYsZDMwCisgICAgVk1MQUwuUzE2IHEzLGQyNyxkMzEKKyAgICBWQURELkkxNiBkOCxkOCxkMjUKKyAgICBWTUxTTC5TMTYgcTMsZDgsZDMwCisgICAgVlFSU0hSVU4uUzMyIGQwLHEwLCMxMAorICAgIFZRUlNIUlVOLlMzMiBkMixxMSwjMTAKKyAgICBWUVJTSFJVTi5TMzIgZDQscTIsIzEwCisgICAgVlFSU0hSVU4uUzMyIGQ2LHEzLCMxMAorICAgIFZRTU9WTi5VMTYgZDAscTAKKyAgICBWUU1PVk4uVTE2IGQyLHExCisgICAgVlFNT1ZOLlUxNiBkNCxxMgorICAgIFZRTU9WTi5VMTYgZDYscTMKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGUxNDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmVfcy5TCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWTEQxLjggICB7ZDIyLGQyM30sW3IwXSxyMQorICAgIFZFWFQuOCAgIGQxMCxkMjIsZDIzLCM1CisgICAgVkVYVC44ICAgZDEyLGQyMixkMjMsIzEKKyAgICBWRVhULjggICBkMTQsZDIyLGQyMywjMgorICAgIFZFWFQuOCAgIGQxNSxkMjIsZDIzLCMzCisgICAgVkVYVC44ICAgZDEzLGQyMixkMjMsIzQKKyAgICBWQURETC5VOCBxMTEsZDIyLGQxMAorICAgIFZBRERMLlU4IHE0LGQxNCxkMTUKKyAgICBWQURETC5VOCBxNixkMTIsZDEzCisgICAgVkxEMS44ICAge2QyNCxkMjV9LFtyMF0scjEKKyAgICBWTUxBLkkxNiBkMjIsZDgsZDMxCisgICAgVk1VTC5JMTYgZDgsZDEyLGQzMAorICAgIFZFWFQuOCAgIGQxMCxkMjQsZDI1LCM1CisgICAgVkVYVC44ICAgZDEyLGQyNCxkMjUsIzEKKyAgICBWRVhULjggICBkMTYsZDI0LGQyNSwjMgorICAgIFZFWFQuOCAgIGQxNyxkMjQsZDI1LCMzCisgICAgVkVYVC44ICAgZDEzLGQyNCxkMjUsIzQKKyAgICBWQURETC5VOCBxMTIsZDI0LGQxMAorICAgIFZTVUIuSTE2IGQyMixkMjIsZDgKKyAgICBWQURETC5VOCBxNCxkMTYsZDE3CisgICAgVkFEREwuVTggcTYsZDEyLGQxMworICAgIFZMRDEuOCAgIHtkMjYsZDI3fSxbcjBdLHIxCisgICAgVk1MQS5JMTYgZDI0LGQ4LGQzMQorICAgIFZNVUwuSTE2IGQ4LGQxMixkMzAKKyAgICBWRVhULjggICBkMTAsZDI2LGQyNywjNQorICAgIFZFWFQuOCAgIGQxMixkMjYsZDI3LCMxCisgICAgVkVYVC44ICAgZDE4LGQyNixkMjcsIzIKKyAgICBWRVhULjggICBkMTksZDI2LGQyNywjMworICAgIFZFWFQuOCAgIGQxMyxkMjYsZDI3LCM0CisgICAgVkFEREwuVTggcTEzLGQyNixkMTAKKyAgICBWU1VCLkkxNiBkMjQsZDI0LGQ4CisgICAgVkFEREwuVTggcTQsZDE4LGQxOQorICAgIFZBRERMLlU4IHE2LGQxMixkMTMKKyAgICBWTEQxLjggICB7ZDI4LGQyOX0sW3IwXSxyMQorICAgIFZNTEEuSTE2IGQyNixkOCxkMzEKKyAgICBWTVVMLkkxNiBkOCxkMTIsZDMwCisgICAgVkVYVC44ICAgZDEwLGQyOCxkMjksIzUKKyAgICBWRVhULjggICBkMTIsZDI4LGQyOSwjMQorICAgIFZFWFQuOCAgIGQyMCxkMjgsZDI5LCMyCisgICAgVkVYVC44ICAgZDIxLGQyOCxkMjksIzMKKyAgICBWRVhULjggICBkMTMsZDI4LGQyOSwjNAorICAgIFZBRERMLlU4IHExNCxkMjgsZDEwCisgICAgVlNVQi5JMTYgZDI2LGQyNixkOAorICAgIFZBRERMLlU4IHE0LGQyMCxkMjEKKyAgICBWQURETC5VOCBxNixkMTIsZDEzCisgICAgVk1MQS5JMTYgZDI4LGQ4LGQzMQorICAgIFZNTFMuSTE2IGQyOCxkMTIsZDMwCisgICAgVlFSU0hSVU4uUzE2IGQyMixxMTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDI0LHExMiwjNQorICAgIFZRUlNIUlVOLlMxNiBkMjYscTEzLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyOCxxMTQsIzUKKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTU4NDZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmVfcy5TCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgLmZ1bmMgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmU6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWTEQxLjggICB7ZDd9LFtyMF0scjEKKyAgICBBREQgICAgICByMTIscjAscjEsTFNMICMyCisgICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxMn0sW3IxMl0scjEKKyAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKKyAgICBWQURETC5VOCBxMCxkNyxkMTIKKyAgICBWTEQxLjggICB7ZDEwfSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxM30sW3IxMl0scjEKKyAgICBWTEQxLjggICB7ZDExfSxbcjBdLHIxCisgICAgVkxEMS44ICAge2QxNH0sW3IxMl0scjEKKyAgICBWQURETC5VOCBxOCxkOCxkMTEKKyAgICBWQURETC5VOCBxOSxkOSxkMTAKKyAgICBWTEQxLjggICB7ZDE1fSxbcjEyXSxyMQorICAgIFZNTFMuSTE2IGQwLGQxNixkMzAKKyAgICBWTVVMLkkxNiBkMjAsZDE4LGQzMQorICAgIFZBRERMLlU4IHE4LGQ5LGQxMgorICAgIFZBRERMLlU4IHE5LGQxMCxkMTEKKyAgICBWQURETC5VOCBxMSxkOCxkMTMKKyAgICBWTUxTLkkxNiBkMixkMTYsZDMwCisgICAgVk1VTC5JMTYgZDIxLGQxOCxkMzEKKyAgICBWQURETC5VOCBxOCxkMTAsZDEzCisgICAgVkFEREwuVTggcTksZDExLGQxMgorICAgIFZBRERMLlU4IHEyLGQ5LGQxNAorICAgIFZNTFMuSTE2IGQ0LGQxNixkMzAKKyAgICBWTVVMLkkxNiBkMjIsZDE4LGQzMQorICAgIFZBRERMLlU4IHE4LGQxMSxkMTQKKyAgICBWQURETC5VOCBxMyxkMTAsZDE1CisgICAgVkFEREwuVTggcTksZDEyLGQxMworICAgIFZNTFMuSTE2IGQ2LGQxNixkMzAKKyAgICBWQURELkkxNiBkMCxkMCxkMjAKKyAgICBWQURELkkxNiBkMixkMixkMjEKKyAgICBWQURELkkxNiBkNCxkNCxkMjIKKyAgICBWTUxBLkkxNiBkNixkMTgsZDMxCisgICAgVlFSU0hSVU4uUzE2IGQwLHEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQyLHExLCM1CisgICAgVlFSU0hSVU4uUzE2IGQ0LHEyLCM1CisgICAgVlFSU0hSVU4uUzE2IGQ2LHEzLCM1CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1MjBkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hX3MuUwpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisKKyAgICAuc2VjdGlvbiAucm9kYXRhCisgICAgLmFsaWduIDQKKworYXJtVkNNNFAxMF9XaWR0aEJyYW5jaFRhYmxlTVZJc05vdFplcm86CisgICAgLndvcmQgICBXaWR0aElzMk1WSXNOb3RaZXJvLCBXaWR0aElzMk1WSXNOb3RaZXJvCisgICAgLndvcmQgICBXaWR0aElzNE1WSXNOb3RaZXJvLCBXaWR0aElzNE1WSXNOb3RaZXJvCisgICAgLndvcmQgICBXaWR0aElzOE1WSXNOb3RaZXJvCisKK2FybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNaZXJvOgorICAgIC53b3JkICAgV2lkdGhJczJNVklzWmVybywgV2lkdGhJczJNVklzWmVybworICAgIC53b3JkICAgV2lkdGhJczRNVklzWmVybywgV2lkdGhJczRNVklzWmVybworICAgIC53b3JkICAgV2lkdGhJczhNVklzWmVybworCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZV9DaHJvbWEKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVfQ2hyb21hCithcm1WQ000UDEwX0ludGVycG9sYXRlX0Nocm9tYToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgTERSRCAgICAgcjYscjcsW3NwLCMweDcwXQorICAgIExEUkQgICAgIHI0LHI1LFtzcCwjMHg2OF0KKyAgICBSU0IgICAgICByOCxyNiwjOAorICAgIFJTQiAgICAgIHI5LHI3LCM4CisgICAgQ01OICAgICAgcjYscjcKKyAgICBNT1YgICAgICByMTAsIzEKKyAgICBMRFJFUSAgICByMTEsID1hcm1WQ000UDEwX1dpZHRoQnJhbmNoVGFibGVNVklzWmVybworICAgIFNVQiAgICAgIGxyLHIxLHIxMAorICAgIExEUk5FICAgIHIxMSwgPWFybVZDTTRQMTBfV2lkdGhCcmFuY2hUYWJsZU1WSXNOb3RaZXJvCisgICAgVkxEMS44ICAge2QwfSxbcjBdLHIxMAorICAgIFNNVUxCQiAgIHIxMixyOCxyOQorICAgIFNNVUxCQiAgIHI5LHI2LHI5CisgICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCisgICAgU01VTEJCICAgcjgscjgscjcKKyAgICBTTVVMQkIgICByNixyNixyNworICAgIFZEVVAuOCAgIGQxMixyMTIKKyAgICBWRFVQLjggICBkMTMscjkKKyAgICBWRFVQLjggICBkMTQscjgKKyAgICBWRFVQLjggICBkMTUscjYKKyAgICBMRFIgICAgICBwYyxbcjExLHI0LExTTCAjMV0KKworV2lkdGhJczhNVklzTm90WmVybzoKKyAgICBWTEQxLjggICB7ZDJ9LFtyMF0scjEwCisgICAgVk1VTEwuVTggcTIsZDAsZDEyCisgICAgVkxEMS44ICAge2QzfSxbcjBdLGxyCisgICAgVk1VTEwuVTggcTMsZDIsZDEyCisgICAgVkxEMS44ICAge2QxNn0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMixkMSxkMTMKKyAgICBWTEQxLjggICB7ZDE3fSxbcjBdLGxyCisgICAgVk1VTEwuVTggcTExLGQxNixkMTIKKyAgICBWTUxBTC5VOCBxMyxkMyxkMTMKKyAgICBWTEQxLjggICB7ZDE4fSxbcjBdLHIxMAorICAgIFZNTEFMLlU4IHEyLGQyLGQxNAorICAgIFZNTEFMLlU4IHExMSxkMTcsZDEzCisgICAgVk1VTEwuVTggcTEyLGQxOCxkMTIKKyAgICBWTEQxLjggICB7ZDE5fSxbcjBdLGxyCisgICAgVk1MQUwuVTggcTMsZDE2LGQxNAorICAgIFZMRDEuOCAgIHtkMH0sW3IwXSxyMTAKKyAgICBWTUxBTC5VOCBxMTIsZDE5LGQxMworICAgIFZNTEFMLlU4IHExMSxkMTgsZDE0CisgICAgVk1MQUwuVTggcTIsZDMsZDE1CisgICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCisgICAgVk1MQUwuVTggcTEyLGQwLGQxNAorICAgIFZNTEFMLlU4IHEzLGQxNyxkMTUKKyAgICBWTUxBTC5VOCBxMTEsZDE5LGQxNQorICAgIFNVQlMgICAgIHI1LHI1LCM0CisgICAgVk1MQUwuVTggcTEyLGQxLGQxNQorICAgIFZRUlNIUk4uVTE2IGQ4LHEyLCM2CisgICAgVlFSU0hSTi5VMTYgZDkscTMsIzYKKyAgICBWUVJTSFJOLlUxNiBkMjAscTExLCM2CisgICAgVlNUMS42NCAge2Q4fSxbcjJdLHIzCisgICAgVlFSU0hSTi5VMTYgZDIxLHExMiwjNgorICAgIFZTVDEuNjQgIHtkOX0sW3IyXSxyMworICAgIFZTVDEuNjQgIHtkMjB9LFtyMl0scjMKKyAgICBWU1QxLjY0ICB7ZDIxfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczhNVklzTm90WmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzNE1WSXNOb3RaZXJvOgorICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKKyAgICBWTVVMTC5VOCBxMixkMCxkMTIKKyAgICBWTVVMTC5VOCBxMyxkMixkMTIKKyAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKKyAgICBWTUxBTC5VOCBxMixkMSxkMTMKKyAgICBWTUxBTC5VOCBxMyxkMyxkMTMKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTIsZDIsZDE0CisgICAgVk1MQUwuVTggcTMsZDAsZDE0CisgICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCisgICAgU1VCUyAgICAgcjUscjUsIzIKKyAgICBWTUxBTC5VOCBxMyxkMSxkMTUKKyAgICBWTUxBTC5VOCBxMixkMyxkMTUKKyAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgorICAgIFZRUlNIUk4uVTE2IGQ4LHEyLCM2CisgICAgVlNUMS4zMiAge2Q4WzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q5WzBdfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczRNVklzTm90WmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzMk1WSXNOb3RaZXJvOgorICAgIFZMRDEuOCAgIHtkMn0sW3IwXSxyMTAKKyAgICBWTVVMTC5VOCBxMixkMCxkMTIKKyAgICBWTVVMTC5VOCBxMyxkMixkMTIKKyAgICBWTEQxLjggICB7ZDN9LFtyMF0sbHIKKyAgICBWTUxBTC5VOCBxMixkMSxkMTMKKyAgICBWTUxBTC5VOCBxMyxkMyxkMTMKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEwCisgICAgVk1MQUwuVTggcTIsZDIsZDE0CisgICAgVk1MQUwuVTggcTMsZDAsZDE0CisgICAgVkxEMS44ICAge2QxfSxbcjBdLGxyCisgICAgU1VCUyAgICAgcjUscjUsIzIKKyAgICBWTUxBTC5VOCBxMyxkMSxkMTUKKyAgICBWTUxBTC5VOCBxMixkMyxkMTUKKyAgICBWUVJTSFJOLlUxNiBkOSxxMywjNgorICAgIFZRUlNIUk4uVTE2IGQ4LHEyLCM2CisgICAgVlNUMS4xNiAge2Q4WzBdfSxbcjJdLHIzCisgICAgVlNUMS4xNiAge2Q5WzBdfSxbcjJdLHIzCisgICAgQkdUICAgICAgV2lkdGhJczJNVklzTm90WmVybworICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorCitXaWR0aElzOE1WSXNaZXJvOgorICAgIFNVQiAgICAgIHIwLHIwLHIxCitXaWR0aElzOExvb3BNVklzWmVybzoKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEKKyAgICBTVUJTICAgICByNSxyNSwjMgorICAgIFZMRDEuOCAgIHtkMX0sW3IwXSxyMQorICAgIFZTVDEuNjQgIHtkMH0sW3IyXSxyMworICAgIFZTVDEuNjQgIHtkMX0sW3IyXSxyMworICAgIEJHVCAgICAgIFdpZHRoSXM4TG9vcE1WSXNaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXM0TVZJc1plcm86CisgICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCisgICAgU1VCUyAgICAgcjUscjUsIzIKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEKKyAgICBWU1QxLjMyICB7ZDFbMF19LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzNE1WSXNaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisKK1dpZHRoSXMyTVZJc1plcm86CisgICAgVkxEMS44ICAge2QxfSxbcjBdLHIxCisgICAgU1VCUyAgICAgcjUscjUsIzIKKyAgICBWU1QxLjE2ICB7ZDBbMF19LFtyMl0scjMKKyAgICBWTEQxLjggICB7ZDB9LFtyMF0scjEKKyAgICBWU1QxLjE2ICB7ZDFbMF19LFtyMl0scjMKKyAgICBCR1QgICAgICBXaWR0aElzMk1WSXNaZXJvCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1F1YW50VGFibGVzX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ2ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9RdWFudFRhYmxlc19zLlMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfTUZNYXRyaXhRUE1vZFRhYmxlCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1FQRGl2SW50cmFUYWJsZQorICAgIC5nbG9iYWwgYXJtVkNNNFAxMF9RUERpdlBsdXNPbmVUYWJsZQorCis7Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zICgxIDw8IFFiaXRzUGx1c09uZSkgLyAzIFZhbHVlcyAoSW50cmEgY2FzZSkgLAorOy8vIGZvciB2YWx1ZXMgb2YgaVFQIGZyb20gMCB0byA1MSAoaW5jbHVzaXZlKS4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2FybVZDTTRQMTBfUVBEaXZJbnRyYVRhYmxlOgorICAgIC53b3JkIDIxODQ1LCAyMTg0NSwgMjE4NDUsIDIxODQ1LCAyMTg0NSwgMjE4NDUKKyAgICAud29yZCA0MzY5MCwgNDM2OTAsIDQzNjkwLCA0MzY5MCwgNDM2OTAsIDQzNjkwCisgICAgLndvcmQgODczODEsIDg3MzgxLCA4NzM4MSwgODczODEsIDg3MzgxLCA4NzM4MQorICAgIC53b3JkIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIsIDE3NDc2MiwgMTc0NzYyLCAxNzQ3NjIKKyAgICAud29yZCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1LCAzNDk1MjUsIDM0OTUyNSwgMzQ5NTI1CisgICAgLndvcmQgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MCwgNjk5MDUwLCA2OTkwNTAsIDY5OTA1MAorICAgIC53b3JkIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEsIDEzOTgxMDEKKyAgICAud29yZCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyLCAyNzk2MjAyCisKKworOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsvLyBUaGlzIHRhYmxlIGNvbnRhaW5zIGFybVZDTTRQMTBfTUZNYXRyaXggW2lRUCAlIDZdWzBdIGVudGlyZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9NRk1hdHJpeFFQTW9kVGFibGU6CisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisgICAgLmh3b3JkIDEzMTA3LCAxMTkxNiwgMTAwODIsIDkzNjIsIDgxOTIsIDcyODIKKyAgICAuaHdvcmQgMTMxMDcsIDExOTE2LCAxMDA4MiwgOTM2MiwgODE5MiwgNzI4MgorICAgIC5od29yZCAxMzEwNywgMTE5MTYsIDEwMDgyLCA5MzYyLCA4MTkyLCA3MjgyCisKKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgY29udGFpbnMgQVJNX000UDEwX1FfT0ZGU0VUICsgMSArIChpUVAgLyA2KSB2YWx1ZXMsCis7Ly8gZm9yIHZhbHVlcyBvZiBpUVAgZnJvbSAwIHRvIDUxIChpbmNsdXNpdmUpLgorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FybVZDTTRQMTBfUVBEaXZQbHVzT25lVGFibGU6CisgICAgLmJ5dGUgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgorICAgIC5ieXRlIDE3LCAxNywgMTcsIDE3LCAxNywgMTcKKyAgICAuYnl0ZSAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4CisgICAgLmJ5dGUgMTksIDE5LCAxOSwgMTksIDE5LCAxOQorICAgIC5ieXRlIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAKKyAgICAuYnl0ZSAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxCisgICAgLmJ5dGUgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMgorICAgIC5ieXRlIDIzLCAyMywgMjMsIDIzLCAyMywgMjMKKyAgICAuYnl0ZSAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0CisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2MvYXJtVkNNNFAxMF9UcmFuc2Zvcm1SZXNpZHVhbDR4NF9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0ZDcxNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDRfcy5TCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQKK2FybVZDTTRQMTBfVHJhbnNmb3JtUmVzaWR1YWw0eDQ6CisgICAgVlBVU0ggICAge2Q4fQorICAgIFZMRDQuMTYgIHtkMCxkMSxkMixkM30sW3IxXQorICAgIFZNT1YuSTE2IGQ0LCMwCisgICAgVkFERC5JMTYgZDUsZDAsZDIKKyAgICBWU1VCLkkxNiBkNixkMCxkMgorICAgIFZIQURELlMxNiBkNyxkMSxkNAorICAgIFZIQURELlMxNiBkOCxkMyxkNAorICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCisgICAgVkFERC5JMTYgZDgsZDEsZDgKKyAgICBWQURELkkxNiBkMCxkNSxkOAorICAgIFZBREQuSTE2IGQxLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWU1VCLkkxNiBkMyxkNSxkOAorICAgIFZUUk4uMTYgIGQwLGQxCisgICAgVlRSTi4xNiAgZDIsZDMKKyAgICBWVFJOLjMyICBxMCxxMQorICAgIFZBREQuSTE2IGQ1LGQwLGQyCisgICAgVlNVQi5JMTYgZDYsZDAsZDIKKyAgICBWSEFERC5TMTYgZDcsZDEsZDQKKyAgICBWSEFERC5TMTYgZDgsZDMsZDQKKyAgICBWU1VCLkkxNiBkNyxkNyxkMworICAgIFZBREQuSTE2IGQ4LGQxLGQ4CisgICAgVkFERC5JMTYgZDAsZDUsZDgKKyAgICBWQURELkkxNiBkMSxkNixkNworICAgIFZTVUIuSTE2IGQyLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDMsZDUsZDgKKyAgICBWUlNIUi5TMTYgZDAsZDAsIzYKKyAgICBWUlNIUi5TMTYgZDEsZDEsIzYKKyAgICBWUlNIUi5TMTYgZDIsZDIsIzYKKyAgICBWUlNIUi5TMTYgZDMsZDMsIzYKKyAgICBWU1QxLjE2ICB7ZDAsZDEsZDIsZDN9LFtyMF0KKyAgICBWUE9QICAgICB7ZDh9CisgICAgQlggICAgICAgbHIKKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL2FybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTJmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9hcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0X3MuUwpAQCAtMCwwICsxLDQwIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgLmZ1bmMgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0Cithcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0OgorICAgIFBVU0ggICAgIHtyNC1yOCxscn0KKyAgICBMRFIgICAgICByMixbcjAsIzBdCisgICAgTU9WICAgICAgcjcsIzB4MWYKKyAgICBNT1YgICAgICByNCwjMAorICAgIE1PViAgICAgIHI1LCMwCisgICAgTERSQiAgICAgcjMsW3IyXSwjMQorICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMF0KKyAgICBTVFJEICAgICByNCxyNSxbcjEsIzhdCisgICAgU1RSRCAgICAgcjQscjUsW3IxLCMweDEwXQorICAgIFNUUkQgICAgIHI0LHI1LFtyMSwjMHgxOF0KK3VucGFja0xvb3A6CisgICAgVFNUICAgICAgcjMsIzB4MTAKKyAgICBMRFJORVNCICByNSxbcjIsIzFdCisgICAgTERSTkVCICAgcjQsW3IyXSwjMgorICAgIEFORCAgICAgIHI2LHI3LHIzLExTTCAjMQorICAgIExEUkVRU0IgIHI0LFtyMl0sIzEKKyAgICBPUlJORSAgICByNCxyNCxyNSxMU0wgIzgKKyAgICBUU1QgICAgICByMywjMHgyMAorICAgIExEUkVRQiAgIHIzLFtyMl0sIzEKKyAgICBTVFJIICAgICByNCxbcjEscjZdCisgICAgQkVRICAgICAgdW5wYWNrTG9vcAorICAgIFNUUiAgICAgIHIyLFtyMCwjMF0KKyAgICBQT1AgICAgICB7cjQtcjgscGN9CisgICAgLmVuZGZ1bmMKKyAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVibG9ja0x1bWFfSS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjEwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kuUwpAQCAtMCwwICsxLDY3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0RlYmxvY2tMdW1hX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRGVibG9ja0x1bWFfSQorb214VkNNNFAxMF9EZWJsb2NrTHVtYV9JOgorICAgIFBVU0ggICAgIHtyNC1yOSxscn0KKyAgICBNT1ZTICAgICByNixyMAorICAgIFNVQiAgICAgIHNwLHNwLCMweGMKKyAgICBNT1YgICAgICByOSxyMQorICAgIE1PViAgICAgIHI3LHIyCisgICAgTU9WICAgICAgcjgscjMKKyAgICBMRFIgICAgICByNCxbc3AsIzB4MjhdCisgICAgTERSICAgICAgcjUsW3NwLCMweDJjXQorICAgIEJFUSAgICAgIEwweDU4CisgICAgVFNUICAgICAgcjYsIzcKKyAgICBUU1RFUSAgICByOSwjNworICAgIEJORSAgICAgIEwweDU4CisgICAgQ01QICAgICAgcjcsIzAKKyAgICBDTVBORSAgICByOCwjMAorICAgIENNUE5FICAgIHI0LCMwCisgICAgQkVRICAgICAgTDB4NTgKKyAgICBUU1QgICAgICByNCwjMworICAgIEJORSAgICAgIEwweDU4CisgICAgQ01QICAgICAgcjUsIzAKKyAgICBCRVEgICAgICBMMHg1OAorICAgIFRTVCAgICAgIHI1LCMzCisgICAgQkVRICAgICAgTDB4NjQKK0wweDU4OgorICAgIE1WTiAgICAgIHIwLCM0CitMMHg1YzoKKyAgICBBREQgICAgICBzcCxzcCwjMHhjCisgICAgUE9QICAgICAge3I0LXI5LHBjfQorTDB4NjQ6CisgICAgU1RSICAgICAgcjQsW3NwLCMwXQorICAgIE1PViAgICAgIHIzLHI4CisgICAgU1RSICAgICAgcjUsW3NwLCM0XQorICAgIE1PViAgICAgIHIyLHI3CisgICAgTU9WICAgICAgcjEscjkKKyAgICBNT1YgICAgICByMCxyNgorICAgIEJMICAgICAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JCisgICAgQ01QICAgICAgcjAsIzAKKyAgICBCTkUgICAgICBMMHg1YworICAgIEFERCAgICAgIHIzLHI1LCMweDEwCisgICAgQUREICAgICAgcjIscjQsIzB4MTAKKyAgICBTVFIgICAgICByMyxbc3AsIzRdCisgICAgU1RSICAgICAgcjIsW3NwLCMwXQorICAgIEFERCAgICAgIHIzLHI4LCMyCisgICAgQUREICAgICAgcjIscjcsIzIKKyAgICBNT1YgICAgICByMSxyOQorICAgIE1PViAgICAgIHIwLHI2CisgICAgQkwgICAgICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0kKKyAgICBBREQgICAgICBzcCxzcCwjMHhjCisgICAgUE9QICAgICAge3I0LXI5LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9EZXF1YW50VHJhbnNmb3JtUmVzaWR1YWxGcm9tUGFpckFuZEFkZF9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMWVlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRGVxdWFudFRyYW5zZm9ybVJlc2lkdWFsRnJvbVBhaXJBbmRBZGRfcy5TCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkCitvbXhWQ000UDEwX0RlcXVhbnRUcmFuc2Zvcm1SZXNpZHVhbEZyb21QYWlyQW5kQWRkOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQ5fQorICAgIFNVQiAgICAgIHNwLHNwLCMweDIwCisgICAgQUREICAgICAgcjQsc3AsIzAKKyAgICBMRFIgICAgICByNSxbc3AsIzB4NjRdCisgICAgTU9WICAgICAgcjcscjEKKyAgICBNT1YgICAgICByOCxyMgorICAgIE1PViAgICAgIHI5LHIzCisgICAgQ01QICAgICAgcjUsIzAKKyAgICBCRVEgICAgICBMMHgxMTQKKyAgICBNT1YgICAgICByMSxyNAorICAgIEJMICAgICAgIGFybVZDTTRQMTBfVW5wYWNrQmxvY2s0eDQgIDsvLworICAgIExEUiAgICAgIHIxLFtzcCwjMHg2MF0KKyAgICBMRFIgICAgICByMTEsID1hcm1WQ000UDEwX1FQTW9kdWxvVGFibGUKKyAgICBMRFIgICAgICByMTAsID1hcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICBMRFIgICAgICByMiwgID1hcm1WQ000UDEwX1ZNYXRyaXhVMTYKKyAgICBMRFJTQiAgICByMTIsW3IxMSxyMV0KKyAgICBMRFJTQiAgICBscixbcjEwLHIxXQorICAgIExEUiAgICAgIHIxMCwgPTB4MzAyMDUwNAorICAgIExEUiAgICAgIHIxLCA9MHg1MDQwMTAwCisgICAgQUREICAgICAgcjIscjIscjEyCisgICAgVkRVUC4zMiAgZDcscjEKKyAgICBWRFVQLjMyICBkOSxyMTAKKyAgICBWRFVQLjE2ICBkNSxscgorICAgIFZMRDEuOCAgIHtkNn0sW3IyXQorICAgIFZUQkwuOCAgIGQ4LHtkNn0sZDcKKyAgICBWVEJMLjggICBkNCx7ZDZ9LGQ5CisgICAgQ01QICAgICAgcjgsIzAKKyAgICBWTEQxLjE2ICB7ZDAsZDEsZDIsZDN9LFtyNF0KKyAgICBWU0hMLlUxNiBkOCxkOCxkNQorICAgIFZTSEwuVTE2IGQ0LGQ0LGQ1CisgICAgQkVRICAgICAgTDEKKyAgICBMRFJTSCAgICByMTAsW3I4LCMwXQorTDE6CisgICAgVk1VTC5JMTYgZDAsZDAsZDgKKyAgICBWTVVMLkkxNiBkMSxkMSxkNAorICAgIFZNVUwuSTE2IGQyLGQyLGQ4CisgICAgVk1VTC5JMTYgZDMsZDMsZDQKKyAgICBWTU9WTkUuMTYgZDBbMF0scjEwCisgICAgVlRSTi4xNiAgZDAsZDEKKyAgICBWVFJOLjE2ICBkMixkMworICAgIFZUUk4uMzIgIHEwLHExCisgICAgVk1PVi5JMTYgZDQsIzAKKyAgICBWQURELkkxNiBkNSxkMCxkMgorICAgIFZTVUIuSTE2IGQ2LGQwLGQyCisgICAgVkhBREQuUzE2IGQ3LGQxLGQ0CisgICAgVkhBREQuUzE2IGQ4LGQzLGQ0CisgICAgVlNVQi5JMTYgZDcsZDcsZDMKKyAgICBWQURELkkxNiBkOCxkMSxkOAorICAgIFZBREQuSTE2IGQwLGQ1LGQ4CisgICAgVkFERC5JMTYgZDEsZDYsZDcKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZTVUIuSTE2IGQzLGQ1LGQ4CisgICAgVlRSTi4xNiAgZDAsZDEKKyAgICBWVFJOLjE2ICBkMixkMworICAgIFZUUk4uMzIgIHEwLHExCisgICAgVkFERC5JMTYgZDUsZDAsZDIKKyAgICBWU1VCLkkxNiBkNixkMCxkMgorICAgIFZIQURELlMxNiBkNyxkMSxkNAorICAgIFZIQURELlMxNiBkOCxkMyxkNAorICAgIFZTVUIuSTE2IGQ3LGQ3LGQzCisgICAgVkFERC5JMTYgZDgsZDEsZDgKKyAgICBWQURELkkxNiBkMCxkNSxkOAorICAgIFZBREQuSTE2IGQxLGQ2LGQ3CisgICAgVlNVQi5JMTYgZDIsZDYsZDcKKyAgICBWU1VCLkkxNiBkMyxkNSxkOAorICAgIFZSU0hSLlMxNiBkMCxkMCwjNgorICAgIFZSU0hSLlMxNiBkMSxkMSwjNgorICAgIFZSU0hSLlMxNiBkMixkMiwjNgorICAgIFZSU0hSLlMxNiBkMyxkMywjNgorICAgIEIgICAgICAgIEwweDEzMAorTDB4MTE0OgorICAgIExEUlNIICAgIHIxMCxbcjgsIzBdCisgICAgQUREICAgICAgcjEwLHIxMCwjMHgyMAorICAgIEFTUiAgICAgIHIxMCxyMTAsIzYKKyAgICBWRFVQLjE2ICBkMCxyMTAKKyAgICBWRFVQLjE2ICBkMSxyMTAKKyAgICBWRFVQLjE2ICBkMixyMTAKKyAgICBWRFVQLjE2ICBkMyxyMTAKK0wweDEzMDoKKyAgICBMRFIgICAgICByMSxbc3AsIzB4NThdCisgICAgTERSICAgICAgcjEwLFtzcCwjMHg1Y10KKyAgICBMRFIgICAgICByMyxbcjddLHIxCisgICAgTERSICAgICAgcjUsW3I3XSxyMQorICAgIFZNT1YgICAgIGQ0LHIzLHI1CisgICAgTERSICAgICAgcjMsW3I3XSxyMQorICAgIExEUiAgICAgIHI1LFtyNywjMF0KKyAgICBWTU9WICAgICBkNSxyMyxyNQorICAgIFZBRERXLlU4IHEzLHEwLGQ0CisgICAgVkFERFcuVTggcTQscTEsZDUKKyAgICBWUU1PVlVOLlMxNiBkMCxxMworICAgIFZRTU9WVU4uUzE2IGQxLHE0CisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjldLHIxMAorICAgIFZTVDEuMzIgIHtkMFsxXX0sW3I5XSxyMTAKKyAgICBWU1QxLjMyICB7ZDFbMF19LFtyOV0scjEwCisgICAgVlNUMS4zMiAge2QxWzFdfSxbcjldCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICBzcCxzcCwjMHgyMAorICAgIFZQT1AgICAgIHtkOC1kOX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX0hvckVkZ2VfSV9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliYTUzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0lfcy5TCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9Ib3JFZGdlX0k6CisgICAgUFVTSCAgICAge3I0LXIxMCxscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdIQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIFNVQiAgICAgIHIwLHIwLHIxCisgICAgVkxEMS44ICAge2QyW119LFtyM10hCisgICAgTERSICAgICAgcjQsW3NwLCMweDY0XQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2MF0KKyAgICBMRFIgICAgICByOSwgPTB4MzAzMDMwMworICAgIExEUiAgICAgIHI4LCA9MHg0MDQwNDA0CisgICAgVk1PVi5JOCAgZDE0LCMwCisgICAgVk1PVi5JOCAgZDE1LCMweDEKKyAgICBWTU9WLkkxNiBkMSwjMHg0CisgICAgTU9WICAgICAgcjcsIzB4NDAwMDAwMDAKK0wweDM4OgorICAgIExEUiAgICAgIHI2LFtyNF0sIzgKKyAgICBWTEQxLjggICB7ZDZ9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDV9LFtyMF0scjEKKyAgICBDTVAgICAgICByNiwjMAorICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxyMQorICAgIFZMRDEuOCAgIHtkOH0sW3IwXSxyMQorICAgIFZBQkQuVTggIGQxOSxkNixkNAorICAgIFZMRDEuOCAgIHtkOX0sW3IwXSxyMQorICAgIFZBQkQuVTggIGQxMyxkNCxkOAorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKKyAgICBCRVEgICAgICBMMHhlNAorICAgIFZBQkQuVTggIGQxMixkNSxkNAorICAgIFZBQkQuVTggIGQxOCxkOSxkOAorICAgIFZDR1QuVTggIGQxNixkMCxkMTMKKyAgICBWTU9WLjMyICBkMjZbMF0scjYKKyAgICBWTUFYLlU4ICBkMTIsZDE4LGQxMgorICAgIFZNT1ZMLlU4IHExMyxkMjYKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVkNHVC5TMTYgZDI3LGQyNiwjMAorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWQ0dULlU4ICBkMTksZDIsZDE5CisgICAgVkFORCAgICAgZDE2LGQxNixkMjcKKyAgICBUU1QgICAgICByNixyOQorICAgIFZDR1QuVTggIGQxNyxkMixkMTcKKyAgICBWQU5EICAgICBkMTYsZDE2LGQxMgorICAgIFZBTkQgICAgIGQxMixkMTYsZDE3CisgICAgVkFORCAgICAgZDE3LGQxNixkMTkKKyAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0xUNF91bnNhZmUKKyAgICBUU1QgICAgICByNixyOAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFZUU1QuMTYgIGQyNixkMjYsZDEKKyAgICBCTE5FICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdDaHJvbWFiU0dFNF91bnNhZmUKKyAgICBWQklUICAgICBkMjksZDEzLGQyNgorICAgIFZCSVQgICAgIGQyNCxkMzEsZDI2CisgICAgVkJJRiAgICAgZDI5LGQ0LGQxNgorICAgIFZCSUYgICAgIGQyNCxkOCxkMTYKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxCisgICAgQUREUyAgICAgcjcscjcscjcKKyAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCisgICAgQk5FICAgICAgTDB4MzgKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KK0wweGU0OgorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQUREUyAgICAgcjcscjcscjcKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgQk5FICAgICAgTDB4MzgKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0Nocm9tYV9WZXJFZGdlX0lfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGRkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdDaHJvbWFfVmVyRWRnZV9JX3MuUwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSQorb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nQ2hyb21hX1ZlckVkZ2VfSToKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgVkxEMS44ICAge2QwW119LFtyMl0hCisgICAgU1VCICAgICAgcjAscjAsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IzXSEKKyAgICBMRFIgICAgICByNCxbc3AsIzB4NmNdCisgICAgTERSICAgICAgcjUsW3NwLCMweDY4XQorICAgIExEUiAgICAgIHI4LCA9MHg0MDQwNDA0CisgICAgTERSICAgICAgcjksID0weDMwMzAzMDMKKyAgICBWTU9WLkk4ICBkMTQsIzAKKyAgICBWTU9WLkk4ICBkMTUsIzB4MQorICAgIFZNT1YuSTE2IGQxLCMweDQKKyAgICBNT1YgICAgICByNywjMHg0MDAwMDAwMAorTDB4MzQ6CisgICAgTERSICAgICAgcjYsW3I0XSwjOAorICAgIEFERCAgICAgIHIxMCxyMCxyMQorICAgIEFERCAgICAgIGxyLHIxLHIxCisgICAgVkxEMS44ICAge2Q3fSxbcjBdLGxyCisgICAgVkxEMS44ICAge2Q4fSxbcjEwXSxscgorICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxscgorICAgIFZMRDEuOCAgIHtkMTB9LFtyMTBdLGxyCisgICAgVkxEMS44ICAge2Q2fSxbcjBdLGxyCisgICAgVkxEMS44ICAge2Q5fSxbcjEwXSxscgorICAgIFZMRDEuOCAgIHtkNH0sW3IwXSxscgorICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLGxyCisgICAgVlpJUC44ICAgZDcsZDgKKyAgICBWWklQLjggICBkNSxkMTAKKyAgICBWWklQLjggICBkNixkOQorICAgIFZaSVAuOCAgIGQ0LGQxMQorICAgIFZaSVAuMTYgIGQ3LGQ1CisgICAgVlpJUC4xNiAgZDgsZDEwCisgICAgVlpJUC4xNiAgZDYsZDQKKyAgICBWWklQLjE2ICBkOSxkMTEKKyAgICBWVFJOLjMyICBkNyxkNgorICAgIFZUUk4uMzIgIGQ1LGQ0CisgICAgVlRSTi4zMiAgZDEwLGQxMQorICAgIFZUUk4uMzIgIGQ4LGQ5CisgICAgQ01QICAgICAgcjYsIzAKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBWQUJELlU4ICBkMTMsZDQsZDgKKyAgICBCRVEgICAgICBMMHgxNzAKKyAgICBWQUJELlU4ICBkMTIsZDUsZDQKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWTU9WLjMyICBkMjZbMF0scjYKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWTU9WTC5VOCBxMTMsZDI2CisgICAgVkFCRC5VOCAgZDE3LGQxMCxkOAorICAgIFZDR1QuUzE2IGQyNyxkMjYsIzAKKyAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZBTkQgICAgIGQxNixkMTYsZDI3CisgICAgVFNUICAgICAgcjYscjkKKyAgICBWQ0dULlU4ICBkMTcsZDIsZDE3CisgICAgVkFORCAgICAgZDE2LGQxNixkMTIKKyAgICBWQU5EICAgICBkMTIsZDE2LGQxNworICAgIFZBTkQgICAgIGQxNyxkMTYsZDE5CisgICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNMVDRfdW5zYWZlCisgICAgVFNUICAgICAgcjYscjgKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBWVFNULjE2ICBkMjYsZDI2LGQxCisgICAgQkxORSAgICAgYXJtVkNNNFAxMF9EZWJsb2NraW5nQ2hyb21hYlNHRTRfdW5zYWZlCisgICAgVkJJVCAgICAgZDI5LGQxMyxkMjYKKyAgICBWQklUICAgICBkMjQsZDMxLGQyNgorICAgIEFERCAgICAgIHIxMCxyMCwjMworICAgIFZCSUYgICAgIGQyOSxkNCxkMTYKKyAgICBBREQgICAgICByMTIscjEwLHIxCisgICAgQUREICAgICAgbHIscjEscjEKKyAgICBWQklGICAgICBkMjQsZDgsZDE2CisgICAgQUREUyAgICAgcjcscjcscjcKKyAgICBWU1QxLjggICB7ZDI5WzBdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjlbMV19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyOVsyXX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzNdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjlbNF19LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyOVs1XX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI5WzZdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjlbN119LFtyMTJdLGxyCisgICAgQUREICAgICAgcjEyLHIwLCM0CisgICAgQUREICAgICAgcjEwLHIxMixyMQorICAgIFZTVDEuOCAgIHtkMjRbMF19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyNFsxXX0sW3IxMF0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzJdfSxbcjEyXSxscgorICAgIFZTVDEuOCAgIHtkMjRbM119LFtyMTBdLGxyCisgICAgVlNUMS44ICAge2QyNFs0XX0sW3IxMl0sbHIKKyAgICBWU1QxLjggICB7ZDI0WzVdfSxbcjEwXSxscgorICAgIFZTVDEuOCAgIHtkMjRbNl19LFtyMTJdLGxyCisgICAgVlNUMS44ICAge2QyNFs3XX0sW3IxMF0sbHIKKyAgICBBREQgICAgICByMCxyMCwjNAorICAgIEJORSAgICAgIEwweDM0CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CitMMHgxNzA6CisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBBREQgICAgICByMCxyMCwjNAorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIEFERFMgICAgIHI3LHI3LHI3CisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIEJORSAgICAgIEwweDM0CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0lfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTU4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSV9zLlMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKi8KKworICAgIC5lYWJpX2F0dHJpYnV0ZSAyNCwgMQorICAgIC5lYWJpX2F0dHJpYnV0ZSAyNSwgMQorCisgICAgLmFybQorICAgIC5mcHUgbmVvbgorICAgIC50ZXh0CisKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfSG9yRWRnZV9JCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX0hvckVkZ2VfSQorb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9Ib3JFZGdlX0k6CisgICAgUFVTSCAgICAge3I0LXIxMixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIEFERCAgICAgIHI3LHIyLCMxCisgICAgQUREICAgICAgcjgscjMsIzEKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IyXQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgTERSICAgICAgcjQsW3NwLCMweDZjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KKyAgICBNT1YgICAgICByMTEsIzAKKyAgICBWTU9WLkk4ICBkMTQsIzAKKyAgICBWTU9WLkk4ICBkMTUsIzB4MQorICAgIEFERCAgICAgIHIxMCxyMSxyMQorICAgIE1PViAgICAgIHI5LCMweDU1MDAwMDAwCitMMHgzODoKKyAgICBMRFJIICAgICByMTIsW3I0XSwjMgorICAgIEFERCAgICAgIHI2LHIwLHIxCisgICAgQ01QICAgICAgcjEyLCMwCisgICAgQkVRICAgICAgTDB4ZTQKKyAgICBWTEQxLjggICB7ZDd9LFtyMF0scjEwCisgICAgVkxEMS44ICAge2Q2fSxbcjZdLHIxMAorICAgIFZMRDEuOCAgIHtkNX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDR9LFtyNl0scjEwCisgICAgVkxEMS44ICAge2Q4fSxbcjBdLHIxMAorICAgIFZBQkQuVTggIGQxMixkNCxkNQorICAgIFZMRDEuOCAgIHtkOX0sW3I2XQorICAgIFZBQkQuVTggIGQxMyxkOCxkNAorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0scjEKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVFNUICAgICAgcjEyLCMweGZmCisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVk1PVkVRLjMyIGQxNlswXSxyMTEKKyAgICBUU1QgICAgICByMTIsIzB4ZmYwMAorICAgIFZDR1QuVTggIGQxOSxkMixkMTkKKyAgICBWQ0dULlU4ICBkMTIsZDIsZDEyCisgICAgVk1PVkVRLjMyIGQxNlsxXSxyMTEKKyAgICBWQ0dULlU4ICBkMTcsZDIsZDE3CisgICAgVkxEMS44ICAge2QxMX0sW3IwXQorICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVFNUICAgICAgcjEyLCM0CisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJORSAgICAgIEwweGY4CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMyCisgICAgU1VCICAgICAgcjAscjAscjEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0RlYmxvY2tpbmdMdW1hYlNMVDRfdW5zYWZlCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMQorICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKKyAgICBTVUIgICAgICByNixyMCxyMSxMU0wgIzIKKyAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWU1QxLjggICB7ZDI1fSxbcjBdCisgICAgQUREICAgICAgcjAscjYsIzgKKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDEzMAorTDB4ZTQ6CisgICAgQUREICAgICAgcjAscjAsIzgKKyAgICBBRERTICAgICByOSxyOSxyOQorICAgIEFERCAgICAgIHI1LHI1LCMyCisgICAgQkNDICAgICAgTDB4MzgKKyAgICBCICAgICAgICBMMHgxMzAKK0wweGY4OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMQorICAgIFZTVDEuOCAgIHtkMjl9LFtyMF0scjEKKyAgICBTVUIgICAgICByNixyMCxyMSxMU0wgIzIKKyAgICBWU1QxLjggICB7ZDI0fSxbcjBdLHIxCisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWU1QxLjggICB7ZDI1fSxbcjBdLHIxCisgICAgQUREICAgICAgcjUscjUsIzIKKyAgICBWU1QxLjggICB7ZDI4fSxbcjBdCisgICAgQUREICAgICAgcjAscjYsIzgKKyAgICBCQ0MgICAgICBMMHgzOAorTDB4MTMwOgorICAgIFNVQiAgICAgIHIwLHIwLCMweDEwCisgICAgVkxEMS44ICAge2QwW119LFtyN10KKyAgICBBREQgICAgICByMCxyMCxyMSxMU0wgIzIKKyAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQorICAgIEJORSAgICAgIEwweDM4CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUE9QICAgICB7ZDgtZDE1fQorICAgIFBPUCAgICAgIHtyNC1yMTIscGN9CisgICAgLmVuZGZ1bmMKKworICAgIC5lbmQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2MzMmVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0lfcy5TCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ZpbHRlckRlYmxvY2tpbmdMdW1hX1ZlckVkZ2VfSQorICAgIC5mdW5jICAgb214VkNNNFAxMF9GaWx0ZXJEZWJsb2NraW5nTHVtYV9WZXJFZGdlX0kKK29teFZDTTRQMTBfRmlsdGVyRGVibG9ja2luZ0x1bWFfVmVyRWRnZV9JOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBBREQgICAgICByNyxyMiwjMQorICAgIEFERCAgICAgIHI4LHIzLCMxCisgICAgVkxEMS44ICAge2QwW119LFtyMl0KKyAgICBTVUIgICAgICByMCxyMCwjNAorICAgIFZMRDEuOCAgIHtkMltdfSxbcjNdCisgICAgTERSICAgICAgcjQsW3NwLCMweDZjXQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2OF0KKyAgICBNT1YgICAgICByNiwjMAorICAgIFZNT1YuSTggIGQxNCwjMAorICAgIFZNT1YuSTggIGQxNSwjMHgxCisgICAgTU9WICAgICAgcjksIzB4MTEwMDAwMDAKKyAgICBBREQgICAgICByMTEscjEscjEKK0wweDM4OgorICAgIExEUkggICAgIHIxMixbcjRdLCM0CisgICAgQ01QICAgICAgcjEyLCMwCisgICAgQkVRICAgICAgTDB4MTYwCisgICAgQUREICAgICAgcjEwLHIwLHIxCisgICAgVkxEMS44ICAge2Q3fSxbcjBdLHIxMQorICAgIFZMRDEuOCAgIHtkOH0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q1fSxbcjBdLHIxMQorICAgIFZaSVAuOCAgIGQ3LGQ4CisgICAgVkxEMS44ICAge2QxMH0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q2fSxbcjBdLHIxMQorICAgIFZaSVAuOCAgIGQ1LGQxMAorICAgIFZMRDEuOCAgIHtkOX0sW3IxMF0scjExCisgICAgVkxEMS44ICAge2Q0fSxbcjBdLHIxMQorICAgIFZMRDEuOCAgIHtkMTF9LFtyMTBdLHIxMQorICAgIFZaSVAuOCAgIGQ2LGQ5CisgICAgVlpJUC4xNiAgZDgsZDEwCisgICAgVlpJUC44ICAgZDQsZDExCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVlpJUC4xNiAgZDcsZDUKKyAgICBWWklQLjE2ICBkOSxkMTEKKyAgICBWWklQLjE2ICBkNixkNAorICAgIFZUUk4uMzIgIGQ4LGQ5CisgICAgVlRSTi4zMiAgZDUsZDQKKyAgICBWVFJOLjMyICBkMTAsZDExCisgICAgVlRSTi4zMiAgZDcsZDYKKyAgICBWQUJELlU4ICBkMTMsZDQsZDgKKyAgICBWQUJELlU4ICBkMTIsZDUsZDQKKyAgICBWQUJELlU4ICBkMTgsZDksZDgKKyAgICBWQUJELlU4ICBkMTksZDYsZDQKKyAgICBUU1QgICAgICByMTIsIzB4ZmYKKyAgICBWQ0dULlU4ICBkMTYsZDAsZDEzCisgICAgVk1BWC5VOCAgZDEyLGQxOCxkMTIKKyAgICBWQUJELlU4ICBkMTcsZDEwLGQ4CisgICAgVk1PVkVRLjMyIGQxNlswXSxyNgorICAgIFRTVCAgICAgIHIxMiwjMHhmZjAwCisgICAgVkNHVC5VOCAgZDE5LGQyLGQxOQorICAgIFZDR1QuVTggIGQxMixkMixkMTIKKyAgICBWTU9WRVEuMzIgZDE2WzFdLHI2CisgICAgVkNHVC5VOCAgZDE3LGQyLGQxNworICAgIFZBTkQgICAgIGQxNixkMTYsZDEyCisgICAgVFNUICAgICAgcjEyLCM0CisgICAgVkFORCAgICAgZDEyLGQxNixkMTcKKyAgICBWQU5EICAgICBkMTcsZDE2LGQxOQorICAgIEJORSAgICAgIEwweDE3YworICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0xUNF91bnNhZmUKKyAgICBWWklQLjggICBkNyxkNgorICAgIFZaSVAuOCAgIGQzMCxkMjkKKyAgICBWWklQLjggICBkMjQsZDI1CisgICAgVlpJUC44ICAgZDEwLGQxMQorICAgIFZaSVAuMTYgIGQ3LGQzMAorICAgIEFERCAgICAgIHIxMCxyMCxyMQorICAgIFZaSVAuMTYgIGQyNCxkMTAKKyAgICBWWklQLjE2ICBkMjUsZDExCisgICAgVlpJUC4xNiAgZDYsZDI5CisgICAgVlRSTi4zMiAgZDcsZDI0CisgICAgVlRSTi4zMiAgZDMwLGQxMAorICAgIFZUUk4uMzIgIGQ2LGQyNQorICAgIFZUUk4uMzIgIGQyOSxkMTEKKyAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDEwfSxbcjEwXSxyMTEKKyAgICBWU1QxLjggICB7ZDZ9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNX0sW3IxMF0scjExCisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWU1QxLjggICB7ZDI5fSxbcjBdLHIxMQorICAgIEFERCAgICAgIHI1LHI1LCMyCisgICAgVlNUMS44ICAge2QxMX0sW3IxMF0scjEKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzMKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDFmMAorTDB4MTYwOgorICAgIEFERCAgICAgIHIwLHIwLCM0CisgICAgQUREUyAgICAgcjkscjkscjkKKyAgICBWTEQxLjggICB7ZDBbXX0sW3I3XQorICAgIEFERCAgICAgIHI1LHI1LCM0CisgICAgVkxEMS44ICAge2QyW119LFtyOF0KKyAgICBCQ0MgICAgICBMMHgzOAorICAgIEIgICAgICAgIEwweDFmMAorTDB4MTdjOgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfRGVibG9ja2luZ0x1bWFiU0dFNF91bnNhZmUKKyAgICBWWklQLjggICBkNyxkMzEKKyAgICBWWklQLjggICBkMzAsZDI5CisgICAgVlpJUC44ICAgZDI0LGQyNQorICAgIFZaSVAuOCAgIGQyOCxkMTEKKyAgICBWWklQLjE2ICBkNyxkMzAKKyAgICBBREQgICAgICByMTAscjAscjEKKyAgICBWWklQLjE2ICBkMjQsZDI4CisgICAgVlpJUC4xNiAgZDI1LGQxMQorICAgIFZaSVAuMTYgIGQzMSxkMjkKKyAgICBWVFJOLjMyICBkNyxkMjQKKyAgICBWVFJOLjMyICBkMzAsZDI4CisgICAgVlRSTi4zMiAgZDMxLGQyNQorICAgIFZUUk4uMzIgIGQyOSxkMTEKKyAgICBWU1QxLjggICB7ZDd9LFtyMF0scjExCisgICAgVlNUMS44ICAge2QyNH0sW3IxMF0scjExCisgICAgVlNUMS44ICAge2QzMH0sW3IwXSxyMTEKKyAgICBWU1QxLjggICB7ZDI4fSxbcjEwXSxyMTEKKyAgICBWU1QxLjggICB7ZDMxfSxbcjBdLHIxMQorICAgIFZTVDEuOCAgIHtkMjV9LFtyMTBdLHIxMQorICAgIEFERFMgICAgIHI5LHI5LHI5CisgICAgVlNUMS44ICAge2QyOX0sW3IwXSxyMTEKKyAgICBBREQgICAgICByNSxyNSwjNAorICAgIFZTVDEuOCAgIHtkMTF9LFtyMTBdLHIxMQorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMworICAgIFZMRDEuOCAgIHtkMFtdfSxbcjddCisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBWTEQxLjggICB7ZDJbXX0sW3I4XQorICAgIEJDQyAgICAgIEwweDM4CitMMHgxZjA6CisgICAgU1VCICAgICAgcjQscjQsIzB4ZQorICAgIFNVQiAgICAgIHI1LHI1LCMweGUKKyAgICBTVUIgICAgICByMCxyMCwjMHgxMAorICAgIFZMRDEuOCAgIHtkMFtdfSxbcjJdCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMzCisgICAgVkxEMS44ICAge2QyW119LFtyM10KKyAgICBCTkUgICAgICBMMHgzOAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMzZDdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfcy5TCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX0ludGVycG9sYXRlTHVtYQorICAgIC5mdW5jICAgb214VkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWEKK29teFZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hOgorICAgIFBVU0ggICAgIHtyNC1yMTIsbHJ9CisgICAgVlBVU0ggICAge2Q4LWQxNX0KKyAgICBTVUIgICAgICBzcCxzcCwjMHgxMAorICAgIExEUiAgICAgIHI2LFtzcCwjMHg3OF0KKyAgICBMRFIgICAgICByNyxbc3AsIzB4N2NdCisgICAgTERSICAgICAgcjUsW3NwLCMweDgwXQorICAgIExEUiAgICAgIHI0LFtzcCwjMHg4NF0KKyAgICBBREQgICAgICByNixyNixyNyxMU0wgIzIKKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBWTU9WLkkxNiBkMzEsIzB4MTQKKyAgICBWTU9WLkkxNiBkMzAsIzB4NQorTDB4MmM6CisgICAgU1RNICAgICAgcjExLHtyMC1yM30KKyAgICBBREQgICAgICBwYyxwYyxyNixMU0wgIzIKKyAgICBCICAgICAgICBMMHgzZjAKKyAgICBCICAgICAgICBMMHg3OAorICAgIEIgICAgICAgIEwweGE4CisgICAgQiAgICAgICAgTDB4ZGMKKyAgICBCICAgICAgICBMMHgxMDAKKyAgICBCICAgICAgICBMMHgxMzQKKyAgICBCICAgICAgICBMMHgxNjgKKyAgICBCICAgICAgICBMMHgxYTgKKyAgICBCICAgICAgICBMMHgxZjAKKyAgICBCICAgICAgICBMMHgyMzQKKyAgICBCICAgICAgICBMMHgyNTgKKyAgICBCICAgICAgICBMMHgyYjAKKyAgICBCICAgICAgICBMMHgyZDgKKyAgICBCICAgICAgICBMMHgzMzAKKyAgICBCICAgICAgICBMMHgzNjQKKyAgICBCICAgICAgICBMMHgzYTgKKyAgICBCICAgICAgICBMMHgzZjAKK0wweDc4OgorICAgIEFERCAgICAgIHIxMixyMCxyMSxMU0wgIzEKKyAgICBWTEQxLjggICB7ZDl9LFtyMF0scjEKKyAgICBWTEQxLjggICB7ZDExfSxbcjEyXSxyMQorICAgIFZMRDEuOCAgIHtkMTB9LFtyMF0KKyAgICBWTEQxLjggICB7ZDEyfSxbcjEyXQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDExWzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMl0KKyAgICBWU1QxLjMyICB7ZDEyWzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4YTg6CisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNgorICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMAorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweGRjOgorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxMDA6CisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmSG9yNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMjIsZDIyLGQxNQorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQxOQorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQxNworICAgIFZSSEFERC5VOCBkMjgsZDI4LGQyMQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDEzNDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmVmVyNHg0X3Vuc2FmZQorICAgIFZSSEFERC5VOCBkMCxkMCxkOQorICAgIFZSSEFERC5VOCBkNCxkNCxkMTEKKyAgICBWUkhBREQuVTggZDIsZDIsZDEwCisgICAgVlJIQURELlU4IGQ2LGQ2LGQxMgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MTY4OgorICAgIE1PViAgICAgIHI4LHIwCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBTVUIgICAgICByMCxyOCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgxYTg6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgU1VCICAgICAgcjAscjAsIzIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX0ludGVycG9sYXRlTHVtYV9IYWxmRGlhZ0hvclZlcjR4NF91bnNhZmUKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE3LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxOCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTgscTksIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMCwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDFmMDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIEFERCAgICAgIHIwLHIwLCMxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBTVUIgICAgICByMCxyOCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZIb3I0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQyMixkMjIsZDAKKyAgICBWUkhBREQuVTggZDI2LGQyNixkNAorICAgIFZSSEFERC5VOCBkMjQsZDI0LGQyCisgICAgVlJIQURELlU4IGQyOCxkMjgsZDYKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QyMlswXX0sW3IyXSxyMworICAgIFZTVDEuMzIgIHtkMjZbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyNFswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkMjhbMF19LFtyMTJdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQiAgICAgICAgTDB4NDM0CitMMHgyMzQ6CisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDI1ODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnVmVySG9yNHg0X3Vuc2FmZQorICAgIFZFWFQuOCAgIGQxOCxkMTgsZDE5LCM0CisgICAgVkVYVC44ICAgZDIwLGQyMCxkMjEsIzQKKyAgICBWRVhULjggICBkMjIsZDIyLGQyMywjNAorICAgIFZFWFQuOCAgIGQyNCxkMjQsZDI1LCM0CisgICAgVlFSU0hSVU4uUzE2IGQxNCxxOSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMTYscTEwLCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTEsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMiwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDJiMDoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MmQ4OgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkRpYWdWZXJIb3I0eDRfdW5zYWZlCisgICAgVkVYVC44ICAgZDE4LGQxOCxkMTksIzYKKyAgICBWRVhULjggICBkMjAsZDIwLGQyMSwjNgorICAgIFZFWFQuOCAgIGQyMixkMjIsZDIzLCM2CisgICAgVkVYVC44ICAgZDI0LGQyNCxkMjUsIzYKKyAgICBWUVJTSFJVTi5TMTYgZDE0LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxNixxMTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE4LHExMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMjAscTEyLCM1CisgICAgVlJIQURELlU4IGQwLGQwLGQxNAorICAgIFZSSEFERC5VOCBkNCxkNCxkMTgKKyAgICBWUkhBREQuVTggZDIsZDIsZDE2CisgICAgVlJIQURELlU4IGQ2LGQ2LGQyMAorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MzMwOgorICAgIFNVQiAgICAgIHIwLHIwLHIxLExTTCAjMQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZWZXI0eDRfdW5zYWZlCisgICAgVlJIQURELlU4IGQwLGQwLGQxMAorICAgIFZSSEFERC5VOCBkNCxkNCxkMTIKKyAgICBWUkhBREQuVTggZDIsZDIsZDExCisgICAgVlJIQURELlU4IGQ2LGQ2LGQxMworICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMl0scjMKKyAgICBWU1QxLjMyICB7ZDRbMF19LFtyMTJdLHIzCisgICAgVlNUMS4zMiAge2QyWzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjEyXQorICAgIEFERCAgICAgIHIxMSxzcCwjMAorICAgIEIgICAgICAgIEwweDQzNAorTDB4MzY0OgorICAgIE1PViAgICAgIHI4LHIwCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMCxyOCxyMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0CisgICAgVlJIQURELlU4IGQyNCxkMjQsZDIKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDNhODoKKyAgICBTVUIgICAgICByMCxyMCxyMSxMU0wgIzEKKyAgICBTVUIgICAgICByMCxyMCwjMgorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW50ZXJwb2xhdGVMdW1hX0hhbGZEaWFnSG9yVmVyNHg0X3Vuc2FmZQorICAgIFZRUlNIUlVOLlMxNiBkMTQscTgsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDE2LHE5LCM1CisgICAgVlFSU0hSVU4uUzE2IGQxOCxxMTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDIwLHExMSwjNQorICAgIFZSSEFERC5VOCBkMCxkMCxkMTQKKyAgICBWUkhBREQuVTggZDQsZDQsZDE4CisgICAgVlJIQURELlU4IGQyLGQyLGQxNgorICAgIFZSSEFERC5VOCBkNixkNixkMjAKKyAgICBBREQgICAgICByMTIscjIscjMsTFNMICMxCisgICAgVlNUMS4zMiAge2QwWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2Q0WzBdfSxbcjEyXSxyMworICAgIFZTVDEuMzIgIHtkMlswXX0sW3IyXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKKyAgICBCICAgICAgICBMMHg0MzQKK0wweDNmMDoKKyAgICBNT1YgICAgICByOCxyMAorICAgIEFERCAgICAgIHIwLHIwLCMxCisgICAgU1VCICAgICAgcjAscjAscjEsTFNMICMxCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZlZlcjR4NF91bnNhZmUKKyAgICBBREQgICAgICByMCxyOCxyMQorICAgIFNVQiAgICAgIHIwLHIwLCMyCisgICAgQkwgICAgICAgYXJtVkNNNFAxMF9JbnRlcnBvbGF0ZUx1bWFfSGFsZkhvcjR4NF91bnNhZmUKKyAgICBWUkhBREQuVTggZDIyLGQyMixkMAorICAgIFZSSEFERC5VOCBkMjYsZDI2LGQ0CisgICAgVlJIQURELlU4IGQyNCxkMjQsZDIKKyAgICBWUkhBREQuVTggZDI4LGQyOCxkNgorICAgIEFERCAgICAgIHIxMixyMixyMyxMU0wgIzEKKyAgICBWU1QxLjMyICB7ZDIyWzBdfSxbcjJdLHIzCisgICAgVlNUMS4zMiAge2QyNlswXX0sW3IxMl0scjMKKyAgICBWU1QxLjMyICB7ZDI0WzBdfSxbcjJdCisgICAgVlNUMS4zMiAge2QyOFswXX0sW3IxMl0KKyAgICBBREQgICAgICByMTEsc3AsIzAKK0wweDQzNDoKKyAgICBMRE0gICAgICByMTEse3IwLXIzfQorICAgIFNVQlMgICAgIHI1LHI1LCM0CisgICAgQUREICAgICAgcjAscjAsIzQKKyAgICBBREQgICAgICByMixyMiwjNAorICAgIEJHVCAgICAgIEwweDJjCisgICAgU1VCUyAgICAgcjQscjQsIzQKKyAgICBMRFIgICAgICByNSxbc3AsIzB4ODBdCisgICAgQUREICAgICAgcjExLHNwLCMwCisgICAgQUREICAgICAgcjAscjAscjEsTFNMICMyCisgICAgQUREICAgICAgcjIscjIscjMsTFNMICMyCisgICAgU1VCICAgICAgcjAscjAscjUKKyAgICBTVUIgICAgICByMixyMixyNQorICAgIEJHVCAgICAgIEwweDJjCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICBzcCxzcCwjMHgxMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDhfcy5TIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ5ZTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4X3MuUwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIChjKSBDb3B5cmlnaHQgMjAwNy0yMDA4IEFSTSBMaW1pdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqLworCisgICAgLmVhYmlfYXR0cmlidXRlIDI0LCAxCisgICAgLmVhYmlfYXR0cmlidXRlIDI1LCAxCisKKyAgICAuYXJtCisgICAgLmZwdSBuZW9uCisgICAgLnNlY3Rpb24gLnJvZGF0YQorICAgIC5hbGlnbiA0CisKK2FybVZDTTRQMTBfcEluZGV4VGFibGU4eDg6CisgICAgLndvcmQgIE9NWF9WQ19DSFJPTUFfREMsICAgICBPTVhfVkNfQ0hST01BX0hPUgorICAgIC53b3JkICBPTVhfVkNfQ0hST01BX1ZFUlQsICAgT01YX1ZDX0NIUk9NQV9QTEFORQorCithcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4ODoKKyAgICAuaHdvcmQgICAzLCAyLCAxLDQKKyAgICAuaHdvcmQgIC0zLC0yLC0xLDAKKyAgICAuaHdvcmQgICAxLCAyLCAzLDQKKworCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIG9teFZDTTRQMTBfUHJlZGljdEludHJhQ2hyb21hXzh4OAorICAgIC5mdW5jICAgb214VkNNNFAxMF9QcmVkaWN0SW50cmFDaHJvbWFfOHg4CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYUNocm9tYV84eDg6CisgICAgUFVTSCAgICAge3I0LXIxMCxscn0KKyAgICBWUFVTSCAgICB7ZDgtZDE1fQorICAgIExEUiAgICAgIHI4LCA9YXJtVkNNNFAxMF9wSW5kZXhUYWJsZTh4OAorICAgIExEUiAgICAgIHI2LFtzcCwjMHg2OF0KKyAgICBMRFIgICAgICByNCxbc3AsIzB4NjBdCisgICAgTERSICAgICAgcjUsW3NwLCMweDY0XQorICAgIExEUiAgICAgIHI3LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICBwYyxbcjgscjYsTFNMICMyXQorT01YX1ZDX0NIUk9NQV9EQzoKKyAgICBUU1QgICAgICByNywjMgorICAgIEJFUSAgICAgIEwweGU4CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDFbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzFdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVsyXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzddfSxbcjldCisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHhjYworICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQwCisgICAgVlBBRERMLlUxNiBkMyxkMgorICAgIFZQQURETC5VOCBkMixkMQorICAgIFZQQURETC5VMTYgZDEsZDIKKyAgICBWQURELkkzMiBkMixkMyxkMQorICAgIFZSU0hSLlUzMiBkMixkMiwjMworICAgIFZSU0hSLlUzMiBkMyxkMywjMgorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIFZNT1YuSTggIGQ1LCMweGMKKyAgICBWTU9WLkk4ICBkNiwjMHg0CisgICAgVlNITC5JNjQgZDUsZDUsIzMyCisgICAgVlNIUi5VNjQgZDYsZDYsIzMyCisgICAgVkFERC5JOCAgZDYsZDYsZDUKKyAgICBWVEJMLjggICBkMCx7ZDItZDN9LGQ1CisgICAgVlRCTC44ICAgZDQse2QxLWQyfSxkNgorTDB4OWM6CisgICAgQUREICAgICAgcjkscjMscjUKKyAgICBBREQgICAgICByMTAscjUscjUKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDR9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q0fSxbcjldCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorTDB4Y2M6CisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDIsZDEKKyAgICBWUEFEREwuVTE2IGQxLGQyCisgICAgVlJTSFIuVTMyIGQxLGQxLCMyCisgICAgVkRVUC44ICAgZDAsZDFbMF0KKyAgICBWRFVQLjggICBkNCxkMVs0XQorICAgIEIgICAgICAgIEwweDljCitMMHhlODoKKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweDExNAorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQyLGQwCisgICAgVlBBRERMLlUxNiBkMyxkMgorICAgIFZSU0hSLlUzMiBkMyxkMywjMgorICAgIFZNT1YuSTggIGQ1LCMweDQKKyAgICBWU0hMLkk2NCBkNSxkNSwjMzIKKyAgICBWVEJMLjggICBkMCx7ZDN9LGQ1CisgICAgQiAgICAgICAgTDB4MTFjCitMMHgxMTQ6CisgICAgVk1PVi5JOCAgZDAsIzB4ODAKKyAgICBNT1YgICAgICByMCwjMAorTDB4MTFjOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDB9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMH0sW3I5XQorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMCxwY30KK09NWF9WQ19DSFJPTUFfVkVSVDoKKyAgICBWTEQxLjggICB7ZDB9LFtyMV0KKyAgICBNT1YgICAgICByMCwjMAorICAgIEIgICAgICAgIEwweDExYworT01YX1ZDX0NIUk9NQV9IT1I6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDBbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDRbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDVbXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDZbXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDdbXX0sW3I5XQorICAgIEIgICAgICAgIEwweDI4YworT01YX1ZDX0NIUk9NQV9QTEFORToKKyAgICBBREQgICAgICByOSxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IyXQorICAgIFZMRDEuOCAgIHtkMVswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbMV19LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QxWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDFbN119LFtyOV0KKyAgICBWUkVWNjQuOCBkMyxkMAorICAgIFZTVUJMLlU4IHEzLGQzLGQyCisgICAgVlNIUi5VNjQgZDMsZDMsIzgKKyAgICBWU1VCTC5VOCBxMixkMyxkMAorICAgIFZSRVY2NC44IGQzLGQxCisgICAgVlNVQkwuVTggcTcsZDMsZDIKKyAgICBWU0hSLlU2NCBkMyxkMywjOAorICAgIFZTVUJMLlU4IHE2LGQzLGQxCisgICAgTERSICAgICAgcjIsID1hcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZUNocm9tYTh4OAorICAgIFZTSEwuSTY0IGQ0LGQ0LCMxNgorICAgIFZFWFQuOCAgIGQ5LGQ0LGQ2LCMyCisgICAgVkxEMS4xNiAge2QxMH0sW3IyXSEKKyAgICBWU0hMLkk2NCBkMTIsZDEyLCMxNgorICAgIFZFWFQuOCAgIGQxNixkMTIsZDE0LCMyCisgICAgVk1VTC5JMTYgZDExLGQ5LGQxMAorICAgIFZNVUwuSTE2IGQzLGQxNixkMTAKKyAgICBWUEFERC5JMTYgZDMsZDExLGQzCisgICAgVlBBRERMLlMxNiBkMyxkMworICAgIFZTSEwuSTMyIGQyLGQzLCM0CisgICAgVkFERC5JMzIgZDMsZDMsZDIKKyAgICBWTEQxLjE2ICB7ZDEwLGQxMX0sW3IyXQorICAgIFZSU0hSLlMzMiBkMyxkMywjNQorICAgIFZBRERMLlU4IHEwLGQwLGQxCisgICAgVkRVUC4xNiAgcTAsZDFbM10KKyAgICBWU0hMLkkxNiBxMCxxMCwjNAorICAgIFZEVVAuMTYgIHEyLGQzWzBdCisgICAgVkRVUC4xNiAgcTMsZDNbMl0KKyAgICBWTVVMLkkxNiBxMixxMixxNQorICAgIFZNVUwuSTE2IHEzLHEzLHE1CisgICAgVkFERC5JMTYgcTIscTIscTAKKyAgICBWRFVQLjE2ICBxMCxkNlswXQorICAgIFZEVVAuMTYgIHExLGQ2WzFdCisgICAgVkRVUC4xNiAgcTQsZDZbMl0KKyAgICBWRFVQLjE2ICBxNSxkNlszXQorICAgIFZEVVAuMTYgIHE2LGQ3WzBdCisgICAgVkRVUC4xNiAgcTcsZDdbMV0KKyAgICBWRFVQLjE2ICBxOCxkN1syXQorICAgIFZEVVAuMTYgIHE5LGQ3WzNdCisgICAgVkFERC5JMTYgcTAscTIscTAKKyAgICBWQURELkkxNiBxMSxxMixxMQorICAgIFZBREQuSTE2IHE0LHEyLHE0CisgICAgVkFERC5JMTYgcTUscTIscTUKKyAgICBWQURELkkxNiBxNixxMixxNgorICAgIFZBREQuSTE2IHE3LHEyLHE3CisgICAgVkFERC5JMTYgcTgscTIscTgKKyAgICBWQURELkkxNiBxOSxxMixxOQorICAgIFZRUlNIUlVOLlMxNiBkMCxxMCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMSxxMSwjNQorICAgIFZRUlNIUlVOLlMxNiBkMixxNCwjNQorICAgIFZRUlNIUlVOLlMxNiBkMyxxNSwjNQorICAgIFZRUlNIUlVOLlMxNiBkNCxxNiwjNQorICAgIFZRUlNIUlVOLlMxNiBkNSxxNywjNQorICAgIFZRUlNIUlVOLlMxNiBkNixxOCwjNQorICAgIFZRUlNIUlVOLlMxNiBkNyxxOSwjNQorTDB4MjhjOgorICAgIEFERCAgICAgIHI5LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMX0sW3I5XSxyMTAKKyAgICBWU1QxLjggICB7ZDJ9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QzfSxbcjldLHIxMAorICAgIFZTVDEuOCAgIHtkNH0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDV9LFtyOV0scjEwCisgICAgVlNUMS44ICAge2Q2fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkN30sW3I5XQorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEwLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2X3MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI2OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDEwL3NyY19nY2Mvb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTZfcy5TCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorOy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOy8vIFRoaXMgdGFibGUgZm9yIGltcGxlbWVudGluZyBzd2l0Y2ggY2FzZSBvZiBDIGluIGFzbSBieQorOy8vIHRoZSBtZWh0b2Qgb2YgdHdvIGxldmVscyBvZiBpbmRleGluZy4KKzsvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXJtVkNNNFAxMF9wSW5kZXhUYWJsZTE2eDE2OgorICAgIC53b3JkICBPTVhfVkNfMTZYMTZfVkVSVCwgT01YX1ZDXzE2WDE2X0hPUgorICAgIC53b3JkICBPTVhfVkNfMTZYMTZfREMsICAgT01YX1ZDXzE2WDE2X1BMQU5FCisKKworCithcm1WQ000UDEwX011bHRpcGxpZXJUYWJsZTE2eDE2OgorICAgIC5od29yZCAgIDcsICA2LCAgNSwgIDQsICAzLCAgMiwgIDEsICA4CisgICAgLmh3b3JkICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcKKyAgICAuaHdvcmQgICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfMTZ4MTYKKyAgICAuZnVuYyAgIG9teFZDTTRQMTBfUHJlZGljdEludHJhXzE2eDE2CitvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV8xNngxNjoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTV9CisgICAgTERSICAgICAgcjksID1hcm1WQ000UDEwX3BJbmRleFRhYmxlMTZ4MTYKKyAgICBMRFIgICAgICByNixbc3AsIzB4NzBdCisgICAgTERSICAgICAgcjQsW3NwLCMweDY4XQorICAgIExEUiAgICAgIHI1LFtzcCwjMHg2Y10KKyAgICBMRFIgICAgICByNyxbc3AsIzB4NzRdCisgICAgTU9WICAgICAgcjEyLCMweDEwCisgICAgTERSICAgICAgcGMsW3I5LHI2LExTTCAjMl0KK09NWF9WQ18xNlgxNl9WRVJUOgorICAgIFZMRDEuOCAgIHtkMCxkMX0sW3IxXQorICAgIEFERCAgICAgIHI4LHIzLHI1CisgICAgQUREICAgICAgcjEwLHI1LHI1CisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2QwLGQxfSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkMCxkMX0sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyM10KKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyOF0KKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9IT1I6CisgICAgQUREICAgICAgcjgscjAscjQKKyAgICBBREQgICAgICByNCxyNCxyNAorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHI1LHI1LHI1CitMMHg4YzoKKyAgICBWTEQxLjggICB7ZDJbXSxkM1tdfSxbcjBdLHI0CisgICAgVkxEMS44ICAge2QwW10sZDFbXX0sW3I4XSxyNAorICAgIFNVQlMgICAgIHIxMixyMTIsIzgKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgVkxEMS44ICAge2QyW10sZDNbXX0sW3IwXSxyNAorICAgIFZMRDEuOCAgIHtkMFtdLGQxW119LFtyOF0scjQKKyAgICBWU1QxLjggICB7ZDIsZDN9LFtyM10scjUKKyAgICBWU1QxLjggICB7ZDAsZDF9LFtyMTFdLHI1CisgICAgQk5FICAgICAgTDB4OGMKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9EQzoKKyAgICBNT1YgICAgICByMTEsIzAKKyAgICBUU1QgICAgICByNywjMgorICAgIEJFUSAgICAgIEwweDE0YworICAgIEFERCAgICAgIHI4LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QyWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlsxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMls3XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzFdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1syXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbM119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzRdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s1XX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzddfSxbcjhdCisgICAgVlBBRERMLlU4IHEwLHExCisgICAgQUREICAgICAgcjExLHIxMSwjMQorICAgIFZQQURELkkxNiBkMCxkMCxkMQorICAgIFZQQURETC5VMTYgZDAsZDAKKyAgICBWUEFEREwuVTMyIGQ2LGQwCisgICAgVlJTSFIuVTY0IGQ4LGQ2LCM0CitMMHgxNGM6CisgICAgVFNUICAgICAgcjcsIzEKKyAgICBCRVEgICAgICBMMHgxNzAKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBBREQgICAgICByMTEscjExLCMxCisgICAgVlBBRERMLlU4IHEwLHEwCisgICAgVlBBREQuSTE2IGQwLGQwLGQxCisgICAgVlBBRERMLlUxNiBkMCxkMAorICAgIFZQQURETC5VMzIgZDcsZDAKKyAgICBWUlNIUi5VNjQgZDgsZDcsIzQKK0wweDE3MDoKKyAgICBDTVAgICAgICByMTEsIzIKKyAgICBCTkUgICAgICBMMHgxODAKKyAgICBWQURELkk2NCBkOCxkNyxkNgorICAgIFZSU0hSLlU2NCBkOCxkOCwjNQorTDB4MTgwOgorICAgIFZEVVAuOCAgIHEzLGQ4WzBdCisgICAgQ01QICAgICAgcjExLCMwCisgICAgQUREICAgICAgcjgscjMscjUKKyAgICBBREQgICAgICByMTAscjUscjUKKyAgICBCTkUgICAgICBMMHgxOTgKKyAgICBWTU9WLkk4ICBxMywjMHg4MAorTDB4MTk4OgorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyM10scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjhdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3IzXSxyMTAKKyAgICBWU1QxLjggICB7ZDYsZDd9LFtyOF0scjEwCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHIxMAorICAgIFZTVDEuOCAgIHtkNixkN30sW3I4XSxyMTAKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTV9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KK09NWF9WQ18xNlgxNl9QTEFORToKKyAgICBMRFIgICAgICByOSwgPWFybVZDTTRQMTBfTXVsdGlwbGllclRhYmxlMTZ4MTYKKyAgICBWTEQxLjggICB7ZDAsZDF9LFtyMV0KKyAgICBWTEQxLjggICB7ZDRbMF19LFtyMl0KKyAgICBBREQgICAgICByOCxyMCxyNAorICAgIEFERCAgICAgIHIxMCxyNCxyNAorICAgIFZMRDEuOCAgIHtkMlswXX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbMV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QyWzJdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMlszXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDJbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QyWzVdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkMls2XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDJbN119LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1sxXX0sW3I4XSxyMTAKKyAgICBWTEQxLjggICB7ZDNbMl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QzWzNdfSxbcjhdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s0XX0sW3IwXSxyMTAKKyAgICBWTEQxLjggICB7ZDNbNV19LFtyOF0scjEwCisgICAgVkxEMS44ICAge2QzWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkM1s3XX0sW3I4XQorICAgIFZSRVY2NC44IGQ1LGQxCisgICAgVlNVQkwuVTggcTMsZDUsZDQKKyAgICBWU0hSLlU2NCBkNSxkNSwjOAorICAgIFZTVUJMLlU4IHE0LGQ1LGQwCisgICAgVlNITC5JNjQgZDksZDksIzE2CisgICAgVkVYVC44ICAgZDksZDksZDYsIzIKKyAgICBWUkVWNjQuOCBkMTIsZDMKKyAgICBWU1VCTC5VOCBxNyxkMTIsZDQKKyAgICBWU0hSLlU2NCBkMTIsZDEyLCM4CisgICAgVlNVQkwuVTggcTgsZDEyLGQyCisgICAgVkxEMS4xNiAge2QyMCxkMjF9LFtyOV0hCisgICAgVlNITC5JNjQgZDE3LGQxNywjMTYKKyAgICBWRVhULjggICBkMTcsZDE3LGQxNCwjMgorICAgIFZNVUxMLlMxNiBxMTEsZDgsZDIwCisgICAgVk1VTEwuUzE2IHExMixkMTYsZDIwCisgICAgVk1MQUwuUzE2IHExMSxkOSxkMjEKKyAgICBWTUxBTC5TMTYgcTEyLGQxNyxkMjEKKyAgICBWUEFERC5JMzIgZDIyLGQyMyxkMjIKKyAgICBWUEFERC5JMzIgZDIzLGQyNSxkMjQKKyAgICBWUEFEREwuUzMyIHExMSxxMTEKKyAgICBWU0hMLkk2NCBxMTIscTExLCMyCisgICAgVkFERC5JNjQgcTExLHExMSxxMTIKKyAgICBWUlNIUi5TNjQgcTExLHExMSwjNgorICAgIFZTSEwuSTY0IHExMixxMTEsIzMKKyAgICBWU1VCLkk2NCBxMTIscTEyLHExMQorICAgIFZMRDEuMTYgIHtkMjAsZDIxfSxbcjldIQorICAgIFZEVVAuMTYgIHE2LGQyMlswXQorICAgIFZEVVAuMTYgIHE3LGQyM1swXQorICAgIFZBRERMLlU4IHExMSxkMSxkMworICAgIFZTSEwuSTE2IHExMSxxMTEsIzQKKyAgICBWRFVQLjE2ICBxMTEsZDIzWzNdCisgICAgVkFERC5JNjQgZDEsZDI0LGQyNQorICAgIFZMRDEuMTYgIHtkMjQsZDI1fSxbcjldCisgICAgVkRVUC4xNiAgcTEzLGQxWzBdCisgICAgVlNVQi5JMTYgcTEzLHExMSxxMTMKKyAgICBWTVVMLkkxNiBxNSxxNixxMTAKKyAgICBWTVVMLkkxNiBxNixxNixxMTIKKyAgICBWQURELkkxNiBxMCxxNSxxMTMKKyAgICBWQURELkkxNiBxMSxxNixxMTMKK0wweDJkNDoKKyAgICBWUVJTSFJVTi5TMTYgZDYscTAsIzUKKyAgICBWUVJTSFJVTi5TMTYgZDcscTEsIzUKKyAgICBTVUJTICAgICByMTIscjEyLCMxCisgICAgVlNUMS44ICAge2Q2LGQ3fSxbcjNdLHI1CisgICAgVkFERC5JMTYgcTAscTAscTcKKyAgICBWQURELkkxNiBxMSxxMSxxNworICAgIEJORSAgICAgIEwweDJkNAorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBPUCAgICAge2Q4LWQxNX0KKyAgICBQT1AgICAgICB7cjQtcjEyLHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NF9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNmQ3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDRfcy5TCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKworICAgIC5zZWN0aW9uIC5yb2RhdGEKKyAgICAuYWxpZ24gNAorCithcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NDoKKyAgICAud29yZCBPTVhfVkNfNHg0X1ZFUlQsICAgICBPTVhfVkNfNHg0X0hPUgorICAgIC53b3JkIE9NWF9WQ180eDRfREMsICAgICAgIE9NWF9WQ180eDRfRElBR19ETAorICAgIC53b3JkIE9NWF9WQ180eDRfRElBR19EUiwgIE9NWF9WQ180eDRfVlIKKyAgICAud29yZCBPTVhfVkNfNHg0X0hELCAgICAgICBPTVhfVkNfNHg0X1ZMCisgICAgLndvcmQgT01YX1ZDXzR4NF9IVQorCisgICAgLnRleHQKKworICAgIC5nbG9iYWwgb214VkNNNFAxMF9QcmVkaWN0SW50cmFfNHg0CisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1ByZWRpY3RJbnRyYV80eDQKK29teFZDTTRQMTBfUHJlZGljdEludHJhXzR4NDoKKyAgICBQVVNIICAgICB7cjQtcjEyLGxyfQorICAgIFZQVVNIICAgIHtkOC1kMTJ9CisgICAgTERSICAgICAgcjgsID1hcm1WQ000UDEwX3BTd2l0Y2hUYWJsZTR4NAorICAgIExEUkQgICAgIHI2LHI3LFtzcCwjMHg1OF0KKyAgICBMRFJEICAgICByNCxyNSxbc3AsIzB4NTBdCisgICAgTERSICAgICAgcGMsW3I4LHI2LExTTCAjMl0KK09NWF9WQ180eDRfSE9SOgorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwW119LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxW119LFtyOV0scjEwCisgICAgVkxEMS44ICAge2QyW119LFtyMF0KKyAgICBWTEQxLjggICB7ZDNbXX0sW3I5XQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDFbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkMlswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkM1swXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVkVSVDoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKK0wweDU4OgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDBbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkMFswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfREM6CisgICAgVFNUICAgICAgcjcsIzIKKyAgICBCRVEgICAgICBMMHhkYworICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QwWzBdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMFsxXX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDBbMl19LFtyMF0KKyAgICBWTEQxLjggICB7ZDBbM119LFtyOV0KKyAgICBUU1QgICAgICByNywjMQorICAgIEJFUSAgICAgIEwweGJjCisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDEsZDAKKyAgICBWUEFEREwuVTE2IGQxLGQxCisgICAgVlBBRERMLlUzMiBkMSxkMQorICAgIFZSU0hSLlU2NCBkMSxkMSwjMworICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweGJjOgorICAgIE1PViAgICAgIHIwLCMwCisgICAgVlBBRERMLlU4IGQxLGQwCisgICAgVlBBRERMLlUxNiBkMSxkMQorICAgIFZSU0hSLlUzMiBkMSxkMSwjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZEVVAuOCAgIGQwLGQxWzBdCisgICAgQiAgICAgICAgTDB4NTgKK0wweGRjOgorICAgIFRTVCAgICAgIHI3LCMxCisgICAgQkVRICAgICAgTDB4MTA4CisgICAgVkxEMS4zMiAge2QwWzBdfSxbcjFdCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBWUEFEREwuVTggZDEsZDAKKyAgICBWUEFEREwuVTE2IGQxLGQxCisgICAgVlJTSFIuVTMyIGQxLGQxLCMyCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgVkRVUC44ICAgZDAsZDFbMF0KKyAgICBCICAgICAgICBMMHg1OAorTDB4MTA4OgorICAgIFZNT1YuSTggIGQwLCMweDgwCisgICAgTU9WICAgICAgcjAsIzAKKyAgICBBREQgICAgICByMTEscjMscjUKKyAgICBBREQgICAgICByMTIscjUscjUKKyAgICBCICAgICAgICBMMHg1OAorT01YX1ZDXzR4NF9ESUFHX0RMOgorICAgIFRTVCAgICAgIHI3LCMweDQwCisgICAgQkVRICAgICAgTDB4MTM4CisgICAgVkxEMS44ICAge2QzfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDNbN10KKyAgICBWRVhULjggICBkNCxkMyxkMiwjMQorICAgIFZFWFQuOCAgIGQ1LGQzLGQyLCMyCisgICAgQiAgICAgICAgTDB4MTRjCitMMHgxMzg6CisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDBbN10KKyAgICBWRVhULjggICBkMyxkMCxkMiwjNAorICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1CisgICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKK0wweDE0YzoKKyAgICBWSEFERC5VOCBkNixkMyxkNQorICAgIFZSSEFERC5VOCBkNixkNixkNAorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyM10scjUKKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9ESUFHX0RSOgorICAgIFZMRDEuMzIgIHtkMFswXX0sW3IxXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgQUREICAgICAgcjEscjMscjUKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs0XX0sW3IwXQorICAgIFZMRDEuOCAgIHtkMVszXX0sW3I5XQorICAgIFZFWFQuOCAgIGQzLGQxLGQwLCMzCisgICAgQUREICAgICAgcjQscjEscjUKKyAgICBWRVhULjggICBkNCxkMSxkMCwjNAorICAgIEFERCAgICAgIHI2LHI0LHI1CisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzUKKyAgICBWSEFERC5VOCBkNixkMyxkNQorICAgIFZSSEFERC5VOCBkNixkNixkNAorICAgIFZTVDEuMzIgIHtkNlswXX0sW3I2XQorICAgIFZFWFQuOCAgIGQ2LGQ2LGQ2LCMxCisgICAgVlNUMS4zMiAge2Q2WzBdfSxbcjRdCisgICAgVkVYVC44ICAgZDYsZDYsZDYsIzEKKyAgICBWU1QxLjMyICB7ZDZbMF19LFtyMV0KKyAgICBWRVhULjggICBkNixkNixkNiwjMQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IzXQorICAgIEIgICAgICAgIEwweDM0OAorT01YX1ZDXzR4NF9WUjoKKyAgICBWTEQxLjMyICB7ZDBbMF19LFtyMV0KKyAgICBWTEQxLjggICB7ZDBbN119LFtyMl0KKyAgICBWTEQxLjggICB7ZDFbN119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDJbN119LFtyMF0scjQKKyAgICBWTEQxLjggICB7ZDFbNl19LFtyMF0KKyAgICBWRVhULjggICBkMTIsZDAsZDAsIzcKKyAgICBWRVhULjggICBkMyxkMSxkMTIsIzYKKyAgICBWRVhULjggICBkNCxkMixkMTIsIzcKKyAgICBWRVhULjggICBkNSxkMSxkMCwjNworICAgIFZFWFQuOCAgIGQ2LGQyLGQwLCM3CisgICAgVkVYVC44ICAgZDExLGQxLGQxMiwjNworICAgIFZIQURELlU4IGQ4LGQ2LGQxMgorICAgIFZSSEFERC5VOCBkOCxkOCxkMTEKKyAgICBWSEFERC5VOCBkNyxkMyxkNQorICAgIFZSSEFERC5VOCBkNyxkNyxkNAorICAgIFZFWFQuOCAgIGQxMCxkOCxkOCwjMQorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZFWFQuOCAgIGQ5LGQ3LGQ3LCMxCisgICAgVlNUMS4zMiAge2QxMFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDlbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDdbMF19LFtyMTFdCisgICAgQiAgICAgICAgTDB4MzQ4CitPTVhfVkNfNHg0X0hEOgorICAgIFZMRDEuOCAgIHtkMH0sW3IxXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3IyXQorICAgIEFERCAgICAgIHI5LHIwLHI0CisgICAgQUREICAgICAgcjEwLHI0LHI0CisgICAgVkxEMS44ICAge2QxWzZdfSxbcjBdLHIxMAorICAgIFZMRDEuOCAgIHtkMVs1XX0sW3I5XSxyMTAKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0KKyAgICBWTEQxLjggICB7ZDFbM119LFtyOV0KKyAgICBWRVhULjggICBkMyxkMSxkMCwjMworICAgIFZFWFQuOCAgIGQ0LGQxLGQwLCMyCisgICAgVkVYVC44ICAgZDUsZDEsZDAsIzEKKyAgICBWSEFERC5VOCBkNyxkMyxkNQorICAgIFZSSEFERC5VOCBkNyxkNyxkNAorICAgIFZSSEFERC5VOCBkOCxkNCxkMworICAgIFZTSEwuSTY0IGQ4LGQ4LCMyNAorICAgIFZTSEwuSTY0IGQ2LGQ3LCMxNgorICAgIFZaSVAuOCAgIGQ4LGQ2CisgICAgVkVYVC44ICAgZDcsZDcsZDcsIzYKKyAgICBWRVhULjggICBkOCxkNixkNywjMgorICAgIEFERCAgICAgIHIxMSxyMyxyNQorICAgIEFERCAgICAgIHIxMixyNSxyNQorICAgIFZTVDEuMzIgIHtkOFsxXX0sW3IzXSxyMTIKKyAgICBWU1QxLjMyICB7ZDZbMV19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkNlswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfVkw6CisgICAgVFNUICAgICAgcjcsIzB4NDAKKyAgICBCRVEgICAgICBMMHgyYjQKKyAgICBWTEQxLjggICB7ZDN9LFtyMV0KKyAgICBWRVhULjggICBkNCxkMyxkMywjMQorICAgIFZFWFQuOCAgIGQ1LGQ0LGQ0LCMxCisgICAgQiAgICAgICAgTDB4MmM4CitMMHgyYjQ6CisgICAgVkxEMS4zMiAge2QwWzFdfSxbcjFdCisgICAgVkRVUC44ICAgZDIsZDBbN10KKyAgICBWRVhULjggICBkMyxkMCxkMiwjNAorICAgIFZFWFQuOCAgIGQ0LGQwLGQyLCM1CisgICAgVkVYVC44ICAgZDUsZDAsZDIsIzYKK0wweDJjODoKKyAgICBWUkhBREQuVTggZDcsZDQsZDMKKyAgICBWSEFERC5VOCBkMTAsZDMsZDUKKyAgICBWUkhBREQuVTggZDEwLGQxMCxkNAorICAgIFZFWFQuOCAgIGQ4LGQ3LGQ3LCMxCisgICAgQUREICAgICAgcjExLHIzLHI1CisgICAgQUREICAgICAgcjEyLHI1LHI1CisgICAgVkVYVC44ICAgZDksZDEwLGQ4LCMxCisgICAgVlNUMS4zMiAge2Q3WzBdfSxbcjNdLHIxMgorICAgIFZTVDEuMzIgIHtkMTBbMF19LFtyMTFdLHIxMgorICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXQorICAgIFZTVDEuMzIgIHtkOVswXX0sW3IxMV0KKyAgICBCICAgICAgICBMMHgzNDgKK09NWF9WQ180eDRfSFU6CisgICAgQUREICAgICAgcjkscjAscjQKKyAgICBBREQgICAgICByMTAscjQscjQKKyAgICBWTEQxLjggICB7ZDFbNF19LFtyMF0scjEwCisgICAgVkxEMS44ICAge2QxWzVdfSxbcjldLHIxMAorICAgIFZMRDEuOCAgIHtkMVs2XX0sW3IwXQorICAgIFZMRDEuOCAgIHtkMVs3XX0sW3I5XQorICAgIFZEVVAuOCAgIGQyLGQxWzddCisgICAgVkVYVC44ICAgZDMsZDEsZDIsIzQKKyAgICBWRVhULjggICBkNCxkMSxkMiwjNQorICAgIFZFWFQuOCAgIGQ1LGQxLGQyLCM2CisgICAgVkhBREQuVTggZDcsZDMsZDUKKyAgICBWUkhBREQuVTggZDcsZDcsZDQKKyAgICBWUkhBREQuVTggZDgsZDQsZDMKKyAgICBWWklQLjggICBkOCxkNworICAgIFZTVDEuMzIgIHtkOFswXX0sW3IzXSxyNQorICAgIFZFWFQuOCAgIGQ4LGQ4LGQ4LCMyCisgICAgVlNUMS4zMiAge2Q4WzBdfSxbcjNdLHI1CisgICAgVkVYVC44ICAgZDgsZDgsZDgsIzIKKyAgICBWU1QxLjMyICB7ZDhbMF19LFtyM10scjUKKyAgICBWU1QxLjMyICB7ZDdbMF19LFtyM10KK0wweDM0ODoKKyAgICBNT1YgICAgICByMCwjMAorICAgIFZQT1AgICAgIHtkOC1kMTJ9CisgICAgUE9QICAgICAge3I0LXIxMixwY30KKyAgICAuZW5kZnVuYworCisgICAgLmVuZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudENocm9tYURDRnJvbVBhaXJfcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTg5Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyX3MuUwpAQCAtMCwwICsxLDU0IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCisgICAgLmZ1bmMgICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyCitvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRDaHJvbWFEQ0Zyb21QYWlyOgorICAgIHB1c2ggICAge3I0LXIxMCwgbHJ9CisgICAgbGRyICAgICByOSwgW3IwLCMwXQorICAgIHZtb3YuaTE2ICAgIGQwLCAjMAorICAgIG1vdiAgICAgcjgsICMweDFmCisgICAgdnN0MS4xNiAgICB7ZDB9LCBbcjFdCisgICAgbGRyYiAgICByNiwgW3I5XSwgIzEKK3VucGFja0xvb3A6CisgICAgdHN0ICAgICByNiwgIzB4MTAKKyAgICBsZHJuZXNiIHI1LCBbcjksICMxXQorICAgIGxkcm5lYiAgcjQsIFtyOV0sICMyCisgICAgYW5kICAgICByNywgcjgsIHI2LCBsc2wgIzEKKyAgICBsZHJlcXNiIHI0LCBbcjldLCAjMQorICAgIG9ycm5lICAgcjQsIHI0LCByNSwgbHNsICM4CisgICAgdHN0ICAgICByNiwgIzB4MjAKKyAgICBsZHJlcWIgIHI2LCBbcjldLCAjMQorICAgIHN0cmggICAgcjQsIFtyMSwgcjddCisgICAgYmVxICAgICB1bnBhY2tMb29wCisgICAgbGRtaWEgICByMSwge3IzLCByNH0KKyAgICBzdHIgICAgIHI5LCBbcjAsICMwXQorICAgIGxkciAgICAgcjUsID1hcm1WQ000UDEwX1FQRGl2VGFibGUKKyAgICBsZHIgICAgIHI2LCA9YXJtVkNNNFAxMF9WTWF0cml4UVBNb2RUYWJsZQorICAgIHNhZGRzdWJ4ICAgICAgICByMywgcjMsIHIzCisgICAgc2FkZHN1YnggICAgICAgIHI0LCByNCwgcjQKKyAgICBsZHJzYiAgIHI5LCBbcjUsIHIyXQorICAgIGxkcnNiICAgcjIsIFtyNiwgcjJdCisgICAgc2FkZDE2ICByNSwgcjMsIHI0CisgICAgc3N1YjE2ICByNiwgcjMsIHI0CisgICAgbHNsICAgICByMiwgcjIsIHI5CisgICAgdm1vdiAgICBkMCwgcjUsIHI2CisgICAgdnJldjMyLjE2ICBkMCwgZDAKKyAgICB2ZHVwLjE2ICAgIGQxLCByMgorICAgIHZtdWxsLnMxNiAgIHExLCBkMCwgZDEKKyAgICB2c2hybi5pMzIgICBkMiwgcTEsICMxCisgICAgdnN0MS4xNiAgICB7ZDJ9LCBbcjFdCisgICAgbW92ICAgICByMCwgIzAKKyAgICBwb3AgICAgIHtyNC1yMTAsIHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMTAvc3JjX2djYy9vbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcl9zLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMDcxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAxMC9zcmNfZ2NjL29teFZDTTRQMTBfVHJhbnNmb3JtRGVxdWFudEx1bWFEQ0Zyb21QYWlyX3MuUwpAQCAtMCwwICsxLDc2IEBACisvKgorICogKGMpIENvcHlyaWdodCAyMDA3LTIwMDggQVJNIExpbWl0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICovCisKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjQsIDEKKyAgICAuZWFiaV9hdHRyaWJ1dGUgMjUsIDEKKworICAgIC5hcm0KKyAgICAuZnB1IG5lb24KKyAgICAudGV4dAorCisgICAgLmdsb2JhbCBhcm1WQ000UDEwX0ludlRyYW5zZm9ybURlcXVhbnRMdW1hREM0eDQKKyAgICAuZnVuYyAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorYXJtVkNNNFAxMF9JbnZUcmFuc2Zvcm1EZXF1YW50THVtYURDNHg0OgorICAgIFBVU0ggICAgIHtyNC1yNixscn0KKyAgICBWUFVTSCAgICB7ZDgtZDEzfQorICAgIFZMRDQuMTYgIHtkMCxkMSxkMixkM30sW3IwXQorICAgIExEUiAgICAgIHIyLCA9YXJtVkNNNFAxMF9RUERpdlRhYmxlCisgICAgTERSICAgICAgcjMsID1hcm1WQ000UDEwX1ZNYXRyaXhRUE1vZFRhYmxlCisgICAgVkFERC5JMTYgZDQsZDAsZDEKKyAgICBWQURELkkxNiBkNSxkMixkMworICAgIFZTVUIuSTE2IGQ2LGQwLGQxCisgICAgTERSU0IgICAgcjQsW3IyLHIxXQorICAgIFZTVUIuSTE2IGQ3LGQyLGQzCisgICAgTERSU0IgICAgcjUsW3IzLHIxXQorICAgIFZBREQuSTE2IGQwLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDEsZDQsZDUKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIExTTCAgICAgIHI1LHI1LHI0CisgICAgVkFERC5JMTYgZDMsZDYsZDcKKyAgICBWVFJOLjE2ICBkMCxkMQorICAgIFZUUk4uMTYgIGQyLGQzCisgICAgVlRSTi4zMiAgcTAscTEKKyAgICBWQURELkkxNiBkNCxkMCxkMQorICAgIFZBREQuSTE2IGQ1LGQyLGQzCisgICAgVlNVQi5JMTYgZDYsZDAsZDEKKyAgICBWU1VCLkkxNiBkNyxkMixkMworICAgIFZBREQuSTE2IGQwLGQ0LGQ1CisgICAgVlNVQi5JMTYgZDEsZDQsZDUKKyAgICBWU1VCLkkxNiBkMixkNixkNworICAgIFZBREQuSTE2IGQzLGQ2LGQ3CisgICAgVkRVUC4xNiAgZDUscjUKKyAgICBWTU9WLkkzMiBxMywjMHgyCisgICAgVk1PVi5JMzIgcTQsIzB4MgorICAgIFZNT1YuSTMyIHE1LCMweDIKKyAgICBWTU9WLkkzMiBxNiwjMHgyCisgICAgVk1MQUwuUzE2IHEzLGQwLGQ1CisgICAgVk1MQUwuUzE2IHE0LGQxLGQ1CisgICAgVk1MQUwuUzE2IHE1LGQyLGQ1CisgICAgVk1MQUwuUzE2IHE2LGQzLGQ1CisgICAgVlNIUk4uSTMyIGQwLHEzLCMyCisgICAgVlNIUk4uSTMyIGQxLHE0LCMyCisgICAgVlNIUk4uSTMyIGQyLHE1LCMyCisgICAgVlNIUk4uSTMyIGQzLHE2LCMyCisgICAgVlNUMS4xNiAge2QwLGQxLGQyLGQzfSxbcjBdCisgICAgVlBPUCAgICAge2Q4LWQxM30KKyAgICBQT1AgICAgICB7cjQtcjYscGN9CisgICAgLmVuZGZ1bmMKKworLmdsb2JhbCBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorLmZ1bmMgICBvbXhWQ000UDEwX1RyYW5zZm9ybURlcXVhbnRMdW1hRENGcm9tUGFpcgorb214VkNNNFAxMF9UcmFuc2Zvcm1EZXF1YW50THVtYURDRnJvbVBhaXI6CisgICAgUFVTSCAgICAge3I0LXI2LGxyfQorICAgIE1PViAgICAgIHI0LHIxCisgICAgTU9WICAgICAgcjUscjIKKyAgICBCTCAgICAgICBhcm1WQ000UDEwX1VucGFja0Jsb2NrNHg0CisgICAgTU9WICAgICAgcjAscjQKKyAgICBNT1YgICAgICByMSxyNQorICAgIEJMICAgICAgIGFybVZDTTRQMTBfSW52VHJhbnNmb3JtRGVxdWFudEx1bWFEQzR4NAorICAgIE1PViAgICAgIHIwLCMwCisgICAgUE9QICAgICAge3I0LXI2LHBjfQorICAgIC5lbmRmdW5jCisKKyAgICAuZW5kCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL2FwaS9hcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0YjU1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX0h1ZmZfVGFibGVzX1ZMQy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogCisgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfSHVmZl9UYWJsZXNfVkxDLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfSHVmZl9UYWJsZXMuaAorICogRGVzY3JpcHRpb246IERlY2xhcmVzIFRhYmxlcyB1c2VkIGZvciBIdWZmZm1hbiBjb2RpbmcgYW5kIGRlY29kaW5nIAorICogICAgICAgICAgICAgIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YSFVGRlRBQl9IXworI2RlZmluZSBfT01YSFVGRlRBQl9IXworCisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9JbnRyYVZsY0wwTDFbMjAwXTsKKworCitleHRlcm4gY29uc3QgT01YX1UxNiBhcm1WQ000UDJfSW50ZXJWbGNMMEwxWzIwMF07CisKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0x1bWFDaHJvbWFJbmRleFs2NF07CisvL2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hSW50cmFEQ0Nocm9tYUluZGV4WzMyXTsKK2V4dGVybiBjb25zdCBPTVhfVTE2IGFybVZDTTRQMl9hVmxjTVZEWzEyNF07CisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludGVyTDBMMUxNQVhbNzNdOworZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfSW50ZXJMMEwxUk1BWFszNV07CitleHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9JbnRyYUwwTDFMTUFYWzUzXTsKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX0ludHJhTDBMMVJNQVhbNDBdCisKKyNlbmRpZiAvKiBfT01YSFVGRlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9hcGkvYXJtVkNNNFAyX1ppZ1phZ19UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTUyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvYXBpL2FybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAKKyAqIEZpbGUgTmFtZTogIGFybVZDTTRQMl9aaWdaYWdfVGFibGVzLmgKKyAqIE9wZW5NQVggREw6IHYxLjAuMgorICogUmV2aXNpb246ICAgMTIyOTAKKyAqIERhdGU6ICAgICAgIFdlZG5lc2RheSwgQXByaWwgOSwgMjAwOAorICogCisgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogCisgKgorICoKKyAqIEZpbGU6ICAgICAgICBhcm1WQ000UDJfWmlnemFnX1RhYmxlcy5oCisgKiBEZXNjcmlwdGlvbjogRGVjbGFyZXMgVGFibGVzIHVzZWQgZm9yIFppZ3phZyBzY2FuIGluIE1QNFAyIGNvZGVjLgorICoKKyAqLworIAorI2lmbmRlZiBfT01YWklHWkFHVEFCX0gKKyNkZWZpbmUgX09NWFpJR1pBR1RBQl9ICisKK2V4dGVybiBjb25zdCBPTVhfVTggYXJtVkNNNFAyX2FDbGFzc2ljYWxaaWd6YWdTY2FuIFsxOTJdOworLy9leHRlcm4gY29uc3QgT01YX1U4IGFybVZDTTRQMl9hSG9yaXpvbnRhbFppZ3phZ1NjYW4gWzY0XTsKKy8vZXh0ZXJuIGNvbnN0IE9NWF9VOCBhcm1WQ000UDJfYVZlcnRpY2FsWmlnemFnU2NhbiBbNjRdOworCisjZW5kaWYgLyogX09NWFpJR1pBR1RBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0NsaXA4X3MucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NWZlNmQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9oMjY0ZGVjL29teGRsL2FybV9uZW9uL3ZjL200cDIvc3JjL2FybVZDTTRQMl9DbGlwOF9zLnMKQEAgLTAsMCArMSw4MiBAQAorOyAvKioKKzsgKiAKKzsgKiBGaWxlIE5hbWU6ICBhcm1WQ000UDJfQ2xpcDhfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGUgZm9yIENsaXBwaW5nIDE2IGJpdCB2YWx1ZSB0byBbMCwyNTVdIFJhbmdlCis7ICovIAorCisgICAgICBJTkNMVURFIG9teHR5cGVzX3MuaAorICAgICAgSU5DTFVERSBhcm1DT01NX3MuaAorICAgICAgCisKKyAgICAgIE1fVkFSSUFOVFMgQ29ydGV4QTgKKworICAgICAgSUYgQ29ydGV4QTgKKzsvL0lucHV0IEFyZ3VtZW50cworCitwU3JjICAgICAgICAgICAgICAgICBSTiAwCitwRHN0ICAgICAgICAgICAgICAgICBSTiAxCitzdGVwICAgICAgICAgICAgICAgICBSTiAyCisKKzsvLyBOZW9uIFJlZ2lzdGVycworCitxeDAgICAgICAgICAgICAgICAgICBRTiAgUTAuUzE2ICAgICAgICAgICAgICAgICAgCitkeDAwICAgICAgICAgICAgICAgICBETiAgRDAuUzE2CitkeDAxICAgICAgICAgICAgICAgICBETiAgRDEuUzE2CitxeDEgICAgICAgICAgICAgICAgICBRTiAgUTEuUzE2CitkeDEwICAgICAgICAgICAgICAgICBETiAgRDIuUzE2CitkeDExICAgICAgICAgICAgICAgICBETiAgRDMuUzE2CisKK3F4MiAgICAgICAgICAgICAgICAgIFFOICBRMi5TMTYgICAgICAgICAgICAgICAgICAKK2R4MjAgICAgICAgICAgICAgICAgIEROICBENC5TMTYKK2R4MjEgICAgICAgICAgICAgICAgIEROICBENS5TMTYKK3F4MyAgICAgICAgICAgICAgICAgIFFOICBRMy5TMTYKK2R4MzAgICAgICAgICAgICAgICAgIEROICBENi5TMTYKK2R4MzEgICAgICAgICAgICAgICAgIEROICBENy5TMTYKKworCitkY2xpcDAgICAgICAgICAgICAgICBETiAgRDAuVTgKK2RjbGlwMSAgICAgICAgICAgICAgIEROICBEMi5VOCAKK2RjbGlwMiAgICAgICAgICAgICAgIEROICBENC5VOAorZGNsaXAzICAgICAgICAgICAgICAgRE4gIEQ2LlU4CisgCisgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfQ2xpcDgKKworICAgICAgIFZMRDEgICAgICAgICAge2R4MDAsZHgwMSxkeDEwLGR4MTF9LFtwU3JjXSEgICAgICAgICAgOy8vIExvYWQgMTYgZW50cmllcyBmcm9tIHBTcmMKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDIwLGR4MjEsZHgzMCxkeDMxfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIG5leHQgMTYgZW50cmllcyBmcm9tIHBTcmMgIAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAwLHF4MCwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMFtpXT1jbGlwIHF4MFtpXSB0byBbMCwyNTVdCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDEscXgxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZGNsaXAxW2ldPWNsaXAgcXgxW2ldIHRvIFswLDI1NV0KKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDB9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMX0sW3BEc3RdLHN0ZXAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIDggYnl0ZXMgYW5kIHBEc3Q9cERzdCtzdGVwCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDIscXgyLCMwCisgICAgICAgVlFTSFJVTiAgICAgICBkY2xpcDMscXgzLCMwCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAyfSxbcERzdF0sc3RlcAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwM30sW3BEc3RdLHN0ZXAKKyAgICAgICAKKyAgICAgICBWTEQxICAgICAgICAgIHtkeDAwLGR4MDEsZHgxMCxkeDExfSxbcFNyY10hICAgICAgICAgIDsvLyBMb2FkIDE2IGVudHJpZXMgZnJvbSBwU3JjCisgICAgICAgVkxEMSAgICAgICAgICB7ZHgyMCxkeDIxLGR4MzAsZHgzMX0sW3BTcmNdISAgICAgICAgICA7Ly8gTG9hZCBuZXh0IDE2IGVudHJpZXMgZnJvbSBwU3JjICAKKyAgICAgICBWUVNIUlVOICAgICAgIGRjbGlwMCxxeDAsIzAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBkY2xpcDBbaV09Y2xpcCBxeDBbaV0gdG8gWzAsMjU1XQorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAxLHF4MSwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIGRjbGlwMVtpXT1jbGlwIHF4MVtpXSB0byBbMCwyNTVdCisgICAgICAgVlNUMSAgICAgICAgICB7ZGNsaXAwfSxbcERzdF0sc3RlcCAgICAgICAgICAgICAgICAgICA7Ly8gc3RvcmUgOCBieXRlcyBhbmQgcERzdD1wRHN0K3N0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDF9LFtwRHN0XSxzdGVwICAgICAgICAgICAgICAgICAgIDsvLyBzdG9yZSA4IGJ5dGVzIGFuZCBwRHN0PXBEc3Qrc3RlcAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAyLHF4MiwjMAorICAgICAgIFZRU0hSVU4gICAgICAgZGNsaXAzLHF4MywjMAorICAgICAgIFZTVDEgICAgICAgICAge2RjbGlwMn0sW3BEc3RdLHN0ZXAKKyAgICAgICBWU1QxICAgICAgICAgIHtkY2xpcDN9LFtwRHN0XSxzdGVwCisKKworICAgICAgIAorICAgICAgICBNX0VORAorICAgICAgICBFTkRJRgorICAgICAgICAKKyAgICAgCisgICAgICAgIAorICAgICAgICBFTkQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9vbXhkbC9hcm1fbmVvbi92Yy9tNHAyL3NyYy9hcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZV9zLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0YTdmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvb214ZGwvYXJtX25lb24vdmMvbTRwMi9zcmMvYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCkBAIC0wLDAgKzEsMzk4IEBACis7LyoqCis7ICogCis7ICogRmlsZSBOYW1lOiAgYXJtVkNNNFAyX0RlY29kZVZMQ1ppZ3phZ19BQ191bnNhZmVfcy5zCis7ICogT3Blbk1BWCBETDogdjEuMC4yCis7ICogUmV2aXNpb246ICAgMTIyOTAKKzsgKiBEYXRlOiAgICAgICBXZWRuZXNkYXksIEFwcmlsIDksIDIwMDgKKzsgKiAKKzsgKiAoYykgQ29weXJpZ2h0IDIwMDctMjAwOCBBUk0gTGltaXRlZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKzsgKiAKKzsgKiAKKzsgKgorOyAqIERlc2NyaXB0aW9uOiAKKzsgKiBDb250YWlucyBtb2R1bGVzIGZvciB6aWd6YWcgc2Nhbm5pbmcgYW5kIFZMQyBkZWNvZGluZworOyAqIGZvciBpbnRlciwgaW50cmEgYmxvY2suCis7ICoKKzsgKgorOyAqCis7ICogRnVuY3Rpb246IG9teFZDTTRQMl9EZWNvZGVWTENaaWd6YWdfQUNfdW5zYWZlCis7ICoKKzsgKiBEZXNjcmlwdGlvbjoKKzsgKiBQZXJmb3JtcyBWTEMgZGVjb2RpbmcgYW5kIGludmVyc2UgemlnemFnIHNjYW4gCis7ICoKKzsgKiAKKzsgKgorOyAqIAorOyAqLworCisKKyAgICAgIElOQ0xVREUgb214dHlwZXNfcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fcy5oCisgICAgICBJTkNMVURFIGFybUNPTU1fQml0RGVjX3MuaAorCisKKyAgICAgIE1fVkFSSUFOVFMgQVJNMTEzNkpTCisKKyAgICAgCisKKworCisgICAgIElGIEFSTTExMzZKUworICAgICAKKyAgICAgICAgCisKKworCis7Ly9JbnB1dCBBcmd1bWVudHMKKworcHBCaXRTdHJlYW0gICAgICAgICAgUk4gMAorcEJpdE9mZnNldCAgICAgICAgICAgUk4gMQorcERzdCAgICAgICAgICAgICAgICAgUk4gMgorc2hvcnRWaWRlb0hlYWRlciAgICAgUk4gMworCisKKzsvL0xvY2FsIFZhcmlhYmxlcworCitSZXR1cm4gICAgICAgICAgICAgICBSTiAwCisKK3BWbGNUYWJsZUwwTDEgICAgICAgIFJOIDQKK3BMTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BSTUFYVGFibGVMMEwxICAgICAgIFJOIDQKK3BaaWd6YWdUYWJsZSAgICAgICAgIFJOIDQKKworZnR5cGUgICAgICAgICAgICAgICAgUk4gMAordGVtcDMgICAgICAgICAgICAgICAgUk4gNAordGVtcCAgICAgICAgICAgICAgICAgUk4gNQorQ291bnQgICAgICAgICAgICAgICAgUk4gNgorRXNjYXBlICAgICAgICAgICAgICAgUk4gNQorCis7Ly8gYXJtVkNNNFAyX0ZpbGxWTERCdWZmZXIKK3ppZ3phZyAgICAgICAgICAgICAgIFJOIDAKK3N0b3JlTGV2ZWwgICAgICAgICAgIFJOIDEKK3RlbXAyICAgICAgICAgICAgICAgIFJOIDQKK3RlbXAxICAgICAgICAgICAgICAgIFJOIDUKK3NpZ24gICAgICAgICAgICAgICAgIFJOIDUKK0xhc3QgICAgICAgICAgICAgICAgIFJOIDcKK3N0b3JlUnVuICAgICAgICAgICAgIFJOIDE0CisKKworcGFja1JldEluZGV4ICAgICAgICAgUk4gNQorCisKK21hcmtlcmJpdCAgICAgICAgICAgIFJOIDUKKworOy8vIFNjcmF0Y2ggUmVnaXN0ZXJzCisKK1JCaXRTdHJlYW0gICAgICAgICAgIFJOIDgKK1JCaXRCdWZmZXIgICAgICAgICAgIFJOIDkKK1JCaXRDb3VudCAgICAgICAgICAgIFJOIDEwCisKK1QxICAgICAgICAgICAgICAgICAgIFJOIDExCitUMiAgICAgICAgICAgICAgICAgICBSTiAxMgorTFIgICAgICAgICAgICAgICAgICAgUk4gMTQgICAgICAgIAorICAgICAgICAKKworCisgICAgICAgIE1fQUxMT0M0ICAgICAgICBwcHBCaXRTdHJlYW0sNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcHBPZmZzZXQsNAorICAgICAgICBNX0FMTE9DNCAgICAgICAgcExpbmtSZWdpc3Rlciw0ICAgICAgIAorICAgICAgICAKKyAgICAgICAgTV9TVEFSVCBhcm1WQ000UDJfRGVjb2RlVkxDWmlnemFnX0FDX3Vuc2FmZQorCisgICAgICAgIDsvLyBnZXQgdGhlIHRhYmxlIGFkZHJlc3NlcyBmcm9tIHN0YWNrICAgICAgIAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBWbGNUYWJsZUwwTDEsNAorICAgICAgICBNX0FSRyAgICAgICAgICAgcHBMTUFYVGFibGVMMEwxLDQKKyAgICAgICAgTV9BUkcgICAgICAgICAgIHBwUk1BWFRhYmxlTDBMMSw0CisgICAgICAgIE1fQVJHICAgICAgICAgICBwcFppZ3phZ1RhYmxlLDQKKyAgICAgICAgCisgICAgICAgIDsvLyBTdG9yZSBBTEwgemVyb3MgYXQgcERzdAorICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAxLCMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJbml0aWFsaXplIENvdW50IHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNT1YgICAgICAgICAgICAgTGFzdCwjMAorICAgICAgICBNX1NUUiAgICAgICAgICAgTFIscExpbmtSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIFN0b3JlIExpbmsgUmVnaXN0ZXIgb24gU3RhY2sKKyAgICAgICAgTU9WICAgICAgICAgICAgIHRlbXAyLCMwCisgICAgICAgIE1PViAgICAgICAgICAgICBMUiwjMCAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBJbml0aWFsaXplIHRoZSBNYWNybyBhbmQgU3RvcmUgYWxsIHplcm9zIHRvIHBEc3QgCisgIAorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9ICAgICAgICAgICAgICAgICAgIAorICAgICAgICBNX0JEX0lOSVQwICAgICAgcHBCaXRTdHJlYW0sIHBCaXRPZmZzZXQsIFJCaXRTdHJlYW0sIFJCaXRCdWZmZXIsIFJCaXRDb3VudCAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9CRF9JTklUMSAgICAgIFQxLCBUMiwgVDIKKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorICAgICAgICBNX0JEX0lOSVQyICAgICAgVDEsIFQyLCBUMgorICAgICAgICBTVE0gICAgICAgICAgICAgcERzdCEse3RlbXAyLHRlbXAxLExhc3QsTFJ9CisgICAgICAgIE1fU1RSICAgICAgICAgICBwcEJpdFN0cmVhbSxwcHBCaXRTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU3RvcmUgcHBCaXRzdHJlYW0gb24gc3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgTV9TVFIgICAgICAgICAgIHBCaXRPZmZzZXQscHBPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBTdG9yZSBwQml0T2Zmc2V0IG9uIHN0YWNrCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgCisgICAgICAgIFNUTSAgICAgICAgICAgICBwRHN0ISx7dGVtcDIsdGVtcDEsTGFzdCxMUn0KKyAgICAgICAgU1RNICAgICAgICAgICAgIHBEc3QhLHt0ZW1wMix0ZW1wMSxMYXN0LExSfQorIAorICAgICAgICAKKyAgICAgICAgU1VCICAgICAgICAgICAgIHBEc3QscERzdCwjMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBSZXN0b3JlIHBEc3QKKworICAgICAgICA7Ly8gVGhlIGFybVZDTTRQMl9HZXRWTENCaXRzIGJlZ2lucworCitnZXRWTENiaXRzCisgICAgICAgIAorICAgICAgICBNX0JEX0xPT0s4ICAgICAgRXNjYXBlLDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWQgRXNjYXBlIFZhbHVlCisgICAgICAgIExTUiAgICAgICAgICAgICBFc2NhcGUsRXNjYXBlLCMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgICBFc2NhcGUsIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gY2hlY2sgZm9yIGVzY2FwZSBtb2RlCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMAorICAgICAgICBCTkUgICAgICAgICAgICAgbm90RXNjYXBlbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIEJyYW5jaCBpZiBub3QgaW4gRXNjYXBlIG1vZGUgMworCisgICAgICAgIE1fQkRfVlNLSVA4ICAgICAjNyxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgc2hvcnRWaWRlb0hlYWRlciwjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOy8vIENoZWNrIHNob3J0VmlkZW9IZWFkZXIgZmxhZyB0byBrbm93IHRoZSB0eXBlIG9mIEVzY2FwZSBtb2RlCisgICAgICAgIEJFUSAgICAgICAgICAgICBlbmRGaWxsVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gRXNjYXBlIE1vZGUgNAorCisgICAgICAgIE1fQkRfUkVBRDggICAgICBMYXN0LDEsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlUnVuLDYsVDEKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHN0b3JlTGV2ZWwsOCxUMQorCisgICAgICAgICAgIAorICAgICAgICA7Ly8gQ2hlY2sgd2hldGhlciB0aGUgUmVzZXJ2ZWQgdmFsdWVzIGZvciBMZXZlbCBhcmUgdXNlZCBhbmQgRXhpdCB3aXRoIGFuIEVycm9yIE1lc3NhZ2UgaWYgaXQgaXMgc28KKworICAgICAgICBURVEgICAgICAgICAgICAgc3RvcmVMZXZlbCwjMAorICAgICAgICBURVFORSAgICAgICAgICAgc3RvcmVMZXZlbCwjMTI4ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQkVRICAgICAgICAgICAgIEV4aXRFcnJvcgorCisgICAgICAgIEFERCAgICAgICAgICAgICB0ZW1wMixzdG9yZVJ1bixDb3VudAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDIsIzY0CisgICAgICAgIEJHRSAgICAgICAgICAgICBFeGl0RXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gZXJyb3IgaWYgQ291bnQrc3RvcmVSdW4gPj0gNjQKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICA7Ly8gTG9hZCBhZGRyZXNzIG9mIHppZ3phZ1RhYmxlCisgICAgICAgIAorICAgICAgICBNX0xEUiAgICAgICAgICAgcFppZ3phZ1RhYmxlLHBwWmlnemFnVGFibGUgICAgICAgICAgICAgICAgICAgICAgOy8vIExvYWRpbmcgdGhlIEFkZHJlc3Mgb2YgWmlnemFnIHRhYmxlCisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgOy8vIGFybVZDTTRQMl9GaWxsVkxEQnVmZmVyCisgICAgICAgICAgICAgICAgCisgICAgICAgIFNYVEIgICAgICAgICAgICBzdG9yZUxldmVsLHN0b3JlTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA7Ly8gU2lnbiBFeHRlbmQgc3RvcmVMZXZlbCB0byAzMiBiaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIDsvLyBUbyBSZWZsZWN0IFJ1bmxlbmd0aAorCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCxzdG9yZVJ1bgorICAgICAgICBMRFJCICAgICAgICAgICAgemlnemFnLFtwWmlnemFnVGFibGUsQ291bnRdCisgICAgICAgIEFERCAgICAgICAgICAgICBDb3VudCxDb3VudCwjMQorICAgICAgICBTVFJIICAgICAgICAgICAgc3RvcmVMZXZlbCxbcERzdCx6aWd6YWddICAgICAgICAgICAgICAgICAgICAgICAgOy8vIHN0b3JlIExldmVsCisgICAgICAgICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICAgRXhpdE9rCisgICAgICAgCisgICAgICAgIAorCitlbmRGaWxsVkxECisgICAgICAgIAorICAgICAgICAgICAgICAgCisgICAgICAgIDsvLyBMb2FkIEZ0eXBlKCBFc2NhcGUgTW9kZSkgdmFsdWUgYmFzZWQgb24gdGhlIHR3byBzdWNjZXNzaXZlIGJpdHMgaW4gdGhlIGJpdHN0cmVhbQorICAgICAKKyAgICAgICAgTV9CRF9SRUFEOCAgICAgIHRlbXAxLDEsVDEgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzAgICAgCisgICAgICAgIE1PVkVRICAgICAgICAgICBmdHlwZSwjMQorICAgICAgICBCRVEgICAgICAgICAgICAgbm90RXNjYXBlbW9kZQorICAgICAgICBNX0JEX1JFQUQ4ICAgICAgdGVtcDEsMSxUMQorICAgICAgICBDTVAgICAgICAgICAgICAgdGVtcDEsIzEKKyAgICAgICAgTU9WRVEgICAgICAgICAgIGZ0eXBlLCMzCisgICAgICAgIE1PVk5FICAgICAgICAgICBmdHlwZSwjMgorICAgICAgICAKKworbm90RXNjYXBlbW9kZQorCisgICAgICAgIDsvLyBMb2FkIG9wdGltaXplZCBwYWNrZWQgVkxDIHRhYmxlIHdpdGggbGFzdD0wIGFuZCBMYXN0PTEKKyAgICAgICAgCisgICAgICAgIE1fTERSICAgICAgICAgICBwVmxjVGFibGVMMEwxLHBwVmxjVGFibGVMMEwxICAgICAgICAgICAgICAgICAgICA7Ly8gTG9hZCBDb21iaW5lZCBWTEMgVGFibGUKKyAgICAgICAgICAgICAgICAKKyAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgIGZ0eXBlLCMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsvLyBJZiBmdHlwZSA+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+Y3BiUmVtb3ZhbERlbGF5TGVuZ3RoID0gdG1wICsgMTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPmRwYk91dHB1dERlbGF5TGVuZ3RoID0gdG1wICsgMTsKKworICAgIHRtcCA9IGgyNjRic2RHZXRCaXRzKHBTdHJtRGF0YSwgNSk7CisgICAgaWYgKHRtcCA9PSBFTkRfT0ZfU1RSRUFNKQorICAgICAgICByZXR1cm4oSEFOVFJPX05PSyk7CisgICAgcEhyZFBhcmFtZXRlcnMtPnRpbWVPZmZzZXRMZW5ndGggPSB0bXA7CisKKyAgICByZXR1cm4oSEFOVFJPX09LKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2gyNjRkZWMvc291cmNlL2gyNjRic2RfdnVpLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDVkNTJhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvaDI2NGRlYy9zb3VyY2UvaDI2NGJzZF92dWkuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBUYWJsZSBvZiBjb250ZW50cworCisgICAgMS4gSW5jbHVkZSBoZWFkZXJzCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKyAgICAzLiBEYXRhIHR5cGVzCisgICAgNC4gRnVuY3Rpb24gcHJvdG90eXBlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZuZGVmIEgyNjRTV0RFQ19WVUlfSAorI2RlZmluZSBIMjY0U1dERUNfVlVJX0gKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAxLiBJbmNsdWRlIGhlYWRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpbmNsdWRlICJiYXNldHlwZS5oIgorI2luY2x1ZGUgImgyNjRic2Rfc3RyZWFtLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgMi4gTW9kdWxlIGRlZmluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgTUFYX0NQQl9DTlQgMzIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAzLiBEYXRhIHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBlbnVtZXJhdGVkIHNhbXBsZSBhc3BlY3QgcmF0aW9zLCBBU1BFQ1RfUkFUSU9fTV9OIG1lYW5zIE06TiAqLworZW51bQoreworICAgIEFTUEVDVF9SQVRJT19VTlNQRUNJRklFRCA9IDAsCisgICAgQVNQRUNUX1JBVElPXzFfMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTJfMTEsCisgICAgQVNQRUNUX1JBVElPXzEwXzExLAorICAgIEFTUEVDVF9SQVRJT18xNl8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fNDBfMzMsCisgICAgQVNQRUNUX1JBVElPXzI0XzExLAorICAgIEFTUEVDVF9SQVRJT18yMF8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMzJfMTEsCisgICAgQVNQRUNUX1JBVElPXzgwXzMzLAorICAgIEFTUEVDVF9SQVRJT18xOF8xMSwKKyAgICBBU1BFQ1RfUkFUSU9fMTVfMTEsCisgICAgQVNQRUNUX1JBVElPXzY0XzMzLAorICAgIEFTUEVDVF9SQVRJT18xNjBfOTksCisgICAgQVNQRUNUX1JBVElPX0VYVEVOREVEX1NBUiA9IDI1NQorfTsKKworLyogc3RydWN0dXJlIHRvIHN0b3JlIEh5cG90aGV0aWNhbCBSZWZlcmVuY2UgRGVjb2RlciAoSFJEKSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHUzMiBjcGJDbnQ7CisgICAgdTMyIGJpdFJhdGVTY2FsZTsKKyAgICB1MzIgY3BiU2l6ZVNjYWxlOworICAgIHUzMiBiaXRSYXRlVmFsdWVbTUFYX0NQQl9DTlRdOworICAgIHUzMiBjcGJTaXplVmFsdWVbTUFYX0NQQl9DTlRdOworICAgIHUzMiBjYnJGbGFnW01BWF9DUEJfQ05UXTsKKyAgICB1MzIgaW5pdGlhbENwYlJlbW92YWxEZWxheUxlbmd0aDsKKyAgICB1MzIgY3BiUmVtb3ZhbERlbGF5TGVuZ3RoOworICAgIHUzMiBkcGJPdXRwdXREZWxheUxlbmd0aDsKKyAgICB1MzIgdGltZU9mZnNldExlbmd0aDsKK30gaHJkUGFyYW1ldGVyc190OworCisvKiBzdG9yYWdlIGZvciBWVUkgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1MzIgYXNwZWN0UmF0aW9QcmVzZW50RmxhZzsKKyAgICB1MzIgYXNwZWN0UmF0aW9JZGM7CisgICAgdTMyIHNhcldpZHRoOworICAgIHUzMiBzYXJIZWlnaHQ7CisgICAgdTMyIG92ZXJzY2FuSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBvdmVyc2NhbkFwcHJvcHJpYXRlRmxhZzsKKyAgICB1MzIgdmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWc7CisgICAgdTMyIHZpZGVvRm9ybWF0OworICAgIHUzMiB2aWRlb0Z1bGxSYW5nZUZsYWc7CisgICAgdTMyIGNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWc7CisgICAgdTMyIGNvbG91clByaW1hcmllczsKKyAgICB1MzIgdHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3M7CisgICAgdTMyIG1hdHJpeENvZWZmaWNpZW50czsKKyAgICB1MzIgY2hyb21hTG9jSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBjaHJvbWFTYW1wbGVMb2NUeXBlVG9wRmllbGQ7CisgICAgdTMyIGNocm9tYVNhbXBsZUxvY1R5cGVCb3R0b21GaWVsZDsKKyAgICB1MzIgdGltaW5nSW5mb1ByZXNlbnRGbGFnOworICAgIHUzMiBudW1Vbml0c0luVGljazsKKyAgICB1MzIgdGltZVNjYWxlOworICAgIHUzMiBmaXhlZEZyYW1lUmF0ZUZsYWc7CisgICAgdTMyIG5hbEhyZFBhcmFtZXRlcnNQcmVzZW50RmxhZzsKKyAgICBocmRQYXJhbWV0ZXJzX3QgbmFsSHJkUGFyYW1ldGVyczsKKyAgICB1MzIgdmNsSHJkUGFyYW1ldGVyc1ByZXNlbnRGbGFnOworICAgIGhyZFBhcmFtZXRlcnNfdCB2Y2xIcmRQYXJhbWV0ZXJzOworICAgIHUzMiBsb3dEZWxheUhyZEZsYWc7CisgICAgdTMyIHBpY1N0cnVjdFByZXNlbnRGbGFnOworICAgIHUzMiBiaXRzdHJlYW1SZXN0cmljdGlvbkZsYWc7CisgICAgdTMyIG1vdGlvblZlY3RvcnNPdmVyUGljQm91bmRhcmllc0ZsYWc7CisgICAgdTMyIG1heEJ5dGVzUGVyUGljRGVub207CisgICAgdTMyIG1heEJpdHNQZXJNYkRlbm9tOworICAgIHUzMiBsb2cyTWF4TXZMZW5ndGhIb3Jpem9udGFsOworICAgIHUzMiBsb2cyTWF4TXZMZW5ndGhWZXJ0aWNhbDsKKyAgICB1MzIgbnVtUmVvcmRlckZyYW1lczsKKyAgICB1MzIgbWF4RGVjRnJhbWVCdWZmZXJpbmc7Cit9IHZ1aVBhcmFtZXRlcnNfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA0LiBGdW5jdGlvbiBwcm90b3R5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit1MzIgaDI2NGJzZERlY29kZVZ1aVBhcmFtZXRlcnMoc3RybURhdGFfdCAqcFN0cm1EYXRhLAorICAgIHZ1aVBhcmFtZXRlcnNfdCAqcFZ1aVBhcmFtZXRlcnMpOworCisjZW5kaWYgLyogI2lmZGVmIEgyNjRTV0RFQ19WVUlfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rCmluZGV4IDcwMmE3YjQuLjYyYmE0MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLm1rCkBAIC05LDEwICs5LDYgQEAKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29wZW5tYXggXAogICAgICAgICAkKFRPUCkvaGFyZHdhcmUvbXNtN2sKIAotaWZuZXEgKCQoZmlsdGVyIGNyZXNwbyBjcmVzcG80ZywkKFRBUkdFVF9ERVZJQ0UpKSwpCi1MT0NBTF9DRkxBR1MgKz0gLURUSElTX0lTX0NSRVNQTz0xCi1lbmRpZgotCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDRiNzJhNTMuLmIyOGQ5NDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBjb25zdCBpbnQgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IDB4N0ZBMzBDMDA7Ci0KIENvbG9yQ29udmVydGVyOjpDb2xvckNvbnZlcnRlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZnJvbSwgT01YX0NPTE9SX0ZPUk1BVFRZUEUgdG8pCiAgICAgOiBtU3JjRm9ybWF0KGZyb20pLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCmluZGV4IDE4MjhhYzguLmE0ZThlZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKQEAgLTU5LDcgKzU5LDYgQEAKICAgICBzaXplX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKIAogICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0jaWZuZGVmIFRISVNfSVNfQ1JFU1BPCiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICAgICAgewogICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwpAQCAtNjcsNyArNjYsNiBAQAogICAgICAgICAgICAgYnVmSGVpZ2h0ID0gKG1IZWlnaHQgKyAxKSAmIH4xOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSNlbmRpZgogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CkBAIC04OSwxMSArODcsNyBAQAogICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoCiAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTgotICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUKLSNpZm5kZWYgVEhJU19JU19DUkVTUE8KLSAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQCi0jZW5kaWYKLSAgICAgICAgICAgICkpOworICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApKTsKIAogICAgIC8vIFdpZHRoIG11c3QgYmUgbXVsdGlwbGUgb2YgMzI/Pz8KICAgICBDSEVDS19FUSgwLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAppbmRleCBhOWU4ZTk1Li5mNmRmMzgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaApAQCAtOTMsNiArOTMsNyBAQAogCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAgICAgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpOworICAgIHN0YXR1c190IHNldENhY2hlU3RhdENvbGxlY3RGcmVxKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCB0aW1lVXMpOwogCkBAIC0xMDQsNiArMTA1LDggQEAKIAogICAgIHN0YXR1c190IHNldFRpbWVkVGV4dFRyYWNrSW5kZXgoaW50MzJfdCBpbmRleCk7CiAKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBBd2Vzb21lRXZlbnQ7CiAgICAgZnJpZW5kIHN0cnVjdCBQcmV2aWV3UGxheWVyOwpAQCAtMTQxLDYgKzE0NCw3IEBACiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIE11dGV4IG1NaXNjU3RhdGVMb2NrOworICAgIG11dGFibGUgTXV0ZXggbVN0YXRzTG9jazsKIAogICAgIE9NWENsaWVudCBtQ2xpZW50OwogICAgIFRpbWVkRXZlbnRRdWV1ZSBtUXVldWU7CkBAIC0yOTEsNiArMjk1LDM0IEBACiAgICAgdm9pZCBzZXROYXRpdmVXaW5kb3dfbChjb25zdCBzcDxBTmF0aXZlV2luZG93PiAmbmF0aXZlKTsKIAogICAgIGJvb2wgaXNTdHJlYW1pbmdIVFRQKCkgY29uc3Q7CisgICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOworCisgICAgZW51bSBGbGFnTW9kZSB7CisgICAgICAgIFNFVCwKKyAgICAgICAgQ0xFQVIsCisgICAgICAgIEFTU0lHTgorICAgIH07CisgICAgdm9pZCBtb2RpZnlGbGFncyh1bnNpZ25lZCB2YWx1ZSwgRmxhZ01vZGUgbW9kZSk7CisKKyAgICBzdHJ1Y3QgVHJhY2tTdGF0IHsKKyAgICAgICAgU3RyaW5nOCBtTUlNRTsKKyAgICAgICAgU3RyaW5nOCBtRGVjb2Rlck5hbWU7CisgICAgfTsKKworICAgIC8vIHByb3RlY3RlZCBieSBtU3RhdHNMb2NrCisgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgaW50IG1GZDsKKyAgICAgICAgU3RyaW5nOCBtVVJJOworICAgICAgICBpbnQ2NF90IG1CaXRyYXRlOworICAgICAgICBzc2l6ZV90IG1BdWRpb1RyYWNrSW5kZXg7CisgICAgICAgIHNzaXplX3QgbVZpZGVvVHJhY2tJbmRleDsKKyAgICAgICAgaW50NjRfdCBtTnVtVmlkZW9GcmFtZXNEZWNvZGVkOworICAgICAgICBpbnQ2NF90IG1OdW1WaWRlb0ZyYW1lc0Ryb3BwZWQ7CisgICAgICAgIGludDMyX3QgbVZpZGVvV2lkdGg7CisgICAgICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OworICAgICAgICB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIFZlY3RvcjxUcmFja1N0YXQ+IG1UcmFja3M7CisgICAgfSBtU3RhdHM7CiAKICAgICBBd2Vzb21lUGxheWVyKGNvbnN0IEF3ZXNvbWVQbGF5ZXIgJik7CiAgICAgQXdlc29tZVBsYXllciAmb3BlcmF0b3I9KGNvbnN0IEF3ZXNvbWVQbGF5ZXIgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0Nocm9taXVtSFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCmluZGV4IDBlMjkyN2QuLmQ4MzNlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2hyb21pdW1IVFRQRGF0YVNvdXJjZS5oCkBAIC00Myw4ICs0Myw2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKIAotICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKLQogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oKTsKIAogICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwpAQCAtNjcsMTEgKzY1LDYgQEAKICAgICAgICAgRElTQ09OTkVDVElORwogICAgIH07CiAKLSAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgewotICAgICAgICBpbnQ2NF90IG1EZWxheVVzOwotICAgICAgICBzaXplX3QgbU51bUJ5dGVzOwotICAgIH07Ci0KICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtOTQsMTEgKzg3LDYgQEAKIAogICAgIFN0cmluZzggbUNvbnRlbnRUeXBlOwogCi0gICAgTGlzdDxCYW5kd2lkdGhFbnRyeT4gbUJhbmR3aWR0aEhpc3Rvcnk7Ci0gICAgc2l6ZV90IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgaW50NjRfdCBtVG90YWxUcmFuc2ZlclRpbWVVczsKLSAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJCeXRlczsKLQogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwogCkBAIC0xMjEsOCArMTA5LDYgQEAKICAgICB2b2lkIG9uUmVhZENvbXBsZXRlZChzc2l6ZV90IHNpemUpOwogICAgIHZvaWQgb25EaXNjb25uZWN0Q29tcGxldGUoKTsKIAotICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnRfbChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7Ci0KICAgICB2b2lkIGNsZWFyRFJNU3RhdGVfbCgpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hyb21pdW1IVFRQRGF0YVNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKaW5kZXggNmNlYzM5MC4uM2E3ZmJiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaApAQCAtMjAsNiArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCwxMSArNDIsNDEgQEAKIAogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBiYW5kd2lkdGggY291bGQgc3VjY2Vzc2Z1bGx5IGJlIGVzdGltYXRlZCwKICAgICAvLyBmYWxzZSBvdGhlcndpc2UuCi0gICAgdmlydHVhbCBib29sIGVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2Jwcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2Jwcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7CiAKICAgICBzdGF0aWMgc3A8SFRUUEJhc2U+IENyZWF0ZSh1aW50MzJfdCBmbGFncyA9IDApOwogCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CisKIHByaXZhdGU6CisKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgeworICAgICAgICBpbnQ2NF90IG1EZWxheVVzOworICAgICAgICBzaXplX3QgbU51bUJ5dGVzOworICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+IG1CYW5kd2lkdGhIaXN0b3J5OworICAgIHNpemVfdCBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOworICAgIGludDY0X3QgbVRvdGFsVHJhbnNmZXJUaW1lVXM7CisgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyQnl0ZXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga01pbkJhbmR3aWR0aENvbGxlY3RGcmVxTXMgPSAxMDAwLCAgIC8vIDEgc2Vjb25kCisgICAgICAgIGtNYXhCYW5kd2lkdGhDb2xsZWN0RnJlcU1zID0gNjAwMDAsICAvLyBvbmUgbWludXRlCisgICAgfTsKKworICAgIGludDY0X3QgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzOworICAgIGludDMyX3QgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzOworICAgIGludDMyX3QgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXM7CisKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBCYXNlKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCmluZGV4IGVkM2UyNjVjLi4yZDZjYjg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKQEAgLTUwLDYgKzUwLDEyIEBACiAKICAgICB2b2lkIHJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKTsKIAorICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgc3VwcG9ydGVkIG9ubHkgaWYgdGhlCisgICAgLy8gZGF0YSBzb3VyY2UgaXMgSFRUUC1iYXNlZDsgb3RoZXJ3aXNlLCBFUlJPUl9VTlNVUFBPUlRFRAorICAgIC8vIGlzIHJldHVybmVkLgorICAgIHN0YXR1c190IGdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2Jwcyk7CisgICAgc3RhdHVzX3Qgc2V0Q2FjaGVTdGF0Q29sbGVjdEZyZXEoaW50MzJfdCBmcmVxTXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVDYWNoZWRTb3VyY2UyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgKaW5kZXggMmFiMWYxOS4uYzI2NWIzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgKQEAgLTQzLDEwICs0Myw2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKIAotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBiYW5kd2lkdGggY291bGQgc3VjY2Vzc2Z1bGx5IGJlIGVzdGltYXRlZCwKLSAgICAvLyBmYWxzZSBvdGhlcndpc2UuCi0gICAgdmlydHVhbCBib29sIGVzdGltYXRlQmFuZHdpZHRoKGludDMyX3QgKmJhbmR3aWR0aF9icHMpOwotCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbigpOwogICAgIHZpcnR1YWwgdm9pZCBnZXREcm1JbmZvKHNwPERlY3J5cHRIYW5kbGU+ICZoYW5kbGUsIERybU1hbmFnZXJDbGllbnQgKipjbGllbnQpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKQEAgLTYzLDExICs1OSw2IEBACiAgICAgICAgIENPTk5FQ1RFRAogICAgIH07CiAKLSAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgewotICAgICAgICBpbnQ2NF90IG1EZWxheVVzOwotICAgICAgICBzaXplX3QgbU51bUJ5dGVzOwotICAgIH07Ci0KICAgICBNdXRleCBtTG9jazsKIAogICAgIHVpbnQzMl90IG1GbGFnczsKQEAgLTkzLDExICs4NCw2IEBACiAgICAgLy8gY2h1bmsgaGVhZGVyIChvciAtMSBpZiBubyBtb3JlIGNodW5rcykuCiAgICAgc3NpemVfdCBtQ2h1bmtEYXRhQnl0ZXNMZWZ0OwogCi0gICAgTGlzdDxCYW5kd2lkdGhFbnRyeT4gbUJhbmR3aWR0aEhpc3Rvcnk7Ci0gICAgc2l6ZV90IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0gICAgaW50NjRfdCBtVG90YWxUcmFuc2ZlclRpbWVVczsKLSAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJCeXRlczsKLQogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwogCkBAIC0xMTQsNyArMTAwLDYgQEAKICAgICBzc2l6ZV90IGludGVybmFsUmVhZCh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICB2b2lkIGFwcGx5VGltZW91dFJlc3BvbnNlKCk7Ci0gICAgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudF9sKHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKTsKIAogICAgIHN0YXRpYyB2b2lkIE1ha2VGdWxsSGVhZGVycygKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpvdmVycmlkZXMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IDRiMWMzYTcuLmQyM2FhM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9PTVguaCIKIApAQCAtMTE2LDcgKzExNSw3IEBACiB9CiAKIHZvaWQgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6OnRocmVhZEVudHJ5KCkgewotICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiT01YQ2FsbGJhY2tEaXNwIiwgMCwgMCwgMCk7CiAKICAgICBmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggMDRjYTM5ZS4uMDJiMWM4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtMzcsNiArMzcsNyBAQAogICAgIHsgIk9NWC5nb29nbGUuYWFjLmRlY29kZXIiLCAiYWFjZGVjIiwgImF1ZGlvX2RlY29kZXIuYWFjIiB9LAogICAgIHsgIk9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIsICJhbXJkZWMiLCAiYXVkaW9fZGVjb2Rlci5hbXJuYiIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmFtcndiLmRlY29kZXIiLCAiYW1yZGVjIiwgImF1ZGlvX2RlY29kZXIuYW1yd2IiIH0sCisgICAgeyAiT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiLCAiaDI2NGRlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmF2Yy5kZWNvZGVyIiwgImF2Y2RlYyIsICJ2aWRlb19kZWNvZGVyLmF2YyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExYWxhdyIgfSwKICAgICB7ICJPTVguZ29vZ2xlLmc3MTEubWxhdy5kZWNvZGVyIiwgImc3MTFkZWMiLCAiYXVkaW9fZGVjb2Rlci5nNzExbWxhdyIgfSwKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggNGE4ZmQzZS4uOWVjNzNjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTUzMywxMiArNTMzLDEwIEBACiAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBhbGwgc3RvcmFnZQogICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7ICAgICAgLy8gMCBmb3IgYWxsIGZvcm1hdHMKICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIG9iamVjdHMgd2l0aCBubyBwYXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDAwMDAwMDAgZm9yIGFsbCBvYmplY3RzPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHMKIAogICAgIGlmICghaGFzU3RvcmFnZShzdG9yYWdlSUQpKQogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfU1RPUkFHRV9JRDsKLSAgICBpZiAocGFyZW50ID09IDB4RkZGRkZGRkYpCi0gICAgICAgIHBhcmVudCA9IDA7CiAKICAgICBNdHBPYmplY3RIYW5kbGVMaXN0KiBoYW5kbGVzID0gbURhdGFiYXNlLT5nZXRPYmplY3RMaXN0KHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOwogICAgIG1EYXRhLnB1dEFVSW50MzIoaGFuZGxlcyk7CkBAIC01NTIsMTEgKzU1MCw5IEBACiAgICAgTXRwU3RvcmFnZUlEIHN0b3JhZ2VJRCA9IG1SZXF1ZXN0LmdldFBhcmFtZXRlcigxKTsgICAgICAvLyAweEZGRkZGRkZGIGZvciBhbGwgc3RvcmFnZQogICAgIE10cE9iamVjdEZvcm1hdCBmb3JtYXQgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7ICAgICAgLy8gMCBmb3IgYWxsIGZvcm1hdHMKICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDMpOyAgICAgIC8vIDB4RkZGRkZGRkYgZm9yIG9iamVjdHMgd2l0aCBubyBwYXJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDB4MDAwMDAwMDAgZm9yIGFsbCBvYmplY3RzPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMHgwMDAwMDAwMCBmb3IgYWxsIG9iamVjdHMKICAgICBpZiAoIWhhc1N0b3JhZ2Uoc3RvcmFnZUlEKSkKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1NUT1JBR0VfSUQ7Ci0gICAgaWYgKHBhcmVudCA9PSAweEZGRkZGRkZGKQotICAgICAgICBwYXJlbnQgPSAwOwogCiAgICAgaW50IGNvdW50ID0gbURhdGFiYXNlLT5nZXROdW1PYmplY3RzKHN0b3JhZ2VJRCwgZm9ybWF0LCBwYXJlbnQpOwogICAgIGlmIChjb3VudCA+PSAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9NZWRpYUZyYW1ld29ya1Rlc3QuamF2YSBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhRnJhbWV3b3JrVGVzdC5qYXZhCmluZGV4IDc5ZmQyY2IuLmU3Zjk4ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhRnJhbWV3b3JrVGVzdC5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhRnJhbWV3b3JrVGVzdC5qYXZhCkBAIC0xMjMsNjMgKzEyMyw2IEBACiAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUocGF0aCwgbWltZXR5cGUpOwogICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFXzA6Ci0gICAgICAgICAgICBNZWRpYVBsYXllciBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgICAgICAgICAgdHJ5ewotICAgICAgICAgICAgICBtcC5zZXREYXRhU291cmNlKE1lZGlhTmFtZXMuVklERU9fUlRTUDNHUCk7Ci0gICAgICAgICAgICAgIExvZy52KCJlbWlseSIsImF3YiAgIiArIHRlc3RmaWxlcGF0aCk7Ci0gICAgICAgICAgICAgIG1wLnNldERpc3BsYXkobVN1cmZhY2VWaWV3LmdldEhvbGRlcigpKTsKLSAgICAgICAgICAgICAgbXAucHJlcGFyZSgpOwotICAgICAgICAgICAgICBtcC5zdGFydCgpOwotICAgICAgICAgICAgfWNhdGNoIChFeGNlcHRpb24gZSl7fQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAKLSAgICAgICAgICAvL3N0YXJ0IHRoZSBtdXNpYyBwbGF5ZXIgaW50ZW50IHdpdGggdGhlIHRlc3QgVVJMIGZyb20gUFYgICAgCi0gICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFXzE6Ci0gICAgICAgICAgICBzdGFydFBsYXliYWNrKE1lZGlhTmFtZXMuU1RSRUFNX01QM18xKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV8yOgotICAgICAgICAgICAgc3RhcnRQbGF5YmFjayhNZWRpYU5hbWVzLlNUUkVBTV9NUDNfMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfMzoKLSAgICAgICAgICAgIHN0YXJ0UGxheWJhY2soTWVkaWFOYW1lcy5TVFJFQU1fTVAzXzMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFXzQ6Ci0gICAgICAgICAgICBzdGFydFBsYXliYWNrKE1lZGlhTmFtZXMuU1RSRUFNX01QM180KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV81OgotICAgICAgICAgICAgc3RhcnRQbGF5YmFjayhNZWRpYU5hbWVzLlNUUkVBTV9NUDNfNSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfNjoKLSAgICAgICAgICAgIHN0YXJ0UGxheWJhY2soTWVkaWFOYW1lcy5TVFJFQU1fTVAzXzYpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgICAgY2FzZSBLZXlFdmVudC5LRVlDT0RFXzc6Ci0gICAgICAgICAgICBzdGFydFBsYXliYWNrKE1lZGlhTmFtZXMuU1RSRUFNX01QM183KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIAotICAgICAgICAgIGNhc2UgS2V5RXZlbnQuS0VZQ09ERV84OgotICAgICAgICAgICAgc3RhcnRQbGF5YmFjayhNZWRpYU5hbWVzLlNUUkVBTV9NUDNfOCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAKLSAgICAgICAgICBjYXNlIEtleUV2ZW50LktFWUNPREVfOToKLSAgICAgICAgICAgIHN0YXJ0UGxheWJhY2soTWVkaWFOYW1lcy5TVFJFQU1fTVAzXzkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5vbktleURvd24oa2V5Q29kZSwgZXZlbnQpOwotICAgICAKLSAgfSAgCiAKICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrU3RyZWFtaW5nU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICBJbmV0QWRkcmVzcyBhZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKE1lZGlhTmFtZXMuU1RSRUFNX1NFUlZFUik7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9NZWRpYU5hbWVzLmphdmEgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9NZWRpYU5hbWVzLmphdmEKaW5kZXggY2E2ZTk5OS4uZjNhOTFjNSAxMDA3NTUKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvTWVkaWFOYW1lcy5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L01lZGlhTmFtZXMuamF2YQpAQCAtMSw1MTAgKzEsMTYwIEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KICAqLwogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhZnJhbWV3b3JrdGVzdDsKIAogLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaGFzIHRoZSBuYW1lcyBvZiB0aGUgYWxsIHRoZSBhY3Rpdml0eSBuYW1lIGFuZCB2YXJpYWJsZXMgCi0gKiBpbiB0aGUgaW5zdHJ1bWVudGF0aW9uIHRlc3QuCisgKgorICogVGhpcyBjbGFzcyBoYXMgdGhlIG5hbWVzIG9mIHRoZSBhbGwgdGhlIGFjdGl2aXR5IG5hbWUgYW5kIHZhcmlhYmxlcyBpbiB0aGUKKyAqIGluc3RydW1lbnRhdGlvbiB0ZXN0LgogICoKICAqLwogcHVibGljIGNsYXNzIE1lZGlhTmFtZXMgewotICAgIC8vQSBkaXJlY3RvcnkgdG8gaG9sZCBhbGwga2luZHMgb2YgbWVkaWEgZmlsZXMKKyAgICAvLyBBIGRpcmVjdG9yeSB0byBob2xkIGFsbCBraW5kcyBvZiBtZWRpYSBmaWxlcwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1NBTVBMRV9QT09MID0gIi9zZGNhcmQvbWVkaWFfYXBpL3NhbXBsZXMvIjsKLSAgICAvL0F1ZGlvIGZpbGVzCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVAzQ0JSID0gIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM18yNTZrYnBzXzJjaC5tcDMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QM1ZCUiA9ICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfMjU2a2Jwc18yY2hfVkJSLm1wMyI7CisgICAgLy8gQXVkaW8gZmlsZXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNUDNDQlIgPSAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0NCUi5tcDMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1QM1ZCUiA9ICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfVkJSLm1wMyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVAzQUJSID0gIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM180OEtIel8xMjhrYnBzX3NfMV8xN19BQlIubXAzIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVE1QMyA9ICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9TSE9SVE1QMy5tcDMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JREkgPSAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvYW50cy5taWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNQTkgPSAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvV01BOS53bWEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNQTEwID0gIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL1dNQTEwLndtYSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FWID0gIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL3JpbmdzXzJjaC53YXYiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUiA9ICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy90ZXN0X2Ftcl9pZXRmLmFtciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0dHID0gIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL1JldmVsYXRpb24ub2dnIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5FXzIwMF8xMDAwID0gIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL3NpbmVfMjAwKzEwMDBIel80NEtfbW8ud2F2IjsKLSAgCisgICAgLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0dHID0KKyAgICAvLyAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvUmV2ZWxhdGlvbi5vZ2ciOworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVAzQ0JSX0xFTkdUSCA9IDcxMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1QM1ZCUl9MRU5HVEggPSA3MTAwMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVE1QM19MRU5HVEggPSAyODY7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlESV9MRU5HVEggPSAxNzAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXTUE5X0xFTkdUSCA9IDEyNjU1OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXTUExMF9MRU5HVEggPSAxMjY1NTk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU1SX0xFTkdUSCA9IDM3MDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9HR19MRU5HVEggPSA0MDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFRUtfVElNRSA9IDEwMDAwOwotICAKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBQQVVTRV9XQUlUX1RJTUUgPSAzMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX1RJTUUgPSAyMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBXQUlUX1NOQVBTSE9UX1RJTUUgPSA1MDAwOwotICAKLSAgICAvL1N0cmVhbWluZyBWaWRlbwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX0hUVFAzR1AgPSAiaHR0cDovL3B2cy5wdi5jb20vamovbGlwc3luYzAuM2dwIjsgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX1JUU1AzR1AgPSAicnRzcDovLzYzLjI0MS4zMS4yMDMvcHVibGljL2pqL21kLjNncCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklERU9fUlRTUDNHUDIgPSAicnRzcDovL3B2cy5wdi5jb20vcHVibGljL2xpdmVfZHZkMS4zZ3AiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX1JUU1AzR1AzID0gCi0gICAgICAicnRzcDovL2VodWcucnRzcC15b3V0dWJlLmwuZ29vZ2xlLmNvbS8iICsKLSAgICAgICJDaTRMRU55NzN3SWFKUW1lUlZDSnE0SHVRQk1ZRFNBTkZFSUpiWFl0WjI5dloyeGxTQVJTQjJSbGRHRnBiSE1NLzAvMC8wL3ZpZGVvLjNncCI7Ci0gICAgLy9wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19SVFNQM0dQID0gInJ0c3A6Ly8xOTMuMTU5LjI0MS4yMS9zcC9hbGl6ZWUwNS4zZ3AiOwotICAKLSAgICAvL2xvY2FsIHZpZGVvCisKKyAgICAvLyBsb2NhbCB2aWRlbwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJREVPX01QNCA9ICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9NUEVHNF8zMjBfQUFDXzY0Lm1wNCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklERU9fTE9OR18zR1AgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vcmFkaW9oZWFkLjNncCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklERU9fU0hPUlRfM0dQID0gIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL3Nob3J0LjNncCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklERU9fTEFSR0VfU0laRV8zR1AgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vYm9yZGVyX2xhcmdlLjNncCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklERU9fSDI2M19BQUMgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vSDI2M181Nl9BQUNfMjQuM2dwIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19IMjYzX0FNUiA9ICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjYzXzU2X0FNUk5CXzYuM2dwIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19IMjY0X0FBQyA9ICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjY0XzMyMF9BQUNfNjQuM2dwIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19IMjY0X0FNUiA9ICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjY0XzMyMF9BTVJOQl82LjNncCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklERU9fV01WID0gIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL2J1Z3Mud212IjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19ISUdIUkVTX0gyNjMgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vSDI2M181MDBfQU1STkJfMTIuM2dwIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19ISUdIUkVTX01QNCA9ICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjY0XzUwMF9BQUNfMTI4LjNncCI7Ci0gICAgCi0gICAgLy9yaW5ndG9uZQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHJpbmd0b25lID0gIi9zZGNhcmQvbWVkaWFfYXBpL3Jpbmd0b25lcy9GMV9OZXdWb2ljZW1haWwubXAzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSURFT19XRUJNID0gIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL2JpZy1idWNrLWJ1bm55X3RyYWlsZXIud2VibSI7CiAKLSAgICAvL3N0cmVhbWluZyBtcDMKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fTVAzXzEgPSAKLSAgICAgICJodHRwOi8vd21zLnB2LmNvbTo3MDcwL01lZGlhRG93bmxvYWRDb250ZW50L21wMy9jaGFkdGhpX2phd2FuaV8xMjhrYnBzLm1wMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01QM18yID0gCi0gICAgICAiaHR0cDovL3dtcy5wdi5jb206NzA3MC9NZWRpYURvd25sb2FkQ29udGVudC9tcDMvZHVhbFN0ZXJlby5tcDMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9NUDNfMyA9IAotICAgICAgImh0dHA6Ly93bXMucHYuY29tOjcwNzAvbWVkaWFkb3dubG9hZGNvbnRlbnQvVXNlclVwbG9hZHMvMTUlMjBLZWVwJTIwSG9sZGluZyUyME9uLm1wMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01QM180ID0gCi0gICAgICAiaHR0cDovL3dtcy5wdi5jb206NzA3MC9tZWRpYWRvd25sb2FkY29udGVudC9Vc2VyVXBsb2Fkcy8xJTIwLSUyMEFwb2xvZ2l6ZS5tcDMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9NUDNfNSA9IAotICAgICAgImh0dHA6Ly93bXMucHYuY29tOjcwNzAvbWVkaWFkb3dubG9hZGNvbnRlbnQvVXNlclVwbG9hZHMvIiArCi0gICAgICAiMDMlMjBZb3UncmUlMjBHb25uYSUyME1pc3MlMjBUaGlzLm1wMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01QM182ID0gCi0gICAgICAiaHR0cDovL3dtcy5wdi5jb206NzA3MC9tZWRpYWRvd25sb2FkY29udGVudC9Vc2VyVXBsb2FkcyIgKwotICAgICAgIi8wMiUyMExvb25leSUyMFR1bmVzJTIwJUMzJTgyJUMyJUI3JTIwTGlnaHQlMjBDYXZhbHJ5JTIwT3ZlcnR1cmUlMjAoTFAlMjBWZXJzaW9uKS5tcDMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9NUDNfNyA9IAotICAgICAgImh0dHA6Ly93bXMucHYuY29tOjcwNzAvbWVkaWFkb3dubG9hZGNvbnRlbnQvVXNlclVwbG9hZHMiICsKLSAgICAgICIvMDElMjBMb3ZlJTIwU29uZyUyMChBbGJ1bSUyMFZlcnNpb24pLm1wMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01QM184ID0gCi0gICAgICAiaHR0cDovL3dtcy5wdi5jb206NzA3MC9NZWRpYURvd25sb2FkQ29udGVudC9Vc2VyVXBsb2Fkcy8xJTIwLSUyMEFwb2xvZ2l6ZS5tcDMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9NUDNfOSA9IAotICAgICAgImh0dHA6Ly93bXMucHYuY29tOjcwNzAvTWVkaWFEb3dubG9hZENvbnRlbnQvVXNlclVwbG9hZHMiICsKLSAgICAgICIvMSUyMC0lMjBTbWlsZSUyMChFeHBsaWNpdCUyMFZlcnNpb24pLm1wMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01QM18xMCA9IAotICAgICAgImh0dHA6Ly93bXMucHYuY29tOjcwNzAvTWVkaWFEb3dubG9hZENvbnRlbnQvVXNlclVwbG9hZHMvYmVlZmNha2UubXAzIjsKLQotICAgIC8vU29uaXZveAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JRElGSUxFU1tdID0geyAKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL0xlYWRzb2wubXhtZiIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9hYmJhLmlteSIsICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9hbnRzLm1pZCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9ncmVlbnNsZWV2ZXMucnR0dGwiLCAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvdGVzdC5vdGEifTsKLSAgCi0gICAgLy9QZXJmb3JtYW5jZSBtZWFzdXJlbWVudAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gV0FWRklMRVMgPSB7IAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9XQVYvTTFGMS1BbGF3V0UtQUZzcC53YXYiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9XQVYvTTFGMS1mbG9hdDY0LUFGc3Aud2F2IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV0FWL3Nvbmcud2F2IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV0FWL1dBVkV0ZXN0LndhdiIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dBVi9XQVZFdGVzdF9vdXQud2F2IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV0FWL3Rlc3Rfb3V0LndhdiJ9OwotICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIEFNUk5CRklMRVMgPSB7IAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVIvQUlfQU1SLU5CXzUuOWticHNfNi4yNGticHNfOGtoel9tb25vX05NQy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVIvQUlfQU1SLU5CXzUuMTVrYnBzXzUuNDZrYnBzXzhraHpfbW9ub19OTUMuYW1yIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQU1SL0FJX0FNUi1OQl83LjRrYnBzXzcuODBrYnBzXzhraHpfbW9ub19OTUMuYW1yIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQU1SL0FJX0FNUi1OQl83Ljk1a2Jwc185LjZrYnBzXzhraHpfbW9ub19OTUMuYW1yIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQU1SL0FJX0FNUi1OQl8xMC4ya2Jwc18xMC40OGticHNfOGtoel9tb25vX05NQy5hbXIifTsKLSAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBBTVJXQkZJTEVTID0geyAKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQU1SV0IvTklOX0FNUi1XQl8xNS44NWticHNfMTZrYnBzLmFtciIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FNUldCL05JTl9BTVItV0JfMTguMjVrYnBzXzE4a2Jwcy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVJXQi9OSU5fQU1SLVdCXzE5Ljg1a2Jwc18yMGticHMuYW1yIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQU1SV0IvTklOX0FNUi1XQl8yMy4wNWticHNfMjNrYnBzLmFtciIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FNUldCL05JTl9BTVItV0JfMjMuODVrYnBzXzI0a2Jwcy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVJXQi9QRF9BTVItV0JfMTkuODVrYnBzXzIwa2Jwcy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVJXQi9QRF9BTVItV0JfMjMuMDVrYnBzXzIza2Jwcy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVJXQi9QRF9BTVItV0JfMjMuODVrYnBzXzI0a2Jwcy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVJXQi9XQ19BTVItV0JfMjMuMDVrYnBzXzIza2Jwcy5hbXIiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BTVJXQi9XQ19BTVItV0JfMjMuODVrYnBzXzI0a2Jwcy5hbXIiLCB9OwotIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gTVAzRklMRVMgPSB7IAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvTklOXzU2a2Jwc18zMmtoel9zdGVyZW9fVkJSX01DQS5NUDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvTklOXzgwa2Jwc18zMmtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvTklOXzgwa2Jwc180NC4xa2h6X3N0ZXJlb19WQlJfTUNBLm1wMyIsIAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvTklOXzgwa2Jwc180OGtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvTklOXzExMmticHNfMzJraHpfc3RlcmVvX1ZCUl9NQ0EubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL05JTl8xMTJrYnBzXzQ0LjFraHpfc3RlcmVvX1ZCUl9NQ0EubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL05JTl8xMTJrYnBzXzQ4a2h6X3N0ZXJlb19WQlJfTUNBLm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL01QMy9OSU5fMTkya2Jwc18zMmtoel9tb25vX0NCUl9NQ0EubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL05JTl8xOTJrYnBzXzQ0LjFraHpfbW9ub19DQlJfTUNBLm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL01QMy9OSU5fMTkya2Jwc180OGtoel9tb25vX0NCUl9NQ0EubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL05JTl8yNTZrYnBzXzQ0LjFraHpfbW9ub19DQlJfTUNBLm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL01QMy9OSU5fMjU2a2Jwc180OGtoel9tb25vX0NCUl9NQ0EubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL1BEXzExMmticHNfMzJraHpfc3RlcmVvX1ZCUl9NQ0EubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL1BEXzExMmticHNfNDQuMWtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvUERfMTEya2Jwc180OGtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9NUDMvUERfMTkya2Jwc18zMmtoel9tb25vX0NCUl9EUEEubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL1BEXzI1NmticHNfNDQuMWtoel9tb25vX0NCUl9EUEEubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvTVAzL1BEXzI1NmticHNfNDhraHpfbW9ub19DQlJfTUNBLm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL01QMy9XQ18yNTZrYnBzXzQ0LjFraHpfbW9ub19DQlJfRFBBLm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL01QMy9XQ18yNTZrYnBzXzQ4a2h6X21vbm9fQ0JSX0RQQS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9yZWd1bGFyX2FsYnVtX3Bob3RvL0Fwb2xvZ2l6ZS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9yZWd1bGFyX2FsYnVtX3Bob3RvL0JlY2F1c2VfT2ZfWW91Lm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL3JlZ3VsYXJfYWxidW1fcGhvdG8vQ29tcGxpY2F0ZWQubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvcmVndWxhcl9hbGJ1bV9waG90by9HbGFtb3JvdXMubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvcmVndWxhcl9hbGJ1bV9waG90by9JbV9XaXRoX1lvdS5tcDMiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9yZWd1bGFyX2FsYnVtX3Bob3RvL1NtaWxlLm1wMyIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL3JlZ3VsYXJfYWxidW1fcGhvdG8vU3VkZGVubHlfSV9TZWUubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvcmVndWxhcl9hbGJ1bV9waG90by9XaGVuIFlvdSBTYXkgTm90aGluZyBBdCBBbGwubXAzIiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvcmVndWxhcl9hbGJ1bV9waG90by9teV9oYXBweV9lbmRpbmcubXAzIn07Ci0gIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gQUFDRklMRVMgPSB7IAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvQUlfQUFDXzI0a2Jwc18xMmtoel9Nb25vXzFwQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvQUlfQUFDXzU2a2Jwc18yMi4wNWtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9BSV9BQUNfNTZrYnBzXzMya2h6X1N0ZXJlb19DQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9BSV9BQUNfNTZrYnBzXzQ0LjFraHpfU3RlcmVvXzFwQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvQUlfQUFDXzgwa2Jwc18zMmtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9BSV9BQUNfODBrYnBzXzMya2h6X1N0ZXJlb19DQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9OSU5fQUFDXzU2a2Jwc18yMi4wNWtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9OSU5fQUFDXzU2a2Jwc18zMmtoel9TdGVyZW9fQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvTklOX0FBQ181NmticHNfNDQuMWtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9OSU5fQUFDXzgwa2Jwc18zMmtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9OSU5fQUFDXzgwa2Jwc18zMmtoel9TdGVyZW9fQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvUERfQUFDXzU2a2Jwc18yMi4wNWtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9QRF9BQUNfNTZrYnBzXzMya2h6X1N0ZXJlb19DQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9QRF9BQUNfNTZrYnBzXzQ0LjFraHpfU3RlcmVvXzFwQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvUERfQUFDXzgwa2Jwc18zMmtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9QRF9BQUNfODBrYnBzXzMya2h6X1N0ZXJlb19DQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9QVl9BQUNfNTZrYnBzXzIyLjA1a2h6X1N0ZXJlb18xcENCUl9TU0UubXA0IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQUFDL1BWX0FBQ181NmticHNfMzJraHpfU3RlcmVvX0NCUl9TU0UubXA0IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQUFDL1BWX0FBQ181NmticHNfNDQuMWtoel9TdGVyZW9fMXBDQlJfU1NFLm1wNCIsCi0gICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL0FBQy9QVl9BQUNfODBrYnBzXzMya2h6X1N0ZXJlb18xcENCUl9TU0UubXA0IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQUFDL1BWX0FBQ184MGticHNfMzJraHpfU3RlcmVvX0NCUl9TU0UubXA0IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQUFDL1dDX0FBQ181NmticHNfMjIuMDVraHpfU3RlcmVvXzFwQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvV0NfQUFDXzU2a2Jwc18zMmtoel9TdGVyZW9fQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvV0NfQUFDXzU2a2Jwc180NC4xa2h6X1N0ZXJlb18xcENCUl9TU0UubXA0IiwKLSAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvQUFDL1dDX0FBQ184MGticHNfMzJraHpfU3RlcmVvXzFwQ0JSX1NTRS5tcDQiLAotICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9BQUMvV0NfQUFDXzgwa2Jwc18zMmtoel9TdGVyZW9fQ0JSX1NTRS5tcDQiLCAgICAgIAotICAgIH07Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBWSURFT0ZJTEVTID0geyAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9BSV9DVE9fTXBlZzRfMzJrYnBzXzEwZnBzX1NRQ0lGXzEyOHg5NitBQUNfOGticHNfOGtoel9tb25vX1FURS5tcDQiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvQUlfQ1RPX01wZWc0XzMya2Jwc18xMmZwc19TUUNJRl8xMjh4OTYrQUFDXzhrYnBzXzhraHpfbW9ub19RVEUubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL0FJX0NUT19NcGVnNF8zMmticHNfMTVmcHNfU1FDSUZfMTI4eDk2K0FBQ184a2Jwc184a2h6X21vbm9fUVRFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9BSV9DVE9fTXBlZzRfMzJrYnBzXzVmcHNfU1FDSUZfMTI4eDk2K0FBQ184a2Jwc184a2h6X21vbm9fUVRFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9BSV9DVE9fTXBlZzRfMzJrYnBzXzVmcHNfU1FDSUZfMTI4eDk2K0FBQ184a2Jwc184a2h6X21vbm9fU1NFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9BSV9DVE9fTXBlZzRfMzJrYnBzXzcuNWZwc19TUUNJRl8xMjh4OTYrQUFDXzhrYnBzXzhraHpfbW9ub19RVEUubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL0FJX1dNVl8xMDI0a2Jwc18yMGZwc19RQ0lGXzE3NngxNDRfbm9hdWRpb19TU0Uud212IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL0FJX1dNVl8xMDI0a2Jwc18yNWZwc19RQ0lGXzE3NngxNDRfbm9hdWRpb19TU0Uud212IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL0NoaWNrZW4ud212IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL01QX3FjaWZfMTVmcHNfMTAwa2Jwc180OGtIel8xOTJrYnBzXzMwc2Vjcy53bXYiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvTklOX0NUT19IMjY0XzEyM2ticHNfNWZwc19RQ0lGXzE3NngxNDQrQU1SXzEyLjJrYnBzXzhraHpfbW9ub19RVEUuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9DVE9fSDI2NF85NmticHNfMTAuMmZwc19RQ0lGXzE3NngxNDQrQU1SXzEyLjJrYnBzXzhraHpfbW9ub19RVEUuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9DVE9fSDI2NF85NmticHNfMTJmcHNfUUNJRl8xNzZ4MTQ0K0FNUl8xMi4ya2Jwc184a2h6X21vbm9fUVRFLjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9OSU5fQ1RPX0gyNjRfOTZrYnBzXzE1ZnBzX1FDSUZfMTc2eDE0NCtBTVJfMTIuMmticHNfOGtoel9tb25vX1FURS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvTklOX0NUT19NcGVnNF8xMjNrYnBzXzE1ZnBzX1FDSUZfMTc2eDE0NCtBQUNfMzJrYnBzXzIya2h6X21vbm9fU1NFLjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9OSU5fQ1RPX01wZWc0XzEyM2ticHNfNy41ZnBzX1FDSUZfMTc2eDE0NCtBQUNfMzJrYnBzXzIya2h6X3N0ZXJlb19TU0UuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9DVE9fTXBlZzRfMTI4a2Jwc18xMGZwc19RQ0lGXzE3NngxNDQrQUFDK18zMmticHNfNDhraHpfc3RlcmVvX1NTRS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvTklOX0NUT19NcGVnNF8xMjhrYnBzXzEyZnBzX1FDSUZfMTc2eDE0NCtBQUMrXzMya2Jwc180OGtoel9zdGVyZW9fU1NFLjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9OSU5fQ1RPX01wZWc0XzEyOGticHNfMTVmcHNfUUNJRl8xNzZ4MTQ0K0FBQytfMzJrYnBzXzQ4a2h6X3N0ZXJlb19TU0UuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9DVE9fTXBlZzRfMTI4a2Jwc181ZnBzX1FDSUZfMTc2eDE0NCtBQUMrXzMya2Jwc180OGtoel9zdGVyZW9fU1NFLjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9OSU5fQ1RPX01wZWc0XzEyOGticHNfNy41ZnBzX1FDSUZfMTc2eDE0NCtBQUMrXzMya2Jwc180OGtoel9zdGVyZW9fU1NFLjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9OSU5fSDI2M18xMjhrYnBzXzEwZnBzX1FDSUZfMTc0eDE0NF9ub2F1ZGlvX1NTRS5tcDQiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvTklOX0gyNjNfMTI4a2Jwc18xNWZwc19RQ0lGXzE3NHgxNDRfbm9hdWRpb19TU0UubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9IMjYzXzQ4a2Jwc18xMGZwc19RQ0lGXzE3NHgxNDRfbm9hdWRpb19TU0UuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9IMjYzXzQ4a2Jwc18xMmZwc19RQ0lGXzE3NHgxNDRfbm9hdWRpb19TU0UuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL05JTl9IMjY0XzEyM2ticHNfMTVmcHNfUUNJRl8xNzZ4MTQ0K0FBQ18zMmticHNfMjJraHpfc3RlcmVvX1NTRS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvTklOX0gyNjRfMTIza2Jwc183LjVmcHNfUUNJRl8xNzZ4MTQ0K0FBQ18zMmticHNfMjJraHpfc3RlcmVvX1NTRS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3BlcmYvUFZfSDI2NF8yMDAwa2Jwc18yMGZwc19DSUZfMzUyeDI4OCtBQUNfOTZrYnBzXzQ4a2h6X3N0ZXJlb19TU0UubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL1BWX0gyNjRfMjAwMGticHNfMjVmcHNfQ0lGXzM1MngyODgrQUFDXzk2a2Jwc180OGtoel9zdGVyZW9fU1NFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9QVl9IMjY0XzIwMDBrYnBzXzMwZnBzX0NJRl8zNTJ4Mjg4K0FBQ18xMjhrYnBzXzQ4a2h6X3N0ZXJlb19TU0UubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19wZXJmL1N0ZXZpZS0xLndtdiIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9XQ19IMjY0XzE2MDBrYnBzXzIwZnBzX1FDSUZfMTc2eDE0NCtBQUNfOTZrYnBzXzQ4a2h6X21vbm9fU1NFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9XQ19IMjY0XzE2MDBrYnBzXzI1ZnBzX1FDSUZfMTc2eDE0NCtBQUNfOTZrYnBzXzQ4a2h6X21vbm9fU1NFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9XQ19IMjY0XzE2MDBrYnBzXzMwZnBzX1FDSUZfMTc2eDE0NCtBQUNfOTZrYnBzXzQ4a2h6X21vbm9fU1NFLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9idWdzLndtdiIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9uaWNlZGF5LndtdiIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fcGVyZi9lYWdsZXNhdG9wbmZscGUud212IiwKLSAgICAgCi0gICAgfTsKLSAgICAKLSAgICAvL3dtYSAtIG9ubHkgc3VwcG9ydCB1cCB0byB3bWEgOQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gV01BU1VQUE9SVEVEID0gewotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BU1VQUE9SVEVEL0FJX1dNQTkuMl8zMmticHNfNDQuMWtoel9tb25vX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVNVUFBPUlRFRC9BSV9XTUE5LjJfNDhrYnBzXzQ0LjFraHpfbW9ub19DQlJfRFBBLndtYSIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9XTUFTVVBQT1JURUQvTklOX1dNQTkuMl8zMmticHNfNDQuMWtoel9tb25vX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVNVUFBPUlRFRC9OSU5fV01BOS4yXzQ4a2Jwc180NC4xa2h6X21vbm9fQ0JSX0RQQS53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BU1VQUE9SVEVEL1BEX1dNQTkuMl8zMmticHNfNDQuMWtoel9tb25vX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVNVUFBPUlRFRC9QRF9XTUE5LjJfNDhrYnBzXzQ0LjFraHpfbW9ub19DQlJfRFBBLndtYSIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9XTUFTVVBQT1JURUQvUFZfV01BOS4yXzMya2Jwc180NC4xa2h6X21vbm9fQ0JSX0RQQS53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BU1VQUE9SVEVEL1BWX1dNQTkuMl80OGticHNfNDQuMWtoel9tb25vX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVNVUFBPUlRFRC9XQ19XTUE5LjJfMzJrYnBzXzQ0LjFraHpfbW9ub19DQlJfRFBBLndtYSIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWNfcGVyZi9XTUFTVVBQT1JURUQvV0NfV01BOS4yXzQ4a2Jwc180NC4xa2h6X21vbm9fQ0JSX0RQQS53bWEiCi0gICAgICAKLSAgICB9OwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gV01BVU5TVVBQT1JURUQgPSB7IAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BVU5TVVBQT1JURUQvQUlfV01BMTBfMTI3a2Jwc180OGtoel9zdGVyZW9fQ0JSX0RQQS53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BVU5TVVBQT1JURUQvQUlfV01BMTBfMTI4a2Jwc180NC4xa2h6X3N0ZXJlb18ycFZCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzEyOGticHNfNDhraHpfc3RlcmVvXzJwVkJSX0RQQS53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BVU5TVVBQT1JURUQvQUlfV01BMTBfMTI4a2Jwc184OGtoel9zdGVyZW9fQ0JSX0RQQS53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BVU5TVVBQT1JURUQvQUlfV01BMTBfMTI4a2Jwc185Nmtoel9zdGVyZW9fQ0JSX0RQQS53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljX3BlcmYvV01BVU5TVVBQT1JURUQvQUlfV01BMTBfMTkya2Jwc180NC4xa2h6X3N0ZXJlb18ycFZCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzE5MmticHNfODhraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzE5MmticHNfOTZraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzI1NmticHNfNDRraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzI1NmticHNfNDhraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzI1NmticHNfODhraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzI1NmticHNfOTZraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzM4NGticHNfNDRraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzM4NGticHNfNDhraHpfc3RlcmVvX0NCUl9EUEEud21hIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpY19wZXJmL1dNQVVOU1VQUE9SVEVEL0FJX1dNQTEwXzM4NGticHNfODhraHpfc3RlcmVvX0NCUl9EUEEud21hIgotICAgIH07Ci0gICAgCi0gICAgLy9NZWRpYSBSZWNvcmRlcgorICAgIC8vIE1lZGlhIFJlY29yZGVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERVJfT1VUUFVUID0gIi9zZGNhcmQvbWVkaWFfYXBpL3JlY29yZGVyT3V0cHV0LmFtciI7Ci0gICAgCi0gICAgLy92aWRlbyB0aHVtYm5haWwKKworICAgIC8vIHZpZGVvIHRodW1ibmFpbAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRIVU1CTkFJTF9PVVRQVVQgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9UaHVtYm5haWwucG5nIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0xERU5fVEhVTUJOQUlMX09VVFBVVCA9ICIvc2RjYXJkL21lZGlhX2FwaS9nb2xkZW5UaHVtYm5haWwucG5nIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHT0xERU5fVEhVTUJOQUlMX09VVFBVVF8yID0gIi9zZGNhcmQvbWVkaWFfYXBpL2dvbGRlblRodW1ibmFpbDIucG5nIjsKLSAgICAKLSAgICAvL01ldGFkYXRhIFV0aWxpdHkKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRIVU1CTkFJTF9DQVBUVVJFX1RFU1RfRklMRVMgPSB7Ci0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvdGVzdC5tcDQiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxLjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvdGVzdDIuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0My4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3Q0LjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvdGVzdDUuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0Ni4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3Q3LjNncCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvdGVzdDguM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0OS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxMC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxMS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxMi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxMy4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxNC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxNS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxNi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxNy4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxOC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QxOS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyMC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyMS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyMi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyMy4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyNC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyNS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyNi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyNy4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyOC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QyOS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzMC4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzMS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzMi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzMy4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzNS5tcDQiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzNi5tNHYiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QzNC53bXYiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3RfbWV0YWRhdGEubXA0IiwKLSAgfTsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTUVUQURBVEFfUkVUUklFVkFMX1RFU1RfRklMRVMgPSB7Ci0gICAgICAvLyBSYXcgQUFDIGlzIG5vdCBzdXBwb3J0ZWQKLSAgICAgIC8vICIvc2RjYXJkL21lZGlhX2FwaS90ZXN0X3Jhdy5hYWMiLAotICAgICAgLy8gIi9zZGNhcmQvbWVkaWFfYXBpL3Rlc3RfYWR0cy5hYWMiLAotICAgICAgLy8gIi9zZGNhcmQvbWVkaWFfYXBpL3Rlc3RfYWRpZi5hYWMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3RfbWV0YWRhdGEubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS9XTUExMC53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL0xlYWRzb2xfb3V0LndhdiIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvdGVzdF9hYWMubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0X2Ftci5tcDQiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3RfYXZjX2Ftci5tcDQiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3RfbWV0YWRhdGEubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0X3Zici5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3RfY2JyLm1wMyIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvbWV0YWRhdGFfdGVzdDEubXAzIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0MzMuM2dwIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0MzUubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0MzYubTR2IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0X200dl9hbXIubXA0IiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tZXRhZGF0YS90ZXN0X2gyNjNfYW1yLm1wNCIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YWRhdGEvdGVzdDM0LndtdiIsCi0gIH07Ci0gIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMQlVNQVJUX1RFU1RfRklMRVMgPSB7Ci0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvYWxidW1fcGhvdG8vdGVzdF8yMl8xNl9tcDMubXAzIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9hbGJ1bV9waG90by9QRF8yNTZrYnBzXzQ4a2h6X21vbm9fQ0JSX01DQS5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvL1BEXzI1NmticHNfNDQuMWtoel9tb25vX0NCUl9EUEEubXAzIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9hbGJ1bV9waG90by9QRF8xOTJrYnBzXzMya2h6X21vbm9fQ0JSX0RQQS5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvL05JTl8yNTZrYnBzXzQ4a2h6X21vbm9fQ0JSX01DQS5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvL05JTl8yNTZrYnBzXzQ0LjFraHpfbW9ub19DQlJfTUNBLm1wMyIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvYWxidW1fcGhvdG8vTklOXzExMmticHMoOTZrYnBzKV80OGtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvL05JTl8xMTJrYnBzKDk2a2JwcylfNDQuMWtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvL2xpZ2h0R3JlZW4xLm1wMyIsCi0gICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvYWxidW1fcGhvdG8vYmFieUJsdWUyIDEubXAzIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9hbGJ1bV9waG90by8yLTAxIDAxIE5JTl81NmticHMoNjRrYnBzKV8zMmtoel9zdGVyZW9fVkJSX01DQS5tcDMiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvLzAyX05JTl8xMTJrYnBzKDgwa2JwcylfMzJraHpfc3RlcmVvX1ZCUl9NQ0EubXAzIiwKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9hbGJ1bV9waG90by9Ob19Xb21hbl9Ob19DcnlfMTI4Sy53bWEiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2FsYnVtX3Bob3RvL0JlZXRob3Zlbl8yLndtYSIsCi0gIH07CiAKLSAgLy9URVNUX1BBVEhfMTogaXMgYSB2aWRlbyBhbmQgY29udGFpbnMgbWV0YWRhdGEgZm9yIGtleSAibnVtLXRyYWNrcyIKLSAgLy8gVEVTVF9QQVRIXzI6IGFueSB2YWxpZCBtZWRpYSBmaWxlLgotICAvLyBURVNUX1BBVEhfMzogaW52YWxpZCBtZWRpYSBmaWxlCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFUSF8xID0gIi9zZGNhcmQvbWVkaWFfYXBpL21ldGFkYXRhL3Rlc3QubXA0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQVRIXzMgPSAiL3NkY2FyZC9tZWRpYV9hcGkvZGF0YS50eHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBVEhfNCA9ICJzb21lbm9uZXhpc3RpbmdwYXRobmFtZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFUSF81ID0gIm1lbTovLzAxMjM0NSI7Ci0gIAotICAvL01ldGEgZGF0YSBleHBlY3RlZCByZXN1bHQKLSAgLy9UaGUgZXhwZWN0ZWQgdGFnIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyCi0gIC8vY2RfdHJhY2tfbnVtYmVyLCBhbGJ1bSwgYXJ0aXN0LCBhdXRob3IsIGNvbXBvc2VyLCBkYXRlLCBnZW5yZQotICAvL3RpdGxlLCB5ZWFycywgZHVyYXRpb24KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9EQVRBX01QMyBbXVtdID0gewotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTVAzL0lEM1YxX0lEM1YyLm1wMyIsICIxLzEwIiwgIklEM1YyLjMgQWxidW0iLCAiSUQzVjIuMyBBcnRpc3QiLAotICAgICAgICAgICJJRDNWMi4zIEx5cmljaXN0IiwgIklEM1YyLjMgQ29tcG9zZXIiLCBudWxsLCAiQmx1ZXMiLAotICAgICAgICAgICJJRDNWMi4zIFRpdGxlIiwgIjEyMzQiLCAiMjk1IiwgIjEiLCBudWxsfSwKLSAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YURhdGFUZXN0TWVkaWFzL01QMy9JRDNWMi5tcDMiLCAiMS8xMCIsICJJRDNWMi4zIEFsYnVtIiwgIklEM1YyLjMgQXJ0aXN0IiwKLSAgICAgICAgICAiSUQzVjIuMyBMeXJpY2lzdCIsICJJRDNWMi4zIENvbXBvc2VyIiwgbnVsbCwgIkJsdWVzIiwgCi0gICAgICAgICAgIklEM1YyLjMgVGl0bGUiLCAiMTIzNCIsICIyODciLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTVAzL0lEM1YxLm1wMyIsICIxIiwgInRlc3QgSUQzVjEgQWxidW0iLCAidGVzdCBJRDNWMSBBcnRpc3QiLAotICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsICIyNTUiLCAidGVzdCBJRDNWMSBUaXRsZSIsICIxMjM0IiwgIjIzMTMzMiIsICIxIiwgbnVsbH0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9NUDMvQ29ycnVwdGVkX0lEM1YxLm1wMyIgLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiMjMxMzMwIiwgIjEiLCBudWxsfSwKLSAgICAgIC8vVGhlIGNvcnJ1cHRlZCBUQUxCIGZpZWxkIGluIGlkM3YyIHdvdWxkIG5vdCBzd2l0Y2ggdG8gaWQzdjEgdGFnIGF1dG9tYXRpY2FsbHkKLSAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YURhdGFUZXN0TWVkaWFzL01QMy9Db3JydXB0ZWRfSUQzVjJfVEFMQi5tcDMiLCAiMDEiLCBudWxsLCAiSUQzVjIuMyBBcnRpc3QiLAotICAgICAgICAgICJJRDNWMi4zIEx5cmljaXN0IiwgIklEM1YyLjMgQ29tcG9zZXIiLCBudWxsLCAKLSAgICAgICAgICAiQmx1ZXMiLCAiSUQzVjIuMyBUaXRsZSIsICIxMjM0IiwgIjI5NSIsICIxIiwgbnVsbH0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9NUDMvQ29ycnVwdGVkX0lEM1YyX1RDT00ubXAzIiwgIjAxIiwgIklEM1YyLjMgQWxidW0iLCAKLSAgICAgICAgICAgIklEM1YyLjMgQXJ0aXN0IiwgIklEM1YyLjMgTHlyaWNpc3QiLCBudWxsLCBudWxsLCAKLSAgICAgICAgICAgIkJsdWVzIiwgIklEM1YyLjMgVGl0bGUiLCAiMTIzNCIsICIyOTUiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTVAzL0NvcnJ1cHRlZF9JRDNWMl9UQ09NXzIubXAzIiwgIjAxIiwgIklEM1YyLjMgQWxidW0iLCAKLSAgICAgICAgICAgIklEM1YyLjMgQXJ0aXN0IiwgbnVsbCwgbnVsbCwgbnVsbCwgIkJsdWVzIiwgIklEM1YyLjMgVGl0bGUiLCAiMTIzNCIsICIyOTUiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTVAzL0NvcnJ1cHRlZF9JRDNWMl9UUkNLLm1wMyIsICJkZCIsICJJRDNWMi4zIEFsYnVtIiwgCi0gICAgICAgICAgICJJRDNWMi4zIEFydGlzdCIsICJJRDNWMi4zIEx5cmljaXN0IiwgIklEM1YyLjMgQ29tcG9zZXIiLCBudWxsLAotICAgICAgICAgICAiQmx1ZXMiLCAiSUQzVjIuMyBUaXRsZSIsICIxMjM0IiwgIjI5NSIsICIxIiwgbnVsbH0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9NUDMvQ29ycnVwdGVkX0lEM1YyX1RSQ0tfMi5tcDMiLCAiMDEiLCAiSUQzVjIuMyBBbGJ1bSIsIAotICAgICAgICAgICAiSUQzVjIuMyBBcnRpc3QiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiSUQzVjIuMyBUaXRsZSIsIG51bGwsICIyOTUiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTVAzL0NvcnJ1cHRlZF9JRDNWMl9UWUVSLm1wMyIsICIwMSIsICJJRDNWMi4zIEFsYnVtIiwKLSAgICAgICAgICAgIklEM1YyLjMgQXJ0aXN0IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIklEM1YyLjMgVGl0bGUiLCAiOTk5OSIsICIyOTUiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTVAzL0NvcnJ1cHRlZF9JRDNWMl9UWUVSXzIubXAzIiwgIjAxIiwgIklEM1YyLjMgQWxidW0iLAotICAgICAgICAgICAiSUQzVjIuMyBBcnRpc3QiLCAiSUQzVjIuMyBMeXJpY2lzdCIsICJJRDNWMi4zIENvbXBvc2VyIiwgbnVsbCwgCi0gICAgICAgICAgICJCbHVlcyIsICJJRDNWMi4zIFRpdGxlIiwgbnVsbCwgIjI5NSIsICIxIiwgbnVsbH0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9NUDMvQ29ycnVwdGVkX0lEM1YyX1RJVC5tcDMiLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICIyOTUiLCAiMSIsIG51bGx9Ci0gIH07CisgICAgLyoKKyAgICAgKiBNZXRhZGF0YSBVdGlsaXR5IFRlc3QgbWVkaWEgZmlsZXMgd2hpY2ggY29udGFpbiBtZXRhIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUSFVNQk5BSUxfTUVUQURBVEFfVEVTVF9GSUxFUyA9IHsKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjNfNTAwX0FNUk5CXzEyLjNncCIsCisgICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjYzXzU2X0FBQ18yNC4zZ3AiLAorICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vSDI2M181Nl9BTVJOQl82LjNncCIsCisgICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlby9IMjY0XzMyMF9BQUNfNjQuM2dwIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjRfMzIwX0FNUk5CXzYuM2dwIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjRfNTAwX0FBQ18xMjguM2dwIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjRfSFZHQV81MDBfTk9fQVVESU8uM2dwIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL0gyNjRfUVZHQV81MDBfTk9fQVVESU8uM2dwIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL01QRUc0XzMyMF9BQUNfNjQubXA0IiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvL2JvcmRlcl9sYXJnZS4zZ3AiLAorICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9lZGl0b3IvSDI2NF9CUF84MDB4NDgwXzE1ZnBzXzUxMmticHNfQUFDTENfMjRLSHpfMzhLYnBzX3NfMV8xNy5tcDQiLAorICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9lZGl0b3IvSDI2NF9NUF85NjB4NzIwXzI1ZnBzXzgwMGticHNfQUFDTENfNDhLaHpfMTkyS2Jwc19zXzFfMTcubXA0IiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvZWRpdG9yL01QRUc0X1NQXzY0MHg0ODBfMTVmcHNfNTEya2Jwc19BQUNMQ180OGtoel8xMzJrYnBzX3NfMF8yNi5tcDQiLAorICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9lZGl0b3IvTVBFRzRfU1BfMTc2eDE0NF8xMmZwc185MmticHNfQU1STkJfOEtIel8xMi4ya2Jwc19tXzBfMjcuM2dwIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvZWRpdG9yL01QRUc0X1NQXzcyMHg0ODBfMzBmcHNfMjgwa2Jwc19BQUNMQ180OGtIel8xNjFrYnBzX3NfMF8yNi5tcDQiCisgICAgfTsKIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RBVEFfT1RIRVJTIFtdW10gPSB7Ci0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy8zR1AvY2F0LjNncCIsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgbnVsbCwgbnVsbCwgIjIwMDgwMzA5VDAwMjQxNS4wMDBaIiwgbnVsbCwKLSAgICAgICAgICBudWxsLCBudWxsLCAiNjM5MTYiLCAiMiIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvQU1SL0FNUl9OQi5hbXIiLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgbnVsbCwgbnVsbCwgIjEyNjU0MCIsICIxIiwgbnVsbH0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9BTVJXQi9BTVJfV0IuYW1yIiwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgIG51bGwsIG51bGwsICIyMzExODAiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvTTRBL0phd3MgT2YgTGlmZV92ZXIxLm00YSIsICIxLzgiLCAiU3VzcGVuZGVkIEFuaW1hdGlvbiIsCi0gICAgICAgICAgIkpvaG4gUGV0cnVjY2kiLCBudWxsLCBudWxsLCAiMjAwNzA1MTBUMTI1MjIzLjAwMFoiLCAKLSAgICAgICAgICAiMTIiLCAiSmF3cyBPZiBMaWZlIiwgIjIwMDUiLCAiNDQ5MzI5IiwgIjEiLCAibTRhIGNvbXBvc2VyIn0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9NNFYvc2FtcGxlX2lQb2QubTR2IiwgbnVsbCwgbnVsbCwgCi0gICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgIjIwMDUxMjIwVDIwMjAxNS4wMDBaIiwgCi0gICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgIjg1NTAwIiwgIjIiLCBudWxsfSwKLSAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YURhdGFUZXN0TWVkaWFzL01JREkvTUlESS5taWQiLCBudWxsLCAiU3VzcGVuZGVkIEFuaW1hdGlvbiIsIAotICAgICAgICAgICJKb2huIFBldHJ1Y2NpIiwgbnVsbCwgbnVsbCwgIjIwMDcwNTEwVDEyNTIyMy4wMDBaIiwgCi0gICAgICAgICAgbnVsbCwgbnVsbCwgIjIwMDUiLCAiMjMxMTgwIiwgIjEiLCBudWxsfSwKLSAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YURhdGFUZXN0TWVkaWFzL01QNC9rdW5nX2Z1X3BhbmRhX2gyNjQubXA0IiwgIjIvMCIsICJtcDQgYWxidW0gS3VuZyBGdSBQYW5kYSIsCi0gICAgICAgICAgIm1wNCBhcnRpc3QgS3VuZyBGdSBQYW5kYSIsIG51bGwsIG51bGwsICIyMDA4MDUxN1QwOTE0NTEuMDAwWiIsIAotICAgICAgICAgICI0MCIsICJLdW5nIEZ1IFBhbmRhIiwgIjIwMDgiLCAiMTI4NTIxIiwgIjIiLCAibXA0IGNvbXBvc2VyIn0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9PR0cvUmluZ19DbGFzc2ljXzAyLm9nZyIsIG51bGwsICJTdXNwZW5kZWQgQW5pbWF0aW9uIiwgCi0gICAgICAgICAgIkpvaG4gUGV0cnVjY2kiLCBudWxsLCBudWxsLCAiMjAwNzA1MTBUMTI1MjIzLjAwMFoiLCAKLSAgICAgICAgICBudWxsLCBudWxsLCAiMjAwNSIsICIyMzExODAiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvT0dHL1doZW4gWW91IFNheSBOb3RoaW5nIEF0IEFsbC5vZ2ciLCAKLSAgICAgICAgICBudWxsLCAiU3VzcGVuZGVkIEFuaW1hdGlvbiIsICJKb2huIFBldHJ1Y2NpIiwgCi0gICAgICAgICAgbnVsbCwgbnVsbCwgIjIwMDcwNTEwVDEyNTIyMy4wMDBaIiwgbnVsbCwgbnVsbCwgIjIwMDUiLCAiMjMxMTgwIiwgIjEiLCBudWxsfSwKLSAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YURhdGFUZXN0TWVkaWFzL1dBVi9JbSBXaXRoIFlvdS53YXYiLCBudWxsLCBudWxsLCAKLSAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKLSAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCAiMjI0MDAwIiwgIjEiLCBudWxsfSwKLSAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbWV0YURhdGFUZXN0TWVkaWFzL1dNQS9XTUE5LndtYSIsICI2IiwgIlRlbiBTb25ncyBpbiB0aGUgS2V5IG9mIEJldHJheWFsIiwgCi0gICAgICAgICAgIkFsaWVuIENyaW1lIFN5bmRpY2F0ZSIsICJBbGllbiBDcmltZSBTeW5kaWNhdGUiLCAKLSAgICAgICAgICAid21hIDkgQ29tcG9zZXIiLCAiMjAwNDA1MjFUMTc1NzI5LjQ4M1oiLCAKLSAgICAgICAgICAiUm9jayIsICJSdW4gZm9yIHRoZSBNb25leSIsICIyMDA0IiwgIjEzNDQ3OSIsICIxIiwgbnVsbH0sCi0gICAgICB7Ii9zZGNhcmQvbWVkaWFfYXBpL21ldGFEYXRhVGVzdE1lZGlhcy9XTUEvV01BMTAud21hIiwgIjA5IiwgIndtYSAxMCBBbGJ1bSIsIAotICAgICAgICAgICJ3bWEgMTAgQWxidW0gQXJ0aXN0IiwgIndtYSAxMCBBcnRpc3QiLCAid21hIDEwIENvbXBvc2VyIiwgIjIwMDcwNzA1VDA2MzYyNS4wOTdaIiwgCi0gICAgICAgICAgIkFjaWQgSmF6eiIsICJ3bWEgMTAgVGl0bGUiLCAiMjAxMCIsICIxMjY1NzQiLCAiMSIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvV01WL2J1Z3Mud212IiwgIjgiLCAid212IDkgQWxidW0iLCAKLSAgICAgICAgICBudWxsLCAid212IDkgQXJ0aXN0ICIsIG51bGwsICIyMDA1MTEyMlQxNTUyNDcuNTQwWiIsIAotICAgICAgICAgIG51bGwsICJMb29uZXkgVHVuZXMgLSBIYXJlLUJyZWFkdGggSHVycnkiLCAiMjAwNSIsICIxOTM0ODIiLCAiMiIsIG51bGx9LAotICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tZXRhRGF0YVRlc3RNZWRpYXMvV01WL2NsaXBzX3Zlcjcud212IiwgIjUwIiwgIndtdiA3IEFsYnVtIiwgCi0gICAgICAgICAgbnVsbCwgIkhhbGxhdSBTaG9vdHMgJiBDb21wYW55IiwgbnVsbCwgIjIwMDIwMjI2VDE3MDA0NS44OTFaIiwgCi0gICAgICAgICAgbnVsbCwgIkNPREVDIFNob290b3V0IiwgIjE5ODYiLCAiNDM3MDkiLCAiMiIsIG51bGx9Ci0gIH07Ci0gIAotICAvL291dHB1dCByZWNvcmRlZCB2aWRlbwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfSFZHQV9IMjYzID0gIi9zZGNhcmQvSFZHQV9IMjYzLjNncCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SREVEX1FWR0FfSDI2MyA9ICIvc2RjYXJkL1FWR0FfSDI2My4zZ3AiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPUkRFRF9TUVZHQV9IMjYzID0gIi9zZGNhcmQvU1FWR0FfSDI2My4zZ3AiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPUkRFRF9DSUZfSDI2MyA9ICIvc2RjYXJkL0NJRl9IMjYzLjNncCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SREVEX1FDSUZfSDI2MyA9ICIvc2RjYXJkL1FDSUZfSDI2My4zZ3AiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPUkRFRF9QT1JUUkFJVF9IMjYzID0gIi9zZGNhcmQvUUNJRl9tcDQuM2dwIjsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SREVEX0hWR0FfTVA0ID0gIi9zZGNhcmQvSFZHQV9tcDQubXA0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUVZHQV9NUDQgPSAiL3NkY2FyZC9RVkdBX21wNC5tcDQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPUkRFRF9TUVZHQV9NUDQgPSAiL3NkY2FyZC9TUVZHQV9tcDQubXA0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfQ0lGX01QNCA9ICIvc2RjYXJkL0NJRl9tcDQubXA0IjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUUNJRl9NUDQgPSAiL3NkY2FyZC9RQ0lGX21wNC5tcDQiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfVklERU9fM0dQID0gIi9zZGNhcmQvdGVtcC4zZ3AiOwotICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxEX1ZJREVPX1BBVEggPSAiL3NkY2FyZC9tZWRpYV9hcGkvZmlsZXBhdGhkb2Vzbm90ZXhpc3QiICsKLSAgICAgICIvZmlsZXBhdGhkb2Vzbm90ZXhpc3QvdGVtcC4zZ3AiOwotICAKLSAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFJFQ09SREVEX1RJTUUgPSA1MDAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVkFMSURfVklERU9fRFVSQVRJT04gPSAyMDAwOwotICAKLSAgLy9WaWRlb3MgZm9yIHRoZSBtZWRpYXBsYXllciBzdHJlc3MgdGVzdAotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIEgyNjNfU1RSRVNTID0geyAKLSAgICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19zdHJlc3MvaDI2My9IMjYzX0NJRi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3N0cmVzcy9oMjYzL0gyNjNfUUNJRi4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3N0cmVzcy9oMjYzL0gyNjNfUVZHQS4zZ3AiLAotICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3N0cmVzcy9oMjYzL0gyNjNfU1FWR0EuM2dwIgotICB9OwotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBNUEVHNF9TVFJFU1MgPSB7IAotICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19zdHJlc3MvaDI2My9tcGVnNF9DSUYubXA0IiwKLSAgICAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW9fc3RyZXNzL2gyNjMvbXBlZzRfUUNJRi4zZ3AiLAotICAgICIvc2RjYXJkL21lZGlhX2FwaS92aWRlb19zdHJlc3MvaDI2My9tcGVnNF9RVkdBLjNncCIsCi0gICAgIi9zZGNhcmQvbWVkaWFfYXBpL3ZpZGVvX3N0cmVzcy9oMjYzL21wZWc0X1NRVkdBLm1wNCIKLSAgfTsKLSAgCi0gIC8vU3RyZWFtaW5nIHRlc3QgZmlsZXMKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIFtdIFNUUkVBTV9TRVJWRVIgPSBuZXcgYnl0ZVtdIHsoYnl0ZSk3NSwoYnl0ZSkxNywoYnl0ZSk0OCwoYnl0ZSkyMDR9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fSDI2NF80ODBfMzYwXzE0MTFrID0gCi0gICAgICAiaHR0cDovLzc1LjE3LjQ4LjIwNDoxMDA4OC95c2xhdS9zdHJlc3NfbWVkaWEvaDI2NF9yZWd1bGFyLm1wNCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9XTVYgPSAKLSAgICAgICJodHRwOi8vNzUuMTcuNDguMjA0OjEwMDg4L3lzbGF1L3N0cmVzc19tZWRpYS9idWdzLndtdiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUkVBTV9IMjYzXzE3NngxNDRfMzI1ayA9IAotICAgICAgImh0dHA6Ly83NS4xNy40OC4yMDQ6MTAwODgveXNsYXUvc3RyZXNzX21lZGlhL2gyNjNfcmVndWxhci4zZ3AiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fSDI2NF8zNTJ4Mjg4XzE1MzZrID0gCi0gICAgICAiaHR0cDovLzc1LjE3LjQ4LjIwNDoxMDA4OC95c2xhdS9zdHJlc3NfbWVkaWEvaDI2NF9oaWdoQml0UmF0ZS5tcDQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fTVAzPSAKLSAgICAgICJodHRwOi8vNzUuMTcuNDguMjA0OjEwMDg4L3lzbGF1L3N0cmVzc19tZWRpYS9tcDNfcmVndWxhci5tcDMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fTVBFRzRfUVZHQV8xMjhrID0gCi0gICAgICAiaHR0cDovLzc1LjE3LjQ4LjIwNDoxMDA4OC95c2xhdS9zdHJlc3NfbWVkaWEvbXBlZzRfcXZnYV8yNGZwcy4zZ3AiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVFJFQU1fSDI2NF80ODBfMzYwXzE0MTFrX0RVUkFUSU9OID0gNDYwMDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJREVPX0gyNjNfQUFDX0RVUkFUSU9OID0gNTAxMDAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSURFT19IMjYzX0FNUl9EVVJBVElPTiA9IDUwMjAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFMQlVNQVJUX1RFU1RfRklMRVMgPSB7CisgICAgICAgICIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfSUQzVjFfSUQzVjIubXAzIiwKKyAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL211c2ljL01QM180OEtIel8xMjhrYnBzX3NfMV8xN19JRDNWMi5tcDMiLAorICAgICAgICAiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YxLm1wMyIsCisgICAgfTsKKworICAgIC8vIFRFU1RfUEFUSF8xOiBpcyBhIHZpZGVvIGFuZCBjb250YWlucyBtZXRhZGF0YSBmb3Iga2V5ICJudW0tdHJhY2tzIgorICAgIC8vIFRFU1RfUEFUSF8yOiBhbnkgdmFsaWQgbWVkaWEgZmlsZS4KKyAgICAvLyBURVNUX1BBVEhfMzogaW52YWxpZCBtZWRpYSBmaWxlCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQVRIXzEgPSAiL3NkY2FyZC9tZWRpYV9hcGkvdmlkZW8vTVBFRzRfMzIwX0FBQ182NC5tcDQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFUSF8zID0gIi9zZGNhcmQvbWVkaWFfYXBpL2RhdGEudHh0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBVEhfNCA9ICJzb21lbm9uZXhpc3RpbmdwYXRobmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QQVRIXzUgPSAibWVtOi8vMDEyMzQ1IjsKKworICAgIC8vIE1ldGEgZGF0YSBleHBlY3RlZCByZXN1bHQKKyAgICAvLyBUaGUgZXhwZWN0ZWQgdGFnIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyCisgICAgLy8gY2RfdHJhY2tfbnVtYmVyLCBhbGJ1bSwgYXJ0aXN0LCBhdXRob3IsIGNvbXBvc2VyLCBkYXRlLCBnZW5yZQorICAgIC8vIHRpdGxlLCB5ZWFycywgZHVyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBX0RBVEFfTVAzW11bXSA9IHsKKyAgICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfSUQzVjFfSUQzVjIubXAzIiwgIjIvMzQiLAorICAgICAgICAgIlRlc3QgSUQzVjIgQWxidW0iLCAiVGVzdCBJRDNWMiBBcnRpc3QiLCBudWxsLCAiVGVzdCBJRDNWMiBDb21wb3NlciIsCisgICAgICAgICBudWxsLCAiKDEpQ2xhc3NpYyBSb2NrIiwgIlRlc3QgSUQzVjIgVGl0bGUgIiwgbnVsbCwgIjc3NjQwIiwgIjEiLCBudWxsfSwKKyAgICAgICAgeyIvc2RjYXJkL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfSUQzVjIubXAzIiwgIjEvMTAiLAorICAgICAgICAgIlRlc3QgSUQzVjIgQWxidW0iLCAiVGVzdCBJRDNWMiBBcnRpc3QiLCBudWxsLCAiVGVzdCBJRDNWMiBDb21wb3NlciIsCisgICAgICAgICBudWxsLCAiKDc0KUFjaWQgSmF6eiIsICJUZXN0IElEM1YyIFRhZyIsIG51bGwsICI3NzY0MCIsICIxIiwgbnVsbH0sCisgICAgICAgIHsiL3NkY2FyZC9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YxLm1wMyIsICIyIiwKKyAgICAgICAgICJUZXN0IElEM1YxIEFsYnVtIiwgIlRlc3QgSUQzVjEgQXJ0aXN0IiwgbnVsbCwgbnVsbCwgbnVsbCwgIigxNSkiLAorICAgICAgICAgIlRlc3QgSUQzVjEgVGl0bGUiLCAiMjAxMSIsICI3NzY0MCIsICIxIiwgbnVsbH0KKyAgICB9OworCisgICAgLy8gb3V0cHV0IHJlY29yZGVkIHZpZGVvCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfSFZHQV9IMjYzID0gIi9zZGNhcmQvSFZHQV9IMjYzLjNncCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUVZHQV9IMjYzID0gIi9zZGNhcmQvUVZHQV9IMjYzLjNncCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfU1FWR0FfSDI2MyA9ICIvc2RjYXJkL1NRVkdBX0gyNjMuM2dwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPUkRFRF9DSUZfSDI2MyA9ICIvc2RjYXJkL0NJRl9IMjYzLjNncCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUUNJRl9IMjYzID0gIi9zZGNhcmQvUUNJRl9IMjYzLjNncCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUE9SVFJBSVRfSDI2MyA9ICIvc2RjYXJkL1FDSUZfbXA0LjNncCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPUkRFRF9IVkdBX01QNCA9ICIvc2RjYXJkL0hWR0FfbXA0Lm1wNCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUVZHQV9NUDQgPSAiL3NkY2FyZC9RVkdBX21wNC5tcDQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SREVEX1NRVkdBX01QNCA9ICIvc2RjYXJkL1NRVkdBX21wNC5tcDQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SREVEX0NJRl9NUDQgPSAiL3NkY2FyZC9DSUZfbXA0Lm1wNCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfUUNJRl9NUDQgPSAiL3NkY2FyZC9RQ0lGX21wNC5tcDQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT1JERURfVklERU9fM0dQID0gIi9zZGNhcmQvdGVtcC4zZ3AiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxEX1ZJREVPX1BBVEggPQorICAgICAgICAgICAgIi9zZGNhcmQvbWVkaWFfYXBpL2ZpbGVwYXRoZG9lc25vdGV4aXN0IiArICIvZmlsZXBhdGhkb2Vzbm90ZXhpc3QvdGVtcC4zZ3AiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFJFQ09SREVEX1RJTUUgPSA1MDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBWQUxJRF9WSURFT19EVVJBVElPTiA9IDIwMDA7CisKKyAgICAvLyBTdHJlYW1pbmcgdGVzdCBmaWxlcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFNUUkVBTV9TRVJWRVIgPQorICAgICAgICAgICAgbmV3IGJ5dGVbXSB7KGJ5dGUpIDc1LCAoYnl0ZSkgMTcsIChieXRlKSA0OCwgKGJ5dGUpIDIwNH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX0gyNjRfNDgwXzM2MF8xNDExayA9CisgICAgICAgICAgICAiaHR0cDovLzc1LjE3LjQ4LjIwNDoxMDA4OC95c2xhdS9zdHJlc3NfbWVkaWEvaDI2NF9yZWd1bGFyLm1wNCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX1dNViA9ICJodHRwOi8vNzUuMTcuNDguMjA0OjEwMDg4L3lzbGF1L3N0cmVzc19tZWRpYS9idWdzLndtdiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX0gyNjNfMTc2eDE0NF8zMjVrID0KKyAgICAgICAgICAgICJodHRwOi8vNzUuMTcuNDguMjA0OjEwMDg4L3lzbGF1L3N0cmVzc19tZWRpYS9oMjYzX3JlZ3VsYXIuM2dwIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fSDI2NF8zNTJ4Mjg4XzE1MzZrID0KKyAgICAgICAgICAgICJodHRwOi8vNzUuMTcuNDguMjA0OjEwMDg4L3lzbGF1L3N0cmVzc19tZWRpYS9oMjY0X2hpZ2hCaXRSYXRlLm1wNCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX01QMyA9CisgICAgICAgICAgICAiaHR0cDovLzc1LjE3LjQ4LjIwNDoxMDA4OC95c2xhdS9zdHJlc3NfbWVkaWEvbXAzX3JlZ3VsYXIubXAzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJFQU1fTVBFRzRfUVZHQV8xMjhrID0KKyAgICAgICAgICAgICJodHRwOi8vNzUuMTcuNDguMjA0OjEwMDg4L3lzbGF1L3N0cmVzc19tZWRpYS9tcGVnNF9xdmdhXzI0ZnBzLjNncCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RSRUFNX0gyNjRfNDgwXzM2MF8xNDExa19EVVJBVElPTiA9IDQ2MDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJREVPX0gyNjNfQUFDX0RVUkFUSU9OID0gNTAxMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJREVPX0gyNjNfQU1SX0RVUkFUSU9OID0gNTAyMDAwOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvZnVuY3Rpb25hbC9NZWRpYU1ldGFkYXRhVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvZnVuY3Rpb25hbC9NZWRpYU1ldGFkYXRhVGVzdC5qYXZhCmluZGV4IDZkZWQ3NGQuLjM4MGRlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L2Z1bmN0aW9uYWwvTWVkaWFNZXRhZGF0YVRlc3QuamF2YQorKysgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhTWV0YWRhdGFUZXN0LmphdmEKQEAgLTQxLDIwICs0MSwxMSBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgc3RhdGljIGVudW0gTVAzX1RFU1RfRklMRXsKLSAgICAgICAgSUQzVjFWMiwgSUQzVjIsIElEM1YxLAotICAgICAgICBDT1JSVVBURURfSUQzVjEsIENPUlJVUFRFRF9JRDNWMl9UQUxCLCBDT1JSVVBURURfSUQzVjJfVENPTSwKLSAgICAgICAgQ09SUlVQVEVEX0lEM1YyX1RDT01fMiwgQ09SUlVQVEVEX0lEM1YyX1RSQ0ssIENPUlJVUFRFRF9EM1YyX1RSQ0tfMiwKLSAgICAgICAgQ09SUlVQVEVEX0lEM1YyX1RZRVIsIENPUlJVUFRFRF9JRDNWMl9UWUVSXzIsIENPUlJVUFRFRF9JRDNWMl9USVQKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIE5PTl9NUDNfVEVTVF9GSUxFewotICAgICAgICAgVEhSRUUzR1AsIEFNUk5CLCBBTVJXQiwgTTRBMSwgTTRWLCBNSURJLAotICAgICAgICAgSDI2NCwgT0dHMSwgT0dHMiwgV0FWLCBXTUE5LCBXTUExMCwgV01WOSwgV01WNworICAgICAgICBJRDNWMVYyLCBJRDNWMiwgSUQzVjEKICAgICB9CiAgICAgCiAgICAgcHVibGljIHN0YXRpYyBNRVRBREFUQV9FWFBFQ1RFRFJFU1VMVCBtZXRhOwogICAgIHB1YmxpYyBzdGF0aWMgTVAzX1RFU1RfRklMRSBtcDNfdGVzdF9maWxlOwotICAgIHB1YmxpYyBzdGF0aWMgTk9OX01QM19URVNUX0ZJTEUgbm9uX21wM190ZXN0X2ZpbGU7CiAgICAKICAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SUQzVjFWMk1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC03MCwxMzQgKzYxLDExIEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RJRDNWMU1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG1wM190ZXN0X2ZpbGUuSUQzVjEub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9NUDMpOwogICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q29ycnVwdGVkSUQzVjFNZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShtcDNfdGVzdF9maWxlLkNPUlJVUFRFRF9JRDNWMS5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX01QMyk7Ci0gICAgfQogCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENvcnJ1cHRlZF9JRDNWMl9UQUxCTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobXAzX3Rlc3RfZmlsZS5DT1JSVVBURURfSUQzVjJfVEFMQi5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX01QMyk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDb3JydXB0ZWRfSUQzVjJfVENPTU1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG1wM190ZXN0X2ZpbGUuQ09SUlVQVEVEX0lEM1YyX1RDT00ub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9NUDMpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q29ycnVwdGVkX0lEM1YyX1RDT01NMmV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobXAzX3Rlc3RfZmlsZS5DT1JSVVBURURfSUQzVjJfVENPTV8yLm9yZGluYWwoKSwgTWVkaWFOYW1lcy5NRVRBX0RBVEFfTVAzKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENvcnJ1cHRlZF9JRDNWMl9UUkNLTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobXAzX3Rlc3RfZmlsZS5DT1JSVVBURURfSUQzVjJfVFJDSy5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX01QMyk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDb3JydXB0ZWRfSUQzVjJfVFJDSzJNZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShtcDNfdGVzdF9maWxlLkNPUlJVUFRFRF9EM1YyX1RSQ0tfMi5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX01QMyk7Ci0gICAgfQotICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdENvcnJ1cHRlZF9JRDNWMl9UWUVSTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobXAzX3Rlc3RfZmlsZS5DT1JSVVBURURfSUQzVjJfVFlFUi5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX01QMyk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDb3JydXB0ZWRfSUQzVjJfVFlFUjJNZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShtcDNfdGVzdF9maWxlLkNPUlJVUFRFRF9JRDNWMl9UWUVSXzIub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9NUDMpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q29ycnVwdGVkX0lEM1YyX1RJVE1ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG1wM190ZXN0X2ZpbGUuQ09SUlVQVEVEX0lEM1YyX1RJVC5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX01QMyk7Ci0gICAgfQotICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdDNncF9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShub25fbXAzX3Rlc3RfZmlsZS5USFJFRTNHUC5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX09USEVSUyk7Ci0gICAgfQotICAgIAotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RBbXJfTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobm9uX21wM190ZXN0X2ZpbGUuQU1STkIub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QW1yV2JfTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobm9uX21wM190ZXN0X2ZpbGUuQU1SV0Iub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0TTRBMV9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShub25fbXAzX3Rlc3RfZmlsZS5NNEExLm9yZGluYWwoKSwgTWVkaWFOYW1lcy5NRVRBX0RBVEFfT1RIRVJTKTsKLSAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE00dl9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShub25fbXAzX3Rlc3RfZmlsZS5NNFYub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SDI2NF9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShub25fbXAzX3Rlc3RfZmlsZS5IMjY0Lm9yZGluYWwoKSwgTWVkaWFOYW1lcy5NRVRBX0RBVEFfT1RIRVJTKTsKLSAgICB9Ci0gICAgLy9idWcjIDE0NDA0ODkKLSAgICBAU3VwcHJlc3MKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0T2dnMV9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShub25fbXAzX3Rlc3RfZmlsZS5PR0cxLm9yZGluYWwoKSwgTWVkaWFOYW1lcy5NRVRBX0RBVEFfT1RIRVJTKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE9nZzJfTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobm9uX21wM190ZXN0X2ZpbGUuT0dHMi5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX09USEVSUyk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzcwotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RNaWRpX01ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG5vbl9tcDNfdGVzdF9maWxlLk1JREkub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0V2F2X01ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG5vbl9tcDNfdGVzdF9maWxlLldBVi5vcmRpbmFsKCksIE1lZGlhTmFtZXMuTUVUQV9EQVRBX09USEVSUyk7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzcwotICAgIEBNZWRpdW1UZXN0Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RXbWE5X01ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG5vbl9tcDNfdGVzdF9maWxlLldNQTkub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3MKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0V21hMTBfTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdmFsaWRhdGVNZXRhdERhdGEobm9uX21wM190ZXN0X2ZpbGUuV01BMTAub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAKLSAgICBAU3VwcHJlc3MKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0V212OV9NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB2YWxpZGF0ZU1ldGF0RGF0YShub25fbXAzX3Rlc3RfZmlsZS5XTVY5Lm9yZGluYWwoKSwgTWVkaWFOYW1lcy5NRVRBX0RBVEFfT1RIRVJTKTsKLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFdtdjEwX01ldGFkYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHZhbGlkYXRlTWV0YXREYXRhKG5vbl9tcDNfdGVzdF9maWxlLldNVjcub3JkaW5hbCgpLCBNZWRpYU5hbWVzLk1FVEFfREFUQV9PVEhFUlMpOwotICAgIH0KLSAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGF0RGF0YShpbnQgZmlsZUluZGV4LCBTdHJpbmcgbWV0YV9kYXRhX2ZpbGVbXVtdKSB7CiAgICAgICAgIExvZy52KFRBRywgImZpbGVQYXRoID0gIisgbWV0YV9kYXRhX2ZpbGVbZmlsZUluZGV4XVswXSk7CiAgICAgICAgIGlmICgobWV0YV9kYXRhX2ZpbGVbZmlsZUluZGV4XVswXS5lbmRzV2l0aCgid21hIikgJiYgIU1lZGlhUHJvZmlsZVJlYWRlci5nZXRXTUFFbmFibGUoKSkgfHwKICAgICAgICAgICAgIChtZXRhX2RhdGFfZmlsZVtmaWxlSW5kZXhdWzBdLmVuZHNXaXRoKCJ3bXYiKSAmJiAhTWVkaWFQcm9maWxlUmVhZGVyLmdldFdNVkVuYWJsZSgpKSkgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiU2tpcCB0ZXN0IHNpbmNlIHdpbmRvd3MgbWVkaWEgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhUGxheWVyQXBpVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvZnVuY3Rpb25hbC9NZWRpYVBsYXllckFwaVRlc3QuamF2YQppbmRleCBkMjIwMjVjLi41N2Q1MzY4IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9mdW5jdGlvbmFsL01lZGlhUGxheWVyQXBpVGVzdC5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L2Z1bmN0aW9uYWwvTWVkaWFQbGF5ZXJBcGlUZXN0LmphdmEKQEAgLTg0LDE1ICs4NCw2IEBACiAgICAgICBkdXJhdG9pbldpdGhpblRvbGVyZW5jZSA9IHZlcmlmeUR1cmF0aW9uKGR1cmF0aW9uLCBNZWRpYU5hbWVzLk1JRElfTEVOR1RIKTsKICAgICAgIGFzc2VydFRydWUoIk1JREkgZ2V0RHVyYXRpb24iLCBkdXJhdG9pbldpdGhpblRvbGVyZW5jZSk7ICAKICAgICB9Ci0gICAgCi0gICAgQE1lZGl1bVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V01BOUdldER1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBpZiAoaXNXTUFFbmFibGUpIHsKLSAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IENvZGVjVGVzdC5nZXREdXJhdGlvbihNZWRpYU5hbWVzLldNQTkpOwotICAgICAgICAgICAgZHVyYXRvaW5XaXRoaW5Ub2xlcmVuY2UgPSB2ZXJpZnlEdXJhdGlvbihkdXJhdGlvbiwgTWVkaWFOYW1lcy5XTUE5X0xFTkdUSCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJXTUE5IGdldER1cmF0aW9uIiwgZHVyYXRvaW5XaXRoaW5Ub2xlcmVuY2UpOwotICAgICAgICB9Ci0gICAgfQogCiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QU1SR2V0RHVyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEyNywxNSArMTE4LDcgQEAKICAgICAgIGJvb2xlYW4gY3VycmVudFBvc2l0aW9uID0gQ29kZWNUZXN0LmdldEN1cnJlbnRQb3NpdGlvbihNZWRpYU5hbWVzLk1JREkpOyAgCiAgICAgICBhc3NlcnRUcnVlKCJNSURJIEdldEN1cnJlbnRQb3NpdGlvbiIsIGN1cnJlbnRQb3NpdGlvbik7ICAKICAgICB9Ci0gICAgCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXTUE5R2V0Q3VycmVudFBvc2l0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1dNQUVuYWJsZSkgewotICAgICAgICAgICAgYm9vbGVhbiBjdXJyZW50UG9zaXRpb24gPSBDb2RlY1Rlc3QuZ2V0Q3VycmVudFBvc2l0aW9uKE1lZGlhTmFtZXMuV01BOSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJXTUE5IEdldEN1cnJlbnRQb3NpdGlvbiIsIGN1cnJlbnRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCisKICAgICBATGFyZ2VUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFNUkdldEN1cnJlbnRQb3NpdGlvbigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgYm9vbGVhbiBjdXJyZW50UG9zaXRpb24gPSBDb2RlY1Rlc3QuZ2V0Q3VycmVudFBvc2l0aW9uKE1lZGlhTmFtZXMuQU1SKTsgIApAQCAtMTY2LDE1ICsxNDksNyBAQAogICAgICAgYm9vbGVhbiBpc1BhdXNlZCA9IENvZGVjVGVzdC5wYXVzZShNZWRpYU5hbWVzLk1JREkpOyAgCiAgICAgICBhc3NlcnRUcnVlKCJNSURJIFBhdXNlIiwgaXNQYXVzZWQpOyAgCiAgICAgfQotICAgCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXTUE5UGF1c2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzV01BRW5hYmxlKSB7Ci0gICAgICAgICAgICBib29sZWFuIGlzUGF1c2VkID0gQ29kZWNUZXN0LnBhdXNlKE1lZGlhTmFtZXMuV01BOSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJXTUE5IFBhdXNlIiwgaXNQYXVzZWQpOwotICAgICAgICB9Ci0gICAgfQotICAKKwogICAgIEBMYXJnZVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QU1SUGF1c2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgIGJvb2xlYW4gaXNQYXVzZWQgPSBDb2RlY1Rlc3QucGF1c2UoTWVkaWFOYW1lcy5BTVIpOyAgCkBAIC0yMzksMTUgKzIxNCw3IEBACiAgICAgICBib29sZWFuIGlzTG9vcCA9IENvZGVjVGVzdC5zZXRMb29waW5nKE1lZGlhTmFtZXMuTUlESSk7ICAKICAgICAgIGFzc2VydFRydWUoIk1JREkgc2V0TG9vcGluZyIsIGlzTG9vcCk7ICAKICAgICB9Ci0gICAgCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXTUE5U2V0TG9vcGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgaWYgKGlzV01BRW5hYmxlKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNMb29wID0gQ29kZWNUZXN0LnNldExvb3BpbmcoTWVkaWFOYW1lcy5XTUE5KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV01BOSBzZXRMb29waW5nIiwgaXNMb29wKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCisKICAgICBATGFyZ2VUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFNUlNldExvb3BpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgIGJvb2xlYW4gaXNMb29wID0gQ29kZWNUZXN0LnNldExvb3BpbmcoTWVkaWFOYW1lcy5BTVIpOyAgCkBAIC0yNzksMTUgKzI0Niw3IEBACiAgICAgICBib29sZWFuIGlzTG9vcCA9IENvZGVjVGVzdC5zZWVrVG8oTWVkaWFOYW1lcy5NSURJKTsgIAogICAgICAgYXNzZXJ0VHJ1ZSgiTUlESSBzZWVrVG8iLCBpc0xvb3ApOyAgCiAgICAgfQotICAgIAotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V01BOVNlZWtUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpZiAoaXNXTUFFbmFibGUpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNMb29wID0gQ29kZWNUZXN0LnNlZWtUbyhNZWRpYU5hbWVzLldNQTkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV01BOSBzZWVrVG8iLCBpc0xvb3ApOwotICAgICAgICB9Ci0gICAgfQotICAgIAorCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBTVJTZWVrVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgIGJvb2xlYW4gaXNMb29wID0gQ29kZWNUZXN0LnNlZWtUbyhNZWRpYU5hbWVzLkFNUik7ICAKQEAgLTMyMCwxNSArMjc5LDYgQEAKICAgICAgIGJvb2xlYW4gaXNFbmQgPSBDb2RlY1Rlc3Quc2Vla1RvRW5kKE1lZGlhTmFtZXMuTUlESSk7ICAKICAgICAgIGFzc2VydFRydWUoIk1JREkgc2Vla1RvRW5kIiwgaXNFbmQpOyAgCiAgICAgfQotCi0gICAgQFN1cHByZXNzCi0gICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXTUE5U2Vla1RvRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc1dNQUVuYWJsZSkgewotICAgICAgICAgICAgYm9vbGVhbiBpc0VuZCA9IENvZGVjVGVzdC5zZWVrVG9FbmQoTWVkaWFOYW1lcy5XTUE5KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIldNQTkgc2Vla1RvRW5kIiwgaXNFbmQpOwotICAgICAgICB9Ci0gICAgfQogICAgIAogICAgIEBMYXJnZVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QU1SU2Vla1RvRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zNjksMTMgKzMxOSw3IEBACiAgICAgICBib29sZWFuIGlzU2VlayA9IENvZGVjVGVzdC52aWRlb1NlZWtUbyhNZWRpYU5hbWVzLlZJREVPX01QNCk7CiAgICAgICBhc3NlcnRUcnVlKCJMb2NhbCBNUDQgU2Vla1RvIiwgaXNTZWVrKTsgICAgICAgICAgCiAgICAgfQotICAgIAotICAgIEBMYXJnZVRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmlkZW9Mb25nM2dwU2Vla1RvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBib29sZWFuIGlzU2VlayA9IENvZGVjVGVzdC52aWRlb1NlZWtUbyhNZWRpYU5hbWVzLlZJREVPX0xPTkdfM0dQKTsKLSAgICAgIGFzc2VydFRydWUoIkxvY2FsIDNncCBTZWVrVG8iLCBpc1NlZWspOyAgICAgICAgIAotICAgIH0KLSAgIAorCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWaWRlb0gyNjNBQUNTZWVrVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgIGJvb2xlYW4gaXNTZWVrID0gQ29kZWNUZXN0LnZpZGVvU2Vla1RvKE1lZGlhTmFtZXMuVklERU9fSDI2M19BQUMpOwpAQCAtMzk5LDE3ICszNDMsMTMgQEAKICAgICAgIGJvb2xlYW4gaXNTZWVrID0gQ29kZWNUZXN0LnZpZGVvU2Vla1RvKE1lZGlhTmFtZXMuVklERU9fSDI2NF9BTVIpOwogICAgICAgYXNzZXJ0VHJ1ZSgiSDI2NEFNUiBTZWVrVG8iLCBpc1NlZWspOyAgICAgICAgIAogICAgIH0KLSAgIAorCiAgICAgQExhcmdlVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWaWRlb1dNVlNlZWtUbygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2cudihUQUcsICJ3bXYgbm90IGVuYWJsZSIpOwotICAgICAgICBpZiAoaXNXTVZFbmFibGUpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywgIndtdiBlbmFibGUiKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNTZWVrID0gQ29kZWNUZXN0LnZpZGVvU2Vla1RvKE1lZGlhTmFtZXMuVklERU9fV01WKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIldNViBTZWVrVG8iLCBpc1NlZWspOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFZpZGVvV2VibVNlZWtUbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgYm9vbGVhbiBpc1NlZWsgPSBDb2RlY1Rlc3QudmlkZW9TZWVrVG8oTWVkaWFOYW1lcy5WSURFT19XRUJNKTsKKyAgICAgIGFzc2VydFRydWUoIldFQk0gU2Vla1RvIiwgaXNTZWVrKTsKICAgICB9Ci0gICAgCisKICAgICBATGFyZ2VUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNvdW5kUmVjb3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICBib29sZWFuIGlzUmVjb3JkZXJlZCA9IENvZGVjVGVzdC5tZWRpYVJlY29yZGVyUmVjb3JkKE1lZGlhTmFtZXMuUkVDT1JERVJfT1VUUFVUKTsKQEAgLTQxOCw3ICszNTgsNyBAQAogICAKICAgICBATGFyZ2VUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldFRodW1ibmFpbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgYm9vbGVhbiBnZXRUaHVtYm5haWwgPSBDb2RlY1Rlc3QuZ2V0VGh1bWJuYWlsKE1lZGlhTmFtZXMuVklERU9fSDI2NF9BQUMsIE1lZGlhTmFtZXMuR09MREVOX1RIVU1CTkFJTF9PVVRQVVRfMik7CisgICAgICBib29sZWFuIGdldFRodW1ibmFpbCA9IENvZGVjVGVzdC5nZXRUaHVtYm5haWwoTWVkaWFOYW1lcy5WSURFT19IMjY0X0FBQywgTWVkaWFOYW1lcy5HT0xERU5fVEhVTUJOQUlMX09VVFBVVCk7CiAgICAgICBhc3NlcnRUcnVlKCJHZXQgVGh1bWJuYWlsIiwgZ2V0VGh1bWJuYWlsKTsgICAgICAgICAKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9wZXJmb3JtYW5jZS9NZWRpYVBsYXllclBlcmZvcm1hbmNlLmphdmEgYi9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9wZXJmb3JtYW5jZS9NZWRpYVBsYXllclBlcmZvcm1hbmNlLmphdmEKaW5kZXggMzRhZmZhNy4uYjM5NjIyMyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvcGVyZm9ybWFuY2UvTWVkaWFQbGF5ZXJQZXJmb3JtYW5jZS5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L3BlcmZvcm1hbmNlL01lZGlhUGxheWVyUGVyZm9ybWFuY2UuamF2YQpAQCAtMTAwLDEwOSArMTAwLDYgQEAKICAgICAgICAgICAgIE1lZGlhVGVzdFV0aWwuZ2V0TmF0aXZlSGVhcER1bXAodGhpcy5nZXROYW1lKCkgKyAiX2FmdGVyIik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY3JlYXRlREIoKSB7Ci0gICAgICAgIG1EQiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKCIvc2RjYXJkL3BlcmYuZGIiLCBudWxsKTsKLSAgICAgICAgbURCLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHBlcmZkYXRhIChfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiICsgCi0gICAgICAgICAgICAgICAgImZpbGUgVEVYVCwiICsgInNldGRhdGF0aW1lIExPTkcsIiArICJwcmVwYXJldGltZSBMT05HLCIgKwotICAgICAgICAgICAgICAgICJwbGF5dGltZSBMT05HIiArICIpOyIpOwotICAgICAgICAvL2NsZWFuIHRoZSB0YWJsZSBiZWZvcmUgYWRkaW5nIG5ldyBkYXRhCi0gICAgICAgIG1EQi5leGVjU1FMKCJERUxFVEUgRlJPTSBwZXJmZGF0YSIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGF1ZGlvUGxheWJhY2tTdGFydHVwVGltZShTdHJpbmdbXSB0ZXN0RmlsZSkgewotICAgICAgICBsb25nIHQxID0gMDsKLSAgICAgICAgbG9uZyB0MiA9IDA7Ci0gICAgICAgIGxvbmcgdDMgPSAwOwotICAgICAgICBsb25nIHQ0ID0gMDsKLSAgICAgICAgbG9uZyBzZXREYXRhU291cmNlRHVyYXRpb24gPSAwOwotICAgICAgICBsb25nIHByZXBhcmVEdXJhdGlvbiA9IDA7Ci0gICAgICAgIGxvbmcgc3RhcnREdXJhdGlvbiA9IDA7Ci0gICAgICAgIGxvbmcgdG90YWxTZXREYXRhVGltZSA9IDA7Ci0gICAgICAgIGxvbmcgdG90YWxQcmVwYXJlVGltZSA9IDA7Ci0gICAgICAgIGxvbmcgdG90YWxTdGFydER1cmF0aW9uID0gMDsKLQotICAgICAgICBpbnQgbnVtYmVyT2ZGaWxlcyA9IHRlc3RGaWxlLmxlbmd0aDsKLSAgICAgICAgTG9nLnYoVEFHLCAiRmlsZSBsZW5ndGggIiArIG51bWJlck9mRmlsZXMpOwotICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IG51bWJlck9mRmlsZXM7IGsrKykgewotICAgICAgICAgICAgTWVkaWFQbGF5ZXIgbXAgPSBuZXcgTWVkaWFQbGF5ZXIoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdDEgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZXN0RmlsZVtrXSk7Ci0gICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmQgPSBmaXMuZ2V0RkQoKTsKLSAgICAgICAgICAgICAgICBtcC5zZXREYXRhU291cmNlKGZkKTsKLSAgICAgICAgICAgICAgICBmaXMuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB0MiA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1wLnByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICB0MyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIG1wLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgdDQgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCBlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RGF0YVNvdXJjZUR1cmF0aW9uID0gdDIgLSB0MTsKLSAgICAgICAgICAgIHByZXBhcmVEdXJhdGlvbiA9IHQzIC0gdDI7Ci0gICAgICAgICAgICBzdGFydER1cmF0aW9uID0gdDQgLSB0MzsKLSAgICAgICAgICAgIHRvdGFsU2V0RGF0YVRpbWUgPSB0b3RhbFNldERhdGFUaW1lICsgc2V0RGF0YVNvdXJjZUR1cmF0aW9uOwotICAgICAgICAgICAgdG90YWxQcmVwYXJlVGltZSA9IHRvdGFsUHJlcGFyZVRpbWUgKyBwcmVwYXJlRHVyYXRpb247Ci0gICAgICAgICAgICB0b3RhbFN0YXJ0RHVyYXRpb24gPSB0b3RhbFN0YXJ0RHVyYXRpb24gKyBzdGFydER1cmF0aW9uOwotICAgICAgICAgICAgbURCLmV4ZWNTUUwoIklOU0VSVCBJTlRPIHBlcmZkYXRhIChmaWxlLCBzZXRkYXRhdGltZSwgcHJlcGFyZXRpbWUsIiArCi0gICAgICAgICAgICAgICAgICAgICIgcGxheXRpbWUpIFZBTFVFUyAoIiArICciJyArIHRlc3RGaWxlW2tdICsgJyInICsgJywnICsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZUR1cmF0aW9uICsgJywnICsgcHJlcGFyZUR1cmF0aW9uICsKLSAgICAgICAgICAgIAkJJywnICsgc3RhcnREdXJhdGlvbiArICIpOyIpOwotICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmlsZSBuYW1lICIgKyB0ZXN0RmlsZVtrXSk7Ci0gICAgICAgICAgICBtcC5zdG9wKCk7Ci0gICAgICAgICAgICBtcC5yZWxlYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgTG9nLnYoVEFHLCAic2V0RGF0YVNvdXJjZSBhdmVyYWdlICIgKyB0b3RhbFNldERhdGFUaW1lIC8gbnVtYmVyT2ZGaWxlcyk7Ci0gICAgICAgIExvZy52KFRBRywgInByZXBhcmUgYXZlcmFnZSAiICsgdG90YWxQcmVwYXJlVGltZSAvIG51bWJlck9mRmlsZXMpOwotICAgICAgICBMb2cudihUQUcsICJzdGFydCBhdmVyYWdlICIgKyB0b3RhbFN0YXJ0RHVyYXRpb24gLyBudW1iZXJPZkZpbGVzKTsKLQotICAgIH0KLQotICAgIEBTdXBwcmVzcwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydFVwVGltZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVEQigpOwotICAgICAgICBhdWRpb1BsYXliYWNrU3RhcnR1cFRpbWUoTWVkaWFOYW1lcy5NUDNGSUxFUyk7Ci0gICAgICAgIGF1ZGlvUGxheWJhY2tTdGFydHVwVGltZShNZWRpYU5hbWVzLkFBQ0ZJTEVTKTsKLQotICAgICAgICAvL2Nsb3NlIHRoZSBkYXRhYmFzZSBhZnRlciBhbGwgdHJhbnNhY3Rpb25zCi0gICAgICAgIGlmIChtREIuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIG1EQi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd21hbWV0YWRhdGF1dGlsaXR5KFN0cmluZ1tdIHRlc3RGaWxlKSB7Ci0gICAgICAgIGxvbmcgdDEgPSAwOwotICAgICAgICBsb25nIHQyID0gMDsKLSAgICAgICAgbG9uZyBzdW0gPSAwOwotICAgICAgICBsb25nIGR1cmF0aW9uID0gMDsKLSAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlciByZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gdGVzdEZpbGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHQxID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UodGVzdEZpbGVbaV0pOwotICAgICAgICAgICAgICAgIHZhbHVlID0gcmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9BTEJVTSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0NPTVBPU0VSKTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfR0VOUkUpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gcmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSByZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1lFQVIpOwotICAgICAgICAgICAgICAgIHZhbHVlID0KLSAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVyCi0gICAgICAgICAgICAgICAgICAgIC5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQ0RfVFJBQ0tfTlVNQkVSKTsKLSAgICAgICAgICAgICAgICB0MiA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gdDIgLSB0MTsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJUaW1lIHRha2VuID0gIiArIGR1cmF0aW9uKTsKLSAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBkdXJhdGlvbjsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBMb2cudihUQUcsICJBdmVyYWdlIGR1cmF0aW9uID0gIiArIHN1bSAvIHRlc3RGaWxlLmxlbmd0aCk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVNZXNzYWdlTG9vcGVyKCkgewogICAgICAgICBmaW5hbCBDb25kaXRpb25WYXJpYWJsZSBzdGFydERvbmUgPSBuZXcgQ29uZGl0aW9uVmFyaWFibGUoKTsKICAgICAgICAgbmV3IFRocmVhZCgpIHsKQEAgLTQyMSwxMyArMzE4LDYgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgQFN1cHByZXNzCi0gICAgcHVibGljIHZvaWQgdGVzdFdtYVBhcnNlVGltZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyBjcmVhdGVEQigpOwotICAgICAgICB3bWFtZXRhZGF0YXV0aWxpdHkoTWVkaWFOYW1lcy5XTUFTVVBQT1JURUQpOwotICAgIH0KLQotCiAgICAgLy8gVGVzdCBjYXNlIDE6IENhcHR1cmUgdGhlIG1lbW9yeSB1c2FnZSBhZnRlciBldmVyeSAyMCBoMjYzIHBsYXliYWNrCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzVmlkZW9QbGF5YmFja01lbW9yeVVzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC00NjYsMjYgKzM1Niw2IEBACiAgICAgICAgIGFzc2VydFRydWUoIkgyNjQgcGxheWJhY2sgbWVtb3J5IHRlc3QiLCBtZW1vcnlSZXN1bHQpOwogICAgIH0KIAotICAgIC8vIFRlc3QgY2FzZSAzOiBDYXB0dXJlIHRoZSBtZW1vcnkgdXNhZ2UgYWZ0ZXIgZWFjaCAyMCBXTVYgcGxheWJhY2sKLSAgICBATGFyZ2VUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdNVlZpZGVvUGxheWJhY2tNZW1vcnlVc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIG1lbW9yeVJlc3VsdCA9IGZhbHNlOwotICAgICAgICBpZiAoTWVkaWFQcm9maWxlUmVhZGVyLmdldFdNVkVuYWJsZSgpKXsKLSAgICAgICAgICAgIG1TdGFydFBpZCA9IGdldE1lZGlhc2VydmVyUGlkKCk7Ci0gICAgICAgICAgICBGaWxlIHdtdk1lbW9yeU91dCA9IG5ldyBGaWxlKE1FRElBX01FTU9SWV9PVVRQVVQpOwotICAgICAgICAgICAgV3JpdGVyIG91dHB1dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcih3bXZNZW1vcnlPdXQsIHRydWUpKTsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZSgiV01WIHZpZGVvIHBsYXliYWNrIG9ubHlcbiIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSRVNTX0xPT1A7IGkrKykgewotICAgICAgICAgICAgICAgIG1lZGlhU3RyZXNzUGxheWJhY2soTWVkaWFOYW1lcy5WSURFT19XTVYpOwotICAgICAgICAgICAgICAgIGdldE1lbW9yeVdyaXRlVG9Mb2cob3V0cHV0LCBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dC53cml0ZSgiXG4iKTsKLSAgICAgICAgICAgIG1lbW9yeVJlc3VsdCA9IHZhbGlkYXRlTWVtb3J5UmVzdWx0KG1TdGFydFBpZCwgbVN0YXJ0TWVtb3J5LCBvdXRwdXQsIERFQ09ERVJfTElNSVQpOwotICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJ3bXYgcGxheWJhY2sgbWVtb3J5IHRlc3QiLCBtZW1vcnlSZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gVGVzdCBjYXNlIDQ6IENhcHR1cmUgdGhlIG1lbW9yeSB1c2FnZSBhZnRlciBldmVyeSAyMCB2aWRlbyBvbmx5IHJlY29yZGVkCiAgICAgQExhcmdlVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RIMjYzUmVjb3JkVmlkZW9Pbmx5TWVtb3J5VXNhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L3BlcmZvcm1hbmNlL1ZpZGVvRWRpdG9yUGVyZm9ybWFuY2UuamF2YSBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L3BlcmZvcm1hbmNlL1ZpZGVvRWRpdG9yUGVyZm9ybWFuY2UuamF2YQppbmRleCA0YzY2YTJkLi43ZWI2ZDIyIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC9wZXJmb3JtYW5jZS9WaWRlb0VkaXRvclBlcmZvcm1hbmNlLmphdmEKKysrIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvcGVyZm9ybWFuY2UvVmlkZW9FZGl0b3JQZXJmb3JtYW5jZS5qYXZhCkBAIC0xMTIsMTIgKzExMiwxMSBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgTlVNX09GX0lURVJBVElPTlM9MjA7CiAKLSAgICBwcml2YXRlIGZsb2F0IGNhbGN1bGF0ZVRpbWVUYWtlbihsb25nIGJlZ2luVGltZSwgaW50IG51bUl0ZXJhdGlvbnMpCisgICAgcHJpdmF0ZSBpbnQgY2FsY3VsYXRlVGltZVRha2VuKGxvbmcgYmVnaW5UaW1lLCBpbnQgbnVtSXRlcmF0aW9ucykKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb24yID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgIGZpbmFsIGxvbmcgZHVyYXRpb25Ub0NyZWF0ZU1lZGlhSXRlbSA9IChkdXJhdGlvbjIgLSBiZWdpblRpbWUpOwotICAgICAgICBmaW5hbCBmbG9hdCB0aW1lVGFrZW4xID0gKGZsb2F0KWR1cmF0aW9uVG9DcmVhdGVNZWRpYUl0ZW0gKgotICAgICAgICAgICAgMS4wZi8oZmxvYXQpbnVtSXRlcmF0aW9uczsKKyAgICAgICAgZmluYWwgaW50IHRpbWVUYWtlbjEgPSAoaW50KShkdXJhdGlvblRvQ3JlYXRlTWVkaWFJdGVtIC8gbnVtSXRlcmF0aW9ucyk7CiAgICAgICAgIHJldHVybiAodGltZVRha2VuMSk7CiAgICAgfQogCkBAIC0yMDgsNyArMjA3LDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nW10gbG9nZ2luZ0luZm8gPSBuZXcgU3RyaW5nWzNdOwogICAgICAgICBmaW5hbCBNZWRpYVZpZGVvSXRlbVtdIG1lZGlhVmlkZW9JdGVtID0KICAgICAgICAgICAgIG5ldyBNZWRpYVZpZGVvSXRlbVtOVU1fT0ZfSVRFUkFUSU9OU107Ci0gICAgICAgIGZsb2F0IHRpbWVUYWtlbiA9IDAuMGY7CisgICAgICAgIGludCB0aW1lVGFrZW4gPSAwOwogICAgICAgICBsb25nIHN0YXJ0VGltZSA9IDA7CiAKICAgICAgICAgLyoqIFRpbWUgVGFrZSBmb3IgY3JlYXRpb24gb2YgTWVkaWEgVmlkZW8gSXRlbSAqLwpAQCAtMjUxLDcgKzI1MCw3IEBACiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxvZ2dpbmdJbmZvID0gbmV3IFN0cmluZ1szXTsKICAgICAgICAgZmluYWwgTWVkaWFJbWFnZUl0ZW1bXSBtZWRpYUltYWdlSXRlbSA9CiAgICAgICAgICAgICBuZXcgTWVkaWFJbWFnZUl0ZW1bTlVNX09GX0lURVJBVElPTlNdOwotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKIAogICAgICAgICBsb25nIGJlZ2luVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwogICAgICAgICBjcmVhdGVJbWFnZUl0ZW1zKG1lZGlhSW1hZ2VJdGVtLCBpbWFnZUl0ZW1GaWxlTmFtZSwgcmVuZGVyaW5nTW9kZSwKQEAgLTI5Niw3ICsyOTUsNyBAQAogICAgICAgICBmaW5hbCBpbnQgdHJhbnNpdGlvbkR1cmF0aW9uID0gNTAwMDsKICAgICAgICAgZmluYWwgaW50IHRyYW5zaXRpb25CZWhhdmlvciA9IFRyYW5zaXRpb24uQkVIQVZJT1JfTUlERExFX0ZBU1Q7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGxvZ2dpbmdJbmZvID0gbmV3IFN0cmluZ1szXTsKLSAgICAgICAgZmxvYXQgdGltZVRha2VuID0gMC4wZjsKKyAgICAgICAgaW50IHRpbWVUYWtlbiA9IDA7CiAKICAgICAgICAgZmluYWwgTWVkaWFWaWRlb0l0ZW1bXSBtZWRpYVZpZGVvSXRlbSA9CiAgICAgICAgICAgICBuZXcgTWVkaWFWaWRlb0l0ZW1bKE5VTV9PRl9JVEVSQVRJT05TICoxMCkgKyAxXTsKQEAgLTUxNCw3ICs1MTMsNyBAQAogICAgICAgICAvKiogMTguRW5hYmxlIExvb3BpbmcgZm9yIEF1ZGlvIFRyYWNrLgogICAgICAgICAgKiAqLwogICAgICAgICBhdWRpb1RyYWNrLmVuYWJsZUxvb3AoKTsKLSAgICAgICAgZmxvYXQgdGltZVRha2VuID0gMC4wZjsKKyAgICAgICAgaW50IHRpbWVUYWtlbiA9IDA7CiAgICAgICAgIGZpbmFsIGxvbmcgYmVnaW5UaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1WaWRlb0VkaXRvci5leHBvcnQob3V0RmlsZW5hbWUsIG91dEhlaWdodCwgb3V0Qml0cmF0ZSwKQEAgLTU1Nyw3ICs1NTYsNyBAQAogICAgICAgICBtZWRpYVZpZGVvSXRlbS5zZXRFeHRyYWN0Qm91bmRhcmllcyh2aWRlb0l0ZW1TdGFydFRpbWUsCiAgICAgICAgICAgICB2aWRlb0l0ZW1FbmRUaW1lKTsKIAotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKICAgICAgICAgbG9uZyBiZWdpblRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0ZfSVRFUkFUSU9OUzsgaSsrKSB7CiAgICAgICAgICAgICBtZWRpYVZpZGVvSXRlbS5nZXRUaHVtYm5haWwobWVkaWFWaWRlb0l0ZW0uZ2V0V2lkdGgoKSAvIDIsCkBAIC02MDMsNyArNjAyLDcgQEAKICAgICAgICAgZmluYWwgT3ZlcmxheUZyYW1lIG92ZXJsYXlGcmFtZVtdID0gbmV3IE92ZXJsYXlGcmFtZVtOVU1fT0ZfSVRFUkFUSU9OU107CiAgICAgICAgIGZpbmFsIEJpdG1hcCBtQml0bWFwID0gIG1WaWRlb0VkaXRvckhlbHBlci5nZXRCaXRtYXAob3ZlcmxheUZpbGVuYW1lLAogICAgICAgICAgICAgNjQwLCA0ODApOwotICAgICAgICBmbG9hdCB0aW1lVGFrZW4gPSAwLjBmOworICAgICAgICBpbnQgdGltZVRha2VuID0gMDsKICAgICAgICAgbG9uZyBiZWdpblRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0ZfSVRFUkFUSU9OUzsgaSsrKSB7CiAgICAgICAgICAgICBvdmVybGF5RnJhbWVbaV0gPSBuZXcgT3ZlcmxheUZyYW1lKG1lZGlhVmlkZW9JdGVtLCAib3ZlcmxheSIgKyBpLApAQCAtNjQ3LDcgKzY0Niw3IEBACiAgICAgICAgIGZpbmFsIGludCB2aWRlb1Byb2ZpbGUgPSBNZWRpYVByb3BlcnRpZXMuSDI2NF9QUk9GSUxFXzBfTEVWRUxfMV8zOwogICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSAxMDgwOwogICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWVkaWFQcm9wZXJ0aWVzLkhFSUdIVF83MjA7Ci0gICAgICAgIGZsb2F0IHRpbWVUYWtlbiA9IDAuMGY7CisgICAgICAgIGludCB0aW1lVGFrZW4gPSAwOwogICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2dnaW5nSW5mbyA9IG5ldyBTdHJpbmdbMV07CiAgICAgICAgIGZpbmFsIE1lZGlhVmlkZW9JdGVtIG1lZGlhVmlkZW9JdGVtID0gbmV3IE1lZGlhVmlkZW9JdGVtKG1WaWRlb0VkaXRvciwKICAgICAgICAgICAgICJtMCIsIHZpZGVvSXRlbUZpbGVOYW1lMSwgcmVuZGVyaW5nTW9kZSk7CkBAIC0xMDA2LDcgKzEwMDUsNyBAQAogICAgICAgICBmaW5hbCBpbnQgcmVuZGVyaW5nTW9kZSA9IE1lZGlhSXRlbS5SRU5ERVJJTkdfTU9ERV9CTEFDS19CT1JERVI7CiAgICAgICAgIGZpbmFsIGludCBhdWRpb1ZvbHVtZSA9IDUwOwogICAgICAgICBmaW5hbCBTdHJpbmdbXSBsb2dnaW5nSW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0gICAgICAgIGZsb2F0IHRpbWVUYWtlbiA9IDAuMGY7CisgICAgICAgIGludCB0aW1lVGFrZW4gPSAwOwogCiAgICAgICAgIGZpbmFsIE1lZGlhVmlkZW9JdGVtIG1lZGlhVmlkZW9JdGVtID0gbmV3IE1lZGlhVmlkZW9JdGVtKG1WaWRlb0VkaXRvciwKICAgICAgICAgICAgICJtZWRpYUl0ZW0xIiwgdmlkZW9JdGVtRmlsZU5hbWUxLCByZW5kZXJpbmdNb2RlKTsKQEAgLTEwNTcsNyArMTA1Niw3IEBACiAgICAgICAgIGZpbmFsIGludCByZW5kZXJpbmdNb2RlID0gTWVkaWFJdGVtLlJFTkRFUklOR19NT0RFX0JMQUNLX0JPUkRFUjsKICAgICAgICAgZmluYWwgU3RyaW5nW10gbG9nZ2luZ0luZm8gPSBuZXcgU3RyaW5nWzNdOwogCi0gICAgICAgIGZsb2F0IHRpbWVUYWtlbiA9IDAuMGY7CisgICAgICAgIGludCB0aW1lVGFrZW4gPSAwOwogCiAgICAgICAgIGZpbmFsIE1lZGlhSW1hZ2VJdGVtW10gbWVkaWFJbWFnZUl0ZW0gPQogICAgICAgICAgICAgbmV3IE1lZGlhSW1hZ2VJdGVtW05VTV9PRl9JVEVSQVRJT05TXTsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L3VuaXQvTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QuamF2YSBiL21lZGlhL3Rlc3RzL01lZGlhRnJhbWV3b3JrVGVzdC9zcmMvY29tL2FuZHJvaWQvbWVkaWFmcmFtZXdvcmt0ZXN0L3VuaXQvTWVkaWFNZXRhZGF0YVJldHJpZXZlclRlc3QuamF2YQppbmRleCBhNjZkYjA1Li44ZWI3NWYzIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9NZWRpYUZyYW1ld29ya1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL21lZGlhZnJhbWV3b3JrdGVzdC91bml0L01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJUZXN0LmphdmEKKysrIGIvbWVkaWEvdGVzdHMvTWVkaWFGcmFtZXdvcmtUZXN0L3NyYy9jb20vYW5kcm9pZC9tZWRpYWZyYW1ld29ya3Rlc3QvdW5pdC9NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdC5qYXZhCkBAIC03NiwyOSArNzYsMjkgQEAKICAgICAgICAgYm9vbGVhbiBoYXNGYWlsZWQgPSBmYWxzZTsKICAgICAgICAgTG9nLnYoVEFHLCAiVGh1bWJuYWlsIHByb2Nlc3Npbmcgc3RhcnRzIik7CiAgICAgICAgIGxvbmcgc3RhcnRlZEF0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDAsIG4gPSBNZWRpYU5hbWVzLlRIVU1CTkFJTF9DQVBUVVJFX1RFU1RfRklMRVMubGVuZ3RoOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGZvcihpbnQgaSA9IDAsIG4gPSBNZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaWxlICIgKyBpICsgIjogIiArIE1lZGlhTmFtZXMuVEhVTUJOQUlMX0NBUFRVUkVfVEVTVF9GSUxFU1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKChNZWRpYU5hbWVzLlRIVU1CTkFJTF9DQVBUVVJFX1RFU1RfRklMRVNbaV0uZW5kc1dpdGgoIi53bWEiKSAmJiAhc3VwcG9ydFdNQSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE1lZGlhTmFtZXMuVEhVTUJOQUlMX0NBUFRVUkVfVEVTVF9GSUxFU1tpXS5lbmRzV2l0aCgiLndtdiIpICYmICFzdXBwb3J0V01WKQorICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkZpbGUgIiArIGkgKyAiOiAiICsgTWVkaWFOYW1lcy5USFVNQk5BSUxfTUVUQURBVEFfVEVTVF9GSUxFU1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKChNZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTW2ldLmVuZHNXaXRoKCIud21hIikgJiYgIXN1cHBvcnRXTUEpIHx8CisgICAgICAgICAgICAgICAgICAgIChNZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTW2ldLmVuZHNXaXRoKCIud212IikgJiYgIXN1cHBvcnRXTVYpCiAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIndpbmRvd3MgbWVkaWEgaXMgbm90IHN1cHBvcnRlZCBhbmQgdGh1cyB3ZSB3aWxsIHNraXAgdGhlIHRlc3QgZm9yIHRoaXMgZmlsZSIpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UoTWVkaWFOYW1lcy5USFVNQk5BSUxfQ0FQVFVSRV9URVNUX0ZJTEVTW2ldKTsKKyAgICAgICAgICAgICAgICByZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShNZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTW2ldKTsKICAgICAgICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gcmV0cmlldmVyLmdldEZyYW1lQXRUaW1lKC0xKTsKICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGJpdG1hcCAhPSBudWxsKTsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLk91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShNZWRpYU5hbWVzLlRIVU1CTkFJTF9DQVBUVVJFX1RFU1RfRklMRVNbaV0gKyAiLmpwZyIpOworICAgICAgICAgICAgICAgICAgICBqYXZhLmlvLk91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShNZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTW2ldICsgIi5qcGciKTsKICAgICAgICAgICAgICAgICAgICAgYml0bWFwLmNvbXByZXNzKEJpdG1hcC5Db21wcmVzc0Zvcm1hdC5KUEVHLCA3NSwgc3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbHMgdG8gY29udmVydCB0aGUgYml0bWFwIHRvIGEgSlBFRyBmaWxlIGZvciAiICsgTWVkaWFOYW1lcy5USFVNQk5BSUxfQ0FQVFVSRV9URVNUX0ZJTEVTW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbHMgdG8gY29udmVydCB0aGUgYml0bWFwIHRvIGEgSlBFRyBmaWxlIGZvciAiICsgTWVkaWFOYW1lcy5USFVNQk5BSUxfTUVUQURBVEFfVEVTVF9GSUxFU1tpXSk7CiAgICAgICAgICAgICAgICAgICAgIGhhc0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbHMgdG8gc2V0RGF0YVNvdXJjZSBmb3IgZmlsZSAiICsgTWVkaWFOYW1lcy5USFVNQk5BSUxfQ0FQVFVSRV9URVNUX0ZJTEVTW2ldKTsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlscyB0byBzZXREYXRhU291cmNlIGZvciBmaWxlICIgKyBNZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTW2ldKTsKICAgICAgICAgICAgICAgICBoYXNGYWlsZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7ICAvLyBEb24ndCBiZSBldmlsCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgbG9uZyBlbmRlZEF0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIHJldHJpZXZlci5yZWxlYXNlKCk7CiAgICAgICAgIGFzc2VydFRydWUoIWhhc0ZhaWxlZCk7Ci0gICAgICAgIExvZy52KFRBRywgIkF2ZXJhZ2UgcHJvY2Vzc2luZyB0aW1lIHBlciB0aHVtYm5haWw6ICIgKyAoZW5kZWRBdCAtIHN0YXJ0ZWRBdCkvTWVkaWFOYW1lcy5USFVNQk5BSUxfQ0FQVFVSRV9URVNUX0ZJTEVTLmxlbmd0aCArICIgbXMiKTsKKyAgICAgICAgTG9nLnYoVEFHLCAiQXZlcmFnZSBwcm9jZXNzaW5nIHRpbWUgcGVyIHRodW1ibmFpbDogIiArIChlbmRlZEF0IC0gc3RhcnRlZEF0KS9NZWRpYU5hbWVzLlRIVU1CTkFJTF9NRVRBREFUQV9URVNUX0ZJTEVTLmxlbmd0aCArICIgbXMiKTsKICAgICB9CiAgICAgCiAgICAgQExhcmdlVGVzdApAQCAtMTE1LDE5ICsxMTUsMTkgQEAKICAgICAgICAgYm9vbGVhbiBzdXBwb3J0V01WID0gTWVkaWFQcm9maWxlUmVhZGVyLmdldFdNVkVuYWJsZSgpOwogICAgICAgICBib29sZWFuIGhhc0ZhaWxlZCA9IGZhbHNlOwogICAgICAgICBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIHJldHJpZXZlciA9IG5ldyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyKCk7Ci0gICAgICAgIGZvcihpbnQgaSA9IDAsIG4gPSBNZWRpYU5hbWVzLk1FVEFEQVRBX1JFVFJJRVZBTF9URVNUX0ZJTEVTLmxlbmd0aDsgaSA8IG47ICsraSkgeworICAgICAgICBmb3IoaW50IGkgPSAwLCBuID0gTWVkaWFOYW1lcy5USFVNQk5BSUxfTUVUQURBVEFfVEVTVF9GSUxFUy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiRmlsZSAiICsgaSArICI6ICIgKyBNZWRpYU5hbWVzLk1FVEFEQVRBX1JFVFJJRVZBTF9URVNUX0ZJTEVTW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoKE1lZGlhTmFtZXMuTUVUQURBVEFfUkVUUklFVkFMX1RFU1RfRklMRVNbaV0uZW5kc1dpdGgoIi53bWEiKSAmJiAhc3VwcG9ydFdNQSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKE1lZGlhTmFtZXMuTUVUQURBVEFfUkVUUklFVkFMX1RFU1RfRklMRVNbaV0uZW5kc1dpdGgoIi53bXYiKSAmJiAhc3VwcG9ydFdNVikKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJGaWxlICIgKyBpICsgIjogIiArIE1lZGlhTmFtZXMuVEhVTUJOQUlMX01FVEFEQVRBX1RFU1RfRklMRVNbaV0pOworICAgICAgICAgICAgICAgIGlmICgoTWVkaWFOYW1lcy5USFVNQk5BSUxfTUVUQURBVEFfVEVTVF9GSUxFU1tpXS5lbmRzV2l0aCgiLndtYSIpICYmICFzdXBwb3J0V01BKSB8fAorICAgICAgICAgICAgICAgICAgICAoTWVkaWFOYW1lcy5USFVNQk5BSUxfTUVUQURBVEFfVEVTVF9GSUxFU1tpXS5lbmRzV2l0aCgiLndtdiIpICYmICFzdXBwb3J0V01WKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJ3aW5kb3dzIG1lZGlhIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHRodXMgd2Ugd2lsbCBza2lwIHRoZSB0ZXN0IGZvciB0aGlzIGZpbGUiKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHJpZXZlci5zZXREYXRhU291cmNlKE1lZGlhTmFtZXMuTUVUQURBVEFfUkVUUklFVkFMX1RFU1RfRklMRVNbaV0pOworICAgICAgICAgICAgICAgIHJldHJpZXZlci5zZXREYXRhU291cmNlKE1lZGlhTmFtZXMuVEhVTUJOQUlMX01FVEFEQVRBX1RFU1RfRklMRVNbaV0pOwogICAgICAgICAgICAgICAgIGV4dHJhY3RBbGxTdXBwb3J0ZWRNZXRhZGF0YVZhbHVlcyhyZXRyaWV2ZXIpOwogICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxzIHRvIHNldERhdGFTb3VyY2UgZm9yIGZpbGUgIiArIE1lZGlhTmFtZXMuTUVUQURBVEFfUkVUUklFVkFMX1RFU1RfRklMRVNbaV0pOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxzIHRvIHNldERhdGFTb3VyY2UgZm9yIGZpbGUgIiArIE1lZGlhTmFtZXMuVEhVTUJOQUlMX01FVEFEQVRBX1RFU1RfRklMRVNbaV0pOwogICAgICAgICAgICAgICAgIGhhc0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsgIC8vIERvbid0IGJlIGV2aWwKQEAgLTIzOSw0NSArMjM5LDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSghaGFzRmFpbGVkKTsKICAgICB9CiAKLSAgICBATWVkaXVtVGVzdAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0SW50ZW5kZWRVc2FnZSgpIHsKLSAgICAgICAgLy8gQnkgZGVmYXVsdCwgY2FwdHVyZSBmcmFtZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEKLSAgICAgICAgTWVkaWFNZXRhZGF0YVJldHJpZXZlciByZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICBib29sZWFuIGhhc0ZhaWxlZCA9IGZhbHNlOwotICAgICAgICByZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShNZWRpYU5hbWVzLlRFU1RfUEFUSF8xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXRyaWV2ZXIuZ2V0RnJhbWVBdFRpbWUoLTEpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfTlVNX1RSQUNLUykgIT0gbnVsbCk7Ci0KLSAgICAgICAgLy8gRG8gbm90IGNhcHR1cmUgZnJhbWUgb3IgcmV0cmlldmUgbWV0YWRhdGEKLSAgICAgICAgcmV0cmlldmVyLnNldERhdGFTb3VyY2UoTWVkaWFOYW1lcy5URVNUX1BBVEhfMSk7Ci0gICAgICAgIGlmIChyZXRyaWV2ZXIuZ2V0RnJhbWVBdFRpbWUoLTEpICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIk5vIGZyYW1lIGV4cGVjdGVkLCBidXQgaXMgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICBoYXNGYWlsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX05VTV9UUkFDS1MpICE9IG51bGwpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIk5vIG51bSB0cmFjayBtZXRhZGF0YSBleHBlY3RlZCwgYnV0IGlzIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgaGFzRmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhcHR1cmUgZnJhbWUgb25seQotICAgICAgICByZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShNZWRpYU5hbWVzLlRFU1RfUEFUSF8xKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShyZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX05VTV9UUkFDS1MpID09IG51bGwpOwotCi0gICAgICAgIC8vIFJldHJpZXZlciBtZXRhZGF0YSBvbmx5Ci0gICAgICAgIHJldHJpZXZlci5zZXREYXRhU291cmNlKE1lZGlhTmFtZXMuVEVTVF9QQVRIXzEpOwotICAgICAgICBpZiAocmV0cmlldmVyLmdldEZyYW1lQXRUaW1lKC0xKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJObyBmcmFtZSBleHBlY3RlZCwgYnV0IGlzIGF2YWlsYWJsZSIpOwotICAgICAgICAgICAgaGFzRmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENhcHR1cmUgZnJhbWUgYW5kIHJldHJpZXZlIG1ldGFkYXRhCi0gICAgICAgIHJldHJpZXZlci5zZXREYXRhU291cmNlKE1lZGlhTmFtZXMuVEVTVF9QQVRIXzEpOwotICAgICAgICBhc3NlcnRUcnVlKHJldHJpZXZlci5nZXRGcmFtZUF0VGltZSgtMSkgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUocmV0cmlldmVyLmV4dHJhY3RNZXRhZGF0YShNZWRpYU1ldGFkYXRhUmV0cmlldmVyLk1FVEFEQVRBX0tFWV9OVU1fVFJBQ0tTKSAhPSBudWxsKTsKLSAgICAgICAgcmV0cmlldmVyLnJlbGVhc2UoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghaGFzRmFpbGVkKTsKLSAgICB9Ci0KICAgICAvLyBUT0RPOgogICAgIC8vIEVuY29kZSBhbmQgdGVzdCBmb3IgdGhlIGNvcnJlY3QgbWl4IG9mIG1ldGFkYXRhIGVsZW1lbnRzIG9uIGEgcGVyLWZpbGUgYmFzaXM/CiAgICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gY29tcGFyZSB0aGUgYWN0dWFsIHJldHVybmVkIG1ldGFkYXRhIHdpdGggdGhlIGV4cGVjdGVkIG1ldGFkYXRhCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvZ29sZGVuVGh1bWJuYWlsLnBuZyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9nb2xkZW5UaHVtYm5haWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiYjZlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvZ29sZGVuVGh1bWJuYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3Lm1wMyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTcubXAzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUwZDZhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3Lm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0FCUi5tcDMgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0FCUi5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNzE5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfQUJSLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0NCUi5tcDMgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0NCUi5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNzE5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfQ0JSLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YxLm1wMyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfSUQzVjEubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDMzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YxLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YxX0lEM1YyLm1wMyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfSUQzVjFfSUQzVjIubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNTI2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YxX0lEM1YyLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YyLm1wMyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfSUQzVjIubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDAzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X0lEM1YyLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X1ZCUi5tcDMgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvTVAzXzQ4S0h6XzEyOGticHNfc18xXzE3X1ZCUi5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNzE5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9NUDNfNDhLSHpfMTI4a2Jwc19zXzFfMTdfVkJSLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvU0hPUlRNUDMubXAzIGIvbWVkaWEvdGVzdHMvY29udGVudHMvbWVkaWFfYXBpL211c2ljL1NIT1JUTVAzLm1wMwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YjUxYjVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvY29udGVudHMvbWVkaWFfYXBpL211c2ljL1NIT1JUTVAzLm1wMwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvYW50cy5taWQgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvYW50cy5taWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDRlYWQ1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9hbnRzLm1pZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvYnprX2NoaWMud2F2IGIvbWVkaWEvdGVzdHMvY29udGVudHMvbWVkaWFfYXBpL211c2ljL2J6a19jaGljLndhdgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYWIxYTZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvY29udGVudHMvbWVkaWFfYXBpL211c2ljL2J6a19jaGljLndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvc2luZV8yMDArMTAwMEh6XzQ0S19tby53YXYgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvc2luZV8yMDArMTAwMEh6XzQ0S19tby53YXYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzEyYjZmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy9zaW5lXzIwMCsxMDAwSHpfNDRLX21vLndhdgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvdGVzdF9hbXJfaWV0Zi5hbXIgYi9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvbXVzaWMvdGVzdF9hbXJfaWV0Zi5hbXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQwNzk0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2NvbnRlbnRzL21lZGlhX2FwaS9tdXNpYy90ZXN0X2Ftcl9pZXRmLmFtcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9jb250ZW50cy9tZWRpYV9hcGkvdmlkZW8vYmlnLWJ1Y2stYnVubnlfdHJhaWxlci53ZWJtIGIvbWVkaWEvdGVzdHMvY29udGVudHMvbWVkaWFfYXBpL3ZpZGVvL2JpZy1idWNrLWJ1bm55X3RyYWlsZXIud2VibQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YTE3Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvY29udGVudHMvbWVkaWFfYXBpL3ZpZGVvL2JpZy1idWNrLWJ1bm55X3RyYWlsZXIud2VibQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9uYXRpdmUvYW5kcm9pZC9uYXRpdmVfd2luZG93LmNwcCBiL25hdGl2ZS9hbmRyb2lkL25hdGl2ZV93aW5kb3cuY3BwCmluZGV4IDhkNDJlZGIuLjJjMGU4OGUgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9hbmRyb2lkL25hdGl2ZV93aW5kb3cuY3BwCisrKyBiL25hdGl2ZS9hbmRyb2lkL25hdGl2ZV93aW5kb3cuY3BwCkBAIC0yMCwxMiArMjAsMjAgQEAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3dfam5pLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2dyYXBoaWNzX1BhcmNlbFN1cmZhY2VUZXh0dXJlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfZ3JhcGhpY3NfU3VyZmFjZVRleHR1cmUuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIEFOYXRpdmVXaW5kb3cqIEFOYXRpdmVXaW5kb3dfZnJvbVN1cmZhY2UoSk5JRW52KiBlbnYsIGpvYmplY3Qgc3VyZmFjZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbiA9IGFuZHJvaWRfU3VyZmFjZV9nZXROYXRpdmVXaW5kb3coZW52LCBzdXJmYWNlKTsKKyAgICBzcDxBTmF0aXZlV2luZG93PiB3aW47CisgICAgaWYgKGFuZHJvaWRfU3VyZmFjZV9pc0luc3RhbmNlT2YoZW52LCBzdXJmYWNlKSkgeworICAgICAgICB3aW4gPSBhbmRyb2lkX1N1cmZhY2VfZ2V0TmF0aXZlV2luZG93KGVudiwgc3VyZmFjZSk7CisgICAgfSBlbHNlIGlmIChhbmRyb2lkX1N1cmZhY2VUZXh0dXJlX2lzSW5zdGFuY2VPZihlbnYsIHN1cmZhY2UpKSB7CisgICAgICAgIHdpbiA9IGFuZHJvaWRfU3VyZmFjZVRleHR1cmVfZ2V0TmF0aXZlV2luZG93KGVudiwgc3VyZmFjZSk7CisgICAgfSBlbHNlIGlmIChhbmRyb2lkX1BhcmNlbFN1cmZhY2VUZXh0dXJlX2lzSW5zdGFuY2VPZihlbnYsIHN1cmZhY2UpKSB7CisgICAgICAgIHdpbiA9IGFuZHJvaWRfUGFyY2VsU3VyZmFjZVRleHR1cmVfZ2V0TmF0aXZlV2luZG93KGVudiwgc3VyZmFjZSk7CisgICAgfQogICAgIGlmICh3aW4gIT0gTlVMTCkgewogICAgICAgICB3aW4tPmluY1N0cm9uZygodm9pZCopQU5hdGl2ZVdpbmRvd19hY3F1aXJlKTsKICAgICB9CmRpZmYgLS1naXQgYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2NvbmZpZ3VyYXRpb24uaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvY29uZmlndXJhdGlvbi5oCmluZGV4IDM5ZmVmMjEuLjI0NDRjNGIgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvY29uZmlndXJhdGlvbi5oCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvY29uZmlndXJhdGlvbi5oCkBAIC00MCw2ICs0MCw3IEBACiAgICAgQUNPTkZJR1VSQVRJT05fREVOU0lUWV9ERUZBVUxUID0gMCwKICAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX0xPVyA9IDEyMCwKICAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX01FRElVTSA9IDE2MCwKKyAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX1RWID0gMjEzLAogICAgIEFDT05GSUdVUkFUSU9OX0RFTlNJVFlfSElHSCA9IDI0MCwKICAgICBBQ09ORklHVVJBVElPTl9ERU5TSVRZX05PTkUgPSAweGZmZmYsCiAKZGlmZiAtLWdpdCBhL25mYy1leHRyYXMvamF2YS9jb20vYW5kcm9pZC9uZmNfZXh0cmFzL05mY0FkYXB0ZXJFeHRyYXMuamF2YSBiL25mYy1leHRyYXMvamF2YS9jb20vYW5kcm9pZC9uZmNfZXh0cmFzL05mY0FkYXB0ZXJFeHRyYXMuamF2YQppbmRleCA2MDAxYmU5Li43Nzc1ZGJmIDEwMDY0NAotLS0gYS9uZmMtZXh0cmFzL2phdmEvY29tL2FuZHJvaWQvbmZjX2V4dHJhcy9OZmNBZGFwdGVyRXh0cmFzLmphdmEKKysrIGIvbmZjLWV4dHJhcy9qYXZhL2NvbS9hbmRyb2lkL25mY19leHRyYXMvTmZjQWRhcHRlckV4dHJhcy5qYXZhCkBAIC0yMDcsMjAgKzIwNyw0IEBACiAgICAgcHVibGljIE5mY0V4ZWN1dGlvbkVudmlyb25tZW50IGdldEVtYmVkZGVkRXhlY3V0aW9uRW52aXJvbm1lbnQoKSB7CiAgICAgICAgIHJldHVybiBzRW1iZWRkZWRFZTsKICAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclRlYXJEb3duQXBkdXMoU3RyaW5nIHBhY2thZ2VOYW1lLCBBcGR1TGlzdCBhcGR1cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc1NlcnZpY2UucmVnaXN0ZXJUZWFyRG93bkFwZHVzKHBhY2thZ2VOYW1lLCBhcGR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhdHRlbXB0RGVhZFNlcnZpY2VSZWNvdmVyeShlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJUZWFyRG93bkFwZHVzKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc1NlcnZpY2UudW5yZWdpc3RlclRlYXJEb3duQXBkdXMocGFja2FnZU5hbWUpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXR0ZW1wdERlYWRTZXJ2aWNlUmVjb3ZlcnkoZSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvRUdMSW1wbC5qYXZhIGIvb3BlbmdsL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0VHTEltcGwuamF2YQppbmRleCBmMTYyZDQwLi41MWQ2Y2E4IDEwMDY0NAotLS0gYS9vcGVuZ2wvamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvRUdMSW1wbC5qYXZhCisrKyBiL29wZW5nbC9qYXZhL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9FR0xJbXBsLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgICAgIGVnbFN1cmZhY2VJZCA9IF9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRpc3BsYXksIGNvbmZpZywgc3VyLCBhdHRyaWJfbGlzdCk7CiAgICAgICAgIH0gZWxzZSBpZiAobmF0aXZlX3dpbmRvdyBpbnN0YW5jZW9mIFN1cmZhY2VUZXh0dXJlKSB7CiAgICAgICAgICAgICBlZ2xTdXJmYWNlSWQgPSBfZWdsQ3JlYXRlV2luZG93U3VyZmFjZVRleHR1cmUoZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAoKFN1cmZhY2VUZXh0dXJlKSBuYXRpdmVfd2luZG93KS5tU3VyZmFjZVRleHR1cmUsIGF0dHJpYl9saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgKFN1cmZhY2VUZXh0dXJlKSBuYXRpdmVfd2luZG93LCBhdHRyaWJfbGlzdCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYW4gaW5zdGFuY2Ugb2YgIiArCkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZVBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgaW50W10gYXR0cmliX2xpc3QpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgX2VnbENyZWF0ZVBpeG1hcFN1cmZhY2UoRUdMU3VyZmFjZSBzdXIsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgT2JqZWN0IG5hdGl2ZV9waXhtYXAsIGludFtdIGF0dHJpYl9saXN0KTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBPYmplY3QgbmF0aXZlX3dpbmRvdywgaW50W10gYXR0cmliX2xpc3QpOwotICAgIHByaXZhdGUgbmF0aXZlIGludCBfZWdsQ3JlYXRlV2luZG93U3VyZmFjZVRleHR1cmUoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBpbnQgbmF0aXZlX3dpbmRvdywgaW50W10gYXR0cmliX2xpc3QpOworICAgIHByaXZhdGUgbmF0aXZlIGludCBfZWdsQ3JlYXRlV2luZG93U3VyZmFjZVRleHR1cmUoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBPYmplY3QgbmF0aXZlX3dpbmRvdywgaW50W10gYXR0cmliX2xpc3QpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCBfZWdsR2V0RGlzcGxheShPYmplY3QgbmF0aXZlX2Rpc3BsYXkpOwogICAgIHByaXZhdGUgbmF0aXZlIGludCBfZWdsR2V0Q3VycmVudENvbnRleHQoKTsKICAgICBwcml2YXRlIG5hdGl2ZSBpbnQgX2VnbEdldEN1cnJlbnREaXNwbGF5KCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZWQ5YTUxOS4uMTk4NDhmNiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjEsNyArMjEsNyBAQAogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQkFDS1VQIiAvPgogCiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6YWxsb3dDbGVhclVzZXJEYXRhPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgYW5kcm9pZDpraWxsQWZ0ZXJSZXN0b3JlPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0iZmFsc2UiCiAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGVybWlzc2lvbj0iYW5kcm9pZC5wZXJtaXNzaW9uLkNPTkZJUk1fRlVMTF9CQUNLVVAiID4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbiIgCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3Jlcy9sYXlvdXQvY29uZmlybV9iYWNrdXAueG1sIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9yZXMvbGF5b3V0L2NvbmZpcm1fYmFja3VwLnhtbAppbmRleCAxMDljZmZmLi5hNDU2NGU2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3Jlcy9sYXlvdXQvY29uZmlybV9iYWNrdXAueG1sCisrKyBiL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vcmVzL2xheW91dC9jb25maXJtX2JhY2t1cC54bWwKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIzMGRwIiAvPgogCiAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbl9hbGxvdyIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmlsdGVyVG91Y2hlc1doZW5PYnNjdXJlZD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hbGxvd19iYWNrdXBfYnV0dG9uX2xhYmVsIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9wYWNrYWdlX25hbWUiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vcmVzL2xheW91dC9jb25maXJtX3Jlc3RvcmUueG1sIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9yZXMvbGF5b3V0L2NvbmZpcm1fcmVzdG9yZS54bWwKaW5kZXggYTFmOWE0YS4uY2E5OWFlMSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9yZXMvbGF5b3V0L2NvbmZpcm1fcmVzdG9yZS54bWwKKysrIGIvcGFja2FnZXMvQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi9yZXMvbGF5b3V0L2NvbmZpcm1fcmVzdG9yZS54bWwKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIzMGRwIiAvPgogCiAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvbl9hbGxvdyIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZmlsdGVyVG91Y2hlc1doZW5PYnNjdXJlZD0idHJ1ZSIKICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9hbGxvd19yZXN0b3JlX2J1dHRvbl9sYWJlbCIKICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvcGFja2FnZV9uYW1lIgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uL3NyYy9jb20vYW5kcm9pZC9iYWNrdXBjb25maXJtL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24uamF2YSBiL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vc3JjL2NvbS9hbmRyb2lkL2JhY2t1cGNvbmZpcm0vQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi5qYXZhCmluZGV4IDRiNDIwNjcuLmVkNDEzZTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vc3JjL2NvbS9hbmRyb2lkL2JhY2t1cGNvbmZpcm0vQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi5qYXZhCisrKyBiL3BhY2thZ2VzL0JhY2t1cFJlc3RvcmVDb25maXJtYXRpb24vc3JjL2NvbS9hbmRyb2lkL2JhY2t1cGNvbmZpcm0vQmFja3VwUmVzdG9yZUNvbmZpcm1hdGlvbi5qYXZhCkBAIC02MCw2ICs2MCw3IEBACiAgICAgSUJhY2t1cE1hbmFnZXIgbUJhY2t1cE1hbmFnZXI7CiAgICAgRnVsbE9ic2VydmVyIG1PYnNlcnZlcjsKICAgICBpbnQgbVRva2VuOworICAgIGJvb2xlYW4gbURpZEFja25vd2xlZGdlOwogCiAgICAgVGV4dFZpZXcgbVN0YXR1c1ZpZXc7CiAgICAgQnV0dG9uIG1BbGxvd0J1dHRvbjsKQEAgLTcwLDYgKzcxLDcgQEAKICAgICAgICAgQ29udGV4dCBtQ29udGV4dDsKICAgICAgICAgT2JzZXJ2ZXJIYW5kbGVyKENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICAgICAgbURpZEFja25vd2xlZGdlID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTk4LDYgKzEwMCw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBjYXNlIE1TR19SRVNUT1JFX1BBQ0tBR0U6IHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBtc2cub2JqOworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRUZXh0KG5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtMTU1LDExICsxNTksNyBAQAogICAgICAgICBtQWxsb3dCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtQmFja3VwTWFuYWdlci5hY2tub3dsZWRnZUZ1bGxCYWNrdXBPclJlc3RvcmUobVRva2VuLCB0cnVlLCBtT2JzZXJ2ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhaWwgZ3JhY2VmdWxseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBiYWNrdXAgbWFuYWdlcgotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kQWNrbm93bGVkZ2VtZW50KG1Ub2tlbiwgdHJ1ZSwgbU9ic2VydmVyKTsKICAgICAgICAgICAgICAgICBtQWxsb3dCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbURlbnlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICB9CkBAIC0xNjgsMTEgKzE2OCw3IEBACiAgICAgICAgIG1EZW55QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbUJhY2t1cE1hbmFnZXIuYWNrbm93bGVkZ2VGdWxsQmFja3VwT3JSZXN0b3JlKG1Ub2tlbiwgZmFsc2UsIG1PYnNlcnZlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYmFpbCBncmFjZWZ1bGx5IGlmIHdlIGNhbid0IGNvbnRhY3QgdGhlIGJhY2t1cCBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbmRBY2tub3dsZWRnZW1lbnQobVRva2VuLCBmYWxzZSwgbU9ic2VydmVyKTsKICAgICAgICAgICAgICAgICBtQWxsb3dCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbURlbnlCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICB9CkBAIC0xODUsMTQgKzE4MSwyMSBAQAogCiAgICAgICAgIC8vIFdlIGV4cGxpY2l0bHkgZXF1YXRlIGRlcGFydHVyZSBmcm9tIHRoZSBVSSB3aXRoIHJlZnVzYWwuICBUaGlzIGluY2x1ZGVzIHRoZQogICAgICAgICAvLyBpbXBsaWNpdCBjb25maWd1cmF0aW9uLWNoYW5nZWQgc3RvcC9yZXN0YXJ0IGN5Y2xlLgotICAgICAgICB0cnkgewotICAgICAgICAgICAgbUJhY2t1cE1hbmFnZXIuYWNrbm93bGVkZ2VGdWxsQmFja3VwT3JSZXN0b3JlKG1Ub2tlbiwgZmFsc2UsIG51bGwpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWYgdGhpcyBmYWlscyB3ZSdsbCBzdGlsbCB0aW1lIG91dCB3aXRoIG5vIGFja25vd2xlZGdtZW50Ci0gICAgICAgIH0KKyAgICAgICAgc2VuZEFja25vd2xlZGdlbWVudChtVG9rZW4sIGZhbHNlLCBudWxsKTsKICAgICAgICAgZmluaXNoKCk7CiAgICAgfQogCisgICAgdm9pZCBzZW5kQWNrbm93bGVkZ2VtZW50KGludCB0b2tlbiwgYm9vbGVhbiBhbGxvdywgSUZ1bGxCYWNrdXBSZXN0b3JlT2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKKyAgICAgICAgaWYgKCFtRGlkQWNrbm93bGVkZ2UpIHsKKyAgICAgICAgICAgIG1EaWRBY2tub3dsZWRnZSA9IHRydWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYWNrdXBNYW5hZ2VyLmFja25vd2xlZGdlRnVsbEJhY2t1cE9yUmVzdG9yZShtVG9rZW4sIHRydWUsIG1PYnNlcnZlcik7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhaWwgZ3JhY2VmdWxseSBpZiB3ZSBjYW4ndCBjb250YWN0IHRoZSBiYWNrdXAgbWFuYWdlcgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhlIG9ic2VydmVyIGJpbmRlciBmb3Igc2hvd2luZyBiYWNrdXAvcmVzdG9yZSBwcm9ncmVzcy4gIFRoaXMgYmluZGVyIGp1c3QgYm91bmNlcwogICAgICAqIHRoZSBub3RpZmljYXRpb25zIG9udG8gdGhlIG1haW4gdGhyZWFkLgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbCBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKaW5kZXggYmYwNmY5NDcuLmIzNDkwMzAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy9kZWZhdWx0cy54bWwKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzL2RlZmF1bHRzLnhtbApAQCAtNzcsOCArNzcsNiBAQAogICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5UIC0tPgogICAgIDxib29sIG5hbWU9ImRlZl92aWJyYXRlX2luX3NpbGVudCI+dHJ1ZTwvYm9vbD4KIAotICAgIDxib29sIG5hbWU9ImRlZl91c2VfcHRwX2ludGVyZmFjZSI+ZmFsc2U8L2Jvb2w+Ci0KICAgICA8IS0tIERlZmF1bHQgZm9yIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX1NDUklQVF9JTkpFQ1RJT04gLS0+CiAgICAgPGJvb2wgbmFtZT0iZGVmX2FjY2Vzc2liaWxpdHlfc2NyaXB0X2luamVjdGlvbiI+ZmFsc2U8L2Jvb2w+CiAKQEAgLTEyNSw0ICsxMjMsNyBAQAogICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU2VjdXJlLkxPTkdfUFJFU1NfVElNRU9VVF9NSUxMSVMgLS0+CiAgICAgPGludGVnZXIgbmFtZT0iZGVmX2xvbmdfcHJlc3NfdGltZW91dF9taWxsaXMiPjUwMDwvaW50ZWdlcj4KIAorICAgIDwhLS0gRGVmYXVsdCBmb3IgU2V0dGluZ3MuU3lzdGVtLlBPSU5URVJfU1BFRUQgLS0+CisgICAgPGludGVnZXIgbmFtZT0iZGVmX3BvaW50ZXJfc3BlZWQiPjA8L2ludGVnZXI+CisKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQppbmRleCBiOTljOGIwLi40N2FiMTUwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvRGF0YWJhc2VIZWxwZXIuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogcGFja2FnZSBjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3M7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5jb250ZW50LlBhY2thZ2VIZWxwZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkJhc2VDb21tYW5kczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUGhvbmU7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlJJTENvbnN0YW50czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5Mb2NrUGF0dGVyblV0aWxzOwpAQCAtMTIwNywxMyArMTIwOSwxMyBAQAogICAgICAgICAgICAgbG9hZEJvb2xlYW5TZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5WSUJSQVRFX0lOX1NJTEVOVCwKICAgICAgICAgICAgICAgICAgICAgUi5ib29sLmRlZl92aWJyYXRlX2luX3NpbGVudCk7CiAKLSAgICAgICAgICAgIGxvYWRCb29sZWFuU2V0dGluZyhzdG10LCBTZXR0aW5ncy5TeXN0ZW0uVVNFX1BUUF9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgIFIuYm9vbC5kZWZfdXNlX3B0cF9pbnRlcmZhY2UpOwotCiAgICAgICAgICAgICAvLyBTZXQgbm90aWZpY2F0aW9uIHZvbHVtZSB0byBmb2xsb3cgcmluZ2VyIHZvbHVtZSBieSBkZWZhdWx0CiAgICAgICAgICAgICBsb2FkQm9vbGVhblNldHRpbmcoc3RtdCwgU2V0dGluZ3MuU3lzdGVtLk5PVElGSUNBVElPTlNfVVNFX1JJTkdfVk9MVU1FLAogICAgICAgICAgICAgICAgICAgICBSLmJvb2wuZGVmX25vdGlmaWNhdGlvbnNfdXNlX3Jpbmdfdm9sdW1lKTsKIAorICAgICAgICAgICAgbG9hZEludGVnZXJTZXR0aW5nKHN0bXQsIFNldHRpbmdzLlN5c3RlbS5QT0lOVEVSX1NQRUVELAorICAgICAgICAgICAgICAgICAgICBSLmludGVnZXIuZGVmX3BvaW50ZXJfc3BlZWQpOworCiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc3RtdCAhPSBudWxsKSBzdG10LmNsb3NlKCk7CiAgICAgICAgIH0KQEAgLTEyOTcsOCArMTI5OSwxMyBAQAogICAgICAgICAgICAgfQogICAgIAogICAgICAgICAgICAgLy8gU2V0IHRoZSBwcmVmZXJyZWQgbmV0d29yayBtb2RlIHRvIDAgPSBHbG9iYWwsIENETUEgZGVmYXVsdAotICAgICAgICAgICAgaW50IHR5cGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicm8udGVsZXBob255LmRlZmF1bHRfbmV0d29yayIsCi0gICAgICAgICAgICAgICAgICAgIFJJTENvbnN0YW50cy5QUkVGRVJSRURfTkVUV09SS19NT0RFKTsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgaWYgKEJhc2VDb21tYW5kcy5nZXRMdGVPbkNkbWFNb2RlU3RhdGljKCkgPT0gUGhvbmUuTFRFX09OX0NETUFfVFJVRSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBQaG9uZS5OVF9NT0RFX0dMT0JBTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0SW50KCJyby50ZWxlcGhvbnkuZGVmYXVsdF9uZXR3b3JrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJJTENvbnN0YW50cy5QUkVGRVJSRURfTkVUV09SS19NT0RFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvYWRTZXR0aW5nKHN0bXQsIFNldHRpbmdzLlNlY3VyZS5QUkVGRVJSRURfTkVUV09SS19NT0RFLCB0eXBlKTsKICAgICAKICAgICAgICAgICAgIC8vIEVuYWJsZSBvciBkaXNhYmxlIENlbGwgQnJvYWRjYXN0IFNNUwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzQmFja3VwQWdlbnQuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0JhY2t1cEFnZW50LmphdmEKaW5kZXggNDViYjJiNi4uMGM0ZWY3ZCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzQmFja3VwQWdlbnQuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NCYWNrdXBBZ2VudC5qYXZhCkBAIC01NSw2ICs1NSw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXR0aW5nc0JhY2t1cEFnZW50IGV4dGVuZHMgQmFja3VwQWdlbnRIZWxwZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0JBQ0tVUCA9IERFQlVHIHx8IHRydWU7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NZU1RFTSA9ICJzeXN0ZW0iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VDVVJFID0gInNlY3VyZSI7CkBAIC03NSw2ICs3Niw5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1dJRklfQ09ORklHICAgICA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NJWkUgICAgICAgICAgICA9IDU7IC8vIFRoZSBudW1iZXIgb2Ygc3RhdGUgaXRlbXMKIAorICAgIC8vIFZlcnNpb25pbmcgb2YgdGhlICdmdWxsIGJhY2t1cCcgZm9ybWF0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZVTExfQkFDS1VQX1ZFUlNJT04gPSAxOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc29ydGVkU3lzdGVtS2V5cyA9IG51bGw7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc29ydGVkU2VjdXJlS2V5cyA9IG51bGw7CiAKQEAgLTEwOSw2ICsxMTMsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtV2lmaUNvbmZpZ0ZpbGU7CiAKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgaWYgKERFQlVHX0JBQ0tVUCkgTG9nLmQoVEFHLCAib25DcmVhdGUoKSBpbnZva2VkIik7CisKICAgICAgICAgbVNldHRpbmdzSGVscGVyID0gbmV3IFNldHRpbmdzSGVscGVyKHRoaXMpOwogICAgICAgICBzdXBlci5vbkNyZWF0ZSgpOwogCkBAIC0xNTEsMjYgKzE1NywzMiBAQAogICAgICAgICAgICAgLy8gcmVwcmVzZW50YXRpb24gb2YgdGhlIGJhY2tlZC11cCBzZXR0aW5ncy4KICAgICAgICAgICAgIFN0cmluZyByb290ID0gZ2V0RmlsZXNEaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgIEZpbGUgc3RhZ2UgPSBuZXcgRmlsZShyb290LCBTVEFHRV9GSUxFKTsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZXN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHN0YWdlKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJ1ZnN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmaWxlc3RyZWFtKTsKLSAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnVmc3RyZWFtKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc3RhZ2UpOworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJ1ZnN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmaWxlc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJ1ZnN0cmVhbSk7CiAKLSAgICAgICAgICAgIG91dC53cml0ZUludChzeXN0ZW1TZXR0aW5nc0RhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIG91dC53cml0ZShzeXN0ZW1TZXR0aW5nc0RhdGEpOwotICAgICAgICAgICAgb3V0LndyaXRlSW50KHNlY3VyZVNldHRpbmdzRGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgb3V0LndyaXRlKHNlY3VyZVNldHRpbmdzRGF0YSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQobG9jYWxlLmxlbmd0aCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUobG9jYWxlKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludCh3aWZpU3VwcGxpY2FudERhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIG91dC53cml0ZSh3aWZpU3VwcGxpY2FudERhdGEpOwotICAgICAgICAgICAgb3V0LndyaXRlSW50KHdpZmlDb25maWdEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUod2lmaUNvbmZpZ0RhdGEpOworICAgICAgICAgICAgICAgIG91dC53cml0ZUludChGVUxMX0JBQ0tVUF9WRVJTSU9OKTsKIAotICAgICAgICAgICAgb3V0LmZsdXNoKCk7ICAgIC8vIGFsc28gZmx1c2hlcyBkb3duc3RyZWFtCisgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KHN5c3RlbVNldHRpbmdzRGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShzeXN0ZW1TZXR0aW5nc0RhdGEpOworICAgICAgICAgICAgICAgIG91dC53cml0ZUludChzZWN1cmVTZXR0aW5nc0RhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoc2VjdXJlU2V0dGluZ3NEYXRhKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQobG9jYWxlLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGxvY2FsZSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KHdpZmlTdXBwbGljYW50RGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZSh3aWZpU3VwcGxpY2FudERhdGEpOworICAgICAgICAgICAgICAgIG91dC53cml0ZUludCh3aWZpQ29uZmlnRGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG91dC53cml0ZSh3aWZpQ29uZmlnRGF0YSk7CiAKLSAgICAgICAgICAgIC8vIG5vdyB3ZSdyZSBzZXQgdG8gZW1pdCB0aGUgdGFyIHN0cmVhbQotICAgICAgICAgICAgRnVsbEJhY2t1cC5iYWNrdXBUb1RhcihnZXRQYWNrYWdlTmFtZSgpLCBGdWxsQmFja3VwLkRBVEFfVFJFRV9UT0tFTiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgcm9vdCwgc3RhZ2UuZ2V0QWJzb2x1dGVQYXRoKCksIGRhdGEpOworICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOyAgICAvLyBhbHNvIGZsdXNoZXMgZG93bnN0cmVhbQorCisgICAgICAgICAgICAgICAgLy8gbm93IHdlJ3JlIHNldCB0byBlbWl0IHRoZSB0YXIgc3RyZWFtCisgICAgICAgICAgICAgICAgRnVsbEJhY2t1cC5iYWNrdXBUb1RhcihnZXRQYWNrYWdlTmFtZSgpLCBGdWxsQmFja3VwLkRBVEFfVFJFRV9UT0tFTiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QsIHN0YWdlLmdldEFic29sdXRlUGF0aCgpLCBkYXRhKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc3RhZ2UuZGVsZXRlKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5OSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChLRVlfTE9DQUxFLmVxdWFscyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIGxvY2FsZURhdGEgPSBuZXcgYnl0ZVtzaXplXTsKICAgICAgICAgICAgICAgICBkYXRhLnJlYWRFbnRpdHlEYXRhKGxvY2FsZURhdGEsIDAsIHNpemUpOwotICAgICAgICAgICAgICAgIG1TZXR0aW5nc0hlbHBlci5zZXRMb2NhbGVEYXRhKGxvY2FsZURhdGEpOworICAgICAgICAgICAgICAgIG1TZXR0aW5nc0hlbHBlci5zZXRMb2NhbGVEYXRhKGxvY2FsZURhdGEsIHNpemUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChLRVlfV0lGSV9DT05GSUcuZXF1YWxzKGtleSkpIHsKICAgICAgICAgICAgICAgICByZXN0b3JlRmlsZURhdGEobVdpZmlDb25maWdGaWxlLCBkYXRhKTsKICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjA4LDYgKzIyMCw3MCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN0b3JlRmlsZShQYXJjZWxGaWxlRGVzY3JpcHRvciBkYXRhLCBsb25nIHNpemUsCisgICAgICAgICAgICBpbnQgdHlwZSwgU3RyaW5nIGRvbWFpbiwgU3RyaW5nIHJlbHBhdGgsIGxvbmcgbW9kZSwgbG9uZyBtdGltZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgIm9uUmVzdG9yZUZpbGUoKSBpbnZva2VkIik7CisgICAgICAgIC8vIE91ciBkYXRhIGlzIGFjdHVhbGx5IGEgYmxvYiBvZiBmbGF0dGVuZWQgc2V0dGluZ3MgZGF0YSBpZGVudGljYWwgdG8gdGhhdAorICAgICAgICAvLyBwcm9kdWNlZCBkdXJpbmcgaW5jcmVtZW50YWwgYmFja3Vwcy4gIEp1c3QgdW5wYWNrIGFuZCBhcHBseSBpdCBhbGwgaW4KKyAgICAgICAgLy8gdHVybi4KKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShkYXRhLmdldEZpbGVEZXNjcmlwdG9yKCkpOworICAgICAgICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGluc3RyZWFtKTsKKworICAgICAgICBpbnQgdmVyc2lvbiA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgaWYgKERFQlVHX0JBQ0tVUCkgTG9nLmQoVEFHLCAiRmxhdHRlbmVkIGRhdGEgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgICAgICAgIGlmICh2ZXJzaW9uID09IEZVTExfQkFDS1VQX1ZFUlNJT04pIHsKKyAgICAgICAgICAgIC8vIHN5c3RlbSBzZXR0aW5ncyBkYXRhIGZpcnN0CisgICAgICAgICAgICBpbnQgbkJ5dGVzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaWYgKERFQlVHX0JBQ0tVUCkgTG9nLmQoVEFHLCBuQnl0ZXMgKyAiIGJ5dGVzIG9mIHNldHRpbmdzIGRhdGEiKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtuQnl0ZXNdOworICAgICAgICAgICAgaW4ucmVhZChidWZmZXIsIDAsIG5CeXRlcyk7CisgICAgICAgICAgICByZXN0b3JlU2V0dGluZ3MoYnVmZmVyLCBuQnl0ZXMsIFNldHRpbmdzLlN5c3RlbS5DT05URU5UX1VSSSk7CisKKyAgICAgICAgICAgIC8vIHNlY3VyZSBzZXR0aW5ncworICAgICAgICAgICAgbkJ5dGVzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaWYgKERFQlVHX0JBQ0tVUCkgTG9nLmQoVEFHLCBuQnl0ZXMgKyAiIGJ5dGVzIG9mIHNlY3VyZSBzZXR0aW5ncyBkYXRhIik7CisgICAgICAgICAgICBpZiAobkJ5dGVzID4gYnVmZmVyLmxlbmd0aCkgYnVmZmVyID0gbmV3IGJ5dGVbbkJ5dGVzXTsKKyAgICAgICAgICAgIGluLnJlYWQoYnVmZmVyLCAwLCBuQnl0ZXMpOworICAgICAgICAgICAgcmVzdG9yZVNldHRpbmdzKGJ1ZmZlciwgbkJ5dGVzLCBTZXR0aW5ncy5TZWN1cmUuQ09OVEVOVF9VUkkpOworCisgICAgICAgICAgICAvLyBsb2NhbGUKKyAgICAgICAgICAgIG5CeXRlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgbkJ5dGVzICsgIiBieXRlcyBvZiBsb2NhbGUgZGF0YSIpOworICAgICAgICAgICAgaWYgKG5CeXRlcyA+IGJ1ZmZlci5sZW5ndGgpIGJ1ZmZlciA9IG5ldyBieXRlW25CeXRlc107CisgICAgICAgICAgICBpbi5yZWFkKGJ1ZmZlciwgMCwgbkJ5dGVzKTsKKyAgICAgICAgICAgIG1TZXR0aW5nc0hlbHBlci5zZXRMb2NhbGVEYXRhKGJ1ZmZlciwgbkJ5dGVzKTsKKworICAgICAgICAgICAgLy8gd2lmaSBzdXBwbGljYW50CisgICAgICAgICAgICBuQnl0ZXMgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAoREVCVUdfQkFDS1VQKSBMb2cuZChUQUcsIG5CeXRlcyArICIgYnl0ZXMgb2Ygd2lmaSBzdXBwbGljYW50IGRhdGEiKTsKKyAgICAgICAgICAgIGlmIChuQnl0ZXMgPiBidWZmZXIubGVuZ3RoKSBidWZmZXIgPSBuZXcgYnl0ZVtuQnl0ZXNdOworICAgICAgICAgICAgaW4ucmVhZChidWZmZXIsIDAsIG5CeXRlcyk7CisgICAgICAgICAgICBpbnQgcmV0YWluZWRXaWZpU3RhdGUgPSBlbmFibGVXaWZpKGZhbHNlKTsKKyAgICAgICAgICAgIHJlc3RvcmVXaWZpU3VwcGxpY2FudChGSUxFX1dJRklfU1VQUExJQ0FOVCwgYnVmZmVyLCBuQnl0ZXMpOworICAgICAgICAgICAgRmlsZVV0aWxzLnNldFBlcm1pc3Npb25zKEZJTEVfV0lGSV9TVVBQTElDQU5ULAorICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuU19JUlVTUiB8IEZpbGVVdGlscy5TX0lXVVNSIHwKKyAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLlNfSVJHUlAgfCBGaWxlVXRpbHMuU19JV0dSUCwKKyAgICAgICAgICAgICAgICAgICAgUHJvY2Vzcy5teVVpZCgpLCBQcm9jZXNzLldJRklfVUlEKTsKKyAgICAgICAgICAgIC8vIHJldGFpbiB0aGUgcHJldmlvdXMgV0lGSSBzdGF0ZS4KKyAgICAgICAgICAgIGVuYWJsZVdpZmkocmV0YWluZWRXaWZpU3RhdGUgPT0gV2lmaU1hbmFnZXIuV0lGSV9TVEFURV9FTkFCTEVEIHx8CisgICAgICAgICAgICAgICAgICAgIHJldGFpbmVkV2lmaVN0YXRlID09IFdpZmlNYW5hZ2VyLldJRklfU1RBVEVfRU5BQkxJTkcpOworCisgICAgICAgICAgICAvLyB3aWZpIGNvbmZpZworICAgICAgICAgICAgbkJ5dGVzID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaWYgKERFQlVHX0JBQ0tVUCkgTG9nLmQoVEFHLCBuQnl0ZXMgKyAiIGJ5dGVzIG9mIHdpZmkgY29uZmlnIGRhdGEiKTsKKyAgICAgICAgICAgIGlmIChuQnl0ZXMgPiBidWZmZXIubGVuZ3RoKSBidWZmZXIgPSBuZXcgYnl0ZVtuQnl0ZXNdOworICAgICAgICAgICAgaW4ucmVhZChidWZmZXIsIDAsIG5CeXRlcyk7CisgICAgICAgICAgICByZXN0b3JlRmlsZURhdGEobVdpZmlDb25maWdGaWxlLCBidWZmZXIsIG5CeXRlcyk7CisKKyAgICAgICAgICAgIGlmIChERUJVR19CQUNLVVApIExvZy5kKFRBRywgIkZ1bGwgcmVzdG9yZSBjb21wbGV0ZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBmaWxlIHNjaGVtYSIpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBsb25nW10gcmVhZE9sZENoZWNrc3VtcyhQYXJjZWxGaWxlRGVzY3JpcHRvciBvbGRTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbG9uZ1tdIHN0YXRlQ2hlY2tzdW1zID0gbmV3IGxvbmdbU1RBVEVfU0laRV07CiAKQEAgLTI4Nyw2ICszNjMsMTcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVNldHRpbmdzKEJhY2t1cERhdGFJbnB1dCBkYXRhLCBVcmkgY29udGVudFVyaSkgeworICAgICAgICBieXRlW10gc2V0dGluZ3MgPSBuZXcgYnl0ZVtkYXRhLmdldERhdGFTaXplKCldOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGF0YS5yZWFkRW50aXR5RGF0YShzZXR0aW5ncywgMCwgc2V0dGluZ3MubGVuZ3RoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCByZWFkIGVudGl0eSBkYXRhIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVzdG9yZVNldHRpbmdzKHNldHRpbmdzLCBzZXR0aW5ncy5sZW5ndGgsIGNvbnRlbnRVcmkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlU2V0dGluZ3MoYnl0ZVtdIHNldHRpbmdzLCBpbnQgYnl0ZXMsIFVyaSBjb250ZW50VXJpKSB7CiAgICAgICAgIGlmIChERUJVRykgTG9nLmkoVEFHLCAicmVzdG9yZVNldHRpbmdzOiAiICsgY29udGVudFVyaSk7CiAgICAgICAgIFN0cmluZ1tdIHdoaXRlbGlzdCA9IG51bGw7CiAgICAgICAgIGlmIChjb250ZW50VXJpLmVxdWFscyhTZXR0aW5ncy5TZWN1cmUuQ09OVEVOVF9VUkkpKSB7CkBAIC0yOTYsMTUgKzM4Myw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBDb250ZW50VmFsdWVzIGN2ID0gbmV3IENvbnRlbnRWYWx1ZXMoMik7Ci0gICAgICAgIGJ5dGVbXSBzZXR0aW5ncyA9IG5ldyBieXRlW2RhdGEuZ2V0RGF0YVNpemUoKV07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYXRhLnJlYWRFbnRpdHlEYXRhKHNldHRpbmdzLCAwLCBzZXR0aW5ncy5sZW5ndGgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkbid0IHJlYWQgZW50aXR5IGRhdGEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgd2hpbGUgKHBvcyA8IHNldHRpbmdzLmxlbmd0aCkgeworICAgICAgICB3aGlsZSAocG9zIDwgYnl0ZXMpIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSByZWFkSW50KHNldHRpbmdzLCBwb3MpOwogICAgICAgICAgICAgcG9zICs9IDQ7CiAgICAgICAgICAgICBTdHJpbmcgc2V0dGluZ05hbWUgPSBsZW5ndGggPiAwPyBuZXcgU3RyaW5nKHNldHRpbmdzLCBwb3MsIGxlbmd0aCkgOiBudWxsOwpAQCAtNDUxLDEzICs1MzEsMTYgQEAKICAgICBwcml2YXRlIHZvaWQgcmVzdG9yZUZpbGVEYXRhKFN0cmluZyBmaWxlbmFtZSwgQmFja3VwRGF0YUlucHV0IGRhdGEpIHsKICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbZGF0YS5nZXREYXRhU2l6ZSgpXTsKICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA8PSAwKSByZXR1cm47CisgICAgICAgIHJlc3RvcmVGaWxlRGF0YShmaWxlbmFtZSwgYnl0ZXMsIGJ5dGVzLmxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVGaWxlRGF0YShTdHJpbmcgZmlsZW5hbWUsIGJ5dGVbXSBieXRlcywgaW50IHNpemUpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRhdGEucmVhZEVudGl0eURhdGEoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlbmFtZSk7CiAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgZmlsZS5kZWxldGUoKTsKIAogICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCB0cnVlKSk7Ci0gICAgICAgICAgICBvcy53cml0ZShieXRlcyk7CisgICAgICAgICAgICBvcy53cml0ZShieXRlcywgMCwgc2l6ZSk7CiAgICAgICAgICAgICBvcy5jbG9zZSgpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIExvZy53KFRBRywgIkNvdWxkbid0IHJlc3RvcmUgIiArIGZpbGVuYW1lKTsKQEAgLTUwNiwxNSArNTg5LDE4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVXaWZpU3VwcGxpY2FudChTdHJpbmcgZmlsZW5hbWUsIEJhY2t1cERhdGFJbnB1dCBkYXRhKSB7CiAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2RhdGEuZ2V0RGF0YVNpemUoKV07CiAgICAgICAgIGlmIChieXRlcy5sZW5ndGggPD0gMCkgcmV0dXJuOworICAgICAgICByZXN0b3JlV2lmaVN1cHBsaWNhbnQoZmlsZW5hbWUsIGJ5dGVzLCBieXRlcy5sZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlV2lmaVN1cHBsaWNhbnQoU3RyaW5nIGZpbGVuYW1lLCBieXRlW10gYnl0ZXMsIGludCBzaXplKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYXRhLnJlYWRFbnRpdHlEYXRhKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICAgICAgICAgICAgRmlsZSBzdXBwbGljYW50RmlsZSA9IG5ldyBGaWxlKEZJTEVfV0lGSV9TVVBQTElDQU5UKTsKICAgICAgICAgICAgIGlmIChzdXBwbGljYW50RmlsZS5leGlzdHMoKSkgc3VwcGxpY2FudEZpbGUuZGVsZXRlKCk7CiAgICAgICAgICAgICBjb3B5V2lmaVN1cHBsaWNhbnRUZW1wbGF0ZSgpOwogCiAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUsIHRydWUpKTsKICAgICAgICAgICAgIG9zLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICBvcy53cml0ZShieXRlcyk7CisgICAgICAgICAgICBvcy53cml0ZShieXRlcywgMCwgc2l6ZSk7CiAgICAgICAgICAgICBvcy5jbG9zZSgpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIExvZy53KFRBRywgIkNvdWxkbid0IHJlc3RvcmUgIiArIGZpbGVuYW1lKTsKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc0hlbHBlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzSGVscGVyLmphdmEKaW5kZXggMGU3NWZiYy4uM2U3ZDg2YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzSGVscGVyLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzSGVscGVyLmphdmEKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAqICJsbCIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgYW5kICJjYyIgaXMgdGhlIGNvdW50cnkgY29kZS4KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgbG9jYWxlIHN0cmluZyBpbiBieXRlcy4KICAgICAgKi8KLSAgICB2b2lkIHNldExvY2FsZURhdGEoYnl0ZVtdIGRhdGEpIHsKKyAgICB2b2lkIHNldExvY2FsZURhdGEoYnl0ZVtdIGRhdGEsIGludCBzaXplKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIGxvY2FsZSB3YXMgc2V0IGJ5IHRoZSB1c2VyOgogICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIExvY2FsZSBsb2MgPSBjb25mLmxvY2FsZTsKQEAgLTE1Nyw5ICsxNTcsOSBAQAogICAgICAgICBpZiAoY29uZi51c2VyU2V0TG9jYWxlKSByZXR1cm47IC8vIERvbid0IGNoYW5nZSBpZiB1c2VyIHNldCBpdCBpbiB0aGUgU2V0dXBXaXphcmQKIAogICAgICAgICBmaW5hbCBTdHJpbmdbXSBhdmFpbGFibGVMb2NhbGVzID0gbUNvbnRleHQuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOwotICAgICAgICBTdHJpbmcgbG9jYWxlQ29kZSA9IG5ldyBTdHJpbmcoZGF0YSk7CisgICAgICAgIFN0cmluZyBsb2NhbGVDb2RlID0gbmV3IFN0cmluZyhkYXRhLCAwLCBzaXplKTsKICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbmV3IFN0cmluZyhkYXRhLCAwLCAyKTsKLSAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBkYXRhLmxlbmd0aCA+IDQgPyBuZXcgU3RyaW5nKGRhdGEsIDMsIDIpIDogIiI7CisgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gc2l6ZSA+IDQgPyBuZXcgU3RyaW5nKGRhdGEsIDMsIDIpIDogIiI7CiAgICAgICAgIGxvYyA9IG51bGw7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlTG9jYWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZUxvY2FsZXNbaV0uZXF1YWxzKGxvY2FsZUNvZGUpKSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ZjRkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5mbGFncworCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gU2hhcmVkU3RvcmFnZUJhY2t1cAorTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4MDU5YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1NoYXJlZFN0b3JhZ2VCYWNrdXAvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnNoYXJlZHN0b3JhZ2ViYWNrdXAiID4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX01FRElBX1NUT1JBR0UiIC8+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDphbGxvd0NsZWFyVXNlckRhdGE9ImZhbHNlIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOnBlcm1pc3Npb249ImFuZHJvaWQucGVybWlzc2lvbi5DT05GSVJNX0ZVTExfQkFDS1VQIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmZ1bGxCYWNrdXBBZ2VudD0iLlNoYXJlZFN0b3JhZ2VBZ2VudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0iZmFsc2UiID4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NoYXJlZFN0b3JhZ2VCYWNrdXAvcHJvZ3VhcmQuZmxhZ3MgYi9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL3Byb2d1YXJkLmZsYWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0M2NiODEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL3Byb2d1YXJkLmZsYWdzCkBAIC0wLDAgKzEgQEAKKy1rZWVwIGNsYXNzIGNvbS5hbmRyb2lkLnNoYXJlZHN0b3JhZ2ViYWNrdXAuU2hhcmVkU3RvcmFnZUFnZW50CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TaGFyZWRTdG9yYWdlQmFja3VwL3NyYy9jb20vYW5kcm9pZC9zaGFyZWRzdG9yYWdlYmFja3VwL1NoYXJlZFN0b3JhZ2VBZ2VudC5qYXZhIGIvcGFja2FnZXMvU2hhcmVkU3RvcmFnZUJhY2t1cC9zcmMvY29tL2FuZHJvaWQvc2hhcmVkc3RvcmFnZWJhY2t1cC9TaGFyZWRTdG9yYWdlQWdlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJjYTJlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU2hhcmVkU3RvcmFnZUJhY2t1cC9zcmMvY29tL2FuZHJvaWQvc2hhcmVkc3RvcmFnZWJhY2t1cC9TaGFyZWRTdG9yYWdlQWdlbnQuamF2YQpAQCAtMCwwICsxLDkzIEBACitwYWNrYWdlIGNvbS5hbmRyb2lkLnNoYXJlZHN0b3JhZ2ViYWNrdXA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuRnVsbEJhY2t1cDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5iYWNrdXAuRnVsbEJhY2t1cEFnZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5CYWNrdXBEYXRhSW5wdXQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuYmFja3VwLkJhY2t1cERhdGFPdXRwdXQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLnN0b3JhZ2UuU3RvcmFnZVZvbHVtZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgU2hhcmVkU3RvcmFnZUFnZW50IGV4dGVuZHMgRnVsbEJhY2t1cEFnZW50IHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTaGFyZWRTdG9yYWdlQWdlbnQiOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKKworICAgIFN0b3JhZ2VWb2x1bWVbXSBtVm9sdW1lczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICBTdG9yYWdlTWFuYWdlciBtZ3IgPSAoU3RvcmFnZU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5TVE9SQUdFX1NFUlZJQ0UpOworICAgICAgICBpZiAobWdyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Wb2x1bWVzID0gbWdyLmdldFZvbHVtZUxpc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gYWNjZXNzIFN0b3JhZ2UgTWFuYWdlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25CYWNrdXAoUGFyY2VsRmlsZURlc2NyaXB0b3Igb2xkU3RhdGUsIEJhY2t1cERhdGFPdXRwdXQgZGF0YSwKKyAgICAgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG5ld1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgc2hhcmVkLXN0b3JhZ2Ugdm9sdW1lcyBhdmFpbGFibGUsIHJ1biB0aGUgaW5oZXJpdGVkIGRpcmVjdG9yeS0KKyAgICAgICAgLy8gaGllcmFyY2h5IGJhY2t1cCBwcm9jZXNzIG9uIHRoZW0uICBCeSBjb252ZW50aW9uIGluIHRoZSBTdG9yYWdlIE1hbmFnZXIsIHRoZQorICAgICAgICAvLyAicHJpbWFyeSIgc2hhcmVkIHN0b3JhZ2Ugdm9sdW1lIGlzIGZpcnN0IGluIHRoZSBsaXN0LgorICAgICAgICBpZiAobVZvbHVtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFN0b3JhZ2VWb2x1bWUgdiA9IG1Wb2x1bWVzW2ldOworICAgICAgICAgICAgICAgIC8vIEV4cHJlc3MgdGhlIGNvbnRlbnRzIG9mIHZvbHVtZSBOIHRoaXMgd2F5IGluIHRoZSB0YXIgc3RyZWFtOgorICAgICAgICAgICAgICAgIC8vICAgICBzaGFyZWQvTi9wYXRoL3RvL2ZpbGUKKyAgICAgICAgICAgICAgICAvLyBUaGUgcmVzdG9yZSB3aWxsIHRoZW4gZXh0cmFjdCB0byB0aGUgZ2l2ZW4gdm9sdW1lCisgICAgICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IEZ1bGxCYWNrdXAuU0hBUkVEX1BSRUZJWCArIGk7CisgICAgICAgICAgICAgICAgcHJvY2Vzc1RyZWUobnVsbCwgZG9tYWluLCB2LmdldFBhdGgoKSwgbnVsbCwgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnRhbCBvblJlc3RvcmUoKSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdXNlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3RvcmUoQmFja3VwRGF0YUlucHV0IGRhdGEsIGludCBhcHBWZXJzaW9uQ29kZSwgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKworICAgIC8qKgorICAgICAqIEZ1bGwgcmVzdG9yZSBvZiBvbmUgZmlsZSB0byBzaGFyZWQgc3RvcmFnZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUZpbGUoUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwgbG9uZyBzaXplLAorICAgICAgICAgICAgaW50IHR5cGUsIFN0cmluZyBkb21haW4sIFN0cmluZyByZWxwYXRoLCBsb25nIG1vZGUsIGxvbmcgbXRpbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTbG9nLmQoVEFHLCAiU2hhcmVkIHJlc3RvcmU6IFsgIiArIGRvbWFpbiArICIgOiAiICsgcmVscGF0aCArICJdIik7CisKKyAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKKworICAgICAgICAvLyBUaGUgZmlsZSBwYXRoIG11c3QgYmUgaW4gdGhlIHNlbWFudGljIGZvcm0gW251bWJlcl0vcGF0aC90by9maWxlLi4uCisgICAgICAgIGludCBzbGFzaCA9IHJlbHBhdGguaW5kZXhPZignLycpOworICAgICAgICBpZiAoc2xhc2ggPiAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBpID0gSW50ZWdlci5wYXJzZUludChyZWxwYXRoLnN1YnN0cmluZygwLCBzbGFzaCkpOworICAgICAgICAgICAgICAgIGlmIChpIDw9IG1Wb2x1bWVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUobVZvbHVtZXNbaV0uZ2V0UGF0aCgpLCByZWxwYXRoLnN1YnN0cmluZyhzbGFzaCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmkoVEFHLCAiID0+ICIgKyBvdXRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ2Fubm90IHJlc3RvcmUgZGF0YSBmb3IgdW5hdmFpbGFibGUgdm9sdW1lICIgKyBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy53KFRBRywgIkJhZCB2b2x1bWUgbnVtYmVyIHRva2VuOiAiICsgcmVscGF0aC5zdWJzdHJpbmcoMCwgc2xhc2gpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5pKFRBRywgIkNhbid0IGZpbmQgdm9sdW1lLW51bWJlciB0b2tlbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJTa2lwcGluZyBkYXRhIHdpdGggbWFsZm9ybWVkIHBhdGggIiArIHJlbHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgRnVsbEJhY2t1cC5yZXN0b3JlVG9GaWxlKGRhdGEsIHNpemUsIHR5cGUsIG1vZGUsIG10aW1lLCBvdXRGaWxlLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggYmJlMTQ2ZDYuLjZkOGVhYjYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjUsNiArMjUsMTAgQEAKICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCiAgICAgICAgICAgICAvPgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii51c2IuVXNiUHJlZmVyZW5jZUFjdGl2aXR5IgorICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkAqYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvLkRpYWxvZy5BbGVydCIKKyAgICAgICAgICAgICBhbmRyb2lkOmV4Y2x1ZGVGcm9tUmVjZW50cz0idHJ1ZSI+CisgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii51c2IuVXNiU3RvcmFnZUFjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZXhjbHVkZUZyb21SZWNlbnRzPSJ0cnVlIj4KICAgICAgICAgPC9hY3Rpdml0eT4KQEAgLTMzLDEzICszNyw2IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ob1RpdGxlQmFyIgotICAgICAgICAgICAgYW5kcm9pZDpleGNsdWRlRnJvbVJlY2VudHM9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZUluc3RhbmNlIgotICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KICAgICAgICAgPCEtLSBzdGFydGVkIGZyb20gVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyIC0tPgogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudXNiLlVzYkNvbmZpcm1BY3Rpdml0eSIKICAgICAgICAgICAgIGFuZHJvaWQ6ZXhwb3J0ZWQ9InRydWUiCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9jb21wYXRfbW9kZV9oZWxwX2RpYWdyYW0ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9kaWFncmFtLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDRiMWYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9kaWFncmFtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9jb21wYXRfbW9kZV9oZWxwX2RpdmlkZXJfYm90dG9tLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9kaXZpZGVyX2JvdHRvbS45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTExOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9kaXZpZGVyX2JvdHRvbS45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9jb21wYXRfbW9kZV9oZWxwX2RpdmlkZXJfdG9wLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9kaXZpZGVyX3RvcC45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE3OGI3Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9kaXZpZGVyX3RvcC45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9jb21wYXRfbW9kZV9oZWxwX2ljb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9pY29uLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJiODkxCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9jb21wYXRfbW9kZV9oZWxwX3RvcF9kaXZpZGVyLjkucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF90b3BfZGl2aWRlci45LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2E1NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvY29tcGF0X21vZGVfaGVscF90b3BfZGl2aWRlci45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9pY19zeXNiYXJfaW1lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3lzYmFyX2ltZV9kZWZhdWx0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2ZWIwYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9pY19zeXNiYXJfaW1lX2RlZmF1bHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3lzYmFyX2ltZV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3N5c2Jhcl9pbWVfcHJlc3NlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjY2ZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvaWNfc3lzYmFyX2ltZV9wcmVzc2VkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZwppbmRleCA4N2E2N2M5Li4yM2FhYmNlIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtaGRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZy5wbmcKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvcmVjZW50c190aHVtYm5haWxfYmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnX3ByZXNzLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1oZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnX3ByZXNzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjA3NjViCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWhkcGkvcmVjZW50c190aHVtYm5haWxfYmdfcHJlc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1sYXJnZS1oZHBpL2FwcF9pY29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1sYXJnZS1oZHBpL2FwcF9pY29uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkZjdlNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtaGRwaS9hcHBfaWNvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtbWRwaS9hcHBfaWNvbi5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtbWRwaS9hcHBfaWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYThhYzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLW1kcGkvYXBwX2ljb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvY29tcGF0X21vZGVfaGVscF9kaWFncmFtLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfZGlhZ3JhbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4YTVjMQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfZGlhZ3JhbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvY29tcGF0X21vZGVfaGVscF9kaXZpZGVyX2JvdHRvbS45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfZGl2aWRlcl9ib3R0b20uOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxMmFiZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfZGl2aWRlcl9ib3R0b20uOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvY29tcGF0X21vZGVfaGVscF9kaXZpZGVyX3RvcC45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfZGl2aWRlcl90b3AuOS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkMDhjOAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfZGl2aWRlcl90b3AuOS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvY29tcGF0X21vZGVfaGVscF9pY29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfaWNvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzYzRkZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2NvbXBhdF9tb2RlX2hlbHBfaWNvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2ltZV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9pbWVfZGVmYXVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDdkZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc3lzYmFyX2ltZV9kZWZhdWx0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9pbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9pY19zeXNiYXJfaW1lX3ByZXNzZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4ODUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3N5c2Jhcl9pbWVfcHJlc3NlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZy5wbmcKaW5kZXggODdhNjdjOS4uMjNhYWJjZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmcucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcKaW5kZXggYTFjMzllNi4uMGIwNzY1YiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmdfcHJlc3MucG5nCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnX3ByZXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbm9kcGkvY29tcGF0X21vZGVfaGVscF9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbm9kcGkvY29tcGF0X21vZGVfaGVscF9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlhNzBmZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1ub2RwaS9jb21wYXRfbW9kZV9oZWxwX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2ljX3N5c2Jhcl9pbWVfZGVmYXVsdC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2ljX3N5c2Jhcl9pbWVfZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5ZDg4YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvaWNfc3lzYmFyX2ltZV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2ljX3N5c2Jhcl9pbWVfcHJlc3NlZC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2ljX3N5c2Jhcl9pbWVfcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkNzUwNwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvaWNfc3lzYmFyX2ltZV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2ljX3N5c2Jhcl96b29tX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9pY19zeXNiYXJfem9vbV9kZWZhdWx0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTEzMjRhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9pY19zeXNiYXJfem9vbV9kZWZhdWx0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL2ljX3N5c2Jhcl96b29tX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9pY19zeXNiYXJfem9vbV9wcmVzc2VkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGUxM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9pY19zeXNiYXJfem9vbV9wcmVzc2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtaGRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLWhkcGkvcmVjZW50c19iZ19wcm90ZWN0X3RpbGUucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5faC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF8zZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX3JvYW0ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtaGRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1oZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLWhkcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9pY19zeXNiYXJfaW1lX2RlZmF1bHQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9pY19zeXNiYXJfaW1lX2RlZmF1bHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWRjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL2ljX3N5c2Jhcl9pbWVfZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9pY19zeXNiYXJfaW1lX3ByZXNzZWQucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9pY19zeXNiYXJfaW1lX3ByZXNzZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWI2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL2ljX3N5c2Jhcl9pbWVfcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9pY19zeXNiYXJfem9vbV9kZWZhdWx0LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvaWNfc3lzYmFyX3pvb21fZGVmYXVsdC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkNDg2ZgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvaWNfc3lzYmFyX3pvb21fZGVmYXVsdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9pY19zeXNiYXJfem9vbV9wcmVzc2VkLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvaWNfc3lzYmFyX3pvb21fcHJlc3NlZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzNDQzNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvaWNfc3lzYmFyX3pvb21fcHJlc3NlZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLW1kcGkvcmVjZW50c19iZ19wcm90ZWN0X3RpbGUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1sYXJnZS1tZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLW1kcGkvcmVjZW50c19ibHVlX2dsb3cuOS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfYmx1ZV9nbG93LjkucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtbWRwaS9yZWNlbnRzX2JsdWVfZ2xvdy45LnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9yZWNlbnRzX2JsdWVfZ2xvdy45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtbWRwaS9yZWNlbnRzX2NhbGxvdXRfbGluZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfY2FsbG91dF9saW5lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLW1kcGkvcmVjZW50c19jYWxsb3V0X2xpbmUucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfY2FsbG91dF9saW5lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtbGFyZ2UtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnX3ByZXNzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLWxhcmdlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmdfcHJlc3MucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnX3ByZXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luXzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5fZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luX2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5faC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbl9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8zZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF8zZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfNGcucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX2luYW5kb3V0X2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfaW5hbmRvdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9pbmFuZG91dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF8xeC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF8zZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0XzRnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9nLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Nvbm5lY3RlZF9vdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9oLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfb3V0X2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX291dF9oLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfY29ubmVjdGVkX3JvYW0ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9jb25uZWN0ZWRfcm9hbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF8zZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkXzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2Nvbm5lY3RlZF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfY29ubmVjdGVkX2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9jb25uZWN0ZWRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luXzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbl80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5fZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luX2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5faC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzF4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfMXgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0XzNnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfNGcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9pbmFuZG91dF80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2cucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X2luYW5kb3V0X2gucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfaW5hbmRvdXRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzF4LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfMXgucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzF4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfM2cucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF8zZy5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfM2cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF80Zy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0XzRnLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF80Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCnJlbmFtZSB0byBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXN3NjAwZHAtbWRwaS9zdGF0X3N5c19kYXRhX2Z1bGx5X291dF9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUtc3c2MDBkcC1tZHBpL3N0YXRfc3lzX2RhdGFfZnVsbHlfb3V0X2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBwYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcKcmVuYW1lIHRvIHBhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS1zdzYwMGRwLW1kcGkvc3RhdF9zeXNfZGF0YV9mdWxseV9vdXRfaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL2FwcF9pY29uLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9hcHBfaWNvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGY3ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1oZHBpL2FwcF9pY29uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLWhkcGkvcmVjZW50c19iZ19wcm90ZWN0X3RpbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTdjMjdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtaGRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvYXBwX2ljb24ucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL2FwcF9pY29uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhOGFjOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvYXBwX2ljb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzdiZTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX2JsdWVfZ2xvdy45LnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX2JsdWVfZ2xvdy45LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0YWU3OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvcmVjZW50c19ibHVlX2dsb3cuOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvcmVjZW50c19jYWxsb3V0X2xpbmUucG5nIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfY2FsbG91dF9saW5lLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YzAzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvcmVjZW50c19jYWxsb3V0X2xpbmUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTY3YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlLXhsYXJnZS1tZHBpL3JlY2VudHNfdGh1bWJuYWlsX2JnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUteGxhcmdlLW1kcGkvcmVjZW50c190aHVtYm5haWxfYmdfcHJlc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMzOWU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS14bGFyZ2UtbWRwaS9yZWNlbnRzX3RodW1ibmFpbF9iZ19wcmVzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvY29tcGF0X21vZGVfaGVscF9iZy5wbmcgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvY29tcGF0X21vZGVfaGVscF9iZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkOGM0MQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9kcmF3YWJsZS9jb21wYXRfbW9kZV9oZWxwX2JnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvZHJhd2FibGUvaWNfc3lzYmFyX3pvb20ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl96b29tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QwMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2RyYXdhYmxlL2ljX3N5c2Jhcl96b29tLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX3ByZXNzZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfem9vbV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfc2VsZWN0ZWQ9InRydWUiIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfem9vbV9wcmVzc2VkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19zeXNiYXJfem9vbV9kZWZhdWx0IiAvPgorPC9zZWxlY3Rvcj4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1sYW5kL3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1sYW5kL3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sCmluZGV4IGNlNzJmMDQuLmJlNGYxZDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtbGFuZC9zdGF0dXNfYmFyX3JlY2VudF9pdGVtLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LWxhbmQvc3RhdHVzX2Jhcl9yZWNlbnRfaXRlbS54bWwKQEAgLTM5LDggKzM5LDggQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL2FwcF90aHVtYm5haWwiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvYXBwX3RodW1ibmFpbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfYm9yZGVyX3dpZHRoIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2JvcmRlcl9oZWlnaHQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfaWNvbl90b3BfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9pY29uX2xlZnRfbWFyZ2luIgogICAgICAgICBhbmRyb2lkOm1heFdpZHRoPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfd2lkdGgiCiAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfaGVpZ2h0IgogICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCkBAIC01Niw3ICs1Niw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL2FwcF90aHVtYm5haWwiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvYXBwX3RodW1ibmFpbCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RleHRfZGVzY3JpcHRpb25fcGFkZGluZyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfYm9yZGVyX3dpZHRoIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vcmVjZW50c190aHVtYm5haWxfYmdfcGFkZGluZ19sZWZ0IgogICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogICAgIC8+CkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL2FwcF90aHVtYm5haWwiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvYXBwX2xhYmVsIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfdGV4dF9kZXNjcmlwdGlvbl9wYWRkaW5nIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9ib3JkZXJfd2lkdGgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9yZWNlbnRzX3RodW1ibmFpbF9iZ19wYWRkaW5nX2xlZnQiCiAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCiAgICAgLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtbGFuZC9zdGF0dXNfYmFyX3JlY2VudF9wYW5lbC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LWxhbmQvc3RhdHVzX2Jhcl9yZWNlbnRfcGFuZWwueG1sCmluZGV4IDc1ZjVlZTQuLjRhODA0ODkgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtbGFuZC9zdGF0dXNfYmFyX3JlY2VudF9wYW5lbC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1sYW5kL3N0YXR1c19iYXJfcmVjZW50X3BhbmVsLnhtbApAQCAtMjcsMTAgKzI3LDkgQEAKICAgICA8RnJhbWVMYXlvdXQKICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2JnX3Byb3RlY3QiCiAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQCphbmRyb2lkOmRpbWVuL3N0YXR1c19iYXJfaGVpZ2h0IgogICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgogICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1wb3J0L3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1wb3J0L3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTY1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXBvcnQvc3RhdHVzX2Jhcl9yZWNlbnRfaXRlbS54bWwKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KKzxSZWxhdGl2ZUxheW91dAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfdmlld193aWR0aCI+CisKKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX3RodW1ibmFpbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2xlZnRfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIgorICAgIC8+CisKKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC9hcHBfdGh1bWJuYWlsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL2FwcF90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2ljb25fbGVmdF9tYXJnaW4iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfaWNvbl90b3BfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOm1heFdpZHRoPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfd2lkdGgiCisgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCisgICAgLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FwcF9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX3dpZHRoIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfdGV4dF9zaXplIgorICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZUxlbmd0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19mYWRpbmdfZWRnZV9sZW5ndGgiCisgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvYXBwX2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX2xlZnRfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCisgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgorICAgIC8+CisKKyAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL3JlY2VudHNfY2FsbG91dF9saW5lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfd2lkdGgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9sYWJlbF9sZWZ0X21hcmdpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9hcHBfdGh1bWJuYWlsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2FwcF9sYWJlbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjNkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iM2RpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcmVjZW50c19jYWxsb3V0X2xpbmUiCisgICAgLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FwcF9kZXNjcmlwdGlvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX3dpZHRoIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfZGVzY3JpcHRpb25fdGV4dF9zaXplIgorICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZUxlbmd0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19mYWRpbmdfZWRnZV9sZW5ndGgiCisgICAgICAgIGFuZHJvaWQ6c2Nyb2xsSG9yaXpvbnRhbGx5PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX2xlZnRfbWFyZ2luIgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3JlY2VudHNfY2FsbG91dF9saW5lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjNkaXAiCisgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCisgICAgLz4KKworPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtcG9ydC9zdGF0dXNfYmFyX3JlY2VudF9wYW5lbC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXBvcnQvc3RhdHVzX2Jhcl9yZWNlbnRfcGFuZWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTFmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXBvcnQvc3RhdHVzX2Jhcl9yZWNlbnRfcGFuZWwueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKiBhcHBzL2NvbW1vbi9hc3NldHMvZGVmYXVsdC9kZWZhdWx0L3NraW5zL1N0YXR1c0Jhci54bWwKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8Y29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudHNQYW5lbFZpZXcKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX3Jvb3QiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2JnX3Byb3RlY3QiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3JlY2VudHNfYmdfcHJvdGVjdF90aWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iQCphbmRyb2lkOmRpbWVuL3N0YXR1c19iYXJfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgorICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiPgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2dsb3ciCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjBkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL3JlY2VudHNfYmx1ZV9nbG93IgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcFRvUGFkZGluZz0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiCisgICAgICAgICAgICA+CisgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudHNWZXJ0aWNhbFNjcm9sbFZpZXcgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2NvbnRhaW5lciIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c193aWR0aCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGFja0Zyb21Cb3R0b209InRydWUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhcnM9Im5vbmUiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlTGVuZ3RoPSIyMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxpc3RTZWxlY3Rvcj0iQGRyYXdhYmxlL3JlY2VudHNfdGh1bWJuYWlsX2JnX3NlbGVjdG9yIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxsZWZ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpcFRvUGFkZGluZz0iZmFsc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIj4KKworICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2xpbmVhcl9sYXlvdXQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICAgICAgPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50c1ZlcnRpY2FsU2Nyb2xsVmlldz4KKworCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPC9GcmFtZUxheW91dD4KKworICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50c19kaXNtaXNzX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjgwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQCphbmRyb2lkOmRpbWVuL3N0YXR1c19iYXJfaGVpZ2h0IgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9pY19zeXNiYXJfYmFja19pbWUiCisgICAgLz4KKworPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50c1BhbmVsVmlldz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9jb21wYXRfbW9kZV9oZWxwLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9jb21wYXRfbW9kZV9oZWxwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjllNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1zdzYwMGRwL2NvbXBhdF9tb2RlX2hlbHAueG1sCkBAIC0wLDAgKzEsOTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8UmVsYXRpdmVMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9jb21wYXRfbW9kZV9oZWxwX2JnIgorICAgID4KKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oZWFkZXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4MGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjgwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSI4MGRwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSI2MHNwIgorICAgICAgICBhbmRyb2lkOm1heExpbmVzPSIxIgorICAgICAgICBhbmRyb2lkOnNoYWRvd1JhZGl1cz0iOCIKKyAgICAgICAgYW5kcm9pZDpzaGFkb3dDb2xvcj0iI0ZGMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29tcGF0X21vZGVfaGVscF9oZWFkZXIiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2NvbXBhdF9tb2RlX2hlbHBfZGl2aWRlcl90b3AiCisgICAgICAgIC8+CisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2RpYWdyYW0iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJJblBhcmVudD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9jb21wYXRfbW9kZV9oZWxwX2RpYWdyYW0iCisgICAgICAgIC8+CisgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTkwZHAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2NvbXBhdF9tb2RlX2hlbHBfZGl2aWRlcl9ib3R0b20iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iNTVkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjgwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduTGVmdD0iQGlkL2hlYWRlciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCisgICAgICAgID4KKyAgICAgICAgPEltYWdlVmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9jb21wYXRfbW9kZV9oZWxwX2ljb24iCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXhwbGFuYXRpb24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIxMGRwIgorICAgICAgICAgICAgYW5kcm9pZDpzaGFkb3dSYWRpdXM9IjQiCisgICAgICAgICAgICBhbmRyb2lkOnNoYWRvd0NvbG9yPSIjRkYwMDAwMDAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyOHNwIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvbXBhdF9tb2RlX2hlbHBfYm9keSIKKyAgICAgICAgICAgIC8+CisgICAgPC9SZWxhdGl2ZUxheW91dD4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjA4ZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25MZWZ0PSJAaWQvaGVhZGVyIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIyMGRwIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyOHNwIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBhbmRyb2lkOnN0cmluZy9vayIKKyAgICAgICAgLz4KKzwvUmVsYXRpdmVMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX2NvbXBhdF9tb2RlX3BhbmVsLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX2NvbXBhdF9tb2RlX3BhbmVsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzM3NDFlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfY29tcGF0X21vZGVfcGFuZWwueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisqKgorKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKworPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuQ29tcGF0TW9kZVBhbmVsCisgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSJAZGltZW4vcGFuZWxfZmxvYXQiCisgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjIwZHAiCisgICAgPgorICAgIDxSYWRpb0dyb3VwIGFuZHJvaWQ6aWQ9IkAraWQvY29tcGF0X21vZGVfcmFkaW9fZ3JvdXAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQCphbmRyb2lkOmRyYXdhYmxlL2RpYWxvZ19mdWxsX2hvbG9fZGFyayIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwZHAiCisgICAgICAgID4KKyAgICAgICAgPFJhZGlvQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvY29tcGF0X21vZGVfb2ZmX3JhZGlvIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvbXBhdF9tb2RlX29mZiIgLz4KKyAgICAgICAgPFJhZGlvQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvY29tcGF0X21vZGVfb25fcmFkaW8iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29tcGF0X21vZGVfb24iIC8+CisgICAgPC9SYWRpb0dyb3VwPgorPC9jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LkNvbXBhdE1vZGVQYW5lbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9hcmVhLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9hcmVhLnhtbAppbmRleCBmNTNiMjllLi5mZWNmZTdmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25fYXJlYS54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfbm90aWZpY2F0aW9uX2FyZWEueG1sCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgPgogCiAgICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmaWNhdGlvbkFuZEltZUFyZWEiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZmVlZGJhY2tJY29uQXJlYSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCiAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCkBAIC00MSw3ICs0MSwxNiBAQAogICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfaW1lX2RlZmF1bHQiCiAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCiAgICAgICAgICAgICAvPgotICAgICAgICAKKworICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5Db21wYXRNb2RlQnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbXBhdE1vZGVCdXR0b24iCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI4ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19zeXNiYXJfem9vbSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKKyAgICAgICAgICAgIC8+CisKICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuTm90aWZpY2F0aW9uSWNvbkFyZWEKICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZpY2F0aW9uSWNvbnMiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgpAQCAtMTQ0LDQgKzE1MywzIEBACiAgICAgICAgIDwvTGluZWFyTGF5b3V0PgogICAgIDwvTGluZWFyTGF5b3V0PgogPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9wYW5lbC54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25fcGFuZWwueG1sCmluZGV4IGVmNTcyMjguLjcyNTE5ZmIgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9wYW5lbC54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfbm90aWZpY2F0aW9uX3BhbmVsLnhtbApAQCAtNTcsMTUgKzU3LDE1IEBACiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCiAgICAgICAgICAgICAgICAgPgotICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5Ob3RpZmljYXRpb25Sb3dMYXlvdXQKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jb250ZW50IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxib3R0b20iCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpmb2N1c2FibGU9InRydWUiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGVzY2VuZGFudEZvY3VzYWJpbGl0eT0iYWZ0ZXJEZXNjZW5kYW50cyIKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtdWk6cm93SGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2hlaWdodCIKICAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgIDwvU2Nyb2xsVmlldz4KICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25fcm93LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9yb3cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTQ1NmIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9yb3cueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPFJlbGF0aXZlTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNjVkcCIKLSAgICA+Ci0KLSAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC92ZXRvIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0byIKLSAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjhkcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iOGRwIgotICAgICAgICAvPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xhcmdlX2ljb24iCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAYW5kcm9pZDpkaW1lbi9ub3RpZmljYXRpb25fbGFyZ2VfaWNvbl93aWR0aCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAYW5kcm9pZDpkaW1lbi9ub3RpZmljYXRpb25fbGFyZ2VfaWNvbl9oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXIiCi0gICAgICAgIC8+Ci0KLSAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLkxhdGVzdEl0ZW1WaWV3IGFuZHJvaWQ6aWQ9IkAraWQvY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvbGFyZ2VfaWNvbiIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC92ZXRvIgotICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgIC8+Ci0KLSAgICA8VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRCb3R0b209InRydWUiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGFuZHJvaWQ6ZHJhd2FibGUvZGl2aWRlcl9ob3Jpem9udGFsX2RhcmsiCi0gICAgICAgIC8+Ci0KLTwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9yZWNlbnRfaXRlbS54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0LXN3NjAwZHAvc3RhdHVzX2Jhcl9yZWNlbnRfaXRlbS54bWwKaW5kZXggY2Q0MmQ3ZS4uOTY4Nzg2NiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC1zdzYwMGRwL3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQtc3c2MDBkcC9zdGF0dXNfYmFyX3JlY2VudF9pdGVtLnhtbApAQCAtMzYsNTMgKzM2LDUzIEBACiAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2FwcF9pY29uIgogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTMxZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEzZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnbkxlZnQ9IkBpZC9hcHBfdGh1bWJuYWlsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL2FwcF90aHVtYm5haWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2ljb25fbGVmdF9tYXJnaW4iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfaWNvbl90b3BfbWFyZ2luIgogICAgICAgICBhbmRyb2lkOm1heFdpZHRoPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfd2lkdGgiCiAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfaGVpZ2h0IgogICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCiAgICAgLz4KIAotICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50c19jYWxsb3V0X2xpbmUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5N2RpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI2MWRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxNmRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9hcHBfdGh1bWJuYWlsIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcmVjZW50c19jYWxsb3V0X2xpbmUiCi0gICAgLz4KLQogICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FwcF9sYWJlbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Ijk3ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfd2lkdGgiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9kZXNjcmlwdGlvbl90ZXh0X3NpemUiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX3RleHRfc2l6ZSIKICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIgogICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2VMZW5ndGg9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfZmFkaW5nX2VkZ2VfbGVuZ3RoIgogICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTZkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX2xlZnRfbWFyZ2luIgogICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjMyZGlwIgogICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogICAgIC8+CiAKKyAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL3JlY2VudHNfY2FsbG91dF9saW5lIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfd2lkdGgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMWRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9hcHBfbGFiZWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iM2RpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9sYWJlbF9sZWZ0X21hcmdpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9hcHBfdGh1bWJuYWlsIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iM2RpcCIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvcmVjZW50c19jYWxsb3V0X2xpbmUiCisgICAgLz4KKwogICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2FwcF9kZXNjcmlwdGlvbiIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Ijk3ZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfd2lkdGgiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgogICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9kZXNjcmlwdGlvbl90ZXh0X3NpemUiCiAgICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKICAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlTGVuZ3RoPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2ZhZGluZ19lZGdlX2xlbmd0aCIKICAgICAgICAgYW5kcm9pZDpzY3JvbGxIb3Jpem9udGFsbHk9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE2ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjYxZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3JlY2VudHNfY2FsbG91dF9saW5lIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9sYWJlbF9sZWZ0X21hcmdpbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzZGlwIgogICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCiAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogICAgIC8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3JlY2VudF9hcHBzX2FjdGl2aXR5LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50X2FwcHNfYWN0aXZpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzY2MWU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50X2FwcHNfYWN0aXZpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qCi0qKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotCi08TGluZWFyTGF5b3V0Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPCEtLSBUaXRsZSAtLT4KLSAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCi0gICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjODBGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZWNlbnRfdGFza3NfdGl0bGUiCi0gICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgotCi0gICAgPCEtLSBUaGlzIGlzIG9ubHkgaW50ZW5kZWQgdG8gYmUgdmlzaWJsZSB3aGVuIGNhcm91c2VsIGlzIGludmlzaWJsZSAtLT4KLSAgICA8VGV4dFZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub19hcHBsaWNhdGlvbnNfbWVzc2FnZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVjZW50X3Rhc2tzX2VtcHR5IgotICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KLQotICAgIDxjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2Fyb3VzZWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIj4KLSAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXc+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRzX2RldGFpbF92aWV3LnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvcmVjZW50c19kZXRhaWxfdmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWQwZjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9yZWNlbnRzX2RldGFpbF92aWV3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0vKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLQotPExpbmVhckxheW91dAotICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDwhLS0gQXBwbGljYXRpb24gVGl0bGUgLS0+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX3RpdGxlIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bSIKLSAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIi8+Ci0KLSAgICA8IS0tIEFwcGxpY2F0aW9uIERldGFpbHMgLS0+Ci0gICAgPFRleHRWaWV3Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXBwX2Rlc2NyaXB0aW9uIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIi8+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2V4cGFuZGVkLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9leHBhbmRlZC54bWwKaW5kZXggMThlODI3My4uNjY3MGVmZiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX2V4cGFuZGVkLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfZXhwYW5kZWQueG1sCkBAIC0xOCw3ICsxOCw5IEBACiAqLwogLS0+CiAKLTxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuRXhwYW5kZWRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKzxjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuRXhwYW5kZWRWaWV3IAorICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczpzeXN0ZW11aT0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9jb20uYW5kcm9pZC5zeXN0ZW11aSIKICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKICAgICBhbmRyb2lkOmRlc2NlbmRhbnRGb2N1c2FiaWxpdHk9ImFmdGVyRGVzY2VuZGFudHMiCkBAIC05NywxMCArOTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0YXR1c19iYXJfb25nb2luZ19ldmVudHNfdGl0bGUiCiAgICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL29uZ29pbmdJdGVtcyIKKyAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5Ob3RpZmljYXRpb25Sb3dMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vbmdvaW5nSXRlbXMiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtdWk6cm93SGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2hlaWdodCIKICAgICAgICAgICAgICAgICAgICAgLz4KIAogICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhdGVzdFRpdGxlIgpAQCAtMTExLDEwICsxMTQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5UaXRsZSIKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0YXR1c19iYXJfbGF0ZXN0X2V2ZW50c190aXRsZSIKICAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbGF0ZXN0SXRlbXMiCisgICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuTm90aWZpY2F0aW9uUm93TGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGF0ZXN0SXRlbXMiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtdWk6cm93SGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2hlaWdodCIKICAgICAgICAgICAgICAgICAgICAgLz4KICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgogICAgICAgICA8L1Njcm9sbFZpZXc+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbm90aWZpY2F0aW9uX3Jvdy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfbm90aWZpY2F0aW9uX3Jvdy54bWwKaW5kZXggOGU0NTZiMi4uYWZmNmE2ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9yb3cueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9ub3RpZmljYXRpb25fcm93LnhtbApAQCAtMSw2ICsxLDYgQEAKIDxSZWxhdGl2ZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjY1ZHAiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbm90aWZpY2F0aW9uX2hlaWdodCIKICAgICA+CiAKICAgICA8SW1hZ2VCdXR0b24KQEAgLTksNiArOSw3IEBACiAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9Ii04MGRwIgogICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL3N0YXR1c19iYXJfdmV0byIKICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImNlbnRlciIKICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbnVsbCIKQEAgLTMwLDcgKzMxLDcgQEAKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI2NGRwIgogICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvbGFyZ2VfaWNvbiIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC92ZXRvIgorICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgogICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCiAgICAgICAgIC8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX3JlY2VudF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0MmQ3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvbGF5b3V0L3N0YXR1c19iYXJfcmVjZW50X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIGFwcHMvY29tbW9uL2Fzc2V0cy9kZWZhdWx0L2RlZmF1bHQvc2tpbnMvU3RhdHVzQmFyLnhtbAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci0KLTwhLS0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvc3RhdHVzX2Jhcl9jbG9zZWRfZGVmYXVsdF9iYWNrZ3JvdW5kIiAtLT4KLTxSZWxhdGl2ZUxheW91dAotICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL3N0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfdmlld193aWR0aCI+Ci0KLSAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX3RodW1ibmFpbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2xlZnRfbWFyZ2luIgotICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIgotICAgIC8+Ci0KLSAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX2ljb24iCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMzFkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTNkaXAiCi0gICAgICAgIGFuZHJvaWQ6bWF4V2lkdGg9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX21heF93aWR0aCIKLSAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX21heF9oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKLSAgICAvPgotCi0gICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2NhbGxvdXRfbGluZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Ijk3ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjFkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjYxZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE2ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL2FwcF90aHVtYm5haWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIzZGlwIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9yZWNlbnRzX2NhbGxvdXRfbGluZSIKLSAgICAvPgotCi0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvYXBwX2xhYmVsIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iOTdkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9kZXNjcmlwdGlvbl90ZXh0X3NpemUiCi0gICAgICAgIGFuZHJvaWQ6ZmFkaW5nRWRnZT0iaG9yaXpvbnRhbCIKLSAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlTGVuZ3RoPSJAZGltZW4vc3RhdHVzX2Jhcl9yZWNlbnRzX2ZhZGluZ19lZGdlX2xlbmd0aCIKLSAgICAgICAgYW5kcm9pZDpzY3JvbGxIb3Jpem9udGFsbHk9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjE2ZGlwIgotICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjMyZGlwIgotICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgIC8+Ci0KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9hcHBfZGVzY3JpcHRpb24iCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI5N2RpcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfYXBwX2Rlc2NyaXB0aW9uX3RleHRfc2l6ZSIKLSAgICAgICAgYW5kcm9pZDpmYWRpbmdFZGdlPSJob3Jpem9udGFsIgotICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2VMZW5ndGg9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfZmFkaW5nX2VkZ2VfbGVuZ3RoIgotICAgICAgICBhbmRyb2lkOnNjcm9sbEhvcml6b250YWxseT0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFRvcD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTZkaXAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iNjFkaXAiCi0gICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9Im1hcnF1ZWUiCi0gICAgLz4KLQotPC9SZWxhdGl2ZUxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvc3RhdHVzX2Jhcl9yZWNlbnRfcGFuZWwueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX3JlY2VudF9wYW5lbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwM2NiYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC9zdGF0dXNfYmFyX3JlY2VudF9wYW5lbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogYXBwcy9jb21tb24vYXNzZXRzL2RlZmF1bHQvZGVmYXVsdC9za2lucy9TdGF0dXNCYXIueG1sCi0qKgotKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLQotPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRzUGFuZWxWaWV3Ci0gICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50c19yb290IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiPgotCi0gICAgPEZyYW1lTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50c19iZ19wcm90ZWN0IgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9yZWNlbnRzX2JnX3Byb3RlY3RfdGlsZSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IkAqYW5kcm9pZDpkaW1lbi9zdGF0dXNfYmFyX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50c19nbG93IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSItNDlkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBkcmF3YWJsZS9yZWNlbnRzX2JsdWVfZ2xvdyIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgYW5kcm9pZDpjbGlwQ2hpbGRyZW49ImZhbHNlIgotICAgICAgICAgICAgPgotICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRzVmVydGljYWxTY3JvbGxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvcmVjZW50c19jb250YWluZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfd2lkdGgiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IkBkaW1lbi9zdGF0dXNfYmFyX3JlY2VudHNfcmlnaHRfZ2xvd19tYXJnaW4iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVyPSJAbnVsbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnN0YWNrRnJvbUJvdHRvbT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2U9InZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFycz0ibm9uZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmZhZGluZ0VkZ2VMZW5ndGg9IjIwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGlzdFNlbGVjdG9yPSJAZHJhd2FibGUvcmVjZW50c190aHVtYm5haWxfYmdfc2VsZWN0b3IiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGxlZnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiPgotCi0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3JlY2VudHNfbGluZWFyX2xheW91dCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBDaGlsZHJlbj0iZmFsc2UiPgotICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRzVmVydGljYWxTY3JvbGxWaWV3PgotCi0KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L0ZyYW1lTGF5b3V0PgotCi0gICAgPFZpZXcgYW5kcm9pZDppZD0iQCtpZC9yZWNlbnRzX2Rpc21pc3NfYnV0dG9uIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iODBweCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAKmFuZHJvaWQ6ZGltZW4vc3RhdHVzX2Jhcl9oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGRyYXdhYmxlL2ljX3N5c2Jhcl9iYWNrX2ltZSIKLSAgICAvPgotCi08L2NvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRzUGFuZWxWaWV3PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL2xheW91dC91c2JfcHJlZmVyZW5jZV9idXR0b25zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvdXNiX3ByZWZlcmVuY2VfYnV0dG9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiZTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy9sYXlvdXQvdXNiX3ByZWZlcmVuY2VfYnV0dG9ucy54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBDaGVjayBib3ggdGhhdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGFjdGl2aXR5IHJlc29sdmVyIFVJIGZvciB0aGUgdXNlcgorICAgICB0byBtYWtlIHRoZWlyIHNlbGVjdGlvbiB0aGUgcHJlZmVycmVkIGFjdGl2aXR5LiAtLT4KKzxMaW5lYXJMYXlvdXQKKyAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNGRpcCIKKyAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTVkaXAiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgorCisgICAgPEJ1dHRvbgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL210cF9wdHBfYnV0dG9uIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdXNlX3B0cF9idXR0b25fdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIC8+CisKKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5zdGFsbGVyX2NkX2J1dHRvbiIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2luc3RhbGxlcl9jZF9idXR0b25fdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmZvY3VzYWJsZT0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1mci1sYXJnZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtZnItbGFyZ2Uvc3RyaW5ncy54bWwKaW5kZXggNDQ3YjE3NC4uZjhkZDU1ZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1mci1sYXJnZS9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWZyLWxhcmdlL3N0cmluZ3MueG1sCkBAIC0yMSw3ICsyMSw3IEBACiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgogICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIiBtc2dpZD0iNDY2MTU4Mzg5NjgwMzM0OTczMiI+IlRvdXQgZWZmYWNlciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjM4MzE0NTE3ODc1NTMyOTA2NyI+IkF1Y3VuZSBjb25uZXhpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NpZ25hbF9tZXRlcl93aWZpX25vc3NpZCIgbXNnaWQ9IjI1MzU0NjUyOTQ0Mzc1ODY1MjgiPiJDb25uZWN0w6kgYXUgV2ktRmkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQiIG1zZ2lkPSIyNTM1NDY1Mjk0NDM3NTg2NTI4Ij4iQ29ubmVjdMOpIGF1IFdpLUZpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ3BzX25vdGlmaWNhdGlvbl9zZWFyY2hpbmdfdGV4dCIgbXNnaWQ9IjQ0Njc5MzUxODY4NjQyMDgyNDkiPiJSZWNoZXJjaGUgZGUgR1BTIGVuIGNvdXJzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ3BzX25vdGlmaWNhdGlvbl9mb3VuZF90ZXh0IiBtc2dpZD0iNjI3MDYyODM4ODkxODgyMjk1NiI+IlBvc2l0aW9uIGTDqWZpbmllIHBhciBHUFMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJub3RpZmljYXRpb25zX29mZl90aXRsZSIgbXNnaWQ9IjE4NjAxMTc2OTYwMzQ3NzU4NTEiPiJOb3RpZmljYXRpb25zIGTDqXNhY3RpdsOpZXMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWhkcGkvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaGRwaS9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MWI3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWhkcGkvZGltZW5zLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS0gT2Zmc2V0cyBmb3IgcmVuZGVyaW5nIHRodW1ibmFpbHMgb3ZlciBkcmF3YWJsZSByZWNlbnRzX3RodW1ibmFpbF9iZyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icmVjZW50c190aHVtYm5haWxfYmdfcGFkZGluZ19sZWZ0Ij42cHg8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJyZWNlbnRzX3RodW1ibmFpbF9iZ19wYWRkaW5nX3RvcCI+N3B4PC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0icmVjZW50c190aHVtYm5haWxfYmdfcGFkZGluZ19yaWdodCI+NnB4PC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0icmVjZW50c190aHVtYm5haWxfYmdfcGFkZGluZ19ib3R0b20iPjZweDwvZGltZW4+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaXQtbGFyZ2Uvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWl0LWxhcmdlL3N0cmluZ3MueG1sCmluZGV4IDNjZGU1MjkuLjE4Y2NkMDcgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaXQtbGFyZ2Uvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pdC1sYXJnZS9zdHJpbmdzLnhtbApAQCAtMTksOCArMTksOCBAQAogCiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iIG1zZ2lkPSI0NjYxNTgzODk2ODAzMzQ5NzMyIj4iQ2FuY2VsbGEgdHV0dG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3NpZ25hbF9tZXRlcl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSIzODMxNDUxNzg3NTUzMjkwNjciPiJOZXNzdW5hIGNvbm5lc3MuIEludGVybmV0Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9jbGVhcl9hbGxfYnV0dG9uIiBtc2dpZD0iNDY2MTU4Mzg5NjgwMzM0OTczMiI+IkNhbmNlbGxhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19zaWduYWxfbWV0ZXJfZGlzY29ubmVjdGVkIiBtc2dpZD0iMzgzMTQ1MTc4NzU1MzI5MDY3Ij4iTmVzc3VuYSBjb25uZXNzaW9uZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX3dpZmlfbm9zc2lkIiBtc2dpZD0iMjUzNTQ2NTI5NDQzNzU4NjUyOCI+IldpLUZpIGNvbm5lc3NvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ3BzX25vdGlmaWNhdGlvbl9zZWFyY2hpbmdfdGV4dCIgbXNnaWQ9IjQ0Njc5MzUxODY4NjQyMDgyNDkiPiJSaWNlcmNhIGRlbCBHUFMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJncHNfbm90aWZpY2F0aW9uX2ZvdW5kX3RleHQiIG1zZ2lkPSI2MjcwNjI4Mzg4OTE4ODIyOTU2Ij4iUG9zaXppb25lIHN0YWJpbGl0YSBkYWwgR1BTIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAppbmRleCA2ZjE0NTNlLi4wMjE5YTc3IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApAQCAtMjMsMTUgKzIzLDE3IEBACiAgICAgPCEtLSBXaWR0aCBvZiBhIHJlY2VudCBhcHAgdmlldywgaW5jbHVkaW5nIGFsbCBjb250ZW50IC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX3ZpZXdfd2lkdGgiPjE1NmRwPC9kaW1lbj4KICAgICA8IS0tIEhvdyBmYXIgdGhlIHRodW1ibmFpbCBmb3IgYSByZWNlbnQgYXBwIGFwcGVhcnMgZnJvbSBsZWZ0IGVkZ2UgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfbGVmdF9tYXJnaW4iPjBkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfbGVmdF9tYXJnaW4iPjhkcDwvZGltZW4+CisgICAgPCEtLSBIb3cgZmFyIHRoZSB0aHVtYm5haWwgZm9yIGEgcmVjZW50IGFwcCBhcHBlYXJzIGZyb20gdG9wIGVkZ2UgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfdG9wX21hcmdpbiI+MTJkcDwvZGltZW4+CiAgICAgPCEtLSBXaWR0aCBvZiBzY3JvbGxhYmxlIGFyZWEgaW4gcmVjZW50cyAtLT4KICAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3dpZHRoIj4xMjhkcDwvZGltZW4+Ci0gICAgPCEtLSBUaHVtYm5haWwgYm9yZGVyIHdpZHRoIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2JvcmRlcl93aWR0aCI+OGRwPC9kaW1lbj4KLSAgICA8IS0tIFRodW1ibmFpbCBib3JkZXIgaGVpZ2h0IC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2JvcmRlcl9oZWlnaHQiPjEyZHA8L2RpbWVuPgogICAgIDwhLS0gUGFkZGluZyBmb3IgdGV4dCBkZXNjcmlwdGlvbnMgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190ZXh0X2Rlc2NyaXB0aW9uX3BhZGRpbmciPjhkcDwvZGltZW4+CisgICAgPCEtLSBXaWR0aCBvZiBhcHBsaWNhdGlvbiBsYWJlbCB0ZXh0IC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX3dpZHRoIj45N2RpcDwvZGltZW4+CisgICAgPCEtLSBMZWZ0IG1hcmdpbiBvZiBhcHBsaWNhdGlvbiBsYWJlbCB0ZXh0IC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfYXBwX2xhYmVsX2xlZnRfbWFyZ2luIj4xNmRpcDwvZGltZW4+CiAgICAgPCEtLSBNYXJnaW4gYmV0d2VlbiByZWNlbnRzIGNvbnRhaW5lciBhbmQgZ2xvdyBvbiB0aGUgcmlnaHQgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19yaWdodF9nbG93X21hcmdpbiI+MGRpcDwvZGltZW4+CiA8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtbGFyZ2UvY29uZmlnLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtbGFyZ2UvY29uZmlnLnhtbAppbmRleCAyOTlhYjk3Li40MDE0ZjhkIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWxhcmdlL2NvbmZpZy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1sYXJnZS9jb25maWcueG1sCkBAIC0yMCwxNCArMjAsNyBAQAogPCEtLSBUaGVzZSByZXNvdXJjZXMgYXJlIGFyb3VuZCBqdXN0IHRvIGFsbG93IHRoZWlyIHZhbHVlcyB0byBiZSBjdXN0b21pemVkCiAgICAgIGZvciBkaWZmZXJlbnQgaGFyZHdhcmUgYW5kIHByb2R1Y3QgYnVpbGRzLiAtLT4KIDxyZXNvdXJjZXM+Ci0gICAgPGludGVnZXIgbmFtZT0iY29uZmlnX3N0YXR1c19iYXJfcG9zaXRpb24iPjE8L2ludGVnZXI+Ci0KLSAgICA8IS0tIENvbXBvbmVudCB0byBiZSB1c2VkIGFzIHRoZSBzdGF0dXMgYmFyIHNlcnZpY2UuICBNdXN0IGltcGxlbWVudCB0aGUgSVN0YXR1c0JhcgotICAgICBpbnRlcmZhY2UuICBUaGlzIG5hbWUgaXMgaW4gdGhlIENvbXBvbmVudE5hbWUgZmxhdHRlbmVkIGZvcm1hdCAocGFja2FnZS9jbGFzcykgIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCIgdHJhbnNsYXRhYmxlPSJmYWxzZSI+Y29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXI8L3N0cmluZz4KLQogICAgIDwhLS0gV2hldGhlciBvciBub3Qgd2Ugc2hvdyB0aGUgbnVtYmVyIGluIHRoZSBiYXIuIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19zdGF0dXNCYXJTaG93TnVtYmVyIj5mYWxzZTwvYm9vbD4KLQogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtbGFyZ2UvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtbGFyZ2UvZGltZW5zLnhtbAppbmRleCBmOGE0YTFjLi45ZDg5ZTIxIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWxhcmdlL2RpbWVucy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1sYXJnZS9kaW1lbnMueG1sCkBAIC0yMiwzMiArMjIsNiBAQAogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3BhbmVsX2JvdHRvbV9vZmZzZXQiPjM2ZHA8L2RpbWVuPgogICAgIDwhLS0gZ2FwIG9uIGVpdGhlciBzaWRlIG9mIHN0YXR1cyBiYXIgbm90aWZpY2F0aW9uIGljb25zIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2ljb25fcGFkZGluZyI+OGRwPC9kaW1lbj4KLQotICAgIDwhLS0gUmVjZW50IEFwcGxpY2F0aW9ucyBwYXJhbWV0ZXJzIC0tPgotICAgIDwhLS0gV2lkdGggb2YgYSByZWNlbnQgYXBwIHZpZXcsIGluY2x1ZGluZyBhbGwgY29udGVudCAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF92aWV3X3dpZHRoIj4xNTZkcDwvZGltZW4+Ci0gICAgPCEtLSBIb3cgZmFyIHRoZSB0aHVtYm5haWwgZm9yIGEgcmVjZW50IGFwcCBhcHBlYXJzIGZyb20gbGVmdCBlZGdlIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2xlZnRfbWFyZ2luIj4xMTBkcDwvZGltZW4+Ci0gICAgPCEtLSBVcHBlciB3aWR0aCBsaW1pdCBmb3IgYXBwbGljYXRpb24gaWNvbiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9tYXhfd2lkdGgiPjY0ZHA8L2RpbWVuPgotICAgIDwhLS0gVXBwZXIgaGVpZ2h0IGxpbWl0IGZvciBhcHBsaWNhdGlvbiBpY29uIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX21heF9oZWlnaHQiPjY0ZHA8L2RpbWVuPgotICAgIDwhLS0gV2lkdGggb2Ygc2Nyb2xsYWJsZSBhcmVhIGluIHJlY2VudHMgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c193aWR0aCI+MzU2ZHA8L2RpbWVuPgotICAgIDwhLS0gVGh1bWJuYWlsIGJvcmRlciB3aWR0aCAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9ib3JkZXJfd2lkdGgiPjEyZHA8L2RpbWVuPgotICAgIDwhLS0gVGh1bWJuYWlsIGJvcmRlciBoZWlnaHQgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfYm9yZGVyX2hlaWdodCI+MTJkcDwvZGltZW4+Ci0gICAgPCEtLSBQYWRkaW5nIGZvciB0ZXh0IGRlc2NyaXB0aW9ucyAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RleHRfZGVzY3JpcHRpb25fcGFkZGluZyI+OGRwPC9kaW1lbj4KLSAgICA8IS0tIFNpemUgb2YgYXBwbGljYXRpb24gbGFiZWwgdGV4dCAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9sYWJlbF90ZXh0X3NpemUiPjE4ZGlwPC9kaW1lbj4KLSAgICA8IS0tIFNpemUgb2YgYXBwbGljYXRpb24gZGVzY3JpcHRpb24gdGV4dCAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9kZXNjcmlwdGlvbl90ZXh0X3NpemUiPjE4ZGlwPC9kaW1lbj4KLSAgICA8IS0tIFNpemUgb2YgZmFkaW5nIGVkZ2UgZm9yIHNjcm9sbCBlZmZlY3QgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19mYWRpbmdfZWRnZV9sZW5ndGgiPjIwZGlwPC9kaW1lbj4KLSAgICA8IS0tIE1hcmdpbiBiZXR3ZWVuIHJlY2VudHMgY29udGFpbmVyIGFuZCBnbG93IG9uIHRoZSByaWdodCAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3JpZ2h0X2dsb3dfbWFyZ2luIj4xMDBkaXA8L2RpbWVuPgogPC9yZXNvdXJjZXM+CiAKIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1tZHBpL2RpbWVucy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLW1kcGkvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDFiNzVhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1tZHBpL2RpbWVucy54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8IS0tIE9mZnNldHMgZm9yIHJlbmRlcmluZyB0aHVtYm5haWxzIG92ZXIgZHJhd2FibGUgcmVjZW50c190aHVtYm5haWxfYmcgLS0+CisgICAgPGRpbWVuIG5hbWU9InJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfbGVmdCI+NnB4PC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0icmVjZW50c190aHVtYm5haWxfYmdfcGFkZGluZ190b3AiPjdweDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfcmlnaHQiPjZweDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfYm90dG9tIj42cHg8L2RpbWVuPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXBvcnQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtcG9ydC9kaW1lbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzI1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXBvcnQvZGltZW5zLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChjKSAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+Cis8cmVzb3VyY2VzPgorICAgIDwhLS0gUmVjZW50IEFwcGxpY2F0aW9ucyBwYXJhbWV0ZXJzIC0tPgorICAgIDwhLS0gV2lkdGggb2YgYSByZWNlbnQgYXBwIHZpZXcsIGluY2x1ZGluZyBhbGwgY29udGVudCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF92aWV3X3dpZHRoIj4xNTZkcDwvZGltZW4+CisgICAgPCEtLSBIb3cgZmFyIHRoZSB0aHVtYm5haWwgZm9yIGEgcmVjZW50IGFwcCBhcHBlYXJzIGZyb20gbGVmdCBlZGdlIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2xlZnRfbWFyZ2luIj4xMTBkcDwvZGltZW4+CisgICAgPCEtLSBXaWR0aCBvZiBzY3JvbGxhYmxlIGFyZWEgaW4gcmVjZW50cyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3dpZHRoIj4zNTZkcDwvZGltZW4+CisgICAgPCEtLSBQYWRkaW5nIGZvciB0ZXh0IGRlc2NyaXB0aW9ucyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RleHRfZGVzY3JpcHRpb25fcGFkZGluZyI+OGRwPC9kaW1lbj4KKyAgICA8IS0tIFdpZHRoIG9mIGFwcGxpY2F0aW9uIGxhYmVsIHRleHQgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfd2lkdGgiPjk3ZGlwPC9kaW1lbj4KKyAgICA8IS0tIExlZnQgbWFyZ2luIG9mIGFwcGxpY2F0aW9uIGxhYmVsIHRleHQgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfbGVmdF9tYXJnaW4iPjE2ZGlwPC9kaW1lbj4KKyAgICA8IS0tIE1hcmdpbiBiZXR3ZWVuIHJlY2VudHMgY29udGFpbmVyIGFuZCBnbG93IG9uIHRoZSByaWdodCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3JpZ2h0X2dsb3dfbWFyZ2luIj4xMDBkaXA8L2RpbWVuPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXJ1LWxhcmdlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1ydS1sYXJnZS9zdHJpbmdzLnhtbAppbmRleCBjNDgzMjFlLi5iYWZiOTdmIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXJ1LWxhcmdlL3N0cmluZ3MueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtcnUtbGFyZ2Uvc3RyaW5ncy54bWwKQEAgLTE5LDExICsxOSwxMSBAQAogCiA8cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2NsZWFyX2FsbF9idXR0b24iIG1zZ2lkPSI0NjYxNTgzODk2ODAzMzQ5NzMyIj4i0J7Rh9C40YHRgtC40YLRjCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfY2xlYXJfYWxsX2J1dHRvbiIgbXNnaWQ9IjQ2NjE1ODM4OTY4MDMzNDk3MzIiPiLQntGH0LjRgdGC0LjRgtGMINCy0YHQtSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjM4MzE0NTE3ODc1NTMyOTA2NyI+ItCd0LXRgiDQv9C+0LTQutC70Y7Rh9C10L3QuNGPINC6INCY0L3RgtC10YDQvdC10YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2lnbmFsX21ldGVyX3dpZmlfbm9zc2lkIiBtc2dpZD0iMjUzNTQ2NTI5NDQzNzU4NjUyOCI+IldpLUZpOiDQv9C+0LTQutC70Y7Rh9C10L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Imdwc19ub3RpZmljYXRpb25fc2VhcmNoaW5nX3RleHQiIG1zZ2lkPSI0NDY3OTM1MTg2ODY0MjA4MjQ5Ij4i0JLRi9C/0L7Qu9C90Y/QtdGC0YHRjyDQv9C+0LjRgdC6INC/0YDQuCDQv9C+0LzQvtGJ0LggR1BTIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19zaWduYWxfbWV0ZXJfd2lmaV9ub3NzaWQiIG1zZ2lkPSIyNTM1NDY1Mjk0NDM3NTg2NTI4Ij4iV2ktRmkg0L/QvtC00LrQu9GO0YfQtdC90L4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJncHNfbm90aWZpY2F0aW9uX3NlYXJjaGluZ190ZXh0IiBtc2dpZD0iNDQ2NzkzNTE4Njg2NDIwODI0OSI+ItCf0L7QuNGB0LogR1BTIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZ3BzX25vdGlmaWNhdGlvbl9mb3VuZF90ZXh0IiBtc2dpZD0iNjI3MDYyODM4ODkxODgyMjk1NiI+ItCc0LXRgdGC0L7Qv9C+0LvQvtC20LXQvdC40LUg0YPRgdGC0LDQvdC+0LLQu9C10L3QviDRgSDQv9C+0LzQvtGJ0YzRjiBHUFMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJub3RpZmljYXRpb25zX29mZl90aXRsZSIgbXNnaWQ9IjE4NjAxMTc2OTYwMzQ3NzU4NTEiPiLQn9C+0LrQsNC3INGD0LLQtdC00L7QvNC70LXQvdC40Lkg0L7RgtC60LvRjtGH0LXQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im5vdGlmaWNhdGlvbnNfb2ZmX3RleHQiIG1zZ2lkPSIxNDM5MTUyODA2MzIwNzg2OTEyIj4i0J3QsNC20LzQuNGC0LUg0LfQtNC10YHRjCwg0YfRgtC+0LHRiyDRgdC90L7QstCwINGA0LDQt9GA0LXRiNC40YLRjCDQv9C+0LrQsNC3INGD0LLQtdC00L7QvNC70LXQvdC40LkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm90aWZpY2F0aW9uc19vZmZfdGl0bGUiIG1zZ2lkPSIxODYwMTE3Njk2MDM0Nzc1ODUxIj4i0KPQstC10LTQvtC80LvQtdC90LjRjyDQvtGC0LrQu9GO0YfQtdC90YsiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub3RpZmljYXRpb25zX29mZl90ZXh0IiBtc2dpZD0iMTQzOTE1MjgwNjMyMDc4NjkxMiI+ItCd0LDQttC80LjRgtC1INC30LTQtdGB0YwsINGH0YLQvtCx0Ysg0YHQvdC+0LLQsCDQstC60LvRjtGH0LjRgtGMINGD0LLQtdC00L7QvNC70LXQvdC40Y8uIjwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NjAwZHAtcG9ydC9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwLXBvcnQvY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjc2NjFhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwLXBvcnQvY29uZmlnLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorLyoKKyoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworLS0+CisKKzwhLS0gVGhlc2UgcmVzb3VyY2VzIGFyZSBhcm91bmQganVzdCB0byBhbGxvdyB0aGVpciB2YWx1ZXMgdG8gYmUgY3VzdG9taXplZAorICAgICBmb3IgZGlmZmVyZW50IGhhcmR3YXJlIGFuZCBwcm9kdWN0IGJ1aWxkcy4gLS0+Cis8cmVzb3VyY2VzPgorICAgIDxpbnRlZ2VyIG5hbWU9ImNvbmZpZ19tYXhOb3RpZmljYXRpb25JY29ucyI+MzwvaW50ZWdlcj4KKzwvcmVzb3VyY2VzPgorCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NjAwZHAtcG9ydC9kaW1lbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwLXBvcnQvZGltZW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGE2Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwLXBvcnQvZGltZW5zLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChjKSAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCistLT4KKzxyZXNvdXJjZXM+CisgICAgPCEtLSBnYXAgb24gZWl0aGVyIHNpZGUgb2Ygc3RhdHVzIGJhciBub3RpZmljYXRpb24gaWNvbnMgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9wYWRkaW5nIj4wZHA8L2RpbWVuPgorPC9yZXNvdXJjZXM+CisKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2NvbG9ycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NjAwZHAvY29sb3JzLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UvY29sb3JzLnhtbApyZW5hbWUgdG8gcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwL2NvbG9ycy54bWwKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmZDhhYgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCkBAIC0wLDAgKzEsNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8IS0tIFRoZSB3aWR0aCBvZiB0aGUgdGlja2VyLCBpbmNsdWRpbmcgdGhlIGljb24gLS0+CisgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl90aWNrZXJfd2lkdGgiPjM2MGRwPC9kaW1lbj4KKyAgICA8IS0tIFN0YXR1cyBiYXIgcGFuZWwgYm90dG9tIG9mZnNldCAoaGVpZ2h0IG9mIHN0YXR1cyBiYXIgLSBvdmVybGFwKSAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9wYW5lbF9ib3R0b21fb2Zmc2V0Ij4zNmRwPC9kaW1lbj4KKyAgICA8IS0tIGdhcCBvbiBlaXRoZXIgc2lkZSBvZiBzdGF0dXMgYmFyIG5vdGlmaWNhdGlvbiBpY29ucyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3BhZGRpbmciPjhkcDwvZGltZW4+CisgICAgPCEtLSBUaGUgd2lkdGggb2YgdGhlIG5vdGlmaWNhdGlvbiBwYW5lbCB3aW5kb3cgLS0+CisgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl9wYW5lbF93aWR0aCI+NTEyZHA8L2RpbWVuPgorICAgIDwhLS0gVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoZSBub3RpZmljYXRpb24gcGFuZWwgd2luZG93IC0tPgorICAgIDxkaW1lbiBuYW1lPSJub3RpZmljYXRpb25fcGFuZWxfbWluX2hlaWdodCI+NzcwZHA8L2RpbWVuPgorICAgIDwhLS0gQm90dG9tIG1hcmdpbiAoZnJvbSBkaXNwbGF5IGVkZ2UpIGZvciBzdGF0dXMgYmFyIHBhbmVscyAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGFuZWxfZmxvYXQiPjU2ZHA8L2RpbWVuPgorCisgICAgPCEtLSBSZWNlbnQgQXBwbGljYXRpb25zIHBhcmFtZXRlcnMgLS0+CisgICAgPCEtLSBXaWR0aCBvZiBhIHJlY2VudCBhcHAgdmlldywgaW5jbHVkaW5nIGFsbCBjb250ZW50IC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX3ZpZXdfd2lkdGgiPjE1NmRwPC9kaW1lbj4KKyAgICA8IS0tIEhvdyBmYXIgdGhlIHRodW1ibmFpbCBmb3IgYSByZWNlbnQgYXBwIGFwcGVhcnMgZnJvbSBsZWZ0IGVkZ2UgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfbGVmdF9tYXJnaW4iPjExMGRwPC9kaW1lbj4KKyAgICA8IS0tIFVwcGVyIHdpZHRoIGxpbWl0IGZvciBhcHBsaWNhdGlvbiBpY29uIC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX21heF93aWR0aCI+NjRkcDwvZGltZW4+CisgICAgPCEtLSBVcHBlciBoZWlnaHQgbGltaXQgZm9yIGFwcGxpY2F0aW9uIGljb24gLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfbWF4X2hlaWdodCI+NjRkcDwvZGltZW4+CisgICAgPCEtLSBXaWR0aCBvZiBzY3JvbGxhYmxlIGFyZWEgaW4gcmVjZW50cyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3dpZHRoIj4zNTZkcDwvZGltZW4+CisgICAgPCEtLSBQYWRkaW5nIGZvciB0ZXh0IGRlc2NyaXB0aW9ucyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RleHRfZGVzY3JpcHRpb25fcGFkZGluZyI+OGRwPC9kaW1lbj4KKyAgICA8IS0tIFNpemUgb2YgYXBwbGljYXRpb24gbGFiZWwgdGV4dCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9sYWJlbF90ZXh0X3NpemUiPjE4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFNpemUgb2YgYXBwbGljYXRpb24gZGVzY3JpcHRpb24gdGV4dCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9kZXNjcmlwdGlvbl90ZXh0X3NpemUiPjE4ZGlwPC9kaW1lbj4KKyAgICA8IS0tIFdpZHRoIG9mIGFwcGxpY2F0aW9uIGxhYmVsIHRleHQgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfd2lkdGgiPjk3ZGlwPC9kaW1lbj4KKyAgICA8IS0tIExlZnQgbWFyZ2luIGZvciBhcHBsaWNhdGlvbiBsYWJlbCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9sYWJlbF9sZWZ0X21hcmdpbiI+MTZkaXA8L2RpbWVuPgorICAgIDwhLS0gU2l6ZSBvZiBmYWRpbmcgZWRnZSBmb3Igc2Nyb2xsIGVmZmVjdCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2ZhZGluZ19lZGdlX2xlbmd0aCI+MjBkaXA8L2RpbWVuPgorICAgIDwhLS0gTWFyZ2luIGJldHdlZW4gcmVjZW50cyBjb250YWluZXIgYW5kIGdsb3cgb24gdGhlIHJpZ2h0IC0tPgorICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfcmlnaHRfZ2xvd19tYXJnaW4iPjEwMGRpcDwvZGltZW4+CisKKyAgICA8IS0tIE9mZnNldHMgZm9yIHJlbmRlcmluZyB0aHVtYm5haWxzIG92ZXIgZHJhd2FibGUgcmVjZW50c190aHVtYm5haWxfYmcgLS0+CisgICAgPGRpbWVuIG5hbWU9InJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfbGVmdCI+MTVweDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfdG9wIj44cHg8L2RpbWVuPgorICAgIDxkaW1lbiBuYW1lPSJyZWNlbnRzX3RodW1ibmFpbF9iZ19wYWRkaW5nX3JpZ2h0Ij4xMnB4PC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0icmVjZW50c190aHVtYm5haWxfYmdfcGFkZGluZ19ib3R0b20iPjhweDwvZGltZW4+CisKKyAgICA8IS0tIFdoZXJlIHRvIHBsYWNlIHRoZSBhcHAgaWNvbiBvdmVyIHRoZSB0aHVtYm5haWwgLS0+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19hcHBfaWNvbl9sZWZ0X21hcmdpbiI+MTNkcDwvZGltZW4+CisgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19hcHBfaWNvbl90b3BfbWFyZ2luIj4xM2RwPC9kaW1lbj4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzcyMGRwLXBvcnQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c3MjBkcC1wb3J0L2RpbWVucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRiMjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtc3c3MjBkcC1wb3J0L2RpbWVucy54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorPHJlc291cmNlcz4KKyAgICA8IS0tIGdhcCBvbiBlaXRoZXIgc2lkZSBvZiBzdGF0dXMgYmFyIG5vdGlmaWNhdGlvbiBpY29ucyAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3BhZGRpbmciPjJkcDwvZGltZW4+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzcyMGRwL2NvbmZpZy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXN3NzIwZHAvY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmI4ZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1zdzcyMGRwL2NvbmZpZy54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKy8qCisqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy0tPgorCis8IS0tIFRoZXNlIHJlc291cmNlcyBhcmUgYXJvdW5kIGp1c3QgdG8gYWxsb3cgdGhlaXIgdmFsdWVzIHRvIGJlIGN1c3RvbWl6ZWQKKyAgICAgZm9yIGRpZmZlcmVudCBoYXJkd2FyZSBhbmQgcHJvZHVjdCBidWlsZHMuIC0tPgorPHJlc291cmNlcz4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbWF4Tm90aWZpY2F0aW9uSWNvbnMiPjU8L2ludGVnZXI+Cis8L3Jlc291cmNlcz4KKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UtcG9ydC9kaW1lbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy14bGFyZ2UtcG9ydC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVmZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlLXBvcnQvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLS0tPgotPHJlc291cmNlcz4KLSAgICA8IS0tIGdhcCBvbiBlaXRoZXIgc2lkZSBvZiBzdGF0dXMgYmFyIG5vdGlmaWNhdGlvbiBpY29ucyAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9pY29uX3BhZGRpbmciPjJkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KLQotCi0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLXhsYXJnZS9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg5ZTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMteGxhcmdlL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICogQ29weXJpZ2h0IChjKSAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBUaGUgd2lkdGggb2YgdGhlIHRpY2tlciwgaW5jbHVkaW5nIHRoZSBpY29uIC0tPgotICAgIDxkaW1lbiBuYW1lPSJub3RpZmljYXRpb25fdGlja2VyX3dpZHRoIj4zNjBkcDwvZGltZW4+Ci0gICAgPCEtLSBTdGF0dXMgYmFyIHBhbmVsIGJvdHRvbSBvZmZzZXQgKGhlaWdodCBvZiBzdGF0dXMgYmFyIC0gb3ZlcmxhcCkgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcGFuZWxfYm90dG9tX29mZnNldCI+MzZkcDwvZGltZW4+Ci0gICAgPCEtLSBnYXAgb24gZWl0aGVyIHNpZGUgb2Ygc3RhdHVzIGJhciBub3RpZmljYXRpb24gaWNvbnMgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfaWNvbl9wYWRkaW5nIj44ZHA8L2RpbWVuPgotPC9yZXNvdXJjZXM+Ci0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCBmYjJmN2Q2My4uNTI5MTYyOSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9hdHRycy54bWwKQEAgLTI0LDUgKzI0LDggQEAKICAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTm90aWZpY2F0aW9uTGluZWFyTGF5b3V0Ij4KICAgICAgICAgPGF0dHIgbmFtZT0iaW5zZXRMZWZ0IiBmb3JtYXQ9ImRpbWVuc2lvbiIgLz4KICAgICA8L2RlY2xhcmUtc3R5bGVhYmxlPgorICAgIDxkZWNsYXJlLXN0eWxlYWJsZSBuYW1lPSJOb3RpZmljYXRpb25Sb3dMYXlvdXQiPgorICAgICAgICA8YXR0ciBuYW1lPSJyb3dIZWlnaHQiIGZvcm1hdD0iZGltZW5zaW9uIiAvPgorICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+CiA8L3Jlc291cmNlcz4KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9jb25maWcueG1sCmluZGV4IDk1NGE4NzEuLjdhNGFjNWQgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvY29uZmlnLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2NvbmZpZy54bWwKQEAgLTI1LDE2ICsyNSwxNCBAQAogICAgIGRhdGEgaWNvbiBvbiBkZXZpY2VzIC0tPgogICAgIDxib29sIG5hbWU9ImNvbmZpZ19oc3BhX2RhdGFfZGlzdGluZ3Vpc2hhYmxlIj5mYWxzZTwvYm9vbD4KIAotICAgIDwhLS0gVGhlIGxvY2F0aW9uIG9mIHRoZSBzdGF0dXMgYmFyLgotICAgICAgICAwIC0gdG9wCi0gICAgICAgIDEgLSBib3R0b20KLSAgICAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfc3RhdHVzX2Jhcl9wb3NpdGlvbiI+MDwvaW50ZWdlcj4KLQogICAgIDwhLS0gQ29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIHN0YXR1cyBiYXIgc2VydmljZS4gIE11c3QgaW1wbGVtZW50IHRoZSBJU3RhdHVzQmFyCiAgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+CiAgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3RhdHVzQmFyQ29tcG9uZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmUuUGhvbmVTdGF0dXNCYXI8L3N0cmluZz4KIAorICAgIDwhLS0gQ29tcG9uZW50IHRvIGJlIHVzZWQgYXMgdGhlIHN5c3RlbSBiYXIgc2VydmljZS4gIE11c3QgaW1wbGVtZW50IHRoZSBJU3RhdHVzQmFyCisgICAgIGludGVyZmFjZS4gIFRoaXMgbmFtZSBpcyBpbiB0aGUgQ29tcG9uZW50TmFtZSBmbGF0dGVuZWQgZm9ybWF0IChwYWNrYWdlL2NsYXNzKSAgLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb25maWdfc3lzdGVtQmFyQ29tcG9uZW50IiB0cmFuc2xhdGFibGU9ImZhbHNlIj5jb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0LlRhYmxldFN0YXR1c0Jhcjwvc3RyaW5nPgorCiAgICAgPCEtLSBXaGV0aGVyIG9yIG5vdCB3ZSBzaG93IHRoZSBudW1iZXIgaW4gdGhlIGJhci4gLS0+CiAgICAgPGJvb2wgbmFtZT0iY29uZmlnX3N0YXR1c0JhclNob3dOdW1iZXIiPnRydWU8L2Jvb2w+CiAKQEAgLTQyLDUgKzQwLDggQEAKICAgICAgICAgIGF1dG9kZXRlY3RlZCBmcm9tIHRoZSBDb25maWd1cmF0aW9uLiAtLT4KICAgICA8Ym9vbCBuYW1lPSJjb25maWdfc2hvd05hdmlnYXRpb25CYXIiPmZhbHNlPC9ib29sPgogCisgICAgPCEtLSBIb3cgbWFueSBpY29ucyBtYXkgYmUgc2hvd24gYXQgb25jZSBpbiB0aGUgc3lzdGVtIGJhci4gSW5jbHVkZXMgYW55CisgICAgICAgICBzbG90cyB0aGF0IG1heSBiZSByZXVzZWQgZm9yIHRoaW5ncyBsaWtlIElNRSBjb250cm9sLiAtLT4KKyAgICA8aW50ZWdlciBuYW1lPSJjb25maWdfbWF4Tm90aWZpY2F0aW9uSWNvbnMiPjU8L2ludGVnZXI+CiA8L3Jlc291cmNlcz4KIApkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmluZGV4IDY1N2RjNDYuLmZjMzVhNDggMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvZGltZW5zLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL2RpbWVucy54bWwKQEAgLTIwLDIyICsyMCwxNCBAQAogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX2VkZ2VfaWdub3JlIj41ZHA8L2RpbWVuPgogCiAgICAgPCEtLSBSZWNlbnQgQXBwbGljYXRpb25zIHBhcmFtZXRlcnMgLS0+Ci0gICAgPCEtLSBXaWR0aCBvZiBhIHJlY2VudCBhcHAgdmlldywgaW5jbHVkaW5nIGFsbCBjb250ZW50IC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX3ZpZXdfd2lkdGgiPjE1NmRwPC9kaW1lbj4KLSAgICA8IS0tIEhvdyBmYXIgdGhlIHRodW1ibmFpbCBmb3IgYSByZWNlbnQgYXBwIGFwcGVhcnMgZnJvbSBsZWZ0IGVkZ2UgLS0+Ci0gICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfbGVmdF9tYXJnaW4iPjExMGRwPC9kaW1lbj4KICAgICA8IS0tIFVwcGVyIHdpZHRoIGxpbWl0IGZvciBhcHBsaWNhdGlvbiBpY29uIC0tPgogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX21heF93aWR0aCI+NjRkcDwvZGltZW4+CiAgICAgPCEtLSBVcHBlciBoZWlnaHQgbGltaXQgZm9yIGFwcGxpY2F0aW9uIGljb24gLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c190aHVtYm5haWxfbWF4X2hlaWdodCI+NjRkcDwvZGltZW4+Ci0gICAgPCEtLSBXaWR0aCBvZiBzY3JvbGxhYmxlIGFyZWEgaW4gcmVjZW50cyAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3dpZHRoIj4zNTZkcDwvZGltZW4+Ci0gICAgPCEtLSBUaHVtYm5haWwgYm9yZGVyIHdpZHRoIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGh1bWJuYWlsX2JvcmRlcl93aWR0aCI+MTJkcDwvZGltZW4+Ci0gICAgPCEtLSBUaHVtYm5haWwgYm9yZGVyIGhlaWdodCAtLT4KLSAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX3RodW1ibmFpbF9ib3JkZXJfaGVpZ2h0Ij4xMmRwPC9kaW1lbj4KLSAgICA8IS0tIFBhZGRpbmcgZm9yIHRleHQgZGVzY3JpcHRpb25zIC0tPgotICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfdGV4dF9kZXNjcmlwdGlvbl9wYWRkaW5nIj44ZHA8L2RpbWVuPgorICAgIDwhLS0gV2hlcmUgdG8gcGxhY2UgdGhlIGFwcCBpY29uIG92ZXIgdGhlIHRodW1ibmFpbCAtLT4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9pY29uX2xlZnRfbWFyZ2luIj4xM2RwPC9kaW1lbj4KKyAgICA8ZGltZW4gbmFtZT0ic3RhdHVzX2Jhcl9yZWNlbnRzX2FwcF9pY29uX3RvcF9tYXJnaW4iPjEzZHA8L2RpbWVuPgorCiAgICAgPCEtLSBTaXplIG9mIGFwcGxpY2F0aW9uIGxhYmVsIHRleHQgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19hcHBfbGFiZWxfdGV4dF9zaXplIj4xOGRpcDwvZGltZW4+CiAgICAgPCEtLSBTaXplIG9mIGFwcGxpY2F0aW9uIGRlc2NyaXB0aW9uIHRleHQgLS0+CkBAIC00NCw4ICszNiwxMyBAQAogICAgIDxkaW1lbiBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudHNfZmFkaW5nX2VkZ2VfbGVuZ3RoIj4yMGRpcDwvZGltZW4+CiAgICAgPCEtLSBNYXJnaW4gYmV0d2VlbiByZWNlbnRzIGNvbnRhaW5lciBhbmQgZ2xvdyBvbiB0aGUgcmlnaHQgLS0+CiAgICAgPGRpbWVuIG5hbWU9InN0YXR1c19iYXJfcmVjZW50c19yaWdodF9nbG93X21hcmdpbiI+MTAwZGlwPC9kaW1lbj4KKyAgICA8IS0tIEFtb3VudCB0byBvZmZzZXQgYm90dG9tIG9mIG5vdGlmaWNhdGlvbiBwZWVrIHdpbmRvdyBmcm9tIHRvcCBvZiBzdGF0dXMgYmFyLiAtLT4KKyAgICA8ZGltZW4gbmFtZT0icGVla193aW5kb3dfeV9vZmZzZXQiPi0xMmRwPC9kaW1lbj4KIAogICAgIDwhLS0gdGhpY2tuZXNzIChoZWlnaHQpIG9mIHRoZSBuYXZpZ2F0aW9uIGJhciBvbiBwaG9uZXMgdGhhdCByZXF1aXJlIGl0IC0tPgogICAgIDxkaW1lbiBuYW1lPSJuYXZpZ2F0aW9uX2Jhcl9zaXplIj40MmRwPC9kaW1lbj4KKworICAgIDwhLS0gdGhpY2tuZXNzIChoZWlnaHQpIG9mIGVhY2ggbm90aWZpY2F0aW9uIHJvdywgaW5jbHVkaW5nIGFueSBzZXBhcmF0b3JzIG9yIHBhZGRpbmcgLS0+CisgICAgPGRpbWVuIG5hbWU9Im5vdGlmaWNhdGlvbl9oZWlnaHQiPjY1ZHA8L2RpbWVuPgogPC9yZXNvdXJjZXM+CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDQ0NjgyN2IuLjg2ZTBjZDAgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMTQzLDQgKzE0MywyNiBAQAogICAgIDwhLS0gQ2hlY2tib3ggbGFiZWwgZm9yIFVTQiBhY2Nlc3NvcnkgZGlhbG9ncy4gIFtDSEFSIExJTUlUPTUwXSAtLT4KICAgICA8c3RyaW5nIG5hbWU9ImFsd2F5c191c2VfYWNjZXNzb3J5Ij5Vc2UgYnkgZGVmYXVsdCBmb3IgdGhpcyBVU0IgYWNjZXNzb3J5PC9zdHJpbmc+CiAKKyAgICA8IS0tIENoZWNrYm94IGxhYmVsIGZvciBhcHBsaWNhdGlvbiBjb21wYXRpYmlsaXR5IG1vZGUgT04gKHpvb21pbmcgYXBwIHRvIGxvb2sgbGlrZSBpdCdzIHJ1bm5pbmcKKyAgICAgICAgIG9uIGEgcGhvbmUpLiAgW0NIQVIgTElNSVQ9MjVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29tcGF0X21vZGVfb24iPlpvb20gdG8gZmlsbCBzY3JlZW48L3N0cmluZz4KKworICAgIDwhLS0gQ2hlY2tib3ggbGFiZWwgZm9yIGFwcGxpY2F0aW9uIGNvbXBhdGliaWxpdHkgbW9kZSBPRkYgKG5vcm1hbCBtb2RlIG9uIHRhYmxldHMpLgorICAgICAgICAgW0NIQVIgTElNSVQ9MjVdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29tcGF0X21vZGVfb2ZmIj5TdHJldGNoIHRvIGZpbGwgc2NyZWVuPC9zdHJpbmc+CisgICAgCisgICAgPCEtLSBDb21wYXRpYmlsaXR5IG1vZGUgaGVscCBzY3JlZW46IGhlYWRlciB0ZXh0LiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJjb21wYXRfbW9kZV9oZWxwX2hlYWRlciI+Q29tcGF0aWJpbGl0eSBab29tPC9zdHJpbmc+CisKKyAgICA8IS0tIENvbXBhdGliaWxpdHkgbW9kZSBoZWxwIHNjcmVlbjogYm9keSB0ZXh0LiBbQ0hBUiBMSU1JVD0xNTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iY29tcGF0X21vZGVfaGVscF9ib2R5Ij5XaGVuIGFuIGFwcCB3YXMgZGVzaWduZWQgZm9yIGEgc21hbGxlciBzY3JlZW4sIGEgem9vbSBjb250cm9sIHdpbGwgYXBwZWFyIGJ5IHRoZSBjbG9jay48L3N0cmluZz4KKworICAgIDwhLS0gVGl0bGUgZm9yIHRoZSBVU0IgZnVuY3Rpb24gY2hvb3NlciBpbiBVc2JQcmVmZXJlbmNlQWN0aXZpdHkuIFtDSEFSIExJTUlUPTMwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9wcmVmZXJlbmNlX3RpdGxlIj5VU0IgZmlsZSB0cmFuc2ZlciBvcHRpb25zPC9zdHJpbmc+CisgICAgPCEtLSBMYWJlbCBmb3IgdGhlIE1UUCBVU0IgZnVuY3Rpb24gaW4gVXNiUHJlZmVyZW5jZUFjdGl2aXR5LiBbQ0hBUiBMSU1JVD01MF0gLS0+CisgICAgPHN0cmluZyBuYW1lPSJ1c2VfbXRwX2J1dHRvbl90aXRsZSI+TW91bnQgYXMgYSBtZWRpYSBwbGF5ZXIgKE1UUCk8L3N0cmluZz4KKyAgICA8IS0tIExhYmVsIGZvciB0aGUgUFRQIFVTQiBmdW5jdGlvbiBpbiBVc2JQcmVmZXJlbmNlQWN0aXZpdHkuIFtDSEFSIExJTUlUPTUwXSAtLT4KKyAgICA8c3RyaW5nIG5hbWU9InVzZV9wdHBfYnV0dG9uX3RpdGxlIj5Nb3VudCBhcyBhIGNhbWVyYSAoUFRQKTwvc3RyaW5nPgorICAgIDwhLS0gTGFiZWwgZm9yIHRoZSBpbnN0YWxsZXIgQ0QgaW1hZ2Ugb3B0aW9uIGluIFVzYlByZWZlcmVuY2VBY3Rpdml0eS4gW0NIQVIgTElNSVQ9NTBdIC0tPgorICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbGVyX2NkX2J1dHRvbl90aXRsZSI+SW5zdGFsbCBBbmRyb2lkIEZpbGUgVHJhbnNmZXIgYXBwbGljYXRpb24gZm9yIE1hYzwvc3RyaW5nPgogPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggODZmZmI0ZC4uOTFhODg1NSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMTYsMjUgKzE2LDI1IEBACiAKIDxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KIAotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIuVGl0bGUiIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRpdGxlIiBwYXJlbnQ9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGw8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JQcmltYXJ5PC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLkludHJ1ZGVyQWxlcnQiCi0gICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgcGFyZW50PSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KICAgICA8L3N0eWxlPgogCiAgICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLlN0YXR1c0Jhci5TeXN0ZW1QYW5lbCIKLSAgICAgICAgcGFyZW50PSJAYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgorICAgICAgICBwYXJlbnQ9IkAqYW5kcm9pZDpzdHlsZS9UZXh0QXBwZWFyYW5jZS5TdGF0dXNCYXIiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+bm9ybWFsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+I0ZGODA4MDgwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyLlRleHRCdXR0b24iCi0gICAgICAgIHBhcmVudD0iQGFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KKyAgICAgICAgcGFyZW50PSJAKmFuZHJvaWQ6c3R5bGUvVGV4dEFwcGVhcmFuY2UuU3RhdHVzQmFyIj4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZTwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPm5vcm1hbDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Q29sb3IiPiNGRkZGRkZGRjwvaXRlbT4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9TeXN0ZW1VSVNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9TeXN0ZW1VSVNlcnZpY2UuamF2YQppbmRleCA4NzBhY2QzLi5kN2E1MDU2IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvU3lzdGVtVUlTZXJ2aWNlLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL1N5c3RlbVVJU2VydmljZS5qYXZhCkBAIC0yNyw3ICsyNywxMCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CiAKIHB1YmxpYyBjbGFzcyBTeXN0ZW1VSVNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1VSVNlcnZpY2UiOwpAQCAtMzYsNyArMzksNyBAQAogICAgICAqIFRoZSBjbGFzcyBuYW1lcyBvZiB0aGUgc3R1ZmYgdG8gc3RhcnQuCiAgICAgICovCiAgICAgZmluYWwgT2JqZWN0W10gU0VSVklDRVMgPSBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgUi5zdHJpbmcuY29uZmlnX3N0YXR1c0JhckNvbXBvbmVudCwKKyAgICAgICAgICAgIDAsIC8vIHN5c3RlbSBiYXIgb3Igc3RhdHVzIGJhciwgZmlsbGVkIGluIGJlbG93LgogICAgICAgICAgICAgY29tLmFuZHJvaWQuc3lzdGVtdWkucG93ZXIuUG93ZXJVSS5jbGFzcywKICAgICAgICAgfTsKIApAQCAtNjIsNiArNjUsMTcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKCkgeworICAgICAgICAvLyBQaWNrIHN0YXR1cyBiYXIgb3Igc3lzdGVtIGJhci4KKyAgICAgICAgSVdpbmRvd01hbmFnZXIgd20gPSBJV2luZG93TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU0VSVklDRVNbMF0gPSB3bS5jYW5TdGF0dXNCYXJIaWRlKCkKKyAgICAgICAgICAgICAgICAgICAgPyBSLnN0cmluZy5jb25maWdfc3RhdHVzQmFyQ29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgIDogUi5zdHJpbmcuY29uZmlnX3N5c3RlbUJhckNvbXBvbmVudDsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJGYWlsaW5nIGNoZWNraW5nIHdoZXRoZXIgc3RhdHVzIGJhciBjYW4gaGlkZSIsIGUpOworICAgICAgICB9CisKICAgICAgICAgZmluYWwgaW50IE4gPSBTRVJWSUNFUy5sZW5ndGg7CiAgICAgICAgIG1TZXJ2aWNlcyA9IG5ldyBTeXN0ZW1VSVtOXTsKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9DaG9yZW9ncmFwaGVyLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L0Nob3Jlb2dyYXBoZXIuamF2YQppbmRleCBiODc2MDc1Li40OWE2NWQ4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L0Nob3Jlb2dyYXBoZXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L0Nob3Jlb2dyYXBoZXIuamF2YQpAQCAtMzYsMTQgKzM2LDE2IEBACiAgICAgVmlldyBtU2NyaW1WaWV3OwogICAgIFZpZXcgbUNvbnRlbnRWaWV3OwogICAgIEFuaW1hdG9yU2V0IG1Db250ZW50QW5pbTsKKyAgICBBbmltYXRvci5BbmltYXRvckxpc3RlbmVyIG1MaXN0ZW5lcjsKIAogICAgIC8vIHRoZSBwYW5lbCB3aWxsIHN0YXJ0IHRvIGFwcGVhciB0aGlzIG1hbnkgcHggZnJvbSB0aGUgZW5kCiAgICAgZmluYWwgaW50IEhZUEVSU1BBQ0VfT0ZGUkFNUCA9IDIwMDsKIAotICAgIHB1YmxpYyBDaG9yZW9ncmFwaGVyKFZpZXcgcm9vdCwgVmlldyBzY3JpbSwgVmlldyBjb250ZW50KSB7CisgICAgcHVibGljIENob3Jlb2dyYXBoZXIoVmlldyByb290LCBWaWV3IHNjcmltLCBWaWV3IGNvbnRlbnQsIEFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgbVJvb3RWaWV3ID0gcm9vdDsKICAgICAgICAgbVNjcmltVmlldyA9IHNjcmltOwogICAgICAgICBtQ29udGVudFZpZXcgPSBjb250ZW50OworICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKICAgICB2b2lkIGNyZWF0ZUFuaW1hdGlvbihib29sZWFuIGFwcGVhcmluZykgewpAQCAtODYsNiArODgsOSBAQAogICAgICAgICAgICAgICAgIC53aXRoKHBvc0FuaW0pOwogICAgICAgICBtQ29udGVudEFuaW0uc2V0RHVyYXRpb24oYXBwZWFyaW5nID8gT1BFTl9EVVJBVElPTiA6IENMT1NFX0RVUkFUSU9OKTsKICAgICAgICAgbUNvbnRlbnRBbmltLmFkZExpc3RlbmVyKHRoaXMpOworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db250ZW50QW5pbS5hZGRMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzdGFydEFuaW1hdGlvbihib29sZWFuIGFwcGVhcmluZykgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRzSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50c0hvcml6b250YWxTY3JvbGxWaWV3LmphdmEKaW5kZXggMTk0YzlkMS4uM2RiY2M1OSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRzSG9yaXpvbnRhbFNjcm9sbFZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudHNIb3Jpem9udGFsU2Nyb2xsVmlldy5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50OwogCi1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudHNQYW5lbFZpZXcuQWN0dml0eURlc2NyaXB0aW9uQWRhcHRlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5yZWNlbnQuUmVjZW50c1BhbmVsVmlldy5BY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcjsKIAogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yLkFuaW1hdG9yTGlzdGVuZXI7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgVEhSRVNISE9MRCA9IDUwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfSU5WQUxJREFURSA9IGZhbHNlOwogICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1MaW5lYXJMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBBY3R2aXR5RGVzY3JpcHRpb25BZGFwdGVyIG1BZGFwdGVyOworICAgIHByaXZhdGUgQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIgbUFkYXB0ZXI7CiAgICAgcHJpdmF0ZSBSZWNlbnRzQ2FsbGJhY2sgbUNhbGxiYWNrOwogICAgIHByb3RlY3RlZCBpbnQgbUxhc3RTY3JvbGxQb3NpdGlvbjsKICAgICBwcml2YXRlIFZpZXcgbUN1cnJlbnRWaWV3OwpAQCAtMjczLDcgKzI3Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKEFjdHZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIgYWRhcHRlcikgeworICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIgYWRhcHRlcikgewogICAgICAgICBtQWRhcHRlciA9IGFkYXB0ZXI7CiAgICAgICAgIG1BZGFwdGVyLnJlZ2lzdGVyRGF0YVNldE9ic2VydmVyKG5ldyBEYXRhU2V0T2JzZXJ2ZXIoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoKSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudHNQYW5lbFZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50c1BhbmVsVmlldy5qYXZhCmluZGV4IGUyYjM0NDYuLmI4ZGM2M2QgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50c1BhbmVsVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvUmVjZW50c1BhbmVsVmlldy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkxheW91dFRyYW5zaXRpb247CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtNTIsMjcgKzUzLDMzIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5TdGF0dXNCYXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBob25lLlBob25lU3RhdHVzQmFyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci50YWJsZXQuU3RhdHVzQmFyUGFuZWw7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnRhYmxldC5UYWJsZXRTdGF0dXNCYXI7CiAKIHB1YmxpYyBjbGFzcyBSZWNlbnRzUGFuZWxWaWV3IGV4dGVuZHMgUmVsYXRpdmVMYXlvdXQKLSAgICAgICAgaW1wbGVtZW50cyBPbkl0ZW1DbGlja0xpc3RlbmVyLCBSZWNlbnRzQ2FsbGJhY2ssIFN0YXR1c0JhclBhbmVsIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0xPV19QQURESU5HID0gMTU7CisgICAgICAgIGltcGxlbWVudHMgT25JdGVtQ2xpY2tMaXN0ZW5lciwgUmVjZW50c0NhbGxiYWNrLCBTdGF0dXNCYXJQYW5lbCwgQW5pbWF0b3IuQW5pbWF0b3JMaXN0ZW5lciB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmVjZW50c0xpc3RWaWV3IjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFRhYmxldFN0YXR1c0Jhci5ERUJVRzsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFRhYmxldFN0YXR1c0Jhci5ERUJVRyB8fCBQaG9uZVN0YXR1c0Jhci5ERUJVRzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTUExBWV9UQVNLUyA9IDIwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVEFTS1MgPSBESVNQTEFZX1RBU0tTICsgMTsgLy8gYWxsb3cgZXh0cmEgZm9yIG5vbi1hcHBzCi0gICAgcHJpdmF0ZSBUYWJsZXRTdGF0dXNCYXIgbUJhcjsKKyAgICBwcml2YXRlIFN0YXR1c0JhciBtQmFyOwogICAgIHByaXZhdGUgQXJyYXlMaXN0PEFjdGl2aXR5RGVzY3JpcHRpb24+IG1BY3Rpdml0eURlc2NyaXB0aW9uczsKICAgICBwcml2YXRlIGludCBtSWNvbkRwaTsKICAgICBwcml2YXRlIFZpZXcgbVJlY2VudHNTY3JpbTsKICAgICBwcml2YXRlIFZpZXcgbVJlY2VudHNHbG93VmlldzsKICAgICBwcml2YXRlIFZpZXcgbVJlY2VudHNDb250YWluZXI7CiAgICAgcHJpdmF0ZSBCaXRtYXAgbUdsb3dCaXRtYXA7CisgICAgLy8gVE9ETzogYWRkIHRoZXNlIHdpZGdldHMgYXR0cmlidXRlcyB0byB0aGUgbGF5b3V0IGZpbGUKKyAgICBwcml2YXRlIGludCBtR2xvd0JpdG1hcFBhZGRpbmdMZWZ0UHg7CisgICAgcHJpdmF0ZSBpbnQgbUdsb3dCaXRtYXBQYWRkaW5nVG9wUHg7CisgICAgcHJpdmF0ZSBpbnQgbUdsb3dCaXRtYXBQYWRkaW5nUmlnaHRQeDsKKyAgICBwcml2YXRlIGludCBtR2xvd0JpdG1hcFBhZGRpbmdCb3R0b21QeDsKICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmc7CiAgICAgcHJpdmF0ZSBDaG9yZW9ncmFwaGVyIG1DaG9yZW87CiAgICAgcHJpdmF0ZSBWaWV3IG1SZWNlbnRzRGlzbWlzc0J1dHRvbjsKLSAgICBwcml2YXRlIEFjdHZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIgbUxpc3RBZGFwdGVyOworICAgIHByaXZhdGUgQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIgbUxpc3RBZGFwdGVyOwogCiAgICAgLyogcGFja2FnZSAqLyBmaW5hbCBzdGF0aWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbiB7CiAgICAgICAgIGludCB0YXNrSWQ7IC8vIGFwcGxpY2F0aW9uIHRhc2sgaWQgZm9yIGN1cmF0aW5nIGFwcHMKQEAgLTEwOCwxMCArMTE1LDEwIEBACiAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gYWN0aXZpdHlEZXNjcmlwdGlvbjsKICAgICB9CiAKLSAgICAvKiBwYWNrYWdlICovIGZpbmFsIGNsYXNzIEFjdHZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7CisgICAgLyogcGFja2FnZSAqLyBmaW5hbCBjbGFzcyBBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKICAgICAgICAgcHJpdmF0ZSBMYXlvdXRJbmZsYXRlciBtSW5mbGF0ZXI7CiAKLSAgICAgICAgcHVibGljIEFjdHZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHB1YmxpYyBBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgICAgIG1JbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CiAgICAgICAgIH0KIApAQCAtMTgzLDYgKzE5MCwyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25DYW5jZWwoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgIGlmIChtU2hvd2luZykgeworICAgICAgICAgICAgZmluYWwgTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uZXIgPSBuZXcgTGF5b3V0VHJhbnNpdGlvbigpOworICAgICAgICAgICAgKChWaWV3R3JvdXApbVJlY2VudHNDb250YWluZXIpLnNldExheW91dFRyYW5zaXRpb24odHJhbnNpdGlvbmVyKTsKKyAgICAgICAgICAgIGNyZWF0ZUN1c3RvbUFuaW1hdGlvbnModHJhbnNpdGlvbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgoVmlld0dyb3VwKW1SZWNlbnRzQ29udGFpbmVyKS5zZXRMYXlvdXRUcmFuc2l0aW9uKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICB9CisKKwogICAgIC8qKgogICAgICAqIFdlIG5lZWQgdG8gYmUgYWxpZ25lZCBhdCB0aGUgYm90dG9tLiAgTGluZWFyTGF5b3V0IGNhbid0IGRvIHRoaXMsIHNvIGluc3RlYWQsCiAgICAgICogbGV0IExpbmVhckxheW91dCBkbyBhbGwgdGhlIGhhcmQgd29yaywgYW5kIHRoZW4gc2hpZnQgZXZlcnl0aGluZyBkb3duIHRvIHRoZSBib3R0b20uCkBAIC0yMDEsNyArMjI4LDcgQEAKICAgICAgICAgcmV0dXJuIG1TaG93aW5nOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldEJhcihUYWJsZXRTdGF0dXNCYXIgYmFyKSB7CisgICAgcHVibGljIHZvaWQgc2V0QmFyKFN0YXR1c0JhciBiYXIpIHsKICAgICAgICAgbUJhciA9IGJhcjsKICAgICB9CiAKQEAgLTIxNyw3ICsyNDQsMTYgQEAKICAgICAgICAgICAgICAgICAmIENvbmZpZ3VyYXRpb24uU0NSRUVOTEFZT1VUX1NJWkVfTUFTSykgPT0gQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9YTEFSR0U7CiAKICAgICAgICAgbUljb25EcGkgPSB4bGFyZ2UgPyBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0hJR0ggOiByZXMuZ2V0RGlzcGxheU1ldHJpY3MoKS5kZW5zaXR5RHBpOworCiAgICAgICAgIG1HbG93Qml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVSZXNvdXJjZShyZXMsIFIuZHJhd2FibGUucmVjZW50c190aHVtYm5haWxfYmcpOworICAgICAgICBtR2xvd0JpdG1hcFBhZGRpbmdMZWZ0UHggPQorICAgICAgICAgICAgICAgIHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5yZWNlbnRzX3RodW1ibmFpbF9iZ19wYWRkaW5nX2xlZnQpOworICAgICAgICBtR2xvd0JpdG1hcFBhZGRpbmdUb3BQeCA9CisgICAgICAgICAgICAgICAgcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfdG9wKTsKKyAgICAgICAgbUdsb3dCaXRtYXBQYWRkaW5nUmlnaHRQeCA9CisgICAgICAgICAgICAgICAgcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfcmlnaHQpOworICAgICAgICBtR2xvd0JpdG1hcFBhZGRpbmdCb3R0b21QeCA9CisgICAgICAgICAgICAgICAgcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLnJlY2VudHNfdGh1bWJuYWlsX2JnX3BhZGRpbmdfYm90dG9tKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIyNSw3ICsyNjEsNyBAQAogICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKICAgICAgICAgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsKICAgICAgICAgbVJlY2VudHNDb250YWluZXIgPSBmaW5kVmlld0J5SWQoUi5pZC5yZWNlbnRzX2NvbnRhaW5lcik7Ci0gICAgICAgIG1MaXN0QWRhcHRlciA9IG5ldyBBY3R2aXR5RGVzY3JpcHRpb25BZGFwdGVyKG1Db250ZXh0KTsKKyAgICAgICAgbUxpc3RBZGFwdGVyID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKG1Db250ZXh0KTsKICAgICAgICAgaWYgKG1SZWNlbnRzQ29udGFpbmVyIGluc3RhbmNlb2YgUmVjZW50c0xpc3RWaWV3KSB7CiAgICAgICAgICAgICBSZWNlbnRzTGlzdFZpZXcgbGlzdFZpZXcgPSAoUmVjZW50c0xpc3RWaWV3KSBtUmVjZW50c0NvbnRhaW5lcjsKICAgICAgICAgICAgIGxpc3RWaWV3LnNldEFkYXB0ZXIobUxpc3RBZGFwdGVyKTsKQEAgLTI0NiwxMyArMjgyLDEwIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtaXNzaW5nIFJlY2VudHNMaXN0Vmlldy9SZWNlbnRzU2Nyb2xsVmlldyIpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgTGF5b3V0VHJhbnNpdGlvbiB0cmFuc2l0aW9uZXIgPSBuZXcgTGF5b3V0VHJhbnNpdGlvbigpOwotICAgICAgICAoKFZpZXdHcm91cCltUmVjZW50c0NvbnRhaW5lcikuc2V0TGF5b3V0VHJhbnNpdGlvbih0cmFuc2l0aW9uZXIpOwotICAgICAgICBjcmVhdGVDdXN0b21BbmltYXRpb25zKHRyYW5zaXRpb25lcik7CiAKICAgICAgICAgbVJlY2VudHNHbG93VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLnJlY2VudHNfZ2xvdyk7CiAgICAgICAgIG1SZWNlbnRzU2NyaW0gPSAoVmlldykgZmluZFZpZXdCeUlkKFIuaWQucmVjZW50c19iZ19wcm90ZWN0KTsKLSAgICAgICAgbUNob3JlbyA9IG5ldyBDaG9yZW9ncmFwaGVyKHRoaXMsIG1SZWNlbnRzU2NyaW0sIG1SZWNlbnRzR2xvd1ZpZXcpOworICAgICAgICBtQ2hvcmVvID0gbmV3IENob3Jlb2dyYXBoZXIodGhpcywgbVJlY2VudHNTY3JpbSwgbVJlY2VudHNHbG93VmlldywgdGhpcyk7CiAgICAgICAgIG1SZWNlbnRzRGlzbWlzc0J1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLnJlY2VudHNfZGlzbWlzc19idXR0b24pOwogICAgICAgICBtUmVjZW50c0Rpc21pc3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewpAQCAtNDAyLDEwICs0MzUsOSBAQAogICAgICAgICAgICAgTG9nLnYoVEFHLCAiU291cmNlIHRodW1iOiAiICsgc3JjV2lkdGggKyAieCIgKyBzcmNIZWlnaHQpOwogICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAodGh1bWJuYWlsLAogICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdCgwLCAwLCBzcmNXaWR0aC0xLCBzcmNIZWlnaHQtMSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0RihHTE9XX1BBRERJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPV19QQURESU5HIC0gNy4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCaXRtYXAuZ2V0V2lkdGgoKSAtIEdMT1dfUEFERElORyArIDMuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Qml0bWFwLmdldEhlaWdodCgpIC0gR0xPV19QQURESU5HICsgNy4wZiksIHBhaW50KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlY3RGKG1HbG93Qml0bWFwUGFkZGluZ0xlZnRQeCwgbUdsb3dCaXRtYXBQYWRkaW5nVG9wUHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Qml0bWFwLmdldFdpZHRoKCkgLSBtR2xvd0JpdG1hcFBhZGRpbmdSaWdodFB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJpdG1hcC5nZXRIZWlnaHQoKSAtIG1HbG93Qml0bWFwUGFkZGluZ0JvdHRvbVB4KSwgcGFpbnQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBvdXRCaXRtYXA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9SZWNlbnRzVmVydGljYWxTY3JvbGxWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudHNWZXJ0aWNhbFNjcm9sbFZpZXcuamF2YQppbmRleCA1NGVjNmI1Li42YTk2MmNiIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudHNWZXJ0aWNhbFNjcm9sbFZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvcmVjZW50L1JlY2VudHNWZXJ0aWNhbFNjcm9sbFZpZXcuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRzUGFuZWxWaWV3LkFjdHZpdHlEZXNjcmlwdGlvbkFkYXB0ZXI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudHNQYW5lbFZpZXcuQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvci5BbmltYXRvckxpc3RlbmVyOwpAQCAtNDksNyArNDksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFRIUkVTSEhPTEQgPSA1MDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0lOVkFMSURBVEUgPSBmYWxzZTsKICAgICBwcml2YXRlIExpbmVhckxheW91dCBtTGluZWFyTGF5b3V0OwotICAgIHByaXZhdGUgQWN0dml0eURlc2NyaXB0aW9uQWRhcHRlciBtQWRhcHRlcjsKKyAgICBwcml2YXRlIEFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyIG1BZGFwdGVyOwogICAgIHByaXZhdGUgUmVjZW50c0NhbGxiYWNrIG1DYWxsYmFjazsKICAgICBwcm90ZWN0ZWQgaW50IG1MYXN0U2Nyb2xsUG9zaXRpb247CiAgICAgcHJpdmF0ZSBWaWV3IG1DdXJyZW50VmlldzsKQEAgLTI3NSw3ICsyNzUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0QWRhcHRlcihBY3R2aXR5RGVzY3JpcHRpb25BZGFwdGVyIGFkYXB0ZXIpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKEFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyIGFkYXB0ZXIpIHsKICAgICAgICAgbUFkYXB0ZXIgPSBhZGFwdGVyOwogICAgICAgICBtQWRhcHRlci5yZWdpc3RlckRhdGFTZXRPYnNlcnZlcihuZXcgRGF0YVNldE9ic2VydmVyKCkgewogICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKCkgewpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9jYXJvdXNlbC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9jYXJvdXNlbC9SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWUyMzBmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvY2Fyb3VzZWwvUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5jYXJvdXNlbDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuZXguY2Fyb3VzZWwuQ2Fyb3VzZWxWaWV3SGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmV4LmNhcm91c2VsLkNhcm91c2VsUlMuQ2Fyb3VzZWxDYWxsYmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXdIZWxwZXIuRGV0YWlsVGV4dHVyZVBhcmFtZXRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlck5hdGl2ZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5JQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuYXBwLklUaHVtYm5haWxSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuUnVubmluZ1Rhc2tJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50RmxhZ3NEcmF3RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZlhmZXJtb2RlOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcC5Db25maWc7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBpeGVsRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBSZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIERCRyA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDQVJEX1NMT1RTID0gNTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJU0lCTEVfU0xPVFMgPSA3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVEFTS1MgPSBWSVNJQkxFX1NMT1RTICogMjsKLQotICAgIC8vIFRPRE86IHRoZXNlIHNob3VsZCBiZSBjb25maWd1cmFibGUKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVUQUlMX1RFWFRVUkVfTUFYX1dJRFRIID0gMjAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVRBSUxfVEVYVFVSRV9NQVhfSEVJR0hUID0gODA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfV0lEVEggPSAyNTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFWFRVUkVfSEVJR0hUID0gMjU2OwotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcjsKLSAgICBwcml2YXRlIExpc3Q8UnVubmluZ1Rhc2tJbmZvPiBtUnVubmluZ1Rhc2tMaXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUG9ydHJhaXRNb2RlID0gdHJ1ZTsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxBY3Rpdml0eURlc2NyaXB0aW9uPiBtQWN0aXZpdHlEZXNjcmlwdGlvbnMKLSAgICAgICAgICAgID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eURlc2NyaXB0aW9uPigpOwotICAgIHByaXZhdGUgQ2Fyb3VzZWxWaWV3IG1DYXJvdXNlbFZpZXc7Ci0gICAgcHJpdmF0ZSBMb2NhbENhcm91c2VsVmlld0hlbHBlciBtSGVscGVyOwotICAgIHByaXZhdGUgVmlldyBtTm9SZWNlbnRzVmlldzsKLSAgICBwcml2YXRlIEJpdG1hcCBtTG9hZGluZ0JpdG1hcDsKLSAgICBwcml2YXRlIEJpdG1hcCBtUmVjZW50T3ZlcmxheTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGRlbiA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGlkaW5nID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBEZXRhaWxJbmZvIG1EZXRhaWxJbmZvOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3IgYWxsIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgRGV0YWlsVmlldyB3ZSdsbAotICAgICAqIGJlIGRyYXdpbmcgdG8gYSBiaXRtYXAgYW5kIHNlbmRpbmcgdG8gQ2Fyb3VzZWwuCi0gICAgICoKLSAgICAgKi8KLSAgICBzdGF0aWMgZmluYWwgY2xhc3MgRGV0YWlsSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBEZXRhaWxJbmZvKFZpZXcgX3ZpZXcsIFRleHRWaWV3IF90aXRsZSwgVGV4dFZpZXcgX2Rlc2MpIHsKLSAgICAgICAgICAgIHZpZXcgPSBfdmlldzsKLSAgICAgICAgICAgIHRpdGxlID0gX3RpdGxlOwotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfZGVzYzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEcmF3cyB2aWV3IGludG8gdGhlIGdpdmVuIGJpdG1hcCwgaWYgcHJvdmlkZWQKLSAgICAgICAgICogQHBhcmFtIGJpdG1hcAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJpdG1hcCBkcmF3KEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgICAgIHJlc2l6ZVZpZXcodmlldywgREVUQUlMX1RFWFRVUkVfTUFYX1dJRFRILCBERVRBSUxfVEVYVFVSRV9NQVhfSEVJR0hUKTsKLSAgICAgICAgICAgIGludCBkZXNpcmVkV2lkdGggPSB2aWV3LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgZGVzaXJlZEhlaWdodCA9IHZpZXcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoYml0bWFwID09IG51bGwgfHwgZGVzaXJlZFdpZHRoICE9IGJpdG1hcC5nZXRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IGRlc2lyZWRIZWlnaHQgIT0gYml0bWFwLmdldEhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcChkZXNpcmVkV2lkdGgsIGRlc2lyZWRIZWlnaHQsIENvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMoYml0bWFwKTsKLSAgICAgICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBGb3JjZSBhIGxheW91dCBwYXNzIG9uIHRoZSBnaXZlbiB2aWV3LgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc2l6ZVZpZXcoVmlldyB2aWV3LCBpbnQgbWF4V2lkdGgsIGludCBtYXhIZWlnaHQpIHsKLSAgICAgICAgICAgIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKE1lYXN1cmVTcGVjLkFUX01PU1QpCi0gICAgICAgICAgICAgICAgICAgIHwgTWVhc3VyZVNwZWMuZ2V0U2l6ZShtYXhXaWR0aCk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLmdldE1vZGUoTWVhc3VyZVNwZWMuQVRfTU9TVCkKLSAgICAgICAgICAgICAgICAgICAgfCBNZWFzdXJlU3BlYy5nZXRTaXplKG1heEhlaWdodCk7Ci0gICAgICAgICAgICB2aWV3Lm1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgICAgIHZpZXcubGF5b3V0KDAsIDAsIHZpZXcuZ2V0TWVhc3VyZWRXaWR0aCgpLCB2aWV3LmdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLnYoVEFHLCAiUkVTSVpFRCBWSUVXOiAiICsgdmlldy5nZXRXaWR0aCgpICsgIiwgIiArIHZpZXcuZ2V0SGVpZ2h0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZpZXcgdmlldzsKLSAgICAgICAgcHVibGljIFRleHRWaWV3IHRpdGxlOwotICAgICAgICBwdWJsaWMgVGV4dFZpZXcgZGVzY3JpcHRpb247Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotICAgICAgICBpbnQgaWQ7Ci0gICAgICAgIEJpdG1hcCB0aHVtYm5haWw7IC8vIGdlbmVyYXRlZCBieSBBY3Rpdml0eS5vbkNyZWF0ZVRodW1ibmFpbCgpCi0gICAgICAgIERyYXdhYmxlIGljb247IC8vIGFwcGxpY2F0aW9uIHBhY2thZ2UgaWNvbgotICAgICAgICBTdHJpbmcgbGFiZWw7IC8vIGFwcGxpY2F0aW9uIHBhY2thZ2UgbGFiZWwKLSAgICAgICAgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uOyAvLyBnZW5lcmF0ZWQgYnkgQWN0aXZpdHkub25DcmVhdGVEZXNjcmlwdGlvbigpCi0gICAgICAgIEludGVudCBpbnRlbnQ7IC8vIGxhdW5jaCBpbnRlbnQgZm9yIGFwcGxpY2F0aW9uCi0gICAgICAgIE1hdHJpeCBtYXRyaXg7IC8vIGFyYml0cmFyeSByb3RhdGlvbiBtYXRyaXggdG8gY29ycmVjdCBvcmllbnRhdGlvbgotICAgICAgICBpbnQgcG9zaXRpb247IC8vIHBvc2l0aW9uIGluIGxpc3QKLQotICAgICAgICBwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbihCaXRtYXAgX3RodW1ibmFpbCwKLSAgICAgICAgICAgICAgICBEcmF3YWJsZSBfaWNvbiwgU3RyaW5nIF9sYWJlbCwgU3RyaW5nIF9kZXNjLCBpbnQgX2lkLCBpbnQgX3BvcykKLSAgICAgICAgewotICAgICAgICAgICAgdGh1bWJuYWlsID0gX3RodW1ibmFpbDsKLSAgICAgICAgICAgIGljb24gPSBfaWNvbjsKLSAgICAgICAgICAgIGxhYmVsID0gX2xhYmVsOwotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfZGVzYzsKLSAgICAgICAgICAgIGlkID0gX2lkOwotICAgICAgICAgICAgcG9zaXRpb24gPSBfcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBpY29uID0gbnVsbDsKLSAgICAgICAgICAgIHRodW1ibmFpbCA9IG51bGw7Ci0gICAgICAgICAgICBsYWJlbCA9IG51bGw7Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBpbnRlbnQgPSBudWxsOwotICAgICAgICAgICAgbWF0cml4ID0gbnVsbDsKLSAgICAgICAgICAgIGlkID0gLTE7Ci0gICAgICAgICAgICBwb3NpdGlvbiA9IC0xOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQWN0aXZpdHlEZXNjcmlwdGlvbiBmaW5kQWN0aXZpdHlEZXNjcmlwdGlvbihpbnQgaWQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uaWQgPT0gaWQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIExvY2FsQ2Fyb3VzZWxWaWV3SGVscGVyIGV4dGVuZHMgQ2Fyb3VzZWxWaWV3SGVscGVyIHsKLSAgICAgICAgcHJpdmF0ZSBEZXRhaWxUZXh0dXJlUGFyYW1ldGVycyBtRGV0YWlsUGFyYW1zID0gbmV3IERldGFpbFRleHR1cmVQYXJhbWV0ZXJzKDEwLjBmLCAyMC4wZik7Ci0KLSAgICAgICAgcHVibGljIExvY2FsQ2Fyb3VzZWxWaWV3SGVscGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERldGFpbFRleHR1cmVQYXJhbWV0ZXJzIGdldERldGFpbFRleHR1cmVQYXJhbWV0ZXJzKGludCBpZCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXRhaWxQYXJhbXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNhcmRTZWxlY3RlZChpbnQgbikgewotICAgICAgICAgICAgaWYgKG4gPCBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpdGVtID0gbUFjdGl2aXR5RGVzY3JpcHRpb25zLmdldChuKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbS5pZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYWN0aXZlIHRhc2s7IGl0IHNob3VsZCBqdXN0IGdvIHRvIHRoZSBmb3JlZ3JvdW5kLgotICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXIgYW0gPSAoQWN0aXZpdHlNYW5hZ2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgYW0ubW92ZVRhc2tUb0Zyb250KGl0ZW0uaWQsIEFjdGl2aXR5TWFuYWdlci5NT1ZFX1RBU0tfV0lUSF9IT01FKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uaW50ZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcHJlcGFyZSBhIGxhdW5jaCBpbnRlbnQgYW5kIHNlbmQgaXQKLSAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTEFVTkNIRURfRlJPTV9ISVNUT1JZCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnRlbnQuRkxBR19BQ1RJVklUWV9UQVNLX09OX0hPTUUpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU3RhcnRpbmcgaW50ZW50ICIgKyBpdGVtLmludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5KGl0ZW0uaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlUGVuZGluZ1RyYW5zaXRpb24oUi5hbmltLnJlY2VudF9hcHBfZW50ZXIsIFIuYW5pbS5yZWNlbnRfYXBwX2xlYXZlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudygiUmVjZW50IiwgIlVuYWJsZSB0byBsYXVuY2ggcmVjZW50IHRhc2siLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXRUZXh0dXJlKGZpbmFsIGludCBpZCkgewotICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAib25SZXF1ZXN0VGV4dHVyZSgiICsgaWQgKyAiKSIpOwotICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpbmZvOwotICAgICAgICAgICAgc3luY2hyb25pemVkKG1BY3Rpdml0eURlc2NyaXB0aW9ucykgewotICAgICAgICAgICAgICAgIGluZm8gPSBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuZ2V0KGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBudWxsOwotICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJpdG1hcCA9IGNvbXBvc2l0ZUJpdG1hcChpbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiaXRtYXA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXREZXRhaWxUZXh0dXJlKGludCBuKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChuIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gaXRlbSA9IG1BY3Rpdml0eURlc2NyaXB0aW9ucy5nZXQobik7Ci0gICAgICAgICAgICAgICAgbURldGFpbEluZm8udGl0bGUuc2V0VGV4dChpdGVtLmxhYmVsKTsKLSAgICAgICAgICAgICAgICBtRGV0YWlsSW5mby5kZXNjcmlwdGlvbi5zZXRUZXh0KGl0ZW0uZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIGJpdG1hcCA9IG1EZXRhaWxJbmZvLmRyYXcobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYml0bWFwOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQml0bWFwIGNvbXBvc2l0ZUJpdG1hcChBY3Rpdml0eURlc2NyaXB0aW9uIGluZm8pIHsKLSAgICAgICAgZmluYWwgaW50IHRhcmdldFdpZHRoID0gVEVYVFVSRV9XSURUSDsKLSAgICAgICAgZmluYWwgaW50IHRhcmdldEhlaWdodCA9IFRFWFRVUkVfSEVJR0hUOwotICAgICAgICBmaW5hbCBpbnQgYm9yZGVyID0gMzsgLy8gaW5zZXQgYWxvbmcgdGhlIGVkZ2UgZm9yIHRodW1ubmFpbCBjb250ZW50Ci0gICAgICAgIGZpbmFsIGludCBvdmVybGFwID0gMTsgLy8gaG93IG1hbnkgcGl4ZWxzIG9mIG92ZXJsYXAgYmV0d2VlbiBib3JkZXIgYW5kIHRodW1ibmFpbAotICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgIGlmIChtUmVjZW50T3ZlcmxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVjZW50T3ZlcmxheSA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UocmVzLCBSLmRyYXdhYmxlLnJlY2VudF9vdmVybGF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENyZWF0ZSBhIGJpdG1hcCBvZiB0aGUgcHJvcGVyIHNpemUvZm9ybWF0IGFuZCBzZXQgdGhlIGNhbnZhcyB0byBkcmF3IHRvIGl0Ci0gICAgICAgIGZpbmFsIEJpdG1hcCByZXN1bHQgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHRhcmdldFdpZHRoLCB0YXJnZXRIZWlnaHQsIEJpdG1hcC5Db25maWcuQVJHQl84ODg4KTsKLSAgICAgICAgZmluYWwgQ2FudmFzIGNhbnZhcyA9IG5ldyBDYW52YXMocmVzdWx0KTsKLSAgICAgICAgY2FudmFzLnNldERyYXdGaWx0ZXIobmV3IFBhaW50RmxhZ3NEcmF3RmlsdGVyKFBhaW50LkRJVEhFUl9GTEFHLCBQYWludC5GSUxURVJfQklUTUFQX0ZMQUcpKTsKLSAgICAgICAgUGFpbnQgcGFpbnQgPSBuZXcgUGFpbnQoKTsKLSAgICAgICAgcGFpbnQuc2V0RmlsdGVyQml0bWFwKGZhbHNlKTsKLQotICAgICAgICBwYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5TUkMpKTsKLSAgICAgICAgY2FudmFzLnNhdmUoKTsKLSAgICAgICAgaWYgKGluZm8udGh1bWJuYWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIERyYXcgdGhlIHRodW1ibmFpbAotICAgICAgICAgICAgaW50IHNvdXJjZVdpZHRoID0gdGFyZ2V0V2lkdGggLSAyICogKGJvcmRlciAtIG92ZXJsYXApOwotICAgICAgICAgICAgaW50IHNvdXJjZUhlaWdodCA9IHRhcmdldEhlaWdodCAtIDIgKiAoYm9yZGVyIC0gb3ZlcmxhcCk7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZVggPSAoZmxvYXQpIHNvdXJjZVdpZHRoIC8gaW5mby50aHVtYm5haWwuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHNjYWxlWSA9IChmbG9hdCkgc291cmNlSGVpZ2h0IC8gaW5mby50aHVtYm5haWwuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJvcmRlciAqIDAuNWYsIGJvcmRlciAqIDAuNWYpOwotICAgICAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKGluZm8udGh1bWJuYWlsLCAwLCAwLCBwYWludCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBEcmF3IHRoZSBMb2FkaW5nIGJpdG1hcCBwbGFjZWhvbGRlciwgVE9ETzogUmVtb3ZlIHdoZW4gUlMgaGFuZGxlcyBibGVuZGluZwotICAgICAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVYID0gKGZsb2F0KSB0YXJnZXRXaWR0aCAvIG1Mb2FkaW5nQml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZVkgPSAoZmxvYXQpIHRhcmdldEhlaWdodCAvIG1Mb2FkaW5nQml0bWFwLmdldEhlaWdodCgpOwotICAgICAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKLSAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0bWFwKG1Mb2FkaW5nQml0bWFwLCAwLCAwLCBwYWludCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLQotICAgICAgICAvLyBEcmF3IG92ZXJsYXkKLSAgICAgICAgY2FudmFzLnNhdmUoKTsKLSAgICAgICAgZmluYWwgZmxvYXQgc2NhbGVPdmVybGF5WCA9IChmbG9hdCkgdGFyZ2V0V2lkdGggLyBtUmVjZW50T3ZlcmxheS5nZXRXaWR0aCgpOwotICAgICAgICBmaW5hbCBmbG9hdCBzY2FsZU92ZXJsYXlZID0gKGZsb2F0KSB0YXJnZXRIZWlnaHQgLyBtUmVjZW50T3ZlcmxheS5nZXRIZWlnaHQoKTsKLSAgICAgICAgY2FudmFzLnNjYWxlKHNjYWxlT3ZlcmxheVgsIHNjYWxlT3ZlcmxheVkpOwotICAgICAgICBwYWludC5zZXRYZmVybW9kZShuZXcgUG9ydGVyRHVmZlhmZXJtb2RlKFBvcnRlckR1ZmYuTW9kZS5BREQpKTsKLSAgICAgICAgY2FudmFzLmRyYXdCaXRtYXAobVJlY2VudE92ZXJsYXksIDAsIDAsIHBhaW50KTsKLSAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKLQotICAgICAgICAvLyBEcmF3IGljb24KLSAgICAgICAgaWYgKGluZm8uaWNvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgaW5mby5pY29uLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSVRodW1ibmFpbFJlY2VpdmVyIG1UaHVtYm5haWxSZWNlaXZlciA9IG5ldyBJVGh1bWJuYWlsUmVjZWl2ZXIuU3R1YigpIHsKLQotICAgICAgICBwdWJsaWMgdm9pZCBmaW5pc2hlZCgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBuZXdUaHVtYm5haWwoZmluYWwgaW50IGlkLCBmaW5hbCBCaXRtYXAgYml0bWFwLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgdyA9IGJpdG1hcC5nZXRXaWR0aCgpOwotICAgICAgICAgICAgaW50IGggPSBiaXRtYXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJOZXcgdGh1bWJuYWlsIGZvciBpZD0iICsgaWQgKyAiLCBkaW1lbnNpb25zPSIgKyB3ICsgIngiICsgaAotICAgICAgICAgICAgICAgICAgICArICIgZGVzY3JpcHRpb24gJyIgKyBkZXNjcmlwdGlvbiArICInIik7Ci0gICAgICAgICAgICBBY3Rpdml0eURlc2NyaXB0aW9uIGluZm8gPSBmaW5kQWN0aXZpdHlEZXNjcmlwdGlvbihpZCk7Ci0gICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5mby50aHVtYm5haWwgPSBiaXRtYXA7Ci0gICAgICAgICAgICAgICAgaW5mby5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCB0aHVtYldpZHRoID0gYml0bWFwLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHRodW1iSGVpZ2h0ID0gYml0bWFwLmdldEhlaWdodCgpOwotICAgICAgICAgICAgICAgIGlmICgobVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoID4gdGh1bWJIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoIW1Qb3J0cmFpdE1vZGUgJiYgdGh1bWJXaWR0aCA8IHRodW1iSGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICBNYXRyaXggbWF0cml4ID0gbmV3IE1hdHJpeCgpOwotICAgICAgICAgICAgICAgICAgICBtYXRyaXguc2V0Um90YXRlKDkwLjBmLCAoZmxvYXQpIHRodW1iV2lkdGggLyAyLCAoZmxvYXQpIHRodW1iSGVpZ2h0IC8gMik7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8ubWF0cml4ID0gbWF0cml4OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8ubWF0cml4ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgQ2Fyb3VzZWwgdG8gcmVxdWVzdCBuZXcgdGV4dHVyZXMgZm9yIHRoaXMgaXRlbS4KLSAgICAgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFRleHR1cmVGb3JJdGVtKGluZm8ucG9zaXRpb24sIG51bGwpOwotICAgICAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0RGV0YWlsVGV4dHVyZUZvckl0ZW0oaW5mby5wb3NpdGlvbiwgMCwgMCwgMCwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNhbid0IGZpbmQgdmlldyBmb3IgaWQgIiArIGlkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBXZSBuZXZlciByZWFsbHkgZmluaXNoKCkgUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHksIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgKiBnZXQgZGVzdHJveWVkIGFuZCBwYXkgdGhlIHN0YXJ0LXVwIGNvc3QgdG8gcmVzdGFydCBpdC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaW5pc2goKSB7Ci0gICAgICAgIG1vdmVUYXNrVG9CYWNrKHRydWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTmV3SW50ZW50KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgbUhpZGRlbiA9ICFtSGlkZGVuOwotICAgICAgICBpZiAobUhpZGRlbikgewotICAgICAgICAgICAgbUhpZGluZyA9IHRydWU7Ci0gICAgICAgICAgICBtb3ZlVGFza1RvQmFjayh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1IaWRpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5vbk5ld0ludGVudChpbnRlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgIGZpbmFsIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0KLSAgICAgICAgZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCkuc2V0QmFja2dyb3VuZENvbG9yKDB4ODAwMDAwMDApOwotCi0gICAgICAgIGlmIChtQ2Fyb3VzZWxWaWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvbmcgdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucmVjZW50X2FwcHNfYWN0aXZpdHkpOwotICAgICAgICAgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0OwotICAgICAgICAgICAgTG9nLnYoVEFHLCAiUmVjZW50cyBsYXlvdXQgdG9vayAiICsgZWxhcHNlZCArICJtcyB0byBsb2FkIik7Ci0gICAgICAgICAgICBtTG9hZGluZ0JpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlUmVzb3VyY2UocmVzLCBSLmRyYXdhYmxlLnJlY2VudF9yZXpfYm9yZGVyKTsKLSAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcgPSAoQ2Fyb3VzZWxWaWV3KWZpbmRWaWV3QnlJZChSLmlkLmNhcm91c2VsKTsKLSAgICAgICAgICAgIG1IZWxwZXIgPSBuZXcgTG9jYWxDYXJvdXNlbFZpZXdIZWxwZXIodGhpcyk7Ci0gICAgICAgICAgICBtSGVscGVyLnNldENhcm91c2VsVmlldyhtQ2Fyb3VzZWxWaWV3KTsKLQotICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRTbG90Q291bnQoQ0FSRF9TTE9UUyk7Ci0gICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFZpc2libGVTbG90cyhWSVNJQkxFX1NMT1RTKTsKLSAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuY3JlYXRlQ2FyZHMoMCk7Ci0gICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFN0YXJ0QW5nbGUoKGZsb2F0KSAtKDIuMGYqTWF0aC5QSSAqIDUgLyBDQVJEX1NMT1RTKSk7Ci0gICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldERlZmF1bHRCaXRtYXAobUxvYWRpbmdCaXRtYXApOwotICAgICAgICAgICAgbUNhcm91c2VsVmlldy5zZXRMb2FkaW5nQml0bWFwKG1Mb2FkaW5nQml0bWFwKTsKLSAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0UmV6SW5DYXJkQ291bnQoMy4wZik7Ci0gICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LmdldEhvbGRlcigpLnNldEZvcm1hdChQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7Ci0KLSAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3ID0gKFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm5vX2FwcGxpY2F0aW9uc19tZXNzYWdlKTsKLQotICAgICAgICAgICAgbUFjdGl2aXR5TWFuYWdlciA9IChBY3Rpdml0eU1hbmFnZXIpIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ1RJVklUWV9TRVJWSUNFKTsKLSAgICAgICAgICAgIG1Qb3J0cmFpdE1vZGUgPSBkZWNvclZpZXcuZ2V0SGVpZ2h0KCkgPiBkZWNvclZpZXcuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgLy8gTG9hZCBkZXRhaWwgdmlldyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRleHQKLSAgICAgICAgICAgIFZpZXcgZGV0YWlsID0gZ2V0TGF5b3V0SW5mbGF0ZXIoKS5pbmZsYXRlKFIubGF5b3V0LnJlY2VudHNfZGV0YWlsX3ZpZXcsIG51bGwpOwotICAgICAgICAgICAgVGV4dFZpZXcgdGl0bGUgPSAoVGV4dFZpZXcpIGRldGFpbC5maW5kVmlld0J5SWQoUi5pZC5hcHBfdGl0bGUpOwotICAgICAgICAgICAgVGV4dFZpZXcgZGVzY3JpcHRpb24gPSAoVGV4dFZpZXcpIGRldGFpbC5maW5kVmlld0J5SWQoUi5pZC5hcHBfZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgbURldGFpbEluZm8gPSBuZXcgRGV0YWlsSW5mbyhkZXRhaWwsIHRpdGxlLCBkZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgICAgIHJlZnJlc2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIG1Qb3J0cmFpdE1vZGUgPSBuZXdDb25maWcub3JpZW50YXRpb24gPT0gQ29uZmlndXJhdGlvbi5PUklFTlRBVElPTl9QT1JUUkFJVDsKLSAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiQ09ORklHIENIQU5HRSwgbVBvcnRyYWl0TW9kZSA9ICIgKyBtUG9ydHJhaXRNb2RlKTsKLSAgICAgICAgcmVmcmVzaCgpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlUnVubmluZ1Rhc2tzKCkgewotICAgICAgICBtUnVubmluZ1Rhc2tMaXN0ID0gbUFjdGl2aXR5TWFuYWdlci5nZXRSdW5uaW5nVGFza3MoTUFYX1RBU0tTLAotICAgICAgICAgICAgICAgIDAsIG1UaHVtYm5haWxSZWNlaXZlcik7Ci0gICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIlBvcnRyYWl0OiAiICsgbVBvcnRyYWl0TW9kZSk7Ci0gICAgICAgIGZvciAoUnVubmluZ1Rhc2tJbmZvIHIgOiBtUnVubmluZ1Rhc2tMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoci50aHVtYm5haWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCB0aHVtYldpZHRoID0gci50aHVtYm5haWwuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgdGh1bWJIZWlnaHQgPSByLnRodW1ibmFpbC5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJHb3QgdGh1bWJuYWlsICIgKyB0aHVtYldpZHRoICsgIngiICsgdGh1bWJIZWlnaHQpOwotICAgICAgICAgICAgICAgIEFjdGl2aXR5RGVzY3JpcHRpb24gZGVzYyA9IGZpbmRBY3Rpdml0eURlc2NyaXB0aW9uKHIuaWQpOwotICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzYy50aHVtYm5haWwgPSByLnRodW1ibmFpbDsKLSAgICAgICAgICAgICAgICAgICAgZGVzYy5kZXNjcmlwdGlvbiA9IHIuZGVzY3JpcHRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmICgobVBvcnRyYWl0TW9kZSAmJiB0aHVtYldpZHRoID4gdGh1bWJIZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFtUG9ydHJhaXRNb2RlICYmIHRodW1iV2lkdGggPCB0aHVtYkhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXguc2V0Um90YXRlKDkwLjBmLCAoZmxvYXQpIHRodW1iV2lkdGggLyAyLCAoZmxvYXQpIHRodW1iSGVpZ2h0IC8gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLm1hdHJpeCA9IG1hdHJpeDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIkNvdWxkbid0IGZpbmQgQWN0aXZpdHlEZXNjIGZvciBpZD0iICsgci5pZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICIqKiogUlVOTklORyBUSFVNQk5BSUwgV0FTIE5VTEwgKioqIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUmVjZW50VGFza3MoKSB7Ci0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIHBtID0gZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyIGFtID0gKEFjdGl2aXR5TWFuYWdlcikgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8QWN0aXZpdHlNYW5hZ2VyLlJlY2VudFRhc2tJbmZvPiByZWNlbnRUYXNrcyA9Ci0gICAgICAgICAgICAgICAgYW0uZ2V0UmVjZW50VGFza3MoTUFYX1RBU0tTLCBBY3Rpdml0eU1hbmFnZXIuUkVDRU5UX0lHTk9SRV9VTkFWQUlMQUJMRSk7Ci0KLSAgICAgICAgQWN0aXZpdHlJbmZvIGhvbWVJbmZvID0gbmV3IEludGVudChJbnRlbnQuQUNUSU9OX01BSU4pLmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9IT01FKQotICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZUFjdGl2aXR5SW5mbyhwbSwgMCk7Ci0KLSAgICAgICAgLy8gSWNvblV0aWxpdGllcyBpY29uVXRpbGl0aWVzID0gbmV3IEljb25VdGlsaXRpZXModGhpcyk7IC8vIEZJWE1FCi0KLSAgICAgICAgaW50IG51bVRhc2tzID0gcmVjZW50VGFza3Muc2l6ZSgpOwotICAgICAgICBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIGluZGV4ID0gMDsgaSA8IG51bVRhc2tzICYmIChpbmRleCA8IE1BWF9UQVNLUyk7ICsraSkgewotICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlNYW5hZ2VyLlJlY2VudFRhc2tJbmZvIHJlY2VudEluZm8gPSByZWNlbnRUYXNrcy5nZXQoaSk7Ci0KLSAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KHJlY2VudEluZm8uYmFzZUludGVudCk7Ci0gICAgICAgICAgICBpZiAocmVjZW50SW5mby5vcmlnQWN0aXZpdHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQocmVjZW50SW5mby5vcmlnQWN0aXZpdHkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTa2lwIHRoZSBjdXJyZW50IGhvbWUgYWN0aXZpdHkuCi0gICAgICAgICAgICBpZiAoaG9tZUluZm8gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBob21lSW5mby5wYWNrYWdlTmFtZS5lcXVhbHMoaW50ZW50LmdldENvbXBvbmVudCgpLmdldFBhY2thZ2VOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGhvbWVJbmZvLm5hbWUuZXF1YWxzKGludGVudC5nZXRDb21wb25lbnQoKS5nZXRDbGFzc05hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKChpbnRlbnQuZ2V0RmxhZ3MoKSZ+SW50ZW50LkZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQpCi0gICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgZmluYWwgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSBwbS5yZXNvbHZlQWN0aXZpdHkoaW50ZW50LCAwKTsKLSAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWN0aXZpdHlJbmZvIGluZm8gPSByZXNvbHZlSW5mby5hY3Rpdml0eUluZm87Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlID0gaW5mby5sb2FkTGFiZWwocG0pLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgRHJhd2FibGUgaWNvbiA9IGluZm8ubG9hZEljb24ocG0pOwotCi0gICAgICAgICAgICAgICAgaW50IGlkID0gcmVjZW50VGFza3MuZ2V0KGkpLmlkOwotICAgICAgICAgICAgICAgIGlmIChpZCAhPSAtMSAmJiB0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCgpID4gMCAmJiBpY29uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWNvbiA9IG51bGw7IEZJWE1FOiBpY29uVXRpbGl0aWVzLmNyZWF0ZUljb25EcmF3YWJsZShpY29uKTsKLSAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEZXNjcmlwdGlvbiBpdGVtID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgaWNvbiwgdGl0bGUsIG51bGwsIGlkLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW0uaW50ZW50ID0gaW50ZW50OwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlEZXNjcmlwdGlvbnMuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICJBZGRlZCBpdGVtWyIgKyBpbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIl0sIGlkPSIgKyBpdGVtLmlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB0aXRsZT0iICsgaXRlbS5sYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgTG9nLnYoVEFHLCAiU0tJUFBJTkcgaXRlbSAiICsgaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVJlZnJlc2hSdW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdXBkYXRlUmVjZW50VGFza3MoKTsKLSAgICAgICAgICAgIHVwZGF0ZVJ1bm5pbmdUYXNrcygpOwotICAgICAgICAgICAgc2hvd0Nhcm91c2VsKG1BY3Rpdml0eURlc2NyaXB0aW9ucy5zaXplKCkgPiAwKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0Nhcm91c2VsKGJvb2xlYW4gc2hvdykgewotICAgICAgICBpZiAoc2hvdykgewotICAgICAgICAgICAgbUNhcm91c2VsVmlldy5jcmVhdGVDYXJkcyhtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbUFjdGl2aXR5RGVzY3JpcHRpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgQ2Fyb3VzZWwgdG8gdXBkYXRlIHRleHR1cmVzLiBOb3RlIHdlIGRvbid0IGRvIHRoaXMgZm9yIHRoZSBmaXJzdCBpdGVtLAotICAgICAgICAgICAgICAgIC8vIHNpbmNlIGl0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIG1UaHVtYm5haWxSZWNlaXZlciByZXR1cm5zIGEgdGh1bWJuYWlsLgotICAgICAgICAgICAgICAgIC8vIFRPRE86IG9ubHkgZG8gdGhpcyBmb3IgYXBwcyB0aGF0IGhhdmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnNldFRleHR1cmVGb3JJdGVtKGksIG51bGwpOwotICAgICAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0RGV0YWlsVGV4dHVyZUZvckl0ZW0oaSwgMCwgMCwgMCwgMCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNYWtlIGNhcm91c2VsIHZpc2libGUKLSAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUNhcm91c2VsVmlldy5jcmVhdGVDYXJkcyhtQWN0aXZpdHlEZXNjcmlwdGlvbnMuc2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHNob3cgIk5vIFJlY2VudCBUYXNrcyIKLSAgICAgICAgICAgIG1Ob1JlY2VudHNWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmICghbUhpZGluZyAmJiBtQ2Fyb3VzZWxWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIERvbid0IHVwZGF0ZSB0aGUgdmlldyBub3cuIEluc3RlYWQsIHBvc3QgYSByZXF1ZXN0IHNvIGl0IGhhcHBlbnMgbmV4dCB0aW1lCi0gICAgICAgICAgICAvLyB3ZSByZWFjaCB0aGUgbG9vcGVyIGFmdGVyIGEgZGVsYXkuIFRoaXMgd2F5IHdlIGNhbiBmb2xkIG11bHRpcGxlIHJlZnJlc2hlcwotICAgICAgICAgICAgLy8gaW50byBqdXN0IHRoZSBsYXRlc3QuCi0gICAgICAgICAgICBtQ2Fyb3VzZWxWaWV3LnJlbW92ZUNhbGxiYWNrcyhtUmVmcmVzaFJ1bm5hYmxlKTsKLSAgICAgICAgICAgIG1DYXJvdXNlbFZpZXcucG9zdERlbGF5ZWQobVJlZnJlc2hSdW5uYWJsZSwgNTApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9jYXJvdXNlbC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9yZWNlbnQvY2Fyb3VzZWwvUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmIwODYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3JlY2VudC9jYXJvdXNlbC9SZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5jYXJvdXNlbDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5leC5jYXJvdXNlbC5DYXJvdXNlbFZpZXc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKLQotcHVibGljIGNsYXNzIFJlY2VudEFwcGxpY2F0aW9uc0Nhcm91c2VsVmlldyBleHRlbmRzIENhcm91c2VsVmlldyB7Ci0KLSAgICBwdWJsaWMgUmVjZW50QXBwbGljYXRpb25zQ2Fyb3VzZWxWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZWNlbnRBcHBsaWNhdGlvbnNDYXJvdXNlbFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbmZvIGdldFJlbmRlclNjcmlwdEluZm8oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5mbyhSLnJhdy5jYXJvdXNlbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9Db21tYW5kUXVldWUuamF2YQppbmRleCBkYTFlMWM1Li42MmQ3NTAwIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL0NvbW1hbmRRdWV1ZS5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvQ29tbWFuZFF1ZXVlLmphdmEKQEAgLTU2LDEyICs1NiwxMiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfTElHSFRTX09OICAgICAgICAgID0gNyA8PCBNU0dfU0hJRlQ7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfTUVOVSAgICAgICAgICAgICAgPSA4IDw8IE1TR19TSElGVDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPUF9BUFBfV0lORE9XX0NIQU5HRUQgPSA4IDw8IE1TR19TSElGVDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfSU1FX0JVVFRPTiAgICAgICAgPSA5IDw8IE1TR19TSElGVDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NFVF9IQVJEX0tFWUJPQVJEX1NUQVRVUyA9IDEwIDw8IE1TR19TSElGVDsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VTRVJfQUNUSVZJVFkgICAgICAgICAgPSAxMSA8PCBNU0dfU0hJRlQ7Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RPR0dMRV9SRUNFTlRfQVBQUyAgICAgICA9IDEyIDw8IE1TR19TSElGVDsKIAogICAgIHByaXZhdGUgU3RhdHVzQmFySWNvbkxpc3QgbUxpc3Q7CiAgICAgcHJpdmF0ZSBDYWxsYmFja3MgbUNhbGxiYWNrczsKQEAgLTg3LDEwICs4NywxMSBAQAogICAgICAgICBwdWJsaWMgdm9pZCBhbmltYXRlRXhwYW5kKCk7CiAgICAgICAgIHB1YmxpYyB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpOwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaWdodHNPbihib29sZWFuIG9uKTsKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVudUtleVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKTsKKyAgICAgICAgcHVibGljIHZvaWQgdG9wQXBwV2luZG93Q2hhbmdlZChib29sZWFuIHZpc2libGUpOwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbWVXaW5kb3dTdGF0dXMoSUJpbmRlciB0b2tlbiwgaW50IHZpcywgaW50IGJhY2tEaXNwb3NpdGlvbik7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEhhcmRLZXlib2FyZFN0YXR1cyhib29sZWFuIGF2YWlsYWJsZSwgYm9vbGVhbiBlbmFibGVkKTsKICAgICAgICAgcHVibGljIHZvaWQgdXNlckFjdGl2aXR5KCk7CisgICAgICAgIHB1YmxpYyB2b2lkIHRvZ2dsZVJlY2VudEFwcHMoKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ29tbWFuZFF1ZXVlKENhbGxiYWNrcyBjYWxsYmFja3MsIFN0YXR1c0Jhckljb25MaXN0IGxpc3QpIHsKQEAgLTE2NiwxMCArMTY3LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRNZW51S2V5VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICBwdWJsaWMgdm9pZCB0b3BBcHBXaW5kb3dDaGFuZ2VkKGJvb2xlYW4gbWVudVZpc2libGUpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTGlzdCkgewotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1NIT1dfTUVOVSk7Ci0gICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19TSE9XX01FTlUsIHZpc2libGUgPyAxIDogMCwgMCwgbnVsbCkuc2VuZFRvVGFyZ2V0KCk7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVE9QX0FQUF9XSU5ET1dfQ0hBTkdFRCk7CisgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19UT1BfQVBQX1dJTkRPV19DSEFOR0VELCBtZW51VmlzaWJsZSA/IDEgOiAwLCAwLAorICAgICAgICAgICAgICAgICAgICBudWxsKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTk2LDYgKzE5OCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdG9nZ2xlUmVjZW50QXBwcygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdCkgeworICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1RPR0dMRV9SRUNFTlRfQVBQUyk7CisgICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19UT0dHTEVfUkVDRU5UX0FQUFMsIDAsIDAsIG51bGwpLnNlbmRUb1RhcmdldCgpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBIIGV4dGVuZHMgSGFuZGxlciB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQgJiBNU0dfTUFTSzsKQEAgLTI1Myw4ICsyNjIsOCBAQAogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NFVF9MSUdIVFNfT046CiAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3Muc2V0TGlnaHRzT24obXNnLmFyZzEgIT0gMCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NIT1dfTUVOVToKLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXRNZW51S2V5VmlzaWJsZShtc2cuYXJnMSAhPSAwKTsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19UT1BfQVBQX1dJTkRPV19DSEFOR0VEOgorICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLnRvcEFwcFdpbmRvd0NoYW5nZWQobXNnLmFyZzEgIT0gMCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1NIT1dfSU1FX0JVVFRPTjoKICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy5zZXRJbWVXaW5kb3dTdGF0dXMoKElCaW5kZXIpbXNnLm9iaiwgbXNnLmFyZzEsIG1zZy5hcmcyKTsKQEAgLTI2NSw2ICsyNzQsOSBAQAogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VTRVJfQUNUSVZJVFk6CiAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja3MudXNlckFjdGl2aXR5KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RPR0dMRV9SRUNFTlRfQVBQUzoKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy50b2dnbGVSZWNlbnRBcHBzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFyLmphdmEKaW5kZXggMjNhZTgyMy4uY2E3NTEzOCAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXIuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0Jhci5qYXZhCkBAIC01Myw2ICs1Myw3IEBACiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFZpZXcgbWFrZVN0YXR1c0JhclZpZXcoKTsKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKTsKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0YXR1c0JhckhlaWdodCgpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFuaW1hdGVDb2xsYXBzZSgpOwogCiAgICAgcHJpdmF0ZSBEb05vdERpc3R1cmIgbURvTm90RGlzdHVyYjsKIApAQCAtNzgsNyArNzksNyBAQAogCiAgICAgICAgIGRpc2FibGUoc3dpdGNoZXNbMF0pOwogICAgICAgICBzZXRMaWdodHNPbihzd2l0Y2hlc1sxXSAhPSAwKTsKLSAgICAgICAgc2V0TWVudUtleVZpc2libGUoc3dpdGNoZXNbMl0gIT0gMCk7CisgICAgICAgIHRvcEFwcFdpbmRvd0NoYW5nZWQoc3dpdGNoZXNbMl0gIT0gMCk7CiAgICAgICAgIC8vIFN0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlIGhhcyBhIGJhY2sgdXAgb2YgSU1FIHRva2VuIGFuZCBpdCdzIHJlc3RvcmVkIGhlcmUuCiAgICAgICAgIHNldEltZVdpbmRvd1N0YXR1cyhiaW5kZXJzLmdldCgwKSwgc3dpdGNoZXNbM10sIHN3aXRjaGVzWzRdKTsKICAgICAgICAgc2V0SGFyZEtleWJvYXJkU3RhdHVzKHN3aXRjaGVzWzVdICE9IDAsIHN3aXRjaGVzWzZdICE9IDApOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJJY29uVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9TdGF0dXNCYXJJY29uVmlldy5qYXZhCmluZGV4IGRiZmJlMTEuLmQ5ZDljMDYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvU3RhdHVzQmFySWNvblZpZXcuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL1N0YXR1c0Jhckljb25WaWV3LmphdmEKQEAgLTI5LDYgKzI5LDggQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0RlYnVnOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwogCitpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnN0YXR1c2Jhci5TdGF0dXNCYXJJY29uOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKQEAgLTE4MCw3ICsxODIsMTggQEAKICAgICB9CiAKICAgICB2b2lkIHBsYWNlTnVtYmVyKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gbU51bWJlclRleHQgPSBJbnRlZ2VyLnRvU3RyaW5nKG1JY29uLm51bWJlcik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHI7CisgICAgICAgIGZpbmFsIGludCB0b29CaWcgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5pbnRlZ2VyLnN0YXR1c19iYXJfbm90aWZpY2F0aW9uX2luZm9fbWF4bnVtKTsKKyAgICAgICAgaWYgKG1JY29uLm51bWJlciA+IHRvb0JpZykgeworICAgICAgICAgICAgc3RyID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLnN0cmluZy5zdGF0dXNfYmFyX25vdGlmaWNhdGlvbl9pbmZvX292ZXJmbG93KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdCBmID0gTnVtYmVyRm9ybWF0LmdldEludGVnZXJJbnN0YW5jZSgpOworICAgICAgICAgICAgc3RyID0gZi5mb3JtYXQobUljb24ubnVtYmVyKTsKKyAgICAgICAgfQorICAgICAgICBtTnVtYmVyVGV4dCA9IHN0cjsKKwogICAgICAgICBmaW5hbCBpbnQgdyA9IGdldFdpZHRoKCk7CiAgICAgICAgIGZpbmFsIGludCBoID0gZ2V0SGVpZ2h0KCk7CiAgICAgICAgIGZpbmFsIFJlY3QgciA9IG5ldyBSZWN0KCk7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL0V4cGFuZGVkVmlldy5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9FeHBhbmRlZFZpZXcuamF2YQppbmRleCA5MmI4OTc2Li41MWZjN2MyIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL0V4cGFuZGVkVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvRXhwYW5kZWRWaWV3LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucGhvbmU7CiAKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5MYXlvdXRUcmFuc2l0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CkBAIC0zNyw2ICszOCw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgewogICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKworICAgICAgICBzZXRMYXllclR5cGUoTEFZRVJfVFlQRV9IQVJEV0FSRSwgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqIFdlIHdhbnQgdG8gc2hyaW5rIGRvd24gdG8gMCwgYW5kIGlnbm9yZSB0aGUgYmFja2dyb3VuZC4gKi8KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvTmF2aWdhdGlvbkJhclZpZXcuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvTmF2aWdhdGlvbkJhclZpZXcuamF2YQppbmRleCA3ZDZjNTdiLi43ZGFmYjg5MiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9OYXZpZ2F0aW9uQmFyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvTmF2aWdhdGlvbkJhclZpZXcuamF2YQpAQCAtMzYsNiArMzYsOCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CiAKIHB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uQmFyVmlldyBleHRlbmRzIExpbmVhckxheW91dCB7CisgICAgZmluYWwgc3RhdGljIGJvb2xlYW4gTkFWQkFSX0FMV0FZU19BVF9SSUdIVCA9IHRydWU7CisKICAgICBwcm90ZWN0ZWQgSVN0YXR1c0JhclNlcnZpY2UgbUJhclNlcnZpY2U7CiAgICAgZmluYWwgRGlzcGxheSBtRGlzcGxheTsKICAgICBWaWV3W10gbVJvdGF0ZWRWaWV3cyA9IG5ldyBWaWV3WzRdOwpAQCAtODgsNyArOTAsOSBAQAogCiAgICAgICAgIG1Sb3RhdGVkVmlld3NbU3VyZmFjZS5ST1RBVElPTl85MF0gPSBmaW5kVmlld0J5SWQoUi5pZC5yb3Q5MCk7CiAgICAgICAgIAotICAgICAgICBtUm90YXRlZFZpZXdzW1N1cmZhY2UuUk9UQVRJT05fMjcwXSA9IGZpbmRWaWV3QnlJZChSLmlkLnJvdDI3MCk7CisgICAgICAgIG1Sb3RhdGVkVmlld3NbU3VyZmFjZS5ST1RBVElPTl8yNzBdID0gTkFWQkFSX0FMV0FZU19BVF9SSUdIVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaW5kVmlld0J5SWQoUi5pZC5yb3Q5MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmluZFZpZXdCeUlkKFIuaWQucm90MjcwKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvUGhvbmVTdGF0dXNCYXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcGhvbmUvUGhvbmVTdGF0dXNCYXIuamF2YQppbmRleCBlNjZhMWEyLi4wYjgyMTIzIDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3Bob25lL1Bob25lU3RhdHVzQmFyLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9waG9uZS9QaG9uZVN0YXR1c0Jhci5qYXZhCkBAIC0yOCwxMCArMjgsMTIgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGl4ZWxGb3JtYXQ7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CkBAIC03NCw2ICs3Niw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuc3RhdHVzYmFyLlN0YXR1c0Jhck5vdGlmaWNhdGlvbjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudHNQYW5lbFZpZXc7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLk5vdGlmaWNhdGlvbkRhdGE7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLlN0YXR1c0JhcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIuU3RhdHVzQmFySWNvblZpZXc7CkBAIC04Myw2ICs4Niw3IEBACiBwdWJsaWMgY2xhc3MgUGhvbmVTdGF0dXNCYXIgZXh0ZW5kcyBTdGF0dXNCYXIgewogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlBob25lU3RhdHVzQmFyIjsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUEVXID0gZmFsc2U7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBVFVTQkFSX1NUQVJUCiAgICAgICAgICAgICA9ICJjb20uYW5kcm9pZC5pbnRlcm5hbC5wb2xpY3kuc3RhdHVzYmFyLlNUQVJUIjsKQEAgLTk0LDYgKzk4LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0FOSU1BVEVfUkVWRUFMID0gMTAwMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1NIT1dfSU5UUlVERVIgPSAxMDAyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfSElERV9JTlRSVURFUiA9IDEwMDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX1JFQ0VOVFNfUEFORUwgPSAxMDIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfUkVDRU5UU19QQU5FTCA9IDEwMjE7CiAKICAgICAvLyB3aWxsIGxpa2VseSBtb3ZlIHRvIGEgcmVzb3VyY2Ugb3Igb3RoZXIgdHVuYWJsZSBwYXJhbSBhdCBzb21lIHBvaW50CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVFJVREVSX0FMRVJUX0RFQ0FZX01TID0gMTAwMDA7CkBAIC0xMzAsMTEgKzEzNiwxMSBAQAogICAgIC8vIG9uZ29pbmcKICAgICBOb3RpZmljYXRpb25EYXRhIG1PbmdvaW5nID0gbmV3IE5vdGlmaWNhdGlvbkRhdGEoKTsKICAgICBUZXh0VmlldyBtT25nb2luZ1RpdGxlOwotICAgIExpbmVhckxheW91dCBtT25nb2luZ0l0ZW1zOworICAgIFZpZXdHcm91cCBtT25nb2luZ0l0ZW1zOwogICAgIC8vIGxhdGVzdAogICAgIE5vdGlmaWNhdGlvbkRhdGEgbUxhdGVzdCA9IG5ldyBOb3RpZmljYXRpb25EYXRhKCk7CiAgICAgVGV4dFZpZXcgbUxhdGVzdFRpdGxlOwotICAgIExpbmVhckxheW91dCBtTGF0ZXN0SXRlbXM7CisgICAgVmlld0dyb3VwIG1MYXRlc3RJdGVtczsKICAgICAvLyBwb3NpdGlvbgogICAgIGludFtdIG1Qb3NpdGlvblRtcCA9IG5ldyBpbnRbMl07CiAgICAgYm9vbGVhbiBtRXhwYW5kZWQ7CkBAIC0xNjAsNiArMTY2LDkgQEAKICAgICBwcml2YXRlIFZpZXcgbVRpY2tlclZpZXc7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1UaWNraW5nOwogCisgICAgLy8gUmVjZW50IGFwcGxpY2F0aW9ucworICAgIHByaXZhdGUgUmVjZW50c1BhbmVsVmlldyBtUmVjZW50c1BhbmVsOworCiAgICAgLy8gVHJhY2tpbmcgZmluZ2VyIGZvciBvcGVuaW5nL2Nsb3NpbmcuCiAgICAgaW50IG1FZGdlQm9yZGVyOyAvLyBjb3JyZXNwb25kcyB0byBSLmRpbWVuLnN0YXR1c19iYXJfZWRnZV9pZ25vcmUKICAgICBib29sZWFuIG1UcmFja2luZzsKQEAgLTI2OCw5ICsyNzcsOSBAQAogICAgICAgICBtRXhwYW5kZWRWaWV3ID0gZXhwYW5kZWQ7CiAgICAgICAgIG1FeHBhbmRlZENvbnRlbnRzID0gZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubm90aWZpY2F0aW9uTGluZWFyTGF5b3V0KTsKICAgICAgICAgbU9uZ29pbmdUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nVGl0bGUpOwotICAgICAgICBtT25nb2luZ0l0ZW1zID0gKExpbmVhckxheW91dClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOworICAgICAgICBtT25nb2luZ0l0ZW1zID0gKFZpZXdHcm91cClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5vbmdvaW5nSXRlbXMpOwogICAgICAgICBtTGF0ZXN0VGl0bGUgPSAoVGV4dFZpZXcpZXhwYW5kZWQuZmluZFZpZXdCeUlkKFIuaWQubGF0ZXN0VGl0bGUpOwotICAgICAgICBtTGF0ZXN0SXRlbXMgPSAoTGluZWFyTGF5b3V0KWV4cGFuZGVkLmZpbmRWaWV3QnlJZChSLmlkLmxhdGVzdEl0ZW1zKTsKKyAgICAgICAgbUxhdGVzdEl0ZW1zID0gKFZpZXdHcm91cClleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5sYXRlc3RJdGVtcyk7CiAgICAgICAgIG1Ob05vdGlmaWNhdGlvbnNUaXRsZSA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5ub05vdGlmaWNhdGlvbnNUaXRsZSk7CiAgICAgICAgIG1DbGVhckJ1dHRvbiA9IChUZXh0VmlldylleHBhbmRlZC5maW5kVmlld0J5SWQoUi5pZC5jbGVhcl9hbGxfYnV0dG9uKTsKICAgICAgICAgbUNsZWFyQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xlYXJCdXR0b25MaXN0ZW5lcik7CkBAIC0yOTYsNiArMzA1LDkgQEAKICAgICAgICAgc2V0QXJlVGhlcmVOb3RpZmljYXRpb25zKCk7CiAgICAgICAgIG1EYXRlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKIAorICAgICAgICAvLyBSZWNlbnRzIFBhbmVsCisgICAgICAgIGluaXRpYWxpemVSZWNlbnRzUGFuZWwoKTsKKwogICAgICAgICAvLyByZWNlaXZlIGJyb2FkY2FzdHMKICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRCk7CkBAIC0zMDYsNiArMzE4LDUxIEBACiAgICAgICAgIHJldHVybiBzYjsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgZ2V0UmVjZW50c0xheW91dFBhcmFtcygpIHsKKyAgICAgICAgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGZhbHNlOworICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0FMVF9GT0NVU0FCTEVfSU0KKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU1BMSVRfVE9VQ0gKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsCisgICAgICAgICAgICAgICAgKHRyYW5zbHVjZW50ID8gUGl4ZWxGb3JtYXQuT1BBUVVFIDogUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5MRUZUOworICAgICAgICBscC5zZXRUaXRsZSgiUmVjZW50c1BhbmVsIik7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBSLnN0eWxlLkFuaW1hdGlvbl9SZWNlbnRQYW5lbDsKKyAgICAgICAgbHAuc29mdElucHV0TW9kZSA9IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfU1RBVEVfVU5DSEFOR0VECisgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfTk9USElORzsKKyAgICAgICAgcmV0dXJuIGxwOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZWNlbnRzUGFuZWwoKSB7CisgICAgICAgIC8vIFJlY2VudHMgUGFuZWwKKyAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gZmFsc2U7CisgICAgICAgIGlmIChtUmVjZW50c1BhbmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZpc2libGUgPSBtUmVjZW50c1BhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7CisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkucmVtb3ZlVmlldyhtUmVjZW50c1BhbmVsKTsKKyAgICAgICAgfQorICAgICAgICBtUmVjZW50c1BhbmVsID0gKFJlY2VudHNQYW5lbFZpZXcpIFZpZXcuaW5mbGF0ZShtQ29udGV4dCwKKyAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX3JlY2VudF9wYW5lbCwgbnVsbCk7CisKKyAgICAgICAgbVJlY2VudHNQYW5lbC5zZXRPblRvdWNoTGlzdGVuZXIobmV3IFRvdWNoT3V0c2lkZUxpc3RlbmVyKE1TR19DTE9TRV9SRUNFTlRTX1BBTkVMLAorICAgICAgICAgICAgICAgIG1SZWNlbnRzUGFuZWwpKTsKKyAgICAgICAgbVJlY2VudHNQYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zIGxwID0gZ2V0UmVjZW50c0xheW91dFBhcmFtcygpOworCisgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1SZWNlbnRzUGFuZWwsIGxwKTsKKyAgICAgICAgbVJlY2VudHNQYW5lbC5zZXRCYXIodGhpcyk7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIHNldCB2aXNpYmlsaXR5IHRvIFZpZXcuR09ORSBlYXJsaWVyIHNpbmNlIHRoYXQKKyAgICAgICAgICAgIC8vIHRyaWdnZXJzIHJlZnJlc2hpbmcgYXBwbGljYXRpb24gbGlzdAorICAgICAgICAgICAgbVJlY2VudHNQYW5lbC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICBtUmVjZW50c1BhbmVsLnNob3codHJ1ZSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgaW50IGdldFN0YXR1c0JhckdyYXZpdHkoKSB7CiAgICAgICAgIHJldHVybiBHcmF2aXR5LlRPUCB8IEdyYXZpdHkuRklMTF9IT1JJWk9OVEFMOwogICAgIH0KQEAgLTM0OSw3ICs0MDYsOCBAQAogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfVE9VQ0hBQkxFX1dIRU5fV0FLSU5HCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFCi0gICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TUExJVF9UT1VDSCwKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NQTElUX1RPVUNICisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TTElQUEVSWSwKICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CiAKICAgICAgICAgbHAuc2V0VGl0bGUoIk5hdmlnYXRpb25CYXIiKTsKQEAgLTM2MCw3ICs0MTgsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTdXJmYWNlLlJPVEFUSU9OXzI3MDoKICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgaGFzIGJlZW4gdHVybmVkIDkwZGVnIGNsb2Nrd2lzZQotICAgICAgICAgICAgICAgIGxwLmdyYXZpdHkgPSBHcmF2aXR5LkxFRlQgfCBHcmF2aXR5LkZJTExfVkVSVElDQUw7CisgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IChOYXZpZ2F0aW9uQmFyVmlldy5OQVZCQVJfQUxXQVlTX0FUX1JJR0hUID8gR3Jhdml0eS5SSUdIVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdyYXZpdHkuTEVGVCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR3Jhdml0eS5GSUxMX1ZFUlRJQ0FMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LkZJTExfSE9SSVpPTlRBTDsKQEAgLTU3OCw2ICs2MzgsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKKyAgICAgICAgaW5pdGlhbGl6ZVJlY2VudHNQYW5lbCgpOworICAgIH0KKworCiAgICAgVmlld1tdIG1ha2VOb3RpZmljYXRpb25WaWV3KFN0YXR1c0Jhck5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIFZpZXdHcm91cCBwYXJlbnQpIHsKICAgICAgICAgTm90aWZpY2F0aW9uIG4gPSBub3RpZmljYXRpb24ubm90aWZpY2F0aW9uOwogICAgICAgICBSZW1vdGVWaWV3cyByZW1vdGVWaWV3cyA9IG4uY29udGVudFZpZXc7CkBAIC03ODYsNiArODUyLDIxIEBACiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfSElERV9JTlRSVURFUjoKICAgICAgICAgICAgICAgICAgICAgc2V0SW50cnVkZXJBbGVydFZpc2liaWxpdHkoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19PUEVOX1JFQ0VOVFNfUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgcmVjZW50cyBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlY2VudHNQYW5lbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlKFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9CQUNLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNlbnRzUGFuZWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlY2VudHNQYW5lbC5zaG93KHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX1JFQ0VOVFNfUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNsb3NpbmcgcmVjZW50cyBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAobVJlY2VudHNQYW5lbCAhPSBudWxsICYmIG1SZWNlbnRzUGFuZWwuaXNTaG93aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUoU3RhdHVzQmFyTWFuYWdlci5ESVNBQkxFX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVJlY2VudHNQYW5lbC5zaG93KGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTgzMiw2ICs5MTMsMTAgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhbmltYXRlQ29sbGFwc2UoKSB7CisgICAgICAgIGFuaW1hdGVDb2xsYXBzZShmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5pbWF0ZUNvbGxhcHNlKGJvb2xlYW4gZXhjbHVkZVJlY2VudHMpIHsKICAgICAgICAgaWYgKFNQRVcpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsICJhbmltYXRlQ29sbGFwc2UoKTogbUV4cGFuZGVkPSIgKyBtRXhwYW5kZWQKICAgICAgICAgICAgICAgICAgICAgKyAiIG1FeHBhbmRlZFZpc2libGU9IiArIG1FeHBhbmRlZFZpc2libGUKQEAgLTg0MSw2ICs5MjYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIG1BbmltVmVsPSIgKyBtQW5pbVZlbCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoIWV4Y2x1ZGVSZWNlbnRzKSB7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQ0xPU0VfUkVDRU5UU19QQU5FTCk7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19DTE9TRV9SRUNFTlRTX1BBTkVMKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICghbUV4cGFuZGVkVmlzaWJsZSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMTQxLDcgKzEyMzEsNyBAQAogICAgIH0KIAogICAgIC8vIE5vdCBzdXBwb3J0ZWQKLSAgICBwdWJsaWMgdm9pZCBzZXRNZW51S2V5VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsgfQorICAgIHB1YmxpYyB2b2lkIHRvcEFwcFdpbmRvd0NoYW5nZWQoYm9vbGVhbiB2aXNpYmxlKSB7IH0KICAgICBwdWJsaWMgdm9pZCBzZXRJbWVXaW5kb3dTdGF0dXMoSUJpbmRlciB0b2tlbiwgaW50IHZpcywgaW50IGJhY2tEaXNwb3NpdGlvbikgeyB9CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0SGFyZEtleWJvYXJkU3RhdHVzKGJvb2xlYW4gYXZhaWxhYmxlLCBib29sZWFuIGVuYWJsZWQpIHsgfQpAQCAtMTU1NCw2ICsxNjQ0LDEzIEBACiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeyB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdG9nZ2xlUmVjZW50QXBwcygpIHsKKyAgICAgICAgaW50IG1zZyA9IChtUmVjZW50c1BhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpCisgICAgICAgICAgICAgICAgPyBNU0dfT1BFTl9SRUNFTlRTX1BBTkVMIDogTVNHX0NMT1NFX1JFQ0VOVFNfUEFORUw7CisgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7CisgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UobXNnKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUaGUgTEVEcyBhcmUgdHVybmVkIG8pZmYgd2hlbiB0aGUgbm90aWZpY2F0aW9uIHBhbmVsIGlzIHNob3duLCBldmVuIGp1c3QgYSBsaXR0bGUgYml0LgogICAgICAqIFRoaXMgd2FzIGFkZGVkIGxhc3QtbWludXRlIGFuZCBpcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IHRoZSByZXN0IG9mIHRoZSBub3RpZmljYXRpb25zCkBAIC0xNjIyLDcgKzE3MTksMTQgQEAKICAgICAgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CiAgICAgICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9DTE9TRV9TWVNURU1fRElBTE9HUy5lcXVhbHMoYWN0aW9uKQogICAgICAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlQ29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGV4Y2x1ZGVSZWNlbnRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKEludGVudC5BQ1RJT05fQ0xPU0VfU1lTVEVNX0RJQUxPR1MuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGludGVudC5nZXRFeHRyYXMoKS5nZXRTdHJpbmcoInJlYXNvbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVhc29uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVSZWNlbnRzID0gcmVhc29uLmVxdWFscygicmVjZW50YXBwcyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFuaW1hdGVDb2xsYXBzZShleGNsdWRlUmVjZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0NPTkZJR1VSQVRJT05fQ0hBTkdFRC5lcXVhbHMoYWN0aW9uKSkgewogICAgICAgICAgICAgICAgIHJlcG9zaXRpb25OYXZpZ2F0aW9uQmFyKCk7CkBAIC0xNjg3LDUgKzE3OTEsMjcgQEAKICAgICAgICAgICAgIHZpYnJhdGUoKTsKICAgICAgICAgfQogICAgIH07CisKKyAgICBwdWJsaWMgY2xhc3MgVG91Y2hPdXRzaWRlTGlzdGVuZXIgaW1wbGVtZW50cyBWaWV3Lk9uVG91Y2hMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgaW50IG1Nc2c7CisgICAgICAgIHByaXZhdGUgUmVjZW50c1BhbmVsVmlldyBtUGFuZWw7CisKKyAgICAgICAgcHVibGljIFRvdWNoT3V0c2lkZUxpc3RlbmVyKGludCBtc2csIFJlY2VudHNQYW5lbFZpZXcgcGFuZWwpIHsKKyAgICAgICAgICAgIG1Nc2cgPSBtc2c7CisgICAgICAgICAgICBtUGFuZWwgPSBwYW5lbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2goVmlldyB2LCBNb3Rpb25FdmVudCBldikgeworICAgICAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBNb3Rpb25FdmVudC5BQ1RJT05fT1VUU0lERQorICAgICAgICAgICAgICAgIHx8IChhY3Rpb24gPT0gTW90aW9uRXZlbnQuQUNUSU9OX0RPV04KKyAgICAgICAgICAgICAgICAgICAgJiYgIW1QYW5lbC5pc0luQ29udGVudEFyZWEoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKSkpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtTXNnKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1Nc2cpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9Db21wYXRNb2RlQnV0dG9uLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9Db21wYXRNb2RlQnV0dG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZjczNAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcG9saWN5L0NvbXBhdE1vZGVCdXR0b24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7CisKK3B1YmxpYyBjbGFzcyBDb21wYXRNb2RlQnV0dG9uIGV4dGVuZHMgSW1hZ2VWaWV3IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdGF0dXNCYXIuQ29tcGF0TW9kZUJ1dHRvbiI7CisKKyAgICBwcml2YXRlIEFjdGl2aXR5TWFuYWdlciBtQU07CisKKyAgICBwdWJsaWMgQ29tcGF0TW9kZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGF0TW9kZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKKworICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7CisKKyAgICAgICAgbUFNID0gKEFjdGl2aXR5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisKKyAgICAgICAgcmVmcmVzaCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIGludCBtb2RlID0gbUFNLmdldEZyb250QWN0aXZpdHlTY3JlZW5Db21wYXRNb2RlKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzID0gKG1vZGUgIT0gQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX05FVkVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1vZGUgIT0gQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0FMV0FZUyk7CisgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImNvbXBhdCBtb2RlIGlzICIgKyBtb2RlICsgIjsgaWNvbiB3aWxsICIgKyAodmlzID8gInNob3ciIDogImhpZGUiKSk7CisgICAgICAgIHNldFZpc2liaWxpdHkodmlzID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9OZXR3b3JrQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9wb2xpY3kvTmV0d29ya0NvbnRyb2xsZXIuamF2YQppbmRleCA3MGE3OGRmLi4zMTc1YTk5IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9OZXR3b3JrQ29udHJvbGxlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcG9saWN5L05ldHdvcmtDb250cm9sbGVyLmphdmEKQEAgLTQ0NiwxMiArNDQ2LDE0IEBACiAgICAgfQogCiAgICAgYm9vbGVhbiBpc0NkbWFFcmkoKSB7Ci0gICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBtU2VydmljZVN0YXRlLmdldENkbWFFcmlJY29uSW5kZXgoKTsKLSAgICAgICAgaWYgKGljb25JbmRleCAhPSBFcmlJbmZvLlJPQU1JTkdfSU5ESUNBVE9SX09GRikgewotICAgICAgICAgICAgZmluYWwgaW50IGljb25Nb2RlID0gbVNlcnZpY2VTdGF0ZS5nZXRDZG1hRXJpSWNvbk1vZGUoKTsKLSAgICAgICAgICAgIGlmIChpY29uTW9kZSA9PSBFcmlJbmZvLlJPQU1JTkdfSUNPTl9NT0RFX05PUk1BTAotICAgICAgICAgICAgICAgICAgICB8fCBpY29uTW9kZSA9PSBFcmlJbmZvLlJPQU1JTkdfSUNPTl9NT0RFX0ZMQVNIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChtU2VydmljZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpY29uSW5kZXggPSBtU2VydmljZVN0YXRlLmdldENkbWFFcmlJY29uSW5kZXgoKTsKKyAgICAgICAgICAgIGlmIChpY29uSW5kZXggIT0gRXJpSW5mby5ST0FNSU5HX0lORElDQVRPUl9PRkYpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaWNvbk1vZGUgPSBtU2VydmljZVN0YXRlLmdldENkbWFFcmlJY29uTW9kZSgpOworICAgICAgICAgICAgICAgIGlmIChpY29uTW9kZSA9PSBFcmlJbmZvLlJPQU1JTkdfSUNPTl9NT0RFX05PUk1BTAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaWNvbk1vZGUgPT0gRXJpSW5mby5ST0FNSU5HX0lDT05fTU9ERV9GTEFTSCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtODU0LDcgKzg1Niw3IEBACiAgICAgICAgIHB3LnByaW50KCIgIG1EYXRhQWN0aXZpdHk9Iik7CiAgICAgICAgIHB3LnByaW50bG4obURhdGFBY3Rpdml0eSk7CiAgICAgICAgIHB3LnByaW50KCIgIG1TZXJ2aWNlU3RhdGU9Iik7Ci0gICAgICAgIHB3LnByaW50bG4obVNlcnZpY2VTdGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgcHcucHJpbnRsbihtU2VydmljZVN0YXRlKTsKICAgICAgICAgcHcucHJpbnQoIiAgbU5ldHdvcmtOYW1lPSIpOwogICAgICAgICBwdy5wcmludGxuKG1OZXR3b3JrTmFtZSk7CiAgICAgICAgIHB3LnByaW50KCIgIG1OZXR3b3JrTmFtZURlZmF1bHQ9Iik7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9Ob3RpZmljYXRpb25Sb3dMYXlvdXQuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcG9saWN5L05vdGlmaWNhdGlvblJvd0xheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MWZiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9Ob3RpZmljYXRpb25Sb3dMYXlvdXQuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeTsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yU2V0OworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLk9iamVjdEFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlRpbWVBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZlbG9jaXR5VHJhY2tlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5SOworCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uUm93TGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGlmaWNhdGlvblJvd0xheW91dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0xPV19BTklNQVRJT05TID0gZmFsc2U7IC8vIERFQlVHOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTklNQVRFX0xBWU9VVCA9IHRydWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENMRUFSX0lGX1NXSVBFRF9GQVJfRU5PVUdIID0gdHJ1ZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTlNUUkFJTl9TV0lQRV9PTl9QRVJNQU5FTlQgPSB0cnVlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFQUEVBUl9BTklNX0xFTiA9IFNMT1dfQU5JTUFUSU9OUyA/IDUwMDAgOiAyNTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0FQUEVBUl9BTklNX0xFTiA9IEFQUEVBUl9BTklNX0xFTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU05BUF9BTklNX0xFTiA9IFNMT1dfQU5JTUFUSU9OUyA/IDEwMDAgOiAyNTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTV0lQRV9FU0NBUEVfVkVMT0NJVFkgPSAxNTAwZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTV0lQRV9BTklNX1ZFTE9DSVRZX01JTiA9IDEwMDBmOworCisgICAgUmVjdCBtVG1wUmVjdCA9IG5ldyBSZWN0KCk7CisgICAgaW50IG1OdW1Sb3dzID0gMDsKKyAgICBpbnQgbVJvd0hlaWdodCA9IDA7CisgICAgaW50IG1IZWlnaHQgPSAwOworCisgICAgSGFzaFNldDxWaWV3PiBtQXBwZWFyaW5nVmlld3MgPSBuZXcgSGFzaFNldDxWaWV3PigpOworICAgIEhhc2hTZXQ8Vmlldz4gbURpc2FwcGVhcmluZ1ZpZXdzID0gbmV3IEhhc2hTZXQ8Vmlldz4oKTsKKworICAgIFZlbG9jaXR5VHJhY2tlciBtVlQ7CisgICAgZmxvYXQgbUluaXRpYWxUb3VjaFgsIG1Jbml0aWFsVG91Y2hZOworICAgIFZpZXcgbVNsaWRpbmdDaGlsZCA9IG51bGw7CisgICAgZmxvYXQgbUxpZnRvZmZWZWxvY2l0eTsKKworICAgIHB1YmxpYyBOb3RpZmljYXRpb25Sb3dMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7CisgICAgfQorCisgICAgcHVibGljIE5vdGlmaWNhdGlvblJvd0xheW91dChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSk7CisKKyAgICAgICAgbVZUID0gVmVsb2NpdHlUcmFja2VyLm9idGFpbigpOworCisgICAgICAgIFR5cGVkQXJyYXkgYSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhhdHRycywgUi5zdHlsZWFibGUuTm90aWZpY2F0aW9uUm93TGF5b3V0LAorICAgICAgICAgICAgICAgIGRlZlN0eWxlLCAwKTsKKyAgICAgICAgbVJvd0hlaWdodCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuc3R5bGVhYmxlLk5vdGlmaWNhdGlvblJvd0xheW91dF9yb3dIZWlnaHQsIDApOworICAgICAgICBhLnJlY3ljbGUoKTsKKworICAgICAgICBzZXRMYXlvdXRUcmFuc2l0aW9uKG51bGwpOworCisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgc2V0T25IaWVyYXJjaHlDaGFuZ2VMaXN0ZW5lcihuZXcgVmlld0dyb3VwLk9uSGllcmFyY2h5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGlsZFZpZXdBZGRlZChWaWV3IHBhcmVudCwgVmlldyBjaGlsZCkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAidmlldyBhZGRlZDogIiArIGNoaWxkICsgIjsgbmV3IGNvdW50OiAiICsgZ2V0Q2hpbGRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGlsZFZpZXdSZW1vdmVkKFZpZXcgcGFyZW50LCBWaWV3IGNoaWxkKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJ2aWV3IHJlbW92ZWQ6ICIgKyBjaGlsZCArICI7IG5ldyBjb3VudDogIiArIChnZXRDaGlsZENvdW50KCkgLSAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHNldEJhY2tncm91bmRDb2xvcigweDgwRkY4MDAwKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLy8gU3dpcGV5IGNvZGUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkludGVyY2VwdFRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworLy8gICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImludGVyY2VwdGluZyB0b3VjaCBldmVudDogIiArIGV2KTsKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046CisgICAgICAgICAgICAgICAgbVZULmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVZULmFkZE1vdmVtZW50KGV2KTsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFRvdWNoWCA9IGV2LmdldFgoKTsKKyAgICAgICAgICAgICAgICBtSW5pdGlhbFRvdWNoWSA9IGV2LmdldFkoKTsKKyAgICAgICAgICAgICAgICBtU2xpZGluZ0NoaWxkID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgbVZULmFkZE1vdmVtZW50KGV2KTsKKyAgICAgICAgICAgICAgICBpZiAobVNsaWRpbmdDaGlsZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhldi5nZXRYKCkgLSBtSW5pdGlhbFRvdWNoWCkgPiA0KSB7IC8vIHNsaWRlIHNsb3AKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgdmlldyB1bmRlciB0aGUgcG9pbnRlciwgYWNjb3VudGluZyBmb3IgR09ORSB2aWV3cworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoaWxkSWR4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBjaGlsZElkeCA8IGNvdW50OyBjaGlsZElkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNsaWRpbmdDaGlsZCA9IGdldENoaWxkQXQoY2hpbGRJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2xpZGluZ0NoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBHT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICs9IG1Sb3dIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jbml0aWFsVG91Y2hZIDwgeSkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0aWFsVG91Y2hYIC09IG1TbGlkaW5nQ2hpbGQuZ2V0VHJhbnNsYXRpb25YKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2xpZGluZ0NoaWxkLmFuaW1hdGUoKS5jYW5jZWwoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdyBzbGlkaW5nIGNoaWxkICVkOiAlcyAodG91Y2hZPSUuMWYsIHJvd0hlaWdodD0lZCwgY291bnQ9JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRJZHgsIG1TbGlkaW5nQ2hpbGQsIG1Jbml0aWFsVG91Y2hZLCBtUm93SGVpZ2h0LCBjb3VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU2xpZGluZ0NoaWxkICE9IG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVDbGVhcmVkKFZpZXcgdikgeworICAgICAgICBmaW5hbCBWaWV3IHZldG8gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnZldG8pOworICAgICAgICByZXR1cm4gKHZldG8gIT0gbnVsbCAmJiB2ZXRvLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGNsZWFyKFZpZXcgdikgeworICAgICAgICBmaW5hbCBWaWV3IHZldG8gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnZldG8pOworICAgICAgICBpZiAodmV0byAhPSBudWxsICYmIHZldG8uZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgeworICAgICAgICAgICAgdmV0by5wZXJmb3JtQ2xpY2soKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgZmluYWwgaW50IGFjdGlvbiA9IGV2LmdldEFjdGlvbigpOworLy8gICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgInRvdWNoIGV2ZW50OiAiICsgZXYgKyAiIHNsaWRpbmc6ICIgKyBtU2xpZGluZ0NoaWxkKTsKKyAgICAgICAgaWYgKG1TbGlkaW5nQ2hpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9PVVRTSURFOgorICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6CisgICAgICAgICAgICAgICAgICAgIG1WVC5hZGRNb3ZlbWVudChldik7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoZXYuZ2V0WCgpIC0gbUluaXRpYWxUb3VjaFgpOworICAgICAgICAgICAgICAgICAgICBpZiAoQ09OU1RSQUlOX1NXSVBFX09OX1BFUk1BTkVOVCAmJiAhY2FuQmVDbGVhcmVkKG1TbGlkaW5nQ2hpbGQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IE1hdGguY29weVNpZ24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihNYXRoLmFicyhkZWx0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2xpZGluZ0NoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSAqIDAuMmYpLCBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVNsaWRpbmdDaGlsZC5zZXRUcmFuc2xhdGlvblgoZGVsdGEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDoKKyAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9DQU5DRUw6CisgICAgICAgICAgICAgICAgICAgIG1WVC5hZGRNb3ZlbWVudChldik7CisgICAgICAgICAgICAgICAgICAgIG1WVC5jb21wdXRlQ3VycmVudFZlbG9jaXR5KDEwMDAgLyogcHgvc2VjICovKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiZXhpdCB2ZWxvY2l0eTogIiArIG1WVC5nZXRYVmVsb2NpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdG9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1MaWZ0b2ZmVmVsb2NpdHkgPSBtVlQuZ2V0WFZlbG9jaXR5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhtTGlmdG9mZlZlbG9jaXR5KSA+IFNXSVBFX0VTQ0FQRV9WRUxPQ0lUWQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKENMRUFSX0lGX1NXSVBFRF9GQVJfRU5PVUdIICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtU2xpZGluZ0NoaWxkLmdldFRyYW5zbGF0aW9uWCgpICogMikgPiBtU2xpZGluZ0NoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpbmdhZGluZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmUgPSAhIGNsZWFyKG1TbGlkaW5nQ2hpbGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0b3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwcGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgbVNsaWRpbmdDaGlsZC5hbmltYXRlKCkudHJhbnNsYXRpb25YKDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKFNOQVBfQU5JTV9MRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8qKgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFZpZXcoVmlldyBjaGlsZCwgaW50IGluZGV4LCBMYXlvdXRQYXJhbXMgcGFyYW1zKSB7CisgICAgICAgIHN1cGVyLmFkZFZpZXcoY2hpbGQsIGluZGV4LCBwYXJhbXMpOworCisgICAgICAgIGZpbmFsIFZpZXcgY2hpbGRGID0gY2hpbGQ7CisKKyAgICAgICAgaWYgKEFOSU1BVEVfTEFZT1VUKSB7CisgICAgICAgICAgICBtQXBwZWFyaW5nVmlld3MuYWRkKGNoaWxkKTsKKworICAgICAgICAgICAgY2hpbGQuc2V0UGl2b3RZKDApOworICAgICAgICAgICAgQW5pbWF0b3JTZXQgYSA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgYS5wbGF5VG9nZXRoZXIoCisgICAgICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yLm9mRmxvYXQoY2hpbGQsICJhbHBoYSIsIDBmLCAxZikKKy8vICAgICAgICAgICAgICAgICAgICAsT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChjaGlsZCwgInNjYWxlWSIsIDBmLCAxZikKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBhLnNldER1cmF0aW9uKEFQUEVBUl9BTklNX0xFTik7CisgICAgICAgICAgICBhLmFkZExpc3RlbmVyKG5ldyBBbmltYXRvckxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZChBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgbUFwcGVhcmluZ1ZpZXdzLnJlbW92ZShjaGlsZEYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYS5zdGFydCgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOyAvLyBzdGFydCB0aGUgY29udGFpbmVyIGFuaW1hdGlvbgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVmlldyhWaWV3IGNoaWxkKSB7CisgICAgICAgIGZpbmFsIFZpZXcgY2hpbGRGID0gY2hpbGQ7CisgICAgICAgIGlmIChBTklNQVRFX0xBWU9VVCkgeworICAgICAgICAgICAgaWYgKG1BcHBlYXJpbmdWaWV3cy5jb250YWlucyhjaGlsZCkpIHsKKyAgICAgICAgICAgICAgICBtQXBwZWFyaW5nVmlld3MucmVtb3ZlKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdWaWV3cy5hZGQoY2hpbGQpOworCisgICAgICAgICAgICBjaGlsZC5zZXRQaXZvdFkoMCk7CisKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IHZlbG9jaXR5ID0gKG1TbGlkaW5nQ2hpbGQgPT0gY2hpbGQpIAorICAgICAgICAgICAgICAgICAgICA/IE1hdGgubWluKG1MaWZ0b2ZmVmVsb2NpdHksIFNXSVBFX0FOSU1fVkVMT0NJVFlfTUlOKQorICAgICAgICAgICAgICAgICAgICA6IFNXSVBFX0VTQ0FQRV9WRUxPQ0lUWTsKKyAgICAgICAgICAgIGZpbmFsIFRpbWVBbmltYXRvciB6b29tID0gbmV3IFRpbWVBbmltYXRvcigpOworICAgICAgICAgICAgem9vbS5zZXRUaW1lTGlzdGVuZXIobmV3IFRpbWVBbmltYXRvci5UaW1lTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UaW1lVXBkYXRlKFRpbWVBbmltYXRvciBhbmltYXRpb24sIGxvbmcgdG90YWxUaW1lLCBsb25nIGRlbHRhVGltZSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZEYuc2V0VHJhbnNsYXRpb25YKGNoaWxkRi5nZXRUcmFuc2xhdGlvblgoKSArIGRlbHRhVGltZSAvIDEwMDBmICogdmVsb2NpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBmaW5hbCBPYmplY3RBbmltYXRvciBhbHBoYUZhZGUgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KGNoaWxkLCAiYWxwaGEiLCAwZik7CisgICAgICAgICAgICBhbHBoYUZhZGUuYWRkTGlzdGVuZXIobmV3IEFuaW1hdG9yTGlzdGVuZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICB6b29tLmNhbmNlbCgpOyAvLyBpdCB3b24ndCBlbmQgb24gaXRzIG93bgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJhY3R1YWxseSByZW1vdmluZyBjaGlsZDogIiArIGNoaWxkRik7CisgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvblJvd0xheW91dC5zdXBlci5yZW1vdmVWaWV3KGNoaWxkRik7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkRi5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICAgICAgICAgIG1EaXNhcHBlYXJpbmdWaWV3cy5yZW1vdmUoY2hpbGRGKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgQW5pbWF0b3JTZXQgYSA9IG5ldyBBbmltYXRvclNldCgpOworICAgICAgICAgICAgYS5wbGF5VG9nZXRoZXIoYWxwaGFGYWRlLCB6b29tKTsKKyAgICAgICAgICAgICAgICAgICAgCisvLyAgICAgICAgICAgICAgICAgICAgLE9iamVjdEFuaW1hdG9yLm9mRmxvYXQoY2hpbGQsICJzY2FsZVkiLCAwZikKKy8vICAgICAgICAgICAgICAgICAgICAsT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChjaGlsZCwgInRyYW5zbGF0aW9uWCIsIGNoaWxkLmdldFRyYW5zbGF0aW9uWCgpICsgMzAwZikKKworICAgICAgICAgICAgYS5zZXREdXJhdGlvbihESVNBUFBFQVJfQU5JTV9MRU4pOworICAgICAgICAgICAgYS5zdGFydCgpOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOyAvLyBzdGFydCB0aGUgY29udGFpbmVyIGFuaW1hdGlvbgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIucmVtb3ZlVmlldyhjaGlsZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8qKgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlKCkgeworICAgICAgICBzdXBlci5vbkZpbmlzaEluZmxhdGUoKTsKKyAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRHJhdyhhbmRyb2lkLmdyYXBoaWNzLkNhbnZhcyBjKSB7CisgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAvL1Nsb2cuZChUQUcsICJvbkRyYXc6IGNhbnZhcyBoZWlnaHQ6ICIgKyBjLmdldEhlaWdodCgpICsgInB4OyBtZWFzdXJlZCBoZWlnaHQ6ICIKKyAgICAgICAgICAgIC8vICAgICAgICArIGdldE1lYXN1cmVkSGVpZ2h0KCkgKyAicHgiKTsKKyAgICAgICAgICAgIGMuc2F2ZSgpOworICAgICAgICAgICAgYy5jbGlwUmVjdCg2LCA2LCBjLmdldFdpZHRoKCkgLSA2LCBnZXRNZWFzdXJlZEhlaWdodCgpIC0gNiwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5ncmFwaGljcy5SZWdpb24uT3AuRElGRkVSRU5DRSk7CisgICAgICAgICAgICBjLmRyYXdDb2xvcigweEZGRkY4MDAwKTsKKyAgICAgICAgICAgIGMucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKKyAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ2V0Q2hpbGRDb3VudCgpOworCisgICAgICAgIC8vIHBhc3MgMTogY291bnQgdGhlIG51bWJlciBvZiBub24tR09ORSB2aWV3cworICAgICAgICBpbnQgbnVtUm93cyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IGdldENoaWxkQXQoaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpID09IEdPTkUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRGlzYXBwZWFyaW5nVmlld3MuY29udGFpbnMoY2hpbGQpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1Sb3dzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bVJvd3MgIT0gbU51bVJvd3MpIHsKKyAgICAgICAgICAgIC8vIHVoIG9oLCBub3cgeW91IG1hZGUgdXMgZ28gYW5kIGRvIHdvcmsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmluYWwgaW50IGNvbXB1dGVkSGVpZ2h0ID0gbnVtUm93cyAqIG1Sb3dIZWlnaHQ7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCBTdHJpbmcuZm9ybWF0KCJyb3dzIHdlbnQgZnJvbSAlZCB0byAlZCwgcmVzaXppbmcgdG8gJWRweCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVJvd3MsIG51bVJvd3MsIGNvbXB1dGVkSGVpZ2h0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1OdW1Sb3dzID0gbnVtUm93czsKKworICAgICAgICAgICAgaWYgKEFOSU1BVEVfTEFZT1VUICYmIGlzU2hvd24oKSkgeworICAgICAgICAgICAgICAgIE9iamVjdEFuaW1hdG9yLm9mSW50KHRoaXMsICJmb3JjZWRIZWlnaHQiLCBjb21wdXRlZEhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKEFQUEVBUl9BTklNX0xFTikKKyAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldEZvcmNlZEhlaWdodChjb21wdXRlZEhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXNzIDI6IHlvdSBrbm93LCBkbyB0aGUgbWVhc3VyaW5nCisgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoTVMgPSB3aWR0aE1lYXN1cmVTcGVjOworICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNUyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKKyAgICAgICAgICAgICAgICBtUm93SGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBnZXRDaGlsZEF0KGkpOworICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSA9PSBHT05FKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1TLCBjaGlsZEhlaWdodE1TKTsKKyAgICAgICAgfQorCisgICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKAorICAgICAgICAgICAgICAgIGdldERlZmF1bHRTaXplKGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aCgpLCB3aWR0aE1lYXN1cmVTcGVjKSwKKyAgICAgICAgICAgICAgICByZXNvbHZlU2l6ZShnZXRGb3JjZWRIZWlnaHQoKSwgaGVpZ2h0TWVhc3VyZVNwZWMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKKyAgICAgICAgZmluYWwgaW50IHdpZHRoID0gcmlnaHQgLSBsZWZ0OworICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gYm90dG9tIC0gdG9wOworCisgICAgICAgIC8vaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAib25MYXlvdXQ6IGhlaWdodD0iICsgaGVpZ2h0KTsKKworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBnZXRDaGlsZENvdW50KCk7CisgICAgICAgIGludCB5ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gZ2V0Q2hpbGRBdChpKTsKKyAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgPT0gR09ORSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBmaW5hbCBpbnQgdGhpc1Jvd0hlaWdodCA9IChpbnQpKAorLy8gICAgICAgICAgICAgICAgKChtQXBwZWFyaW5nVmlld3MuY29udGFpbnMoY2hpbGQpIHx8IG1EaXNhcHBlYXJpbmdWaWV3cy5jb250YWlucyhjaGlsZCkpCisvLyAgICAgICAgICAgICAgICAgICAgICAgID8gY2hpbGQuZ2V0U2NhbGVZKCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgOiAxLjBmKQorLy8gICAgICAgICAgICAgICAgKiBtUm93SGVpZ2h0KTsKKyAgICAgICAgICAgIGZpbmFsIGludCB0aGlzUm93SGVpZ2h0ID0gKGludCkoY2hpbGQuZ2V0QWxwaGEoKSAqIG1Sb3dIZWlnaHQpOworLy8gICAgICAgICAgICBjaGlsZC5sYXlvdXQoMCwgeSwgd2lkdGgsIHkgKyB0aGlzUm93SGVpZ2h0KTsKKyAgICAgICAgICAgIGNoaWxkLmxheW91dCgwLCB5LCB3aWR0aCwgeSArIG1Sb3dIZWlnaHQpOworICAgICAgICAgICAgeSArPSB0aGlzUm93SGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rm9yY2VkSGVpZ2h0KGludCBoKSB7CisgICAgICAgIC8vaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiZm9yY2VkSGVpZ2h0OiAiICsgaCk7CisgICAgICAgIGlmIChoICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgIG1IZWlnaHQgPSBoOworICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRGb3JjZWRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBtSGVpZ2h0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcG9saWN5L1ByZWZzLmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3BvbGljeS9QcmVmcy5qYXZhCmluZGV4IDA1ZWFmZTguLjgzZThjOTYgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvcG9saWN5L1ByZWZzLmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci9wb2xpY3kvUHJlZnMuamF2YQpAQCAtMjYsNiArMjYsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPX05PVF9ESVNUVVJCX1BSRUYgPSAiZG9fbm90X2Rpc3R1cmIiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBET19OT1RfRElTVFVSQl9ERUZBVUxUID0gZmFsc2U7CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XTl9DT01QQVRfTU9ERV9IRUxQID0gInNob3duX2NvbXBhdF9tb2RlX2hlbHAiOworCiAgICAgcHVibGljIHN0YXRpYyBTaGFyZWRQcmVmZXJlbmNlcyByZWFkKENvbnRleHQgY29udGV4dCkgewogICAgICAgICByZXR1cm4gY29udGV4dC5nZXRTaGFyZWRQcmVmZXJlbmNlcyhQcmVmcy5TSEFSRURfUFJFRlNfTkFNRSwgQ29udGV4dC5NT0RFX1BSSVZBVEUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L0NvbXBhdE1vZGVQYW5lbC5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvQ29tcGF0TW9kZVBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyYzRhZAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L0NvbXBhdE1vZGVQYW5lbC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIudGFibGV0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SYWRpb0J1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5SYWRpb0dyb3VwOworCitpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuUjsKKworcHVibGljIGNsYXNzIENvbXBhdE1vZGVQYW5lbCBleHRlbmRzIEZyYW1lTGF5b3V0IGltcGxlbWVudHMgU3RhdHVzQmFyUGFuZWwsCisgICAgICAgIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gVGFibGV0U3RhdHVzQmFyLkRFQlVHOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ29tcGF0TW9kZVBhbmVsIjsKKworICAgIHByaXZhdGUgQWN0aXZpdHlNYW5hZ2VyIG1BTTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBSYWRpb0J1dHRvbiBtT25CdXR0b24sIG1PZmZCdXR0b247CisKKyAgICBwcml2YXRlIFZpZXcgbVRyaWdnZXI7CisvLyAgICBwcml2YXRlIElucHV0TWV0aG9kQnV0dG9uIG1JbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbjsKKworICAgIHB1YmxpYyBDb21wYXRNb2RlUGFuZWwoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1BTSA9IChBY3Rpdml0eU1hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRmluaXNoSW5mbGF0ZSgpIHsKKyAgICAgICAgbU9uQnV0dG9uICA9IChSYWRpb0J1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuY29tcGF0X21vZGVfb25fcmFkaW8pOworICAgICAgICBtT2ZmQnV0dG9uID0gKFJhZGlvQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5jb21wYXRfbW9kZV9vZmZfcmFkaW8pOworICAgICAgICBtT25CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtT2ZmQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICByZWZyZXNoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7CisgICAgICAgIGlmIChtQXR0YWNoZWQpIHsKKyAgICAgICAgICAgIG1BdHRhY2hlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgeworICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKKyAgICAgICAgaWYgKCFtQXR0YWNoZWQpIHsKKyAgICAgICAgICAgIG1BdHRhY2hlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBpZiAodiA9PSBtT25CdXR0b24pIHsKKyAgICAgICAgICAgIG1BTS5zZXRGcm9udEFjdGl2aXR5U2NyZWVuQ29tcGF0TW9kZShBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfRU5BQkxFRCk7CisgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtT2ZmQnV0dG9uKSB7CisgICAgICAgICAgICBtQU0uc2V0RnJvbnRBY3Rpdml0eVNjcmVlbkNvbXBhdE1vZGUoQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSW5Db250ZW50QXJlYShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRyaWdnZXIoVmlldyB2KSB7CisgICAgICAgIG1UcmlnZ2VyID0gdjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvcGVuUGFuZWwoKSB7CisgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgaWYgKG1UcmlnZ2VyICE9IG51bGwpIG1UcmlnZ2VyLnNldFNlbGVjdGVkKHRydWUpOworICAgICAgICByZWZyZXNoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VQYW5lbCgpIHsKKyAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICBpZiAobVRyaWdnZXIgIT0gbnVsbCkgbVRyaWdnZXIuc2V0U2VsZWN0ZWQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkgeworICAgICAgICBpbnQgbW9kZSA9IG1BTS5nZXRGcm9udEFjdGl2aXR5U2NyZWVuQ29tcGF0TW9kZSgpOworICAgICAgICBpZiAobW9kZSA9PSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfQUxXQVlTCisgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfTkVWRVIpIHsKKyAgICAgICAgICAgIC8vIE5vIGxvbmdlciBoYXZlIHNvbWV0aGluZyB0byBzd2l0Y2guCisgICAgICAgICAgICBjbG9zZVBhbmVsKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgYm9vbGVhbiBvbiA9IChtb2RlID09IEFjdGl2aXR5TWFuYWdlci5DT01QQVRfTU9ERV9FTkFCTEVEKTsKKyAgICAgICAgbU9uQnV0dG9uLnNldENoZWNrZWQob24pOworICAgICAgICBtT2ZmQnV0dG9uLnNldENoZWNrZWQoIW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9IZWlnaHRSZWNlaXZlci5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvSGVpZ2h0UmVjZWl2ZXIuamF2YQppbmRleCA5OTI0ZmFhLi43ZjRjOTE4IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9IZWlnaHRSZWNlaXZlci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L0hlaWdodFJlY2VpdmVyLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgaW50IGhlaWdodCA9IC0xOwogICAgICAgICBpZiAocGx1Z2dlZCkgewogICAgICAgICAgICAgZmluYWwgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IG5ldyBEaXNwbGF5TWV0cmljcygpOwotICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRNZXRyaWNzKG1ldHJpY3MpOworICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRSZWFsTWV0cmljcyhtZXRyaWNzKTsKICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgInNldFBsdWdnZWQ6IGRpc3BsYXkgbWV0cmljcz0iICsgbWV0cmljcyk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgc2hvcnRTaWRlID0gTWF0aC5taW4obWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy5oZWlnaHRQaXhlbHMpOwogICAgICAgICAgICAgaGVpZ2h0ID0gc2hvcnRTaWRlIC0gNzIwOwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvSW5wdXRNZXRob2RzUGFuZWwuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L0lucHV0TWV0aG9kc1BhbmVsLmphdmEKaW5kZXggZTlkYjk5OC4uMzM5ZTNmMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvSW5wdXRNZXRob2RzUGFuZWwuamF2YQorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9JbnB1dE1ldGhvZHNQYW5lbC5qYXZhCkBAIC00MjIsOSArNDIyLDggQEAKICAgICAgICAgICAgIExvZy5kKFRBRywgIkdldCB0ZXh0IGZyb206ICIgKyBpbWkuZ2V0UGFja2FnZU5hbWUoKSArIHN1YnR5cGUuZ2V0TmFtZVJlc0lkKCkKICAgICAgICAgICAgICAgICAgICAgKyBpbWkuZ2V0U2VydmljZUluZm8oKS5hcHBsaWNhdGlvbkluZm8pOwogICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IENoYW5nZSB0aGUgbGFuZ3VhZ2Ugb2Ygc3VidHlwZSBuYW1lIGFjY29yZGluZyB0byBzdWJ0eXBlJ3MgbG9jYWxlLgotICAgICAgICByZXR1cm4gbVBhY2thZ2VNYW5hZ2VyLmdldFRleHQoCi0gICAgICAgICAgICAgICAgaW1pLmdldFBhY2thZ2VOYW1lKCksIHN1YnR5cGUuZ2V0TmFtZVJlc0lkKCksIGltaS5nZXRTZXJ2aWNlSW5mbygpLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgIHJldHVybiBzdWJ0eXBlLmdldERpc3BsYXlOYW1lKAorICAgICAgICAgICAgICAgIG1Db250ZXh0LCBpbWkuZ2V0UGFja2FnZU5hbWUoKSwgaW1pLmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKTsKICAgICB9CiAKICAgICBwcml2YXRlIERyYXdhYmxlIGdldFN1YnR5cGVJY29uKElucHV0TWV0aG9kSW5mbyBpbWksIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlKSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXIuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0Jhci5qYXZhCmluZGV4IDkxYzNjYzEuLjkzZjdhZjMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0Jhci5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0Jhci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uTGF5b3V0VHJhbnNpdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXJOYXRpdmU7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQuYXBwLlN0YXR1c0Jhck1hbmFnZXI7CkBAIC0zNSw2ICszNiw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5MYXllckRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC00Myw2ICs0NSw3IEBACiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKQEAgLTY4LDIxICs3MSwxOSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci4qOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuQmF0dGVyeUNvbnRyb2xsZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkuc3RhdHVzYmFyLnBvbGljeS5CbHVldG9vdGhDb250cm9sbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuQ29tcGF0TW9kZUJ1dHRvbjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5LkxvY2F0aW9uQ29udHJvbGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zeXN0ZW11aS5zdGF0dXNiYXIucG9saWN5Lk5ldHdvcmtDb250cm9sbGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLnN0YXR1c2Jhci5wb2xpY3kuUHJlZnM7CiBpbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LlJlY2VudHNQYW5lbFZpZXc7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3lzdGVtdWkucmVjZW50LmNhcm91c2VsLlJlY2VudEFwcGxpY2F0aW9uc0FjdGl2aXR5OwogCiBwdWJsaWMgY2xhc3MgVGFibGV0U3RhdHVzQmFyIGV4dGVuZHMgU3RhdHVzQmFyIGltcGxlbWVudHMKICAgICAgICAgSGVpZ2h0UmVjZWl2ZXIuT25CYXJIZWlnaHRDaGFuZ2VkTGlzdGVuZXIsCiAgICAgICAgIElucHV0TWV0aG9kc1BhbmVsLk9uSGFyZEtleWJvYXJkRW5hYmxlZENoYW5nZUxpc3RlbmVyIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfQ09NUEFUX0hFTFAgPSBmYWxzZTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVGFibGV0U3RhdHVzQmFyIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9OT1RJRklDQVRJT05fSUNPTlMgPSA1OwotICAgIC8vIElNRSBzd2l0Y2hlciBpY29uIGlzIGJpZyBhbmQgb2NjdXB5IHdpZHRoIG9mIHR3byBpY29ucwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9OT1RJRklDQVRJT05fSUNPTlNfSU1FX0JVVFRPTl9WSVNJQkxFID0gTUFYX05PVElGSUNBVElPTl9JQ09OUyAtIDE7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfT1BFTl9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DTE9TRV9OT1RJRklDQVRJT05fUEFORUwgPSAxMDAxOwpAQCAtOTQsNiArOTUsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ISURFX0NIUk9NRSA9IDEwMzE7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX09QRU5fSU5QVVRfTUVUSE9EU19QQU5FTCA9IDEwNDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NMT1NFX0lOUFVUX01FVEhPRFNfUEFORUwgPSAxMDQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19PUEVOX0NPTVBBVF9NT0RFX1BBTkVMID0gMTA1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ0xPU0VfQ09NUEFUX01PREVfUEFORUwgPSAxMDUxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19TVE9QX1RJQ0tFUiA9IDIwMDA7CiAKICAgICAvLyBGaXR0cycgTGF3IGFzc2lzdGFuY2UgZm9yIExhdGluSU1FOyBzZWUgcG9saWN5LkV2ZW50SG9sZQpAQCAtMTA0LDYgKzEwNyw3IEBACiAgICAgaW50IG1OYXR1cmFsQmFySGVpZ2h0ID0gLTE7CiAgICAgaW50IG1JY29uU2l6ZSA9IC0xOwogICAgIGludCBtSWNvbkhQYWRkaW5nID0gLTE7CisgICAgcHJpdmF0ZSBpbnQgbU1heE5vdGlmaWNhdGlvbkljb25zID0gNTsKIAogICAgIEggbUhhbmRsZXIgPSBuZXcgSCgpOwogCkBAIC0xMjYsMTAgKzEzMCwxMiBAQAogICAgIFZpZXcgbU1lbnVCdXR0b247CiAgICAgVmlldyBtUmVjZW50QnV0dG9uOwogCi0gICAgVmlld0dyb3VwIG1Ob3RpZmljYXRpb25BbmRJbWVBcmVhOworICAgIFZpZXdHcm91cCBtRmVlZGJhY2tJY29uQXJlYTsgLy8gbm90aWZpY2F0aW9uIGljb25zLCBJTUUgaWNvbiwgY29tcGF0IGljb24KICAgICBJbnB1dE1ldGhvZEJ1dHRvbiBtSW5wdXRNZXRob2RTd2l0Y2hCdXR0b247CisgICAgQ29tcGF0TW9kZUJ1dHRvbiBtQ29tcGF0TW9kZUJ1dHRvbjsKIAogICAgIE5vdGlmaWNhdGlvblBhbmVsIG1Ob3RpZmljYXRpb25QYW5lbDsKKyAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBtTm90aWZpY2F0aW9uUGFuZWxQYXJhbXM7CiAgICAgTm90aWZpY2F0aW9uUGVla1BhbmVsIG1Ob3RpZmljYXRpb25QZWVrV2luZG93OwogICAgIFZpZXdHcm91cCBtTm90aWZpY2F0aW9uUGVla1JvdzsKICAgICBpbnQgbU5vdGlmaWNhdGlvblBlZWtJbmRleDsKQEAgLTE2MCwxNiArMTY2LDIwIEBACiAgICAgVmlldyBtRmFrZVNwYWNlQmFyOwogICAgIEtleUV2ZW50IG1TcGFjZUJhcktleUV2ZW50ID0gbnVsbDsKIAorICAgIFZpZXcgbUNvbXBhdGliaWxpdHlIZWxwRGlhbG9nID0gbnVsbDsKKyAgICAKICAgICAvLyBmb3IgZGlzYWJsaW5nIHRoZSBzdGF0dXMgYmFyCiAgICAgaW50IG1EaXNhYmxlZCA9IDA7CiAKICAgICBwcml2YXRlIFJlY2VudHNQYW5lbFZpZXcgbVJlY2VudHNQYW5lbDsKICAgICBwcml2YXRlIElucHV0TWV0aG9kc1BhbmVsIG1JbnB1dE1ldGhvZHNQYW5lbDsKKyAgICBwcml2YXRlIENvbXBhdE1vZGVQYW5lbCBtQ29tcGF0TW9kZVBhbmVsOwogCiAgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsgcmV0dXJuIG1Db250ZXh0OyB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQYW5lbFdpbmRvd3MoKSB7CiAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1Db250ZXh0OworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CiAKICAgICAgICAgLy8gTm90aWZpY2F0aW9uIFBhbmVsCiAgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbCA9IChOb3RpZmljYXRpb25QYW5lbClWaWV3LmluZmxhdGUoY29udGV4dCwKQEAgLTE5NywxMSArMjA3LDEyIEBACiAKICAgICAgICAgbVN0YXR1c0JhclZpZXcuc2V0SWdub3JlQ2hpbGRyZW4oMCwgbU5vdGlmaWNhdGlvblRyaWdnZXIsIG1Ob3RpZmljYXRpb25QYW5lbCk7CiAKLSAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgNTEyLCAvLyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBtTm90aWZpY2F0aW9uUGFuZWxQYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm5vdGlmaWNhdGlvbl9wYW5lbF93aWR0aCksCisgICAgICAgICAgICAgICAgZ2V0Tm90aWZpY2F0aW9uUGFuZWxIZWlnaHQoKSwKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX1NUQVRVU19CQVJfUEFORUwsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfSU5fU0NSRUVOCisgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19MQVlPVVRfTk9fTElNSVRTCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19BTFRfRk9DVVNBQkxFX0lNCiAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19TUExJVF9UT1VDSAogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURUQsCkBAIC0yNDMsMTEgKzI1NCwxMiBAQAogICAgICAgICAgICAgICAgIDUxMiwgLy8gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCiAgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAotICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUwogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTQogICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU1BMSVRfVE9VQ0gsCiAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQpOwogICAgICAgICBscC5ncmF2aXR5ID0gR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LlJJR0hUOworICAgICAgICBscC55ID0gcmVzLmdldERpbWVuc2lvblBpeGVsT2Zmc2V0KFIuZGltZW4ucGVla193aW5kb3dfeV9vZmZzZXQpOwogICAgICAgICBscC5zZXRUaXRsZSgiTm90aWZpY2F0aW9uUGVla1dpbmRvdyIpOwogICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZS5BbmltYXRpb25fVG9hc3Q7CiAKQEAgLTMwMSw2ICszMTMsMzYgQEAKICAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IFIuc3R5bGUuQW5pbWF0aW9uX1JlY2VudFBhbmVsOwogCiAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5hZGRWaWV3KG1JbnB1dE1ldGhvZHNQYW5lbCwgbHApOworICAgICAgICAKKyAgICAgICAgLy8gQ29tcGF0aWJpbGl0eSBtb2RlIHNlbGVjdG9yIHBhbmVsCisgICAgICAgIG1Db21wYXRNb2RlUGFuZWwgPSAoQ29tcGF0TW9kZVBhbmVsKSBWaWV3LmluZmxhdGUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBSLmxheW91dC5zdGF0dXNfYmFyX2NvbXBhdF9tb2RlX3BhbmVsLCBudWxsKTsKKyAgICAgICAgbUNvbXBhdE1vZGVQYW5lbC5zZXRPblRvdWNoTGlzdGVuZXIobmV3IFRvdWNoT3V0c2lkZUxpc3RlbmVyKAorICAgICAgICAgICAgICAgIE1TR19DTE9TRV9DT01QQVRfTU9ERV9QQU5FTCwgbUNvbXBhdE1vZGVQYW5lbCkpOworICAgICAgICBtQ29tcGF0TW9kZVBhbmVsLnNldFRyaWdnZXIobUNvbXBhdE1vZGVCdXR0b24pOworICAgICAgICBtQ29tcGF0TW9kZVBhbmVsLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgbVN0YXR1c0JhclZpZXcuc2V0SWdub3JlQ2hpbGRyZW4oNCwgbUNvbXBhdE1vZGVCdXR0b24sIG1Db21wYXRNb2RlUGFuZWwpOworICAgICAgICBscCA9IG5ldyBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICAyNTAsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TVEFUVVNfQkFSX1BBTkVMLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTQorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfU1BMSVRfVE9VQ0gKKyAgICAgICAgICAgICAgICAgICAgfCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0hBUkRXQVJFX0FDQ0VMRVJBVEVELAorICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UKTsKKyAgICAgICAgbHAuZ3Jhdml0eSA9IEdyYXZpdHkuQk9UVE9NIHwgR3Jhdml0eS5SSUdIVDsKKyAgICAgICAgbHAuc2V0VGl0bGUoIkNvbXBhdE1vZGVQYW5lbCIpOworICAgICAgICBscC53aW5kb3dBbmltYXRpb25zID0gYW5kcm9pZC5SLnN0eWxlLkFuaW1hdGlvbl9EaWFsb2c7CisKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLmFkZFZpZXcobUNvbXBhdE1vZGVQYW5lbCwgbHApOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldE5vdGlmaWNhdGlvblBhbmVsSGVpZ2h0KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIGZpbmFsIERpc3BsYXkgZCA9IFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5nZXREZWZhdWx0RGlzcGxheSgpOworICAgICAgICByZXR1cm4gTWF0aC5tYXgocmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm5vdGlmaWNhdGlvbl9wYW5lbF9taW5faGVpZ2h0KSwKKyAgICAgICAgICAgICAgICBkLmdldFJlYWxIZWlnaHQoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0zMTEsMTYgKzM1MywxOSBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKICAgICAgICAgbG9hZERpbWVucygpOworICAgICAgICBtTm90aWZpY2F0aW9uUGFuZWxQYXJhbXMuaGVpZ2h0ID0gZ2V0Tm90aWZpY2F0aW9uUGFuZWxIZWlnaHQoKTsKKyAgICAgICAgV2luZG93TWFuYWdlckltcGwuZ2V0RGVmYXVsdCgpLnVwZGF0ZVZpZXdMYXlvdXQobU5vdGlmaWNhdGlvblBhbmVsLAorICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25QYW5lbFBhcmFtcyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9hZERpbWVucygpIHsKICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlc291cmNlcygpOwogCiAgICAgICAgIG1OYXR1cmFsQmFySGVpZ2h0ID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN5c3RlbV9iYXJfaGVpZ2h0KTsKIAogICAgICAgICBpbnQgbmV3SWNvblNpemUgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdGF0dXNfYmFyX2ljb25fc2l6ZSk7CisgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN5c3RlbV9iYXJfaWNvbl9zaXplKTsKICAgICAgICAgaW50IG5ld0ljb25IUGFkZGluZyA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCiAgICAgICAgICAgICBSLmRpbWVuLnN0YXR1c19iYXJfaWNvbl9wYWRkaW5nKTsKIApAQCAtMzMwLDYgKzM3NSwxMyBAQAogICAgICAgICAgICAgbUljb25TaXplID0gbmV3SWNvblNpemU7CiAgICAgICAgICAgICByZWxvYWRBbGxOb3RpZmljYXRpb25JY29ucygpOyAvLyByZWxvYWQgdGhlIHRyYXkKICAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBudW1JY29ucyA9IHJlcy5nZXRJbnRlZ2VyKFIuaW50ZWdlci5jb25maWdfbWF4Tm90aWZpY2F0aW9uSWNvbnMpOworICAgICAgICBpZiAobnVtSWNvbnMgIT0gbU1heE5vdGlmaWNhdGlvbkljb25zKSB7CisgICAgICAgICAgICBtTWF4Tm90aWZpY2F0aW9uSWNvbnMgPSBudW1JY29uczsKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm1heCBub3RpZmljYXRpb24gaWNvbnM6ICIgKyBtTWF4Tm90aWZpY2F0aW9uSWNvbnMpOworICAgICAgICAgICAgcmVsb2FkQWxsTm90aWZpY2F0aW9uSWNvbnMoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByb3RlY3RlZCBWaWV3IG1ha2VTdGF0dXNCYXJWaWV3KCkgewpAQCAtNDEwLDExICs0NjIsMTQgQEAKICAgICAgICAgbU5hdmlnYXRpb25BcmVhLnNldExheW91dFRyYW5zaXRpb24obUJhckNvbnRlbnRzTGF5b3V0VHJhbnNpdGlvbik7CiAKICAgICAgICAgLy8gVGhlIGJhciBjb250ZW50cyBidXR0b25zCi0gICAgICAgIG1Ob3RpZmljYXRpb25BbmRJbWVBcmVhID0gKFZpZXdHcm91cClzYi5maW5kVmlld0J5SWQoUi5pZC5ub3RpZmljYXRpb25BbmRJbWVBcmVhKTsKKyAgICAgICAgbUZlZWRiYWNrSWNvbkFyZWEgPSAoVmlld0dyb3VwKXNiLmZpbmRWaWV3QnlJZChSLmlkLmZlZWRiYWNrSWNvbkFyZWEpOwogICAgICAgICBtSW5wdXRNZXRob2RTd2l0Y2hCdXR0b24gPSAoSW5wdXRNZXRob2RCdXR0b24pIHNiLmZpbmRWaWV3QnlJZChSLmlkLmltZVN3aXRjaEJ1dHRvbik7CiAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgbGlzdGVyCiAgICAgICAgIG1JbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CiAKKyAgICAgICAgbUNvbXBhdE1vZGVCdXR0b24gPSAoQ29tcGF0TW9kZUJ1dHRvbikgc2IuZmluZFZpZXdCeUlkKFIuaWQuY29tcGF0TW9kZUJ1dHRvbik7CisgICAgICAgIG1Db21wYXRNb2RlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtT25DbGlja0xpc3RlbmVyKTsKKwogICAgICAgICAvLyBmb3IgcmVkaXJlY3RpbmcgZXJyYW50IGJhciB0YXBzIHRvIHRoZSBJTUUKICAgICAgICAgbUZha2VTcGFjZUJhciA9IHNiLmZpbmRWaWV3QnlJZChSLmlkLmZha2Vfc3BhY2VfYmFyKTsKIApAQCAtNjI2LDYgKzY4MSwxNCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIGlucHV0IG1ldGhvZHMgcGFuZWwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dE1ldGhvZHNQYW5lbCAhPSBudWxsKSBtSW5wdXRNZXRob2RzUGFuZWwuY2xvc2VQYW5lbChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX09QRU5fQ09NUEFUX01PREVfUEFORUw6CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIm9wZW5pbmcgY29tcGF0IHBhbmVsIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ29tcGF0TW9kZVBhbmVsICE9IG51bGwpIG1Db21wYXRNb2RlUGFuZWwub3BlblBhbmVsKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0NMT1NFX0NPTVBBVF9NT0RFX1BBTkVMOgorICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbG9zaW5nIGNvbXBhdCBwYW5lbCIpOworICAgICAgICAgICAgICAgICAgICBpZiAobUNvbXBhdE1vZGVQYW5lbCAhPSBudWxsKSBtQ29tcGF0TW9kZVBhbmVsLmNsb3NlUGFuZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfU0hPV19DSFJPTUU6CiAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgImhpZGluZyBzaGFkb3dzIChsaWdodHMgb24pIik7CiAgICAgICAgICAgICAgICAgICAgIG1CYXJDb250ZW50cy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CkBAIC04OTQsMTQgKzk1NywxNCBAQAogICAgICAgICAgICAgaWYgKDAgPT0gKG1EaXNhYmxlZCAmIChTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX0lDT05TCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfTk9USUZJQ0FUSU9OX1RJQ0tFUikpKSB7CiAgICAgICAgICAgICAgICAgbVRpY2tlci5hZGQoa2V5LCBuKTsKLSAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uQW5kSW1lQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgICAgICAgICAgbUZlZWRiYWNrSWNvbkFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gY2FsbGVkIGJ5IFRhYmxldFRpY2tlciB3aGVuIGl0J3MgZG9uZSB3aXRoIGFsbCBxdWV1ZWQgdGlja3MKICAgICBwdWJsaWMgdm9pZCBkb25lVGlja2luZygpIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkFuZEltZUFyZWEuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOworICAgICAgICBtRmVlZGJhY2tJY29uQXJlYS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYW5pbWF0ZUV4cGFuZCgpIHsKQEAgLTkxOSw2ICs5ODIsOCBAQAogICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19DTE9TRV9SRUNFTlRTX1BBTkVMKTsKICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NMT1NFX0lOUFVUX01FVEhPRFNfUEFORUwpOwogICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19DTE9TRV9JTlBVVF9NRVRIT0RTX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0NMT1NFX0NPTVBBVF9NT0RFX1BBTkVMKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfQ0xPU0VfQ09NUEFUX01PREVfUEFORUwpOwogICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfQ0xPU0VfTk9USUZJQ0FUSU9OX1BFRUspOwogICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKE1TR19DTE9TRV9OT1RJRklDQVRJT05fUEVFSyk7CiAgICAgfQpAQCAtOTM2LDE2ICsxMDAxLDY4IEBACiAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2Uob24gPyBNU0dfU0hPV19DSFJPTUUgOiBNU0dfSElERV9DSFJPTUUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldE1lbnVLZXlWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworICAgIHB1YmxpYyB2b2lkIHRvcEFwcFdpbmRvd0NoYW5nZWQoYm9vbGVhbiB3aW5kb3dWaXNpYmxlKSB7CiAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgU2xvZy5kKFRBRywgKHZpc2libGU/InNob3dpbmciOiJoaWRpbmciKSArICIgdGhlIE1FTlUgYnV0dG9uIik7CisgICAgICAgICAgICBTbG9nLmQoVEFHLCAod2luZG93VmlzaWJsZT8ic2hvd2luZyI6ImhpZGluZyIpICsgIiB0aGUgTUVOVSBidXR0b24iKTsKICAgICAgICAgfQotICAgICAgICBtTWVudUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOworICAgICAgICBtTWVudUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHdpbmRvd1Zpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwogCiAgICAgICAgIC8vIFNlZSBhYm92ZSByZTogbGlnaHRzLW91dCBwb2xpY3kgZm9yIGxlZ2FjeSBhcHBzLgotICAgICAgICBpZiAodmlzaWJsZSkgc2V0TGlnaHRzT24odHJ1ZSk7CisgICAgICAgIGlmICh3aW5kb3dWaXNpYmxlKSBzZXRMaWdodHNPbih0cnVlKTsKKworICAgICAgICBtQ29tcGF0TW9kZUJ1dHRvbi5yZWZyZXNoKCk7CisgICAgICAgIGlmIChtQ29tcGF0TW9kZUJ1dHRvbi5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfQ09NUEFUX0hFTFAKKyAgICAgICAgICAgICAgICAgICAgfHwgISBQcmVmcy5yZWFkKG1Db250ZXh0KS5nZXRCb29sZWFuKFByZWZzLlNIT1dOX0NPTVBBVF9NT0RFX0hFTFAsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHNob3dDb21wYXRpYmlsaXR5SGVscCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGlkZUNvbXBhdGliaWxpdHlIZWxwKCk7CisgICAgICAgICAgICBtQ29tcGF0TW9kZVBhbmVsLmNsb3NlUGFuZWwoKTsKKyAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzaG93Q29tcGF0aWJpbGl0eUhlbHAoKSB7CisgICAgICAgIGlmIChtQ29tcGF0aWJpbGl0eUhlbHBEaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtQ29tcGF0aWJpbGl0eUhlbHBEaWFsb2cgPSBWaWV3LmluZmxhdGUobUNvbnRleHQsIFIubGF5b3V0LmNvbXBhdF9tb2RlX2hlbHAsIG51bGwpOworICAgICAgICBWaWV3IGJ1dHRvbiA9IG1Db21wYXRpYmlsaXR5SGVscERpYWxvZy5maW5kVmlld0J5SWQoUi5pZC5idXR0b24pOworCisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGhpZGVDb21wYXRpYmlsaXR5SGVscCgpOworICAgICAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzLkVkaXRvciBlZGl0b3IgPSBQcmVmcy5lZGl0KG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBlZGl0b3IucHV0Qm9vbGVhbihQcmVmcy5TSE9XTl9DT01QQVRfTU9ERV9IRUxQLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBlZGl0b3IuYXBwbHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMgbHAgPSBtTm90aWZpY2F0aW9uUGFuZWxQYXJhbXMgPSBuZXcgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuVFlQRV9TWVNURU1fRElBTE9HLAorICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTgorICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX05PX0xJTUlUUworICAgICAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSwKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdC5UUkFOU0xVQ0VOVCk7CisgICAgICAgIGxwLnNldFRpdGxlKCJDb21wYXRpYmlsaXR5TW9kZURpYWxvZyIpOworICAgICAgICBscC5zb2Z0SW5wdXRNb2RlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9VTkNIQU5HRUQKKyAgICAgICAgICAgICAgICB8IFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlNPRlRfSU5QVVRfQURKVVNUX05PVEhJTkc7CisgICAgICAgIGxwLndpbmRvd0FuaW1hdGlvbnMgPSBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLkFuaW1hdGlvbl9ab29tQnV0dG9uczsgLy8gc2ltcGxlIGZhZGUKKworICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbC5nZXREZWZhdWx0KCkuYWRkVmlldyhtQ29tcGF0aWJpbGl0eUhlbHBEaWFsb2csIGxwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGlkZUNvbXBhdGliaWxpdHlIZWxwKCkgeworICAgICAgICBpZiAobUNvbXBhdGliaWxpdHlIZWxwRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsLmdldERlZmF1bHQoKS5yZW1vdmVWaWV3KG1Db21wYXRpYmlsaXR5SGVscERpYWxvZyk7CisgICAgICAgICAgICBtQ29tcGF0aWJpbGl0eUhlbHBEaWFsb2cgPSBudWxsOworICAgICAgICB9CisgICAgfQorICAgIAogICAgIHB1YmxpYyB2b2lkIHNldEltZVdpbmRvd1N0YXR1cyhJQmluZGVyIHRva2VuLCBpbnQgdmlzLCBpbnQgYmFja0Rpc3Bvc2l0aW9uKSB7CiAgICAgICAgIG1JbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbi5zZXRJbWVXaW5kb3dTdGF0dXModG9rZW4sCiAgICAgICAgICAgICAgICAgKHZpcyAmIElucHV0TWV0aG9kU2VydmljZS5JTUVfQUNUSVZFKSAhPSAwKTsKQEAgLTEwMzYsNiArMTE1Myw4IEBACiAgICAgICAgICAgICAgICAgb25DbGlja1JlY2VudEJ1dHRvbigpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IG1JbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbikgewogICAgICAgICAgICAgICAgIG9uQ2xpY2tJbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbigpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IG1Db21wYXRNb2RlQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgb25DbGlja0NvbXBhdE1vZGVCdXR0b24oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CkBAIC0xMDUzLDIwICsxMTcyLDEyIEBACiAKICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrUmVjZW50QnV0dG9uKCkgewogICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJjbGlja2VkIHJlY2VudCBhcHBzOyBkaXNhYmxlZD0iICsgbURpc2FibGVkKTsKLSAgICAgICAgaWYgKG1SZWNlbnRzUGFuZWwgPT0gbnVsbCkgewotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgIGludGVudC5zZXRDbGFzcyhtQ29udGV4dCwgUmVjZW50QXBwbGljYXRpb25zQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLCi0gICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFMpOwotICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChtRGlzYWJsZWQgJiBTdGF0dXNCYXJNYW5hZ2VyLkRJU0FCTEVfRVhQQU5EKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IG1zZyA9IChtUmVjZW50c1BhbmVsLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpCi0gICAgICAgICAgICAgICAgICAgID8gTVNHX09QRU5fUkVDRU5UU19QQU5FTAotICAgICAgICAgICAgICAgICAgICA6IE1TR19DTE9TRV9SRUNFTlRTX1BBTkVMOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKG1zZyk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoKG1EaXNhYmxlZCAmIFN0YXR1c0Jhck1hbmFnZXIuRElTQUJMRV9FWFBBTkQpID09IDApIHsKKyAgICAgICAgICAgIGludCBtc2cgPSAobVJlY2VudHNQYW5lbC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKQorICAgICAgICAgICAgICAgID8gTVNHX09QRU5fUkVDRU5UU19QQU5FTAorICAgICAgICAgICAgICAgIDogTVNHX0NMT1NFX1JFQ0VOVFNfUEFORUw7CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDc4LDYgKzExODksMTMgQEAKICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2tDb21wYXRNb2RlQnV0dG9uKCkgeworICAgICAgICBpbnQgbXNnID0gKG1Db21wYXRNb2RlUGFuZWwuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgPworICAgICAgICAgICAgICAgIE1TR19PUEVOX0NPTVBBVF9NT0RFX1BBTkVMIDogTVNHX0NMT1NFX0NPTVBBVF9NT0RFX1BBTkVMOworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhtc2cpOworICAgICAgICBtSGFuZGxlci5zZW5kRW1wdHlNZXNzYWdlKG1zZyk7CisgICAgfQorCiAgICAgcHVibGljIE5vdGlmaWNhdGlvbkNsaWNrZXIgbWFrZUNsaWNrZXIoUGVuZGluZ0ludGVudCBpbnRlbnQsIFN0cmluZyBwa2csIFN0cmluZyB0YWcsIGludCBpZCkgewogICAgICAgICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvbkNsaWNrZXIoaW50ZW50LCBwa2csIHRhZywgaWQpOwogICAgIH0KQEAgLTE0MTQsMTEgKzE1MzIsMTMgQEAKIAogICAgICAgICBBcnJheUxpc3Q8Vmlldz4gdG9TaG93ID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOwogCi0gICAgICAgIC8vIFdoZW4gSU1FIGJ1dHRvbiBpcyB2aXNpYmxlLCB0aGUgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbiBpY29ucyBzaG91bGQgYmUgZGVjcmVtZW50ZWQKLSAgICAgICAgLy8gdG8gZml0IHRoZSB1cHBlciBsaW1pdC4KLSAgICAgICAgZmluYWwgaW50IG1heE5vdGlmaWNhdGlvbkljb25zQ291bnQgPQotICAgICAgICAgICAgICAgIChtSW5wdXRNZXRob2RTd2l0Y2hCdXR0b24uZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgPwotICAgICAgICAgICAgICAgICAgICAgICAgTUFYX05PVElGSUNBVElPTl9JQ09OU19JTUVfQlVUVE9OX1ZJU0lCTEUgOiBNQVhfTk9USUZJQ0FUSU9OX0lDT05TOworICAgICAgICAvLyBFeHRyYSBTcGVjaWFsIEljb25zCisgICAgICAgIC8vIFRoZSBJTUUgc3dpdGNoZXIgYW5kIGNvbXBhdGliaWxpdHkgbW9kZSBpY29ucyB0YWtlIHRoZSBwbGFjZSBvZiBub3RpZmljYXRpb25zLiBZb3UgZGlkbid0CisgICAgICAgIC8vIG5lZWQgdG8gc2VlIGFsbCB0aG9zZSBuZXcgZW1haWxzLCBkaWQgeW91PworICAgICAgICBpbnQgbWF4Tm90aWZpY2F0aW9uSWNvbnNDb3VudCA9IG1NYXhOb3RpZmljYXRpb25JY29uczsKKyAgICAgICAgaWYgKG1JbnB1dE1ldGhvZFN3aXRjaEJ1dHRvbi5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSBtYXhOb3RpZmljYXRpb25JY29uc0NvdW50IC0tOworICAgICAgICBpZiAobUNvbXBhdE1vZGVCdXR0b24uZ2V0VmlzaWJpbGl0eSgpICAgICAgICAhPSBWaWV3LkdPTkUpIG1heE5vdGlmaWNhdGlvbkljb25zQ291bnQgLS07CisKICAgICAgICAgZm9yIChpbnQgaT0wOyBpPCBtYXhOb3RpZmljYXRpb25JY29uc0NvdW50OyBpKyspIHsKICAgICAgICAgICAgIGlmIChpPj1OKSBicmVhazsKICAgICAgICAgICAgIHRvU2hvdy5hZGQobU5vdGlmaWNhdGlvbkRhdGEuZ2V0KE4taS0xKS5pY29uKTsKQEAgLTE1NjksNiArMTY4OSwxMyBAQAogICAgIHB1YmxpYyB2b2lkIHVzZXJBY3Rpdml0eSgpIHsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0b2dnbGVSZWNlbnRBcHBzKCkgeworICAgICAgICBpbnQgbXNnID0gKG1SZWNlbnRzUGFuZWwuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkKKyAgICAgICAgICAgICAgICA/IE1TR19PUEVOX1JFQ0VOVFNfUEFORUwgOiBNU0dfQ0xPU0VfUkVDRU5UU19QQU5FTDsKKyAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMobXNnKTsKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShtc2cpOworICAgIH0KKwogICAgIHB1YmxpYyBjbGFzcyBUb3VjaE91dHNpZGVMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25Ub3VjaExpc3RlbmVyIHsKICAgICAgICAgcHJpdmF0ZSBpbnQgbU1zZzsKICAgICAgICAgcHJpdmF0ZSBTdGF0dXNCYXJQYW5lbCBtUGFuZWw7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJWaWV3LmphdmEgYi9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc3RhdHVzYmFyL3RhYmxldC9UYWJsZXRTdGF0dXNCYXJWaWV3LmphdmEKaW5kZXggNGUyZmFmNy4uZGZmMWY2YSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3N0YXR1c2Jhci90YWJsZXQvVGFibGV0U3RhdHVzQmFyVmlldy5qYXZhCisrKyBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zdGF0dXNiYXIvdGFibGV0L1RhYmxldFN0YXR1c0JhclZpZXcuamF2YQpAQCAtMjcsOCArMjcsOSBAQAogcHVibGljIGNsYXNzIFRhYmxldFN0YXR1c0JhclZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCB7CiAgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3W10gbUlnbm9yZUNoaWxkcmVuID0gbmV3IFZpZXdbNF07Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3W10gbVBhbmVscyA9IG5ldyBWaWV3WzRdOworICAgIHByaXZhdGUgZmluYWwgaW50IE1BWF9QQU5FTFMgPSA1OworICAgIHByaXZhdGUgZmluYWwgVmlld1tdIG1JZ25vcmVDaGlsZHJlbiA9IG5ldyBWaWV3W01BWF9QQU5FTFNdOworICAgIHByaXZhdGUgZmluYWwgVmlld1tdIG1QYW5lbHMgPSBuZXcgVmlld1tNQVhfUEFORUxTXTsKICAgICBwcml2YXRlIGZpbmFsIGludFtdIG1Qb3MgPSBuZXcgaW50WzJdOwogCiAgICAgcHVibGljIFRhYmxldFN0YXR1c0JhclZpZXcoQ29udGV4dCBjb250ZXh0KSB7CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvdXNiL1VzYlByZWZlcmVuY2VBY3Rpdml0eS5qYXZhIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3VzYi9Vc2JQcmVmZXJlbmNlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQ0NGU4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3VzYi9Vc2JQcmVmZXJlbmNlQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK3BhY2thZ2UgY29tLmFuZHJvaWQuc3lzdGVtdWkudXNiOw0KKw0KK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsNCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7DQoraW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0Ow0KK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOw0KK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JNYW5hZ2VyOw0KK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsNCitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOw0KK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsNCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsNCitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQorDQoraW1wb3J0IGNvbS5hbmRyb2lkLnN5c3RlbXVpLlI7DQorDQorcHVibGljIGNsYXNzIFVzYlByZWZlcmVuY2VBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgIHsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJVc2JQcmVmZXJlbmNlQWN0aXZpdHkiOw0KKw0KKyAgICBwcml2YXRlIFVzYk1hbmFnZXIgbVVzYk1hbmFnZXI7DQorICAgIHByaXZhdGUgU3RyaW5nIG1DdXJyZW50RnVuY3Rpb247DQorICAgIHByaXZhdGUgU3RyaW5nW10gbUZ1bmN0aW9uczsNCisgICAgcHJpdmF0ZSBTdHJpbmcgbUluc3RhbGxlckltYWdlUGF0aDsNCisgICAgcHJpdmF0ZSBCdXR0b24gbU10cFB0cEJ1dHRvbjsNCisgICAgcHJpdmF0ZSBCdXR0b24gbUluc3RhbGxlckNkQnV0dG9uOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gbVB0cEFjdGl2ZTsNCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsNCisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7DQorDQorICAgICAgICBtVXNiTWFuYWdlciA9IChVc2JNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5VU0JfU0VSVklDRSk7DQorDQorICAgICAgICBBbGVydERpYWxvZy5CdWlsZGVyIGRpYWxvZ0J1aWxkZXIgPSBuZXcgQWxlcnREaWFsb2cuQnVpbGRlcih0aGlzKTsNCisgICAgICAgIGRpYWxvZ0J1aWxkZXIuc2V0VGl0bGUoZ2V0U3RyaW5nKFIuc3RyaW5nLnVzYl9wcmVmZXJlbmNlX3RpdGxlKSk7DQorDQorICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcilnZXRTeXN0ZW1TZXJ2aWNlKA0KKyAgICAgICAgICAgICAgICBDb250ZXh0LkxBWU9VVF9JTkZMQVRFUl9TRVJWSUNFKTsNCisgICAgICAgIFZpZXcgYnV0dG9uVmlldyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudXNiX3ByZWZlcmVuY2VfYnV0dG9ucywgbnVsbCk7DQorICAgICAgICBkaWFsb2dCdWlsZGVyLnNldFZpZXcoYnV0dG9uVmlldyk7DQorICAgICAgICBtTXRwUHRwQnV0dG9uID0gKEJ1dHRvbilidXR0b25WaWV3LmZpbmRWaWV3QnlJZChSLmlkLm10cF9wdHBfYnV0dG9uKTsNCisgICAgICAgIG1JbnN0YWxsZXJDZEJ1dHRvbiA9IChCdXR0b24pYnV0dG9uVmlldy5maW5kVmlld0J5SWQoUi5pZC5pbnN0YWxsZXJfY2RfYnV0dG9uKTsNCisgICAgICAgIG1NdHBQdHBCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOw0KKyAgICAgICAgbUluc3RhbGxlckNkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsNCisNCisgICAgICAgIG1QdHBBY3RpdmUgPSBtVXNiTWFuYWdlci5pc0Z1bmN0aW9uRW5hYmxlZChVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9QVFApOw0KKyAgICAgICAgaWYgKG1QdHBBY3RpdmUpIHsNCisgICAgICAgICAgICBtTXRwUHRwQnV0dG9uLnNldFRleHQoUi5zdHJpbmcudXNlX210cF9idXR0b25fdGl0bGUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbUluc3RhbGxlckltYWdlUGF0aCA9IGdldFN0cmluZyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5jb25maWdfaXNvSW1hZ2VQYXRoKTsNCisgICAgICAgIGlmICghKG5ldyBGaWxlKG1JbnN0YWxsZXJJbWFnZVBhdGgpKS5leGlzdHMoKSkgew0KKyAgICAgICAgICAgIG1JbnN0YWxsZXJDZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7DQorICAgICAgICB9DQorDQorICAgICAgICBkaWFsb2dCdWlsZGVyLnNob3coKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgew0KKyAgICAgICAgaWYgKHYuZXF1YWxzKG1NdHBQdHBCdXR0b24pKSB7DQorICAgICAgICAgICAgaWYgKG1QdHBBY3RpdmUpIHsNCisgICAgICAgICAgICAgICAgbVVzYk1hbmFnZXIuc2V0UHJpbWFyeUZ1bmN0aW9uKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX01UUCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgbVVzYk1hbmFnZXIuc2V0UHJpbWFyeUZ1bmN0aW9uKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX1BUUCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICh2LmVxdWFscyhtSW5zdGFsbGVyQ2RCdXR0b24pKSB7DQorICAgICAgICAgICAgbVVzYk1hbmFnZXIuc2V0UHJpbWFyeUZ1bmN0aW9uKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX01BU1NfU1RPUkFHRSk7DQorICAgICAgICAgICAgbVVzYk1hbmFnZXIuc2V0TWFzc1N0b3JhZ2VCYWNraW5nRmlsZShtSW5zdGFsbGVySW1hZ2VQYXRoKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZpbmlzaCgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1ZwbkRpYWxvZ3MvQW5kcm9pZC5tayBiL3BhY2thZ2VzL1ZwbkRpYWxvZ3MvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWYwMTBhCi0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvVnBuRGlhbG9ncy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFZwbkRpYWxvZ3MKKworaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9WcG5EaWFsb2dzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2Nzg0YwotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1ZwbkRpYWxvZ3MvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDIyIEBACis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC52cG5kaWFsb2dzIj4KKworICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJWcG5EaWFsb2dzIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkNvbmZpcm1EaWFsb2ciCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL3RyYW5zcGFyZW50Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuTWFuYWdlRGlhbG9nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBzdHlsZS90cmFuc3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5vSGlzdG9yeT0idHJ1ZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy9sYXlvdXQvY29uZmlybS54bWwgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy9sYXlvdXQvY29uZmlybS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5YjZlNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1ZwbkRpYWxvZ3MvcmVzL2xheW91dC9jb25maXJtLnhtbApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8UmVsYXRpdmVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAYW5kcm9pZDpkaW1lbi9hcHBfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAYW5kcm9pZDpkaW1lbi9hcHBfaWNvbl9zaXplIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMW1tIi8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC93YXJuaW5nIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9pY29uIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIybW0iCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2FybmluZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiLz4KKworICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Byb21wdCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRUb3A9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvaWNvbiIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2Fib3ZlPSJAaWQvd2FybmluZyIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIvPgorCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3dhcm5pbmciCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYWNjZXB0IgorCisKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE4c3AiCisgICAgICAgICAgICBhbmRyb2lkOmNoZWNrZWQ9ImZhbHNlIi8+CisKKzwvUmVsYXRpdmVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy9sYXlvdXQvbWFuYWdlLnhtbCBiL3BhY2thZ2VzL1ZwbkRpYWxvZ3MvcmVzL2xheW91dC9tYW5hZ2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMGI4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy9sYXlvdXQvbWFuYWdlLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8VGFibGVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMCwxIj4KKworICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXNzaW9uIiBzdHlsZT0iQHN0eWxlL2xhYmVsIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3Nlc3Npb24iIHN0eWxlPSJAc3R5bGUvdmFsdWUiLz4KKyAgICA8L1RhYmxlUm93PgorCisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2R1cmF0aW9uIiBzdHlsZT0iQHN0eWxlL2xhYmVsIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2R1cmF0aW9uIiBzdHlsZT0iQHN0eWxlL3ZhbHVlIi8+CisgICAgPC9UYWJsZVJvdz4KKworICAgIDxUYWJsZVJvdz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kYXRhX3RyYW5zbWl0dGVkIiBzdHlsZT0iQHN0eWxlL2xhYmVsIi8+CisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2RhdGFfdHJhbnNtaXR0ZWQiIHN0eWxlPSJAc3R5bGUvdmFsdWUiLz4KKyAgICA8L1RhYmxlUm93PgorCisgICAgPFRhYmxlUm93PgorICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2RhdGFfcmVjZWl2ZWQiIHN0eWxlPSJAc3R5bGUvbGFiZWwiLz4KKyAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZGF0YV9yZWNlaXZlZCIgc3R5bGU9IkBzdHlsZS92YWx1ZSIvPgorICAgIDwvVGFibGVSb3c+CisKKzwvVGFibGVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4NmUyNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2VzL1ZwbkRpYWxvZ3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKworICAgIDxzdHJpbmcgbmFtZT0icHJvbXB0Ij48eGxpZmY6ZyBpZD0iYXBwIj4lczwveGxpZmY6Zz4KKyAgICAgICAgYXR0ZW1wdHMgdG8gY3JlYXRlIGEgVlBOIGNvbm5lY3Rpb24uCisgICAgPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9Indhcm5pbmciPkJ5IHByb2NlZWRpbmcsIHlvdSBhcmUgZ2l2aW5nIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICBwZXJtaXNzaW9uIHRvIGludGVyY2VwdCBhbGwgbmV0d29yayB0cmFmZmljLgorICAgICAgICA8Yj5EbyBOT1QgYWNjZXB0IHVubGVzcyB5b3UgdHJ1c3QgdGhlIGFwcGxpY2F0aW9uLjwvYj4gT3RoZXJ3aXNlLAorICAgICAgICB5b3UgcnVuIHRoZSByaXNrIG9mIGhhdmluZyB5b3VyIGRhdGEgY29tcHJvbWlzZWQgYnkgYSBtYWxpY2lvdXMKKyAgICAgICAgc29mdHdhcmUuCisgICAgPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFjY2VwdCI+SSB0cnVzdCB0aGlzIGFwcGxpY2F0aW9uLjwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJjb25maWd1cmUiPkNvbmZpZ3VyZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGlzY29ubmVjdCI+RGlzY29ubmVjdDwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJzZXNzaW9uIj5TZXNzaW9uOjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZHVyYXRpb24iPkR1cmF0aW9uOjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0YV90cmFuc21pdHRlZCI+RGF0YSBUcmFuc21pdHRlZDo8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImRhdGFfcmVjZWl2ZWQiPkRhdGEgUmVjZWl2ZWQ6PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImJsYW5rX3ZhbHVlIj4tLTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGF0YV92YWx1ZV9mb3JtYXQiPgorICAgICAgICA8eGxpZmY6ZyBpZD0ibnVtYmVyIj4lMSRzPC94bGlmZjpnPiBieXRlcyAvCisgICAgICAgIDx4bGlmZjpnIGlkPSJudW1iZXIiPiUyJHM8L3hsaWZmOmc+IHBhY2tldHMKKyAgICA8L3N0cmluZz4KKzwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvVnBuRGlhbG9ncy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFlMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZXMvVnBuRGlhbG9ncy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHJlc291cmNlcz4KKworICAgIDxzdHlsZSBuYW1lPSJ0cmFuc3BhcmVudCI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93QmFja2dyb3VuZCI+QGFuZHJvaWQ6Y29sb3IvdHJhbnNwYXJlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dJc0Zsb2F0aW5nIj50cnVlPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0ibGFiZWwiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcl92ZXJ0aWNhbHxyaWdodDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nUmlnaHQiPjVtbTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MTZzcDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9InZhbHVlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfdmVydGljYWx8bGVmdDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U2l6ZSI+MThzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9ibGFua192YWx1ZTwvaXRlbT4KKyAgICA8L3N0eWxlPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9WcG5EaWFsb2dzL3NyYy9jb20vYW5kcm9pZC92cG5kaWFsb2dzL0NvbmZpcm1EaWFsb2cuamF2YSBiL3BhY2thZ2VzL1ZwbkRpYWxvZ3Mvc3JjL2NvbS9hbmRyb2lkL3ZwbmRpYWxvZ3MvQ29uZmlybURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NGU3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3NyYy9jb20vYW5kcm9pZC92cG5kaWFsb2dzL0NvbmZpcm1EaWFsb2cuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudnBuZGlhbG9nczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2U7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIENvbmZpcm1EaWFsb2cgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIENvbXBvdW5kQnV0dG9uLk9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyLAorICAgICAgICBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyLCBEaWFsb2dJbnRlcmZhY2UuT25EaXNtaXNzTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVnBuQ29uZmlybSI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtUGFja2FnZU5hbWU7CisKKyAgICBwcml2YXRlIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1TZXJ2aWNlOworCisgICAgcHJpdmF0ZSBBbGVydERpYWxvZyBtRGlhbG9nOworICAgIHByaXZhdGUgQnV0dG9uIG1CdXR0b247CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IGdldENhbGxpbmdQYWNrYWdlKCk7CisKKyAgICAgICAgICAgIG1TZXJ2aWNlID0gSUNvbm5lY3Rpdml0eU1hbmFnZXIuU3R1Yi5hc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKSk7CisKKyAgICAgICAgICAgIGlmIChtUGFja2FnZU5hbWUuZXF1YWxzKG1TZXJ2aWNlLnByZXBhcmVWcG4obnVsbCkpKSB7CisgICAgICAgICAgICAgICAgc2V0UmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQYWNrYWdlTWFuYWdlciBwbSA9IGdldFBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwID0gcG0uZ2V0QXBwbGljYXRpb25JbmZvKG1QYWNrYWdlTmFtZSwgMCk7CisKKyAgICAgICAgICAgIFZpZXcgdmlldyA9IFZpZXcuaW5mbGF0ZSh0aGlzLCBSLmxheW91dC5jb25maXJtLCBudWxsKTsKKyAgICAgICAgICAgICgoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmljb24pKS5zZXRJbWFnZURyYXdhYmxlKGFwcC5sb2FkSWNvbihwbSkpOworICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5wcm9tcHQpKS5zZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICBnZXRTdHJpbmcoUi5zdHJpbmcucHJvbXB0LCBhcHAubG9hZExhYmVsKHBtKSkpOworICAgICAgICAgICAgKChDb21wb3VuZEJ1dHRvbikgdmlldy5maW5kVmlld0J5SWQoUi5pZC5jaGVjaykpLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKHRoaXMpOworCisgICAgICAgICAgICBtRGlhbG9nID0gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIodGhpcykKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19hbGVydCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKGFuZHJvaWQuUi5zdHJpbmcuZGlhbG9nX2FsZXJ0X3RpdGxlKQorICAgICAgICAgICAgICAgICAgICAuc2V0Vmlldyh2aWV3KQorICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oYW5kcm9pZC5SLnN0cmluZy5vaywgdGhpcykKKyAgICAgICAgICAgICAgICAgICAgLnNldE5lZ2F0aXZlQnV0dG9uKGFuZHJvaWQuUi5zdHJpbmcuY2FuY2VsLCB0aGlzKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q2FuY2VsYWJsZShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOworICAgICAgICAgICAgbURpYWxvZy5zZXRPbkRpc21pc3NMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1EaWFsb2cuc2hvdygpOworCisgICAgICAgICAgICBtQnV0dG9uID0gbURpYWxvZy5nZXRCdXR0b24oRGlhbG9nSW50ZXJmYWNlLkJVVFRPTl9QT1NJVElWRSk7CisgICAgICAgICAgICBtQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25SZXN1bWUiLCBlKTsKKyAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICBtRGlhbG9nLnNldE9uRGlzbWlzc0xpc3RlbmVyKG51bGwpOworICAgICAgICAgICAgbURpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgIG1CdXR0b24uc2V0RW5hYmxlZChjaGVja2VkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKERpYWxvZ0ludGVyZmFjZSBkaWFsb2csIGludCB3aGljaCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdoaWNoID09IEFsZXJ0RGlhbG9nLkJVVFRPTl9QT1NJVElWRSAmJgorICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU5hbWUuZXF1YWxzKG1TZXJ2aWNlLnByZXBhcmVWcG4obVBhY2thZ2VOYW1lKSkpIHsKKyAgICAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uQ2xpY2siLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRGlzbWlzcyhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nKSB7CisgICAgICAgIGZpbmlzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1ZwbkRpYWxvZ3Mvc3JjL2NvbS9hbmRyb2lkL3ZwbmRpYWxvZ3MvTWFuYWdlRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3NyYy9jb20vYW5kcm9pZC92cG5kaWFsb2dzL01hbmFnZURpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2YzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlcy9WcG5EaWFsb2dzL3NyYy9jb20vYW5kcm9pZC92cG5kaWFsb2dzL01hbmFnZURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC52cG5kaWFsb2dzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNvbXBvdW5kQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm5ldC5WcG5Db25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKKworcHVibGljIGNsYXNzIE1hbmFnZURpYWxvZyBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgSGFuZGxlci5DYWxsYmFjaywKKyAgICAgICAgRGlhbG9nSW50ZXJmYWNlLk9uQ2xpY2tMaXN0ZW5lciwgRGlhbG9nSW50ZXJmYWNlLk9uRGlzbWlzc0xpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZwbk1hbmFnZSI7CisKKyAgICBwcml2YXRlIFZwbkNvbmZpZyBtQ29uZmlnOworCisgICAgcHJpdmF0ZSBJQ29ubmVjdGl2aXR5TWFuYWdlciBtU2VydmljZTsKKworICAgIHByaXZhdGUgQWxlcnREaWFsb2cgbURpYWxvZzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1EdXJhdGlvbjsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1EYXRhVHJhbnNtaXR0ZWQ7CisgICAgcHJpdmF0ZSBUZXh0VmlldyBtRGF0YVJlY2VpdmVkOworCisgICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ29uZmlnID0gZ2V0SW50ZW50KCkuZ2V0UGFyY2VsYWJsZUV4dHJhKCJjb25maWciKTsKKworICAgICAgICAgICAgbVNlcnZpY2UgPSBJQ29ubmVjdGl2aXR5TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UpKTsKKworICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBnZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcCA9IHBtLmdldEFwcGxpY2F0aW9uSW5mbyhtQ29uZmlnLnBhY2thZ2VOYW1lLCAwKTsKKworICAgICAgICAgICAgVmlldyB2aWV3ID0gVmlldy5pbmZsYXRlKHRoaXMsIFIubGF5b3V0Lm1hbmFnZSwgbnVsbCk7CisgICAgICAgICAgICBpZiAobUNvbmZpZy5zZXNzaW9uTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5zZXNzaW9uKSkuc2V0VGV4dChtQ29uZmlnLnNlc3Npb25OYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EdXJhdGlvbiA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5kdXJhdGlvbik7CisgICAgICAgICAgICBtRGF0YVRyYW5zbWl0dGVkID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLmRhdGFfdHJhbnNtaXR0ZWQpOworICAgICAgICAgICAgbURhdGFSZWNlaXZlZCA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5kYXRhX3JlY2VpdmVkKTsKKworICAgICAgICAgICAgbURpYWxvZyA9IG5ldyBBbGVydERpYWxvZy5CdWlsZGVyKHRoaXMpCisgICAgICAgICAgICAgICAgICAgIC5zZXRJY29uKGFwcC5sb2FkSWNvbihwbSkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUaXRsZShhcHAubG9hZExhYmVsKHBtKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFZpZXcodmlldykKKyAgICAgICAgICAgICAgICAgICAgLnNldE5ldXRyYWxCdXR0b24oUi5zdHJpbmcuZGlzY29ubmVjdCwgdGhpcykKKyAgICAgICAgICAgICAgICAgICAgLnNldE5lZ2F0aXZlQnV0dG9uKGFuZHJvaWQuUi5zdHJpbmcuY2FuY2VsLCB0aGlzKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7CisKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLmNvbmZpZ3VyZUFjdGl2aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtRGlhbG9nLnNldEJ1dHRvbihEaWFsb2dJbnRlcmZhY2UuQlVUVE9OX1BPU0lUSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGV4dChSLnN0cmluZy5jb25maWd1cmUpLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EaWFsb2cuc2V0T25EaXNtaXNzTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtRGlhbG9nLnNob3coKTsKKworICAgICAgICAgICAgaWYgKG1IYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZSgwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIm9uUmVzdW1lIiwgZSk7CisgICAgICAgICAgICBmaW5pc2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKKyAgICAgICAgaWYgKG1EaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbURpYWxvZy5zZXRPbkRpc21pc3NMaXN0ZW5lcihudWxsKTsKKyAgICAgICAgICAgIG1EaWFsb2cuZGlzbWlzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2gpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh3aGljaCA9PSBBbGVydERpYWxvZy5CVVRUT05fUE9TSVRJVkUpIHsKKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUobUNvbmZpZy5wYWNrYWdlTmFtZSwgbUNvbmZpZy5jb25maWd1cmVBY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGljaCA9PSBBbGVydERpYWxvZy5CVVRUT05fTkVVVFJBTCkgeworICAgICAgICAgICAgICAgIG1TZXJ2aWNlLnByZXBhcmVWcG4oIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAib25DbGljayIsIGUpOworICAgICAgICAgICAgZmluaXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRpc21pc3MoRGlhbG9nSW50ZXJmYWNlIGRpYWxvZykgeworICAgICAgICBmaW5pc2goKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcygwKTsKKworICAgICAgICBpZiAobURpYWxvZy5pc1Nob3dpbmcoKSkgeworICAgICAgICAgICAgaWYgKG1Db25maWcuc3RhcnRUaW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBsb25nIHNlY29uZHMgPSAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBtQ29uZmlnLnN0YXJ0VGltZSkgLyAxMDAwOworICAgICAgICAgICAgICAgIG1EdXJhdGlvbi5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIiUwMmQ6JTAyZDolMDJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgLyAzNjAwLCBzZWNvbmRzIC8gNjAgJSA2MCwgc2Vjb25kcyAlIDYwKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ1tdIG51bWJlcnMgPSBnZXRTdGF0aXN0aWNzKCk7CisgICAgICAgICAgICBpZiAobnVtYmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gWzFdIGFuZCBbMl0gYXJlIHJlY2VpdmVkIGRhdGEgaW4gYnl0ZXMgYW5kIHBhY2tldHMuCisgICAgICAgICAgICAgICAgbURhdGFSZWNlaXZlZC5zZXRUZXh0KGdldFN0cmluZyhSLnN0cmluZy5kYXRhX3ZhbHVlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcnNbMV0sIG51bWJlcnNbMl0pKTsKKworICAgICAgICAgICAgICAgIC8vIFs5XSBhbmQgWzEwXSBhcmUgdHJhbnNtaXR0ZWQgZGF0YSBpbiBieXRlcyBhbmQgcGFja2V0cy4KKyAgICAgICAgICAgICAgICBtRGF0YVRyYW5zbWl0dGVkLnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLmRhdGFfdmFsdWVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyc1s5XSwgbnVtYmVyc1sxMF0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKDAsIDEwMDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0U3RhdGlzdGljcygpIHsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFNlZSBkZXZfc2VxX3ByaW50Zl9zdGF0cygpIGluIG5ldC9jb3JlL2Rldi5jLgorICAgICAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oIi9wcm9jL25ldC9kZXYiKSk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbUNvbmZpZy5pbnRlcmZhY2VOYW1lICsgJzonOworCisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gaW4ucmVhZExpbmUoKS50cmltKCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RhcnRzV2l0aChwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG51bWJlcnMgPSBsaW5lLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpLnNwbGl0KCIgKyIpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXJzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVXBkYXRlTW9uaXRvci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFVwZGF0ZU1vbml0b3IuamF2YQppbmRleCA1ZWQ2N2E5Li5mMzg1YTIzIDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVXBkYXRlTW9uaXRvci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRVcGRhdGVNb25pdG9yLmphdmEKQEAgLTExNCw3ICsxMTQsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZyBzdGF0ZUV4dHJhID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKEljY0NhcmQuSU5URU5UX0tFWV9JQ0NfU1RBVEUpOwogICAgICAgICAgICAgaWYgKEljY0NhcmQuSU5URU5UX1ZBTFVFX0lDQ19BQlNFTlQuZXF1YWxzKHN0YXRlRXh0cmEpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5zaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhYnNlbnRSZWFzb24gPSBpbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZ0V4dHJhKEljY0NhcmQuSU5URU5UX0tFWV9MT0NLRURfUkVBU09OKTsKKworICAgICAgICAgICAgICAgIGlmIChJY2NDYXJkLklOVEVOVF9WQUxVRV9BQlNFTlRfT05fUEVSTV9ESVNBQkxFRC5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICBhYnNlbnRSZWFzb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlBFUk1fRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zaW1TdGF0ZSA9IEljY0NhcmQuU3RhdGUuQUJTRU5UOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX1JFQURZLmVxdWFscyhzdGF0ZUV4dHJhKSkgewogICAgICAgICAgICAgICAgIHRoaXMuc2ltU3RhdGUgPSBJY2NDYXJkLlN0YXRlLlJFQURZOwogICAgICAgICAgICAgfSBlbHNlIGlmIChJY2NDYXJkLklOVEVOVF9WQUxVRV9JQ0NfTE9DS0VELmVxdWFscyhzdGF0ZUV4dHJhKSkgewpAQCAtNDgwLDExICs0ODgsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXBvcnQgdGhhdCB0aGUgdXNlciBzdWNjZXNmdWxseSBlbnRlcmVkIHRoZSBzaW0gcGluIHNvIHdlCisgICAgICogUmVwb3J0IHRoYXQgdGhlIHVzZXIgc3VjY2VzZnVsbHkgZW50ZXJlZCB0aGUgc2ltIHBpbiBvciBwdWsgc28gd2UKICAgICAgKiBoYXZlIHRoZSBpbmZvcm1hdGlvbiBlYXJsaWVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIGludGVudAogICAgICAqIGJyb2FkY2FzdCBmcm9tIHRoZSB0ZWxlcGhvbnkgY29kZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXBvcnRTaW1QaW5VbmxvY2tlZCgpIHsKKyAgICBwdWJsaWMgdm9pZCByZXBvcnRTaW1VbmxvY2tlZCgpIHsKICAgICAgICAgbVNpbVN0YXRlID0gSWNjQ2FyZC5TdGF0ZS5SRUFEWTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKaW5kZXggYWUyM2RmNi4uNzk4MzI3OCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNYW5hZ2VyLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwpAQCAtOTQsNiArOTUsOCBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzaG93KCkgewogICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgInNob3coKTsgbUtleWd1YXJkVmlldz09IiArIG1LZXlndWFyZFZpZXcpOwogCisgICAgICAgIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgYm9vbGVhbiBlbmFibGVTY3JlZW5Sb3RhdGlvbiA9IHJlcy5nZXRCb29sZWFuKFIuYm9vbC5jb25maWdfZW5hYmxlTG9ja1NjcmVlblJvdGF0aW9uKTsKICAgICAgICAgaWYgKG1LZXlndWFyZEhvc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJrZXlndWFyZCBob3N0IGlzIG51bGwsIGNyZWF0aW5nIGl0Li4uIik7CiAKQEAgLTExNiwxOCArMTE5LDIyIEBACiAgICAgICAgICAgICBscC5zb2Z0SW5wdXRNb2RlID0gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUEFOOwogICAgICAgICAgICAgbHAud2luZG93QW5pbWF0aW9ucyA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGUuQW5pbWF0aW9uX0xvY2tTY3JlZW47CiAKLSAgICAgICAgICAgIC8vIFRPRE86IFNvbWV0aW1lcyB3ZSBnZXQgdGhlIHdyb25nIHZhbHVlIGZvciB0aGUgc2Vuc29yIHJlc291cmNlIHdlIHVzZSB0byBjb25maWd1cmUKLSAgICAgICAgICAgIC8vIHRoaXMuICBIb3dldmVyLCB0aGUgY3VycmVudCBVSSBkZXNpZ24gaGFzIExvY2tTY3JlZW4gYWx3YXlzIHJlc3BvbmQgdG8gb3JpZW50YXRpb24gc28KLSAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdGhpcyBmb3IgdGhlIHRpbWUtYmVpbmcuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gRm9yIHJlZmVyZW5jZSwgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgaXMgUi5ib29sLmNvbmZpZ19lbmFibGVMb2NrU2NyZWVuUm90YXRpb24KLSAgICAgICAgICAgIGxwLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9TRU5TT1I7CiAgICAgICAgICAgICBscC5zZXRUaXRsZSgiS2V5Z3VhcmQiKTsKICAgICAgICAgICAgIG1XaW5kb3dMYXlvdXRQYXJhbXMgPSBscDsKIAogICAgICAgICAgICAgbVZpZXdNYW5hZ2VyLmFkZFZpZXcobUtleWd1YXJkSG9zdCwgbHApOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGVuYWJsZVNjcmVlblJvdGF0aW9uKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJSb3RhdGlvbiBzZW5zb3IgZm9yIGxvY2sgc2NyZWVuIE9uISIpOworICAgICAgICAgICAgbVdpbmRvd0xheW91dFBhcmFtcy5zY3JlZW5PcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fU0VOU09SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm90YXRpb24gc2Vuc29yIGZvciBsb2NrIHNjcmVlbiBPZmYhIik7CisgICAgICAgICAgICBtV2luZG93TGF5b3V0UGFyYW1zLnNjcmVlbk9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9OT1NFTlNPUjsKKyAgICAgICAgfQorCisgICAgICAgIG1WaWV3TWFuYWdlci51cGRhdGVWaWV3TGF5b3V0KG1LZXlndWFyZEhvc3QsIG1XaW5kb3dMYXlvdXRQYXJhbXMpOworCiAgICAgICAgIGlmIChtS2V5Z3VhcmRWaWV3ID09IG51bGwpIHsKICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAia2V5Z3VhcmQgdmlldyBpcyBudWxsLCBjcmVhdGluZyBpdC4uLiIpOwogICAgICAgICAgICAgbUtleWd1YXJkVmlldyA9IG1LZXlndWFyZFZpZXdQcm9wZXJ0aWVzLmNyZWF0ZUtleWd1YXJkVmlldyhtQ29udGV4dCwgbVVwZGF0ZU1vbml0b3IsIHRoaXMpOwpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9LZXlndWFyZFZpZXdNZWRpYXRvci5qYXZhCmluZGV4IDhhNjAwOTguLjhiYTIzNWIgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvS2V5Z3VhcmRWaWV3TWVkaWF0b3IuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0tleWd1YXJkVmlld01lZGlhdG9yLmphdmEKQEAgLTU4MCw3ICs1ODAsOSBAQAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBwcm92aXNpb25lZCA9IG1VcGRhdGVNb25pdG9yLmlzRGV2aWNlUHJvdmlzaW9uZWQoKTsKICAgICAgICAgICAgIGZpbmFsIEljY0NhcmQuU3RhdGUgc3RhdGUgPSBtVXBkYXRlTW9uaXRvci5nZXRTaW1TdGF0ZSgpOwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBsb2NrZWRPck1pc3NpbmcgPSBzdGF0ZS5pc1BpbkxvY2tlZCgpCi0gICAgICAgICAgICAgICAgICAgIHx8ICgoc3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQpICYmIHJlcXVpcmVTaW0pOworICAgICAgICAgICAgICAgICAgICB8fCAoKHN0YXRlID09IEljY0NhcmQuU3RhdGUuQUJTRU5UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5QRVJNX0RJU0FCTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlcXVpcmVTaW0pOwogCiAgICAgICAgICAgICBpZiAoIWxvY2tlZE9yTWlzc2luZyAmJiAhcHJvdmlzaW9uZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgImRvS2V5Z3VhcmQ6IG5vdCBzaG93aW5nIGJlY2F1c2UgZGV2aWNlIGlzbid0IHByb3Zpc2lvbmVkIgpAQCAtNjg3LDEyICs2ODksMTUgQEAKIAogICAgICAgICBzd2l0Y2ggKHNpbVN0YXRlKSB7CiAgICAgICAgICAgICBjYXNlIEFCU0VOVDoKKyAgICAgICAgICAgIGNhc2UgUEVSTV9ESVNBQkxFRDoKICAgICAgICAgICAgICAgICAvLyBvbmx5IGZvcmNlIGxvY2sgc2NyZWVuIGluIGNhc2Ugb2YgbWlzc2luZyBzaW0gaWYgdXNlciBoYXNuJ3QKICAgICAgICAgICAgICAgICAvLyBnb25lIHRocm91Z2ggc2V0dXAgd2l6YXJkCiAgICAgICAgICAgICAgICAgaWYgKCFtVXBkYXRlTW9uaXRvci5pc0RldmljZVByb3Zpc2lvbmVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1Nob3dpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJJTlRFTlRfVkFMVUVfSUNDX0FCU0VOVCBhbmQga2V5Z2F1cmQgaXNuJ3Qgc2hvd2luZywgd2UgbmVlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRvIHNob3cgdGhlIGtleWd1YXJkIHNpbmNlIHRoZSBkZXZpY2UgaXNuJ3QgcHJvdmlzaW9uZWQgeWV0LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJJTlRFTlRfVkFMVUVfSUNDX0FCU0VOVCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yIFBFUk1fRElTQUJMRUQgYW5kIGtleWdhdXJkIGlzbid0IHNob3dpbmcsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2UgbmVlZCB0byBzaG93IHRoZSBrZXlndWFyZCBzaW5jZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkZXZpY2UgaXNuJ3QgcHJvdmlzaW9uZWQgeWV0LiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZG9LZXlndWFyZCgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRTdGF0ZUxvY2tlZCgpOwpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCmluZGV4IDJmZGEzYWEuLmVlYTMwNDA3IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3LmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlldy5qYXZhCkBAIC0xMTYsNiArMTE2LDExIEBACiAgICAgICAgIFNpbVBpbiwKIAogICAgICAgICAvKioKKyAgICAgICAgICogVW5sb2NrIGJ5IGVudGVyaW5nIGEgc2ltIHB1ay4KKyAgICAgICAgICovCisgICAgICAgIFNpbVB1aywKKworICAgICAgICAvKioKICAgICAgICAgICogVW5sb2NrIGJ5IGVudGVyaW5nIGFuIGFjY291bnQncyBsb2dpbiBhbmQgcGFzc3dvcmQuCiAgICAgICAgICAqLwogICAgICAgICBBY2NvdW50LApAQCAtMTc2LDcgKzE4MSw4IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHN0dWNrT25Mb2NrU2NyZWVuQmVjYXVzZVNpbU1pc3NpbmcoKSB7CiAgICAgICAgIHJldHVybiBtUmVxdWlyZXNTaW0KICAgICAgICAgICAgICAgICAmJiAoIW1VcGRhdGVNb25pdG9yLmlzRGV2aWNlUHJvdmlzaW9uZWQoKSkKLSAgICAgICAgICAgICAgICAmJiAobVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLkFCU0VOVCk7CisgICAgICAgICAgICAgICAgJiYgKG1VcGRhdGVNb25pdG9yLmdldFNpbVN0YXRlKCkgPT0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQgfHwKKyAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlBFUk1fRElTQUJMRUQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjIyLDggKzIyOCwxMCBAQAogICAgICAgICAgICAgcHVibGljIHZvaWQgZ29Ub1VubG9ja1NjcmVlbigpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBJY2NDYXJkLlN0YXRlIHNpbVN0YXRlID0gbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3R1Y2tPbkxvY2tTY3JlZW5CZWNhdXNlU2ltTWlzc2luZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUFVLX1JFUVVJUkVEKSl7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0dWNrIG9uIGxvY2sgc2NyZWVuIHdoZW4gc2ltIG1pc3Npbmcgb3IgcHVrJ2QKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc2ltU3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5QVUtfUkVRVUlSRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1Mb2NrUGF0dGVyblV0aWxzLmlzUHVrVW5sb2NrU2NyZWVuRW5hYmxlKCkpKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3R1Y2sgb24gbG9jayBzY3JlZW4gd2hlbiBzaW0gbWlzc2luZyBvcgorICAgICAgICAgICAgICAgICAgICAvLyBwdWsnZCBidXQgcHVrIHVubG9jayBzY3JlZW4gaXMgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWlzU2VjdXJlKCkpIHsKQEAgLTUyMiw4ICs1MzAsMTAgQEAKICAgICAgICAgICAgICAgICBzZWN1cmUgPSBtTG9ja1BhdHRlcm5VdGlscy5pc0xvY2tQYXR0ZXJuRW5hYmxlZCgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTaW1QaW46Ci0gICAgICAgICAgICAgICAgc2VjdXJlID0gbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1VcGRhdGVNb25pdG9yLmdldFNpbVN0YXRlKCkgPT0gSWNjQ2FyZC5TdGF0ZS5QVUtfUkVRVUlSRUQ7CisgICAgICAgICAgICAgICAgc2VjdXJlID0gbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKSA9PSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2ltUHVrOgorICAgICAgICAgICAgICAgIHNlY3VyZSA9IG1VcGRhdGVNb25pdG9yLmdldFNpbVN0YXRlKCkgPT0gSWNjQ2FyZC5TdGF0ZS5QVUtfUkVRVUlSRUQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFjY291bnQ6CiAgICAgICAgICAgICAgICAgc2VjdXJlID0gdHJ1ZTsKQEAgLTU5Miw2ICs2MDIsMTAgQEAKIAogICAgIFZpZXcgY3JlYXRlVW5sb2NrU2NyZWVuRm9yKFVubG9ja01vZGUgdW5sb2NrTW9kZSkgewogICAgICAgICBWaWV3IHVubG9ja1ZpZXcgPSBudWxsOworCisgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICJjcmVhdGVVbmxvY2tTY3JlZW5Gb3IoIiArIHVubG9ja01vZGUgKyAiKTogbUVuYWJsZUZhbGxiYWNrPSIgKyBtRW5hYmxlRmFsbGJhY2spOworCiAgICAgICAgIGlmICh1bmxvY2tNb2RlID09IFVubG9ja01vZGUuUGF0dGVybikgewogICAgICAgICAgICAgUGF0dGVyblVubG9ja1NjcmVlbiB2aWV3ID0gbmV3IFBhdHRlcm5VbmxvY2tTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LApAQCAtNjAwLDEwICs2MTQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IsCiAgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZFNjcmVlbkNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5nZXRGYWlsZWRBdHRlbXB0cygpKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLAotICAgICAgICAgICAgICAgICJjcmVhdGVVbmxvY2tTY3JlZW5Gb3IoIiArIHVubG9ja01vZGUgKyAiKTogbUVuYWJsZUZhbGxiYWNrPSIgKyBtRW5hYmxlRmFsbGJhY2spOwogICAgICAgICAgICAgdmlldy5zZXRFbmFibGVGYWxsYmFjayhtRW5hYmxlRmFsbGJhY2spOwogICAgICAgICAgICAgdW5sb2NrVmlldyA9IHZpZXc7CisgICAgICAgIH0gZWxzZSBpZiAodW5sb2NrTW9kZSA9PSBVbmxvY2tNb2RlLlNpbVB1aykgeworICAgICAgICAgICAgdW5sb2NrVmlldyA9IG5ldyBTaW1QdWtVbmxvY2tTY3JlZW4oCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IsCisgICAgICAgICAgICAgICAgICAgIG1LZXlndWFyZFNjcmVlbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5VdGlscyk7CiAgICAgICAgIH0gZWxzZSBpZiAodW5sb2NrTW9kZSA9PSBVbmxvY2tNb2RlLlNpbVBpbikgewogICAgICAgICAgICAgdW5sb2NrVmlldyA9IG5ldyBTaW1VbmxvY2tTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LApAQCAtNjU0LDcgKzY3Myw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBNb2RlIGdldEluaXRpYWxNb2RlKCkgewogICAgICAgICBmaW5hbCBJY2NDYXJkLlN0YXRlIHNpbVN0YXRlID0gbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKTsKLSAgICAgICAgaWYgKHN0dWNrT25Mb2NrU2NyZWVuQmVjYXVzZVNpbU1pc3NpbmcoKSB8fCAoc2ltU3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5QVUtfUkVRVUlSRUQpKSB7CisgICAgICAgIGlmIChzdHVja09uTG9ja1NjcmVlbkJlY2F1c2VTaW1NaXNzaW5nKCkgfHwKKyAgICAgICAgICAgICAgICAoc2ltU3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5QVUtfUkVRVUlSRUQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtTG9ja1BhdHRlcm5VdGlscy5pc1B1a1VubG9ja1NjcmVlbkVuYWJsZSgpKSkgewogICAgICAgICAgICAgcmV0dXJuIE1vZGUuTG9ja1NjcmVlbjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFNob3cgTG9ja1NjcmVlbiBmaXJzdCBmb3IgYW55IHNjcmVlbiBvdGhlciB0aGFuIFBhdHRlcm4gdW5sb2NrLgpAQCAtNjc2LDggKzY5NywxMCBAQAogICAgIHByaXZhdGUgVW5sb2NrTW9kZSBnZXRVbmxvY2tNb2RlKCkgewogICAgICAgICBmaW5hbCBJY2NDYXJkLlN0YXRlIHNpbVN0YXRlID0gbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKTsKICAgICAgICAgVW5sb2NrTW9kZSBjdXJyZW50TW9kZTsKLSAgICAgICAgaWYgKHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUElOX1JFUVVJUkVEIHx8IHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUFVLX1JFUVVJUkVEKSB7CisgICAgICAgIGlmIChzaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRCkgewogICAgICAgICAgICAgY3VycmVudE1vZGUgPSBVbmxvY2tNb2RlLlNpbVBpbjsKKyAgICAgICAgfSBlbHNlIGlmIChzaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRCkgeworICAgICAgICAgICAgY3VycmVudE1vZGUgPSBVbmxvY2tNb2RlLlNpbVB1azsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbmFsIGludCBtb2RlID0gbUxvY2tQYXR0ZXJuVXRpbHMuZ2V0S2V5Z3VhcmRTdG9yZWRQYXNzd29yZFF1YWxpdHkoKTsKICAgICAgICAgICAgIHN3aXRjaCAobW9kZSkgewpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlld1Byb3BlcnRpZXMuamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1BhdHRlcm5LZXlndWFyZFZpZXdQcm9wZXJ0aWVzLmphdmEKaW5kZXggZWQ1YTA1OC4uMTlhZGIzZSAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9Mb2NrUGF0dGVybktleWd1YXJkVmlld1Byb3BlcnRpZXMuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tQYXR0ZXJuS2V5Z3VhcmRWaWV3UHJvcGVydGllcy5qYXZhCkBAIC01NSw4ICs1NSwxMCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2ltUGluU2VjdXJlKCkgewogICAgICAgICBmaW5hbCBJY2NDYXJkLlN0YXRlIHNpbVN0YXRlID0gbVVwZGF0ZU1vbml0b3IuZ2V0U2ltU3RhdGUoKTsKLSAgICAgICAgcmV0dXJuIChzaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRCB8fCBzaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRAotICAgICAgICAgICAgfHwgc2ltU3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQpOworICAgICAgICByZXR1cm4gKHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUElOX1JFUVVJUkVECisgICAgICAgICAgICAgICAgfHwgc2ltU3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5QVUtfUkVRVUlSRUQKKyAgICAgICAgICAgICAgICB8fCBzaW1TdGF0ZSA9PSBJY2NDYXJkLlN0YXRlLkFCU0VOVAorICAgICAgICAgICAgICAgIHx8IHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUEVSTV9ESVNBQkxFRCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL0xvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCmluZGV4IGE5ZDVjZTQuLjhiN2E2MWUgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvTG9ja1NjcmVlbi5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LlNsaWRpbmdUYWI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwud2lkZ2V0LldhdmVWaWV3OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLndpZGdldC5XYXZlVmlldy5PblRyaWdnZXJMaXN0ZW5lcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQubXVsdGl3YXZldmlldy5NdWx0aVdhdmVWaWV3OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwpAQCAtOTEsNiArOTIsOCBAQAogICAgIHByaXZhdGUgV2F2ZVZpZXcgbUVuZXJneVdhdmU7CiAgICAgcHJpdmF0ZSBTbGlkaW5nVGFiTWV0aG9kcyBtU2xpZGluZ1RhYk1ldGhvZHM7CiAgICAgcHJpdmF0ZSBXYXZlVmlld01ldGhvZHMgbVdhdmVWaWV3TWV0aG9kczsKKyAgICBwcml2YXRlIE11bHRpV2F2ZVZpZXcgbU11bHRpV2F2ZVZpZXc7CisgICAgcHJpdmF0ZSBNdWx0aVdhdmVWaWV3TWV0aG9kcyBtTXVsdGlXYXZlVmlld01ldGhvZHM7CiAKICAgICAvKioKICAgICAgKiBUaGUgc3RhdHVzIG9mIHRoaXMgbG9jayBzY3JlZW4uCkBAIC0xMjYsNyArMTI5LDEyIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgc2ltIGNhcmQgaXMgbG9ja2VkLgogICAgICAgICAgKi8KLSAgICAgICAgU2ltTG9ja2VkKHRydWUpOworICAgICAgICBTaW1Mb2NrZWQodHJ1ZSksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzaW0gY2FyZCBpcyBwZXJtYW5lbnRseSBkaXNhYmxlZCBkdWUgdG8gcHVrIHVubG9jayBmYWlsdXJlCisgICAgICAgICAqLworICAgICAgICBTaW1QZXJtRGlzYWJsZWQoZmFsc2UpOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU2hvd1N0YXR1c0xpbmVzOwogCkBAIC0xNjYsMzQgKzE3NCw5IEBACiAgICAgICAgICAgICBpZiAod2hpY2hIYW5kbGUgPT0gU2xpZGluZ1RhYi5PblRyaWdnZXJMaXN0ZW5lci5MRUZUX0hBTkRMRSkgewogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5nb1RvVW5sb2NrU2NyZWVuKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoaWNoSGFuZGxlID09IFNsaWRpbmdUYWIuT25UcmlnZ2VyTGlzdGVuZXIuUklHSFRfSEFORExFKSB7Ci0gICAgICAgICAgICAgICAgLy8gdG9nZ2xlIHNpbGVudCBtb2RlCi0gICAgICAgICAgICAgICAgbVNpbGVudE1vZGUgPSAhbVNpbGVudE1vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1TaWxlbnRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmliZSA9IChTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5ULCAxKSA9PSAxKTsKLQotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUodmliZQotICAgICAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfVklCUkFURQotICAgICAgICAgICAgICAgICAgICAgICAgOiBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfU0lMRU5UKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFJpbmdlck1vZGUoQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX05PUk1BTCk7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgdG9nZ2xlUmluZ01vZGUoKTsKICAgICAgICAgICAgICAgICB1cGRhdGVSaWdodFRhYlJlc291cmNlcygpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBtU2lsZW50TW9kZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmdsb2JhbF9hY3Rpb25fc2lsZW50X21vZGVfb25fc3RhdHVzKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmdsb2JhbF9hY3Rpb25fc2lsZW50X21vZGVfb2ZmX3N0YXR1cyk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RJY29uID0gbVNpbGVudE1vZGUKLSAgICAgICAgICAgICAgICAgICAgPyBSLmRyYXdhYmxlLmljX2xvY2tfcmluZ2VyX29mZgotICAgICAgICAgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb247Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9hc3RDb2xvciA9IG1TaWxlbnRNb2RlCi0gICAgICAgICAgICAgICAgICAgID8gZ2V0Q29udGV4dCgpLmdldFJlc291cmNlcygpLmdldENvbG9yKFIuY29sb3Iua2V5Z3VhcmRfdGV4dF9jb2xvcl9zb3VuZG9mZikKLSAgICAgICAgICAgICAgICAgICAgOiBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb24pOwotICAgICAgICAgICAgICAgIHRvYXN0TWVzc2FnZShtU2NyZWVuTG9ja2VkLCBtZXNzYWdlLCB0b2FzdENvbG9yLCB0b2FzdEljb24pOworICAgICAgICAgICAgICAgIGRvU2lsZW5jZVJpbmdUb2FzdCgpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE0LDI1ICsxOTcsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIFdhdmVWaWV3TWV0aG9kcyBpbXBsZW1lbnRzIFdhdmVWaWV3Lk9uVHJpZ2dlckxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfRk9SX0FOSU1BVElPTl9USU1FT1VUID0gMDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVlfT05fV0hJTEVfR1JBQkJFRF9USU1FT1VUID0gMzAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBSVRfRk9SX0FOSU1BVElPTl9USU1FT1VUID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBWV9PTl9XSElMRV9HUkFCQkVEX1RJTUVPVVQgPSAzMDAwMDsKIAorICAgIGNsYXNzIFdhdmVWaWV3TWV0aG9kcyBpbXBsZW1lbnRzIFdhdmVWaWV3Lk9uVHJpZ2dlckxpc3RlbmVyIHsKICAgICAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICAgICAgcHVibGljIHZvaWQgb25UcmlnZ2VyKFZpZXcgdiwgaW50IHdoaWNoSGFuZGxlKSB7CiAgICAgICAgICAgICBpZiAod2hpY2hIYW5kbGUgPT0gV2F2ZVZpZXcuT25UcmlnZ2VyTGlzdGVuZXIuQ0VOVEVSX0hBTkRMRSkgewotICAgICAgICAgICAgICAgIC8vIERlbGF5IGhpZGluZyBsb2NrIHNjcmVlbiBsb25nIGVub3VnaCBmb3IgYW5pbWF0aW9uIHRvIGZpbmlzaAotICAgICAgICAgICAgICAgIHBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sIFdBSVRfRk9SX0FOSU1BVElPTl9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0VW5sb2NrU2NyZWVuKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgICAgICBwdWJsaWMgdm9pZCBvbkdyYWJiZWRTdGF0ZUNoYW5nZShWaWV3IHYsIGludCBncmFiYmVkU3RhdGUpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIExvZy52KFRBRywgIioqKiBMb2NrU2NyZWVuIGFjY2VsIGlzICIgCisgICAgICAgICAgICBpZiAoREJHKSBMb2cudihUQUcsICIqKiogTG9ja1NjcmVlbiBhY2NlbCBpcyAiCiAgICAgICAgICAgICAgICAgICAgICsgKG1FbmVyZ3lXYXZlLmlzSGFyZHdhcmVBY2NlbGVyYXRlZCgpID8gIm9uIjoib2ZmIikpOwogICAgICAgICAgICAgLy8gRG9uJ3QgcG9rZSB0aGUgd2FrZSBsb2NrIHdoZW4gcmV0dXJuaW5nIHRvIGEgc3RhdGUgd2hlcmUgdGhlIGhhbmRsZSBpcwogICAgICAgICAgICAgLy8gbm90IGdyYWJiZWQgc2luY2UgdGhhdCBjYW4gaGFwcGVuIHdoZW4gdGhlIHN5c3RlbSAoaW5zdGVhZCBvZiB0aGUgdXNlcikKQEAgLTI0Myw2ICsyMjEsODAgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGNsYXNzIE11bHRpV2F2ZVZpZXdNZXRob2RzIGltcGxlbWVudHMgTXVsdGlXYXZlVmlldy5PblRyaWdnZXJMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uR3JhYmJlZChWaWV3IHYsIGludCBoYW5kbGUpIHsKKworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZWQoVmlldyB2LCBpbnQgaGFuZGxlKSB7CisKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBvblRyaWdnZXIoVmlldyB2LCBpbnQgdGFyZ2V0KSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0ID09IDApIHsgLy8gVE9ETzogVXNlIHJlc291cmNlcyB0byBkZXRlcm1pbmUgd2hpY2ggaGFuZGxlIHdhcyB1c2VkCisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09IDIpIHsKKyAgICAgICAgICAgICAgICB0b2dnbGVSaW5nTW9kZSgpOworICAgICAgICAgICAgICAgIHVwZGF0ZVJlc291cmNlcygpOworICAgICAgICAgICAgICAgIGRvU2lsZW5jZVJpbmdUb2FzdCgpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgICAgIG1NdWx0aVdhdmVWaWV3LnNldFRhcmdldFJlc291cmNlcyhtU2lsZW50TW9kZSA/IFIuYXJyYXkubG9ja3NjcmVlbl90YXJnZXRzX3doZW5fc2lsZW50CisgICAgICAgICAgICAgICAgICAgIDogUi5hcnJheS5sb2Nrc2NyZWVuX3RhcmdldHNfd2hlbl9zb3VuZG9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uR3JhYmJlZFN0YXRlQ2hhbmdlKFZpZXcgdiwgaW50IGhhbmRsZSkgeworICAgICAgICAgICAgLy8gRG9uJ3QgcG9rZSB0aGUgd2FrZSBsb2NrIHdoZW4gcmV0dXJuaW5nIHRvIGEgc3RhdGUgd2hlcmUgdGhlIGhhbmRsZSBpcworICAgICAgICAgICAgLy8gbm90IGdyYWJiZWQgc2luY2UgdGhhdCBjYW4gaGFwcGVuIHdoZW4gdGhlIHN5c3RlbSAoaW5zdGVhZCBvZiB0aGUgdXNlcikKKyAgICAgICAgICAgIC8vIGNhbmNlbHMgdGhlIGdyYWIuCisgICAgICAgICAgICBpZiAoaGFuZGxlICE9IE11bHRpV2F2ZVZpZXcuT25UcmlnZ2VyTGlzdGVuZXIuTk9fSEFORExFKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RVbmxvY2tTY3JlZW4oKSB7CisgICAgICAgIC8vIERlbGF5IGhpZGluZyBsb2NrIHNjcmVlbiBsb25nIGVub3VnaCBmb3IgYW5pbWF0aW9uIHRvIGZpbmlzaAorICAgICAgICBwb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgV0FJVF9GT1JfQU5JTUFUSU9OX1RJTUVPVVQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1NpbGVuY2VSaW5nVG9hc3QoKSB7CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gbVNpbGVudE1vZGUgPworICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRTdHJpbmcoUi5zdHJpbmcuZ2xvYmFsX2FjdGlvbl9zaWxlbnRfbW9kZV9vbl9zdGF0dXMpIDoKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmdsb2JhbF9hY3Rpb25fc2lsZW50X21vZGVfb2ZmX3N0YXR1cyk7CisKKyAgICAgICAgZmluYWwgaW50IHRvYXN0SWNvbiA9IG1TaWxlbnRNb2RlCisgICAgICAgICAgICA/IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb2ZmCisgICAgICAgICAgICA6IFIuZHJhd2FibGUuaWNfbG9ja19yaW5nZXJfb247CisKKyAgICAgICAgZmluYWwgaW50IHRvYXN0Q29sb3IgPSBtU2lsZW50TW9kZQorICAgICAgICAgICAgPyBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb2ZmKQorICAgICAgICAgICAgOiBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IoUi5jb2xvci5rZXlndWFyZF90ZXh0X2NvbG9yX3NvdW5kb24pOworICAgICAgICB0b2FzdE1lc3NhZ2UobVNjcmVlbkxvY2tlZCwgbWVzc2FnZSwgdG9hc3RDb2xvciwgdG9hc3RJY29uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdG9nZ2xlUmluZ01vZGUoKSB7CisgICAgICAgIC8vIHRvZ2dsZSBzaWxlbnQgbW9kZQorICAgICAgICBtU2lsZW50TW9kZSA9ICFtU2lsZW50TW9kZTsKKyAgICAgICAgaWYgKG1TaWxlbnRNb2RlKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZpYmUgPSAoU2V0dGluZ3MuU3lzdGVtLmdldEludCgKKyAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLlZJQlJBVEVfSU5fU0lMRU5ULCAxKSA9PSAxKTsKKworICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRSaW5nZXJNb2RlKHZpYmUKKyAgICAgICAgICAgICAgICA/IEF1ZGlvTWFuYWdlci5SSU5HRVJfTU9ERV9WSUJSQVRFCisgICAgICAgICAgICAgICAgOiBBdWRpb01hbmFnZXIuUklOR0VSX01PREVfU0lMRU5UKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0UmluZ2VyTW9kZShBdWRpb01hbmFnZXIuUklOR0VSX01PREVfTk9STUFMKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIEluIGdlbmVyYWwsIHdlIGVuYWJsZSB1bmxvY2tpbmcgdGhlIGluc2VjdXJlIGtleSBndWFyZCB3aXRoIHRoZSBtZW51IGtleS4gSG93ZXZlciwgdGhlcmUgYXJlCiAgICAgICogc29tZSBjYXNlcyB3aGVyZSB3ZSB3aXNoIHRvIGRpc2FibGUgaXQsIG5vdGFibHkgd2hlbiB0aGUgbWVudSBidXR0b24gcGxhY2VtZW50IG9yIHRlY2hub2xvZ3kKQEAgLTMxOSw5ICszNzEsOSBAQAogICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKICAgICAgICAgbVNpbGVudE1vZGUgPSBpc1NpbGVudE1vZGUoKTsKIAotICAgICAgICBtU2xpZGluZ1RhYiA9IChTbGlkaW5nVGFiKSBmaW5kVmlld0J5SWQoUi5pZC50YWJfc2VsZWN0b3IpOwotICAgICAgICBtRW5lcmd5V2F2ZSA9IChXYXZlVmlldykgZmluZFZpZXdCeUlkKFIuaWQud2F2ZV92aWV3KTsKLSAgICAgICAgaWYgKG1TbGlkaW5nVGFiICE9IG51bGwpIHsKKyAgICAgICAgVmlldyB1bmxvY2tXaWRnZXQgPSBmaW5kVmlld0J5SWQoUi5pZC51bmxvY2tfd2lkZ2V0KTsKKyAgICAgICAgaWYgKHVubG9ja1dpZGdldCBpbnN0YW5jZW9mIFNsaWRpbmdUYWIpIHsKKyAgICAgICAgICAgIG1TbGlkaW5nVGFiID0gKFNsaWRpbmdUYWIpIHVubG9ja1dpZGdldDsKICAgICAgICAgICAgIG1TbGlkaW5nVGFiLnNldEhvbGRBZnRlclRyaWdnZXIodHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgbVNsaWRpbmdUYWIuc2V0TGVmdEhpbnRUZXh0KFIuc3RyaW5nLmxvY2tzY3JlZW5fdW5sb2NrX2xhYmVsKTsKICAgICAgICAgICAgIG1TbGlkaW5nVGFiLnNldExlZnRUYWJSZXNvdXJjZXMoCkBAIC0zMzIsMTEgKzM4NCwxNyBAQAogICAgICAgICAgICAgbVNsaWRpbmdUYWJNZXRob2RzID0gbmV3IFNsaWRpbmdUYWJNZXRob2RzKCk7CiAgICAgICAgICAgICBtU2xpZGluZ1RhYi5zZXRPblRyaWdnZXJMaXN0ZW5lcihtU2xpZGluZ1RhYk1ldGhvZHMpOwogICAgICAgICAgICAgbVNsaWRpbmdUYWJNZXRob2RzLnVwZGF0ZVJpZ2h0VGFiUmVzb3VyY2VzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUVuZXJneVdhdmUgIT0gbnVsbCkgeworICAgICAgICB9IGVsc2UgaWYgKHVubG9ja1dpZGdldCBpbnN0YW5jZW9mIFdhdmVWaWV3KSB7CisgICAgICAgICAgICBtRW5lcmd5V2F2ZSA9IChXYXZlVmlldykgdW5sb2NrV2lkZ2V0OwogICAgICAgICAgICAgbVdhdmVWaWV3TWV0aG9kcyA9IG5ldyBXYXZlVmlld01ldGhvZHMoKTsKICAgICAgICAgICAgIG1FbmVyZ3lXYXZlLnNldE9uVHJpZ2dlckxpc3RlbmVyKG1XYXZlVmlld01ldGhvZHMpOworICAgICAgICB9IGVsc2UgaWYgKHVubG9ja1dpZGdldCBpbnN0YW5jZW9mIE11bHRpV2F2ZVZpZXcpIHsKKyAgICAgICAgICAgIG1NdWx0aVdhdmVWaWV3ID0gKE11bHRpV2F2ZVZpZXcpIHVubG9ja1dpZGdldDsKKyAgICAgICAgICAgIG1NdWx0aVdhdmVWaWV3TWV0aG9kcyA9IG5ldyBNdWx0aVdhdmVWaWV3TWV0aG9kcygpOworICAgICAgICAgICAgbU11bHRpV2F2ZVZpZXdNZXRob2RzLnVwZGF0ZVJlc291cmNlcygpOyAvLyB1cGRhdGUgc2lsZW5jZS9yaW5nIHJlc291cmNlcworICAgICAgICAgICAgbU11bHRpV2F2ZVZpZXcuc2V0T25UcmlnZ2VyTGlzdGVuZXIobU11bHRpV2F2ZVZpZXdNZXRob2RzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk11c3QgaGF2ZSBlaXRoZXIgU2xpZGluZ1RhYiBvciBXYXZlVmlldyBkZWZpbmVkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdW5sb2NrIHdpZGdldDogIiArIHVubG9ja1dpZGdldCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXNldFN0YXR1c0luZm8odXBkYXRlTW9uaXRvcik7CkBAIC00NTAsNyArNTA4LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFN0YXR1cyBnZXRDdXJyZW50U3RhdHVzKEljY0NhcmQuU3RhdGUgc2ltU3RhdGUpIHsKICAgICAgICAgYm9vbGVhbiBtaXNzaW5nQW5kTm90UHJvdmlzaW9uZWQgPSAoIW1VcGRhdGVNb25pdG9yLmlzRGV2aWNlUHJvdmlzaW9uZWQoKQotICAgICAgICAgICAgICAgICYmIHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuQUJTRU5UKTsKKyAgICAgICAgICAgICAgICAmJiAoc2ltU3RhdGUgPT0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNpbVN0YXRlID09IEljY0NhcmQuU3RhdGUuUEVSTV9ESVNBQkxFRCkpOworCiAgICAgICAgIGlmIChtaXNzaW5nQW5kTm90UHJvdmlzaW9uZWQpIHsKICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU2ltTWlzc2luZ0xvY2tlZDsKICAgICAgICAgfQpAQCAtNDY4LDYgKzUyOCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5TaW1QdWtMb2NrZWQ7CiAgICAgICAgICAgICBjYXNlIFJFQURZOgogICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuTm9ybWFsOworICAgICAgICAgICAgY2FzZSBQRVJNX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU2ltUGVybURpc2FibGVkOwogICAgICAgICAgICAgY2FzZSBVTktOT1dOOgogICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU2ltTWlzc2luZzsKICAgICAgICAgfQpAQCAtNTM0LDExICs1OTYsMjMgQEAKICAgICAgICAgICAgIGNhc2UgU2ltTWlzc2luZzoKICAgICAgICAgICAgICAgICAvLyB0ZXh0CiAgICAgICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0Q2FycmllclRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0KTsKLSAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9taXNzaW5nX3NpbV9pbnN0cnVjdGlvbnMpOworICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX2luc3RydWN0aW9uc19sb25nKTsKIAogICAgICAgICAgICAgICAgIC8vIGxheW91dAogICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1FbWVyZ2VuY3lDYWxsVGV4dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbFRleHQobUVtZXJnZW5jeUNhbGxUZXh0KTsKKyAgICAgICAgICAgICAgICBlbmFibGVVbmxvY2soKTsgLy8gZG8gbm90IG5lZWQgdG8gc2hvdyB0aGUgZS1jYWxsIGJ1dHRvbjsgdXNlciBtYXkgdW5sb2NrCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU2ltUGVybURpc2FibGVkOgorICAgICAgICAgICAgICAgIC8vIHRleHQKKyAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy5zZXRDYXJyaWVyVGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQpOworICAgICAgICAgICAgICAgIG1TY3JlZW5Mb2NrZWQuc2V0VGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLmxvY2tzY3JlZW5fcGVybWFuZW50X2Rpc2FibGVkX3NpbV9pbnN0cnVjdGlvbnMpOworCisgICAgICAgICAgICAgICAgLy8gbGF5b3V0CisgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbFRleHQobUVtZXJnZW5jeUNhbGxUZXh0KTsKICAgICAgICAgICAgICAgICBlbmFibGVVbmxvY2soKTsgLy8gZG8gbm90IG5lZWQgdG8gc2hvdyB0aGUgZS1jYWxsIGJ1dHRvbjsgdXNlciBtYXkgdW5sb2NrCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTU1Miw4ICs2MjYsOCBAQAogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0CiAgICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbFRleHQobUVtZXJnZW5jeUNhbGxUZXh0KTsKKyAgICAgICAgICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgICAgICAgICAgICAgIGRpc2FibGVVbmxvY2soKTsKICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTc5LDEwICs2NTMsMTUgQEAKICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFRleHQoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fcHVrX2xvY2tlZF9pbnN0cnVjdGlvbnMpOwogCiAgICAgICAgICAgICAgICAgLy8gbGF5b3V0Ci0gICAgICAgICAgICAgICAgbVNjcmVlbkxvY2tlZC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbUVtZXJnZW5jeUNhbGxUZXh0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgZGlzYWJsZVVubG9jaygpOworICAgICAgICAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxUZXh0KG1FbWVyZ2VuY3lDYWxsVGV4dCk7CisgICAgICAgICAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKKyAgICAgICAgICAgICAgICBpZiAobUxvY2tQYXR0ZXJuVXRpbHMuaXNQdWtVbmxvY2tTY3JlZW5FbmFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOworICAgICAgICAgICAgICAgICAgICBlbmFibGVVbmxvY2soKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU2NyZWVuTG9ja2VkLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVVubG9jaygpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MiwxMSArNzMxLDE3IEBACiAgICAgICAgIGlmIChtRW5lcmd5V2F2ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBtRW5lcmd5V2F2ZS5yZXNldCgpOwogICAgICAgICB9CisgICAgICAgIGlmIChtTXVsdGlXYXZlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICBtTXVsdGlXYXZlVmlldy5yZXNldChmYWxzZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIG9uUmVzdW1lKCkgewogICAgICAgICByZXNldFN0YXR1c0luZm8obVVwZGF0ZU1vbml0b3IpOworICAgICAgICBpZiAobU11bHRpV2F2ZVZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgbU11bHRpV2F2ZVZpZXcucGluZygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YSBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGFzc3dvcmRVbmxvY2tTY3JlZW4uamF2YQppbmRleCBjYTU2YzRmLi42NzM0MDA1IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bhc3N3b3JkVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXNzd29yZFVubG9ja1NjcmVlbi5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAKIGltcG9ydCBhbmRyb2lkLm9zLkNvdW50RG93blRpbWVyOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5zZWN1cml0eS5LZXlTdG9yZTsKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5UZWxlcGhvbnlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudGV4dC5JbnB1dFR5cGU7CiBpbXBvcnQgYW5kcm9pZC50ZXh0Lm1ldGhvZC5EaWdpdHNLZXlMaXN0ZW5lcjsKQEAgLTEyNCw3ICsxMjUsOCBAQAogICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0SW5wdXRUeXBlKElucHV0VHlwZS5UWVBFX0NMQVNTX05VTUJFUgogICAgICAgICAgICAgICAgICAgICB8IElucHV0VHlwZS5UWVBFX05VTUJFUl9WQVJJQVRJT05fUEFTU1dPUkQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBhc3N3b3JkRW50cnkuc2V0SW5wdXRUeXBlKElucHV0VHlwZS5UWVBFX1RFWFRfVkFSSUFUSU9OX1BBU1NXT1JEKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEVudHJ5LnNldElucHV0VHlwZShJbnB1dFR5cGUuVFlQRV9DTEFTU19URVhUCisgICAgICAgICAgICAgICAgICAgIHwgSW5wdXRUeXBlLlRZUEVfVEVYVF9WQVJJQVRJT05fUEFTU1dPUkQpOwogICAgICAgICB9CiAKICAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbWVyZ2VuY3lDYWxsKTsKQEAgLTIzMSw2ICsyMzMsNyBAQAogICAgICAgICAgICAgbUNhbGxiYWNrLmtleWd1YXJkRG9uZSh0cnVlKTsKICAgICAgICAgICAgIG1DYWxsYmFjay5yZXBvcnRTdWNjZXNzZnVsVW5sb2NrQXR0ZW1wdCgpOwogICAgICAgICAgICAgbVN0YXR1c1ZpZXcuc2V0SW5zdHJ1Y3Rpb25UZXh0KG51bGwpOworICAgICAgICAgICAgS2V5U3RvcmUuZ2V0SW5zdGFuY2UoKS5wYXNzd29yZChlbnRyeSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkubGVuZ3RoKCkgPiBNSU5JTVVNX1BBU1NXT1JEX0xFTkdUSF9CRUZPUkVfUkVQT1JUICkgewogICAgICAgICAgICAgLy8gdG8gYXZvaWQgYWNjaWRlbnRhbCBsb2Nrb3V0LCBvbmx5IGNvdW50IGF0dGVtcHRzIHRoYXQgYXJlIGxvbmcgZW5vdWdoIHRvIGJlIGEKICAgICAgICAgICAgIC8vIHJlYWwgcGFzc3dvcmQuIFRoaXMgbWF5IHJlcXVpcmUgc29tZSB0d2Vha2luZy4KZGlmZiAtLWdpdCBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGF0dGVyblVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKaW5kZXggMDE4ZmUwYy4uY2Q3OWI2MCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QYXR0ZXJuVW5sb2NrU2NyZWVuLmphdmEKQEAgLTIwLDggKzIwLDEwIEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQ291bnREb3duVGltZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnNlY3VyaXR5LktleVN0b3JlOwogaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwpAQCAtNzIsMTIgKzc0LDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZUZhbGxiYWNrOwogCiAgICAgcHJpdmF0ZSBTdGF0dXNWaWV3IG1TdGF0dXNWaWV3OwotCiAgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblZpZXcgbUxvY2tQYXR0ZXJuVmlldzsKIAotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Gb290ZXJOb3JtYWw7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUZvb3RlckZvcmdvdFBhdHRlcm47Ci0KICAgICAvKioKICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgbGFzdCB0aW1lIHdlIHBva2VkIHRoZSB3YWtlIGxvY2sgZHVyaW5nIGRpc3BhdGNoaW5nCiAgICAgICogb2YgdGhlIHRvdWNoIGV2ZW50LCBpbml0YWxpemVkIHRvIHNvbWV0aGluZyBnYXVyYW50ZWVkIHRvIG1ha2UgdXMKQEAgLTk1LDkgKzkzLDIwIEBACiAgICAgICAgIH0KICAgICB9OwogCisgICAgcHJpdmF0ZSBmaW5hbCBPbkNsaWNrTGlzdGVuZXIgbUVtZXJnZW5jeUNsaWNrID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay50YWtlRW1lcmdlbmN5Q2FsbEFjdGlvbigpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgT25DbGlja0xpc3RlbmVyIG1Gb3Jnb3RQYXR0ZXJuQ2xpY2sgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgbUNhbGxiYWNrLmZvcmdvdFBhdHRlcm4odHJ1ZSk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgcHJpdmF0ZSBCdXR0b24gbUZvcmdvdFBhdHRlcm5CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gbUVtZXJnZW5jeUFsb25lOwotICAgIHByaXZhdGUgQnV0dG9uIG1FbWVyZ2VuY3lUb2dldGhlcjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtRW1lcmdlbmN5QnV0dG9uOwogICAgIHByaXZhdGUgaW50IG1DcmVhdGlvbk9yaWVudGF0aW9uOwogCiAgICAgZW51bSBGb290ZXJNb2RlIHsKQEAgLTEwNiwyMyArMTE1LDI3IEBACiAgICAgICAgIFZlcmlmeVVubG9ja2VkCiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGhpZGVGb3Jnb3RQYXR0ZXJuQnV0dG9uKCkgeworICAgICAgICBtRm9yZ290UGF0dGVybkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dGb3Jnb3RQYXR0ZXJuQnV0dG9uKCkgeworICAgICAgICBtRm9yZ290UGF0dGVybkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZvb3RlcihGb290ZXJNb2RlIG1vZGUpIHsKICAgICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtb2RlIG5vcm1hbCIpOwotICAgICAgICAgICAgICAgIG1Gb290ZXJOb3JtYWwuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm1vZGUgbm9ybWFsIik7CisgICAgICAgICAgICAgICAgaGlkZUZvcmdvdFBhdHRlcm5CdXR0b24oKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRm9yZ290TG9ja1BhdHRlcm46Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBGb3Jnb3RMb2NrUGF0dGVybiIpOwotICAgICAgICAgICAgICAgIG1Gb290ZXJOb3JtYWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRm9yZ290UGF0dGVybkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJtb2RlIEZvcmdvdExvY2tQYXR0ZXJuIik7CisgICAgICAgICAgICAgICAgc2hvd0ZvcmdvdFBhdHRlcm5CdXR0b24oKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgVmVyaWZ5VW5sb2NrZWQ6Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibW9kZSBWZXJpZnlVbmxvY2tlZCIpOwotICAgICAgICAgICAgICAgIG1Gb290ZXJOb3JtYWwuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm1vZGUgVmVyaWZ5VW5sb2NrZWQiKTsKKyAgICAgICAgICAgICAgICBoaWRlRm9yZ290UGF0dGVybkJ1dHRvbigpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzUsMzIgKzE4OCwxNiBAQAogCiAgICAgICAgIG1Mb2NrUGF0dGVyblZpZXcgPSAoTG9ja1BhdHRlcm5WaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5sb2NrUGF0dGVybik7CiAKLSAgICAgICAgbUZvb3Rlck5vcm1hbCA9IChWaWV3R3JvdXApIGZpbmRWaWV3QnlJZChSLmlkLmZvb3Rlck5vcm1hbCk7Ci0gICAgICAgIG1Gb290ZXJGb3Jnb3RQYXR0ZXJuID0gKFZpZXdHcm91cCkgZmluZFZpZXdCeUlkKFIuaWQuZm9vdGVyRm9yZ290UGF0dGVybik7Ci0KICAgICAgICAgLy8gZW1lcmdlbmN5IGNhbGwgYnV0dG9ucwotICAgICAgICBmaW5hbCBPbkNsaWNrTGlzdGVuZXIgZW1lcmdlbmN5Q2xpY2sgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sudGFrZUVtZXJnZW5jeUNhbGxBY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgbUVtZXJnZW5jeUJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGxCdXR0b24pOworICAgICAgICBtRW1lcmdlbmN5QnV0dG9uLnNldEZvY3VzYWJsZShmYWxzZSk7IC8vIHRvdWNoIG9ubHkhCisgICAgICAgIG1FbWVyZ2VuY3lCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1FbWVyZ2VuY3lDbGljayk7CiAKLSAgICAgICAgbUVtZXJnZW5jeUFsb25lID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZW1lcmdlbmN5Q2FsbEFsb25lKTsKLSAgICAgICAgbUVtZXJnZW5jeUFsb25lLnNldEZvY3VzYWJsZShmYWxzZSk7IC8vIHRvdWNoIG9ubHkhCi0gICAgICAgIG1FbWVyZ2VuY3lBbG9uZS5zZXRPbkNsaWNrTGlzdGVuZXIoZW1lcmdlbmN5Q2xpY2spOwotICAgICAgICBtRW1lcmdlbmN5VG9nZXRoZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbWVyZ2VuY3lDYWxsVG9nZXRoZXIpOwotICAgICAgICBtRW1lcmdlbmN5VG9nZXRoZXIuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKLSAgICAgICAgbUVtZXJnZW5jeVRvZ2V0aGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihlbWVyZ2VuY3lDbGljayk7CiAgICAgICAgIHJlZnJlc2hFbWVyZ2VuY3lCdXR0b25UZXh0KCk7CiAKLSAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5mb3Jnb3RQYXR0ZXJuKTsKKyAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5mb3Jnb3RQYXR0ZXJuQnV0dG9uKTsKICAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0VGV4dChSLnN0cmluZy5sb2Nrc2NyZWVuX2ZvcmdvdF9wYXR0ZXJuX2J1dHRvbl90ZXh0KTsKLSAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLmZvcmdvdFBhdHRlcm4odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBtRm9yZ290UGF0dGVybkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZvcmdvdFBhdHRlcm5DbGljayk7CiAKICAgICAgICAgLy8gbWFrZSBpdCBzbyB1bmhhbmRsZWQgdG91Y2ggZXZlbnRzIHdpdGhpbiB0aGUgdW5sb2NrIHNjcmVlbiBnbyB0byB0aGUKICAgICAgICAgLy8gbG9jayBwYXR0ZXJuIHZpZXcuCkBAIC0yMzEsOCArMjI4LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaEVtZXJnZW5jeUJ1dHRvblRleHQoKSB7Ci0gICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5QWxvbmUpOwotICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeVRvZ2V0aGVyKTsKKyAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lCdXR0b24pOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZUZhbGxiYWNrKGJvb2xlYW4gc3RhdGUpIHsKQEAgLTMzNyw4ICszMzMsMTEgQEAKICAgICAgICAgbUxvY2tQYXR0ZXJuVmlldy5jbGVhclBhdHRlcm4oKTsKIAogICAgICAgICAvLyBzaG93ICJmb3Jnb3QgcGF0dGVybj8iIGJ1dHRvbiBpZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSBhdXRoZW50aWNhdGlvbiBtZXRob2QKLSAgICAgICAgbUZvcmdvdFBhdHRlcm5CdXR0b24uc2V0VmlzaWJpbGl0eShtQ2FsbGJhY2suZG9lc0ZhbGxiYWNrVW5sb2NrU2NyZWVuRXhpc3QoKQotICAgICAgICAgICAgICAgID8gVmlldy5WSVNJQkxFIDogVmlldy5JTlZJU0lCTEUpOworICAgICAgICBpZiAobUNhbGxiYWNrLmRvZXNGYWxsYmFja1VubG9ja1NjcmVlbkV4aXN0KCkpIHsKKyAgICAgICAgICAgIHNob3dGb3Jnb3RQYXR0ZXJuQnV0dG9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoaWRlRm9yZ290UGF0dGVybkJ1dHRvbigpOworICAgICAgICB9CiAKICAgICAgICAgLy8gaWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IGxvY2tlZCBvdXQsIGVuZm9yY2UgaXQuCiAgICAgICAgIGxvbmcgZGVhZGxpbmUgPSBtTG9ja1BhdHRlcm5VdGlscy5nZXRMb2Nrb3V0QXR0ZW1wdERlYWRsaW5lKCk7CkBAIC00MDcsNiArNDA2LDcgQEAKICAgICAgICAgICAgICAgICBtU3RhdHVzVmlldy51cGRhdGVTdGF0dXNMaW5lcyh0cnVlKTsKICAgICAgICAgICAgICAgICBtQ2FsbGJhY2sua2V5Z3VhcmREb25lKHRydWUpOwogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5yZXBvcnRTdWNjZXNzZnVsVW5sb2NrQXR0ZW1wdCgpOworICAgICAgICAgICAgICAgIEtleVN0b3JlLmdldEluc3RhbmNlKCkucGFzc3dvcmQoTG9ja1BhdHRlcm5VdGlscy5wYXR0ZXJuVG9TdHJpbmcocGF0dGVybikpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlcG9ydEZhaWxlZEF0dGVtcHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5zaXplKCkgPiBNSU5fUEFUVEVSTl9CRUZPUkVfUE9LRV9XQUtFTE9DSykgewpkaWZmIC0tZ2l0IGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCmluZGV4IGQ5OTcxMDkuLjc1ZjQ2NmEgMTAwNjQ0Ci0tLSBhL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQorKysgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKQEAgLTE0NDYsNyArMTQ0Niw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUFjdGlvbkJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXRTdGF0ZS5wdXRCb29sZWFuKEFDVElPTl9CQVJfVEFHLCBtQWN0aW9uQmFyLmlzT3ZlcmZsb3dNZW51U2hvd2luZygpKTsKKyAgICAgICAgICAgIFNwYXJzZUFycmF5PFBhcmNlbGFibGU+IGFjdGlvbkJhclN0YXRlcyA9IG5ldyBTcGFyc2VBcnJheTxQYXJjZWxhYmxlPigpOworICAgICAgICAgICAgbUFjdGlvbkJhci5zYXZlSGllcmFyY2h5U3RhdGUoYWN0aW9uQmFyU3RhdGVzKTsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dFNwYXJzZVBhcmNlbGFibGVBcnJheShBQ1RJT05fQkFSX1RBRywgYWN0aW9uQmFyU3RhdGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBvdXRTdGF0ZTsKQEAgLTE0ODQsOCArMTQ4NiwxMCBAQAogICAgICAgICAgICAgcmVzdG9yZVBhbmVsU3RhdGUocGFuZWxTdGF0ZXMpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCAmJiBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0Qm9vbGVhbihBQ1RJT05fQkFSX1RBRykpIHsKLSAgICAgICAgICAgIG1BY3Rpb25CYXIucG9zdFNob3dPdmVyZmxvd01lbnUoKTsKKyAgICAgICAgaWYgKG1BY3Rpb25CYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3BhcnNlQXJyYXk8UGFyY2VsYWJsZT4gYWN0aW9uQmFyU3RhdGVzID0KKyAgICAgICAgICAgICAgICAgICAgc2F2ZWRJbnN0YW5jZVN0YXRlLmdldFNwYXJzZVBhcmNlbGFibGVBcnJheShBQ1RJT05fQkFSX1RBRyk7CisgICAgICAgICAgICBtQWN0aW9uQmFyLnJlc3RvcmVIaWVyYXJjaHlTdGF0ZShhY3Rpb25CYXJTdGF0ZXMpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvd01hbmFnZXIuamF2YQppbmRleCBlNDhkYmU5Li5iNTJlN2UxIDEwMDc1NQotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93TWFuYWdlci5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwpAQCAtNTYsNiArNTcsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuQmFzZUlucHV0SGFuZGxlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuUG9pbnRlckxvY2F0aW9uVmlldzsKIAoraW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKQEAgLTE0NywxMCArMTQ5LDEyIEBACiAgICAgc3RhdGljIGZpbmFsIGludCBMT05HX1BSRVNTX1BPV0VSX05PVEhJTkcgPSAwOwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9OR19QUkVTU19QT1dFUl9HTE9CQUxfQUNUSU9OUyA9IDE7CiAgICAgc3RhdGljIGZpbmFsIGludCBMT05HX1BSRVNTX1BPV0VSX1NIVVRfT0ZGID0gMjsKLSAgICAKKworICAgIC8vIFRoZXNlIG5lZWQgdG8gbWF0Y2ggdGhlIGRvY3VtZW50YXRpb24vY29uc3RhbnQgaW4KKyAgICAvLyBjb3JlL3Jlcy9yZXMvdmFsdWVzL2NvbmZpZy54bWwKICAgICBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfSE9NRV9OT1RISU5HID0gMDsKICAgICBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfSE9NRV9SRUNFTlRfRElBTE9HID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IExPTkdfUFJFU1NfSE9NRV9SRUNFTlRfQUNUSVZJVFkgPSAyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9OR19QUkVTU19IT01FX1JFQ0VOVF9TWVNURU1fVUkgPSAyOwogCiAgICAgLy8gd2FsbHBhcGVyIGlzIGF0IHRoZSBib3R0b20sIHRob3VnaCB0aGUgd2luZG93IG1hbmFnZXIgbWF5IG1vdmUgaXQuCiAgICAgc3RhdGljIGZpbmFsIGludCBXQUxMUEFQRVJfTEFZRVIgPSAyOwpAQCAtMzI4LDYgKzMzMiw4IEBACiAgICAgc3RhdGljIGZpbmFsIFJlY3QgbVRtcFZpc2libGVGcmFtZSA9IG5ldyBSZWN0KCk7CiAgICAgCiAgICAgV2luZG93U3RhdGUgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZTsKKyAgICBXaW5kb3dTdGF0ZSBtVG9wQXBwV2luZG93U3RhdGU7CisgICAgV2luZG93U3RhdGUgbUxhc3RUb3BBcHBXaW5kb3dTdGF0ZTsKICAgICBib29sZWFuIG1Ub3BJc0Z1bGxzY3JlZW47CiAgICAgYm9vbGVhbiBtRm9yY2VTdGF0dXNCYXI7CiAgICAgYm9vbGVhbiBtSGlkZUxvY2tTY3JlZW47CkBAIC0zMzgsNyArMzQ0LDYgQEAKICAgICBJbnRlbnQgbURlc2tEb2NrSW50ZW50OwogICAgIGludCBtU2hvcnRjdXRLZXlQcmVzc2VkID0gLTE7CiAgICAgYm9vbGVhbiBtQ29uc3VtZVNob3J0Y3V0S2V5VXA7Ci0gICAgYm9vbGVhbiBtU2hvd01lbnVLZXkgPSBmYWxzZTsgLy8gdHJhY2sgRkxBR19ORUVEU19NRU5VX0tFWSBvbiBmcm9udG1vc3Qgd2luZG93CiAKICAgICAvLyBzdXBwb3J0IGZvciBhY3RpdmF0aW5nIHRoZSBsb2NrIHNjcmVlbiB3aGlsZSB0aGUgc2NyZWVuIGlzIG9uCiAgICAgYm9vbGVhbiBtQWxsb3dMb2Nrc2NyZWVuV2hlbk9uOwpAQCAtNjIwLDcgKzYyNSw3IEBACiAgICAgICAgICAgICBtTG9uZ1ByZXNzT25Ib21lQmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRJbnRlZ2VyKFIuaW50ZWdlci5jb25maWdfbG9uZ1ByZXNzT25Ib21lQmVoYXZpb3IpOwogICAgICAgICAgICAgaWYgKG1Mb25nUHJlc3NPbkhvbWVCZWhhdmlvciA8IExPTkdfUFJFU1NfSE9NRV9OT1RISU5HIHx8Ci0gICAgICAgICAgICAgICAgICAgIG1Mb25nUHJlc3NPbkhvbWVCZWhhdmlvciA+IExPTkdfUFJFU1NfSE9NRV9SRUNFTlRfQUNUSVZJVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxvbmdQcmVzc09uSG9tZUJlaGF2aW9yID4gTE9OR19QUkVTU19IT01FX1JFQ0VOVF9TWVNURU1fVUkpIHsKICAgICAgICAgICAgICAgICBtTG9uZ1ByZXNzT25Ib21lQmVoYXZpb3IgPSBMT05HX1BSRVNTX0hPTUVfTk9USElORzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjM2LDE3ICs2NDEsMTEgQEAKIAogICAgICAgICBpZiAobUxvbmdQcmVzc09uSG9tZUJlaGF2aW9yID09IExPTkdfUFJFU1NfSE9NRV9SRUNFTlRfRElBTE9HKSB7CiAgICAgICAgICAgICBzaG93T3JIaWRlUmVjZW50QXBwc0RpYWxvZygwLCB0cnVlIC8qZGlzbWlzc0lmU2hvd24qLyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobUxvbmdQcmVzc09uSG9tZUJlaGF2aW9yID09IExPTkdfUFJFU1NfSE9NRV9SRUNFTlRfQUNUSVZJVFkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChtTG9uZ1ByZXNzT25Ib21lQmVoYXZpb3IgPT0gTE9OR19QUkVTU19IT01FX1JFQ0VOVF9TWVNURU1fVUkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnJlY2VudC5SZWNlbnRBcHBsaWNhdGlvbnNBY3Rpdml0eSIpOwotICAgICAgICAgICAgICAgIGludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfQUNUSVZJVFlfRVhDTFVERV9GUk9NX1JFQ0VOVFMpOwotICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gbGF1bmNoIFJlY2VudEFwcHNJbnRlbnQiLCBlKTsKKyAgICAgICAgICAgICAgICBtU3RhdHVzQmFyU2VydmljZS50b2dnbGVSZWNlbnRBcHBzKCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJSZW1vdGVFeGNlcHRpb24gd2hlbiBzaG93aW5nIHJlY2VudCBhcHBzIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03NDUsMTUgKzc0NCwxNCBAQAogICAgICAgICBtU2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4gPSBnZXRMb25nSW50QXJyYXkobUNvbnRleHQuZ2V0UmVzb3VyY2VzKCksCiAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hcnJheS5jb25maWdfc2FmZU1vZGVFbmFibGVkVmliZVBhdHRlcm4pOwogCi0gICAgICAgIC8vIE5vdGU6IHRoZSBDb25maWd1cmF0aW9uIGlzIG5vdCBzdGFibGUgaGVyZSwgc28gd2UgY2Fubm90IGxvYWQgbVN0YXR1c0JhckNhbkhpZGUgZnJvbQotICAgICAgICAvLyBjb25maWdfc3RhdHVzQmFyQ2FuSGlkZSBiZWNhdXNlIHRoZSBsYXR0ZXIgZGVwZW5kcyBvbiB0aGUgc2NyZWVuIHNpemUKLQogICAgICAgICAvLyBDb250cm9scyByb3RhdGlvbiBhbmQgdGhlIGxpa2UuCiAgICAgICAgIGluaXRpYWxpemVIZG1pU3RhdGUoKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsRGlzcGxheVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIGludCBzaG9ydFNpemU7CiAgICAgICAgIGlmICh3aWR0aCA+IGhlaWdodCkgeworICAgICAgICAgICAgc2hvcnRTaXplID0gaGVpZ2h0OwogICAgICAgICAgICAgbUxhbmRzY2FwZVJvdGF0aW9uID0gU3VyZmFjZS5ST1RBVElPTl8wOwogICAgICAgICAgICAgbVNlYXNjYXBlUm90YXRpb24gPSBTdXJmYWNlLlJPVEFUSU9OXzE4MDsKICAgICAgICAgICAgIGlmIChtQ29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRCb29sZWFuKApAQCAtNzY1LDYgKzc2Myw3IEBACiAgICAgICAgICAgICAgICAgbVVwc2lkZURvd25Sb3RhdGlvbiA9IFN1cmZhY2UuUk9UQVRJT05fOTA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG9ydFNpemUgPSB3aWR0aDsKICAgICAgICAgICAgIG1Qb3J0cmFpdFJvdGF0aW9uID0gU3VyZmFjZS5ST1RBVElPTl8wOwogICAgICAgICAgICAgbVVwc2lkZURvd25Sb3RhdGlvbiA9IFN1cmZhY2UuUk9UQVRJT05fMTgwOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCkBAIC03NzYsNiArNzc1LDE4IEBACiAgICAgICAgICAgICAgICAgbVNlYXNjYXBlUm90YXRpb24gPSBTdXJmYWNlLlJPVEFUSU9OXzI3MDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoZSBzdGF0dXMgYmFyIGNhbiBoaWRlIGJhc2VkIG9uIHRoZSBzaXplCisgICAgICAgIC8vIG9mIHRoZSBzY3JlZW4uICBXZSBhc3N1bWUgc2l6ZXMgPiA2MDBkcCBhcmUgdGFibGV0cyB3aGVyZSB3ZQorICAgICAgICAvLyB3aWxsIHVzZSB0aGUgc3lzdGVtIGJhci4KKyAgICAgICAgaW50IHNob3J0U2l6ZURwID0gc2hvcnRTaXplCisgICAgICAgICAgICAgICAgKiBEaXNwbGF5TWV0cmljcy5ERU5TSVRZX0RFRkFVTFQKKyAgICAgICAgICAgICAgICAvIERpc3BsYXlNZXRyaWNzLkRFTlNJVFlfREVWSUNFOworICAgICAgICBtU3RhdHVzQmFyQ2FuSGlkZSA9IHNob3J0U2l6ZURwIDwgNjAwOworICAgICAgICBtU3RhdHVzQmFySGVpZ2h0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAorICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJDYW5IaWRlCisgICAgICAgICAgICAgICAgPyBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN0YXR1c19iYXJfaGVpZ2h0CisgICAgICAgICAgICAgICAgOiBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN5c3RlbV9iYXJfaGVpZ2h0KTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTZXR0aW5ncygpIHsKQEAgLTg1OSw3ICs4NzAsNyBAQAogICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTEFZT1VUX0lOX1NDUkVFTjsKICAgICAgICAgICAgIGxwLmZvcm1hdCA9IFBpeGVsRm9ybWF0LlRSQU5TTFVDRU5UOwogICAgICAgICAgICAgbHAuc2V0VGl0bGUoIlBvaW50ZXJMb2NhdGlvbiIpOwotICAgICAgICAgICAgV2luZG93TWFuYWdlckltcGwgd20gPSAoV2luZG93TWFuYWdlckltcGwpCisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIHdtID0gKFdpbmRvd01hbmFnZXIpCiAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CiAgICAgICAgICAgICB3bS5hZGRWaWV3KGFkZFZpZXcsIGxwKTsKICAgICAgICAgICAgIApAQCAtODgyLDcgKzg5Myw3IEBACiAgICAgICAgICAgICAgICAgbVBvaW50ZXJMb2NhdGlvbklucHV0Q2hhbm5lbCA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIFdpbmRvd01hbmFnZXJJbXBsIHdtID0gKFdpbmRvd01hbmFnZXJJbXBsKQorICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKQogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwogICAgICAgICAgICAgd20ucmVtb3ZlVmlldyhyZW1vdmVWaWV3KTsKICAgICAgICAgfQpAQCAtMTA4Myw2ICsxMDk0LDEwIEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfQkFSX0xBWUVSOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGNhblN0YXR1c0JhckhpZGUoKSB7CisgICAgICAgIHJldHVybiBtU3RhdHVzQmFyQ2FuSGlkZTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldE5vbkRlY29yRGlzcGxheVdpZHRoKGludCByb3RhdGlvbiwgaW50IGZ1bGxXaWR0aCkgewogICAgICAgICByZXR1cm4gZnVsbFdpZHRoOwogICAgIH0KQEAgLTExMDksOSArMTEyNCw5IEBACiAgICAgfQogICAgIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgcHVibGljIFZpZXcgYWRkU3RhcnRpbmdXaW5kb3coSUJpbmRlciBhcHBUb2tlbiwgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aGVtZSwgQ2hhclNlcXVlbmNlIG5vbkxvY2FsaXplZExhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWJlbFJlcywgaW50IGljb24sIGludCB3aW5kb3dGbGFncykgeworICAgIHB1YmxpYyBWaWV3IGFkZFN0YXJ0aW5nV2luZG93KElCaW5kZXIgYXBwVG9rZW4sIFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHRoZW1lLAorICAgICAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbywgQ2hhclNlcXVlbmNlIG5vbkxvY2FsaXplZExhYmVsLCBpbnQgbGFiZWxSZXMsCisgICAgICAgICAgICBpbnQgaWNvbiwgaW50IHdpbmRvd0ZsYWdzKSB7CiAgICAgICAgIGlmICghU0hPV19TVEFSVElOR19BTklNQVRJT05TKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQpAQCAtMTE1Nyw4ICsxMTcyLDEyIEBACiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19OT1RfRk9DVVNBQkxFfAogICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQUxUX0ZPQ1VTQUJMRV9JTSk7CiAgICAgCisgICAgICAgICAgICBpZiAoIWNvbXBhdEluZm8uc3VwcG9ydHNTY3JlZW4oKSkgeworICAgICAgICAgICAgICAgIHdpbi5hZGRGbGFncyhXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0NPTVBBVElCTEVfV0lORE9XKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgd2luLnNldExheW91dChXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CiAgICAgCiAgICAgICAgICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcyBwYXJhbXMgPSB3aW4uZ2V0QXR0cmlidXRlcygpOwogICAgICAgICAgICAgcGFyYW1zLnRva2VuID0gYXBwVG9rZW47CkBAIC0xMTY3LDggKzExODYsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5XaW5kb3dfd2luZG93QW5pbWF0aW9uU3R5bGUsIDApOwogICAgICAgICAgICAgcGFyYW1zLnNldFRpdGxlKCJTdGFydGluZyAiICsgcGFja2FnZU5hbWUpOwogCi0gICAgICAgICAgICBXaW5kb3dNYW5hZ2VySW1wbCB3bSA9IChXaW5kb3dNYW5hZ2VySW1wbCkKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICAgICAgV2luZG93TWFuYWdlciB3bSA9IChXaW5kb3dNYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKICAgICAgICAgICAgIFZpZXcgdmlldyA9IHdpbi5nZXREZWNvclZpZXcoKTsKIAogICAgICAgICAgICAgaWYgKHdpbi5pc0Zsb2F0aW5nKCkpIHsKQEAgLTEyMTMsNyArMTIzMSw3IEBACiAgICAgICAgICAgICBUQUcsICJSZW1vdmluZyBzdGFydGluZyB3aW5kb3cgZm9yICIgKyBhcHBUb2tlbiArICI6ICIgKyB3aW5kb3cpOwogCiAgICAgICAgIGlmICh3aW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgV2luZG93TWFuYWdlckltcGwgd20gPSAoV2luZG93TWFuYWdlckltcGwpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7CisgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIHdtID0gKFdpbmRvd01hbmFnZXIpbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKICAgICAgICAgICAgIHdtLnJlbW92ZVZpZXcod2luZG93KTsKICAgICAgICAgfQogICAgIH0KQEAgLTEyNDQsMTMgKzEyNjIsNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV2luZG93TWFuYWdlckltcGwuQUREX01VTFRJUExFX1NJTkdMRVRPTjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVN0YXR1c0JhciA9IHdpbjsKLQotICAgICAgICAgICAgICAgIC8vIFRoZSBDb25maWd1cmF0aW9uIHdpbGwgYmUgc3RhYmxlIGJ5IG5vdywgc28gd2UgY2FuIGxvYWQgdGhpcwotICAgICAgICAgICAgICAgIG1TdGF0dXNCYXJDYW5IaWRlID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfc3RhdHVzQmFyQ2FuSGlkZSk7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0JhckhlaWdodCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3RhdHVzX2Jhcl9oZWlnaHQpOwotCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFRZUEVfTkFWSUdBVElPTl9CQVI6CiAgICAgICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKApAQCAtMTkzOCwyOCArMTk0OSw0MCBAQAogICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJsYXlvdXRXaW5kb3dMdygiICsgYXR0cnMuZ2V0VGl0bGUoKSArICIpOiBub3JtYWwgd2luZG93Iik7CiAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhIG5vcm1hbCB3aW5kb3cgbXVzdCBiZSBwbGFjZWQgaW5zaWRlIHRoZSBjb250ZW50CiAgICAgICAgICAgICAgICAgLy8gb2YgYWxsIHNjcmVlbiBkZWNvcmF0aW9ucy4KLSAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gbUNvbnRlbnRMZWZ0OwotICAgICAgICAgICAgICAgIHBmLnRvcCA9IG1Db250ZW50VG9wOwotICAgICAgICAgICAgICAgIHBmLnJpZ2h0ID0gbUNvbnRlbnRSaWdodDsKLSAgICAgICAgICAgICAgICBwZi5ib3R0b20gPSBtQ29udGVudEJvdHRvbTsKLSAgICAgICAgICAgICAgICBpZiAoYWRqdXN0ICE9IFNPRlRfSU5QVVRfQURKVVNUX1JFU0laRSkgewotICAgICAgICAgICAgICAgICAgICBkZi5sZWZ0ID0gY2YubGVmdCA9IG1Eb2NrTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgZGYudG9wID0gY2YudG9wID0gbURvY2tUb3A7Ci0gICAgICAgICAgICAgICAgICAgIGRmLnJpZ2h0ID0gY2YucmlnaHQgPSBtRG9ja1JpZ2h0OwotICAgICAgICAgICAgICAgICAgICBkZi5ib3R0b20gPSBjZi5ib3R0b20gPSBtRG9ja0JvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cnMudHlwZSA9PSBUWVBFX1NUQVRVU19CQVJfUEFORUwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhdHVzIGJhciBwYW5lbHMgYXJlIHRoZSBvbmx5IHdpbmRvd3Mgd2hvIGNhbiBnbyBvbiB0b3Agb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXR1cyBiYXIuICBUaGV5IGFyZSBwcm90ZWN0ZWQgYnkgdGhlIFNUQVRVU19CQVJfU0VSVklDRQorICAgICAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9uLCBzbyB0aGV5IGhhdmUgdGhlIHNhbWUgcHJpdmlsZWdlcyBhcyB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgIC8vIGJhciBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgIHBmLmxlZnQgPSBkZi5sZWZ0ID0gY2YubGVmdCA9IG1SZXN0cmljdGVkU2NyZWVuTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgcGYudG9wID0gZGYudG9wID0gY2YudG9wID0gbVJlc3RyaWN0ZWRTY3JlZW5Ub3A7CisgICAgICAgICAgICAgICAgICAgIHBmLnJpZ2h0ID0gZGYucmlnaHQgPSBjZi5yaWdodCA9IG1SZXN0cmljdGVkU2NyZWVuTGVmdCttUmVzdHJpY3RlZFNjcmVlbldpZHRoOworICAgICAgICAgICAgICAgICAgICBwZi5ib3R0b20gPSBkZi5ib3R0b20gPSBjZi5ib3R0b20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG1SZXN0cmljdGVkU2NyZWVuVG9wK21SZXN0cmljdGVkU2NyZWVuSGVpZ2h0OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGRmLmxlZnQgPSBjZi5sZWZ0ID0gbUNvbnRlbnRMZWZ0OwotICAgICAgICAgICAgICAgICAgICBkZi50b3AgPSBjZi50b3AgPSBtQ29udGVudFRvcDsKLSAgICAgICAgICAgICAgICAgICAgZGYucmlnaHQgPSBjZi5yaWdodCA9IG1Db250ZW50UmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGRmLmJvdHRvbSA9IGNmLmJvdHRvbSA9IG1Db250ZW50Qm90dG9tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWRqdXN0ICE9IFNPRlRfSU5QVVRfQURKVVNUX05PVEhJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdmYubGVmdCA9IG1DdXJMZWZ0OwotICAgICAgICAgICAgICAgICAgICB2Zi50b3AgPSBtQ3VyVG9wOwotICAgICAgICAgICAgICAgICAgICB2Zi5yaWdodCA9IG1DdXJSaWdodDsKLSAgICAgICAgICAgICAgICAgICAgdmYuYm90dG9tID0gbUN1ckJvdHRvbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB2Zi5zZXQoY2YpOworICAgICAgICAgICAgICAgICAgICBwZi5sZWZ0ID0gbUNvbnRlbnRMZWZ0OworICAgICAgICAgICAgICAgICAgICBwZi50b3AgPSBtQ29udGVudFRvcDsKKyAgICAgICAgICAgICAgICAgICAgcGYucmlnaHQgPSBtQ29udGVudFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBwZi5ib3R0b20gPSBtQ29udGVudEJvdHRvbTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkanVzdCAhPSBTT0ZUX0lOUFVUX0FESlVTVF9SRVNJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmLmxlZnQgPSBjZi5sZWZ0ID0gbURvY2tMZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgZGYudG9wID0gY2YudG9wID0gbURvY2tUb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi5yaWdodCA9IGNmLnJpZ2h0ID0gbURvY2tSaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmLmJvdHRvbSA9IGNmLmJvdHRvbSA9IG1Eb2NrQm90dG9tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGYubGVmdCA9IGNmLmxlZnQgPSBtQ29udGVudExlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi50b3AgPSBjZi50b3AgPSBtQ29udGVudFRvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmLnJpZ2h0ID0gY2YucmlnaHQgPSBtQ29udGVudFJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgZGYuYm90dG9tID0gY2YuYm90dG9tID0gbUNvbnRlbnRCb3R0b207CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkanVzdCAhPSBTT0ZUX0lOUFVUX0FESlVTVF9OT1RISU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2Zi5sZWZ0ID0gbUN1ckxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2Zi50b3AgPSBtQ3VyVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgdmYucmlnaHQgPSBtQ3VyUmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2Zi5ib3R0b20gPSBtQ3VyQm90dG9tOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdmYuc2V0KGNmKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjAwNSw2ICsyMDI4LDcgQEAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwogICAgIHB1YmxpYyB2b2lkIGJlZ2luQW5pbWF0aW9uTHcoaW50IGRpc3BsYXlXaWR0aCwgaW50IGRpc3BsYXlIZWlnaHQpIHsKICAgICAgICAgbVRvcEZ1bGxzY3JlZW5PcGFxdWVXaW5kb3dTdGF0ZSA9IG51bGw7CisgICAgICAgIG1Ub3BBcHBXaW5kb3dTdGF0ZSA9IG51bGw7CiAgICAgICAgIG1Gb3JjZVN0YXR1c0JhciA9IGZhbHNlOwogICAgICAgICAKICAgICAgICAgbUhpZGVMb2NrU2NyZWVuID0gZmFsc2U7CkBAIC0yMDQwLDYgKzIwNjQsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1Ub3BBcHBXaW5kb3dTdGF0ZSA9PSBudWxsICYmIHdpbi5pc1Zpc2libGVPckJlaGluZEtleWd1YXJkTHcoKSkgeworICAgICAgICAgICAgaWYgKGF0dHJzLnR5cGUgPj0gRklSU1RfQVBQTElDQVRJT05fV0lORE9XCisgICAgICAgICAgICAgICAgICAgICYmIGF0dHJzLnR5cGUgPD0gTEFTVF9BUFBMSUNBVElPTl9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICBtVG9wQXBwV2luZG93U3RhdGUgPSB3aW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLwpAQCAtMjA4MywyMiArMjExMywxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgYm9vbGVhbiB0b3BOZWVkc01lbnUgPSBtU2hvd01lbnVLZXk7Ci0gICAgICAgIGlmIChscCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0b3BOZWVkc01lbnUgPSAobHAuZmxhZ3MgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05FRURTX01FTlVfS0VZKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHX0xBWU9VVCkgTG9nLnYoVEFHLCAiVG9wIHdpbmRvdyAiIAotICAgICAgICAgICAgICAgICsgKHRvcE5lZWRzTWVudSA/ICJuZWVkcyIgOiAiZG9lcyBub3QgbmVlZCIpCi0gICAgICAgICAgICAgICAgKyAiIHRoZSBNRU5VIGtleSIpOwotCiAgICAgICAgIG1Ub3BJc0Z1bGxzY3JlZW4gPSB0b3BJc0Z1bGxzY3JlZW47Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gY2hhbmdlZE1lbnUgPSAodG9wTmVlZHNNZW51ICE9IG1TaG93TWVudUtleSk7CiAKLSAgICAgICAgaWYgKGNoYW5nZWRNZW51KSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHRvcE5lZWRzTWVudUYgPSB0b3BOZWVkc01lbnU7CisgICAgICAgIGlmIChtVG9wQXBwV2luZG93U3RhdGUgIT0gbnVsbCAmJiBtVG9wQXBwV2luZG93U3RhdGUgIT0gbUxhc3RUb3BBcHBXaW5kb3dTdGF0ZSkgeworICAgICAgICAgICAgbUxhc3RUb3BBcHBXaW5kb3dTdGF0ZSA9IG1Ub3BBcHBXaW5kb3dTdGF0ZTsKIAotICAgICAgICAgICAgbVNob3dNZW51S2V5ID0gdG9wTmVlZHNNZW51OworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0b3BOZWVkc01lbnUgPSAobVRvcEFwcFdpbmRvd1N0YXRlLmdldEF0dHJzKCkuZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgJiBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05FRURTX01FTlVfS0VZKSAhPSAwOwogCiAgICAgICAgICAgICBtSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewpAQCAtMjExMyw5ICsyMTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElTdGF0dXNCYXJTZXJ2aWNlIHNicyA9IG1TdGF0dXNCYXJTZXJ2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNCYXJTZXJ2aWNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZE1lbnUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicy5zZXRNZW51S2V5VmlzaWJsZSh0b3BOZWVkc01lbnVGKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnMudG9wQXBwV2luZG93Q2hhbmdlZCh0b3BOZWVkc01lbnUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcG9zc2libGUgYmVjYXVzZSB3ZSdyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzQmFyU2VydmljZSA9IG51bGw7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1NpbVB1a1VubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TaW1QdWtVbmxvY2tTY3JlZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRiYjNkCi0tLSAvZGV2L251bGwKKysrIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TaW1QdWtVbmxvY2tTY3JlZW4uamF2YQpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwucG9saWN5LmltcGw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5hcHAuUHJvZ3Jlc3NEaWFsb2c7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSVRlbGVwaG9ueTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC53aWRnZXQuTG9ja1BhdHRlcm5VdGlsczsKKworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworCisvKioKKyAqIERpc3BsYXlzIGEgZGlhbGVyIGxpa2UgaW50ZXJmYWNlIHRvIHVubG9jayB0aGUgU0lNIFBVSy4KKyAqLworcHVibGljIGNsYXNzIFNpbVB1a1VubG9ja1NjcmVlbiBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIEtleWd1YXJkU2NyZWVuLAorICAgIFZpZXcuT25DbGlja0xpc3RlbmVyLCBLZXlndWFyZFVwZGF0ZU1vbml0b3IuSW5mb0NhbGxiYWNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdJVF9QUkVTU19XQUtFX01JTExJUyA9IDUwMDA7CisKKyAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkVXBkYXRlTW9uaXRvciBtVXBkYXRlTW9uaXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBUZXh0VmlldyBtSGVhZGVyVGV4dDsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1QdWtUZXh0OworICAgIHByaXZhdGUgVGV4dFZpZXcgbVBpblRleHQ7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1Gb2N1c2VkRW50cnk7CisKKyAgICBwcml2YXRlIFRleHRWaWV3IG1Pa0J1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBtRW1lcmdlbmN5Q2FsbEJ1dHRvbjsKKworICAgIHByaXZhdGUgVmlldyBtRGVsUHVrQnV0dG9uOworICAgIHByaXZhdGUgVmlldyBtRGVsUGluQnV0dG9uOworCisgICAgcHJpdmF0ZSBQcm9ncmVzc0RpYWxvZyBtU2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2cgPSBudWxsOworCisgICAgcHJpdmF0ZSBMb2NrUGF0dGVyblV0aWxzIG1Mb2NrUGF0dGVyblV0aWxzOworCisgICAgcHJpdmF0ZSBpbnQgbUNyZWF0aW9uT3JpZW50YXRpb247CisKKyAgICBwcml2YXRlIGludCBtS2V5Ym9hcmRIaWRkZW47CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRElHSVRTID0geycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5J307CisKKyAgICBwdWJsaWMgU2ltUHVrVW5sb2NrU2NyZWVuKENvbnRleHQgY29udGV4dCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgS2V5Z3VhcmRVcGRhdGVNb25pdG9yIHVwZGF0ZU1vbml0b3IsIEtleWd1YXJkU2NyZWVuQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICBMb2NrUGF0dGVyblV0aWxzIGxvY2twYXR0ZXJudXRpbHMpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1VcGRhdGVNb25pdG9yID0gdXBkYXRlTW9uaXRvcjsKKyAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7OworCisgICAgICAgIG1DcmVhdGlvbk9yaWVudGF0aW9uID0gY29uZmlndXJhdGlvbi5vcmllbnRhdGlvbjsKKyAgICAgICAgbUtleWJvYXJkSGlkZGVuID0gY29uZmlndXJhdGlvbi5oYXJkS2V5Ym9hcmRIaWRkZW47CisgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzID0gbG9ja3BhdHRlcm51dGlsczsKKworICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IExheW91dEluZmxhdGVyLmZyb20oY29udGV4dCk7CisgICAgICAgIGlmIChtS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8pIHsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoCisgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmtleWd1YXJkX3NjcmVlbl9zaW1fcHVrX2xhbmRzY2FwZSwgdGhpcywgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZsYXRlci5pbmZsYXRlKAorICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5rZXlndWFyZF9zY3JlZW5fc2ltX3B1a19wb3J0cmFpdCwgdGhpcywgdHJ1ZSk7CisgICAgICAgICAgICBuZXcgVG91Y2hJbnB1dCgpOworICAgICAgICB9CisKKyAgICAgICAgbUhlYWRlclRleHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmhlYWRlclRleHQpOworICAgICAgICBtUHVrVGV4dCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQucHVrRGlzcGxheSk7CisgICAgICAgIG1QdWtUZXh0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgcmVxdWVzdEZvY3VzKG1QdWtUZXh0KTsKKyAgICAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soKTsKKyAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVBpblRleHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnBpbkRpc3BsYXkpOworICAgICAgICBtUGluVGV4dC5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgbURlbFB1a0J1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLnB1a0RlbCk7CisgICAgICAgIG1EZWxQdWtCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICBtRGVsUGluQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQucGluRGVsKTsKKyAgICAgICAgbURlbFBpbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisKKworICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmVtZXJnZW5jeUNhbGwpOworICAgICAgICBtT2tCdXR0b24gPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm9rKTsKKworICAgICAgICBtSGVhZGVyVGV4dC5zZXRUZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX2VudGVyX3B1a19jb2RlKTsKKyAgICAgICAgbVB1a1RleHQuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKKyAgICAgICAgbVBpblRleHQuc2V0Rm9jdXNhYmxlKGZhbHNlKTsKKyAgICAgICAgbU9rQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICByZXF1ZXN0Rm9jdXMobVB1a1RleHQpOworCisgICAgICAgIGlmIChtTG9ja1BhdHRlcm5VdGlscy5pc0VtZXJnZW5jeUNhbGxDYXBhYmxlKCkpIHsKKyAgICAgICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CisgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRW1lcmdlbmN5Q2FsbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdEZvY3VzKFRleHRWaWV3IGVudHJ5KSB7CisgICAgICAgIG1Gb2N1c2VkRW50cnkgPSBlbnRyeTsKKyAgICAgICAgbUZvY3VzZWRFbnRyeS5zZXRUZXh0KCIiKTsKKyAgICB9CisKKyAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIHB1YmxpYyBib29sZWFuIG5lZWRzSW5wdXQoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKKworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIC8vIHN0YXJ0IGZyZXNoCisgICAgICAgIG1IZWFkZXJUZXh0LnNldFRleHQoUi5zdHJpbmcua2V5Z3VhcmRfcGFzc3dvcmRfZW50ZXJfcHVrX2NvZGUpOworICAgICAgICByZXF1ZXN0Rm9jdXMobVB1a1RleHQpOworICAgICAgICBtUGluVGV4dC5zZXRUZXh0KCIiKTsKKworICAgICAgICBpZiAobUxvY2tQYXR0ZXJuVXRpbHMuaXNFbWVyZ2VuY3lDYWxsQ2FwYWJsZSgpKSB7CisgICAgICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkgeworICAgICAgICAvLyBkaXNtaXNzIHRoZSBkaWFsb2cuCisgICAgICAgIGlmIChtU2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2cgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNpbVVubG9ja1Byb2dyZXNzRGlhbG9nLmRpc21pc3MoKTsKKyAgICAgICAgICAgIG1TaW1VbmxvY2tQcm9ncmVzc0RpYWxvZyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVtb3ZlQ2FsbGJhY2sodGhpcyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBTaW5jZSB0aGUgSVBDIGNhbiBibG9jaywgd2Ugd2FudCB0byBydW4gdGhlIHJlcXVlc3QgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAgKiB3aXRoIGEgY2FsbGJhY2suCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDaGVja1NpbVB1ayBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBpbiwgbVB1azsKKworICAgICAgICBwcm90ZWN0ZWQgQ2hlY2tTaW1QdWsoU3RyaW5nIHB1aywgU3RyaW5nIHBpbikgeworICAgICAgICAgICAgbVB1ayA9IHB1azsKKyAgICAgICAgICAgIG1QaW4gPSBwaW47CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCB2b2lkIG9uU2ltTG9ja0NoYW5nZWRSZXNwb25zZShib29sZWFuIHN1Y2Nlc3MpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gSVRlbGVwaG9ueS5TdHViLmFzSW50ZXJmYWNlKFNlcnZpY2VNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tTZXJ2aWNlKCJwaG9uZSIpKS5zdXBwbHlQdWsobVB1aywgbVBpbik7CisKKyAgICAgICAgICAgICAgICBwb3N0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25TaW1Mb2NrQ2hhbmdlZFJlc3BvbnNlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uU2ltTG9ja0NoYW5nZWRSZXNwb25zZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgIGlmICh2ID09IG1EZWxQdWtCdXR0b24pIHsKKyAgICAgICAgICAgIGZpbmFsIEVkaXRhYmxlIGRpZ2l0cyA9IG1QdWtUZXh0LmdldEVkaXRhYmxlVGV4dCgpOworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IGRpZ2l0cy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzLmRlbGV0ZShsZW4tMSwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soKTsKKyAgICAgICAgfSBlbHNlIGlmICh2ID09IG1EZWxQaW5CdXR0b24pIHsKKyAgICAgICAgICAgIGZpbmFsIEVkaXRhYmxlIGRpZ2l0cyA9IG1QaW5UZXh0LmdldEVkaXRhYmxlVGV4dCgpOworICAgICAgICAgICAgZmluYWwgaW50IGxlbiA9IGRpZ2l0cy5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzLmRlbGV0ZShsZW4tMSwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWxsYmFjay5wb2tlV2FrZWxvY2soKTsKKyAgICAgICAgfSBlbHNlIGlmICh2ID09IG1QaW5UZXh0KSB7CisgICAgICAgICAgICByZXF1ZXN0Rm9jdXMobVBpblRleHQpOworICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbUVtZXJnZW5jeUNhbGxCdXR0b24pIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay50YWtlRW1lcmdlbmN5Q2FsbEFjdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbU9rQnV0dG9uKSB7CisgICAgICAgICAgICBjaGVja1B1aygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEaWFsb2cgZ2V0U2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2coKSB7CisgICAgICAgIGlmIChtU2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2cgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNpbVVubG9ja1Byb2dyZXNzRGlhbG9nID0gbmV3IFByb2dyZXNzRGlhbG9nKG1Db250ZXh0KTsKKyAgICAgICAgICAgIG1TaW1VbmxvY2tQcm9ncmVzc0RpYWxvZy5zZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcubG9ja3NjcmVlbl9zaW1fdW5sb2NrX3Byb2dyZXNzX2RpYWxvZ19tZXNzYWdlKSk7CisgICAgICAgICAgICBtU2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2cuc2V0SW5kZXRlcm1pbmF0ZSh0cnVlKTsKKyAgICAgICAgICAgIG1TaW1VbmxvY2tQcm9ncmVzc0RpYWxvZy5zZXRDYW5jZWxhYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIG1TaW1VbmxvY2tQcm9ncmVzc0RpYWxvZy5nZXRXaW5kb3coKS5zZXRUeXBlKAorICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5UWVBFX0tFWUdVQVJEX0RJQUxPRyk7CisgICAgICAgICAgICBpZiAoIW1Db250ZXh0LmdldFJlc291cmNlcygpLmdldEJvb2xlYW4oCisgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfc2Zfc2xvd0JsdXIpKSB7CisgICAgICAgICAgICAgICAgbVNpbVVubG9ja1Byb2dyZXNzRGlhbG9nLmdldFdpbmRvdygpLnNldEZsYWdzKAorICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19CTFVSX0JFSElORCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfQkxVUl9CRUhJTkQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtU2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2c7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUHVrKCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcHVrIGlzIGF0IGxlYXN0IDggZGlnaXRzIGxvbmcuCisgICAgICAgIGlmIChtUHVrVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPCA4KSB7CisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGRpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSB1c2VyLCBhbmQgZG9uJ3Qgc3VibWl0LgorICAgICAgICAgICAgbUhlYWRlclRleHQuc2V0VGV4dChSLnN0cmluZy5pbnZhbGlkUHVrKTsKKyAgICAgICAgICAgIG1QdWtUZXh0LnNldFRleHQoIiIpOworICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QaW5UZXh0LmdldFRleHQoKS5sZW5ndGgoKSA8IDQKKyAgICAgICAgICAgICAgICB8fCBtUGluVGV4dC5nZXRUZXh0KCkubGVuZ3RoKCkgPiA4KSB7CisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGRpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSB1c2VyLCBhbmQgZG9uJ3Qgc3VibWl0LgorICAgICAgICAgICAgbUhlYWRlclRleHQuc2V0VGV4dChSLnN0cmluZy5pbnZhbGlkUGluKTsKKyAgICAgICAgICAgIG1QaW5UZXh0LnNldFRleHQoIiIpOworICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2V0U2ltVW5sb2NrUHJvZ3Jlc3NEaWFsb2coKS5zaG93KCk7CisKKyAgICAgICAgbmV3IENoZWNrU2ltUHVrKG1QdWtUZXh0LmdldFRleHQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIG1QaW5UZXh0LmdldFRleHQoKS50b1N0cmluZygpKSB7CisgICAgICAgICAgICB2b2lkIG9uU2ltTG9ja0NoYW5nZWRSZXNwb25zZShib29sZWFuIHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNpbVVubG9ja1Byb2dyZXNzRGlhbG9nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNpbVVubG9ja1Byb2dyZXNzRGlhbG9nLmhpZGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGNsb3NpbmcgdGhlIGtleWd1YXJkLCByZXBvcnQgYmFjayB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaW0gaXMgdW5sb2NrZWQgc28gaXQga25vd3MgcmlnaHQgYXdheQorICAgICAgICAgICAgICAgICAgICBtVXBkYXRlTW9uaXRvci5yZXBvcnRTaW1VbmxvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suZ29Ub1VubG9ja1NjcmVlbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1IZWFkZXJUZXh0LnNldFRleHQoUi5zdHJpbmcuYmFkUHVrKTsKKyAgICAgICAgICAgICAgICAgICAgbVB1a1RleHQuc2V0VGV4dCgiIik7CisgICAgICAgICAgICAgICAgICAgIG1QaW5UZXh0LnNldFRleHQoIiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucG9rZVdha2Vsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9CQUNLKSB7CisgICAgICAgICAgICBtQ2FsbGJhY2suZ29Ub0xvY2tTY3JlZW4oKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGNoYXIgbWF0Y2ggPSBldmVudC5nZXRNYXRjaChESUdJVFMpOworICAgICAgICBpZiAobWF0Y2ggIT0gMCkgeworICAgICAgICAgICAgcmVwb3J0RGlnaXQobWF0Y2ggLSAnMCcpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9ERUwpIHsKKyAgICAgICAgICAgIG1Gb2N1c2VkRW50cnkub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICAgICAgICAgIGZpbmFsIEVkaXRhYmxlIGRpZ2l0cyA9IG1Gb2N1c2VkRW50cnkuZ2V0RWRpdGFibGVUZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gZGlnaXRzLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMuZGVsZXRlKGxlbi0xLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jaygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX0VOVEVSKSB7CisgICAgICAgICAgICBjaGVja1B1aygpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydERpZ2l0KGludCBkaWdpdCkgeworICAgICAgICBtRm9jdXNlZEVudHJ5LmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGRpZ2l0KSk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVDb25maWd1cmF0aW9uKCkgeworICAgICAgICBDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKG5ld0NvbmZpZy5vcmllbnRhdGlvbiAhPSBtQ3JlYXRpb25PcmllbnRhdGlvbikgeworICAgICAgICAgICAgbUNhbGxiYWNrLnJlY3JlYXRlTWUobmV3Q29uZmlnKTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXdDb25maWcuaGFyZEtleWJvYXJkSGlkZGVuICE9IG1LZXlib2FyZEhpZGRlbikgeworICAgICAgICAgICAgbUtleWJvYXJkSGlkZGVuID0gbmV3Q29uZmlnLmhhcmRLZXlib2FyZEhpZGRlbjsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNLZXlib2FyZE9wZW4gPQorICAgICAgICAgICAgICAgIChtS2V5Ym9hcmRIaWRkZW4gPT0gQ29uZmlndXJhdGlvbi5IQVJES0VZQk9BUkRISURERU5fTk8pOworICAgICAgICAgICAgaWYgKG1VcGRhdGVNb25pdG9yLmlzS2V5Z3VhcmRCeXBhc3NFbmFibGVkKCkgJiYgaXNLZXlib2FyZE9wZW4pIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2suZ29Ub1VubG9ja1NjcmVlbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7CisgICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOworICAgICAgICB1cGRhdGVDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKSB7CisgICAgICAgIHN1cGVyLm9uQ29uZmlndXJhdGlvbkNoYW5nZWQobmV3Q29uZmlnKTsKKyAgICAgICAgdXBkYXRlQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW5wdXQgZnJvbSB0b3VjaCBkaWFsZXIuICBPbmx5IHJlbGV2YW50IHdoZW4KKyAgICAgKiB0aGUga2V5Ym9hcmQgaXMgc2h1dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFRvdWNoSW5wdXQgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbVplcm87CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbU9uZTsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtVHdvOworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1UaHJlZTsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtRm91cjsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtRml2ZTsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtU2l4OworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1TZXZlbjsKKyAgICAgICAgcHJpdmF0ZSBUZXh0VmlldyBtRWlnaHQ7CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbU5pbmU7CisgICAgICAgIHByaXZhdGUgVGV4dFZpZXcgbUNhbmNlbEJ1dHRvbjsKKworICAgICAgICBwcml2YXRlIFRvdWNoSW5wdXQoKSB7CisgICAgICAgICAgICBtWmVybyA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuemVybyk7CisgICAgICAgICAgICBtT25lID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5vbmUpOworICAgICAgICAgICAgbVR3byA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQudHdvKTsKKyAgICAgICAgICAgIG1UaHJlZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQudGhyZWUpOworICAgICAgICAgICAgbUZvdXIgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmZvdXIpOworICAgICAgICAgICAgbUZpdmUgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmZpdmUpOworICAgICAgICAgICAgbVNpeCA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc2l4KTsKKyAgICAgICAgICAgIG1TZXZlbiA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc2V2ZW4pOworICAgICAgICAgICAgbUVpZ2h0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5laWdodCk7CisgICAgICAgICAgICBtTmluZSA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubmluZSk7CisgICAgICAgICAgICBtQ2FuY2VsQnV0dG9uID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYW5jZWwpOworCisgICAgICAgICAgICBtWmVyby5zZXRUZXh0KCIwIik7CisgICAgICAgICAgICBtT25lLnNldFRleHQoIjEiKTsKKyAgICAgICAgICAgIG1Ud28uc2V0VGV4dCgiMiIpOworICAgICAgICAgICAgbVRocmVlLnNldFRleHQoIjMiKTsKKyAgICAgICAgICAgIG1Gb3VyLnNldFRleHQoIjQiKTsKKyAgICAgICAgICAgIG1GaXZlLnNldFRleHQoIjUiKTsKKyAgICAgICAgICAgIG1TaXguc2V0VGV4dCgiNiIpOworICAgICAgICAgICAgbVNldmVuLnNldFRleHQoIjciKTsKKyAgICAgICAgICAgIG1FaWdodC5zZXRUZXh0KCI4Iik7CisgICAgICAgICAgICBtTmluZS5zZXRUZXh0KCI5Iik7CisKKyAgICAgICAgICAgIG1aZXJvLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1PbmUuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbVR3by5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtVGhyZWUuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbUZvdXIuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbUZpdmUuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbVNpeC5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBtU2V2ZW4uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgbUVpZ2h0LnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1OaW5lLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIG1DYW5jZWxCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgaWYgKHYgPT0gbUNhbmNlbEJ1dHRvbikgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay5nb1RvTG9ja1NjcmVlbigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IGRpZ2l0ID0gY2hlY2tEaWdpdCh2KTsKKyAgICAgICAgICAgIGlmIChkaWdpdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLnBva2VXYWtlbG9jayhESUdJVF9QUkVTU19XQUtFX01JTExJUyk7CisgICAgICAgICAgICAgICAgcmVwb3J0RGlnaXQoZGlnaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY2hlY2tEaWdpdChWaWV3IHYpIHsKKyAgICAgICAgICAgIGludCBkaWdpdCA9IC0xOworICAgICAgICAgICAgaWYgKHYgPT0gbVplcm8pIHsKKyAgICAgICAgICAgICAgICBkaWdpdCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbU9uZSkgeworICAgICAgICAgICAgICAgIGRpZ2l0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtVHdvKSB7CisgICAgICAgICAgICAgICAgZGlnaXQgPSAyOworICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IG1UaHJlZSkgeworICAgICAgICAgICAgICAgIGRpZ2l0ID0gMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtRm91cikgeworICAgICAgICAgICAgICAgIGRpZ2l0ID0gNDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtRml2ZSkgeworICAgICAgICAgICAgICAgIGRpZ2l0ID0gNTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtU2l4KSB7CisgICAgICAgICAgICAgICAgZGlnaXQgPSA2OworICAgICAgICAgICAgfSBlbHNlIGlmICh2ID09IG1TZXZlbikgeworICAgICAgICAgICAgICAgIGRpZ2l0ID0gNzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodiA9PSBtRWlnaHQpIHsKKyAgICAgICAgICAgICAgICBkaWdpdCA9IDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gbU5pbmUpIHsKKyAgICAgICAgICAgICAgICBkaWdpdCA9IDk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGlnaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblBob25lU3RhdGVDaGFuZ2VkKFN0cmluZyBuZXdTdGF0ZSkgeworICAgICAgICBpZiAobUxvY2tQYXR0ZXJuVXRpbHMuaXNFbWVyZ2VuY3lDYWxsQ2FwYWJsZSgpKSB7CisgICAgICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SZWZyZXNoQmF0dGVyeUluZm8oYm9vbGVhbiBzaG93QmF0dGVyeUluZm8sIGJvb2xlYW4gcGx1Z2dlZEluLCBpbnQgYmF0dGVyeUxldmVsKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblJlZnJlc2hDYXJyaWVySW5mbyhDaGFyU2VxdWVuY2UgcGxtbiwgQ2hhclNlcXVlbmNlIHNwbikgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25SaW5nZXJNb2RlQ2hhbmdlZChpbnQgc3RhdGUpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uVGltZUNoYW5nZWQoKSB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1NpbVVubG9ja1NjcmVlbi5qYXZhIGIvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9TaW1VbmxvY2tTY3JlZW4uamF2YQppbmRleCA0ODZlN2FhLi43MjU1YzI3IDEwMDY0NAotLS0gYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1NpbVVubG9ja1NjcmVlbi5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvU2ltVW5sb2NrU2NyZWVuLmphdmEKQEAgLTkyLDE2ICs5MiwxNyBAQAogICAgICAgICBtQmFja1NwYWNlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuYmFja3NwYWNlKTsKICAgICAgICAgbUJhY2tTcGFjZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIodGhpcyk7CiAKLSAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbWVyZ2VuY3lDYWxsKTsKLSAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKICAgICAgICAgbU9rQnV0dG9uID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5vayk7CiAKICAgICAgICAgbUhlYWRlclRleHQuc2V0VGV4dChSLnN0cmluZy5rZXlndWFyZF9wYXNzd29yZF9lbnRlcl9waW5fY29kZSk7CiAgICAgICAgIG1QaW5UZXh0LnNldEZvY3VzYWJsZShmYWxzZSk7CiAKLSAgICAgICAgbUVtZXJnZW5jeUNhbGxCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwogICAgICAgICBtT2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwogCisgICAgICAgIG1FbWVyZ2VuY3lDYWxsQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuZW1lcmdlbmN5Q2FsbCk7CisgICAgICAgIG1FbWVyZ2VuY3lDYWxsQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbUxvY2tQYXR0ZXJuVXRpbHMudXBkYXRlRW1lcmdlbmN5Q2FsbEJ1dHRvblN0YXRlKG1FbWVyZ2VuY3lDYWxsQnV0dG9uKTsKKwogICAgICAgICBzZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKICAgICB9CiAKQEAgLTIyOSw3ICsyMzAsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBjbG9zaW5nIHRoZSBrZXlndWFyZCwgcmVwb3J0IGJhY2sgdGhhdAogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2ltIGlzIHVubG9ja2VkIHNvIGl0IGtub3dzIHJpZ2h0IGF3YXkKLSAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVwb3J0U2ltUGluVW5sb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgbVVwZGF0ZU1vbml0b3IucmVwb3J0U2ltVW5sb2NrZWQoKTsKICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdvVG9VbmxvY2tTY3JlZW4oKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtSGVhZGVyVGV4dC5zZXRUZXh0KFIuc3RyaW5nLmtleWd1YXJkX3Bhc3N3b3JkX3dyb25nX3Bpbl9jb2RlKTsKQEAgLTI5MSw5ICsyOTIsOCBAQAogICAgICAgICAgICAgICAgIG1DYWxsYmFjay5nb1RvVW5sb2NrU2NyZWVuKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgCiAgICAgfQotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewogICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKQEAgLTQwMyw3ICs0MDMsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uUGhvbmVTdGF0ZUNoYW5nZWQoU3RyaW5nIG5ld1N0YXRlKSB7Ci0gICAgICAgIG1Mb2NrUGF0dGVyblV0aWxzLnVwZGF0ZUVtZXJnZW5jeUNhbGxCdXR0b25TdGF0ZShtRW1lcmdlbmN5Q2FsbEJ1dHRvbik7CisgICAgICAgICAgICBtTG9ja1BhdHRlcm5VdGlscy51cGRhdGVFbWVyZ2VuY3lDYWxsQnV0dG9uU3RhdGUobUVtZXJnZW5jeUNhbGxCdXR0b24pOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uUmVmcmVzaEJhdHRlcnlJbmZvKGJvb2xlYW4gc2hvd0JhdHRlcnlJbmZvLCBib29sZWFuIHBsdWdnZWRJbiwgaW50IGJhdHRlcnlMZXZlbCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCAwNTM4NTRmLi40NGRmNWI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2hhbC5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCkBAIC01MywxMyArNTMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIHNpbSBidWlsZCBkb2Vzbid0IGhhdmUgZ2V0dGlkCi0KLSNpZm5kZWYgSEFWRV9HRVRUSUQKLSMgZGVmaW5lIGdldHRpZCBnZXRwaWQKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzYwLDggKzM1Myw4IEBACiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTQyOSw3ICs0MjIsNyBAQAogICAgICAgICBMT0dWKCJjcmVhdGVUcmFjaygpIGxTZXNzaW9uSWQ6ICVkIiwgbFNlc3Npb25JZCk7CiAKICAgICAgICAgdHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVRyYWNrX2woY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIGxTZXNzaW9uSWQsICZsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBsU2Vzc2lvbklkLCAmbFN0YXR1cyk7CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtNDc3LDcgKzQ3MCw3IEBACiAgICAgcmV0dXJuIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OmZvcm1hdChpbnQgb3V0cHV0KSBjb25zdAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpmb3JtYXQoaW50IG91dHB1dCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKQEAgLTkxNiw3ICs5MDksNyBAQAogICAgIHJldHVybiAoaW50KW1DaGFubmVsQ291bnQ7CiB9CiAKLWludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmZvcm1hdCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1Gb3JtYXQ7CiB9CkBAIC0xMDAyLDYgKzk5NSw4IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNoYW5uZWwgQ291bnQ6ICVkXG4iLCBtQ2hhbm5lbENvdW50KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2hhbm5lbCBNYXNrOiAweCUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJGcmFtZSBzaXplOiAlZFxuIiwgbUZyYW1lU2l6ZSk7CkBAIC0xMDc1LDcgKzEwNzAsNyBAQAogCiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lICBDbGllbiBUeXAgRm10IENobiBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIG1hc2sgICBTZXNzaW9uIEJ1ZiAgUyBNIEYgU1JhdGUgTGVmdFYgUmlnaFYgIFNlcnYgICAgICAgVXNlciAgICAgICBNYWluIGJ1ZiAgIEF1eCBCdWZcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtMTA4Niw3ICsxMDgxLDcgQEAKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIk91dHB1dCB0aHJlYWQgJXAgYWN0aXZlIHRyYWNrc1xuIiwgdGhpcyk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIFNlc3Npb24gQnVmICBTIE0gRiBTUmF0ZSBMZWZ0ViBSaWdoViAgU2VydiAgICAgICBVc2VyICAgICAgIE1haW4gYnVmICAgQXV4IEJ1ZlxuIik7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgTmFtZSAgQ2xpZW4gVHlwIEZtdCBDaG4gbWFzayAgIFNlc3Npb24gQnVmICBTIE0gRiBTUmF0ZSBMZWZ0ViBSaWdoViAgU2VydiAgICAgICBVc2VyICAgICAgIE1haW4gYnVmICAgQXV4IEJ1ZlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHdwPFRyYWNrPiB3VHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICBpZiAod1RyYWNrICE9IDApIHsKQEAgLTExNzIsOCArMTE2Nyw4IEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGludCBzZXNzaW9uSWQsCkBAIC0xMTgzLDExICsxMTc4LDE0IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAogICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbENvdW50ICE9IChpbnQpbUNoYW5uZWxDb3VudCkgewotICAgICAgICAgICAgTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6ICBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbENvdW50ICVkIGZvciBvdXRwdXQgJXAiLAotICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgbU91dHB1dCk7Ci0gICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICBpZiAoKGZvcm1hdCAmIEFVRElPX0ZPUk1BVF9NQUlOX01BU0spID09IEFVRElPX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlIHx8IGZvcm1hdCAhPSBtRm9ybWF0IHx8IGNoYW5uZWxNYXNrICE9IG1DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrX2woKSBCYWQgcGFyYW1ldGVyOiBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgMHglMDh4IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciBvdXRwdXQgJXAgd2l0aCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbU91dHB1dCwgbUZvcm1hdCk7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBSZXNhbXBsZXIgaW1wbGVtZW50YXRpb24gbGltaXRzIGlucHV0IHNhbXBsaW5nIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGluZyByYXRlLgpAQCAtMTIyNCw3ICsxMjIyLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCk7CiAgICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CkBAIC0xMzczLDcgKzEzNzEsNyBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsczsKKyAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsTWFzazsKICAgICAgICAgZGVzYy5zYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKQEAgLTEzOTMsOCArMTM5MSw4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnJlYWRPdXRwdXRQYXJhbWV0ZXJzKCkKIHsKICAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVscyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxzKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KXBvcGNvdW50KG1DaGFubmVsTWFzayk7CiAgICAgbUZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKICAgICBtRnJhbWVTaXplID0gKHVpbnQxNl90KWF1ZGlvX3N0cmVhbV9mcmFtZV9zaXplKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUZyYW1lQ291bnQgPSBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKSAvIG1GcmFtZVNpemU7CkBAIC0xODA0LDcgKzE4MDIsNyBAQAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX0NPVU5ULCAodm9pZCAqKXRyYWNrLT5jaGFubmVsQ291bnQoKSk7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKXRyYWNrLT5jaGFubmVsTWFzaygpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCkBAIC0yNjgzLDcgKzI2ODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKICAgICBpZiAob3V0cHV0VHJhY2stPmNibGsoKSAhPSBOVUxMKSB7CiAgICAgICAgIHRocmVhZC0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9DTlQsIDEuMGYpOwpAQCAtMjc1MSw4ICsyNzQ5LDggQEAKICAgICAgICAgICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMjc3Miw2ICsyNzcwLDcgQEAKIAogICAgIC8vIExPR0QoIkNyZWF0aW5nIHRyYWNrIHdpdGggJWQgYnVmZmVycyBAICVkIGJ5dGVzIiwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwogICAgc2l6ZV90IHNpemUgPSBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoY2hhbm5lbE1hc2spOwogICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCk7CiAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKICAgICAgICBzaXplICs9IGJ1ZmZlclNpemU7CkBAIC0yNzg2LDcgKzI3ODUsOCBAQAogICAgICAgICAgICAgICAgIC8vIGNsZWFyIGFsbCBidWZmZXJzCiAgICAgICAgICAgICAgICAgbUNibGstPmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgICAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CkBAIC0yODEwLDcgKzI4MTAsOCBAQAogICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgbUNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgbUNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CiAgICAgICAgICAgIG1CdWZmZXIgPSAoY2hhciopbUNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKICAgICAgICAgICAgbWVtc2V0KG1CdWZmZXIsIDAsIGZyYW1lQ291bnQqY2hhbm5lbENvdW50KnNpemVvZihpbnQxNl90KSk7CiAgICAgICAgICAgIC8vIEZvcmNlIHVuZGVycnVuIGNvbmRpdGlvbiB0byBhdm9pZCBmYWxzZSB1bmRlcnJ1biBjYWxsYmFjayB1bnRpbCBmaXJzdCBkYXRhIGlzCkBAIC0yODc3LDcgKzI4NzgsMTEgQEAKIH0KIAogaW50IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpjaGFubmVsQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChpbnQpbUNibGstPmNoYW5uZWxDb3VudDsKKyAgICByZXR1cm4gKGNvbnN0IGludCltQ2hhbm5lbENvdW50OworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6Y2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1DaGFubmVsTWFzazsKIH0KIAogdm9pZCogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OmdldEJ1ZmZlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGZyYW1lcykgY29uc3QgewpAQCAtMjg4OSw5ICsyODk0LDkgQEAKICAgICBpZiAoYnVmZmVyU3RhcnQgPCBtQnVmZmVyIHx8IGJ1ZmZlclN0YXJ0ID4gYnVmZmVyRW5kIHx8IGJ1ZmZlckVuZCA+IG1CdWZmZXJFbmQgfHwKICAgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1ZmZlclN0YXJ0ICYgKHVuc2lnbmVkIGxvbmcpKGNibGstPmZyYW1lU2l6ZSAtIDEpKSkgewogICAgICAgICBMT0dFKCJUcmFja0Jhc2U6OmdldEJ1ZmZlciBidWZmZXIgb3V0IG9mIHJhbmdlOlxuICAgIHN0YXJ0OiAlcCwgZW5kICVwICwgbUJ1ZmZlciAlcCBtQnVmZmVyRW5kICVwXG4gICAgXAotICAgICAgICAgICAgICAgIHNlcnZlciAlZCwgc2VydmVyQmFzZSAlZCwgdXNlciAlZCwgdXNlckJhc2UgJWQsIGNoYW5uZWxDb3VudCAlZCIsCisgICAgICAgICAgICAgICAgc2VydmVyICVkLCBzZXJ2ZXJCYXNlICVkLCB1c2VyICVkLCB1c2VyQmFzZSAlZCIsCiAgICAgICAgICAgICAgICAgYnVmZmVyU3RhcnQsIGJ1ZmZlckVuZCwgbUJ1ZmZlciwgbUJ1ZmZlckVuZCwKLSAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlLCBjYmxrLT5jaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIGNibGstPnNlcnZlciwgY2Jsay0+c2VydmVyQmFzZSwgY2Jsay0+dXNlciwgY2Jsay0+dXNlckJhc2UpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI5MDYsMTIgKzI5MTEsMTIgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGludCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCAwLCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCksCisgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgMCwgc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQpLAogICAgIG1NdXRlKGZhbHNlKSwgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLCBtTmFtZSgtMSksIG1NYWluQnVmZmVyKE5VTEwpLCBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpCiB7CkBAIC0yOTMxLDcgKzI5MzYsNyBAQAogICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CiAgICAgICAgIC8vIE5PVEU6IGF1ZGlvX3RyYWNrX2NibGtfdDo6ZnJhbWVTaXplIGZvciA4IGJpdCBQQ00gZGF0YSBpcyBiYXNlZCBvbiBhIHNhbXBsZSBzaXplIG9mCiAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlciBieSBBdWRpb1RyYWNrCi0gICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgPyBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkgOiBzaXplb2YoaW50OF90KTsKKyAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSA/IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkgOiBzaXplb2YoaW50OF90KTsKICAgICB9CiB9CiAKQEAgLTI5NzksMTIgKzI5ODQsMTIgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgJTAzdSAlMDV1ICAgJTA0dSAlMWQgJTFkICUxZCAlMDV1ICUwNXUgJTA1dSAgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgMHglMDh4ICUwNXUgICAlMDR1ICUxZCAlMWQgJTFkICUwNXUgJTA1dSAlMDV1ICAweCUwOHggMHglMDh4IDB4JTA4eCAweCUwOHhcbiIsCiAgICAgICAgICAgICBtTmFtZSAtIEF1ZGlvTWl4ZXI6OlRSQUNLMCwKICAgICAgICAgICAgIChtQ2xpZW50ID09IE5VTEwpID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgbUZvcm1hdCwKLSAgICAgICAgICAgIG1DYmxrLT5jaGFubmVsQ291bnQsCisgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsCiAgICAgICAgICAgICBtU3RhdGUsCkBAIC0zMjE5LDIxICszMjI0LDIxIEBACiAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGZsYWdzLCAwLCBzZXNzaW9uSWQpLAorICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCAwLCBzZXNzaW9uSWQpLAogICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCiB7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKICAgICAgICBMT0dWKCJSZWNvcmRUcmFjayBjb25zdHJ1Y3Rvciwgc2l6ZSAlZCIsIChpbnQpbUJ1ZmZlckVuZCAtIChpbnQpbUJ1ZmZlcik7CiAgICAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUKSB7Ci0gICAgICAgICAgIG1DYmxrLT5mcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKKyAgICAgICAgICAgbUNibGstPmZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBzaXplb2YoaW50OF90KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVTaXplID0gc2l6ZW9mKGludDhfdCk7CiAgICAgICAgfQpAQCAtMzMxMywxMCArMzMxOCwxMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6ZHVtcChjaGFyKiBidWZmZXIsIHNpemVfdCBzaXplKQogewotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTAzdSAlMDN1ICUwNWQgICAlMDR1ICUwMWQgJTA1dSAgJTA4eCAlMDh4XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTAzdSAweCUwOHggJTA1ZCAgICUwNHUgJTAxZCAlMDV1ICAlMDh4ICUwOHhcbiIsCiAgICAgICAgICAgICAobUNsaWVudCA9PSBOVUxMKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtRm9ybWF0LAotICAgICAgICAgICAgbUNibGstPmNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1TdGF0ZSwKQEAgLTMzMzIsMTAgKzMzMzcsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICBEdXBsaWNhdGluZ1RocmVhZCAqc291cmNlVGhyZWFkLAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkKLSAgICA6ICAgVHJhY2sodGhyZWFkLCBOVUxMLCBBVURJT19TVFJFQU1fQ05ULCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgTlVMTCwgMCksCisgICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX0NOVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgTlVMTCwgMCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewogCkBAIC0zMzQ2LDggKzMzNTEsMTAgQEAKICAgICAgICAgbUNibGstPnZvbHVtZVswXSA9IG1DYmxrLT52b2x1bWVbMV0gPSAweDEwMDA7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tVHJhY2tzLmFkZCh0aGlzKTsKLSAgICAgICAgTE9HVigiT3V0cHV0VHJhY2sgY29uc3RydWN0b3IgbUNibGsgJXAsIG1CdWZmZXIgJXAsIG1DYmxrLT5idWZmZXJzICVwLCBtQ2Jsay0+ZnJhbWVDb3VudCAlZCwgbUNibGstPnNhbXBsZVJhdGUgJWQsIG1DYmxrLT5jaGFubmVsQ291bnQgJWQgbUJ1ZmZlckVuZCAlcCIsCi0gICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsIG1DYmxrLT5idWZmZXJzLCBtQ2Jsay0+ZnJhbWVDb3VudCwgbUNibGstPnNhbXBsZVJhdGUsIG1DYmxrLT5jaGFubmVsQ291bnQsIG1CdWZmZXJFbmQpOworICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsICIgXAorICAgICAgICAgICAgICAgICJtQ2Jsay0+ZnJhbWVDb3VudCAlZCwgbUNibGstPnNhbXBsZVJhdGUgJWQsIG1DaGFubmVsTWFzayAweCUwOHggbUJ1ZmZlckVuZCAlcCIsCisgICAgICAgICAgICAgICAgbUNibGssIG1CdWZmZXIsIG1DYmxrLT5idWZmZXJzLAorICAgICAgICAgICAgICAgIG1DYmxrLT5mcmFtZUNvdW50LCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUNoYW5uZWxNYXNrLCBtQnVmZmVyRW5kKTsKICAgICB9IGVsc2UgewogICAgICAgICBMT0dXKCJFcnJvciBjcmVhdGluZyBvdXRwdXQgdHJhY2sgb24gdGhyZWFkICVwIiwgcGxheWJhY2tUaHJlYWQpOwogICAgIH0KQEAgLTMzODIsNyArMzM4OSw3IEBACiB7CiAgICAgQnVmZmVyICpwSW5CdWZmZXI7CiAgICAgQnVmZmVyIGluQnVmZmVyOwotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1DYmxrLT5jaGFubmVsQ291bnQ7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxDb3VudDsKICAgICBib29sIG91dHB1dEJ1ZmZlckZ1bGwgPSBmYWxzZTsKICAgICBpbkJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOwogICAgIGluQnVmZmVyLmkxNiA9IGRhdGE7CkBAIC0zNjY3LDggKzM2NzQsOCBAQAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGludCBpbnB1dCwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKQEAgLTM3MTcsNyArMzcyNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gY3JlYXRlIG5ldyByZWNvcmQgdHJhY2suIFRoZSByZWNvcmQgdHJhY2sgdXNlcyBvbmUgdHJhY2sgaW4gbUhhcmR3YXJlTWl4ZXJUaHJlYWQgYnkgY29udmVudGlvbi4KICAgICAgICAgcmVjb3JkVHJhY2sgPSBuZXcgUmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjayh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgbFNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbFNlc3Npb25JZCk7CiAgICAgfQogICAgIGlmIChyZWNvcmRUcmFjay0+Z2V0Q2JsaygpID09IE5VTEwpIHsKICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IGJlZm9yZSBkZWxldGluZyB0aGUgUmVjb3JkVHJhY2sgc28gdGhhdCB0aGUgQ2xpZW50CkBAIC00MDY1LDcgKzQwNzIsNyBAQAogCiAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBUcmFjazpcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgICBDbGllbiBGbXQgQ2huIFNlc3Npb24gQnVmICBTIFNSYXRlICBTZXJ2ICAgICBVc2VyXG4iKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgQ2xpZW4gRm10IENobiBtYXNrICAgU2Vzc2lvbiBCdWYgIFMgU1JhdGUgIFNlcnYgICAgIFVzZXJcbiIpOwogICAgICAgICBtQWN0aXZlVHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCkBAIC00MjE5LDcgKzQyMjYsNyBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbHM7CisgICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIGRlc2Muc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CkBAIC00MjQyLDggKzQyNDksOCBAQAogICAgIG1SZXNhbXBsZXIgPSAwOwogCiAgICAgbVNhbXBsZVJhdGUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7Ci0gICAgbUNoYW5uZWxzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVsQ291bnQgPSAodWludDE2X3QpcG9wY291bnQobUNoYW5uZWxzKTsKKyAgICBtQ2hhbm5lbE1hc2sgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdClwb3Bjb3VudChtQ2hhbm5lbE1hc2spOwogICAgIG1Gb3JtYXQgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpYXVkaW9fc3RyZWFtX2ZyYW1lX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1JbnB1dEJ5dGVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDA2OThkY2IuLjFmYWQ5ODcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19oYWwuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgogCiAjaW5jbHVkZSAiQXVkaW9CdWZmZXJQcm92aWRlci5oIgogCkBAIC03Niw4ICs3Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KGludCBvdXRwdXQpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIGludCAgICAgICAgIGZvcm1hdChpbnQgb3V0cHV0KSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBmb3JtYXQoaW50IG91dHB1dCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudChpbnQgb3V0cHV0KSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBsYXRlbmN5KGludCBvdXRwdXQpIGNvbnN0OwogCkBAIC0xODksOCArMTg5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCkBAIC0zMDEsOCArMzAxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLApAQCAtMzI5LDEyICszMjksMTQgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgPSAwOwogICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwogCi0gICAgICAgICAgICBpbnQgZm9ybWF0KCkgY29uc3QgeworICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0KCkgY29uc3QgewogICAgICAgICAgICAgICAgIHJldHVybiBtRm9ybWF0OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50KCkgY29uc3QgOwogCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaygpIGNvbnN0OworCiAgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSgpIGNvbnN0OwogCiAgICAgICAgICAgICB2b2lkKiBnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0OwpAQCAtMzYwLDkgKzM2MiwxMSBAQAogICAgICAgICAgICAgLy8gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgYSBsb2NrIGZvciB0aGVzZQogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU3RhdGU7CiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1DbGllbnRUaWQ7Ci0gICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1Gb3JtYXQ7CisgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1GbGFnczsKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgbUNoYW5uZWxNYXNrOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIENvbmZpZ0V2ZW50IHsKQEAgLTM3NSw3ICszNzksNyBAQAogCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgY2hhbm5lbENvdW50KCkgY29uc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIGZvcm1hdCgpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBmb3JtYXQoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB3YWtlVXAoKSAgICB7IG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOyB9CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKQEAgLTQwNiwxMCArNDEwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gICAgICAgIG1BdWRpb0ZsaW5nZXI7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgIG1QYXJhbUNvbmQ7CiAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAgICAgICAgIG1OZXdQYXJhbWV0ZXJzOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtUGFyYW1TdGF0dXM7CkBAIC00NDIsOCArNDQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCk7CkBAIC01MzAsOCArNTM0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VHJhY2soICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cGxpY2F0aW5nVGhyZWFkICpzb3VyY2VUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfk91dHB1dFRyYWNrKCk7CiAKQEAgLTU4Myw4ICs1ODcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKQEAgLTgyOSw4ICs4MzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRUcmFjayhjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggNTBkY2RhNy4uNmU5MzE5ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtMjYsNiArMjYsMTAgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC02MSw2ICs2NSw3IEBACiAgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IDI7CiAgICAgICAgIHQtPmVuYWJsZWQgPSAwOwogICAgICAgICB0LT5mb3JtYXQgPSAxNjsKKyAgICAgICAgdC0+Y2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgICAgIHQtPmJ1ZmZlci5yYXcgPSAwOwogICAgICAgICB0LT5idWZmZXJQcm92aWRlciA9IDA7CiAgICAgICAgIHQtPmhvb2sgPSAwOwpAQCAtMTgwLDEzICsxODUsMTggQEAKIAogICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgY2FzZSBUUkFDSzoKLSAgICAgICAgaWYgKG5hbWUgPT0gQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgaWYgKCh1aW50MzJfdCh2YWx1ZUludCkgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKHZhbHVlSW50KSkgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgIT0gdmFsdWVJbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9DT1VOVCwgJWQpIiwgdmFsdWVJbnQpOworICAgICAgICBpZiAobmFtZSA9PSBDSEFOTkVMX01BU0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAodWludDMyX3QpdmFsdWU7CisgICAgICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbE1hc2sgIT0gbWFzaykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQobWFzayk7CisgICAgICAgICAgICAgICAgaWYgKChjaGFubmVsQ291bnQgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbE1hc2sgPSBtYXNrOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCBtYXNrKTsKICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDE8PG1BY3RpdmVUcmFjayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggODg0MDhhNy4uNzVjOTE3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC02MSw3ICs2MSw3IEBACiAKICAgICAgICAgLy8gc2V0IFBhcmFtZXRlciBuYW1lcwogICAgICAgICAvLyBmb3IgdGFyZ2V0IFRSQUNLCi0gICAgICAgIENIQU5ORUxfQ09VTlQgICA9IDB4NDAwMCwKKyAgICAgICAgQ0hBTk5FTF9NQVNLICAgID0gMHg0MDAwLAogICAgICAgICBGT1JNQVQgICAgICAgICAgPSAweDQwMDEsCiAgICAgICAgIE1BSU5fQlVGRkVSICAgICA9IDB4NDAwMiwKICAgICAgICAgQVVYX0JVRkZFUiAgICAgID0gMHg0MDAzLApAQCAtMTUwLDYgKzE1MCw3IEBACiAgICAgICAgIHVpbnQ4X3QgICAgIGVuYWJsZWQgICAgICA6IDE7CiAgICAgICAgIHVpbnQ4X3QgICAgIHJlc2VydmVkMCAgICA6IDM7CiAgICAgICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgICAgY2hhbm5lbE1hc2s7CiAKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgICAgICAgICAgICAgYnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIG11dGFibGUgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIGJ1ZmZlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZWY4ZDk1Ny4uNDdjYTNhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTM2LDE1ICszNiw4IEBACiAKICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19wb2xpY3lfaGFsLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRoZSBzaW0gYnVpbGQgZG9lc24ndCBoYXZlIGdldHRpZAotCi0jaWZuZGVmIEhBVkVfR0VUVElECi0jIGRlZmluZSBnZXR0aWQgZ2V0cGlkCi0jZW5kaWYKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggZDliNWFkYS4uYjgzMDEyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fcG9saWN5X2hhbC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCmluZGV4IGY5ZmEzMGUuLmEzNzQ5Y2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaApAQCAtNDM4LDE4ICs0MzgsMjMgQEAKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBfX2RhdGFfY2IoaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKICAgICB7CiAgICAgICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKl9fdGhpcyA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UgKj4odXNlcik7CiAgICAgICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSkpOwotICAgICAgICBfX3RoaXMtPm1EYXRhQ2IobXNnX3R5cGUsIG1lbSwgX190aGlzLT5tQ2JVc2VyKTsKKyAgICAgICAgaWYgKGluZGV4ID49IG1lbS0+bU51bUJ1ZnMpIHsKKyAgICAgICAgICAgIExPR0UoIiVzOiBpbnZhbGlkIGJ1ZmZlciBpbmRleCAlZCwgbWF4IGFsbG93ZWQgaXMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgIGluZGV4LCBtZW0tPm1OdW1CdWZzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBfX3RoaXMtPm1EYXRhQ2IobXNnX3R5cGUsIG1lbS0+bUJ1ZmZlcnNbaW5kZXhdLCBfX3RoaXMtPm1DYlVzZXIpOwogICAgIH0KIAogICAgIHN0YXRpYyB2b2lkIF9fZGF0YV9jYl90aW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcikKICAgICB7CiAgICAgICAgIExPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKQEAgLTQ1OSwzOCArNDY0LDg1IEBACiAgICAgICAgIC8vIGRyb3AgYWxsIHJlZmVyZW5jZXMsIGl0IHdpbGwgYmUgZGVzdHJveWVkIChhcyB3ZWxsIGFzIHRoZSBlbmNsb3NlZAogICAgICAgICAvLyBNZW1vcnlIZWFwQmFzZS4KICAgICAgICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4oZGF0YS0+aGFuZGxlKSk7Ci0gICAgICAgIF9fdGhpcy0+bURhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ190eXBlLCBtZW0sIF9fdGhpcy0+bUNiVXNlcik7CisgICAgICAgIGlmIChpbmRleCA+PSBtZW0tPm1OdW1CdWZzKSB7CisgICAgICAgICAgICBMT0dFKCIlczogaW52YWxpZCBidWZmZXIgaW5kZXggJWQsIG1heCBhbGxvd2VkIGlzICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICBpbmRleCwgbWVtLT5tTnVtQnVmcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgX190aGlzLT5tRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgbXNnX3R5cGUsIG1lbS0+bUJ1ZmZlcnNbaW5kZXhdLCBfX3RoaXMtPm1DYlVzZXIpOwogICAgIH0KIAogICAgIC8vIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHRoYXQgY29tYmluZXMgYSBNZW1vcnlIZWFwQmFzZSBhbmQgYSBNZW1vcnlCYXNlCiAgICAgLy8gaW4gb25lLiAgU2luY2Ugd2UgdGVuZCB0byB1c2UgdGhlbSBpbiBhIG9uZS10by1vbmUgcmVsYXRpb25zaGlwLCB0aGlzIGlzCiAgICAgLy8gaGFuZHkuCiAKLSAgICBjbGFzcyBDYW1lcmFIZWFwTWVtb3J5IDogcHVibGljIE1lbW9yeUJhc2UgeworICAgIGNsYXNzIENhbWVyYUhlYXBNZW1vcnkgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgotICAgICAgICBDYW1lcmFIZWFwTWVtb3J5KHNpemVfdCBzaXplKSA6Ci0gICAgICAgICAgICBNZW1vcnlCYXNlKG5ldyBNZW1vcnlIZWFwQmFzZShzaXplKSwgMCwgc2l6ZSkKKyAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeShpbnQgZmQsIHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZmZXJzID0gMSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKGJ1Zl9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQnVmcyhudW1fYnVmZmVycykKICAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlLmRhdGEgPSBnZXRIZWFwKCktPmJhc2UoKTsKLSAgICAgICAgICAgIGhhbmRsZS5zaXplID0gc2l6ZTsKLSAgICAgICAgICAgIGhhbmRsZS5oYW5kbGUgPSB0aGlzOworICAgICAgICAgICAgbUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoZmQsIGJ1Zl9zaXplICogbnVtX2J1ZmZlcnMpOworICAgICAgICAgICAgY29tbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgfQogCisgICAgICAgIENhbWVyYUhlYXBNZW1vcnkoc2l6ZV90IGJ1Zl9zaXplLCB1aW50X3QgbnVtX2J1ZmZlcnMgPSAxKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUoYnVmX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1CdWZzKG51bV9idWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBtSGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShidWZfc2l6ZSAqIG51bV9idWZmZXJzKTsKKyAgICAgICAgICAgIGNvbW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNvbW1vbkluaXRpYWxpemF0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlLmRhdGEgPSBtSGVhcC0+YmFzZSgpOworICAgICAgICAgICAgaGFuZGxlLnNpemUgPSBtQnVmU2l6ZSAqIG1OdW1CdWZzOworICAgICAgICAgICAgaGFuZGxlLmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgICAgIG1CdWZmZXJzID0gbmV3IHNwPE1lbW9yeUJhc2U+W21OdW1CdWZzXTsKKyAgICAgICAgICAgIGZvciAodWludF90IGkgPSAwOyBpIDwgbU51bUJ1ZnM7IGkrKykKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXSA9IG5ldyBNZW1vcnlCYXNlKG1IZWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAqIG1CdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUpOworCisgICAgICAgICAgICBoYW5kbGUucmVsZWFzZSA9IF9fcHV0X21lbW9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNhbWVyYUhlYXBNZW1vcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgW10gbUJ1ZmZlcnM7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbUJ1ZlNpemU7CisgICAgICAgIHVpbnRfdCBtTnVtQnVmczsKKyAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IG1IZWFwOworICAgICAgICBzcDxNZW1vcnlCYXNlPiAqbUJ1ZmZlcnM7CisKICAgICAgICAgY2FtZXJhX21lbW9yeV90IGhhbmRsZTsKICAgICB9OwogCi0gICAgc3RhdGljIGNhbWVyYV9tZW1vcnlfdCogX19nZXRfbWVtb3J5KHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKKyAgICBzdGF0aWMgY2FtZXJhX21lbW9yeV90KiBfX2dldF9tZW1vcnkoaW50IGZkLCBzaXplX3QgYnVmX3NpemUsIHVpbnRfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKICAgICB7Ci0gICAgICAgIC8vIFdlIGFsbG9jYXRlIHRoZSBvYmplY3QgaGVyZSwgYnV0IHdlIGRvIG5vdCBhc3NpZ24gaXQgdG8gYSBzdHJvbmcKLSAgICAgICAgLy8gcG9pbnRlciB5ZXQuICBUaGUgSEFMIHdpbGwgcGFzcyBpdCBiYWNrIHRvIHVzIHZpYSB0aGUgZGF0YSBjYWxsYmFjawotICAgICAgICAvLyBvciB0aGUgZGF0YS10aW1lc3RhbXAgY2FsbGJhY2ssIGFuZCBmcm9tIHRoZXJlIG9uIHdlIHdpbGwgd3JhcCBpdAotICAgICAgICAvLyB3aXRoaW4gYSBzdHJvbmcgcG9pbnRlci4KLQotICAgICAgICBDYW1lcmFIZWFwTWVtb3J5ICptZW0gPSBuZXcgQ2FtZXJhSGVhcE1lbW9yeShzaXplKTsKKyAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeSAqbWVtOworICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgbWVtID0gbmV3IENhbWVyYUhlYXBNZW1vcnkoYnVmX3NpemUsIG51bV9idWZzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWVtID0gbmV3IENhbWVyYUhlYXBNZW1vcnkoZmQsIGJ1Zl9zaXplLCBudW1fYnVmcyk7CisgICAgICAgIG1lbS0+aW5jU3Ryb25nKG1lbSk7CiAgICAgICAgIHJldHVybiAmbWVtLT5oYW5kbGU7CiAgICAgfQogCisgICAgc3RhdGljIHZvaWQgX19wdXRfbWVtb3J5KGNhbWVyYV9tZW1vcnlfdCAqZGF0YSkKKyAgICB7CisgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDYW1lcmFIZWFwTWVtb3J5ICptZW0gPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSk7CisgICAgICAgIG1lbS0+ZGVjU3Ryb25nKG1lbSk7CisgICAgfQorCiAgICAgc3RhdGljIEFOYXRpdmVXaW5kb3cgKl9fdG9fYW53KHZvaWQgKnVzZXIpCiAgICAgewogICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqX190aGlzID0KQEAgLTUwMCw3ICs1NTIsNyBAQAogI2RlZmluZSBhbncobikgX190b19hbncoKChzdHJ1Y3QgY2FtZXJhX3ByZXZpZXdfd2luZG93ICopbiktPnVzZXIpCiAKICAgICBzdGF0aWMgaW50IF9fZGVxdWV1ZV9idWZmZXIoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKLSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlciwgaW50ICpzdHJpZGUpCiAgICAgewogICAgICAgICBpbnQgcmM7CiAgICAgICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBhbncodyk7CkBAIC01MDgsOCArNTYwLDEwIEBACiAgICAgICAgIHJjID0gYS0+ZGVxdWV1ZUJ1ZmZlcihhLCAmYW5iKTsKICAgICAgICAgaWYgKCFyYykgewogICAgICAgICAgICAgcmMgPSBhLT5sb2NrQnVmZmVyKGEsIGFuYik7Ci0gICAgICAgICAgICBpZiAoIXJjKQorICAgICAgICAgICAgaWYgKCFyYykgewogICAgICAgICAgICAgICAgICpidWZmZXIgPSAmYW5iLT5oYW5kbGU7CisgICAgICAgICAgICAgICAgKnN0cmlkZSA9IGFuYi0+c3RyaWRlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGEtPmNhbmNlbEJ1ZmZlcihhLCBhbmIpOwogICAgICAgICB9CkBAIC01NDEsNyArNTk1LDcgQEAKICAgICBzdGF0aWMgaW50IF9fc2V0X2J1ZmZlcl9jb3VudChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzKiB3LCBpbnQgY291bnQpCiAgICAgewogICAgICAgICBBTmF0aXZlV2luZG93ICphID0gYW53KHcpOwotCXJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoYSwgY291bnQpOworICAgICAgICByZXR1cm4gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGEsIGNvdW50KTsKICAgICB9CiAKICAgICBzdGF0aWMgaW50IF9fc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyogdywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMWU4YzMwYi4uYTAxMWFlMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTE0Nyw2ICsxNDcsMTQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgic3lzLnNlY3BvbGljeS5jYW1lcmEuZGlzYWJsZWQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpZiAoc3RyY21wKHZhbHVlLCAiMSIpID09IDApIHsKKyAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2FibGVkIGJ5IERldmljZVBvbGljeU1hbmFnZXIuCisgICAgICAgIExPR0koIkNhbWVyYSBpcyBkaXNhYmxlZC4gY29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIiwgY2FsbGluZ1BpZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgaWYgKG1DbGllbnRbY2FtZXJhSWRdICE9IDApIHsKICAgICAgICAgY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvRXZlbnRIdWIuY3BwIGIvc2VydmljZXMvaW5wdXQvRXZlbnRIdWIuY3BwCmluZGV4IGFmMzA4ODcuLjk1YjhhNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L0V2ZW50SHViLmNwcAorKysgYi9zZXJ2aWNlcy9pbnB1dC9FdmVudEh1Yi5jcHAKQEAgLTE0LDIwICsxNCw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vLwotLy8gSGFuZGxlIGV2ZW50cywgbGlrZSBrZXkgaW5wdXQgYW5kIHZzeW5jLgotLy8KLS8vIFRoZSBnb2FsIGlzIHRvIHByb3ZpZGUgYW4gb3B0aW1pemVkIHNvbHV0aW9uIGZvciBMaW51eCwgbm90IGFuCi0vLyBpbXBsZW1lbnRhdGlvbiB0aGF0IHdvcmtzIHdlbGwgYWNyb3NzIGFsbCBwbGF0Zm9ybXMuICBXZSBleHBlY3QKLS8vIGV2ZW50cyB0byBhcnJpdmUgb24gZmlsZSBkZXNjcmlwdG9ycywgc28gdGhhdCB3ZSBjYW4gdXNlIGEgc2VsZWN0KCkKLS8vIHNlbGVjdCgpIGNhbGwgdG8gc2xlZXAuCi0vLwotLy8gV2UgY2FuJ3Qgc2VsZWN0KCkgb24gYW55dGhpbmcgYnV0IG5ldHdvcmsgc29ja2V0cyBpbiBXaW5kb3dzLCBzbyB3ZQotLy8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB3YWl0RXZlbnQgZm9yIHRoYXQgcGxhdGZvcm0uCi0vLwogI2RlZmluZSBMT0dfVEFHICJFdmVudEh1YiIKIAotLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgIkV2ZW50SHViLmgiCiAKQEAgLTU0LDE0ICs0MywxMSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgotI2lmZGVmIEhBVkVfSU5PVElGWQotIyBpbmNsdWRlIDxzeXMvaW5vdGlmeS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0jIGluY2x1ZGUgPHN5cy9saW1pdHMuaD4gICAgICAgIC8qIG5vdCBwYXJ0IG9mIExpbnV4ICovCi0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvcG9sbC5oPgorCisjaW5jbHVkZSA8c3lzL2lub3RpZnkuaD4KKyNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbGltaXRzLmg+CiAKIC8qIHRoaXMgbWFjcm8gaXMgdXNlZCB0byB0ZWxsIGlmICJiaXQiIGlzIHNldCBpbiAiYXJyYXkiCiAgKiBpdCBzZWxlY3RzIGEgYnl0ZSBmcm9tIHRoZSBhcnJheSwgYW5kIGRvZXMgYSBib29sZWFuIEFORApAQCAtNzMsOSArNTksNiBAQAogLyogdGhpcyBtYWNybyBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byByZXByZXNlbnQgYSBiaXQgYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBzaXplICovCiAjZGVmaW5lIHNpemVvZl9iaXRfYXJyYXkoYml0cykgICgoYml0cyArIDcpIC8gOCkKIAotLy8gRmQgYXQgaW5kZXggMCBpcyBhbHdheXMgcmVzZXJ2ZWQgZm9yIGlub3RpZnkKLSNkZWZpbmUgRklSU1RfQUNUVUFMX0RFVklDRV9JTkRFWCAxCi0KICNkZWZpbmUgSU5ERU5UICIgICIKICNkZWZpbmUgSU5ERU5UMiAiICAgICIKICNkZWZpbmUgSU5ERU5UMyAiICAgICAgIgpAQCAtMTAxLDE1ICs4NCwxNyBAQAogICAgICAgICBjb25zdCBJbnB1dERldmljZUlkZW50aWZpZXImIGlkZW50aWZpZXIpIDoKICAgICAgICAgbmV4dChOVUxMKSwKICAgICAgICAgZmQoZmQpLCBpZChpZCksIHBhdGgocGF0aCksIGlkZW50aWZpZXIoaWRlbnRpZmllciksCi0gICAgICAgIGNsYXNzZXMoMCksIGtleUJpdG1hc2soTlVMTCksIHJlbEJpdG1hc2soTlVMTCksIHByb3BCaXRtYXNrKE5VTEwpLAotICAgICAgICBjb25maWd1cmF0aW9uKE5VTEwpLCB2aXJ0dWFsS2V5TWFwKE5VTEwpIHsKKyAgICAgICAgY2xhc3NlcygwKSwgY29uZmlndXJhdGlvbihOVUxMKSwgdmlydHVhbEtleU1hcChOVUxMKSB7CisgICAgbWVtc2V0KGtleUJpdG1hc2ssIDAsIHNpemVvZihrZXlCaXRtYXNrKSk7CisgICAgbWVtc2V0KGFic0JpdG1hc2ssIDAsIHNpemVvZihhYnNCaXRtYXNrKSk7CisgICAgbWVtc2V0KHJlbEJpdG1hc2ssIDAsIHNpemVvZihyZWxCaXRtYXNrKSk7CisgICAgbWVtc2V0KHN3Qml0bWFzaywgMCwgc2l6ZW9mKHN3Qml0bWFzaykpOworICAgIG1lbXNldChsZWRCaXRtYXNrLCAwLCBzaXplb2YobGVkQml0bWFzaykpOworICAgIG1lbXNldChwcm9wQml0bWFzaywgMCwgc2l6ZW9mKHByb3BCaXRtYXNrKSk7CiB9CiAKIEV2ZW50SHViOjpEZXZpY2U6On5EZXZpY2UoKSB7CiAgICAgY2xvc2UoKTsKLSAgICBkZWxldGVbXSBrZXlCaXRtYXNrOwotICAgIGRlbGV0ZVtdIHJlbEJpdG1hc2s7Ci0gICAgZGVsZXRlW10gcHJvcEJpdG1hc2s7CiAgICAgZGVsZXRlIGNvbmZpZ3VyYXRpb247CiAgICAgZGVsZXRlIHZpcnR1YWxLZXlNYXA7CiB9CkBAIC0xMjQsMjQgKzEwOSw3MiBAQAogCiAvLyAtLS0gRXZlbnRIdWIgLS0tCiAKK2NvbnN0IHVpbnQzMl90IEV2ZW50SHViOjpFUE9MTF9JRF9JTk9USUZZOworY29uc3QgdWludDMyX3QgRXZlbnRIdWI6OkVQT0xMX0lEX1dBS0U7Citjb25zdCBpbnQgRXZlbnRIdWI6OkVQT0xMX1NJWkVfSElOVDsKK2NvbnN0IGludCBFdmVudEh1Yjo6RVBPTExfTUFYX0VWRU5UUzsKKwogRXZlbnRIdWI6OkV2ZW50SHViKHZvaWQpIDoKLSAgICAgICAgbUVycm9yKE5PX0lOSVQpLCBtQnVpbHRJbktleWJvYXJkSWQoLTEpLCBtTmV4dERldmljZUlkKDEpLAorICAgICAgICBtQnVpbHRJbktleWJvYXJkSWQoLTEpLCBtTmV4dERldmljZUlkKDEpLAogICAgICAgICBtT3BlbmluZ0RldmljZXMoMCksIG1DbG9zaW5nRGV2aWNlcygwKSwKLSAgICAgICAgbU9wZW5lZChmYWxzZSksIG1OZWVkVG9TZW5kRmluaXNoZWREZXZpY2VTY2FuKGZhbHNlKSwKLSAgICAgICAgbUlucHV0RmRJbmRleCgxKSB7CisgICAgICAgIG1OZWVkVG9TZW5kRmluaXNoZWREZXZpY2VTY2FuKGZhbHNlKSwKKyAgICAgICAgbU5lZWRUb1Jlb3BlbkRldmljZXMoZmFsc2UpLCBtTmVlZFRvU2NhbkRldmljZXModHJ1ZSksCisgICAgICAgIG1QZW5kaW5nRXZlbnRDb3VudCgwKSwgbVBlbmRpbmdFdmVudEluZGV4KDApLCBtUGVuZGluZ0lOb3RpZnkoZmFsc2UpIHsKICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywgV0FLRV9MT0NLX0lEKTsKIAotICAgIG1lbXNldChtU3dpdGNoZXMsIDAsIHNpemVvZihtU3dpdGNoZXMpKTsKICAgICBtTnVtQ3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworCisgICAgbUVwb2xsRmQgPSBlcG9sbF9jcmVhdGUoRVBPTExfU0laRV9ISU5UKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1FcG9sbEZkIDwgMCwgIkNvdWxkIG5vdCBjcmVhdGUgZXBvbGwgaW5zdGFuY2UuICBlcnJubz0lZCIsIGVycm5vKTsKKworICAgIG1JTm90aWZ5RmQgPSBpbm90aWZ5X2luaXQoKTsKKyAgICBpbnQgcmVzdWx0ID0gaW5vdGlmeV9hZGRfd2F0Y2gobUlOb3RpZnlGZCwgREVWSUNFX1BBVEgsIElOX0RFTEVURSB8IElOX0NSRUFURSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgPCAwLCAiQ291bGQgbm90IHJlZ2lzdGVyIElOb3RpZnkgZm9yICVzLiAgZXJybm89JWQiLAorICAgICAgICAgICAgREVWSUNFX1BBVEgsIGVycm5vKTsKKworICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldmVudEl0ZW07CisgICAgbWVtc2V0KCZldmVudEl0ZW0sIDAsIHNpemVvZihldmVudEl0ZW0pKTsKKyAgICBldmVudEl0ZW0uZXZlbnRzID0gRVBPTExJTjsKKyAgICBldmVudEl0ZW0uZGF0YS51MzIgPSBFUE9MTF9JRF9JTk9USUZZOworICAgIHJlc3VsdCA9IGVwb2xsX2N0bChtRXBvbGxGZCwgRVBPTExfQ1RMX0FERCwgbUlOb3RpZnlGZCwgJmV2ZW50SXRlbSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBhZGQgSU5vdGlmeSB0byBlcG9sbCBpbnN0YW5jZS4gIGVycm5vPSVkIiwgZXJybm8pOworCisgICAgaW50IHdha2VGZHNbMl07CisgICAgcmVzdWx0ID0gcGlwZSh3YWtlRmRzKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IGNyZWF0ZSB3YWtlIHBpcGUuICBlcnJubz0lZCIsIGVycm5vKTsKKworICAgIG1XYWtlUmVhZFBpcGVGZCA9IHdha2VGZHNbMF07CisgICAgbVdha2VXcml0ZVBpcGVGZCA9IHdha2VGZHNbMV07CisKKyAgICByZXN1bHQgPSBmY250bChtV2FrZVJlYWRQaXBlRmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgbWFrZSB3YWtlIHJlYWQgcGlwZSBub24tYmxvY2tpbmcuICBlcnJubz0lZCIsCisgICAgICAgICAgICBlcnJubyk7CisKKyAgICByZXN1bHQgPSBmY250bChtV2FrZVdyaXRlUGlwZUZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IG1ha2Ugd2FrZSB3cml0ZSBwaXBlIG5vbi1ibG9ja2luZy4gIGVycm5vPSVkIiwKKyAgICAgICAgICAgIGVycm5vKTsKKworICAgIGV2ZW50SXRlbS5kYXRhLnUzMiA9IEVQT0xMX0lEX1dBS0U7CisgICAgcmVzdWx0ID0gZXBvbGxfY3RsKG1FcG9sbEZkLCBFUE9MTF9DVExfQURELCBtV2FrZVJlYWRQaXBlRmQsICZldmVudEl0ZW0pOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgYWRkIHdha2UgcmVhZCBwaXBlIHRvIGVwb2xsIGluc3RhbmNlLiAgZXJybm89JWQiLAorICAgICAgICAgICAgZXJybm8pOwogfQogCiBFdmVudEh1Yjo6fkV2ZW50SHViKHZvaWQpIHsKLSAgICByZWxlYXNlX3dha2VfbG9jayhXQUtFX0xPQ0tfSUQpOwotICAgIC8vIHdlIHNob3VsZCBmcmVlIHN0dWZmIGhlcmUuLi4KLX0KKyAgICBjbG9zZUFsbERldmljZXNMb2NrZWQoKTsKIAotc3RhdHVzX3QgRXZlbnRIdWI6OmVycm9yQ2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FcnJvcjsKKyAgICB3aGlsZSAobUNsb3NpbmdEZXZpY2VzKSB7CisgICAgICAgIERldmljZSogZGV2aWNlID0gbUNsb3NpbmdEZXZpY2VzOworICAgICAgICBtQ2xvc2luZ0RldmljZXMgPSBkZXZpY2UtPm5leHQ7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgfQorCisgICAgOjpjbG9zZShtRXBvbGxGZCk7CisgICAgOjpjbG9zZShtSU5vdGlmeUZkKTsKKyAgICA6OmNsb3NlKG1XYWtlUmVhZFBpcGVGZCk7CisgICAgOjpjbG9zZShtV2FrZVdyaXRlUGlwZUZkKTsKKworICAgIHJlbGVhc2Vfd2FrZV9sb2NrKFdBS0VfTE9DS19JRCk7CiB9CiAKIFN0cmluZzggRXZlbnRIdWI6OmdldERldmljZU5hbWUoaW50MzJfdCBkZXZpY2VJZCkgY29uc3QgewpAQCAtMTkwLDYgKzIyMyw3IEBACiAgICAgICAgIG91dEF4aXNJbmZvLT5tYXhWYWx1ZSA9IGluZm8ubWF4aW11bTsKICAgICAgICAgb3V0QXhpc0luZm8tPmZsYXQgPSBpbmZvLmZsYXQ7CiAgICAgICAgIG91dEF4aXNJbmZvLT5mdXp6ID0gaW5mby5mdXp6OworICAgICAgICBvdXRBeGlzSW5mby0+cmVzb2x1dGlvbiA9IGluZm8ucmVzb2x1dGlvbjsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzE0LDcgKzM0OCw3IEBACiAKIGJvb2wgRXZlbnRIdWI6Om1hcmtTdXBwb3J0ZWRLZXlDb2Rlc0xvY2tlZChEZXZpY2UqIGRldmljZSwgc2l6ZV90IG51bUNvZGVzLAogICAgICAgICBjb25zdCBpbnQzMl90KiBrZXlDb2RlcywgdWludDhfdCogb3V0RmxhZ3MpIGNvbnN0IHsKLSAgICBpZiAoIWRldmljZS0+a2V5TWFwLmhhdmVLZXlMYXlvdXQoKSB8fCAhZGV2aWNlLT5rZXlCaXRtYXNrKSB7CisgICAgaWYgKCFkZXZpY2UtPmtleU1hcC5oYXZlS2V5TGF5b3V0KCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzkzLDI0ICs0MjcsMTggQEAKICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiB9CiAKLXZvaWQgRXZlbnRIdWI6OmFkZEV4Y2x1ZGVkRGV2aWNlKGNvbnN0IGNoYXIqIGRldmljZU5hbWUpCi17Cit2b2lkIEV2ZW50SHViOjpzZXRFeGNsdWRlZERldmljZXMoY29uc3QgVmVjdG9yPFN0cmluZzg+JiBkZXZpY2VzKSB7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKIAotICAgIFN0cmluZzggbmFtZShkZXZpY2VOYW1lKTsKLSAgICBtRXhjbHVkZWREZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKKyAgICBtRXhjbHVkZWREZXZpY2VzID0gZGV2aWNlczsKIH0KIAogYm9vbCBFdmVudEh1Yjo6aGFzTGVkKGludDMyX3QgZGV2aWNlSWQsIGludDMyX3QgbGVkKSBjb25zdCB7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKICAgICBEZXZpY2UqIGRldmljZSA9IGdldERldmljZUxvY2tlZChkZXZpY2VJZCk7Ci0gICAgaWYgKGRldmljZSkgewotICAgICAgICB1aW50OF90IGJpdG1hc2tbc2l6ZW9mX2JpdF9hcnJheShMRURfTUFYICsgMSldOwotICAgICAgICBtZW1zZXQoYml0bWFzaywgMCwgc2l6ZW9mKGJpdG1hc2spKTsKLSAgICAgICAgaWYgKGlvY3RsKGRldmljZS0+ZmQsIEVWSU9DR0JJVChFVl9MRUQsIHNpemVvZihiaXRtYXNrKSksIGJpdG1hc2spID49IDApIHsKLSAgICAgICAgICAgIGlmICh0ZXN0X2JpdChsZWQsIGJpdG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgaWYgKGRldmljZSAmJiBsZWQgPj0gMCAmJiBsZWQgPD0gTEVEX01BWCkgeworICAgICAgICBpZiAodGVzdF9iaXQobGVkLCBkZXZpY2UtPmxlZEJpdG1hc2spKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC00MTksNyArNDQ3LDcgQEAKIHZvaWQgRXZlbnRIdWI6OnNldExlZFN0YXRlKGludDMyX3QgZGV2aWNlSWQsIGludDMyX3QgbGVkLCBib29sIG9uKSB7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKICAgICBEZXZpY2UqIGRldmljZSA9IGdldERldmljZUxvY2tlZChkZXZpY2VJZCk7Ci0gICAgaWYgKGRldmljZSkgeworICAgIGlmIChkZXZpY2UgJiYgbGVkID49IDAgJiYgbGVkIDw9IExFRF9NQVgpIHsKICAgICAgICAgc3RydWN0IGlucHV0X2V2ZW50IGV2OwogICAgICAgICBldi50aW1lLnR2X3NlYyA9IDA7CiAgICAgICAgIGV2LnRpbWUudHZfdXNlYyA9IDA7CkBAIC00NDksMTEgKzQ3NywxNCBAQAogICAgIGlmIChkZXZpY2VJZCA9PSAwKSB7CiAgICAgICAgIGRldmljZUlkID0gbUJ1aWx0SW5LZXlib2FyZElkOwogICAgIH0KKyAgICBzc2l6ZV90IGluZGV4ID0gbURldmljZXMuaW5kZXhPZktleShkZXZpY2VJZCk7CisgICAgcmV0dXJuIGluZGV4ID49IDAgPyBtRGV2aWNlcy52YWx1ZUF0KGluZGV4KSA6IE5VTEw7Cit9CiAKLSAgICBzaXplX3QgbnVtRGV2aWNlcyA9IG1EZXZpY2VzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gRklSU1RfQUNUVUFMX0RFVklDRV9JTkRFWDsgaSA8IG51bURldmljZXM7IGkrKykgewotICAgICAgICBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VzW2ldOwotICAgICAgICBpZiAoZGV2aWNlLT5pZCA9PSBkZXZpY2VJZCkgeworRXZlbnRIdWI6OkRldmljZSogRXZlbnRIdWI6OmdldERldmljZUJ5UGF0aExvY2tlZChjb25zdCBjaGFyKiBkZXZpY2VQYXRoKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXZpY2UtPnBhdGggPT0gZGV2aWNlUGF0aCkgewogICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ2MSwyMyArNDkyLDI5IEBACiB9CiAKIHNpemVfdCBFdmVudEh1Yjo6Z2V0RXZlbnRzKGludCB0aW1lb3V0TWlsbGlzLCBSYXdFdmVudCogYnVmZmVyLCBzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIC8vIE5vdGUgdGhhdCB3ZSBvbmx5IGFsbG93IG9uZSBjYWxsZXIgdG8gZ2V0RXZlbnRzKCksIHNvIGRvbid0IG5lZWQKLSAgICAvLyB0byBkbyBsb2NraW5nIGhlcmUuLi4gIG9ubHkgd2hlbiBhZGRpbmcvcmVtb3ZpbmcgZGV2aWNlcy4KICAgICBMT0dfQVNTRVJUKGJ1ZmZlclNpemUgPj0gMSk7CiAKLSAgICBpZiAoIW1PcGVuZWQpIHsKLSAgICAgICAgbUVycm9yID0gb3BlblBsYXRmb3JtSW5wdXQoKSA/IE5PX0VSUk9SIDogVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgbU9wZW5lZCA9IHRydWU7Ci0gICAgICAgIG1OZWVkVG9TZW5kRmluaXNoZWREZXZpY2VTY2FuID0gdHJ1ZTsKLSAgICB9CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKIAogICAgIHN0cnVjdCBpbnB1dF9ldmVudCByZWFkQnVmZmVyW2J1ZmZlclNpemVdOwogCiAgICAgUmF3RXZlbnQqIGV2ZW50ID0gYnVmZmVyOwogICAgIHNpemVfdCBjYXBhY2l0eSA9IGJ1ZmZlclNpemU7CisgICAgYm9vbCBhd29rZW4gPSBmYWxzZTsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogCisgICAgICAgIC8vIFJlb3BlbiBpbnB1dCBkZXZpY2VzIGlmIG5lZWRlZC4KKyAgICAgICAgaWYgKG1OZWVkVG9SZW9wZW5EZXZpY2VzKSB7CisgICAgICAgICAgICBtTmVlZFRvUmVvcGVuRGV2aWNlcyA9IGZhbHNlOworCisgICAgICAgICAgICBMT0dJKCJSZW9wZW5pbmcgYWxsIGlucHV0IGRldmljZXMgZHVlIHRvIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UuIik7CisKKyAgICAgICAgICAgIGNsb3NlQWxsRGV2aWNlc0xvY2tlZCgpOworICAgICAgICAgICAgbU5lZWRUb1NjYW5EZXZpY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOyAvLyByZXR1cm4gdG8gdGhlIGNhbGxlciBiZWZvcmUgd2UgYWN0dWFsbHkgcmVzY2FuCisgICAgICAgIH0KKwogICAgICAgICAvLyBSZXBvcnQgYW55IGRldmljZXMgdGhhdCBoYWQgbGFzdCBiZWVuIGFkZGVkL3JlbW92ZWQuCiAgICAgICAgIHdoaWxlIChtQ2xvc2luZ0RldmljZXMpIHsKICAgICAgICAgICAgIERldmljZSogZGV2aWNlID0gbUNsb3NpbmdEZXZpY2VzOwpAQCAtNDk1LDYgKzUzMiwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1OZWVkVG9TY2FuRGV2aWNlcykgeworICAgICAgICAgICAgbU5lZWRUb1NjYW5EZXZpY2VzID0gZmFsc2U7CisgICAgICAgICAgICBzY2FuRGV2aWNlc0xvY2tlZCgpOworICAgICAgICAgICAgbU5lZWRUb1NlbmRGaW5pc2hlZERldmljZVNjYW4gPSB0cnVlOworICAgICAgICB9CisKICAgICAgICAgd2hpbGUgKG1PcGVuaW5nRGV2aWNlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBEZXZpY2UqIGRldmljZSA9IG1PcGVuaW5nRGV2aWNlczsKICAgICAgICAgICAgIExPR1YoIlJlcG9ydGluZyBkZXZpY2Ugb3BlbmVkOiBpZD0lZCwgbmFtZT0lc1xuIiwKQEAgLTUyMSwyNyArNTY0LDU2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBHcmFiIHRoZSBuZXh0IGlucHV0IGV2ZW50LgotICAgICAgICAvLyBtSW5wdXRGZEluZGV4IGlzIGluaXRpYWxseSAxIGJlY2F1c2UgaW5kZXggMCBpcyB1c2VkIGZvciBpbm90aWZ5LgotICAgICAgICBib29sIGRldmljZVdhc1JlbW92ZWQgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKG1JbnB1dEZkSW5kZXggPCBtRmRzLnNpemUoKSkgewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBvbGxmZCYgcGZkID0gbUZkc1ttSW5wdXRGZEluZGV4XTsKLSAgICAgICAgICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExJTikgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVhZFNpemUgPSByZWFkKHBmZC5mZCwgcmVhZEJ1ZmZlciwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkgKiBjYXBhY2l0eSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRTaXplIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5PREVWKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VXYXNSZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2wgZGV2aWNlQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAobVBlbmRpbmdFdmVudEluZGV4IDwgbVBlbmRpbmdFdmVudENvdW50KSB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZXBvbGxfZXZlbnQmIGV2ZW50SXRlbSA9IG1QZW5kaW5nRXZlbnRJdGVtc1ttUGVuZGluZ0V2ZW50SW5kZXgrK107CisgICAgICAgICAgICBpZiAoZXZlbnRJdGVtLmRhdGEudTMyID09IEVQT0xMX0lEX0lOT1RJRlkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRJdGVtLmV2ZW50cyAmIEVQT0xMSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdJTm90aWZ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGVwb2xsIGV2ZW50IDB4JTA4eCBmb3IgSU5vdGlmeS4iLCBldmVudEl0ZW0uZXZlbnRzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChldmVudEl0ZW0uZGF0YS51MzIgPT0gRVBPTExfSURfV0FLRSkgeworICAgICAgICAgICAgICAgIGlmIChldmVudEl0ZW0uZXZlbnRzICYgRVBPTExJTikgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJhd29rZW4gYWZ0ZXIgd2FrZSgpIik7CisgICAgICAgICAgICAgICAgICAgIGF3b2tlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzE2XTsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBuUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgblJlYWQgPSByZWFkKG1XYWtlUmVhZFBpcGVGZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChuUmVhZCA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikgfHwgblJlYWQgPT0gc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coIlJlY2VpdmVkIHVuZXhwZWN0ZWQgZXBvbGwgZXZlbnQgMHglMDh4IGZvciB3YWtlIHJlYWQgcGlwZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SXRlbS5ldmVudHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3NpemVfdCBkZXZpY2VJbmRleCA9IG1EZXZpY2VzLmluZGV4T2ZLZXkoZXZlbnRJdGVtLmRhdGEudTMyKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJSZWNlaXZlZCB1bmV4cGVjdGVkIGVwb2xsIGV2ZW50IDB4JTA4eCBmb3IgdW5rbm93biBkZXZpY2UgaWQgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SXRlbS5ldmVudHMsIGV2ZW50SXRlbS5kYXRhLnUzMik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIERldmljZSogZGV2aWNlID0gbURldmljZXMudmFsdWVBdChkZXZpY2VJbmRleCk7CisgICAgICAgICAgICBpZiAoZXZlbnRJdGVtLmV2ZW50cyAmIEVQT0xMSU4pIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlYWRTaXplID0gcmVhZChkZXZpY2UtPmZkLCByZWFkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkgKiBjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRTaXplID09IDAgfHwgKHJlYWRTaXplIDwgMCAmJiBlcnJubyA9PSBFTk9ERVYpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERldmljZSB3YXMgcmVtb3ZlZCBiZWZvcmUgSU5vdGlmeSBub3RpY2VkLgorICAgICAgICAgICAgICAgICAgICBkZXZpY2VDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VEZXZpY2VMb2NrZWQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRTaXplIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVJTlRSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJjb3VsZCBub3QgZ2V0IGV2ZW50IChlcnJubz0lZCkiLCBlcnJubyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChyZWFkU2l6ZSAlIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoImNvdWxkIG5vdCBnZXQgZXZlbnQgKHdyb25nIHNpemU6ICVkKSIsIHJlYWRTaXplKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlYWRTaXplID09IDApIHsgLy8gZW9mCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVdhc1JlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VzW21JbnB1dEZkSW5kZXhdOwogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUlkID0gZGV2aWNlLT5pZCA9PSBtQnVpbHRJbktleWJvYXJkSWQgPyAwIDogZGV2aWNlLT5pZDsKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBzaXplX3QocmVhZFNpemUpIC8gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCk7CkBAIC01ODYsMzggKzY1OCwzOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5IC09IGNvdW50OwogICAgICAgICAgICAgICAgICAgICBpZiAoY2FwYWNpdHkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlc3VsdCBidWZmZXIgaXMgZnVsbC4gIFJlc2V0IHRoZSBwZW5kaW5nIGV2ZW50IGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSB3aWxsIHRyeSB0byByZWFkIHRoZSBkZXZpY2UgYWdhaW4gb24gdGhlIG5leHQgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdFdmVudEluZGV4IC09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HVygiUmVjZWl2ZWQgdW5leHBlY3RlZCBlcG9sbCBldmVudCAweCUwOHggZm9yIGRldmljZSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJdGVtLmV2ZW50cywgZGV2aWNlLT5pZGVudGlmaWVyLm5hbWUuc3RyaW5nKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlucHV0RmRJbmRleCArPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgYnV0IElOb3RpZnkgaGFzIG5vdCB5ZXQgbm90aWNlZC4KLSAgICAgICAgaWYgKGRldmljZVdhc1JlbW92ZWQpIHsKLSAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgICAgICBjbG9zZURldmljZUF0SW5kZXhMb2NrZWQobUlucHV0RmRJbmRleCk7Ci0gICAgICAgICAgICBjb250aW51ZTsgLy8gcmVwb3J0IGFkZGVkIG9yIHJlbW92ZWQgZGV2aWNlcyBpbW1lZGlhdGVseQorICAgICAgICAvLyByZWFkTm90aWZ5KCkgd2lsbCBtb2RpZnkgdGhlIGxpc3Qgb2YgZGV2aWNlcyBzbyB0aGlzIG11c3QgYmUgZG9uZSBhZnRlcgorICAgICAgICAvLyBwcm9jZXNzaW5nIGFsbCBvdGhlciBldmVudHMgdG8gZW5zdXJlIHRoYXQgd2UgcmVhZCBhbGwgcmVtYWluaW5nIGV2ZW50cworICAgICAgICAvLyBiZWZvcmUgY2xvc2luZyB0aGUgZGV2aWNlcy4KKyAgICAgICAgaWYgKG1QZW5kaW5nSU5vdGlmeSAmJiBtUGVuZGluZ0V2ZW50SW5kZXggPj0gbVBlbmRpbmdFdmVudENvdW50KSB7CisgICAgICAgICAgICBtUGVuZGluZ0lOb3RpZnkgPSBmYWxzZTsKKyAgICAgICAgICAgIHJlYWROb3RpZnlMb2NrZWQoKTsKKyAgICAgICAgICAgIGRldmljZUNoYW5nZWQgPSB0cnVlOwogICAgICAgICB9CiAKLSNpZiBIQVZFX0lOT1RJRlkKLSAgICAgICAgLy8gcmVhZE5vdGlmeSgpIHdpbGwgbW9kaWZ5IG1GRHMgYW5kIG1GRENvdW50LCBzbyB0aGlzIG11c3QgYmUgZG9uZSBhZnRlcgotICAgICAgICAvLyBwcm9jZXNzaW5nIGFsbCBvdGhlciBldmVudHMuCi0gICAgICAgIGlmKG1GZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgewotICAgICAgICAgICAgcmVhZE5vdGlmeShtRmRzWzBdLmZkKTsKLSAgICAgICAgICAgIG1GZHMuZWRpdEl0ZW1BdCgwKS5yZXZlbnRzID0gMDsKLSAgICAgICAgICAgIG1JbnB1dEZkSW5kZXggPSBtRmRzLnNpemUoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOyAvLyByZXBvcnQgYWRkZWQgb3IgcmVtb3ZlZCBkZXZpY2VzIGltbWVkaWF0ZWx5CisgICAgICAgIC8vIFJlcG9ydCBhZGRlZCBvciByZW1vdmVkIGRldmljZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIGlmIChkZXZpY2VDaGFuZ2VkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotI2VuZGlmCiAKLSAgICAgICAgLy8gUmV0dXJuIG5vdyBpZiB3ZSBoYXZlIGNvbGxlY3RlZCBhbnkgZXZlbnRzLCBvdGhlcndpc2UgcG9sbC4KLSAgICAgICAgaWYgKGV2ZW50ICE9IGJ1ZmZlcikgeworICAgICAgICAvLyBSZXR1cm4gbm93IGlmIHdlIGhhdmUgY29sbGVjdGVkIGFueSBldmVudHMgb3IgaWYgd2Ugd2VyZSBleHBsaWNpdGx5IGF3b2tlbi4KKyAgICAgICAgaWYgKGV2ZW50ICE9IGJ1ZmZlciB8fCBhd29rZW4pIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUG9sbCBmb3IgZXZlbnRzLiAgTWluZCB0aGUgd2FrZSBsb2NrIGRhbmNlIQotICAgICAgICAvLyBXZSBob2xkIGEgd2FrZSBsb2NrIGF0IGFsbCB0aW1lcyBleGNlcHQgZHVyaW5nIHBvbGwoKS4gIFRoaXMgd29ya3MgZHVlIHRvIHNvbWUKKyAgICAgICAgLy8gV2UgaG9sZCBhIHdha2UgbG9jayBhdCBhbGwgdGltZXMgZXhjZXB0IGR1cmluZyBlcG9sbF93YWl0KCkuICBUaGlzIHdvcmtzIGR1ZSB0byBzb21lCiAgICAgICAgIC8vIHN1YnRsZSBjaG9yZW9ncmFwaHkuICBXaGVuIGEgZGV2aWNlIGRyaXZlciBoYXMgcGVuZGluZyAodW5yZWFkKSBldmVudHMsIGl0IGFjcXVpcmVzCiAgICAgICAgIC8vIGEga2VybmVsIHdha2UgbG9jay4gIEhvd2V2ZXIsIG9uY2UgdGhlIGxhc3QgcGVuZGluZyBldmVudCBoYXMgYmVlbiByZWFkLCB0aGUgZGV2aWNlCiAgICAgICAgIC8vIGRyaXZlciB3aWxsIHJlbGVhc2UgdGhlIGtlcm5lbCB3YWtlIGxvY2suICBUbyBwcmV2ZW50IHRoZSBzeXN0ZW0gZnJvbSBnb2luZyB0byBzbGVlcApAQCAtNjI3LDE2ICs3MDAsMjYgQEAKICAgICAgICAgLy8KICAgICAgICAgLy8gVGhlIHRpbWVvdXQgaXMgYWR2aXNvcnkgb25seS4gIElmIHRoZSBkZXZpY2UgaXMgYXNsZWVwLCBpdCB3aWxsIG5vdCB3YWtlIGp1c3QgdG8KICAgICAgICAgLy8gc2VydmljZSB0aGUgdGltZW91dC4KKyAgICAgICAgbVBlbmRpbmdFdmVudEluZGV4ID0gMDsKKworICAgICAgICBtTG9jay51bmxvY2soKTsgLy8gcmVsZWFzZSBsb2NrIGJlZm9yZSBwb2xsLCBtdXN0IGJlIGJlZm9yZSByZWxlYXNlX3dha2VfbG9jawogICAgICAgICByZWxlYXNlX3dha2VfbG9jayhXQUtFX0xPQ0tfSUQpOwogCi0gICAgICAgIGludCBwb2xsUmVzdWx0ID0gcG9sbChtRmRzLmVkaXRBcnJheSgpLCBtRmRzLnNpemUoKSwgdGltZW91dE1pbGxpcyk7CisgICAgICAgIGludCBwb2xsUmVzdWx0ID0gZXBvbGxfd2FpdChtRXBvbGxGZCwgbVBlbmRpbmdFdmVudEl0ZW1zLCBFUE9MTF9NQVhfRVZFTlRTLCB0aW1lb3V0TWlsbGlzKTsKIAogICAgICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywgV0FLRV9MT0NLX0lEKTsKKyAgICAgICAgbUxvY2subG9jaygpOyAvLyByZWFjcXVpcmUgbG9jayBhZnRlciBwb2xsLCBtdXN0IGJlIGFmdGVyIGFjcXVpcmVfd2FrZV9sb2NrCiAKICAgICAgICAgaWYgKHBvbGxSZXN1bHQgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7IC8vIHRpbWVkIG91dAorICAgICAgICAgICAgLy8gVGltZWQgb3V0LgorICAgICAgICAgICAgbVBlbmRpbmdFdmVudENvdW50ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKICAgICAgICAgaWYgKHBvbGxSZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZC4KKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRDb3VudCA9IDA7CisKICAgICAgICAgICAgIC8vIFNsZWVwIGFmdGVyIGVycm9ycyB0byBhdm9pZCBsb2NraW5nIHVwIHRoZSBzeXN0ZW0uCiAgICAgICAgICAgICAvLyBIb3BlZnVsbHkgdGhlIGVycm9yIGlzIHRyYW5zaWVudC4KICAgICAgICAgICAgIGlmIChlcnJubyAhPSBFSU5UUikgewpAQCAtNjQ0LDYgKzcyNyw5IEBACiAgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTb21lIGV2ZW50cyBvY2N1cnJlZC4KKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRDb3VudCA9IHNpemVfdChwb2xsUmVzdWx0KTsKKwogICAgICAgICAgICAgLy8gT24gYW4gU01QIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBmcmFtZXdvcmsgdG8gcmVhZCBpbnB1dCBldmVudHMKICAgICAgICAgICAgIC8vIGZhc3RlciB0aGFuIHRoZSBrZXJuZWwgaW5wdXQgZGV2aWNlIGRyaXZlciBjYW4gcHJvZHVjZSBhIGNvbXBsZXRlIHBhY2tldC4KICAgICAgICAgICAgIC8vIEJlY2F1c2UgcG9sbCgpIHdha2VzIHVwIGFzIHNvb24gYXMgdGhlIGZpcnN0IGlucHV0IGV2ZW50IGJlY29tZXMgYXZhaWxhYmxlLApAQCAtNjU3LDUyICs3NDMsMzAgQEAKICAgICAgICAgICAgICAgICB1c2xlZXAoMjUwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIC8vIFByZXBhcmUgdG8gcHJvY2VzcyBhbGwgb2YgdGhlIEZEcyB3ZSBqdXN0IHBvbGxlZC4KLSAgICAgICAgbUlucHV0RmRJbmRleCA9IDE7CiAgICAgfQogCiAgICAgLy8gQWxsIGRvbmUsIHJldHVybiB0aGUgbnVtYmVyIG9mIGV2ZW50cyB3ZSByZWFkLgogICAgIHJldHVybiBldmVudCAtIGJ1ZmZlcjsKIH0KIAotLyoKLSAqIE9wZW4gdGhlIHBsYXRmb3JtLXNwZWNpZmljIGlucHV0IGRldmljZS4KLSAqLwotYm9vbCBFdmVudEh1Yjo6b3BlblBsYXRmb3JtSW5wdXQodm9pZCkgewotICAgIC8qCi0gICAgICogT3BlbiBwbGF0Zm9ybS1zcGVjaWZpYyBpbnB1dCBkZXZpY2UocykuCi0gICAgICovCi0gICAgaW50IHJlcywgZmQ7Cit2b2lkIEV2ZW50SHViOjp3YWtlKCkgeworICAgIExPR1YoIndha2UoKSBjYWxsZWQiKTsKIAotI2lmZGVmIEhBVkVfSU5PVElGWQotICAgIGZkID0gaW5vdGlmeV9pbml0KCk7Ci0gICAgcmVzID0gaW5vdGlmeV9hZGRfd2F0Y2goZmQsIERFVklDRV9QQVRILCBJTl9ERUxFVEUgfCBJTl9DUkVBVEUpOwotICAgIGlmKHJlcyA8IDApIHsKLSAgICAgICAgTE9HRSgiY291bGQgbm90IGFkZCB3YXRjaCBmb3IgJXMsICVzXG4iLCBERVZJQ0VfUEFUSCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBzc2l6ZV90IG5Xcml0ZTsKKyAgICBkbyB7CisgICAgICAgIG5Xcml0ZSA9IHdyaXRlKG1XYWtlV3JpdGVQaXBlRmQsICJXIiwgMSk7CisgICAgfSB3aGlsZSAobldyaXRlID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICAgIGlmIChuV3JpdGUgIT0gMSAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKyAgICAgICAgTE9HVygiQ291bGQgbm90IHdyaXRlIHdha2Ugc2lnbmFsLCBlcnJubz0lZCIsIGVycm5vKTsKICAgICB9Ci0jZWxzZQotICAgIC8qCi0gICAgICogVGhlIGNvZGUgaW4gRXZlbnRIdWI6OmdldEV2ZW50IGFzc3VtZXMgdGhhdCBtRkRzWzBdIGlzIGFuIGlub3RpZnkgZmQuCi0gICAgICogV2UgYWxsb2NhdGUgc3BhY2UgZm9yIGl0IGFuZCBzZXQgaXQgdG8gc29tZXRoaW5nIGludmFsaWQuCi0gICAgICovCi0gICAgZmQgPSAtMTsKLSNlbmRpZgorfQogCi0gICAgLy8gUmVzZXJ2ZSBmZCBpbmRleCAwIGZvciBpbm90aWZ5LgotICAgIHN0cnVjdCBwb2xsZmQgcG9sbGZkOwotICAgIHBvbGxmZC5mZCA9IGZkOwotICAgIHBvbGxmZC5ldmVudHMgPSBQT0xMSU47Ci0gICAgcG9sbGZkLnJldmVudHMgPSAwOwotICAgIG1GZHMucHVzaChwb2xsZmQpOwotICAgIG1EZXZpY2VzLnB1c2goTlVMTCk7Ci0KLSAgICByZXMgPSBzY2FuRGlyKERFVklDRV9QQVRIKTsKK3ZvaWQgRXZlbnRIdWI6OnNjYW5EZXZpY2VzTG9ja2VkKCkgeworICAgIHN0YXR1c190IHJlcyA9IHNjYW5EaXJMb2NrZWQoREVWSUNFX1BBVEgpOwogICAgIGlmKHJlcyA8IDApIHsKICAgICAgICAgTE9HRSgic2NhbiBkaXIgZmFpbGVkIGZvciAlc1xuIiwgREVWSUNFX1BBVEgpOwogICAgIH0KLQotICAgIHJldHVybiB0cnVlOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MzEsMTMgKzc5NSwxMSBAQAogICAgICAgICBBS0VZQ09ERV9CVVRUT05fMTMsIEFLRVlDT0RFX0JVVFRPTl8xNCwgQUtFWUNPREVfQlVUVE9OXzE1LCBBS0VZQ09ERV9CVVRUT05fMTYsCiB9OwogCi1pbnQgRXZlbnRIdWI6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlUGF0aCkgeworc3RhdHVzX3QgRXZlbnRIdWI6Om9wZW5EZXZpY2VMb2NrZWQoY29uc3QgY2hhciAqZGV2aWNlUGF0aCkgewogICAgIGNoYXIgYnVmZmVyWzgwXTsKIAogICAgIExPR1YoIk9wZW5pbmcgZGV2aWNlOiAlcyIsIGRldmljZVBhdGgpOwogCi0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQogICAgIGludCBmZCA9IG9wZW4oZGV2aWNlUGF0aCwgT19SRFdSKTsKICAgICBpZihmZCA8IDApIHsKICAgICAgICAgTE9HRSgiY291bGQgbm90IG9wZW4gJXMsICVzXG4iLCBkZXZpY2VQYXRoLCBzdHJlcnJvcihlcnJubykpOwpAQCAtNzU1LDEyICs4MTcsMTAgQEAKICAgICB9CiAKICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGRldmljZSBpcyBvbiBvdXIgZXhjbHVkZWQgbGlzdAotICAgIExpc3Q8U3RyaW5nOD46Oml0ZXJhdG9yIGl0ZXIgPSBtRXhjbHVkZWREZXZpY2VzLmJlZ2luKCk7Ci0gICAgTGlzdDxTdHJpbmc4Pjo6aXRlcmF0b3IgZW5kID0gbUV4Y2x1ZGVkRGV2aWNlcy5lbmQoKTsKLSAgICBmb3IgKCA7IGl0ZXIgIT0gZW5kOyBpdGVyKyspIHsKLSAgICAgICAgY29uc3QgY2hhciogdGVzdCA9ICppdGVyOwotICAgICAgICBpZiAoaWRlbnRpZmllci5uYW1lID09IHRlc3QpIHsKLSAgICAgICAgICAgIExPR0koImlnbm9yaW5nIGV2ZW50IGlkICVzIGRyaXZlciAlc1xuIiwgZGV2aWNlUGF0aCwgdGVzdCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRXhjbHVkZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzgmIGl0ZW0gPSBtRXhjbHVkZWREZXZpY2VzLml0ZW1BdChpKTsKKyAgICAgICAgaWYgKGlkZW50aWZpZXIubmFtZSA9PSBpdGVtKSB7CisgICAgICAgICAgICBMT0dJKCJpZ25vcmluZyBldmVudCBpZCAlcyBkcml2ZXIgJXNcbiIsIGRldmljZVBhdGgsIGl0ZW0uc3RyaW5nKCkpOwogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC04MjgsNzcgKzg4OCw1MCBAQAogI2VuZGlmCiAKICAgICAvLyBMb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBkZXZpY2UuCi0gICAgbG9hZENvbmZpZ3VyYXRpb24oZGV2aWNlKTsKKyAgICBsb2FkQ29uZmlndXJhdGlvbkxvY2tlZChkZXZpY2UpOwogCiAgICAgLy8gRmlndXJlIG91dCB0aGUga2luZHMgb2YgZXZlbnRzIHRoZSBkZXZpY2UgcmVwb3J0cy4KLSAgICB1aW50OF90IGtleV9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoS0VZX01BWCArIDEpXTsKLSAgICBtZW1zZXQoa2V5X2JpdG1hc2ssIDAsIHNpemVvZihrZXlfYml0bWFzaykpOwotICAgIGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfS0VZLCBzaXplb2Yoa2V5X2JpdG1hc2spKSwga2V5X2JpdG1hc2spOwotCi0gICAgdWludDhfdCBhYnNfYml0bWFza1tzaXplb2ZfYml0X2FycmF5KEFCU19NQVggKyAxKV07Ci0gICAgbWVtc2V0KGFic19iaXRtYXNrLCAwLCBzaXplb2YoYWJzX2JpdG1hc2spKTsKLSAgICBpb2N0bChmZCwgRVZJT0NHQklUKEVWX0FCUywgc2l6ZW9mKGFic19iaXRtYXNrKSksIGFic19iaXRtYXNrKTsKLQotICAgIHVpbnQ4X3QgcmVsX2JpdG1hc2tbc2l6ZW9mX2JpdF9hcnJheShSRUxfTUFYICsgMSldOwotICAgIG1lbXNldChyZWxfYml0bWFzaywgMCwgc2l6ZW9mKHJlbF9iaXRtYXNrKSk7Ci0gICAgaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9SRUwsIHNpemVvZihyZWxfYml0bWFzaykpLCByZWxfYml0bWFzayk7Ci0KLSAgICB1aW50OF90IHN3X2JpdG1hc2tbc2l6ZW9mX2JpdF9hcnJheShTV19NQVggKyAxKV07Ci0gICAgbWVtc2V0KHN3X2JpdG1hc2ssIDAsIHNpemVvZihzd19iaXRtYXNrKSk7Ci0gICAgaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9TVywgc2l6ZW9mKHN3X2JpdG1hc2spKSwgc3dfYml0bWFzayk7Ci0KLSAgICB1aW50OF90IHByb3BfYml0bWFza1tzaXplb2ZfYml0X2FycmF5KElOUFVUX1BST1BfTUFYICsgMSldOwotICAgIG1lbXNldChwcm9wX2JpdG1hc2ssIDAsIHNpemVvZihwcm9wX2JpdG1hc2spKTsKLSAgICBpb2N0bChmZCwgRVZJT0NHUFJPUChzaXplb2YocHJvcF9iaXRtYXNrKSksIHByb3BfYml0bWFzayk7Ci0KLSAgICBkZXZpY2UtPmtleUJpdG1hc2sgPSBuZXcgdWludDhfdFtzaXplb2Yoa2V5X2JpdG1hc2spXTsKLSAgICBkZXZpY2UtPnJlbEJpdG1hc2sgPSBuZXcgdWludDhfdFtzaXplb2YocmVsX2JpdG1hc2spXTsKLSAgICBkZXZpY2UtPnByb3BCaXRtYXNrID0gbmV3IHVpbnQ4X3Rbc2l6ZW9mKHByb3BfYml0bWFzayldOwotCi0gICAgaWYgKCFkZXZpY2UtPmtleUJpdG1hc2sgfHwgIWRldmljZS0+cmVsQml0bWFzayB8fCAhZGV2aWNlLT5wcm9wQml0bWFzaykgewotICAgICAgICBkZWxldGUgZGV2aWNlOwotICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgYml0bWFza3MiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1lbWNweShkZXZpY2UtPmtleUJpdG1hc2ssIGtleV9iaXRtYXNrLCBzaXplb2Yoa2V5X2JpdG1hc2spKTsKLSAgICBtZW1jcHkoZGV2aWNlLT5yZWxCaXRtYXNrLCByZWxfYml0bWFzaywgc2l6ZW9mKHJlbF9iaXRtYXNrKSk7Ci0gICAgbWVtY3B5KGRldmljZS0+cHJvcEJpdG1hc2ssIHByb3BfYml0bWFzaywgc2l6ZW9mKHByb3BfYml0bWFzaykpOworICAgIGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfS0VZLCBzaXplb2YoZGV2aWNlLT5rZXlCaXRtYXNrKSksIGRldmljZS0+a2V5Qml0bWFzayk7CisgICAgaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9BQlMsIHNpemVvZihkZXZpY2UtPmFic0JpdG1hc2spKSwgZGV2aWNlLT5hYnNCaXRtYXNrKTsKKyAgICBpb2N0bChmZCwgRVZJT0NHQklUKEVWX1JFTCwgc2l6ZW9mKGRldmljZS0+cmVsQml0bWFzaykpLCBkZXZpY2UtPnJlbEJpdG1hc2spOworICAgIGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfU1csIHNpemVvZihkZXZpY2UtPnN3Qml0bWFzaykpLCBkZXZpY2UtPnN3Qml0bWFzayk7CisgICAgaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9MRUQsIHNpemVvZihkZXZpY2UtPmxlZEJpdG1hc2spKSwgZGV2aWNlLT5sZWRCaXRtYXNrKTsKKyAgICBpb2N0bChmZCwgRVZJT0NHUFJPUChzaXplb2YoZGV2aWNlLT5wcm9wQml0bWFzaykpLCBkZXZpY2UtPnByb3BCaXRtYXNrKTsKIAogICAgIC8vIFNlZSBpZiB0aGlzIGlzIGEga2V5Ym9hcmQuICBJZ25vcmUgZXZlcnl0aGluZyBpbiB0aGUgYnV0dG9uIHJhbmdlIGV4Y2VwdCBmb3IKICAgICAvLyBqb3lzdGljayBhbmQgZ2FtZXBhZCBidXR0b25zIHdoaWNoIGFyZSBoYW5kbGVkIGxpa2Uga2V5Ym9hcmRzIGZvciB0aGUgbW9zdCBwYXJ0LgotICAgIGJvb2wgaGF2ZUtleWJvYXJkS2V5cyA9IGNvbnRhaW5zTm9uWmVyb0J5dGUoa2V5X2JpdG1hc2ssIDAsIHNpemVvZl9iaXRfYXJyYXkoQlROX01JU0MpKQotICAgICAgICAgICAgfHwgY29udGFpbnNOb25aZXJvQnl0ZShrZXlfYml0bWFzaywgc2l6ZW9mX2JpdF9hcnJheShLRVlfT0spLAorICAgIGJvb2wgaGF2ZUtleWJvYXJkS2V5cyA9IGNvbnRhaW5zTm9uWmVyb0J5dGUoZGV2aWNlLT5rZXlCaXRtYXNrLCAwLCBzaXplb2ZfYml0X2FycmF5KEJUTl9NSVNDKSkKKyAgICAgICAgICAgIHx8IGNvbnRhaW5zTm9uWmVyb0J5dGUoZGV2aWNlLT5rZXlCaXRtYXNrLCBzaXplb2ZfYml0X2FycmF5KEtFWV9PSyksCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZl9iaXRfYXJyYXkoS0VZX01BWCArIDEpKTsKLSAgICBib29sIGhhdmVHYW1lcGFkQnV0dG9ucyA9IGNvbnRhaW5zTm9uWmVyb0J5dGUoa2V5X2JpdG1hc2ssIHNpemVvZl9iaXRfYXJyYXkoQlROX01JU0MpLAorICAgIGJvb2wgaGF2ZUdhbWVwYWRCdXR0b25zID0gY29udGFpbnNOb25aZXJvQnl0ZShkZXZpY2UtPmtleUJpdG1hc2ssIHNpemVvZl9iaXRfYXJyYXkoQlROX01JU0MpLAogICAgICAgICAgICAgICAgICAgICBzaXplb2ZfYml0X2FycmF5KEJUTl9NT1VTRSkpCi0gICAgICAgICAgICB8fCBjb250YWluc05vblplcm9CeXRlKGtleV9iaXRtYXNrLCBzaXplb2ZfYml0X2FycmF5KEJUTl9KT1lTVElDSyksCisgICAgICAgICAgICB8fCBjb250YWluc05vblplcm9CeXRlKGRldmljZS0+a2V5Qml0bWFzaywgc2l6ZW9mX2JpdF9hcnJheShCVE5fSk9ZU1RJQ0spLAogICAgICAgICAgICAgICAgICAgICBzaXplb2ZfYml0X2FycmF5KEJUTl9ESUdJKSk7CiAgICAgaWYgKGhhdmVLZXlib2FyZEtleXMgfHwgaGF2ZUdhbWVwYWRCdXR0b25zKSB7CiAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7CiAgICAgfQogCiAgICAgLy8gU2VlIGlmIHRoaXMgaXMgYSBjdXJzb3IgZGV2aWNlIHN1Y2ggYXMgYSB0cmFja2JhbGwgb3IgbW91c2UuCi0gICAgaWYgKHRlc3RfYml0KEJUTl9NT1VTRSwga2V5X2JpdG1hc2spCi0gICAgICAgICAgICAmJiB0ZXN0X2JpdChSRUxfWCwgcmVsX2JpdG1hc2spCi0gICAgICAgICAgICAmJiB0ZXN0X2JpdChSRUxfWSwgcmVsX2JpdG1hc2spKSB7CisgICAgaWYgKHRlc3RfYml0KEJUTl9NT1VTRSwgZGV2aWNlLT5rZXlCaXRtYXNrKQorICAgICAgICAgICAgJiYgdGVzdF9iaXQoUkVMX1gsIGRldmljZS0+cmVsQml0bWFzaykKKyAgICAgICAgICAgICYmIHRlc3RfYml0KFJFTF9ZLCBkZXZpY2UtPnJlbEJpdG1hc2spKSB7CiAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfQ1VSU09SOwogICAgIH0KIAogICAgIC8vIFNlZSBpZiB0aGlzIGlzIGEgdG91Y2ggcGFkLgogICAgIC8vIElzIHRoaXMgYSBuZXcgbW9kZXJuIG11bHRpLXRvdWNoIGRyaXZlcj8KLSAgICBpZiAodGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1gsIGFic19iaXRtYXNrKQotICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1ksIGFic19iaXRtYXNrKSkgeworICAgIGlmICh0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWCwgZGV2aWNlLT5hYnNCaXRtYXNrKQorICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1ksIGRldmljZS0+YWJzQml0bWFzaykpIHsKICAgICAgICAgLy8gU29tZSBqb3lzdGlja3Mgc3VjaCBhcyB0aGUgUFMzIGNvbnRyb2xsZXIgcmVwb3J0IGF4ZXMgdGhhdCBjb25mbGljdAogICAgICAgICAvLyB3aXRoIHRoZSBBQlNfTVQgcmFuZ2UuICBUcnkgdG8gY29uZmlybSB0aGF0IHRoZSBkZXZpY2UgcmVhbGx5IGlzCiAgICAgICAgIC8vIGEgdG91Y2ggc2NyZWVuLgotICAgICAgICBpZiAodGVzdF9iaXQoQlROX1RPVUNILCBrZXlfYml0bWFzaykgfHwgIWhhdmVHYW1lcGFkQnV0dG9ucykgeworICAgICAgICBpZiAodGVzdF9iaXQoQlROX1RPVUNILCBkZXZpY2UtPmtleUJpdG1hc2spIHx8ICFoYXZlR2FtZXBhZEJ1dHRvbnMpIHsKICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0ggfCBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hfTVQ7CiAgICAgICAgIH0KICAgICAvLyBJcyB0aGlzIGFuIG9sZCBzdHlsZSBzaW5nbGUtdG91Y2ggZHJpdmVyPwotICAgIH0gZWxzZSBpZiAodGVzdF9iaXQoQlROX1RPVUNILCBrZXlfYml0bWFzaykKLSAgICAgICAgICAgICYmIHRlc3RfYml0KEFCU19YLCBhYnNfYml0bWFzaykKLSAgICAgICAgICAgICYmIHRlc3RfYml0KEFCU19ZLCBhYnNfYml0bWFzaykpIHsKKyAgICB9IGVsc2UgaWYgKHRlc3RfYml0KEJUTl9UT1VDSCwgZGV2aWNlLT5rZXlCaXRtYXNrKQorICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX1gsIGRldmljZS0+YWJzQml0bWFzaykKKyAgICAgICAgICAgICYmIHRlc3RfYml0KEFCU19ZLCBkZXZpY2UtPmFic0JpdG1hc2spKSB7CiAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0g7CiAgICAgfQogCkBAIC05MDgsMjkgKzk0MSwyMyBAQAogICAgIC8vIGZyb20gb3RoZXIgZGV2aWNlcyBzdWNoIGFzIGFjY2VsZXJvbWV0ZXJzIHRoYXQgYWxzbyBoYXZlIGFic29sdXRlIGF4ZXMuCiAgICAgaWYgKGhhdmVHYW1lcGFkQnV0dG9ucwogICAgICAgICAgICAgJiYgIShkZXZpY2UtPmNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0gpCi0gICAgICAgICAgICAmJiBjb250YWluc05vblplcm9CeXRlKGFic19iaXRtYXNrLCAwLCBzaXplb2ZfYml0X2FycmF5KEFCU19NQVggKyAxKSkpIHsKKyAgICAgICAgICAgICYmIGNvbnRhaW5zTm9uWmVyb0J5dGUoZGV2aWNlLT5hYnNCaXRtYXNrLCAwLCBzaXplb2ZfYml0X2FycmF5KEFCU19NQVggKyAxKSkpIHsKICAgICAgICAgZGV2aWNlLT5jbGFzc2VzIHw9IElOUFVUX0RFVklDRV9DTEFTU19KT1lTVElDSzsKICAgICB9CiAKLSAgICAvLyBmaWd1cmUgb3V0IHRoZSBzd2l0Y2hlcyB0aGlzIGRldmljZSByZXBvcnRzCi0gICAgYm9vbCBoYXZlU3dpdGNoZXMgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpPTA7IGk8RVZfU1c7IGkrKykgewotICAgICAgICAvL0xPR0koIkRldmljZSAlZCBzdyAlZDogaGFzPSVkIiwgZGV2aWNlLT5pZCwgaSwgdGVzdF9iaXQoaSwgc3dfYml0bWFzaykpOwotICAgICAgICBpZiAodGVzdF9iaXQoaSwgc3dfYml0bWFzaykpIHsKLSAgICAgICAgICAgIGhhdmVTd2l0Y2hlcyA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVN3aXRjaGVzW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICBtU3dpdGNoZXNbaV0gPSBkZXZpY2UtPmlkOwotICAgICAgICAgICAgfQorICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBkZXZpY2UgaGFzIHN3aXRjaGVzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IFNXX01BWDsgaSsrKSB7CisgICAgICAgIGlmICh0ZXN0X2JpdChpLCBkZXZpY2UtPnN3Qml0bWFzaykpIHsKKyAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfU1dJVENIOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGhhdmVTd2l0Y2hlcykgewotICAgICAgICBkZXZpY2UtPmNsYXNzZXMgfD0gSU5QVVRfREVWSUNFX0NMQVNTX1NXSVRDSDsKLSAgICB9CiAKKyAgICAvLyBDb25maWd1cmUgdmlydHVhbCBrZXlzLgogICAgIGlmICgoZGV2aWNlLT5jbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIKSkgewogICAgICAgICAvLyBMb2FkIHRoZSB2aXJ0dWFsIGtleXMgZm9yIHRoZSB0b3VjaCBzY3JlZW4sIGlmIGFueS4KICAgICAgICAgLy8gV2UgZG8gdGhpcyBub3cgc28gdGhhdCB3ZSBjYW4gbWFrZSBzdXJlIHRvIGxvYWQgdGhlIGtleW1hcCBpZiBuZWNlc3NhcnkuCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvYWRWaXJ0dWFsS2V5TWFwKGRldmljZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvYWRWaXJ0dWFsS2V5TWFwTG9ja2VkKGRldmljZSk7CiAgICAgICAgIGlmICghc3RhdHVzKSB7CiAgICAgICAgICAgICBkZXZpY2UtPmNsYXNzZXMgfD0gSU5QVVRfREVWSUNFX0NMQVNTX0tFWUJPQVJEOwogICAgICAgICB9CkBAIC05NDEsMTMgKzk2OCwxMyBAQAogICAgIHN0YXR1c190IGtleU1hcFN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwogICAgIGlmIChkZXZpY2UtPmNsYXNzZXMgJiAoSU5QVVRfREVWSUNFX0NMQVNTX0tFWUJPQVJEIHwgSU5QVVRfREVWSUNFX0NMQVNTX0pPWVNUSUNLKSkgewogICAgICAgICAvLyBMb2FkIHRoZSBrZXltYXAgZm9yIHRoZSBkZXZpY2UuCi0gICAgICAgIGtleU1hcFN0YXR1cyA9IGxvYWRLZXlNYXAoZGV2aWNlKTsKKyAgICAgICAga2V5TWFwU3RhdHVzID0gbG9hZEtleU1hcExvY2tlZChkZXZpY2UpOwogICAgIH0KIAogICAgIC8vIENvbmZpZ3VyZSB0aGUga2V5Ym9hcmQsIGdhbWVwYWQgb3IgdmlydHVhbCBrZXlib2FyZC4KICAgICBpZiAoZGV2aWNlLT5jbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX0tFWUJPQVJEKSB7CiAgICAgICAgIC8vIFNldCBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIGtleWJvYXJkLgotICAgICAgICBzZXRLZXlib2FyZFByb3BlcnRpZXMoZGV2aWNlLCBmYWxzZSk7CisgICAgICAgIHNldEtleWJvYXJkUHJvcGVydGllc0xvY2tlZChkZXZpY2UsIGZhbHNlKTsKIAogICAgICAgICAvLyBSZWdpc3RlciB0aGUga2V5Ym9hcmQgYXMgYSBidWlsdC1pbiBrZXlib2FyZCBpZiBpdCBpcyBlbGlnaWJsZS4KICAgICAgICAgaWYgKCFrZXlNYXBTdGF0dXMKQEAgLTk1NSw3ICs5ODIsNyBAQAogICAgICAgICAgICAgICAgICYmIGlzRWxpZ2libGVCdWlsdEluS2V5Ym9hcmQoZGV2aWNlLT5pZGVudGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5jb25maWd1cmF0aW9uLCAmZGV2aWNlLT5rZXlNYXApKSB7CiAgICAgICAgICAgICBtQnVpbHRJbktleWJvYXJkSWQgPSBkZXZpY2UtPmlkOwotICAgICAgICAgICAgc2V0S2V5Ym9hcmRQcm9wZXJ0aWVzKGRldmljZSwgdHJ1ZSk7CisgICAgICAgICAgICBzZXRLZXlib2FyZFByb3BlcnRpZXNMb2NrZWQoZGV2aWNlLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vICdRJyBrZXkgc3VwcG9ydCA9IGNoZWFwIHRlc3Qgb2Ygd2hldGhlciB0aGlzIGlzIGFuIGFscGhhLWNhcGFibGUga2JkCkBAIC05OTAsMTAgKzEwMTcsMjEgQEAKICAgICB9CiAKICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGV2aWNlIGlzIGV4dGVybmFsIG9yIGludGVybmFsLgotICAgIGlmIChpc0V4dGVybmFsRGV2aWNlKGRldmljZSkpIHsKKyAgICBpZiAoaXNFeHRlcm5hbERldmljZUxvY2tlZChkZXZpY2UpKSB7CiAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfRVhURVJOQUw7CiAgICAgfQogCisgICAgLy8gUmVnaXN0ZXIgd2l0aCBlcG9sbC4KKyAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnRJdGVtOworICAgIG1lbXNldCgmZXZlbnRJdGVtLCAwLCBzaXplb2YoZXZlbnRJdGVtKSk7CisgICAgZXZlbnRJdGVtLmV2ZW50cyA9IEVQT0xMSU47CisgICAgZXZlbnRJdGVtLmRhdGEudTMyID0gZGV2aWNlSWQ7CisgICAgaWYgKGVwb2xsX2N0bChtRXBvbGxGZCwgRVBPTExfQ1RMX0FERCwgZmQsICZldmVudEl0ZW0pKSB7CisgICAgICAgIExPR0UoIkNvdWxkIG5vdCBhZGQgZGV2aWNlIGZkIHRvIGVwb2xsIGluc3RhbmNlLiAgZXJybm89JWQiLCBlcnJubyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICAgICBMT0dJKCJOZXcgZGV2aWNlOiBpZD0lZCwgZmQ9JWQsIHBhdGg9JyVzJywgbmFtZT0nJXMnLCBjbGFzc2VzPTB4JXgsICIKICAgICAgICAgICAgICJjb25maWd1cmF0aW9uPSclcycsIGtleUxheW91dD0nJXMnLCBrZXlDaGFyYWN0ZXJNYXA9JyVzJywgYnVpbHRpbktleWJvYXJkPSVzIiwKICAgICAgICAgIGRldmljZUlkLCBmZCwgZGV2aWNlUGF0aCwgZGV2aWNlLT5pZGVudGlmaWVyLm5hbWUuc3RyaW5nKCksCkBAIC0xMDAzLDE5ICsxMDQxLDE0IEBACiAgICAgICAgICBkZXZpY2UtPmtleU1hcC5rZXlDaGFyYWN0ZXJNYXBGaWxlLnN0cmluZygpLAogICAgICAgICAgdG9TdHJpbmcobUJ1aWx0SW5LZXlib2FyZElkID09IGRldmljZUlkKSk7CiAKLSAgICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZDsKLSAgICBwb2xsZmQuZmQgPSBmZDsKLSAgICBwb2xsZmQuZXZlbnRzID0gUE9MTElOOwotICAgIHBvbGxmZC5yZXZlbnRzID0gMDsKLSAgICBtRmRzLnB1c2gocG9sbGZkKTsKLSAgICBtRGV2aWNlcy5wdXNoKGRldmljZSk7CisgICAgbURldmljZXMuYWRkKGRldmljZUlkLCBkZXZpY2UpOwogCiAgICAgZGV2aWNlLT5uZXh0ID0gbU9wZW5pbmdEZXZpY2VzOwogICAgIG1PcGVuaW5nRGV2aWNlcyA9IGRldmljZTsKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBFdmVudEh1Yjo6bG9hZENvbmZpZ3VyYXRpb24oRGV2aWNlKiBkZXZpY2UpIHsKK3ZvaWQgRXZlbnRIdWI6OmxvYWRDb25maWd1cmF0aW9uTG9ja2VkKERldmljZSogZGV2aWNlKSB7CiAgICAgZGV2aWNlLT5jb25maWd1cmF0aW9uRmlsZSA9IGdldElucHV0RGV2aWNlQ29uZmlndXJhdGlvbkZpbGVQYXRoQnlEZXZpY2VJZGVudGlmaWVyKAogICAgICAgICAgICAgZGV2aWNlLT5pZGVudGlmaWVyLCBJTlBVVF9ERVZJQ0VfQ09ORklHVVJBVElPTl9GSUxFX1RZUEVfQ09ORklHVVJBVElPTik7CiAgICAgaWYgKGRldmljZS0+Y29uZmlndXJhdGlvbkZpbGUuaXNFbXB0eSgpKSB7CkBAIC0xMDMyLDcgKzEwNjUsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgRXZlbnRIdWI6OmxvYWRWaXJ0dWFsS2V5TWFwKERldmljZSogZGV2aWNlKSB7CitzdGF0dXNfdCBFdmVudEh1Yjo6bG9hZFZpcnR1YWxLZXlNYXBMb2NrZWQoRGV2aWNlKiBkZXZpY2UpIHsKICAgICAvLyBUaGUgdmlydHVhbCBrZXkgbWFwIGlzIHN1cHBsaWVkIGJ5IHRoZSBrZXJuZWwgYXMgYSBzeXN0ZW0gYm9hcmQgcHJvcGVydHkgZmlsZS4KICAgICBTdHJpbmc4IHBhdGg7CiAgICAgcGF0aC5hcHBlbmQoIi9zeXMvYm9hcmRfcHJvcGVydGllcy92aXJ0dWFsa2V5cy4iKTsKQEAgLTEwNDMsMjIgKzEwNzYsMjIgQEAKICAgICByZXR1cm4gVmlydHVhbEtleU1hcDo6bG9hZChwYXRoLCAmZGV2aWNlLT52aXJ0dWFsS2V5TWFwKTsKIH0KIAotc3RhdHVzX3QgRXZlbnRIdWI6OmxvYWRLZXlNYXAoRGV2aWNlKiBkZXZpY2UpIHsKK3N0YXR1c190IEV2ZW50SHViOjpsb2FkS2V5TWFwTG9ja2VkKERldmljZSogZGV2aWNlKSB7CiAgICAgcmV0dXJuIGRldmljZS0+a2V5TWFwLmxvYWQoZGV2aWNlLT5pZGVudGlmaWVyLCBkZXZpY2UtPmNvbmZpZ3VyYXRpb24pOwogfQogCi12b2lkIEV2ZW50SHViOjpzZXRLZXlib2FyZFByb3BlcnRpZXMoRGV2aWNlKiBkZXZpY2UsIGJvb2wgYnVpbHRJbktleWJvYXJkKSB7Cit2b2lkIEV2ZW50SHViOjpzZXRLZXlib2FyZFByb3BlcnRpZXNMb2NrZWQoRGV2aWNlKiBkZXZpY2UsIGJvb2wgYnVpbHRJbktleWJvYXJkKSB7CiAgICAgaW50MzJfdCBpZCA9IGJ1aWx0SW5LZXlib2FyZCA/IDAgOiBkZXZpY2UtPmlkOwogICAgIGFuZHJvaWQ6OnNldEtleWJvYXJkUHJvcGVydGllcyhpZCwgZGV2aWNlLT5pZGVudGlmaWVyLAogICAgICAgICAgICAgZGV2aWNlLT5rZXlNYXAua2V5TGF5b3V0RmlsZSwgZGV2aWNlLT5rZXlNYXAua2V5Q2hhcmFjdGVyTWFwRmlsZSk7CiB9CiAKLXZvaWQgRXZlbnRIdWI6OmNsZWFyS2V5Ym9hcmRQcm9wZXJ0aWVzKERldmljZSogZGV2aWNlLCBib29sIGJ1aWx0SW5LZXlib2FyZCkgewordm9pZCBFdmVudEh1Yjo6Y2xlYXJLZXlib2FyZFByb3BlcnRpZXNMb2NrZWQoRGV2aWNlKiBkZXZpY2UsIGJvb2wgYnVpbHRJbktleWJvYXJkKSB7CiAgICAgaW50MzJfdCBpZCA9IGJ1aWx0SW5LZXlib2FyZCA/IDAgOiBkZXZpY2UtPmlkOwogICAgIGFuZHJvaWQ6OmNsZWFyS2V5Ym9hcmRQcm9wZXJ0aWVzKGlkKTsKIH0KIAotYm9vbCBFdmVudEh1Yjo6aXNFeHRlcm5hbERldmljZShEZXZpY2UqIGRldmljZSkgeworYm9vbCBFdmVudEh1Yjo6aXNFeHRlcm5hbERldmljZUxvY2tlZChEZXZpY2UqIGRldmljZSkgewogICAgIGlmIChkZXZpY2UtPmNvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgYm9vbCB2YWx1ZTsKICAgICAgICAgaWYgKGRldmljZS0+Y29uZmlndXJhdGlvbi0+dHJ5R2V0UHJvcGVydHkoU3RyaW5nOCgiZGV2aWNlLmludGVybmFsIiksIHZhbHVlKQpAQCAtMTA4Nyw0MSArMTEyMCw0MCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotaW50IEV2ZW50SHViOjpjbG9zZURldmljZShjb25zdCBjaGFyICpkZXZpY2VQYXRoKSB7Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSBGSVJTVF9BQ1RVQUxfREVWSUNFX0lOREVYOyBpIDwgbURldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlc1tpXTsKLSAgICAgICAgaWYgKGRldmljZS0+cGF0aCA9PSBkZXZpY2VQYXRoKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xvc2VEZXZpY2VBdEluZGV4TG9ja2VkKGkpOwotICAgICAgICB9CitzdGF0dXNfdCBFdmVudEh1Yjo6Y2xvc2VEZXZpY2VCeVBhdGhMb2NrZWQoY29uc3QgY2hhciAqZGV2aWNlUGF0aCkgeworICAgIERldmljZSogZGV2aWNlID0gZ2V0RGV2aWNlQnlQYXRoTG9ja2VkKGRldmljZVBhdGgpOworICAgIGlmIChkZXZpY2UpIHsKKyAgICAgICAgY2xvc2VEZXZpY2VMb2NrZWQoZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIExPR1YoIlJlbW92ZSBkZXZpY2U6ICVzIG5vdCBmb3VuZCwgZGV2aWNlIG1heSBhbHJlYWR5IGhhdmUgYmVlbiByZW1vdmVkLiIsIGRldmljZVBhdGgpOwogICAgIHJldHVybiAtMTsKIH0KIAotaW50IEV2ZW50SHViOjpjbG9zZURldmljZUF0SW5kZXhMb2NrZWQoaW50IGluZGV4KSB7Ci0gICAgRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlc1tpbmRleF07Cit2b2lkIEV2ZW50SHViOjpjbG9zZUFsbERldmljZXNMb2NrZWQoKSB7CisgICAgd2hpbGUgKG1EZXZpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgY2xvc2VEZXZpY2VMb2NrZWQobURldmljZXMudmFsdWVBdChtRGV2aWNlcy5zaXplKCkgLSAxKSk7CisgICAgfQorfQorCit2b2lkIEV2ZW50SHViOjpjbG9zZURldmljZUxvY2tlZChEZXZpY2UqIGRldmljZSkgewogICAgIExPR0koIlJlbW92ZWQgZGV2aWNlOiBwYXRoPSVzIG5hbWU9JXMgaWQ9JWQgZmQ9JWQgY2xhc3Nlcz0weCV4XG4iLAogICAgICAgICAgZGV2aWNlLT5wYXRoLnN0cmluZygpLCBkZXZpY2UtPmlkZW50aWZpZXIubmFtZS5zdHJpbmcoKSwgZGV2aWNlLT5pZCwKICAgICAgICAgIGRldmljZS0+ZmQsIGRldmljZS0+Y2xhc3Nlcyk7CiAKLSAgICBmb3IgKGludCBqPTA7IGo8RVZfU1c7IGorKykgewotICAgICAgICBpZiAobVN3aXRjaGVzW2pdID09IGRldmljZS0+aWQpIHsKLSAgICAgICAgICAgIG1Td2l0Y2hlc1tqXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBpZiAoZGV2aWNlLT5pZCA9PSBtQnVpbHRJbktleWJvYXJkSWQpIHsKICAgICAgICAgTE9HVygiYnVpbHQtaW4ga2V5Ym9hcmQgZGV2aWNlICVzIChpZD0lZCkgaXMgY2xvc2luZyEgdGhlIGFwcHMgd2lsbCBub3QgbGlrZSB0aGlzIiwKICAgICAgICAgICAgICAgICBkZXZpY2UtPnBhdGguc3RyaW5nKCksIG1CdWlsdEluS2V5Ym9hcmRJZCk7CiAgICAgICAgIG1CdWlsdEluS2V5Ym9hcmRJZCA9IC0xOwotICAgICAgICBjbGVhcktleWJvYXJkUHJvcGVydGllcyhkZXZpY2UsIHRydWUpOworICAgICAgICBjbGVhcktleWJvYXJkUHJvcGVydGllc0xvY2tlZChkZXZpY2UsIHRydWUpOwogICAgIH0KLSAgICBjbGVhcktleWJvYXJkUHJvcGVydGllcyhkZXZpY2UsIGZhbHNlKTsKKyAgICBjbGVhcktleWJvYXJkUHJvcGVydGllc0xvY2tlZChkZXZpY2UsIGZhbHNlKTsKIAotICAgIG1GZHMucmVtb3ZlQXQoaW5kZXgpOwotICAgIG1EZXZpY2VzLnJlbW92ZUF0KGluZGV4KTsKKyAgICBpZiAoZXBvbGxfY3RsKG1FcG9sbEZkLCBFUE9MTF9DVExfREVMLCBkZXZpY2UtPmZkLCBOVUxMKSkgeworICAgICAgICBMT0dXKCJDb3VsZCBub3QgcmVtb3ZlIGRldmljZSBmZCBmcm9tIGVwb2xsIGluc3RhbmNlLiAgZXJybm89JWQiLCBlcnJubyk7CisgICAgfQorCisgICAgbURldmljZXMucmVtb3ZlSXRlbShkZXZpY2UtPmlkKTsKICAgICBkZXZpY2UtPmNsb3NlKCk7CiAKICAgICAvLyBVbmxpbmsgZm9yIG9wZW5pbmcgZGV2aWNlcyBsaXN0IGlmIGl0IGlzIHByZXNlbnQuCkBAIC0xMTUyLDExICsxMTg0LDkgQEAKICAgICAgICAgZGV2aWNlLT5uZXh0ID0gbUNsb3NpbmdEZXZpY2VzOwogICAgICAgICBtQ2xvc2luZ0RldmljZXMgPSBkZXZpY2U7CiAgICAgfQotICAgIHJldHVybiAwOwogfQogCi1pbnQgRXZlbnRIdWI6OnJlYWROb3RpZnkoaW50IG5mZCkgewotI2lmZGVmIEhBVkVfSU5PVElGWQorc3RhdHVzX3QgRXZlbnRIdWI6OnJlYWROb3RpZnlMb2NrZWQoKSB7CiAgICAgaW50IHJlczsKICAgICBjaGFyIGRldm5hbWVbUEFUSF9NQVhdOwogICAgIGNoYXIgKmZpbGVuYW1lOwpAQCAtMTE2NSwxMyArMTE5NSwxMyBAQAogICAgIGludCBldmVudF9wb3MgPSAwOwogICAgIHN0cnVjdCBpbm90aWZ5X2V2ZW50ICpldmVudDsKIAotICAgIExPR1YoIkV2ZW50SHViOjpyZWFkTm90aWZ5IG5mZDogJWRcbiIsIG5mZCk7Ci0gICAgcmVzID0gcmVhZChuZmQsIGV2ZW50X2J1Ziwgc2l6ZW9mKGV2ZW50X2J1ZikpOworICAgIExPR1YoIkV2ZW50SHViOjpyZWFkTm90aWZ5IG5mZDogJWRcbiIsIG1JTm90aWZ5RmQpOworICAgIHJlcyA9IHJlYWQobUlOb3RpZnlGZCwgZXZlbnRfYnVmLCBzaXplb2YoZXZlbnRfYnVmKSk7CiAgICAgaWYocmVzIDwgKGludClzaXplb2YoKmV2ZW50KSkgewogICAgICAgICBpZihlcnJubyA9PSBFSU5UUikKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBMT0dXKCJjb3VsZCBub3QgZ2V0IGV2ZW50LCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgLy9wcmludGYoImdvdCAlZCBieXRlcyBvZiBldmVudCBpbmZvcm1hdGlvblxuIiwgcmVzKTsKIApAQCAtMTE4NSwyMSArMTIxNSwxOSBAQAogICAgICAgICBpZihldmVudC0+bGVuKSB7CiAgICAgICAgICAgICBzdHJjcHkoZmlsZW5hbWUsIGV2ZW50LT5uYW1lKTsKICAgICAgICAgICAgIGlmKGV2ZW50LT5tYXNrICYgSU5fQ1JFQVRFKSB7Ci0gICAgICAgICAgICAgICAgb3BlbkRldmljZShkZXZuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlKGRldm5hbWUpOworICAgICAgICAgICAgICAgIG9wZW5EZXZpY2VMb2NrZWQoZGV2bmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNsb3NlRGV2aWNlQnlQYXRoTG9ja2VkKGRldm5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGV2ZW50X3NpemUgPSBzaXplb2YoKmV2ZW50KSArIGV2ZW50LT5sZW47CiAgICAgICAgIHJlcyAtPSBldmVudF9zaXplOwogICAgICAgICBldmVudF9wb3MgKz0gZXZlbnRfc2l6ZTsKICAgICB9Ci0jZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAotaW50IEV2ZW50SHViOjpzY2FuRGlyKGNvbnN0IGNoYXIgKmRpcm5hbWUpCitzdGF0dXNfdCBFdmVudEh1Yjo6c2NhbkRpckxvY2tlZChjb25zdCBjaGFyICpkaXJuYW1lKQogewogICAgIGNoYXIgZGV2bmFtZVtQQVRIX01BWF07CiAgICAgY2hhciAqZmlsZW5hbWU7CkBAIC0xMjE3LDEyICsxMjQ1LDE5IEBACiAgICAgICAgICAgICAoZGUtPmRfbmFtZVsxXSA9PSAnLicgJiYgZGUtPmRfbmFtZVsyXSA9PSAnXDAnKSkpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgc3RyY3B5KGZpbGVuYW1lLCBkZS0+ZF9uYW1lKTsKLSAgICAgICAgb3BlbkRldmljZShkZXZuYW1lKTsKKyAgICAgICAgb3BlbkRldmljZUxvY2tlZChkZXZuYW1lKTsKICAgICB9CiAgICAgY2xvc2VkaXIoZGlyKTsKICAgICByZXR1cm4gMDsKIH0KIAordm9pZCBFdmVudEh1Yjo6cmVxdWVzdFJlb3BlbkRldmljZXMoKSB7CisgICAgTE9HVigicmVxdWVzdFJlb3BlbkRldmljZXMoKSBjYWxsZWQiKTsKKworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgbU5lZWRUb1Jlb3BlbkRldmljZXMgPSB0cnVlOworfQorCiB2b2lkIEV2ZW50SHViOjpkdW1wKFN0cmluZzgmIGR1bXApIHsKICAgICBkdW1wLmFwcGVuZCgiRXZlbnQgSHViIFN0YXRlOlxuIik7CiAKQEAgLTEyMzMsMzEgKzEyNjgsMjkgQEAKIAogICAgICAgICBkdW1wLmFwcGVuZChJTkRFTlQgIkRldmljZXM6XG4iKTsKIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gRklSU1RfQUNUVUFMX0RFVklDRV9JTkRFWDsgaSA8IG1EZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2UqIGRldmljZSA9IG1EZXZpY2VzW2ldOwotICAgICAgICAgICAgaWYgKGRldmljZSkgewotICAgICAgICAgICAgICAgIGlmIChtQnVpbHRJbktleWJvYXJkSWQgPT0gZGV2aWNlLT5pZCkgewotICAgICAgICAgICAgICAgICAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICIlZDogJXMgKGFrYSBkZXZpY2UgMCAtIGJ1aWx0LWluIGtleWJvYXJkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmlkZW50aWZpZXIubmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiJWQ6ICVzXG4iLCBkZXZpY2UtPmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aWRlbnRpZmllci5uYW1lLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiQ2xhc3NlczogMHglMDh4XG4iLCBkZXZpY2UtPmNsYXNzZXMpOwotICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlBhdGg6ICVzXG4iLCBkZXZpY2UtPnBhdGguc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIkxvY2F0aW9uOiAlc1xuIiwgZGV2aWNlLT5pZGVudGlmaWVyLmxvY2F0aW9uLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJVbmlxdWVJZDogJXNcbiIsIGRldmljZS0+aWRlbnRpZmllci51bmlxdWVJZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiSWRlbnRpZmllcjogYnVzPTB4JTA0eCwgdmVuZG9yPTB4JTA0eCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3Q9MHglMDR4LCB2ZXJzaW9uPTB4JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aWRlbnRpZmllci5idXMsIGRldmljZS0+aWRlbnRpZmllci52ZW5kb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkZW50aWZpZXIucHJvZHVjdCwgZGV2aWNlLT5pZGVudGlmaWVyLnZlcnNpb24pOwotICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIktleUxheW91dEZpbGU6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5rZXlNYXAua2V5TGF5b3V0RmlsZS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiS2V5Q2hhcmFjdGVyTWFwRmlsZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmtleU1hcC5rZXlDaGFyYWN0ZXJNYXBGaWxlLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJDb25maWd1cmF0aW9uRmlsZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbmZpZ3VyYXRpb25GaWxlLnN0cmluZygpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgRGV2aWNlKiBkZXZpY2UgPSBtRGV2aWNlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG1CdWlsdEluS2V5Ym9hcmRJZCA9PSBkZXZpY2UtPmlkKSB7CisgICAgICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiJWQ6ICVzIChha2EgZGV2aWNlIDAgLSBidWlsdC1pbiBrZXlib2FyZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkLCBkZXZpY2UtPmlkZW50aWZpZXIubmFtZS5zdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIiVkOiAlc1xuIiwgZGV2aWNlLT5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aWRlbnRpZmllci5uYW1lLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIkNsYXNzZXM6IDB4JTA4eFxuIiwgZGV2aWNlLT5jbGFzc2VzKTsKKyAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlBhdGg6ICVzXG4iLCBkZXZpY2UtPnBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiTG9jYXRpb246ICVzXG4iLCBkZXZpY2UtPmlkZW50aWZpZXIubG9jYXRpb24uc3RyaW5nKCkpOworICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiVW5pcXVlSWQ6ICVzXG4iLCBkZXZpY2UtPmlkZW50aWZpZXIudW5pcXVlSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiSWRlbnRpZmllcjogYnVzPTB4JTA0eCwgdmVuZG9yPTB4JTA0eCwgIgorICAgICAgICAgICAgICAgICAgICAicHJvZHVjdD0weCUwNHgsIHZlcnNpb249MHglMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkZW50aWZpZXIuYnVzLCBkZXZpY2UtPmlkZW50aWZpZXIudmVuZG9yLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkZW50aWZpZXIucHJvZHVjdCwgZGV2aWNlLT5pZGVudGlmaWVyLnZlcnNpb24pOworICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiS2V5TGF5b3V0RmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+a2V5TWFwLmtleUxheW91dEZpbGUuc3RyaW5nKCkpOworICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiS2V5Q2hhcmFjdGVyTWFwRmlsZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+a2V5TWFwLmtleUNoYXJhY3Rlck1hcEZpbGUuc3RyaW5nKCkpOworICAgICAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiQ29uZmlndXJhdGlvbkZpbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmNvbmZpZ3VyYXRpb25GaWxlLnN0cmluZygpKTsKICAgICAgICAgfQogICAgIH0gLy8gcmVsZWFzZSBsb2NrCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC9FdmVudEh1Yi5oIGIvc2VydmljZXMvaW5wdXQvRXZlbnRIdWIuaAppbmRleCBjYTMzNjE5Li4wYTM0ZTQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9pbnB1dC9FdmVudEh1Yi5oCisrKyBiL3NlcnZpY2VzL2lucHV0L0V2ZW50SHViLmgKQEAgLTMxLDQ5ICszMSwxNiBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1Byb3BlcnR5TWFwLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcmUgbm90IGRlZmluZWQgaW4gbGludXgvaW5wdXQuaCBpbiB0aGUgdmVyc2lvbiBvZiB0aGUga2VybmVsCi0gKiBoZWFkZXJzIGN1cnJlbnRseSBwcm92aWRlZCB3aXRoIEJpb25pYy4gKi8KLQotI2RlZmluZSBFVklPQ0dQUk9QKGxlbikgX0lPQyhfSU9DX1JFQUQsICdFJywgMHgwOSwgbGVuKQotCi0jZGVmaW5lIElOUFVUX1BST1BfUE9JTlRFUiAweDAwCi0jZGVmaW5lIElOUFVUX1BST1BfRElSRUNUIDB4MDEKLSNkZWZpbmUgSU5QVVRfUFJPUF9CVVRUT05QQUQgMHgwMgotI2RlZmluZSBJTlBVVF9QUk9QX1NFTUlfTVQgMHgwMwotI2RlZmluZSBJTlBVVF9QUk9QX01BWCAweDFmCi0jZGVmaW5lIElOUFVUX1BST1BfQ05UIChJTlBVVF9QUk9QX01BWCArIDEpCi0KLSNkZWZpbmUgQUJTX01UX1NMT1QgMHgyZgotI2RlZmluZSBBQlNfTVRfVE9VQ0hfTUFKT1IgMHgzMAotI2RlZmluZSBBQlNfTVRfVE9VQ0hfTUlOT1IgMHgzMQotI2RlZmluZSBBQlNfTVRfV0lEVEhfTUFKT1IgMHgzMgotI2RlZmluZSBBQlNfTVRfV0lEVEhfTUlOT1IgMHgzMwotI2RlZmluZSBBQlNfTVRfT1JJRU5UQVRJT04gMHgzNAotI2RlZmluZSBBQlNfTVRfUE9TSVRJT05fWCAweDM1Ci0jZGVmaW5lIEFCU19NVF9QT1NJVElPTl9ZIDB4MzYKLSNkZWZpbmUgQUJTX01UX1RPT0xfVFlQRSAweDM3Ci0jZGVmaW5lIEFCU19NVF9CTE9CX0lEIDB4MzgKLSNkZWZpbmUgQUJTX01UX1RSQUNLSU5HX0lEIDB4MzkKLSNkZWZpbmUgQUJTX01UX1BSRVNTVVJFIDB4M2EKLSNkZWZpbmUgQUJTX01UX0RJU1RBTkNFIDB4M2IKLQotI2RlZmluZSBNVF9UT09MX0ZJTkdFUiAwCi0jZGVmaW5lIE1UX1RPT0xfUEVOIDEKLQotI2RlZmluZSBTWU5fTVRfUkVQT1JUIDIKLSNkZWZpbmUgU1lOX0RST1BQRUQgMwotCisjaW5jbHVkZSA8c3lzL2Vwb2xsLmg+CiAKIC8qIENvbnZlbmllbmNlIGNvbnN0YW50cy4gKi8KIAogI2RlZmluZSBCVE5fRklSU1QgMHgxMDAgIC8vIGZpcnN0IGJ1dHRvbiBzY2FuY29kZQogI2RlZmluZSBCVE5fTEFTVCAweDE1ZiAgIC8vIGxhc3QgYnV0dG9uIHNjYW5jb2RlCiAKLXN0cnVjdCBwb2xsZmQ7Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLyoKQEAgLTk3LDYgKzY0LDcgQEAKICAgICBpbnQzMl90IG1heFZhbHVlOyAgLy8gbWF4aW11bSB2YWx1ZQogICAgIGludDMyX3QgZmxhdDsgICAgICAvLyBjZW50ZXIgZmxhdCBwb3NpdGlvbiwgZWcuIGZsYXQgPT0gOCBtZWFucyBjZW50ZXIgaXMgYmV0d2VlbiAtOCBhbmQgOAogICAgIGludDMyX3QgZnV6ejsgICAgICAvLyBlcnJvciB0b2xlcmFuY2UsIGVnLiBmdXp6ID09IDQgbWVhbnMgdmFsdWUgaXMgKy8tIDQgZHVlIHRvIG5vaXNlCisgICAgaW50MzJfdCByZXNvbHV0aW9uOyAvLyByZXNvbHV0aW9uIGluIHVuaXRzIHBlciBtbSBvciByYWRpYW5zIHBlciBtbQogCiAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CiAgICAgICAgIHZhbGlkID0gZmFsc2U7CkBAIC0xMDQsNiArNzIsNyBAQAogICAgICAgICBtYXhWYWx1ZSA9IDA7CiAgICAgICAgIGZsYXQgPSAwOwogICAgICAgICBmdXp6ID0gMDsKKyAgICAgICAgcmVzb2x1dGlvbiA9IDA7CiAgICAgfQogfTsKIApAQCAtMTkzLDkgKzE2Miw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBtYXBBeGlzKGludDMyX3QgZGV2aWNlSWQsIGludCBzY2FuY29kZSwKICAgICAgICAgICAgIEF4aXNJbmZvKiBvdXRBeGlzSW5mbykgY29uc3QgPSAwOwogCi0gICAgLy8gZXhjbHVkZSBhIHBhcnRpY3VsYXIgZGV2aWNlIGZyb20gb3BlbmluZwotICAgIC8vIHRoaXMgY2FuIGJlIHVzZWQgdG8gaWdub3JlIGlucHV0IGRldmljZXMgZm9yIHNlbnNvcnMKLSAgICB2aXJ0dWFsIHZvaWQgYWRkRXhjbHVkZWREZXZpY2UoY29uc3QgY2hhciogZGV2aWNlTmFtZSkgPSAwOworICAgIC8vIFNldHMgZGV2aWNlcyB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIG9wZW5pbmcuCisgICAgLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBpZ25vcmUgaW5wdXQgZGV2aWNlcyBmb3Igc2Vuc29ycy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXhjbHVkZWREZXZpY2VzKGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZGV2aWNlcykgPSAwOwogCiAgICAgLyoKICAgICAgKiBXYWl0IGZvciBldmVudHMgdG8gYmVjb21lIGF2YWlsYWJsZSBhbmQgcmV0dXJucyB0aGVtLgpAQCAtMjMwLDYgKzE5OSwxMiBAQAogICAgIHZpcnR1YWwgdm9pZCBnZXRWaXJ0dWFsS2V5RGVmaW5pdGlvbnMoaW50MzJfdCBkZXZpY2VJZCwKICAgICAgICAgICAgIFZlY3RvcjxWaXJ0dWFsS2V5RGVmaW5pdGlvbj4mIG91dFZpcnR1YWxLZXlzKSBjb25zdCA9IDA7CiAKKyAgICAvKiBSZXF1ZXN0cyB0aGUgRXZlbnRIdWIgdG8gcmVvcGVuIGFsbCBpbnB1dCBkZXZpY2VzIG9uIHRoZSBuZXh0IGNhbGwgdG8gZ2V0RXZlbnRzKCkuICovCisgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RSZW9wZW5EZXZpY2VzKCkgPSAwOworCisgICAgLyogV2FrZXMgdXAgZ2V0RXZlbnRzKCkgaWYgaXQgaXMgYmxvY2tlZCBvbiBhIHJlYWQuICovCisgICAgdmlydHVhbCB2b2lkIHdha2UoKSA9IDA7CisKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiBkdW1wKSA9IDA7CiB9OwogCkBAIC0yMzgsOCArMjEzLDYgQEAKIHB1YmxpYzoKICAgICBFdmVudEh1YigpOwogCi0gICAgc3RhdHVzX3QgZXJyb3JDaGVjaygpIGNvbnN0OwotCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VDbGFzc2VzKGludDMyX3QgZGV2aWNlSWQpIGNvbnN0OwogCiAgICAgdmlydHVhbCBTdHJpbmc4IGdldERldmljZU5hbWUoaW50MzJfdCBkZXZpY2VJZCkgY29uc3Q7CkBAIC0yNTksNyArMjMyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IG1hcEF4aXMoaW50MzJfdCBkZXZpY2VJZCwgaW50IHNjYW5jb2RlLAogICAgICAgICAgICAgQXhpc0luZm8qIG91dEF4aXNJbmZvKSBjb25zdDsKIAotICAgIHZpcnR1YWwgdm9pZCBhZGRFeGNsdWRlZERldmljZShjb25zdCBjaGFyKiBkZXZpY2VOYW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXhjbHVkZWREZXZpY2VzKGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZGV2aWNlcyk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U2NhbkNvZGVTdGF0ZShpbnQzMl90IGRldmljZUlkLCBpbnQzMl90IHNjYW5Db2RlKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0S2V5Q29kZVN0YXRlKGludDMyX3QgZGV2aWNlSWQsIGludDMyX3Qga2V5Q29kZSkgY29uc3Q7CkBAIC0yNzYsMjIgKzI0OSwxNiBAQAogICAgIHZpcnR1YWwgdm9pZCBnZXRWaXJ0dWFsS2V5RGVmaW5pdGlvbnMoaW50MzJfdCBkZXZpY2VJZCwKICAgICAgICAgICAgIFZlY3RvcjxWaXJ0dWFsS2V5RGVmaW5pdGlvbj4mIG91dFZpcnR1YWxLZXlzKSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0UmVvcGVuRGV2aWNlcygpOworCisgICAgdmlydHVhbCB2b2lkIHdha2UoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RXZlbnRIdWIoKTsKLSAgICAKKwogcHJpdmF0ZToKLSAgICBib29sIG9wZW5QbGF0Zm9ybUlucHV0KHZvaWQpOwotCi0gICAgaW50IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlUGF0aCk7Ci0gICAgaW50IGNsb3NlRGV2aWNlKGNvbnN0IGNoYXIgKmRldmljZVBhdGgpOwotICAgIGludCBjbG9zZURldmljZUF0SW5kZXhMb2NrZWQoaW50IGluZGV4KTsKLSAgICBpbnQgc2NhbkRpcihjb25zdCBjaGFyICpkaXJuYW1lKTsKLSAgICBpbnQgcmVhZE5vdGlmeShpbnQgbmZkKTsKLQotICAgIHN0YXR1c190IG1FcnJvcjsKLQogICAgIHN0cnVjdCBEZXZpY2UgewogICAgICAgICBEZXZpY2UqIG5leHQ7CiAKQEAgLTMwMSw5ICsyNjgsMTQgQEAKICAgICAgICAgY29uc3QgSW5wdXREZXZpY2VJZGVudGlmaWVyIGlkZW50aWZpZXI7CiAKICAgICAgICAgdWludDMyX3QgY2xhc3NlczsKLSAgICAgICAgdWludDhfdCoga2V5Qml0bWFzazsKLSAgICAgICAgdWludDhfdCogcmVsQml0bWFzazsKLSAgICAgICAgdWludDhfdCogcHJvcEJpdG1hc2s7CisKKyAgICAgICAgdWludDhfdCBrZXlCaXRtYXNrWyhLRVlfTUFYICsgMSkgLyA4XTsKKyAgICAgICAgdWludDhfdCBhYnNCaXRtYXNrWyhBQlNfTUFYICsgMSkgLyA4XTsKKyAgICAgICAgdWludDhfdCByZWxCaXRtYXNrWyhSRUxfTUFYICsgMSkgLyA4XTsKKyAgICAgICAgdWludDhfdCBzd0JpdG1hc2tbKFNXX01BWCArIDEpIC8gOF07CisgICAgICAgIHVpbnQ4X3QgbGVkQml0bWFza1soTEVEX01BWCArIDEpIC8gOF07CisgICAgICAgIHVpbnQ4X3QgcHJvcEJpdG1hc2tbKElOUFVUX1BST1BfTUFYICsgMSkgLyA4XTsKKwogICAgICAgICBTdHJpbmc4IGNvbmZpZ3VyYXRpb25GaWxlOwogICAgICAgICBQcm9wZXJ0eU1hcCogY29uZmlndXJhdGlvbjsKICAgICAgICAgVmlydHVhbEtleU1hcCogdmlydHVhbEtleU1hcDsKQEAgLTMxNSw3ICsyODcsMTkgQEAKICAgICAgICAgdm9pZCBjbG9zZSgpOwogICAgIH07CiAKKyAgICBzdGF0dXNfdCBvcGVuRGV2aWNlTG9ja2VkKGNvbnN0IGNoYXIgKmRldmljZVBhdGgpOworICAgIHN0YXR1c190IGNsb3NlRGV2aWNlQnlQYXRoTG9ja2VkKGNvbnN0IGNoYXIgKmRldmljZVBhdGgpOworCisgICAgdm9pZCBjbG9zZURldmljZUxvY2tlZChEZXZpY2UqIGRldmljZSk7CisgICAgdm9pZCBjbG9zZUFsbERldmljZXNMb2NrZWQoKTsKKworICAgIHN0YXR1c190IHNjYW5EaXJMb2NrZWQoY29uc3QgY2hhciAqZGlybmFtZSk7CisgICAgdm9pZCBzY2FuRGV2aWNlc0xvY2tlZCgpOworICAgIHN0YXR1c190IHJlYWROb3RpZnlMb2NrZWQoKTsKKwogICAgIERldmljZSogZ2V0RGV2aWNlTG9ja2VkKGludDMyX3QgZGV2aWNlSWQpIGNvbnN0OworICAgIERldmljZSogZ2V0RGV2aWNlQnlQYXRoTG9ja2VkKGNvbnN0IGNoYXIqIGRldmljZVBhdGgpIGNvbnN0OworCiAgICAgYm9vbCBoYXNLZXljb2RlTG9ja2VkKERldmljZSogZGV2aWNlLCBpbnQga2V5Y29kZSkgY29uc3Q7CiAKICAgICBpbnQzMl90IGdldFNjYW5Db2RlU3RhdGVMb2NrZWQoRGV2aWNlKiBkZXZpY2UsIGludDMyX3Qgc2NhbkNvZGUpIGNvbnN0OwpAQCAtMzI0LDEzICszMDgsMTMgQEAKICAgICBib29sIG1hcmtTdXBwb3J0ZWRLZXlDb2Rlc0xvY2tlZChEZXZpY2UqIGRldmljZSwgc2l6ZV90IG51bUNvZGVzLAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCoga2V5Q29kZXMsIHVpbnQ4X3QqIG91dEZsYWdzKSBjb25zdDsKIAotICAgIHZvaWQgbG9hZENvbmZpZ3VyYXRpb24oRGV2aWNlKiBkZXZpY2UpOwotICAgIHN0YXR1c190IGxvYWRWaXJ0dWFsS2V5TWFwKERldmljZSogZGV2aWNlKTsKLSAgICBzdGF0dXNfdCBsb2FkS2V5TWFwKERldmljZSogZGV2aWNlKTsKLSAgICB2b2lkIHNldEtleWJvYXJkUHJvcGVydGllcyhEZXZpY2UqIGRldmljZSwgYm9vbCBidWlsdEluS2V5Ym9hcmQpOwotICAgIHZvaWQgY2xlYXJLZXlib2FyZFByb3BlcnRpZXMoRGV2aWNlKiBkZXZpY2UsIGJvb2wgYnVpbHRJbktleWJvYXJkKTsKKyAgICB2b2lkIGxvYWRDb25maWd1cmF0aW9uTG9ja2VkKERldmljZSogZGV2aWNlKTsKKyAgICBzdGF0dXNfdCBsb2FkVmlydHVhbEtleU1hcExvY2tlZChEZXZpY2UqIGRldmljZSk7CisgICAgc3RhdHVzX3QgbG9hZEtleU1hcExvY2tlZChEZXZpY2UqIGRldmljZSk7CisgICAgdm9pZCBzZXRLZXlib2FyZFByb3BlcnRpZXNMb2NrZWQoRGV2aWNlKiBkZXZpY2UsIGJvb2wgYnVpbHRJbktleWJvYXJkKTsKKyAgICB2b2lkIGNsZWFyS2V5Ym9hcmRQcm9wZXJ0aWVzTG9ja2VkKERldmljZSogZGV2aWNlLCBib29sIGJ1aWx0SW5LZXlib2FyZCk7CiAKLSAgICBib29sIGlzRXh0ZXJuYWxEZXZpY2UoRGV2aWNlKiBkZXZpY2UpOworICAgIGJvb2wgaXNFeHRlcm5hbERldmljZUxvY2tlZChEZXZpY2UqIGRldmljZSk7CiAKICAgICAvLyBQcm90ZWN0IGFsbCBpbnRlcm5hbCBzdGF0ZS4KICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtMzQxLDIzICszMjUsMzYgQEAKIAogICAgIGludDMyX3QgbU5leHREZXZpY2VJZDsKIAotICAgIC8vIFBhcmFsbGVsIGFycmF5cyBvZiBmZHMgYW5kIGRldmljZXMuCi0gICAgLy8gRmlyc3QgaW5kZXggaXMgcmVzZXJ2ZWQgZm9yIGlub3RpZnkuCi0gICAgVmVjdG9yPHN0cnVjdCBwb2xsZmQ+IG1GZHM7Ci0gICAgVmVjdG9yPERldmljZSo+IG1EZXZpY2VzOworICAgIEtleWVkVmVjdG9yPGludDMyX3QsIERldmljZSo+IG1EZXZpY2VzOwogCiAgICAgRGV2aWNlICptT3BlbmluZ0RldmljZXM7CiAgICAgRGV2aWNlICptQ2xvc2luZ0RldmljZXM7CiAKLSAgICBib29sIG1PcGVuZWQ7CiAgICAgYm9vbCBtTmVlZFRvU2VuZEZpbmlzaGVkRGV2aWNlU2NhbjsKLSAgICBMaXN0PFN0cmluZzg+IG1FeGNsdWRlZERldmljZXM7CisgICAgYm9vbCBtTmVlZFRvUmVvcGVuRGV2aWNlczsKKyAgICBib29sIG1OZWVkVG9TY2FuRGV2aWNlczsKKyAgICBWZWN0b3I8U3RyaW5nOD4gbUV4Y2x1ZGVkRGV2aWNlczsKIAotICAgIC8vIGRldmljZSBpZHMgdGhhdCByZXBvcnQgcGFydGljdWxhciBzd2l0Y2hlcy4KLSAgICBpbnQzMl90IG1Td2l0Y2hlc1tTV19NQVggKyAxXTsKKyAgICBpbnQgbUVwb2xsRmQ7CisgICAgaW50IG1JTm90aWZ5RmQ7CisgICAgaW50IG1XYWtlUmVhZFBpcGVGZDsKKyAgICBpbnQgbVdha2VXcml0ZVBpcGVGZDsKIAotICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgbmV4dCBmaWxlIGRlc2NyaXB0b3IgdGhhdCBuZWVkcyB0byBiZSByZWFkLgotICAgIHNpemVfdCBtSW5wdXRGZEluZGV4OworICAgIC8vIElkcyB1c2VkIGZvciBlcG9sbCBub3RpZmljYXRpb25zIG5vdCBhc3NvY2lhdGVkIHdpdGggZGV2aWNlcy4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRVBPTExfSURfSU5PVElGWSA9IDB4ODAwMDAwMDE7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEVQT0xMX0lEX1dBS0UgPSAweDgwMDAwMDAyOworCisgICAgLy8gRXBvbGwgRkQgbGlzdCBzaXplIGhpbnQuCisgICAgc3RhdGljIGNvbnN0IGludCBFUE9MTF9TSVpFX0hJTlQgPSA4OworCisgICAgLy8gTWF4aW11bSBudW1iZXIgb2Ygc2lnbmFsbGVkIEZEcyB0byBoYW5kbGUgYXQgYSB0aW1lLgorICAgIHN0YXRpYyBjb25zdCBpbnQgRVBPTExfTUFYX0VWRU5UUyA9IDE2OworCisgICAgLy8gVGhlIGFycmF5IG9mIHBlbmRpbmcgZXBvbGwgZXZlbnRzIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5leHQgZXZlbnQgdG8gYmUgaGFuZGxlZC4KKyAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgbVBlbmRpbmdFdmVudEl0ZW1zW0VQT0xMX01BWF9FVkVOVFNdOworICAgIHNpemVfdCBtUGVuZGluZ0V2ZW50Q291bnQ7CisgICAgc2l6ZV90IG1QZW5kaW5nRXZlbnRJbmRleDsKKyAgICBib29sIG1QZW5kaW5nSU5vdGlmeTsKIAogICAgIC8vIFNldCB0byB0aGUgbnVtYmVyIG9mIENQVXMuCiAgICAgaW50MzJfdCBtTnVtQ3B1czsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2lucHV0L0lucHV0RGlzcGF0Y2hlci5jcHAgYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dERpc3BhdGNoZXIuY3BwCmluZGV4IDhjNTM1ZDYuLjRhNTBkOGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L0lucHV0RGlzcGF0Y2hlci5jcHAKKysrIGIvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmNwcApAQCAtMjI4LDEzICsyMjgsMTQgQEAKIAogICAgIG1LZXlSZXBlYXRTdGF0ZS5sYXN0S2V5RW50cnkgPSBOVUxMOwogCi0gICAgaW50MzJfdCBtYXhFdmVudHNQZXJTZWNvbmQgPSBwb2xpY3ktPmdldE1heEV2ZW50c1BlclNlY29uZCgpOwotICAgIG1UaHJvdHRsZVN0YXRlLm1pblRpbWVCZXR3ZWVuRXZlbnRzID0gMTAwMDAwMDAwMExMIC8gbWF4RXZlbnRzUGVyU2Vjb25kOworICAgIHBvbGljeS0+Z2V0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24oJm1Db25maWcpOworCisgICAgbVRocm90dGxlU3RhdGUubWluVGltZUJldHdlZW5FdmVudHMgPSAxMDAwMDAwMDAwTEwgLyBtQ29uZmlnLm1heEV2ZW50c1BlclNlY29uZDsKICAgICBtVGhyb3R0bGVTdGF0ZS5sYXN0RGV2aWNlSWQgPSAtMTsKIAogI2lmIERFQlVHX1RIUk9UVExJTkcKICAgICBtVGhyb3R0bGVTdGF0ZS5vcmlnaW5hbFNhbXBsZUNvdW50ID0gMDsKLSAgICBMT0dEKCJUaHJvdHRsaW5nIC0gTWF4IGV2ZW50cyBwZXIgc2Vjb25kID0gJWQiLCBtYXhFdmVudHNQZXJTZWNvbmQpOworICAgIExPR0QoIlRocm90dGxpbmcgLSBNYXggZXZlbnRzIHBlciBzZWNvbmQgPSAlZCIsIG1Db25maWcubWF4RXZlbnRzUGVyU2Vjb25kKTsKICNlbmRpZgogfQogCkBAIC0yNTMsMTMgKzI1NCwxMCBAQAogfQogCiB2b2lkIElucHV0RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hPbmNlKCkgewotICAgIG5zZWNzX3Qga2V5UmVwZWF0VGltZW91dCA9IG1Qb2xpY3ktPmdldEtleVJlcGVhdFRpbWVvdXQoKTsKLSAgICBuc2Vjc190IGtleVJlcGVhdERlbGF5ID0gbVBvbGljeS0+Z2V0S2V5UmVwZWF0RGVsYXkoKTsKLQogICAgIG5zZWNzX3QgbmV4dFdha2V1cFRpbWUgPSBMT05HX0xPTkdfTUFYOwogICAgIHsgLy8gYWNxdWlyZSBsb2NrCiAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgIGRpc3BhdGNoT25jZUlubmVyTG9ja2VkKGtleVJlcGVhdFRpbWVvdXQsIGtleVJlcGVhdERlbGF5LCAmIG5leHRXYWtldXBUaW1lKTsKKyAgICAgICAgZGlzcGF0Y2hPbmNlSW5uZXJMb2NrZWQoJm5leHRXYWtldXBUaW1lKTsKIAogICAgICAgICBpZiAocnVuQ29tbWFuZHNMb2NrZWRJbnRlcnJ1cHRpYmxlKCkpIHsKICAgICAgICAgICAgIG5leHRXYWtldXBUaW1lID0gTE9OR19MT05HX01JTjsgIC8vIGZvcmNlIG5leHQgcG9sbCB0byB3YWtlIHVwIGltbWVkaWF0ZWx5CkBAIC0yNzIsMTQgKzI3MCwxMyBAQAogICAgIG1Mb29wZXItPnBvbGxPbmNlKHRpbWVvdXRNaWxsaXMpOwogfQogCi12b2lkIElucHV0RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hPbmNlSW5uZXJMb2NrZWQobnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0LAotICAgICAgICBuc2Vjc190IGtleVJlcGVhdERlbGF5LCBuc2Vjc190KiBuZXh0V2FrZXVwVGltZSkgewordm9pZCBJbnB1dERpc3BhdGNoZXI6OmRpc3BhdGNoT25jZUlubmVyTG9ja2VkKG5zZWNzX3QqIG5leHRXYWtldXBUaW1lKSB7CiAgICAgbnNlY3NfdCBjdXJyZW50VGltZSA9IG5vdygpOwogCiAgICAgLy8gUmVzZXQgdGhlIGtleSByZXBlYXQgdGltZXIgd2hlbmV2ZXIgd2UgZGlzYWxsb3cga2V5IGV2ZW50cywgZXZlbiBpZiB0aGUgbmV4dCBldmVudAogICAgIC8vIGlzIG5vdCBhIGtleS4gIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgd2UgYWJvcnQgYSBrZXkgcmVwZWF0IGlmIHRoZSBkZXZpY2UgaXMganVzdCBjb21pbmcKICAgICAvLyBvdXQgb2Ygc2xlZXAuCi0gICAgaWYgKGtleVJlcGVhdFRpbWVvdXQgPCAwKSB7CisgICAgaWYgKCFtUG9saWN5LT5pc0tleVJlcGVhdEVuYWJsZWQoKSkgewogICAgICAgICByZXNldEtleVJlcGVhdExvY2tlZCgpOwogICAgIH0KIApAQCAtMzEzLDcgKzMxMCw3IEBACiAgICAgICAgICAgICAvLyBTeW50aGVzaXplIGEga2V5IHJlcGVhdCBpZiBhcHByb3ByaWF0ZS4KICAgICAgICAgICAgIGlmIChtS2V5UmVwZWF0U3RhdGUubGFzdEtleUVudHJ5KSB7CiAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lID49IG1LZXlSZXBlYXRTdGF0ZS5uZXh0UmVwZWF0VGltZSkgewotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0V2ZW50ID0gc3ludGhlc2l6ZUtleVJlcGVhdExvY2tlZChjdXJyZW50VGltZSwga2V5UmVwZWF0RGVsYXkpOworICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0V2ZW50ID0gc3ludGhlc2l6ZUtleVJlcGVhdExvY2tlZChjdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1LZXlSZXBlYXRTdGF0ZS5uZXh0UmVwZWF0VGltZSA8ICpuZXh0V2FrZXVwVGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgKm5leHRXYWtldXBUaW1lID0gbUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lOwpAQCAtNDMyLDggKzQyOSw3IEBACiAgICAgICAgIGlmIChkcm9wUmVhc29uID09IERST1BfUkVBU09OX05PVF9EUk9QUEVEICYmIG1OZXh0VW5ibG9ja2VkRXZlbnQpIHsKICAgICAgICAgICAgIGRyb3BSZWFzb24gPSBEUk9QX1JFQVNPTl9CTE9DS0VEOwogICAgICAgICB9Ci0gICAgICAgIGRvbmUgPSBkaXNwYXRjaEtleUxvY2tlZChjdXJyZW50VGltZSwgdHlwZWRFbnRyeSwga2V5UmVwZWF0VGltZW91dCwKLSAgICAgICAgICAgICAgICAmZHJvcFJlYXNvbiwgbmV4dFdha2V1cFRpbWUpOworICAgICAgICBkb25lID0gZGlzcGF0Y2hLZXlMb2NrZWQoY3VycmVudFRpbWUsIHR5cGVkRW50cnksICZkcm9wUmVhc29uLCBuZXh0V2FrZXVwVGltZSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtNjkyLDggKzY4OCw3IEBACiAgICAgfQogfQogCi1JbnB1dERpc3BhdGNoZXI6OktleUVudHJ5KiBJbnB1dERpc3BhdGNoZXI6OnN5bnRoZXNpemVLZXlSZXBlYXRMb2NrZWQoCi0gICAgICAgIG5zZWNzX3QgY3VycmVudFRpbWUsIG5zZWNzX3Qga2V5UmVwZWF0RGVsYXkpIHsKK0lucHV0RGlzcGF0Y2hlcjo6S2V5RW50cnkqIElucHV0RGlzcGF0Y2hlcjo6c3ludGhlc2l6ZUtleVJlcGVhdExvY2tlZChuc2Vjc190IGN1cnJlbnRUaW1lKSB7CiAgICAgS2V5RW50cnkqIGVudHJ5ID0gbUtleVJlcGVhdFN0YXRlLmxhc3RLZXlFbnRyeTsKIAogICAgIC8vIFJldXNlIHRoZSByZXBlYXRlZCBrZXkgZW50cnkgaWYgaXQgaXMgb3RoZXJ3aXNlIHVucmVmZXJlbmNlZC4KQEAgLTcyMSw3ICs3MTYsNyBAQAogICAgIC8vIG1LZXlSZXBlYXRTdGF0ZS5sYXN0S2V5RW50cnkgaW4gYWRkaXRpb24gdG8gdGhlIG9uZSB3ZSByZXR1cm4uCiAgICAgZW50cnktPnJlZkNvdW50ICs9IDE7CiAKLSAgICBtS2V5UmVwZWF0U3RhdGUubmV4dFJlcGVhdFRpbWUgPSBjdXJyZW50VGltZSArIGtleVJlcGVhdERlbGF5OworICAgIG1LZXlSZXBlYXRTdGF0ZS5uZXh0UmVwZWF0VGltZSA9IGN1cnJlbnRUaW1lICsgbUNvbmZpZy5rZXlSZXBlYXREZWxheTsKICAgICByZXR1cm4gZW50cnk7CiB9CiAKQEAgLTc0MSw4ICs3MzYsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIElucHV0RGlzcGF0Y2hlcjo6ZGlzcGF0Y2hLZXlMb2NrZWQoCi0gICAgICAgIG5zZWNzX3QgY3VycmVudFRpbWUsIEtleUVudHJ5KiBlbnRyeSwgbnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0LAorYm9vbCBJbnB1dERpc3BhdGNoZXI6OmRpc3BhdGNoS2V5TG9ja2VkKG5zZWNzX3QgY3VycmVudFRpbWUsIEtleUVudHJ5KiBlbnRyeSwKICAgICAgICAgRHJvcFJlYXNvbiogZHJvcFJlYXNvbiwgbnNlY3NfdCogbmV4dFdha2V1cFRpbWUpIHsKICAgICAvLyBQcmVwcm9jZXNzaW5nLgogICAgIGlmICghIGVudHJ5LT5kaXNwYXRjaEluUHJvZ3Jlc3MpIHsKQEAgLTc2Miw3ICs3NTYsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBOb3QgYSByZXBlYXQuICBTYXZlIGtleSBkb3duIHN0YXRlIGluIGNhc2Ugd2UgZG8gc2VlIGEgcmVwZWF0IGxhdGVyLgogICAgICAgICAgICAgICAgIHJlc2V0S2V5UmVwZWF0TG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgbUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lID0gZW50cnktPmV2ZW50VGltZSArIGtleVJlcGVhdFRpbWVvdXQ7CisgICAgICAgICAgICAgICAgbUtleVJlcGVhdFN0YXRlLm5leHRSZXBlYXRUaW1lID0gZW50cnktPmV2ZW50VGltZSArIG1Db25maWcua2V5UmVwZWF0VGltZW91dDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1LZXlSZXBlYXRTdGF0ZS5sYXN0S2V5RW50cnkgPSBlbnRyeTsKICAgICAgICAgICAgIGVudHJ5LT5yZWZDb3VudCArPSAxOwpAQCAtMTQxOCw2ICsxNDEyLDUwIEBACiAgICAgICAgICAgICBpbmplY3Rpb25SZXN1bHQgPSBJTlBVVF9FVkVOVF9JTkpFQ1RJT05fRkFJTEVEOwogICAgICAgICAgICAgZ290byBGYWlsZWQ7CiAgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRvdWNoZXMgc2hvdWxkIHNsaXAgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBmb3JlZ3JvdW5kIHdpbmRvdy4KKyAgICAgICAgaWYgKG1hc2tlZEFjdGlvbiA9PSBBTU9USU9OX0VWRU5UX0FDVElPTl9NT1ZFCisgICAgICAgICAgICAgICAgJiYgZW50cnktPnBvaW50ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgJiYgbVRlbXBUb3VjaFN0YXRlLmlzU2xpcHBlcnkoKSkgeworICAgICAgICAgICAgY29uc3QgTW90aW9uU2FtcGxlKiBzYW1wbGUgPSAmZW50cnktPmZpcnN0U2FtcGxlOworICAgICAgICAgICAgaW50MzJfdCB4ID0gaW50MzJfdChzYW1wbGUtPnBvaW50ZXJDb29yZHNbMF0uZ2V0QXhpc1ZhbHVlKEFNT1RJT05fRVZFTlRfQVhJU19YKSk7CisgICAgICAgICAgICBpbnQzMl90IHkgPSBpbnQzMl90KHNhbXBsZS0+cG9pbnRlckNvb3Jkc1swXS5nZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1kpKTsKKworICAgICAgICAgICAgY29uc3QgSW5wdXRXaW5kb3cqIG9sZFRvdWNoZWRXaW5kb3cgPSBtVGVtcFRvdWNoU3RhdGUuZ2V0Rmlyc3RGb3JlZ3JvdW5kV2luZG93KCk7CisgICAgICAgICAgICBjb25zdCBJbnB1dFdpbmRvdyogbmV3VG91Y2hlZFdpbmRvdyA9IGZpbmRUb3VjaGVkV2luZG93QXRMb2NrZWQoeCwgeSk7CisgICAgICAgICAgICBpZiAob2xkVG91Y2hlZFdpbmRvdyAhPSBuZXdUb3VjaGVkV2luZG93ICYmIG5ld1RvdWNoZWRXaW5kb3cpIHsKKyNpZiBERUJVR19GT0NVUworICAgICAgICAgICAgICAgIExPR0QoIlRvdWNoIGlzIHNsaXBwaW5nIG91dCBvZiB3aW5kb3cgJXMgaW50byB3aW5kb3cgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZFRvdWNoZWRXaW5kb3ctPm5hbWUuc3RyaW5nKCksIG5ld1RvdWNoZWRXaW5kb3ctPm5hbWUuc3RyaW5nKCkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gTWFrZSBhIHNsaXBwZXJ5IGV4aXQgZnJvbSB0aGUgb2xkIHdpbmRvdy4KKyAgICAgICAgICAgICAgICBtVGVtcFRvdWNoU3RhdGUuYWRkT3JVcGRhdGVXaW5kb3cob2xkVG91Y2hlZFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VYSVQsIEJpdFNldDMyKDApKTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBzbGlwcGVyeSBlbnRyYW5jZSBpbnRvIHRoZSBuZXcgd2luZG93LgorICAgICAgICAgICAgICAgIGlmIChuZXdUb3VjaGVkV2luZG93LT5zdXBwb3J0c1NwbGl0VG91Y2goKSkgeworICAgICAgICAgICAgICAgICAgICBpc1NwbGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRhcmdldEZsYWdzID0gSW5wdXRUYXJnZXQ6OkZMQUdfRk9SRUdST1VORAorICAgICAgICAgICAgICAgICAgICAgICAgfCBJbnB1dFRhcmdldDo6RkxBR19ESVNQQVRDSF9BU19TTElQUEVSWV9FTlRFUjsKKyAgICAgICAgICAgICAgICBpZiAoaXNTcGxpdCkgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRGbGFncyB8PSBJbnB1dFRhcmdldDo6RkxBR19TUExJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93T2JzY3VyZWRBdFBvaW50TG9ja2VkKG5ld1RvdWNoZWRXaW5kb3csIHgsIHkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldEZsYWdzIHw9IElucHV0VGFyZ2V0OjpGTEFHX1dJTkRPV19JU19PQlNDVVJFRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBCaXRTZXQzMiBwb2ludGVySWRzOworICAgICAgICAgICAgICAgIGlmIChpc1NwbGl0KSB7CisgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJJZHMubWFya0JpdChlbnRyeS0+cG9pbnRlclByb3BlcnRpZXNbMF0uaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVGVtcFRvdWNoU3RhdGUuYWRkT3JVcGRhdGVXaW5kb3cobmV3VG91Y2hlZFdpbmRvdywgdGFyZ2V0RmxhZ3MsIHBvaW50ZXJJZHMpOworCisgICAgICAgICAgICAgICAgLy8gU3BsaXQgdGhlIGJhdGNoIGhlcmUgc28gd2Ugc2VuZCBleGFjdGx5IG9uZSBzYW1wbGUuCisgICAgICAgICAgICAgICAgKm91dFNwbGl0QmF0Y2hBZnRlclNhbXBsZSA9ICZlbnRyeS0+Zmlyc3RTYW1wbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobmV3SG92ZXJXaW5kb3cgIT0gbUxhc3RIb3ZlcldpbmRvdykgewpAQCAtMTQ3MCw2ICsxNTA4LDIzIEBACiAgICAgICAgIGluamVjdGlvblBlcm1pc3Npb24gPSBJTkpFQ1RJT05fUEVSTUlTU0lPTl9HUkFOVEVEOwogICAgIH0KIAorICAgIC8vIENoZWNrIHdoZXRoZXIgd2luZG93cyBsaXN0ZW5pbmcgZm9yIG91dHNpZGUgdG91Y2hlcyBhcmUgb3duZWQgYnkgdGhlIHNhbWUgVUlELiBJZiBpdCBpcworICAgIC8vIHNldCB0aGUgcG9saWN5IGZsYWcgdGhhdCB3ZSB3aWxsIG5vdCByZXZlYWwgY29vcmRpbmF0ZSBpbmZvcm1hdGlvbiB0byB0aGlzIHdpbmRvdy4KKyAgICBpZiAobWFza2VkQWN0aW9uID09IEFNT1RJT05fRVZFTlRfQUNUSU9OX0RPV04pIHsKKyAgICAgICAgY29uc3QgSW5wdXRXaW5kb3cqIGZvcmVncm91bmRXaW5kb3cgPSBtVGVtcFRvdWNoU3RhdGUuZ2V0Rmlyc3RGb3JlZ3JvdW5kV2luZG93KCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgZm9yZWdyb3VuZFdpbmRvd1VpZCA9IGZvcmVncm91bmRXaW5kb3ctPm93bmVyVWlkOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UZW1wVG91Y2hTdGF0ZS53aW5kb3dzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBUb3VjaGVkV2luZG93JiB0b3VjaGVkV2luZG93ID0gbVRlbXBUb3VjaFN0YXRlLndpbmRvd3NbaV07CisgICAgICAgICAgICBpZiAodG91Y2hlZFdpbmRvdy50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX09VVFNJREUpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBJbnB1dFdpbmRvdyogaW5wdXRXaW5kb3cgPSB0b3VjaGVkV2luZG93LndpbmRvdzsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRXaW5kb3ctPm93bmVyVWlkICE9IGZvcmVncm91bmRXaW5kb3dVaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRlbXBUb3VjaFN0YXRlLmFkZE9yVXBkYXRlV2luZG93KGlucHV0V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0VGFyZ2V0OjpGTEFHX1pFUk9fQ09PUkRTLCBCaXRTZXQzMigwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gRW5zdXJlIGFsbCB0b3VjaGVkIGZvcmVncm91bmQgd2luZG93cyBhcmUgcmVhZHkgZm9yIG5ldyBpbnB1dC4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UZW1wVG91Y2hTdGF0ZS53aW5kb3dzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IFRvdWNoZWRXaW5kb3cmIHRvdWNoZWRXaW5kb3cgPSBtVGVtcFRvdWNoU3RhdGUud2luZG93c1tpXTsKQEAgLTE4NzMsNiArMTkyOCwxMCBAQAogICAgICAgICAgICAgcmVzdW1lV2l0aEFwcGVuZGVkTW90aW9uU2FtcGxlLCBJbnB1dFRhcmdldDo6RkxBR19ESVNQQVRDSF9BU19IT1ZFUl9FTlRFUik7CiAgICAgZW5xdWV1ZURpc3BhdGNoRW50cnlMb2NrZWQoY29ubmVjdGlvbiwgZXZlbnRFbnRyeSwgaW5wdXRUYXJnZXQsCiAgICAgICAgICAgICByZXN1bWVXaXRoQXBwZW5kZWRNb3Rpb25TYW1wbGUsIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX0lTKTsKKyAgICBlbnF1ZXVlRGlzcGF0Y2hFbnRyeUxvY2tlZChjb25uZWN0aW9uLCBldmVudEVudHJ5LCBpbnB1dFRhcmdldCwKKyAgICAgICAgICAgIHJlc3VtZVdpdGhBcHBlbmRlZE1vdGlvblNhbXBsZSwgSW5wdXRUYXJnZXQ6OkZMQUdfRElTUEFUQ0hfQVNfU0xJUFBFUllfRVhJVCk7CisgICAgZW5xdWV1ZURpc3BhdGNoRW50cnlMb2NrZWQoY29ubmVjdGlvbiwgZXZlbnRFbnRyeSwgaW5wdXRUYXJnZXQsCisgICAgICAgICAgICByZXN1bWVXaXRoQXBwZW5kZWRNb3Rpb25TYW1wbGUsIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VOVEVSKTsKIAogICAgIC8vIElmIHRoZSBvdXRib3VuZCBxdWV1ZSB3YXMgcHJldmlvdXNseSBlbXB0eSwgc3RhcnQgdGhlIGRpc3BhdGNoIGN5Y2xlIGdvaW5nLgogICAgIGlmICh3YXNFbXB0eSAmJiAhY29ubmVjdGlvbi0+b3V0Ym91bmRRdWV1ZS5pc0VtcHR5KCkpIHsKQEAgLTE5NzQsNiArMjAzMywxMCBAQAogICAgICAgICAgICAgYWN0aW9uID0gQU1PVElPTl9FVkVOVF9BQ1RJT05fSE9WRVJfRVhJVDsKICAgICAgICAgfSBlbHNlIGlmIChkaXNwYXRjaEVudHJ5LT50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX0hPVkVSX0VOVEVSKSB7CiAgICAgICAgICAgICBhY3Rpb24gPSBBTU9USU9OX0VWRU5UX0FDVElPTl9IT1ZFUl9FTlRFUjsKKyAgICAgICAgfSBlbHNlIGlmIChkaXNwYXRjaEVudHJ5LT50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VYSVQpIHsKKyAgICAgICAgICAgIGFjdGlvbiA9IEFNT1RJT05fRVZFTlRfQUNUSU9OX0NBTkNFTDsKKyAgICAgICAgfSBlbHNlIGlmIChkaXNwYXRjaEVudHJ5LT50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VOVEVSKSB7CisgICAgICAgICAgICBhY3Rpb24gPSBBTU9USU9OX0VWRU5UX0FDVElPTl9ET1dOOwogICAgICAgICB9CiAgICAgICAgIGlmIChkaXNwYXRjaEVudHJ5LT50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX1dJTkRPV19JU19PQlNDVVJFRCkgewogICAgICAgICAgICAgZmxhZ3MgfD0gQU1PVElPTl9FVkVOVF9GTEFHX1dJTkRPV19JU19PQlNDVVJFRDsKQEAgLTE5OTMsNyArMjA1Niw4IEBACiAKICAgICAgICAgLy8gU2V0IHRoZSBYIGFuZCBZIG9mZnNldCBkZXBlbmRpbmcgb24gdGhlIGlucHV0IHNvdXJjZS4KICAgICAgICAgZmxvYXQgeE9mZnNldCwgeU9mZnNldCwgc2NhbGVGYWN0b3I7Ci0gICAgICAgIGlmIChtb3Rpb25FbnRyeS0+c291cmNlICYgQUlOUFVUX1NPVVJDRV9DTEFTU19QT0lOVEVSKSB7CisgICAgICAgIGlmIChtb3Rpb25FbnRyeS0+c291cmNlICYgQUlOUFVUX1NPVVJDRV9DTEFTU19QT0lOVEVSCisgICAgICAgICAgICAgICAgJiYgIShkaXNwYXRjaEVudHJ5LT50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX1pFUk9fQ09PUkRTKSkgewogICAgICAgICAgICAgc2NhbGVGYWN0b3IgPSBkaXNwYXRjaEVudHJ5LT5zY2FsZUZhY3RvcjsKICAgICAgICAgICAgIHhPZmZzZXQgPSBkaXNwYXRjaEVudHJ5LT54T2Zmc2V0ICogc2NhbGVGYWN0b3I7CiAgICAgICAgICAgICB5T2Zmc2V0ID0gZGlzcGF0Y2hFbnRyeS0+eU9mZnNldCAqIHNjYWxlRmFjdG9yOwpAQCAtMjAwOCw2ICsyMDcyLDE0IEBACiAgICAgICAgICAgICB4T2Zmc2V0ID0gMC4wZjsKICAgICAgICAgICAgIHlPZmZzZXQgPSAwLjBmOwogICAgICAgICAgICAgc2NhbGVGYWN0b3IgPSAxLjBmOworCisgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRoZSBkaXNwYXRjaCB0YXJnZXQgdG8ga25vdy4KKyAgICAgICAgICAgIGlmIChkaXNwYXRjaEVudHJ5LT50YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX1pFUk9fQ09PUkRTKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtb3Rpb25FbnRyeS0+cG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVkQ29vcmRzW2ldLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVzaW5nQ29vcmRzID0gc2NhbGVkQ29vcmRzOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb25uZWN0aW9uJ3MgaW5wdXQgc3RhdGUuCkBAIC0yMDM2LDkgKzIxMDgsMTEgQEAKICAgICAgICAgICAgIE1vdGlvblNhbXBsZSogbmV4dE1vdGlvblNhbXBsZSA9IGZpcnN0TW90aW9uU2FtcGxlLT5uZXh0OwogICAgICAgICAgICAgZm9yICg7IG5leHRNb3Rpb25TYW1wbGUgIT0gTlVMTDsgbmV4dE1vdGlvblNhbXBsZSA9IG5leHRNb3Rpb25TYW1wbGUtPm5leHQpIHsKICAgICAgICAgICAgICAgICBpZiAodXNpbmdDb29yZHMgPT0gc2NhbGVkQ29vcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbW90aW9uRW50cnktPnBvaW50ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRDb29yZHNbaV0gPSBuZXh0TW90aW9uU2FtcGxlLT5wb2ludGVyQ29vcmRzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkQ29vcmRzW2ldLnNjYWxlKHNjYWxlRmFjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoZGlzcGF0Y2hFbnRyeS0+dGFyZ2V0RmxhZ3MgJiBJbnB1dFRhcmdldDo6RkxBR19aRVJPX0NPT1JEUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbW90aW9uRW50cnktPnBvaW50ZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkQ29vcmRzW2ldID0gbmV4dE1vdGlvblNhbXBsZS0+cG9pbnRlckNvb3Jkc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRDb29yZHNbaV0uc2NhbGUoc2NhbGVGYWN0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdXNpbmdDb29yZHMgPSBuZXh0TW90aW9uU2FtcGxlLT5wb2ludGVyQ29vcmRzOwpAQCAtMzMyMSw2ICszMzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgd2luZG93LmZyYW1lUmlnaHQsIHdpbmRvdy5mcmFtZUJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjYWxlRmFjdG9yKTsKICAgICAgICAgICAgIGR1bXBSZWdpb24oZHVtcCwgd2luZG93LnRvdWNoYWJsZVJlZ2lvbik7CisgICAgICAgICAgICBkdW1wLmFwcGVuZEZvcm1hdCgiLCBpbnB1dEZlYXR1cmVzPTB4JTA4eCIsIHdpbmRvdy5pbnB1dEZlYXR1cmVzKTsKICAgICAgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KCIsIG93bmVyUGlkPSVkLCBvd25lclVpZD0lZCwgZGlzcGF0Y2hpbmdUaW1lb3V0PSUwLjNmbXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vd25lclBpZCwgd2luZG93Lm93bmVyVWlkLAogICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGlzcGF0Y2hpbmdUaW1lb3V0IC8gMTAwMDAwMC4wKTsKQEAgLTM3NzcsNiArMzg1MiwxMSBAQAogdm9pZCBJbnB1dERpc3BhdGNoZXI6OmR1bXAoU3RyaW5nOCYgZHVtcCkgewogICAgIGR1bXAuYXBwZW5kKCJJbnB1dCBEaXNwYXRjaGVyIFN0YXRlOlxuIik7CiAgICAgZHVtcERpc3BhdGNoU3RhdGVMb2NrZWQoZHVtcCk7CisKKyAgICBkdW1wLmFwcGVuZChJTkRFTlQgIkNvbmZpZ3VyYXRpb246XG4iKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICJNYXhFdmVudHNQZXJTZWNvbmQ6ICVkXG4iLCBtQ29uZmlnLm1heEV2ZW50c1BlclNlY29uZCk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiS2V5UmVwZWF0RGVsYXk6ICUwLjFmbXNcbiIsIG1Db25maWcua2V5UmVwZWF0RGVsYXkgKiAwLjAwMDAwMWYpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIktleVJlcGVhdFRpbWVvdXQ6ICUwLjFmbXNcbiIsIG1Db25maWcua2V5UmVwZWF0VGltZW91dCAqIDAuMDAwMDAxZik7CiB9CiAKIApAQCAtNDM1OSw2ICs0NDM5LDkgQEAKICAgICAgICAgVG91Y2hlZFdpbmRvdyYgdG91Y2hlZFdpbmRvdyA9IHdpbmRvd3MuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgaWYgKHRvdWNoZWRXaW5kb3cud2luZG93ID09IHdpbmRvdykgewogICAgICAgICAgICAgdG91Y2hlZFdpbmRvdy50YXJnZXRGbGFncyB8PSB0YXJnZXRGbGFnczsKKyAgICAgICAgICAgIGlmICh0YXJnZXRGbGFncyAmIElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VYSVQpIHsKKyAgICAgICAgICAgICAgICB0b3VjaGVkV2luZG93LnRhcmdldEZsYWdzICY9IH5JbnB1dFRhcmdldDo6RkxBR19ESVNQQVRDSF9BU19JUzsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRvdWNoZWRXaW5kb3cucG9pbnRlcklkcy52YWx1ZSB8PSBwb2ludGVySWRzLnZhbHVlOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC00Mzc2LDcgKzQ0NTksOCBAQAogdm9pZCBJbnB1dERpc3BhdGNoZXI6OlRvdWNoU3RhdGU6OmZpbHRlck5vbkFzSXNUb3VjaFdpbmRvd3MoKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgd2luZG93cy5zaXplKCk7ICkgewogICAgICAgICBUb3VjaGVkV2luZG93JiB3aW5kb3cgPSB3aW5kb3dzLmVkaXRJdGVtQXQoaSk7Ci0gICAgICAgIGlmICh3aW5kb3cudGFyZ2V0RmxhZ3MgJiBJbnB1dFRhcmdldDo6RkxBR19ESVNQQVRDSF9BU19JUykgeworICAgICAgICBpZiAod2luZG93LnRhcmdldEZsYWdzICYgKElucHV0VGFyZ2V0OjpGTEFHX0RJU1BBVENIX0FTX0lTCisgICAgICAgICAgICAgICAgfCBJbnB1dFRhcmdldDo6RkxBR19ESVNQQVRDSF9BU19TTElQUEVSWV9FTlRFUikpIHsKICAgICAgICAgICAgIHdpbmRvdy50YXJnZXRGbGFncyAmPSB+SW5wdXRUYXJnZXQ6OkZMQUdfRElTUEFUQ0hfTUFTSzsKICAgICAgICAgICAgIHdpbmRvdy50YXJnZXRGbGFncyB8PSBJbnB1dFRhcmdldDo6RkxBR19ESVNQQVRDSF9BU19JUzsKICAgICAgICAgICAgIGkgKz0gMTsKQEAgLTQzODYsMTUgKzQ0NzAsMzIgQEAKICAgICB9CiB9CiAKLWNvbnN0IElucHV0V2luZG93KiBJbnB1dERpc3BhdGNoZXI6OlRvdWNoU3RhdGU6OmdldEZpcnN0Rm9yZWdyb3VuZFdpbmRvdygpIHsKK2NvbnN0IElucHV0V2luZG93KiBJbnB1dERpc3BhdGNoZXI6OlRvdWNoU3RhdGU6OmdldEZpcnN0Rm9yZWdyb3VuZFdpbmRvdygpIGNvbnN0IHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdpbmRvd3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHdpbmRvd3NbaV0udGFyZ2V0RmxhZ3MgJiBJbnB1dFRhcmdldDo6RkxBR19GT1JFR1JPVU5EKSB7Ci0gICAgICAgICAgICByZXR1cm4gd2luZG93c1tpXS53aW5kb3c7CisgICAgICAgIGNvbnN0IFRvdWNoZWRXaW5kb3cmIHdpbmRvdyA9IHdpbmRvd3MuaXRlbUF0KGkpOworICAgICAgICBpZiAod2luZG93LnRhcmdldEZsYWdzICYgSW5wdXRUYXJnZXQ6OkZMQUdfRk9SRUdST1VORCkgeworICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy53aW5kb3c7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK2Jvb2wgSW5wdXREaXNwYXRjaGVyOjpUb3VjaFN0YXRlOjppc1NsaXBwZXJ5KCkgY29uc3QgeworICAgIC8vIE11c3QgaGF2ZSBleGFjdGx5IG9uZSBmb3JlZ3JvdW5kIHdpbmRvdy4KKyAgICBib29sIGhhdmVTbGlwcGVyeUZvcmVncm91bmRXaW5kb3cgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdpbmRvd3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgVG91Y2hlZFdpbmRvdyYgd2luZG93ID0gd2luZG93cy5pdGVtQXQoaSk7CisgICAgICAgIGlmICh3aW5kb3cudGFyZ2V0RmxhZ3MgJiBJbnB1dFRhcmdldDo6RkxBR19GT1JFR1JPVU5EKSB7CisgICAgICAgICAgICBpZiAoaGF2ZVNsaXBwZXJ5Rm9yZWdyb3VuZFdpbmRvdworICAgICAgICAgICAgICAgICAgICB8fCAhKHdpbmRvdy53aW5kb3ctPmxheW91dFBhcmFtc0ZsYWdzICYgSW5wdXRXaW5kb3c6OkZMQUdfU0xJUFBFUlkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGF2ZVNsaXBwZXJ5Rm9yZWdyb3VuZFdpbmRvdyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhhdmVTbGlwcGVyeUZvcmVncm91bmRXaW5kb3c7Cit9CisKIAogLy8gLS0tIElucHV0RGlzcGF0Y2hlclRocmVhZCAtLS0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvSW5wdXREaXNwYXRjaGVyLmggYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dERpc3BhdGNoZXIuaAppbmRleCA5YWM1Yjc1Li42NzZkMTYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9pbnB1dC9JbnB1dERpc3BhdGNoZXIuaAorKysgYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dERpc3BhdGNoZXIuaApAQCAtOTYsNiArOTYsMTIgQEAKICAgICAgICAgLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IGEgbW90aW9uIGV2ZW50IGlzIGJlaW5nIHNwbGl0IGFjcm9zcyBtdWx0aXBsZSB3aW5kb3dzLiAqLwogICAgICAgICBGTEFHX1NQTElUID0gMSA8PCAyLAogCisgICAgICAgIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgcG9pbnRlciBjb29yZGluYXRlcyBkaXNwYXRjaGVkIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgKiB3aWxsIGJlIHplcm9lZCBvdXQgdG8gYXZvaWQgcmV2ZWFsaW5nIGluZm9ybWF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLiBUaGlzIGlzCisgICAgICAgICAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBGTEFHX0RJU1BBVENIX0FTX09VVFNJREUgdG8gcHJldmVudCBhcHBzIG5vdCBzaGFyaW5nCisgICAgICAgICAqIHRoZSBzYW1lIFVJRCBmcm9tIHdhdGNoaW5nIGFsbCB0b3VjaGVzLiAqLworICAgICAgICBGTEFHX1pFUk9fQ09PUkRTID0gMSA8PCAzLAorCiAgICAgICAgIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgZXZlbnQgc2hvdWxkIGJlIHNlbnQgYXMgaXMuCiAgICAgICAgICAqIFNob3VsZCBhbHdheXMgYmUgc2V0IHVubGVzcyB0aGUgZXZlbnQgaXMgdG8gYmUgdHJhbnNtdXRlZC4gKi8KICAgICAgICAgRkxBR19ESVNQQVRDSF9BU19JUyA9IDEgPDwgOCwKQEAgLTExNSwxMSArMTIxLDIzIEBACiAgICAgICAgICAqIFRoZSBldmVudCBpcyB0cmFuc211dGVkIGludG8gQUNUSU9OX0hPVkVSX0VOVEVSLiAqLwogICAgICAgICBGTEFHX0RJU1BBVENIX0FTX0hPVkVSX0VYSVQgPSAxIDw8IDExLAogCisgICAgICAgIC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgZXZlbnQgc2hvdWxkIGJlIGNhbmNlbGVkLgorICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHRyYW5zbXV0ZSBBQ1RJT05fTU9WRSBpbnRvIEFDVElPTl9DQU5DRUwgd2hlbiBhIHRvdWNoIHNsaXBzCisgICAgICAgICAqIG91dHNpZGUgb2YgYSB3aW5kb3cuICovCisgICAgICAgIEZMQUdfRElTUEFUQ0hfQVNfU0xJUFBFUllfRVhJVCA9IDEgPDwgMTIsCisKKyAgICAgICAgLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBldmVudCBzaG91bGQgYmUgZGlzcGF0Y2hlZCBhcyBhbiBpbml0aWFsIGRvd24uCisgICAgICAgICAqIEl0IGlzIHVzZWQgdG8gdHJhbnNtdXRlIEFDVElPTl9NT1ZFIGludG8gQUNUSU9OX0RPV04gd2hlbiBhIHRvdWNoIHNsaXBzCisgICAgICAgICAqIGludG8gYSBuZXcgd2luZG93LiAqLworICAgICAgICBGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VOVEVSID0gMSA8PCAxMywKKwogICAgICAgICAvKiBNYXNrIGZvciBhbGwgZGlzcGF0Y2ggbW9kZXMuICovCiAgICAgICAgIEZMQUdfRElTUEFUQ0hfTUFTSyA9IEZMQUdfRElTUEFUQ0hfQVNfSVMKICAgICAgICAgICAgICAgICB8IEZMQUdfRElTUEFUQ0hfQVNfT1VUU0lERQogICAgICAgICAgICAgICAgIHwgRkxBR19ESVNQQVRDSF9BU19IT1ZFUl9FTlRFUgotICAgICAgICAgICAgICAgIHwgRkxBR19ESVNQQVRDSF9BU19IT1ZFUl9FWElULAorICAgICAgICAgICAgICAgIHwgRkxBR19ESVNQQVRDSF9BU19IT1ZFUl9FWElUCisgICAgICAgICAgICAgICAgfCBGTEFHX0RJU1BBVENIX0FTX1NMSVBQRVJZX0VYSVQKKyAgICAgICAgICAgICAgICB8IEZMQUdfRElTUEFUQ0hfQVNfU0xJUFBFUllfRU5URVIsCiAgICAgfTsKIAogICAgIC8vIFRoZSBpbnB1dCBjaGFubmVsIHRvIGJlIHRhcmdldGVkLgpAQCAtMTQzLDYgKzE2MSwzMCBAQAogCiAKIC8qCisgKiBJbnB1dCBkaXNwYXRjaGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogU3BlY2lmaWVzIHZhcmlvdXMgb3B0aW9ucyB0aGF0IG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIGlucHV0IGRpc3BhdGNoZXIuCisgKi8KK3N0cnVjdCBJbnB1dERpc3BhdGNoZXJDb25maWd1cmF0aW9uIHsKKyAgICAvLyBUaGUga2V5IHJlcGVhdCBpbml0aWFsIHRpbWVvdXQuCisgICAgbnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0OworCisgICAgLy8gVGhlIGtleSByZXBlYXQgaW50ZXIta2V5IGRlbGF5LgorICAgIG5zZWNzX3Qga2V5UmVwZWF0RGVsYXk7CisKKyAgICAvLyBUaGUgbWF4aW11bSBzdWdnZXN0ZWQgZXZlbnQgZGVsaXZlcnkgcmF0ZSBwZXIgc2Vjb25kLgorICAgIC8vIFRoaXMgdmFsdWUgaXMgdXNlZCB0byB0aHJvdHRsZSBtb3Rpb24gZXZlbnQgbW92ZW1lbnQgYWN0aW9ucyBvbiBhIHBlci1kZXZpY2UKKyAgICAvLyBiYXNpcy4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGhhcmQgbGltaXQuCisgICAgaW50MzJfdCBtYXhFdmVudHNQZXJTZWNvbmQ7CisKKyAgICBJbnB1dERpc3BhdGNoZXJDb25maWd1cmF0aW9uKCkgOgorICAgICAgICAgICAga2V5UmVwZWF0VGltZW91dCg1MDAgKiAxMDAwMDAwTEwpLAorICAgICAgICAgICAga2V5UmVwZWF0RGVsYXkoNTAgKiAxMDAwMDAwTEwpLAorICAgICAgICAgICAgbWF4RXZlbnRzUGVyU2Vjb25kKDYwKSB7IH0KK307CisKKworLyoKICAqIElucHV0IGRpc3BhdGNoZXIgcG9saWN5IGludGVyZmFjZS4KICAqCiAgKiBUaGUgaW5wdXQgcmVhZGVyIHBvbGljeSBpcyB1c2VkIGJ5IHRoZSBpbnB1dCByZWFkZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgV2luZG93IE1hbmFnZXIKQEAgLTE2OCwxNyArMjEwLDExIEBACiAgICAgLyogTm90aWZpZXMgdGhlIHN5c3RlbSB0aGF0IGFuIGlucHV0IGNoYW5uZWwgaXMgdW5yZWNvdmVyYWJseSBicm9rZW4uICovCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlucHV0Q2hhbm5lbEJyb2tlbihjb25zdCBzcDxJbnB1dFdpbmRvd0hhbmRsZT4mIGlucHV0V2luZG93SGFuZGxlKSA9IDA7CiAKLSAgICAvKiBHZXRzIHRoZSBrZXkgcmVwZWF0IGluaXRpYWwgdGltZW91dCBvciAtMSBpZiBhdXRvbWF0aWMga2V5IHJlcGVhdGluZyBpcyBkaXNhYmxlZC4gKi8KLSAgICB2aXJ0dWFsIG5zZWNzX3QgZ2V0S2V5UmVwZWF0VGltZW91dCgpID0gMDsKKyAgICAvKiBHZXRzIHRoZSBpbnB1dCBkaXNwYXRjaGVyIGNvbmZpZ3VyYXRpb24uICovCisgICAgdmlydHVhbCB2b2lkIGdldERpc3BhdGNoZXJDb25maWd1cmF0aW9uKElucHV0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24qIG91dENvbmZpZykgPSAwOwogCi0gICAgLyogR2V0cyB0aGUga2V5IHJlcGVhdCBpbnRlci1rZXkgZGVsYXkuICovCi0gICAgdmlydHVhbCBuc2Vjc190IGdldEtleVJlcGVhdERlbGF5KCkgPSAwOwotCi0gICAgLyogR2V0cyB0aGUgbWF4aW11bSBzdWdnZXN0ZWQgZXZlbnQgZGVsaXZlcnkgcmF0ZSBwZXIgc2Vjb25kLgotICAgICAqIFRoaXMgdmFsdWUgaXMgdXNlZCB0byB0aHJvdHRsZSBtb3Rpb24gZXZlbnQgbW92ZW1lbnQgYWN0aW9ucyBvbiBhIHBlci1kZXZpY2UKLSAgICAgKiBiYXNpcy4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIGhhcmQgbGltaXQuCi0gICAgICovCi0gICAgdmlydHVhbCBpbnQzMl90IGdldE1heEV2ZW50c1BlclNlY29uZCgpID0gMDsKKyAgICAvKiBSZXR1cm5zIHRydWUgaWYgYXV0b21hdGljIGtleSByZXBlYXRpbmcgaXMgZW5hYmxlZC4gKi8KKyAgICB2aXJ0dWFsIGJvb2wgaXNLZXlSZXBlYXRFbmFibGVkKCkgPSAwOwogCiAgICAgLyogRmlsdGVycyBhbiBpbnB1dCBldmVudC4KICAgICAgKiBSZXR1cm4gdHJ1ZSB0byBkaXNwYXRjaCB0aGUgZXZlbnQgdW5tb2RpZmllZCwgZmFsc2UgdG8gY29uc3VtZSB0aGUgZXZlbnQuCkBAIC04MDAsNiArODM2LDcgQEAKICAgICB9OwogCiAgICAgc3A8SW5wdXREaXNwYXRjaGVyUG9saWN5SW50ZXJmYWNlPiBtUG9saWN5OworICAgIElucHV0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24gbUNvbmZpZzsKIAogICAgIE11dGV4IG1Mb2NrOwogCkBAIC04MTIsOCArODQ5LDcgQEAKIAogICAgIFZlY3RvcjxFdmVudEVudHJ5Kj4gbVRlbXBDYW5jZWxhdGlvbkV2ZW50czsKIAotICAgIHZvaWQgZGlzcGF0Y2hPbmNlSW5uZXJMb2NrZWQobnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0LCBuc2Vjc190IGtleVJlcGVhdERlbGF5LAotICAgICAgICAgICAgbnNlY3NfdCogbmV4dFdha2V1cFRpbWUpOworICAgIHZvaWQgZGlzcGF0Y2hPbmNlSW5uZXJMb2NrZWQobnNlY3NfdCogbmV4dFdha2V1cFRpbWUpOwogCiAgICAgLy8gQmF0Y2hlcyBhIG5ldyBzYW1wbGUgb250byBhIG1vdGlvbiBlbnRyeS4KICAgICAvLyBBc3N1bWVzIHRoYXQgdGhlIHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgd2UgY2FuIGFwcGVuZCBzYW1wbGVzLgpAQCAtODg1LDcgKzkyMSw3IEBACiAgICAgfSBtS2V5UmVwZWF0U3RhdGU7CiAKICAgICB2b2lkIHJlc2V0S2V5UmVwZWF0TG9ja2VkKCk7Ci0gICAgS2V5RW50cnkqIHN5bnRoZXNpemVLZXlSZXBlYXRMb2NrZWQobnNlY3NfdCBjdXJyZW50VGltZSwgbnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0KTsKKyAgICBLZXlFbnRyeSogc3ludGhlc2l6ZUtleVJlcGVhdExvY2tlZChuc2Vjc190IGN1cnJlbnRUaW1lKTsKIAogICAgIC8vIERlZmVycmVkIGNvbW1hbmQgcHJvY2Vzc2luZy4KICAgICBib29sIHJ1bkNvbW1hbmRzTG9ja2VkSW50ZXJydXB0aWJsZSgpOwpAQCAtOTI2LDkgKzk2MiwxMCBAQAogICAgICAgICB+VG91Y2hTdGF0ZSgpOwogICAgICAgICB2b2lkIHJlc2V0KCk7CiAgICAgICAgIHZvaWQgY29weUZyb20oY29uc3QgVG91Y2hTdGF0ZSYgb3RoZXIpOwotICAgICAgICB2b2lkIGFkZE9yVXBkYXRlV2luZG93KGNvbnN0IElucHV0V2luZG93KiB3aW5kb3csIGludDMyX3QgdGFyZ2V0RmxhZ3MsIEJpdFNldDMyIHBvaW50ZXJJZHMpOworICAgICAgICB2b2lkIGFkZE9yVXBkYXRlV2luZG93KGNvbnN0IElucHV0V2luZG93KiB3aW5kb3csaW50MzJfdCB0YXJnZXRGbGFncywgQml0U2V0MzIgcG9pbnRlcklkcyk7CiAgICAgICAgIHZvaWQgZmlsdGVyTm9uQXNJc1RvdWNoV2luZG93cygpOwotICAgICAgICBjb25zdCBJbnB1dFdpbmRvdyogZ2V0Rmlyc3RGb3JlZ3JvdW5kV2luZG93KCk7CisgICAgICAgIGNvbnN0IElucHV0V2luZG93KiBnZXRGaXJzdEZvcmVncm91bmRXaW5kb3coKSBjb25zdDsKKyAgICAgICAgYm9vbCBpc1NsaXBwZXJ5KCkgY29uc3Q7CiAgICAgfTsKIAogICAgIFRvdWNoU3RhdGUgbVRvdWNoU3RhdGU7CkBAIC05NDMsNyArOTgwLDcgQEAKICAgICBib29sIGRpc3BhdGNoQ29uZmlndXJhdGlvbkNoYW5nZWRMb2NrZWQoCiAgICAgICAgICAgICBuc2Vjc190IGN1cnJlbnRUaW1lLCBDb25maWd1cmF0aW9uQ2hhbmdlZEVudHJ5KiBlbnRyeSk7CiAgICAgYm9vbCBkaXNwYXRjaEtleUxvY2tlZCgKLSAgICAgICAgICAgIG5zZWNzX3QgY3VycmVudFRpbWUsIEtleUVudHJ5KiBlbnRyeSwgbnNlY3NfdCBrZXlSZXBlYXRUaW1lb3V0LAorICAgICAgICAgICAgbnNlY3NfdCBjdXJyZW50VGltZSwgS2V5RW50cnkqIGVudHJ5LAogICAgICAgICAgICAgRHJvcFJlYXNvbiogZHJvcFJlYXNvbiwgbnNlY3NfdCogbmV4dFdha2V1cFRpbWUpOwogICAgIGJvb2wgZGlzcGF0Y2hNb3Rpb25Mb2NrZWQoCiAgICAgICAgICAgICBuc2Vjc190IGN1cnJlbnRUaW1lLCBNb3Rpb25FbnRyeSogZW50cnksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC9JbnB1dFJlYWRlci5jcHAgYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dFJlYWRlci5jcHAKaW5kZXggMjVhMmM3OC4uM2U0YzY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXQvSW5wdXRSZWFkZXIuY3BwCisrKyBiL3NlcnZpY2VzL2lucHV0L0lucHV0UmVhZGVyLmNwcApAQCAtNjEsNjUgKzYxLDYgQEAKIC8vIE1heGltdW0gbnVtYmVyIG9mIHNsb3RzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIHRoZSBzbG90LWJhc2VkIE11bHRpdG91Y2ggUHJvdG9jb2wgQi4KIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX1NMT1RTID0gMzI7CiAKLS8vIFF1aWV0IHRpbWUgYmV0d2VlbiBjZXJ0YWluIGdlc3R1cmUgdHJhbnNpdGlvbnMuCi0vLyBUaW1lIHRvIGFsbG93IGZvciBhbGwgZmluZ2VycyBvciBidXR0b25zIHRvIHNldHRsZSBpbnRvIGEgc3RhYmxlIHN0YXRlIGJlZm9yZQotLy8gc3RhcnRpbmcgYSBuZXcgZ2VzdHVyZS4KLXN0YXRpYyBjb25zdCBuc2Vjc190IFFVSUVUX0lOVEVSVkFMID0gMTAwICogMTAwMDAwMDsgLy8gMTAwIG1zCi0KLS8vIFRoZSBtaW5pbXVtIHNwZWVkIHRoYXQgYSBwb2ludGVyIG11c3QgdHJhdmVsIGZvciB1cyB0byBjb25zaWRlciBzd2l0Y2hpbmcgdGhlIGFjdGl2ZQotLy8gdG91Y2ggcG9pbnRlciB0byBpdCBkdXJpbmcgYSBkcmFnLiAgVGhpcyB0aHJlc2hvbGQgaXMgc2V0IHRvIGF2b2lkIHN3aXRjaGluZyBkdWUKLS8vIHRvIG5vaXNlIGZyb20gYSBmaW5nZXIgcmVzdGluZyBvbiB0aGUgdG91Y2ggcGFkIChwZXJoYXBzIGp1c3QgcHJlc3NpbmcgaXQgZG93bikuCi1zdGF0aWMgY29uc3QgZmxvYXQgRFJBR19NSU5fU1dJVENIX1NQRUVEID0gNTAuMGY7IC8vIHBpeGVscyBwZXIgc2Vjb25kCi0KLS8vIFRhcCBnZXN0dXJlIGRlbGF5IHRpbWUuCi0vLyBUaGUgdGltZSBiZXR3ZWVuIGRvd24gYW5kIHVwIG11c3QgYmUgbGVzcyB0aGFuIHRoaXMgdG8gYmUgY29uc2lkZXJlZCBhIHRhcC4KLXN0YXRpYyBjb25zdCBuc2Vjc190IFRBUF9JTlRFUlZBTCA9IDE1MCAqIDEwMDAwMDA7IC8vIDE1MCBtcwotCi0vLyBUYXAgZHJhZyBnZXN0dXJlIGRlbGF5IHRpbWUuCi0vLyBUaGUgdGltZSBiZXR3ZWVuIHVwIGFuZCB0aGUgbmV4dCB1cCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGlzIHRvIGJlIGNvbnNpZGVyZWQgYQotLy8gZHJhZy4gIE90aGVyd2lzZSwgdGhlIHByZXZpb3VzIHRhcCBpcyBmaW5pc2hlZCBhbmQgYSBuZXcgdGFwIGJlZ2lucy4KLXN0YXRpYyBjb25zdCBuc2Vjc190IFRBUF9EUkFHX0lOVEVSVkFMID0gMTUwICogMTAwMDAwMDsgLy8gMTUwIG1zCi0KLS8vIFRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgdGhhdCB0aGUgcG9pbnRlciBpcyBhbGxvd2VkIHRvIG1vdmUgZnJvbSBpbml0aWFsIGRvd24KLS8vIHRvIHVwIGFuZCBzdGlsbCBiZSBjYWxsZWQgYSB0YXAuCi1zdGF0aWMgY29uc3QgZmxvYXQgVEFQX1NMT1AgPSAxMC4wZjsgLy8gMTAgcGl4ZWxzCi0KLS8vIFRpbWUgYWZ0ZXIgdGhlIGZpcnN0IHRvdWNoIHBvaW50cyBnbyBkb3duIHRvIHNldHRsZSBvbiBhbiBpbml0aWFsIGNlbnRyb2lkLgotLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBlbm91Z2ggdGltZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgcHV0cyBkb3duIHR3bwotLy8gZmluZ2VycyBhdCBhbG1vc3QgYnV0IG5vdCBxdWl0ZSBleGFjdGx5IHRoZSBzYW1lIHRpbWUuCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBNVUxUSVRPVUNIX1NFVFRMRV9JTlRFUlZBTCA9IDEwMCAqIDEwMDAwMDA7IC8vIDEwMG1zCi0KLS8vIFRoZSB0cmFuc2l0aW9uIGZyb20gUFJFU1MgdG8gU1dJUEUgb3IgRlJFRUZPUk0gZ2VzdHVyZSBtb2RlIGlzIG1hZGUgd2hlbgotLy8gYm90aCBvZiB0aGUgcG9pbnRlcnMgYXJlIG1vdmluZyBhdCBsZWFzdCB0aGlzIGZhc3QuCi1zdGF0aWMgY29uc3QgZmxvYXQgTVVMVElUT1VDSF9NSU5fU1BFRUQgPSAxNTAuMGY7IC8vIHBpeGVscyBwZXIgc2Vjb25kCi0KLS8vIFRoZSB0cmFuc2l0aW9uIGZyb20gUFJFU1MgdG8gU1dJUEUgZ2VzdHVyZSBtb2RlIGNhbiBvbmx5IG9jY3VyIHdoZW4gdGhlCi0vLyBjb3NpbmUgb2YgdGhlIGFuZ2xlIGJldHdlZW4gdGhlIHR3byB2ZWN0b3JzIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGFuIHRoaXMgdmFsdWUKLS8vIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSB2ZWN0b3JzIGFyZSBvcmllbnRlZCBpbiB0aGUgc2FtZSBkaXJlY3Rpb24uCi0vLyBXaGVuIHRoZSB2ZWN0b3JzIGFyZSBvcmllbnRlZCBpbiB0aGUgZXhhY3RseSBzYW1lIGRpcmVjdGlvbiwgdGhlIGNvc2luZSBpcyAxLjAuCi0vLyAoSW4gZXhhY3RseSBvcHBvc2l0ZSBkaXJlY3Rpb25zLCB0aGUgY29zaW5lIGlzIC0xLjAuKQotc3RhdGljIGNvbnN0IGZsb2F0IFNXSVBFX1RSQU5TSVRJT05fQU5HTEVfQ09TSU5FID0gMC41ZjsgLy8gY29zaW5lIG9mIDQ1IGRlZ3JlZXMKLQotLy8gVGhlIHRyYW5zaXRpb24gZnJvbSBQUkVTUyB0byBTV0lQRSBnZXN0dXJlIG1vZGUgY2FuIG9ubHkgb2NjdXIgd2hlbiB0aGUKLS8vIGZpbmdlcnMgYXJlIG5vIG1vcmUgdGhhbiB0aGlzIGZhciBhcGFydCByZWxhdGl2ZSB0byB0aGUgZGlhZ29uYWwgc2l6ZSBvZgotLy8gdGhlIHRvdWNoIHBhZC4gIEZvciBleGFtcGxlLCBhIHJhdGlvIG9mIDAuNSBtZWFucyB0aGF0IHRoZSBmaW5nZXJzIG11c3QgYmUKLS8vIG5vIG1vcmUgdGhhbiBoYWxmIHRoZSBkaWFnb25hbCBzaXplIG9mIHRoZSB0b3VjaCBwYWQgYXBhcnQuCi1zdGF0aWMgY29uc3QgZmxvYXQgU1dJUEVfTUFYX1dJRFRIX1JBVElPID0gMC4zMzNmOyAvLyAxLzMKLQotLy8gVGhlIGdlc3R1cmUgbW92ZW1lbnQgc3BlZWQgZmFjdG9yIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSBkaXNwbGF5LgotLy8gTW92ZW1lbnQgc3BlZWQgYXBwbGllcyB3aGVuIHRoZSBmaW5nZXJzIGFyZSBtb3ZpbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLgotLy8gV2l0aG91dCBhY2NlbGVyYXRpb24sIGEgZnVsbCBzd2lwZSBvZiB0aGUgdG91Y2ggcGFkIGRpYWdvbmFsIGluIG1vdmVtZW50IG1vZGUKLS8vIHdpbGwgY292ZXIgdGhpcyBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5IGRpYWdvbmFsLgotc3RhdGljIGNvbnN0IGZsb2F0IEdFU1RVUkVfTU9WRU1FTlRfU1BFRURfUkFUSU8gPSAwLjhmOwotCi0vLyBUaGUgZ2VzdHVyZSB6b29tIHNwZWVkIGZhY3RvciByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KLS8vIFpvb20gc3BlZWQgYXBwbGllcyB3aGVuIHRoZSBmaW5nZXJzIGFyZSBtb3N0bHkgbW92aW5nIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIKLS8vIHRvIGV4ZWN1dGUgYSBzY2FsZSBnZXN0dXJlIG9yIHNpbWlsYXIuCi0vLyBXaXRob3V0IGFjY2VsZXJhdGlvbiwgYSBmdWxsIHN3aXBlIG9mIHRoZSB0b3VjaCBwYWQgZGlhZ29uYWwgaW4gem9vbSBtb2RlCi0vLyB3aWxsIGNvdmVyIHRoaXMgcG9ydGlvbiBvZiB0aGUgZGlzcGxheSBkaWFnb25hbC4KLXN0YXRpYyBjb25zdCBmbG9hdCBHRVNUVVJFX1pPT01fU1BFRURfUkFUSU8gPSAwLjNmOwotCi0KIC8vIC0tLSBTdGF0aWMgRnVuY3Rpb25zIC0tLQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpAQCAtMjU4LDIzICsxOTksNiBAQAogICAgIHJldHVybiBlZGdlRmxhZ3M7CiB9CiAKLXN0YXRpYyB2b2lkIGNsYW1wUG9zaXRpb25Vc2luZ1BvaW50ZXJCb3VuZHMoCi0gICAgICAgIGNvbnN0IHNwPFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlPiYgcG9pbnRlckNvbnRyb2xsZXIsIGZsb2F0KiB4LCBmbG9hdCogeSkgewotICAgIGZsb2F0IG1pblgsIG1pblksIG1heFgsIG1heFk7Ci0gICAgaWYgKHBvaW50ZXJDb250cm9sbGVyLT5nZXRCb3VuZHMoJm1pblgsICZtaW5ZLCAmbWF4WCwgJm1heFkpKSB7Ci0gICAgICAgIGlmICgqeCA8IG1pblgpIHsKLSAgICAgICAgICAgICp4ID0gbWluWDsKLSAgICAgICAgfSBlbHNlIGlmICgqeCA+IG1heFgpIHsKLSAgICAgICAgICAgICp4ID0gbWF4WDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnkgPCBtaW5ZKSB7Ci0gICAgICAgICAgICAqeSA9IG1pblk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKnkgPiBtYXhZKSB7Ci0gICAgICAgICAgICAqeSA9IG1heFk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXRpYyBmbG9hdCBjYWxjdWxhdGVDb21tb25WZWN0b3IoZmxvYXQgYSwgZmxvYXQgYikgewogICAgIGlmIChhID4gMCAmJiBiID4gMCkgewogICAgICAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKQEAgLTMxOSw4ICsyNDMsOSBAQAogICAgICAgICBjb25zdCBzcDxJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZT4mIHBvbGljeSwKICAgICAgICAgY29uc3Qgc3A8SW5wdXREaXNwYXRjaGVySW50ZXJmYWNlPiYgZGlzcGF0Y2hlcikgOgogICAgICAgICBtRXZlbnRIdWIoZXZlbnRIdWIpLCBtUG9saWN5KHBvbGljeSksIG1EaXNwYXRjaGVyKGRpc3BhdGNoZXIpLAotICAgICAgICBtR2xvYmFsTWV0YVN0YXRlKDApLCBtRGlzYWJsZVZpcnR1YWxLZXlzVGltZW91dChMTE9OR19NSU4pLCBtTmV4dFRpbWVvdXQoTExPTkdfTUFYKSB7Ci0gICAgY29uZmlndXJlRXhjbHVkZWREZXZpY2VzKCk7CisgICAgICAgIG1HbG9iYWxNZXRhU3RhdGUoMCksIG1EaXNhYmxlVmlydHVhbEtleXNUaW1lb3V0KExMT05HX01JTiksIG1OZXh0VGltZW91dChMTE9OR19NQVgpLAorICAgICAgICBtQ29uZmlndXJhdGlvbkNoYW5nZXNUb1JlZnJlc2goMCkgeworICAgIHJlZnJlc2hDb25maWd1cmF0aW9uKDApOwogICAgIHVwZGF0ZUdsb2JhbE1ldGFTdGF0ZSgpOwogICAgIHVwZGF0ZUlucHV0Q29uZmlndXJhdGlvbigpOwogfQpAQCAtMzMyLDYgKzI1NywxOCBAQAogfQogCiB2b2lkIElucHV0UmVhZGVyOjpsb29wT25jZSgpIHsKKyAgICB1aW50MzJfdCBjaGFuZ2VzOworICAgIHsgLy8gYWNxdWlyZSBsb2NrCisgICAgICAgIEF1dG9NdXRleCBfbChtU3RhdGVMb2NrKTsKKworICAgICAgICBjaGFuZ2VzID0gbUNvbmZpZ3VyYXRpb25DaGFuZ2VzVG9SZWZyZXNoOworICAgICAgICBtQ29uZmlndXJhdGlvbkNoYW5nZXNUb1JlZnJlc2ggPSAwOworICAgIH0gLy8gcmVsZWFzZSBsb2NrCisKKyAgICBpZiAoY2hhbmdlcykgeworICAgICAgICByZWZyZXNoQ29uZmlndXJhdGlvbihjaGFuZ2VzKTsKKyAgICB9CisKICAgICBpbnQzMl90IHRpbWVvdXRNaWxsaXMgPSAtMTsKICAgICBpZiAobU5leHRUaW1lb3V0ICE9IExMT05HX01BWCkgewogICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKQEAgLTM5NSw3ICszMzIsNyBAQAogICAgIHVpbnQzMl90IGNsYXNzZXMgPSBtRXZlbnRIdWItPmdldERldmljZUNsYXNzZXMoZGV2aWNlSWQpOwogCiAgICAgSW5wdXREZXZpY2UqIGRldmljZSA9IGNyZWF0ZURldmljZShkZXZpY2VJZCwgbmFtZSwgY2xhc3Nlcyk7Ci0gICAgZGV2aWNlLT5jb25maWd1cmUoKTsKKyAgICBkZXZpY2UtPmNvbmZpZ3VyZSgmbUNvbmZpZywgMCk7CiAKICAgICBpZiAoZGV2aWNlLT5pc0lnbm9yZWQoKSkgewogICAgICAgICBMT0dJKCJEZXZpY2UgYWRkZWQ6IGlkPSVkLCBuYW1lPSclcycgKGlnbm9yZWQgbm9uLWlucHV0IGRldmljZSkiLCBkZXZpY2VJZCwgbmFtZS5zdHJpbmcoKSk7CkBAIC01NTIsMTIgKzQ4OSwyNSBAQAogICAgIG1EaXNwYXRjaGVyLT5ub3RpZnlDb25maWd1cmF0aW9uQ2hhbmdlZCh3aGVuKTsKIH0KIAotdm9pZCBJbnB1dFJlYWRlcjo6Y29uZmlndXJlRXhjbHVkZWREZXZpY2VzKCkgewotICAgIFZlY3RvcjxTdHJpbmc4PiBleGNsdWRlZERldmljZU5hbWVzOwotICAgIG1Qb2xpY3ktPmdldEV4Y2x1ZGVkRGV2aWNlTmFtZXMoZXhjbHVkZWREZXZpY2VOYW1lcyk7Cit2b2lkIElucHV0UmVhZGVyOjpyZWZyZXNoQ29uZmlndXJhdGlvbih1aW50MzJfdCBjaGFuZ2VzKSB7CisgICAgbVBvbGljeS0+Z2V0UmVhZGVyQ29uZmlndXJhdGlvbigmbUNvbmZpZyk7CisgICAgbUV2ZW50SHViLT5zZXRFeGNsdWRlZERldmljZXMobUNvbmZpZy5leGNsdWRlZERldmljZU5hbWVzKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXhjbHVkZWREZXZpY2VOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICBtRXZlbnRIdWItPmFkZEV4Y2x1ZGVkRGV2aWNlKGV4Y2x1ZGVkRGV2aWNlTmFtZXNbaV0pOworICAgIGlmIChjaGFuZ2VzKSB7CisgICAgICAgIExPR0koIlJlY29uZmlndXJpbmcgaW5wdXQgZGV2aWNlcy4gIGNoYW5nZXM9MHglMDh4IiwgY2hhbmdlcyk7CisKKyAgICAgICAgaWYgKGNoYW5nZXMgJiBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb246OkNIQU5HRV9NVVNUX1JFT1BFTikgeworICAgICAgICAgICAgbUV2ZW50SHViLT5yZXF1ZXN0UmVvcGVuRGV2aWNlcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeyAvLyBhY3F1aXJlIGRldmljZSByZWdpc3RyeSByZWFkZXIgbG9jaworICAgICAgICAgICAgICAgIFJXTG9jazo6QXV0b1JMb2NrIF9ybChtRGV2aWNlUmVnaXN0cnlMb2NrKTsKKworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2UqIGRldmljZSA9IG1EZXZpY2VzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+Y29uZmlndXJlKCZtQ29uZmlnLCBjaGFuZ2VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIHJlbGVhc2UgZGV2aWNlIHJlZ2lzdHJ5IHJlYWRlciBsb2NrCisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTc3OCw2ICs3MjgsMjIgQEAKICAgICB9IC8vIHJlbGVhc2UgZGV2aWNlIHJlZ2lzdHkgcmVhZGVyIGxvY2sKIH0KIAordm9pZCBJbnB1dFJlYWRlcjo6cmVxdWVzdFJlZnJlc2hDb25maWd1cmF0aW9uKHVpbnQzMl90IGNoYW5nZXMpIHsKKyAgICBpZiAoY2hhbmdlcykgeworICAgICAgICBib29sIG5lZWRXYWtlOworICAgICAgICB7IC8vIGFjcXVpcmUgbG9jaworICAgICAgICAgICAgQXV0b011dGV4IF9sKG1TdGF0ZUxvY2spOworCisgICAgICAgICAgICBuZWVkV2FrZSA9ICFtQ29uZmlndXJhdGlvbkNoYW5nZXNUb1JlZnJlc2g7CisgICAgICAgICAgICBtQ29uZmlndXJhdGlvbkNoYW5nZXNUb1JlZnJlc2ggfD0gY2hhbmdlczsKKyAgICAgICAgfSAvLyByZWxlYXNlIGxvY2sKKworICAgICAgICBpZiAobmVlZFdha2UpIHsKKyAgICAgICAgICAgIG1FdmVudEh1Yi0+d2FrZSgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIElucHV0UmVhZGVyOjpkdW1wKFN0cmluZzgmIGR1bXApIHsKICAgICBtRXZlbnRIdWItPmR1bXAoZHVtcCk7CiAgICAgZHVtcC5hcHBlbmQoIlxuIik7CkBAIC03OTEsNiArNzU3LDYyIEBACiAgICAgICAgICAgICBtRGV2aWNlcy52YWx1ZUF0KGkpLT5kdW1wKGR1bXApOwogICAgICAgICB9CiAgICAgfSAvLyByZWxlYXNlIGRldmljZSByZWdpc3R5IHJlYWRlciBsb2NrCisKKyAgICBkdW1wLmFwcGVuZChJTkRFTlQgIkNvbmZpZ3VyYXRpb246XG4iKTsKKyAgICBkdW1wLmFwcGVuZChJTkRFTlQyICJFeGNsdWRlZERldmljZU5hbWVzOiBbIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29uZmlnLmV4Y2x1ZGVkRGV2aWNlTmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgZHVtcC5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgICAgZHVtcC5hcHBlbmQobUNvbmZpZy5leGNsdWRlZERldmljZU5hbWVzLml0ZW1BdChpKS5zdHJpbmcoKSk7CisgICAgfQorICAgIGR1bXAuYXBwZW5kKCJdXG4iKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICJGaWx0ZXJUb3VjaEV2ZW50czogJXNcbiIsCisgICAgICAgICAgICB0b1N0cmluZyhtQ29uZmlnLmZpbHRlclRvdWNoRXZlbnRzKSk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiRmlsdGVySnVtcHlUb3VjaEV2ZW50czogJXNcbiIsCisgICAgICAgICAgICB0b1N0cmluZyhtQ29uZmlnLmZpbHRlckp1bXB5VG91Y2hFdmVudHMpKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQyICJWaXJ0dWFsS2V5UXVpZXRUaW1lOiAlMC4xZm1zXG4iLAorICAgICAgICAgICAgbUNvbmZpZy52aXJ0dWFsS2V5UXVpZXRUaW1lICogMC4wMDAwMDFmKTsKKworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIlBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzOiAiCisgICAgICAgICAgICAic2NhbGU9JTAuM2YsIGxvd1RocmVzaG9sZD0lMC4zZiwgaGlnaFRocmVzaG9sZD0lMC4zZiwgYWNjZWxlcmF0aW9uPSUwLjNmXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycy5zY2FsZSwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMubG93VGhyZXNob2xkLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycy5oaWdoVGhyZXNob2xkLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycy5hY2NlbGVyYXRpb24pOworCisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMiAiV2hlZWxWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzOiAiCisgICAgICAgICAgICAic2NhbGU9JTAuM2YsIGxvd1RocmVzaG9sZD0lMC4zZiwgaGlnaFRocmVzaG9sZD0lMC4zZiwgYWNjZWxlcmF0aW9uPSUwLjNmXG4iLAorICAgICAgICAgICAgbUNvbmZpZy53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuc2NhbGUsCisgICAgICAgICAgICBtQ29uZmlnLndoZWVsVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycy5sb3dUaHJlc2hvbGQsCisgICAgICAgICAgICBtQ29uZmlnLndoZWVsVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycy5oaWdoVGhyZXNob2xkLAorICAgICAgICAgICAgbUNvbmZpZy53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMuYWNjZWxlcmF0aW9uKTsKKworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDIgIlBvaW50ZXJHZXN0dXJlOlxuIik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiRW5hYmxlZDogJXNcbiIsCisgICAgICAgICAgICB0b1N0cmluZyhtQ29uZmlnLnBvaW50ZXJHZXN0dXJlc0VuYWJsZWQpKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJRdWlldEludGVydmFsOiAlMC4xZm1zXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZVF1aWV0SW50ZXJ2YWwgKiAwLjAwMDAwMWYpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIkRyYWdNaW5Td2l0Y2hTcGVlZDogJTAuMWZweC9zXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZURyYWdNaW5Td2l0Y2hTcGVlZCk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiVGFwSW50ZXJ2YWw6ICUwLjFmbXNcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlVGFwSW50ZXJ2YWwgKiAwLjAwMDAwMWYpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlRhcERyYWdJbnRlcnZhbDogJTAuMWZtc1xuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwgKiAwLjAwMDAwMWYpOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlRhcFNsb3A6ICUwLjFmcHhcbiIsCisgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlVGFwU2xvcCk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiTXVsdGl0b3VjaFNldHRsZUludGVydmFsOiAlMC4xZm1zXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZU11bHRpdG91Y2hTZXR0bGVJbnRlcnZhbCAqIDAuMDAwMDAxZik7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiTXVsdGl0b3VjaE1pbkRpc3RhbmNlOiAlMC4xZnB4XG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZU11bHRpdG91Y2hNaW5EaXN0YW5jZSk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiU3dpcGVUcmFuc2l0aW9uQW5nbGVDb3NpbmU6ICUwLjFmXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZVN3aXBlVHJhbnNpdGlvbkFuZ2xlQ29zaW5lKTsKKyAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQzICJTd2lwZU1heFdpZHRoUmF0aW86ICUwLjFmXG4iLAorICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZVN3aXBlTWF4V2lkdGhSYXRpbyk7CisgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UMyAiTW92ZW1lbnRTcGVlZFJhdGlvOiAlMC4xZlxuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVNb3ZlbWVudFNwZWVkUmF0aW8pOworICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDMgIlpvb21TcGVlZFJhdGlvOiAlMC4xZlxuIiwKKyAgICAgICAgICAgIG1Db25maWcucG9pbnRlckdlc3R1cmVab29tU3BlZWRSYXRpbyk7CiB9CiAKIApAQCAtODY0LDE4ICs4ODYsMjAgQEAKICAgICBtTWFwcGVycy5hZGQobWFwcGVyKTsKIH0KIAotdm9pZCBJbnB1dERldmljZTo6Y29uZmlndXJlKCkgewotICAgIGlmICghIGlzSWdub3JlZCgpKSB7Ci0gICAgICAgIG1Db250ZXh0LT5nZXRFdmVudEh1YigpLT5nZXRDb25maWd1cmF0aW9uKG1JZCwgJm1Db25maWd1cmF0aW9uKTsKLSAgICB9Ci0KK3ZvaWQgSW5wdXREZXZpY2U6OmNvbmZpZ3VyZShjb25zdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIGNvbmZpZywgdWludDMyX3QgY2hhbmdlcykgewogICAgIG1Tb3VyY2VzID0gMDsKIAotICAgIHNpemVfdCBudW1NYXBwZXJzID0gbU1hcHBlcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtTWFwcGVyczsgaSsrKSB7Ci0gICAgICAgIElucHV0TWFwcGVyKiBtYXBwZXIgPSBtTWFwcGVyc1tpXTsKLSAgICAgICAgbWFwcGVyLT5jb25maWd1cmUoKTsKLSAgICAgICAgbVNvdXJjZXMgfD0gbWFwcGVyLT5nZXRTb3VyY2VzKCk7CisgICAgaWYgKCFpc0lnbm9yZWQoKSkgeworICAgICAgICBpZiAoIWNoYW5nZXMpIHsgLy8gZmlyc3QgdGltZSBvbmx5CisgICAgICAgICAgICBtQ29udGV4dC0+Z2V0RXZlbnRIdWIoKS0+Z2V0Q29uZmlndXJhdGlvbihtSWQsICZtQ29uZmlndXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbnVtTWFwcGVycyA9IG1NYXBwZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1NYXBwZXJzOyBpKyspIHsKKyAgICAgICAgICAgIElucHV0TWFwcGVyKiBtYXBwZXIgPSBtTWFwcGVyc1tpXTsKKyAgICAgICAgICAgIG1hcHBlci0+Y29uZmlndXJlKGNvbmZpZywgY2hhbmdlcyk7CisgICAgICAgICAgICBtU291cmNlcyB8PSBtYXBwZXItPmdldFNvdXJjZXMoKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTAxOSw3ICsxMDQzLDcgQEAKIHZvaWQgSW5wdXRNYXBwZXI6OmR1bXAoU3RyaW5nOCYgZHVtcCkgewogfQogCi12b2lkIElucHV0TWFwcGVyOjpjb25maWd1cmUoKSB7Cit2b2lkIElucHV0TWFwcGVyOjpjb25maWd1cmUoY29uc3QgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBjb25maWcsIHVpbnQzMl90IGNoYW5nZXMpIHsKIH0KIAogdm9pZCBJbnB1dE1hcHBlcjo6cmVzZXQoKSB7CkBAIC0xMDU1LDggKzEwNzksOCBAQAogdm9pZCBJbnB1dE1hcHBlcjo6ZHVtcFJhd0Fic29sdXRlQXhpc0luZm8oU3RyaW5nOCYgZHVtcCwKICAgICAgICAgY29uc3QgUmF3QWJzb2x1dGVBeGlzSW5mbyYgYXhpcywgY29uc3QgY2hhciogbmFtZSkgewogICAgIGlmIChheGlzLnZhbGlkKSB7Ci0gICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDQgIiVzOiBtaW49JWQsIG1heD0lZCwgZmxhdD0lZCwgZnV6ej0lZFxuIiwKLSAgICAgICAgICAgICAgICBuYW1lLCBheGlzLm1pblZhbHVlLCBheGlzLm1heFZhbHVlLCBheGlzLmZsYXQsIGF4aXMuZnV6eik7CisgICAgICAgIGR1bXAuYXBwZW5kRm9ybWF0KElOREVOVDQgIiVzOiBtaW49JWQsIG1heD0lZCwgZmxhdD0lZCwgZnV6ej0lZCwgcmVzb2x1dGlvbj0lZFxuIiwKKyAgICAgICAgICAgICAgICBuYW1lLCBheGlzLm1pblZhbHVlLCBheGlzLm1heFZhbHVlLCBheGlzLmZsYXQsIGF4aXMuZnV6eiwgYXhpcy5yZXNvbHV0aW9uKTsKICAgICB9IGVsc2UgewogICAgICAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQ0ICIlczogdW5rbm93biByYW5nZVxuIiwgbmFtZSk7CiAgICAgfQpAQCAtMTEzMywxNiArMTE1NywxOCBAQAogfQogCiAKLXZvaWQgS2V5Ym9hcmRJbnB1dE1hcHBlcjo6Y29uZmlndXJlKCkgewotICAgIElucHV0TWFwcGVyOjpjb25maWd1cmUoKTsKK3ZvaWQgS2V5Ym9hcmRJbnB1dE1hcHBlcjo6Y29uZmlndXJlKGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogY29uZmlnLCB1aW50MzJfdCBjaGFuZ2VzKSB7CisgICAgSW5wdXRNYXBwZXI6OmNvbmZpZ3VyZShjb25maWcsIGNoYW5nZXMpOwogCi0gICAgLy8gQ29uZmlndXJlIGJhc2ljIHBhcmFtZXRlcnMuCi0gICAgY29uZmlndXJlUGFyYW1ldGVycygpOworICAgIGlmICghY2hhbmdlcykgeyAvLyBmaXJzdCB0aW1lIG9ubHkKKyAgICAgICAgLy8gQ29uZmlndXJlIGJhc2ljIHBhcmFtZXRlcnMuCisgICAgICAgIGNvbmZpZ3VyZVBhcmFtZXRlcnMoKTsKIAotICAgIC8vIFJlc2V0IExFRHMuCi0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgICAgICByZXNldExlZFN0YXRlTG9ja2VkKCk7CisgICAgICAgIC8vIFJlc2V0IExFRHMuCisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgICAgICAgICByZXNldExlZFN0YXRlTG9ja2VkKCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTE0MjAsMzYgKzE0NDYsNDQgQEAKICAgICB9IC8vIHJlbGVhc2UgbG9jawogfQogCi12b2lkIEN1cnNvcklucHV0TWFwcGVyOjpjb25maWd1cmUoKSB7Ci0gICAgSW5wdXRNYXBwZXI6OmNvbmZpZ3VyZSgpOwordm9pZCBDdXJzb3JJbnB1dE1hcHBlcjo6Y29uZmlndXJlKGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogY29uZmlnLCB1aW50MzJfdCBjaGFuZ2VzKSB7CisgICAgSW5wdXRNYXBwZXI6OmNvbmZpZ3VyZShjb25maWcsIGNoYW5nZXMpOwogCi0gICAgLy8gQ29uZmlndXJlIGJhc2ljIHBhcmFtZXRlcnMuCi0gICAgY29uZmlndXJlUGFyYW1ldGVycygpOworICAgIGlmICghY2hhbmdlcykgeyAvLyBmaXJzdCB0aW1lIG9ubHkKKyAgICAgICAgLy8gQ29uZmlndXJlIGJhc2ljIHBhcmFtZXRlcnMuCisgICAgICAgIGNvbmZpZ3VyZVBhcmFtZXRlcnMoKTsKIAotICAgIC8vIENvbmZpZ3VyZSBkZXZpY2UgbW9kZS4KLSAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLm1vZGUpIHsKLSAgICBjYXNlIFBhcmFtZXRlcnM6Ok1PREVfUE9JTlRFUjoKLSAgICAgICAgbVNvdXJjZSA9IEFJTlBVVF9TT1VSQ0VfTU9VU0U7Ci0gICAgICAgIG1YUHJlY2lzaW9uID0gMS4wZjsKLSAgICAgICAgbVlQcmVjaXNpb24gPSAxLjBmOwotICAgICAgICBtWFNjYWxlID0gMS4wZjsKLSAgICAgICAgbVlTY2FsZSA9IDEuMGY7Ci0gICAgICAgIG1Qb2ludGVyQ29udHJvbGxlciA9IGdldFBvbGljeSgpLT5vYnRhaW5Qb2ludGVyQ29udHJvbGxlcihnZXREZXZpY2VJZCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQYXJhbWV0ZXJzOjpNT0RFX05BVklHQVRJT046Ci0gICAgICAgIG1Tb3VyY2UgPSBBSU5QVVRfU09VUkNFX1RSQUNLQkFMTDsKLSAgICAgICAgbVhQcmVjaXNpb24gPSBUUkFDS0JBTExfTU9WRU1FTlRfVEhSRVNIT0xEOwotICAgICAgICBtWVByZWNpc2lvbiA9IFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQ7Ci0gICAgICAgIG1YU2NhbGUgPSAxLjBmIC8gVFJBQ0tCQUxMX01PVkVNRU5UX1RIUkVTSE9MRDsKLSAgICAgICAgbVlTY2FsZSA9IDEuMGYgLyBUUkFDS0JBTExfTU9WRU1FTlRfVEhSRVNIT0xEOwotICAgICAgICBicmVhazsKKyAgICAgICAgLy8gQ29uZmlndXJlIGRldmljZSBtb2RlLgorICAgICAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLm1vZGUpIHsKKyAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpNT0RFX1BPSU5URVI6CisgICAgICAgICAgICBtU291cmNlID0gQUlOUFVUX1NPVVJDRV9NT1VTRTsKKyAgICAgICAgICAgIG1YUHJlY2lzaW9uID0gMS4wZjsKKyAgICAgICAgICAgIG1ZUHJlY2lzaW9uID0gMS4wZjsKKyAgICAgICAgICAgIG1YU2NhbGUgPSAxLjBmOworICAgICAgICAgICAgbVlTY2FsZSA9IDEuMGY7CisgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXIgPSBnZXRQb2xpY3koKS0+b2J0YWluUG9pbnRlckNvbnRyb2xsZXIoZ2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpNT0RFX05BVklHQVRJT046CisgICAgICAgICAgICBtU291cmNlID0gQUlOUFVUX1NPVVJDRV9UUkFDS0JBTEw7CisgICAgICAgICAgICBtWFByZWNpc2lvbiA9IFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQ7CisgICAgICAgICAgICBtWVByZWNpc2lvbiA9IFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQ7CisgICAgICAgICAgICBtWFNjYWxlID0gMS4wZiAvIFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQ7CisgICAgICAgICAgICBtWVNjYWxlID0gMS4wZiAvIFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG1WV2hlZWxTY2FsZSA9IDEuMGY7CisgICAgICAgIG1IV2hlZWxTY2FsZSA9IDEuMGY7CisKKyAgICAgICAgbUhhdmVWV2hlZWwgPSBnZXRFdmVudEh1YigpLT5oYXNSZWxhdGl2ZUF4aXMoZ2V0RGV2aWNlSWQoKSwgUkVMX1dIRUVMKTsKKyAgICAgICAgbUhhdmVIV2hlZWwgPSBnZXRFdmVudEh1YigpLT5oYXNSZWxhdGl2ZUF4aXMoZ2V0RGV2aWNlSWQoKSwgUkVMX0hXSEVFTCk7CiAgICAgfQogCi0gICAgbVZXaGVlbFNjYWxlID0gMS4wZjsKLSAgICBtSFdoZWVsU2NhbGUgPSAxLjBmOwotCi0gICAgbUhhdmVWV2hlZWwgPSBnZXRFdmVudEh1YigpLT5oYXNSZWxhdGl2ZUF4aXMoZ2V0RGV2aWNlSWQoKSwgUkVMX1dIRUVMKTsKLSAgICBtSGF2ZUhXaGVlbCA9IGdldEV2ZW50SHViKCktPmhhc1JlbGF0aXZlQXhpcyhnZXREZXZpY2VJZCgpLCBSRUxfSFdIRUVMKTsKKyAgICBpZiAoIWNoYW5nZXMgfHwgKGNoYW5nZXMgJiBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb246OkNIQU5HRV9QT0lOVEVSX1NQRUVEKSkgeworICAgICAgICBtUG9pbnRlclZlbG9jaXR5Q29udHJvbC5zZXRQYXJhbWV0ZXJzKGNvbmZpZy0+cG9pbnRlclZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMpOworICAgICAgICBtV2hlZWxYVmVsb2NpdHlDb250cm9sLnNldFBhcmFtZXRlcnMoY29uZmlnLT53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMpOworICAgICAgICBtV2hlZWxZVmVsb2NpdHlDb250cm9sLnNldFBhcmFtZXRlcnMoY29uZmlnLT53aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMpOworICAgIH0KIH0KIAogdm9pZCBDdXJzb3JJbnB1dE1hcHBlcjo6Y29uZmlndXJlUGFyYW1ldGVycygpIHsKQEAgLTE1MTEsNiArMTU0NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IC8vIHJlbGVhc2UgbG9jawogCisgICAgICAgIC8vIFJlc2V0IHZlbG9jaXR5LgorICAgICAgICBtUG9pbnRlclZlbG9jaXR5Q29udHJvbC5yZXNldCgpOworICAgICAgICBtV2hlZWxYVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CisgICAgICAgIG1XaGVlbFlWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKKwogICAgICAgICAvLyBTeW50aGVzaXplIGJ1dHRvbiB1cCBldmVudCBvbiByZXNldC4KICAgICAgICAgbnNlY3NfdCB3aGVuID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgICAgICBtQWNjdW11bGF0b3IuY2xlYXIoKTsKQEAgLTE2NzQsMTEgKzE3MTMsMTYgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHZzY3JvbGwgPSAwOwogICAgICAgICB9CisgICAgICAgIG1XaGVlbFlWZWxvY2l0eUNvbnRyb2wubW92ZSh3aGVuLCBOVUxMLCAmdnNjcm9sbCk7CisKICAgICAgICAgaWYgKG1IYXZlSFdoZWVsICYmIChmaWVsZHMgJiBBY2N1bXVsYXRvcjo6RklFTERfUkVMX0hXSEVFTCkpIHsKICAgICAgICAgICAgIGhzY3JvbGwgPSBtQWNjdW11bGF0b3IucmVsSFdoZWVsOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaHNjcm9sbCA9IDA7CiAgICAgICAgIH0KKyAgICAgICAgbVdoZWVsWFZlbG9jaXR5Q29udHJvbC5tb3ZlKHdoZW4sICZoc2Nyb2xsLCBOVUxMKTsKKworICAgICAgICBtUG9pbnRlclZlbG9jaXR5Q29udHJvbC5tb3ZlKHdoZW4sICZkZWx0YVgsICZkZWx0YVkpOwogCiAgICAgICAgIGlmIChtUG9pbnRlckNvbnRyb2xsZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgaWYgKGRlbHRhWCAhPSAwIHx8IGRlbHRhWSAhPSAwIHx8IHZzY3JvbGwgIT0gMCB8fCBoc2Nyb2xsICE9IDAKQEAgLTE2OTQsNyArMTczOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+c2V0QnV0dG9uU3RhdGUobUxvY2tlZC5idXR0b25TdGF0ZSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT51bmZhZGUoKTsKKyAgICAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPnVuZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VFJBTlNJVElPTl9JTU1FRElBVEUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmbG9hdCB4LCB5OwpAQCAtMTc3Miw3ICsxODE2LDcgQEAKICAgICB7IC8vIGFjcXVpcmUgbG9jawogICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgICAgICBpZiAobVBvaW50ZXJDb250cm9sbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+ZmFkZSgpOworICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5mYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUUkFOU0lUSU9OX0dSQURVQUwpOwogICAgICAgICB9CiAgICAgfSAvLyByZWxlYXNlIGxvY2sKIH0KQEAgLTE5MjAsNTQgKzE5NjQsODEgQEAKICAgICBtUG9pbnRlckdlc3R1cmUucmVzZXQoKTsKIH0KIAotdm9pZCBUb3VjaElucHV0TWFwcGVyOjpjb25maWd1cmUoKSB7Ci0gICAgSW5wdXRNYXBwZXI6OmNvbmZpZ3VyZSgpOwordm9pZCBUb3VjaElucHV0TWFwcGVyOjpjb25maWd1cmUoY29uc3QgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBjb25maWcsIHVpbnQzMl90IGNoYW5nZXMpIHsKKyAgICBJbnB1dE1hcHBlcjo6Y29uZmlndXJlKGNvbmZpZywgY2hhbmdlcyk7CiAKLSAgICAvLyBDb25maWd1cmUgYmFzaWMgcGFyYW1ldGVycy4KLSAgICBjb25maWd1cmVQYXJhbWV0ZXJzKCk7CisgICAgbUNvbmZpZyA9ICpjb25maWc7CiAKLSAgICAvLyBDb25maWd1cmUgc291cmNlcy4KLSAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmRldmljZVR5cGUpIHsKLSAgICBjYXNlIFBhcmFtZXRlcnM6OkRFVklDRV9UWVBFX1RPVUNIX1NDUkVFTjoKLSAgICAgICAgbVRvdWNoU291cmNlID0gQUlOUFVUX1NPVVJDRV9UT1VDSFNDUkVFTjsKLSAgICAgICAgbVBvaW50ZXJTb3VyY2UgPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBhcmFtZXRlcnM6OkRFVklDRV9UWVBFX1RPVUNIX1BBRDoKLSAgICAgICAgbVRvdWNoU291cmNlID0gQUlOUFVUX1NPVVJDRV9UT1VDSFBBRDsKLSAgICAgICAgbVBvaW50ZXJTb3VyY2UgPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBhcmFtZXRlcnM6OkRFVklDRV9UWVBFX1BPSU5URVI6Ci0gICAgICAgIG1Ub3VjaFNvdXJjZSA9IEFJTlBVVF9TT1VSQ0VfVE9VQ0hQQUQ7Ci0gICAgICAgIG1Qb2ludGVyU291cmNlID0gQUlOUFVUX1NPVVJDRV9NT1VTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FTU0VSVChmYWxzZSk7CisgICAgaWYgKCFjaGFuZ2VzKSB7IC8vIGZpcnN0IHRpbWUgb25seQorICAgICAgICAvLyBDb25maWd1cmUgYmFzaWMgcGFyYW1ldGVycy4KKyAgICAgICAgY29uZmlndXJlUGFyYW1ldGVycygpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBzb3VyY2VzLgorICAgICAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmRldmljZVR5cGUpIHsKKyAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpERVZJQ0VfVFlQRV9UT1VDSF9TQ1JFRU46CisgICAgICAgICAgICBtVG91Y2hTb3VyY2UgPSBBSU5QVVRfU09VUkNFX1RPVUNIU0NSRUVOOworICAgICAgICAgICAgbVBvaW50ZXJTb3VyY2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6REVWSUNFX1RZUEVfVE9VQ0hfUEFEOgorICAgICAgICAgICAgbVRvdWNoU291cmNlID0gQUlOUFVUX1NPVVJDRV9UT1VDSFBBRDsKKyAgICAgICAgICAgIG1Qb2ludGVyU291cmNlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OkRFVklDRV9UWVBFX1BPSU5URVI6CisgICAgICAgICAgICBtVG91Y2hTb3VyY2UgPSBBSU5QVVRfU09VUkNFX1RPVUNIUEFEOworICAgICAgICAgICAgbVBvaW50ZXJTb3VyY2UgPSBBSU5QVVRfU09VUkNFX01PVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbmZpZ3VyZSBhYnNvbHV0ZSBheGlzIGluZm9ybWF0aW9uLgorICAgICAgICBjb25maWd1cmVSYXdBeGVzKCk7CisKKyAgICAgICAgLy8gUHJlcGFyZSBpbnB1dCBkZXZpY2UgY2FsaWJyYXRpb24uCisgICAgICAgIHBhcnNlQ2FsaWJyYXRpb24oKTsKKyAgICAgICAgcmVzb2x2ZUNhbGlicmF0aW9uKCk7CisKKyAgICAgICAgeyAvLyBhY3F1aXJlIGxvY2sKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisKKyAgICAgICAgICAgICAvLyBDb25maWd1cmUgc3VyZmFjZSBkaW1lbnNpb25zIGFuZCBvcmllbnRhdGlvbi4KKyAgICAgICAgICAgIGNvbmZpZ3VyZVN1cmZhY2VMb2NrZWQoKTsKKyAgICAgICAgfSAvLyByZWxlYXNlIGxvY2sKICAgICB9CiAKLSAgICAvLyBDb25maWd1cmUgYWJzb2x1dGUgYXhpcyBpbmZvcm1hdGlvbi4KLSAgICBjb25maWd1cmVSYXdBeGVzKCk7CisgICAgaWYgKCFjaGFuZ2VzIHx8IChjaGFuZ2VzICYgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uOjpDSEFOR0VfUE9JTlRFUl9TUEVFRCkpIHsKKyAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wuc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICBtQ29uZmlnLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzKTsKKyAgICB9CiAKLSAgICAvLyBQcmVwYXJlIGlucHV0IGRldmljZSBjYWxpYnJhdGlvbi4KLSAgICBwYXJzZUNhbGlicmF0aW9uKCk7Ci0gICAgcmVzb2x2ZUNhbGlicmF0aW9uKCk7Ci0KLSAgICB7IC8vIGFjcXVpcmUgbG9jawotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotCi0gICAgICAgICAvLyBDb25maWd1cmUgc3VyZmFjZSBkaW1lbnNpb25zIGFuZCBvcmllbnRhdGlvbi4KLSAgICAgICAgY29uZmlndXJlU3VyZmFjZUxvY2tlZCgpOwotICAgIH0gLy8gcmVsZWFzZSBsb2NrCisgICAgaWYgKCFjaGFuZ2VzIHx8IChjaGFuZ2VzICYgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uOjpDSEFOR0VfUE9JTlRFUl9HRVNUVVJFX0VOQUJMRU1FTlQpKSB7CisgICAgICAgIC8vIFJlc2V0IHRoZSB0b3VjaCBzY3JlZW4gd2hlbiBwb2ludGVyIGdlc3R1cmUgZW5hYmxlbWVudCBjaGFuZ2VzLgorICAgICAgICByZXNldCgpOworICAgIH0KIH0KIAogdm9pZCBUb3VjaElucHV0TWFwcGVyOjpjb25maWd1cmVQYXJhbWV0ZXJzKCkgewotICAgIG1QYXJhbWV0ZXJzLnVzZUJhZFRvdWNoRmlsdGVyID0gZ2V0UG9saWN5KCktPmZpbHRlclRvdWNoRXZlbnRzKCk7Ci0gICAgbVBhcmFtZXRlcnMudXNlQXZlcmFnaW5nVG91Y2hGaWx0ZXIgPSBnZXRQb2xpY3koKS0+ZmlsdGVyVG91Y2hFdmVudHMoKTsKLSAgICBtUGFyYW1ldGVycy51c2VKdW1weVRvdWNoRmlsdGVyID0gZ2V0UG9saWN5KCktPmZpbHRlckp1bXB5VG91Y2hFdmVudHMoKTsKLSAgICBtUGFyYW1ldGVycy52aXJ0dWFsS2V5UXVpZXRUaW1lID0gZ2V0UG9saWN5KCktPmdldFZpcnR1YWxLZXlRdWlldFRpbWUoKTsKKyAgICBtUGFyYW1ldGVycy51c2VCYWRUb3VjaEZpbHRlciA9IG1Db25maWcuZmlsdGVyVG91Y2hFdmVudHM7CisgICAgbVBhcmFtZXRlcnMudXNlQXZlcmFnaW5nVG91Y2hGaWx0ZXIgPSBtQ29uZmlnLmZpbHRlclRvdWNoRXZlbnRzOworICAgIG1QYXJhbWV0ZXJzLnVzZUp1bXB5VG91Y2hGaWx0ZXIgPSBtQ29uZmlnLmZpbHRlckp1bXB5VG91Y2hFdmVudHM7CiAKLSAgICAvLyBUT0RPOiBNYWtlIHRoaXMgY29uZmlndXJhYmxlLgotICAgIC8vbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfUE9JTlRFUjsKLSAgICBtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUzsKKyAgICAvLyBVc2UgdGhlIHBvaW50ZXIgcHJlc2VudGF0aW9uIG1vZGUgZm9yIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBkaXN0aW5jdAorICAgIC8vIG11bHRpdG91Y2guICBUaGUgc3BvdC1iYXNlZCBwcmVzZW50YXRpb24gcmVsaWVzIG9uIGJlaW5nIGFibGUgdG8gYWNjdXJhdGVseQorICAgIC8vIGxvY2F0ZSB0d28gb3IgbW9yZSBmaW5nZXJzIG9uIHRoZSB0b3VjaCBwYWQuCisgICAgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPSBnZXRFdmVudEh1YigpLT5oYXNJbnB1dFByb3BlcnR5KGdldERldmljZUlkKCksIElOUFVUX1BST1BfU0VNSV9NVCkKKyAgICAgICAgICAgID8gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1BPSU5URVIgOiBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfU1BPVFM7CisKKyAgICBTdHJpbmc4IGdlc3R1cmVNb2RlU3RyaW5nOworICAgIGlmIChnZXREZXZpY2UoKS0+Z2V0Q29uZmlndXJhdGlvbigpLnRyeUdldFByb3BlcnR5KFN0cmluZzgoInRvdWNoLmdlc3R1cmVNb2RlIiksCisgICAgICAgICAgICBnZXN0dXJlTW9kZVN0cmluZykpIHsKKyAgICAgICAgaWYgKGdlc3R1cmVNb2RlU3RyaW5nID09ICJwb2ludGVyIikgeworICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfUE9JTlRFUjsKKyAgICAgICAgfSBlbHNlIGlmIChnZXN0dXJlTW9kZVN0cmluZyA9PSAic3BvdHMiKSB7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUzsKKyAgICAgICAgfSBlbHNlIGlmIChnZXN0dXJlTW9kZVN0cmluZyAhPSAiZGVmYXVsdCIpIHsKKyAgICAgICAgICAgIExPR1coIkludmFsaWQgdmFsdWUgZm9yIHRvdWNoLmdlc3R1cmVNb2RlOiAnJXMnIiwgZ2VzdHVyZU1vZGVTdHJpbmcuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKGdldEV2ZW50SHViKCktPmhhc1JlbGF0aXZlQXhpcyhnZXREZXZpY2VJZCgpLCBSRUxfWCkKICAgICAgICAgICAgIHx8IGdldEV2ZW50SHViKCktPmhhc1JlbGF0aXZlQXhpcyhnZXREZXZpY2VJZCgpLCBSRUxfWSkpIHsKQEAgLTE5OTQsNyArMjA2NSw3IEBACiAgICAgICAgICAgICBtUGFyYW1ldGVycy5kZXZpY2VUeXBlID0gUGFyYW1ldGVyczo6REVWSUNFX1RZUEVfVE9VQ0hfUEFEOwogICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVTdHJpbmcgPT0gInBvaW50ZXIiKSB7CiAgICAgICAgICAgICBtUGFyYW1ldGVycy5kZXZpY2VUeXBlID0gUGFyYW1ldGVyczo6REVWSUNFX1RZUEVfUE9JTlRFUjsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VUeXBlU3RyaW5nICE9ICJkZWZhdWx0IikgewogICAgICAgICAgICAgTE9HVygiSW52YWxpZCB2YWx1ZSBmb3IgdG91Y2guZGV2aWNlVHlwZTogJyVzJyIsIGRldmljZVR5cGVTdHJpbmcuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAxMiw2ICsyMDgzLDE3IEBACiB2b2lkIFRvdWNoSW5wdXRNYXBwZXI6OmR1bXBQYXJhbWV0ZXJzKFN0cmluZzgmIGR1bXApIHsKICAgICBkdW1wLmFwcGVuZChJTkRFTlQzICJQYXJhbWV0ZXJzOlxuIik7CiAKKyAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlKSB7CisgICAgY2FzZSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfUE9JTlRFUjoKKyAgICAgICAgZHVtcC5hcHBlbmQoSU5ERU5UNCAiR2VzdHVyZU1vZGU6IHBvaW50ZXJcbiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUzoKKyAgICAgICAgZHVtcC5hcHBlbmQoSU5ERU5UNCAiR2VzdHVyZU1vZGU6IHNwb3RzXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICB9CisKICAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmRldmljZVR5cGUpIHsKICAgICBjYXNlIFBhcmFtZXRlcnM6OkRFVklDRV9UWVBFX1RPVUNIX1NDUkVFTjoKICAgICAgICAgZHVtcC5hcHBlbmQoSU5ERU5UNCAiRGV2aWNlVHlwZTogdG91Y2hTY3JlZW5cbiIpOwpAQCAtMjM2NSwyNiArMjQ0NywyNiBAQAogICAgICAgICAgICAgICAgICAgICBtTG9ja2VkLmFzc29jaWF0ZWREaXNwbGF5SGVpZ2h0KTsKIAogICAgICAgICAgICAgLy8gU2NhbGUgbW92ZW1lbnRzIHN1Y2ggdGhhdCBvbmUgd2hvbGUgc3dpcGUgb2YgdGhlIHRvdWNoIHBhZCBjb3ZlcnMgYQotICAgICAgICAgICAgLy8gZ2l2ZW4gYXJlYSByZWxhdGl2ZSB0byB0aGUgZGlhZ29uYWwgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKyAgICAgICAgICAgIC8vIGdpdmVuIGFyZWEgcmVsYXRpdmUgdG8gdGhlIGRpYWdvbmFsIHNpemUgb2YgdGhlIGRpc3BsYXkgd2hlbiBubyBhY2NlbGVyYXRpb24KKyAgICAgICAgICAgIC8vIGlzIGFwcGxpZWQuCiAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCB0aGUgdG91Y2ggcGFkIGhhcyBhIHNxdWFyZSBhc3BlY3QgcmF0aW8gc3VjaCB0aGF0IG1vdmVtZW50cyBpbgogICAgICAgICAgICAgLy8gWCBhbmQgWSBvZiB0aGUgc2FtZSBudW1iZXIgb2YgcmF3IHVuaXRzIGNvdmVyIHRoZSBzYW1lIHBoeXNpY2FsIGRpc3RhbmNlLgotICAgICAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVGYWN0b3IgPSAwLjhmOwotCi0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGUgPSBHRVNUVVJFX01PVkVNRU5UX1NQRUVEX1JBVElPCisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGUgPSBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlTW92ZW1lbnRTcGVlZFJhdGlvCiAgICAgICAgICAgICAgICAgICAgICogZGlzcGxheURpYWdvbmFsIC8gcmF3RGlhZ29uYWw7CiAgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWU1vdmVtZW50U2NhbGUgPSBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGU7CiAKICAgICAgICAgICAgIC8vIFNjYWxlIHpvb21zIHRvIGNvdmVyIGEgc21hbGxlciByYW5nZSBvZiB0aGUgZGlzcGxheSB0aGFuIG1vdmVtZW50cyBkby4KICAgICAgICAgICAgIC8vIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgYXJlYSBhcm91bmQgdGhlIHBvaW50ZXIgdGhhdCBpcyBhZmZlY3RlZCBieSBmcmVlZm9ybQogICAgICAgICAgICAgLy8gcG9pbnRlciBnZXN0dXJlcy4KLSAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYWm9vbVNjYWxlID0gR0VTVFVSRV9aT09NX1NQRUVEX1JBVElPCisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWFpvb21TY2FsZSA9IG1Db25maWcucG9pbnRlckdlc3R1cmVab29tU3BlZWRSYXRpbwogICAgICAgICAgICAgICAgICAgICAqIGRpc3BsYXlEaWFnb25hbCAvIHJhd0RpYWdvbmFsOwogICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlab29tU2NhbGUgPSBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWFpvb21TY2FsZTsKIAogICAgICAgICAgICAgLy8gTWF4IHdpZHRoIGJldHdlZW4gcG9pbnRlcnMgdG8gZGV0ZWN0IGEgc3dpcGUgZ2VzdHVyZSBpcyBtb3JlIHRoYW4gc29tZSBmcmFjdGlvbgogICAgICAgICAgICAgLy8gb2YgdGhlIGRpYWdvbmFsIGF4aXMgb2YgdGhlIHRvdWNoIHBhZC4gIFRvdWNoZXMgdGhhdCBhcmUgd2lkZXIgdGhhbiB0aGlzIGFyZQogICAgICAgICAgICAgLy8gdHJhbnNsYXRlZCBpbnRvIGZyZWVmb3JtIGdlc3R1cmVzLgotICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyR2VzdHVyZU1heFN3aXBlV2lkdGggPSBTV0lQRV9NQVhfV0lEVEhfUkFUSU8gKiByYXdEaWFnb25hbDsKKyAgICAgICAgICAgIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVNYXhTd2lwZVdpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5wb2ludGVyR2VzdHVyZVN3aXBlTWF4V2lkdGhSYXRpbyAqIHJhd0RpYWdvbmFsOwogCiAgICAgICAgICAgICAvLyBSZXNldCB0aGUgY3VycmVudCBwb2ludGVyIGdlc3R1cmUuCiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVzZXQoKTsKQEAgLTI4NzAsNiArMjk1Miw3IEBACiAKICAgICAgICAgaWYgKG1Qb2ludGVyQ29udHJvbGxlciAhPSBOVUxMCiAgICAgICAgICAgICAgICAgJiYgbVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7CisgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmZhZGUoUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlRSQU5TSVRJT05fR1JBRFVBTCk7CiAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmNsZWFyU3BvdHMoKTsKICAgICAgICAgfQogICAgIH0gLy8gcmVsZWFzZSBsb2NrCkBAIC0yOTUwLDcgKzMwMzMsNyBAQAogICAgICAgICB0b3VjaFJlc3VsdCA9IGNvbnN1bWVPZmZTY3JlZW5Ub3VjaGVzKHdoZW4sIHBvbGljeUZsYWdzKTsKICAgICAgICAgaWYgKHRvdWNoUmVzdWx0ID09IERJU1BBVENIX1RPVUNIKSB7CiAgICAgICAgICAgICBzdXBwcmVzc1N3aXBlT250b1ZpcnR1YWxLZXlzKHdoZW4pOwotICAgICAgICAgICAgaWYgKG1Qb2ludGVyQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobVBvaW50ZXJDb250cm9sbGVyICE9IE5VTEwgJiYgbUNvbmZpZy5wb2ludGVyR2VzdHVyZXNFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgZGlzcGF0Y2hQb2ludGVyR2VzdHVyZXMod2hlbiwgcG9saWN5RmxhZ3MsIGZhbHNlIC8qaXNUaW1lb3V0Ki8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGlzcGF0Y2hUb3VjaGVzKHdoZW4sIHBvbGljeUZsYWdzKTsKQEAgLTMxMDcsOCArMzE5MCw4IEBACiAgICAgLy8gICAgYXJlYSBhbmQgYWNjaWRlbnRhbGx5IHRyaWdnZXJzIGEgdmlydHVhbCBrZXkuICBUaGlzIG9mdGVuIGhhcHBlbnMgd2hlbiB2aXJ0dWFsIGtleXMKICAgICAvLyAgICBhcmUgbGF5ZWQgb3V0IGJlbG93IHRoZSBzY3JlZW4gbmVhciB0byB3aGVyZSB0aGUgb24gc2NyZWVuIGtleWJvYXJkJ3Mgc3BhY2UgYmFyCiAgICAgLy8gICAgaXMgZGlzcGxheWVkLgotICAgIGlmIChtUGFyYW1ldGVycy52aXJ0dWFsS2V5UXVpZXRUaW1lID4gMCAmJiBtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCAhPSAwKSB7Ci0gICAgICAgIG1Db250ZXh0LT5kaXNhYmxlVmlydHVhbEtleXNVbnRpbCh3aGVuICsgbVBhcmFtZXRlcnMudmlydHVhbEtleVF1aWV0VGltZSk7CisgICAgaWYgKG1Db25maWcudmlydHVhbEtleVF1aWV0VGltZSA+IDAgJiYgbUN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgIT0gMCkgeworICAgICAgICBtQ29udGV4dC0+ZGlzYWJsZVZpcnR1YWxLZXlzVW50aWwod2hlbiArIG1Db25maWcudmlydHVhbEtleVF1aWV0VGltZSk7CiAgICAgfQogfQogCkBAIC0zNDUxLDEyICszNTM0LDYgQEAKIAogdm9pZCBUb3VjaElucHV0TWFwcGVyOjpkaXNwYXRjaFBvaW50ZXJHZXN0dXJlcyhuc2Vjc190IHdoZW4sIHVpbnQzMl90IHBvbGljeUZsYWdzLAogICAgICAgICBib29sIGlzVGltZW91dCkgewotICAgIC8vIFN3aXRjaCBwb2ludGVyIHByZXNlbnRhdGlvbi4KLSAgICBtUG9pbnRlckNvbnRyb2xsZXItPnNldFByZXNlbnRhdGlvbigKLSAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUwotICAgICAgICAgICAgICAgICAgICA/IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpQUkVTRU5UQVRJT05fU1BPVAotICAgICAgICAgICAgICAgICAgICA6IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpQUkVTRU5UQVRJT05fUE9JTlRFUik7Ci0KICAgICAvLyBVcGRhdGUgY3VycmVudCBnZXN0dXJlIGNvb3JkaW5hdGVzLgogICAgIGJvb2wgY2FuY2VsUHJldmlvdXNHZXN0dXJlLCBmaW5pc2hQcmV2aW91c0dlc3R1cmU7CiAgICAgYm9vbCBzZW5kRXZlbnRzID0gcHJlcGFyZVBvaW50ZXJHZXN0dXJlcyh3aGVuLApAQCAtMzQ2NCwxMSArMzU0MSw1MyBAQAogICAgIGlmICghc2VuZEV2ZW50cykgewogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIGlmIChmaW5pc2hQcmV2aW91c0dlc3R1cmUpIHsKKyAgICAgICAgY2FuY2VsUHJldmlvdXNHZXN0dXJlID0gZmFsc2U7CisgICAgfQogCi0gICAgLy8gU2hvdyB0aGUgcG9pbnRlciBpZiBuZWVkZWQuCi0gICAgaWYgKG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgIT0gUG9pbnRlckdlc3R1cmU6Ok5FVVRSQUwKLSAgICAgICAgICAgICYmIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgIT0gUG9pbnRlckdlc3R1cmU6OlFVSUVUKSB7Ci0gICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+dW5mYWRlKCk7CisgICAgLy8gVXBkYXRlIHRoZSBwb2ludGVyIHByZXNlbnRhdGlvbiBhbmQgc3BvdHMuCisgICAgaWYgKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUykgeworICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPnNldFByZXNlbnRhdGlvbihQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6UFJFU0VOVEFUSU9OX1NQT1QpOworICAgICAgICBpZiAoZmluaXNoUHJldmlvdXNHZXN0dXJlIHx8IGNhbmNlbFByZXZpb3VzR2VzdHVyZSkgeworICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5jbGVhclNwb3RzKCk7CisgICAgICAgIH0KKyAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5zZXRTcG90cyhtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVDb29yZHMsCisgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlSWRUb0luZGV4LAorICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZUlkQml0cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5zZXRQcmVzZW50YXRpb24oUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlBSRVNFTlRBVElPTl9QT0lOVEVSKTsKKyAgICB9CisKKyAgICAvLyBTaG93IG9yIGhpZGUgdGhlIHBvaW50ZXIgaWYgbmVlZGVkLgorICAgIHN3aXRjaCAobVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSkgeworICAgIGNhc2UgUG9pbnRlckdlc3R1cmU6Ok5FVVRSQUw6CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6UVVJRVQ6CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9PSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfU1BPVFMKKyAgICAgICAgICAgICAgICAmJiAobVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSA9PSBQb2ludGVyR2VzdHVyZTo6U1dJUEUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgPT0gUG9pbnRlckdlc3R1cmU6OkZSRUVGT1JNKSkgeworICAgICAgICAgICAgLy8gUmVtaW5kIHRoZSB1c2VyIG9mIHdoZXJlIHRoZSBwb2ludGVyIGlzIGFmdGVyIGZpbmlzaGluZyBhIGdlc3R1cmUgd2l0aCBzcG90cy4KKyAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+dW5mYWRlKFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpUUkFOU0lUSU9OX0dSQURVQUwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUG9pbnRlckdlc3R1cmU6OlRBUDoKKyAgICBjYXNlIFBvaW50ZXJHZXN0dXJlOjpUQVBfRFJBRzoKKyAgICBjYXNlIFBvaW50ZXJHZXN0dXJlOjpCVVRUT05fQ0xJQ0tfT1JfRFJBRzoKKyAgICBjYXNlIFBvaW50ZXJHZXN0dXJlOjpIT1ZFUjoKKyAgICBjYXNlIFBvaW50ZXJHZXN0dXJlOjpQUkVTUzoKKyAgICAgICAgLy8gVW5mYWRlIHRoZSBwb2ludGVyIHdoZW4gdGhlIGN1cnJlbnQgZ2VzdHVyZSBtYW5pcHVsYXRlcyB0aGUKKyAgICAgICAgLy8gYXJlYSBkaXJlY3RseSB1bmRlciB0aGUgcG9pbnRlci4KKyAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT51bmZhZGUoUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlRSQU5TSVRJT05fSU1NRURJQVRFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6U1dJUEU6CisgICAgY2FzZSBQb2ludGVyR2VzdHVyZTo6RlJFRUZPUk06CisgICAgICAgIC8vIEZhZGUgdGhlIHBvaW50ZXIgd2hlbiB0aGUgY3VycmVudCBnZXN0dXJlIG1hbmlwdWxhdGVzIGEgZGlmZmVyZW50CisgICAgICAgIC8vIGFyZWEgYW5kIHRoZXJlIGFyZSBzcG90cyB0byBndWlkZSB0aGUgdXNlciBleHBlcmllbmNlLgorICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7CisgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmZhZGUoUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlRSQU5TSVRJT05fR1JBRFVBTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPnVuZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VFJBTlNJVElPTl9JTU1FRElBVEUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8vIFNlbmQgZXZlbnRzIQpAQCAtMzYyMCw5ICszNzM5LDEwIEBACiAjZW5kaWYKIAogICAgICAgICBpZiAobVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSA9PSBQb2ludGVyR2VzdHVyZTo6VEFQKSB7Ci0gICAgICAgICAgICBpZiAod2hlbiA8PSBtUG9pbnRlckdlc3R1cmUudGFwVXBUaW1lICsgVEFQX0RSQUdfSU5URVJWQUwpIHsKKyAgICAgICAgICAgIGlmICh3aGVuIDw9IG1Qb2ludGVyR2VzdHVyZS50YXBVcFRpbWUgKyBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlVGFwRHJhZ0ludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIHRhcC9kcmFnIHRpbWVvdXQgaGFzIG5vdCB5ZXQgZXhwaXJlZC4KLSAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCktPnJlcXVlc3RUaW1lb3V0QXRUaW1lKG1Qb2ludGVyR2VzdHVyZS50YXBVcFRpbWUgKyBUQVBfRFJBR19JTlRFUlZBTCk7CisgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLT5yZXF1ZXN0VGltZW91dEF0VGltZShtUG9pbnRlckdlc3R1cmUudGFwVXBUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICArIG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgdGFwIGlzIGZpbmlzaGVkLgogI2lmIERFQlVHX0dFU1RVUkVTCkBAIC0zNjM0LDExICszNzU0LDcgQEAKICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6Ok5FVVRSQUw7CiAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlSWRCaXRzLmNsZWFyKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90R2VzdHVyZSA9IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfTkVVVFJBTDsKLSAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVNwb3RzTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM2OTEsNyArMzgwNyw3IEBACiAgICAgaWYgKGFjdGl2ZVRvdWNoSWQgPCAwKSB7CiAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZXNldFF1aWV0VGltZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzUXVpZXRUaW1lID0gd2hlbiA8IG1Qb2ludGVyR2VzdHVyZS5xdWlldFRpbWUgKyBRVUlFVF9JTlRFUlZBTDsKKyAgICAgICAgaXNRdWlldFRpbWUgPSB3aGVuIDwgbVBvaW50ZXJHZXN0dXJlLnF1aWV0VGltZSArIG1Db25maWcucG9pbnRlckdlc3R1cmVRdWlldEludGVydmFsOwogICAgICAgICBpZiAoIWlzUXVpZXRUaW1lKSB7CiAgICAgICAgICAgICBpZiAoKG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgPT0gUG9pbnRlckdlc3R1cmU6OlBSRVNTCiAgICAgICAgICAgICAgICAgICAgIHx8IG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgPT0gUG9pbnRlckdlc3R1cmU6OlNXSVBFCkBAIC0zNzE5LDIwICszODM1LDE4IEBACiAgICAgaWYgKGlzUXVpZXRUaW1lKSB7CiAgICAgICAgIC8vIENhc2UgMTogUXVpZXQgdGltZS4gKFFVSUVUKQogI2lmIERFQlVHX0dFU1RVUkVTCi0gICAgICAgIExPR0QoIkdlc3R1cmVzOiBRVUlFVCBmb3IgbmV4dCAlMC4zZm1zIiwKLSAgICAgICAgICAgICAgICAobVBvaW50ZXJHZXN0dXJlLnF1aWV0VGltZSArIFFVSUVUX0lOVEVSVkFMIC0gd2hlbikgKiAwLjAwMDAwMWYpOworICAgICAgICBMT0dEKCJHZXN0dXJlczogUVVJRVQgZm9yIG5leHQgJTAuM2ZtcyIsIChtUG9pbnRlckdlc3R1cmUucXVpZXRUaW1lCisgICAgICAgICAgICAgICAgKyBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlUXVpZXRJbnRlcnZhbCAtIHdoZW4pICogMC4wMDAwMDFmKTsKICNlbmRpZgotICAgICAgICAqb3V0RmluaXNoUHJldmlvdXNHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgIT0gUG9pbnRlckdlc3R1cmU6OlFVSUVUKSB7CisgICAgICAgICAgICAqb3V0RmluaXNoUHJldmlvdXNHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgfQogCiAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5hY3RpdmVHZXN0dXJlSWQgPSAtMTsKICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpRVUlFVDsKICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlSWRCaXRzLmNsZWFyKCk7CiAKLSAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUykgewotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RHZXN0dXJlID0gUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlNQT1RfR0VTVFVSRV9ORVVUUkFMOwotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMuY2xlYXIoKTsKLSAgICAgICAgICAgIG1vdmVTcG90c0xvY2tlZCgpOwotICAgICAgICB9CisgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CiAgICAgfSBlbHNlIGlmIChpc1BvaW50ZXJEb3duKG1DdXJyZW50VG91Y2guYnV0dG9uU3RhdGUpKSB7CiAgICAgICAgIC8vIENhc2UgMjogQnV0dG9uIGlzIHByZXNzZWQuIChCVVRUT05fQ0xJQ0tfT1JfRFJBRykKICAgICAgICAgLy8gVGhlIHBvaW50ZXIgZm9sbG93cyB0aGUgYWN0aXZlIHRvdWNoIHBvaW50LgpAQCAtMzc1OSw0NiArMzg3Myw0OCBAQAogCiAgICAgICAgIC8vIFN3aXRjaCBwb2ludGVycyBpZiBuZWVkZWQuCiAgICAgICAgIC8vIEZpbmQgdGhlIGZhc3Rlc3QgcG9pbnRlciBhbmQgZm9sbG93IGl0LgotICAgICAgICBpZiAoYWN0aXZlVG91Y2hJZCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBiZXN0SWQgPSAtMTsKLSAgICAgICAgICAgICAgICBmbG9hdCBiZXN0U3BlZWQgPSBEUkFHX01JTl9TV0lUQ0hfU1BFRUQ7Ci0gICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBtQ3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLmlkOwotICAgICAgICAgICAgICAgICAgICBmbG9hdCB2eCwgdnk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUudmVsb2NpdHlUcmFja2VyLmdldFZlbG9jaXR5KGlkLCAmdngsICZ2eSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gaHlwb3RmKHZ4LCB2eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgPiBiZXN0U3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0SWQgPSBpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0U3BlZWQgPSBzcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGl2ZVRvdWNoSWQgPj0gMCAmJiBtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIGludDMyX3QgYmVzdElkID0gLTE7CisgICAgICAgICAgICBmbG9hdCBiZXN0U3BlZWQgPSBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlRHJhZ01pblN3aXRjaFNwZWVkOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbaV0uaWQ7CisgICAgICAgICAgICAgICAgZmxvYXQgdngsIHZ5OworICAgICAgICAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUudmVsb2NpdHlUcmFja2VyLmdldFZlbG9jaXR5KGlkLCAmdngsICZ2eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSBoeXBvdGYodngsIHZ5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkID4gYmVzdFNwZWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0SWQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTcGVlZCA9IHNwZWVkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChiZXN0SWQgPj0gMCAmJiBiZXN0SWQgIT0gYWN0aXZlVG91Y2hJZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuYWN0aXZlVG91Y2hJZCA9IGFjdGl2ZVRvdWNoSWQgPSBiZXN0SWQ7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRvdWNoQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmVzdElkID49IDAgJiYgYmVzdElkICE9IGFjdGl2ZVRvdWNoSWQpIHsKKyAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuYWN0aXZlVG91Y2hJZCA9IGFjdGl2ZVRvdWNoSWQgPSBiZXN0SWQ7CisgICAgICAgICAgICAgICAgYWN0aXZlVG91Y2hDaGFuZ2VkID0gdHJ1ZTsKICNpZiBERUJVR19HRVNUVVJFUwotICAgICAgICAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogQlVUVE9OX0NMSUNLX09SX0RSQUcgc3dpdGNoZWQgcG9pbnRlcnMsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVzdElkPSVkLCBiZXN0U3BlZWQ9JTAuM2YiLCBiZXN0SWQsIGJlc3RTcGVlZCk7CisgICAgICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IEJVVFRPTl9DTElDS19PUl9EUkFHIHN3aXRjaGVkIHBvaW50ZXJzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYmVzdElkPSVkLCBiZXN0U3BlZWQ9JTAuM2YiLCBiZXN0SWQsIGJlc3RTcGVlZCk7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1MYXN0VG91Y2guaWRCaXRzLmhhc0JpdChhY3RpdmVUb3VjaElkKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJEYXRhJiBjdXJyZW50UG9pbnRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRvdWNoLnBvaW50ZXJzW21DdXJyZW50VG91Y2guaWRUb0luZGV4W2FjdGl2ZVRvdWNoSWRdXTsKLSAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyRGF0YSYgbGFzdFBvaW50ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUb3VjaC5wb2ludGVyc1ttTGFzdFRvdWNoLmlkVG9JbmRleFthY3RpdmVUb3VjaElkXV07Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFYID0gKGN1cnJlbnRQb2ludGVyLnggLSBsYXN0UG9pbnRlci54KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGU7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFZID0gKGN1cnJlbnRQb2ludGVyLnkgLSBsYXN0UG9pbnRlci55KQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWU1vdmVtZW50U2NhbGU7CisgICAgICAgIGlmIChhY3RpdmVUb3VjaElkID49IDAgJiYgbUxhc3RUb3VjaC5pZEJpdHMuaGFzQml0KGFjdGl2ZVRvdWNoSWQpKSB7CisgICAgICAgICAgICBjb25zdCBQb2ludGVyRGF0YSYgY3VycmVudFBvaW50ZXIgPQorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRvdWNoLnBvaW50ZXJzW21DdXJyZW50VG91Y2guaWRUb0luZGV4W2FjdGl2ZVRvdWNoSWRdXTsKKyAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJEYXRhJiBsYXN0UG9pbnRlciA9CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2gucG9pbnRlcnNbbUxhc3RUb3VjaC5pZFRvSW5kZXhbYWN0aXZlVG91Y2hJZF1dOworICAgICAgICAgICAgZmxvYXQgZGVsdGFYID0gKGN1cnJlbnRQb2ludGVyLnggLSBsYXN0UG9pbnRlci54KQorICAgICAgICAgICAgICAgICAgICAqIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYTW92ZW1lbnRTY2FsZTsKKyAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IChjdXJyZW50UG9pbnRlci55IC0gbGFzdFBvaW50ZXIueSkKKyAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWU1vdmVtZW50U2NhbGU7CiAKLSAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSBwb2ludGVyIHVzaW5nIGEgcmVsYXRpdmUgbW90aW9uLgotICAgICAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgc3BvdHMsIHRoZSBjbGljayB3aWxsIG9jY3VyIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5jaG9yCi0gICAgICAgICAgICAgICAgLy8gc3BvdCBhbmQgYWxsIG90aGVyIHNwb3RzIHdpbGwgbW92ZSB0aGVyZS4KLSAgICAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPm1vdmUoZGVsdGFYLCBkZWx0YVkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wubW92ZSh3aGVuLCAmZGVsdGFYLCAmZGVsdGFZKTsKKworICAgICAgICAgICAgLy8gTW92ZSB0aGUgcG9pbnRlciB1c2luZyBhIHJlbGF0aXZlIG1vdGlvbi4KKyAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgc3BvdHMsIHRoZSBjbGljayB3aWxsIG9jY3VyIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5jaG9yCisgICAgICAgICAgICAvLyBzcG90IGFuZCBhbGwgb3RoZXIgc3BvdHMgd2lsbCBtb3ZlIHRoZXJlLgorICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5tb3ZlKGRlbHRhWCwgZGVsdGFZKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBmbG9hdCB4LCB5OwpAQCAtMzgxNiw0OSArMzkzMiwzMCBAQAogICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVDb29yZHNbMF0uc2V0QXhpc1ZhbHVlKEFNT1RJT05fRVZFTlRfQVhJU19YLCB4KTsKICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlQ29vcmRzWzBdLnNldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfWSwgeSk7CiAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZUNvb3Jkc1swXS5zZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1BSRVNTVVJFLCAxLjBmKTsKLQotICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlVG91Y2hJZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29sbGFwc2UgYWxsIHNwb3RzIGludG8gb25lIHBvaW50IGF0IHRoZSBwb2ludGVyIGxvY2F0aW9uLgotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90R2VzdHVyZSA9IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfQlVUVE9OX0RSQUc7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbaV0uaWQ7Ci0gICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90SWRCaXRzLm1hcmtCaXQoaWQpOwotICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkVG9JbmRleFtpZF0gPSBpOwotICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdENvb3Jkc1tpXSA9IG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZUNvb3Jkc1swXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE5vIGZpbmdlcnMuICBHZW5lcmF0ZSBhIHNwb3QgYXQgdGhlIHBvaW50ZXIgbG9jYXRpb24gc28gdGhlCi0gICAgICAgICAgICAgICAgLy8gYW5jaG9yIGFwcGVhcnMgdG8gYmUgcHJlc3NlZC4KLSAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdEdlc3R1cmUgPSBQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6U1BPVF9HRVNUVVJFX0JVVFRPTl9DTElDSzsKLSAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkQml0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90SWRCaXRzLm1hcmtCaXQoMCk7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZFRvSW5kZXhbMF0gPSAwOwotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90Q29vcmRzWzBdID0gbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlQ29vcmRzWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW92ZVNwb3RzTG9ja2VkKCk7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID09IDApIHsKICAgICAgICAgLy8gQ2FzZSAzLiBObyBmaW5nZXJzIGRvd24gYW5kIGJ1dHRvbiBpcyBub3QgcHJlc3NlZC4gKE5FVVRSQUwpCi0gICAgICAgICpvdXRGaW5pc2hQcmV2aW91c0dlc3R1cmUgPSB0cnVlOworICAgICAgICBpZiAobVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSAhPSBQb2ludGVyR2VzdHVyZTo6TkVVVFJBTCkgeworICAgICAgICAgICAgKm91dEZpbmlzaFByZXZpb3VzR2VzdHVyZSA9IHRydWU7CisgICAgICAgIH0KIAogICAgICAgICAvLyBXYXRjaCBmb3IgdGFwcyBjb21pbmcgb3V0IG9mIEhPVkVSIG9yIFRBUF9EUkFHIG1vZGUuCisgICAgICAgIC8vIENoZWNraW5nIGZvciB0YXBzIGFmdGVyIFRBUF9EUkFHIGFsbG93cyB1cyB0byBkZXRlY3QgZG91YmxlLXRhcHMuCiAgICAgICAgIGJvb2wgdGFwcGVkID0gZmFsc2U7CiAgICAgICAgIGlmICgobVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSA9PSBQb2ludGVyR2VzdHVyZTo6SE9WRVIKICAgICAgICAgICAgICAgICB8fCBtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpUQVBfRFJBRykKICAgICAgICAgICAgICAgICAmJiBtTGFzdFRvdWNoLnBvaW50ZXJDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICBpZiAod2hlbiA8PSBtUG9pbnRlckdlc3R1cmUudGFwRG93blRpbWUgKyBUQVBfSU5URVJWQUwpIHsKKyAgICAgICAgICAgIGlmICh3aGVuIDw9IG1Qb2ludGVyR2VzdHVyZS50YXBEb3duVGltZSArIG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgIGZsb2F0IHgsIHk7CiAgICAgICAgICAgICAgICAgbVBvaW50ZXJDb250cm9sbGVyLT5nZXRQb3NpdGlvbigmeCwgJnkpOwotICAgICAgICAgICAgICAgIGlmIChmYWJzKHggLSBtUG9pbnRlckdlc3R1cmUudGFwWCkgPD0gVEFQX1NMT1AKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGZhYnMoeSAtIG1Qb2ludGVyR2VzdHVyZS50YXBZKSA8PSBUQVBfU0xPUCkgeworICAgICAgICAgICAgICAgIGlmIChmYWJzKHggLSBtUG9pbnRlckdlc3R1cmUudGFwWCkgPD0gbUNvbmZpZy5wb2ludGVyR2VzdHVyZVRhcFNsb3AKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZhYnMoeSAtIG1Qb2ludGVyR2VzdHVyZS50YXBZKSA8PSBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlVGFwU2xvcCkgewogI2lmIERFQlVHX0dFU1RVUkVTCiAgICAgICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBUQVAiKTsKICNlbmRpZgogCiAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS50YXBVcFRpbWUgPSB3aGVuOwotICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCktPnJlcXVlc3RUaW1lb3V0QXRUaW1lKHdoZW4gKyBUQVBfRFJBR19JTlRFUlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKS0+cmVxdWVzdFRpbWVvdXRBdFRpbWUod2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUNvbmZpZy5wb2ludGVyR2VzdHVyZVRhcERyYWdJbnRlcnZhbCk7CiAKICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZUdlc3R1cmVJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBQb2ludGVyR2VzdHVyZTo6VEFQOwpAQCAtMzg4MCwxNSArMzk3Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZUNvb3Jkc1swXS5zZXRBeGlzVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1PVElPTl9FVkVOVF9BWElTX1BSRVNTVVJFLCAxLjBmKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdEdlc3R1cmUgPSBQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6U1BPVF9HRVNUVVJFX1RBUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90SWRCaXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkQml0cy5tYXJrQml0KGxhc3RBY3RpdmVUb3VjaElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90SWRUb0luZGV4W2xhc3RBY3RpdmVUb3VjaElkXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdENvb3Jkc1swXSA9IG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZUNvb3Jkc1swXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVTcG90c0xvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICAgICAgdGFwcGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogI2lmIERFQlVHX0dFU1RVUkVTCkBAIC0zOTA1LDYgKzM5OTMsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKKwogICAgICAgICBpZiAoIXRhcHBlZCkgewogI2lmIERFQlVHX0dFU1RVUkVTCiAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogTkVVVFJBTCIpOwpAQCAtMzkxMiwxMiArNDAwMiw2IEBACiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuYWN0aXZlR2VzdHVyZUlkID0gLTE7CiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6Ok5FVVRSQUw7CiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVJZEJpdHMuY2xlYXIoKTsKLQotICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUykgewotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90R2VzdHVyZSA9IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfTkVVVFJBTDsKLSAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkQml0cy5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1vdmVTcG90c0xvY2tlZCgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCA9PSAxKSB7CiAgICAgICAgIC8vIENhc2UgNC4gRXhhY3RseSBvbmUgZmluZ2VyIGRvd24sIGJ1dHRvbiBpcyBub3QgcHJlc3NlZC4gKEhPVkVSIG9yIFRBUF9EUkFHKQpAQCAtMzkyOCwxMSArNDAxMiwxMSBAQAogCiAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBQb2ludGVyR2VzdHVyZTo6SE9WRVI7CiAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpUQVApIHsKLSAgICAgICAgICAgIGlmICh3aGVuIDw9IG1Qb2ludGVyR2VzdHVyZS50YXBVcFRpbWUgKyBUQVBfRFJBR19JTlRFUlZBTCkgeworICAgICAgICAgICAgaWYgKHdoZW4gPD0gbVBvaW50ZXJHZXN0dXJlLnRhcFVwVGltZSArIG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICBmbG9hdCB4LCB5OwogICAgICAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+Z2V0UG9zaXRpb24oJngsICZ5KTsKLSAgICAgICAgICAgICAgICBpZiAoZmFicyh4IC0gbVBvaW50ZXJHZXN0dXJlLnRhcFgpIDw9IFRBUF9TTE9QCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBmYWJzKHkgLSBtUG9pbnRlckdlc3R1cmUudGFwWSkgPD0gVEFQX1NMT1ApIHsKKyAgICAgICAgICAgICAgICBpZiAoZmFicyh4IC0gbVBvaW50ZXJHZXN0dXJlLnRhcFgpIDw9IG1Db25maWcucG9pbnRlckdlc3R1cmVUYXBTbG9wCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmYWJzKHkgLSBtUG9pbnRlckdlc3R1cmUudGFwWSkgPD0gbUNvbmZpZy5wb2ludGVyR2VzdHVyZVRhcFNsb3ApIHsKICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpUQVBfRFJBRzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogI2lmIERFQlVHX0dFU1RVUkVTCkBAIC0zOTYxLDkgKzQwNDUsMTMgQEAKICAgICAgICAgICAgIGZsb2F0IGRlbHRhWSA9IChjdXJyZW50UG9pbnRlci55IC0gbGFzdFBvaW50ZXIueSkKICAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWU1vdmVtZW50U2NhbGU7CiAKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmRlbHRhWCwgJmRlbHRhWSk7CisKICAgICAgICAgICAgIC8vIE1vdmUgdGhlIHBvaW50ZXIgdXNpbmcgYSByZWxhdGl2ZSBtb3Rpb24uCiAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIHNwb3RzLCB0aGUgaG92ZXIgb3IgZHJhZyB3aWxsIG9jY3VyIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5jaG9yIHNwb3QuCiAgICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPm1vdmUoZGVsdGFYLCBkZWx0YVkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnBvaW50ZXJWZWxvY2l0eUNvbnRyb2wucmVzZXQoKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgZG93bjsKQEAgLTM5NzYsNyArNDA2NCw5IEBACiAjaWYgREVCVUdfR0VTVFVSRVMKICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBIT1ZFUiIpOwogI2VuZGlmCi0gICAgICAgICAgICAqb3V0RmluaXNoUHJldmlvdXNHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlICE9IFBvaW50ZXJHZXN0dXJlOjpIT1ZFUikgeworICAgICAgICAgICAgICAgICpvdXRGaW5pc2hQcmV2aW91c0dlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZUdlc3R1cmVJZCA9IDA7CiAgICAgICAgICAgICBkb3duID0gZmFsc2U7CiAgICAgICAgIH0KQEAgLTQwMDMsMTYgKzQwOTMsNiBAQAogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnRhcFggPSB4OwogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnRhcFkgPSB5OwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUykgewotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RHZXN0dXJlID0gZG93biA/IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfRFJBRwotICAgICAgICAgICAgICAgICAgICA6IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfSE9WRVI7Ci0gICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkQml0cy5jbGVhcigpOwotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMubWFya0JpdChhY3RpdmVUb3VjaElkKTsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90SWRUb0luZGV4W2FjdGl2ZVRvdWNoSWRdID0gMDsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90Q29vcmRzWzBdID0gbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlQ29vcmRzWzBdOwotICAgICAgICAgICAgbW92ZVNwb3RzTG9ja2VkKCk7Ci0gICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBDYXNlIDUuIEF0IGxlYXN0IHR3byBmaW5nZXJzIGRvd24sIGJ1dHRvbiBpcyBub3QgcHJlc3NlZC4gKFBSRVNTLCBTV0lQRSBvciBGUkVFRk9STSkKICAgICAgICAgLy8gV2UgbmVlZCB0byBwcm92aWRlIGZlZWRiYWNrIGZvciBlYWNoIGZpbmdlciB0aGF0IGdvZXMgZG93biBzbyB3ZSBjYW5ub3Qgd2FpdApAQCAtNDAyOSwxMjggKzQxMDksMTY1IEBACiAgICAgICAgIC8vIGEgZGVjaXNpb24gdG8gdHJhbnNpdGlvbiBpbnRvIFNXSVBFIG9yIEZSRUVGT1JNIG1vZGUgYWNjb3JkaW5nbHkuCiAgICAgICAgIExPR19BU1NFUlQoYWN0aXZlVG91Y2hJZCA+PSAwKTsKIAotICAgICAgICBib29sIG5lZWRSZWZlcmVuY2UgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBzZXR0bGVkID0gd2hlbiA+PSBtUG9pbnRlckdlc3R1cmUuZmlyc3RUb3VjaFRpbWUgKyBNVUxUSVRPVUNIX1NFVFRMRV9JTlRFUlZBTDsKKyAgICAgICAgYm9vbCBzZXR0bGVkID0gd2hlbiA+PSBtUG9pbnRlckdlc3R1cmUuZmlyc3RUb3VjaFRpbWUKKyAgICAgICAgICAgICAgICArIG1Db25maWcucG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoU2V0dGxlSW50ZXJ2YWw7CiAgICAgICAgIGlmIChtUG9pbnRlckdlc3R1cmUubGFzdEdlc3R1cmVNb2RlICE9IFBvaW50ZXJHZXN0dXJlOjpQUkVTUwogICAgICAgICAgICAgICAgICYmIG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGUgIT0gUG9pbnRlckdlc3R1cmU6OlNXSVBFCiAgICAgICAgICAgICAgICAgJiYgbVBvaW50ZXJHZXN0dXJlLmxhc3RHZXN0dXJlTW9kZSAhPSBQb2ludGVyR2VzdHVyZTo6RlJFRUZPUk0pIHsKICAgICAgICAgICAgICpvdXRGaW5pc2hQcmV2aW91c0dlc3R1cmUgPSB0cnVlOwotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpQUkVTUzsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5hY3RpdmVHZXN0dXJlSWQgPSAwOwotCi0gICAgICAgICAgICBpZiAoc2V0dGxlZCAmJiBtUGFyYW1ldGVycy5nZXN0dXJlTW9kZSA9PSBQYXJhbWV0ZXJzOjpHRVNUVVJFX01PREVfU1BPVFMKLSAgICAgICAgICAgICAgICAgICAgJiYgbUxhc3RUb3VjaC5pZEJpdHMuaGFzQml0KG1Qb2ludGVyR2VzdHVyZS5hY3RpdmVUb3VjaElkKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzcG90IGlzIGFscmVhZHkgdmlzaWJsZSBhbmQgaGFzIHNldHRsZWQsIHVzZSBpdCBhcyB0aGUgcmVmZXJlbmNlIHBvaW50Ci0gICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBnZXN0dXJlLiAgT3RoZXIgc3BvdHMgd2lsbCBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoaXMgb25lLgotI2lmIERFQlVHX0dFU1RVUkVTCi0gICAgICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IFVzaW5nIGFjdGl2ZSBzcG90IGFzIHJlZmVyZW5jZSBmb3IgTVVMVElUT1VDSCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgInNldHRsZSB0aW1lIGV4cGlyZWQgJTAuM2ZtcyBhZ28iLAotICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gLSBtUG9pbnRlckdlc3R1cmUuZmlyc3RUb3VjaFRpbWUgLSBNVUxUSVRPVUNIX1NFVFRMRV9JTlRFUlZBTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAwLjAwMDAwMWYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlckRhdGEmIGQgPSBtTGFzdFRvdWNoLnBvaW50ZXJzW21MYXN0VG91Y2guaWRUb0luZGV4WwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZVRvdWNoSWRdXTsKLSAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlVG91Y2hYID0gZC54OwotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFkgPSBkLnk7Ci0gICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlckNvb3JkcyYgYyA9IG1Qb2ludGVyR2VzdHVyZS5zcG90Q29vcmRzW21Qb2ludGVyR2VzdHVyZS5zcG90SWRUb0luZGV4WwotICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZVRvdWNoSWRdXTsKLSAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVggPSBjLmdldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfWCk7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUdlc3R1cmVZID0gYy5nZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1kpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSNpZiBERUJVR19HRVNUVVJFUwotICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBVc2luZyBjZW50cm9pZCBhcyByZWZlcmVuY2UgZm9yIE1VTFRJVE9VQ0gsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0bGUgdGltZSByZW1haW5pbmcgJTAuM2ZtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobVBvaW50ZXJHZXN0dXJlLmZpcnN0VG91Y2hUaW1lICsgTVVMVElUT1VDSF9TRVRUTEVfSU5URVJWQUwgLSB3aGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAuMDAwMDAxZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBuZWVkUmVmZXJlbmNlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghc2V0dGxlZCAmJiBtQ3VycmVudFRvdWNoLnBvaW50ZXJDb3VudCA+IG1MYXN0VG91Y2gucG9pbnRlckNvdW50KSB7CiAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsIHBvaW50ZXJzIGhhdmUgZ29uZSBkb3duIGJ1dCBub3QgeWV0IHNldHRsZWQuCiAgICAgICAgICAgICAvLyBSZXNldCB0aGUgZ2VzdHVyZS4KICNpZiBERUJVR19HRVNUVVJFUwogICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IFJlc2V0dGluZyBnZXN0dXJlIHNpbmNlIGFkZGl0aW9uYWwgcG9pbnRlcnMgd2VudCBkb3duIGZvciBNVUxUSVRPVUNILCAiCi0gICAgICAgICAgICAgICAgICAgICJzZXR0bGUgdGltZSByZW1haW5pbmcgJTAuM2ZtcyIsCi0gICAgICAgICAgICAgICAgICAgIChtUG9pbnRlckdlc3R1cmUuZmlyc3RUb3VjaFRpbWUgKyBNVUxUSVRPVUNIX1NFVFRMRV9JTlRFUlZBTCAtIHdoZW4pCisgICAgICAgICAgICAgICAgICAgICJzZXR0bGUgdGltZSByZW1haW5pbmcgJTAuM2ZtcyIsIChtUG9pbnRlckdlc3R1cmUuZmlyc3RUb3VjaFRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1Db25maWcucG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoU2V0dGxlSW50ZXJ2YWwgLSB3aGVuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMC4wMDAwMDFmKTsKICNlbmRpZgogICAgICAgICAgICAgKm91dENhbmNlbFByZXZpb3VzR2VzdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6OlBSRVNTOwotICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZUdlc3R1cmVJZCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDb250aW51ZSBwcmV2aW91cyBnZXN0dXJlLgogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IG1Qb2ludGVyR2VzdHVyZS5sYXN0R2VzdHVyZU1vZGU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobmVlZFJlZmVyZW5jZSkgeworICAgICAgICBpZiAoKm91dEZpbmlzaFByZXZpb3VzR2VzdHVyZSB8fCAqb3V0Q2FuY2VsUHJldmlvdXNHZXN0dXJlKSB7CisgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6OlBSRVNTOworICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZUdlc3R1cmVJZCA9IDA7CisgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlSWRCaXRzLmNsZWFyKCk7CisgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucG9pbnRlclZlbG9jaXR5Q29udHJvbC5yZXNldCgpOworCiAgICAgICAgICAgICAvLyBVc2UgdGhlIGNlbnRyb2lkIGFuZCBwb2ludGVyIGxvY2F0aW9uIGFzIHRoZSByZWZlcmVuY2UgcG9pbnRzIGZvciB0aGUgZ2VzdHVyZS4KKyNpZiBERUJVR19HRVNUVVJFUworICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IFVzaW5nIGNlbnRyb2lkIGFzIHJlZmVyZW5jZSBmb3IgTVVMVElUT1VDSCwgIgorICAgICAgICAgICAgICAgICAgICAic2V0dGxlIHRpbWUgcmVtYWluaW5nICUwLjNmbXMiLCAobVBvaW50ZXJHZXN0dXJlLmZpcnN0VG91Y2hUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaFNldHRsZUludGVydmFsIC0gd2hlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDAuMDAwMDAxZik7CisjZW5kaWYKICAgICAgICAgICAgIG1DdXJyZW50VG91Y2guZ2V0Q2VudHJvaWQoJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VUb3VjaFgsCiAgICAgICAgICAgICAgICAgICAgICZtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlVG91Y2hZKTsKICAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+Z2V0UG9zaXRpb24oJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWCwKICAgICAgICAgICAgICAgICAgICAgJm1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9PSBQb2ludGVyR2VzdHVyZTo6UFJFU1MpIHsKLSAgICAgICAgICAgIGZsb2F0IGQ7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQgPiAyKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG1vcmUgdGhhbiB0d28gcG9pbnRlcnMsIHN3aXRjaCB0byBGUkVFRk9STS4KLSNpZiBERUJVR19HRVNUVVJFUwotICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBQUkVTUyB0cmFuc2l0aW9uZWQgdG8gRlJFRUZPUk0sIG51bWJlciBvZiBwb2ludGVycyAlZCA+IDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgKm91dENhbmNlbFByZXZpb3VzR2VzdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpGUkVFRk9STTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKChkID0gZGlzdGFuY2UoCi0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VG91Y2gucG9pbnRlcnNbMF0ueCwgbUN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS55LAotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRvdWNoLnBvaW50ZXJzWzFdLngsIG1DdXJyZW50VG91Y2gucG9pbnRlcnNbMV0ueSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlTWF4U3dpcGVXaWR0aCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHBvaW50ZXJzIGJ1dCB0aGV5IGFyZSB0b28gZmFyIGFwYXJ0LCBzd2l0Y2ggdG8gRlJFRUZPUk0uCi0jaWYgREVCVUdfR0VTVFVSRVMKLSAgICAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogUFJFU1MgdHJhbnNpdGlvbmVkIHRvIEZSRUVGT1JNLCBkaXN0YW5jZSAlMC4zZiA+ICUwLjNmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGQsIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVNYXhTd2lwZVdpZHRoKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICpvdXRDYW5jZWxQcmV2aW91c0dlc3R1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBQb2ludGVyR2VzdHVyZTo6RlJFRUZPUk07CisgICAgICAgIC8vIENsZWFyIHRoZSByZWZlcmVuY2UgZGVsdGFzIGZvciBmaW5nZXJzIG5vdCB5ZXQgaW5jbHVkZWQgaW4gdGhlIHJlZmVyZW5jZSBjYWxjdWxhdGlvbi4KKyAgICAgICAgZm9yIChCaXRTZXQzMiBpZEJpdHMobUN1cnJlbnRUb3VjaC5pZEJpdHMudmFsdWUgJiB+bVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUlkQml0cy52YWx1ZSk7CisgICAgICAgICAgICAgICAgIWlkQml0cy5pc0VtcHR5KCk7ICkgeworICAgICAgICAgICAgdWludDMyX3QgaWQgPSBpZEJpdHMuZmlyc3RNYXJrZWRCaXQoKTsKKyAgICAgICAgICAgIGlkQml0cy5jbGVhckJpdChpZCk7CisKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VEZWx0YXNbaWRdLmR4ID0gMDsKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VEZWx0YXNbaWRdLmR5ID0gMDsKKyAgICAgICAgfQorICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlSWRCaXRzID0gbUN1cnJlbnRUb3VjaC5pZEJpdHM7CisKKyAgICAgICAgLy8gQWRkIGRlbHRhIGZvciBhbGwgZmluZ2VycyBhbmQgY2FsY3VsYXRlIGEgY29tbW9uIG1vdmVtZW50IGRlbHRhLgorICAgICAgICBmbG9hdCBjb21tb25EZWx0YVggPSAwLCBjb21tb25EZWx0YVkgPSAwOworICAgICAgICBCaXRTZXQzMiBjb21tb25JZEJpdHMobUxhc3RUb3VjaC5pZEJpdHMudmFsdWUgJiBtQ3VycmVudFRvdWNoLmlkQml0cy52YWx1ZSk7CisgICAgICAgIGZvciAoQml0U2V0MzIgaWRCaXRzKGNvbW1vbklkQml0cyk7ICFpZEJpdHMuaXNFbXB0eSgpOyApIHsKKyAgICAgICAgICAgIGJvb2wgZmlyc3QgPSAoaWRCaXRzID09IGNvbW1vbklkQml0cyk7CisgICAgICAgICAgICB1aW50MzJfdCBpZCA9IGlkQml0cy5maXJzdE1hcmtlZEJpdCgpOworICAgICAgICAgICAgaWRCaXRzLmNsZWFyQml0KGlkKTsKKworICAgICAgICAgICAgY29uc3QgUG9pbnRlckRhdGEmIGNwZCA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbbUN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdXTsKKyAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJEYXRhJiBscGQgPSBtTGFzdFRvdWNoLnBvaW50ZXJzW21MYXN0VG91Y2guaWRUb0luZGV4W2lkXV07CisgICAgICAgICAgICBQb2ludGVyR2VzdHVyZTo6RGVsdGEmIGRlbHRhID0gbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZF07CisgICAgICAgICAgICBkZWx0YS5keCArPSBjcGQueCAtIGxwZC54OworICAgICAgICAgICAgZGVsdGEuZHkgKz0gY3BkLnkgLSBscGQueTsKKworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFYID0gZGVsdGEuZHg7CisgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFZID0gZGVsdGEuZHk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcG9pbnRlcnMuICBXYWl0IGZvciBib3RoIHBvaW50ZXJzIHRvIHN0YXJ0IG1vdmluZwotICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRoaXMgaXMgYSBTV0lQRSBvciBGUkVFRk9STSBnZXN0dXJlLgotICAgICAgICAgICAgICAgIHVpbnQzMl90IGlkMSA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbMF0uaWQ7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaWQyID0gbUN1cnJlbnRUb3VjaC5wb2ludGVyc1sxXS5pZDsKKyAgICAgICAgICAgICAgICBjb21tb25EZWx0YVggPSBjYWxjdWxhdGVDb21tb25WZWN0b3IoY29tbW9uRGVsdGFYLCBkZWx0YS5keCk7CisgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFZID0gY2FsY3VsYXRlQ29tbW9uVmVjdG9yKGNvbW1vbkRlbHRhWSwgZGVsdGEuZHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmbG9hdCB2eDEsIHZ5MSwgdngyLCB2eTI7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnZlbG9jaXR5VHJhY2tlci5nZXRWZWxvY2l0eShpZDEsICZ2eDEsICZ2eTEpOwotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS52ZWxvY2l0eVRyYWNrZXIuZ2V0VmVsb2NpdHkoaWQyLCAmdngyLCAmdnkyKTsKKyAgICAgICAgLy8gQ29uc2lkZXIgdHJhbnNpdGlvbnMgZnJvbSBQUkVTUyB0byBTV0lQRSBvciBNVUxUSVRPVUNILgorICAgICAgICBpZiAobVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9PSBQb2ludGVyR2VzdHVyZTo6UFJFU1MpIHsKKyAgICAgICAgICAgIGZsb2F0IGRpc3RbTUFYX1BPSU5URVJfSUQgKyAxXTsKKyAgICAgICAgICAgIGludDMyX3QgZGlzdE92ZXJUaHJlc2hvbGQgPSAwOworICAgICAgICAgICAgZm9yIChCaXRTZXQzMiBpZEJpdHMobVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZUlkQml0cyk7ICFpZEJpdHMuaXNFbXB0eSgpOyApIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCA9IGlkQml0cy5maXJzdE1hcmtlZEJpdCgpOworICAgICAgICAgICAgICAgIGlkQml0cy5jbGVhckJpdChpZCk7CiAKLSAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZDEgPSBoeXBvdGYodngxLCB2eTEpOwotICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkMiA9IGh5cG90Zih2eDIsIHZ5Mik7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWVkMSA+PSBNVUxUSVRPVUNIX01JTl9TUEVFRCAmJiBzcGVlZDIgPj0gTVVMVElUT1VDSF9NSU5fU1BFRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkb3QgcHJvZHVjdCBvZiB0aGUgdmVsb2NpdHkgdmVjdG9ycy4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgdmVjdG9ycyBhcmUgb3JpZW50ZWQgaW4gYXBwcm94aW1hdGVseSB0aGUgc2FtZSBkaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhbmdsZSBiZXR3ZWVlbiB0aGVtIGlzIG5lYXIgemVybyBhbmQgdGhlIGNvc2luZSBvZiB0aGUgYW5nbGUKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwcm9jaGVzIDEuMC4gIFJlY2FsbCB0aGF0IGRvdCh2MSwgdjIpID0gY29zKGFuZ2xlKSAqIG1hZyh2MSkgKiBtYWcodjIpLgotICAgICAgICAgICAgICAgICAgICBmbG9hdCBkb3QgPSB2eDEgKiB2eDIgKyB2eTEgKiB2eTI7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvc2luZSA9IGRvdCAvIChzcGVlZDEgKiBzcGVlZDIpOyAvLyBkZW5vbWluYXRvciBhbHdheXMgPiAwCi0gICAgICAgICAgICAgICAgICAgIGlmIChjb3NpbmUgPj0gU1dJUEVfVFJBTlNJVElPTl9BTkdMRV9DT1NJTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXJzIGFyZSBtb3ZpbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLiAgU3dpdGNoIHRvIFNXSVBFLgorICAgICAgICAgICAgICAgIFBvaW50ZXJHZXN0dXJlOjpEZWx0YSYgZGVsdGEgPSBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlRGVsdGFzW2lkXTsKKyAgICAgICAgICAgICAgICBkaXN0W2lkXSA9IGh5cG90ZihkZWx0YS5keCAqIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYWm9vbVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEuZHkgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWVpvb21TY2FsZSk7CisgICAgICAgICAgICAgICAgaWYgKGRpc3RbaWRdID4gbUNvbmZpZy5wb2ludGVyR2VzdHVyZU11bHRpdG91Y2hNaW5EaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBkaXN0T3ZlclRocmVzaG9sZCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHdoZW4gYXQgbGVhc3QgdHdvIHBvaW50ZXJzIGhhdmUgbW92ZWQgZnVydGhlciB0aGFuCisgICAgICAgICAgICAvLyB0aGUgbWluaW11bSBkaXN0YW5jZSB0aHJlc2hvbGQuCisgICAgICAgICAgICBpZiAoZGlzdE92ZXJUaHJlc2hvbGQgPj0gMikgeworICAgICAgICAgICAgICAgIGZsb2F0IGQ7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID4gMikgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbW9yZSB0aGFuIHR3byBwb2ludGVycywgc3dpdGNoIHRvIEZSRUVGT1JNLgogI2lmIERFQlVHX0dFU1RVUkVTCi0gICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogUFJFU1MgdHJhbnNpdGlvbmVkIHRvIFNXSVBFLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVlZDEgJTAuM2YgPj0gJTAuM2YsIHNwZWVkMiAlMC4zZiA+PSAlMC4zZiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29zaW5lICUwLjNmID49ICUwLjNmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQxLCBNVUxUSVRPVUNIX01JTl9TUEVFRCwgc3BlZWQyLCBNVUxUSVRPVUNIX01JTl9TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zaW5lLCBTV0lQRV9UUkFOU0lUSU9OX0FOR0xFX0NPU0lORSk7CisgICAgICAgICAgICAgICAgICAgIExPR0QoIkdlc3R1cmVzOiBQUkVTUyB0cmFuc2l0aW9uZWQgdG8gRlJFRUZPUk0sIG51bWJlciBvZiBwb2ludGVycyAlZCA+IDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50KTsKICNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSA9IFBvaW50ZXJHZXN0dXJlOjpTV0lQRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50ZXJzIGFyZSBtb3ZpbmcgaW4gZGlmZmVyZW50IGRpcmVjdGlvbnMuICBTd2l0Y2ggdG8gRlJFRUZPUk0uCisgICAgICAgICAgICAgICAgICAgICpvdXRDYW5jZWxQcmV2aW91c0dlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6OkZSRUVGT1JNOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChkID0gZGlzdGFuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRvdWNoLnBvaW50ZXJzWzBdLngsIG1DdXJyZW50VG91Y2gucG9pbnRlcnNbMF0ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VG91Y2gucG9pbnRlcnNbMV0ueCwgbUN1cnJlbnRUb3VjaC5wb2ludGVyc1sxXS55KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlTWF4U3dpcGVXaWR0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBwb2ludGVycyBidXQgdGhleSBhcmUgdG9vIGZhciBhcGFydCBmb3IgYSBTV0lQRSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIEZSRUVGT1JNLgogI2lmIERFQlVHX0dFU1RVUkVTCi0gICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogUFJFU1MgdHJhbnNpdGlvbmVkIHRvIEZSRUVGT1JNLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGVlZDEgJTAuM2YgPj0gJTAuM2YsIHNwZWVkMiAlMC4zZiA+PSAlMC4zZiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29zaW5lICUwLjNmIDwgJTAuM2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZDEsIE1VTFRJVE9VQ0hfTUlOX1NQRUVELCBzcGVlZDIsIE1VTFRJVE9VQ0hfTUlOX1NQRUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3NpbmUsIFNXSVBFX1RSQU5TSVRJT05fQU5HTEVfQ09TSU5FKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IFBSRVNTIHRyYW5zaXRpb25lZCB0byBGUkVFRk9STSwgZGlzdGFuY2UgJTAuM2YgPiAlMC4zZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCwgbUxvY2tlZC5wb2ludGVyR2VzdHVyZU1heFN3aXBlV2lkdGgpOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAqb3V0Q2FuY2VsUHJldmlvdXNHZXN0dXJlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5jdXJyZW50R2VzdHVyZU1vZGUgPSBQb2ludGVyR2VzdHVyZTo6RlJFRUZPUk07CisgICAgICAgICAgICAgICAgICAgICpvdXRDYW5jZWxQcmV2aW91c0dlc3R1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6OkZSRUVGT1JNOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcG9pbnRlcnMuICBXYWl0IGZvciBib3RoIHBvaW50ZXJzIHRvIHN0YXJ0IG1vdmluZworICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0aGlzIGlzIGEgU1dJUEUgb3IgRlJFRUZPUk0gZ2VzdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQxID0gbUN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS5pZDsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQyID0gbUN1cnJlbnRUb3VjaC5wb2ludGVyc1sxXS5pZDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGlzdDEgPSBkaXN0W2lkMV07CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QyID0gZGlzdFtpZDJdOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdDEgPj0gbUNvbmZpZy5wb2ludGVyR2VzdHVyZU11bHRpdG91Y2hNaW5EaXN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpc3QyID49IG1Db25maWcucG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoTWluRGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGRpc3BsYWNlbWVudCB2ZWN0b3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgdmVjdG9ycyBhcmUgb3JpZW50ZWQgaW4gYXBwcm94aW1hdGVseSB0aGUgc2FtZSBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYW5nbGUgYmV0d2VlZW4gdGhlbSBpcyBuZWFyIHplcm8gYW5kIHRoZSBjb3NpbmUgb2YgdGhlIGFuZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHByb2NoZXMgMS4wLiAgUmVjYWxsIHRoYXQgZG90KHYxLCB2MikgPSBjb3MoYW5nbGUpICogbWFnKHYxKSAqIG1hZyh2MikuCisgICAgICAgICAgICAgICAgICAgICAgICBQb2ludGVyR2VzdHVyZTo6RGVsdGEmIGRlbHRhMSA9IG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VEZWx0YXNbaWQxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJHZXN0dXJlOjpEZWx0YSYgZGVsdGEyID0gbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZDJdOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHgxID0gZGVsdGExLmR4ICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVhab29tU2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkeTEgPSBkZWx0YTEuZHkgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWVpvb21TY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGR4MiA9IGRlbHRhMi5keCAqIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVYWm9vbVNjYWxlOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHkyID0gZGVsdGEyLmR5ICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlab29tU2NhbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkb3QgPSBkeDEgKiBkeDIgKyBkeTEgKiBkeTI7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb3NpbmUgPSBkb3QgLyAoZGlzdDEgKiBkaXN0Mik7IC8vIGRlbm9taW5hdG9yIGFsd2F5cyA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3NpbmUgPj0gbUNvbmZpZy5wb2ludGVyR2VzdHVyZVN3aXBlVHJhbnNpdGlvbkFuZ2xlQ29zaW5lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlcnMgYXJlIG1vdmluZyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24uICBTd2l0Y2ggdG8gU1dJUEUuCisjaWYgREVCVUdfR0VTVFVSRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJHZXN0dXJlczogUFJFU1MgdHJhbnNpdGlvbmVkIHRvIFNXSVBFLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlzdDEgJTAuM2YgPj0gJTAuM2YsIGRpc3QyICUwLjNmID49ICUwLjNmLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29zaW5lICUwLjNmID49ICUwLjNmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QxLCBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaE1pbkRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdDIsIG1Db25maWcucG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoTWluRGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3NpbmUsIG1Db25maWcucG9pbnRlckdlc3R1cmVTd2lwZVRyYW5zaXRpb25BbmdsZUNvc2luZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6OlNXSVBFOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb2ludGVycyBhcmUgbW92aW5nIGluIGRpZmZlcmVudCBkaXJlY3Rpb25zLiAgU3dpdGNoIHRvIEZSRUVGT1JNLgorI2lmIERFQlVHX0dFU1RVUkVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgiR2VzdHVyZXM6IFBSRVNTIHRyYW5zaXRpb25lZCB0byBGUkVFRk9STSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc3QxICUwLjNmID49ICUwLjNmLCBkaXN0MiAlMC4zZiA+PSAlMC4zZiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvc2luZSAlMC4zZiA8ICUwLjNmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QxLCBtQ29uZmlnLnBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaE1pbkRpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdDIsIG1Db25maWcucG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoTWluRGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3NpbmUsIG1Db25maWcucG9pbnRlckdlc3R1cmVTd2lwZVRyYW5zaXRpb25BbmdsZUNvc2luZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0Q2FuY2VsUHJldmlvdXNHZXN0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID0gUG9pbnRlckdlc3R1cmU6OkZSRUVGT1JNOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDE2Nyw0MCArNDI4NCwyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gTW92ZSB0aGUgcmVmZXJlbmNlIHBvaW50cyBiYXNlZCBvbiB0aGUgb3ZlcmFsbCBncm91cCBtb3Rpb24gb2YgdGhlIGZpbmdlcnMuCi0gICAgICAgIC8vIFRoZSBvYmplY3RpdmUgaXMgdG8gY2FsY3VsYXRlIGEgdmVjdG9yIGRlbHRhIHRoYXQgaXMgY29tbW9uIHRvIHRoZSBtb3ZlbWVudAotICAgICAgICAvLyBvZiBhbGwgZmluZ2Vycy4KLSAgICAgICAgQml0U2V0MzIgY29tbW9uSWRCaXRzKG1MYXN0VG91Y2guaWRCaXRzLnZhbHVlICYgbUN1cnJlbnRUb3VjaC5pZEJpdHMudmFsdWUpOwotICAgICAgICBpZiAoIWNvbW1vbklkQml0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZsb2F0IGNvbW1vbkRlbHRhWCA9IDAsIGNvbW1vbkRlbHRhWSA9IDA7Ci0gICAgICAgICAgICBmb3IgKEJpdFNldDMyIGlkQml0cyhjb21tb25JZEJpdHMpOyAhaWRCaXRzLmlzRW1wdHkoKTsgKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IChpZEJpdHMgPT0gY29tbW9uSWRCaXRzKTsKKyAgICAgICAgLy8gTW92ZSB0aGUgcmVmZXJlbmNlIHBvaW50cyBiYXNlZCBvbiB0aGUgb3ZlcmFsbCBncm91cCBtb3Rpb24gb2YgdGhlIGZpbmdlcnMKKyAgICAgICAgLy8gZXhjZXB0IGluIFBSRVNTIG1vZGUgd2hpbGUgd2FpdGluZyBmb3IgYSB0cmFuc2l0aW9uIHRvIG9jY3VyLgorICAgICAgICBpZiAobVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlTW9kZSAhPSBQb2ludGVyR2VzdHVyZTo6UFJFU1MKKyAgICAgICAgICAgICAgICAmJiAoY29tbW9uRGVsdGFYIHx8IGNvbW1vbkRlbHRhWSkpIHsKKyAgICAgICAgICAgIGZvciAoQml0U2V0MzIgaWRCaXRzKG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VJZEJpdHMpOyAhaWRCaXRzLmlzRW1wdHkoKTsgKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBpZEJpdHMuZmlyc3RNYXJrZWRCaXQoKTsKICAgICAgICAgICAgICAgICBpZEJpdHMuY2xlYXJCaXQoaWQpOwogCi0gICAgICAgICAgICAgICAgY29uc3QgUG9pbnRlckRhdGEmIGNwZCA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbbUN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdXTsKLSAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyRGF0YSYgbHBkID0gbUxhc3RUb3VjaC5wb2ludGVyc1ttTGFzdFRvdWNoLmlkVG9JbmRleFtpZF1dOwotICAgICAgICAgICAgICAgIGZsb2F0IGRlbHRhWCA9IGNwZC54IC0gbHBkLng7Ci0gICAgICAgICAgICAgICAgZmxvYXQgZGVsdGFZID0gY3BkLnkgLSBscGQueTsKLQotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVggPSBkZWx0YVg7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1vbkRlbHRhWSA9IGRlbHRhWTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVggPSBjYWxjdWxhdGVDb21tb25WZWN0b3IoY29tbW9uRGVsdGFYLCBkZWx0YVgpOwotICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVkgPSBjYWxjdWxhdGVDb21tb25WZWN0b3IoY29tbW9uRGVsdGFZLCBkZWx0YVkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQb2ludGVyR2VzdHVyZTo6RGVsdGEmIGRlbHRhID0gbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZURlbHRhc1tpZF07CisgICAgICAgICAgICAgICAgZGVsdGEuZHggPSAwOworICAgICAgICAgICAgICAgIGRlbHRhLmR5ID0gMDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZVRvdWNoWCArPSBjb21tb25EZWx0YVg7CiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlVG91Y2hZICs9IGNvbW1vbkRlbHRhWTsKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWCArPQotICAgICAgICAgICAgICAgICAgICBjb21tb25EZWx0YVggKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWE1vdmVtZW50U2NhbGU7Ci0gICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVkgKz0KLSAgICAgICAgICAgICAgICAgICAgY29tbW9uRGVsdGFZICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVlNb3ZlbWVudFNjYWxlOwotICAgICAgICAgICAgY2xhbXBQb3NpdGlvblVzaW5nUG9pbnRlckJvdW5kcyhtUG9pbnRlckNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICZtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVgsCi0gICAgICAgICAgICAgICAgICAgICZtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVkpOworCisgICAgICAgICAgICBjb21tb25EZWx0YVggKj0gbUxvY2tlZC5wb2ludGVyR2VzdHVyZVhNb3ZlbWVudFNjYWxlOworICAgICAgICAgICAgY29tbW9uRGVsdGFZICo9IG1Mb2NrZWQucG9pbnRlckdlc3R1cmVZTW92ZW1lbnRTY2FsZTsKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5wb2ludGVyVmVsb2NpdHlDb250cm9sLm1vdmUod2hlbiwgJmNvbW1vbkRlbHRhWCwgJmNvbW1vbkRlbHRhWSk7CisKKyAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWCArPSBjb21tb25EZWx0YVg7CisgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVkgKz0gY29tbW9uRGVsdGFZOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUmVwb3J0IGdlc3R1cmVzLgpAQCAtNDIyNiwxMCArNDMzMSw2IEBACiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVDb29yZHNbMF0uc2V0QXhpc1ZhbHVlKEFNT1RJT05fRVZFTlRfQVhJU19ZLAogICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVkpOwogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlQ29vcmRzWzBdLnNldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfUFJFU1NVUkUsIDEuMGYpOwotCi0gICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RHZXN0dXJlID0gUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlNQT1RfR0VTVFVSRV9QUkVTUzsKLSAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpTV0lQRSkgewogICAgICAgICAgICAgLy8gU1dJUEUgbW9kZS4KICNpZiBERUJVR19HRVNUVVJFUwpAQCAtNDI1MiwxMCArNDM1Myw2IEBACiAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVDb29yZHNbMF0uc2V0QXhpc1ZhbHVlKEFNT1RJT05fRVZFTlRfQVhJU19ZLAogICAgICAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVkpOwogICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLmN1cnJlbnRHZXN0dXJlQ29vcmRzWzBdLnNldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfUFJFU1NVUkUsIDEuMGYpOwotCi0gICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RHZXN0dXJlID0gUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlNQT1RfR0VTVFVSRV9TV0lQRTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtUG9pbnRlckdlc3R1cmUuY3VycmVudEdlc3R1cmVNb2RlID09IFBvaW50ZXJHZXN0dXJlOjpGUkVFRk9STSkgewogICAgICAgICAgICAgLy8gRlJFRUZPUk0gbW9kZS4KICNpZiBERUJVR19HRVNUVVJFUwpAQCAtNDM1NywzMyArNDQ1NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0aXZlR2VzdHVyZUlkPSVkIiwgbVBvaW50ZXJHZXN0dXJlLmFjdGl2ZUdlc3R1cmVJZCk7CiAjZW5kaWYKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdlc3R1cmVNb2RlID09IFBhcmFtZXRlcnM6OkdFU1RVUkVfTU9ERV9TUE9UUykgewotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90R2VzdHVyZSA9IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfRlJFRUZPUk07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgc3BvdCBsb2NhdGlvbnMgZm9yIFBSRVNTLCBTV0lQRSBhbmQgRlJFRUZPUk0uCi0gICAgICAgIC8vIFdlIHVzZSB0aGUgc2FtZSBjYWxjdWxhdGlvbiBhcyB3ZSBkbyB0byBjYWxjdWxhdGUgdGhlIGdlc3R1cmUgcG9pbnRlcnMKLSAgICAgICAgLy8gZm9yIEZSRUVGT1JNIHNvIHRoYXQgdGhlIHNwb3RzIHNtb290aGx5IHRyYWNrIGdlc3R1cmVzLgotICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2VzdHVyZU1vZGUgPT0gUGFyYW1ldGVyczo6R0VTVFVSRV9NT0RFX1NQT1RTKSB7Ci0gICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdElkQml0cy5jbGVhcigpOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpZCA9IG1DdXJyZW50VG91Y2gucG9pbnRlcnNbaV0uaWQ7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMubWFya0JpdChpZCk7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZFRvSW5kZXhbaWRdID0gaTsKLQotICAgICAgICAgICAgICAgIGZsb2F0IHggPSAobUN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS54IC0gbVBvaW50ZXJHZXN0dXJlLnJlZmVyZW5jZVRvdWNoWCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogbUxvY2tlZC5wb2ludGVyR2VzdHVyZVhab29tU2NhbGUgKyBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlR2VzdHVyZVg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgeSA9IChtQ3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnkgLSBtUG9pbnRlckdlc3R1cmUucmVmZXJlbmNlVG91Y2hZKQotICAgICAgICAgICAgICAgICAgICAgICAgKiBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlWVpvb21TY2FsZSArIG1Qb2ludGVyR2VzdHVyZS5yZWZlcmVuY2VHZXN0dXJlWTsKLQotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90Q29vcmRzW2ldLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbVBvaW50ZXJHZXN0dXJlLnNwb3RDb29yZHNbaV0uc2V0QXhpc1ZhbHVlKEFNT1RJT05fRVZFTlRfQVhJU19YLCB4KTsKLSAgICAgICAgICAgICAgICBtUG9pbnRlckdlc3R1cmUuc3BvdENvb3Jkc1tpXS5zZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1ksIHkpOwotICAgICAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90Q29vcmRzW2ldLnNldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfUFJFU1NVUkUsIDEuMGYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW92ZVNwb3RzTG9ja2VkKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ0MjYsMTEgKzQ0OTYsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFRvdWNoSW5wdXRNYXBwZXI6Om1vdmVTcG90c0xvY2tlZCgpIHsKLSAgICBtUG9pbnRlckNvbnRyb2xsZXItPnNldFNwb3RzKG1Qb2ludGVyR2VzdHVyZS5zcG90R2VzdHVyZSwKLSAgICAgICAgICAgIG1Qb2ludGVyR2VzdHVyZS5zcG90Q29vcmRzLCBtUG9pbnRlckdlc3R1cmUuc3BvdElkVG9JbmRleCwgbVBvaW50ZXJHZXN0dXJlLnNwb3RJZEJpdHMpOwotfQotCiB2b2lkIFRvdWNoSW5wdXRNYXBwZXI6OmRpc3BhdGNoTW90aW9uKG5zZWNzX3Qgd2hlbiwgdWludDMyX3QgcG9saWN5RmxhZ3MsIHVpbnQzMl90IHNvdXJjZSwKICAgICAgICAgaW50MzJfdCBhY3Rpb24sIGludDMyX3QgZmxhZ3MsIGludDMyX3QgbWV0YVN0YXRlLCBpbnQzMl90IGJ1dHRvblN0YXRlLCBpbnQzMl90IGVkZ2VGbGFncywKICAgICAgICAgY29uc3QgUG9pbnRlclByb3BlcnRpZXMqIHByb3BlcnRpZXMsIGNvbnN0IFBvaW50ZXJDb29yZHMqIGNvb3JkcywKQEAgLTQ1MDgsNyArNDU3Myw3IEBACiAgICAgeyAvLyBhY3F1aXJlIGxvY2sKICAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKICAgICAgICAgaWYgKG1Qb2ludGVyQ29udHJvbGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUG9pbnRlckNvbnRyb2xsZXItPmZhZGUoKTsKKyAgICAgICAgICAgIG1Qb2ludGVyQ29udHJvbGxlci0+ZmFkZShQb2ludGVyQ29udHJvbGxlckludGVyZmFjZTo6VFJBTlNJVElPTl9HUkFEVUFMKTsKICAgICAgICAgfQogICAgIH0gLy8gcmVsZWFzZSBsb2NrCiB9CkBAIC01MzAzLDcgKzUzNjgsOCBAQAogfQogCiB2b2lkIE11bHRpVG91Y2hJbnB1dE1hcHBlcjo6Y2xlYXJTdGF0ZSgpIHsKLSAgICBtQWNjdW11bGF0b3IuY2xlYXIobVNsb3RDb3VudCk7CisgICAgbUFjY3VtdWxhdG9yLmNsZWFyU2xvdHMobVNsb3RDb3VudCk7CisgICAgbUFjY3VtdWxhdG9yLmNsZWFyQnV0dG9ucygpOwogICAgIG1CdXR0b25TdGF0ZSA9IDA7CiB9CiAKQEAgLTUzMzcsMTMgKzU0MDMsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQWNjdW11bGF0b3IuY3VycmVudFNsb3QgPCAwIHx8IHNpemVfdChtQWNjdW11bGF0b3IuY3VycmVudFNsb3QpID49IG1TbG90Q291bnQpIHsKLSAgICAgICAgICAgIGlmIChuZXdTbG90KSB7CiAjaWYgREVCVUdfUE9JTlRFUlMKKyAgICAgICAgICAgIGlmIChuZXdTbG90KSB7CiAgICAgICAgICAgICAgICAgTE9HVygiTXVsdGlUb3VjaCBkZXZpY2UgJXMgZW1pdHRlZCBpbnZhbGlkIHNsb3QgaW5kZXggJWQgYnV0IGl0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgYmV0d2VlbiAwIGFuZCAlZDsgaWdub3JpbmcgdGhpcyBzbG90LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCkuc3RyaW5nKCksIG1BY2N1bXVsYXRvci5jdXJyZW50U2xvdCwgbVNsb3RDb3VudCk7Ci0jZW5kaWYKICAgICAgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNTU0Niw3ICs1NjEyLDEwIEBACiAKICAgICBzeW5jVG91Y2god2hlbiwgaGF2ZVBvaW50ZXJJZHMpOwogCi0gICAgbUFjY3VtdWxhdG9yLmNsZWFyKG1Vc2luZ1Nsb3RzUHJvdG9jb2wgPyAwIDogbVNsb3RDb3VudCk7CisgICAgaWYgKCFtVXNpbmdTbG90c1Byb3RvY29sKSB7CisgICAgICAgIG1BY2N1bXVsYXRvci5jbGVhclNsb3RzKG1TbG90Q291bnQpOworICAgIH0KKyAgICBtQWNjdW11bGF0b3IuY2xlYXJCdXR0b25zKCk7CiB9CiAKIHZvaWQgTXVsdGlUb3VjaElucHV0TWFwcGVyOjpjb25maWd1cmVSYXdBeGVzKCkgewpAQCAtNTY0MCw5MSArNTcwOSw5NCBAQAogICAgICAgICBkdW1wLmFwcGVuZEZvcm1hdChJTkRFTlQ0ICIgIHNjYWxlPSUwLjVmLCBvZmZzZXQ9JTAuNWYsICIKICAgICAgICAgICAgICAgICAiaGlnaFNjYWxlPSUwLjVmLCBoaWdoT2Zmc2V0PSUwLjVmXG4iLAogICAgICAgICAgICAgICAgIGF4aXMuc2NhbGUsIGF4aXMub2Zmc2V0LCBheGlzLmhpZ2hTY2FsZSwgYXhpcy5oaWdoT2Zmc2V0KTsKLSAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UNCAiICByYXdBeGlzPSVkLCByYXdNaW49JWQsIHJhd01heD0lZCwgcmF3RmxhdD0lZCwgcmF3RnV6ej0lZFxuIiwKKyAgICAgICAgZHVtcC5hcHBlbmRGb3JtYXQoSU5ERU5UNCAiICByYXdBeGlzPSVkLCByYXdNaW49JWQsIHJhd01heD0lZCwgIgorICAgICAgICAgICAgICAgICJyYXdGbGF0PSVkLCByYXdGdXp6PSVkLCByYXdSZXNvbHV0aW9uPSVkXG4iLAogICAgICAgICAgICAgICAgIG1BeGVzLmtleUF0KGkpLCBheGlzLnJhd0F4aXNJbmZvLm1pblZhbHVlLCBheGlzLnJhd0F4aXNJbmZvLm1heFZhbHVlLAotICAgICAgICAgICAgICAgIGF4aXMucmF3QXhpc0luZm8uZmxhdCwgYXhpcy5yYXdBeGlzSW5mby5mdXp6KTsKKyAgICAgICAgICAgICAgICBheGlzLnJhd0F4aXNJbmZvLmZsYXQsIGF4aXMucmF3QXhpc0luZm8uZnV6eiwgYXhpcy5yYXdBeGlzSW5mby5yZXNvbHV0aW9uKTsKICAgICB9CiB9CiAKLXZvaWQgSm95c3RpY2tJbnB1dE1hcHBlcjo6Y29uZmlndXJlKCkgewotICAgIElucHV0TWFwcGVyOjpjb25maWd1cmUoKTsKK3ZvaWQgSm95c3RpY2tJbnB1dE1hcHBlcjo6Y29uZmlndXJlKGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogY29uZmlnLCB1aW50MzJfdCBjaGFuZ2VzKSB7CisgICAgSW5wdXRNYXBwZXI6OmNvbmZpZ3VyZShjb25maWcsIGNoYW5nZXMpOwogCi0gICAgLy8gQ29sbGVjdCBhbGwgYXhlcy4KLSAgICBmb3IgKGludDMyX3QgYWJzID0gMDsgYWJzIDw9IEFCU19NQVg7IGFicysrKSB7Ci0gICAgICAgIFJhd0Fic29sdXRlQXhpc0luZm8gcmF3QXhpc0luZm87Ci0gICAgICAgIGdldEV2ZW50SHViKCktPmdldEFic29sdXRlQXhpc0luZm8oZ2V0RGV2aWNlSWQoKSwgYWJzLCAmcmF3QXhpc0luZm8pOwotICAgICAgICBpZiAocmF3QXhpc0luZm8udmFsaWQpIHsKLSAgICAgICAgICAgIC8vIE1hcCBheGlzLgotICAgICAgICAgICAgQXhpc0luZm8gYXhpc0luZm87Ci0gICAgICAgICAgICBib29sIGV4cGxpY2l0bHlNYXBwZWQgPSAhZ2V0RXZlbnRIdWIoKS0+bWFwQXhpcyhnZXREZXZpY2VJZCgpLCBhYnMsICZheGlzSW5mbyk7Ci0gICAgICAgICAgICBpZiAoIWV4cGxpY2l0bHlNYXBwZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBBeGlzIGlzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCwgd2lsbCBjaG9vc2UgYSBnZW5lcmljIGF4aXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgYXhpc0luZm8ubW9kZSA9IEF4aXNJbmZvOjpNT0RFX05PUk1BTDsKLSAgICAgICAgICAgICAgICBheGlzSW5mby5heGlzID0gLTE7CisgICAgaWYgKCFjaGFuZ2VzKSB7IC8vIGZpcnN0IHRpbWUgb25seQorICAgICAgICAvLyBDb2xsZWN0IGFsbCBheGVzLgorICAgICAgICBmb3IgKGludDMyX3QgYWJzID0gMDsgYWJzIDw9IEFCU19NQVg7IGFicysrKSB7CisgICAgICAgICAgICBSYXdBYnNvbHV0ZUF4aXNJbmZvIHJhd0F4aXNJbmZvOworICAgICAgICAgICAgZ2V0RXZlbnRIdWIoKS0+Z2V0QWJzb2x1dGVBeGlzSW5mbyhnZXREZXZpY2VJZCgpLCBhYnMsICZyYXdBeGlzSW5mbyk7CisgICAgICAgICAgICBpZiAocmF3QXhpc0luZm8udmFsaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBNYXAgYXhpcy4KKyAgICAgICAgICAgICAgICBBeGlzSW5mbyBheGlzSW5mbzsKKyAgICAgICAgICAgICAgICBib29sIGV4cGxpY2l0bHlNYXBwZWQgPSAhZ2V0RXZlbnRIdWIoKS0+bWFwQXhpcyhnZXREZXZpY2VJZCgpLCBhYnMsICZheGlzSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKCFleHBsaWNpdGx5TWFwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEF4aXMgaXMgbm90IGV4cGxpY2l0bHkgbWFwcGVkLCB3aWxsIGNob29zZSBhIGdlbmVyaWMgYXhpcyBsYXRlci4KKyAgICAgICAgICAgICAgICAgICAgYXhpc0luZm8ubW9kZSA9IEF4aXNJbmZvOjpNT0RFX05PUk1BTDsKKyAgICAgICAgICAgICAgICAgICAgYXhpc0luZm8uYXhpcyA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFwcGx5IGZsYXQgb3ZlcnJpZGUuCisgICAgICAgICAgICAgICAgaW50MzJfdCByYXdGbGF0ID0gYXhpc0luZm8uZmxhdE92ZXJyaWRlIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgPyByYXdBeGlzSW5mby5mbGF0IDogYXhpc0luZm8uZmxhdE92ZXJyaWRlOworCisgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNjYWxpbmcgZmFjdG9ycyBhbmQgbGltaXRzLgorICAgICAgICAgICAgICAgIEF4aXMgYXhpczsKKyAgICAgICAgICAgICAgICBpZiAoYXhpc0luZm8ubW9kZSA9PSBBeGlzSW5mbzo6TU9ERV9TUExJVCkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IDEuMGYgLyAoYXhpc0luZm8uc3BsaXRWYWx1ZSAtIHJhd0F4aXNJbmZvLm1pblZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaGlnaFNjYWxlID0gMS4wZiAvIChyYXdBeGlzSW5mby5tYXhWYWx1ZSAtIGF4aXNJbmZvLnNwbGl0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBheGlzLmluaXRpYWxpemUocmF3QXhpc0luZm8sIGF4aXNJbmZvLCBleHBsaWNpdGx5TWFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLCAwLjBmLCBoaWdoU2NhbGUsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMS4wZiwgcmF3RmxhdCAqIHNjYWxlLCByYXdBeGlzSW5mby5mdXp6ICogc2NhbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDZW50ZXJlZEF4aXMoYXhpc0luZm8uYXhpcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAyLjBmIC8gKHJhd0F4aXNJbmZvLm1heFZhbHVlIC0gcmF3QXhpc0luZm8ubWluVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBvZmZzZXQgPSBhdmcocmF3QXhpc0luZm8ubWluVmFsdWUsIHJhd0F4aXNJbmZvLm1heFZhbHVlKSAqIC1zY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgYXhpcy5pbml0aWFsaXplKHJhd0F4aXNJbmZvLCBheGlzSW5mbywgZXhwbGljaXRseU1hcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwgb2Zmc2V0LCBzY2FsZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLCAxLjBmLCByYXdGbGF0ICogc2NhbGUsIHJhd0F4aXNJbmZvLmZ1enogKiBzY2FsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAxLjBmIC8gKHJhd0F4aXNJbmZvLm1heFZhbHVlIC0gcmF3QXhpc0luZm8ubWluVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBheGlzLmluaXRpYWxpemUocmF3QXhpc0luZm8sIGF4aXNJbmZvLCBleHBsaWNpdGx5TWFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLCAwLjBmLCBzY2FsZSwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAxLjBmLCByYXdGbGF0ICogc2NhbGUsIHJhd0F4aXNJbmZvLmZ1enogKiBzY2FsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVG8gZWxpbWluYXRlIG5vaXNlIHdoaWxlIHRoZSBqb3lzdGljayBpcyBhdCByZXN0LCBmaWx0ZXIgb3V0IHNtYWxsIHZhcmlhdGlvbnMKKyAgICAgICAgICAgICAgICAvLyBpbiBheGlzIHZhbHVlcyB1cCBmcm9udC4KKyAgICAgICAgICAgICAgICBheGlzLmZpbHRlciA9IGF4aXMuZmxhdCAqIDAuMjVmOworCisgICAgICAgICAgICAgICAgbUF4ZXMuYWRkKGFicywgYXhpcyk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFwcGx5IGZsYXQgb3ZlcnJpZGUuCi0gICAgICAgICAgICBpbnQzMl90IHJhd0ZsYXQgPSBheGlzSW5mby5mbGF0T3ZlcnJpZGUgPCAwCi0gICAgICAgICAgICAgICAgICAgID8gcmF3QXhpc0luZm8uZmxhdCA6IGF4aXNJbmZvLmZsYXRPdmVycmlkZTsKLQotICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNjYWxpbmcgZmFjdG9ycyBhbmQgbGltaXRzLgotICAgICAgICAgICAgQXhpcyBheGlzOwotICAgICAgICAgICAgaWYgKGF4aXNJbmZvLm1vZGUgPT0gQXhpc0luZm86Ok1PREVfU1BMSVQpIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSA9IDEuMGYgLyAoYXhpc0luZm8uc3BsaXRWYWx1ZSAtIHJhd0F4aXNJbmZvLm1pblZhbHVlKTsKLSAgICAgICAgICAgICAgICBmbG9hdCBoaWdoU2NhbGUgPSAxLjBmIC8gKHJhd0F4aXNJbmZvLm1heFZhbHVlIC0gYXhpc0luZm8uc3BsaXRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgYXhpcy5pbml0aWFsaXplKHJhd0F4aXNJbmZvLCBheGlzSW5mbywgZXhwbGljaXRseU1hcHBlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLCAwLjBmLCBoaWdoU2NhbGUsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAxLjBmLCByYXdGbGF0ICogc2NhbGUsIHJhd0F4aXNJbmZvLmZ1enogKiBzY2FsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ2VudGVyZWRBeGlzKGF4aXNJbmZvLmF4aXMpKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAyLjBmIC8gKHJhd0F4aXNJbmZvLm1heFZhbHVlIC0gcmF3QXhpc0luZm8ubWluVmFsdWUpOwotICAgICAgICAgICAgICAgIGZsb2F0IG9mZnNldCA9IGF2ZyhyYXdBeGlzSW5mby5taW5WYWx1ZSwgcmF3QXhpc0luZm8ubWF4VmFsdWUpICogLXNjYWxlOwotICAgICAgICAgICAgICAgIGF4aXMuaW5pdGlhbGl6ZShyYXdBeGlzSW5mbywgYXhpc0luZm8sIGV4cGxpY2l0bHlNYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwgb2Zmc2V0LCBzY2FsZSwgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgLTEuMGYsIDEuMGYsIHJhd0ZsYXQgKiBzY2FsZSwgcmF3QXhpc0luZm8uZnV6eiAqIHNjYWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAxLjBmIC8gKHJhd0F4aXNJbmZvLm1heFZhbHVlIC0gcmF3QXhpc0luZm8ubWluVmFsdWUpOwotICAgICAgICAgICAgICAgIGF4aXMuaW5pdGlhbGl6ZShyYXdBeGlzSW5mbywgYXhpc0luZm8sIGV4cGxpY2l0bHlNYXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwgMC4wZiwgc2NhbGUsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAxLjBmLCByYXdGbGF0ICogc2NhbGUsIHJhd0F4aXNJbmZvLmZ1enogKiBzY2FsZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRvIGVsaW1pbmF0ZSBub2lzZSB3aGlsZSB0aGUgam95c3RpY2sgaXMgYXQgcmVzdCwgZmlsdGVyIG91dCBzbWFsbCB2YXJpYXRpb25zCi0gICAgICAgICAgICAvLyBpbiBheGlzIHZhbHVlcyB1cCBmcm9udC4KLSAgICAgICAgICAgIGF4aXMuZmlsdGVyID0gYXhpcy5mbGF0ICogMC4yNWY7Ci0KLSAgICAgICAgICAgIG1BeGVzLmFkZChhYnMsIGF4aXMpOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgLy8gSWYgdGhlcmUgYXJlIHRvbyBtYW55IGF4ZXMsIHN0YXJ0IGRyb3BwaW5nIHRoZW0uCi0gICAgLy8gUHJlZmVyIHRvIGtlZXAgZXhwbGljaXRseSBtYXBwZWQgYXhlcy4KLSAgICBpZiAobUF4ZXMuc2l6ZSgpID4gUG9pbnRlckNvb3Jkczo6TUFYX0FYRVMpIHsKLSAgICAgICAgTE9HSSgiSm95c3RpY2sgJyVzJyBoYXMgJWQgYXhlcyBidXQgdGhlIGZyYW1ld29yayBvbmx5IHN1cHBvcnRzIGEgbWF4aW11bSBvZiAlZC4iLAotICAgICAgICAgICAgICAgIGdldERldmljZU5hbWUoKS5zdHJpbmcoKSwgbUF4ZXMuc2l6ZSgpLCBQb2ludGVyQ29vcmRzOjpNQVhfQVhFUyk7Ci0gICAgICAgIHBydW5lQXhlcyh0cnVlKTsKLSAgICAgICAgcHJ1bmVBeGVzKGZhbHNlKTsKLSAgICB9CisgICAgICAgIC8vIElmIHRoZXJlIGFyZSB0b28gbWFueSBheGVzLCBzdGFydCBkcm9wcGluZyB0aGVtLgorICAgICAgICAvLyBQcmVmZXIgdG8ga2VlcCBleHBsaWNpdGx5IG1hcHBlZCBheGVzLgorICAgICAgICBpZiAobUF4ZXMuc2l6ZSgpID4gUG9pbnRlckNvb3Jkczo6TUFYX0FYRVMpIHsKKyAgICAgICAgICAgIExPR0koIkpveXN0aWNrICclcycgaGFzICVkIGF4ZXMgYnV0IHRoZSBmcmFtZXdvcmsgb25seSBzdXBwb3J0cyBhIG1heGltdW0gb2YgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlTmFtZSgpLnN0cmluZygpLCBtQXhlcy5zaXplKCksIFBvaW50ZXJDb29yZHM6Ok1BWF9BWEVTKTsKKyAgICAgICAgICAgIHBydW5lQXhlcyh0cnVlKTsKKyAgICAgICAgICAgIHBydW5lQXhlcyhmYWxzZSk7CisgICAgICAgIH0KIAotICAgIC8vIEFzc2lnbiBnZW5lcmljIGF4aXMgaWRzIHRvIHJlbWFpbmluZyBheGVzLgotICAgIGludDMyX3QgbmV4dEdlbmVyaWNBeGlzSWQgPSBBTU9USU9OX0VWRU5UX0FYSVNfR0VORVJJQ18xOwotICAgIHNpemVfdCBudW1BeGVzID0gbUF4ZXMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQXhlczsgaSsrKSB7Ci0gICAgICAgIEF4aXMmIGF4aXMgPSBtQXhlcy5lZGl0VmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGF4aXMuYXhpc0luZm8uYXhpcyA8IDApIHsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0R2VuZXJpY0F4aXNJZCA8PSBBTU9USU9OX0VWRU5UX0FYSVNfR0VORVJJQ18xNgotICAgICAgICAgICAgICAgICAgICAmJiBoYXZlQXhpcyhuZXh0R2VuZXJpY0F4aXNJZCkpIHsKLSAgICAgICAgICAgICAgICBuZXh0R2VuZXJpY0F4aXNJZCArPSAxOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBBc3NpZ24gZ2VuZXJpYyBheGlzIGlkcyB0byByZW1haW5pbmcgYXhlcy4KKyAgICAgICAgaW50MzJfdCBuZXh0R2VuZXJpY0F4aXNJZCA9IEFNT1RJT05fRVZFTlRfQVhJU19HRU5FUklDXzE7CisgICAgICAgIHNpemVfdCBudW1BeGVzID0gbUF4ZXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUF4ZXM7IGkrKykgeworICAgICAgICAgICAgQXhpcyYgYXhpcyA9IG1BeGVzLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGF4aXMuYXhpc0luZm8uYXhpcyA8IDApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dEdlbmVyaWNBeGlzSWQgPD0gQU1PVElPTl9FVkVOVF9BWElTX0dFTkVSSUNfMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGhhdmVBeGlzKG5leHRHZW5lcmljQXhpc0lkKSkgeworICAgICAgICAgICAgICAgICAgICBuZXh0R2VuZXJpY0F4aXNJZCArPSAxOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG5leHRHZW5lcmljQXhpc0lkIDw9IEFNT1RJT05fRVZFTlRfQVhJU19HRU5FUklDXzE2KSB7Ci0gICAgICAgICAgICAgICAgYXhpcy5heGlzSW5mby5heGlzID0gbmV4dEdlbmVyaWNBeGlzSWQ7Ci0gICAgICAgICAgICAgICAgbmV4dEdlbmVyaWNBeGlzSWQgKz0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HSSgiSWdub3Jpbmcgam95c3RpY2sgJyVzJyBheGlzICVkIGJlY2F1c2UgYWxsIG9mIHRoZSBnZW5lcmljIGF4aXMgaWRzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYXZlIGFscmVhZHkgYmVlbiBhc3NpZ25lZCB0byBvdGhlciBheGVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VOYW1lKCkuc3RyaW5nKCksIG1BeGVzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICBtQXhlcy5yZW1vdmVJdGVtc0F0KGktLSk7Ci0gICAgICAgICAgICAgICAgbnVtQXhlcyAtPSAxOworICAgICAgICAgICAgICAgIGlmIChuZXh0R2VuZXJpY0F4aXNJZCA8PSBBTU9USU9OX0VWRU5UX0FYSVNfR0VORVJJQ18xNikgeworICAgICAgICAgICAgICAgICAgICBheGlzLmF4aXNJbmZvLmF4aXMgPSBuZXh0R2VuZXJpY0F4aXNJZDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEdlbmVyaWNBeGlzSWQgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJJZ25vcmluZyBqb3lzdGljayAnJXMnIGF4aXMgJWQgYmVjYXVzZSBhbGwgb2YgdGhlIGdlbmVyaWMgYXhpcyBpZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXZlIGFscmVhZHkgYmVlbiBhc3NpZ25lZCB0byBvdGhlciBheGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlTmFtZSgpLnN0cmluZygpLCBtQXhlcy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIG1BeGVzLnJlbW92ZUl0ZW1zQXQoaS0tKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtQXhlcyAtPSAxOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2lucHV0L0lucHV0UmVhZGVyLmggYi9zZXJ2aWNlcy9pbnB1dC9JbnB1dFJlYWRlci5oCmluZGV4IDg1MzM4YjYuLjI4OGZmNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L0lucHV0UmVhZGVyLmgKKysrIGIvc2VydmljZXMvaW5wdXQvSW5wdXRSZWFkZXIuaApAQCAtNDAsNiArNDAsMTMzIEBACiAKIAogLyoKKyAqIElucHV0IHJlYWRlciBjb25maWd1cmF0aW9uLgorICoKKyAqIFNwZWNpZmllcyB2YXJpb3VzIG9wdGlvbnMgdGhhdCBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnB1dCByZWFkZXIuCisgKi8KK3N0cnVjdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24geworICAgIC8vIERlc2NyaWJlcyBjaGFuZ2VzIHRoYXQgaGF2ZSBvY2N1cnJlZC4KKyAgICBlbnVtIHsKKyAgICAgICAgLy8gVGhlIHBvaW50ZXIgc3BlZWQgY2hhbmdlZC4KKyAgICAgICAgQ0hBTkdFX1BPSU5URVJfU1BFRUQgPSAxIDw8IDAsCisKKyAgICAgICAgLy8gVGhlIHBvaW50ZXIgZ2VzdHVyZSBjb250cm9sIGNoYW5nZWQuCisgICAgICAgIENIQU5HRV9QT0lOVEVSX0dFU1RVUkVfRU5BQkxFTUVOVCA9IDEgPDwgMSwKKworICAgICAgICAvLyBBbGwgZGV2aWNlcyBtdXN0IGJlIHJlb3BlbmVkLgorICAgICAgICBDSEFOR0VfTVVTVF9SRU9QRU4gPSAxIDw8IDMxLAorICAgIH07CisKKyAgICAvLyBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdHVybiBvbiBzb21lIGhhY2tzIHdlIGhhdmUgdG8gaW1wcm92ZSB0aGUgdG91Y2ggaW50ZXJhY3Rpb24gd2l0aCBhCisgICAgLy8gY2VydGFpbiBkZXZpY2Ugd2hvc2Ugc2NyZWVuIGN1cnJlbnRseSBpcyBub3QgYWxsIHRoYXQgZ29vZC4KKyAgICBib29sIGZpbHRlclRvdWNoRXZlbnRzOworCisgICAgLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHR1cm4gb24gc29tZSBoYWNrcyB0byBpbXByb3ZlIHRvdWNoIGludGVyYWN0aW9uIHdpdGggYW5vdGhlciBkZXZpY2UKKyAgICAvLyB3aGVyZSB0b3VjaCBjb29yZGluYXRlIGRhdGEgY2FuIGdldCBjb3JydXB0ZWQuCisgICAgYm9vbCBmaWx0ZXJKdW1weVRvdWNoRXZlbnRzOworCisgICAgLy8gR2V0cyB0aGUgYW1vdW50IG9mIHRpbWUgdG8gZGlzYWJsZSB2aXJ0dWFsIGtleXMgYWZ0ZXIgdGhlIHNjcmVlbiBpcyB0b3VjaGVkCisgICAgLy8gaW4gb3JkZXIgdG8gZmlsdGVyIG91dCBhY2NpZGVudGFsIHZpcnR1YWwga2V5IHByZXNzZXMgZHVlIHRvIHN3aXBpbmcgZ2VzdHVyZXMKKyAgICAvLyBvciB0YXBzIG5lYXIgdGhlIGVkZ2Ugb2YgdGhlIGRpc3BsYXkuICBNYXkgYmUgMCB0byBkaXNhYmxlIHRoZSBmZWF0dXJlLgorICAgIG5zZWNzX3QgdmlydHVhbEtleVF1aWV0VGltZTsKKworICAgIC8vIFRoZSBleGNsdWRlZCBkZXZpY2UgbmFtZXMgZm9yIHRoZSBwbGF0Zm9ybS4KKyAgICAvLyBEZXZpY2VzIHdpdGggdGhlc2UgbmFtZXMgd2lsbCBiZSBpZ25vcmVkLgorICAgIFZlY3RvcjxTdHJpbmc4PiBleGNsdWRlZERldmljZU5hbWVzOworCisgICAgLy8gVmVsb2NpdHkgY29udHJvbCBwYXJhbWV0ZXJzIGZvciBtb3VzZSBwb2ludGVyIG1vdmVtZW50cy4KKyAgICBWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzIHBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzOworCisgICAgLy8gVmVsb2NpdHkgY29udHJvbCBwYXJhbWV0ZXJzIGZvciBtb3VzZSB3aGVlbCBtb3ZlbWVudHMuCisgICAgVmVsb2NpdHlDb250cm9sUGFyYW1ldGVycyB3aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnM7CisKKyAgICAvLyBUcnVlIGlmIHBvaW50ZXIgZ2VzdHVyZXMgYXJlIGVuYWJsZWQuCisgICAgYm9vbCBwb2ludGVyR2VzdHVyZXNFbmFibGVkOworCisgICAgLy8gUXVpZXQgdGltZSBiZXR3ZWVuIGNlcnRhaW4gcG9pbnRlciBnZXN0dXJlIHRyYW5zaXRpb25zLgorICAgIC8vIFRpbWUgdG8gYWxsb3cgZm9yIGFsbCBmaW5nZXJzIG9yIGJ1dHRvbnMgdG8gc2V0dGxlIGludG8gYSBzdGFibGUgc3RhdGUgYmVmb3JlCisgICAgLy8gc3RhcnRpbmcgYSBuZXcgZ2VzdHVyZS4KKyAgICBuc2Vjc190IHBvaW50ZXJHZXN0dXJlUXVpZXRJbnRlcnZhbDsKKworICAgIC8vIFRoZSBtaW5pbXVtIHNwZWVkIHRoYXQgYSBwb2ludGVyIG11c3QgdHJhdmVsIGZvciB1cyB0byBjb25zaWRlciBzd2l0Y2hpbmcgdGhlIGFjdGl2ZQorICAgIC8vIHRvdWNoIHBvaW50ZXIgdG8gaXQgZHVyaW5nIGEgZHJhZy4gIFRoaXMgdGhyZXNob2xkIGlzIHNldCB0byBhdm9pZCBzd2l0Y2hpbmcgZHVlCisgICAgLy8gdG8gbm9pc2UgZnJvbSBhIGZpbmdlciByZXN0aW5nIG9uIHRoZSB0b3VjaCBwYWQgKHBlcmhhcHMganVzdCBwcmVzc2luZyBpdCBkb3duKS4KKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZURyYWdNaW5Td2l0Y2hTcGVlZDsgLy8gaW4gcGl4ZWxzIHBlciBzZWNvbmQKKworICAgIC8vIFRhcCBnZXN0dXJlIGRlbGF5IHRpbWUuCisgICAgLy8gVGhlIHRpbWUgYmV0d2VlbiBkb3duIGFuZCB1cCBtdXN0IGJlIGxlc3MgdGhhbiB0aGlzIHRvIGJlIGNvbnNpZGVyZWQgYSB0YXAuCisgICAgbnNlY3NfdCBwb2ludGVyR2VzdHVyZVRhcEludGVydmFsOworCisgICAgLy8gVGFwIGRyYWcgZ2VzdHVyZSBkZWxheSB0aW1lLgorICAgIC8vIFRoZSB0aW1lIGJldHdlZW4gdGhlIHByZXZpb3VzIHRhcCdzIHVwIGFuZCB0aGUgbmV4dCBkb3duIG11c3QgYmUgbGVzcyB0aGFuCisgICAgLy8gdGhpcyB0byBiZSBjb25zaWRlcmVkIGEgZHJhZy4gIE90aGVyd2lzZSwgdGhlIHByZXZpb3VzIHRhcCBpcyBmaW5pc2hlZCBhbmQgYQorICAgIC8vIG5ldyB0YXAgYmVnaW5zLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwcmV2aW91cyB0YXAgd2lsbCBiZSBoZWxkIGRvd24gZm9yIHRoaXMgZW50aXJlIGR1cmF0aW9uIHNvIHRoaXMKKyAgICAvLyBpbnRlcnZhbCBtdXN0IGJlIHNob3J0ZXIgdGhhbiB0aGUgbG9uZyBwcmVzcyB0aW1lb3V0LgorICAgIG5zZWNzX3QgcG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWw7CisKKyAgICAvLyBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoYXQgdGhlIHBvaW50ZXIgaXMgYWxsb3dlZCB0byBtb3ZlIGZyb20gaW5pdGlhbCBkb3duCisgICAgLy8gdG8gdXAgYW5kIHN0aWxsIGJlIGNhbGxlZCBhIHRhcC4KKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZVRhcFNsb3A7IC8vIGluIHBpeGVscworCisgICAgLy8gVGltZSBhZnRlciB0aGUgZmlyc3QgdG91Y2ggcG9pbnRzIGdvIGRvd24gdG8gc2V0dGxlIG9uIGFuIGluaXRpYWwgY2VudHJvaWQuCisgICAgLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBlbm91Z2ggdGltZSB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgcHV0cyBkb3duIHR3bworICAgIC8vIGZpbmdlcnMgYXQgYWxtb3N0IGJ1dCBub3QgcXVpdGUgZXhhY3RseSB0aGUgc2FtZSB0aW1lLgorICAgIG5zZWNzX3QgcG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoU2V0dGxlSW50ZXJ2YWw7CisKKyAgICAvLyBUaGUgdHJhbnNpdGlvbiBmcm9tIFBSRVNTIHRvIFNXSVBFIG9yIEZSRUVGT1JNIGdlc3R1cmUgbW9kZSBpcyBtYWRlIHdoZW4KKyAgICAvLyBhdCBsZWFzdCB0d28gcG9pbnRlcnMgaGF2ZSBtb3ZlZCBhdCBsZWFzdCB0aGlzIGZhciBmcm9tIHRoZWlyIHN0YXJ0aW5nIHBsYWNlLgorICAgIGZsb2F0IHBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaE1pbkRpc3RhbmNlOyAvLyBpbiBwaXhlbHMKKworICAgIC8vIFRoZSB0cmFuc2l0aW9uIGZyb20gUFJFU1MgdG8gU1dJUEUgZ2VzdHVyZSBtb2RlIGNhbiBvbmx5IG9jY3VyIHdoZW4gdGhlCisgICAgLy8gY29zaW5lIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSB0d28gdmVjdG9ycyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhhbiB0aGlzIHZhbHVlCisgICAgLy8gd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZlY3RvcnMgYXJlIG9yaWVudGVkIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4KKyAgICAvLyBXaGVuIHRoZSB2ZWN0b3JzIGFyZSBvcmllbnRlZCBpbiB0aGUgZXhhY3RseSBzYW1lIGRpcmVjdGlvbiwgdGhlIGNvc2luZSBpcyAxLjAuCisgICAgLy8gKEluIGV4YWN0bHkgb3Bwb3NpdGUgZGlyZWN0aW9ucywgdGhlIGNvc2luZSBpcyAtMS4wLikKKyAgICBmbG9hdCBwb2ludGVyR2VzdHVyZVN3aXBlVHJhbnNpdGlvbkFuZ2xlQ29zaW5lOworCisgICAgLy8gVGhlIHRyYW5zaXRpb24gZnJvbSBQUkVTUyB0byBTV0lQRSBnZXN0dXJlIG1vZGUgY2FuIG9ubHkgb2NjdXIgd2hlbiB0aGUKKyAgICAvLyBmaW5nZXJzIGFyZSBubyBtb3JlIHRoYW4gdGhpcyBmYXIgYXBhcnQgcmVsYXRpdmUgdG8gdGhlIGRpYWdvbmFsIHNpemUgb2YKKyAgICAvLyB0aGUgdG91Y2ggcGFkLiAgRm9yIGV4YW1wbGUsIGEgcmF0aW8gb2YgMC41IG1lYW5zIHRoYXQgdGhlIGZpbmdlcnMgbXVzdCBiZQorICAgIC8vIG5vIG1vcmUgdGhhbiBoYWxmIHRoZSBkaWFnb25hbCBzaXplIG9mIHRoZSB0b3VjaCBwYWQgYXBhcnQuCisgICAgZmxvYXQgcG9pbnRlckdlc3R1cmVTd2lwZU1heFdpZHRoUmF0aW87CisKKyAgICAvLyBUaGUgZ2VzdHVyZSBtb3ZlbWVudCBzcGVlZCBmYWN0b3IgcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIGRpc3BsYXkuCisgICAgLy8gTW92ZW1lbnQgc3BlZWQgYXBwbGllcyB3aGVuIHRoZSBmaW5nZXJzIGFyZSBtb3ZpbmcgaW4gdGhlIHNhbWUgZGlyZWN0aW9uLgorICAgIC8vIFdpdGhvdXQgYWNjZWxlcmF0aW9uLCBhIGZ1bGwgc3dpcGUgb2YgdGhlIHRvdWNoIHBhZCBkaWFnb25hbCBpbiBtb3ZlbWVudCBtb2RlCisgICAgLy8gd2lsbCBjb3ZlciB0aGlzIHBvcnRpb24gb2YgdGhlIGRpc3BsYXkgZGlhZ29uYWwuCisgICAgZmxvYXQgcG9pbnRlckdlc3R1cmVNb3ZlbWVudFNwZWVkUmF0aW87CisKKyAgICAvLyBUaGUgZ2VzdHVyZSB6b29tIHNwZWVkIGZhY3RvciByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxheS4KKyAgICAvLyBab29tIHNwZWVkIGFwcGxpZXMgd2hlbiB0aGUgZmluZ2VycyBhcmUgbW9zdGx5IG1vdmluZyByZWxhdGl2ZSB0byBlYWNoIG90aGVyCisgICAgLy8gdG8gZXhlY3V0ZSBhIHNjYWxlIGdlc3R1cmUgb3Igc2ltaWxhci4KKyAgICAvLyBXaXRob3V0IGFjY2VsZXJhdGlvbiwgYSBmdWxsIHN3aXBlIG9mIHRoZSB0b3VjaCBwYWQgZGlhZ29uYWwgaW4gem9vbSBtb2RlCisgICAgLy8gd2lsbCBjb3ZlciB0aGlzIHBvcnRpb24gb2YgdGhlIGRpc3BsYXkgZGlhZ29uYWwuCisgICAgZmxvYXQgcG9pbnRlckdlc3R1cmVab29tU3BlZWRSYXRpbzsKKworICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIGZpbHRlclRvdWNoRXZlbnRzKGZhbHNlKSwKKyAgICAgICAgICAgIGZpbHRlckp1bXB5VG91Y2hFdmVudHMoZmFsc2UpLAorICAgICAgICAgICAgdmlydHVhbEtleVF1aWV0VGltZSgwKSwKKyAgICAgICAgICAgIHBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzKDEuMGYsIDUwMC4wZiwgMzAwMC4wZiwgMy4wZiksCisgICAgICAgICAgICB3aGVlbFZlbG9jaXR5Q29udHJvbFBhcmFtZXRlcnMoMS4wZiwgMTUuMGYsIDUwLjBmLCA0LjBmKSwKKyAgICAgICAgICAgIHBvaW50ZXJHZXN0dXJlc0VuYWJsZWQodHJ1ZSksCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVF1aWV0SW50ZXJ2YWwoMTAwICogMTAwMDAwMExMKSwgLy8gMTAwIG1zCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZURyYWdNaW5Td2l0Y2hTcGVlZCg1MCksIC8vIDUwIHBpeGVscyBwZXIgc2Vjb25kCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVRhcEludGVydmFsKDE1MCAqIDEwMDAwMDBMTCksIC8vIDE1MCBtcworICAgICAgICAgICAgcG9pbnRlckdlc3R1cmVUYXBEcmFnSW50ZXJ2YWwoMTUwICogMTAwMDAwMExMKSwgLy8gMTUwIG1zCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVRhcFNsb3AoMTAuMGYpLCAvLyAxMCBwaXhlbHMKKyAgICAgICAgICAgIHBvaW50ZXJHZXN0dXJlTXVsdGl0b3VjaFNldHRsZUludGVydmFsKDEwMCAqIDEwMDAwMDBMTCksIC8vIDEwMCBtcworICAgICAgICAgICAgcG9pbnRlckdlc3R1cmVNdWx0aXRvdWNoTWluRGlzdGFuY2UoMTUpLCAvLyAxNSBwaXhlbHMKKyAgICAgICAgICAgIHBvaW50ZXJHZXN0dXJlU3dpcGVUcmFuc2l0aW9uQW5nbGVDb3NpbmUoMC4yNTg4ZiksIC8vIGNvc2luZSBvZiA3NSBkZWdyZWVzCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZVN3aXBlTWF4V2lkdGhSYXRpbygwLjI1ZiksCisgICAgICAgICAgICBwb2ludGVyR2VzdHVyZU1vdmVtZW50U3BlZWRSYXRpbygwLjhmKSwKKyAgICAgICAgICAgIHBvaW50ZXJHZXN0dXJlWm9vbVNwZWVkUmF0aW8oMC4zZikgeyB9Cit9OworCisKKy8qCiAgKiBJbnB1dCByZWFkZXIgcG9saWN5IGludGVyZmFjZS4KICAqCiAgKiBUaGUgaW5wdXQgcmVhZGVyIHBvbGljeSBpcyB1c2VkIGJ5IHRoZSBpbnB1dCByZWFkZXIgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgV2luZG93IE1hbmFnZXIKQEAgLTY4LDI0ICsxOTUsOCBAQAogICAgIHZpcnR1YWwgYm9vbCBnZXREaXNwbGF5SW5mbyhpbnQzMl90IGRpc3BsYXlJZCwKICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLCBpbnQzMl90KiBoZWlnaHQsIGludDMyX3QqIG9yaWVudGF0aW9uKSA9IDA7CiAKLSAgICAvKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdHVybiBvbiBzb21lIGhhY2tzIHdlIGhhdmUgdG8gaW1wcm92ZSB0aGUgdG91Y2ggaW50ZXJhY3Rpb24gd2l0aCBhCi0gICAgICogY2VydGFpbiBkZXZpY2Ugd2hvc2Ugc2NyZWVuIGN1cnJlbnRseSBpcyBub3QgYWxsIHRoYXQgZ29vZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgZmlsdGVyVG91Y2hFdmVudHMoKSA9IDA7Ci0KLSAgICAvKiBEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdHVybiBvbiBzb21lIGhhY2tzIHRvIGltcHJvdmUgdG91Y2ggaW50ZXJhY3Rpb24gd2l0aCBhbm90aGVyIGRldmljZQotICAgICAqIHdoZXJlIHRvdWNoIGNvb3JkaW5hdGUgZGF0YSBjYW4gZ2V0IGNvcnJ1cHRlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgZmlsdGVySnVtcHlUb3VjaEV2ZW50cygpID0gMDsKLQotICAgIC8qIEdldHMgdGhlIGFtb3VudCBvZiB0aW1lIHRvIGRpc2FibGUgdmlydHVhbCBrZXlzIGFmdGVyIHRoZSBzY3JlZW4gaXMgdG91Y2hlZAotICAgICAqIGluIG9yZGVyIHRvIGZpbHRlciBvdXQgYWNjaWRlbnRhbCB2aXJ0dWFsIGtleSBwcmVzc2VzIGR1ZSB0byBzd2lwaW5nIGdlc3R1cmVzCi0gICAgICogb3IgdGFwcyBuZWFyIHRoZSBlZGdlIG9mIHRoZSBkaXNwbGF5LiAgTWF5IGJlIDAgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIG5zZWNzX3QgZ2V0VmlydHVhbEtleVF1aWV0VGltZSgpID0gMDsKLQotICAgIC8qIEdldHMgdGhlIGV4Y2x1ZGVkIGRldmljZSBuYW1lcyBmb3IgdGhlIHBsYXRmb3JtLiAqLwotICAgIHZpcnR1YWwgdm9pZCBnZXRFeGNsdWRlZERldmljZU5hbWVzKFZlY3RvcjxTdHJpbmc4PiYgb3V0RXhjbHVkZWREZXZpY2VOYW1lcykgPSAwOworICAgIC8qIEdldHMgdGhlIGlucHV0IHJlYWRlciBjb25maWd1cmF0aW9uLiAqLworICAgIHZpcnR1YWwgdm9pZCBnZXRSZWFkZXJDb25maWd1cmF0aW9uKElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogb3V0Q29uZmlnKSA9IDA7CiAKICAgICAvKiBHZXRzIGEgcG9pbnRlciBjb250cm9sbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGN1cnNvciBkZXZpY2UgKGllLiBhIG1vdXNlKS4gKi8KICAgICB2aXJ0dWFsIHNwPFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlPiBvYnRhaW5Qb2ludGVyQ29udHJvbGxlcihpbnQzMl90IGRldmljZUlkKSA9IDA7CkBAIC0xMzksNiArMjUwLDExIEBACiAgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgcGh5c2ljYWwga2V5cyBleGlzdCBmb3IgdGhlIGdpdmVuIGZyYW1ld29yay1kb21haW4ga2V5IGNvZGVzLiAqLwogICAgIHZpcnR1YWwgYm9vbCBoYXNLZXlzKGludDMyX3QgZGV2aWNlSWQsIHVpbnQzMl90IHNvdXJjZU1hc2ssCiAgICAgICAgICAgICBzaXplX3QgbnVtQ29kZXMsIGNvbnN0IGludDMyX3QqIGtleUNvZGVzLCB1aW50OF90KiBvdXRGbGFncykgPSAwOworCisgICAgLyogUmVxdWVzdHMgdGhhdCBhIHJlY29uZmlndXJhdGlvbiBvZiBhbGwgaW5wdXQgZGV2aWNlcy4KKyAgICAgKiBUaGUgY2hhbmdlcyBmbGFnIGlzIGEgYml0ZmllbGQgdGhhdCBpbmRpY2F0ZXMgd2hhdCBoYXMgY2hhbmdlZCBhbmQgd2hldGhlcgorICAgICAqIHRoZSBpbnB1dCBkZXZpY2VzIG11c3QgYWxsIGJlIHJlb3BlbmVkLiAqLworICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0UmVmcmVzaENvbmZpZ3VyYXRpb24odWludDMyX3QgY2hhbmdlcykgPSAwOwogfTsKIAogCkBAIC0yMDIsNiArMzE4LDggQEAKICAgICB2aXJ0dWFsIGJvb2wgaGFzS2V5cyhpbnQzMl90IGRldmljZUlkLCB1aW50MzJfdCBzb3VyY2VNYXNrLAogICAgICAgICAgICAgc2l6ZV90IG51bUNvZGVzLCBjb25zdCBpbnQzMl90KiBrZXlDb2RlcywgdWludDhfdCogb3V0RmxhZ3MpOwogCisgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RSZWZyZXNoQ29uZmlndXJhdGlvbih1aW50MzJfdCBjaGFuZ2VzKTsKKwogcHJvdGVjdGVkOgogICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIHByb3RlY3RlZCB2aXJ0dWFsIHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYW5kIGluc3RydW1lbnRlZAogICAgIC8vIGJ5IHRlc3QgY2FzZXMuCkBAIC0yMTIsNiArMzMwLDggQEAKICAgICBzcDxJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZT4gbVBvbGljeTsKICAgICBzcDxJbnB1dERpc3BhdGNoZXJJbnRlcmZhY2U+IG1EaXNwYXRjaGVyOwogCisgICAgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uIG1Db25maWc7CisKICAgICB2aXJ0dWFsIElucHV0UmVhZGVyUG9saWN5SW50ZXJmYWNlKiBnZXRQb2xpY3koKSB7IHJldHVybiBtUG9saWN5LmdldCgpOyB9CiAgICAgdmlydHVhbCBJbnB1dERpc3BhdGNoZXJJbnRlcmZhY2UqIGdldERpc3BhdGNoZXIoKSB7IHJldHVybiBtRGlzcGF0Y2hlci5nZXQoKTsgfQogICAgIHZpcnR1YWwgRXZlbnRIdWJJbnRlcmZhY2UqIGdldEV2ZW50SHViKCkgeyByZXR1cm4gbUV2ZW50SHViLmdldCgpOyB9CkBAIC0yNDAsMTggKzM2MCwxNyBAQAogICAgIHZvaWQgdGltZW91dEV4cGlyZWQobnNlY3NfdCB3aGVuKTsKIAogICAgIHZvaWQgaGFuZGxlQ29uZmlndXJhdGlvbkNoYW5nZWQobnNlY3NfdCB3aGVuKTsKLSAgICB2b2lkIGNvbmZpZ3VyZUV4Y2x1ZGVkRGV2aWNlcygpOwogCiAgICAgLy8gc3RhdGUgbWFuYWdlbWVudCBmb3IgYWxsIGRldmljZXMKICAgICBNdXRleCBtU3RhdGVMb2NrOwogCi0gICAgaW50MzJfdCBtR2xvYmFsTWV0YVN0YXRlOworICAgIGludDMyX3QgbUdsb2JhbE1ldGFTdGF0ZTsgLy8gZ3VhcmRlZCBieSBtU3RhdGVMb2NrCiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUdsb2JhbE1ldGFTdGF0ZSgpOwogICAgIHZpcnR1YWwgaW50MzJfdCBnZXRHbG9iYWxNZXRhU3RhdGUoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBmYWRlUG9pbnRlcigpOwogCi0gICAgSW5wdXRDb25maWd1cmF0aW9uIG1JbnB1dENvbmZpZ3VyYXRpb247CisgICAgSW5wdXRDb25maWd1cmF0aW9uIG1JbnB1dENvbmZpZ3VyYXRpb247IC8vIGd1YXJkZWQgYnkgbVN0YXRlTG9jawogICAgIHZvaWQgdXBkYXRlSW5wdXRDb25maWd1cmF0aW9uKCk7CiAKICAgICBuc2Vjc190IG1EaXNhYmxlVmlydHVhbEtleXNUaW1lb3V0OyAvLyBvbmx5IGFjY2Vzc2VkIGJ5IHJlYWRlciB0aHJlYWQKQEAgLTI1OSw5ICszNzgsMTIgQEAKICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRHJvcFZpcnR1YWxLZXkobnNlY3NfdCBub3csCiAgICAgICAgICAgICBJbnB1dERldmljZSogZGV2aWNlLCBpbnQzMl90IGtleUNvZGUsIGludDMyX3Qgc2NhbkNvZGUpOwogCi0gICAgbnNlY3NfdCBtTmV4dFRpbWVvdXQ7IC8vIG9ubHkgYWNjZXNzZWQgYnkgcmVhZGVyIHRocmVhZAorICAgIG5zZWNzX3QgbU5leHRUaW1lb3V0OyAvLyBvbmx5IGFjY2Vzc2VkIGJ5IHJlYWRlciB0aHJlYWQsIG5vdCBndWFyZGVkCiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RUaW1lb3V0QXRUaW1lKG5zZWNzX3Qgd2hlbik7CiAKKyAgICB1aW50MzJfdCBtQ29uZmlndXJhdGlvbkNoYW5nZXNUb1JlZnJlc2g7IC8vIGd1YXJkZWQgYnkgbVN0YXRlTG9jaworICAgIHZvaWQgcmVmcmVzaENvbmZpZ3VyYXRpb24odWludDMyX3QgY2hhbmdlcyk7CisKICAgICAvLyBzdGF0ZSBxdWVyaWVzCiAgICAgdHlwZWRlZiBpbnQzMl90IChJbnB1dERldmljZTo6KkdldFN0YXRlRnVuYykodWludDMyX3Qgc291cmNlTWFzaywgaW50MzJfdCBjb2RlKTsKICAgICBpbnQzMl90IGdldFN0YXRlKGludDMyX3QgZGV2aWNlSWQsIHVpbnQzMl90IHNvdXJjZU1hc2ssIGludDMyX3QgY29kZSwKQEAgLTMwMiw3ICs0MjQsNyBAQAogCiAgICAgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApOwogICAgIHZvaWQgYWRkTWFwcGVyKElucHV0TWFwcGVyKiBtYXBwZXIpOwotICAgIHZvaWQgY29uZmlndXJlKCk7CisgICAgdm9pZCBjb25maWd1cmUoY29uc3QgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBjb25maWcsIHVpbnQzMl90IGNoYW5nZXMpOwogICAgIHZvaWQgcmVzZXQoKTsKICAgICB2b2lkIHByb2Nlc3MoY29uc3QgUmF3RXZlbnQqIHJhd0V2ZW50cywgc2l6ZV90IGNvdW50KTsKICAgICB2b2lkIHRpbWVvdXRFeHBpcmVkKG5zZWNzX3Qgd2hlbik7CkBAIC0zNjAsNyArNDgyLDcgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNvdXJjZXMoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHBvcHVsYXRlRGV2aWNlSW5mbyhJbnB1dERldmljZUluZm8qIGRldmljZUluZm8pOwogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApOwotICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogY29uZmlnLCB1aW50MzJfdCBjaGFuZ2VzKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzcyhjb25zdCBSYXdFdmVudCogcmF3RXZlbnQpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgdGltZW91dEV4cGlyZWQobnNlY3NfdCB3aGVuKTsKQEAgLTQwNyw3ICs1MjksNyBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U291cmNlcygpOwogICAgIHZpcnR1YWwgdm9pZCBwb3B1bGF0ZURldmljZUluZm8oSW5wdXREZXZpY2VJbmZvKiBkZXZpY2VJbmZvKTsKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiBkdW1wKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShjb25zdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIGNvbmZpZywgdWludDMyX3QgY2hhbmdlcyk7CiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoY29uc3QgUmF3RXZlbnQqIHJhd0V2ZW50KTsKIApAQCAtNDc3LDcgKzU5OSw3IEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTb3VyY2VzKCk7CiAgICAgdmlydHVhbCB2b2lkIHBvcHVsYXRlRGV2aWNlSW5mbyhJbnB1dERldmljZUluZm8qIGRldmljZUluZm8pOwogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApOwotICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogY29uZmlnLCB1aW50MzJfdCBjaGFuZ2VzKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzcyhjb25zdCBSYXdFdmVudCogcmF3RXZlbnQpOwogCkBAIC01MzgsNiArNjYwLDEyIEBACiAgICAgZmxvYXQgbVZXaGVlbFNjYWxlOwogICAgIGZsb2F0IG1IV2hlZWxTY2FsZTsKIAorICAgIC8vIFZlbG9jaXR5IGNvbnRyb2xzIGZvciBtb3VzZSBwb2ludGVyIGFuZCB3aGVlbCBtb3ZlbWVudHMuCisgICAgLy8gVGhlIGNvbnRyb2xzIGZvciBYIGFuZCBZIHdoZWVsIG1vdmVtZW50cyBhcmUgc2VwYXJhdGUgdG8ga2VlcCB0aGVtIGRlY291cGxlZC4KKyAgICBWZWxvY2l0eUNvbnRyb2wgbVBvaW50ZXJWZWxvY2l0eUNvbnRyb2w7CisgICAgVmVsb2NpdHlDb250cm9sIG1XaGVlbFhWZWxvY2l0eUNvbnRyb2w7CisgICAgVmVsb2NpdHlDb250cm9sIG1XaGVlbFlWZWxvY2l0eUNvbnRyb2w7CisKICAgICBzcDxQb2ludGVyQ29udHJvbGxlckludGVyZmFjZT4gbVBvaW50ZXJDb250cm9sbGVyOwogCiAgICAgc3RydWN0IExvY2tlZFN0YXRlIHsKQEAgLTU2Miw3ICs2OTAsNyBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U291cmNlcygpOwogICAgIHZpcnR1YWwgdm9pZCBwb3B1bGF0ZURldmljZUluZm8oSW5wdXREZXZpY2VJbmZvKiBkZXZpY2VJbmZvKTsKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiBkdW1wKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZShjb25zdCBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIGNvbmZpZywgdWludDMyX3QgY2hhbmdlcyk7CiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0S2V5Q29kZVN0YXRlKHVpbnQzMl90IHNvdXJjZU1hc2ssIGludDMyX3Qga2V5Q29kZSk7CkBAIC02NjksNiArNzk3LDkgQEAKICAgICB1aW50MzJfdCBtVG91Y2hTb3VyY2U7IC8vIHNvdXJjZXMgd2hlbiByZXBvcnRpbmcgdG91Y2ggZGF0YQogICAgIHVpbnQzMl90IG1Qb2ludGVyU291cmNlOyAvLyBzb3VyY2VzIHdoZW4gcmVwb3J0aW5nIHBvaW50ZXIgZ2VzdHVyZXMKIAorICAgIC8vIFRoZSByZWFkZXIncyBjb25maWd1cmF0aW9uLgorICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiBtQ29uZmlnOworCiAgICAgLy8gSW1tdXRhYmxlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KICAgICBzdHJ1Y3QgUGFyYW1ldGVycyB7CiAgICAgICAgIGVudW0gRGV2aWNlVHlwZSB7CkBAIC02ODQsNyArODE1LDYgQEAKICAgICAgICAgYm9vbCB1c2VCYWRUb3VjaEZpbHRlcjsKICAgICAgICAgYm9vbCB1c2VKdW1weVRvdWNoRmlsdGVyOwogICAgICAgICBib29sIHVzZUF2ZXJhZ2luZ1RvdWNoRmlsdGVyOwotICAgICAgICBuc2Vjc190IHZpcnR1YWxLZXlRdWlldFRpbWU7CiAKICAgICAgICAgZW51bSBHZXN0dXJlTW9kZSB7CiAgICAgICAgICAgICBHRVNUVVJFX01PREVfUE9JTlRFUiwKQEAgLTk2NCw2ICsxMDk0LDggQEAKICAgICAgICAgICAgIC8vIEV4YWN0bHkgb25lIGZpbmdlciBkcmFnZ2luZyBmb2xsb3dpbmcgYSB0YXAuCiAgICAgICAgICAgICAvLyBQb2ludGVyIGZvbGxvd3MgdGhlIGFjdGl2ZSBmaW5nZXIuCiAgICAgICAgICAgICAvLyBFbWl0cyBET1dOLCBNT1ZFIGFuZCBVUCBldmVudHMgYXQgdGhlIHBvaW50ZXIgbG9jYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRGV0ZWN0IGRvdWJsZS10YXBzIHdoZW4gdGhlIGZpbmdlciBnb2VzIHVwIHdoaWxlIGluIFRBUF9EUkFHIG1vZGUuCiAgICAgICAgICAgICBUQVBfRFJBRywKIAogICAgICAgICAgICAgLy8gQnV0dG9uIGlzIHByZXNzZWQuCkBAIC05NzQsNiArMTEwNiw4IEBACiAgICAgICAgICAgICAvLyBFeGFjdGx5IG9uZSBmaW5nZXIsIGJ1dHRvbiBpcyBub3QgcHJlc3NlZC4KICAgICAgICAgICAgIC8vIFBvaW50ZXIgZm9sbG93cyB0aGUgYWN0aXZlIGZpbmdlci4KICAgICAgICAgICAgIC8vIEVtaXRzIEhPVkVSX01PVkUgZXZlbnRzIGF0IHRoZSBwb2ludGVyIGxvY2F0aW9uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIERldGVjdCB0YXBzIHdoZW4gdGhlIGZpbmdlciBnb2VzIHVwIHdoaWxlIGluIEhPVkVSIG1vZGUuCiAgICAgICAgICAgICBIT1ZFUiwKIAogICAgICAgICAgICAgLy8gRXhhY3RseSB0d28gZmluZ2VycyBidXQgbmVpdGhlciBoYXZlIG1vdmVkIGVub3VnaCB0byBjbGVhcmx5IGluZGljYXRlCkBAIC0xMDIxLDEyICsxMTU1LDYgQEAKICAgICAgICAgUG9pbnRlclByb3BlcnRpZXMgbGFzdEdlc3R1cmVQcm9wZXJ0aWVzW01BWF9QT0lOVEVSU107CiAgICAgICAgIFBvaW50ZXJDb29yZHMgbGFzdEdlc3R1cmVDb29yZHNbTUFYX1BPSU5URVJTXTsKIAotICAgICAgICAvLyBQb2ludGVyIGNvb3JkcyBhbmQgaWRzIGZvciB0aGUgY3VycmVudCBzcG90cy4KLSAgICAgICAgUG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U6OlNwb3RHZXN0dXJlIHNwb3RHZXN0dXJlOwotICAgICAgICBCaXRTZXQzMiBzcG90SWRCaXRzOyAvLyBzYW1lIHNldCBvZiBpZHMgYXMgdG91Y2ggaWRzCi0gICAgICAgIHVpbnQzMl90IHNwb3RJZFRvSW5kZXhbTUFYX1BPSU5URVJfSUQgKyAxXTsKLSAgICAgICAgUG9pbnRlckNvb3JkcyBzcG90Q29vcmRzW01BWF9QT0lOVEVSU107Ci0KICAgICAgICAgLy8gVGltZSB0aGUgcG9pbnRlciBnZXN0dXJlIGxhc3Qgd2VudCBkb3duLgogICAgICAgICBuc2Vjc190IGRvd25UaW1lOwogCkBAIC0xMDQ4LDEyICsxMTc2LDIzIEBACiAgICAgICAgIGZsb2F0IHJlZmVyZW5jZUdlc3R1cmVYOyAgLy8gcmVmZXJlbmNlIGdlc3R1cmUgWC9ZIGNvb3JkaW5hdGVzIGluIHBpeGVscwogICAgICAgICBmbG9hdCByZWZlcmVuY2VHZXN0dXJlWTsKIAorICAgICAgICAvLyBEaXN0YW5jZSB0aGF0IGVhY2ggcG9pbnRlciBoYXMgdHJhdmVsZWQgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbgorICAgICAgICAvLyBzdWJzdW1lZCBpbnRvIHRoZSByZWZlcmVuY2UgZ2VzdHVyZSBwb3NpdGlvbi4KKyAgICAgICAgQml0U2V0MzIgcmVmZXJlbmNlSWRCaXRzOworICAgICAgICBzdHJ1Y3QgRGVsdGEgeworICAgICAgICAgICAgZmxvYXQgZHgsIGR5OworICAgICAgICB9OworICAgICAgICBEZWx0YSByZWZlcmVuY2VEZWx0YXNbTUFYX1BPSU5URVJfSUQgKyAxXTsKKwogICAgICAgICAvLyBEZXNjcmliZXMgaG93IHRvdWNoIGlkcyBhcmUgbWFwcGVkIHRvIGdlc3R1cmUgaWRzIGZvciBmcmVlZm9ybSBnZXN0dXJlcy4KICAgICAgICAgdWludDMyX3QgZnJlZWZvcm1Ub3VjaFRvR2VzdHVyZUlkTWFwW01BWF9QT0lOVEVSX0lEICsgMV07CiAKICAgICAgICAgLy8gQSB2ZWxvY2l0eSB0cmFja2VyIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHN3aXRjaCBhY3RpdmUgcG9pbnRlcnMgZHVyaW5nIGRyYWdzLgogICAgICAgICBWZWxvY2l0eVRyYWNrZXIgdmVsb2NpdHlUcmFja2VyOwogCisgICAgICAgIC8vIFZlbG9jaXR5IGNvbnRyb2wgZm9yIHBvaW50ZXIgbW92ZW1lbnRzLgorICAgICAgICBWZWxvY2l0eUNvbnRyb2wgcG9pbnRlclZlbG9jaXR5Q29udHJvbDsKKwogICAgICAgICB2b2lkIHJlc2V0KCkgewogICAgICAgICAgICAgZmlyc3RUb3VjaFRpbWUgPSBMTE9OR19NSU47CiAgICAgICAgICAgICBhY3RpdmVUb3VjaElkID0gLTE7CkBAIC0xMDYyLDEyICsxMjAxLDExIEBACiAgICAgICAgICAgICBjdXJyZW50R2VzdHVyZUlkQml0cy5jbGVhcigpOwogICAgICAgICAgICAgbGFzdEdlc3R1cmVNb2RlID0gTkVVVFJBTDsKICAgICAgICAgICAgIGxhc3RHZXN0dXJlSWRCaXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICBzcG90R2VzdHVyZSA9IFBvaW50ZXJDb250cm9sbGVySW50ZXJmYWNlOjpTUE9UX0dFU1RVUkVfTkVVVFJBTDsKLSAgICAgICAgICAgIHNwb3RJZEJpdHMuY2xlYXIoKTsKICAgICAgICAgICAgIGRvd25UaW1lID0gMDsKICAgICAgICAgICAgIHZlbG9jaXR5VHJhY2tlci5jbGVhcigpOwogICAgICAgICAgICAgcmVzZXRUYXAoKTsKICAgICAgICAgICAgIHJlc2V0UXVpZXRUaW1lKCk7CisgICAgICAgICAgICBwb2ludGVyVmVsb2NpdHlDb250cm9sLnJlc2V0KCk7CiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHJlc2V0VGFwKCkgewpAQCAtMTA4OCw3ICsxMjI2LDYgQEAKICAgICB2b2lkIGRpc3BhdGNoUG9pbnRlckdlc3R1cmVzKG5zZWNzX3Qgd2hlbiwgdWludDMyX3QgcG9saWN5RmxhZ3MsIGJvb2wgaXNUaW1lb3V0KTsKICAgICBib29sIHByZXBhcmVQb2ludGVyR2VzdHVyZXMobnNlY3NfdCB3aGVuLAogICAgICAgICAgICAgYm9vbCogb3V0Q2FuY2VsUHJldmlvdXNHZXN0dXJlLCBib29sKiBvdXRGaW5pc2hQcmV2aW91c0dlc3R1cmUsIGJvb2wgaXNUaW1lb3V0KTsKLSAgICB2b2lkIG1vdmVTcG90c0xvY2tlZCgpOwogCiAgICAgLy8gRGlzcGF0Y2hlcyBhIG1vdGlvbiBldmVudC4KICAgICAvLyBJZiB0aGUgY2hhbmdlZElkIGlzID49IDAgYW5kIHRoZSBhY3Rpb24gaXMgUE9JTlRFUl9ET1dOIG9yIFBPSU5URVJfVVAsIHRoZQpAQCAtMTIzNSw4ICsxMzcyLDcgQEAKICAgICAgICAgdWludDMyX3QgYnV0dG9uRG93bjsKICAgICAgICAgdWludDMyX3QgYnV0dG9uVXA7CiAKLSAgICAgICAgQWNjdW11bGF0b3IoKSA6IHNsb3RzKE5VTEwpIHsKLSAgICAgICAgICAgIGNsZWFyKGZhbHNlKTsKKyAgICAgICAgQWNjdW11bGF0b3IoKSA6IGN1cnJlbnRTbG90KDApLCBzbG90cyhOVUxMKSwgYnV0dG9uRG93bigwKSwgYnV0dG9uVXAoMCkgewogICAgICAgICB9CiAKICAgICAgICAgfkFjY3VtdWxhdG9yKCkgewpAQCAtMTI0NywxMSArMTM4MywxNCBAQAogICAgICAgICAgICAgc2xvdHMgPSBuZXcgU2xvdFtzbG90Q291bnRdOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCBjbGVhcihzaXplX3Qgc2xvdENvdW50KSB7CisgICAgICAgIHZvaWQgY2xlYXJTbG90cyhzaXplX3Qgc2xvdENvdW50KSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNsb3RDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc2xvdHNbaV0uY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGN1cnJlbnRTbG90ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXJCdXR0b25zKCkgewogICAgICAgICAgICAgYnV0dG9uRG93biA9IDA7CiAgICAgICAgICAgICBidXR0b25VcCA9IDA7CiAgICAgICAgIH0KQEAgLTEyNzYsNyArMTQxNSw3IEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTb3VyY2VzKCk7CiAgICAgdmlydHVhbCB2b2lkIHBvcHVsYXRlRGV2aWNlSW5mbyhJbnB1dERldmljZUluZm8qIGRldmljZUluZm8pOwogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIGR1bXApOwotICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKGNvbnN0IElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogY29uZmlnLCB1aW50MzJfdCBjaGFuZ2VzKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzcyhjb25zdCBSYXdFdmVudCogcmF3RXZlbnQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC9JbnB1dFdpbmRvdy5oIGIvc2VydmljZXMvaW5wdXQvSW5wdXRXaW5kb3cuaAppbmRleCBkN2Q4MTlkLi5kMTY2YWQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9pbnB1dC9JbnB1dFdpbmRvdy5oCisrKyBiL3NlcnZpY2VzL2lucHV0L0lucHV0V2luZG93LmgKQEAgLTgwLDYgKzgwLDEwIEBACiAgICAgICAgIEZMQUdfVFVSTl9TQ1JFRU5fT04gPSAweDAwMjAwMDAwLAogICAgICAgICBGTEFHX0RJU01JU1NfS0VZR1VBUkQgPSAweDAwNDAwMDAwLAogICAgICAgICBGTEFHX1NQTElUX1RPVUNIID0gMHgwMDgwMDAwMCwKKyAgICAgICAgRkxBR19IQVJEV0FSRV9BQ0NFTEVSQVRFRCA9IDB4MDEwMDAwMDAsCisgICAgICAgIEZMQUdfSEFSRFdBUkVfQUNDRUxFUkFURURfU1lTVEVNID0gMHgwMjAwMDAwMCwKKyAgICAgICAgRkxBR19TTElQUEVSWSA9IDB4MDQwMDAwMDAsCisgICAgICAgIEZMQUdfTkVFRFNfTUVOVV9LRVkgPSAweDA4MDAwMDAwLAogICAgICAgICBGTEFHX0tFRVBfU1VSRkFDRV9XSElMRV9BTklNQVRJTkcgPSAweDEwMDAwMDAwLAogICAgICAgICBGTEFHX0NPTVBBVElCTEVfV0lORE9XID0gMHgyMDAwMDAwMCwKICAgICAgICAgRkxBR19TWVNURU1fRVJST1IgPSAweDQwMDAwMDAwLApAQCAtMTIzLDYgKzEyNywxMCBAQAogICAgICAgICBMQVNUX1NZU1RFTV9XSU5ET1cgICAgICA9IDI5OTksCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBJTlBVVF9GRUFUVVJFX0RJU0FCTEVfVE9VQ0hfUEFEX0dFU1RVUkVTID0gMHgwMDAwMDAwMSwKKyAgICB9OworCiAgICAgc3A8SW5wdXRXaW5kb3dIYW5kbGU+IGlucHV0V2luZG93SGFuZGxlOwogICAgIHNwPElucHV0Q2hhbm5lbD4gaW5wdXRDaGFubmVsOwogICAgIFN0cmluZzggbmFtZTsKQEAgLTE0Myw2ICsxNTEsNyBAQAogICAgIGludDMyX3QgbGF5ZXI7CiAgICAgaW50MzJfdCBvd25lclBpZDsKICAgICBpbnQzMl90IG93bmVyVWlkOworICAgIGludDMyX3QgaW5wdXRGZWF0dXJlczsKIAogICAgIGJvb2wgdG91Y2hhYmxlUmVnaW9uQ29udGFpbnNQb2ludChpbnQzMl90IHgsIGludDMyX3QgeSkgY29uc3Q7CiAgICAgYm9vbCBmcmFtZUNvbnRhaW5zUG9pbnQoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuY3BwIGIvc2VydmljZXMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuY3BwCmluZGV4IGI4N2M5OGQuLjEyYzdjYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyLmNwcAorKysgYi9zZXJ2aWNlcy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5jcHAKQEAgLTY5LDEwICs2OSwxMCBAQAogCiAgICAgbUxvY2tlZC5pbmFjdGl2aXR5VGltZW91dCA9IElOQUNUSVZJVFlfVElNRU9VVF9OT1JNQUw7CiAKLSAgICBtTG9ja2VkLnBvaW50ZXJJc0ZhZGluZyA9IHRydWU7IC8vIGtlZXAgdGhlIHBvaW50ZXIgaW5pdGlhbGx5IGZhZGVkCisgICAgbUxvY2tlZC5wb2ludGVyRmFkZURpcmVjdGlvbiA9IDA7CiAgICAgbUxvY2tlZC5wb2ludGVyWCA9IDA7CiAgICAgbUxvY2tlZC5wb2ludGVyWSA9IDA7Ci0gICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAwLjBmOworICAgIG1Mb2NrZWQucG9pbnRlckFscGhhID0gMC4wZjsgLy8gcG9pbnRlciBpcyBpbml0aWFsbHkgZmFkZWQKICAgICBtTG9ja2VkLnBvaW50ZXJTcHJpdGUgPSBtU3ByaXRlQ29udHJvbGxlci0+Y3JlYXRlU3ByaXRlKCk7CiAgICAgbUxvY2tlZC5wb2ludGVySWNvbkNoYW5nZWQgPSBmYWxzZTsKIApAQCAtMTkxLDIzICsxOTEsMzcgQEAKICAgICAqb3V0WSA9IG1Mb2NrZWQucG9pbnRlclk7CiB9CiAKLXZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OmZhZGUoKSB7Cit2b2lkIFBvaW50ZXJDb250cm9sbGVyOjpmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbikgewogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAKLSAgICBzZW5kSW1tZWRpYXRlSW5hY3Rpdml0eVRpbWVvdXRMb2NrZWQoKTsKKyAgICAvLyBSZW1vdmUgdGhlIGluYWN0aXZpdHkgdGltZW91dCwgc2luY2Ugd2UgYXJlIGZhZGluZyBub3cuCisgICAgcmVtb3ZlSW5hY3Rpdml0eVRpbWVvdXRMb2NrZWQoKTsKKworICAgIC8vIFN0YXJ0IGZhZGluZy4KKyAgICBpZiAodHJhbnNpdGlvbiA9PSBUUkFOU0lUSU9OX0lNTUVESUFURSkgeworICAgICAgICBtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID0gMDsKKyAgICAgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAwLjBmOworICAgICAgICB1cGRhdGVQb2ludGVyTG9ja2VkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxvY2tlZC5wb2ludGVyRmFkZURpcmVjdGlvbiA9IC0xOworICAgICAgICBzdGFydEFuaW1hdGlvbkxvY2tlZCgpOworICAgIH0KIH0KIAotdm9pZCBQb2ludGVyQ29udHJvbGxlcjo6dW5mYWRlKCkgewordm9pZCBQb2ludGVyQ29udHJvbGxlcjo6dW5mYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbikgewogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAKICAgICAvLyBBbHdheXMgcmVzZXQgdGhlIGluYWN0aXZpdHkgdGltZXIuCiAgICAgcmVzZXRJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpOwogCi0gICAgLy8gVW5mYWRlIGltbWVkaWF0ZWx5IGlmIG5lZWRlZC4KLSAgICBpZiAobUxvY2tlZC5wb2ludGVySXNGYWRpbmcpIHsKLSAgICAgICAgbUxvY2tlZC5wb2ludGVySXNGYWRpbmcgPSBmYWxzZTsKKyAgICAvLyBTdGFydCB1bmZhZGluZy4KKyAgICBpZiAodHJhbnNpdGlvbiA9PSBUUkFOU0lUSU9OX0lNTUVESUFURSkgeworICAgICAgICBtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID0gMDsKICAgICAgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAxLjBmOwogICAgICAgICB1cGRhdGVQb2ludGVyTG9ja2VkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxvY2tlZC5wb2ludGVyRmFkZURpcmVjdGlvbiA9IDE7CisgICAgICAgIHN0YXJ0QW5pbWF0aW9uTG9ja2VkKCk7CiAgICAgfQogfQogCkBAIC0yMjYsMTUgKzI0MCwxNSBAQAogICAgIH0KIH0KIAotdm9pZCBQb2ludGVyQ29udHJvbGxlcjo6c2V0U3BvdHMoU3BvdEdlc3R1cmUgc3BvdEdlc3R1cmUsCi0gICAgICAgIGNvbnN0IFBvaW50ZXJDb29yZHMqIHNwb3RDb29yZHMsIGNvbnN0IHVpbnQzMl90KiBzcG90SWRUb0luZGV4LCBCaXRTZXQzMiBzcG90SWRCaXRzKSB7Cit2b2lkIFBvaW50ZXJDb250cm9sbGVyOjpzZXRTcG90cyhjb25zdCBQb2ludGVyQ29vcmRzKiBzcG90Q29vcmRzLAorICAgICAgICBjb25zdCB1aW50MzJfdCogc3BvdElkVG9JbmRleCwgQml0U2V0MzIgc3BvdElkQml0cykgewogI2lmIERFQlVHX1BPSU5URVJfVVBEQVRFUwotICAgIExPR0QoInNldFNwb3RzOiBzcG90R2VzdHVyZT0lZCIsIHNwb3RHZXN0dXJlKTsKKyAgICBMT0dEKCJzZXRTcG90czogaWRCaXRzPSUwOHgiLCBzcG90SWRCaXRzLnZhbHVlKTsKICAgICBmb3IgKEJpdFNldDMyIGlkQml0cyhzcG90SWRCaXRzKTsgIWlkQml0cy5pc0VtcHR5KCk7ICkgewogICAgICAgICB1aW50MzJfdCBpZCA9IGlkQml0cy5maXJzdE1hcmtlZEJpdCgpOwogICAgICAgICBpZEJpdHMuY2xlYXJCaXQoaWQpOwogICAgICAgICBjb25zdCBQb2ludGVyQ29vcmRzJiBjID0gc3BvdENvb3Jkc1tzcG90SWRUb0luZGV4W2lkXV07Ci0gICAgICAgIExPR0QoIiAgc3BvdCAlZDogcG9zaXRpb249KCUwLjNmLCAlMC4zZiksIHByZXNzdXJlPSUwLjNmIiwgaWQsCisgICAgICAgIExPR0QoIiBzcG90ICVkOiBwb3NpdGlvbj0oJTAuM2YsICUwLjNmKSwgcHJlc3N1cmU9JTAuM2YiLCBpZCwKICAgICAgICAgICAgICAgICBjLmdldEF4aXNWYWx1ZShBTU9USU9OX0VWRU5UX0FYSVNfWCksCiAgICAgICAgICAgICAgICAgYy5nZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1kpLAogICAgICAgICAgICAgICAgIGMuZ2V0QXhpc1ZhbHVlKEFNT1RJT05fRVZFTlRfQVhJU19QUkVTU1VSRSkpOwpAQCAtNDAxLDEwICs0MTUsMjAgQEAKICAgICBuc2Vjc190IGZyYW1lRGVsYXkgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgLSBtTG9ja2VkLmFuaW1hdGlvblRpbWU7CiAKICAgICAvLyBBbmltYXRlIHBvaW50ZXIgZmFkZS4KLSAgICBpZiAobUxvY2tlZC5wb2ludGVySXNGYWRpbmcpIHsKKyAgICBpZiAobUxvY2tlZC5wb2ludGVyRmFkZURpcmVjdGlvbiA8IDApIHsKICAgICAgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgLT0gZmxvYXQoZnJhbWVEZWxheSkgLyBQT0lOVEVSX0ZBREVfRFVSQVRJT047Ci0gICAgICAgIGlmIChtTG9ja2VkLnBvaW50ZXJBbHBoYSA8PSAwKSB7Ci0gICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJBbHBoYSA9IDA7CisgICAgICAgIGlmIChtTG9ja2VkLnBvaW50ZXJBbHBoYSA8PSAwLjBmKSB7CisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJBbHBoYSA9IDAuMGY7CisgICAgICAgICAgICBtTG9ja2VkLnBvaW50ZXJGYWRlRGlyZWN0aW9uID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGtlZXBBbmltYXRpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKKyAgICB9IGVsc2UgaWYgKG1Mb2NrZWQucG9pbnRlckZhZGVEaXJlY3Rpb24gPiAwKSB7CisgICAgICAgIG1Mb2NrZWQucG9pbnRlckFscGhhICs9IGZsb2F0KGZyYW1lRGVsYXkpIC8gUE9JTlRFUl9GQURFX0RVUkFUSU9OOworICAgICAgICBpZiAobUxvY2tlZC5wb2ludGVyQWxwaGEgPj0gMS4wZikgeworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyQWxwaGEgPSAxLjBmOworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyRmFkZURpcmVjdGlvbiA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBrZWVwQW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtNDMyLDEyICs0NTYsNyBAQAogfQogCiB2b2lkIFBvaW50ZXJDb250cm9sbGVyOjpkb0luYWN0aXZpdHlUaW1lb3V0KCkgewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICBpZiAoIW1Mb2NrZWQucG9pbnRlcklzRmFkaW5nKSB7Ci0gICAgICAgIG1Mb2NrZWQucG9pbnRlcklzRmFkaW5nID0gdHJ1ZTsKLSAgICAgICAgc3RhcnRBbmltYXRpb25Mb2NrZWQoKTsKLSAgICB9CisgICAgZmFkZShUUkFOU0lUSU9OX0dSQURVQUwpOwogfQogCiB2b2lkIFBvaW50ZXJDb250cm9sbGVyOjpzdGFydEFuaW1hdGlvbkxvY2tlZCgpIHsKQEAgLTQ1Niw5ICs0NzUsOCBAQAogICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlRGVsYXllZCh0aW1lb3V0LCBtSGFuZGxlciwgTVNHX0lOQUNUSVZJVFlfVElNRU9VVCk7CiB9CiAKLXZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OnNlbmRJbW1lZGlhdGVJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpIHsKK3ZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OnJlbW92ZUluYWN0aXZpdHlUaW1lb3V0TG9ja2VkKCkgewogICAgIG1Mb29wZXItPnJlbW92ZU1lc3NhZ2VzKG1IYW5kbGVyLCBNU0dfSU5BQ1RJVklUWV9USU1FT1VUKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShtSGFuZGxlciwgTVNHX0lOQUNUSVZJVFlfVElNRU9VVCk7CiB9CiAKIHZvaWQgUG9pbnRlckNvbnRyb2xsZXI6OnVwZGF0ZVBvaW50ZXJMb2NrZWQoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5oIGIvc2VydmljZXMvaW5wdXQvUG9pbnRlckNvbnRyb2xsZXIuaAppbmRleCBjNzQzNWVlLi43MDBlZjcyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9pbnB1dC9Qb2ludGVyQ29udHJvbGxlci5oCisrKyBiL3NlcnZpY2VzL2lucHV0L1BvaW50ZXJDb250cm9sbGVyLmgKQEAgLTY0LDE0ICs2NCwyMSBAQAogICAgIC8qIEdldHMgdGhlIGFic29sdXRlIGxvY2F0aW9uIG9mIHRoZSBwb2ludGVyLiAqLwogICAgIHZpcnR1YWwgdm9pZCBnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0ID0gMDsKIAorICAgIGVudW0gVHJhbnNpdGlvbiB7CisgICAgICAgIC8vIEZhZGUvdW5mYWRlIGltbWVkaWF0ZWx5LgorICAgICAgICBUUkFOU0lUSU9OX0lNTUVESUFURSwKKyAgICAgICAgLy8gRmFkZS91bmZhZGUgZ3JhZHVhbGx5LgorICAgICAgICBUUkFOU0lUSU9OX0dSQURVQUwsCisgICAgfTsKKwogICAgIC8qIEZhZGVzIHRoZSBwb2ludGVyIG91dCBub3cuICovCi0gICAgdmlydHVhbCB2b2lkIGZhZGUoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGZhZGUoVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSA9IDA7CiAKICAgICAvKiBNYWtlcyB0aGUgcG9pbnRlciB2aXNpYmxlIGlmIGl0IGhhcyBmYWRlZCBvdXQuCiAgICAgICogVGhlIHBvaW50ZXIgbmV2ZXIgdW5mYWRlcyBpdHNlbGYgYXV0b21hdGljYWxseS4gIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkCiAgICAgICogYnkgdGhlIGNsaWVudCB3aGVuZXZlciB0aGUgcG9pbnRlciBpcyBtb3ZlZCBvciBhIGJ1dHRvbiBpcyBwcmVzc2VkIGFuZCBpdAogICAgICAqIHdhbnRzIHRvIGVuc3VyZSB0aGF0IHRoZSBwb2ludGVyIGJlY29tZXMgdmlzaWJsZSBhZ2Fpbi4gKi8KLSAgICB2aXJ0dWFsIHZvaWQgdW5mYWRlKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCB1bmZhZGUoVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSA9IDA7CiAKICAgICBlbnVtIFByZXNlbnRhdGlvbiB7CiAgICAgICAgIC8vIFNob3cgdGhlIG1vdXNlIHBvaW50ZXIuCkBAIC04MywzOCArOTAsNiBAQAogICAgIC8qIFNldHMgdGhlIG1vZGUgb2YgdGhlIHBvaW50ZXIgY29udHJvbGxlci4gKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0UHJlc2VudGF0aW9uKFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pID0gMDsKIAotICAgIC8vIERlc2NyaWJlcyB0aGUgY3VycmVudCBnZXN0dXJlLgotICAgIGVudW0gU3BvdEdlc3R1cmUgewotICAgICAgICAvLyBObyBnZXN0dXJlLgotICAgICAgICAvLyBEbyBub3QgZGlzcGxheSBhbnkgc3BvdHMuCi0gICAgICAgIFNQT1RfR0VTVFVSRV9ORVVUUkFMLAotICAgICAgICAvLyBUYXAgYXQgY3VycmVudCBsb2NhdGlvbi4KLSAgICAgICAgLy8gQnJpZWZseSBkaXNwbGF5IG9uZSBzcG90IGF0IHRoZSB0YXBwZWQgbG9jYXRpb24uCi0gICAgICAgIFNQT1RfR0VTVFVSRV9UQVAsCi0gICAgICAgIC8vIERyYWcgYXQgY3VycmVudCBsb2NhdGlvbi4KLSAgICAgICAgLy8gRGlzcGxheSBzcG90IGF0IHByZXNzZWQgbG9jYXRpb24uCi0gICAgICAgIFNQT1RfR0VTVFVSRV9EUkFHLAotICAgICAgICAvLyBCdXR0b24gcHJlc3NlZCBidXQgbm8gZmluZ2VyIGlzIGRvd24uCi0gICAgICAgIC8vIERpc3BsYXkgc3BvdCBhdCBwcmVzc2VkIGxvY2F0aW9uLgotICAgICAgICBTUE9UX0dFU1RVUkVfQlVUVE9OX0NMSUNLLAotICAgICAgICAvLyBCdXR0b24gcHJlc3NlZCBhbmQgYSBmaW5nZXIgaXMgZG93bi4KLSAgICAgICAgLy8gRGlzcGxheSBzcG90IGF0IHByZXNzZWQgbG9jYXRpb24uCi0gICAgICAgIFNQT1RfR0VTVFVSRV9CVVRUT05fRFJBRywKLSAgICAgICAgLy8gT25lIGZpbmdlciBkb3duIGFuZCBob3ZlcmluZy4KLSAgICAgICAgLy8gRGlzcGxheSBzcG90IGF0IHRoZSBob3ZlcmVkIGxvY2F0aW9uLgotICAgICAgICBTUE9UX0dFU1RVUkVfSE9WRVIsCi0gICAgICAgIC8vIFR3byBmaW5nZXJzIGRvd24gYnV0IG5vdCBzdXJlIGluIHdoaWNoIGRpcmVjdGlvbiB0aGV5IGFyZSBtb3Zpbmcgc28gd2UgY29uc2lkZXIKLSAgICAgICAgLy8gaXQgYSBwcmVzcyBhdCB0aGUgcG9pbnRlciBsb2NhdGlvbi4KLSAgICAgICAgLy8gRGlzcGxheSB0d28gc3BvdHMgbmVhciB0aGUgcG9pbnRlciBsb2NhdGlvbi4KLSAgICAgICAgU1BPVF9HRVNUVVJFX1BSRVNTLAotICAgICAgICAvLyBUd28gZmluZ2VycyBkb3duIGFuZCBtb3ZpbmcgaW4gc2FtZSBkaXJlY3Rpb24uCi0gICAgICAgIC8vIERpc3BsYXkgdHdvIHNwb3RzIG5lYXIgdGhlIHBvaW50ZXIgbG9jYXRpb24uCi0gICAgICAgIFNQT1RfR0VTVFVSRV9TV0lQRSwKLSAgICAgICAgLy8gVHdvIG9yIG1vcmUgZmluZ2VycyBkb3duIGFuZCBtb3ZpbmcgaW4gYXJiaXRyYXJ5IGRpcmVjdGlvbnMuCi0gICAgICAgIC8vIERpc3BsYXkgdHdvIG9yIG1vcmUgc3BvdHMgbmVhciB0aGUgcG9pbnRlciBsb2NhdGlvbiwgb25lIGZvciBlYWNoIGZpbmdlci4KLSAgICAgICAgU1BPVF9HRVNUVVJFX0ZSRUVGT1JNLAotICAgIH07Ci0KICAgICAvKiBTZXRzIHRoZSBzcG90cyBmb3IgdGhlIGN1cnJlbnQgZ2VzdHVyZS4KICAgICAgKiBUaGUgc3BvdHMgYXJlIG5vdCBzdWJqZWN0IHRvIHRoZSBpbmFjdGl2aXR5IHRpbWVvdXQgbGlrZSB0aGUgcG9pbnRlcgogICAgICAqIGl0c2VsZiBpdCBzaW5jZSB0aGV5IGFyZSBleHBlY3RlZCB0byByZW1haW4gdmlzaWJsZSBmb3Igc28gbG9uZyBhcwpAQCAtMTI0LDggKzk5LDcgQEAKICAgICAgKiBGb3Igc3BvdENvb3JkcywgcHJlc3N1cmUgIT0gMCBpbmRpY2F0ZXMgdGhhdCB0aGUgc3BvdCdzIGxvY2F0aW9uIGlzIGJlaW5nCiAgICAgICogcHJlc3NlZCAobm90IGhvdmVyaW5nKS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3BvdHMoU3BvdEdlc3R1cmUgc3BvdEdlc3R1cmUsCi0gICAgICAgICAgICBjb25zdCBQb2ludGVyQ29vcmRzKiBzcG90Q29vcmRzLCBjb25zdCB1aW50MzJfdCogc3BvdElkVG9JbmRleCwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3BvdHMoY29uc3QgUG9pbnRlckNvb3Jkcyogc3BvdENvb3JkcywgY29uc3QgdWludDMyX3QqIHNwb3RJZFRvSW5kZXgsCiAgICAgICAgICAgICBCaXRTZXQzMiBzcG90SWRCaXRzKSA9IDA7CiAKICAgICAvKiBSZW1vdmVzIGFsbCBzcG90cy4gKi8KQEAgLTE4NywxMiArMTYxLDEyIEBACiAgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1dHRvblN0YXRlKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpOwogICAgIHZpcnR1YWwgdm9pZCBnZXRQb3NpdGlvbihmbG9hdCogb3V0WCwgZmxvYXQqIG91dFkpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBmYWRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVuZmFkZSgpOworICAgIHZpcnR1YWwgdm9pZCBmYWRlKFRyYW5zaXRpb24gdHJhbnNpdGlvbik7CisgICAgdmlydHVhbCB2b2lkIHVuZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pOwogCiAgICAgdmlydHVhbCB2b2lkIHNldFByZXNlbnRhdGlvbihQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0U3BvdHMoU3BvdEdlc3R1cmUgc3BvdEdlc3R1cmUsCi0gICAgICAgICAgICBjb25zdCBQb2ludGVyQ29vcmRzKiBzcG90Q29vcmRzLCBjb25zdCB1aW50MzJfdCogc3BvdElkVG9JbmRleCwgQml0U2V0MzIgc3BvdElkQml0cyk7CisgICAgdmlydHVhbCB2b2lkIHNldFNwb3RzKGNvbnN0IFBvaW50ZXJDb29yZHMqIHNwb3RDb29yZHMsCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogc3BvdElkVG9JbmRleCwgQml0U2V0MzIgc3BvdElkQml0cyk7CiAgICAgdmlydHVhbCB2b2lkIGNsZWFyU3BvdHMoKTsKIAogICAgIHZvaWQgc2V0RGlzcGxheVNpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOwpAQCAtMjUwLDcgKzIyNCw3IEBACiAgICAgICAgIFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb247CiAgICAgICAgIGJvb2wgcHJlc2VudGF0aW9uQ2hhbmdlZDsKIAotICAgICAgICBib29sIHBvaW50ZXJJc0ZhZGluZzsKKyAgICAgICAgaW50MzJfdCBwb2ludGVyRmFkZURpcmVjdGlvbjsKICAgICAgICAgZmxvYXQgcG9pbnRlclg7CiAgICAgICAgIGZsb2F0IHBvaW50ZXJZOwogICAgICAgICBmbG9hdCBwb2ludGVyQWxwaGE7CkBAIC0yNzQsNyArMjQ4LDcgQEAKICAgICB2b2lkIHN0YXJ0QW5pbWF0aW9uTG9ja2VkKCk7CiAKICAgICB2b2lkIHJlc2V0SW5hY3Rpdml0eVRpbWVvdXRMb2NrZWQoKTsKLSAgICB2b2lkIHNlbmRJbW1lZGlhdGVJbmFjdGl2aXR5VGltZW91dExvY2tlZCgpOworICAgIHZvaWQgcmVtb3ZlSW5hY3Rpdml0eVRpbWVvdXRMb2NrZWQoKTsKICAgICB2b2lkIHVwZGF0ZVBvaW50ZXJMb2NrZWQoKTsKIAogICAgIFNwb3QqIGdldFNwb3RMb2NrZWQodWludDMyX3QgaWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvdGVzdHMvSW5wdXREaXNwYXRjaGVyX3Rlc3QuY3BwIGIvc2VydmljZXMvaW5wdXQvdGVzdHMvSW5wdXREaXNwYXRjaGVyX3Rlc3QuY3BwCmluZGV4IDNkYjM0NzMuLjhkZmI0NGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0L3Rlc3RzL0lucHV0RGlzcGF0Y2hlcl90ZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dERpc3BhdGNoZXJfdGVzdC5jcHAKQEAgLTM1LDYgKzM1LDggQEAKIC8vIC0tLSBGYWtlSW5wdXREaXNwYXRjaGVyUG9saWN5IC0tLQogCiBjbGFzcyBGYWtlSW5wdXREaXNwYXRjaGVyUG9saWN5IDogcHVibGljIElucHV0RGlzcGF0Y2hlclBvbGljeUludGVyZmFjZSB7CisgICAgSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbiBtQ29uZmlnOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RmFrZUlucHV0RGlzcGF0Y2hlclBvbGljeSgpIHsKICAgICB9CkBAIC01NSwxNiArNTcsMTIgQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SW5wdXRDaGFubmVsQnJva2VuKGNvbnN0IHNwPElucHV0V2luZG93SGFuZGxlPiYgaW5wdXRXaW5kb3dIYW5kbGUpIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIG5zZWNzX3QgZ2V0S2V5UmVwZWF0VGltZW91dCgpIHsKLSAgICAgICAgcmV0dXJuIDUwMCAqIDEwMDAwMDBMTDsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24oSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbiogb3V0Q29uZmlnKSB7CisgICAgICAgICpvdXRDb25maWcgPSBtQ29uZmlnOwogICAgIH0KIAotICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRLZXlSZXBlYXREZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIDUwICogMTAwMDAwMExMOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50MzJfdCBnZXRNYXhFdmVudHNQZXJTZWNvbmQoKSB7Ci0gICAgICAgIHJldHVybiA2MDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNLZXlSZXBlYXRFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGJvb2wgZmlsdGVySW5wdXRFdmVudChjb25zdCBJbnB1dEV2ZW50KiBpbnB1dEV2ZW50LCB1aW50MzJfdCBwb2xpY3lGbGFncykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvaW5wdXQvdGVzdHMvSW5wdXRSZWFkZXJfdGVzdC5jcHAgYi9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dFJlYWRlcl90ZXN0LmNwcAppbmRleCAxYWIyYTNlLi5lMzQ5MjQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dFJlYWRlcl90ZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9pbnB1dC90ZXN0cy9JbnB1dFJlYWRlcl90ZXN0LmNwcApAQCAtOTIsMTcgKzkyLDE3IEBACiAgICAgICAgICpvdXRZID0gMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgZmFkZSgpIHsKKyAgICB2aXJ0dWFsIHZvaWQgZmFkZShUcmFuc2l0aW9uIHRyYW5zaXRpb24pIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgdW5mYWRlKCkgeworICAgIHZpcnR1YWwgdm9pZCB1bmZhZGUoVHJhbnNpdGlvbiB0cmFuc2l0aW9uKSB7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHNldFByZXNlbnRhdGlvbihQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHNldFNwb3RzKFNwb3RHZXN0dXJlIHNwb3RHZXN0dXJlLAotICAgICAgICAgICAgY29uc3QgUG9pbnRlckNvb3Jkcyogc3BvdENvb3JkcywgY29uc3QgdWludDMyX3QqIHNwb3RJZFRvSW5kZXgsIEJpdFNldDMyIHNwb3RJZEJpdHMpIHsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3BvdHMoY29uc3QgUG9pbnRlckNvb3Jkcyogc3BvdENvb3JkcywKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcG90SWRUb0luZGV4LCBCaXRTZXQzMiBzcG90SWRCaXRzKSB7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIGNsZWFyU3BvdHMoKSB7CkBAIC0xMjAsMTcgKzEyMCwxNCBAQAogICAgIH07CiAKICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBEaXNwbGF5SW5mbz4gbURpc3BsYXlJbmZvczsKLSAgICBib29sIG1GaWx0ZXJUb3VjaEV2ZW50czsKLSAgICBib29sIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzOwotICAgIFZlY3RvcjxTdHJpbmc4PiBtRXhjbHVkZWREZXZpY2VOYW1lczsKKyAgICBJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24gbUNvbmZpZzsKICAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxGYWtlUG9pbnRlckNvbnRyb2xsZXI+ID4gbVBvaW50ZXJDb250cm9sbGVyczsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZha2VJbnB1dFJlYWRlclBvbGljeSgpIHsgfQogCiBwdWJsaWM6Ci0gICAgRmFrZUlucHV0UmVhZGVyUG9saWN5KCkgOgotICAgICAgICAgICAgbUZpbHRlclRvdWNoRXZlbnRzKGZhbHNlKSwgbUZpbHRlckp1bXB5VG91Y2hFdmVudHMoZmFsc2UpIHsKKyAgICBGYWtlSW5wdXRSZWFkZXJQb2xpY3koKSB7CiAgICAgfQogCiAgICAgdm9pZCByZW1vdmVEaXNwbGF5SW5mbyhpbnQzMl90IGRpc3BsYXlJZCkgewpAQCAtMTQ4LDExICsxNDUsMTEgQEAKICAgICB9CiAKICAgICB2b2lkIHNldEZpbHRlclRvdWNoRXZlbnRzKGJvb2wgZW5hYmxlZCkgewotICAgICAgICBtRmlsdGVyVG91Y2hFdmVudHMgPSBlbmFibGVkOworICAgICAgICBtQ29uZmlnLmZpbHRlclRvdWNoRXZlbnRzID0gZW5hYmxlZDsKICAgICB9CiAKICAgICB2b2lkIHNldEZpbHRlckp1bXB5VG91Y2hFdmVudHMoYm9vbCBlbmFibGVkKSB7Ci0gICAgICAgIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzID0gZW5hYmxlZDsKKyAgICAgICAgbUNvbmZpZy5maWx0ZXJKdW1weVRvdWNoRXZlbnRzID0gZW5hYmxlZDsKICAgICB9CiAKICAgICB2aXJ0dWFsIG5zZWNzX3QgZ2V0VmlydHVhbEtleVF1aWV0VGltZSgpIHsKQEAgLTE2MCw3ICsxNTcsNyBAQAogICAgIH0KIAogICAgIHZvaWQgYWRkRXhjbHVkZWREZXZpY2VOYW1lKGNvbnN0IFN0cmluZzgmIGRldmljZU5hbWUpIHsKLSAgICAgICAgbUV4Y2x1ZGVkRGV2aWNlTmFtZXMucHVzaChkZXZpY2VOYW1lKTsKKyAgICAgICAgbUNvbmZpZy5leGNsdWRlZERldmljZU5hbWVzLnB1c2goZGV2aWNlTmFtZSk7CiAgICAgfQogCiAgICAgdm9pZCBzZXRQb2ludGVyQ29udHJvbGxlcihpbnQzMl90IGRldmljZUlkLCBjb25zdCBzcDxGYWtlUG9pbnRlckNvbnRyb2xsZXI+JiBjb250cm9sbGVyKSB7CkBAIC0xODcsMTYgKzE4NCw4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGJvb2wgZmlsdGVyVG91Y2hFdmVudHMoKSB7Ci0gICAgICAgIHJldHVybiBtRmlsdGVyVG91Y2hFdmVudHM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGZpbHRlckp1bXB5VG91Y2hFdmVudHMoKSB7Ci0gICAgICAgIHJldHVybiBtRmlsdGVySnVtcHlUb3VjaEV2ZW50czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZ2V0RXhjbHVkZWREZXZpY2VOYW1lcyhWZWN0b3I8U3RyaW5nOD4mIG91dEV4Y2x1ZGVkRGV2aWNlTmFtZXMpIHsKLSAgICAgICAgb3V0RXhjbHVkZWREZXZpY2VOYW1lcy5hcHBlbmRWZWN0b3IobUV4Y2x1ZGVkRGV2aWNlTmFtZXMpOworICAgIHZpcnR1YWwgdm9pZCBnZXRSZWFkZXJDb25maWd1cmF0aW9uKElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiogb3V0Q29uZmlnKSB7CisgICAgICAgICpvdXRDb25maWcgPSBtQ29uZmlnOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3A8UG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U+IG9idGFpblBvaW50ZXJDb250cm9sbGVyKGludDMyX3QgZGV2aWNlSWQpIHsKQEAgLTQ5Miw3ICs0ODEsNyBAQAogICAgIH0KIAogICAgIHZvaWQgYWRkQWJzb2x1dGVBeGlzKGludDMyX3QgZGV2aWNlSWQsIGludCBheGlzLAotICAgICAgICAgICAgaW50MzJfdCBtaW5WYWx1ZSwgaW50MzJfdCBtYXhWYWx1ZSwgaW50IGZsYXQsIGludCBmdXp6KSB7CisgICAgICAgICAgICBpbnQzMl90IG1pblZhbHVlLCBpbnQzMl90IG1heFZhbHVlLCBpbnQgZmxhdCwgaW50IGZ1enosIGludCByZXNvbHV0aW9uID0gMCkgewogICAgICAgICBEZXZpY2UqIGRldmljZSA9IGdldERldmljZShkZXZpY2VJZCk7CiAKICAgICAgICAgUmF3QWJzb2x1dGVBeGlzSW5mbyBpbmZvOwpAQCAtNTAxLDYgKzQ5MCw3IEBACiAgICAgICAgIGluZm8ubWF4VmFsdWUgPSBtYXhWYWx1ZTsKICAgICAgICAgaW5mby5mbGF0ID0gZmxhdDsKICAgICAgICAgaW5mby5mdXp6ID0gZnV6ejsKKyAgICAgICAgaW5mby5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKICAgICAgICAgZGV2aWNlLT5hYnNvbHV0ZUF4ZXMuYWRkKGF4aXMsIGluZm8pOwogICAgIH0KIApAQCAtNjQwLDggKzYzMCw4IEBACiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgYWRkRXhjbHVkZWREZXZpY2UoY29uc3QgY2hhciogZGV2aWNlTmFtZSkgewotICAgICAgICBtRXhjbHVkZWREZXZpY2VzLmFkZChTdHJpbmc4KGRldmljZU5hbWUpKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXhjbHVkZWREZXZpY2VzKGNvbnN0IFZlY3RvcjxTdHJpbmc4PiYgZGV2aWNlcykgeworICAgICAgICBtRXhjbHVkZWREZXZpY2VzID0gZGV2aWNlczsKICAgICB9CiAKICAgICB2aXJ0dWFsIHNpemVfdCBnZXRFdmVudHMoaW50IHRpbWVvdXRNaWxsaXMsIFJhd0V2ZW50KiBidWZmZXIsIHNpemVfdCBidWZmZXJTaXplKSB7CkBAIC03MzksNiArNzI5LDEyIEBACiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiBkdW1wKSB7CiAgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RSZW9wZW5EZXZpY2VzKCkgeworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB3YWtlKCkgeworICAgIH0KIH07CiAKIApAQCAtODkyLDcgKzg4OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlKCkgeworICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmUoY29uc3QgSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBjb25maWcsIHVpbnQzMl90IGNoYW5nZXMpIHsKICAgICAgICAgbUNvbmZpZ3VyZVdhc0NhbGxlZCA9IHRydWU7CiAgICAgfQogCkBAIC0xMzU2LDcgKzEzNTIsOCBAQAogCiBURVNUX0YoSW5wdXREZXZpY2VUZXN0LCBXaGVuTm9NYXBwZXJzQXJlUmVnaXN0ZXJlZF9EZXZpY2VJc0lnbm9yZWQpIHsKICAgICAvLyBDb25maWd1cmF0aW9uLgotICAgIG1EZXZpY2UtPmNvbmZpZ3VyZSgpOworICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgbURldmljZS0+Y29uZmlndXJlKCZjb25maWcsIDApOwogCiAgICAgLy8gTWV0YWRhdGEuCiAgICAgQVNTRVJUX1RSVUUobURldmljZS0+aXNJZ25vcmVkKCkpOwpAQCAtMTQxMCw3ICsxNDA3LDggQEAKICAgICBtYXBwZXIyLT5zZXRNZXRhU3RhdGUoQU1FVEFfU0hJRlRfT04pOwogICAgIG1EZXZpY2UtPmFkZE1hcHBlcihtYXBwZXIyKTsKIAotICAgIG1EZXZpY2UtPmNvbmZpZ3VyZSgpOworICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgbURldmljZS0+Y29uZmlndXJlKCZjb25maWcsIDApOwogCiAgICAgU3RyaW5nOCBwcm9wZXJ0eVZhbHVlOwogICAgIEFTU0VSVF9UUlVFKG1EZXZpY2UtPmdldENvbmZpZ3VyYXRpb24oKS50cnlHZXRQcm9wZXJ0eShTdHJpbmc4KCJrZXkiKSwgcHJvcGVydHlWYWx1ZSkpCkBAIC0xNTE2LDggKzE1MTQsMTAgQEAKICAgICB9CiAKICAgICB2b2lkIGFkZE1hcHBlckFuZENvbmZpZ3VyZShJbnB1dE1hcHBlciogbWFwcGVyKSB7CisgICAgICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisKICAgICAgICAgbURldmljZS0+YWRkTWFwcGVyKG1hcHBlcik7Ci0gICAgICAgIG1EZXZpY2UtPmNvbmZpZ3VyZSgpOworICAgICAgICBtRGV2aWNlLT5jb25maWd1cmUoJmNvbmZpZywgMCk7CiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgcHJvY2VzcyhJbnB1dE1hcHBlciogbWFwcGVyLCBuc2Vjc190IHdoZW4sIGludDMyX3QgZGV2aWNlSWQsIGludDMyX3QgdHlwZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FwcFdpZGdldFNlcnZpY2UuamF2YQppbmRleCBjMDNiOTk0Li4xNThjNzc4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BcHBXaWRnZXRTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQXBwV2lkZ2V0U2VydmljZS5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLmltcGwuU2ltcGxlTG9nOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwpAQCAtMzk0LDQxICszOTUsNDcgQEAKICAgICBwdWJsaWMgdm9pZCBiaW5kQXBwV2lkZ2V0SWQoaW50IGFwcFdpZGdldElkLCBDb21wb25lbnROYW1lIHByb3ZpZGVyKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQklORF9BUFBXSURHRVQsCiAgICAgICAgICAgICAgICAgImJpbmRHYWdldElkIGFwcFdpZGdldElkPSIgKyBhcHBXaWRnZXRJZCArICIgcHJvdmlkZXI9IiArIHByb3ZpZGVyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXBwV2lkZ2V0SWRzKSB7Ci0gICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkKTsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYmFkIGFwcFdpZGdldElkIik7CisgICAgICAgIAorICAgICAgICBmaW5hbCBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1BcHBXaWRnZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBBcHBXaWRnZXRJZCBpZCA9IGxvb2t1cEFwcFdpZGdldElkTG9ja2VkKGFwcFdpZGdldElkKTsKKyAgICAgICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiYWQgYXBwV2lkZ2V0SWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlkLnByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXBwV2lkZ2V0SWQgIiArIGFwcFdpZGdldElkICsgIiBhbHJlYWR5IGJvdW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlkLnByb3ZpZGVyLmluZm8ucHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQcm92aWRlciBwID0gbG9va3VwUHJvdmlkZXJMb2NrZWQocHJvdmlkZXIpOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90IGEgYXBwd2lkZ2V0IHByb3ZpZGVyOiAiICsgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocC56b21iaWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuJ3QgYmluZCB0byBhIDNyZCBwYXJ0eSBwcm92aWRlciBpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2FmZSBtb2RlOiAiICsgcHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICBpZC5wcm92aWRlciA9IHA7CisgICAgICAgICAgICAgICAgcC5pbnN0YW5jZXMuYWRkKGlkKTsKKyAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2VzU2l6ZSA9IHAuaW5zdGFuY2VzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2VzU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRlbGwgdGhlIHByb3ZpZGVyIHRoYXQgaXQncyByZWFkeQorICAgICAgICAgICAgICAgICAgICBzZW5kRW5hYmxlSW50ZW50TG9ja2VkKHApOworICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgICAgICAvLyBzZW5kIGFuIHVwZGF0ZSBub3cgLS0gV2UgbmVlZCB0aGlzIHVwZGF0ZSBub3csIGFuZCBqdXN0IGZvciB0aGlzIGFwcFdpZGdldElkLgorICAgICAgICAgICAgICAgIC8vIEl0J3MgbGVzcyBjcml0aWNhbCB3aGVuIHRoZSBuZXh0IG9uZSBoYXBwZW5zLCBzbyB3aGVuIHdlIHNjaGR1bGUgdGhlIG5leHQgb25lLAorICAgICAgICAgICAgICAgIC8vIHdlIGFkZCB1cGRhdGVQZXJpb2RNaWxsaXMgdG8gaXRzIHN0YXJ0IHRpbWUuICBUaGF0IHRpbWUgd2lsbCBoYXZlIHNvbWUgc2xvcCwKKyAgICAgICAgICAgICAgICAvLyBidXQgdGhhdCdzIG9rYXkuCisgICAgICAgICAgICAgICAgc2VuZFVwZGF0ZUludGVudExvY2tlZChwLCBuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9KTsKKyAgICAKKyAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB0aGUgZnV0dXJlIHVwZGF0ZXMKKyAgICAgICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHNMb2NrZWQocCwgZ2V0QXBwV2lkZ2V0SWRzKHApKTsKKyAgICAgICAgICAgICAgICBzYXZlU3RhdGVMb2NrZWQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpZC5wcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXBwV2lkZ2V0SWQgIiArIGFwcFdpZGdldElkICsgIiBhbHJlYWR5IGJvdW5kIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgaWQucHJvdmlkZXIuaW5mby5wcm92aWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcm92aWRlciBwID0gbG9va3VwUHJvdmlkZXJMb2NrZWQocHJvdmlkZXIpOwotICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdCBhIGFwcHdpZGdldCBwcm92aWRlcjogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwLnpvbWJpZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbid0IGJpbmQgdG8gYSAzcmQgcGFydHkgcHJvdmlkZXIgaW4iCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgc2FmZSBtb2RlOiAiICsgcHJvdmlkZXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZC5wcm92aWRlciA9IHA7Ci0gICAgICAgICAgICBwLmluc3RhbmNlcy5hZGQoaWQpOwotICAgICAgICAgICAgaW50IGluc3RhbmNlc1NpemUgPSBwLmluc3RhbmNlcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoaW5zdGFuY2VzU2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGVsbCB0aGUgcHJvdmlkZXIgdGhhdCBpdCdzIHJlYWR5Ci0gICAgICAgICAgICAgICAgc2VuZEVuYWJsZUludGVudExvY2tlZChwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2VuZCBhbiB1cGRhdGUgbm93IC0tIFdlIG5lZWQgdGhpcyB1cGRhdGUgbm93LCBhbmQganVzdCBmb3IgdGhpcyBhcHBXaWRnZXRJZC4KLSAgICAgICAgICAgIC8vIEl0J3MgbGVzcyBjcml0aWNhbCB3aGVuIHRoZSBuZXh0IG9uZSBoYXBwZW5zLCBzbyB3aGVuIHdlIHNjaGR1bGUgdGhlIG5leHQgb25lLAotICAgICAgICAgICAgLy8gd2UgYWRkIHVwZGF0ZVBlcmlvZE1pbGxpcyB0byBpdHMgc3RhcnQgdGltZS4gIFRoYXQgdGltZSB3aWxsIGhhdmUgc29tZSBzbG9wLAotICAgICAgICAgICAgLy8gYnV0IHRoYXQncyBva2F5LgotICAgICAgICAgICAgc2VuZFVwZGF0ZUludGVudExvY2tlZChwLCBuZXcgaW50W10geyBhcHBXaWRnZXRJZCB9KTsKLQotICAgICAgICAgICAgLy8gc2NoZWR1bGUgdGhlIGZ1dHVyZSB1cGRhdGVzCi0gICAgICAgICAgICByZWdpc3RlckZvckJyb2FkY2FzdHNMb2NrZWQocCwgZ2V0QXBwV2lkZ2V0SWRzKHApKTsKLSAgICAgICAgICAgIHNhdmVTdGF0ZUxvY2tlZCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYWNrdXBNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQmFja3VwTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0NTViNGMyLi4zYWExMjM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9CYWNrdXBNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0JhY2t1cE1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTM5LDYgKzM5LDggQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VEYXRhT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlRGVsZXRlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLklQYWNrYWdlSW5zdGFsbE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKQEAgLTQ2LDYgKzQ4LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwpAQCAtNzQsMTIgKzc3LDE2IEBACiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMTI3LDYgKzEzNCw3IEBACiAgICAgLy8gVGltZW91dCBpbnRlcnZhbHMgZm9yIGFnZW50IGJhY2t1cCAmIHJlc3RvcmUgb3BlcmF0aW9ucwogICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfQkFDS1VQX0lOVEVSVkFMID0gMzAgKiAxMDAwOwogICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfRlVMTF9CQUNLVVBfSU5URVJWQUwgPSA1ICogNjAgKiAxMDAwOworICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfU0hBUkVEX0JBQ0tVUF9JTlRFUlZBTCA9IDMwICogNjAgKiAxMDAwOwogICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfUkVTVE9SRV9JTlRFUlZBTCA9IDYwICogMTAwMDsKIAogICAgIC8vIFVzZXIgY29uZmlybWF0aW9uIHRpbWVvdXQgZm9yIGEgZnVsbCBiYWNrdXAvcmVzdG9yZSBvcGVyYXRpb24KQEAgLTM5OCw2ICs0MDYsMTMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBNU0dfUlVOX0ZVTExfUkVTVE9SRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGdWxsUmVzdG9yZVBhcmFtcyBwYXJhbXMgPSAoRnVsbFJlc3RvcmVQYXJhbXMpbXNnLm9iajsKKyAgICAgICAgICAgICAgICAobmV3IFBlcmZvcm1GdWxsUmVzdG9yZVRhc2socGFyYW1zLmZkLCBwYXJhbXMub2JzZXJ2ZXIsIHBhcmFtcy5sYXRjaCkpLnJ1bigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1TR19SVU5fQ0xFQVI6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ2xlYXJQYXJhbXMgcGFyYW1zID0gKENsZWFyUGFyYW1zKW1zZy5vYmo7CkBAIC0xMjM2LDcgKzEyNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiYXdhaXRpbmcgYWdlbnQgZm9yICIgKyBhcHApOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3M7IHdhaXQgZm9yIHRoZSBhZ2VudCB0byBhcnJpdmUKLSAgICAgICAgICAgICAgICAgICAgLy8gb25seSB3YWl0IDEwIHNlY29uZHMgZm9yIHRoZSBjbGVhciBkYXRhIHRvIGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IHdhaXQgMTAgc2Vjb25kcyBmb3IgdGhlIGJpbmQgdG8gaGFwcGVuCiAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dE1hcmsgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIFRJTUVPVVRfSU5URVJWQUw7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtQ29ubmVjdGluZyAmJiBtQ29ubmVjdGVkQWdlbnQgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IHRpbWVvdXRNYXJrKSkgewpAQCAtMTY3Nyw2ICsxNjkyLDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgZmluYWwgTGlzdDxQYWNrYWdlSW5mbz4gcGFja2FnZXNUb0JhY2t1cDsKIAorICAgICAgICAgICAgU2xvZy5pKFRBRywgIi0tLSBQZXJmb3JtaW5nIGZ1bGwtZGF0YXNldCBiYWNrdXAgLS0tIik7CiAgICAgICAgICAgICBzZW5kU3RhcnRCYWNrdXAoKTsKIAogICAgICAgICAgICAgLy8gZG9BbGxBcHBzIHN1cGVyc2VkZXMgdGhlIHBhY2thZ2Ugc2V0IGlmIGFueQpAQCAtMTY5NSw2NCArMTcxMSwzMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gTm93IGJhY2sgdXAgdGhlIGFwcCBkYXRhIHZpYSB0aGUgYWdlbnQgbWVjaGFuaXNtCisgICAgICAgICAgICAvLyBDdWxsIGFueSBwYWNrYWdlcyB0aGF0IGhhdmUgaW5kaWNhdGVkIHRoYXQgYmFja3VwcyBhcmUgbm90IHBlcm1pdHRlZC4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXNUb0JhY2t1cC5zaXplKCk7ICkgeworICAgICAgICAgICAgICAgIFBhY2thZ2VJbmZvIGluZm8gPSBwYWNrYWdlc1RvQmFja3VwLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKGluZm8uYXBwbGljYXRpb25JbmZvLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfQUxMT1dfQkFDS1VQKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzVG9CYWNrdXAucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBrZyA9IG51bGw7CiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIE5vdyBiYWNrIHVwIHRoZSBhcHAgZGF0YSB2aWEgdGhlIGFnZW50IG1lY2hhbmlzbQogICAgICAgICAgICAgICAgIGludCBOID0gcGFja2FnZXNUb0JhY2t1cC5zaXplKCk7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgcGtnID0gcGFja2FnZXNUb0JhY2t1cC5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGJhY2t1cE9uZVBhY2thZ2UocGtnKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkJpbmRpbmcgdG8gZnVsbCBiYWNrdXAgYWdlbnQgOiAiICsgcGtnLnBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICBJQmFja3VwQWdlbnQgYWdlbnQgPSBiaW5kVG9BZ2VudFN5bmNocm9ub3VzKHBrZy5hcHBsaWNhdGlvbkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkLkJBQ0tVUF9NT0RFX0ZVTEwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwID0gcGtnLmFwcGxpY2F0aW9uSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmRBcGsgPSBtSW5jbHVkZUFwa3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoYXBwLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfRk9SV0FSRF9MT0NLKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChhcHAuZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfVVBEQVRFRF9TWVNURU1fQVBQKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRPbkJhY2t1cFBhY2thZ2UocGtnLnBhY2thZ2VOYW1lKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja3VwRGF0YU91dHB1dCBvdXRwdXQgPSBuZXcgQmFja3VwRGF0YU91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RmlsZS5nZXRGaWxlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJXcml0aW5nIG1hbmlmZXN0IGZvciAiICsgcGtnLnBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBcHBNYW5pZmVzdChwa2csIG1NYW5pZmVzdEZpbGUsIHNlbmRBcGspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKHBrZy5wYWNrYWdlTmFtZSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZXNEaXIuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmlmZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkNhbGxpbmcgZG9CYWNrdXAoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0b2tlbiA9IGdlbmVyYXRlVG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlT3BlcmF0aW9uVGltZW91dCh0b2tlbiwgVElNRU9VVF9GVUxMX0JBQ0tVUF9JTlRFUlZBTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnQuZG9CYWNrdXAobnVsbCwgbU91dHB1dEZpbGUsIG51bGwsIHNlbmRBcGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgbUJhY2t1cE1hbmFnZXJCaW5kZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IHdhaXRVbnRpbE9wZXJhdGlvbkNvbXBsZXRlKHRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkZ1bGwgYmFja3VwIGZhaWxlZCBvbiBwYWNrYWdlICIgKyBwa2cucGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkZ1bGwgYmFja3VwIHN1Y2Nlc3M6ICIgKyBwa2cucGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgYmFja2luZyB1cCAiICsgcGtnLnBhY2thZ2VOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmFibGUgdG8gYmluZCB0byBmdWxsIGFnZW50IGZvciAiICsgcGtnLnBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bihwa2cpOworICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIHNoYXJlZCBzdG9yYWdlIGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgICAgIGlmIChtSW5jbHVkZVNoYXJlZCkgeworICAgICAgICAgICAgICAgICAgICBiYWNrdXBTaGFyZWRTdG9yYWdlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQXBwIGRpZWQgZHVyaW5nIGZ1bGwgYmFja3VwIik7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChwa2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0ZWFyRG93bihwa2cpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZWFyRG93bihwa2cpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGaWxlLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtMTc3MSw2ICsxNzU2LDc5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgYmFja3VwT25lUGFja2FnZShQYWNrYWdlSW5mbyBwa2cpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgU2xvZy5kKFRBRywgIkJpbmRpbmcgdG8gZnVsbCBiYWNrdXAgYWdlbnQgOiAiICsgcGtnLnBhY2thZ2VOYW1lKTsKKworICAgICAgICAgICAgSUJhY2t1cEFnZW50IGFnZW50ID0gYmluZFRvQWdlbnRTeW5jaHJvbm91cyhwa2cuYXBwbGljYXRpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICBJQXBwbGljYXRpb25UaHJlYWQuQkFDS1VQX01PREVfRlVMTCk7CisgICAgICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhcHAgPSBwa2cuYXBwbGljYXRpb25JbmZvOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbmRBcGsgPSBtSW5jbHVkZUFwa3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGFwcC5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0ZPUldBUkRfTE9DSykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGFwcC5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwLmZsYWdzICYgQXBwbGljYXRpb25JbmZvLkZMQUdfVVBEQVRFRF9TWVNURU1fQVBQKSAhPSAwKTsKKworICAgICAgICAgICAgICAgICAgICBzZW5kT25CYWNrdXBQYWNrYWdlKHBrZy5wYWNrYWdlTmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja3VwRGF0YU91dHB1dCBvdXRwdXQgPSBuZXcgQmFja3VwRGF0YU91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZpbGUuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIldyaXRpbmcgbWFuaWZlc3QgZm9yICIgKyBwa2cucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBcHBNYW5pZmVzdChwa2csIG1NYW5pZmVzdEZpbGUsIHNlbmRBcGspOworICAgICAgICAgICAgICAgICAgICAgICAgRnVsbEJhY2t1cC5iYWNrdXBUb1Rhcihwa2cucGFja2FnZU5hbWUsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hbmlmZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkNhbGxpbmcgZG9CYWNrdXAoKSIpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9rZW4gPSBnZW5lcmF0ZVRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVPcGVyYXRpb25UaW1lb3V0KHRva2VuLCBUSU1FT1VUX0ZVTExfQkFDS1VQX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgYWdlbnQuZG9CYWNrdXAobnVsbCwgbU91dHB1dEZpbGUsIG51bGwsIHNlbmRBcGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIG1CYWNrdXBNYW5hZ2VyQmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3YWl0VW50aWxPcGVyYXRpb25Db21wbGV0ZSh0b2tlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJGdWxsIGJhY2t1cCBmYWlsZWQgb24gcGFja2FnZSAiICsgcGtnLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkZ1bGwgYmFja3VwIHN1Y2Nlc3M6ICIgKyBwa2cucGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRXJyb3IgYmFja2luZyB1cCAiICsgcGtnLnBhY2thZ2VOYW1lLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJVbmFibGUgdG8gYmluZCB0byBmdWxsIGFnZW50IGZvciAiICsgcGtnLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlYXJEb3duKHBrZyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYmFja3VwU2hhcmVkU3RvcmFnZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgUGFja2FnZUluZm8gcGtnID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGtnID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VJbmZvKCJjb20uYW5kcm9pZC5zaGFyZWRzdG9yYWdlYmFja3VwIiwgMCk7CisgICAgICAgICAgICAgICAgSUJhY2t1cEFnZW50IGFnZW50ID0gYmluZFRvQWdlbnRTeW5jaHJvbm91cyhwa2cuYXBwbGljYXRpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkLkJBQ0tVUF9NT0RFX0ZVTEwpOworICAgICAgICAgICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbmRPbkJhY2t1cFBhY2thZ2UoIlNoYXJlZCBzdG9yYWdlIik7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRva2VuID0gZ2VuZXJhdGVUb2tlbigpOworICAgICAgICAgICAgICAgICAgICBwcmVwYXJlT3BlcmF0aW9uVGltZW91dCh0b2tlbiwgVElNRU9VVF9TSEFSRURfQkFDS1VQX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgYWdlbnQuZG9CYWNrdXAobnVsbCwgbU91dHB1dEZpbGUsIG51bGwsIGZhbHNlLCB0b2tlbiwgbUJhY2t1cE1hbmFnZXJCaW5kZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXdhaXRVbnRpbE9wZXJhdGlvbkNvbXBsZXRlKHRva2VuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZ1bGwgYmFja3VwIGZhaWxlZCBvbiBzaGFyZWQgc3RvcmFnZSIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiRnVsbCBzaGFyZWQgc3RvcmFnZSBiYWNrdXAgc3VjY2VzcyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkNvdWxkIG5vdCBiaW5kIHRvIHNoYXJlZCBzdG9yYWdlIGJhY2t1cCBhZ2VudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlNoYXJlZCBzdG9yYWdlIGJhY2t1cCBwYWNrYWdlIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0ZWFyRG93bihwa2cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQXBwTWFuaWZlc3QoUGFja2FnZUluZm8gcGtnLCBGaWxlIG1hbmlmZXN0RmlsZSwgYm9vbGVhbiB3aXRoQXBrKQogICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICAvLyBNYW5pZmVzdCBmb3JtYXQuIEFsbCBkYXRhIGFyZSBzdHJpbmdzIGVuZGluZyBpbiBMRjoKQEAgLTE3NzksNyArMTgzNyw5IEBACiAgICAgICAgICAgICAvLyBWZXJzaW9uIDE6CiAgICAgICAgICAgICAvLyAgICAgcGFja2FnZSBuYW1lCiAgICAgICAgICAgICAvLyAgICAgcGFja2FnZSdzIHZlcnNpb25Db2RlCi0gICAgICAgICAgICAvLyAgICAgYm9vbGVhbjogIjEiIGlmIGFyY2hpdmUgaW5jbHVkZXMgLmFwaywgIjAiIG90aGVyd2lzZQorICAgICAgICAgICAgLy8gICAgIHBsYXRmb3JtIHZlcnNpb25Db2RlCisgICAgICAgICAgICAvLyAgICAgZ2V0SW5zdGFsbGVyUGFja2FnZU5hbWUoKSBmb3IgdGhpcyBwYWNrYWdlIChtYXliZSBlbXB0eSkKKyAgICAgICAgICAgIC8vICAgICBib29sZWFuOiAiMSIgaWYgYXJjaGl2ZSBpbmNsdWRlcyAuYXBrOyBhbnkgb3RoZXIgc3RyaW5nIG1lYW5zIG5vdAogICAgICAgICAgICAgLy8gICAgIG51bWJlciBvZiBzaWduYXR1cmVzID09IE4KICAgICAgICAgICAgIC8vIE4qOiAgICBzaWduYXR1cmUgYnl0ZSBhcnJheSBpbiBhc2NpaSBmb3JtYXQgcGVyIFNpZ25hdHVyZS50b0NoYXJzU3RyaW5nKCkKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDQwOTYpOwpAQCAtMTc4OCw2ICsxODQ4LDExIEBACiAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oSW50ZWdlci50b1N0cmluZyhCQUNLVVBfTUFOSUZFU1RfVkVSU0lPTikpOwogICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKHBrZy5wYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oSW50ZWdlci50b1N0cmluZyhwa2cudmVyc2lvbkNvZGUpKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnRsbihJbnRlZ2VyLnRvU3RyaW5nKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCkpOworCisgICAgICAgICAgICBTdHJpbmcgaW5zdGFsbGVyTmFtZSA9IG1QYWNrYWdlTWFuYWdlci5nZXRJbnN0YWxsZXJQYWNrYWdlTmFtZShwa2cucGFja2FnZU5hbWUpOworICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKChpbnN0YWxsZXJOYW1lICE9IG51bGwpID8gaW5zdGFsbGVyTmFtZSA6ICIiKTsKKwogICAgICAgICAgICAgcHJpbnRlci5wcmludGxuKHdpdGhBcGsgPyAiMSIgOiAiMCIpOwogICAgICAgICAgICAgaWYgKHBrZy5zaWduYXR1cmVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBwcmludGVyLnByaW50bG4oIjAiKTsKQEAgLTE4MDQsMjMgKzE4NjksMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgdm9pZCB0ZWFyRG93bihQYWNrYWdlSW5mbyBwa2cpIHsKLSAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBhcHAgPSBwa2cuYXBwbGljYXRpb25JbmZvOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyB1bmJpbmQgYW5kIHRpZHkgdXAgZXZlbiBvbiB0aW1lb3V0IG9yIGZhaWx1cmUsIGp1c3QgaW4gY2FzZQotICAgICAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIudW5iaW5kQmFja3VwQWdlbnQoYXBwKTsKKyAgICAgICAgICAgIGlmIChwa2cgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBhcHAgPSBwa2cuYXBwbGljYXRpb25JbmZvOworICAgICAgICAgICAgICAgIGlmIChhcHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5iaW5kIGFuZCB0aWR5IHVwIGV2ZW4gb24gdGltZW91dCBvciBmYWlsdXJlLCBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIudW5iaW5kQmFja3VwQWdlbnQoYXBwKTsKIAotICAgICAgICAgICAgICAgIC8vIFRoZSBhZ2VudCB3YXMgcnVubmluZyB3aXRoIGEgc3R1YiBBcHBsaWNhdGlvbiBvYmplY3QsIHNvIHNodXQgaXQgZG93bi4KLSAgICAgICAgICAgICAgICAvLyAhISEgV2UgaGFyZGNvZGUgdGhlIGNvbmZpcm1hdGlvbiBVSSdzIHBhY2thZ2UgbmFtZSBoZXJlIHJhdGhlciB0aGFuIHVzZSBhCi0gICAgICAgICAgICAgICAgLy8gICAgIG1hbmlmZXN0IGZsYWchICBUT0RPIHNvbWV0aGluZyBsZXNzIGRpcmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoYXBwLnVpZCAhPSBQcm9jZXNzLlNZU1RFTV9VSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFwa2cucGFja2FnZU5hbWUuZXF1YWxzKCJjb20uYW5kcm9pZC5iYWNrdXBjb25maXJtIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiQmFja3VwIGNvbXBsZXRlLCBraWxsaW5nIGhvc3QgcHJvY2VzcyIpOwotICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyLmtpbGxBcHBsaWNhdGlvblByb2Nlc3MoYXBwLnByb2Nlc3NOYW1lLCBhcHAudWlkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJOb3Qga2lsbGluZyBhZnRlciByZXN0b3JlOiAiICsgYXBwLnByb2Nlc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhZ2VudCB3YXMgcnVubmluZyB3aXRoIGEgc3R1YiBBcHBsaWNhdGlvbiBvYmplY3QsIHNvIHNodXQgaXQgZG93bi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHAudWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkJhY2t1cCBjb21wbGV0ZSwga2lsbGluZyBob3N0IHByb2Nlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyLmtpbGxBcHBsaWNhdGlvblByb2Nlc3MoYXBwLnByb2Nlc3NOYW1lLCBhcHAudWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiTm90IGtpbGxpbmcgYWZ0ZXIgcmVzdG9yZTogIiArIGFwcC5wcm9jZXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTG9zdCBhcHAgdHJ5aW5nIHRvIHNodXQgZG93biIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiTG9zdCBhcHAgdHJ5aW5nIHRvIHNodXQgZG93biIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE4NjEsNiArMTkyNywxMDE5IEBACiAgICAgfQogCiAKKyAgICAvLyAtLS0tLSBGdWxsIHJlc3RvcmUgZnJvbSBhIGZpbGUvc29ja2V0IC0tLS0tCisKKyAgICAvLyBEZXNjcmlwdGlvbiBvZiBhIGZpbGUgaW4gdGhlIHJlc3RvcmUgZGF0YXN0cmVhbQorICAgIHN0YXRpYyBjbGFzcyBGaWxlTWV0YWRhdGEgeworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWU7ICAgICAgICAgICAgIC8vIG5hbWUgb2YgdGhlIG93bmluZyBhcHAKKyAgICAgICAgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lOyAgICAvLyBuYW1lIG9mIHRoZSBtYXJrZXQtdHlwZSBhcHAgdGhhdCBpbnN0YWxsZWQgdGhlIG93bmVyCisgICAgICAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBGdWxsQmFja3VwLlRZUEVfRElSRUNUT1JZCisgICAgICAgIFN0cmluZyBkb21haW47ICAgICAgICAgICAgICAgICAgLy8gZS5nLiBGdWxsQmFja3VwLkRBVEFCQVNFX1RSRUVfVE9LRU4KKyAgICAgICAgU3RyaW5nIHBhdGg7ICAgICAgICAgICAgICAgICAgICAvLyBzdWJwYXRoIHdpdGhpbiB0aGUgc2VtYW50aWMgZG9tYWluCisgICAgICAgIGxvbmcgbW9kZTsgICAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiAwNjY2IChhY3R1YWxseSBpbnQpCisgICAgICAgIGxvbmcgbXRpbWU7ICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBtb2QgdGltZSwgVVRDIHRpbWVfdCAoYWN0dWFsbHkgaW50KQorICAgICAgICBsb25nIHNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIG9mIGNvbnRlbnQKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCJGaWxlTWV0YWRhdGF7Iik7CisgICAgICAgICAgICBzYi5hcHBlbmQocGFja2FnZU5hbWUpOyBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0eXBlKTsgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBzYi5hcHBlbmQoZG9tYWluKTsgc2IuYXBwZW5kKCc6Jyk7IHNiLmFwcGVuZChwYXRoKTsgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICBzYi5hcHBlbmQoc2l6ZSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBSZXN0b3JlUG9saWN5IHsKKyAgICAgICAgSUdOT1JFLAorICAgICAgICBBQ0NFUFQsCisgICAgICAgIEFDQ0VQVF9JRl9BUEsKKyAgICB9CisKKyAgICBjbGFzcyBQZXJmb3JtRnVsbFJlc3RvcmVUYXNrIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBtSW5wdXRGaWxlOworICAgICAgICBJRnVsbEJhY2t1cFJlc3RvcmVPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgICAgIEF0b21pY0Jvb2xlYW4gbUxhdGNoT2JqZWN0OworICAgICAgICBJQmFja3VwQWdlbnQgbUFnZW50OworICAgICAgICBTdHJpbmcgbUFnZW50UGFja2FnZTsKKyAgICAgICAgQXBwbGljYXRpb25JbmZvIG1UYXJnZXRBcHA7CisgICAgICAgIFBhcmNlbEZpbGVEZXNjcmlwdG9yW10gbVBpcGVzID0gbnVsbDsKKworICAgICAgICBsb25nIG1CeXRlczsKKworICAgICAgICAvLyBwb3NzaWJsZSBoYW5kbGluZyBzdGF0ZXMgZm9yIGEgZ2l2ZW4gcGFja2FnZSBpbiB0aGUgcmVzdG9yZSBkYXRhc2V0CisgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBSZXN0b3JlUG9saWN5PiBtUGFja2FnZVBvbGljaWVzCisgICAgICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlc3RvcmVQb2xpY3k+KCk7CisKKyAgICAgICAgLy8gaW5zdGFsbGVyIHBhY2thZ2UgbmFtZXMgZm9yIGVhY2ggZW5jb3VudGVyZWQgYXBwLCBkZXJpdmVkIGZyb20gdGhlIG1hbmlmZXN0cworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtUGFja2FnZUluc3RhbGxlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICAvLyBTaWduYXR1cmVzIGZvciBhIGdpdmVuIHBhY2thZ2UgZm91bmQgaW4gaXRzIG1hbmlmZXN0IGZpbGUKKyAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFNpZ25hdHVyZVtdPiBtTWFuaWZlc3RTaWduYXR1cmVzCisgICAgICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNpZ25hdHVyZVtdPigpOworCisgICAgICAgIC8vIFBhY2thZ2VzIHdlJ3ZlIGFscmVhZHkgd2lwZWQgZGF0YSBvbiB3aGVuIHJlc3RvcmluZyB0aGVpciBmaXJzdCBmaWxlCisgICAgICAgIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBtQ2xlYXJlZFBhY2thZ2VzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgICAgIFBlcmZvcm1GdWxsUmVzdG9yZVRhc2soUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQsIElGdWxsQmFja3VwUmVzdG9yZU9ic2VydmVyIG9ic2VydmVyLAorICAgICAgICAgICAgICAgIEF0b21pY0Jvb2xlYW4gbGF0Y2gpIHsKKyAgICAgICAgICAgIG1JbnB1dEZpbGUgPSBmZDsKKyAgICAgICAgICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOworICAgICAgICAgICAgbUxhdGNoT2JqZWN0ID0gbGF0Y2g7CisgICAgICAgICAgICBtQWdlbnQgPSBudWxsOworICAgICAgICAgICAgbUFnZW50UGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICBtVGFyZ2V0QXBwID0gbnVsbDsKKworICAgICAgICAgICAgLy8gV2hpY2ggcGFja2FnZXMgd2UndmUgYWxyZWFkeSB3aXBlZCBkYXRhIG9uLiAgV2UgcHJlcG9wdWxhdGUgdGhpcworICAgICAgICAgICAgLy8gd2l0aCBhIHdoaXRlbGlzdCBvZiBwYWNrYWdlcyBrbm93biB0byBiZSB1bmNsZWFyYWJsZS4KKyAgICAgICAgICAgIG1DbGVhcmVkUGFja2FnZXMuYWRkKCJhbmRyb2lkIik7CisgICAgICAgICAgICBtQ2xlYXJlZFBhY2thZ2VzLmFkZCgiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzIik7CisKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFJlc3RvcmVGaWxlUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgICAgICBJQmFja3VwQWdlbnQgbUFnZW50OworICAgICAgICAgICAgRmlsZU1ldGFkYXRhIG1JbmZvOworICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgbVNvY2tldDsKKyAgICAgICAgICAgIGludCBtVG9rZW47CisKKyAgICAgICAgICAgIFJlc3RvcmVGaWxlUnVubmFibGUoSUJhY2t1cEFnZW50IGFnZW50LCBGaWxlTWV0YWRhdGEgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Igc29ja2V0LCBpbnQgdG9rZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgbUFnZW50ID0gYWdlbnQ7CisgICAgICAgICAgICAgICAgbUluZm8gPSBpbmZvOworICAgICAgICAgICAgICAgIG1Ub2tlbiA9IHRva2VuOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHN0cmljdGx5IGZvciBwcm9jZXNzLWxvY2FsIGJpbmRlciBpbnZvY2F0aW9ucy4gIFRoZQorICAgICAgICAgICAgICAgIC8vIHNlbWFudGljcyBvZiBQYXJjZWxGaWxlRGVzY3JpcHRvciBkaWZmZXIgaW4gdGhpcyBjYXNlOyBpbiBwYXJ0aWN1bGFyLCB3ZQorICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhdXRvbWF0aWNhbGx5IGdldCBhICdkdXAnZWQgZGVzY3JpcHRvciB0aGF0IHdlIGNhbiBjYW4gY29udGludWUKKyAgICAgICAgICAgICAgICAvLyB0byB1c2UgYXN5bmNocm9ub3VzbHkgZnJvbSB0aGUgY2FsbGVyLiAgU28sIHdlIG1ha2Ugc3VyZSB0byBkdXAgaXQgb3Vyc2VsdmVzCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHByb2NlZWRpbmcgdG8gZG8gdGhlIHJlc3RvcmUuCisgICAgICAgICAgICAgICAgbVNvY2tldCA9IFBhcmNlbEZpbGVEZXNjcmlwdG9yLmR1cChzb2NrZXQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1BZ2VudC5kb1Jlc3RvcmVGaWxlKG1Tb2NrZXQsIG1JbmZvLnNpemUsIG1JbmZvLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluZm8uZG9tYWluLCBtSW5mby5wYXRoLCBtSW5mby5tb2RlLCBtSW5mby5tdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW4sIG1CYWNrdXBNYW5hZ2VyQmluZGVyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciBoYXBwZW5zOyB0aGlzIGlzIHVzZWQgc3RyaWN0bHkgZm9yIGxvY2FsIGJpbmRlciBjYWxscworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAiLS0tIFBlcmZvcm1pbmcgZnVsbC1kYXRhc2V0IHJlc3RvcmUgLS0tIik7CisgICAgICAgICAgICBzZW5kU3RhcnRSZXN0b3JlKCk7CisKKyAgICAgICAgICAgIC8vIEFyZSB3ZSBhYmxlIHRvIHJlc3RvcmUgc2hhcmVkLXN0b3JhZ2UgZGF0YT8KKyAgICAgICAgICAgIGlmIChFbnZpcm9ubWVudC5nZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZSgpLmVxdWFscyhFbnZpcm9ubWVudC5NRURJQV9NT1VOVEVEKSkgeworICAgICAgICAgICAgICAgIG1QYWNrYWdlUG9saWNpZXMucHV0KCJjb20uYW5kcm9pZC5zaGFyZWRzdG9yYWdlYmFja3VwIiwgUmVzdG9yZVBvbGljeS5BQ0NFUFQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CeXRlcyA9IDA7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzMyICogMTAyNF07CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtSW5wdXRGaWxlLmdldEZpbGVEZXNjcmlwdG9yKCkpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBkaWRSZXN0b3JlOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgZGlkUmVzdG9yZSA9IHJlc3RvcmVPbmVGaWxlKGluc3RyZWFtLCBidWZmZXIpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGRpZFJlc3RvcmUpOworCisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLnYoVEFHLCAiRG9uZSBjb25zdW1pbmcgaW5wdXQgdGFyZmlsZSwgdG90YWwgYnl0ZXM9IiArIG1CeXRlcyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRlYXJEb3duUGlwZXMoKTsKKyAgICAgICAgICAgICAgICB0ZWFyRG93bkFnZW50KG1UYXJnZXRBcHApOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0RmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkNsb3NlIG9mIHJlc3RvcmUgZGF0YSBwaXBlIHRocmV3IiwgZSk7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoaXMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ3VycmVudE9wTG9jaykgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudE9wZXJhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTGF0Y2hPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoT2JqZWN0LnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhdGNoT2JqZWN0Lm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZW5kRW5kUmVzdG9yZSgpOworICAgICAgICAgICAgICAgIG1XYWtlbG9jay5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiRnVsbCByZXN0b3JlIHBhc3MgY29tcGxldGUuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlc3RvcmVPbmVGaWxlKElucHV0U3RyZWFtIGluc3RyZWFtLCBieXRlW10gYnVmZmVyKSB7CisgICAgICAgICAgICBGaWxlTWV0YWRhdGEgaW5mbzsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IHJlYWRUYXJIZWFkZXJzKGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZpbGVNZXRhZGF0YShpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwa2cgPSBpbmZvLnBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBrZy5lcXVhbHMobUFnZW50UGFja2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rYXksIGNoYW5nZSBpbiBwYWNrYWdlOyBzZXQgdXAgb3VyIHZhcmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvb2trZWVwaW5nIGlmIHdlIGhhdmVuJ3Qgc2VlbiBpdCB5ZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVBhY2thZ2VQb2xpY2llcy5jb250YWluc0tleShwa2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VQb2xpY2llcy5wdXQocGtnLCBSZXN0b3JlUG9saWN5LklHTk9SRSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBwcmV2aW91cyBhZ2VudCByZWxhdGlvbnNoaXAgaWYgbmVjZXNzYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxldCB0aGUgb2JzZXJ2ZXIga25vdyB3ZSdyZSBjb25zaWRlcmluZyBhIG5ldyBhcHAuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJTYXcgbmV3IHBhY2thZ2U7IHRlYXJpbmcgZG93biBvbGQgb25lIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd25QaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJEb3duQWdlbnQobVRhcmdldEFwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldEFwcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFnZW50UGFja2FnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5wYXRoLmVxdWFscyhCQUNLVVBfTUFOSUZFU1RfRklMRU5BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIHJlYWRBcHBNYW5pZmVzdChpbmZvLCBpbnN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VJbnN0YWxsZXJzLnB1dChwa2csIGluZm8uaW5zdGFsbGVyUGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgcmVhZCBvbmx5IHRoZSBtYW5pZmVzdCBjb250ZW50IGl0c2VsZiBhdCB0aGlzIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gY29uc3VtZSB0aGUgZm9vdGVyIGJlZm9yZSBsb29waW5nIGFyb3VuZCB0byB0aGUgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFRhclBhZGRpbmcoaW5mby5zaXplLCBpbnN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kT25SZXN0b3JlUGFja2FnZShwa2cpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uLW1hbmlmZXN0LCBzbyBpdCdzIGFjdHVhbCBmaWxlIGRhdGEuICBJcyB0aGlzIGEgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgaWdub3Jpbmc/CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG9rYXkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgUmVzdG9yZVBvbGljeSBwb2xpY3kgPSBtUGFja2FnZVBvbGljaWVzLmdldChwa2cpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElHTk9SRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNDRVBUX0lGX0FQSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaW4gYWNjZXB0LWlmLWFwayBzdGF0ZSwgdGhlbiB0aGUgZmlyc3QgZmlsZSB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgTVVTVCBiZSB0aGUgYXBrLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5kb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuQVBLX1RSRUVfVE9LRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJBUEsgZmlsZTsgaW5zdGFsbGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGluc3RhbGwgdGhlIGFwcC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnN0YWxsZXJOYW1lID0gbVBhY2thZ2VJbnN0YWxsZXJzLmdldChwa2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGluc3RhbGxBcGsoaW5mbywgaW5zdGFsbGVyTmFtZSwgaW5zdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ29vZCB0byBnbzsgcHJvbW90ZSB0byBBQ0NFUFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlUG9saWNpZXMucHV0KHBrZywgKG9rYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUmVzdG9yZVBvbGljeS5BQ0NFUFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSZXN0b3JlUG9saWN5LklHTk9SRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbnN1bWVkIHRoaXMgZmlsZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Vyc2VsdmVzLCBzbyBqdXN0IHN0cmlwIHRoZSB0YXIgZm9vdGVyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ28gb24gdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwVGFyUGFkZGluZyhpbmZvLnNpemUsIGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBkYXRhIGJlZm9yZSAob3Igd2l0aG91dCkgdGhlIGFway4gIFdlIGNhbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaXQgY29oZXJlbnRseSBpbiB0aGlzIGNhc2Ugc28gaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VQb2xpY2llcy5wdXQocGtnLCBSZXN0b3JlUG9saWN5LklHTk9SRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDQ0VQVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkFQS19UUkVFX1RPS0VOKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiYXBrIHByZXNlbnQgYnV0IEFDQ0VQVCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY2FuIHRha2UgdGhlIGRhdGEgd2l0aG91dCB0aGUgYXBrLCBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKndhbnQqIHRvIGRvIHNvLiAgc2tpcCB0aGUgYXBrIGJ5IGRlY2xhcmluZyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmUgZmlsZSBub3Qtb2theSB3aXRob3V0IGNoYW5naW5nIHRoZSByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2xpY3kgZm9yIHRoZSBwYWNrYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGhhcyBnb25lIGRyZWFkZnVsbHkgd3Jvbmcgd2hlbiBkZXRlcm1pbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdG9yZSBwb2xpY3kgZnJvbSB0aGUgbWFuaWZlc3QuICBJZ25vcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3Qgb2YgdGhpcyBwYWNrYWdlJ3MgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkludmFsaWQgcG9saWN5IGZyb20gbWFuaWZlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIFJlc3RvcmVQb2xpY3kuSUdOT1JFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwb2xpY3kgaXMgc2F0aXNmaWVkLCBnbyBhaGVhZCBhbmQgc2V0IHVwIHRvIHBpcGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHRvIHRoZSBhZ2VudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRyAmJiBva2F5ICYmIG1BZ2VudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlJldXNpbmcgZXhpc3RpbmcgYWdlbnQgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChva2F5ICYmIG1BZ2VudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiTmVlZCB0byBsYXVuY2ggYWdlbnQgZm9yICIgKyBwa2cpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldEFwcCA9IG1QYWNrYWdlTWFuYWdlci5nZXRBcHBsaWNhdGlvbkluZm8ocGtnLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHNlbnQgYW55IGRhdGEgdG8gdGhpcyBhcHAgeWV0LCB3ZSBwcm9iYWJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGNsZWFyIGl0IGZpcnN0LiAgQ2hlY2sgdGhhdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ2xlYXJlZFBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcHMgd2l0aCB0aGVpciBvd24gZnVsbCBiYWNrdXAgYWdlbnRzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2libGUgZm9yIGNvaGVyZW50bHkgbWFuYWdpbmcgYSBmdWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRBcHAuZnVsbEJhY2t1cEFnZW50TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiQ2xlYXJpbmcgYXBwIGRhdGEgcHJlcGFyYXRvcnkgdG8gZnVsbCByZXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBcHBsaWNhdGlvbkRhdGFTeW5jaHJvbm91cyhwa2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJmdWxsIGJhY2t1cCBhZ2VudCAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVGFyZ2V0QXBwLmZ1bGxCYWNrdXBBZ2VudE5hbWUgKyAiKSA9PiBubyBjbGVhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsZWFyZWRQYWNrYWdlcy5hZGQocGtnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIldlJ3ZlIGluaXRpYWxpemVkIHRoaXMgYXBwIGFscmVhZHk7IG5vIGNsZWFyIHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgc2V0OyBub3cgc2V0IHVwIHRoZSBJUEMgYW5kIGxhdW5jaCB0aGUgYWdlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBQaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWdlbnQgPSBiaW5kVG9BZ2VudFN5bmNocm9ub3VzKG1UYXJnZXRBcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFwcGxpY2F0aW9uVGhyZWFkLkJBQ0tVUF9NT0RFX1JFU1RPUkVfRlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudFBhY2thZ2UgPSBwa2c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ggdG8gZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUFnZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiVW5hYmxlIHRvIGNyZWF0ZSBhZ2VudCBmb3IgIiArIHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd25QaXBlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZVBvbGljaWVzLnB1dChwa2csIFJlc3RvcmVQb2xpY3kuSUdOT1JFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjazogbWFrZSBzdXJlIHdlIG5ldmVyIGdpdmUgZGF0YSB0byB0aGUgd3JvbmcgYXBwLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiBidXQgYSBsaXR0bGUgcGFyYW5vaWEgaGVyZSB3b24ndCBnbyBhbWlzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChva2F5ICYmICFwa2cuZXF1YWxzKG1BZ2VudFBhY2thZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlJlc3RvcmluZyBkYXRhIGZvciAiICsgcGtnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IGFnZW50IGlzIGZvciAiICsgbUFnZW50UGFja2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYW4gYWdlbnQgcmVhZHkgdG8gaGFuZGxlIHRoZSBmdWxsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGRhdGEgYXMgd2VsbCBhcyBhIHBpcGUgZm9yIHNlbmRpbmcgZGF0YSB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhZ2VudC4gIFRlbGwgdGhlIGFnZW50IHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpcGUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2theSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWdlbnRTdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRvQ29weSA9IGluZm8uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG9rZW4gPSBnZW5lcmF0ZVRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiSW52b2tpbmcgYWdlbnQgdG8gcmVzdG9yZSBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8ucGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVPcGVyYXRpb25UaW1lb3V0KHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVPVVRfRlVMTF9CQUNLVVBfSU5URVJWQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJlIHVwIHRoZSBhcHAncyBhZ2VudCBsaXN0ZW5pbmcgb24gdGhlIHNvY2tldC4gIElmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhZ2VudCBpcyBydW5uaW5nIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3ZSBjYW4ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBqdXN0IGludm9rZSBpdCBhc3luY2hyb25vdXNseSwgc28gd2UgcHJvdmlkZSBhIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRBcHAucHJvY2Vzc05hbWUuZXF1YWxzKCJzeXN0ZW0iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgInN5c3RlbSBwcm9jZXNzIGFnZW50IC0gc3Bpbm5pbmcgYSB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3RvcmVGaWxlUnVubmFibGUgcnVubmVyID0gbmV3IFJlc3RvcmVGaWxlUnVubmFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudCwgaW5mbywgbVBpcGVzWzBdLCB0b2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKHJ1bm5lcikuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudC5kb1Jlc3RvcmVGaWxlKG1QaXBlc1swXSwgaW5mby5zaXplLCBpbmZvLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZG9tYWluLCBpbmZvLnBhdGgsIGluZm8ubW9kZSwgaW5mby5tdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIG1CYWNrdXBNYW5hZ2VyQmluZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZHVwIHRoZSBzb2NrZXQgZm9yIGEgcHJvY2Vzcy1sb2NhbCByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJDb3VsZG4ndCBlc3RhYmxpc2ggcmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2VudFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdob29wcywgcmVtb3RlIGFnZW50IHdlbnQgYXdheS4gIFdlJ2xsIGVhdCB0aGUgY29udGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXJzZWx2ZXMsIHRoZW4sIGFuZCBub3QgY29weSBpdCBvdmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiQWdlbnQgY3Jhc2hlZCBkdXJpbmcgZnVsbCByZXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50U3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBvdmVyIHRoZSBkYXRhIGlmIHRoZSBhZ2VudCBpcyBzdGlsbCBnb29kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwaXBlT2theSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gcGlwZSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QaXBlc1sxXS5nZXRGaWxlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiUGlwaW5nIGRhdGEgdG8gYWdlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRvQ29weSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b1JlYWQgPSAodG9Db3B5ID4gYnVmZmVyLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYnVmZmVyLmxlbmd0aCA6IChpbnQpdG9Db3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gaW5zdHJlYW0ucmVhZChidWZmZXIsIDAsIHRvUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoblJlYWQgPj0gMCkgbUJ5dGVzICs9IG5SZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5SZWFkIDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Db3B5IC09IG5SZWFkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGl0IHRvIHRoZSBvdXRwdXQgcGlwZSBhcyBsb25nIGFzIHRoaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHN0aWxsIGdvb2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlT2theSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUud3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbGVkIHRvIHdyaXRlIHRvIHJlc3RvcmUgcGlwZSIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlT2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbmUgc2VuZGluZyB0aGF0IGZpbGUhICBOb3cgd2UganVzdCBuZWVkIHRvIGNvbnN1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRlbHRhIGZyb20gaW5mby5zaXplIHRvIHRoZSBlbmQgb2YgYmxvY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUYXJQYWRkaW5nKGluZm8uc2l6ZSwgaW5zdHJlYW0pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBub3cgdGhhdCB3ZSd2ZSBzZW50IGl0IGFsbCwgd2FpdCBmb3IgdGhlIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWRlIHRvIGFja25vd2xlZGdlIHJlY2VpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRTdWNjZXNzID0gd2FpdFVudGlsT3BlcmF0aW9uQ29tcGxldGUodG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9rYXksIGlmIHRoZSByZW1vdGUgZW5kIGZhaWxlZCBhdCBhbnkgcG9pbnQsIGRlYWwgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGJ5IGlnbm9yaW5nIHRoZSByZXN0IG9mIHRoZSByZXN0b3JlIG9uIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhZ2VudFN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhY2t1cEhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyRG93blBpcGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJEb3duQWdlbnQobVRhcmdldEFwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZ2VudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlUG9saWNpZXMucHV0KHBrZywgUmVzdG9yZVBvbGljeS5JR05PUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvYmxlbXMgc2V0dGluZyB1cCB0aGUgYWdlbnQgY29tbXVuaWNhdGlvbiwgb3IgYW4gYWxyZWFkeS0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQgcGFja2FnZTogc2tpcCB0byB0aGUgbmV4dCB0YXIgc3RyZWFtIGVudHJ5IGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIGFuZCBkaXNjYXJkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2theSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIltkaXNjYXJkaW5nIGZpbGUgY29udGVudF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJ5dGVzVG9Db25zdW1lID0gKGluZm8uc2l6ZSArIDUxMSkgJiB+NTExOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChieXRlc1RvQ29uc3VtZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvUmVhZCA9IChieXRlc1RvQ29uc3VtZSA+IGJ1ZmZlci5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYnVmZmVyLmxlbmd0aCA6IChpbnQpYnl0ZXNUb0NvbnN1bWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgblJlYWQgPSBpbnN0cmVhbS5yZWFkKGJ1ZmZlciwgMCwgdG9SZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5SZWFkID49IDApIG1CeXRlcyArPSBuUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5SZWFkIDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1RvQ29uc3VtZSAtPSBuUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgImlvIGV4Y2VwdGlvbiBvbiByZXN0b3JlIHNvY2tldCByZWFkIiwgZSk7CisgICAgICAgICAgICAgICAgLy8gdHJlYXQgYXMgRU9GCisgICAgICAgICAgICAgICAgaW5mbyA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoaW5mbyAhPSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0VXBQaXBlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBtUGlwZXMgPSBQYXJjZWxGaWxlRGVzY3JpcHRvci5jcmVhdGVQaXBlKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRlYXJEb3duUGlwZXMoKSB7CisgICAgICAgICAgICBpZiAobVBpcGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtUGlwZXNbMF0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVBpcGVzWzBdID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbVBpcGVzWzFdLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIG1QaXBlc1sxXSA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgY2xvc2UgYWdlbnQgcGlwZXMiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVBpcGVzID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdGVhckRvd25BZ2VudChBcHBsaWNhdGlvbkluZm8gYXBwKSB7CisgICAgICAgICAgICBpZiAobUFnZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyB1bmJpbmQgYW5kIHRpZHkgdXAgZXZlbiBvbiB0aW1lb3V0IG9yIGZhaWx1cmUsIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyLnVuYmluZEJhY2t1cEFnZW50KGFwcCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGFnZW50IHdhcyBydW5uaW5nIHdpdGggYSBzdHViIEFwcGxpY2F0aW9uIG9iamVjdCwgc28gc2h1dCBpdCBkb3duLgorICAgICAgICAgICAgICAgICAgICAvLyAhISEgV2UgaGFyZGNvZGUgdGhlIGNvbmZpcm1hdGlvbiBVSSdzIHBhY2thZ2UgbmFtZSBoZXJlIHJhdGhlciB0aGFuIHVzZSBhCisgICAgICAgICAgICAgICAgICAgIC8vICAgICBtYW5pZmVzdCBmbGFnISAgVE9ETyBzb21ldGhpbmcgbGVzcyBkaXJlY3QuCisgICAgICAgICAgICAgICAgICAgIGlmIChhcHAudWlkICE9IFByb2Nlc3MuU1lTVEVNX1VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFhcHAucGFja2FnZU5hbWUuZXF1YWxzKCJjb20uYW5kcm9pZC5iYWNrdXBjb25maXJtIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIktpbGxpbmcgaG9zdCBwcm9jZXNzIik7CisgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlNYW5hZ2VyLmtpbGxBcHBsaWNhdGlvblByb2Nlc3MoYXBwLnByb2Nlc3NOYW1lLCBhcHAudWlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIk5vdCBraWxsaW5nIGFmdGVyIGZ1bGwgcmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIkxvc3QgYXBwIHRyeWluZyB0byBzaHV0IGRvd24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUFnZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFJlc3RvcmVJbnN0YWxsT2JzZXJ2ZXIgZXh0ZW5kcyBJUGFja2FnZUluc3RhbGxPYnNlcnZlci5TdHViIHsKKyAgICAgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gbURvbmUgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICAgICAgU3RyaW5nIG1QYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIGludCBtUmVzdWx0OworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIG1Eb25lLnNldChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yQ29tcGxldGlvbigpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtRG9uZS5nZXQoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRG9uZS53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGdldFJlc3VsdCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWNrYWdlSW5zdGFsbGVkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHJldHVybkNvZGUpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobURvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlc3VsdCA9IHJldHVybkNvZGU7CisgICAgICAgICAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOworICAgICAgICAgICAgICAgICAgICBtRG9uZS5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1Eb25lLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIFJlc3RvcmVEZWxldGVPYnNlcnZlciBleHRlbmRzIElQYWNrYWdlRGVsZXRlT2JzZXJ2ZXIuU3R1YiB7CisgICAgICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIG1Eb25lID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKyAgICAgICAgICAgIGludCBtUmVzdWx0OworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIG1Eb25lLnNldChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yQ29tcGxldGlvbigpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChtRG9uZS5nZXQoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRG9uZS53YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWNrYWdlRGVsZXRlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCByZXR1cm5Db2RlKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Eb25lKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZXN1bHQgPSByZXR1cm5Db2RlOworICAgICAgICAgICAgICAgICAgICBtRG9uZS5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIG1Eb25lLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc3RvcmVJbnN0YWxsT2JzZXJ2ZXIgbUluc3RhbGxPYnNlcnZlciA9IG5ldyBSZXN0b3JlSW5zdGFsbE9ic2VydmVyKCk7CisgICAgICAgIGZpbmFsIFJlc3RvcmVEZWxldGVPYnNlcnZlciBtRGVsZXRlT2JzZXJ2ZXIgPSBuZXcgUmVzdG9yZURlbGV0ZU9ic2VydmVyKCk7CisKKyAgICAgICAgYm9vbGVhbiBpbnN0YWxsQXBrKEZpbGVNZXRhZGF0YSBpbmZvLCBTdHJpbmcgaW5zdGFsbGVyUGFja2FnZSwgSW5wdXRTdHJlYW0gaW5zdHJlYW0pIHsKKyAgICAgICAgICAgIGJvb2xlYW4gb2theSA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkluc3RhbGxpbmcgZnJvbSBiYWNrdXA6ICIgKyBpbmZvLnBhY2thZ2VOYW1lKTsKKworICAgICAgICAgICAgLy8gVGhlIGZpbGUgY29udGVudCBpcyBhbiAuYXBrIGZpbGUuICBDb3B5IGl0IG91dCB0byBhIHN0YWdpbmcgbG9jYXRpb24gYW5kCisgICAgICAgICAgICAvLyBhdHRlbXB0IHRvIGluc3RhbGwgaXQuCisgICAgICAgICAgICBGaWxlIGFwa0ZpbGUgPSBuZXcgRmlsZShtRGF0YURpciwgaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gYXBrU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYXBrRmlsZSk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzMyICogMTAyNF07CisgICAgICAgICAgICAgICAgbG9uZyBzaXplID0gaW5mby5zaXplOworICAgICAgICAgICAgICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBsb25nIHRvUmVhZCA9IChidWZmZXIubGVuZ3RoIDwgc2l6ZSkgPyBidWZmZXIubGVuZ3RoIDogc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZFJlYWQgPSBpbnN0cmVhbS5yZWFkKGJ1ZmZlciwgMCwgKGludCl0b1JlYWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlkUmVhZCA+PSAwKSBtQnl0ZXMgKz0gZGlkUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgYXBrU3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgZGlkUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gZGlkUmVhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXBrU3RyZWFtLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGluc3RhbGxlciBjYW4gcmVhZCBpdAorICAgICAgICAgICAgICAgIGFwa0ZpbGUuc2V0UmVhZGFibGUodHJ1ZSwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgLy8gTm93IGluc3RhbGwgaXQKKyAgICAgICAgICAgICAgICBVcmkgcGFja2FnZVVyaSA9IFVyaS5mcm9tRmlsZShhcGtGaWxlKTsKKyAgICAgICAgICAgICAgICBtSW5zdGFsbE9ic2VydmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyLmluc3RhbGxQYWNrYWdlKHBhY2thZ2VVcmksIG1JbnN0YWxsT2JzZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5JTlNUQUxMX1JFUExBQ0VfRVhJU1RJTkcsIGluc3RhbGxlclBhY2thZ2UpOworICAgICAgICAgICAgICAgIG1JbnN0YWxsT2JzZXJ2ZXIud2FpdEZvckNvbXBsZXRpb24oKTsKKworICAgICAgICAgICAgICAgIGlmIChtSW5zdGFsbE9ic2VydmVyLmdldFJlc3VsdCgpICE9IFBhY2thZ2VNYW5hZ2VyLklOU1RBTExfU1VDQ0VFREVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvbmx5IHRpbWUgd2UgY29udGludWUgdG8gYWNjZXB0IGluc3RhbGwgb2YgZGF0YSBldmVuIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBhcGsgaW5zdGFsbCBmYWlsZWQgaXMgaWYgd2UgaGFkIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IHdlIGNvdWxkCisgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdCB0aGUgZGF0YSByZWdhcmRsZXNzLgorICAgICAgICAgICAgICAgICAgICBpZiAobVBhY2thZ2VQb2xpY2llcy5nZXQoaW5mby5wYWNrYWdlTmFtZSkgIT0gUmVzdG9yZVBvbGljeS5BQ0NFUFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9rYXksIHRoZSBpbnN0YWxsIHN1Y2NlZWRlZC4gIE1ha2Ugc3VyZSBpdCB3YXMgdGhlIHJpZ2h0IGFwcC4KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bmluc3RhbGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSW5zdGFsbE9ic2VydmVyLm1QYWNrYWdlTmFtZS5lcXVhbHMoaW5mby5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJSZXN0b3JlIHN0cmVhbSBjbGFpbWVkIHRvIGluY2x1ZGUgYXBrIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby5wYWNrYWdlTmFtZSArICIgYnV0IGFwayB3YXMgcmVhbGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFsbE9ic2VydmVyLm1QYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgdGhlIHBhY2thZ2Ugd2UganVzdCBwdXQgaW4gcGxhY2U7IGl0IG1pZ2h0IGJlIGZyYXVkdWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rYXkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaW5zdGFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VJbmZvIHBrZyA9IG1QYWNrYWdlTWFuYWdlci5nZXRQYWNrYWdlSW5mbyhpbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX1NJR05BVFVSRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGtnLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0FMTE9XX0JBQ0tVUCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiUmVzdG9yZSBzdHJlYW0gY29udGFpbnMgYXBrIG9mIHBhY2thZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby5wYWNrYWdlTmFtZSArICIgYnV0IGl0IGRpc2FsbG93cyBiYWNrdXAvcmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gZmFyIHNvIGdvb2QgLS0gZG8gdGhlIHNpZ25hdHVyZXMgbWF0Y2ggdGhlIG1hbmlmZXN0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduYXR1cmVbXSBzaWdzID0gbU1hbmlmZXN0U2lnbmF0dXJlcy5nZXQoaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2lnbmF0dXJlc01hdGNoKHNpZ3MsIHBrZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJJbnN0YWxsZWQgYXBwICIgKyBpbmZvLnBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaWduYXR1cmVzIGRvIG5vdCBtYXRjaCByZXN0b3JlIG1hbmlmZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmluc3RhbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSW5zdGFsbCBvZiBwYWNrYWdlICIgKyBpbmZvLnBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3VjY2VlZGVkIGJ1dCBub3cgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2theSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IG9rYXkgYXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byBkZWxldGUgdGhlIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBqdXN0IGluc3RhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHVuaW5zdGFsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZU9ic2VydmVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZU1hbmFnZXIuZGVsZXRlUGFja2FnZShtSW5zdGFsbE9ic2VydmVyLm1QYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlbGV0ZU9ic2VydmVyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWxldGVPYnNlcnZlci53YWl0Rm9yQ29tcGxldGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gdHJhbnNjcmliZSByZXN0b3JlZCBhcGsgZm9yIGluc3RhbGwiKTsKKyAgICAgICAgICAgICAgICBva2F5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGFwa0ZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBva2F5OworICAgICAgICB9CisKKyAgICAgICAgLy8gR2l2ZW4gYW4gYWN0dWFsIGZpbGUgY29udGVudCBzaXplLCBjb25zdW1lIHRoZSBwb3N0LWNvbnRlbnQgcGFkZGluZyBtYW5kYXRlZAorICAgICAgICAvLyBieSB0aGUgdGFyIGZvcm1hdC4KKyAgICAgICAgdm9pZCBza2lwVGFyUGFkZGluZyhsb25nIHNpemUsIElucHV0U3RyZWFtIGluc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbG9uZyBwYXJ0aWFsID0gKHNpemUgKyA1MTIpICUgNTEyOworICAgICAgICAgICAgaWYgKHBhcnRpYWwgPiAwKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzUxMl07CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gaW5zdHJlYW0ucmVhZChidWZmZXIsIDAsIDUxMiAtIChpbnQpcGFydGlhbCk7CisgICAgICAgICAgICAgICAgaWYgKG5SZWFkID49IDApIG1CeXRlcyArPSBuUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybnMgYSBwb2xpY3kgY29uc3RhbnQ7IHRha2VzIGEgYnVmZmVyIGFyZyB0byByZWR1Y2UgbWVtb3J5IGNodXJuCisgICAgICAgIFJlc3RvcmVQb2xpY3kgcmVhZEFwcE1hbmlmZXN0KEZpbGVNZXRhZGF0YSBpbmZvLCBJbnB1dFN0cmVhbSBpbnN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gRmFpbCBvbiBzdXNwaWNpb3VzbHkgbGFyZ2UgbWFuaWZlc3QgZmlsZXMKKyAgICAgICAgICAgIGlmIChpbmZvLnNpemUgPiA2NCAqIDEwMjQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlJlc3RvcmUgbWFuaWZlc3QgdG9vIGJpZzsgY29ycnVwdD8gc2l6ZT0iICsgaW5mby5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsoaW50KSBpbmZvLnNpemVdOworICAgICAgICAgICAgaW50IG5SZWFkID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChuUmVhZCA8IGluZm8uc2l6ZSkgeworICAgICAgICAgICAgICAgIG5SZWFkICs9IGluc3RyZWFtLnJlYWQoYnVmZmVyLCBuUmVhZCwgKGludClpbmZvLnNpemUgLSBuUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoblJlYWQgPj0gMCkgbUJ5dGVzICs9IG5SZWFkOworCisgICAgICAgICAgICBSZXN0b3JlUG9saWN5IHBvbGljeSA9IFJlc3RvcmVQb2xpY3kuSUdOT1JFOworICAgICAgICAgICAgU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IGV4dHJhY3RMaW5lKGJ1ZmZlciwgb2Zmc2V0LCBzdHIpOworICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzdHJbMF0pOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IEJBQ0tVUF9NQU5JRkVTVF9WRVJTSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGV4dHJhY3RMaW5lKGJ1ZmZlciwgb2Zmc2V0LCBzdHIpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWFuaWZlc3RQYWNrYWdlID0gc3RyWzBdOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgPG9yaWdpbmFsLXBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdFBhY2thZ2UuZXF1YWxzKGluZm8ucGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBleHRyYWN0TGluZShidWZmZXIsIG9mZnNldCwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBJbnRlZ2VyLnBhcnNlSW50KHN0clswXSk7ICAvLyBhcHAgdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0cmFjdExpbmUoYnVmZmVyLCBvZmZzZXQsIHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhdGZvcm1WZXJzaW9uID0gSW50ZWdlci5wYXJzZUludChzdHJbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0cmFjdExpbmUoYnVmZmVyLCBvZmZzZXQsIHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmluc3RhbGxlclBhY2thZ2VOYW1lID0gKHN0clswXS5sZW5ndGgoKSA+IDApID8gc3RyWzBdIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGV4dHJhY3RMaW5lKGJ1ZmZlciwgb2Zmc2V0LCBzdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNBcGsgPSBzdHJbMF0uZXF1YWxzKCIxIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBleHRyYWN0TGluZShidWZmZXIsIG9mZnNldCwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1TaWdzID0gSW50ZWdlci5wYXJzZUludChzdHJbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVNpZ3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlW10gc2lncyA9IG5ldyBTaWduYXR1cmVbbnVtU2lnc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaWdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZXh0cmFjdExpbmUoYnVmZmVyLCBvZmZzZXQsIHN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ3NbaV0gPSBuZXcgU2lnbmF0dXJlKHN0clswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYW5pZmVzdFNpZ25hdHVyZXMucHV0KGluZm8ucGFja2FnZU5hbWUsIHNpZ3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2theSwgZ290IHRoZSBtYW5pZmVzdCBpbmZvIHdlIG5lZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlSW5mbyBwa2dJbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucGFja2FnZU5hbWUsIFBhY2thZ2VNYW5hZ2VyLkdFVF9TSUdOQVRVUkVTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIElHTk9SRSBpZiB0aGUgYXBwIGV4cGxpY2l0bHkgZGlzYWxsb3dzIGJhY2t1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBwa2dJbmZvLmFwcGxpY2F0aW9uSW5mby5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0FMTE9XX0JBQ0tVUCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZXMgYWdhaW5zdCBhbnkgaW5zdGFsbGVkIHZlcnNpb247IGlmIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IG1hdGNoLCB0aGVuIHdlIGZhbGwgdGhvdWdoIGFuZCBpZ25vcmUgdGhlIGRhdGEuICBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hdHVyZU1hdGNoKCkgbWV0aG9kIGV4cGxpY2l0bHkgaWdub3JlcyB0aGUgc2lnbmF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgcGFja2FnZXMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIHBhY2thZ2VzIGFyZSBzaWduZWQgd2l0aCB0aGUgcGxhdGZvcm0gY2VydCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIGRldmVsb3BlcidzIGNlcnQsIHNvIHRoZXkncmUgZGlmZmVyZW50IG9uIGV2ZXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlc01hdGNoKHNpZ3MsIHBrZ0luZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrZ0luZm8udmVyc2lvbkNvZGUgPj0gdmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiU2lnICsgdmVyc2lvbiBtYXRjaDsgdGFraW5nIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gUmVzdG9yZVBvbGljeS5BQ0NFUFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRhdGEgaXMgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgdGhlIGFwcCB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHByZXNlbnRseSBpbnN0YWxsZWQuICBUaGF0IG1lYW5zIHdlIGNhbiBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBpdCBpZiB0aGUgbWF0Y2hpbmcgYXBrIGlzIGFsc28gc3VwcGxpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJEYXRhIHZlcnNpb24gIiArIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbmV3ZXIgdGhhbiBpbnN0YWxsZWQgdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwa2dJbmZvLnZlcnNpb25Db2RlICsgIiAtIHJlcXVpcmluZyBhcGsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gUmVzdG9yZVBvbGljeS5BQ0NFUFRfSUZfQVBLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlJlc3RvcmUgbWFuaWZlc3Qgc2lnbmF0dXJlcyBkbyBub3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW5zdGFsbGVkIGFwcGxpY2F0aW9uIGZvciAiICsgaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuaShUQUcsICJSZXN0b3JlIG1hbmlmZXN0IGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8ucGFja2FnZU5hbWUgKyAiIGJ1dCBhbGxvd0JhY2t1cD1mYWxzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2theSwgdGhlIHRhcmdldCBhcHAgaXNuJ3QgaW5zdGFsbGVkLiAgV2UgY2FuIHByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3RvcmUgcHJvcGVybHkgb25seSBpZiB0aGUgZGF0YXNldCBwcm92aWRlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBrIGZpbGUgYW5kIHdlIGNhbiBzdWNjZXNzZnVsbHkgaW5zdGFsbCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmkoVEFHLCAiUGFja2FnZSAiICsgaW5mby5wYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBub3QgaW5zdGFsbGVkOyByZXF1aXJpbmcgYXBrIGluIGRhdGFzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5ID0gUmVzdG9yZVBvbGljeS5BQ0NFUFRfSUZfQVBLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3kgPT0gUmVzdG9yZVBvbGljeS5BQ0NFUFRfSUZfQVBLICYmICFoYXNBcGspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIkNhbm5vdCByZXN0b3JlIHBhY2thZ2UgIiArIGluZm8ucGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aG91dCB0aGUgbWF0Y2hpbmcgLmFwayIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk1pc3Npbmcgc2lnbmF0dXJlIG9uIGJhY2tlZC11cCBwYWNrYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby5wYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRXhwZWN0ZWQgcGFja2FnZSAiICsgaW5mby5wYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnV0IHJlc3RvcmUgbWFuaWZlc3QgY2xhaW1zICIgKyBtYW5pZmVzdFBhY2thZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlVua25vd24gcmVzdG9yZSBtYW5pZmVzdCB2ZXJzaW9uICIgKyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBwYWNrYWdlICIgKyBpbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJDb3JydXB0IHJlc3RvcmUgbWFuaWZlc3QgZm9yIHBhY2thZ2UgIiArIGluZm8ucGFja2FnZU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcG9saWN5OworICAgICAgICB9CisKKyAgICAgICAgLy8gQnVpbGRzIGEgbGluZSBmcm9tIGEgYnl0ZSBidWZmZXIgc3RhcnRpbmcgYXQgJ29mZnNldCcsIGFuZCByZXR1cm5zCisgICAgICAgIC8vIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB1bmNvbnN1bWVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgaW50IGV4dHJhY3RMaW5lKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIFN0cmluZ1tdIG91dFN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBlbmQgPSBidWZmZXIubGVuZ3RoOworICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBlbmQpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW5jb21wbGV0ZSBkYXRhIik7CisKKyAgICAgICAgICAgIGludCBwb3M7CisgICAgICAgICAgICBmb3IgKHBvcyA9IG9mZnNldDsgcG9zIDwgZW5kOyBwb3MrKykgeworICAgICAgICAgICAgICAgIGJ5dGUgYyA9IGJ1ZmZlcltwb3NdOworICAgICAgICAgICAgICAgIC8vIGF0IExGIHdlIGRlY2xhcmUgZW5kIG9mIGxpbmUsIGFuZCByZXR1cm4gdGhlIG5leHQgY2hhciBhcyB0aGUKKyAgICAgICAgICAgICAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgdGhlIG5leHQgdGltZSB0aHJvdWdoCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRTdHJbMF0gPSBuZXcgU3RyaW5nKGJ1ZmZlciwgb2Zmc2V0LCBwb3MgLSBvZmZzZXQpOworICAgICAgICAgICAgcG9zKys7ICAvLyBtYXkgYmUgcG9pbnRpbmcgYW4gZXh0cmEgYnl0ZSBwYXN0IHRoZSBlbmQgYnV0IHRoYXQncyBva2F5CisgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wRmlsZU1ldGFkYXRhKEZpbGVNZXRhZGF0YSBpbmZvKSB7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworCisgICAgICAgICAgICAgICAgLy8gbW9kZSBzdHJpbmcKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoaW5mby50eXBlID09IEZ1bGxCYWNrdXAuVFlQRV9ESVJFQ1RPUlkpID8gJ2QnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDA0MDApICE9IDApID8gJ3InIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAyMDApICE9IDApID8gJ3cnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAxMDApICE9IDApID8gJ3gnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwNDApICE9IDApID8gJ3InIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMjApICE9IDApID8gJ3cnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMTApICE9IDApID8gJ3gnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMDQpICE9IDApID8gJ3InIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMDIpICE9IDApID8gJ3cnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgoKGluZm8ubW9kZSAmIDAwMDEpICE9IDApID8gJ3gnIDogJy0nKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIgJTlkICIsIGluZm8uc2l6ZSkpOworCisgICAgICAgICAgICAgICAgRGF0ZSBzdGFtcCA9IG5ldyBEYXRlKGluZm8ubXRpbWUpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTU0gZGQga2s6bW06c3MgIikuZm9ybWF0KHN0YW1wKSk7CisKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChpbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIDo6ICIpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKGluZm8uZG9tYWluKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIDo6ICIpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKGluZm8ucGF0aCk7CisKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCBiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENvbnN1bWUgYSB0YXIgZmlsZSBoZWFkZXIgYmxvY2sgW3NlcXVlbmNlXSBhbmQgYWNjdW11bGF0ZSB0aGUgcmVsZXZhbnQgbWV0YWRhdGEKKyAgICAgICAgRmlsZU1ldGFkYXRhIHJlYWRUYXJIZWFkZXJzKElucHV0U3RyZWFtIGluc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYnl0ZVtdIGJsb2NrID0gbmV3IGJ5dGVbNTEyXTsKKyAgICAgICAgICAgIEZpbGVNZXRhZGF0YSBpbmZvID0gbnVsbDsKKworICAgICAgICAgICAgYm9vbGVhbiBnb3RIZWFkZXIgPSByZWFkVGFySGVhZGVyKGluc3RyZWFtLCBibG9jayk7CisgICAgICAgICAgICBpZiAoZ290SGVhZGVyKSB7CisgICAgICAgICAgICAgICAgLy8gb2theSwgcHJlc3VtZSB3ZSdyZSBva2F5LCBhbmQgZXh0cmFjdCB0aGUgdmFyaW91cyBtZXRhZGF0YQorICAgICAgICAgICAgICAgIGluZm8gPSBuZXcgRmlsZU1ldGFkYXRhKCk7CisgICAgICAgICAgICAgICAgaW5mby5zaXplID0gZXh0cmFjdFJhZGl4KGJsb2NrLCAxMjQsIDEyLCA4KTsKKyAgICAgICAgICAgICAgICBpbmZvLm10aW1lID0gZXh0cmFjdFJhZGl4KGJsb2NrLCAxMzYsIDEyLCA4KTsKKyAgICAgICAgICAgICAgICBpbmZvLm1vZGUgPSBleHRyYWN0UmFkaXgoYmxvY2ssIDEwMCwgOCwgOCk7CisKKyAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSBleHRyYWN0U3RyaW5nKGJsb2NrLCAzNDUsIDE1NSk7IC8vIHByZWZpeAorICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZXh0cmFjdFN0cmluZyhibG9jaywgMCwgMTAwKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8ucGF0aC5sZW5ndGgoKSA+IDApIGluZm8ucGF0aCArPSAnLyc7CisgICAgICAgICAgICAgICAgICAgIGluZm8ucGF0aCArPSBwYXRoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHRhciBsaW5rIGluZGljYXRvciBmaWVsZDogMSBieXRlIGF0IG9mZnNldCAxNTYgaW4gdGhlIGhlYWRlci4KKyAgICAgICAgICAgICAgICBpbnQgdHlwZUNoYXIgPSBibG9ja1sxNTZdOworICAgICAgICAgICAgICAgIGlmICh0eXBlQ2hhciA9PSAneCcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGF4IGV4dGVuZGVkIGhlYWRlciwgc28gd2UgbmVlZCB0byByZWFkIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgZ290SGVhZGVyID0gcmVhZFBheEV4dGVuZGVkSGVhZGVyKGluc3RyZWFtLCBpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFmdGVyIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBjb21lcyBhbm90aGVyIHJlYWwgaGVhZGVyIC0tIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdG8gZmluZCB0aGUgcmVhbCBmaWxlIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdEhlYWRlciA9IHJlYWRUYXJIZWFkZXIoaW5zdHJlYW0sIGJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIWdvdEhlYWRlcikgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCYWQgb3IgbWlzc2luZyBwYXggaGVhZGVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHlwZUNoYXIgPSBibG9ja1sxNTZdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZUNoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnMCc6IGluZm8udHlwZSA9IEZ1bGxCYWNrdXAuVFlQRV9GSUxFOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udHlwZSA9IEZ1bGxCYWNrdXAuVFlQRV9ESVJFQ1RPUlk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5zaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRGlyZWN0b3J5IGVudHJ5IHdpdGggbm9uemVybyBzaXplIGluIGhlYWRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXN1bWUgRU9GCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cudyhUQUcsICJTYXcgdHlwZT0wIGluIHRhciBoZWFkZXIgYmxvY2ssIGluZm89IiArIGluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlVua25vd24gdGFyIGVudGl0eSB0eXBlOiAiICsgdHlwZUNoYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmtub3duIGVudGl0eSB0eXBlICIgKyB0eXBlQ2hhcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBQYXJzZSBvdXQgdGhlIHBhdGgKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGZpcnN0OiBhcHBzL3NoYXJlZC91bnJlY29nbml6ZWQKKyAgICAgICAgICAgICAgICBpZiAoRnVsbEJhY2t1cC5TSEFSRURfUFJFRklYLnJlZ2lvbk1hdGNoZXMoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucGF0aCwgMCwgRnVsbEJhY2t1cC5TSEFSRURfUFJFRklYLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIGluIHNoYXJlZCBzdG9yYWdlLiAgISEhIFRPRE86IGltcGxlbWVudCB0aGlzLgorICAgICAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSBpbmZvLnBhdGguc3Vic3RyaW5nKEZ1bGxCYWNrdXAuU0hBUkVEX1BSRUZJWC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8ucGFja2FnZU5hbWUgPSAiY29tLmFuZHJvaWQuc2hhcmVkc3RvcmFnZWJhY2t1cCI7CisgICAgICAgICAgICAgICAgICAgIGluZm8uZG9tYWluID0gRnVsbEJhY2t1cC5TSEFSRURfU1RPUkFHRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmkoVEFHLCAiRmlsZSBpbiBzaGFyZWQgc3RvcmFnZTogIiArIGluZm8ucGF0aCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGdWxsQmFja3VwLkFQUFNfUFJFRklYLnJlZ2lvbk1hdGNoZXMoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucGF0aCwgMCwgRnVsbEJhY2t1cC5BUFBTX1BSRUZJWC5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXBwIGNvbnRlbnQhICBQYXJzZSBvdXQgdGhlIHBhY2thZ2UgbmFtZSBhbmQgZG9tYWluCisKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RyaXAgdGhlIGFwcHMvIHByZWZpeAorICAgICAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSBpbmZvLnBhdGguc3Vic3RyaW5nKEZ1bGxCYWNrdXAuQVBQU19QUkVGSVgubGVuZ3RoKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhlIHBhY2thZ2UgbmFtZQorICAgICAgICAgICAgICAgICAgICBpbnQgc2xhc2ggPSBpbmZvLnBhdGguaW5kZXhPZignLycpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2xhc2ggPCAwKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklsbGVnYWwgc2VtYW50aWMgcGF0aCBpbiAiICsgaW5mby5wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5wYWNrYWdlTmFtZSA9IGluZm8ucGF0aC5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgICAgICAgICBpbmZvLnBhdGggPSBpbmZvLnBhdGguc3Vic3RyaW5nKHNsYXNoKzEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBtYW5pZmVzdCB3ZSdyZSBkb25lLCBvdGhlcndpc2UgcGFyc2Ugb3V0IHRoZSBkb21haW5zCisgICAgICAgICAgICAgICAgICAgIGlmICghaW5mby5wYXRoLmVxdWFscyhCQUNLVVBfTUFOSUZFU1RfRklMRU5BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbGFzaCA9IGluZm8ucGF0aC5pbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2xhc2ggPCAwKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklsbGVnYWwgc2VtYW50aWMgcGF0aCBpbiBub24tbWFuaWZlc3QgIiArIGluZm8ucGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmRvbWFpbiA9IGluZm8ucGF0aC5zdWJzdHJpbmcoMCwgc2xhc2gpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgdGhhdCBpdCdzIG9uZSBvZiB0aGUgZG9tYWlucyB3ZSB1bmRlcnN0YW5kCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkFQS19UUkVFX1RPS0VOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaW5mby5kb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuREFUQV9UUkVFX1RPS0VOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhaW5mby5kb21haW4uZXF1YWxzKEZ1bGxCYWNrdXAuREFUQUJBU0VfVFJFRV9UT0tFTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLlJPT1RfVFJFRV9UT0tFTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLlNIQVJFRFBSRUZTX1RSRUVfVE9LRU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFpbmZvLmRvbWFpbi5lcXVhbHMoRnVsbEJhY2t1cC5PQkJfVFJFRV9UT0tFTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWluZm8uZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLkNBQ0hFX1RSRUVfVE9LRU4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgZG9tYWluICIgKyBpbmZvLmRvbWFpbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucGF0aCA9IGluZm8ucGF0aC5zdWJzdHJpbmcoc2xhc2ggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZWFkVGFySGVhZGVyKElucHV0U3RyZWFtIGluc3RyZWFtLCBieXRlW10gYmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgblJlYWQgPSBpbnN0cmVhbS5yZWFkKGJsb2NrLCAwLCA1MTIpOworICAgICAgICAgICAgaWYgKG5SZWFkID49IDApIG1CeXRlcyArPSBuUmVhZDsKKyAgICAgICAgICAgIGlmIChuUmVhZCA+IDAgJiYgblJlYWQgIT0gNTEyKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgd2UgcmVhZCBvbmx5IGEgcGFydGlhbCBibG9jaywgdGhlbiB0aGluZ3MgYXJlCisgICAgICAgICAgICAgICAgLy8gY2xlYXJseSBzY3Jld2VkIHVwLiAgdGVybWluYXRlIHRoZSByZXN0b3JlLgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGFydGlhbCBoZWFkZXIgYmxvY2s6ICIgKyBuUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKG5SZWFkID4gMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvdmVyd3JpdGVzICdpbmZvJyBmaWVsZHMgYmFzZWQgb24gdGhlIHBheCBleHRlbmRlZCBoZWFkZXIKKyAgICAgICAgYm9vbGVhbiByZWFkUGF4RXh0ZW5kZWRIZWFkZXIoSW5wdXRTdHJlYW0gaW5zdHJlYW0sIEZpbGVNZXRhZGF0YSBpbmZvKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgc2VlIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBsYXJnZXIgdGhhbiB0aGlzCisgICAgICAgICAgICBpZiAoaW5mby5zaXplID4gMzIqMTAyNCkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJTdXNwaWNpb3VzbHkgbGFyZ2UgcGF4IGhlYWRlciBzaXplICIgKyBpbmZvLnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtIGFib3J0aW5nIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTYW5pdHkgZmFpbHVyZTogcGF4IGhlYWRlciBzaXplICIgKyBpbmZvLnNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWFkIHdob2xlIGJsb2Nrcywgbm90IGp1c3QgdGhlIGNvbnRlbnQgc2l6ZQorICAgICAgICAgICAgaW50IG51bUJsb2NrcyA9IChpbnQpKChpbmZvLnNpemUgKyA1MTEpID4+IDkpOworICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtudW1CbG9ja3MgKiA1MTJdOworICAgICAgICAgICAgaW50IG5SZWFkID0gaW5zdHJlYW0ucmVhZChkYXRhKTsKKyAgICAgICAgICAgIGlmIChuUmVhZCA+PSAwKSBtQnl0ZXMgKz0gblJlYWQ7CisgICAgICAgICAgICBpZiAoblJlYWQgIT0gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBjb250ZW50U2l6ZSA9IChpbnQpIGluZm8uc2l6ZTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhlIGxpbmUgYXQgJ29mZnNldCcKKyAgICAgICAgICAgICAgICBpbnQgZW9sID0gb2Zmc2V0KzE7CisgICAgICAgICAgICAgICAgd2hpbGUgKGVvbCA8IGNvbnRlbnRTaXplICYmIGRhdGFbZW9sXSAhPSAnICcpIGVvbCsrOworICAgICAgICAgICAgICAgIGlmIChlb2wgPj0gY29udGVudFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3I6IHdlIGp1c3QgaGl0IEVPRCBsb29raW5nIGZvciB0aGUgZW5kIG9mIHRoZSBzaXplIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW52YWxpZCBwYXggZGF0YSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBlb2wgcG9pbnRzIHRvIHRoZSBzcGFjZSBiZXR3ZWVuIHRoZSBjb3VudCBhbmQgdGhlIGtleQorICAgICAgICAgICAgICAgIGludCBsaW5lbGVuID0gKGludCkgZXh0cmFjdFJhZGl4KGRhdGEsIG9mZnNldCwgZW9sIC0gb2Zmc2V0LCAxMCk7CisgICAgICAgICAgICAgICAgaW50IGtleSA9IGVvbCArIDE7ICAvLyBzdGFydCBvZiBrZXk9dmFsdWUKKyAgICAgICAgICAgICAgICBlb2wgPSBvZmZzZXQgKyBsaW5lbGVuIC0gMTsgLy8gdHJhaWxpbmcgTEYKKyAgICAgICAgICAgICAgICBpbnQgdmFsdWU7CisgICAgICAgICAgICAgICAgZm9yICh2YWx1ZSA9IGtleSsxOyBkYXRhW3ZhbHVlXSAhPSAnPScgJiYgdmFsdWUgPD0gZW9sOyB2YWx1ZSsrKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiBlb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIHBheCBkZWNsYXJhdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIHBheCByZXF1aXJlcyB0aGF0IGtleS92YWx1ZSBzdHJpbmdzIGJlIGluIFVURi04CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVN0ciA9IG5ldyBTdHJpbmcoZGF0YSwga2V5LCB2YWx1ZS1rZXksICJVVEYtOCIpOworICAgICAgICAgICAgICAgIC8vIC0xIHRvIHN0cmlwIHRoZSB0cmFpbGluZyBMRgorICAgICAgICAgICAgICAgIFN0cmluZyB2YWxTdHIgPSBuZXcgU3RyaW5nKGRhdGEsIHZhbHVlKzEsIGVvbC12YWx1ZS0xLCAiVVRGLTgiKTsKKworICAgICAgICAgICAgICAgIGlmICgicGF0aCIuZXF1YWxzKGtleVN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5wYXRoID0gdmFsU3RyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNpemUiLmVxdWFscyhrZXlTdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm8uc2l6ZSA9IExvbmcucGFyc2VMb25nKHZhbFN0cik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmkoVEFHLCAiVW5oYW5kbGVkIHBheCBrZXk6ICIgKyBrZXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9mZnNldCArPSBsaW5lbGVuOworICAgICAgICAgICAgfSB3aGlsZSAob2Zmc2V0IDwgY29udGVudFNpemUpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgZXh0cmFjdFJhZGl4KGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbWF4Q2hhcnMsIGludCByYWRpeCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbG9uZyB2YWx1ZSA9IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgZW5kID0gb2Zmc2V0ICsgbWF4Q2hhcnM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlIGIgPSBkYXRhW2ldOworICAgICAgICAgICAgICAgIC8vIE51bWVyaWMgZmllbGRzIGluIHRhciBjYW4gdGVybWluYXRlIHdpdGggZWl0aGVyIE5VTCBvciBTUEMKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSAwIHx8IGIgPT0gJyAnKSBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoYiA8ICcwJyB8fCBiID4gKCcwJyArIHJhZGl4IC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnZhbGlkIG51bWJlciBpbiBoZWFkZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUgPSByYWRpeCAqIHZhbHVlICsgKGIgLSAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGV4dHJhY3RTdHJpbmcoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBtYXhDaGFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBlbmQgPSBvZmZzZXQgKyBtYXhDaGFyczsKKyAgICAgICAgICAgIGludCBlb3MgPSBvZmZzZXQ7CisgICAgICAgICAgICAvLyB0YXIgc3RyaW5nIGZpZWxkcyB0ZXJtaW5hdGUgZWFybHkgd2l0aCBhIE5VTAorICAgICAgICAgICAgd2hpbGUgKGVvcyA8IGVuZCAmJiBkYXRhW2Vvc10gIT0gMCkgZW9zKys7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhkYXRhLCBvZmZzZXQsIGVvcy1vZmZzZXQsICJVUy1BU0NJSSIpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZW5kU3RhcnRSZXN0b3JlKCkgeworICAgICAgICAgICAgaWYgKG1PYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyLm9uU3RhcnRSZXN0b3JlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgImZ1bGwgcmVzdG9yZSBvYnNlcnZlciB3ZW50IGF3YXk6IHN0YXJ0UmVzdG9yZSIpOworICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2VuZE9uUmVzdG9yZVBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIGlmIChtT2JzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBhIG1vcmUgdXNlci1mcmllbmRseSBuYW1lIHN0cmluZworICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2ZXIub25SZXN0b3JlUGFja2FnZShuYW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiZnVsbCByZXN0b3JlIG9ic2VydmVyIHdlbnQgYXdheTogcmVzdG9yZVBhY2thZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNlbmRFbmRSZXN0b3JlKCkgeworICAgICAgICAgICAgaWYgKG1PYnNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbU9ic2VydmVyLm9uRW5kUmVzdG9yZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJmdWxsIHJlc3RvcmUgb2JzZXJ2ZXIgd2VudCBhd2F5OiBlbmRSZXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgIG1PYnNlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gLS0tLS0gUmVzdG9yZSBoYW5kbGluZyAtLS0tLQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNpZ25hdHVyZXNNYXRjaChTaWduYXR1cmVbXSBzdG9yZWRTaWdzLCBQYWNrYWdlSW5mbyB0YXJnZXQpIHsKQEAgLTI1ODMsNDEgKzM2NjIsOTUgQEAKICAgICAgICAgICAgICAgICBtRnVsbENvbmZpcm1hdGlvbnMucHV0KHRva2VuLCBwYXJhbXMpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBzdGFydCB1cCB0aGUgY29uZmlybWF0aW9uIFVJLCBtYWtpbmcgc3VyZSB0aGUgc2NyZWVuIGxpZ2h0cyB1cAotICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiU3RhcnRpbmcgY29uZmlybWF0aW9uIFVJLCB0b2tlbj0iICsgdG9rZW4pOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJbnRlbnQgY29uZkludGVudCA9IG5ldyBJbnRlbnQoRnVsbEJhY2t1cC5GVUxMX0JBQ0tVUF9JTlRFTlRfQUNUSU9OKTsKLSAgICAgICAgICAgICAgICBjb25mSW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuYmFja3VwY29uZmlybSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmFja3VwY29uZmlybS5CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uIik7Ci0gICAgICAgICAgICAgICAgY29uZkludGVudC5wdXRFeHRyYShGdWxsQmFja3VwLkNPTkZfVE9LRU5fSU5URU5UX0VYVFJBLCB0b2tlbik7Ci0gICAgICAgICAgICAgICAgY29uZkludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0gICAgICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShjb25mSW50ZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gbGF1bmNoIGZ1bGwgYmFja3VwIGNvbmZpcm1hdGlvbiIsIGUpOworICAgICAgICAgICAgLy8gc3RhcnQgdXAgdGhlIGNvbmZpcm1hdGlvbiBVSQorICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiU3RhcnRpbmcgYmFja3VwIGNvbmZpcm1hdGlvbiBVSSwgdG9rZW49IiArIHRva2VuKTsKKyAgICAgICAgICAgIGlmICghc3RhcnRDb25maXJtYXRpb25VaSh0b2tlbiwgRnVsbEJhY2t1cC5GVUxMX0JBQ0tVUF9JTlRFTlRfQUNUSU9OKSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJVbmFibGUgdG8gbGF1bmNoIGZ1bGwgYmFja3VwIGNvbmZpcm1hdGlvbiIpOwogICAgICAgICAgICAgICAgIG1GdWxsQ29uZmlybWF0aW9ucy5kZWxldGUodG9rZW4pOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzY3JlZW4gaXMgbGl0IGZvciB0aGUgdXNlciBpbnRlcmFjdGlvbgogICAgICAgICAgICAgbVBvd2VyTWFuYWdlci51c2VyQWN0aXZpdHkoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIGZhbHNlKTsKIAogICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGNvbmZpcm1hdGlvbiBjb3VudGRvd24KLSAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIlBvc3RpbmcgY29uZiB0aW1lb3V0IG1zZyBhZnRlciAiCi0gICAgICAgICAgICAgICAgICAgICsgVElNRU9VVF9GVUxMX0NPTkZJUk1BVElPTiArICIgbWlsbGlzIik7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1CYWNrdXBIYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0ZVTExfQ09ORklSTUFUSU9OX1RJTUVPVVQsCi0gICAgICAgICAgICAgICAgICAgIHRva2VuLCAwLCBwYXJhbXMpOwotICAgICAgICAgICAgbUJhY2t1cEhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgVElNRU9VVF9GVUxMX0NPTkZJUk1BVElPTik7CisgICAgICAgICAgICBzdGFydENvbmZpcm1hdGlvblRpbWVvdXQodG9rZW4sIHBhcmFtcyk7CiAKICAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBiYWNrdXAgdG8gYmUgcGVyZm9ybWVkCiAgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJXYWl0aW5nIGZvciBmdWxsIGJhY2t1cCBjb21wbGV0aW9uLi4uIik7CiAgICAgICAgICAgICB3YWl0Rm9yQ29tcGxldGlvbihwYXJhbXMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiLi4uRnVsbCBiYWNrdXAgb3BlcmF0aW9uIGNvbXBsZXRlISIpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkob2xkSWQpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBmZC5jbG9zZSgpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIGp1c3QgZWF0IGl0CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShvbGRJZCk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiRnVsbCBiYWNrdXAgZG9uZTsgcmV0dXJuaW5nIHRvIGNhbGxlciIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZ1bGxSZXN0b3JlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIGZkKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQkFDS1VQLCAiZnVsbEJhY2t1cCIpOworICAgICAgICBTbG9nLmkoVEFHLCAiQmVnaW5uaW5nIGZ1bGwgcmVzdG9yZS4uLiIpOworCisgICAgICAgIGxvbmcgb2xkSWQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRnVsbFJlc3RvcmVQYXJhbXMgcGFyYW1zID0gbmV3IEZ1bGxSZXN0b3JlUGFyYW1zKGZkKTsKKyAgICAgICAgICAgIGZpbmFsIGludCB0b2tlbiA9IGdlbmVyYXRlVG9rZW4oKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUZ1bGxDb25maXJtYXRpb25zKSB7CisgICAgICAgICAgICAgICAgbUZ1bGxDb25maXJtYXRpb25zLnB1dCh0b2tlbiwgcGFyYW1zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RhcnQgdXAgdGhlIGNvbmZpcm1hdGlvbiBVSQorICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiU3RhcnRpbmcgcmVzdG9yZSBjb25maXJtYXRpb24gVUksIHRva2VuPSIgKyB0b2tlbik7CisgICAgICAgICAgICBpZiAoIXN0YXJ0Q29uZmlybWF0aW9uVWkodG9rZW4sIEZ1bGxCYWNrdXAuRlVMTF9SRVNUT1JFX0lOVEVOVF9BQ1RJT04pKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIlVuYWJsZSB0byBsYXVuY2ggZnVsbCByZXN0b3JlIGNvbmZpcm1hdGlvbiIpOworICAgICAgICAgICAgICAgIG1GdWxsQ29uZmlybWF0aW9ucy5kZWxldGUodG9rZW4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBzY3JlZW4gaXMgbGl0IGZvciB0aGUgdXNlciBpbnRlcmFjdGlvbgorICAgICAgICAgICAgbVBvd2VyTWFuYWdlci51c2VyQWN0aXZpdHkoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCksIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgdGhlIGNvbmZpcm1hdGlvbiBjb3VudGRvd24KKyAgICAgICAgICAgIHN0YXJ0Q29uZmlybWF0aW9uVGltZW91dCh0b2tlbiwgcGFyYW1zKTsKKworICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHJlc3RvcmUgdG8gYmUgcGVyZm9ybWVkCisgICAgICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJXYWl0aW5nIGZvciBmdWxsIHJlc3RvcmUgY29tcGxldGlvbi4uLiIpOworICAgICAgICAgICAgd2FpdEZvckNvbXBsZXRpb24ocGFyYW1zKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRXJyb3IgdHJ5aW5nIHRvIGNsb3NlIGZkIGFmdGVyIGZ1bGwgcmVzdG9yZTogIiArIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkob2xkSWQpOworICAgICAgICAgICAgU2xvZy5pKFRBRywgIkZ1bGwgcmVzdG9yZSBjb21wbGV0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gc3RhcnRDb25maXJtYXRpb25VaShpbnQgdG9rZW4sIFN0cmluZyBhY3Rpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVudCBjb25mSW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOworICAgICAgICAgICAgY29uZkludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLmJhY2t1cGNvbmZpcm0iLAorICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYmFja3VwY29uZmlybS5CYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uIik7CisgICAgICAgICAgICBjb25mSW50ZW50LnB1dEV4dHJhKEZ1bGxCYWNrdXAuQ09ORl9UT0tFTl9JTlRFTlRfRVhUUkEsIHRva2VuKTsKKyAgICAgICAgICAgIGNvbmZJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShjb25mSW50ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzdGFydENvbmZpcm1hdGlvblRpbWVvdXQoaW50IHRva2VuLCBGdWxsUGFyYW1zIHBhcmFtcykgeworICAgICAgICBpZiAoREVCVUcpIFNsb2cuZChUQUcsICJQb3N0aW5nIGNvbmYgdGltZW91dCBtc2cgYWZ0ZXIgIgorICAgICAgICAgICAgICAgICsgVElNRU9VVF9GVUxMX0NPTkZJUk1BVElPTiArICIgbWlsbGlzIik7CisgICAgICAgIE1lc3NhZ2UgbXNnID0gbUJhY2t1cEhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfRlVMTF9DT05GSVJNQVRJT05fVElNRU9VVCwKKyAgICAgICAgICAgICAgICB0b2tlbiwgMCwgcGFyYW1zKTsKKyAgICAgICAgbUJhY2t1cEhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgVElNRU9VVF9GVUxMX0NPTkZJUk1BVElPTik7CiAgICAgfQogCiAgICAgdm9pZCB3YWl0Rm9yQ29tcGxldGlvbihGdWxsUGFyYW1zIHBhcmFtcykgewpAQCAtMjY2MSw5ICszNzk0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvdykgewogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm9ic2VydmVyID0gb2JzZXJ2ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmVyYiA9IHBhcmFtcyBpbnN0YW5jZW9mIEZ1bGxCYWNrdXBQYXJhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgID8gTVNHX1JVTl9GVUxMX0JBQ0tVUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1TR19SVU5fRlVMTF9CQUNLVVAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNU0dfUlVOX0ZVTExfUkVTVE9SRTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBTbG9nLmQoVEFHLCAiU2VuZGluZyBjb25mIG1lc3NhZ2Ugd2l0aCB2ZXJiICIgKyB2ZXJiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1XYWtlbG9jay5hY3F1aXJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1CYWNrdXBIYW5kbGVyLm9idGFpbk1lc3NhZ2UodmVyYiwgcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CYWNrdXBIYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Db25uZWN0aXZpdHlTZXJ2aWNlLmphdmEKaW5kZXggZDJmZDA0Yi4uYWEzZGZhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQ29ubmVjdGl2aXR5U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0Nvbm5lY3Rpdml0eVNlcnZpY2UuamF2YQpAQCAtMTYsNiArMTYsMTEgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9ORVRXT1JLX1BPTElDWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlci5pc05ldHdvcmtUeXBlVmFsaWQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlJVTEVfQUxMT1dfQUxMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5SVUxFX1JFSkVDVF9NRVRFUkVEOworCiBpbXBvcnQgYW5kcm9pZC5ibHVldG9vdGguQmx1ZXRvb3RoVGV0aGVyaW5nRGF0YVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTI2LDExICszMSwxNCBAQAogaW1wb3J0IGFuZHJvaWQubmV0LkR1bW15RGF0YVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5FdGhlcm5ldERhdGFUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtBZGRyZXNzOworaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrUG9saWN5TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtQb2xpY3lNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LkxpbmtQcm9wZXJ0aWVzOwogaW1wb3J0IGFuZHJvaWQubmV0Lk1vYmlsZURhdGFTdGF0ZVRyYWNrZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0NvbmZpZzsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZTsKIGltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGVUcmFja2VyOwogaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtVdGlsczsKIGltcG9ydCBhbmRyb2lkLm5ldC5Qcm94eTsKQEAgLTM5LDEyICs0NywxNCBAQAogaW1wb3J0IGFuZHJvaWQubmV0LnZwbi5WcG5NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LndpZmkuV2lmaVN0YXRlVHJhY2tlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC5vcy5Qb3dlck1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKQEAgLTUzLDIyICs2MywyOCBAQAogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm5ldC5WcG5Db25maWc7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lOwogaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jb25uZWN0aXZpdHkuVGV0aGVyaW5nOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5jb25uZWN0aXZpdHkuVnBuOworCitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuU2V0czsKIAogaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5JbmV0NEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCiAgKiBAaGlkZQpAQCAtNzgsNiArOTQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbm5lY3Rpdml0eVNlcnZpY2UiOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dEX1JVTEVTID0gZmFsc2U7CisKICAgICAvLyBob3cgbG9uZyB0byB3YWl0IGJlZm9yZSBzd2l0Y2hpbmcgYmFjayB0byBhIHJhZGlvJ3MgZGVmYXVsdCBuZXR3b3JrCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkVfREVGQVVMVF9ORVRXT1JLX0RFTEFZID0gMSAqIDYwICogMTAwMDsKICAgICAvLyBzeXN0ZW0gcHJvcGVydHkgdGhhdCBjYW4gb3ZlcnJpZGUgdGhlIGFib3ZlIHZhbHVlCkBAIC05MSw2ICsxMDksMTUgQEAKICAgICBwcml2YXRlIFRldGhlcmluZyBtVGV0aGVyaW5nOwogICAgIHByaXZhdGUgYm9vbGVhbiBtVGV0aGVyaW5nQ29uZmlnVmFsaWQgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgVnBuIG1WcG47CisKKyAgICAvKiogTG9jayBhcm91bmQge0BsaW5rICNtVWlkUnVsZXN9IGFuZCB7QGxpbmsgI21NZXRlcmVkSWZhY2VzfS4gKi8KKyAgICBwcml2YXRlIE9iamVjdCBtUnVsZXNMb2NrID0gbmV3IE9iamVjdCgpOworICAgIC8qKiBDdXJyZW50bHkgYWN0aXZlIG5ldHdvcmsgcnVsZXMgYnkgVUlELiAqLworICAgIHByaXZhdGUgU3BhcnNlSW50QXJyYXkgbVVpZFJ1bGVzID0gbmV3IFNwYXJzZUludEFycmF5KCk7CisgICAgLyoqIFNldCBvZiBpZmFjZXMgdGhhdCBhcmUgY29zdGx5LiAqLworICAgIHByaXZhdGUgSGFzaFNldDxTdHJpbmc+IG1NZXRlcmVkSWZhY2VzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKICAgICAvKioKICAgICAgKiBTb21ldGltZXMgd2Ugd2FudCB0byByZWZlciB0byB0aGUgaW5kaXZpZHVhbCBuZXR3b3JrIHN0YXRlCiAgICAgICogdHJhY2tlcnMgc2VwYXJhdGVseSwgYW5kIHNvbWV0aW1lcyB3ZSBqdXN0IHdhbnQgdG8gdHJlYXQgdGhlbQpAQCAtMTI4LDYgKzE1NSw3IEBACiAgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIG1CYWNrZ3JvdW5kRGF0YUVuYWJsZWQgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKIAogICAgIHByaXZhdGUgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBtTmV0ZDsKKyAgICBwcml2YXRlIElOZXR3b3JrUG9saWN5TWFuYWdlciBtUG9saWN5TWFuYWdlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkFCTEVEICA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEID0gMDsKQEAgLTI1MCwxNCArMjc4LDggQEAKICAgICB9CiAgICAgUmFkaW9BdHRyaWJ1dGVzW10gbVJhZGlvQXR0cmlidXRlczsKIAotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIENvbm5lY3Rpdml0eVNlcnZpY2UgZ2V0SW5zdGFuY2UoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzU2VydmljZUluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHNTZXJ2aWNlSW5zdGFuY2UgPSBuZXcgQ29ubmVjdGl2aXR5U2VydmljZShjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc1NlcnZpY2VJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbm5lY3Rpdml0eVNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIENvbm5lY3Rpdml0eVNlcnZpY2UoCisgICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbmV0ZCwgSU5ldHdvcmtQb2xpY3lNYW5hZ2VyIHBvbGljeU1hbmFnZXIpIHsKICAgICAgICAgaWYgKERCRykgbG9nKCJDb25uZWN0aXZpdHlTZXJ2aWNlIHN0YXJ0aW5nIHVwIik7CiAKICAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIkNvbm5lY3Rpdml0eVNlcnZpY2VUaHJlYWQiKTsKQEAgLTI5MCw5ICszMTIsMTkgQEAKICAgICAgICAgICAgIGxvZ2UoIkVycm9yIHNldHRpbmcgZGVmYXVsdERucyB1c2luZyAiICsgZG5zKTsKICAgICAgICAgfQogCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbUNvbnRleHQgPSBjaGVja05vdE51bGwoY29udGV4dCwgIm1pc3NpbmcgQ29udGV4dCIpOworICAgICAgICBtTmV0ZCA9IGNoZWNrTm90TnVsbChuZXRkLCAibWlzc2luZyBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIik7CisgICAgICAgIG1Qb2xpY3lNYW5hZ2VyID0gY2hlY2tOb3ROdWxsKHBvbGljeU1hbmFnZXIsICJtaXNzaW5nIElOZXR3b3JrUG9saWN5TWFuYWdlciIpOwogCi0gICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKW1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1Qb2xpY3lNYW5hZ2VyLnJlZ2lzdGVyTGlzdGVuZXIobVBvbGljeUxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG91Y2gsIG5vIHJ1bGVzIHVwZGF0ZXMgbWVhbnMgc29tZSBwcm9jZXNzZXMgbWF5IG5ldmVyIGdldCBuZXR3b3JrCisgICAgICAgICAgICBTbG9nLmUoVEFHLCAidW5hYmxlIHRvIHJlZ2lzdGVyIElOZXR3b3JrUG9saWN5TGlzdGVuZXIiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoCisgICAgICAgICAgICAgICAgQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKICAgICAgICAgbU5ldFRyYW5zaXRpb25XYWtlTG9jayA9IHBvd2VyTWFuYWdlci5uZXdXYWtlTG9jayhQb3dlck1hbmFnZXIuUEFSVElBTF9XQUtFX0xPQ0ssIFRBRyk7CiAgICAgICAgIG1OZXRUcmFuc2l0aW9uV2FrZUxvY2tUaW1lb3V0ID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0SW50ZWdlcigKICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmludGVnZXIuY29uZmlnX25ldHdvcmtUcmFuc2l0aW9uVGltZW91dCk7CkBAIC00NDEsNiArNDczLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRldGhlcmluZy5nZXRUZXRoZXJhYmxlQmx1ZXRvb3RoUmVnZXhzKCkubGVuZ3RoICE9IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGV0aGVyaW5nLmdldFVwc3RyZWFtSWZhY2VSZWdleHMoKS5sZW5ndGggIT0gMCk7CiAKKyAgICAgICAgbVZwbiA9IG5ldyBWcG4obUNvbnRleHQsIG5ldyBWcG5DYWxsYmFjaygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbm1TZXJ2aWNlLnJlZ2lzdGVyT2JzZXJ2ZXIobVRldGhlcmluZyk7CisgICAgICAgICAgICBubVNlcnZpY2UucmVnaXN0ZXJPYnNlcnZlcihtVnBuKTsKKyAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZ2UoIkVycm9yIHJlZ2lzdGVyaW5nIG9ic2VydmVyIDoiICsgZSk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBtSW5ldExvZyA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgfQpAQCAtNTM2LDM0ICs1NzcsOTMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDaGVjayBpZiBVSUQgc2hvdWxkIGJlIGJsb2NrZWQgZnJvbSB1c2luZyB0aGUgbmV0d29yayByZXByZXNlbnRlZCBieSB0aGUKKyAgICAgKiBnaXZlbiB7QGxpbmsgTmV0d29ya1N0YXRlVHJhY2tlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTmV0d29ya0Jsb2NrZWQoTmV0d29ya1N0YXRlVHJhY2tlciB0cmFja2VyLCBpbnQgdWlkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpZmFjZSA9IHRyYWNrZXIuZ2V0TGlua1Byb3BlcnRpZXMoKS5nZXRJbnRlcmZhY2VOYW1lKCk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBuZXR3b3JrQ29zdGx5OworICAgICAgICBmaW5hbCBpbnQgdWlkUnVsZXM7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgeworICAgICAgICAgICAgbmV0d29ya0Nvc3RseSA9IG1NZXRlcmVkSWZhY2VzLmNvbnRhaW5zKGlmYWNlKTsKKyAgICAgICAgICAgIHVpZFJ1bGVzID0gbVVpZFJ1bGVzLmdldCh1aWQsIFJVTEVfQUxMT1dfQUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXR3b3JrQ29zdGx5ICYmICh1aWRSdWxlcyAmIFJVTEVfUkVKRUNUX01FVEVSRUQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm8gcmVzdHJpY3RpdmUgcnVsZXM7IG5ldHdvcmsgaXMgdmlzaWJsZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgZmlsdGVyZWQge0BsaW5rIE5ldHdvcmtJbmZvfSwgcG90ZW50aWFsbHkgbWFya2VkCisgICAgICoge0BsaW5rIERldGFpbGVkU3RhdGUjQkxPQ0tFRH0gYmFzZWQgb24KKyAgICAgKiB7QGxpbmsgI2lzTmV0d29ya0Jsb2NrZWQoTmV0d29ya1N0YXRlVHJhY2tlciwgaW50KX0uCisgICAgICovCisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBnZXRGaWx0ZXJlZE5ldHdvcmtJbmZvKE5ldHdvcmtTdGF0ZVRyYWNrZXIgdHJhY2tlciwgaW50IHVpZCkgeworICAgICAgICBOZXR3b3JrSW5mbyBpbmZvID0gdHJhY2tlci5nZXROZXR3b3JrSW5mbygpOworICAgICAgICBpZiAoaXNOZXR3b3JrQmxvY2tlZCh0cmFja2VyLCB1aWQpKSB7CisgICAgICAgICAgICAvLyBuZXR3b3JrIGlzIGJsb2NrZWQ7IGNsb25lIGFuZCBvdmVycmlkZSBzdGF0ZQorICAgICAgICAgICAgaW5mbyA9IG5ldyBOZXR3b3JrSW5mbyhpbmZvKTsKKyAgICAgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkJMT0NLRUQsIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHVybiBOZXR3b3JrSW5mbyBmb3IgdGhlIGFjdGl2ZSAoaS5lLiwgY29ubmVjdGVkKSBuZXR3b3JrIGludGVyZmFjZS4KICAgICAgKiBJdCBpcyBhc3N1bWVkIHRoYXQgYXQgbW9zdCBvbmUgbmV0d29yayBpcyBhY3RpdmUgYXQgYSB0aW1lLiBJZiBtb3JlCiAgICAgICogdGhhbiBvbmUgaXMgYWN0aXZlLCBpdCBpcyBpbmRldGVybWluYXRlIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgICogQHJldHVybiB0aGUgaW5mbyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSBpcwogICAgICAqIGFjdGl2ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mbygpIHsKLSAgICAgICAgcmV0dXJuIGdldE5ldHdvcmtJbmZvKG1BY3RpdmVEZWZhdWx0TmV0d29yayk7CisgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7CisgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICByZXR1cm4gZ2V0TmV0d29ya0luZm8obUFjdGl2ZURlZmF1bHROZXR3b3JrLCB1aWQpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOZXR3b3JrSW5mbyBnZXRBY3RpdmVOZXR3b3JrSW5mb0ZvclVpZChpbnQgdWlkKSB7CisgICAgICAgIGVuZm9yY2VDb25uZWN0aXZpdHlJbnRlcm5hbFBlcm1pc3Npb24oKTsKKyAgICAgICAgcmV0dXJuIGdldE5ldHdvcmtJbmZvKG1BY3RpdmVEZWZhdWx0TmV0d29yaywgdWlkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTmV0d29ya0luZm8gZ2V0TmV0d29ya0luZm8oaW50IG5ldHdvcmtUeXBlKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGlmIChDb25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVWYWxpZChuZXR3b3JrVHlwZSkpIHsKLSAgICAgICAgICAgIE5ldHdvcmtTdGF0ZVRyYWNrZXIgdCA9IG1OZXRUcmFja2Vyc1tuZXR3b3JrVHlwZV07Ci0gICAgICAgICAgICBpZiAodCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0LmdldE5ldHdvcmtJbmZvKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICByZXR1cm4gZ2V0TmV0d29ya0luZm8obmV0d29ya1R5cGUsIHVpZCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBOZXR3b3JrSW5mbyBnZXROZXR3b3JrSW5mbyhpbnQgbmV0d29ya1R5cGUsIGludCB1aWQpIHsKKyAgICAgICAgTmV0d29ya0luZm8gaW5mbyA9IG51bGw7CisgICAgICAgIGlmIChpc05ldHdvcmtUeXBlVmFsaWQobmV0d29ya1R5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdGVUcmFja2VyIHRyYWNrZXIgPSBtTmV0VHJhY2tlcnNbbmV0d29ya1R5cGVdOworICAgICAgICAgICAgaWYgKHRyYWNrZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZm8gPSBnZXRGaWx0ZXJlZE5ldHdvcmtJbmZvKHRyYWNrZXIsIHVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE5ldHdvcmtJbmZvW10gZ2V0QWxsTmV0d29ya0luZm8oKSB7CiAgICAgICAgIGVuZm9yY2VBY2Nlc3NQZXJtaXNzaW9uKCk7Ci0gICAgICAgIE5ldHdvcmtJbmZvW10gcmVzdWx0ID0gbmV3IE5ldHdvcmtJbmZvW21OZXR3b3Jrc0RlZmluZWRdOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoTmV0d29ya1N0YXRlVHJhY2tlciB0IDogbU5ldFRyYWNrZXJzKSB7Ci0gICAgICAgICAgICBpZih0ICE9IG51bGwpIHJlc3VsdFtpKytdID0gdC5nZXROZXR3b3JrSW5mbygpOworICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5ldHdvcmtJbmZvPiByZXN1bHQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtUnVsZXNMb2NrKSB7CisgICAgICAgICAgICBmb3IgKE5ldHdvcmtTdGF0ZVRyYWNrZXIgdHJhY2tlciA6IG1OZXRUcmFja2VycykgeworICAgICAgICAgICAgICAgIGlmICh0cmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChnZXRGaWx0ZXJlZE5ldHdvcmtJbmZvKHRyYWNrZXIsIHVpZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IE5ldHdvcmtJbmZvW3Jlc3VsdC5zaXplKCldKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU3NCwxOSArNjc0LDQwIEBACiAgICAgICogQHJldHVybiB0aGUgaXAgcHJvcGVydGllcyBmb3IgdGhlIGFjdGl2ZSBuZXR3b3JrLCBvciB7QGNvZGUgbnVsbH0gaWYKICAgICAgKiBub25lIGlzIGFjdGl2ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaW5rUHJvcGVydGllcyBnZXRBY3RpdmVMaW5rUHJvcGVydGllcygpIHsKICAgICAgICAgcmV0dXJuIGdldExpbmtQcm9wZXJ0aWVzKG1BY3RpdmVEZWZhdWx0TmV0d29yayk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpbmtQcm9wZXJ0aWVzIGdldExpbmtQcm9wZXJ0aWVzKGludCBuZXR3b3JrVHlwZSkgewogICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOwotICAgICAgICBpZiAoQ29ubmVjdGl2aXR5TWFuYWdlci5pc05ldHdvcmtUeXBlVmFsaWQobmV0d29ya1R5cGUpKSB7Ci0gICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIHQgPSBtTmV0VHJhY2tlcnNbbmV0d29ya1R5cGVdOwotICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgcmV0dXJuIHQuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKGlzTmV0d29ya1R5cGVWYWxpZChuZXR3b3JrVHlwZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0ZVRyYWNrZXIgdHJhY2tlciA9IG1OZXRUcmFja2Vyc1tuZXR3b3JrVHlwZV07CisgICAgICAgICAgICBpZiAodHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXIuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRlW10gZ2V0QWxsTmV0d29ya1N0YXRlKCkgeworICAgICAgICBlbmZvcmNlQWNjZXNzUGVybWlzc2lvbigpOworICAgICAgICBmaW5hbCBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5ldHdvcmtTdGF0ZT4gcmVzdWx0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgeworICAgICAgICAgICAgZm9yIChOZXR3b3JrU3RhdGVUcmFja2VyIHRyYWNrZXIgOiBtTmV0VHJhY2tlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIGluZm8gPSBnZXRGaWx0ZXJlZE5ldHdvcmtJbmZvKHRyYWNrZXIsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IE5ldHdvcmtTdGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLCB0cmFja2VyLmdldExpbmtQcm9wZXJ0aWVzKCksIHRyYWNrZXIuZ2V0TGlua0NhcGFiaWxpdGllcygpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgTmV0d29ya1N0YXRlW3Jlc3VsdC5zaXplKCldKTsKKyAgICB9CisKICAgICBwdWJsaWMgYm9vbGVhbiBzZXRSYWRpb3MoYm9vbGVhbiB0dXJuT24pIHsKICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwogICAgICAgICBlbmZvcmNlQ2hhbmdlUGVybWlzc2lvbigpOwpAQCAtMTAyNyw2ICsxMTQ4LDQ3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbVBvbGljeUxpc3RlbmVyID0gbmV3IElOZXR3b3JrUG9saWN5TGlzdGVuZXIuU3R1YigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uVWlkUnVsZXNDaGFuZ2VkKGludCB1aWQsIGludCB1aWRSdWxlcykgeworICAgICAgICAgICAgLy8gb25seSBzb21lb25lIGxpa2UgTlBNUyBzaG91bGQgb25seSBiZSBjYWxsaW5nIHVzCisgICAgICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTUFOQUdFX05FVFdPUktfUE9MSUNZLCBUQUcpOworCisgICAgICAgICAgICBpZiAoTE9HRF9SVUxFUykgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJvblVpZFJ1bGVzQ2hhbmdlZCh1aWQ9IiArIHVpZCArICIsIHVpZFJ1bGVzPSIgKyB1aWRSdWxlcyArICIpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgeworICAgICAgICAgICAgICAgIC8vIHNraXAgdXBkYXRlIHdoZW4gd2UndmUgYWxyZWFkeSBhcHBsaWVkIHJ1bGVzCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG9sZFJ1bGVzID0gbVVpZFJ1bGVzLmdldCh1aWQsIFJVTEVfQUxMT1dfQUxMKTsKKyAgICAgICAgICAgICAgICBpZiAob2xkUnVsZXMgPT0gdWlkUnVsZXMpIHJldHVybjsKKworICAgICAgICAgICAgICAgIG1VaWRSdWxlcy5wdXQodWlkLCB1aWRSdWxlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IGRpc3BhdGNoIGludG8gTk1TIHRvIHB1c2ggcnVsZXMgdG93YXJkcyBrZXJuZWwgbW9kdWxlCisgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkgVUlEIHdoZW4gaXQgaGFzIHJlcXVlc3RlZCB0YXJnZXRlZCB1cGRhdGVzCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25NZXRlcmVkSWZhY2VzQ2hhbmdlZChTdHJpbmdbXSBtZXRlcmVkSWZhY2VzKSB7CisgICAgICAgICAgICAvLyBvbmx5IHNvbWVvbmUgbGlrZSBOUE1TIHNob3VsZCBvbmx5IGJlIGNhbGxpbmcgdXMKKyAgICAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNQU5BR0VfTkVUV09SS19QT0xJQ1ksIFRBRyk7CisKKyAgICAgICAgICAgIGlmIChMT0dEX1JVTEVTKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbk1ldGVyZWRJZmFjZXNDaGFuZ2VkKGlmYWNlcz0iICsgQXJyYXlzLnRvU3RyaW5nKG1ldGVyZWRJZmFjZXMpICsgIikiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3luY2hyb25pemVkIChtUnVsZXNMb2NrKSB7CisgICAgICAgICAgICAgICAgbU1ldGVyZWRJZmFjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IG1ldGVyZWRJZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGVyZWRJZmFjZXMuYWRkKGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCiAgICAgLyoqCiAgICAgICogQHNlZSBDb25uZWN0aXZpdHlNYW5hZ2VyI3NldE1vYmlsZURhdGFFbmFibGVkKGJvb2xlYW4pCiAgICAgICovCkBAIC0xMTMyLDggKzEyOTQsMzAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQ29ubmVjdGl2aXR5TWFuYWdlci5FWFRSQV9JTkVUX0NPTkRJVElPTiwgbURlZmF1bHRJbmV0Q29uZGl0aW9uUHVibGlzaGVkKTsKKworICAgICAgICAvLyBSZXNldCBpbnRlcmZhY2UgaWYgbm8gb3RoZXIgY29ubmVjdGlvbnMgYXJlIHVzaW5nIHRoZSBzYW1lIGludGVyZmFjZQorICAgICAgICBib29sZWFuIGRvUmVzZXQgPSB0cnVlOworICAgICAgICBMaW5rUHJvcGVydGllcyBsaW5rUHJvcGVydGllcyA9IG1OZXRUcmFja2Vyc1twcmV2TmV0VHlwZV0uZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgaWYgKGxpbmtQcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBvbGRJZmFjZSA9IGxpbmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShvbGRJZmFjZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE5ldHdvcmtTdGF0ZVRyYWNrZXIgbmV0d29ya1N0YXRlVHJhY2tlciA6IG1OZXRUcmFja2VycykgeworICAgICAgICAgICAgICAgICAgICBpZiAobmV0d29ya1N0YXRlVHJhY2tlciA9PSBudWxsKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgTmV0d29ya0luZm8gbmV0d29ya0luZm8gPSBuZXR3b3JrU3RhdGVUcmFja2VyLmdldE5ldHdvcmtJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXR3b3JrSW5mby5pc0Nvbm5lY3RlZCgpICYmIG5ldHdvcmtJbmZvLmdldFR5cGUoKSAhPSBwcmV2TmV0VHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlua1Byb3BlcnRpZXMgbCA9IG5ldHdvcmtTdGF0ZVRyYWNrZXIuZ2V0TGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsID09IG51bGwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZElmYWNlLmVxdWFscyhsLmdldEludGVyZmFjZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1Jlc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBkbyB0aGlzIGJlZm9yZSB3ZSBicm9hZGNhc3QgdGhlIGNoYW5nZQotICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UocHJldk5ldFR5cGUpOworICAgICAgICBoYW5kbGVDb25uZWN0aXZpdHlDaGFuZ2UocHJldk5ldFR5cGUsIGRvUmVzZXQpOwogCiAgICAgICAgIHNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKICAgICAgICAgLyoKQEAgLTEyODQsOSArMTQ2OCw2IEBACiAgICAgfQogCiAgICAgdm9pZCBzeXN0ZW1SZWFkeSgpIHsKLSAgICAgICAgSUJpbmRlciBiID0gU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UpOwotICAgICAgICBtTmV0ZCA9IElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuU3R1Yi5hc0ludGVyZmFjZShiKTsKLQogICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewogICAgICAgICAgICAgbVN5c3RlbVJlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChtSW5pdGlhbEJyb2FkY2FzdCAhPSBudWxsKSB7CkBAIC0xMzU4LDcgKzE1MzksNyBAQAogICAgICAgICB9CiAgICAgICAgIHRoaXNOZXQuc2V0VGVhcmRvd25SZXF1ZXN0ZWQoZmFsc2UpOwogICAgICAgICB1cGRhdGVOZXR3b3JrU2V0dGluZ3ModGhpc05ldCk7Ci0gICAgICAgIGhhbmRsZUNvbm5lY3Rpdml0eUNoYW5nZSh0eXBlKTsKKyAgICAgICAgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKHR5cGUsIGZhbHNlKTsKICAgICAgICAgc2VuZENvbm5lY3RlZEJyb2FkY2FzdChpbmZvKTsKICAgICB9CiAKQEAgLTEzNjgsNyArMTU0OSw3IEBACiAgICAgICogYWNjb3JkaW5nIHRvIHdoaWNoIG5ldHdvcmtzIGFyZSBjb25uZWN0ZWQsIGFuZCBlbnN1cmluZyB0aGF0IHRoZQogICAgICAqIHJpZ2h0IHJvdXRpbmcgdGFibGUgZW50cmllcyBleGlzdC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKGludCBuZXRUeXBlKSB7CisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbm5lY3Rpdml0eUNoYW5nZShpbnQgbmV0VHlwZSwgYm9vbGVhbiBkb1Jlc2V0KSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIElmIGEgbm9uLWRlZmF1bHQgbmV0d29yayBpcyBlbmFibGVkLCBhZGQgdGhlIGhvc3Qgcm91dGVzIHRoYXQKICAgICAgICAgICogd2lsbCBhbGxvdyBpdCdzIEROUyBzZXJ2ZXJzIHRvIGJlIGFjY2Vzc2VkLgpAQCAtMTQwOCw2ICsxNTg5LDE3IEBACiAgICAgICAgICAgICAgICAgcmVtb3ZlUHJpdmF0ZURuc1JvdXRlcyhtTmV0VHJhY2tlcnNbbmV0VHlwZV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvUmVzZXQpIHsKKyAgICAgICAgICAgIExpbmtQcm9wZXJ0aWVzIGxpbmtQcm9wZXJ0aWVzID0gbU5ldFRyYWNrZXJzW25ldFR5cGVdLmdldExpbmtQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBpZiAobGlua1Byb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBpZmFjZSA9IGxpbmtQcm9wZXJ0aWVzLmdldEludGVyZmFjZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoaWZhY2UpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygicmVzZXRDb25uZWN0aW9ucygiICsgaWZhY2UgKyAiKSIpOworICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhpZmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFkZFByaXZhdGVEbnNSb3V0ZXMoTmV0d29ya1N0YXRlVHJhY2tlciBudCkgewpAQCAtMTU1MiwxMiArMTc0NCwxMiBAQAogCiAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSA2KSB7CiAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSAiL3N5cy9rZXJuZWwvaXB2NC90Y3BfIjsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWluIiwgdmFsdWVzWzBdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fZGVmIiwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWluIiwgdmFsdWVzWzNdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fZGVmIiwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5nVG9GaWxlKHByZWZpeCArICJybWVtX21pbiIsIHZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ1RvRmlsZShwcmVmaXggKyAicm1lbV9kZWYiLCB2YWx1ZXNbMV0pOworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdUb0ZpbGUocHJlZml4ICsgInJtZW1fbWF4IiwgdmFsdWVzWzJdKTsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5nVG9GaWxlKHByZWZpeCArICJ3bWVtX21pbiIsIHZhbHVlc1szXSk7CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ1RvRmlsZShwcmVmaXggKyAid21lbV9kZWYiLCB2YWx1ZXNbNF0pOworICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdUb0ZpbGUocHJlZml4ICsgIndtZW1fbWF4IiwgdmFsdWVzWzVdKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbG9nZSgiSW52YWxpZCBidWZmZXJzaXplIHN0cmluZzogIiArIGJ1ZmZlclNpemVzKTsKICAgICAgICAgICAgIH0KQEAgLTE1NjYsMjMgKzE3NTgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAvKioKLSAgICAgKiBXcml0ZXMgc3RyaW5nIHRvIGZpbGUuIEJhc2ljYWxseSBzYW1lIGFzICJlY2hvIC1uICRzdHJpbmcgPiAkZmlsZW5hbWUiCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsZW5hbWUKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdHJpbmdUb0ZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgc3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC53cml0ZShzdHJpbmcpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQogICAgIC8qKgogICAgICAqIEFkanVzdCB0aGUgcGVyLXByb2Nlc3MgZG5zIGVudHJpZXMgKG5ldC5kbnM8eD4uPHBpZD4pIGJhc2VkCiAgICAgICogb24gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgYWN0aXZlIG5ldCB3aGljaCB0aGlzIHByb2Nlc3MgcmVxdWVzdGVkLgpAQCAtMTg1MCw3ICsyMDI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBOZXR3b3JrU3RhdGVUcmFja2VyLkVWRU5UX0NPTkZJR1VSQVRJT05fQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAgICAgaW5mbyA9IChOZXR3b3JrSW5mbykgbXNnLm9iajsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKGluZm8uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29ubmVjdGl2aXR5Q2hhbmdlKGluZm8uZ2V0VHlwZSgpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9DTEVBUl9ORVRfVFJBTlNJVElPTl9XQUtFTE9DSzoKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNhdXNlZEJ5ID0gbnVsbDsKQEAgLTIyNTIsNiArMjQyNyw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGxvZ2UoU3RyaW5nIHMpIHsKICAgICAgICAgU2xvZy5lKFRBRywgcyk7CiAgICAgfQorCiAgICAgaW50IGNvbnZlcnRGZWF0dXJlVG9OZXR3b3JrVHlwZShTdHJpbmcgZmVhdHVyZSl7CiAgICAgICAgIGludCBuZXR3b3JrVHlwZSA9IC0xOwogICAgICAgICBpZiAoVGV4dFV0aWxzLmVxdWFscyhmZWF0dXJlLCBQaG9uZS5GRUFUVVJFX0VOQUJMRV9NTVMpKSB7CkBAIC0yMjcyLDQgKzI0NDgsODIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV0d29ya1R5cGU7CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgY2hlY2tOb3ROdWxsKFQgdmFsdWUsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3RlY3QgYSBzb2NrZXQgZnJvbSBWUE4gcm91dGluZyBydWxlcy4gVGhpcyBtZXRob2QgaXMgdXNlZCBieQorICAgICAqIFZwbkJ1aWxkZXIgYW5kIG5vdCBhdmFpbGFibGUgaW4gQ29ubmVjdGl2aXR5TWFuYWdlci4gUGVybWlzc2lvbgorICAgICAqIGNoZWNrcyBhcmUgZG9uZSBpbiBWcG4gY2xhc3MuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcm90ZWN0VnBuKFBhcmNlbEZpbGVEZXNjcmlwdG9yIHNvY2tldCkgeworICAgICAgICBtVnBuLnByb3RlY3Qoc29ja2V0LCBnZXREZWZhdWx0SW50ZXJmYWNlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGEgVlBOIGFwcGxpY2F0aW9uLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IFZwbkRpYWxvZ3MKKyAgICAgKiBhbmQgbm90IGF2YWlsYWJsZSBpbiBDb25uZWN0aXZpdHlNYW5hZ2VyLiBQZXJtaXNzaW9uIGNoZWNrcyBhcmUKKyAgICAgKiBkb25lIGluIFZwbiBjbGFzcy4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcHJlcGFyZVZwbihTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1WcG4ucHJlcGFyZShwYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGEgVFVOIGludGVyZmFjZSBhbmQgcmV0dXJuIGl0cyBmaWxlIGRlc2NyaXB0b3IuIFBhcmFtZXRlcnMKKyAgICAgKiBhcmUgZW5jb2RlZCBhbmQgb3BhcXVlIHRvIHRoaXMgY2xhc3MuIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgVnBuQnVpbGRlcgorICAgICAqIGFuZCBub3QgYXZhaWxhYmxlIGluIENvbm5lY3Rpdml0eU1hbmFnZXIuIFBlcm1pc3Npb24gY2hlY2tzIGFyZSBkb25lCisgICAgICogaW4gVnBuIGNsYXNzLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIGVzdGFibGlzaFZwbihWcG5Db25maWcgY29uZmlnKSB7CisgICAgICAgIHJldHVybiBtVnBuLmVzdGFibGlzaChjb25maWcpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRJbnRlcmZhY2UoKSB7CisgICAgICAgIGlmIChDb25uZWN0aXZpdHlNYW5hZ2VyLmlzTmV0d29ya1R5cGVWYWxpZChtQWN0aXZlRGVmYXVsdE5ldHdvcmspKSB7CisgICAgICAgICAgICBOZXR3b3JrU3RhdGVUcmFja2VyIHRyYWNrZXIgPSBtTmV0VHJhY2tlcnNbbUFjdGl2ZURlZmF1bHROZXR3b3JrXTsKKyAgICAgICAgICAgIGlmICh0cmFja2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gdHJhY2tlci5nZXRMaW5rUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0SW50ZXJmYWNlTmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBkZWZhdWx0IGludGVyZmFjZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGZvciBWUE4gc3Vic3lzdGVtLiBDdXJyZW50bHkgVlBOIGlzIG5vdCBhZGFwdGVkIHRvIHRoZSBzZXJ2aWNlCisgICAgICogdGhyb3VnaCBOZXR3b3JrU3RhdGVUcmFja2VyIHNpbmNlIGl0IHdvcmtzIGRpZmZlcmVudGx5LiBGb3IgZXhhbXBsZSwgaXQKKyAgICAgKiBuZWVkcyB0byBvdmVycmlkZSBETlMgc2VydmVycyBidXQgbmV2ZXIgdGFrZXMgdGhlIGRlZmF1bHQgcm91dGVzLiBJdAorICAgICAqIHJlbGllcyBvbiBhbm90aGVyIGRhdGEgbmV0d29yaywgYW5kIGl0IGNvdWxkIGtlZXAgZXhpc3RpbmcgY29ubmVjdGlvbnMKKyAgICAgKiBhbGl2ZSBhZnRlciByZWNvbm5lY3RpbmcsIHN3aXRjaGluZyBiZXR3ZWVuIG5ldHdvcmtzLCBvciBldmVuIHJlc3VtaW5nCisgICAgICogZnJvbSBkZWVwIHNsZWVwLiBDYWxscyBmcm9tIGFwcGxpY2F0aW9ucyBzaG91bGQgYmUgZG9uZSBzeW5jaHJvbm91c2x5CisgICAgICogdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLiBBcyB0aGVzZSBhcmUgYWxsIGhpZGRlbiBBUElzLCByZWZhY3RvcmluZyBjYW4KKyAgICAgKiBiZSBkb25lIHdoZW5ldmVyIGEgYmV0dGVyIGFic3RyYWN0aW9uIGlzIGRldmVsb3BlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgVnBuQ2FsbGJhY2sgeworCisgICAgICAgIHByaXZhdGUgVnBuQ2FsbGJhY2soKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb3ZlcnJpZGUoU3RyaW5nW10gZG5zU2VydmVycykgeworICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgRE5TIHNlcnZlcnMgYW5kIGh0dHAgcHJveHkuCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdG9yZSgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlc3RvcmUgVlBOIGNoYW5nZXMuCisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvRGV2aWNlUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA5MmQ3NmJlLi5kNTQ5MzA4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9EZXZpY2VQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0RldmljZVBvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTG93ZXJDYXNlID0gREVGX01JTklNVU1fUEFTU1dPUkRfTE9XRVJfQ0FTRTsKIAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFRl9NSU5JTVVNX1BBU1NXT1JEX0xFVFRFUlMgPSAxOwotICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTGV0dGVycyA9IERFRl9NSU5JTVVNX1BBU1NXT1JEX0xPV0VSX0NBU0U7CisgICAgICAgIGludCBtaW5pbXVtUGFzc3dvcmRMZXR0ZXJzID0gREVGX01JTklNVU1fUEFTU1dPUkRfTEVUVEVSUzsKIAogICAgICAgICBzdGF0aWMgZmluYWwgaW50IERFRl9NSU5JTVVNX1BBU1NXT1JEX05VTUVSSUMgPSAxOwogICAgICAgICBpbnQgbWluaW11bVBhc3N3b3JkTnVtZXJpYyA9IERFRl9NSU5JTVVNX1BBU1NXT1JEX05VTUVSSUM7CkBAIC0xNzIsNiArMTcyLDcgQEAKICAgICAgICAgbG9uZyBwYXNzd29yZEV4cGlyYXRpb25EYXRlID0gREVGX1BBU1NXT1JEX0VYUElSQVRJT05fREFURTsKIAogICAgICAgICBib29sZWFuIGVuY3J5cHRpb25SZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBkaXNhYmxlQ2FtZXJhID0gZmFsc2U7CiAKICAgICAgICAgLy8gVE9ETzogcmV2aWV3IGltcGxlbWVudGF0aW9uIGRlY2lzaW9ucyB3aXRoIGZyYW1ld29ya3MgdGVhbQogICAgICAgICBib29sZWFuIHNwZWNpZmllc0dsb2JhbFByb3h5ID0gZmFsc2U7CkBAIC0yNzQsNiArMjc1LDExIEBACiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKGVuY3J5cHRpb25SZXF1ZXN0ZWQpKTsKICAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJlbmNyeXB0aW9uLXJlcXVlc3RlZCIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpc2FibGVDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImRpc2FibGUtY2FtZXJhIik7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAidmFsdWUiLCBCb29sZWFuLnRvU3RyaW5nKGRpc2FibGVDYW1lcmEpKTsKKyAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsICJkaXNhYmxlLWNhbWVyYSIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdm9pZCByZWFkRnJvbVhtbChYbWxQdWxsUGFyc2VyIHBhcnNlcikKQEAgLTMzOSw2ICszNDUsOSBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImVuY3J5cHRpb24tcmVxdWVzdGVkIi5lcXVhbHModGFnKSkgewogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uUmVxdWVzdGVkID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkaXNhYmxlLWNhbWVyYSIuZXF1YWxzKHRhZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUNhbWVyYSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidmFsdWUiKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVua25vd24gYWRtaW4gdGFnOiAiICsgdGFnKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zOTMsNiArNDAyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJlbmNyeXB0aW9uUmVxdWVzdGVkPSIpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGVuY3J5cHRpb25SZXF1ZXN0ZWQpOworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImRpc2FibGVDYW1lcmE9Iik7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oZGlzYWJsZUNhbWVyYSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQyNCw2ICs0MzUsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZCkgewogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY0RldmljZUNhcGFiaWxpdGllc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICBzYXZlU2V0dGluZ3NMb2NrZWQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC01NzgsNiArNTkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFkbWluTGlzdC5yZW1vdmUoYWRtaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWRtaW5NYXAucmVtb3ZlKGFkbWluUmVjZWl2ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY0RldmljZUNhcGFiaWxpdGllc0xvY2tlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9Qcm94eUNsZWFudXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0R2xvYmFsUHJveHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODAxLDYgKzgxNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkT3duZXJMb2NrZWQoKTsKKyAgICAgICAgc3luY0RldmljZUNhcGFiaWxpdGllc0xvY2tlZCgpOwogCiAgICAgICAgIGxvbmcgdGltZU1zID0gZ2V0TWF4aW11bVRpbWVUb0xvY2sobnVsbCk7CiAgICAgICAgIGlmICh0aW1lTXMgPD0gMCkgewpAQCAtODQ0LDYgKzg1OCwyOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUHVzaGVzIGRvd24gcG9saWN5IGluZm9ybWF0aW9uIHRvIHRoZSBzeXN0ZW0gZm9yIGFueSBwb2xpY2llcyByZWxhdGVkIHRvIGdlbmVyYWwgZGV2aWNlCisgICAgICogY2FwYWJpbGl0aWVzIHRoYXQgbmVlZCB0byBiZSBlbmZvcmNlZCBieSBsb3dlciBsZXZlbCBzZXJ2aWNlcyAoZS5nLiBDYW1lcmEgc2VydmljZXMpLgorICAgICAqLworICAgIHZvaWQgc3luY0RldmljZUNhcGFiaWxpdGllc0xvY2tlZCgpIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBzdGF0dXMgb2YgdGhlIGNhbWVyYSBpcyBzeW5jZWQgZG93biB0byB0aGUgc3lzdGVtLiBJbnRlcmVzdGVkIG5hdGl2ZSBzZXJ2aWNlcworICAgICAgICAvLyBzaG91bGQgbW9uaXRvciB0aGlzIHZhbHVlIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICAgIGJvb2xlYW4gc3lzdGVtU3RhdGUgPSBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEJvb2xlYW4oU1lTVEVNX1BST1BfRElTQUJMRV9DQU1FUkEsIGZhbHNlKTsKKyAgICAgICAgYm9vbGVhbiBjYW1lcmFEaXNhYmxlZCA9IGdldENhbWVyYURpc2FibGVkKG51bGwpOworICAgICAgICBpZiAoY2FtZXJhRGlzYWJsZWQgIT0gc3lzdGVtU3RhdGUpIHsKKyAgICAgICAgICAgIGxvbmcgdG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY2FtZXJhRGlzYWJsZWQgPyAiMSIgOiAiMCI7CisgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIkNoYW5nZSBpbiBjYW1lcmEgc3RhdGUgWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgU1lTVEVNX1BST1BfRElTQUJMRV9DQU1FUkEgKyAiXSA9ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoU1lTVEVNX1BST1BfRElTQUJMRV9DQU1FUkEsIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgbG9hZFNldHRpbmdzTG9ja2VkKCk7CkBAIC0xOTI1LDkgKzE5NjEsOCBAQAogICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHBlcm1pc3Npb25zIGlmIGEgcGFydGljdWxhciBjYWxsZXIgaXMgc3BlY2lmaWVkCiAgICAgICAgICAgICBpZiAod2hvICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBXaGVuIGNoZWNraW5nIGZvciBhIHNpbmdsZSBjYWxsZXIsIHN0YXR1cyBpcyBiYXNlZCBvbiBjYWxsZXIncyByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pbkZvckNhbGxlckxvY2tlZCh3aG8sCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZG1pbkluZm8uVVNFU19FTkNSWVBURURfU1RPUkFHRSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFwLmVuY3J5cHRpb25SZXF1ZXN0ZWQ7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYXAgPSBnZXRBY3RpdmVBZG1pblVuY2hlY2tlZExvY2tlZCh3aG8pOworICAgICAgICAgICAgICAgIHJldHVybiBhcCAhPSBudWxsID8gYXAuZW5jcnlwdGlvblJlcXVlc3RlZCA6IGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBubyBwYXJ0aWN1bGFyIGNhbGxlciBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgYWdncmVnYXRlIHNldCBvZiByZXF1ZXN0cy4KQEAgLTE5ODMsNiArMjAxOCw1MyBAQAogICAgIHByaXZhdGUgdm9pZCBzZXRFbmNyeXB0aW9uUmVxdWVzdGVkKGJvb2xlYW4gZW5jcnlwdCkgewogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoZSBzeXN0ZW0gcHJvcGVydHkgdXNlZCB0byBzaGFyZSB0aGUgc3RhdGUgb2YgdGhlIGNhbWVyYS4gVGhlIG5hdGl2ZSBjYW1lcmEgc2VydmljZQorICAgICAqIGlzIGV4cGVjdGVkIHRvIHJlYWQgdGhpcyBwcm9wZXJ0eSBhbmQgYWN0IGFjY29yZGluZ2x5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9QUk9QX0RJU0FCTEVfQ0FNRVJBID0gInN5cy5zZWNwb2xpY3kuY2FtZXJhLmRpc2FibGVkIjsKKworICAgIC8qKgorICAgICAqIERpc2FibGVzIGFsbCBkZXZpY2UgY2FtZXJhcyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhZG1pbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYW1lcmFEaXNhYmxlZChDb21wb25lbnROYW1lIHdobywgYm9vbGVhbiBkaXNhYmxlZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQ29tcG9uZW50TmFtZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY3RpdmVBZG1pbiBhcCA9IGdldEFjdGl2ZUFkbWluRm9yQ2FsbGVyTG9ja2VkKHdobywKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlQWRtaW5JbmZvLlVTRVNfUE9MSUNZX0RJU0FCTEVfQ0FNRVJBKTsKKyAgICAgICAgICAgIGlmIChhcC5kaXNhYmxlQ2FtZXJhICE9IGRpc2FibGVkKSB7CisgICAgICAgICAgICAgICAgYXAuZGlzYWJsZUNhbWVyYSA9IGRpc2FibGVkOworICAgICAgICAgICAgICAgIHNhdmVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY0RldmljZUNhcGFiaWxpdGllc0xvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB3aGV0aGVyIG9yIG5vdCBhbGwgZGV2aWNlIGNhbWVyYXMgYXJlIGRpc2FibGVkIGZvciBhIGdpdmVuIGFkbWluLCBvciBkaXNhYmxlZCBmb3IgYW55CisgICAgICogYWN0aXZlIGFkbWlucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDYW1lcmFEaXNhYmxlZChDb21wb25lbnROYW1lIHdobykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmICh3aG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFjdGl2ZUFkbWluIGFkbWluID0gZ2V0QWN0aXZlQWRtaW5VbmNoZWNrZWRMb2NrZWQod2hvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGFkbWluICE9IG51bGwpID8gYWRtaW4uZGlzYWJsZUNhbWVyYSA6IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGRldmljZSBjYW1lcmEgaXMgZGlzYWJsZWQgZm9yIGFueSBhY3RpdmUgYWRtaW5zLgorICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtQWRtaW5MaXN0LnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQWN0aXZlQWRtaW4gYWRtaW4gPSBtQWRtaW5MaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRtaW4uZGlzYWJsZUNhbWVyYSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewogICAgICAgICBpZiAobUNvbnRleHQuY2hlY2tDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0lucHV0TWV0aG9kTWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBjOTYyNzNiLi5mYmRlOWQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9JbnB1dE1ldGhvZE1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvSW5wdXRNZXRob2RNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbnRlbnQuUGFja2FnZU1vbml0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuQXRvbWljRmlsZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVyQ2FsbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRmFzdFhtbFNlcmlhbGl6ZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRDb250ZXh0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSUlucHV0TWV0aG9kQ2FsbGJhY2s7CkBAIC0yNSwxMCArMjcsMTEgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC52aWV3LklJbnB1dE1ldGhvZE1hbmFnZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudmlldy5JSW5wdXRNZXRob2RTZXNzaW9uOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnZpZXcuSW5wdXRCaW5kUmVzdWx0OwotCiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLkV2ZW50TG9nVGFnczsKIAoraW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwpAQCAtMzcsOSArNDAsOSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkRpYWxvZ0ludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5EaWFsb2dJbnRlcmZhY2UuT25DYW5jZWxMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtNTEsNiArNTQsNyBAQAogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQuaW5wdXRtZXRob2RzZXJ2aWNlLklucHV0TWV0aG9kU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OwogaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwpAQCAtNjgsOSArNzIsMTAgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxydUNhY2hlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QcmludFdyaXRlclByaW50ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlByaW50ZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSVdpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm87CkBAIC04MCwxNSArODUsMTkgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuSW5wdXRNZXRob2RNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZFN1YnR5cGU7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIAogLyoqCkBAIC0xMzQsNiArMTQzLDcgQEAKICAgICBmaW5hbCBTdGF0dXNCYXJNYW5hZ2VyU2VydmljZSBtU3RhdHVzQmFyOwogICAgIGZpbmFsIElXaW5kb3dNYW5hZ2VyIG1JV2luZG93TWFuYWdlcjsKICAgICBmaW5hbCBIYW5kbGVyQ2FsbGVyIG1DYWxsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dE1ldGhvZEZpbGVNYW5hZ2VyIG1GaWxlTWFuYWdlcjsKIAogICAgIGZpbmFsIElucHV0QmluZFJlc3VsdCBtTm9CaW5kaW5nID0gbmV3IElucHV0QmluZFJlc3VsdChudWxsLCBudWxsLCAtMSk7CiAKQEAgLTQwNywxMCArNDE3LDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKGN1cklucHV0TWV0aG9kSWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dE1ldGhvZEluZm8gaW1pID0gbU1ldGhvZExpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltaS5nZXRJZCgpLmVxdWFscyhjdXJJbnB1dE1ldGhvZElkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltaUlkID0gaW1pLmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1pSWQuZXF1YWxzKGN1cklucHV0TWV0aG9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VySW0gPSBpbWk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFuZ2UgPSBpc1BhY2thZ2VEaXNhcHBlYXJpbmcoaW1pLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFja2FnZU1vZGlmaWVkKGltaS5nZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWxlTWFuYWdlci5kZWxldGVBbGxJbnB1dE1ldGhvZFN1YnR5cGVzKGltaUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgPT0gUEFDS0FHRV9URU1QT1JBUllfQ0hBTkdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5nZSA9PSBQQUNLQUdFX1BFUk1BTkVOVF9DSEFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiSW5wdXQgbWV0aG9kIHVuaW5zdGFsbGVkLCBkaXNhYmxpbmc6ICIKQEAgLTQ3MSw5ICs0ODYsMTEgQEAKICAgICAgICAgICAgIG1NZXRob2QgPSBtZXRob2Q7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZmluaXNoZWRFdmVudChpbnQgc2VxLCBib29sZWFuIGhhbmRsZWQpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlc3Npb25DcmVhdGVkKElJbnB1dE1ldGhvZFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBvblNlc3Npb25DcmVhdGVkKG1NZXRob2QsIHNlc3Npb24pOwogICAgICAgICB9CkBAIC00ODYsMTAgKzUwMywxNCBAQAogICAgICAgICBtSVdpbmRvd01hbmFnZXIgPSBJV2luZG93TWFuYWdlci5TdHViLmFzSW50ZXJmYWNlKAogICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSkpOwogICAgICAgICBtQ2FsbGVyID0gbmV3IEhhbmRsZXJDYWxsZXIoY29udGV4dCwgbmV3IEhhbmRsZXJDYWxsZXIuQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CisgICAgICAgICAgICBtRmlsZU1hbmFnZXIgPSBuZXcgSW5wdXRNZXRob2RGaWxlTWFuYWdlcihtTWV0aG9kTWFwKTsKKyAgICAgICAgfQogCiAgICAgICAgIChuZXcgTXlQYWNrYWdlTW9uaXRvcigpKS5yZWdpc3RlcihtQ29udGV4dCwgdHJ1ZSk7CiAKQEAgLTU2NiwxMiArNTg3LDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxJbnB1dE1ldGhvZEluZm8+IGdldElucHV0TWV0aG9kTGlzdCgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxJbnB1dE1ldGhvZEluZm8+KG1NZXRob2RMaXN0KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PElucHV0TWV0aG9kSW5mbz4gZ2V0RW5hYmxlZElucHV0TWV0aG9kTGlzdCgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CiAgICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzLmdldEVuYWJsZWRJbnB1dE1ldGhvZExpc3RMb2NrZWQoKTsKQEAgLTYwMiw2ICs2MjUsNyBAQAogICAgICAgICByZXR1cm4gSW5wdXRNZXRob2RTdWJ0eXBlLnNvcnQobUNvbnRleHQsIDAsIGltaSwgZW5hYmxlZFN1YnR5cGVzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+IGdldEVuYWJsZWRJbnB1dE1ldGhvZFN1YnR5cGVMaXN0KElucHV0TWV0aG9kSW5mbyBpbWksCiAgICAgICAgICAgICBib29sZWFuIGFsbG93c0ltcGxpY2l0bHlTZWxlY3RlZFN1YnR5cGVzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewpAQCAtNjA5LDYgKzYzMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRDbGllbnQoSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCwKICAgICAgICAgICAgIElJbnB1dENvbnRleHQgaW5wdXRDb250ZXh0LCBpbnQgdWlkLCBpbnQgcGlkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewpAQCAtNjE3LDYgKzY0Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZW1vdmVDbGllbnQoSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKICAgICAgICAgICAgIG1DbGllbnRzLnJlbW92ZShjbGllbnQuYXNCaW5kZXIoKSk7CkBAIC04NDAsNiArODY2LDcgQEAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0QmluZFJlc3VsdCBzdGFydElucHV0KElJbnB1dE1ldGhvZENsaWVudCBjbGllbnQsCiAgICAgICAgICAgICBJSW5wdXRDb250ZXh0IGlucHV0Q29udGV4dCwgRWRpdG9ySW5mbyBhdHRyaWJ1dGUsCiAgICAgICAgICAgICBib29sZWFuIGluaXRpYWwsIGJvb2xlYW4gbmVlZFJlc3VsdCkgewpAQCAtODU0LDkgKzg4MSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmluaXNoSW5wdXQoSUlucHV0TWV0aG9kQ2xpZW50IGNsaWVudCkgewogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKICAgICAgICAgICAgIGlmIChtQ3VySW50ZW50ICE9IG51bGwgJiYgbmFtZS5lcXVhbHMobUN1ckludGVudC5nZXRDb21wb25lbnQoKSkpIHsKQEAgLTk0Nyw2ICs5NzYsNyBAQAogICAgICAgICBtU3RhdHVzQmFyLnNldEljb25WaXNpYmlsaXR5KCJpbWUiLCBmYWxzZSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy52KFRBRywgIlNlcnZpY2UgZGlzY29ubmVjdGVkOiAiICsgbmFtZQpAQCAtMTAxMiw2ICsxMDQyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyU3VnZ2VzdGlvblNwYW5zRm9yTm90aWZpY2F0aW9uKFN1Z2dlc3Rpb25TcGFuW10gc3BhbnMpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTWV0aG9kTWFwKSB7CiAgICAgICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZEluZm8gY3VycmVudEltaSA9IG1NZXRob2RNYXAuZ2V0KG1DdXJNZXRob2RJZCk7CkBAIC0xMDI1LDYgKzEwNTYsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbm90aWZ5U3VnZ2VzdGlvblBpY2tlZChTdWdnZXN0aW9uU3BhbiBzcGFuLCBTdHJpbmcgb3JpZ2luYWxTdHJpbmcsIGludCBpbmRleCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKICAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kSW5mbyB0YXJnZXRJbWkgPSBtU2VjdXJlU3VnZ2VzdGlvblNwYW5zLmdldChzcGFuKTsKQEAgLTE0ODUsNiArMTUxNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW5wdXRNZXRob2RTdWJ0eXBlIGdldExhc3RJbnB1dE1ldGhvZFN1YnR5cGUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewogICAgICAgICAgICAgZmluYWwgUGFpcjxTdHJpbmcsIFN0cmluZz4gbGFzdEltZSA9IG1TZXR0aW5ncy5nZXRMYXN0SW5wdXRNZXRob2RBbmRTdWJ0eXBlTG9ja2VkKCk7CkBAIC0xNTAzLDYgKzE1MzYsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNldEFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVzKElCaW5kZXIgdG9rZW4sIElucHV0TWV0aG9kU3VidHlwZVtdIHN1YnR5cGVzKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IG1DdXJUb2tlbiAhPSB0b2tlbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzdWJ0eXBlcyA9PSBudWxsIHx8IHN1YnR5cGVzLmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgeworICAgICAgICAgICAgZmluYWwgSW5wdXRNZXRob2RJbmZvIGltaSA9IG1NZXRob2RNYXAuZ2V0KG1DdXJNZXRob2RJZCk7CisgICAgICAgICAgICBpZiAoaW1pID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGZpbmFsIGludCBOID0gc3VidHlwZXMubGVuZ3RoOworICAgICAgICAgICAgbUZpbGVNYW5hZ2VyLmFkZElucHV0TWV0aG9kU3VidHlwZXMobUN1ck1ldGhvZElkLCBzdWJ0eXBlcyk7CisgICAgICAgICAgICBidWlsZElucHV0TWV0aG9kTGlzdExvY2tlZChtTWV0aG9kTGlzdCwgbU1ldGhvZE1hcCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzZXRJbnB1dE1ldGhvZFdpdGhTdWJ0eXBlSWQoSUJpbmRlciB0b2tlbiwgU3RyaW5nIGlkLCBpbnQgc3VidHlwZUlkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewogICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKQEAgLTE3NDksNiArMTc5OCw4IEBACiAgICAgICAgICAgICAgICAgbmV3IEludGVudChJbnB1dE1ldGhvZC5TRVJWSUNFX0lOVEVSRkFDRSksCiAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CiAKKyAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPj4gYWRkaXRpb25hbFN1YnR5cGVzID0KKyAgICAgICAgICAgICAgICBtRmlsZU1hbmFnZXIuZ2V0QWxsQWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZXMoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgUmVzb2x2ZUluZm8gcmkgPSBzZXJ2aWNlcy5nZXQoaSk7CiAgICAgICAgICAgICBTZXJ2aWNlSW5mbyBzaSA9IHJpLnNlcnZpY2VJbmZvOwpAQCAtMTc2NCw3ICsxODE1LDcgQEAKICAgICAgICAgICAgIGlmIChERUJVRykgU2xvZy5kKFRBRywgIkNoZWNraW5nICIgKyBjb21wTmFtZSk7CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIHAgPSBuZXcgSW5wdXRNZXRob2RJbmZvKG1Db250ZXh0LCByaSk7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RJbmZvIHAgPSBuZXcgSW5wdXRNZXRob2RJbmZvKG1Db250ZXh0LCByaSwgYWRkaXRpb25hbFN1YnR5cGVzKTsKICAgICAgICAgICAgICAgICBsaXN0LmFkZChwKTsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBwLmdldElkKCk7CiAgICAgICAgICAgICAgICAgbWFwLnB1dChpZCwgcCk7CkBAIC0xODg1LDggKzE5MzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYW1lUmVzSWQgPSBzdWJ0eXBlLmdldE5hbWVSZXNJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2RlID0gc3VidHlwZS5nZXRNb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gVGV4dFV0aWxzLmNvbmNhdChwbS5nZXRUZXh0KGltaS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVSZXNJZCwgaW1pLmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBUZXh0VXRpbHMuY29uY2F0KHN1YnR5cGUuZ2V0RGlzcGxheU5hbWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWkuZ2V0UGFja2FnZU5hbWUoKSwgaW1pLmdldFNlcnZpY2VJbmZvKCkuYXBwbGljYXRpb25JbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVGV4dFV0aWxzLmlzRW1wdHkobGFiZWwpID8gIiIgOiAiICgiICsgbGFiZWwgKyAiKSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgbGFuZ3VhZ2UgPSBzdWJ0eXBlLmdldExvY2FsZSgpOwpAQCAtMjM5OSw2ICsyNDUwLDcgQEAKICAgICB9CiAKICAgICAvLyBUT0RPOiBXZSBzaG91bGQgY2hhbmdlIHRoZSByZXR1cm4gdHlwZSBmcm9tIExpc3QgdG8gTGlzdDxQYXJjZWxhYmxlPgorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0IGdldFNob3J0Y3V0SW5wdXRNZXRob2RzQW5kU3VidHlwZXMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobU1ldGhvZE1hcCkgewogICAgICAgICAgICAgQXJyYXlMaXN0PE9iamVjdD4gcmV0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CkBAIC0yODIxLDYgKzI4NzMsMjAwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnB1dE1ldGhvZEZpbGVNYW5hZ2VyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9QQVRIID0gInN5c3RlbSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9NRVRIT0RfUEFUSCA9ICJpbnB1dG1ldGhvZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRERJVElPTkFMX1NVQlRZUEVTX0ZJTEVfTkFNRSA9ICJzdWJ0eXBlcy54bWwiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9TVUJUWVBFUyA9ICJzdWJ0eXBlcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1NVQlRZUEUgPSAic3VidHlwZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0lNSSA9ICJpbWkiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JRCA9ICJpZCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xBQkVMID0gImxhYmVsIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUNPTiA9ICJpY29uIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU1FX1NVQlRZUEVfTE9DQUxFID0gImltZVN1YnR5cGVMb2NhbGUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JTUVfU1VCVFlQRV9NT0RFID0gImltZVN1YnR5cGVNb2RlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU1FX1NVQlRZUEVfRVhUUkFfVkFMVUUgPSAiaW1lU3VidHlwZUV4dHJhVmFsdWUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9JU19BVVhJTElBUlkgPSAiaXNBdXhpbGlhcnkiOworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ZpbGUgbUFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVGaWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnB1dE1ldGhvZEluZm8+IG1NZXRob2RNYXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPj4gbVN1YnR5cGVzTWFwID0KKyAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPj4oKTsKKyAgICAgICAgcHVibGljIElucHV0TWV0aG9kRmlsZU1hbmFnZXIoSGFzaE1hcDxTdHJpbmcsIElucHV0TWV0aG9kSW5mbz4gbWV0aG9kTWFwKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm1ldGhvZE1hcCBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTWV0aG9kTWFwID0gbWV0aG9kTWFwOworICAgICAgICAgICAgZmluYWwgRmlsZSBzeXN0ZW1EaXIgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXREYXRhRGlyZWN0b3J5KCksIFNZU1RFTV9QQVRIKTsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgaW5wdXRNZXRob2REaXIgPSBuZXcgRmlsZShzeXN0ZW1EaXIsIElOUFVUX01FVEhPRF9QQVRIKTsKKyAgICAgICAgICAgIGlmICghaW5wdXRNZXRob2REaXIubWtkaXJzKCkpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiQ291bGRuJ3QgY3JlYXRlIGRpci46ICIgKyBpbnB1dE1ldGhvZERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBGaWxlIHN1YnR5cGVGaWxlID0gbmV3IEZpbGUoaW5wdXRNZXRob2REaXIsIEFERElUSU9OQUxfU1VCVFlQRVNfRklMRV9OQU1FKTsKKyAgICAgICAgICAgIG1BZGRpdGlvbmFsSW5wdXRNZXRob2RTdWJ0eXBlRmlsZSA9IG5ldyBBdG9taWNGaWxlKHN1YnR5cGVGaWxlKTsKKyAgICAgICAgICAgIGlmICghc3VidHlwZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiAic3VidHlwZXMueG1sIiBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBibGFuayBmaWxlLgorICAgICAgICAgICAgICAgIHdyaXRlQWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZXMobVN1YnR5cGVzTWFwLCBtQWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RNYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWFkQWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZXMobVN1YnR5cGVzTWFwLCBtQWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZUZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbElucHV0TWV0aG9kU3VidHlwZXMoU3RyaW5nIGltaUlkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKKyAgICAgICAgICAgICAgICBtU3VidHlwZXNNYXAucmVtb3ZlKGltaUlkKTsKKyAgICAgICAgICAgICAgICB3cml0ZUFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVzKG1TdWJ0eXBlc01hcCwgbUFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGhvZE1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dE1ldGhvZFN1YnR5cGVzKAorICAgICAgICAgICAgICAgIFN0cmluZyBpbWlJZCwgSW5wdXRNZXRob2RTdWJ0eXBlW10gYWRkaXRpb25hbFN1YnR5cGVzKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPiBzdWJ0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPigpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gYWRkaXRpb25hbFN1YnR5cGVzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47ICsraSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dE1ldGhvZFN1YnR5cGUgc3VidHlwZSA9IGFkZGl0aW9uYWxTdWJ0eXBlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJ0eXBlcy5jb250YWlucyhzdWJ0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZXMuYWRkKHN1YnR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdWJ0eXBlc01hcC5wdXQoaW1pSWQsIHN1YnR5cGVzKTsKKyAgICAgICAgICAgICAgICB3cml0ZUFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVzKG1TdWJ0eXBlc01hcCwgbUFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGhvZE1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIExpc3Q8SW5wdXRNZXRob2RTdWJ0eXBlPj4gZ2V0QWxsQWRkaXRpb25hbElucHV0TWV0aG9kU3VidHlwZXMoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1NZXRob2RNYXApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN1YnR5cGVzTWFwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVzKAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBMaXN0PElucHV0TWV0aG9kU3VidHlwZT4+IGFsbFN1YnR5cGVzLCBBdG9taWNGaWxlIHN1YnR5cGVzRmlsZSwKKyAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgSW5wdXRNZXRob2RJbmZvPiBtZXRob2RNYXApIHsKKyAgICAgICAgICAgIC8vIFNhZmV0eSBuZXQgZm9yIHRoZSBjYXNlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIG1ldGhvZE1hcCBpcyBzZXQuCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzU2V0TWV0aG9kTWFwID0gbWV0aG9kTWFwICE9IG51bGwgJiYgbWV0aG9kTWFwLnNpemUoKSA+IDA7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvcyA9IHN1YnR5cGVzRmlsZS5zdGFydFdyaXRlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgWG1sU2VyaWFsaXplciBvdXQgPSBuZXcgRmFzdFhtbFNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgICAgICBvdXQuc2V0T3V0cHV0KGZvcywgInV0Zi04Iik7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0RG9jdW1lbnQobnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3V0LnNldEZlYXR1cmUoImh0dHA6Ly94bWxwdWxsLm9yZy92MS9kb2MvZmVhdHVyZXMuaHRtbCNpbmRlbnQtb3V0cHV0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3V0LnN0YXJ0VGFnKG51bGwsIE5PREVfU1VCVFlQRVMpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGltaUlkIDogYWxsU3VidHlwZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2V0TWV0aG9kTWFwICYmICFtZXRob2RNYXAuY29udGFpbnNLZXkoaW1pSWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSU1FIHVuaW5zdGFsbGVkIG9yIG5vdCB2YWxpZC46ICIgKyBpbWlJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgTk9ERV9JTUkpOworICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIEFUVFJfSUQsIGltaUlkKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+IHN1YnR5cGVzTGlzdCA9IGFsbFN1YnR5cGVzLmdldChpbWlJZCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gc3VidHlwZXNMaXN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0gc3VidHlwZXNMaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCBOT0RFX1NVQlRZUEUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCBBVFRSX0lDT04sIFN0cmluZy52YWx1ZU9mKHN1YnR5cGUuZ2V0SWNvblJlc0lkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgQVRUUl9MQUJFTCwgU3RyaW5nLnZhbHVlT2Yoc3VidHlwZS5nZXROYW1lUmVzSWQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCBBVFRSX0lNRV9TVUJUWVBFX0xPQ0FMRSwgc3VidHlwZS5nZXRMb2NhbGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIEFUVFJfSU1FX1NVQlRZUEVfTU9ERSwgc3VidHlwZS5nZXRNb2RlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCBBVFRSX0lNRV9TVUJUWVBFX0VYVFJBX1ZBTFVFLCBzdWJ0eXBlLmdldEV4dHJhVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIEFUVFJfSVNfQVVYSUxJQVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihzdWJ0eXBlLmlzQXV4aWxpYXJ5KCkgPyAxIDogMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCBOT0RFX1NVQlRZUEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgTk9ERV9JTUkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsIE5PREVfU1VCVFlQRVMpOworICAgICAgICAgICAgICAgIG91dC5lbmREb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHN1YnR5cGVzRmlsZS5maW5pc2hXcml0ZShmb3MpOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkVycm9yIHdyaXRpbmcgc3VidHlwZXMiLCBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VidHlwZXNGaWxlLmZhaWxXcml0ZShmb3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZEFkZGl0aW9uYWxJbnB1dE1ldGhvZFN1YnR5cGVzKAorICAgICAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBMaXN0PElucHV0TWV0aG9kU3VidHlwZT4+IGFsbFN1YnR5cGVzLCBBdG9taWNGaWxlIHN1YnR5cGVzRmlsZSkgeworICAgICAgICAgICAgaWYgKGFsbFN1YnR5cGVzID09IG51bGwgfHwgc3VidHlwZXNGaWxlID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIGFsbFN1YnR5cGVzLmNsZWFyKCk7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlzID0gc3VidHlwZXNGaWxlLm9wZW5SZWFkKCk7CisgICAgICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChmaXMsIG51bGwpOworICAgICAgICAgICAgICAgIGludCB0eXBlID0gcGFyc2VyLmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgICAgIC8vIFNraXAgcGFyc2luZyB1bnRpbCBTVEFSVF9UQUcKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHR5cGUgPSBwYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRworICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkge30KKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlyc3ROb2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCFOT0RFX1NVQlRZUEVTLmVxdWFscyhmaXJzdE5vZGVOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbigiWG1sIGRvZXNuJ3Qgc3RhcnQgd2l0aCBzdWJ0eXBlcyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVwdGggPXBhcnNlci5nZXREZXB0aCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50SW1pSWQgPSBudWxsOworICAgICAgICAgICAgICAgIEFycmF5TGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+IHRlbXBTdWJ0eXBlc0FycmF5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJzZXIuZ2V0RGVwdGgoKSA+IGRlcHRoKSAmJiB0eXBlICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFhtbFB1bGxQYXJzZXIuU1RBUlRfVEFHKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBub2RlTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChOT0RFX0lNSS5lcXVhbHMobm9kZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50SW1pSWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgQVRUUl9JRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoY3VycmVudEltaUlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJJbnZhbGlkIGltaSBpZCBmb3VuZCBpbiBzdWJ0eXBlcy54bWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdWJ0eXBlc0FycmF5ID0gbmV3IEFycmF5TGlzdDxJbnB1dE1ldGhvZFN1YnR5cGU+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxTdWJ0eXBlcy5wdXQoY3VycmVudEltaUlkLCB0ZW1wU3VidHlwZXNBcnJheSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTk9ERV9TVUJUWVBFLmVxdWFscyhub2RlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShjdXJyZW50SW1pSWQpIHx8IHRlbXBTdWJ0eXBlc0FycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiSU1FIHVuaW5zdGFsbGVkIG9yIG5vdCB2YWxpZC46ICIgKyBjdXJyZW50SW1pSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGljb24gPSBJbnRlZ2VyLnZhbHVlT2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSX0lDT04pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsYWJlbCA9IEludGVnZXIudmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJfTEFCRUwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbWVTdWJ0eXBlTG9jYWxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJfSU1FX1NVQlRZUEVfTE9DQUxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbWVTdWJ0eXBlTW9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBBVFRSX0lNRV9TVUJUWVBFX01PREUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGltZVN1YnR5cGVFeHRyYVZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIEFUVFJfSU1FX1NVQlRZUEVfRVhUUkFfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0F1eGlsaWFyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4udmFsdWVPZihwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgQVRUUl9JU19BVVhJTElBUlkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0TWV0aG9kU3VidHlwZSBzdWJ0eXBlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0TWV0aG9kU3VidHlwZShsYWJlbCwgaWNvbiwgaW1lU3VidHlwZUxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWVTdWJ0eXBlTW9kZSwgaW1lU3VidHlwZUV4dHJhVmFsdWUsIGlzQXV4aWxpYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdWJ0eXBlc0FycmF5LmFkZChzdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJFcnJvciByZWFkaW5nIHN1YnR5cGVzOiAiICsgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkVycm9yIHJlYWRpbmcgc3VidHlwZXM6ICIgKyBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJFcnJvciByZWFkaW5nIHN1YnR5cGVzOiAiICsgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoZmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHRvIGNsb3NlLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Nb3VudFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCmluZGV4IGY3OGRjYTkuLmQzMjQ0ZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL01vdW50U2VydmljZS5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKQEAgLTE1Miw3ICsxNTMsNiBAQAogICAgICAgICAgKiA2MDAgc2VyaWVzIC0gVW5zb2xpY2l0ZWQgYnJvYWRjYXN0cy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZvbHVtZVN0YXRlQ2hhbmdlICAgICAgICAgICAgICA9IDYwNTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU2hhcmVBdmFpbGFiaWxpdHlDaGFuZ2UgICAgICAgID0gNjIwOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWb2x1bWVEaXNrSW5zZXJ0ZWQgICAgICAgICAgICAgPSA2MzA7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZvbHVtZURpc2tSZW1vdmVkICAgICAgICAgICAgICA9IDYzMTsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVm9sdW1lQmFkUmVtb3ZhbCAgICAgICAgICAgICAgID0gNjMyOwpAQCAtMTY3LDYgKzE2Nyw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FeHRlcm5hbFN0b3JhZ2VQYXRoOwogICAgIHByaXZhdGUgUGFja2FnZU1hbmFnZXJTZXJ2aWNlICAgICAgICAgICAgICAgICBtUG1zOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVW1zRW5hYmxpbmc7CisgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VbXNBdmFpbGFibGUgPSBmYWxzZTsKICAgICAvLyBVc2VkIGFzIGEgbG9jayBmb3IgbWV0aG9kcyB0aGF0IHJlZ2lzdGVyL3VucmVnaXN0ZXIgbGlzdGVuZXJzLgogICAgIGZpbmFsIHByaXZhdGUgQXJyYXlMaXN0PE1vdW50U2VydmljZUJpbmRlckxpc3RlbmVyPiBtTGlzdGVuZXJzID0KICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8TW91bnRTZXJ2aWNlQmluZGVyTGlzdGVuZXI+KCk7CkBAIC01MjUsNiArNTI2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9LnN0YXJ0KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoVXNiTWFuYWdlci5BQ1RJT05fVVNCX1NUQVRFKSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gYXZhaWxhYmxlID0gKGludGVudC5nZXRCb29sZWFuRXh0cmEoVXNiTWFuYWdlci5VU0JfQ09OTkVDVEVELCBmYWxzZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCb29sZWFuRXh0cmEoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fTUFTU19TVE9SQUdFLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIG5vdGlmeVNoYXJlQXZhaWxhYmlsaXR5Q2hhbmdlKGF2YWlsYWJsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwpAQCAtNjU0LDEyICs2NTksNiBAQAogICAgICAgICAgICAgICAgICAgICB1cGRhdGVQdWJsaWNWb2x1bWVTdGF0ZShtRXh0ZXJuYWxTdG9yYWdlUGF0aCwgRW52aXJvbm1lbnQuTUVESUFfUkVNT1ZFRCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdmFpbCA9IGRvR2V0U2hhcmVNZXRob2RBdmFpbGFibGUoInVtcyIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlTaGFyZUF2YWlsYWJpbGl0eUNoYW5nZSgidW1zIiwgYXZhaWwpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiRmFpbGVkIHRvIGdldCBzaGFyZSBhdmFpbGFiaWxpdHkiKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBOb3cgdGhhdCB3ZSd2ZSBkb25lIG91ciBpbml0aWFsaXphdGlvbiwgcmVsZWFzZQogICAgICAgICAgICAgICAgICAqIHRoZSBob3VuZHMhCkBAIC02OTQsMTMgKzY5Myw2IEBACiAgICAgICAgICAgICBub3RpZnlWb2x1bWVTdGF0ZUNoYW5nZSgKICAgICAgICAgICAgICAgICAgICAgY29va2VkWzJdLCBjb29rZWRbM10sIEludGVnZXIucGFyc2VJbnQoY29va2VkWzddKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGNvb2tlZFsxMF0pKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IFZvbGRSZXNwb25zZUNvZGUuU2hhcmVBdmFpbGFiaWxpdHlDaGFuZ2UpIHsKLSAgICAgICAgICAgIC8vIEZNVDogTk5OIFNoYXJlIG1ldGhvZCA8bWV0aG9kPiBub3cgPGF2YWlsYWJsZXx1bmF2YWlsYWJsZT4KLSAgICAgICAgICAgIGJvb2xlYW4gYXZhaWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjb29rZWRbNV0uZXF1YWxzKCJhdmFpbGFibGUiKSkgewotICAgICAgICAgICAgICAgIGF2YWlsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeVNoYXJlQXZhaWxhYmlsaXR5Q2hhbmdlKGNvb2tlZFszXSwgYXZhaWwpOwogICAgICAgICB9IGVsc2UgaWYgKChjb2RlID09IFZvbGRSZXNwb25zZUNvZGUuVm9sdW1lRGlza0luc2VydGVkKSB8fAogICAgICAgICAgICAgICAgICAgIChjb2RlID09IFZvbGRSZXNwb25zZUNvZGUuVm9sdW1lRGlza1JlbW92ZWQpIHx8CiAgICAgICAgICAgICAgICAgICAgKGNvZGUgPT0gVm9sZFJlc3BvbnNlQ29kZS5Wb2x1bWVCYWRSZW1vdmFsKSkgewpAQCAtODM1LDQyICs4MjcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGRvR2V0U2hhcmVNZXRob2RBdmFpbGFibGUoU3RyaW5nIG1ldGhvZCkgewotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiByc3A7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByc3AgPSBtQ29ubmVjdG9yLmRvQ29tbWFuZCgic2hhcmUgc3RhdHVzICIgKyBtZXRob2QpOwotICAgICAgICB9IGNhdGNoIChOYXRpdmVEYWVtb25Db25uZWN0b3JFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgc2hhcmUgbWV0aG9kICIgKyBtZXRob2QgKyAiIGlzIGF2YWlsYWJsZS4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiByc3ApIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHRvayA9IGxpbmUuc3BsaXQoIiAiKTsKLSAgICAgICAgICAgIGlmICh0b2subGVuZ3RoIDwgMykgewotICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJNYWxmb3JtZWQgcmVzcG9uc2UgdG8gc2hhcmUgc3RhdHVzICIgKyBtZXRob2QpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNvZGU7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHRva1swXSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiRXJyb3IgcGFyc2luZyBjb2RlICVzIiwgdG9rWzBdKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvZGUgPT0gVm9sZFJlc3BvbnNlQ29kZS5TaGFyZVN0YXR1c1Jlc3VsdCkgewotICAgICAgICAgICAgICAgIGlmICh0b2tbMl0uZXF1YWxzKCJhdmFpbGFibGUiKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCBTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGNvZGUgJWQiLCBjb2RlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFNsb2cuZShUQUcsICJHb3QgYW4gZW1wdHkgcmVzcG9uc2UiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IGRvTW91bnRWb2x1bWUoU3RyaW5nIHBhdGgpIHsKICAgICAgICAgaW50IHJjID0gU3RvcmFnZVJlc3VsdENvZGUuT3BlcmF0aW9uU3VjY2VlZGVkOwogCkBAIC0xMDE4LDEzICs5NzQsOSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNoYXJlQXZhaWxhYmlsaXR5Q2hhbmdlKFN0cmluZyBtZXRob2QsIGZpbmFsIGJvb2xlYW4gYXZhaWwpIHsKLSAgICAgICAgaWYgKCFtZXRob2QuZXF1YWxzKCJ1bXMiKSkgewotICAgICAgICAgICBTbG9nLncoVEFHLCAiSWdub3JpbmcgdW5zdXBwb3J0ZWQgc2hhcmUgbWV0aG9kIHsiICsgbWV0aG9kICsgIn0iKTsKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5U2hhcmVBdmFpbGFiaWxpdHlDaGFuZ2UoZmluYWwgYm9vbGVhbiBhdmFpbCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1MaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIG1VbXNBdmFpbGFibGUgPSBhdmFpbDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtTGlzdGVuZXJzLnNpemUoKSAtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICBNb3VudFNlcnZpY2VCaW5kZXJMaXN0ZW5lciBibCA9IG1MaXN0ZW5lcnMuZ2V0KGkpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0xMTIxLDE2ICsxMDczLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHlsZWFibGUuU3RvcmFnZV9lbXVsYXRlZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBpbnQgbXRwUmVzZXJ2ZSA9IGEuZ2V0SW50KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlN0b3JhZ2VfbXRwUmVzZXJ2ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYWxsb3dNYXNzU3RvcmFnZSA9IGEuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlYWJsZS5TdG9yYWdlX2FsbG93TWFzc1N0b3JhZ2UsIGZhbHNlKTsKIAogICAgICAgICAgICAgICAgICAgICBTbG9nLmQoVEFHLCAiZ290IHN0b3JhZ2UgcGF0aDogIiArIHBhdGggKyAiIGRlc2NyaXB0aW9uOiAiICsgZGVzY3JpcHRpb24gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcHJpbWFyeTogIiArIHByaW1hcnkgKyAiIHJlbW92YWJsZTogIiArIHJlbW92YWJsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlbXVsYXRlZDogIiArIGVtdWxhdGVkICsgICIgbXRwUmVzZXJ2ZTogIiArIG10cFJlc2VydmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZW11bGF0ZWQ6ICIgKyBlbXVsYXRlZCArICAiIG10cFJlc2VydmU6ICIgKyBtdHBSZXNlcnZlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFsbG93TWFzc1N0b3JhZ2U6ICIgKyBhbGxvd01hc3NTdG9yYWdlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCB8fCBkZXNjcmlwdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAicGF0aCBvciBkZXNjcmlwdGlvbiBpcyBudWxsIGluIHJlYWRTdG9yYWdlTGlzdCIpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBwYXRoLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVm9sdW1lIHZvbHVtZSA9IG5ldyBTdG9yYWdlVm9sdW1lKHBhdGhTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCksIHJlbW92YWJsZSwgZW11bGF0ZWQsIG10cFJlc2VydmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi50b1N0cmluZygpLCByZW1vdmFibGUsIGVtdWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdHBSZXNlcnZlLCBhbGxvd01hc3NTdG9yYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmltYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5Vm9sdW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlWb2x1bWUgPSB2b2x1bWU7CkBAIC0xMTg1LDggKzExNDEsMTMgQEAKICAgICAgICAgLy8gWFhYOiBUaGlzIHdpbGwgZ28gYXdheSBzb29uIGluIGZhdm9yIG9mIElNb3VudFNlcnZpY2VPYnNlcnZlcgogICAgICAgICBtUG1zID0gKFBhY2thZ2VNYW5hZ2VyU2VydmljZSkgU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgicGFja2FnZSIpOwogCi0gICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLAotICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9CT09UX0NPTVBMRVRFRCksIG51bGwsIG51bGwpOworICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOworICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fQk9PVF9DT01QTEVURUQpOworICAgICAgICAvLyBkb24ndCBib3RoZXIgbW9uaXRvcmluZyBVU0IgaWYgbWFzcyBzdG9yYWdlIGlzIG5vdCBzdXBwb3J0ZWQgb24gb3VyIHByaW1hcnkgdm9sdW1lCisgICAgICAgIGlmIChtUHJpbWFyeVZvbHVtZSAhPSBudWxsICYmIG1QcmltYXJ5Vm9sdW1lLmFsbG93TWFzc1N0b3JhZ2UoKSkgeworICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihVc2JNYW5hZ2VyLkFDVElPTl9VU0JfU1RBVEUpOworICAgICAgICB9CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJyb2FkY2FzdFJlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG51bGwpOwogCiAgICAgICAgIG1IYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIk1vdW50U2VydmljZSIpOwogICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOwpAQCAtMTMxOSw3ICsxMjgwLDkgQEAKICAgICAgICAgaWYgKGdldFVtc0VuYWJsaW5nKCkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkb0dldFNoYXJlTWV0aG9kQXZhaWxhYmxlKCJ1bXMiKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTGlzdGVuZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gbVVtc0F2YWlsYWJsZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFVzYk1hc3NTdG9yYWdlRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewpAQCAtMTQxNSw3ICsxMzc4LDcgQEAKICAgICAgICAgcmV0dXJuIGRvRm9ybWF0Vm9sdW1lKHBhdGgpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgW11nZXRTdG9yYWdlVXNlcnMoU3RyaW5nIHBhdGgpIHsKKyAgICBwdWJsaWMgaW50W10gZ2V0U3RvcmFnZVVzZXJzKFN0cmluZyBwYXRoKSB7CiAgICAgICAgIHZhbGlkYXRlUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTU9VTlRfVU5NT1VOVF9GSUxFU1lTVEVNUyk7CiAgICAgICAgIHdhaXRGb3JSZWFkeSgpOwogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0U3RhdFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldFN0YXRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTY3NDMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0U3RhdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0czsKLWltcG9ydCBhbmRyb2lkLm9zLklOZXRTdGF0U2VydmljZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgTmV0U3RhdFNlcnZpY2UgZXh0ZW5kcyBJTmV0U3RhdFNlcnZpY2UuU3R1YiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotCi0gICAgcHVibGljIE5ldFN0YXRTZXJ2aWNlKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TW9iaWxlVHhQYWNrZXRzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldE1vYmlsZVR4UGFja2V0cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE1vYmlsZVJ4UGFja2V0cygpIHsKLSAgICAgICAgcmV0dXJuIFRyYWZmaWNTdGF0cy5nZXRNb2JpbGVSeFBhY2tldHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNb2JpbGVUeEJ5dGVzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldE1vYmlsZVR4Qnl0ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRNb2JpbGVSeEJ5dGVzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldE1vYmlsZVJ4Qnl0ZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFR4UGFja2V0cygpIHsKLSAgICAgICAgcmV0dXJuIFRyYWZmaWNTdGF0cy5nZXRUb3RhbFR4UGFja2V0cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRvdGFsUnhQYWNrZXRzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldFRvdGFsUnhQYWNrZXRzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0VG90YWxUeEJ5dGVzKCkgewotICAgICAgICByZXR1cm4gVHJhZmZpY1N0YXRzLmdldFRvdGFsVHhCeXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRvdGFsUnhCeXRlcygpIHsKLSAgICAgICAgcmV0dXJuIFRyYWZmaWNTdGF0cy5nZXRUb3RhbFJ4Qnl0ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgewotICAgICAgICAvLyBUaGlzIGRhdGEgaXMgYWNjZXNzaWJsZSB0byBhbnkgYXBwIC0tIG5vIHBlcm1pc3Npb24gY2hlY2sgbmVlZGVkLgotCi0gICAgICAgIHB3LnByaW50KCJFbGFwc2VkOiB0b3RhbD0iKTsKLSAgICAgICAgcHcucHJpbnQoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOwotICAgICAgICBwdy5wcmludCgibXMgYXdha2U9Iik7Ci0gICAgICAgIHB3LnByaW50KFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKLSAgICAgICAgcHcucHJpbnRsbigibXMiKTsKLQotICAgICAgICBwdy5wcmludCgiTW9iaWxlOiBUeD0iKTsKLSAgICAgICAgcHcucHJpbnQoZ2V0TW9iaWxlVHhCeXRlcygpKTsKLSAgICAgICAgcHcucHJpbnQoIkIvIik7Ci0gICAgICAgIHB3LnByaW50KGdldE1vYmlsZVR4UGFja2V0cygpKTsKLSAgICAgICAgcHcucHJpbnQoIlBrdHMgUng9Iik7Ci0gICAgICAgIHB3LnByaW50KGdldE1vYmlsZVJ4Qnl0ZXMoKSk7Ci0gICAgICAgIHB3LnByaW50KCJCLyIpOwotICAgICAgICBwdy5wcmludChnZXRNb2JpbGVSeFBhY2tldHMoKSk7Ci0gICAgICAgIHB3LnByaW50bG4oIlBrdHMiKTsKLQotICAgICAgICBwdy5wcmludCgiVG90YWw6IFR4PSIpOwotICAgICAgICBwdy5wcmludChnZXRUb3RhbFR4Qnl0ZXMoKSk7Ci0gICAgICAgIHB3LnByaW50KCJCLyIpOwotICAgICAgICBwdy5wcmludChnZXRUb3RhbFR4UGFja2V0cygpKTsKLSAgICAgICAgcHcucHJpbnQoIlBrdHMgUng9Iik7Ci0gICAgICAgIHB3LnByaW50KGdldFRvdGFsUnhCeXRlcygpKTsKLSAgICAgICAgcHcucHJpbnQoIkIvIik7Ci0gICAgICAgIHB3LnByaW50KGdldFRvdGFsUnhQYWNrZXRzKCkpOwotICAgICAgICBwdy5wcmludGxuKCJQa3RzIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuamF2YQppbmRleCA4ZjE3OWY1Li5kNjcwNGY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuamF2YQpAQCAtMTYsNiArMTYsMTAgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CiAKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzLklGQUNFX0FMTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzLlRBR19OT05FOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdHMuVUlEX0FMTDsKKwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya01hbmFnZW1lbnRFdmVudE9ic2VydmVyOwpAQCAtMzcsNiArNDEsNyBAQAogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LkluZXQ0QWRkcmVzczsKQEAgLTU5LDggKzY0LDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFID0gMjsKIAotICAgIC8qKiBCYXNlIHBhdGggdG8gVUlELWdyYW51bGFyaXR5IG5ldHdvcmsgc3RhdGlzdGljcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIFBBVEhfUFJPQ19VSURfU1RBVCA9IG5ldyBGaWxlKCIvcHJvYy91aWRfc3RhdCIpOworICAgIEBEZXByZWNhdGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBTVEFUU19VSURTVEFUID0gbmV3IEZpbGUoIi9wcm9jL3VpZF9zdGF0Iik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBTVEFUU19ORVRGSUxURVIgPSBuZXcgRmlsZSgiL3Byb2MvbmV0L3h0X3F0YWd1aWQvc3RhdHMiKTsKIAogICAgIGNsYXNzIE5ldGRSZXNwb25zZUNvZGUgewogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlcmZhY2VMaXN0UmVzdWx0ICAgICAgID0gMTEwOwpAQCAtMzExLDYgKzMxNywxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogVE9ETzogVGhpcyBpcyByaWdodCBub3cgYSBJUHY0IG9ubHkgZnVuY3Rpb24uIFdvcmtzIGZvciB3aWZpIHdoaWNoIGxvc2VzIGl0cworICAgICAgIElQdjYgYWRkcmVzc2VzIG9uIGludGVyZmFjZSBkb3duLCBidXQgd2UgbmVlZCB0byBkbyBmdWxsIGNsZWFuIHVwIGhlcmUgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckludGVyZmFjZUFkZHJlc3NlcyhTdHJpbmcgaWZhY2UpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgU3RyaW5nIGNtZCA9IFN0cmluZy5mb3JtYXQoImludGVyZmFjZSBjbGVhcmFkZHJzICVzIiwgaWZhY2UpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbm5lY3Rvci5kb0NvbW1hbmQoY21kKTsKKyAgICAgICAgfSBjYXRjaCAoTmF0aXZlRGFlbW9uQ29ubmVjdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBuYXRpdmUgZGFlbW9uIHRvIGludGVyZmFjZSBjbGVhcmFsbGlwcyAtICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGFkZFJvdXRlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBSb3V0ZUluZm8gcm91dGUpIHsKICAgICAgICAgbW9kaWZ5Um91dGUoaW50ZXJmYWNlTmFtZSwgQURELCByb3V0ZSk7CiAgICAgfQpAQCAtODgyLDE2ICs5MDAsMTUgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUsICJOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UiKTsKIAogICAgICAgICBmaW5hbCBTdHJpbmdbXSBpZmFjZXMgPSBsaXN0SW50ZXJmYWNlcygpOwotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMuQnVpbGRlciBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMuQnVpbGRlcigKLSAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSwgaWZhY2VzLmxlbmd0aCk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCksIGlmYWNlcy5sZW5ndGgpOwogCiAgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogaWZhY2VzKSB7CiAgICAgICAgICAgICBmaW5hbCBsb25nIHJ4ID0gZ2V0SW50ZXJmYWNlQ291bnRlcihpZmFjZSwgdHJ1ZSk7CiAgICAgICAgICAgICBmaW5hbCBsb25nIHR4ID0gZ2V0SW50ZXJmYWNlQ291bnRlcihpZmFjZSwgZmFsc2UpOwotICAgICAgICAgICAgc3RhdHMuYWRkRW50cnkoaWZhY2UsIE5ldHdvcmtTdGF0cy5VSURfQUxMLCByeCwgdHgpOworICAgICAgICAgICAgc3RhdHMuYWRkRW50cnkoaWZhY2UsIFVJRF9BTEwsIFRBR19OT05FLCByeCwgdHgpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHN0YXRzLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBzdGF0czsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTg5OSwxNiArOTE2LDExIEBACiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUsICJOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UiKTsKIAotICAgICAgICBmaW5hbCBTdHJpbmdbXSBrbm93blVpZHMgPSBQQVRIX1BST0NfVUlEX1NUQVQubGlzdCgpOwotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMuQnVpbGRlciBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMuQnVpbGRlcigKLSAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSwga25vd25VaWRzLmxlbmd0aCk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgdWlkIDoga25vd25VaWRzKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdWlkSW50ID0gSW50ZWdlci5wYXJzZUludCh1aWQpOwotICAgICAgICAgICAgY29sbGVjdE5ldHdvcmtTdGF0c0RldGFpbChzdGF0cywgdWlkSW50KTsKKyAgICAgICAgaWYgKFNUQVRTX05FVEZJTFRFUi5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldE5ldHdvcmtTdGF0c0RldGFpbE5ldGZpbHRlcihVSURfQUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBnZXROZXR3b3JrU3RhdHNEZXRhaWxVaWRzdGF0KFVJRF9BTEwpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRzLmJ1aWxkKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05MTgsMjAgKzkzMCw4NCBAQAogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQUNDRVNTX05FVFdPUktfU1RBVEUsICJOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UiKTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cy5CdWlsZGVyIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0cy5CdWlsZGVyKAotICAgICAgICAgICAgICAgIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLCAxKTsKLSAgICAgICAgY29sbGVjdE5ldHdvcmtTdGF0c0RldGFpbChzdGF0cywgdWlkKTsKLSAgICAgICAgcmV0dXJuIHN0YXRzLmJ1aWxkKCk7CisgICAgICAgIGlmIChTVEFUU19ORVRGSUxURVIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXROZXR3b3JrU3RhdHNEZXRhaWxOZXRmaWx0ZXIodWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBnZXROZXR3b3JrU3RhdHNEZXRhaWxVaWRzdGF0KHVpZCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgY29sbGVjdE5ldHdvcmtTdGF0c0RldGFpbChOZXR3b3JrU3RhdHMuQnVpbGRlciBzdGF0cywgaW50IHVpZCkgewotICAgICAgICAvLyBUT0RPOiBrZXJuZWwgbW9kdWxlIHdpbGwgcHJvdmlkZSBpbnRlcmZhY2UtbGV2ZWwgc3RhdHMgaW4gZnV0dXJlCi0gICAgICAgIC8vIFRPRE86IG1pZ3JhdGUgdGhlc2Ugc3RhdHMgdG8gY29tZSBhY3Jvc3MgbmV0ZCBpbiBidWxrLCBpbnN0ZWFkIG9mIGFsbAotICAgICAgICAvLyB0aGVzZSBpbmRpdmlkdWFsIGZpbGUgcmVhZHMuCi0gICAgICAgIGZpbmFsIEZpbGUgdWlkUGF0aCA9IG5ldyBGaWxlKFBBVEhfUFJPQ19VSURfU1RBVCwgSW50ZWdlci50b1N0cmluZyh1aWQpKTsKLSAgICAgICAgZmluYWwgbG9uZyByeCA9IHJlYWRTaW5nbGVMb25nRnJvbUZpbGUobmV3IEZpbGUodWlkUGF0aCwgInRjcF9yY3YiKSk7Ci0gICAgICAgIGZpbmFsIGxvbmcgdHggPSByZWFkU2luZ2xlTG9uZ0Zyb21GaWxlKG5ldyBGaWxlKHVpZFBhdGgsICJ0Y3Bfc25kIikpOwotICAgICAgICBzdGF0cy5hZGRFbnRyeShOZXR3b3JrU3RhdHMuSUZBQ0VfQUxMLCB1aWQsIHJ4LCB0eCk7CisgICAgLyoqCisgICAgICogQnVpbGQge0BsaW5rIE5ldHdvcmtTdGF0c30gd2l0aCBkZXRhaWxlZCBVSUQgc3RhdGlzdGljcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyBnZXROZXR3b3JrU3RhdHNEZXRhaWxOZXRmaWx0ZXIoaW50IGxpbWl0VWlkKSB7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCksIDI0KTsKKworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKFNUQVRTX05FVEZJTFRFUikpOworCisgICAgICAgICAgICAvLyBhc3N1bWVzIGZvcm1hdCBmcm9tIGtlcm5lbDoKKyAgICAgICAgICAgIC8vIGlkeCBpZmFjZSBhY2N0X3RhZ19oZXggdWlkX3RhZ19pbnQgcnhfYnl0ZXMgdHhfYnl0ZXMKKworICAgICAgICAgICAgLy8gc2tpcCBmaXJzdCBsaW5lLCB3aGljaCBpcyBsZWdlbmQKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZHggPSB0Lm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZmFjZSA9IHQubmV4dFRva2VuKCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBrZXJuZWwgY3VycmVudGx5IGVtaXRzIHRhZyBpbiB1cHBlciBoYWxmIG9mIGxvbmc7CisgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50dWFsbHkgc3dpdGNoIHRvIGRpcmVjdGx5IHVzaW5nIGludC4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhZyA9IChpbnQpIChMb25nLnBhcnNlTG9uZyh0Lm5leHRUb2tlbigpLnN1YnN0cmluZygyKSwgMTYpID4+IDMyKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IEludGVnZXIucGFyc2VJbnQodC5uZXh0VG9rZW4oKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcnggPSBMb25nLnBhcnNlTG9uZyh0Lm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0eCA9IExvbmcucGFyc2VMb25nKHQubmV4dFRva2VuKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdFVpZCA9PSBVSURfQUxMIHx8IGxpbWl0VWlkID09IHVpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuYWRkRW50cnkoaWZhY2UsIHVpZCwgdGFnLCByeCwgdHgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInByb2JsZW0gcGFyc2luZyBzdGF0cyBmb3IgaWR4ICIgKyBpZHggKyAiOiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicHJvYmxlbSBwYXJzaW5nIHN0YXRzOiAiICsgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBJb1V0aWxzLmNsb3NlUXVpZXRseShyZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIHtAbGluayBOZXR3b3JrU3RhdHN9IHdpdGggZGV0YWlsZWQgVUlEIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB0aGlzIHVzZXMgb2xkZXIgInVpZF9zdGF0IiBkYXRhLCBhbmQgZG9lc24ndCBwcm92aWRlCisgICAgICogICAgICAgICAgICAgdGFnLWxldmVsIGdyYW51bGFyaXR5IG9yIGFkZGl0aW9uYWwgdmFyaWFibGVzLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHJpdmF0ZSBOZXR3b3JrU3RhdHMgZ2V0TmV0d29ya1N0YXRzRGV0YWlsVWlkc3RhdChpbnQgbGltaXRVaWQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10ga25vd25VaWRzOworICAgICAgICBpZiAobGltaXRVaWQgPT0gVUlEX0FMTCkgeworICAgICAgICAgICAga25vd25VaWRzID0gU1RBVFNfVUlEU1RBVC5saXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBrbm93blVpZHMgPSBuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZihsaW1pdFVpZCkgfTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMoCisgICAgICAgICAgICAgICAgU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCksIGtub3duVWlkcy5sZW5ndGgpOworICAgICAgICBmb3IgKFN0cmluZyB1aWQgOiBrbm93blVpZHMpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB1aWRJbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHVpZCk7CisgICAgICAgICAgICBmaW5hbCBGaWxlIHVpZFBhdGggPSBuZXcgRmlsZShTVEFUU19VSURTVEFULCB1aWQpOworICAgICAgICAgICAgZmluYWwgbG9uZyByeCA9IHJlYWRTaW5nbGVMb25nRnJvbUZpbGUobmV3IEZpbGUodWlkUGF0aCwgInRjcF9yY3YiKSk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHR4ID0gcmVhZFNpbmdsZUxvbmdGcm9tRmlsZShuZXcgRmlsZSh1aWRQYXRoLCAidGNwX3NuZCIpKTsKKyAgICAgICAgICAgIHN0YXRzLmFkZEVudHJ5KElGQUNFX0FMTCwgdWlkSW50LCBUQUdfTk9ORSwgcngsIHR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGF0czsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2VUaHJvdHRsZShTdHJpbmcgaWZhY2UsIGludCByeEticHMsIGludCB0eEticHMpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Ob3RpZmljYXRpb25NYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGU3MzgxNDUuLjRlY2RmZWQgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvTm90aWZpY2F0aW9uTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuU3RhdHVzQmFyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwpAQCAtMzcsNyArMzYsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CkBAIC00Nyw3ICs0NSw2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CiBpbXBvcnQgYW5kcm9pZC5vcy5WaWJyYXRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOwogaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CkBAIC0xMTIsMTAgKzEwOSw2IEBACiAgICAgLy8gVGhpcyBpcyByZXNldCB0byBmYWxzZSB3aGVuIHRoZSBzY3JlZW4gaXMgdHVybmVkIG9uLgogICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ1B1bHNlTm90aWZpY2F0aW9uOwogCi0gICAgLy8gZm9yIGFkYiBjb25uZWN0ZWQgbm90aWZpY2F0aW9ucwotICAgIHByaXZhdGUgYm9vbGVhbiBtQWRiTm90aWZpY2F0aW9uU2hvd24gPSBmYWxzZTsKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtQWRiTm90aWZpY2F0aW9uOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Tm90aWZpY2F0aW9uUmVjb3JkPiBtTm90aWZpY2F0aW9uTGlzdCA9CiAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PE5vdGlmaWNhdGlvblJlY29yZD4oKTsKIApAQCAtMzMwLDEzICszMjMsNyBAQAogCiAgICAgICAgICAgICBib29sZWFuIHF1ZXJ5UmVzdGFydCA9IGZhbHNlOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhVc2JNYW5hZ2VyLkFDVElPTl9VU0JfU1RBVEUpKSB7Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IGludGVudC5nZXRFeHRyYXMoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVzYkNvbm5lY3RlZCA9IGV4dHJhcy5nZXRCb29sZWFuKFVzYk1hbmFnZXIuVVNCX0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhZGJFbmFibGVkID0gKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0VOQUJMRUQuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzLmdldFN0cmluZyhVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BREIpKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQWRiTm90aWZpY2F0aW9uKHVzYkNvbm5lY3RlZCAmJiBhZGJFbmFibGVkKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVNT1ZFRCkKKyAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKQogICAgICAgICAgICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVNUQVJURUQpCiAgICAgICAgICAgICAgICAgICAgIHx8IChxdWVyeVJlc3RhcnQ9YWN0aW9uLmVxdWFscyhJbnRlbnQuQUNUSU9OX1FVRVJZX1BBQ0tBR0VfUkVTVEFSVCkpCiAgICAgICAgICAgICAgICAgICAgIHx8IGFjdGlvbi5lcXVhbHMoSW50ZW50LkFDVElPTl9FWFRFUk5BTF9BUFBMSUNBVElPTlNfVU5BVkFJTEFCTEUpKSB7CkBAIC00MzcsNyArNDI0LDYgQEAKIAogICAgICAgICAvLyByZWdpc3RlciBmb3IgdmFyaW91cyBJbnRlbnRzCiAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIGZpbHRlci5hZGRBY3Rpb24oVXNiTWFuYWdlci5BQ1RJT05fVVNCX1NUQVRFKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PTik7CiAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9TQ1JFRU5fT0ZGKTsKICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihUZWxlcGhvbnlNYW5hZ2VyLkFDVElPTl9QSE9ORV9TVEFURV9DSEFOR0VEKTsKQEAgLTExMTcsNjcgKzExMDMsNiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgLy8gVGhpcyBpcyBoZXJlIGluc3RlYWQgb2YgU3RhdHVzQmFyUG9saWN5IGJlY2F1c2UgaXQgaXMgYW4gaW1wb3J0YW50Ci0gICAgLy8gc2VjdXJpdHkgZmVhdHVyZSB0aGF0IHdlIGRvbid0IHdhbnQgcGVvcGxlIGN1c3RvbWl6aW5nIHRoZSBwbGF0Zm9ybQotICAgIC8vIHRvIGFjY2lkZW50YWxseSBsb3NlLgotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBZGJOb3RpZmljYXRpb24oYm9vbGVhbiBhZGJFbmFibGVkKSB7Ci0gICAgICAgIGlmIChhZGJFbmFibGVkKSB7Ci0gICAgICAgICAgICBpZiAoIjAiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5hZGIubm90aWZ5IikpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQWRiTm90aWZpY2F0aW9uU2hvd24pIHsKLSAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25NYW5hZ2VyIG5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25NYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gci5nZXRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIG1lc3NhZ2UgPSByLmdldFRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fbWVzc2FnZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BZGJOb3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24uaWNvbiA9IGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuc3RhdF9zeXNfYWRiOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbi53aGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbi50aWNrZXJUZXh0ID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRiTm90aWZpY2F0aW9uLmRlZmF1bHRzID0gMDsgLy8gcGxlYXNlIGJlIHF1aWV0Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRiTm90aWZpY2F0aW9uLnNvdW5kID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24udmlicmF0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5BQ1RJT05fQVBQTElDQVRJT05fREVWRUxPUE1FTlRfU0VUVElOR1MpOwotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0sgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgYXJlIGhhcmQtY29kaW5nIHRoZSBjb21wb25lbnQgYmVjYXVzZSB0aGlzIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGltcG9ydGFudCBzZWN1cml0eSBVSSB0aGF0IHdlIGRvbid0IHdhbnQgYW55b25lCi0gICAgICAgICAgICAgICAgICAgIC8vIGludGVyY2VwdGluZy4KLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChuZXcgQ29tcG9uZW50TmFtZSgiY29tLmFuZHJvaWQuc2V0dGluZ3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXR0aW5ncy5EZXZlbG9wbWVudFNldHRpbmdzIikpOwotICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShtQ29udGV4dCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIDApOwotCi0gICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24uc2V0TGF0ZXN0RXZlbnRJbmZvKG1Db250ZXh0LCB0aXRsZSwgbWVzc2FnZSwgcGkpOwotCi0gICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb25TaG93biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKG1BZGJOb3RpZmljYXRpb25TaG93bikgewotICAgICAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBub3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpIG1Db250ZXh0Ci0gICAgICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb25TaG93biA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbk1hbmFnZXIuY2FuY2VsKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvblB1bHNlKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Ob3RpZmljYXRpb25MaXN0KSB7CiAgICAgICAgICAgICB1cGRhdGVMaWdodHNMb2NrZWQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TdGF0dXNCYXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDFkMjA3MmMuLjI4NmE5MzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N0YXR1c0Jhck1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTYsMjEgKzE2LDE2IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOwogCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmFwcC5TdGF0dXNCYXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CiAKQEAgLTI1MywyNSArMjQ4LDIzIEBACiAgICAgICogSGlkZSBvciBzaG93IHRoZSBvbi1zY3JlZW4gTWVudSBrZXkuIE9ubHkgY2FsbCB0aGlzIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyLCB0eXBpY2FsbHkgaW4KICAgICAgKiByZXNwb25zZSB0byBhIHdpbmRvdyB3aXRoIEZMQUdfTkVFRFNfTUVOVV9LRVkgc2V0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lbnVLZXlWaXNpYmxlKGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgIHB1YmxpYyB2b2lkIHRvcEFwcFdpbmRvd0NoYW5nZWQoZmluYWwgYm9vbGVhbiBtZW51VmlzaWJsZSkgewogICAgICAgICBlbmZvcmNlU3RhdHVzQmFyKCk7CiAKLSAgICAgICAgaWYgKFNQRVcpIFNsb2cuZChUQUcsICh2aXNpYmxlPyJzaG93aW5nIjoiaGlkaW5nIikgKyAiIE1FTlUga2V5Iik7CisgICAgICAgIGlmIChTUEVXKSBTbG9nLmQoVEFHLCAobWVudVZpc2libGU/InNob3dpbmciOiJoaWRpbmciKSArICIgTUVOVSBrZXkiKTsKIAogICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtTWVudVZpc2libGUgIT0gdmlzaWJsZSkgewotICAgICAgICAgICAgICAgIG1NZW51VmlzaWJsZSA9IHZpc2libGU7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1CYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhci5zZXRNZW51S2V5VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1NZW51VmlzaWJsZSA9IG1lbnVWaXNpYmxlOworICAgICAgICAgICAgbUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmFyLnRvcEFwcFdpbmRvd0NoYW5nZWQobWVudVZpc2libGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzUyLDYgKzM0NSwxNSBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0b2dnbGVSZWNlbnRBcHBzKCkgeworICAgICAgICBpZiAobUJhciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1CYXIudG9nZ2xlUmVjZW50QXBwcygpOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7fQorICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTdGF0dXNCYXIoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uU1RBVFVTX0JBUiwKICAgICAgICAgICAgICAgICAiU3RhdHVzQmFyTWFuYWdlclNlcnZpY2UiKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbUJhY2t1cEFnZW50LmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1CYWNrdXBBZ2VudC5qYXZhCmluZGV4IDU0NTU1YmIuLjA4YzY2OTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbUJhY2t1cEFnZW50LmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvU3lzdGVtQmFja3VwQWdlbnQuamF2YQpAQCAtMzcsMTYgKzM3LDI1IEBACiBwdWJsaWMgY2xhc3MgU3lzdGVtQmFja3VwQWdlbnQgZXh0ZW5kcyBCYWNrdXBBZ2VudEhlbHBlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1CYWNrdXBBZ2VudCI7CiAKLSAgICAvLyBUaGVzZSBwYXRocyBtdXN0IG1hdGNoIHdoYXQgdGhlIFdhbGxwYXBlck1hbmFnZXJTZXJ2aWNlIHVzZXMKKyAgICAvLyBUaGVzZSBwYXRocyBtdXN0IG1hdGNoIHdoYXQgdGhlIFdhbGxwYXBlck1hbmFnZXJTZXJ2aWNlIHVzZXMuICBUaGUgbGVhZiAqX0ZJTEVOQU1FCisgICAgLy8gYXJlIGFsc28gdXNlZCBpbiB0aGUgZnVsbC1iYWNrdXAgZmlsZSBmb3JtYXQsIHNvIG11c3Qgbm90IGNoYW5nZSB1bmxlc3Mgc3RlcHMgYXJlCisgICAgLy8gdGFrZW4gdG8gc3VwcG9ydCB0aGUgbGVnYWN5IGJhY2tlZC11cCBkYXRhc2V0cy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FMTFBBUEVSX0lNQUdFX0ZJTEVOQU1FID0gIndhbGxwYXBlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTkZPX0ZJTEVOQU1FID0gIndhbGxwYXBlcl9pbmZvLnhtbCI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FMTFBBUEVSX0lNQUdFX0RJUiA9ICIvZGF0YS9kYXRhL2NvbS5hbmRyb2lkLnNldHRpbmdzL2ZpbGVzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FMTFBBUEVSX0lNQUdFID0gV0FMTFBBUEVSX0lNQUdFX0RJUiArICIvd2FsbHBhcGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FMTFBBUEVSX0lNQUdFID0gV0FMTFBBUEVSX0lNQUdFX0RJUiArICIvIiArIFdBTExQQVBFUl9JTUFHRV9GSUxFTkFNRTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQUxMUEFQRVJfSU5GT19ESVIgPSAiL2RhdGEvc3lzdGVtIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FMTFBBUEVSX0lORk8gPSBXQUxMUEFQRVJfSU5GT19ESVIgKyAiL3dhbGxwYXBlcl9pbmZvLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdBTExQQVBFUl9JTkZPID0gV0FMTFBBUEVSX0lORk9fRElSICsgIi8iICsgIFdBTExQQVBFUl9JTkZPX0ZJTEVOQU1FOworCiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkJhY2t1cChQYXJjZWxGaWxlRGVzY3JpcHRvciBvbGRTdGF0ZSwgQmFja3VwRGF0YU91dHB1dCBkYXRhLAogICAgICAgICAgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmV3U3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvbGRTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBBaCwgaXQncyBhIGZ1bGwgYmFja3VwIGRhdGFzZXQsIGJlaW5nIHJlc3RvcmVkIHBpZWNlbWVhbC4gIEp1c3QKKyAgICAgICAgICAgIC8vIHBvcCBvdmVyIHRvIHRoZSBmdWxsIHJlc3RvcmUgaGFuZGxpbmcgYW5kIHdlJ3JlIGRvbmUuCiAgICAgICAgICAgICBydW5GdWxsQmFja3VwKGRhdGEpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC02NiwxMSArNzUsMTggQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcnVuRnVsbEJhY2t1cChCYWNrdXBEYXRhT3V0cHV0IG91dHB1dCkgewotICAgICAgICAvLyBCYWNrIHVwIHRoZSBkYXRhIGZpbGVzIGRpcmVjdGx5Ci0gICAgICAgIEZ1bGxCYWNrdXAuYmFja3VwVG9UYXIoZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICBXQUxMUEFQRVJfSU1BR0VfRElSLCBXQUxMUEFQRVJfSU1BR0UsIG91dHB1dCk7Ci0gICAgICAgIEZ1bGxCYWNrdXAuYmFja3VwVG9UYXIoZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgbnVsbCwKKyAgICAgICAgZnVsbFdhbGxwYXBlckJhY2t1cChvdXRwdXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmdWxsV2FsbHBhcGVyQmFja3VwKEJhY2t1cERhdGFPdXRwdXQgb3V0cHV0KSB7CisgICAgICAgIC8vIEJhY2sgdXAgdGhlIGRhdGEgZmlsZXMgZGlyZWN0bHkuICBXZSBkbyB0aGVtIGluIHRoaXMgc3BlY2lmaWMgb3JkZXIgLS0KKyAgICAgICAgLy8gaW5mbyBmaWxlIGZvbGxvd2VkIGJ5IGltYWdlIC0tIGJlY2F1c2UgdGhlbiB3ZSBuZWVkIHRha2Ugbm8gc3BlY2lhbAorICAgICAgICAvLyBzdGVwcyBkdXJpbmcgcmVzdG9yZTsgdGhlIHJlc3RvcmUgd2lsbCBoYXBwZW4gcHJvcGVybHkgd2hlbiB0aGUgaW5kaXZpZHVhbAorICAgICAgICAvLyBmaWxlcyBhcmUgcmVzdG9yZWQgcGllY2VtZWFsLgorICAgICAgICBGdWxsQmFja3VwLmJhY2t1cFRvVGFyKGdldFBhY2thZ2VOYW1lKCksIEZ1bGxCYWNrdXAuUk9PVF9UUkVFX1RPS0VOLCBudWxsLAogICAgICAgICAgICAgICAgIFdBTExQQVBFUl9JTkZPX0RJUiwgV0FMTFBBUEVSX0lORk8sIG91dHB1dCk7CisgICAgICAgIEZ1bGxCYWNrdXAuYmFja3VwVG9UYXIoZ2V0UGFja2FnZU5hbWUoKSwgRnVsbEJhY2t1cC5ST09UX1RSRUVfVE9LRU4sIG51bGwsCisgICAgICAgICAgICAgICAgV0FMTFBBUEVSX0lNQUdFX0RJUiwgV0FMTFBBUEVSX0lNQUdFLCBvdXRwdXQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtOTYsNCArMTEyLDQ2IEBACiAgICAgICAgICAgICAobmV3IEZpbGUoV0FMTFBBUEVSX0lORk8pKS5kZWxldGUoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdG9yZUZpbGUoUGFyY2VsRmlsZURlc2NyaXB0b3IgZGF0YSwgbG9uZyBzaXplLAorICAgICAgICAgICAgaW50IHR5cGUsIFN0cmluZyBkb21haW4sIFN0cmluZyBwYXRoLCBsb25nIG1vZGUsIGxvbmcgbXRpbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTbG9nLmkoVEFHLCAiUmVzdG9yaW5nIGZpbGUgZG9tYWluPSIgKyBkb21haW4gKyAiIHBhdGg9IiArIHBhdGgpOworCisgICAgICAgIC8vIEJpdHMgdG8gaW5kaWNhdGUgcG9zdHByb2Nlc3Npbmcgd2UgbWF5IG5lZWQgdG8gcGVyZm9ybQorICAgICAgICBib29sZWFuIHJlc3RvcmVkV2FsbHBhcGVyID0gZmFsc2U7CisKKyAgICAgICAgRmlsZSBvdXRGaWxlID0gbnVsbDsKKyAgICAgICAgLy8gVmFyaW91cyBkb21haW4rZmlsZXMgd2UgdW5kZXJzdGFuZCBhIHByaW9yaQorICAgICAgICBpZiAoZG9tYWluLmVxdWFscyhGdWxsQmFja3VwLlJPT1RfVFJFRV9UT0tFTikpIHsKKyAgICAgICAgICAgIGlmIChwYXRoLmVxdWFscyhXQUxMUEFQRVJfSU5GT19GSUxFTkFNRSkpIHsKKyAgICAgICAgICAgICAgICBvdXRGaWxlID0gbmV3IEZpbGUoV0FMTFBBUEVSX0lORk8pOworICAgICAgICAgICAgICAgIHJlc3RvcmVkV2FsbHBhcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aC5lcXVhbHMoV0FMTFBBUEVSX0lNQUdFX0ZJTEVOQU1FKSkgeworICAgICAgICAgICAgICAgIG91dEZpbGUgPSBuZXcgRmlsZShXQUxMUEFQRVJfSU1BR0UpOworICAgICAgICAgICAgICAgIHJlc3RvcmVkV2FsbHBhcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAob3V0RmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlNraXBwaW5nIHVucmVjb2duaXplZCBzeXN0ZW0gZmlsZTogWyAiICsgZG9tYWluICsgIiA6ICIgKyBwYXRoICsgIiBdIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGdWxsQmFja3VwLnJlc3RvcmVUb0ZpbGUoZGF0YSwgc2l6ZSwgdHlwZSwgbW9kZSwgbXRpbWUsIG91dEZpbGUsIHRydWUpOworCisgICAgICAgICAgICBpZiAocmVzdG9yZWRXYWxscGFwZXIpIHsKKyAgICAgICAgICAgICAgICBXYWxscGFwZXJNYW5hZ2VyU2VydmljZSB3YWxscGFwZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKFdhbGxwYXBlck1hbmFnZXJTZXJ2aWNlKVNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LldBTExQQVBFUl9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICB3YWxscGFwZXIuc2V0dGluZ3NSZXN0b3JlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAocmVzdG9yZWRXYWxscGFwZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2Ugd2luZCB1cCBpbiBhIGdvb2Qgc3RhdGUKKyAgICAgICAgICAgICAgICAobmV3IEZpbGUoV0FMTFBBUEVSX0lNQUdFKSkuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgKG5ldyBGaWxlKFdBTExQQVBFUl9JTkZPKSkuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9TeXN0ZW1TZXJ2ZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCmluZGV4IDUzNTVkNDQuLmEyM2JhY2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1N5c3RlbVNlcnZlci5qYXZhCkBAIC0xNiwxOSArMTYsNiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlcjsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIucG0uUGFja2FnZU1hbmFnZXJTZXJ2aWNlOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci51c2IuVXNiU2VydmljZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20uV2luZG93TWFuYWdlclNlcnZpY2U7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLlNodXRkb3duVGhyZWFkOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLkJpbmRlckludGVybmFsOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLlNhbXBsaW5nUHJvZmlsZXJJbnRlZ3JhdGlvbjsKLQotaW1wb3J0IGRhbHZpay5zeXN0ZW0uVk1SdW50aW1lOwotaW1wb3J0IGRhbHZpay5zeXN0ZW0uWnlnb3RlOwotCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuYmx1ZXRvb3RoLkJsdWV0b290aEFkYXB0ZXI7CkBAIC0zOSwyNyArMjYsMzYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlN0cmljdE1vZGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhBMmRwU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnNlcnZlci5CbHVldG9vdGhTZXJ2aWNlOwogaW1wb3J0IGFuZHJvaWQuc2VydmVyLnNlYXJjaC5TZWFyY2hNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkV2ZW50TG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7CiBpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7CiAKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hcHAuU2h1dGRvd25UaHJlYWQ7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuQmluZGVySW50ZXJuYWw7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuU2FtcGxpbmdQcm9maWxlckludGVncmF0aW9uOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuYW0uQWN0aXZpdHlNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtTdGF0c1NlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLnBtLlBhY2thZ2VNYW5hZ2VyU2VydmljZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIudXNiLlVzYlNlcnZpY2U7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLldpbmRvd01hbmFnZXJTZXJ2aWNlOworCitpbXBvcnQgZGFsdmlrLnN5c3RlbS5WTVJ1bnRpbWU7CitpbXBvcnQgZGFsdmlrLnN5c3RlbS5aeWdvdGU7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyOwogaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CkBAIC02OSwxOSArNjUsNiBAQAogCiAgICAgQ29udGVudFJlc29sdmVyIG1Db250ZW50UmVzb2x2ZXI7CiAKLSAgICBwcml2YXRlIGNsYXNzIEFkYlNldHRpbmdzT2JzZXJ2ZXIgZXh0ZW5kcyBDb250ZW50T2JzZXJ2ZXIgewotICAgICAgICBwdWJsaWMgQWRiU2V0dGluZ3NPYnNlcnZlcigpIHsKLSAgICAgICAgICAgIHN1cGVyKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZShib29sZWFuIHNlbGZDaGFuZ2UpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlQWRiID0gKFNldHRpbmdzLlNlY3VyZS5nZXRJbnQobUNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQURCX0VOQUJMRUQsIDApID4gMCk7Ci0gICAgICAgICAgICAvLyBzZXR0aW5nIHRoaXMgc2VjdXJlIHByb3BlcnR5IHdpbGwgc3RhcnQgb3Igc3RvcCBhZGJkCi0gICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnNlcnZpY2UuYWRiLmVuYWJsZSIsIGVuYWJsZUFkYiA/ICIxIiA6ICIwIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIEV2ZW50TG9nLndyaXRlRXZlbnQoRXZlbnRMb2dUYWdzLkJPT1RfUFJPR1JFU1NfU1lTVEVNX1JVTiwKQEAgLTEyMCw2ICsxMDMsOSBAQAogICAgICAgICBMaWdodHNTZXJ2aWNlIGxpZ2h0cyA9IG51bGw7CiAgICAgICAgIFBvd2VyTWFuYWdlclNlcnZpY2UgcG93ZXIgPSBudWxsOwogICAgICAgICBCYXR0ZXJ5U2VydmljZSBiYXR0ZXJ5ID0gbnVsbDsKKyAgICAgICAgQWxhcm1NYW5hZ2VyU2VydmljZSBhbGFybSA9IG51bGw7CisgICAgICAgIE5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBuZXR3b3JrTWFuYWdlbWVudCA9IG51bGw7CisgICAgICAgIE5ldHdvcmtTdGF0c1NlcnZpY2UgbmV0d29ya1N0YXRzID0gbnVsbDsKICAgICAgICAgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlIG5ldHdvcmtQb2xpY3kgPSBudWxsOwogICAgICAgICBDb25uZWN0aXZpdHlTZXJ2aWNlIGNvbm5lY3Rpdml0eSA9IG51bGw7CiAgICAgICAgIElQYWNrYWdlTWFuYWdlciBwbSA9IG51bGw7CkBAIC0xOTEsNyArMTc3LDcgQEAKICAgICAgICAgICAgIHBvd2VyLmluaXQoY29udGV4dCwgbGlnaHRzLCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmdldERlZmF1bHQoKSwgYmF0dGVyeSk7CiAKICAgICAgICAgICAgIFNsb2cuaShUQUcsICJBbGFybSBNYW5hZ2VyIik7Ci0gICAgICAgICAgICBBbGFybU1hbmFnZXJTZXJ2aWNlIGFsYXJtID0gbmV3IEFsYXJtTWFuYWdlclNlcnZpY2UoY29udGV4dCk7CisgICAgICAgICAgICBhbGFybSA9IG5ldyBBbGFybU1hbmFnZXJTZXJ2aWNlKGNvbnRleHQpOwogICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LkFMQVJNX1NFUlZJQ0UsIGFsYXJtKTsKIAogICAgICAgICAgICAgU2xvZy5pKFRBRywgIkluaXQgV2F0Y2hkb2ciKTsKQEAgLTI3NywzNCArMjYzLDM2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk5ldFN0YXQgU2VydmljZSIpOwotICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoIm5ldHN0YXQiLCBuZXcgTmV0U3RhdFNlcnZpY2UoY29udGV4dCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLSAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBOZXRTdGF0IFNlcnZpY2UiLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiTmV0d29ya1BvbGljeSBTZXJ2aWNlIik7Ci0gICAgICAgICAgICAgICAgbmV0d29ya1BvbGljeSA9IG5ldyBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLnNlbGYoKSwgcG93ZXIpOwotICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLX1BPTElDWV9TRVJWSUNFLCBuZXR3b3JrUG9saWN5KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgQ29ubmVjdGl2aXR5IFNlcnZpY2UiLCBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiTmV0d29ya01hbmFnZW1lbnQgU2VydmljZSIpOwotICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5hZ2VyLmFkZFNlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuY3JlYXRlKGNvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBuZXR3b3JrTWFuYWdlbWVudCA9IE5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5jcmVhdGUoY29udGV4dCk7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0Lk5FVFdPUktNQU5BR0VNRU5UX1NFUlZJQ0UsIG5ldHdvcmtNYW5hZ2VtZW50KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgTmV0d29ya01hbmFnZW1lbnQgU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNsb2cuaShUQUcsICJOZXR3b3JrU3RhdHMgU2VydmljZSIpOworICAgICAgICAgICAgICAgIG5ldHdvcmtTdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHNTZXJ2aWNlKGNvbnRleHQsIG5ldHdvcmtNYW5hZ2VtZW50LCBhbGFybSk7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0Lk5FVFdPUktfU1RBVFNfU0VSVklDRSwgbmV0d29ya1N0YXRzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkZhaWx1cmUgc3RhcnRpbmcgTmV0d29ya1N0YXRzIFNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiTmV0d29ya1BvbGljeSBTZXJ2aWNlIik7CisgICAgICAgICAgICAgICAgbmV0d29ya1BvbGljeSA9IG5ldyBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLnNlbGYoKSwgcG93ZXIsIG5ldHdvcmtTdGF0cyk7CisgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0Lk5FVFdPUktfUE9MSUNZX1NFUlZJQ0UsIG5ldHdvcmtQb2xpY3kpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBOZXR3b3JrUG9saWN5IFNlcnZpY2UiLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiQ29ubmVjdGl2aXR5IFNlcnZpY2UiKTsKLSAgICAgICAgICAgICAgICBjb25uZWN0aXZpdHkgPSBDb25uZWN0aXZpdHlTZXJ2aWNlLmdldEluc3RhbmNlKGNvbnRleHQpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpdml0eSA9IG5ldyBDb25uZWN0aXZpdHlTZXJ2aWNlKGNvbnRleHQsIG5ldHdvcmtNYW5hZ2VtZW50LCBuZXR3b3JrUG9saWN5KTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuQ09OTkVDVElWSVRZX1NFUlZJQ0UsIGNvbm5lY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgbmV0d29ya1N0YXRzLmJpbmRDb25uZWN0aXZpdHlNYW5hZ2VyKGNvbm5lY3Rpdml0eSk7CisgICAgICAgICAgICAgICAgbmV0d29ya1BvbGljeS5iaW5kQ29ubmVjdGl2aXR5TWFuYWdlcihjb25uZWN0aXZpdHkpOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBDb25uZWN0aXZpdHkgU2VydmljZSIsIGUpOwogICAgICAgICAgICAgfQpAQCAtMzQxLDYgKzMyOSw3IEBACiAgICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIk5vdGlmaWNhdGlvbiBNYW5hZ2VyIik7CiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbk1hbmFnZXJTZXJ2aWNlKGNvbnRleHQsIHN0YXR1c0JhciwgbGlnaHRzKTsKICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuYWdlci5hZGRTZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UsIG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICAgICAgbmV0d29ya1BvbGljeS5iaW5kTm90aWZpY2F0aW9uTWFuYWdlcihub3RpZmljYXRpb24pOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiRmFpbHVyZSBzdGFydGluZyBOb3RpZmljYXRpb24gTWFuYWdlciIsIGUpOwogICAgICAgICAgICAgfQpAQCAtNDE3LDggKzQwNiw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU2xvZy5pKFRBRywgIlVTQiBPYnNlcnZlciIpOwotICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgVVNCIGNoYW5nZXMKKyAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiVVNCIFNlcnZpY2UiKTsKKyAgICAgICAgICAgICAgICAvLyBNYW5hZ2UgVVNCIGhvc3QgYW5kIGRldmljZSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgdXNiID0gbmV3IFVzYlNlcnZpY2UoY29udGV4dCk7CiAgICAgICAgICAgICAgICAgU2VydmljZU1hbmFnZXIuYWRkU2VydmljZShDb250ZXh0LlVTQl9TRVJWSUNFLCB1c2IpOwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKQEAgLTQ4MywxNCArNDcyLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgQURCX0VOQUJMRUQgc2V0dGluZyB2YWx1ZSBtYXRjaGVzIHRoZSBzZWN1cmUgcHJvcGVydHkgdmFsdWUKLSAgICAgICAgU2V0dGluZ3MuU2VjdXJlLnB1dEludChtQ29udGVudFJlc29sdmVyLCBTZXR0aW5ncy5TZWN1cmUuQURCX0VOQUJMRUQsCi0gICAgICAgICAgICAgICAgIjEiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5zZXJ2aWNlLmFkYi5lbmFibGUiKSkgPyAxIDogMCk7Ci0KLSAgICAgICAgLy8gcmVnaXN0ZXIgb2JzZXJ2ZXIgdG8gbGlzdGVuIGZvciBzZXR0aW5ncyBjaGFuZ2VzCi0gICAgICAgIG1Db250ZW50UmVzb2x2ZXIucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoU2V0dGluZ3MuU2VjdXJlLmdldFVyaUZvcihTZXR0aW5ncy5TZWN1cmUuQURCX0VOQUJMRUQpLAotICAgICAgICAgICAgICAgIGZhbHNlLCBuZXcgQWRiU2V0dGluZ3NPYnNlcnZlcigpKTsKLQogICAgICAgICAvLyBCZWZvcmUgdGhpbmdzIHN0YXJ0IHJvbGxpbmcsIGJlIHN1cmUgd2UgaGF2ZSBkZWNpZGVkIHdoZXRoZXIKICAgICAgICAgLy8gd2UgYXJlIGluIHNhZmUgbW9kZS4KICAgICAgICAgZmluYWwgYm9vbGVhbiBzYWZlTW9kZSA9IHdtLmRldGVjdFNhZmVNb2RlKCk7CkBAIC01MzksNiArNTIwLDcgQEAKICAgICAgICAgLy8gVGhlc2UgYXJlIG5lZWRlZCB0byBwcm9wYWdhdGUgdG8gdGhlIHJ1bm5hYmxlIGJlbG93LgogICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHRGID0gY29udGV4dDsKICAgICAgICAgZmluYWwgQmF0dGVyeVNlcnZpY2UgYmF0dGVyeUYgPSBiYXR0ZXJ5OworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNTZXJ2aWNlIG5ldHdvcmtTdGF0c0YgPSBuZXR3b3JrU3RhdHM7CiAgICAgICAgIGZpbmFsIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZSBuZXR3b3JrUG9saWN5RiA9IG5ldHdvcmtQb2xpY3k7CiAgICAgICAgIGZpbmFsIENvbm5lY3Rpdml0eVNlcnZpY2UgY29ubmVjdGl2aXR5RiA9IGNvbm5lY3Rpdml0eTsKICAgICAgICAgZmluYWwgRG9ja09ic2VydmVyIGRvY2tGID0gZG9jazsKQEAgLTU2NSw2ICs1NDcsNyBAQAogCiAgICAgICAgICAgICAgICAgc3RhcnRTeXN0ZW1VaShjb250ZXh0Rik7CiAgICAgICAgICAgICAgICAgaWYgKGJhdHRlcnlGICE9IG51bGwpIGJhdHRlcnlGLnN5c3RlbVJlYWR5KCk7CisgICAgICAgICAgICAgICAgaWYgKG5ldHdvcmtTdGF0c0YgIT0gbnVsbCkgbmV0d29ya1N0YXRzRi5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChuZXR3b3JrUG9saWN5RiAhPSBudWxsKSBuZXR3b3JrUG9saWN5Ri5zeXN0ZW1SZWFkeSgpOwogICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aXZpdHlGICE9IG51bGwpIGNvbm5lY3Rpdml0eUYuc3lzdGVtUmVhZHkoKTsKICAgICAgICAgICAgICAgICBpZiAoZG9ja0YgIT0gbnVsbCkgZG9ja0Yuc3lzdGVtUmVhZHkoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEKaW5kZXggNTEwZmY2Mi4uNzI2NmQ3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlLmphdmEKQEAgLTUzMyw3ICs1MzMsOCBAQAogICAgICAgICAgICAgbG9uZyBpbmNXcml0ZSA9IDA7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG1OTVNlcnZpY2UuZ2V0TmV0d29ya1N0YXRzU3VtbWFyeSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IHN0YXRzLmZpbmRJbmRleChtSWZhY2UsIE5ldHdvcmtTdGF0cy5VSURfQUxMKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBzdGF0cy5maW5kSW5kZXgoCisgICAgICAgICAgICAgICAgICAgICAgICBtSWZhY2UsIE5ldHdvcmtTdGF0cy5VSURfQUxMLCBOZXR3b3JrU3RhdHMuVEFHX05PTkUpOwogCiAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgIGluY1JlYWQgPSBzdGF0cy5yeFtpbmRleF0gLSBtTGFzdFJlYWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVNlcnZpY2UuamF2YQppbmRleCA0MWVjNjNhLi5jYjU1NDUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlTZXJ2aWNlLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKIAogcHVibGljIGNsYXNzIFdpZmlTZXJ2aWNlIGV4dGVuZHMgSVdpZmlNYW5hZ2VyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiV2lmaVNlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBXaWZpU3RhdGVNYWNoaW5lIG1XaWZpU3RhdGVNYWNoaW5lOwogCkBAIC0zMjEsNiArMzIxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgQXN5bmNDaGFubmVsLkNNRF9DSEFOTkVMX0RJU0NPTk5FQ1RFRDogeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoVEFHLCAiV2lmaVN0YXRlTWFjaGluZSBjaGFubmVsIGxvc3QsIG1zZy5hcmcxID0iICsgbXNnLmFyZzEpOworICAgICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZUNoYW5uZWwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAvL1JlLWVzdGFibGlzaCBjb25uZWN0aW9uIHRvIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgICAgICAgICAgICAgbVdzbUNoYW5uZWwuY29ubmVjdChtQ29udGV4dCwgdGhpcywgbVdpZmlTdGF0ZU1hY2hpbmUuZ2V0SGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgIldpZmlTdGF0ZU1hY2hpbmVIYW5kbGVyLmhhbmRsZU1lc3NhZ2UgaWdub3JpbmcgbXNnPSIgKyBtc2cpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTU5Myw3ICs2MDAsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgV2lmaUNvbmZpZ3VyYXRpb24gZ2V0V2lmaUFwQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgZW5mb3JjZUFjY2Vzc1Blcm1pc3Npb24oKTsKLSAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRXaWZpQXBDb25maWd1cmF0aW9uKG1XaWZpU3RhdGVNYWNoaW5lQ2hhbm5lbCk7CisgICAgICAgIGlmIChtV2lmaVN0YXRlTWFjaGluZUNoYW5uZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1XaWZpU3RhdGVNYWNoaW5lLnN5bmNHZXRXaWZpQXBDb25maWd1cmF0aW9uKG1XaWZpU3RhdGVNYWNoaW5lQ2hhbm5lbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTbG9nLmUoVEFHLCAibVdpZmlTdGF0ZU1hY2hpbmVDaGFubmVsIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpZmlXYXRjaGRvZ1NlcnZpY2UuamF2YQppbmRleCA2ZWY2OTYzLi41NmJmYmUwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpV2F0Y2hkb2dTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVdhdGNoZG9nU2VydmljZS5qYXZhCkBAIC0zNiwxNiArMzYsMjEgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TbG9nOwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVBhY2tldDsKIGltcG9ydCBqYXZhLm5ldC5EYXRhZ3JhbVNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKIAogLyoqCiAgKiB7QGxpbmsgV2lmaVdhdGNoZG9nU2VydmljZX0gbW9uaXRvcnMgdGhlIGluaXRpYWwgY29ubmVjdGlvbiB0byBhIFdpLUZpCkBAIC03Myw5ICs3OCw5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBXaWZpV2F0Y2hkb2dTZXJ2aWNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIldpZmlXYXRjaGRvZ1NlcnZpY2UiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gViA9IGZhbHNlIHx8IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRCA9IHRydWUgfHwgZmFsc2U7Ci0gICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBWID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEID0gdHJ1ZTsKKwogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKICAgICBwcml2YXRlIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOwogICAgIHByaXZhdGUgV2lmaU1hbmFnZXIgbVdpZmlNYW5hZ2VyOwpAQCAtMTAzLDE3ICsxMDgsMTYgQEAKICAgICBwcml2YXRlIFN0cmluZyBtU3NpZDsKICAgICAvKioKICAgICAgKiBUaGUgbnVtYmVyIG9mIGFjY2VzcyBwb2ludHMgaW4gdGhlIGN1cnJlbnQgbmV0d29yayAoe0BsaW5rICNtU3NpZH0pIHRoYXQKLSAgICAgKiBoYXZlIGJlZW4gY2hlY2tlZC4gT25seSB0b3VjaGVkIGluIHRoZSBtYWluIHRocmVhZCEKKyAgICAgKiBoYXZlIGJlZW4gY2hlY2tlZC4gT25seSB0b3VjaGVkIGluIHRoZSBtYWluIHRocmVhZCwgdXNpbmcgZ2V0dGVyL3NldHRlciBtZXRob2RzLgogICAgICAqLwotICAgIHByaXZhdGUgaW50IG1OdW1BcHNDaGVja2VkOworICAgIHByaXZhdGUgaW50IG1Cc3NpZENoZWNrQ291bnQ7CiAgICAgLyoqIFdoZXRoZXIgdGhlIGN1cnJlbnQgQVAgY2hlY2sgc2hvdWxkIGJlIGNhbmNlbGVkLiAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvdWxkQ2FuY2VsOwotICAgIAorCiAgICAgV2lmaVdhdGNoZG9nU2VydmljZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKICAgICAgICAgbVdpZmlNYW5hZ2VyID0gKFdpZmlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOwotICAgICAgICAKICAgICAgICAgY3JlYXRlVGhyZWFkKCk7CiAgICAgICAgIAogICAgICAgICAvLyBUaGUgY29udGVudCBvYnNlcnZlciB0byBsaXN0ZW4gbmVlZHMgYSBoYW5kbGVyLCB3aGljaCBjcmVhdGVUaHJlYWQgY3JlYXRlcwpAQCAtMTk1LDYgKzE5OSwzNCBAQAogICAgICAgICByZXR1cm4gU2V0dGluZ3MuU2VjdXJlLmdldEludChtQ29udGVudFJlc29sdmVyLAogICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLldJRklfV0FUQ0hET0dfUElOR19ERUxBWV9NUywgMjUwKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfV0FUQ0hET0dfV0FMTEVEX0dBUkRFTl9URVNUX0VOQUJMRUQKKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBCb29sZWFuIGlzV2FsbGVkR2FyZGVuVGVzdEVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5XSUZJX1dBVENIRE9HX1dBTExFRF9HQVJERU5fVEVTVF9FTkFCTEVELCAxKSA9PSAxOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfV0FUQ0hET0dfV0FMTEVEX0dBUkRFTl9VUkwKKyAgICAgKi8KKyAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0V2FsbGVkR2FyZGVuVXJsKCkgeworICAgICAgICBTdHJpbmcgdXJsID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9XQVRDSERPR19XQUxMRURfR0FSREVOX1VSTCk7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eSh1cmwpKSByZXR1cm4gImh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8iOworICAgICAgICByZXR1cm4gdXJsOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlI1dJRklfV0FUQ0hET0dfV0FMTEVEX0dBUkRFTl9QQVRURVJOCisgICAgICovCisgICAgIHByaXZhdGUgU3RyaW5nIGdldFdhbGxlZEdhcmRlblBhdHRlcm4oKSB7CisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gU2V0dGluZ3MuU2VjdXJlLmdldFN0cmluZyhtQ29udGVudFJlc29sdmVyLAorICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuV0lGSV9XQVRDSERPR19XQUxMRURfR0FSREVOX1BBVFRFUk4pOworICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGF0dGVybikpIHJldHVybiAiPHRpdGxlPi4qR29vZ2xlLio8L3RpdGxlPiI7CisgICAgICAgIHJldHVybiBwYXR0ZXJuOworICAgICB9CiAgICAgCiAgICAgLyoqCiAgICAgICogQHNlZSBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZSNXSUZJX1dBVENIRE9HX0FDQ0VQVEFCTEVfUEFDS0VUX0xPU1NfUEVSQ0VOVEFHRQpAQCAtMzc3LDYgKzQwOSw5IEBACiAgICAgICAgICAgICAgICAgICogU3VjY2Vzc2Z1bCAiaWdub3JlZCIgcGluZ3MgYXJlICpub3QqIGlnbm9yZWQgKHRoZXkgY291bnQgaW4gdGhlIHRvdGFsIG51bWJlcgogICAgICAgICAgICAgICAgICAqIG9mIHBpbmdzKSwgYnV0IGZhaWx1cmVzIGFyZSByZWFsbHkgaWdub3JlZC4KICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgaXMgY29uZnVzaW5nIGxvZ2ljIGFuZCBzaG91bGQgYmUgcmV3aXR0ZW4KKyAgICAgICAgICAgICAgICAvLyBIZXJlLCBzdWNjZXNzZnVsICdpZ25vcmVkJyBwaW5ncyBhcmUgaW50ZXJwcmV0ZWQgYXMgYSBzdWNjZXNzIGluIHRoZSBiZWxvdyBsb29wCiAgICAgICAgICAgICAgICAgcGluZ0NvdW50ZXIrKzsKICAgICAgICAgICAgICAgICBzdWNjZXNzQ291bnRlcisrOwogICAgICAgICAgICAgfQpAQCAtNDE4LDYgKzQ1Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvL1RPRE86IEludGVnZXIgZGl2aXNpb24gbWlnaHQgY2F1c2UgcHJvYmxlbXMgZG93biB0aGUgcm9hZC4uLgogICAgICAgICBpbnQgcGFja2V0TG9zc1BlcmNlbnRhZ2UgPSAxMDAgKiAobnVtUGluZ3MgLSBzdWNjZXNzQ291bnRlcikgLyBudW1QaW5nczsKICAgICAgICAgaWYgKEQpIHsKICAgICAgICAgICAgIFNsb2cuZChUQUcsIHBhY2tldExvc3NQZXJjZW50YWdlCkBAIC00MzcsNyArNDczLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmYWxzZSAmJiBWKSB7CisgICAgICAgIGlmIChWKSB7CiAgICAgICAgICAgICBteUxvZ1YoImJhY2tncm91bmRDaGVja0Ruc0Nvbm5lY3Rpdml0eTogQmFja2dyb3VuZCBjaGVja2luZyAiICsKICAgICAgICAgICAgICAgICAgICAgZG5zLmdldEhvc3RBZGRyZXNzKCkgKyAiIGZvciBjb25uZWN0aXZpdHkiKTsKICAgICAgICAgfQpAQCAtNTA5LDcgKzU0NSw3IEBACiAgICAgICAgICAgICAvLyBUaGlzIGFjY2VzcyBwb2ludCBkb2VzIG5vdCByZXF1aXJlIGEgd2F0Y2hkb2csIHNvIHF1ZXVlIGlkbGUgb24gdGhlIG1haW4gdGhyZWFkCiAgICAgICAgICAgICBtSGFuZGxlci5pZGxlKCk7CiAgICAgICAgIH0KLSAgICAgICAgbUhhbmRsZXIuY2hlY2tXYWxsZWRHYXJkZW4oc3NpZCk7CisgICAgICAgIGlmIChpc1dhbGxlZEdhcmRlblRlc3RFbmFibGVkKCkpIG1IYW5kbGVyLmNoZWNrV2FsbGVkR2FyZGVuKHNzaWQpOwogICAgIH0KICAgICAKICAgICAvKioKQEAgLTY5OCw4ICs3MzQsOCBAQAogICAgICAgICAgKiBDaGVja3MgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgZXhjZWVkZWQgdGhlIG1heCBudW1iZXIgb2YgY2hlY2tzCiAgICAgICAgICAqIHdlJ3JlIGFsbG93ZWQgcGVyIG5ldHdvcmsKICAgICAgICAgICovCi0gICAgICAgIG1OdW1BcHNDaGVja2VkKys7Ci0gICAgICAgIGlmIChtTnVtQXBzQ2hlY2tlZCA+IGdldE1heEFwQ2hlY2tzKCkpIHsKKyAgICAgICAgaW5jcmVtZW50QnNzaWRDaGVja0NvdW50KCk7CisgICAgICAgIGlmIChnZXRCc3NpZENoZWNrQ291bnQoKSA+IGdldE1heEFwQ2hlY2tzKCkpIHsKICAgICAgICAgICAgIGlmIChWKSB7CiAgICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIiAgUGFzc2VkIHRoZSBtYXggYXR0ZW1wdHMgKCIgKyBnZXRNYXhBcENoZWNrcygpCiAgICAgICAgICAgICAgICAgICAgICAgICArICIpLCBnb2luZyB0byBzbGVlcCBmb3IgIiArIG1Tc2lkKTsKQEAgLTc5MCw3ICs4MjYsNyBAQAogICAgICAgICAvLyBSZXNldCB0aGUgY2FuY2VsIHN0YXRlIHNpbmNlIHRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG9mIHRoaXMgYWN0aW9uCiAgICAgICAgIG1TaG91bGRDYW5jZWwgPSBmYWxzZTsKICAgICAgICAgCi0gICAgICAgIGlmIChmYWxzZSAmJiBWKSB7CisgICAgICAgIGlmIChWKSB7CiAgICAgICAgICAgICBteUxvZ1YoImhhbmRsZUJhY2tncm91bmRDaGVja0FwOiBBY2Nlc3NQb2ludDogIiArIGFwKTsKICAgICAgICAgfQogICAgICAgICAKQEAgLTkyOSw3ICs5NjUsNyBAQAogICAgICAgICBpZiAoZm9yY2VJZGxlU3RhdGUgfHwgKG1TdGF0ZSAhPSBXYXRjaGRvZ1N0YXRlLlNMRUVQKSkgewogICAgICAgICAgICAgbVN0YXRlID0gV2F0Y2hkb2dTdGF0ZS5JRExFOwogICAgICAgICB9Ci0gICAgICAgIG1OdW1BcHNDaGVja2VkID0gMDsKKyAgICAgICAgcmVzZXRCc3NpZENoZWNrQ291bnQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk1Nyw2ICs5OTMsMTggQEAKICAgICAgICAgU1dJVENISU5HX0FQCiAgICAgfQogCisgICAgcHJpdmF0ZSBpbnQgZ2V0QnNzaWRDaGVja0NvdW50KCkgeworICAgICAgICByZXR1cm4gbUJzc2lkQ2hlY2tDb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5jcmVtZW50QnNzaWRDaGVja0NvdW50KCkgeworICAgICAgICBtQnNzaWRDaGVja0NvdW50Kys7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc2V0QnNzaWRDaGVja0NvdW50KCkgeworICAgICAgICB0aGlzLm1Cc3NpZENoZWNrQ291bnQgPSAwOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRoZSBtYWluIHRocmVhZCBmb3IgdGhlIHdhdGNoZG9nIG1vbml0b3JpbmcuIFRoaXMgd2lsbCBiZSB0dXJuZWQgaW50byBhCiAgICAgICoge0BsaW5rIExvb3Blcn0gdGhyZWFkLgpAQCAtMTA4Nyw2ICsxMTM1LDkgQEAKICAgICAgICAgCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBpZiAoVikgeworICAgICAgICAgICAgICAgIG15TG9nVigiaGFuZGxlTWVzc2FnZTogIiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKICAgICAgICAgICAgICAgICBjYXNlIE1FU1NBR0VfTkVUV09SS19DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICBoYW5kbGVOZXR3b3JrQ2hhbmdlZCgoU3RyaW5nKSBtc2cub2JqKTsKQEAgLTExMTgsMTkgKzExNjksMzUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8qKgorICAgICAgICAgKiBETlMgYmFzZWQgZGV0ZWN0aW9uIHRlY2huaXF1ZXMgZG8gbm90IHdvcmsgYXQgYWxsIGhvdHNwb3RzLiBUaGUgb25lIHN1cmUgd2F5IHRvIGNoZWNrCisgICAgICAgICAqIGEgd2FsbGVkIGdhcmRlbiBpcyB0byBzZWUgaWYgYSBVUkwgZmV0Y2ggb24gYSBrbm93biBhZGRyZXNzIGZldGNoZXMgdGhlIGRhdGEgd2UKKyAgICAgICAgICogZXhwZWN0CisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNXYWxsZWRHYXJkZW5Db25uZWN0aW9uKCkgewotICAgICAgICAgICAgLy9PbmUgd2F5IHRvIGRldGVjdCBhIHdhbGxlZCBnYXJkZW4gaXMgdG8gc2VlIGlmIG11bHRpcGxlIEROUyBxdWVyaWVzCi0gICAgICAgICAgICAvL3Jlc29sdmUgdG8gdGhlIHNhbWUgSVAgYWRkcmVzcworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOworICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gIHVybENvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdDEgPSAid3d3Lmdvb2dsZS5jb20iOwotICAgICAgICAgICAgICAgIFN0cmluZyBob3N0MiA9ICJ3d3cuYW5kcm9pZC5jb20iOwotICAgICAgICAgICAgICAgIFN0cmluZyBhZGRyZXNzMSA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0MSkuZ2V0SG9zdEFkZHJlc3MoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWRkcmVzczIgPSBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaG9zdDIpLmdldEhvc3RBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MxLmVxdWFscyhhZGRyZXNzMikpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGdldFdhbGxlZEdhcmRlblVybCgpKTsKKyAgICAgICAgICAgICAgICB1cmxDb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgU2Nhbm5lciBzY2FubmVyID0gbmV3IFNjYW5uZXIoaW4pOworICAgICAgICAgICAgICAgIGlmIChzY2FubmVyLmZpbmRJbkxpbmUoZ2V0V2FsbGVkR2FyZGVuUGF0dGVybigpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1cmxDb25uZWN0aW9uICE9IG51bGwpIHVybENvbm5lY3Rpb24uZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVdhbGxlZEdhcmRlbkNoZWNrKFN0cmluZyBzc2lkKSB7CkBAIC0xMjE0LDM0ICsxMjgxLDM2IEBACiAKICAgICAvKioKICAgICAgKiBEZXNjcmliZXMgYW4gYWNjZXNzIHBvaW50IGJ5IGl0cyBTU0lEIGFuZCBCU1NJRC4KKyAgICAgKgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFjY2Vzc1BvaW50IHsKICAgICAgICAgU3RyaW5nIHNzaWQ7CiAgICAgICAgIFN0cmluZyBic3NpZDsKICAgICAgICAgCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gc3NpZCBjYW5ub3QgYmUgbnVsbAorICAgICAgICAgKiBAcGFyYW0gYnNzaWQgY2Fubm90IGJlIG51bGwKKyAgICAgICAgICovCiAgICAgICAgIEFjY2Vzc1BvaW50KFN0cmluZyBzc2lkLCBTdHJpbmcgYnNzaWQpIHsKKyAgICAgICAgICAgIGlmIChzc2lkID09IG51bGwgfHwgYnNzaWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsIFN0cmluZy5mb3JtYXQoIiglcykgSU5WQUxJRCBBQ0NFU1NQT0lOVDogKCVzLCAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCksc3NpZCxic3NpZCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhpcy5zc2lkID0gc3NpZDsKICAgICAgICAgICAgIHRoaXMuYnNzaWQgPSBic3NpZDsKICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOdWxsKCkgewotICAgICAgICAgICAgcmV0dXJuIHNzaWQgPT0gbnVsbCB8fCBic3NpZCA9PSBudWxsOwotICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQWNjZXNzUG9pbnQpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICBBY2Nlc3NQb2ludCBvdGhlckFwID0gKEFjY2Vzc1BvaW50KSBvOwotICAgICAgICAgICAgYm9vbGVhbiBpSGF2ZU51bGwgPSBoYXNOdWxsKCk7CisKICAgICAgICAgICAgIC8vIEVpdGhlciB3ZSBib3RoIGhhdmUgYSBudWxsLCBvciBvdXIgU1NJRHMgYW5kIEJTU0lEcyBhcmUgZXF1YWwKLSAgICAgICAgICAgIHJldHVybiAoaUhhdmVOdWxsICYmIG90aGVyQXAuaGFzTnVsbCgpKSB8fCAKLSAgICAgICAgICAgICAgICAgICAgKG90aGVyQXAuYnNzaWQgIT0gbnVsbCAmJiBzc2lkLmVxdWFscyhvdGhlckFwLnNzaWQpCi0gICAgICAgICAgICAgICAgICAgICYmIGJzc2lkLmVxdWFscyhvdGhlckFwLmJzc2lkKSk7CisgICAgICAgICAgICByZXR1cm4gc3NpZC5lcXVhbHMob3RoZXJBcC5zc2lkKSAmJiBic3NpZC5lcXVhbHMob3RoZXJBcC5ic3NpZCk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgaWYgKHNzaWQgPT0gbnVsbCB8fCBic3NpZCA9PSBudWxsKSByZXR1cm4gMDsKICAgICAgICAgICAgIHJldHVybiBzc2lkLmhhc2hDb2RlKCkgKyBic3NpZC5oYXNoQ29kZSgpOwogICAgICAgICB9CiAKQEAgLTEzMTYsNyArMTM4NSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpZiAoViB8fCBmYWxzZSkgeworICAgICAgICAgICAgICAgIGlmIChWKSB7CiAgICAgICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJEbnNQaW5nZXIuaXNSZWFjaGFibGUgZ290IGFuIHVua25vd24gZXhjZXB0aW9uIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGQ5NjM2OWIuLmE5ZGZiMjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtMTYsMTEgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuYWNjZXNzaWJpbGl0eTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbnRlbnQuUGFja2FnZU1vbml0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuSGFuZGxlckNhbGxlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVyQ2FsbGVyLlNvbWVBcmdzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci53bS5XaW5kb3dNYW5hZ2VyU2VydmljZTsKLQoraW1wb3J0IGFuZHJvaWQuTWFuaWZlc3Q7CiBpbXBvcnQgYW5kcm9pZC5hY2Nlc3NpYmlsaXR5c2VydmljZS5BY2Nlc3NpYmlsaXR5U2VydmljZTsKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLklBY2Nlc3NpYmlsaXR5U2VydmljZUNvbm5lY3Rpb247CkBAIC0zNSwzNCArMzEsNDYgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLm9zLlNlcnZpY2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CiBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nczsKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHMuU2ltcGxlU3RyaW5nU3BsaXR0ZXI7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OworaW1wb3J0IGFuZHJvaWQudmlldy5JV2luZG93OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5Tm9kZUluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb247CitpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb25DYWxsYmFjazsKIGltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5JQWNjZXNzaWJpbGl0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50OwogCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29udGVudC5QYWNrYWdlTW9uaXRvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5vcy5IYW5kbGVyQ2FsbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLkhhbmRsZXJDYWxsZXIuU29tZUFyZ3M7CitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLndtLldpbmRvd01hbmFnZXJTZXJ2aWNlOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiAvKioKICAqIFRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGJ5IHRoZSBzeXN0ZW0gYXMgYSBzeXN0ZW0gbGV2ZWwgc2VydmljZSBhbmQgY2FuIGJlCkBAIC03OSwxMiArODcsMTcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkFjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZSI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05fUkVHSVNURVJfRVZFTlRfTElTVEVORVIgPQorICAgICAgICAicmVnaXN0ZXJFdmVudExpc3RlbmVyIjsKKwogICAgIHByaXZhdGUgc3RhdGljIGludCBzSWRDb3VudGVyID0gMDsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPV05fUFJPQ0VTU19JRCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5teVBpZCgpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPX1NFVF9TRVJWSUNFX0lORk8gPSAxMDsKIAorICAgIHByaXZhdGUgc3RhdGljIGludCBzTmV4dFdpbmRvd0lkOworCiAgICAgZmluYWwgSGFuZGxlckNhbGxlciBtQ2FsbGVyOwogCiAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKQEAgLTk2LDI1ICsxMDksMzUgQEAKICAgICBmaW5hbCBMaXN0PElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudD4gbUNsaWVudHMgPQogICAgICAgICBuZXcgQXJyYXlMaXN0PElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudD4oKTsKIAotICAgIGZpbmFsIE1hcDxDb21wb25lbnROYW1lLCBTZXJ2aWNlPiBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPENvbXBvbmVudE5hbWUsIFNlcnZpY2U+KCk7CisgICAgZmluYWwgTWFwPENvbXBvbmVudE5hbWUsIFNlcnZpY2U+IG1Db21wb25lbnROYW1lVG9TZXJ2aWNlTWFwID0gbmV3IEhhc2hNYXA8Q29tcG9uZW50TmFtZSwgU2VydmljZT4oKTsKIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTZXJ2aWNlSW5mbz4gbUluc3RhbGxlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW5mbz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBtSW5zdGFsbGVkU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgU2V0PENvbXBvbmVudE5hbWU+IG1FbmFibGVkU2VydmljZXMgPSBuZXcgSGFzaFNldDxDb21wb25lbnROYW1lPigpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBTaW1wbGVTdHJpbmdTcGxpdHRlciBtU3RyaW5nQ29sb25TcGxpdHRlciA9IG5ldyBTaW1wbGVTdHJpbmdTcGxpdHRlcignOicpOworICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8SUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24+IG1XaW5kb3dJZFRvSW50ZXJhY3Rpb25Db25uZWN0aW9uTWFwID0KKyAgICAgICAgbmV3IFNwYXJzZUFycmF5PElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uPigpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxMaXN0PFNlcnZpY2VJbmZvPj4gbUZlZWRiYWNrVHlwZVRvRW5hYmxlZFNlcnZpY2VzTWFwID0KLSAgICAgICAgbmV3IFNwYXJzZUFycmF5PExpc3Q8U2VydmljZUluZm8+PigpOworICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8SUJpbmRlcj4gbVdpbmRvd0lkVG9XaW5kb3dUb2tlbk1hcCA9IG5ldyBTcGFyc2VBcnJheTxJQmluZGVyPigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTaW1wbGVTdHJpbmdTcGxpdHRlciBtU3RyaW5nQ29sb25TcGxpdHRlciA9IG5ldyBTaW1wbGVTdHJpbmdTcGxpdHRlcignOicpOwogCiAgICAgcHJpdmF0ZSBQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7CiAKICAgICBwcml2YXRlIGludCBtSGFuZGxlZEZlZWRiYWNrVHlwZXMgPSAwOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0VuYWJsZWQ7CisKICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlJbnB1dEZpbHRlciBtSW5wdXRGaWx0ZXI7CiAKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBtRW5hYmxlZFNlcnZpY2VzRm9yRmVlZGJhY2tUZW1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPigpOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNJbnB1dEZpbHRlcjsKKworICAgIHByaXZhdGUgZmluYWwgV2luZG93TWFuYWdlclNlcnZpY2UgbVdpbmRvd01hbmFnZXJTZXJ2aWNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZWN1cml0eVBvbGljeSBtU2VjdXJpdHlQb2xpY3k7CisKICAgICAvKioKICAgICAgKiBIYW5kbGVyIGZvciBkZWxheWVkIGV2ZW50IGRpc3BhdGNoLgogICAgICAqLwpAQCAtMTI3LDkgKzE1MCw2IEBACiAKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgICAgICBub3RpZnlFdmVudExpc3RlbmVyTG9ja2VkKHNlcnZpY2UsIGV2ZW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG9sZEV2ZW50ID0gc2VydmljZS5tUGVuZGluZ0V2ZW50cy5nZXQoZXZlbnRUeXBlKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLm1QZW5kaW5nRXZlbnRzLnJlbW92ZShldmVudFR5cGUpOwotICAgICAgICAgICAgICAgIHRyeVJlY3ljbGVMb2NrZWQob2xkRXZlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKQEAgLTE0Myw2ICsxNjMsOSBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IG1Db250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgIG1DYWxsZXIgPSBuZXcgSGFuZGxlckNhbGxlcihjb250ZXh0LCB0aGlzKTsKKyAgICAgICAgbVdpbmRvd01hbmFnZXJTZXJ2aWNlID0gKFdpbmRvd01hbmFnZXJTZXJ2aWNlKSBTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOworICAgICAgICBtU2VjdXJpdHlQb2xpY3kgPSBuZXcgU2VjdXJpdHlQb2xpY3koKTsKIAogICAgICAgICByZWdpc3RlclBhY2thZ2VDaGFuZ2VBbmRCb290Q29tcGxldGVkQnJvYWRjYXN0UmVjZWl2ZXIoKTsKICAgICAgICAgcmVnaXN0ZXJTZXR0aW5nc0NvbnRlbnRPYnNlcnZlcnMoKTsKQEAgLTIwNiw3ICsyMjksNiBAQAogICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkgPT0gSW50ZW50LkFDVElPTl9CT09UX0NPTVBMRVRFRCkgewogICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdExvY2tlZCgpOwotCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGFjY2Vzc2liaWxpdHkgZW5hYmxlZCBzZXR0aW5nIG9uIGJvb3QKICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc0VuYWJsZWQgPSBTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuQUNDRVNTSUJJTElUWV9FTkFCTEVELCAwKSA9PSAxOwpAQCAtMjIxLDcgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgICAgc3VwZXIub25SZWNlaXZlKGNvbnRleHQsIGludGVudCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC0yNzYsNDIgKzI5OCw2MCBAQAogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQ2xpZW50KElBY2Nlc3NpYmlsaXR5TWFuYWdlckNsaWVudCBjbGllbnQpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRDbGllbnQoSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGNsaWVudCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgZmluYWwgSUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50IGFkZGVkQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgbUNsaWVudHMuYWRkKGFkZGVkQ2xpZW50KTsKKyAgICAgICAgICAgIC8vIENsaWVudHMgYXJlIHJlZ2lzdGVyZWQgYWxsIHRoZSB0aW1lIHVudGlsIHRoZWlyIHByb2Nlc3MgaXMKKyAgICAgICAgICAgIC8vIGtpbGxlZCwgdGhlcmVmb3JlIHdlIGRvIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyB1bmxpbmtUb0RlYXRoLgorICAgICAgICAgICAgY2xpZW50LmFzQmluZGVyKCkubGlua1RvRGVhdGgobmV3IERlYXRoUmVjaXBpZW50KCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLnJlbW92ZShhZGRlZENsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgIHJldHVybiBtSXNFbmFibGVkOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gc2VuZEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbm90aWZ5QWNjZXNzaWJpbGl0eVNlcnZpY2VzRGVsYXllZExvY2tlZChldmVudCwgZmFsc2UpOwotICAgICAgICAgICAgbm90aWZ5QWNjZXNzaWJpbGl0eVNlcnZpY2VzRGVsYXllZExvY2tlZChldmVudCwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAobVNlY3VyaXR5UG9saWN5LmNhbkRpc3BhdGNoQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIG1TZWN1cml0eVBvbGljeS51cGRhdGVSZXRyaWV2YWxBbGxvd2luZ1dpbmRvd0FuZEV2ZW50U291cmNlTG9ja2VkKGV2ZW50KTsKKyAgICAgICAgICAgICAgICBub3RpZnlBY2Nlc3NpYmlsaXR5U2VydmljZXNEZWxheWVkTG9ja2VkKGV2ZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QWNjZXNzaWJpbGl0eVNlcnZpY2VzRGVsYXllZExvY2tlZChldmVudCwgdHJ1ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gZXZlbnQgbm90IHNjaGVkdWxlZCBmb3IgZGlzcGF0Y2ggPT4gcmVjeWNsZQotICAgICAgICBpZiAobUhhbmRsZWRGZWVkYmFja1R5cGVzID09IDApIHsKLSAgICAgICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1IYW5kbGVkRmVlZGJhY2tUeXBlcyA9IDA7Ci0gICAgICAgIH0KLQorICAgICAgICBldmVudC5yZWN5Y2xlKCk7CisgICAgICAgIG1IYW5kbGVkRmVlZGJhY2tUeXBlcyA9IDA7CiAgICAgICAgIHJldHVybiAoT1dOX1BST0NFU1NfSUQgIT0gQmluZGVyLmdldENhbGxpbmdQaWQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIExpc3Q8U2VydmljZUluZm8+IGdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHsKKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEluc3RhbGxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIG1JbnN0YWxsZWRTZXJ2aWNlczsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VJbmZvPiBnZXRFbmFibGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KGludCBmZWVkYmFja1R5cGUpIHsKKyAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+IGdldEVuYWJsZWRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoaW50IGZlZWRiYWNrVHlwZSkgeworICAgICAgICBMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gcmVzdWx0ID0gbUVuYWJsZWRTZXJ2aWNlc0ZvckZlZWRiYWNrVGVtcExpc3Q7CisgICAgICAgIHJlc3VsdC5jbGVhcigpOworICAgICAgICBMaXN0PFNlcnZpY2U+IHNlcnZpY2VzID0gbVNlcnZpY2VzOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBlbmFibGVkU2VydmljZXMgPSBtRmVlZGJhY2tUeXBlVG9FbmFibGVkU2VydmljZXNNYXAuZ2V0KGZlZWRiYWNrVHlwZSk7Ci0gICAgICAgICAgICBpZiAoZW5hYmxlZFNlcnZpY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICB3aGlsZSAoZmVlZGJhY2tUeXBlICE9IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmVlZGJhY2tUeXBlQml0ID0gKDEgPDwgSW50ZWdlci5udW1iZXJPZlRyYWlsaW5nWmVyb3MoZmVlZGJhY2tUeXBlKSk7CisgICAgICAgICAgICAgICAgZmVlZGJhY2tUeXBlICY9IH5mZWVkYmFja1R5cGVCaXQ7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlcnZpY2VDb3VudCA9IHNlcnZpY2VzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChzZXJ2aWNlLm1GZWVkYmFja1R5cGUgJiBmZWVkYmFja1R5cGVCaXQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoc2VydmljZS5tQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlbmFibGVkU2VydmljZXM7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBpbnRlcnJ1cHQoKSB7CkBAIC0zMjEsMTYgKzM2MSw4IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tU2VydmljZUludGVyZmFjZS5vbkludGVycnVwdCgpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmUgaW5zdGFuY2VvZiBEZWFkT2JqZWN0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkRlYWQgIiArIHNlcnZpY2UubVNlcnZpY2UgKyAiLiBDbGVhbmluZyB1cC4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVEZWFkU2VydmljZUxvY2tlZChzZXJ2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciBkdXJpbmcgc2VuZGluZyBpbnRlcnJ1cHQgcmVxdWVzdCB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VydmljZS5tU2VydmljZSwgcmUpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgZHVyaW5nIHNlbmRpbmcgaW50ZXJydXB0IHJlcXVlc3QgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlLm1TZXJ2aWNlLCByZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMzgsMzAgKzM3MCw5NCBAQAogCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CiAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIERPX1NFVF9TRVJWSUNFX0lORk86CisgICAgICAgICAgICBjYXNlIERPX1NFVF9TRVJWSUNFX0lORk86IHsKICAgICAgICAgICAgICAgICBTb21lQXJncyBhcmd1bWVudHMgPSAoKFNvbWVBcmdzKSBtZXNzYWdlLm9iaik7CiAKICAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbyA9IChBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pIGFyZ3VtZW50cy5hcmcxOwogICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKSBhcmd1bWVudHMuYXJnMjsKIAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tRXZlbnRUeXBlcyA9IGluZm8uZXZlbnRUeXBlczsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tRmVlZGJhY2tUeXBlID0gaW5mby5mZWVkYmFja1R5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyA9IGluZm8ucGFja2FnZU5hbWVzOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UubVBhY2thZ2VOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYWNrYWdlTmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhNTCBtYW5pZmVzdCBoYWQgZGF0YSB0byBjb25maWd1cmUgdGhlIHNlcnZpY2UgaXRzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFscmVhZHkgc2V0LiBJbiBzdWNoIGEgY2FzZSB1cGRhdGUgb25seSB0aGUgZHluYW1pY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJhYmxlIHByb3BlcnRpZXMuCisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBvbGRJbmZvID0gc2VydmljZS5tQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGRJbmZvLnVwZGF0ZUR5bmFtaWNhbGx5Q29uZmlndXJhYmxlUHJvcGVydGllcyhpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0RHluYW1pY2FsbHlDb25maWd1cmFibGVQcm9wZXJ0aWVzKG9sZEluZm8pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5zZXREeW5hbWljYWxseUNvbmZpZ3VyYWJsZVByb3BlcnRpZXMoaW5mbyk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tTm90aWZpY2F0aW9uVGltZW91dCA9IGluZm8ubm90aWZpY2F0aW9uVGltZW91dDsKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZS5tSXNEZWZhdWx0ID0gKGluZm8uZmxhZ3MgJiBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uREVGQVVMVCkgIT0gMDsKLQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZU9uRW5hYmxlZFNlcnZpY2Uoc2VydmljZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gcmV0dXJuOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIlVua25vd24gbWVzc2FnZSB0eXBlOiAiICsgbWVzc2FnZS53aGF0KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBpbnQgYWRkQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuLAorICAgICAgICAgICAgSUFjY2Vzc2liaWxpdHlJbnRlcmFjdGlvbkNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIElXaW5kb3cgYWRkZWRXaW5kb3dUb2tlbiA9IHdpbmRvd1Rva2VuOworICAgICAgICAgICAgZmluYWwgaW50IHdpbmRvd0lkID0gc05leHRXaW5kb3dJZCsrOworICAgICAgICAgICAgY29ubmVjdGlvbi5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG5ldyBEZWF0aFJlY2lwaWVudCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uKGFkZGVkV2luZG93VG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMCk7CisgICAgICAgICAgICBtV2luZG93SWRUb1dpbmRvd1Rva2VuTWFwLnB1dCh3aW5kb3dJZCwgYWRkZWRXaW5kb3dUb2tlbi5hc0JpbmRlcigpKTsKKyAgICAgICAgICAgIG1XaW5kb3dJZFRvSW50ZXJhY3Rpb25Db25uZWN0aW9uTWFwLnB1dCh3aW5kb3dJZCwgY29ubmVjdGlvbik7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgIkFkZGluZyBpbnRlcmFjdGlvbiBjb25uZWN0aW9uIHRvIHdpbmRvd0lkOiAiICsgd2luZG93SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdpbmRvd0lkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbihJV2luZG93IHdpbmRvd1Rva2VuKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAudmFsdWVBdChpKSA9PSB3aW5kb3dUb2tlbi5hc0JpbmRlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dJZCA9IG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dJZFRvV2luZG93VG9rZW5NYXAucmVtb3ZlKHdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvd0lkVG9JbnRlcmFjdGlvbkNvbm5lY3Rpb25NYXAucmVtb3ZlKHdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoTE9HX1RBRywgIlJlbW92aW5nIGludGVyYWN0aW9uIGNvbm5lY3Rpb24gdG8gd2luZG93SWQ6ICIgKyB3aW5kb3dJZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uIHJlZ2lzdGVyRXZlbnRMaXN0ZW5lcihJRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBtU2VjdXJpdHlQb2xpY3kuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVUUklFVkVfV0lORE9XX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgRlVOQ1RJT05fUkVHSVNURVJfRVZFTlRfTElTVEVORVIpOworICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBuZXcgQ29tcG9uZW50TmFtZSgiZm9vLmJhciIsICJGYWtlQWNjZXNzaWJpbGl0eVNlcnZpY2UiKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgU2VydmljZSBvbGRTZXJ2aWNlID0gbUNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAuZ2V0KGNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgaWYgKG9sZFNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeVJlbW92ZVNlcnZpY2VMb2NrZWQob2xkU2VydmljZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGlzIEFQSSBpcyBpbnRlbmRlZCBmb3IgdGVzdGluZyBzbyBlbmFibGUgYWNjZXNzaWJpbGl0eSB0byBtYWtlCisgICAgICAgICAgICAvLyBzdXJlIGNsaWVudHMgY2FuIHN0YXJ0IHBva2luZyB3aXRoIHRoZSB3aW5kb3cgY29udGVudC4KKyAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5wdXRJbnQobUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCksCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BQ0NFU1NJQklMSVRZX0VOQUJMRUQsIDEpOworICAgICAgICAgICAgLy8gQWxzbyBkaXNhYmxlIGFsbCBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIHRvIGF2b2lkIGludGVyZmVyZW5jZQorICAgICAgICAgICAgLy8gd2l0aCB0aGUgdGVzdHMuCisgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0U3RyaW5nKG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TZWN1cmUuRU5BQkxFRF9BQ0NFU1NJQklMSVRZX1NFUlZJQ0VTLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8oKTsKKyAgICAgICAgYWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLmV2ZW50VHlwZXMgPSBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRVNfQUxMX01BU0s7CisgICAgICAgIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5mZWVkYmFja1R5cGUgPSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfR0VORVJJQzsKKyAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoY29tcG9uZW50TmFtZSwgYWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLCB0cnVlKTsKKyAgICAgICAgc2VydmljZS5vblNlcnZpY2VDb25uZWN0ZWQoY29tcG9uZW50TmFtZSwgbGlzdGVuZXIuYXNCaW5kZXIoKSk7CisgICAgICAgIHJldHVybiBzZXJ2aWNlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFBvcHVsYXRlcyB0aGUgY2FjaGVkIGxpc3Qgb2YgaW5zdGFsbGVkIHtAbGluayBBY2Nlc3NpYmlsaXR5U2VydmljZX1zLgogICAgICAqLwpAQCAtMzY5LDEwICs0NjUsMjAgQEAKICAgICAgICAgbUluc3RhbGxlZFNlcnZpY2VzLmNsZWFyKCk7CiAKICAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gaW5zdGFsbGVkU2VydmljZXMgPSBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcygKLSAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEFjY2Vzc2liaWxpdHlTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKSwgUGFja2FnZU1hbmFnZXIuR0VUX1NFUlZJQ0VTKTsKKyAgICAgICAgICAgICAgICBuZXcgSW50ZW50KEFjY2Vzc2liaWxpdHlTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKSwKKyAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfU0VSVklDRVMgfCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBpbnN0YWxsZWRTZXJ2aWNlcy5zaXplKCk7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtSW5zdGFsbGVkU2VydmljZXMuYWRkKGluc3RhbGxlZFNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyk7CisgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGluc3RhbGxlZFNlcnZpY2VzLmdldChpKTsKKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm87CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyA9IG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8ocmVzb2x2ZUluZm8sIG1Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBtSW5zdGFsbGVkU2VydmljZXMuYWRkKGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyk7CisgICAgICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIHhwcGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIHdoaWxlIGluaXRpYWxpemluZyBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8iLCB4cHBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyIsIGlvZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxNCw0NiArNTIwLDI3IEBACiAgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFjY2Vzc2liaWxpdHlTZXJ2aWNlRGVsYXllZExvY2tlZChTZXJ2aWNlIHNlcnZpY2UsCiAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaW50IGV2ZW50VHlwZSA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZSA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkgc2luY2UgZHVyaW5nIGRpc3BhdGNoIGl0IGlzIHBvc3NpYmxlIHRoZSBldmVudCB0bworICAgICAgICAgICAgLy8gYmUgbW9kaWZpZWQgdG8gcmVtb3ZlIGl0cyBzb3VyY2UgaWYgdGhlIHJlY2VpdmluZyBzZXJ2aWNlIGRvZXMKKyAgICAgICAgICAgIC8vIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSB3aW5kb3cgY29udGVudC4KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBuZXdFdmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oZXZlbnQpOwogICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IG9sZEV2ZW50ID0gc2VydmljZS5tUGVuZGluZ0V2ZW50cy5nZXQoZXZlbnRUeXBlKTsKLSAgICAgICAgICAgIHNlcnZpY2UubVBlbmRpbmdFdmVudHMucHV0KGV2ZW50VHlwZSwgZXZlbnQpOworICAgICAgICAgICAgc2VydmljZS5tUGVuZGluZ0V2ZW50cy5wdXQoZXZlbnRUeXBlLCBuZXdFdmVudCk7CiAKLSAgICAgICAgICAgIGludCB3aGF0ID0gZXZlbnRUeXBlIHwgKHNlcnZpY2UubUlkIDw8IDE2KTsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gZXZlbnRUeXBlIHwgKHNlcnZpY2UubUlkIDw8IDE2KTsKICAgICAgICAgICAgIGlmIChvbGRFdmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMod2hhdCk7Ci0gICAgICAgICAgICAgICAgdHJ5UmVjeWNsZUxvY2tlZChvbGRFdmVudCk7CisgICAgICAgICAgICAgICAgb2xkRXZlbnQucmVjeWNsZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKHdoYXQsIHNlcnZpY2UpOwotICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gZXZlbnQuZ2V0RXZlbnRUeXBlKCk7CisgICAgICAgICAgICBtZXNzYWdlLmFyZzEgPSBldmVudFR5cGU7CiAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobWVzc2FnZSwgc2VydmljZS5tTm90aWZpY2F0aW9uVGltZW91dCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWN5Y2xlcyBhbiBldmVudCBpZiBpdCBjYW4gYmUgc2FmZWx5IHJlY3ljbGVkLiBUaGUgY29uZGl0aW9uIGlzIHRoYXQgbm8KLSAgICAgKiBub3Qgbm90aWZpZWQgc2VydmljZSBpcyBpbnRlcmVzdGVkIGluIHRoZSBldmVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHRyeVJlY3ljbGVMb2NrZWQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGV2ZW50VHlwZSA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOwotICAgICAgICBMaXN0PFNlcnZpY2U+IHNlcnZpY2VzID0gbVNlcnZpY2VzOwotCi0gICAgICAgIC8vIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIHNlcnZpY2Ugd2hpY2ggaXMgbm90IGxhcmdlCi0gICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IHNlcnZpY2VzLnNpemUoKTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlLm1QZW5kaW5nRXZlbnRzLmdldChldmVudFR5cGUpID09IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV2ZW50LnJlY3ljbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBOb3RpZmllcyBhIHNlcnZpY2UgZm9yIGEgc2NoZWR1bGVkIGV2ZW50IGdpdmVuIHRoZSBldmVudCB0eXBlLgogICAgICAqCiAgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UuCkBAIC00NjIsMzUgKzU0OSw1OSBAQAogICAgIHByaXZhdGUgdm9pZCBub3RpZnlFdmVudExpc3RlbmVyTG9ja2VkKFNlcnZpY2Ugc2VydmljZSwgaW50IGV2ZW50VHlwZSkgewogICAgICAgICBJRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IHNlcnZpY2UubVNlcnZpY2VJbnRlcmZhY2U7CiAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IHNlcnZpY2UubVBlbmRpbmdFdmVudHMuZ2V0KGV2ZW50VHlwZSk7Ci0KKyAgICAgICAgc2VydmljZS5tUGVuZGluZ0V2ZW50cy5yZW1vdmUoZXZlbnRUeXBlKTsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtU2VjdXJpdHlQb2xpY3kuY2FuUmV0cmlldmVXaW5kb3dDb250ZW50KHNlcnZpY2UpKSB7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q29ubmVjdGlvbihzZXJ2aWNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXZlbnQuc2V0U291cmNlKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXZlbnQuc2V0U2VhbGVkKHRydWUpOwogICAgICAgICAgICAgbGlzdGVuZXIub25BY2Nlc3NpYmlsaXR5RXZlbnQoZXZlbnQpOworICAgICAgICAgICAgZXZlbnQucmVjeWNsZSgpOwogICAgICAgICAgICAgaWYgKERFQlVHKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJFdmVudCAiICsgZXZlbnQgKyAiIHNlbnQgdG8gIiArIGxpc3RlbmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICBpZiAocmUgaW5zdGFuY2VvZiBEZWFkT2JqZWN0RXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJEZWFkICIgKyBzZXJ2aWNlLm1TZXJ2aWNlICsgIi4gQ2xlYW5pbmcgdXAuIik7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGVhZFNlcnZpY2VMb2NrZWQoc2VydmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiRXJyb3IgZHVyaW5nIHNlbmRpbmcgIiArIGV2ZW50ICsgIiB0byAiICsgc2VydmljZS5tU2VydmljZSwgcmUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciBkdXJpbmcgc2VuZGluZyAiICsgZXZlbnQgKyAiIHRvICIgKyBzZXJ2aWNlLm1TZXJ2aWNlLCByZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgZGVhZCBzZXJ2aWNlLgorICAgICAqIEFkZHMgYSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gYWRkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0cnlBZGRTZXJ2aWNlTG9ja2VkKFNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1TZXJ2aWNlcy5jb250YWlucyhzZXJ2aWNlKSB8fCAhc2VydmljZS5pc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZpY2UubGlua1RvT3duRGVhdGgoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlcy5hZGQoc2VydmljZSk7CisgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcC5wdXQoc2VydmljZS5tQ29tcG9uZW50TmFtZSwgc2VydmljZSk7CisgICAgICAgICAgICB1cGRhdGVJbnB1dEZpbHRlckxvY2tlZCgpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHNlcnZpY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZS4KICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlcnZpY2Ugd2FzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRGVhZFNlcnZpY2VMb2NrZWQoU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJEZWFkIHNlcnZpY2UgIiArIHNlcnZpY2UubVNlcnZpY2UgKyAiIHJlbW92ZWQiKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdHJ5UmVtb3ZlU2VydmljZUxvY2tlZChTZXJ2aWNlIHNlcnZpY2UpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZW1vdmVkID0gbVNlcnZpY2VzLnJlbW92ZShzZXJ2aWNlKTsKKyAgICAgICAgaWYgKCFyZW1vdmVkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgbUNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAucmVtb3ZlKHNlcnZpY2UubUNvbXBvbmVudE5hbWUpOwogICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhzZXJ2aWNlLm1JZCk7Ci0gICAgICAgIHVwZGF0ZVN0YXRlT25EaXNhYmxlZFNlcnZpY2Uoc2VydmljZSk7Ci0gICAgICAgIHJldHVybiBtU2VydmljZXMucmVtb3ZlKHNlcnZpY2UpOworICAgICAgICBzZXJ2aWNlLnVubGlua1RvT3duRGVhdGgoKTsKKyAgICAgICAgdXBkYXRlSW5wdXRGaWx0ZXJMb2NrZWQoKTsKKyAgICAgICAgcmV0dXJuIHJlbW92ZWQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTMsMTEgKzYyNCw2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXNlcnZpY2UubVNlcnZpY2UuaXNCaW5kZXJBbGl2ZSgpKSB7Ci0gICAgICAgICAgICByZW1vdmVEZWFkU2VydmljZUxvY2tlZChzZXJ2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCiAgICAgICAgIGludCBldmVudFR5cGUgPSBldmVudC5nZXRFdmVudFR5cGUoKTsKICAgICAgICAgaWYgKChzZXJ2aWNlLm1FdmVudFR5cGVzICYgZXZlbnRUeXBlKSAhPSBldmVudFR5cGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU5NSwyMiArNzAxLDIyIEBACiAgICAgICogQHBhcmFtIGluc3RhbGxlZFNlcnZpY2VzIEFsbCBpbnN0YWxsZWQge0BsaW5rIEFjY2Vzc2liaWxpdHlTZXJ2aWNlfXMuCiAgICAgICogQHBhcmFtIGVuYWJsZWRTZXJ2aWNlcyBUaGUge0BsaW5rIENvbXBvbmVudE5hbWV9cyBvZiB0aGUgZW5hYmxlZCBzZXJ2aWNlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VydmljZXNTdGF0ZUxvY2tlZChMaXN0PFNlcnZpY2VJbmZvPiBpbnN0YWxsZWRTZXJ2aWNlcywKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VydmljZXNTdGF0ZUxvY2tlZChMaXN0PEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbz4gaW5zdGFsbGVkU2VydmljZXMsCiAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50TmFtZT4gZW5hYmxlZFNlcnZpY2VzKSB7CiAKICAgICAgICAgTWFwPENvbXBvbmVudE5hbWUsIFNlcnZpY2U+IGNvbXBvbmVudE5hbWVUb1NlcnZpY2VNYXAgPSBtQ29tcG9uZW50TmFtZVRvU2VydmljZU1hcDsKICAgICAgICAgYm9vbGVhbiBpc0VuYWJsZWQgPSBtSXNFbmFibGVkOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IGluc3RhbGxlZFNlcnZpY2VzLnNpemUoKTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIGludGFsbGVkU2VydmljZSA9IGluc3RhbGxlZFNlcnZpY2VzLmdldChpKTsKLSAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSA9IG5ldyBDb21wb25lbnROYW1lKGludGFsbGVkU2VydmljZS5wYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgaW50YWxsZWRTZXJ2aWNlLm5hbWUpOworICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluc3RhbGxlZFNlcnZpY2UgPSBpbnN0YWxsZWRTZXJ2aWNlcy5nZXQoaSk7CisgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZFNlcnZpY2UuZ2V0SWQoKSk7CiAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBjb21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLmdldChjb21wb25lbnROYW1lKTsKIAogICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgIGlmIChlbmFibGVkU2VydmljZXMuY29udGFpbnMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IG5ldyBTZXJ2aWNlKGNvbXBvbmVudE5hbWUsIGludGFsbGVkU2VydmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gbmV3IFNlcnZpY2UoY29tcG9uZW50TmFtZSwgaW5zdGFsbGVkU2VydmljZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuYmluZCgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuYWJsZWRTZXJ2aWNlcy5jb250YWlucyhjb21wb25lbnROYW1lKSkgewpAQCAtNjQyLDY0ICs3NDgsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBpbnB1dCBmaWx0ZXIgc3RhdGUuIElmIHRoZSBmaWx0ZXIgaXMgaW4gZW5hYmxlZCBpdCBpcyByZWdpc3RlcmVkCi0gICAgICogaW4gdGhlIHdpbmRvdyBtYW5hZ2VyLCBvdGhlcndpc2UgdGhlIGZpbHRlciBpcyByZW1vdmVkIGZyb20gdGhlIGxhdHRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBlbmFibGVkIFdoZXRoZXIgdGhlIGlucHV0IGZpbHRlciBpcyBlbmFibGVkLgorICAgICAqIFVwZGF0ZXMgdGhlIGlucHV0IGZpbHRlciBzdGF0ZS4gVGhlIGZpbHRlciBpcyBlbmFibGVkIGlmIGFjY2Vzc2liaWxpdHkKKyAgICAgKiBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIHByb3ZpZGluZworICAgICAqIHNwb2tlbiBmZWVkYmFjay4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXRGaWx0ZXJFbmFibGVkTG9ja2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZSB3bSA9IChXaW5kb3dNYW5hZ2VyU2VydmljZSlTZXJ2aWNlTWFuYWdlci5nZXRTZXJ2aWNlKAotICAgICAgICAgICAgICAgIENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotICAgICAgICBpZiAod20gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlSW5wdXRGaWx0ZXJMb2NrZWQoKSB7CisgICAgICAgIGlmIChtSXNFbmFibGVkKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc1Nwb2tlbkZlZWRiYWNrU2VydmljZXMgPSAhZ2V0RW5hYmxlZEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkZFRURCQUNLX1NQT0tFTikuaXNFbXB0eSgpOworICAgICAgICAgICAgaWYgKGhhc1Nwb2tlbkZlZWRiYWNrU2VydmljZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAobUhhc0lucHV0RmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEZpbHRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbHRlciA9IG5ldyBBY2Nlc3NpYmlsaXR5SW5wdXRGaWx0ZXIobUNvbnRleHQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3bS5zZXRJbnB1dEZpbHRlcihtSW5wdXRGaWx0ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB3bS5zZXRJbnB1dEZpbHRlcihudWxsKTsKKyAgICAgICAgICAgICAgICBtV2luZG93TWFuYWdlclNlcnZpY2Uuc2V0SW5wdXRGaWx0ZXIobUlucHV0RmlsdGVyKTsKKyAgICAgICAgICAgICAgICBtSGFzSW5wdXRGaWx0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHNldCBvZiBlbmFibGVkIHNlcnZpY2VzIGZvciBhIGdpdmVuIGZlZWRiYWNrIHR5cGUgYW5kCi0gICAgICogaWYgbW9yZSB0aGFuIG9uZSBvZiB0aGVtIHByb3ZpZGVzIHNwb2tlbiBmZWVkYmFjayBlbmFibGVzIHRvdWNoCi0gICAgICogZXhwbG9yYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZSBBbiBlbmFibGUgc2VydmljZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGVPbkVuYWJsZWRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBpbnQgZmVlZGJhY2tUeXBlID0gc2VydmljZS5tRmVlZGJhY2tUeXBlOwotICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBlbmFibGVkU2VydmljZXMgPSBtRmVlZGJhY2tUeXBlVG9FbmFibGVkU2VydmljZXNNYXAuZ2V0KGZlZWRiYWNrVHlwZSk7Ci0gICAgICAgIGlmIChlbmFibGVkU2VydmljZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgZW5hYmxlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlSW5mbz4oKTsKLSAgICAgICAgICAgIG1GZWVkYmFja1R5cGVUb0VuYWJsZWRTZXJ2aWNlc01hcC5wdXQoZmVlZGJhY2tUeXBlLCBlbmFibGVkU2VydmljZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVuYWJsZWRTZXJ2aWNlcy5hZGQoc2VydmljZS5tU2VydmljZUluZm8pOwotCi0gICAgICAgIC8vIFdlIGVuYWJsZSB0b3VjaCBleHBsb3JhdGlvbiBpZiBhdCBsZWFzdCBvbmUKLSAgICAgICAgLy8gZW5hYmxlZCBzZXJ2aWNlIHByb3ZpZGVzIHNwb2tlbiBmZWVkYmFjay4KLSAgICAgICAgaWYgKGVuYWJsZWRTZXJ2aWNlcy5zaXplKCkgPiAwCi0gICAgICAgICAgICAgICAgJiYgc2VydmljZS5tRmVlZGJhY2tUeXBlID09IEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5GRUVEQkFDS19TUE9LRU4pIHsKLSAgICAgICAgICAgIHVwZGF0ZUNsaWVudHNMb2NrZWQoKTsKLSAgICAgICAgICAgIHNldElucHV0RmlsdGVyRW5hYmxlZExvY2tlZCh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZU9uRGlzYWJsZWRTZXJ2aWNlKFNlcnZpY2Ugc2VydmljZSkgewotICAgICAgICBMaXN0PFNlcnZpY2VJbmZvPiBlbmFibGVkU2VydmljZXMgPQotICAgICAgICAgICAgbUZlZWRiYWNrVHlwZVRvRW5hYmxlZFNlcnZpY2VzTWFwLmdldChzZXJ2aWNlLm1GZWVkYmFja1R5cGUpOwotICAgICAgICBpZiAoZW5hYmxlZFNlcnZpY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBlbmFibGVkU2VydmljZXMucmVtb3ZlKHNlcnZpY2UubVNlcnZpY2VJbmZvKTsKLSAgICAgICAgLy8gV2UgZGlzYWJsZSB0b3VjaCBleHBsb3JhdGlvbiBpZiBubwotICAgICAgICAvLyBlbmFibGVkIHNlcnZpY2UgcHJvdmlkZXMgc3Bva2VuIGZlZWRiYWNrLgotICAgICAgICBpZiAoZW5hYmxlZFNlcnZpY2VzLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICYmIHNlcnZpY2UubUZlZWRiYWNrVHlwZSA9PSBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uRkVFREJBQ0tfU1BPS0VOKSB7Ci0gICAgICAgICAgICB1cGRhdGVDbGllbnRzTG9ja2VkKCk7Ci0gICAgICAgICAgICBzZXRJbnB1dEZpbHRlckVuYWJsZWRMb2NrZWQoZmFsc2UpOworICAgICAgICBpZiAobUhhc0lucHV0RmlsdGVyKSB7CisgICAgICAgICAgICBtV2luZG93TWFuYWdlclNlcnZpY2Uuc2V0SW5wdXRGaWx0ZXIobnVsbCk7CisgICAgICAgICAgICBtSGFzSW5wdXRGaWx0ZXIgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzExLDEwICs3ODIsMTEgQEAKICAgICAgKiBwYXNzZWQgdG8gdGhlIHNlcnZpY2UgaXQgcmVwcmVzZW50cyBhcyBzb29uIGl0IGlzIGJvdW5kLiBJdCBhbHNvIHNlcnZlcyBhcyB0aGUKICAgICAgKiBjb25uZWN0aW9uIGZvciB0aGUgc2VydmljZS4KICAgICAgKi8KLSAgICBjbGFzcyBTZXJ2aWNlIGV4dGVuZHMgSUFjY2Vzc2liaWxpdHlTZXJ2aWNlQ29ubmVjdGlvbi5TdHViIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24geworICAgIGNsYXNzIFNlcnZpY2UgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eVNlcnZpY2VDb25uZWN0aW9uLlN0dWIKKyAgICAgICAgICAgIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24sIERlYXRoUmVjaXBpZW50IHsKICAgICAgICAgaW50IG1JZCA9IDA7CiAKLSAgICAgICAgU2VydmljZUluZm8gbVNlcnZpY2VJbmZvOworICAgICAgICBBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gbUFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIAogICAgICAgICBJQmluZGVyIG1TZXJ2aWNlOwogCkBAIC03MzAsMjUgKzgwMiw1NCBAQAogCiAgICAgICAgIGxvbmcgbU5vdGlmaWNhdGlvblRpbWVvdXQ7CiAKLSAgICAgICAgYm9vbGVhbiBtSXNBY3RpdmU7Ci0KICAgICAgICAgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKIAogICAgICAgICBJbnRlbnQgbUludGVudDsKIAorICAgICAgICBib29sZWFuIG1DYW5SZXRyaWV2ZVNjcmVlbkNvbnRlbnQ7CisKKyAgICAgICAgYm9vbGVhbiBtSXNGYWtlOworCisgICAgICAgIGZpbmFsIENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBDYWxsYmFjaygpOworCisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgbUludGVyYWN0aW9uSWRDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKwogICAgICAgICAvLyB0aGUgZXZlbnRzIHBlbmRpbmcgZXZlbnRzIHRvIGJlIGRpc3BhdGNoZWQgdG8gdGhpcyBzZXJ2aWNlCiAgICAgICAgIGZpbmFsIFNwYXJzZUFycmF5PEFjY2Vzc2liaWxpdHlFdmVudD4gbVBlbmRpbmdFdmVudHMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PEFjY2Vzc2liaWxpdHlFdmVudD4oKTsKIAotICAgICAgICBTZXJ2aWNlKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSwgU2VydmljZUluZm8gc2VydmljZUluZm8pIHsKKyAgICAgICAgcHVibGljIFNlcnZpY2UoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8sIGJvb2xlYW4gaXNGYWtlKSB7CiAgICAgICAgICAgICBtSWQgPSBzSWRDb3VudGVyKys7CiAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgICAgICBtU2VydmljZUluZm8gPSBzZXJ2aWNlSW5mbzsKLSAgICAgICAgICAgIG1JbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIG1JbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0NMSUVOVF9MQUJFTCwKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWNjZXNzaWJpbGl0eV9iaW5kaW5nX2xhYmVsKTsKLSAgICAgICAgICAgIG1JbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0NMSUVOVF9JTlRFTlQsIFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkoCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwLCBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9BQ0NFU1NJQklMSVRZX1NFVFRJTkdTKSwgMCkpOworICAgICAgICAgICAgbUFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyA9IGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKKyAgICAgICAgICAgIG1Jc0Zha2UgPSBpc0Zha2U7CisgICAgICAgICAgICBpZiAoIWlzRmFrZSkgeworICAgICAgICAgICAgICAgIG1DYW5SZXRyaWV2ZVNjcmVlbkNvbnRlbnQgPSBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8uZ2V0Q2FuUmV0cmlldmVXaW5kb3dDb250ZW50KCk7CisgICAgICAgICAgICAgICAgbUludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDb21wb25lbnQobUNvbXBvbmVudE5hbWUpOworICAgICAgICAgICAgICAgIG1JbnRlbnQucHV0RXh0cmEoSW50ZW50LkVYVFJBX0NMSUVOVF9MQUJFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLmFjY2Vzc2liaWxpdHlfYmluZGluZ19sYWJlbCk7CisgICAgICAgICAgICAgICAgbUludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfQ0xJRU5UX0lOVEVOVCwgUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LCAwLCBuZXcgSW50ZW50KFNldHRpbmdzLkFDVElPTl9BQ0NFU1NJQklMSVRZX1NFVFRJTkdTKSwgMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ2FuUmV0cmlldmVTY3JlZW5Db250ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldER5bmFtaWNhbGx5Q29uZmlndXJhYmxlUHJvcGVydGllcyhhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY2FsbHlDb25maWd1cmFibGVQcm9wZXJ0aWVzKEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBpbmZvKSB7CisgICAgICAgICAgICBtRXZlbnRUeXBlcyA9IGluZm8uZXZlbnRUeXBlczsKKyAgICAgICAgICAgIG1GZWVkYmFja1R5cGUgPSBpbmZvLmZlZWRiYWNrVHlwZTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHBhY2thZ2VOYW1lcyA9IGluZm8ucGFja2FnZU5hbWVzOworICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYWNrYWdlTmFtZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25UaW1lb3V0ID0gaW5mby5ub3RpZmljYXRpb25UaW1lb3V0OworICAgICAgICAgICAgbUlzRGVmYXVsdCA9IChpbmZvLmZsYWdzICYgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvLkRFRkFVTFQpICE9IDA7CisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICB0cnlBZGRTZXJ2aWNlTG9ja2VkKHRoaXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC03NTcsNyArODU4LDcgQEAKICAgICAgICAgICogQHJldHVybiBUcnVlIGlmIGJpbmRpbmcgaXMgc3VjY2Vzc2Z1bC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtSXNGYWtlICYmIG1TZXJ2aWNlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuYmluZFNlcnZpY2UobUludGVudCwgdGhpcywgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTc3MSwxMSArODcyLDEzIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiB1bmJpbmQoKSB7CiAgICAgICAgICAgICBpZiAobVNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5UmVtb3ZlU2VydmljZUxvY2tlZCh0aGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtSXNGYWtlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UodGhpcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKHRoaXMpOwotICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLnJlbW92ZShtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VzLnJlbW92ZSh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZU9uRGlzYWJsZWRTZXJ2aWNlKHRoaXMpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzg4LDcgKzg5MSw3IEBACiAgICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2VydmljZSBpcyBjb25maWd1cmVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1FdmVudFR5cGVzICE9IDAgJiYgbUZlZWRiYWNrVHlwZSAhPSAwKTsKKyAgICAgICAgICAgIHJldHVybiAobUV2ZW50VHlwZXMgIT0gMCAmJiBtRmVlZGJhY2tUeXBlICE9IDAgJiYgbVNlcnZpY2UgIT0gbnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlSW5mbyhBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gaW5mbykgewpAQCAtNzk4LDI0ICs5MDEsMzYxIEBACiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUsIElCaW5kZXIgc2VydmljZSkgewogICAgICAgICAgICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwogICAgICAgICAgICAgbVNlcnZpY2VJbnRlcmZhY2UgPSBJRXZlbnRMaXN0ZW5lci5TdHViLmFzSW50ZXJmYWNlKHNlcnZpY2UpOwotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1TZXJ2aWNlSW50ZXJmYWNlLnNldENvbm5lY3Rpb24odGhpcyk7CiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW1TZXJ2aWNlcy5jb250YWlucyh0aGlzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VzLmFkZCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLnB1dChjb21wb25lbnROYW1lLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnlBZGRTZXJ2aWNlTG9ja2VkKHRoaXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgewogICAgICAgICAgICAgICAgIFNsb2cudyhMT0dfVEFHLCAiRXJyb3Igd2hpbGUgc2V0dGluZyBDb250cm9sbGVyIGZvciBzZXJ2aWNlOiAiICsgc2VydmljZSwgcmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgeworICAgICAgICBwdWJsaWMgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9CeVZpZXdJZEluQWN0aXZlV2luZG93KGludCB2aWV3SWQpIHsKKyAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIFNlcnZpY2Ugc2VydmljZSA9IG1Db21wb25lbnROYW1lVG9TZXJ2aWNlTWFwLnJlbW92ZShjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZXMucmVtb3ZlKHNlcnZpY2UpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvbkdyYW50ZWQgPSBtU2VjdXJpdHlQb2xpY3kuY2FuUmV0cmlldmVXaW5kb3dDb250ZW50KHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uR3JhbnRlZCkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvblRvUmV0cmlldmFsQWxsb3dpbmdXaW5kb3dMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiTm8gaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0byBhIHJldHJpZXZlIGFsbG93aW5nIHdpbmRvdy4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5VG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBtSW50ZXJhY3Rpb25JZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlWaWV3SWQodmlld0lkLCBpbnRlcmFjdGlvbklkLCBtQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvID0gbUNhbGxiYWNrLmdldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHRBbmRDbGVhcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5zZXRDb25uZWN0aW9uKHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLnNldFNlYWxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIGZpbmRpbmcgbm9kZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zQnlWaWV3VGV4dEluQWN0aXZlV2luZG93KAorICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0KHRleHQsCisgICAgICAgICAgICAgICAgICAgIG1TZWN1cml0eVBvbGljeS5tUmV0cmlldmFsQWxvd2luZ1dpbmRvd0lkLCBWaWV3Lk5PX0lEKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NCeVZpZXdUZXh0KFN0cmluZyB0ZXh0LAorICAgICAgICAgICAgICAgIGludCBhY2Nlc3NpYmlsaXR5V2luZG93SWQsIGludCBhY2Nlc3NpYmlsaXR5Vmlld0lkKSB7CisgICAgICAgICAgICBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHBlcm1pc3Npb25HcmFudGVkID0KKyAgICAgICAgICAgICAgICAgICAgbVNlY3VyaXR5UG9saWN5LmNhbkdldEFjY2Vzc2liaWxpdHlOb2RlSW5mb0xvY2tlZCh0aGlzLCBhY2Nlc3NpYmlsaXR5V2luZG93SWQpOworICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uR3JhbnRlZCkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gZ2V0Q29ubmVjdGlvblRvUmV0cmlldmFsQWxsb3dpbmdXaW5kb3dMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiTm8gaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0byBmb2N1c2VkIHdpbmRvdy4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5VG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBtSW50ZXJhY3Rpb25JZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld1RleHQodGV4dCwgYWNjZXNzaWJpbGl0eVZpZXdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uSWQsIG1DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGluZm9zID0KKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrLmdldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zUmVzdWx0QW5kQ2xlYXIoaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKGluZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZm9Db3VudCA9IGluZm9zLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8gPSBpbmZvcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNldENvbm5lY3Rpb24odGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNldFNlYWxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mb3M7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciBmaW5kaW5nIG5vZGUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBCaW5kZXIucmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvQnlBY2Nlc3NpYmlsaXR5SWQoCisgICAgICAgICAgICAgICAgaW50IGFjY2Vzc2liaWxpdHlXaW5kb3dJZCwgaW50IGFjY2Vzc2liaWxpdHlWaWV3SWQpIHsKKyAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvbkdyYW50ZWQgPQorICAgICAgICAgICAgICAgICAgICBtU2VjdXJpdHlQb2xpY3kuY2FuR2V0QWNjZXNzaWJpbGl0eU5vZGVJbmZvTG9ja2VkKHRoaXMsIGFjY2Vzc2liaWxpdHlXaW5kb3dJZCk7CisgICAgICAgICAgICAgICAgaWYgKHBlcm1pc3Npb25HcmFudGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBtV2luZG93SWRUb0ludGVyYWN0aW9uQ29ubmVjdGlvbk1hcC5nZXQoYWNjZXNzaWJpbGl0eVdpbmRvd0lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cuZShMT0dfVEFHLCAiTm8gaW50ZXJhY3Rpb24gY29ubmVjdGlvbiB0byB3aW5kb3c6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjY2Vzc2liaWxpdHlXaW5kb3dJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgbG9uZyBpZGVudGl0eVRva2VuID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbnRlcmFjdGlvbklkID0gbUludGVyYWN0aW9uSWRDb3VudGVyLmdldEFuZEluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb0J5QWNjZXNzaWJpbGl0eUlkKGFjY2Vzc2liaWxpdHlWaWV3SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbklkLCBtQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBpbmZvID0KKyAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5nZXRGaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0QW5kQ2xlYXIoaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLnNldENvbm5lY3Rpb24odGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGluZm8uc2V0U2VhbGVkKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIkVycm9yIHJlcXVlc3Rpbmcgbm9kZSB3aXRoIGFjY2Vzc2liaWxpdHlWaWV3SWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjY2Vzc2liaWxpdHlWaWV3SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uKGludCBhY2Nlc3NpYmlsaXR5V2luZG93SWQsCisgICAgICAgICAgICAgICAgaW50IGFjY2Vzc2liaWxpdHlWaWV3SWQsIGludCBhY3Rpb24pIHsKKyAgICAgICAgICAgIElBY2Nlc3NpYmlsaXR5SW50ZXJhY3Rpb25Db25uZWN0aW9uIGNvbm5lY3Rpb24gPSBudWxsOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVybWlzc2lvbkdyYW50ZWQgPSBtU2VjdXJpdHlQb2xpY3kuY2FuUGVyZm9ybUFjdGlvbkxvY2tlZCh0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eVdpbmRvd0lkLCBhY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uR3JhbnRlZCkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gbVdpbmRvd0lkVG9JbnRlcmFjdGlvbkNvbm5lY3Rpb25NYXAuZ2V0KGFjY2Vzc2liaWxpdHlXaW5kb3dJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBTbG9nLmUoTE9HX1RBRywgIk5vIGludGVyYWN0aW9uIGNvbm5lY3Rpb24gdG8gd2luZG93OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhY2Nlc3NpYmlsaXR5V2luZG93SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBsb25nIGlkZW50aXR5VG9rZW4gPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGludGVyYWN0aW9uSWQgPSBtSW50ZXJhY3Rpb25JZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvbihhY2Nlc3NpYmlsaXR5Vmlld0lkLCBhY3Rpb24sIGludGVyYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2spOworICAgICAgICAgICAgICAgIHJldHVybiBtQ2FsbGJhY2suZ2V0UGVyZm9ybUFjY2Vzc2liaWxpdHlBY3Rpb25SZXN1bHQoaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgU2xvZy5lKExPR19UQUcsICJFcnJvciByZXF1ZXN0aW5nIG5vZGUgd2l0aCBhY2Nlc3NpYmlsaXR5Vmlld0lkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhY2Nlc3NpYmlsaXR5Vmlld0lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgeworICAgICAgICAgICAgLyogZG8gbm90aGluZyAtICNiaW5kZXJEaWVkIHRha2VzIGNhcmUgKi8KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGxpbmtUb093bkRlYXRoKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBtU2VydmljZS5saW5rVG9EZWF0aCh0aGlzLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHVubGlua1RvT3duRGVhdGgoKSB7CisgICAgICAgICAgICBtU2VydmljZS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICB0cnlSZW1vdmVTZXJ2aWNlTG9ja2VkKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uVG9SZXRyaWV2YWxBbGxvd2luZ1dpbmRvd0xvY2tlZCgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCB3aW5kb3dJZCA9IG1TZWN1cml0eVBvbGljeS5nZXRSZXRyaWV2YWxBbGxvd2luZ1dpbmRvd0xvY2tlZCgpOworICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgU2xvZy5pKExPR19UQUcsICJUcnlpbmcgdG8gZ2V0IGludGVyYWN0aW9uIGNvbm5lY3Rpb24gdG8gd2luZG93SWQ6ICIgKyB3aW5kb3dJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbVdpbmRvd0lkVG9JbnRlcmFjdGlvbkNvbm5lY3Rpb25NYXAuZ2V0KHdpbmRvd0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGNsYXNzIFNlY3VyaXR5UG9saWN5IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBTElEX0FDVElPTlMgPSBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0ZPQ1VTCisgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlOb2RlSW5mby5BQ1RJT05fQ0xFQVJfRk9DVVMgfCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX1NFTEVDVAorICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8uQUNUSU9OX0NMRUFSX1NFTEVDVElPTjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVUUklFVkFMX0FMTE9XSU5HX0VWRU5UX1RZUEVTID0KKyAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfRU5ECisgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfU1RBUlQKKyAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19DTElDS0VEIHwgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19GT0NVU0VECisgICAgICAgICAgICB8IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfSE9WRVJfRU5URVIgfCBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX0hPVkVSX0VYSVQKKyAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfVklFV19MT05HX0NMSUNLRUQgfCBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9WSUVXX1RFWFRfQ0hBTkdFRAorICAgICAgICAgICAgfCBBY2Nlc3NpYmlsaXR5RXZlbnQuVFlQRV9XSU5ET1dfU1RBVEVfQ0hBTkdFRCB8IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1ZJRVdfU0VMRUNURUQKKyAgICAgICAgICAgIHwgQWNjZXNzaWJpbGl0eUV2ZW50LlRZUEVfV0lORE9XX0NPTlRFTlRfQ0hBTkdFRDsKKworICAgICAgICBwcml2YXRlIGludCBtUmV0cmlldmFsQWxvd2luZ1dpbmRvd0lkOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjYW5EaXNwYXRjaEFjY2Vzc2liaWxpdHlFdmVudChBY2Nlc3NpYmlsaXR5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIC8vIFNlbmQgd2luZG93IGNoYW5nZWQgZXZlbnQgb25seSBmb3IgdGhlIHJldHJpZXZhbCBhbGxvd2luZyB3aW5kb3cuCisgICAgICAgICAgICByZXR1cm4gKGV2ZW50LmdldEV2ZW50VHlwZSgpICE9IEFjY2Vzc2liaWxpdHlFdmVudC5UWVBFX1dJTkRPV19DT05URU5UX0NIQU5HRUQKKyAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQuZ2V0V2luZG93SWQoKSA9PSBtUmV0cmlldmFsQWxvd2luZ1dpbmRvd0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVJldHJpZXZhbEFsbG93aW5nV2luZG93QW5kRXZlbnRTb3VyY2VMb2NrZWQoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgd2luZG93SWQgPSBldmVudC5nZXRXaW5kb3dJZCgpOworICAgICAgICAgICAgZmluYWwgaW50IGV2ZW50VHlwZSA9IGV2ZW50LmdldEV2ZW50VHlwZSgpOworICAgICAgICAgICAgaWYgKChldmVudFR5cGUgJiBSRVRSSUVWQUxfQUxMT1dJTkdfRVZFTlRfVFlQRVMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBtUmV0cmlldmFsQWxvd2luZ1dpbmRvd0lkID0gd2luZG93SWQ7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBldmVudC5zZXRTb3VyY2UobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldFJldHJpZXZhbEFsbG93aW5nV2luZG93TG9ja2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1SZXRyaWV2YWxBbG93aW5nV2luZG93SWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5HZXRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9Mb2NrZWQoU2VydmljZSBzZXJ2aWNlLCBpbnQgd2luZG93SWQpIHsKKyAgICAgICAgICAgIHJldHVybiBjYW5SZXRyaWV2ZVdpbmRvd0NvbnRlbnQoc2VydmljZSkgJiYgaXNSZXRyaWV2YWxBbGxvd2luZ1dpbmRvdyh3aW5kb3dJZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5QZXJmb3JtQWN0aW9uTG9ja2VkKFNlcnZpY2Ugc2VydmljZSwgaW50IHdpbmRvd0lkLCBpbnQgYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY2FuUmV0cmlldmVXaW5kb3dDb250ZW50KHNlcnZpY2UpCisgICAgICAgICAgICAgICAgJiYgaXNSZXRyaWV2YWxBbGxvd2luZ1dpbmRvdyh3aW5kb3dJZCkKKyAgICAgICAgICAgICAgICAmJiBpc0FjdGlvblBlcm1pdHRlZChhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuUmV0cmlldmVXaW5kb3dDb250ZW50KFNlcnZpY2Ugc2VydmljZSkgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UubUNhblJldHJpZXZlU2NyZWVuQ29udGVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1JldHJpZXZhbEFsbG93aW5nV2luZG93KGludCB3aW5kb3dJZCkgeworICAgICAgICAgICAgcmV0dXJuIChtUmV0cmlldmFsQWxvd2luZ1dpbmRvd0lkID09IHdpbmRvd0lkKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0FjdGlvblBlcm1pdHRlZChpbnQgYWN0aW9uKSB7CisgICAgICAgICAgICAgcmV0dXJuIChWQUxJRF9BQ1RJT05TICYgYWN0aW9uKSAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcgcGVybWlzc2lvbiwgU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgICAgICAgICBpZiAoT1dOX1BST0NFU1NfSUQgPT0gQmluZGVyLmdldENhbGxpbmdQaWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCBwZXJtaXNzaW9uU3RhdHVzID0gbUNvbnRleHQuY2hlY2tDYWxsaW5nUGVybWlzc2lvbihwZXJtaXNzaW9uKTsKKyAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uU3RhdHVzICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiWW91IGRvIG5vdCBoYXZlICIgKyBwZXJtaXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVxdWlyZWQgdG8gY2FsbCAiICsgZnVuY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgQ2FsbGJhY2sgZXh0ZW5kcyBJQWNjZXNzaWJpbGl0eUludGVyYWN0aW9uQ29ubmVjdGlvbkNhbGxiYWNrLlN0dWIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfSU5URVJBQ1RJT05fTUlMTElTID0gNTAwMDsKKworICAgICAgICBwcml2YXRlIGludCBtSW50ZXJhY3Rpb25JZCA9IC0xOworICAgICAgICBwcml2YXRlIEFjY2Vzc2liaWxpdHlOb2RlSW5mbyBtRmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb1Jlc3VsdDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gbUZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9zUmVzdWx0OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0OworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQoQWNjZXNzaWJpbGl0eU5vZGVJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgaW50IGludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJhY3Rpb25JZCA+IG1JbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIG1GaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvUmVzdWx0ID0gaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyYWN0aW9uSWQgPSBpbnRlcmFjdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gZ2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb1Jlc3VsdEFuZENsZWFyKGludCBpbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgd2FpdEZvclJlc3VsdFRpbWVkTG9ja2VkKFRJTUVPVVRfSU5URVJBQ1RJT05fTUlMTElTLCBpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBBY2Nlc3NpYmlsaXR5Tm9kZUluZm8gcmVzdWx0ID0gbUZpbmRBY2Nlc3NpYmlsaXR5Tm9kZUluZm9SZXN1bHQ7CisgICAgICAgICAgICAgICAgY2xlYXJMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQoTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IGluZm9zLAorICAgICAgICAgICAgICAgIGludCBpbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKGludGVyYWN0aW9uSWQgPiBtSW50ZXJhY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICBtRmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQgPSBpbmZvczsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyYWN0aW9uSWQgPSBpbnRlcmFjdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PEFjY2Vzc2liaWxpdHlOb2RlSW5mbz4gZ2V0RmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHRBbmRDbGVhcigKKyAgICAgICAgICAgICAgICBpbnQgaW50ZXJhY3Rpb25JZCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgICAgIHdhaXRGb3JSZXN1bHRUaW1lZExvY2tlZChUSU1FT1VUX0lOVEVSQUNUSU9OX01JTExJUywgaW50ZXJhY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgTGlzdDxBY2Nlc3NpYmlsaXR5Tm9kZUluZm8+IHJlc3VsdCA9IG1GaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc1Jlc3VsdDsKKyAgICAgICAgICAgICAgICBjbGVhckxvY2tlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvblJlc3VsdChib29sZWFuIHN1Y2NlZWRlZCwgaW50IGludGVyYWN0aW9uSWQpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJhY3Rpb25JZCA+IG1JbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIG1QZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvblJlc3VsdCA9IHN1Y2NlZWRlZDsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyYWN0aW9uSWQgPSBpbnRlcmFjdGlvbklkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0KGludCBpbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAgICAgd2FpdEZvclJlc3VsdFRpbWVkTG9ja2VkKFRJTUVPVVRfSU5URVJBQ1RJT05fTUlMTElTLCBpbnRlcmFjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlc3VsdCA9IG1QZXJmb3JtQWNjZXNzaWJpbGl0eUFjdGlvblJlc3VsdDsKKyAgICAgICAgICAgICAgICBjbGVhckxvY2tlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbGVhckxvY2tlZCgpIHsKKyAgICAgICAgICAgIG1JbnRlcmFjdGlvbklkID0gLTE7CisgICAgICAgICAgICBtRmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb1Jlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBtRmluZEFjY2Vzc2liaWxpdHlOb2RlSW5mb3NSZXN1bHQgPSBudWxsOworICAgICAgICAgICAgbVBlcmZvcm1BY2Nlc3NpYmlsaXR5QWN0aW9uUmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgd2FpdEZvclJlc3VsdFRpbWVkTG9ja2VkKGxvbmcgd2FpdFRpbWVNaWxsaXMsIGludCBpbnRlcmFjdGlvbklkKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobUludGVyYWN0aW9uSWQgPT0gaW50ZXJhY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZWxhcHNlZFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZU1pbGxpczsKKyAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVNaWxsaXMgPSBUSU1FT1VUX0lOVEVSQUNUSU9OX01JTExJUyAtIGVsYXBzZWRUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFRpbWVNaWxsaXMgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQod2FpdFRpbWVNaWxsaXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGlnbm9yZSAqLworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FjY2Vzc2liaWxpdHkvVG91Y2hFeHBsb3Jlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYWNjZXNzaWJpbGl0eS9Ub3VjaEV4cGxvcmVyLmphdmEKaW5kZXggNGM3ZjU5NS4uYWFiMTg5YTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FjY2Vzc2liaWxpdHkvVG91Y2hFeHBsb3Jlci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FjY2Vzc2liaWxpdHkvVG91Y2hFeHBsb3Jlci5qYXZhCkBAIC0yMjYsOCArMjI2LDkgQEAKICAgICAgICAgICAgICAgICAvLyBTZW5kIGEgaG92ZXIgZm9yIGV2ZXJ5IGZpbmdlciBkb3duIHNvIHRoZSB1c2VyIGdldHMgZmVlZGJhY2sKICAgICAgICAgICAgICAgICAvLyB3aGVyZSBzaGUgaXMgY3VycmVudGx5IHRvdWNoaW5nLgogICAgICAgICAgICAgICAgIG1TZW5kSG92ZXJEZWxheWVkLmZvcmNlU2VuZEFuZFJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1TZW5kSG92ZXJEZWxheWVkLnBvc3QoZXZlbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9IT1ZFUl9FTlRFUiwgMSwgcG9saWN5RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBERUxBWV9TRU5EX0hPVkVSX01PVkUpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb2ludGVySWRCaXRzID0gKDEgPDwgZXZlbnQuZ2V0QWN0aW9uSW5kZXgoKSk7CisgICAgICAgICAgICAgICAgbVNlbmRIb3ZlckRlbGF5ZWQucG9zdChldmVudCwgTW90aW9uRXZlbnQuQUNUSU9OX0hPVkVSX0VOVEVSLCBwb2ludGVySWRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5RmxhZ3MsIERFTEFZX1NFTkRfSE9WRVJfTU9WRSk7CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOOiB7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3RpdmVQb2ludGVyQ291bnQpIHsKQEAgLTM1MCwxMSArMzUxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEcmFnZ2luZ0dlc3R1cmUoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHdvIHBvaW50ZXJzIG1vdmluZyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gd2l0aGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBnaXZlbiBkaXN0YW5jZSBwZXJmb3JtIGEgZHJhZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRFJBR0dJTkc7ICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0RSQUdHSU5HOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVG91Y2hFeHBsb3JlR2VzdHVyZUluUHJvZ3Jlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEFjY2Vzc2liaWxpdHlFdmVudChUWVBFX1RPVUNIX0VYUExPUkFUSU9OX0dFU1RVUkVfRU5EKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoRXhwbG9yZUdlc3R1cmVJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VG91Y2hFeHBsb3JlRXZlbnQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFnZ2luZ1BvaW50ZXJJZCA9IHBvaW50ZXJJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTW90aW9uRXZlbnQoZXZlbnQsIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOLCBwb2ludGVySWRCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5RmxhZ3MpOwpAQCAtMzY1LDYgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoVFlQRV9UT1VDSF9FWFBMT1JBVElPTl9HRVNUVVJFX0VORCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3VjaEV4cGxvcmVHZXN0dXJlSW5Qcm9ncmVzcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoRXhwbG9yZUV2ZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRG93bkZvckFsbEFjdGl2ZU5vdEluamVjdGVkUG9pbnRlcnMoZXZlbnQsIHBvbGljeUZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKQEAgLTM4Miw2ICszODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRBY2Nlc3NpYmlsaXR5RXZlbnQoVFlQRV9UT1VDSF9FWFBMT1JBVElPTl9HRVNUVVJFX0VORCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdWNoRXhwbG9yZUdlc3R1cmVJblByb2dyZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRvdWNoRXhwbG9yZUV2ZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmREb3duRm9yQWxsQWN0aXZlTm90SW5qZWN0ZWRQb2ludGVycyhldmVudCwgcG9saWN5RmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNzI4LDcgKzczMiw3IEBACiAgICAgLyoqCiAgICAgICogU2VuZHMgYW4gZXZlbnQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQuCisgICAgICogQHBhcmFtIHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBpbmplY3RlZCBldmVudHMuCiAgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIG9mIHRoZSBldmVudC4KICAgICAgKiBAcGFyYW0gcG9pbnRlcklkQml0cyBUaGUgYml0cyBvZiB0aGUgcG9pbnRlcnMgdG8gc2VuZC4KICAgICAgKiBAcGFyYW0gcG9saWN5RmxhZ3MgVGhlIHBvbGljeSBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgpAQCAtOTc5LDcgKzk4Myw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fRE9XTjogewogICAgICAgICAgICAgICAgICAgICAvLyBOZXcgZ2VzdHVyZSBzbyByZXN0YXJ0IHRyYWNraW5nIGluamVjdGVkIGRvd24gcG9pbnRlcnMuCiAgICAgICAgICAgICAgICAgICAgIG1JbmplY3RlZFBvaW50ZXJzRG93biA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlY2VpdmVkUG9pbnRlckRvd24oMCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZWNlaXZlZFBvaW50ZXJEb3duKGV2ZW50LmdldEFjdGlvbkluZGV4KCksIGV2ZW50KTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfRE9XTjogewogICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZWNlaXZlZFBvaW50ZXJEb3duKGV2ZW50LmdldEFjdGlvbkluZGV4KCksIGV2ZW50KTsKQEAgLTk4OCw3ICs5OTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZWNlaXZlZFBvaW50ZXJNb3ZlKGV2ZW50KTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX1VQOiB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlY2VpdmVkUG9pbnRlclVwKDAsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmVjZWl2ZWRQb2ludGVyVXAoZXZlbnQuZ2V0QWN0aW9uSW5kZXgoKSwgZXZlbnQpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUDogewogICAgICAgICAgICAgICAgICAgICBoYW5kbGVSZWNlaXZlZFBvaW50ZXJVcChldmVudC5nZXRBY3Rpb25JbmRleCgpLCBldmVudCk7CkBAIC0xMDA4LDEzICsxMDEyLDEzIEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXZlbnQuZ2V0QWN0aW9uTWFza2VkKCk7CiAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgICAgICAgICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX0RPV046IHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlSW5qZWN0ZWRQb2ludGVyRG93bigwLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUluamVjdGVkUG9pbnRlckRvd24oZXZlbnQuZ2V0QWN0aW9uSW5kZXgoKSwgZXZlbnQpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9ET1dOOiB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUluamVjdGVkUG9pbnRlckRvd24oZXZlbnQuZ2V0QWN0aW9uSW5kZXgoKSwgZXZlbnQpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6IHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlSW5qZWN0ZWRQb2ludGVyVXAoMCwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVJbmplY3RlZFBvaW50ZXJVcChldmVudC5nZXRBY3Rpb25JbmRleCgpLCBldmVudCk7CiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUluamVjdGVkUG9pbnRlclVwKGV2ZW50LmdldEFjdGlvbkluZGV4KCksIGV2ZW50KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCBjZjU1OTJjLi40ZWM3MWMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLlN5c3RlbVNlcnZlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIuV2F0Y2hkb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLmFtLkFjdGl2aXR5U3RhY2suQWN0aXZpdHlTdGF0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZTsKIGltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIud20uV2luZG93TWFuYWdlclNlcnZpY2U7CiAKIGltcG9ydCBkYWx2aWsuc3lzdGVtLlp5Z290ZTsKQEAgLTkzLDcgKzkyLDYgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKIGltcG9ydCBhbmRyb2lkLm9zLklQZXJtaXNzaW9uQ29udHJvbGxlcjsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CkBAIC05NjgsMTAgKzk2NiwxMiBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfRVhDRVNTSVZFX1dBS0VfTE9DS1NfTVNHID0gMjc7CiAgICAgc3RhdGljIGZpbmFsIGludCBDTEVBUl9ETlNfQ0FDSEUgPSAyODsKICAgICBzdGF0aWMgZmluYWwgaW50IFVQREFURV9IVFRQX1BST1hZID0gMjk7Ci0gICAgc3RhdGljIGZpbmFsIGludCBESVNQQVRDSF9GT1JFR1JPVU5EX0FDVElWSVRJRVNfQ0hBTkdFRCA9IDMwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRElTUEFUQ0hfUFJPQ0VTU19ESUVEID0gMzE7CisgICAgc3RhdGljIGZpbmFsIGludCBTSE9XX0NPTVBBVF9NT0RFX0RJQUxPR19NU0cgPSAzMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IERJU1BBVENIX0ZPUkVHUk9VTkRfQUNUSVZJVElFU19DSEFOR0VEID0gMzE7CisgICAgc3RhdGljIGZpbmFsIGludCBESVNQQVRDSF9QUk9DRVNTX0RJRUQgPSAzMjsKIAogICAgIEFsZXJ0RGlhbG9nIG1VaWRBbGVydDsKKyAgICBDb21wYXRNb2RlRGlhbG9nIG1Db21wYXRNb2RlRGlhbG9nOwogCiAgICAgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewogICAgICAgICAvL3B1YmxpYyBIYW5kbGVyKCkgewpAQCAtMTI3MCwxNiArMTI3MCw0NSBAQAogICAgICAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZURlbGF5ZWQobm1zZywgUE9XRVJfQ0hFQ0tfREVMQVkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNIT1dfQ09NUEFUX01PREVfRElBTE9HX01TRzogeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoQWN0aXZpdHlNYW5hZ2VyU2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIGFyID0gKEFjdGl2aXR5UmVjb3JkKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ29tcGF0TW9kZURpYWxvZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbXBhdE1vZGVEaWFsb2cubUFwcEluZm8ucGFja2FnZU5hbWUuZXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhci5pbmZvLmFwcGxpY2F0aW9uSW5mby5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGF0TW9kZURpYWxvZy5kaXNtaXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcGF0TW9kZURpYWxvZyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyICE9IG51bGwgJiYgZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29tcGF0TW9kZVBhY2thZ2VzLmdldFBhY2thZ2VBc2tDb21wYXRNb2RlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhci5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IG1Db21wYXRNb2RlUGFja2FnZXMuY29tcHV0ZUNvbXBhdE1vZGVMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhci5pbmZvLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IEFjdGl2aXR5TWFuYWdlci5DT01QQVRfTU9ERV9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wYXRNb2RlRGlhbG9nID0gbmV3IENvbXBhdE1vZGVEaWFsb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS50aGlzLCBtQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhci5pbmZvLmFwcGxpY2F0aW9uSW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wYXRNb2RlRGlhbG9nLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIERJU1BBVENIX0ZPUkVHUk9VTkRfQUNUSVZJVElFU19DSEFOR0VEOiB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUHJvY2Vzc1JlY29yZCBhcHAgPSAoUHJvY2Vzc1JlY29yZCkgbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZvcmVncm91bmRBY3Rpdml0aWVzID0gbXNnLmFyZzEgIT0gMDsKLSAgICAgICAgICAgICAgICBkaXNwYXRjaEZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcC5waWQsIGFwcC5pbmZvLnVpZCwgZm9yZWdyb3VuZEFjdGl2aXRpZXMpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwaWQgPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gbXNnLmFyZzI7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JlZ3JvdW5kQWN0aXZpdGllcyA9IChCb29sZWFuKSBtc2cub2JqOworICAgICAgICAgICAgICAgIGRpc3BhdGNoRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKHBpZCwgdWlkLCBmb3JlZ3JvdW5kQWN0aXZpdGllcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIERJU1BBVENIX1BST0NFU1NfRElFRDogewotICAgICAgICAgICAgICAgIGZpbmFsIFByb2Nlc3NSZWNvcmQgYXBwID0gKFByb2Nlc3NSZWNvcmQpIG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hQcm9jZXNzRGllZChhcHAucGlkLCBhcHAuaW5mby51aWQpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwaWQgPSBtc2cuYXJnMTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gbXNnLmFyZzI7CisgICAgICAgICAgICAgICAgZGlzcGF0Y2hQcm9jZXNzRGllZChwaWQsIHVpZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xOTA0LDYgKzE5MzMsOSBAQAogICAgICAgICAgICAgaW50IGRlYnVnRmxhZ3MgPSAwOwogICAgICAgICAgICAgaWYgKChhcHAuaW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX0RFQlVHR0FCTEUpICE9IDApIHsKICAgICAgICAgICAgICAgICBkZWJ1Z0ZsYWdzIHw9IFp5Z290ZS5ERUJVR19FTkFCTEVfREVCVUdHRVI7CisgICAgICAgICAgICAgICAgLy8gQWxzbyB0dXJuIG9uIENoZWNrSk5JIGZvciBkZWJ1Z2dhYmxlIGFwcHMuIEl0J3MgcXVpdGUKKyAgICAgICAgICAgICAgICAvLyBhd2t3YXJkIHRvIHR1cm4gb24gb3RoZXJ3aXNlLgorICAgICAgICAgICAgICAgIGRlYnVnRmxhZ3MgfD0gWnlnb3RlLkRFQlVHX0VOQUJMRV9DSEVDS0pOSTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFJ1biB0aGUgYXBwIGluIHNhZmUgbW9kZSBpZiBpdHMgbWFuaWZlc3QgcmVxdWVzdHMgc28gb3IgdGhlCiAgICAgICAgICAgICAvLyBzeXN0ZW0gaXMgYm9vdGVkIGluIHNhZmUgbW9kZS4KQEAgLTIxMTIsNiArMjE0NCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UGFja2FnZUFza1NjcmVlbkNvbXBhdChTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbXBhdE1vZGVQYWNrYWdlcy5nZXRQYWNrYWdlQXNrQ29tcGF0TW9kZUxvY2tlZChwYWNrYWdlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlQXNrU2NyZWVuQ29tcGF0KFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiBhc2spIHsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBtQ29tcGF0TW9kZVBhY2thZ2VzLnNldFBhY2thZ2VBc2tDb21wYXRNb2RlTG9ja2VkKHBhY2thZ2VOYW1lLCBhc2spOworICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCByZXBvcnRSZXN1bWVkQWN0aXZpdHlMb2NrZWQoQWN0aXZpdHlSZWNvcmQgcikgewogICAgICAgICAvL1Nsb2cuaShUQUcsICIqKioqIFJFUE9SVCBSRVNVTUU6ICIgKyByKTsKICAgICAgICAgCkBAIC0zNjM0LDYgKzM2NzgsNyBAQAogICAgICAgICAgICAgYm9vbGVhbiBpc1Jlc3RyaWN0ZWRCYWNrdXBNb2RlID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAobUJhY2t1cFRhcmdldCAhPSBudWxsICYmIG1CYWNrdXBBcHBOYW1lLmVxdWFscyhwcm9jZXNzTmFtZSkpIHsKICAgICAgICAgICAgICAgICBpc1Jlc3RyaWN0ZWRCYWNrdXBNb2RlID0gKG1CYWNrdXBUYXJnZXQuYmFja3VwTW9kZSA9PSBCYWNrdXBSZWNvcmQuUkVTVE9SRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtQmFja3VwVGFyZ2V0LmJhY2t1cE1vZGUgPT0gQmFja3VwUmVjb3JkLlJFU1RPUkVfRlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChtQmFja3VwVGFyZ2V0LmJhY2t1cE1vZGUgPT0gQmFja3VwUmVjb3JkLkJBQ0tVUF9GVUxMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIApAQCAtMzY0NywxMiArMzY5MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICArIHByb2Nlc3NOYW1lICsgIiB3aXRoIGNvbmZpZyAiICsgbUNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcEluZm8gPSBhcHAuaW5zdHJ1bWVudGF0aW9uSW5mbyAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgID8gYXBwLmluc3RydW1lbnRhdGlvbkluZm8gOiBhcHAuaW5mbzsKKyAgICAgICAgICAgIGFwcC5jb21wYXQgPSBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoYXBwSW5mbyk7CiAgICAgICAgICAgICB0aHJlYWQuYmluZEFwcGxpY2F0aW9uKHByb2Nlc3NOYW1lLCBhcHBJbmZvLCBwcm92aWRlcnMsCiAgICAgICAgICAgICAgICAgICAgIGFwcC5pbnN0cnVtZW50YXRpb25DbGFzcywgYXBwLmluc3RydW1lbnRhdGlvblByb2ZpbGVGaWxlLAogICAgICAgICAgICAgICAgICAgICBhcHAuaW5zdHJ1bWVudGF0aW9uQXJndW1lbnRzLCBhcHAuaW5zdHJ1bWVudGF0aW9uV2F0Y2hlciwgdGVzdE1vZGUsIAogICAgICAgICAgICAgICAgICAgICBpc1Jlc3RyaWN0ZWRCYWNrdXBNb2RlIHx8ICFub3JtYWxNb2RlLAotICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbiwgY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKGFwcEluZm8pLAotICAgICAgICAgICAgICAgICAgICBnZXRDb21tb25TZXJ2aWNlc0xvY2tlZCgpLAorICAgICAgICAgICAgICAgICAgICBtQ29uZmlndXJhdGlvbiwgYXBwLmNvbXBhdCwgZ2V0Q29tbW9uU2VydmljZXNMb2NrZWQoKSwKICAgICAgICAgICAgICAgICAgICAgbUNvcmVTZXR0aW5nc09ic2VydmVyLmdldENvcmVTZXR0aW5nc0xvY2tlZCgpKTsKICAgICAgICAgICAgIHVwZGF0ZUxydVByb2Nlc3NMb2NrZWQoYXBwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICBhcHAubGFzdFJlcXVlc3RlZEdjID0gYXBwLmxhc3RMb3dNZW1vcnkgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKQEAgLTc2MjUsNyArNzY3MCw4IEBACiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICBDT01QX1NQRUMgbWF5IGFsc28gYmUgYSBjb21wb25lbnQgbmFtZSAoY29tLmZvby8ubXlBcHApLCIpOwogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBhIHBhcnRpYWwgc3Vic3RyaW5nIGluIGEgY29tcG9uZW50IG5hbWUsIGFuIik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIEFjdGl2aXR5UmVjb3JkIGhleCBvYmplY3QgaWRlbnRpZmllciwgb3IiKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgXCJhbGxcIiBmb3IgYWxsIG9iamVjdHMiKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgXCJhbGxcIiBmb3IgYWxsIG9iamVjdHMsIG9yIik7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIFwidG9wXCIgZm9yIHRoZSB0b3AgYWN0aXZpdHkuIik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAtYTogaW5jbHVkZSBhbGwgYXZhaWxhYmxlIHNlcnZlciBzdGF0ZS4iKTsKICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgIC1jOiBpbmNsdWRlIGNsaWVudCBzdGF0ZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC03OTQ4LDggKzc5OTQsMTQgQEAKICAgICAgICAgaWYgKGR1bXBBbGwpIHsKICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgbUNvbmZpZ1dpbGxDaGFuZ2U6ICIgKyBtTWFpblN0YWNrLm1Db25maWdXaWxsQ2hhbmdlKTsKICAgICAgICAgICAgIGlmIChtQ29tcGF0TW9kZVBhY2thZ2VzLmdldFBhY2thZ2VzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgIG1TY3JlZW5Db21wYXRQYWNrYWdlcz0iKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKG1Db21wYXRNb2RlUGFja2FnZXMuZ2V0UGFja2FnZXMoKSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICBtU2NyZWVuQ29tcGF0UGFja2FnZXM6Iik7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtQ29tcGF0TW9kZVBhY2thZ2VzLmdldFBhY2thZ2VzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBtb2RlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgICAiKTsgcHcucHJpbnQocGtnKTsgcHcucHJpbnQoIjogIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQobW9kZSk7IHB3LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHcucHJpbnRsbigiICBtU2xlZXBpbmc9IiArIG1TbGVlcGluZyArICIgbVNodXR0aW5nRG93bj0iICsgbVNodXR0aW5nRG93bik7CkBAIC04MTczLDYgKzgyMjUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdGllcy5hZGQocjEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgidG9wIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbU1haW5TdGFjay5tSGlzdG9yeS5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKE4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMuYWRkKChBY3Rpdml0eVJlY29yZCltTWFpblN0YWNrLm1IaXN0b3J5LmdldChOLTEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUgPSBDb21wb25lbnROYW1lLnVuZmxhdHRlbkZyb21TdHJpbmcobmFtZSk7CiAgICAgICAgICAgICBpbnQgb2JqZWN0SWQgPSAwOwpAQCAtOTIxMSw3ICs5MjcwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfUFJPQ0VTU19ESUVELCBhcHApLnNlbmRUb1RhcmdldCgpOworICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKERJU1BBVENIX1BST0NFU1NfRElFRCwgYXBwLnBpZCwgYXBwLmluZm8udWlkLCBudWxsKS5zZW5kVG9UYXJnZXQoKTsKIAogICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIHJlc3RhcnRpbmcgdGhpcyBhcHAsIHRoZW4gbGVhdmUgaXQgaW4gaXRzCiAgICAgICAgIC8vIGN1cnJlbnQgbGlzdHMgYW5kIGxldCB0aGUgY2FsbGVyIHRha2UgY2FyZSBvZiBpdC4KQEAgLTExMTA5LDEzICsxMTE2OCwxMSBAQAogICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGFkZGluZyBhIHBhY2thZ2U6IGJ5IGRlZmF1bHQgdHVybiBvbiBjb21wYXRpYmlsaXR5CiAgICAgICAgIC8vIG1vZGUuCiAgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVELmVxdWFscyhpbnRlbnQuZ2V0QWN0aW9uKCkpKSB7Ci0gICAgICAgICAgICBpZiAoIWludGVudC5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgVXJpIGRhdGEgPSBpbnRlbnQuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzc3A7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiAoc3NwPWRhdGEuZ2V0U2NoZW1lU3BlY2lmaWNQYXJ0KCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBhdE1vZGVQYWNrYWdlcy5zZXRQYWNrYWdlU2NyZWVuQ29tcGF0TW9kZUxvY2tlZChzc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0VOQUJMRUQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVyaSBkYXRhID0gaW50ZW50LmdldERhdGEoKTsKKyAgICAgICAgICAgIFN0cmluZyBzc3A7CisgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIChzc3A9ZGF0YS5nZXRTY2hlbWVTcGVjaWZpY1BhcnQoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Db21wYXRNb2RlUGFja2FnZXMuaGFuZGxlUGFja2FnZUFkZGVkTG9ja2VkKHNzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCb29sZWFuRXh0cmEoSW50ZW50LkVYVFJBX1JFUExBQ0lORywgZmFsc2UpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMjM1MSw2ICsxMjQwOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBhYy51cGRhdGVDb25maWd1cmF0aW9uKG1Db25maWd1cmF0aW9uKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHJlc291cmNlcyBpbiBvdXIgcHJvY2VzcyBhcmUgdXBkYXRlZAorICAgICAgICAgICAgICAgIC8vIHJpZ2h0IG5vdywgc28gdGhhdCBhbnlvbmUgd2hvIGlzIGdvaW5nIHRvIHJldHJpZXZlCisgICAgICAgICAgICAgICAgLy8gcmVzb3VyY2UgdmFsdWVzIGFmdGVyIHdlIHJldHVybiB3aWxsIGJlIHN1cmUgdG8gZ2V0CisgICAgICAgICAgICAgICAgLy8gdGhlIG5ldyBvbmVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBkdXJpbmcKKyAgICAgICAgICAgICAgICAvLyBib290LCB3aGVyZSB0aGUgZmlyc3QgY29uZmlnIGNoYW5nZSBuZWVkcyB0byBndWFyYW50ZWUKKyAgICAgICAgICAgICAgICAvLyBhbGwgcmVzb3VyY2VzIGhhdmUgdGhhdCBjb25maWcgYmVmb3JlIGZvbGxvd2luZyBib290CisgICAgICAgICAgICAgICAgLy8gY29kZSBpcyBleGVjdXRlZC4KKyAgICAgICAgICAgICAgICBtU3lzdGVtVGhyZWFkLmFwcGx5Q29uZmlndXJhdGlvblRvUmVzb3VyY2VzKG5ld0NvbmZpZyk7CisKICAgICAgICAgICAgICAgICBpZiAoU2V0dGluZ3MuU3lzdGVtLmhhc0ludGVyZXN0aW5nQ29uZmlndXJhdGlvbkNoYW5nZXMoY2hhbmdlcykpIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFVQREFURV9DT05GSUdVUkFUSU9OX01TRyk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy5vYmogPSBuZXcgQ29uZmlndXJhdGlvbihtQ29uZmlndXJhdGlvbik7CkBAIC0xMjc3Miw4ICsxMjgzOCw4IEBACiAgICAgICAgIGFwcC5jdXJTY2hlZEdyb3VwID0gc2NoZWRHcm91cDsKIAogICAgICAgICBpZiAoaGFkRm9yZWdyb3VuZEFjdGl2aXRpZXMgIT0gYXBwLmZvcmVncm91bmRBY3Rpdml0aWVzKSB7Ci0gICAgICAgICAgICBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKERJU1BBVENIX0ZPUkVHUk9VTkRfQUNUSVZJVElFU19DSEFOR0VELAotICAgICAgICAgICAgICAgICAgICBhcHAuZm9yZWdyb3VuZEFjdGl2aXRpZXMgPyAxIDogMCwgMCwgYXBwKS5zZW5kVG9UYXJnZXQoKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRElTUEFUQ0hfRk9SRUdST1VORF9BQ1RJVklUSUVTX0NIQU5HRUQsIGFwcC5waWQsIGFwcC5pbmZvLnVpZCwKKyAgICAgICAgICAgICAgICAgICAgYXBwLmZvcmVncm91bmRBY3Rpdml0aWVzKS5zZW5kVG9UYXJnZXQoKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBhZGo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQppbmRleCBjYzllNzhlLi4wOTBlMjZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbXBhdGliaWxpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwpAQCAtNzksNiArODAsNyBAQAogICAgIGxvbmcgc3RhcnRUaW1lOyAgICAgICAgIC8vIGxhc3QgdGltZSB0aGlzIGFjdGl2aXR5IHdhcyBzdGFydGVkCiAgICAgbG9uZyBjcHVUaW1lQXRSZXN1bWU7ICAgLy8gdGhlIGNwdSB0aW1lIG9mIGhvc3QgcHJvY2VzcyBhdCB0aGUgdGltZSBvZiByZXN1bWluZyBhY3Rpdml0eQogICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsgLy8gY29uZmlndXJhdGlvbiBhY3Rpdml0eSB3YXMgbGFzdCBydW5uaW5nIGluCisgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0Oy8vIGxhc3QgdXNlZCBjb21wYXRpYmlsaXR5IG1vZGUKICAgICBBY3Rpdml0eVJlY29yZCByZXN1bHRUbzsgLy8gd2hvIHN0YXJ0ZWQgdGhpcyBlbnRyeSwgc28gd2lsbCBnZXQgb3VyIHJlcGx5CiAgICAgZmluYWwgU3RyaW5nIHJlc3VsdFdobzsgLy8gYWRkaXRpb25hbCBpZGVudGlmaWVyIGZvciB1c2UgYnkgcmVzdWx0VG8uCiAgICAgZmluYWwgaW50IHJlcXVlc3RDb2RlOyAgLy8gY29kZSBnaXZlbiBieSByZXF1ZXN0ZXIgKHJlc3VsdFRvKQpAQCAtMTM3LDYgKzEzOSw3IEBACiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBjb21wb25lbnRTcGVjaWZpZWQ9Iik7IHB3LnByaW50KGNvbXBvbmVudFNwZWNpZmllZCk7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBpc0hvbWVBY3Rpdml0eT0iKTsgcHcucHJpbnRsbihpc0hvbWVBY3Rpdml0eSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJjb25maWc9Iik7IHB3LnByaW50bG4oY29uZmlndXJhdGlvbik7CisgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJjb21wYXQ9Iik7IHB3LnByaW50bG4oY29tcGF0KTsKICAgICAgICAgaWYgKHJlc3VsdFRvICE9IG51bGwgfHwgcmVzdWx0V2hvICE9IG51bGwpIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJyZXN1bHRUbz0iKTsgcHcucHJpbnQocmVzdWx0VG8pOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHJlc3VsdFdobz0iKTsgcHcucHJpbnQocmVzdWx0V2hvKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQppbmRleCBkNWFjMTllLi5kODc3MmI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCkBAIC00ODUsNiArNDg1LDEzIEBACiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIGZpbmFsIHZvaWQgc2hvd0Fza0NvbXBhdE1vZGVEaWFsb2dMb2NrZWQoQWN0aXZpdHlSZWNvcmQgcikgeworICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7CisgICAgICAgIG1zZy53aGF0ID0gQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5TSE9XX0NPTVBBVF9NT0RFX0RJQUxPR19NU0c7CisgICAgICAgIG1zZy5vYmogPSByLnRhc2suYXNrZWRDb21wYXRNb2RlID8gbnVsbCA6IHI7CisgICAgICAgIG1TZXJ2aWNlLm1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgfQorCiAgICAgZmluYWwgYm9vbGVhbiByZWFsU3RhcnRBY3Rpdml0eUxvY2tlZChBY3Rpdml0eVJlY29yZCByLAogICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBhcHAsIGJvb2xlYW4gYW5kUmVzdW1lLCBib29sZWFuIGNoZWNrQ29uZmlnKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CkBAIC01NDEsMTAgKzU0OCwxMSBAQAogICAgICAgICAgICAgbVNlcnZpY2UuZW5zdXJlUGFja2FnZURleE9wdChyLmludGVudC5nZXRDb21wb25lbnQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgIHIuc2xlZXBpbmcgPSBmYWxzZTsKICAgICAgICAgICAgIHIuZm9yY2VOZXdDb25maWcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNob3dBc2tDb21wYXRNb2RlRGlhbG9nTG9ja2VkKHIpOworICAgICAgICAgICAgci5jb21wYXQgPSBtU2VydmljZS5jb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoci5pbmZvLmFwcGxpY2F0aW9uSW5mbyk7CiAgICAgICAgICAgICBhcHAudGhyZWFkLnNjaGVkdWxlTGF1bmNoQWN0aXZpdHkobmV3IEludGVudChyLmludGVudCksIHIsCiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHIpLAotICAgICAgICAgICAgICAgICAgICByLmluZm8sIG1TZXJ2aWNlLmNvbXBhdGliaWxpdHlJbmZvRm9yUGFja2FnZUxvY2tlZChyLmluZm8uYXBwbGljYXRpb25JbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgci5pY2ljbGUsIHJlc3VsdHMsIG5ld0ludGVudHMsICFhbmRSZXN1bWUsCisgICAgICAgICAgICAgICAgICAgIHIuaW5mbywgci5jb21wYXQsIHIuaWNpY2xlLCByZXN1bHRzLCBuZXdJbnRlbnRzLCAhYW5kUmVzdW1lLAogICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5pc05leHRUcmFuc2l0aW9uRm9yd2FyZCgpKTsKICAgICAgICAgICAgIAogICAgICAgICAgICAgaWYgKChhcHAuaW5mby5mbGFncyZBcHBsaWNhdGlvbkluZm8uRkxBR19DQU5UX1NBVkVfU1RBVEUpICE9IDApIHsKQEAgLTE0MzAsNiArMTQzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LnRhc2sudGFza0lkLCBuZXh0LnNob3J0Q29tcG9uZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgbmV4dC5zbGVlcGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNob3dBc2tDb21wYXRNb2RlRGlhbG9nTG9ja2VkKG5leHQpOwogICAgICAgICAgICAgICAgIG5leHQuYXBwLnRocmVhZC5zY2hlZHVsZVJlc3VtZUFjdGl2aXR5KG5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5pc05leHRUcmFuc2l0aW9uRm9yd2FyZCgpKTsKICAgICAgICAgICAgICAgICAKQEAgLTE0NDYsNiArMTQ1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX0FQUF9TVEFSVElOR19QUkVWSUVXICYmIG1NYWluU3RhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1XaW5kb3dNYW5hZ2VyLnNldEFwcFN0YXJ0aW5nV2luZG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LCBuZXh0LnBhY2thZ2VOYW1lLCBuZXh0LnRoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5jb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5pbmZvLmFwcGxpY2F0aW9uSW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQubm9uTG9jYWxpemVkTGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQubGFiZWxSZXMsIG5leHQuaWNvbiwgbmV4dC53aW5kb3dGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7CkBAIC0xNDgyLDYgKzE0OTMsOCBAQAogICAgICAgICAgICAgICAgIGlmIChTSE9XX0FQUF9TVEFSVElOR19QUkVWSUVXKSB7CiAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1XaW5kb3dNYW5hZ2VyLnNldEFwcFN0YXJ0aW5nV2luZG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQsIG5leHQucGFja2FnZU5hbWUsIG5leHQudGhlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5pbmZvLmFwcGxpY2F0aW9uSW5mbyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5ub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmxhYmVsUmVzLCBuZXh0Lmljb24sIG5leHQud2luZG93RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSk7CkBAIC0xNjA2LDcgKzE2MTksOSBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2Lm5vd1Zpc2libGUpIHByZXYgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU2VydmljZS5tV2luZG93TWFuYWdlci5zZXRBcHBTdGFydGluZ1dpbmRvdygKLSAgICAgICAgICAgICAgICAgICAgICAgIHIsIHIucGFja2FnZU5hbWUsIHIudGhlbWUsIHIubm9uTG9jYWxpemVkTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICByLCByLnBhY2thZ2VOYW1lLCByLnRoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2UuY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmluZm8uYXBwbGljYXRpb25JbmZvKSwgci5ub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHIubGFiZWxSZXMsIHIuaWNvbiwgci53aW5kb3dGbGFncywgcHJldiwgc2hvd1N0YXJ0aW5nSWNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zODkyLDEwICszOTA3LDEwIEBACiAgICAgICAgIGlmIChERUJVR19TV0lUQ0ggfHwgREVCVUdfQ09ORklHVVJBVElPTikgewogICAgICAgICAgICAgU2xvZy52KFRBRywgIkNoZWNraW5nIHRvIHJlc3RhcnQgIiArIHIuaW5mby5uYW1lICsgIjogY2hhbmdlZD0weCIKICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoYW5nZXMpICsgIiwgaGFuZGxlcz0weCIKLSAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHIuaW5mby5jb25maWdDaGFuZ2VzKQorICAgICAgICAgICAgICAgICAgICArIEludGVnZXIudG9IZXhTdHJpbmcoci5pbmZvLmdldFJlYWxDb25maWdDaGFuZ2VkKCkpCiAgICAgICAgICAgICAgICAgICAgICsgIiwgbmV3Q29uZmlnPSIgKyBuZXdDb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoY2hhbmdlcyYofnIuaW5mby5jb25maWdDaGFuZ2VzKSkgIT0gMCB8fCByLmZvcmNlTmV3Q29uZmlnKSB7CisgICAgICAgIGlmICgoY2hhbmdlcyYofnIuaW5mby5nZXRSZWFsQ29uZmlnQ2hhbmdlZCgpKSkgIT0gMCB8fCByLmZvcmNlTmV3Q29uZmlnKSB7CiAgICAgICAgICAgICAvLyBBaGEsIHRoZSBhY3Rpdml0eSBpc24ndCBoYW5kbGluZyB0aGUgY2hhbmdlLCBzbyBESUUgRElFIERJRS4KICAgICAgICAgICAgIHIuY29uZmlnQ2hhbmdlRmxhZ3MgfD0gY2hhbmdlczsKICAgICAgICAgICAgIHIuc3RhcnRGcmVlemluZ1NjcmVlbkxvY2tlZChyLmFwcCwgZ2xvYmFsQ2hhbmdlcyk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9CYWNrdXBSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhY2t1cFJlY29yZC5qYXZhCmluZGV4IDY1OTBiOTEuLjdlNzMxMDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhY2t1cFJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0JhY2t1cFJlY29yZC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX05PUk1BTCA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1VQX0ZVTEwgPSAxOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkUgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1RPUkVfRlVMTCA9IDM7CiAgICAgCiAgICAgZmluYWwgQmF0dGVyeVN0YXRzSW1wbC5VaWQuUGtnLlNlcnYgc3RhdHM7CiAgICAgU3RyaW5nIHN0cmluZ05hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkIHRvU3RyaW5nKCkgb3V0cHV0CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlRGlhbG9nLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MmJkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0NvbXBhdE1vZGVEaWFsb2cuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuYW07CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Db21wb3VuZEJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Td2l0Y2g7CisKK3B1YmxpYyBjbGFzcyBDb21wYXRNb2RlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKyAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBtQXBwSW5mbzsKKworICAgIGZpbmFsIFN3aXRjaCBtQ29tcGF0RW5hYmxlZDsKKyAgICBmaW5hbCBDaGVja0JveCBtQWx3YXlzU2hvdzsKKyAgICBmaW5hbCBWaWV3IG1IaW50OworCisgICAgcHVibGljIENvbXBhdE1vZGVEaWFsb2coQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBzZXJ2aWNlLCBDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwSW5mbykgeworICAgICAgICBzdXBlcihjb250ZXh0LCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0eWxlLlRoZW1lX0hvbG9fRGlhbG9nX01pbldpZHRoKTsKKyAgICAgICAgc2V0Q2FuY2VsYWJsZSh0cnVlKTsKKyAgICAgICAgc2V0Q2FuY2VsZWRPblRvdWNoT3V0c2lkZSh0cnVlKTsKKyAgICAgICAgZ2V0V2luZG93KCkucmVxdWVzdEZlYXR1cmUoV2luZG93LkZFQVRVUkVfTk9fVElUTEUpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRUeXBlKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfUEhPTkUpOworICAgICAgICBnZXRXaW5kb3coKS5zZXRHcmF2aXR5KEdyYXZpdHkuQk9UVE9NfEdyYXZpdHkuQ0VOVEVSX0hPUklaT05UQUwpOworICAgICAgICBtU2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgIG1BcHBJbmZvID0gYXBwSW5mbzsKKworICAgICAgICBzZXRDb250ZW50Vmlldyhjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmxheW91dC5hbV9jb21wYXRfbW9kZV9kaWFsb2cpOworICAgICAgICBtQ29tcGF0RW5hYmxlZCA9IChTd2l0Y2gpZmluZFZpZXdCeUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuaWQuY29tcGF0X2NoZWNrYm94KTsKKyAgICAgICAgbUNvbXBhdEVuYWJsZWQuc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIobmV3IENvbXBvdW5kQnV0dG9uLk9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKENvbXBvdW5kQnV0dG9uIGJ1dHRvblZpZXcsIGJvb2xlYW4gaXNDaGVja2VkKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtU2VydmljZSkgeworICAgICAgICAgICAgICAgICAgICBtU2VydmljZS5tQ29tcGF0TW9kZVBhY2thZ2VzLnNldFBhY2thZ2VTY3JlZW5Db21wYXRNb2RlTG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcHBJbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wYXRFbmFibGVkLmlzQ2hlY2tlZCgpID8gQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udHJvbHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtQWx3YXlzU2hvdyA9IChDaGVja0JveClmaW5kVmlld0J5SWQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC5hc2tfY2hlY2tib3gpOworICAgICAgICBtQWx3YXlzU2hvdy5zZXRPbkNoZWNrZWRDaGFuZ2VMaXN0ZW5lcihuZXcgQ29tcG91bmRCdXR0b24uT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoQ29tcG91bmRCdXR0b24gYnV0dG9uVmlldywgYm9vbGVhbiBpc0NoZWNrZWQpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1Db21wYXRNb2RlUGFja2FnZXMuc2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFwcEluZm8ucGFja2FnZU5hbWUsIG1BbHdheXNTaG93LmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29udHJvbHMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtSGludCA9IGZpbmRWaWV3QnlJZChjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmlkLnJlYXNrX2hpbnQpOworCisgICAgICAgIHVwZGF0ZUNvbnRyb2xzKCk7CisgICAgfQorCisgICAgdm9pZCB1cGRhdGVDb250cm9scygpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU2VydmljZSkgeworICAgICAgICAgICAgaW50IG1vZGUgPSBtU2VydmljZS5tQ29tcGF0TW9kZVBhY2thZ2VzLmNvbXB1dGVDb21wYXRNb2RlTG9ja2VkKG1BcHBJbmZvKTsKKyAgICAgICAgICAgIG1Db21wYXRFbmFibGVkLnNldENoZWNrZWQobW9kZSA9PSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfRU5BQkxFRCk7CisgICAgICAgICAgICBib29sZWFuIGFzayA9IG1TZXJ2aWNlLm1Db21wYXRNb2RlUGFja2FnZXMuZ2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgIG1BcHBJbmZvLnBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIG1BbHdheXNTaG93LnNldENoZWNrZWQoYXNrKTsKKyAgICAgICAgICAgIG1IaW50LnNldFZpc2liaWxpdHkoYXNrID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQ29tcGF0TW9kZVBhY2thZ2VzLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlUGFja2FnZXMuamF2YQppbmRleCAxZmFmOGRhLi5mNjU2NDg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlUGFja2FnZXMuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Db21wYXRNb2RlUGFja2FnZXMuamF2YQpAQCAtMyw4ICszLDEwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKQEAgLTE1LDYgKzE3LDcgQEAKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CkBAIC0zMSw3ICszNCwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBtU2VydmljZTsKICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ZpbGUgbUZpbGU7CiAKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBtUGFja2FnZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgLy8gQ29tcGF0aWJpbGl0eSBzdGF0ZTogbm8gbG9uZ2VyIGFzayB1c2VyIHRvIHNlbGVjdCB0aGUgbW9kZS4KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVRfRkxBR19ET05UX0FTSyA9IDE8PDA7CisgICAgLy8gQ29tcGF0aWJpbGl0eSBzdGF0ZTogY29tcGF0aWJpbGl0eSBtb2RlIGlzIGVuYWJsZWQuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NUEFUX0ZMQUdfRU5BQkxFRCA9IDE8PDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtUGFja2FnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1dSSVRFID0gMTsKIApAQCAtNzEsNyArNzksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoInBrZyIuZXF1YWxzKHRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgIm5hbWUiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFja2FnZXMuYWRkKHBrZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAibW9kZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGVJbnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVJbnQgPSBJbnRlZ2VyLnBhcnNlSW50KG1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnB1dChwa2csIG1vZGVJbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTMsMTkgKzEwOSw1MyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIEhhc2hTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlcygpIHsKKyAgICBwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGdldFBhY2thZ2VzKCkgewogICAgICAgICByZXR1cm4gbVBhY2thZ2VzOwogICAgIH0KIAotICAgIHB1YmxpYyBDb21wYXRpYmlsaXR5SW5mbyBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoQXBwbGljYXRpb25JbmZvIGFpKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksIG1TZXJ2aWNlLm1Db25maWd1cmF0aW9uLnNjcmVlbkxheW91dCwKLSAgICAgICAgICAgICAgICBtUGFja2FnZXMuY29udGFpbnMoYWkucGFja2FnZU5hbWUpKTsKKyAgICBwcml2YXRlIGludCBnZXRQYWNrYWdlRmxhZ3MoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIEludGVnZXIgZmxhZ3MgPSBtUGFja2FnZXMuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZsYWdzICE9IG51bGwgPyBmbGFncyA6IDA7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgY29tcHV0ZUNvbXBhdE1vZGVMb2NrZWQoQXBwbGljYXRpb25JbmZvIGFpKSB7Ci0gICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IG1QYWNrYWdlcy5jb250YWlucyhhaS5wYWNrYWdlTmFtZSk7CisgICAgcHVibGljIHZvaWQgaGFuZGxlUGFja2FnZUFkZGVkTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiB1cGRhdGVkKSB7CisgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhaSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhaSA9IEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRBcHBsaWNhdGlvbkluZm8ocGFja2FnZU5hbWUsIDApOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIGlmIChhaSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ29tcGF0aWJpbGl0eUluZm8gY2kgPSBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoYWkpOworICAgICAgICBmaW5hbCBib29sZWFuIG1heUNvbXBhdCA9ICFjaS5hbHdheXNTdXBwb3J0c1NjcmVlbigpCisgICAgICAgICAgICAgICAgJiYgIWNpLm5ldmVyU3VwcG9ydHNTY3JlZW4oKTsKKworICAgICAgICBpZiAodXBkYXRlZCkgeworICAgICAgICAgICAgLy8gVXBkYXRlIC0tIGlmIHRoZSBhcHAgbm8gbG9uZ2VyIGNhbiBydW4gaW4gY29tcGF0IG1vZGUsIGNsZWFyCisgICAgICAgICAgICAvLyBhbnkgY3VycmVudCBzZXR0aW5ncyBmb3IgaXQuCisgICAgICAgICAgICBpZiAoIW1heUNvbXBhdCAmJiBtUGFja2FnZXMuY29udGFpbnNLZXkocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1dSSVRFKTsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX1dSSVRFKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKEFwcGxpY2F0aW9uSW5mbyBhaSkgeworICAgICAgICBDb21wYXRpYmlsaXR5SW5mbyBjaSA9IG5ldyBDb21wYXRpYmlsaXR5SW5mbyhhaSwgbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0LAorICAgICAgICAgICAgICAgIG1TZXJ2aWNlLm1Db25maWd1cmF0aW9uLnNtYWxsZXN0U2NyZWVuV2lkdGhEcCwKKyAgICAgICAgICAgICAgICAoZ2V0UGFja2FnZUZsYWdzKGFpLnBhY2thZ2VOYW1lKSZDT01QQVRfRkxBR19FTkFCTEVEKSAhPSAwKTsKKyAgICAgICAgLy9TbG9nLmkoVEFHLCAiKioqKioqKioqKiogQ09NUEFUIEZPUiBQS0cgIiArIGFpLnBhY2thZ2VOYW1lICsgIjogIiArIGNpKTsKKyAgICAgICAgcmV0dXJuIGNpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgY29tcHV0ZUNvbXBhdE1vZGVMb2NrZWQoQXBwbGljYXRpb25JbmZvIGFpKSB7CisgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IChnZXRQYWNrYWdlRmxhZ3MoYWkucGFja2FnZU5hbWUpJkNPTVBBVF9GTEFHX0VOQUJMRUQpICE9IDA7CiAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksCi0gICAgICAgICAgICAgICAgbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0LCBlbmFibGVkKTsKKyAgICAgICAgICAgICAgICBtU2VydmljZS5tQ29uZmlndXJhdGlvbi5zY3JlZW5MYXlvdXQsCisgICAgICAgICAgICAgICAgbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc21hbGxlc3RTY3JlZW5XaWR0aERwLCBlbmFibGVkKTsKICAgICAgICAgaWYgKGluZm8uYWx3YXlzU3VwcG9ydHNTY3JlZW4oKSkgewogICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlci5DT01QQVRfTU9ERV9ORVZFUjsKICAgICAgICAgfQpAQCAtMTE2LDYgKzE2Niw0MCBAQAogICAgICAgICAgICAgICAgIDogQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGdldEZyb250QWN0aXZpdHlBc2tDb21wYXRNb2RlTG9ja2VkKCkgeworICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisgICAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoci5wYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UGFja2FnZUFza0NvbXBhdE1vZGVMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHJldHVybiAoZ2V0UGFja2FnZUZsYWdzKHBhY2thZ2VOYW1lKSZDT01QQVRfRkxBR19ET05UX0FTSykgPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9udEFjdGl2aXR5QXNrQ29tcGF0TW9kZUxvY2tlZChib29sZWFuIGFzaykgeworICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFBhY2thZ2VBc2tDb21wYXRNb2RlTG9ja2VkKHIucGFja2FnZU5hbWUsIGFzayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlQXNrQ29tcGF0TW9kZUxvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gYXNrKSB7CisgICAgICAgIGludCBjdXJGbGFncyA9IGdldFBhY2thZ2VGbGFncyhwYWNrYWdlTmFtZSk7CisgICAgICAgIGludCBuZXdGbGFncyA9IGFzayA/IChjdXJGbGFncyZ+Q09NUEFUX0ZMQUdfRE9OVF9BU0spIDogKGN1ckZsYWdzfENPTVBBVF9GTEFHX0RPTlRfQVNLKTsKKyAgICAgICAgaWYgKGN1ckZsYWdzICE9IG5ld0ZsYWdzKSB7CisgICAgICAgICAgICBpZiAobmV3RmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QYWNrYWdlcy5wdXQocGFja2FnZU5hbWUsIG5ld0ZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfV1JJVEUpOworICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19XUklURSk7CisgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwMCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldEZyb250QWN0aXZpdHlTY3JlZW5Db21wYXRNb2RlTG9ja2VkKCkgewogICAgICAgICBBY3Rpdml0eVJlY29yZCByID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CiAgICAgICAgIGlmIChyID09IG51bGwpIHsKQEAgLTE2MSw3ICsyNDUsOCBAQAogICAgIHByaXZhdGUgdm9pZCBzZXRQYWNrYWdlU2NyZWVuQ29tcGF0TW9kZUxvY2tlZChBcHBsaWNhdGlvbkluZm8gYWksIGludCBtb2RlKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGFpLnBhY2thZ2VOYW1lOwogCi0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBpbnQgY3VyRmxhZ3MgPSBnZXRQYWNrYWdlRmxhZ3MocGFja2FnZU5hbWUpOworCiAgICAgICAgIGJvb2xlYW4gZW5hYmxlOwogICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyLkNPTVBBVF9NT0RFX0RJU0FCTEVEOgpAQCAtMTcxLDQwICsyNTYsNjEgQEAKICAgICAgICAgICAgICAgICBlbmFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXIuQ09NUEFUX01PREVfVE9HR0xFOgotICAgICAgICAgICAgICAgIGVuYWJsZSA9ICFtUGFja2FnZXMuY29udGFpbnMocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgIGVuYWJsZSA9IChjdXJGbGFncyZDT01QQVRfRkxBR19FTkFCTEVEKSA9PSAwOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAiVW5rbm93biBzY3JlZW4gY29tcGF0IG1vZGUgcmVxICMiICsgbW9kZSArICI7IGlnbm9yaW5nIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgaW50IG5ld0ZsYWdzID0gY3VyRmxhZ3M7CiAgICAgICAgIGlmIChlbmFibGUpIHsKLSAgICAgICAgICAgIGlmICghbVBhY2thZ2VzLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1QYWNrYWdlcy5hZGQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3RmxhZ3MgfD0gQ09NUEFUX0ZMQUdfRU5BQkxFRDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtUGFja2FnZXMuY29udGFpbnMocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBuZXdGbGFncyAmPSB+Q09NUEFUX0ZMQUdfRU5BQkxFRDsKKyAgICAgICAgfQorCisgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNpID0gY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKGFpKTsKKyAgICAgICAgaWYgKGNpLmFsd2F5c1N1cHBvcnRzU2NyZWVuKCkpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJJZ25vcmluZyBjb21wYXQgbW9kZSBjaGFuZ2Ugb2YgIiArIHBhY2thZ2VOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjsgY29tcGF0aWJpbGl0eSBuZXZlciBuZWVkZWQiKTsKKyAgICAgICAgICAgIG5ld0ZsYWdzID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2kubmV2ZXJTdXBwb3J0c1NjcmVlbigpKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAiSWdub3JpbmcgY29tcGF0IG1vZGUgY2hhbmdlIG9mICIgKyBwYWNrYWdlTmFtZQorICAgICAgICAgICAgICAgICAgICArICI7IGNvbXBhdGliaWxpdHkgYWx3YXlzIG5lZWRlZCIpOworICAgICAgICAgICAgbmV3RmxhZ3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld0ZsYWdzICE9IGN1ckZsYWdzKSB7CisgICAgICAgICAgICBpZiAobmV3RmxhZ3MgIT0gMCkgeworICAgICAgICAgICAgICAgIG1QYWNrYWdlcy5wdXQocGFja2FnZU5hbWUsIG5ld0ZsYWdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVBhY2thZ2VzLnJlbW92ZShwYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGNpID0gY29tcGF0aWJpbGl0eUluZm9Gb3JQYWNrYWdlTG9ja2VkKGFpKTsKLSAgICAgICAgICAgIGlmIChjaS5hbHdheXNTdXBwb3J0c1NjcmVlbigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIGNvbXBhdCBtb2RlIGNoYW5nZSBvZiAiICsgcGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgY29tcGF0aWJpbGl0eSBuZXZlciBuZWVkZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2kubmV2ZXJTdXBwb3J0c1NjcmVlbigpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIklnbm9yaW5nIGNvbXBhdCBtb2RlIGNoYW5nZSBvZiAiICsgcGFja2FnZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgY29tcGF0aWJpbGl0eSBhbHdheXMgbmVlZGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOZWVkIHRvIGdldCBjb21wYXRpYmlsaXR5IGluZm8gaW4gbmV3IHN0YXRlLgorICAgICAgICAgICAgY2kgPSBjb21wYXRpYmlsaXR5SW5mb0ZvclBhY2thZ2VMb2NrZWQoYWkpOwogCiAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfV1JJVEUpOwogICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19XUklURSk7CiAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCAxMDAwMCk7CiAKKyAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIHN0YXJ0aW5nID0gbVNlcnZpY2UubU1haW5TdGFjay50b3BSdW5uaW5nQWN0aXZpdHlMb2NrZWQobnVsbCk7CisKKyAgICAgICAgICAgIC8vIEFsbCBhY3Rpdml0aWVzIHRoYXQgY2FtZSBmcm9tIHRoZSBwYWNrYWdlIG11c3QgYmUKKyAgICAgICAgICAgIC8vIHJlc3RhcnRlZCBhcyBpZiB0aGVyZSB3YXMgYSBjb25maWcgY2hhbmdlLgorICAgICAgICAgICAgZm9yIChpbnQgaT1tU2VydmljZS5tTWFpblN0YWNrLm1IaXN0b3J5LnNpemUoKS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBBY3Rpdml0eVJlY29yZCBhID0gKEFjdGl2aXR5UmVjb3JkKW1TZXJ2aWNlLm1NYWluU3RhY2subUhpc3RvcnkuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChhLmluZm8ucGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhLmZvcmNlTmV3Q29uZmlnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nICE9IG51bGwgJiYgYSA9PSBzdGFydGluZyAmJiBhLnZpc2libGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuc3RhcnRGcmVlemluZ1NjcmVlbkxvY2tlZChzdGFydGluZy5hcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5SW5mby5DT05GSUdfU0NSRUVOX0xBWU9VVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIFRlbGwgYWxsIHByb2Nlc3NlcyB0aGF0IGxvYWRlZCB0aGlzIHBhY2thZ2UgYWJvdXQgdGhlIGNoYW5nZS4KICAgICAgICAgICAgIGZvciAoaW50IGk9bVNlcnZpY2UubUxydVByb2Nlc3Nlcy5zaXplKCktMTsgaT49MDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1JlY29yZCBhcHAgPSBtU2VydmljZS5tTHJ1UHJvY2Vzc2VzLmdldChpKTsKQEAgLTIyMSwxNiArMzI3LDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIEFsbCBhY3Rpdml0aWVzIHRoYXQgY2FtZSBmcm9tIHRoZSBwYWNrZ2UgbXVzdCBiZQotICAgICAgICAgICAgLy8gcmVzdGFydGVkIGFzIGlmIHRoZXJlIHdhcyBhIGNvbmZpZyBjaGFuZ2UuCi0gICAgICAgICAgICBmb3IgKGludCBpPW1TZXJ2aWNlLm1NYWluU3RhY2subUhpc3Rvcnkuc2l6ZSgpLTE7IGk+PTA7IGktLSkgewotICAgICAgICAgICAgICAgIEFjdGl2aXR5UmVjb3JkIGEgPSAoQWN0aXZpdHlSZWNvcmQpbVNlcnZpY2UubU1haW5TdGFjay5tSGlzdG9yeS5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGEuaW5mby5wYWNrYWdlTmFtZS5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGEuZm9yY2VOZXdDb25maWcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQWN0aXZpdHlSZWNvcmQgc3RhcnRpbmcgPSBtU2VydmljZS5tTWFpblN0YWNrLnRvcFJ1bm5pbmdBY3Rpdml0eUxvY2tlZChudWxsKTsKICAgICAgICAgICAgIGlmIChzdGFydGluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVNlcnZpY2UubU1haW5TdGFjay5lbnN1cmVBY3Rpdml0eUNvbmZpZ3VyYXRpb25Mb2NrZWQoc3RhcnRpbmcsIDApOwogICAgICAgICAgICAgICAgIC8vIEFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhdCB0aGlzIHBvaW50IHRoYXQgYWxsIG90aGVyIGFjdGl2aXRpZXMKQEAgLTI0MSw5ICszMzcsOSBAQAogICAgIH0KIAogICAgIHZvaWQgc2F2ZUNvbXBhdE1vZGVzKCkgewotICAgICAgICBIYXNoU2V0PFN0cmluZz4gcGtnczsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IHBrZ3M7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVNlcnZpY2UpIHsKLSAgICAgICAgICAgIHBrZ3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KG1QYWNrYWdlcyk7CisgICAgICAgICAgICBwa2dzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPihtUGFja2FnZXMpOwogICAgICAgICB9CiAKICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwpAQCAtMjU4LDkgKzM1NCwxNSBAQAogCiAgICAgICAgICAgICBmaW5hbCBJUGFja2FnZU1hbmFnZXIgcG0gPSBBcHBHbG9iYWxzLmdldFBhY2thZ2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgc2NyZWVuTGF5b3V0ID0gbVNlcnZpY2UubUNvbmZpZ3VyYXRpb24uc2NyZWVuTGF5b3V0OwotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzbWFsbGVzdFNjcmVlbldpZHRoRHAgPSBtU2VydmljZS5tQ29uZmlndXJhdGlvbi5zbWFsbGVzdFNjcmVlbldpZHRoRHA7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPj4gaXQgPSBwa2dzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwa2cgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFpID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBhaSA9IHBtLmdldEFwcGxpY2F0aW9uSW5mbyhwa2csIDApOwpAQCAtMjY5LDcgKzM3MSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGFpID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksIHNjcmVlbkxheW91dCwgZmFsc2UpOworICAgICAgICAgICAgICAgIENvbXBhdGliaWxpdHlJbmZvIGluZm8gPSBuZXcgQ29tcGF0aWJpbGl0eUluZm8oYWksIHNjcmVlbkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0U2NyZWVuV2lkdGhEcCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChpbmZvLmFsd2F5c1N1cHBvcnRzU2NyZWVuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjc4LDYgKzM4MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAicGtnIik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibmFtZSIsIHBrZyk7CisgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibW9kZSIsIEludGVnZXIudG9TdHJpbmcobW9kZSkpOwogICAgICAgICAgICAgICAgIG91dC5lbmRUYWcobnVsbCwgInBrZyIpOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Qcm9jZXNzUmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9Qcm9jZXNzUmVjb3JkLmphdmEKaW5kZXggYmVlZjEzNi4uMzk2OGY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUHJvY2Vzc1JlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NSZWNvcmQuamF2YQpAQCAtNzEsNiArNzEsNyBAQAogICAgIElCaW5kZXIgZm9yY2luZ1RvRm9yZWdyb3VuZDsvLyBUb2tlbiB0aGF0IGlzIGZvcmNpbmcgdGhpcyBwcm9jZXNzIHRvIGJlIGZvcmVncm91bmQKICAgICBpbnQgYWRqU2VxOyAgICAgICAgICAgICAgICAgLy8gU2VxdWVuY2UgaWQgZm9yIGlkZW50aWZ5aW5nIG9vbV9hZGogYXNzaWdubWVudCBjeWNsZXMKICAgICBpbnQgbHJ1U2VxOyAgICAgICAgICAgICAgICAgLy8gU2VxdWVuY2UgaWQgZm9yIGlkZW50aWZ5aW5nIExSVSB1cGRhdGUgY3ljbGVzCisgICAgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0OyAgIC8vIGxhc3QgdXNlZCBjb21wYXRpYmlsaXR5IG1vZGUKICAgICBDb21wb25lbnROYW1lIGluc3RydW1lbnRhdGlvbkNsYXNzOy8vIGNsYXNzIGluc3RhbGxlZCB0byBpbnN0cnVtZW50IGFwcAogICAgIEFwcGxpY2F0aW9uSW5mbyBpbnN0cnVtZW50YXRpb25JbmZvOyAvLyB0aGUgYXBwbGljYXRpb24gYmVpbmcgaW5zdHJ1bWVudGVkCiAgICAgU3RyaW5nIGluc3RydW1lbnRhdGlvblByb2ZpbGVGaWxlOyAvLyB3aGVyZSB0byBzYXZlIHByb2ZpbGluZwpAQCAtMTQ3LDYgKzE0OCw3IEBACiAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBwdWJsaWNEaXI9Iik7IHB3LnByaW50KGluZm8ucHVibGljU291cmNlRGlyKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGRhdGE9Iik7IHB3LnByaW50bG4oaW5mby5kYXRhRGlyKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhY2thZ2VMaXN0PSIpOyBwdy5wcmludGxuKHBrZ0xpc3QpOworICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiY29tcGF0PSIpOyBwdy5wcmludGxuKGNvbXBhdCk7CiAgICAgICAgIGlmIChpbnN0cnVtZW50YXRpb25DbGFzcyAhPSBudWxsIHx8IGluc3RydW1lbnRhdGlvblByb2ZpbGVGaWxlICE9IG51bGwKICAgICAgICAgICAgICAgICB8fCBpbnN0cnVtZW50YXRpb25Bcmd1bWVudHMgIT0gbnVsbCkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImluc3RydW1lbnRhdGlvbkNsYXNzPSIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhCmluZGV4IGU4Yzg3ZTEuLmU2MWE3ZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Rhc2tSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9UYXNrUmVjb3JkLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKICAgICBsb25nIGxhc3RBY3RpdmVUaW1lOyAgICAvLyBMYXN0IHRpbWUgdGhpcyB0YXNrIHdhcyBhY3RpdmUsIGluY2x1ZGluZyBzbGVlcC4KICAgICBib29sZWFuIHJvb3RXYXNSZXNldDsgICAvLyBUcnVlIGlmIHRoZSBpbnRlbnQgYXQgdGhlIHJvb3Qgb2YgdGhlIHRhc2sgaGFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIEZMQUdfQUNUSVZJVFlfUkVTRVRfVEFTS19JRl9ORUVERUQgZmxhZy4KKyAgICBib29sZWFuIGFza2VkQ29tcGF0TW9kZTsvLyBIYXZlIGFza2VkIHRoZSB1c2VyIGFib3V0IGNvbXBhdCBtb2RlIGZvciB0aGlzIHRhc2suCiAKICAgICBTdHJpbmcgc3RyaW5nTmFtZTsgICAgICAvLyBjYWNoaW5nIG9mIHRvU3RyaW5nKCkgcmVzdWx0LgogICAgIApAQCAtMTEyLDYgKzExMyw5IEBACiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVhbEFjdGl2aXR5PSIpOwogICAgICAgICAgICAgcHcucHJpbnRsbihyZWFsQWN0aXZpdHkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFhc2tlZENvbXBhdE1vZGUpIHsKKyAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJhc2tlZENvbXBhdE1vZGU9Iik7IHB3LnByaW50bG4oYXNrZWRDb21wYXRNb2RlKTsKKyAgICAgICAgfQogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibGFzdEFjdGl2ZVRpbWU9Iik7IHB3LnByaW50KGxhc3RBY3RpdmVUaW1lKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIChpbmFjdGl2ZSBmb3IgIik7CiAgICAgICAgICAgICAgICAgcHcucHJpbnQoKGdldEluYWN0aXZlRHVyYXRpb24oKS8xMDAwKSk7IHB3LnByaW50bG4oInMpIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVGV0aGVyaW5nLmphdmEKaW5kZXggZTgxNTViNC4uNWZhMjZlZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1RldGhlcmluZy5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9UZXRoZXJpbmcuamF2YQpAQCAtMTI5LDEzICsxMjksNiBAQAogICAgICAgICBtTk1TZXJ2aWNlID0gbm1TZXJ2aWNlOwogICAgICAgICBtTG9vcGVyID0gbG9vcGVyOwogCi0gICAgICAgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIGZyb20gTmV0d29ya01hbmFnZW1lbnQgU2VydmljZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU5NU2VydmljZS5yZWdpc3Rlck9ic2VydmVyKHRoaXMpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgcmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgOiIgKyBlKTsKLSAgICAgICAgfQotCiAgICAgICAgIG1JZmFjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRldGhlckludGVyZmFjZVNNPigpOwogCiAgICAgICAgIC8vIG1ha2Ugb3VyIG93biB0aHJlYWQgc28gd2UgZG9uJ3QgYW5yIHRoZSBzeXN0ZW0KQEAgLTEyMTIsOCArMTIwNSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogaWZhY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHJlZ2V4IDogbVVwc3RyZWFtSWZhY2VSZWdleHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyByZWdleCA6IG1VcHN0cmVhbUlmYWNlUmVnZXhzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogaWZhY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZhY2UubWF0Y2hlcyhyZWdleCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgaXQgaXMgYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBpZmNnID0gbnVsbDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9WcG4uamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2Nvbm5lY3Rpdml0eS9WcG4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgxM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvY29ubmVjdGl2aXR5L1Zwbi5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuY29ubmVjdGl2aXR5OworCitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5uZXQuVnBuQ29uZmlnOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5Db25uZWN0aXZpdHlTZXJ2aWNlLlZwbkNhbGxiYWNrOworCisvKioKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBWcG4gZXh0ZW5kcyBJTmV0d29ya01hbmFnZW1lbnRFdmVudE9ic2VydmVyLlN0dWIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJWcG4iOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWUE4gPSBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVlBOOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgVnBuQ2FsbGJhY2sgbUNhbGxiYWNrOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2VOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIG1JbnRlcmZhY2VOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIG1EbnNQcm9wZXJ0eVByZWZpeDsKKworICAgIHB1YmxpYyBWcG4oQ29udGV4dCBjb250ZXh0LCBWcG5DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgZm9yIGEgVlBOIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG5ldyBWUE4gYXBwbGljYXRpb24uCisgICAgICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcmVwYXJlZCBwYWNrYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHByZXBhcmUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBwcmVwYXJlZCBwYWNrYWdlIGlmIHRoZSBuZXcgb25lIGlzIG51bGwuCisgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHBlcm1pc3Npb24gb2YgdGhlIGNhbGxlci4KKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBWcG5Db25maWcuZW5mb3JjZUNhbGxpbmdQYWNrYWdlKHBtLmdldE5hbWVGb3JVaWQoQmluZGVyLmdldENhbGxpbmdVaWQoKSkpOworCisgICAgICAgIC8vIENoZWNrIHRoZSBwZXJtaXNzaW9uIG9mIHRoZSBnaXZlbiBwYWNrYWdlLgorICAgICAgICBpZiAocGFja2FnZU5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAocG0uY2hlY2tQZXJtaXNzaW9uKFZQTiwgcGFja2FnZU5hbWUpICE9IFBhY2thZ2VNYW5hZ2VyLlBFUk1JU1NJT05fR1JBTlRFRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKHBhY2thZ2VOYW1lICsgIiBkb2VzIG5vdCBoYXZlICIgKyBWUE4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGludGVyZmFjZSBhbmQgaGlkZSB0aGUgbm90aWZpY2F0aW9uLgorICAgICAgICBpZiAobUludGVyZmFjZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgbmF0aXZlUmVzZXQobUludGVyZmFjZU5hbWUpOworICAgICAgICAgICAgbUNhbGxiYWNrLnJlc3RvcmUoKTsKKyAgICAgICAgICAgIGhpZGVOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdGlmeSB0aGUgcGFja2FnZSBiZWluZyByZXZva2VkLgorICAgICAgICBpZiAobVBhY2thZ2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFZwbkNvbmZpZy5BQ1RJT05fVlBOX1JFVk9LRUQpOworICAgICAgICAgICAgaW50ZW50LnNldFBhY2thZ2UobVBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFkpOworICAgICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICB9CisKKyAgICAgICAgTG9nLmkoVEFHLCAiU3dpdGNoZWQgZnJvbSAiICsgbVBhY2thZ2VOYW1lICsgIiB0byAiICsgcGFja2FnZU5hbWUpOworICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKyAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm90ZWN0IGEgc29ja2V0IGZyb20gcm91dGluZyBjaGFuZ2VzIGJ5IGJpbmRpbmcgaXQgdG8gdGhlIGdpdmVuCisgICAgICogaW50ZXJmYWNlLiBUaGUgc29ja2V0IElTIGNsb3NlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb2NrZXQgVGhlIHNvY2tldCB0byBiZSBib3VuZC4KKyAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3RlY3QoUGFyY2VsRmlsZURlc2NyaXB0b3Igc29ja2V0LCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKFZQTiwgInByb3RlY3QiKTsKKyAgICAgICAgICAgIG5hdGl2ZVByb3RlY3Qoc29ja2V0LmdldEZkKCksIG5hbWUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgYSBUVU4gaW50ZXJmYWNlIGFuZCByZXR1cm4gaXRzIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIFRoZSBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gVGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUGFyY2VsRmlsZURlc2NyaXB0b3IgZXN0YWJsaXNoKFZwbkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHBlcm1pc3Npb24gb2YgdGhlIGNhbGxlci4KKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKFZQTiwgImVzdGFibGlzaCIpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBwcmVwYXJlZC4KKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBBcHBsaWNhdGlvbkluZm8gYXBwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcCA9IHBtLmdldEFwcGxpY2F0aW9uSW5mbyhtUGFja2FnZU5hbWUsIDApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgIT0gYXBwLnVpZCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgaW50ZXJmYWNlLgorICAgICAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gUGFyY2VsRmlsZURlc2NyaXB0b3IuYWRvcHRGZCgKKyAgICAgICAgICAgICAgICBuYXRpdmVFc3RhYmxpc2goY29uZmlnLm10dSwgY29uZmlnLmFkZHJlc3NlcywgY29uZmlnLnJvdXRlcykpOworCisgICAgICAgIC8vIFJlcGxhY2UgdGhlIGludGVyZmFjZSBhbmQgYWJvcnQgaWYgaXQgZmFpbHMuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IG5hdGl2ZUdldE5hbWUoZGVzY3JpcHRvci5nZXRGZCgpKTsKKworICAgICAgICAgICAgaWYgKG1JbnRlcmZhY2VOYW1lICE9IG51bGwgJiYgIW1JbnRlcmZhY2VOYW1lLmVxdWFscyhpbnRlcmZhY2VOYW1lKSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZVJlc2V0KG1JbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlTmFtZTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBkbnNTZXJ2ZXJzID0gKGNvbmZpZy5kbnNTZXJ2ZXJzID09IG51bGwpID8gIiIgOiBjb25maWcuZG5zU2VydmVycy50cmltKCk7CisgICAgICAgIG1DYWxsYmFjay5vdmVycmlkZShkbnNTZXJ2ZXJzLmlzRW1wdHkoKSA/IG51bGwgOiBkbnNTZXJ2ZXJzLnNwbGl0KCIgIikpOworCisgICAgICAgIGNvbmZpZy5wYWNrYWdlTmFtZSA9IG1QYWNrYWdlTmFtZTsKKyAgICAgICAgY29uZmlnLmludGVyZmFjZU5hbWUgPSBtSW50ZXJmYWNlTmFtZTsKKyAgICAgICAgc2hvd05vdGlmaWNhdGlvbihwbSwgYXBwLCBjb25maWcpOworICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICAvLyBJTmV0d29ya01hbmFnZW1lbnRFdmVudE9ic2VydmVyLlN0dWIKKyAgICBwdWJsaWMgdm9pZCBpbnRlcmZhY2VMaW5rU3RhdHVzQ2hhbmdlZChTdHJpbmcgbmFtZSwgYm9vbGVhbiB1cCkgeworICAgIH0KKworICAgIC8vIElOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXIuU3R1YgorICAgIHB1YmxpYyB2b2lkIGludGVyZmFjZUFkZGVkKFN0cmluZyBuYW1lKSB7CisgICAgfQorCisgICAgLy8gSU5ldHdvcmtNYW5hZ2VtZW50RXZlbnRPYnNlcnZlci5TdHViCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGludGVyZmFjZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG1JbnRlcmZhY2VOYW1lKSAmJiBuYXRpdmVDaGVjayhuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBoaWRlTm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICBtSW50ZXJmYWNlTmFtZSA9IG51bGw7CisgICAgICAgICAgICBtQ2FsbGJhY2sucmVzdG9yZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNob3dOb3RpZmljYXRpb24oUGFja2FnZU1hbmFnZXIgcG0sIEFwcGxpY2F0aW9uSW5mbyBhcHAsIFZwbkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgTm90aWZpY2F0aW9uTWFuYWdlciBubSA9IChOb3RpZmljYXRpb25NYW5hZ2VyKQorICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5OT1RJRklDQVRJT05fU0VSVklDRSk7CisKKyAgICAgICAgaWYgKG5tICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIGljb24gYW5kIGNvbnZlcnQgaXQgaW50byBhIGJpdG1hcC4KKyAgICAgICAgICAgIERyYXdhYmxlIGljb24gPSBhcHAubG9hZEljb24ocG0pOworICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG51bGw7CisgICAgICAgICAgICBpZiAoaWNvbi5nZXRJbnRyaW5zaWNXaWR0aCgpID4gMCAmJiBpY29uLmdldEludHJpbnNpY0hlaWdodCgpID4gMCkgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5kaW1lbi5ub3RpZmljYXRpb25fbGFyZ2VfaWNvbl93aWR0aCk7CisgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IG1Db250ZXh0LmdldFJlc291cmNlcygpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5kaW1lbi5ub3RpZmljYXRpb25fbGFyZ2VfaWNvbl9oZWlnaHQpOworICAgICAgICAgICAgICAgIGljb24uc2V0Qm91bmRzKDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIGJpdG1hcCA9IEJpdG1hcC5jcmVhdGVCaXRtYXAod2lkdGgsIGhlaWdodCwgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOworICAgICAgICAgICAgICAgIGljb24uZHJhdyhuZXcgQ2FudmFzKGJpdG1hcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBsYWJlbC4KKyAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGFwcC5sb2FkTGFiZWwocG0pLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIC8vIEJ1aWxkIHRoZSBub3RpZmljYXRpb24uCisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IChjb25maWcuc2Vzc2lvbk5hbWUgPT0gbnVsbCkgPyBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcudnBuX3RleHQpIDoKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnZwbl90ZXh0X2xvbmcsIGNvbmZpZy5zZXNzaW9uTmFtZSk7CisgICAgICAgICAgICBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbi5CdWlsZGVyKG1Db250ZXh0KQorICAgICAgICAgICAgICAgICAgICAuc2V0U21hbGxJY29uKFIuZHJhd2FibGUudnBuX2Nvbm5lY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgLnNldExhcmdlSWNvbihiaXRtYXApCisgICAgICAgICAgICAgICAgICAgIC5zZXRUaWNrZXIobUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLnZwbl90aWNrZXIsIGxhYmVsKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldENvbnRlbnRUaXRsZShtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcudnBuX3RpdGxlLCBsYWJlbCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250ZW50VGV4dCh0ZXh0KQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGVudEludGVudChWcG5Db25maWcuZ2V0SW50ZW50Rm9yTm90aWZpY2F0aW9uKG1Db250ZXh0LCBjb25maWcpKQorICAgICAgICAgICAgICAgICAgICAuc2V0RGVmYXVsdHMoTm90aWZpY2F0aW9uLkRFRkFVTFRfQUxMKQorICAgICAgICAgICAgICAgICAgICAuc2V0T25nb2luZyh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuZ2V0Tm90aWZpY2F0aW9uKCk7CisgICAgICAgICAgICBubS5ub3RpZnkoUi5kcmF3YWJsZS52cG5fY29ubmVjdGVkLCBub3RpZmljYXRpb24pOworICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhpZGVOb3RpZmljYXRpb24oKSB7CisgICAgICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbm0gPSAoTm90aWZpY2F0aW9uTWFuYWdlcikKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOworCisgICAgICAgIGlmIChubSAhPSBudWxsKSB7CisgICAgICAgICAgICBsb25nIGlkZW50aXR5ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICBubS5jYW5jZWwoUi5kcmF3YWJsZS52cG5fY29ubmVjdGVkKTsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGludCBuYXRpdmVFc3RhYmxpc2goaW50IG10dSwgU3RyaW5nIGFkZHJlc3NlcywgU3RyaW5nIHJvdXRlcyk7CisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIG5hdGl2ZUdldE5hbWUoaW50IGZkKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG5hdGl2ZVJlc2V0KFN0cmluZyBuYW1lKTsKKyAgICBwcml2YXRlIG5hdGl2ZSBpbnQgbmF0aXZlQ2hlY2soU3RyaW5nIG5hbWUpOworICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbmF0aXZlUHJvdGVjdChpbnQgZmQsIFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25ldC9OZXR3b3JrSWRlbnRpdHlTZXQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25ldC9OZXR3b3JrSWRlbnRpdHlTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjAzZmIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbmV0L05ldHdvcmtJZGVudGl0eVNldC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci5uZXQ7CisKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSWRlbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKKworLyoqCisgKiBJZGVudGl0eSBvZiBhIHtAY29kZSBpZmFjZX0sIGRlZmluZWQgYnkgdGhlIHNldCBvZiB7QGxpbmsgTmV0d29ya0lkZW50aXR5fQorICogYWN0aXZlIG9uIHRoYXQgaW50ZXJmYWNlLgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrSWRlbnRpdHlTZXQgZXh0ZW5kcyBIYXNoU2V0PE5ldHdvcmtJZGVudGl0eT4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0lOSVQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0FERF9ST0FNSU5HID0gMjsKKworICAgIHB1YmxpYyBOZXR3b3JrSWRlbnRpdHlTZXQoKSB7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtJZGVudGl0eVNldChEYXRhSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uID0gaW4ucmVhZEludCgpOworICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgVkVSU0lPTl9JTklUOiB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGlnbm9yZWRWZXJzaW9uID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN1YlR5cGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdWJzY3JpYmVySWQgPSByZWFkT3B0aW9uYWxTdHJpbmcoaW4pOworICAgICAgICAgICAgICAgICAgICBhZGQobmV3IE5ldHdvcmtJZGVudGl0eSh0eXBlLCBzdWJUeXBlLCBzdWJzY3JpYmVySWQsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBWRVJTSU9OX0FERF9ST0FNSU5HOiB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzdWJUeXBlID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3Vic2NyaWJlcklkID0gcmVhZE9wdGlvbmFsU3RyaW5nKGluKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByb2FtaW5nID0gaW4ucmVhZEJvb2xlYW4oKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkKG5ldyBOZXR3b3JrSWRlbnRpdHkodHlwZSwgc3ViVHlwZSwgc3Vic2NyaWJlcklkLCByb2FtaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigidW5leHBlY3RlZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvU3RyZWFtKERhdGFPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGVJbnQoVkVSU0lPTl9BRERfUk9BTUlORyk7CisgICAgICAgIG91dC53cml0ZUludChzaXplKCkpOworICAgICAgICBmb3IgKE5ldHdvcmtJZGVudGl0eSBpZGVudCA6IHRoaXMpIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludChpZGVudC5nZXRUeXBlKCkpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KGlkZW50LmdldFN1YlR5cGUoKSk7CisgICAgICAgICAgICB3cml0ZU9wdGlvbmFsU3RyaW5nKG91dCwgaWRlbnQuZ2V0U3Vic2NyaWJlcklkKCkpOworICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihpZGVudC5nZXRSb2FtaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZU9wdGlvbmFsU3RyaW5nKERhdGFPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKDEpOworICAgICAgICAgICAgb3V0LndyaXRlVVRGKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZE9wdGlvbmFsU3RyaW5nKERhdGFJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGluLnJlYWRCeXRlKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGluLnJlYWRVVEYoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvbmV0L05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGQwODNkMDEuLjU4NGNkMDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25ldC9OZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE2LDYzICsxNiwyMTkgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0OwogCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5DT05ORUNUSVZJVFlfSU5URVJOQUw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5EVU1QOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUFOQUdFX0FQUF9UT0tFTlM7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5VUERBVEVfREVWSUNFX1NUQVRTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUFOQUdFX05FVFdPUktfUE9MSUNZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9ORVRXT1JLX1VTQUdFX0hJU1RPUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1BIT05FX1NUQVRFOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkFDVElPTl9VSURfUkVNT1ZFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5FWFRSQV9VSUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuQ09OTkVDVElWSVRZX0FDVElPTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlci5UWVBFX01PQklMRTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeS5MSU1JVF9ESVNBQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeS5XQVJOSU5HX0RJU0FCTEVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5BQ1RJT05fREFUQV9VU0FHRV9MSU1JVDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuQUNUSU9OX0RBVEFfVVNBR0VfV0FSTklORzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuRVhUUkFfTkVUV09SS19URU1QTEFURTsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUE9MSUNZX05PTkU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlBPTElDWV9SRUpFQ1RfQkFDS0dST1VORDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUE9MSUNZX1JFSkVDVF9QQUlEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5QT0xJQ1lfUkVKRUNUX01FVEVSRURfQkFDS0dST1VORDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUlVMRV9BTExPV19BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlJVTEVfUkVKRUNUX01FVEVSRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLmNvbXB1dGVMYXN0Q3ljbGVCb3VuZGFyeTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuZHVtcFBvbGljeTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuZHVtcFJ1bGVzOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5pc1VpZFZhbGlkRm9yUG9saWN5OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGUuTUFUQ0hfTU9CSUxFXzNHX0xPV0VSOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGUuTUFUQ0hfTU9CSUxFXzRHOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGUuTUFUQ0hfTU9CSUxFX0FMTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuREFZX0lOX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLm5ldC5OZXR3b3JrU3RhdHNTZXJ2aWNlLkFDVElPTl9ORVRXT1JLX1NUQVRTX1VQREFURUQ7CitpbXBvcnQgc3RhdGljIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UOworaW1wb3J0IHN0YXRpYyBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyLlNUQVJUX1RBRzsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLklBY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSU5vdGlmaWNhdGlvbk1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuSVByb2Nlc3NPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247CitpbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtQb2xpY3lMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya1BvbGljeU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtTdGF0c1NlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0lkZW50aXR5OworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3k7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0czsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGU7CitpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwogaW1wb3J0IGFuZHJvaWQub3MuSVBvd2VyTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUNhbGxiYWNrTGlzdDsKIGltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5Gb3JtYXR0ZXI7CitpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5UaW1lOworaW1wb3J0IGFuZHJvaWQudXRpbC5OdHBUcnVzdGVkVGltZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlSW50QXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlRydXN0ZWRUaW1lOworaW1wb3J0IGFuZHJvaWQudXRpbC5YbWw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5SOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLm9zLkF0b21pY0ZpbGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GYXN0WG1sU2VyaWFsaXplcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0LlNldHM7CisKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgbGliY29yZS5pby5Jb1V0aWxzOwogCiAvKioKICAqIFNlcnZpY2UgdGhhdCBtYWludGFpbnMgbG93LWxldmVsIG5ldHdvcmsgcG9saWN5IHJ1bGVzIGFuZCBjb2xsZWN0cyB1c2FnZQogICogc3RhdGlzdGljcyB0byBkcml2ZSB0aG9zZSBydWxlcy4KKyAqIDxwPgorICogRGVyaXZlcyBhY3RpdmUgcnVsZXMgYnkgY29tYmluaW5nIGEgZ2l2ZW4gcG9saWN5IHdpdGggb3RoZXIgc3lzdGVtIHN0YXR1cywKKyAqIGFuZCBkZWxpdmVycyB0byBsaXN0ZW5lcnMsIHN1Y2ggYXMge0BsaW5rIENvbm5lY3Rpdml0eU1hbmFnZXJ9LCBmb3IKKyAqIGVuZm9yY2VtZW50LgogICovCiBwdWJsaWMgY2xhc3MgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlIGV4dGVuZHMgSU5ldHdvcmtQb2xpY3lNYW5hZ2VyLlN0dWIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmV0d29ya1BvbGljeSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dEID0gdHJ1ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR1YgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIElBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcjsKLSAgICBwcml2YXRlIElQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9DVVJSRU5UID0gMTsKIAotICAgIHByaXZhdGUgT2JqZWN0IG1SdWxlc0xvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBLQl9JTl9CWVRFUyA9IDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQl9JTl9CWVRFUyA9IEtCX0lOX0JZVEVTICogMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEdCX0lOX0JZVEVTID0gTUJfSU5fQllURVMgKiAxMDI0OwogCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TY3JlZW5PbiA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX1dBUk5JTkcgPSAweDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfTElNSVQgPSAweDI7CiAKLSAgICAvKiogQ3VycmVudCBuZXR3b3JrIHBvbGljeSBmb3IgZWFjaCBVSUQuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QT0xJQ1lfTElTVCA9ICJwb2xpY3ktbGlzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19ORVRXT1JLX1BPTElDWSA9ICJuZXR3b3JrLXBvbGljeSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VSURfUE9MSUNZID0gInVpZC1wb2xpY3kiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ORVRXT1JLX1RFTVBMQVRFID0gIm5ldHdvcmtUZW1wbGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1VCU0NSSUJFUl9JRCA9ICJzdWJzY3JpYmVySWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0NZQ0xFX0RBWSA9ICJjeWNsZURheSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfV0FSTklOR19CWVRFUyA9ICJ3YXJuaW5nQnl0ZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xJTUlUX0JZVEVTID0gImxpbWl0Qnl0ZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1VJRCA9ICJ1aWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BPTElDWSA9ICJwb2xpY3kiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUSU1FX0NBQ0hFX01BWF9BR0UgPSBEQVlfSU5fTUlMTElTOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgSUFjdGl2aXR5TWFuYWdlciBtQWN0aXZpdHlNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgSVBvd2VyTWFuYWdlciBtUG93ZXJNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgSU5ldHdvcmtTdGF0c1NlcnZpY2UgbU5ldHdvcmtTdGF0czsKKyAgICBwcml2YXRlIGZpbmFsIFRydXN0ZWRUaW1lIG1UaW1lOworCisgICAgcHJpdmF0ZSBJQ29ubmVjdGl2aXR5TWFuYWdlciBtQ29ubk1hbmFnZXI7CisgICAgcHJpdmF0ZSBJTm90aWZpY2F0aW9uTWFuYWdlciBtTm90aWZNYW5hZ2VyOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJ1bGVzTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBtU2NyZWVuT247CisKKyAgICAvKiogQ3VycmVudCBwb2xpY3kgZm9yIG5ldHdvcmsgdGVtcGxhdGVzLiAqLworICAgIHByaXZhdGUgQXJyYXlMaXN0PE5ldHdvcmtQb2xpY3k+IG1OZXR3b3JrUG9saWN5ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICAvKiogQ3VycmVudCBwb2xpY3kgZm9yIGVhY2ggVUlELiAqLwogICAgIHByaXZhdGUgU3BhcnNlSW50QXJyYXkgbVVpZFBvbGljeSA9IG5ldyBTcGFyc2VJbnRBcnJheSgpOworICAgIC8qKiBDdXJyZW50IGRlcml2ZWQgbmV0d29yayBydWxlcyBmb3IgZWFjaCBVSUQuICovCisgICAgcHJpdmF0ZSBTcGFyc2VJbnRBcnJheSBtVWlkUnVsZXMgPSBuZXcgU3BhcnNlSW50QXJyYXkoKTsKKworICAgIC8qKiBTZXQgb2YgaWZhY2VzIHRoYXQgYXJlIG1ldGVyZWQuICovCisgICAgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gbU1ldGVyZWRJZmFjZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKIAogICAgIC8qKiBGb3JlZ3JvdW5kIGF0IGJvdGggVUlEIGFuZCBQSUQgZ3JhbnVsYXJpdHkuICovCiAgICAgcHJpdmF0ZSBTcGFyc2VCb29sZWFuQXJyYXkgbVVpZEZvcmVncm91bmQgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KCk7CiAgICAgcHJpdmF0ZSBTcGFyc2VBcnJheTxTcGFyc2VCb29sZWFuQXJyYXk+IG1VaWRQaWRGb3JlZ3JvdW5kID0gbmV3IFNwYXJzZUFycmF5PAogICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5PigpOwogCi0gICAgLy8gVE9ETzogcGVyaW9kaWNhbGx5IHBvbGwgbmV0d29yayBzdGF0cyBhbmQgd3JpdGUgdG8gZGlzawotICAgIC8vIFRPRE86IHNhdmUvcmVzdG9yZSBwb2xpY3kgaW5mb3JtYXRpb24gZnJvbSBkaXNrCisgICAgcHJpdmF0ZSBmaW5hbCBSZW1vdGVDYWxsYmFja0xpc3Q8SU5ldHdvcmtQb2xpY3lMaXN0ZW5lcj4gbUxpc3RlbmVycyA9IG5ldyBSZW1vdGVDYWxsYmFja0xpc3Q8CisgICAgICAgICAgICBJTmV0d29ya1BvbGljeUxpc3RlbmVyPigpOwogCi0gICAgcHVibGljIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZSgKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgSUFjdGl2aXR5TWFuYWdlciBhY3Rpdml0eU1hbmFnZXIsIElQb3dlck1hbmFnZXIgcG93ZXJNYW5hZ2VyKSB7CisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyVGhyZWFkIG1IYW5kbGVyVGhyZWFkOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljRmlsZSBtUG9saWN5RmlsZTsKKworICAgIC8vIFRPRE86IGtlZXAgd2hpdGVsaXN0IG9mIHN5c3RlbS1jcml0aWNhbCBzZXJ2aWNlcyB0aGF0IHNob3VsZCBuZXZlciBoYXZlCisgICAgLy8gcnVsZXMgZW5mb3JjZWQsIHN1Y2ggYXMgc3lzdGVtLCBwaG9uZSwgYW5kIHJhZGlvIFVJRHMuCisKKyAgICBwdWJsaWMgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlKENvbnRleHQgY29udGV4dCwgSUFjdGl2aXR5TWFuYWdlciBhY3Rpdml0eU1hbmFnZXIsCisgICAgICAgICAgICBJUG93ZXJNYW5hZ2VyIHBvd2VyTWFuYWdlciwgSU5ldHdvcmtTdGF0c1NlcnZpY2UgbmV0d29ya1N0YXRzKSB7CisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gdXNpbmcgY2FjaGVkIE50cFRydXN0ZWRUaW1lCisgICAgICAgIHRoaXMoY29udGV4dCwgYWN0aXZpdHlNYW5hZ2VyLCBwb3dlck1hbmFnZXIsIG5ldHdvcmtTdGF0cywgbmV3IE50cFRydXN0ZWRUaW1lKCksCisgICAgICAgICAgICAgICAgZ2V0U3lzdGVtRGlyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0U3lzdGVtRGlyKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUoRW52aXJvbm1lbnQuZ2V0RGF0YURpcmVjdG9yeSgpLCAic3lzdGVtIik7CisgICAgfQorCisgICAgcHVibGljIE5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZShDb250ZXh0IGNvbnRleHQsIElBY3Rpdml0eU1hbmFnZXIgYWN0aXZpdHlNYW5hZ2VyLAorICAgICAgICAgICAgSVBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIsIElOZXR3b3JrU3RhdHNTZXJ2aWNlIG5ldHdvcmtTdGF0cywgVHJ1c3RlZFRpbWUgdGltZSwKKyAgICAgICAgICAgIEZpbGUgc3lzdGVtRGlyKSB7CiAgICAgICAgIG1Db250ZXh0ID0gY2hlY2tOb3ROdWxsKGNvbnRleHQsICJtaXNzaW5nIGNvbnRleHQiKTsKICAgICAgICAgbUFjdGl2aXR5TWFuYWdlciA9IGNoZWNrTm90TnVsbChhY3Rpdml0eU1hbmFnZXIsICJtaXNzaW5nIGFjdGl2aXR5TWFuYWdlciIpOwogICAgICAgICBtUG93ZXJNYW5hZ2VyID0gY2hlY2tOb3ROdWxsKHBvd2VyTWFuYWdlciwgIm1pc3NpbmcgcG93ZXJNYW5hZ2VyIik7CisgICAgICAgIG1OZXR3b3JrU3RhdHMgPSBjaGVja05vdE51bGwobmV0d29ya1N0YXRzLCAibWlzc2luZyBuZXR3b3JrU3RhdHMiKTsKKyAgICAgICAgbVRpbWUgPSBjaGVja05vdE51bGwodGltZSwgIm1pc3NpbmcgVHJ1c3RlZFRpbWUiKTsKKworICAgICAgICBtSGFuZGxlclRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKFRBRyk7CisgICAgICAgIG1IYW5kbGVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIobUhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOworCisgICAgICAgIG1Qb2xpY3lGaWxlID0gbmV3IEF0b21pY0ZpbGUobmV3IEZpbGUoc3lzdGVtRGlyLCAibmV0cG9saWN5LnhtbCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiaW5kQ29ubmVjdGl2aXR5TWFuYWdlcihJQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uTWFuYWdlcikgeworICAgICAgICBtQ29ubk1hbmFnZXIgPSBjaGVja05vdE51bGwoY29ubk1hbmFnZXIsICJtaXNzaW5nIElDb25uZWN0aXZpdHlNYW5hZ2VyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYmluZE5vdGlmaWNhdGlvbk1hbmFnZXIoSU5vdGlmaWNhdGlvbk1hbmFnZXIgbm90aWZNYW5hZ2VyKSB7CisgICAgICAgIG1Ob3RpZk1hbmFnZXIgPSBjaGVja05vdE51bGwobm90aWZNYW5hZ2VyLCAibWlzc2luZyBJTm90aWZpY2F0aW9uTWFuYWdlciIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgewotICAgICAgICAvLyBUT0RPOiByZWFkIGN1cnJlbnQgcG9saWN5K3N0YXRzIGZyb20gZGlzayBhbmQgZ2VuZXJhdGUgTk1TIHJ1bGVzCisgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgeworICAgICAgICAgICAgLy8gcmVhZCBwb2xpY3kgZnJvbSBkaXNrCisgICAgICAgICAgICByZWFkUG9saWN5TG9ja2VkKCk7CisgICAgICAgICAgICB1cGRhdGVOb3RpZmljYXRpb25zTG9ja2VkKCk7CisgICAgICAgIH0KIAogICAgICAgICB1cGRhdGVTY3JlZW5PbigpOwogCkBAIC05Miw5ICsyNDgsMTggQEAKICAgICAgICAgc2NyZWVuRmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NDUkVFTl9PRkYpOwogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TY3JlZW5SZWNlaXZlciwgc2NyZWVuRmlsdGVyKTsKIAotICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgc2h1dGRvd25GaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgIHNodXRkb3duRmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1NIVVRET1dOKTsKLSAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtU2h1dGRvd25SZWNlaXZlciwgc2h1dGRvd25GaWx0ZXIpOworICAgICAgICAvLyB3YXRjaCBmb3IgbmV0d29yayBpbnRlcmZhY2VzIHRvIGJlIGNsYWltZWQKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGNvbm5GaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKENPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Db25uUmVjZWl2ZXIsIGNvbm5GaWx0ZXIsIENPTk5FQ1RJVklUWV9JTlRFUk5BTCwgbUhhbmRsZXIpOworCisgICAgICAgIC8vIGxpc3RlbiBmb3IgdWlkIHJlbW92YWwgdG8gY2xlYW4gcG9saWN5CisgICAgICAgIGZpbmFsIEludGVudEZpbHRlciByZW1vdmVkRmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBQ1RJT05fVUlEX1JFTU9WRUQpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1SZW1vdmVkUmVjZWl2ZXIsIHJlbW92ZWRGaWx0ZXIsIG51bGwsIG1IYW5kbGVyKTsKKworICAgICAgICAvLyBsaXN0ZW4gZm9yIHdhcm5pbmcgcG9sbGluZyBldmVudHM7IGN1cnJlbnRseSBkaXNwYXRjaGVkIGJ5CisgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBzdGF0c0ZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX05FVFdPUktfU1RBVFNfVVBEQVRFRCk7CisgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIoCisgICAgICAgICAgICAgICAgbVN0YXRzUmVjZWl2ZXIsIHN0YXRzRmlsdGVyLCBSRUFEX05FVFdPUktfVVNBR0VfSElTVE9SWSwgbUhhbmRsZXIpOwogCiAgICAgfQogCkBAIC0xMDIsOCArMjY3LDEwIEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChpbnQgcGlkLCBpbnQgdWlkLCBib29sZWFuIGZvcmVncm91bmRBY3Rpdml0aWVzKSB7CiAgICAgICAgICAgICAvLyBvbmx5IHNvbWVvbmUgbGlrZSBBTVMgc2hvdWxkIG9ubHkgYmUgY2FsbGluZyB1cwotICAgICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgICAgICBNQU5BR0VfQVBQX1RPS0VOUywgInJlcXVpcmVzIE1BTkFHRV9BUFBfVE9LRU5TIHBlcm1pc3Npb24iKTsKKyAgICAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNQU5BR0VfQVBQX1RPS0VOUywgVEFHKTsKKworICAgICAgICAgICAgLy8gc2tpcCB3aGVuIFVJRCBjb3VsZG4ndCBoYXZlIGFueSBwb2xpY3kKKyAgICAgICAgICAgIGlmICghaXNVaWRWYWxpZEZvclBvbGljeShtQ29udGV4dCwgdWlkKSkgcmV0dXJuOwogCiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGEgdWlkIGNhbiBoYXZlIG11bHRpcGxlIHBpZHMgcnVubmluZyBpbnNpZGUsIHdlIG5lZWQgdG8KQEAgLTExNiwyMiArMjgzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIG1VaWRQaWRGb3JlZ3JvdW5kLnB1dCh1aWQsIHBpZEZvcmVncm91bmQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwaWRGb3JlZ3JvdW5kLnB1dChwaWQsIGZvcmVncm91bmRBY3Rpdml0aWVzKTsKLSAgICAgICAgICAgICAgICBjb21wdXRlVWlkRm9yZWdyb3VuZEwodWlkKTsKKyAgICAgICAgICAgICAgICBjb21wdXRlVWlkRm9yZWdyb3VuZExvY2tlZCh1aWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvY2Vzc0RpZWQoaW50IHBpZCwgaW50IHVpZCkgewogICAgICAgICAgICAgLy8gb25seSBzb21lb25lIGxpa2UgQU1TIHNob3VsZCBvbmx5IGJlIGNhbGxpbmcgdXMKLSAgICAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgTUFOQUdFX0FQUF9UT0tFTlMsICJyZXF1aXJlcyBNQU5BR0VfQVBQX1RPS0VOUyBwZXJtaXNzaW9uIik7CisgICAgICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTUFOQUdFX0FQUF9UT0tFTlMsIFRBRyk7CisKKyAgICAgICAgICAgIC8vIHNraXAgd2hlbiBVSUQgY291bGRuJ3QgaGF2ZSBhbnkgcG9saWN5CisgICAgICAgICAgICBpZiAoIWlzVWlkVmFsaWRGb3JQb2xpY3kobUNvbnRleHQsIHVpZCkpIHJldHVybjsKIAogICAgICAgICAgICAgc3luY2hyb25pemVkIChtUnVsZXNMb2NrKSB7CiAgICAgICAgICAgICAgICAgLy8gY2xlYXIgcmVjb3JkcyBhbmQgcmVjb21wdXRlLCB3aGVuIHRoZXkgZXhpc3QKICAgICAgICAgICAgICAgICBmaW5hbCBTcGFyc2VCb29sZWFuQXJyYXkgcGlkRm9yZWdyb3VuZCA9IG1VaWRQaWRGb3JlZ3JvdW5kLmdldCh1aWQpOwogICAgICAgICAgICAgICAgIGlmIChwaWRGb3JlZ3JvdW5kICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcGlkRm9yZWdyb3VuZC5kZWxldGUocGlkKTsKLSAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVVpZEZvcmVncm91bmRMKHVpZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVVaWRGb3JlZ3JvdW5kTG9ja2VkKHVpZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDgsMzYgKzMxNyw2MjIgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1TaHV0ZG93blJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVJlbW92ZWRSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHBlcnNpc3QgYW55IHBlbmRpbmcgc3RhdHMgZHVyaW5nIGNsZWFuIHNodXRkb3duCi0gICAgICAgICAgICBMb2cuZChUQUcsICJwZXJzaXN0aW5nIHN0YXRzIik7CisgICAgICAgICAgICAvLyBvbiBiYWNrZ3JvdW5kIGhhbmRsZXIgdGhyZWFkLCBhbmQgVUlEX1JFTU9WRUQgaXMgcHJvdGVjdGVkCisgICAgICAgICAgICAvLyBicm9hZGNhc3QuCisgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1VJRCwgMCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW55IHBvbGljeSBhbmQgdXBkYXRlIHJ1bGVzIHRvIGNsZWFuIHVwCisgICAgICAgICAgICAgICAgbVVpZFBvbGljeS5kZWxldGUodWlkKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVSdWxlc0ZvclVpZExvY2tlZCh1aWQpOworICAgICAgICAgICAgICAgIHdyaXRlUG9saWN5TG9ja2VkKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9OwogCisgICAgLyoqCisgICAgICogUmVjZWl2ZXIgdGhhdCB3YXRjaGVzIGZvciB7QGxpbmsgSU5ldHdvcmtTdGF0c1NlcnZpY2V9IHVwZGF0ZXMsIHdoaWNoIHdlCisgICAgICogdXNlIHRvIGNoZWNrIGFnYWluc3Qge0BsaW5rIE5ldHdvcmtQb2xpY3kjd2FybmluZ0J5dGVzfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1TdGF0c1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gb24gYmFja2dyb3VuZCBoYW5kbGVyIHRocmVhZCwgYW5kIHZlcmlmaWVkCisgICAgICAgICAgICAvLyBSRUFEX05FVFdPUktfVVNBR0VfSElTVE9SWSBwZXJtaXNzaW9uIGFib3ZlLgorCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVOb3RpZmljYXRpb25zTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQ2hlY2sge0BsaW5rIE5ldHdvcmtQb2xpY3l9IGFnYWluc3QgY3VycmVudCB7QGxpbmsgSU5ldHdvcmtTdGF0c1NlcnZpY2V9CisgICAgICogdG8gc2hvdyB2aXNpYmxlIG5vdGlmaWNhdGlvbnMgYXMgbmVlZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVOb3RpZmljYXRpb25zTG9ja2VkKCkgeworICAgICAgICBpZiAoTE9HVikgU2xvZy52KFRBRywgInVwZGF0ZU5vdGlmaWNhdGlvbnNMb2NrZWQoKSIpOworCisgICAgICAgIC8vIHRyeSByZWZyZXNoaW5nIHRpbWUgc291cmNlIHdoZW4gc3RhbGUKKyAgICAgICAgaWYgKG1UaW1lLmdldENhY2hlQWdlKCkgPiBUSU1FX0NBQ0hFX01BWF9BR0UpIHsKKyAgICAgICAgICAgIG1UaW1lLmZvcmNlUmVmcmVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZSA9IG1UaW1lLmhhc0NhY2hlKCkgPyBtVGltZS5jdXJyZW50VGltZU1pbGxpcygpCisgICAgICAgICAgICAgICAgOiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBUT0RPOiB3aGVuIHN3aXRjaGluZyB0byBrZXJuZWwgbm90aWZpY2F0aW9ucywgY29tcHV0ZSBuZXh0IGZ1dHVyZQorICAgICAgICAvLyBjeWNsZSBib3VuZGFyeSB0byByZWNvbXB1dGUgbm90aWZpY2F0aW9ucy4KKworICAgICAgICAvLyBleGFtaW5lIHN0YXRzIGZvciBlYWNoIHBvbGljeSBkZWZpbmVkCisgICAgICAgIGZvciAoTmV0d29ya1BvbGljeSBwb2xpY3kgOiBtTmV0d29ya1BvbGljeSkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IGNvbXB1dGVMYXN0Q3ljbGVCb3VuZGFyeShjdXJyZW50VGltZSwgcG9saWN5KTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kID0gY3VycmVudFRpbWU7CisKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgdG90YWw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG1OZXR3b3JrU3RhdHMuZ2V0U3VtbWFyeUZvck5ldHdvcmsoCisgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kudGVtcGxhdGUsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgICAgIHRvdGFsID0gc3RhdHMucnhbMF0gKyBzdGF0cy50eFswXTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInByb2JsZW0gcmVhZGluZyBzdW1tYXJ5IGZvciB0ZW1wbGF0ZSAiICsgcG9saWN5LnRlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvbGljeS5saW1pdEJ5dGVzICE9IExJTUlUX0RJU0FCTEVEICYmIHRvdGFsID49IHBvbGljeS5saW1pdEJ5dGVzKSB7CisgICAgICAgICAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKHBvbGljeSwgVFlQRV9XQVJOSU5HKTsKKyAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKHBvbGljeSwgVFlQRV9MSU1JVCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwb2xpY3ksIFRZUEVfTElNSVQpOworCisgICAgICAgICAgICAgICAgaWYgKHBvbGljeS53YXJuaW5nQnl0ZXMgIT0gV0FSTklOR19ESVNBQkxFRCAmJiB0b3RhbCA+PSBwb2xpY3kud2FybmluZ0J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24ocG9saWN5LCBUWVBFX1dBUk5JTkcpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihwb2xpY3ksIFRZUEVfV0FSTklORyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgdW5pcXVlIHRhZyB0aGF0IGlkZW50aWZpZXMgYW4gYWN0aXZlIHtAbGluayBOZXR3b3JrUG9saWN5fQorICAgICAqIG5vdGlmaWNhdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUsIGxpa2Uge0BsaW5rICNUWVBFX0xJTUlUfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBidWlsZE5vdGlmaWNhdGlvblRhZyhOZXR3b3JrUG9saWN5IHBvbGljeSwgaW50IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFRBRyArICI6IiArIHBvbGljeS50ZW1wbGF0ZS5oYXNoQ29kZSgpICsgIjoiICsgdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG93IG5vdGlmaWNhdGlvbiBmb3IgY29tYmluZWQge0BsaW5rIE5ldHdvcmtQb2xpY3l9IGFuZCBzcGVjaWZpYyB0eXBlLAorICAgICAqIGxpa2Uge0BsaW5rICNUWVBFX0xJTUlUfS4gT2theSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbnF1ZXVlTm90aWZpY2F0aW9uKE5ldHdvcmtQb2xpY3kgcG9saWN5LCBpbnQgdHlwZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGFnID0gYnVpbGROb3RpZmljYXRpb25UYWcocG9saWN5LCB0eXBlKTsKKyAgICAgICAgZmluYWwgTm90aWZpY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBOb3RpZmljYXRpb24uQnVpbGRlcihtQ29udGV4dCk7CisgICAgICAgIGJ1aWxkZXIuc2V0T25seUFsZXJ0T25jZSh0cnVlKTsKKyAgICAgICAgYnVpbGRlci5zZXRPbmdvaW5nKHRydWUpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRZUEVfV0FSTklORzogeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZSA9IHJlcy5nZXRTdHJpbmcoUi5zdHJpbmcuZGF0YV91c2FnZV93YXJuaW5nX3RpdGxlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYm9keSA9IHJlcy5nZXRTdHJpbmcoUi5zdHJpbmcuZGF0YV91c2FnZV93YXJuaW5nX2JvZHksCisgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZXIuZm9ybWF0RmlsZVNpemUobUNvbnRleHQsIHBvbGljeS53YXJuaW5nQnl0ZXMpKTsKKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0U21hbGxJY29uKFIuZHJhd2FibGUuaWNfbWVudV9pbmZvX2RldGFpbHMpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0VGlja2VyKHRpdGxlKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvbnRlbnRUaXRsZSh0aXRsZSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb250ZW50VGV4dChib2R5KTsKKworICAgICAgICAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEFDVElPTl9EQVRBX1VTQUdFX1dBUk5JTkcpOworICAgICAgICAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05FVFdPUktfVEVNUExBVEUsIHBvbGljeS50ZW1wbGF0ZS5nZXRNYXRjaFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb250ZW50SW50ZW50KFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCwgMCwgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgVFlQRV9MSU1JVDogeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYm9keSA9IHJlcy5nZXRTdHJpbmcoUi5zdHJpbmcuZGF0YV91c2FnZV9saW1pdF9ib2R5KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBvbGljeS50ZW1wbGF0ZS5nZXRNYXRjaFJ1bGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE1BVENIX01PQklMRV8zR19MT1dFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gcmVzLmdldFN0cmluZyhSLnN0cmluZy5kYXRhX3VzYWdlXzNnX2xpbWl0X3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1BVENIX01PQklMRV80RzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gcmVzLmdldFN0cmluZyhSLnN0cmluZy5kYXRhX3VzYWdlXzRnX2xpbWl0X3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSByZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLmRhdGFfdXNhZ2VfbW9iaWxlX2xpbWl0X3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0U21hbGxJY29uKGNvbS5hbmRyb2lkLmludGVybmFsLlIuZHJhd2FibGUuaWNfbWVudV9ibG9jayk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRUaWNrZXIodGl0bGUpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29udGVudFRpdGxlKHRpdGxlKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldENvbnRlbnRUZXh0KGJvZHkpOworCisgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX0RBVEFfVVNBR0VfTElNSVQpOworICAgICAgICAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX05FVFdPUktfVEVNUExBVEUsIHBvbGljeS50ZW1wbGF0ZS5nZXRNYXRjaFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb250ZW50SW50ZW50KFBlbmRpbmdJbnRlbnQuZ2V0QWN0aXZpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCwgMCwgaW50ZW50LCBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gTm90aWZpY2F0aW9uTWFuYWdlciBvbmNlIHdlIGNhbiBtb2NrIGl0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgZmluYWwgaW50W10gaWRSZWNlaXZlZCA9IG5ldyBpbnRbMV07CisgICAgICAgICAgICBtTm90aWZNYW5hZ2VyLmVucXVldWVOb3RpZmljYXRpb25XaXRoVGFnKAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgdGFnLCAweDAsIGJ1aWxkZXIuZ2V0Tm90aWZpY2F0aW9uKCksIGlkUmVjZWl2ZWQpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2xvZy53KFRBRywgInByb2JsZW0gZHVyaW5nIGVucXVldWVOb3RpZmljYXRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCBhbnkgbm90aWZpY2F0aW9uIGZvciBjb21iaW5lZCB7QGxpbmsgTmV0d29ya1BvbGljeX0gYW5kIHNwZWNpZmljCisgICAgICogdHlwZSwgbGlrZSB7QGxpbmsgI1RZUEVfTElNSVR9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxOb3RpZmljYXRpb24oTmV0d29ya1BvbGljeSBwb2xpY3ksIGludCB0eXBlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YWcgPSBidWlsZE5vdGlmaWNhdGlvblRhZyhwb2xpY3ksIHR5cGUpOworCisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gTm90aWZpY2F0aW9uTWFuYWdlciBvbmNlIHdlIGNhbiBtb2NrIGl0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpOworICAgICAgICAgICAgbU5vdGlmTWFuYWdlci5jYW5jZWxOb3RpZmljYXRpb25XaXRoVGFnKHBhY2thZ2VOYW1lLCB0YWcsIDB4MCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicHJvYmxlbSBkdXJpbmcgZW5xdWV1ZU5vdGlmaWNhdGlvbjogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZXIgdGhhdCB3YXRjaGVzIGZvciB7QGxpbmsgSUNvbm5lY3Rpdml0eU1hbmFnZXJ9IHRvIGNsYWltIG5ldHdvcmsKKyAgICAgKiBpbnRlcmZhY2VzLiBVc2VkIHRvIGFwcGx5IHtAbGluayBOZXR3b3JrUG9saWN5fSB0byBtYXRjaGluZyBuZXR3b3Jrcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1Db25uUmVjZWl2ZXIgPSBuZXcgQnJvYWRjYXN0UmVjZWl2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICAvLyBvbiBiYWNrZ3JvdW5kIGhhbmRsZXIgdGhyZWFkLCBhbmQgdmVyaWZpZWQgQ09OTkVDVElWSVRZX0lOVEVSTkFMCisgICAgICAgICAgICAvLyBwZXJtaXNzaW9uIGFib3ZlLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtUnVsZXNMb2NrKSB7CisgICAgICAgICAgICAgICAgZW5zdXJlQWN0aXZlTW9iaWxlUG9saWN5TG9ja2VkKCk7CisgICAgICAgICAgICAgICAgdXBkYXRlSWZhY2VzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogRXhhbWluZSBhbGwgY29ubmVjdGVkIHtAbGluayBOZXR3b3JrU3RhdGV9LCBsb29raW5nIGZvcgorICAgICAqIHtAbGluayBOZXR3b3JrUG9saWN5fSB0aGF0IG5lZWQgdG8gYmUgZW5mb3JjZWQuIFdoZW4gbWF0Y2hlcyBmb3VuZCwgc2V0CisgICAgICogcmVtYWluaW5nIHF1b3RhIGJhc2VkIG9uIHVzYWdlIGN5Y2xlIGFuZCBoaXN0b3JpY2FsIHN0YXRzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJZmFjZXNMb2NrZWQoKSB7CisgICAgICAgIGlmIChMT0dWKSBTbG9nLnYoVEFHLCAidXBkYXRlSWZhY2VzTG9ja2VkKCkiKTsKKworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdGVbXSBzdGF0ZXM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF0ZXMgPSBtQ29ubk1hbmFnZXIuZ2V0QWxsTmV0d29ya1N0YXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicHJvYmxlbSByZWFkaW5nIG5ldHdvcmsgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpcnN0LCBkZXJpdmUgaWRlbnRpdHkgZm9yIGFsbCBjb25uZWN0ZWQgbmV0d29ya3MsIHdoaWNoIGNhbiBiZSB1c2VkCisgICAgICAgIC8vIHRvIG1hdGNoIGFnYWluc3QgdGVtcGxhdGVzLgorICAgICAgICBmaW5hbCBIYXNoTWFwPE5ldHdvcmtJZGVudGl0eSwgU3RyaW5nPiBuZXR3b3JrcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgICAgICBmb3IgKE5ldHdvcmtTdGF0ZSBzdGF0ZSA6IHN0YXRlcykgeworICAgICAgICAgICAgLy8gc3Rhc2ggaWRlbnRpdHkgYW5kIGlmYWNlIGF3YXkgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgaWYgKHN0YXRlLm5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWZhY2UgPSBzdGF0ZS5saW5rUHJvcGVydGllcy5nZXRJbnRlcmZhY2VOYW1lKCk7CisgICAgICAgICAgICAgICAgZmluYWwgTmV0d29ya0lkZW50aXR5IGlkZW50ID0gTmV0d29ya0lkZW50aXR5LmJ1aWxkTmV0d29ya0lkZW50aXR5KG1Db250ZXh0LCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgbmV0d29ya3MucHV0KGlkZW50LCBpZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBidWlsZCBsaXN0IG9mIHJ1bGVzIGFuZCBpZmFjZXMgdG8gZW5mb3JjZSB0aGVtIGFnYWluc3QKKyAgICAgICAgZmluYWwgSGFzaE1hcDxOZXR3b3JrUG9saWN5LCBTdHJpbmdbXT4gcnVsZXMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gaWZhY2VMaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoTmV0d29ya1BvbGljeSBwb2xpY3kgOiBtTmV0d29ya1BvbGljeSkgeworCisgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCBhY3RpdmUgaWZhY2VzIHRoYXQgbWF0Y2ggdGhpcyB0ZW1wbGF0ZQorICAgICAgICAgICAgaWZhY2VMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKE5ldHdvcmtJZGVudGl0eSBpZGVudCA6IG5ldHdvcmtzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvbGljeS50ZW1wbGF0ZS5tYXRjaGVzKGlkZW50KSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWZhY2UgPSBuZXR3b3Jrcy5nZXQoaWRlbnQpOworICAgICAgICAgICAgICAgICAgICBpZmFjZUxpc3QuYWRkKGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpZmFjZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGlmYWNlcyA9IGlmYWNlTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbaWZhY2VMaXN0LnNpemUoKV0pOworICAgICAgICAgICAgICAgIHJ1bGVzLnB1dChwb2xpY3ksIGlmYWNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0cnkgcmVmcmVzaGluZyB0aW1lIHNvdXJjZSB3aGVuIHN0YWxlCisgICAgICAgIGlmIChtVGltZS5nZXRDYWNoZUFnZSgpID4gVElNRV9DQUNIRV9NQVhfQUdFKSB7CisgICAgICAgICAgICBtVGltZS5mb3JjZVJlZnJlc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBtVGltZS5oYXNDYWNoZSgpID8gbVRpbWUuY3VycmVudFRpbWVNaWxsaXMoKQorICAgICAgICAgICAgICAgIDogU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgbU1ldGVyZWRJZmFjZXMuY2xlYXIoKTsKKworICAgICAgICAvLyBhcHBseSBlYWNoIHBvbGljeSB0aGF0IHdlIGZvdW5kIGlmYWNlcyBmb3I7IGNvbXB1dGUgcmVtYWluaW5nIGRhdGEKKyAgICAgICAgLy8gYmFzZWQgb24gY3VycmVudCBjeWNsZSBhbmQgaGlzdG9yaWNhbCBzdGF0cywgYW5kIHB1c2ggdG8ga2VybmVsLgorICAgICAgICBmb3IgKE5ldHdvcmtQb2xpY3kgcG9saWN5IDogcnVsZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGlmYWNlcyA9IHJ1bGVzLmdldChwb2xpY3kpOworCisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0ID0gY29tcHV0ZUxhc3RDeWNsZUJvdW5kYXJ5KGN1cnJlbnRUaW1lLCBwb2xpY3kpOworICAgICAgICAgICAgZmluYWwgbG9uZyBlbmQgPSBjdXJyZW50VGltZTsKKworICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHN0YXRzOworICAgICAgICAgICAgZmluYWwgbG9uZyB0b3RhbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBtTmV0d29ya1N0YXRzLmdldFN1bW1hcnlGb3JOZXR3b3JrKHBvbGljeS50ZW1wbGF0ZSwgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICAgICAgdG90YWwgPSBzdGF0cy5yeFswXSArIHN0YXRzLnR4WzBdOworICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoVEFHLCAicHJvYmxlbSByZWFkaW5nIHN1bW1hcnkgZm9yIHRlbXBsYXRlICIgKyBwb2xpY3kudGVtcGxhdGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTE9HRCkgeworICAgICAgICAgICAgICAgIFNsb2cuZChUQUcsICJhcHBseWluZyBwb2xpY3kgIiArIHBvbGljeS50b1N0cmluZygpICsgIiB0byBpZmFjZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBBcnJheXMudG9TdHJpbmcoaWZhY2VzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHJlZ2lzdGVyIGZvciB3YXJuaW5nIG5vdGlmaWNhdGlvbiB0cmlnZ2VyIHRocm91Z2ggTk1TCisKKyAgICAgICAgICAgIGlmIChwb2xpY3kubGltaXRCeXRlcyAhPSBOZXR3b3JrUG9saWN5LkxJTUlUX0RJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtYWluaW5nICJxdW90YSIgaXMgYmFzZWQgb24gdXNhZ2UgaW4gY3VycmVudCBjeWNsZQorICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcXVvdGEgPSBNYXRoLm1heCgwLCBwb2xpY3kubGltaXRCeXRlcyAtIHRvdGFsKTsKKyAgICAgICAgICAgICAgICAvL2tlcm5lbFNldElmYWNlc1F1b3RhKGlmYWNlcywgcXVvdGEpOworCisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaWZhY2UgOiBpZmFjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGVyZWRJZmFjZXMuYWRkKGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkaXNwYXRjaCBjaGFuZ2VkIHJ1bGUgdG8gZXhpc3RpbmcgbGlzdGVuZXJzCisgICAgICAgIC8vIFRPRE86IGRpc3BhdGNoIG91dHNpZGUgb2YgaG9sZGluZyBsb2NrCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1ldGVyZWRJZmFjZXMgPSBtTWV0ZXJlZElmYWNlcy50b0FycmF5KG5ldyBTdHJpbmdbbU1ldGVyZWRJZmFjZXMuc2l6ZSgpXSk7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBtTGlzdGVuZXJzLmJlZ2luQnJvYWRjYXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbGlzdGVuZXIgPSBtTGlzdGVuZXJzLmdldEJyb2FkY2FzdEl0ZW0oaSk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uTWV0ZXJlZElmYWNlc0NoYW5nZWQobWV0ZXJlZElmYWNlcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVycy5maW5pc2hCcm9hZGNhc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmNlIGFueSB7QGxpbmsgI21OZXR3b3JrUG9saWN5fSBhcmUgbG9hZGVkIGZyb20gZGlzaywgZW5zdXJlIHRoYXQgd2UKKyAgICAgKiBoYXZlIGF0IGxlYXN0IGEgZGVmYXVsdCBtb2JpbGUgcG9saWN5IGRlZmluZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUFjdGl2ZU1vYmlsZVBvbGljeUxvY2tlZCgpIHsKKyAgICAgICAgaWYgKExPR1YpIFNsb2cudihUQUcsICJlbnN1cmVBY3RpdmVNb2JpbGVQb2xpY3lMb2NrZWQoKSIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3Vic2NyaWJlcklkID0gZ2V0QWN0aXZlU3Vic2NyaWJlcklkKCk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtJZGVudGl0eSBwcm9iZUlkZW50ID0gbmV3IE5ldHdvcmtJZGVudGl0eSgKKyAgICAgICAgICAgICAgICBUWVBFX01PQklMRSwgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU5LTk9XTiwgc3Vic2NyaWJlcklkLCBmYWxzZSk7CisKKyAgICAgICAgLy8gZXhhbWluZSB0byBzZWUgaWYgYW55IHBvbGljeSBpcyBkZWZpbmVkIGZvciBhY3RpdmUgbW9iaWxlCisgICAgICAgIGJvb2xlYW4gbW9iaWxlRGVmaW5lZCA9IGZhbHNlOworICAgICAgICBmb3IgKE5ldHdvcmtQb2xpY3kgcG9saWN5IDogbU5ldHdvcmtQb2xpY3kpIHsKKyAgICAgICAgICAgIGlmIChwb2xpY3kudGVtcGxhdGUubWF0Y2hlcyhwcm9iZUlkZW50KSkgeworICAgICAgICAgICAgICAgIG1vYmlsZURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtb2JpbGVEZWZpbmVkKSB7CisgICAgICAgICAgICBTbG9nLmkoVEFHLCAibm8gcG9saWN5IGZvciBhY3RpdmUgbW9iaWxlIG5ldHdvcms7IGdlbmVyYXRpbmcgZGVmYXVsdCBwb2xpY3kiKTsKKworICAgICAgICAgICAgLy8gZGVmYXVsdCBtb2JpbGUgcG9saWN5IGhhcyBjb21iaW5lZCA0R0Igd2FybmluZywgYW5kIGFzc3VtZSB1c2FnZQorICAgICAgICAgICAgLy8gY3ljbGUgc3RhcnRzIHRvZGF5IHRvZGF5LgorCisgICAgICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgcG9saWN5IGRlZmluaXRpb24gdG8gb3ZlcmxheSBvciBzZWN1cmUgc2V0dGluZworICAgICAgICAgICAgZmluYWwgVGltZSB0aW1lID0gbmV3IFRpbWUoVGltZS5USU1FWk9ORV9VVEMpOworICAgICAgICAgICAgdGltZS5zZXRUb05vdygpOworICAgICAgICAgICAgZmluYWwgaW50IGN5Y2xlRGF5ID0gdGltZS5tb250aERheTsKKworICAgICAgICAgICAgZmluYWwgTmV0d29ya1RlbXBsYXRlIHRlbXBsYXRlID0gbmV3IE5ldHdvcmtUZW1wbGF0ZShNQVRDSF9NT0JJTEVfQUxMLCBzdWJzY3JpYmVySWQpOworICAgICAgICAgICAgbU5ldHdvcmtQb2xpY3kuYWRkKAorICAgICAgICAgICAgICAgICAgICBuZXcgTmV0d29ya1BvbGljeSh0ZW1wbGF0ZSwgY3ljbGVEYXksIDQgKiBHQl9JTl9CWVRFUywgTElNSVRfRElTQUJMRUQpKTsKKyAgICAgICAgICAgIHdyaXRlUG9saWN5TG9ja2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZFBvbGljeUxvY2tlZCgpIHsKKyAgICAgICAgaWYgKExPR1YpIFNsb2cudihUQUcsICJyZWFkUG9saWN5TG9ja2VkKCkiKTsKKworICAgICAgICAvLyBjbGVhciBhbnkgZXhpc3RpbmcgcG9saWN5IGFuZCByZWFkIGZyb20gZGlzaworICAgICAgICBtTmV0d29ya1BvbGljeS5jbGVhcigpOworICAgICAgICBtVWlkUG9saWN5LmNsZWFyKCk7CisKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaXMgPSBtUG9saWN5RmlsZS5vcGVuUmVhZCgpOworICAgICAgICAgICAgZmluYWwgWG1sUHVsbFBhcnNlciBpbiA9IFhtbC5uZXdQdWxsUGFyc2VyKCk7CisgICAgICAgICAgICBpbi5zZXRJbnB1dChmaXMsIG51bGwpOworCisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl9DVVJSRU5UOworICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gaW4ubmV4dCgpKSAhPSBFTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFnID0gaW4uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNUQVJUX1RBRykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVEFHX1BPTElDWV9MSVNULmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcmVhZEludEF0dHJpYnV0ZShpbiwgQVRUUl9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19ORVRXT1JLX1BPTElDWS5lcXVhbHModGFnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ldHdvcmtUZW1wbGF0ZSA9IHJlYWRJbnRBdHRyaWJ1dGUoaW4sIEFUVFJfTkVUV09SS19URU1QTEFURSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3Vic2NyaWJlcklkID0gaW4uZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgQVRUUl9TVUJTQ1JJQkVSX0lEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjeWNsZURheSA9IHJlYWRJbnRBdHRyaWJ1dGUoaW4sIEFUVFJfQ1lDTEVfREFZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgd2FybmluZ0J5dGVzID0gcmVhZExvbmdBdHRyaWJ1dGUoaW4sIEFUVFJfV0FSTklOR19CWVRFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxpbWl0Qnl0ZXMgPSByZWFkTG9uZ0F0dHJpYnV0ZShpbiwgQVRUUl9MSU1JVF9CWVRFUyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBOZXR3b3JrVGVtcGxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtUZW1wbGF0ZSwgc3Vic2NyaWJlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXR3b3JrUG9saWN5LmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5ldHdvcmtQb2xpY3kodGVtcGxhdGUsIGN5Y2xlRGF5LCB3YXJuaW5nQnl0ZXMsIGxpbWl0Qnl0ZXMpKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRBR19VSURfUE9MSUNZLmVxdWFscyh0YWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gcmVhZEludEF0dHJpYnV0ZShpbiwgQVRUUl9VSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHBvbGljeSA9IHJlYWRJbnRBdHRyaWJ1dGUoaW4sIEFUVFJfUE9MSUNZKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVWlkVmFsaWRGb3JQb2xpY3kobUNvbnRleHQsIHVpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVaWRQb2xpY3lVbmNoZWNrZWQodWlkLCBwb2xpY3ksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgInVuYWJsZSB0byBhcHBseSBwb2xpY3kgdG8gVUlEICIgKyB1aWQgKyAiOyBpZ25vcmluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBtaXNzaW5nIHBvbGljeSBpcyBva2F5LCBwcm9iYWJseSBmaXJzdCBib290CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJwcm9ibGVtIHJlYWRpbmcgbmV0d29yayBzdGF0cyIsIGUpOworICAgICAgICB9IGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJwcm9ibGVtIHJlYWRpbmcgbmV0d29yayBzdGF0cyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgSW9VdGlscy5jbG9zZVF1aWV0bHkoZmlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZVBvbGljeUxvY2tlZCgpIHsKKyAgICAgICAgaWYgKExPR1YpIFNsb2cudihUQUcsICJ3cml0ZVBvbGljeUxvY2tlZCgpIik7CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9zID0gbVBvbGljeUZpbGUuc3RhcnRXcml0ZSgpOworCisgICAgICAgICAgICBYbWxTZXJpYWxpemVyIG91dCA9IG5ldyBGYXN0WG1sU2VyaWFsaXplcigpOworICAgICAgICAgICAgb3V0LnNldE91dHB1dChmb3MsICJ1dGYtOCIpOworICAgICAgICAgICAgb3V0LnN0YXJ0RG9jdW1lbnQobnVsbCwgdHJ1ZSk7CisKKyAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCBUQUdfUE9MSUNZX0xJU1QpOworICAgICAgICAgICAgd3JpdGVJbnRBdHRyaWJ1dGUob3V0LCBBVFRSX1ZFUlNJT04sIFZFUlNJT05fQ1VSUkVOVCk7CisKKyAgICAgICAgICAgIC8vIHdyaXRlIGFsbCBrbm93biBuZXR3b3JrIHBvbGljaWVzCisgICAgICAgICAgICBmb3IgKE5ldHdvcmtQb2xpY3kgcG9saWN5IDogbU5ldHdvcmtQb2xpY3kpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrVGVtcGxhdGUgdGVtcGxhdGUgPSBwb2xpY3kudGVtcGxhdGU7CisKKyAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgVEFHX05FVFdPUktfUE9MSUNZKTsKKyAgICAgICAgICAgICAgICB3cml0ZUludEF0dHJpYnV0ZShvdXQsIEFUVFJfTkVUV09SS19URU1QTEFURSwgdGVtcGxhdGUuZ2V0TWF0Y2hSdWxlKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdWJzY3JpYmVySWQgPSB0ZW1wbGF0ZS5nZXRTdWJzY3JpYmVySWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaWJlcklkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCBBVFRSX1NVQlNDUklCRVJfSUQsIHN1YnNjcmliZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlSW50QXR0cmlidXRlKG91dCwgQVRUUl9DWUNMRV9EQVksIHBvbGljeS5jeWNsZURheSk7CisgICAgICAgICAgICAgICAgd3JpdGVMb25nQXR0cmlidXRlKG91dCwgQVRUUl9XQVJOSU5HX0JZVEVTLCBwb2xpY3kud2FybmluZ0J5dGVzKTsKKyAgICAgICAgICAgICAgICB3cml0ZUxvbmdBdHRyaWJ1dGUob3V0LCBBVFRSX0xJTUlUX0JZVEVTLCBwb2xpY3kubGltaXRCeXRlcyk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCBUQUdfTkVUV09SS19QT0xJQ1kpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3cml0ZSBhbGwga25vd24gdWlkIHBvbGljaWVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1VaWRQb2xpY3kuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gbVVpZFBvbGljeS5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9saWN5ID0gbVVpZFBvbGljeS52YWx1ZUF0KGkpOworCisgICAgICAgICAgICAgICAgLy8gc2tpcCB3cml0aW5nIGVtcHR5IHBvbGljaWVzCisgICAgICAgICAgICAgICAgaWYgKHBvbGljeSA9PSBQT0xJQ1lfTk9ORSkgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgVEFHX1VJRF9QT0xJQ1kpOworICAgICAgICAgICAgICAgIHdyaXRlSW50QXR0cmlidXRlKG91dCwgQVRUUl9VSUQsIHVpZCk7CisgICAgICAgICAgICAgICAgd3JpdGVJbnRBdHRyaWJ1dGUob3V0LCBBVFRSX1BPTElDWSwgcG9saWN5KTsKKyAgICAgICAgICAgICAgICBvdXQuZW5kVGFnKG51bGwsIFRBR19VSURfUE9MSUNZKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCBUQUdfUE9MSUNZX0xJU1QpOworICAgICAgICAgICAgb3V0LmVuZERvY3VtZW50KCk7CisKKyAgICAgICAgICAgIG1Qb2xpY3lGaWxlLmZpbmlzaFdyaXRlKGZvcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Qb2xpY3lGaWxlLmZhaWxXcml0ZShmb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VWlkUG9saWN5KGludCB1aWQsIGludCBwb2xpY3kpIHsKLSAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKAotICAgICAgICAgICAgICAgIFVQREFURV9ERVZJQ0VfU1RBVFMsICJyZXF1aXJlcyBVUERBVEVfREVWSUNFX1NUQVRTIHBlcm1pc3Npb24iKTsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1BTkFHRV9ORVRXT1JLX1BPTElDWSwgVEFHKTsKIAorICAgICAgICBpZiAoIWlzVWlkVmFsaWRGb3JQb2xpY3kobUNvbnRleHQsIHVpZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbm5vdCBhcHBseSBwb2xpY3kgdG8gVUlEICIgKyB1aWQpOworICAgICAgICB9CisKKyAgICAgICAgc2V0VWlkUG9saWN5VW5jaGVja2VkKHVpZCwgcG9saWN5LCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VWlkUG9saWN5VW5jaGVja2VkKGludCB1aWQsIGludCBwb2xpY3ksIGJvb2xlYW4gcGVyc2lzdCkgeworICAgICAgICBmaW5hbCBpbnQgb2xkUG9saWN5OwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIG9sZFBvbGljeSA9IGdldFVpZFBvbGljeSh1aWQpOwogICAgICAgICAgICAgbVVpZFBvbGljeS5wdXQodWlkLCBwb2xpY3kpOworCisgICAgICAgICAgICAvLyB1aWQgcG9saWN5IGNoYW5nZWQsIHJlY29tcHV0ZSBydWxlcyBhbmQgcGVyc2lzdCBwb2xpY3kuCisgICAgICAgICAgICB1cGRhdGVSdWxlc0ZvclVpZExvY2tlZCh1aWQpOworICAgICAgICAgICAgaWYgKHBlcnNpc3QpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVBvbGljeUxvY2tlZCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRVaWRQb2xpY3koaW50IHVpZCkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTUFOQUdFX05FVFdPUktfUE9MSUNZLCBUQUcpOworCiAgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgewogICAgICAgICAgICAgcmV0dXJuIG1VaWRQb2xpY3kuZ2V0KHVpZCwgUE9MSUNZX05PTkUpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lcihJTmV0d29ya1BvbGljeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBwZXJtaXNzaW9uIGZvciBvYnNlcnZpbmcgbmV0d29yayBwb2xpY3kKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKENPTk5FQ1RJVklUWV9JTlRFUk5BTCwgVEFHKTsKKworICAgICAgICBtTGlzdGVuZXJzLnJlZ2lzdGVyKGxpc3RlbmVyKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIC8vIGRpc3BhdGNoIGFueSBleGlzdGluZyBydWxlcyB0byBuZXcgbGlzdGVuZXJzCisgICAgICAgICAgICAvLyBUT0RPOiBkaXNwYXRjaCBvdXRzaWRlIG9mIGhvbGRpbmcgbG9jaworICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBtVWlkUnVsZXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gbVVpZFJ1bGVzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCB1aWRSdWxlcyA9IG1VaWRSdWxlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmICh1aWRSdWxlcyAhPSBSVUxFX0FMTE9XX0FMTCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25VaWRSdWxlc0NoYW5nZWQodWlkLCB1aWRSdWxlcyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRpc3BhdGNoIGFueSBtZXRlcmVkIGlmYWNlcyB0byBuZXcgbGlzdGVuZXJzCisgICAgICAgICAgICAvLyBUT0RPOiBkaXNwYXRjaCBvdXRzaWRlIG9mIGhvbGRpbmcgbG9jaworICAgICAgICAgICAgaWYgKG1NZXRlcmVkSWZhY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBtZXRlcmVkSWZhY2VzID0gbU1ldGVyZWRJZmFjZXMudG9BcnJheSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbbU1ldGVyZWRJZmFjZXMuc2l6ZSgpXSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25NZXRlcmVkSWZhY2VzQ2hhbmdlZChtZXRlcmVkSWZhY2VzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJMaXN0ZW5lcihJTmV0d29ya1BvbGljeUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBwZXJtaXNzaW9uIGZvciBvYnNlcnZpbmcgbmV0d29yayBwb2xpY3kKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKENPTk5FQ1RJVklUWV9JTlRFUk5BTCwgVEFHKTsKKworICAgICAgICBtTGlzdGVuZXJzLnVucmVnaXN0ZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE5ldHdvcmtQb2xpY2llcyhOZXR3b3JrUG9saWN5W10gcG9saWNpZXMpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1BTkFHRV9ORVRXT1JLX1BPTElDWSwgVEFHKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1SdWxlc0xvY2spIHsKKyAgICAgICAgICAgIG1OZXR3b3JrUG9saWN5LmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKE5ldHdvcmtQb2xpY3kgcG9saWN5IDogcG9saWNpZXMpIHsKKyAgICAgICAgICAgICAgICBtTmV0d29ya1BvbGljeS5hZGQocG9saWN5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXBkYXRlSWZhY2VzTG9ja2VkKCk7CisgICAgICAgICAgICB1cGRhdGVOb3RpZmljYXRpb25zTG9ja2VkKCk7CisgICAgICAgICAgICB3cml0ZVBvbGljeUxvY2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5ldHdvcmtQb2xpY3lbXSBnZXROZXR3b3JrUG9saWNpZXMoKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNQU5BR0VfTkVUV09SS19QT0xJQ1ksIFRBRyk7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihSRUFEX1BIT05FX1NUQVRFLCBUQUcpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG1OZXR3b3JrUG9saWN5LnRvQXJyYXkobmV3IE5ldHdvcmtQb2xpY3lbbU5ldHdvcmtQb2xpY3kuc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBmb3V0LCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihEVU1QLCBUQUcpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobVJ1bGVzTG9jaykgeworICAgICAgICAgICAgZm91dC5wcmludGxuKCJOZXR3b3JrIHBvbGljaWVzOiIpOworICAgICAgICAgICAgZm9yIChOZXR3b3JrUG9saWN5IHBvbGljeSA6IG1OZXR3b3JrUG9saWN5KSB7CisgICAgICAgICAgICAgICAgZm91dC5wcmludCgiICAiKTsgZm91dC5wcmludGxuKHBvbGljeS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm91dC5wcmludGxuKCJQb2xpY3kgc3RhdHVzIGZvciBrbm93biBVSURzOiIpOworCisgICAgICAgICAgICBmaW5hbCBTcGFyc2VCb29sZWFuQXJyYXkga25vd25VaWRzID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgpOworICAgICAgICAgICAgY29sbGVjdEtleXMobVVpZFBvbGljeSwga25vd25VaWRzKTsKKyAgICAgICAgICAgIGNvbGxlY3RLZXlzKG1VaWRGb3JlZ3JvdW5kLCBrbm93blVpZHMpOworICAgICAgICAgICAgY29sbGVjdEtleXMobVVpZFJ1bGVzLCBrbm93blVpZHMpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGtub3duVWlkcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBrbm93blVpZHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgZm91dC5wcmludCgiICBVSUQ9Iik7CisgICAgICAgICAgICAgICAgZm91dC5wcmludCh1aWQpOworCisgICAgICAgICAgICAgICAgZm91dC5wcmludCgiIHBvbGljeT0iKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9saWN5SW5kZXggPSBtVWlkUG9saWN5LmluZGV4T2ZLZXkodWlkKTsKKyAgICAgICAgICAgICAgICBpZiAocG9saWN5SW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdXQucHJpbnQoIlVOS05PV04iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdW1wUG9saWN5KGZvdXQsIG1VaWRQb2xpY3kudmFsdWVBdChwb2xpY3lJbmRleCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvdXQucHJpbnQoIiBmb3JlZ3JvdW5kPSIpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBmb3JlZ3JvdW5kSW5kZXggPSBtVWlkUGlkRm9yZWdyb3VuZC5pbmRleE9mS2V5KHVpZCk7CisgICAgICAgICAgICAgICAgaWYgKGZvcmVncm91bmRJbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm91dC5wcmludCgiVU5LTk9XTiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGR1bXBTcGFyc2VCb29sZWFuQXJyYXkoZm91dCwgbVVpZFBpZEZvcmVncm91bmQudmFsdWVBdChmb3JlZ3JvdW5kSW5kZXgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3V0LnByaW50KCIgcnVsZXM9Iik7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJ1bGVzSW5kZXggPSBtVWlkUnVsZXMuaW5kZXhPZktleSh1aWQpOworICAgICAgICAgICAgICAgIGlmIChydWxlc0luZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmb3V0LnByaW50KCJVTktOT1dOIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtcFJ1bGVzKGZvdXQsIG1VaWRSdWxlcy52YWx1ZUF0KHJ1bGVzSW5kZXgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVWlkRm9yZWdyb3VuZChpbnQgdWlkKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNQU5BR0VfTkVUV09SS19QT0xJQ1ksIFRBRyk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtUnVsZXNMb2NrKSB7CisgICAgICAgICAgICAvLyBvbmx5IHJlYWxseSBpbiBmb3JlZ3JvdW5kIHdoZW4gc2NyZWVuIGlzIGFsc28gb24KKyAgICAgICAgICAgIHJldHVybiBtVWlkRm9yZWdyb3VuZC5nZXQodWlkLCBmYWxzZSkgJiYgbVNjcmVlbk9uOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogRm9yZWdyb3VuZCBmb3IgUElEIGNoYW5nZWQ7IHJlY29tcHV0ZSBmb3JlZ3JvdW5kIGF0IFVJRCBsZXZlbC4gSWYKLSAgICAgKiBjaGFuZ2VkLCB3aWxsIHRyaWdnZXIge0BsaW5rICN1cGRhdGVSdWxlc0ZvclVpZEwoaW50KX0uCisgICAgICogY2hhbmdlZCwgd2lsbCB0cmlnZ2VyIHtAbGluayAjdXBkYXRlUnVsZXNGb3JVaWRMb2NrZWQoaW50KX0uCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVVaWRGb3JlZ3JvdW5kTChpbnQgdWlkKSB7CisgICAgcHJpdmF0ZSB2b2lkIGNvbXB1dGVVaWRGb3JlZ3JvdW5kTG9ja2VkKGludCB1aWQpIHsKICAgICAgICAgZmluYWwgU3BhcnNlQm9vbGVhbkFycmF5IHBpZEZvcmVncm91bmQgPSBtVWlkUGlkRm9yZWdyb3VuZC5nZXQodWlkKTsKIAogICAgICAgICAvLyBjdXJyZW50IHBpZCBpcyBkcm9wcGluZyBmb3JlZ3JvdW5kOyBleGFtaW5lIG90aGVyIHBpZHMKQEAgLTE5NCw3ICs5NDksNyBAQAogICAgICAgICBpZiAob2xkVWlkRm9yZWdyb3VuZCAhPSB1aWRGb3JlZ3JvdW5kKSB7CiAgICAgICAgICAgICAvLyBmb3JlZ3JvdW5kIGNoYW5nZWQsIHB1c2ggdXBkYXRlZCBydWxlcwogICAgICAgICAgICAgbVVpZEZvcmVncm91bmQucHV0KHVpZCwgdWlkRm9yZWdyb3VuZCk7Ci0gICAgICAgICAgICB1cGRhdGVSdWxlc0ZvclVpZEwodWlkKTsKKyAgICAgICAgICAgIHVwZGF0ZVJ1bGVzRm9yVWlkTG9ja2VkKHVpZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwNCw0NyArOTU5LDExNiBAQAogICAgICAgICAgICAgICAgIG1TY3JlZW5PbiA9IG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpOwogICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZVJ1bGVzRm9yU2NyZWVuTCgpOworICAgICAgICAgICAgdXBkYXRlUnVsZXNGb3JTY3JlZW5Mb2NrZWQoKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIFVwZGF0ZSBydWxlcyB0aGF0IG1pZ2h0IGJlIGNoYW5nZWQgYnkge0BsaW5rICNtU2NyZWVuT259IHZhbHVlLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdWxlc0ZvclNjcmVlbkwoKSB7CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bGVzRm9yU2NyZWVuTG9ja2VkKCkgewogICAgICAgICAvLyBvbmx5IHVwZGF0ZSBydWxlcyBmb3IgYW55b25lIHdpdGggZm9yZWdyb3VuZCBhY3Rpdml0aWVzCiAgICAgICAgIGZpbmFsIGludCBzaXplID0gbVVpZEZvcmVncm91bmQuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgaWYgKG1VaWRGb3JlZ3JvdW5kLnZhbHVlQXQoaSkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gbVVpZEZvcmVncm91bmQua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUnVsZXNGb3JVaWRMKHVpZCk7CisgICAgICAgICAgICAgICAgdXBkYXRlUnVsZXNGb3JVaWRMb2NrZWQodWlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVSdWxlc0ZvclVpZEwoaW50IHVpZCkgewotICAgICAgICAvLyBvbmx5IHJlYWxseSBpbiBmb3JlZ3JvdW5kIHdoZW4gc2NyZWVuIG9uCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gdWlkRm9yZWdyb3VuZCA9IG1VaWRGb3JlZ3JvdW5kLmdldCh1aWQsIGZhbHNlKSAmJiBtU2NyZWVuT247CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVJ1bGVzRm9yVWlkTG9ja2VkKGludCB1aWQpIHsKKyAgICAgICAgaWYgKCFpc1VpZFZhbGlkRm9yUG9saWN5KG1Db250ZXh0LCB1aWQpKSByZXR1cm47CisKICAgICAgICAgZmluYWwgaW50IHVpZFBvbGljeSA9IGdldFVpZFBvbGljeSh1aWQpOworICAgICAgICBmaW5hbCBib29sZWFuIHVpZEZvcmVncm91bmQgPSBpc1VpZEZvcmVncm91bmQodWlkKTsKIAotICAgICAgICBpZiAoTE9HRCkgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidXBkYXRlUnVsZXNGb3JVaWQodWlkPSIgKyB1aWQgKyAiKSBmb3VuZCBmb3JlZ3JvdW5kPSIgKyB1aWRGb3JlZ3JvdW5kCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbmQgcG9saWN5PSIgKyB1aWRQb2xpY3kpOworICAgICAgICAvLyBkZXJpdmUgYWN0aXZlIHJ1bGVzIGJhc2VkIG9uIHBvbGljeSBhbmQgYWN0aXZlIHN0YXRlCisgICAgICAgIGludCB1aWRSdWxlcyA9IFJVTEVfQUxMT1dfQUxMOworICAgICAgICBpZiAoIXVpZEZvcmVncm91bmQgJiYgKHVpZFBvbGljeSAmIFBPTElDWV9SRUpFQ1RfTUVURVJFRF9CQUNLR1JPVU5EKSAhPSAwKSB7CisgICAgICAgICAgICAvLyB1aWQgaW4gYmFja2dyb3VuZCwgYW5kIHBvbGljeSBzYXlzIHRvIGJsb2NrIG1ldGVyZWQgZGF0YQorICAgICAgICAgICAgdWlkUnVsZXMgPSBSVUxFX1JFSkVDVF9NRVRFUkVEOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCF1aWRGb3JlZ3JvdW5kICYmICh1aWRQb2xpY3kgJiBQT0xJQ1lfUkVKRUNUX0JBQ0tHUk9VTkQpICE9IDApIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGJ1aWxkIHVwZGF0ZWQgcnVsZXMgYW5kIHB1c2ggdG8gTk1TCi0gICAgICAgIH0gZWxzZSBpZiAoKHVpZFBvbGljeSAmIFBPTElDWV9SRUpFQ1RfUEFJRCkgIT0gMCkgewotICAgICAgICAgICAgLy8gVE9ETzogYnVpbGQgdXBkYXRlZCBydWxlcyBhbmQgcHVzaCB0byBOTVMKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IGJ1aWxkIHVwZGF0ZWQgcnVsZXMgYW5kIHB1c2ggdG8gTk1TCisgICAgICAgIC8vIFRPRE86IG9ubHkgZGlzcGF0Y2ggd2hlbiBydWxlcyBhY3R1YWxseSBjaGFuZ2UKKworICAgICAgICAvLyByZWNvcmQgcnVsZSBsb2NhbGx5IHRvIGRpc3BhdGNoIHRvIG5ldyBsaXN0ZW5lcnMKKyAgICAgICAgbVVpZFJ1bGVzLnB1dCh1aWQsIHVpZFJ1bGVzKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIHJlamVjdE1ldGVyZWQgPSAodWlkUnVsZXMgJiBSVUxFX1JFSkVDVF9NRVRFUkVEKSAhPSAwOworICAgICAgICAvL2tlcm5lbFNldFVpZFJlamVjdFBhaWQodWlkLCByZWplY3RQYWlkKTsKKworICAgICAgICAvLyBkaXNwYXRjaCBjaGFuZ2VkIHJ1bGUgdG8gZXhpc3RpbmcgbGlzdGVuZXJzCisgICAgICAgIC8vIFRPRE86IGRpc3BhdGNoIG91dHNpZGUgb2YgaG9sZGluZyBsb2NrCisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBtTGlzdGVuZXJzLmJlZ2luQnJvYWRjYXN0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIElOZXR3b3JrUG9saWN5TGlzdGVuZXIgbGlzdGVuZXIgPSBtTGlzdGVuZXJzLmdldEJyb2FkY2FzdEl0ZW0oaSk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uVWlkUnVsZXNDaGFuZ2VkKHVpZCwgdWlkUnVsZXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lcnMuZmluaXNoQnJvYWRjYXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aXZlU3Vic2NyaWJlcklkKCkgeworICAgICAgICBmaW5hbCBUZWxlcGhvbnlNYW5hZ2VyIHRlbGVwaG9ueSA9IChUZWxlcGhvbnlNYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuVEVMRVBIT05ZX1NFUlZJQ0UpOworICAgICAgICByZXR1cm4gdGVsZXBob255LmdldFN1YnNjcmliZXJJZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEtleXMoU3BhcnNlSW50QXJyYXkgc291cmNlLCBTcGFyc2VCb29sZWFuQXJyYXkgdGFyZ2V0KSB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gc291cmNlLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHRhcmdldC5wdXQoc291cmNlLmtleUF0KGkpLCB0cnVlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIDxUPiBUIGNoZWNrTm90TnVsbChUIHZhbHVlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEtleXMoU3BhcnNlQm9vbGVhbkFycmF5IHNvdXJjZSwgU3BhcnNlQm9vbGVhbkFycmF5IHRhcmdldCkgeworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHNvdXJjZS5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICB0YXJnZXQucHV0KHNvdXJjZS5rZXlBdChpKSwgdHJ1ZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFNwYXJzZUJvb2xlYW5BcnJheShQcmludFdyaXRlciBmb3V0LCBTcGFyc2VCb29sZWFuQXJyYXkgdmFsdWUpIHsKKyAgICAgICAgZm91dC5wcmludCgiWyIpOworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHZhbHVlLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvdXQucHJpbnQodmFsdWUua2V5QXQoaSkgKyAiPSIgKyB2YWx1ZS52YWx1ZUF0KGkpKTsKKyAgICAgICAgICAgIGlmIChpIDwgc2l6ZSAtIDEpIGZvdXQucHJpbnQoIiwiKTsKKyAgICAgICAgfQorICAgICAgICBmb3V0LnByaW50KCJdIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlYWRJbnRBdHRyaWJ1dGUoWG1sUHVsbFBhcnNlciBpbiwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGluLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIG5hbWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJwcm9ibGVtIHBhcnNpbmcgIiArIG5hbWUgKyAiPSIgKyB2YWx1ZSArICIgYXMgaW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIHJlYWRMb25nQXR0cmlidXRlKFhtbFB1bGxQYXJzZXIgaW4sIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBpbi5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBuYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oInByb2JsZW0gcGFyc2luZyAiICsgbmFtZSArICI9IiArIHZhbHVlICsgIiBhcyBpbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVJbnRBdHRyaWJ1dGUoWG1sU2VyaWFsaXplciBvdXQsIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIG5hbWUsIEludGVnZXIudG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTG9uZ0F0dHJpYnV0ZShYbWxTZXJpYWxpemVyIG91dCwgU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIG5hbWUsIExvbmcudG9TdHJpbmcodmFsdWUpKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL25ldC9OZXR3b3JrU3RhdHNTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvTmV0d29ya1N0YXRzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2E1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9uZXQvTmV0d29ya1N0YXRzU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLm5ldDsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uRFVNUDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfTkVUV09SS19VU0FHRV9ISVNUT1JZOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkFDVElPTl9TSFVURE9XTjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5BQ1RJT05fVUlEX1JFTU9WRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRVhUUkFfVUlEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0cy5JRkFDRV9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0cy5UQUdfTk9ORTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzLlVJRF9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LlRyYWZmaWNTdGF0cy5VSURfUkVNT1ZFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZWN1cmUuTkVUU1RBVFNfTkVUV09SS19CVUNLRVRfRFVSQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLk5FVFNUQVRTX05FVFdPUktfTUFYX0hJU1RPUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLk5FVFNUQVRTX1BFUlNJU1RfVEhSRVNIT0xEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5ORVRTVEFUU19QT0xMX0lOVEVSVkFMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5ORVRTVEFUU19UQUdfTUFYX0hJU1RPUlk7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLk5FVFNUQVRTX1VJRF9CVUNLRVRfRFVSQVRJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3MuU2VjdXJlLk5FVFNUQVRTX1VJRF9NQVhfSElTVE9SWTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuREFZX0lOX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuSE9VUl9JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQudGV4dC5mb3JtYXQuRGF0ZVV0aWxzLk1JTlVURV9JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BbGFybU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuSUFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQubmV0LklDb25uZWN0aXZpdHlNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrU3RhdHNTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtJZGVudGl0eTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0c0hpc3Rvcnk7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1RlbXBsYXRlOworaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLm9zLklOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2U7CitpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvbmdTcGFyc2VBcnJheTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTnRwVHJ1c3RlZFRpbWU7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlRydXN0ZWRUaW1lOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwub3MuQXRvbWljRmlsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuYW5kcm9pZC5jb2xsZWN0LlNldHM7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGxpYmNvcmUuaW8uSW9VdGlsczsKKworLyoqCisgKiBDb2xsZWN0IGFuZCBwZXJzaXN0IGRldGFpbGVkIG5ldHdvcmsgc3RhdGlzdGljcywgYW5kIHByb3ZpZGUgdGhpcyBkYXRhIHRvCisgKiBvdGhlciBzeXN0ZW0gc2VydmljZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR3b3JrU3RhdHNTZXJ2aWNlIGV4dGVuZHMgSU5ldHdvcmtTdGF0c1NlcnZpY2UuU3R1YiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrU3RhdHMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HRCA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dWID0gZmFsc2U7CisKKyAgICAvKiogRmlsZSBoZWFkZXIgbWFnaWMgbnVtYmVyOiAiQU5FVCIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRklMRV9NQUdJQyA9IDB4NDE0RTQ1NTQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTkVUV09SS19JTklUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9VSURfSU5JVCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fVUlEX1dJVEhfSURFTlQgPSAyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX1VJRF9XSVRIX1RBRyA9IDM7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG1OZXR3b3JrTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIElBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFRydXN0ZWRUaW1lIG1UaW1lOworICAgIHByaXZhdGUgZmluYWwgTmV0d29ya1N0YXRzU2V0dGluZ3MgbVNldHRpbmdzOworCisgICAgcHJpdmF0ZSBJQ29ubmVjdGl2aXR5TWFuYWdlciBtQ29ubk1hbmFnZXI7CisKKyAgICAvLyBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fTkVUV09SS19TVEFUU19QT0xMID0KKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5zZXJ2ZXIuYWN0aW9uLk5FVFdPUktfU1RBVFNfUE9MTCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05FVFdPUktfU1RBVFNfVVBEQVRFRCA9CisgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2VydmVyLmFjdGlvbi5ORVRXT1JLX1NUQVRTX1VQREFURUQiOworCisgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1Qb2xsSW50ZW50OworCisgICAgLy8gVE9ETzogbGlzdGVuIGZvciBrZXJuZWwgcHVzaCBldmVudHMgdGhyb3VnaCBuZXRkIGluc3RlYWQgb2YgcG9sbGluZworICAgIC8vIFRPRE86IHdhdGNoIGZvciBVSUQgdW5pbnN0YWxsLCBhbmQgdHJhbnNmZXIgc3RhdHMgaW50byBzaW5nbGUgYnVja2V0CisKKyAgICAvLyBUT0RPOiB0cmltIGVtcHR5IGhpc3Rvcnkgb2JqZWN0cyBlbnRpcmVseQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBLQl9JTl9CWVRFUyA9IDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQl9JTl9CWVRFUyA9IDEwMjQgKiBLQl9JTl9CWVRFUzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEdCX0lOX0JZVEVTID0gMTAyNCAqIE1CX0lOX0JZVEVTOworCisgICAgLyoqCisgICAgICogU2V0dGluZ3MgdGhhdCBjYW4gYmUgY2hhbmdlZCBleHRlcm5hbGx5LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTmV0d29ya1N0YXRzU2V0dGluZ3MgeworICAgICAgICBwdWJsaWMgbG9uZyBnZXRQb2xsSW50ZXJ2YWwoKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UGVyc2lzdFRocmVzaG9sZCgpOworICAgICAgICBwdWJsaWMgbG9uZyBnZXROZXR3b3JrQnVja2V0RHVyYXRpb24oKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0TmV0d29ya01heEhpc3RvcnkoKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VWlkQnVja2V0RHVyYXRpb24oKTsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VWlkTWF4SGlzdG9yeSgpOworICAgICAgICBwdWJsaWMgbG9uZyBnZXRUYWdNYXhIaXN0b3J5KCk7CisgICAgICAgIHB1YmxpYyBsb25nIGdldFRpbWVDYWNoZU1heEFnZSgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1TdGF0c0xvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAvKiogU2V0IG9mIGN1cnJlbnRseSBhY3RpdmUgaWZhY2VzLiAqLworICAgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIE5ldHdvcmtJZGVudGl0eVNldD4gbUFjdGl2ZUlmYWNlcyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIC8qKiBTZXQgb2YgaGlzdG9yaWNhbCBzdGF0cyBmb3Iga25vd24gbmV0d29ya3MuICovCisgICAgcHJpdmF0ZSBIYXNoTWFwPE5ldHdvcmtJZGVudGl0eVNldCwgTmV0d29ya1N0YXRzSGlzdG9yeT4gbU5ldHdvcmtTdGF0cyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIC8qKiBTZXQgb2YgaGlzdG9yaWNhbCBzdGF0cyBmb3Iga25vd24gVUlEcy4gKi8KKyAgICBwcml2YXRlIEhhc2hNYXA8TmV0d29ya0lkZW50aXR5U2V0LCBMb25nU3BhcnNlQXJyYXk8TmV0d29ya1N0YXRzSGlzdG9yeT4+IG1VaWRTdGF0cyA9CisgICAgICAgICAgICBNYXBzLm5ld0hhc2hNYXAoKTsKKworICAgIC8qKiBGbGFnIGlmIHtAbGluayAjbVVpZFN0YXRzfSBoYXZlIGJlZW4gbG9hZGVkIGZyb20gZGlzay4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gbVVpZFN0YXRzTG9hZGVkID0gZmFsc2U7CisKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyBtTGFzdE5ldHdvcmtTbmFwc2hvdDsKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyBtTGFzdFBlcnNpc3ROZXR3b3JrU25hcHNob3Q7CisKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0cyBtTGFzdFVpZFNuYXBzaG90OworCisgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyVGhyZWFkIG1IYW5kbGVyVGhyZWFkOworICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljRmlsZSBtTmV0d29ya0ZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNGaWxlIG1VaWRGaWxlOworCisgICAgLy8gVE9ETzogY29sbGVjdCBkZXRhaWxlZCB1aWQgc3RhdHMsIHN0b3JpbmcgdGFnLWdyYW51bGFyaXR5IGRhdGEgdW50aWwgbmV4dAorICAgIC8vIGRyb3Bib3gsIGFuZCB1aWQgc3VtbWFyeSBmb3IgYSBzcGVjaWZpYyBidWNrZXQgY291bnQuCisKKyAgICAvLyBUT0RPOiBwZXJpb2RpY2FsbHkgY29tcGlsZSBzdGF0aXN0aWNzIGFuZCBzZW5kIHRvIGRyb3Bib3guCisKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzU2VydmljZSgKKyAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBuZXR3b3JrTWFuYWdlciwgSUFsYXJtTWFuYWdlciBhbGFybU1hbmFnZXIpIHsKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0byB1c2luZyBjYWNoZWQgTnRwVHJ1c3RlZFRpbWUKKyAgICAgICAgdGhpcyhjb250ZXh0LCBuZXR3b3JrTWFuYWdlciwgYWxhcm1NYW5hZ2VyLCBuZXcgTnRwVHJ1c3RlZFRpbWUoKSwgZ2V0U3lzdGVtRGlyKCksCisgICAgICAgICAgICAgICAgbmV3IERlZmF1bHROZXR3b3JrU3RhdHNTZXR0aW5ncyhjb250ZXh0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRTeXN0ZW1EaXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXREYXRhRGlyZWN0b3J5KCksICJzeXN0ZW0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTmV0d29ya1N0YXRzU2VydmljZShDb250ZXh0IGNvbnRleHQsIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbmV0d29ya01hbmFnZXIsCisgICAgICAgICAgICBJQWxhcm1NYW5hZ2VyIGFsYXJtTWFuYWdlciwgVHJ1c3RlZFRpbWUgdGltZSwgRmlsZSBzeXN0ZW1EaXIsCisgICAgICAgICAgICBOZXR3b3JrU3RhdHNTZXR0aW5ncyBzZXR0aW5ncykgeworICAgICAgICBtQ29udGV4dCA9IGNoZWNrTm90TnVsbChjb250ZXh0LCAibWlzc2luZyBDb250ZXh0Iik7CisgICAgICAgIG1OZXR3b3JrTWFuYWdlciA9IGNoZWNrTm90TnVsbChuZXR3b3JrTWFuYWdlciwgIm1pc3NpbmcgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSIpOworICAgICAgICBtQWxhcm1NYW5hZ2VyID0gY2hlY2tOb3ROdWxsKGFsYXJtTWFuYWdlciwgIm1pc3NpbmcgSUFsYXJtTWFuYWdlciIpOworICAgICAgICBtVGltZSA9IGNoZWNrTm90TnVsbCh0aW1lLCAibWlzc2luZyBUcnVzdGVkVGltZSIpOworICAgICAgICBtU2V0dGluZ3MgPSBjaGVja05vdE51bGwoc2V0dGluZ3MsICJtaXNzaW5nIE5ldHdvcmtTdGF0c1NldHRpbmdzIik7CisKKyAgICAgICAgbUhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZChUQUcpOworICAgICAgICBtSGFuZGxlclRocmVhZC5zdGFydCgpOworICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1IYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKKworICAgICAgICBtTmV0d29ya0ZpbGUgPSBuZXcgQXRvbWljRmlsZShuZXcgRmlsZShzeXN0ZW1EaXIsICJuZXRzdGF0cy5iaW4iKSk7CisgICAgICAgIG1VaWRGaWxlID0gbmV3IEF0b21pY0ZpbGUobmV3IEZpbGUoc3lzdGVtRGlyLCAibmV0c3RhdHNfdWlkLmJpbiIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBiaW5kQ29ubmVjdGl2aXR5TWFuYWdlcihJQ29ubmVjdGl2aXR5TWFuYWdlciBjb25uTWFuYWdlcikgeworICAgICAgICBtQ29ubk1hbmFnZXIgPSBjaGVja05vdE51bGwoY29ubk1hbmFnZXIsICJtaXNzaW5nIElDb25uZWN0aXZpdHlNYW5hZ2VyIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzTG9jaykgeworICAgICAgICAgICAgLy8gcmVhZCBoaXN0b3JpY2FsIG5ldHdvcmsgc3RhdHMgZnJvbSBkaXNrLCBzaW5jZSBwb2xpY3kgc2VydmljZQorICAgICAgICAgICAgLy8gbWlnaHQgbmVlZCB0aGVtIHJpZ2h0IGF3YXkuIHdlIGRlbGF5IGxvYWRpbmcgZGV0YWlsZWQgVUlEIHN0YXRzCisgICAgICAgICAgICAvLyB1bnRpbCBhY3R1YWxseSBuZWVkZWQuCisgICAgICAgICAgICByZWFkTmV0d29ya1N0YXRzTG9ja2VkKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3YXRjaCBmb3IgbmV0d29yayBpbnRlcmZhY2VzIHRvIGJlIGNsYWltZWQKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGNvbm5GaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKENPTk5FQ1RJVklUWV9BQ1RJT04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Db25uUmVjZWl2ZXIsIGNvbm5GaWx0ZXIsIENPTk5FQ1RJVklUWV9JTlRFUk5BTCwgbUhhbmRsZXIpOworCisgICAgICAgIC8vIGxpc3RlbiBmb3IgcGVyaW9kaWMgcG9sbGluZyBldmVudHMKKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIHBvbGxGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1Qb2xsUmVjZWl2ZXIsIHBvbGxGaWx0ZXIsIFJFQURfTkVUV09SS19VU0FHRV9ISVNUT1JZLCBtSGFuZGxlcik7CisKKyAgICAgICAgLy8gbGlzdGVuIGZvciB1aWQgcmVtb3ZhbCB0byBjbGVhbiBzdGF0cworICAgICAgICBmaW5hbCBJbnRlbnRGaWx0ZXIgcmVtb3ZlZEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoQUNUSU9OX1VJRF9SRU1PVkVEKTsKKyAgICAgICAgbUNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtUmVtb3ZlZFJlY2VpdmVyLCByZW1vdmVkRmlsdGVyLCBudWxsLCBtSGFuZGxlcik7CisKKyAgICAgICAgLy8gcGVyc2lzdCBzdGF0cyBkdXJpbmcgY2xlYW4gc2h1dGRvd24KKyAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIHNodXRkb3duRmlsdGVyID0gbmV3IEludGVudEZpbHRlcihBQ1RJT05fU0hVVERPV04pOworICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TaHV0ZG93blJlY2VpdmVyLCBzaHV0ZG93bkZpbHRlcik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZ2lzdGVyUG9sbEFsYXJtTG9ja2VkKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAidW5hYmxlIHRvIHJlZ2lzdGVyIHBvbGwgYWxhcm0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bkxvY2tlZCgpIHsKKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1Db25uUmVjZWl2ZXIpOworICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVBvbGxSZWNlaXZlcik7CisgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtUmVtb3ZlZFJlY2VpdmVyKTsKKyAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1TaHV0ZG93blJlY2VpdmVyKTsKKworICAgICAgICB3cml0ZU5ldHdvcmtTdGF0c0xvY2tlZCgpOworICAgICAgICBpZiAobVVpZFN0YXRzTG9hZGVkKSB7CisgICAgICAgICAgICB3cml0ZVVpZFN0YXRzTG9ja2VkKCk7CisgICAgICAgIH0KKyAgICAgICAgbU5ldHdvcmtTdGF0cy5jbGVhcigpOworICAgICAgICBtVWlkU3RhdHMuY2xlYXIoKTsKKyAgICAgICAgbVVpZFN0YXRzTG9hZGVkID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW55IGV4aXN0aW5nIHtAbGluayAjQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTH0gYWxhcm1zLCBhbmQKKyAgICAgKiByZXNjaGVkdWxlIGJhc2VkIG9uIGN1cnJlbnQge0BsaW5rIE5ldHdvcmtTdGF0c1NldHRpbmdzI2dldFBvbGxJbnRlcnZhbCgpfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJQb2xsQWxhcm1Mb2NrZWQoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1Qb2xsSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbGFybU1hbmFnZXIucmVtb3ZlKG1Qb2xsSW50ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIG1Qb2xsSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCisgICAgICAgICAgICAgICAgbUNvbnRleHQsIDAsIG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTCksIDApOworCisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFJlYWx0aW1lID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIG1BbGFybU1hbmFnZXIuc2V0SW5leGFjdFJlcGVhdGluZyhBbGFybU1hbmFnZXIuRUxBUFNFRF9SRUFMVElNRSwgY3VycmVudFJlYWx0aW1lLAorICAgICAgICAgICAgICAgIG1TZXR0aW5ncy5nZXRQb2xsSW50ZXJ2YWwoKSwgbVBvbGxJbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5IGdldEhpc3RvcnlGb3JOZXR3b3JrKE5ldHdvcmtUZW1wbGF0ZSB0ZW1wbGF0ZSkgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oUkVBRF9ORVRXT1JLX1VTQUdFX0hJU1RPUlksIFRBRyk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtU3RhdHNMb2NrKSB7CisgICAgICAgICAgICAvLyBjb21iaW5lIGFsbCBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGVtcGxhdGUKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgY29tYmluZWQgPSBuZXcgTmV0d29ya1N0YXRzSGlzdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldE5ldHdvcmtCdWNrZXREdXJhdGlvbigpLCBlc3RpbWF0ZU5ldHdvcmtCdWNrZXRzKCkpOworICAgICAgICAgICAgZm9yIChOZXR3b3JrSWRlbnRpdHlTZXQgaWRlbnQgOiBtTmV0d29ya1N0YXRzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWF0Y2hlcyh0ZW1wbGF0ZSwgaWRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgaGlzdG9yeSA9IG1OZXR3b3JrU3RhdHMuZ2V0KGlkZW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWQucmVjb3JkRW50aXJlSGlzdG9yeShoaXN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb21iaW5lZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOZXR3b3JrU3RhdHNIaXN0b3J5IGdldEhpc3RvcnlGb3JVaWQoTmV0d29ya1RlbXBsYXRlIHRlbXBsYXRlLCBpbnQgdWlkLCBpbnQgdGFnKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihSRUFEX05FVFdPUktfVVNBR0VfSElTVE9SWSwgVEFHKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0c0xvY2spIHsKKyAgICAgICAgICAgIGVuc3VyZVVpZFN0YXRzTG9hZGVkTG9ja2VkKCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHBhY2tlZCA9IHBhY2tVaWRBbmRUYWcodWlkLCB0YWcpOworCisgICAgICAgICAgICAvLyBjb21iaW5lIGFsbCBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGVtcGxhdGUKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgY29tYmluZWQgPSBuZXcgTmV0d29ya1N0YXRzSGlzdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzLmdldFVpZEJ1Y2tldER1cmF0aW9uKCksIGVzdGltYXRlVWlkQnVja2V0cygpKTsKKyAgICAgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5U2V0IGlkZW50IDogbVVpZFN0YXRzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWF0Y2hlcyh0ZW1wbGF0ZSwgaWRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgaGlzdG9yeSA9IG1VaWRTdGF0cy5nZXQoaWRlbnQpLmdldChwYWNrZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZC5yZWNvcmRFbnRpcmVIaXN0b3J5KGhpc3RvcnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVkOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5ldHdvcmtTdGF0cyBnZXRTdW1tYXJ5Rm9yTmV0d29yayhOZXR3b3JrVGVtcGxhdGUgdGVtcGxhdGUsIGxvbmcgc3RhcnQsIGxvbmcgZW5kKSB7CisgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihSRUFEX05FVFdPUktfVVNBR0VfSElTVE9SWSwgVEFHKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0c0xvY2spIHsKKyAgICAgICAgICAgIGxvbmcgcnggPSAwOworICAgICAgICAgICAgbG9uZyB0eCA9IDA7CisgICAgICAgICAgICBsb25nW10gbmV0d29ya1RvdGFsID0gbmV3IGxvbmdbMl07CisKKyAgICAgICAgICAgIC8vIGNvbWJpbmUgdG90YWwgZnJvbSBhbGwgaW50ZXJmYWNlcyB0aGF0IG1hdGNoIHRlbXBsYXRlCisgICAgICAgICAgICBmb3IgKE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCA6IG1OZXR3b3JrU3RhdHMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGVNYXRjaGVzKHRlbXBsYXRlLCBpZGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzSGlzdG9yeSBoaXN0b3J5ID0gbU5ldHdvcmtTdGF0cy5nZXQoaWRlbnQpOworICAgICAgICAgICAgICAgICAgICBuZXR3b3JrVG90YWwgPSBoaXN0b3J5LmdldFRvdGFsRGF0YShzdGFydCwgZW5kLCBuZXR3b3JrVG90YWwpOworICAgICAgICAgICAgICAgICAgICByeCArPSBuZXR3b3JrVG90YWxbMF07CisgICAgICAgICAgICAgICAgICAgIHR4ICs9IG5ldHdvcmtUb3RhbFsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMoZW5kIC0gc3RhcnQsIDEpOworICAgICAgICAgICAgc3RhdHMuYWRkRW50cnkoSUZBQ0VfQUxMLCBVSURfQUxMLCBUQUdfTk9ORSwgcngsIHR4KTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOZXR3b3JrU3RhdHMgZ2V0U3VtbWFyeUZvckFsbFVpZCgKKyAgICAgICAgICAgIE5ldHdvcmtUZW1wbGF0ZSB0ZW1wbGF0ZSwgbG9uZyBzdGFydCwgbG9uZyBlbmQsIGJvb2xlYW4gaW5jbHVkZVRhZ3MpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKFJFQURfTkVUV09SS19VU0FHRV9ISVNUT1JZLCBUQUcpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzTG9jaykgeworICAgICAgICAgICAgZW5zdXJlVWlkU3RhdHNMb2FkZWRMb2NrZWQoKTsKKworICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIHN0YXRzID0gbmV3IE5ldHdvcmtTdGF0cyhlbmQgLSBzdGFydCwgMjQpOworICAgICAgICAgICAgbG9uZ1tdIHRvdGFsID0gbmV3IGxvbmdbMl07CisKKyAgICAgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5U2V0IGlkZW50IDogbVVpZFN0YXRzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlTWF0Y2hlcyh0ZW1wbGF0ZSwgaWRlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExvbmdTcGFyc2VBcnJheTxOZXR3b3JrU3RhdHNIaXN0b3J5PiB1aWRTdGF0cyA9IG1VaWRTdGF0cy5nZXQoaWRlbnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVpZFN0YXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBhY2tlZCA9IHVpZFN0YXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IHVucGFja1VpZChwYWNrZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhZyA9IHVucGFja1RhZyhwYWNrZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgaW5jbHVkZSBzdW1tYXJ5IHVuZGVyIFRBR19OT05FLCBhbmQgaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgdGFncyB3aGVuIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gVEFHX05PTkUgfHwgaW5jbHVkZVRhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSB1aWRTdGF0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsID0gaGlzdG9yeS5nZXRUb3RhbERhdGEoc3RhcnQsIGVuZCwgdG90YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcnggPSB0b3RhbFswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHR4ID0gdG90YWxbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ4ID4gMCB8fCB0eCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMuY29tYmluZUVudHJ5KElGQUNFX0FMTCwgdWlkLCB0YWcsIHJ4LCB0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc3RhdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlciB0aGF0IHdhdGNoZXMgZm9yIHtAbGluayBJQ29ubmVjdGl2aXR5TWFuYWdlcn0gdG8gY2xhaW0gbmV0d29yaworICAgICAqIGludGVyZmFjZXMuIFVzZWQgdG8gYXNzb2NpYXRlIHtAbGluayBUZWxlcGhvbnlNYW5hZ2VyI2dldFN1YnNjcmliZXJJZCgpfQorICAgICAqIHdpdGggbW9iaWxlIGludGVyZmFjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtQ29ublJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gb24gYmFja2dyb3VuZCBoYW5kbGVyIHRocmVhZCwgYW5kIHZlcmlmaWVkIENPTk5FQ1RJVklUWV9JTlRFUk5BTAorICAgICAgICAgICAgLy8gcGVybWlzc2lvbiBhYm92ZS4KKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVN0YXRzTG9jaykgeworICAgICAgICAgICAgICAgIHVwZGF0ZUlmYWNlc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0UmVjZWl2ZXIgbVBvbGxSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIC8vIG9uIGJhY2tncm91bmQgaGFuZGxlciB0aHJlYWQsIGFuZCB2ZXJpZmllZCBVUERBVEVfREVWSUNFX1NUQVRTCisgICAgICAgICAgICAvLyBwZXJtaXNzaW9uIGFib3ZlLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdHNMb2NrKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYWNxdWlyZSB3YWtlbG9jayB3aGlsZSBwZXJmb3JtaW5nIHBvbGwKKyAgICAgICAgICAgICAgICBwZXJmb3JtUG9sbExvY2tlZCh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtUmVtb3ZlZFJlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICAgICAgLy8gb24gYmFja2dyb3VuZCBoYW5kbGVyIHRocmVhZCwgYW5kIFVJRF9SRU1PVkVEIGlzIHByb3RlY3RlZAorICAgICAgICAgICAgLy8gYnJvYWRjYXN0LgorICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9VSUQsIDApOworICAgICAgICAgICAgc3luY2hyb25pemVkIChtU3RhdHNMb2NrKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlVWlkTG9ja2VkKHVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBCcm9hZGNhc3RSZWNlaXZlciBtU2h1dGRvd25SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgICAgIC8vIFNIVVRET1dOIGlzIHByb3RlY3RlZCBicm9hZGNhc3QuCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0c0xvY2spIHsKKyAgICAgICAgICAgICAgICBzaHV0ZG93bkxvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluc3BlY3QgYWxsIGN1cnJlbnQge0BsaW5rIE5ldHdvcmtTdGF0ZX0gdG8gZGVyaXZlIG1hcHBpbmcgZnJvbSB7QGNvZGUKKyAgICAgKiBpZmFjZX0gdG8ge0BsaW5rIE5ldHdvcmtTdGF0c0hpc3Rvcnl9LiBXaGVuIG11bHRpcGxlIHtAbGluayBOZXR3b3JrSW5mb30KKyAgICAgKiBhcmUgYWN0aXZlIG9uIGEgc2luZ2xlIHtAY29kZSBpZmFjZX0sIHRoZXkgYXJlIGNvbWJpbmVkIHVuZGVyIGEgc2luZ2xlCisgICAgICoge0BsaW5rIE5ldHdvcmtJZGVudGl0eVNldH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUlmYWNlc0xvY2tlZCgpIHsKKyAgICAgICAgaWYgKExPR1YpIFNsb2cudihUQUcsICJ1cGRhdGVJZmFjZXNMb2NrZWQoKSIpOworCisgICAgICAgIC8vIHRha2Ugb25lIGxhc3Qgc3RhdHMgc25hcHNob3QgYmVmb3JlIHVwZGF0aW5nIGlmYWNlIG1hcHBpbmcuIHRoaXMKKyAgICAgICAgLy8gaXNuJ3QgcGVyZmVjdCwgc2luY2UgdGhlIGtlcm5lbCBtYXkgYWxyZWFkeSBiZSBjb3VudGluZyB0cmFmZmljIGZyb20KKyAgICAgICAgLy8gdGhlIHVwZGF0ZWQgbmV0d29yay4KKyAgICAgICAgcGVyZm9ybVBvbGxMb2NrZWQoZmFsc2UsIGZhbHNlKTsKKworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdGVbXSBzdGF0ZXM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF0ZXMgPSBtQ29ubk1hbmFnZXIuZ2V0QWxsTmV0d29ya1N0YXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicHJvYmxlbSByZWFkaW5nIG5ldHdvcmsgc3RhdGUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlYnVpbGQgYWN0aXZlIGludGVyZmFjZXMgYmFzZWQgb24gY29ubmVjdGVkIG5ldHdvcmtzCisgICAgICAgIG1BY3RpdmVJZmFjZXMuY2xlYXIoKTsKKworICAgICAgICBmb3IgKE5ldHdvcmtTdGF0ZSBzdGF0ZSA6IHN0YXRlcykgeworICAgICAgICAgICAgaWYgKHN0YXRlLm5ldHdvcmtJbmZvLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IG5ldHdvcmtzIHVuZGVyIHRoZWlyIHBhcmVudCBpbnRlcmZhY2VzCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlmYWNlID0gc3RhdGUubGlua1Byb3BlcnRpZXMuZ2V0SW50ZXJmYWNlTmFtZSgpOworCisgICAgICAgICAgICAgICAgTmV0d29ya0lkZW50aXR5U2V0IGlkZW50ID0gbUFjdGl2ZUlmYWNlcy5nZXQoaWZhY2UpOworICAgICAgICAgICAgICAgIGlmIChpZGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlkZW50ID0gbmV3IE5ldHdvcmtJZGVudGl0eVNldCgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlSWZhY2VzLnB1dChpZmFjZSwgaWRlbnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlkZW50LmFkZChOZXR3b3JrSWRlbnRpdHkuYnVpbGROZXR3b3JrSWRlbnRpdHkobUNvbnRleHQsIHN0YXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJpb2RpYyBwb2xsIG9wZXJhdGlvbiwgcmVhZGluZyBjdXJyZW50IHN0YXRpc3RpY3MgYW5kIHJlY29yZGluZyBpbnRvCisgICAgICoge0BsaW5rIE5ldHdvcmtTdGF0c0hpc3Rvcnl9LgorICAgICAqCisgICAgICogQHBhcmFtIGRldGFpbGVkUG9sbCBJbmRpY2F0ZSBpZiBkZXRhaWxlZCBVSUQgc3RhdHMgc2hvdWxkIGJlIGNvbGxlY3RlZAorICAgICAqICAgICAgICAgICAgZHVyaW5nIHRoaXMgcG9sbCBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1Qb2xsTG9ja2VkKGJvb2xlYW4gZGV0YWlsZWRQb2xsLCBib29sZWFuIGZvcmNlUGVyc2lzdCkgeworICAgICAgICBpZiAoTE9HVikgU2xvZy52KFRBRywgInBlcmZvcm1Qb2xsTG9ja2VkKCkiKTsKKworICAgICAgICAvLyB0cnkgcmVmcmVzaGluZyB0aW1lIHNvdXJjZSB3aGVuIHN0YWxlCisgICAgICAgIGlmIChtVGltZS5nZXRDYWNoZUFnZSgpID4gbVNldHRpbmdzLmdldFRpbWVDYWNoZU1heEFnZSgpKSB7CisgICAgICAgICAgICBtVGltZS5mb3JjZVJlZnJlc2goKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIG1hcmtpbmcgInVudHJ1c3RlZCIgdGltZXMgaW4gaGlzdG9yaWNhbCBzdGF0cworICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gbVRpbWUuaGFzQ2FjaGUoKSA/IG1UaW1lLmN1cnJlbnRUaW1lTWlsbGlzKCkKKyAgICAgICAgICAgICAgICA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBuZXR3b3JrU25hcHNob3Q7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyB1aWRTbmFwc2hvdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldHdvcmtTbmFwc2hvdCA9IG1OZXR3b3JrTWFuYWdlci5nZXROZXR3b3JrU3RhdHNTdW1tYXJ5KCk7CisgICAgICAgICAgICB1aWRTbmFwc2hvdCA9IGRldGFpbGVkUG9sbCA/IG1OZXR3b3JrTWFuYWdlci5nZXROZXR3b3JrU3RhdHNEZXRhaWwoKSA6IG51bGw7CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTbG9nLncoVEFHLCAicHJvYmxlbSByZWFkaW5nIG5ldHdvcmsgc3RhdHMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHBlcmZvcm1OZXR3b3JrUG9sbExvY2tlZChuZXR3b3JrU25hcHNob3QsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgaWYgKGRldGFpbGVkUG9sbCkgeworICAgICAgICAgICAgcGVyZm9ybVVpZFBvbGxMb2NrZWQodWlkU25hcHNob3QsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlY2lkZSBpZiBlbm91Z2ggaGFzIGNoYW5nZWQgdG8gdHJpZ2dlciBwZXJzaXN0CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0cyBwZXJzaXN0RGVsdGEgPSBjb21wdXRlU3RhdHNEZWx0YSgKKyAgICAgICAgICAgICAgICBtTGFzdFBlcnNpc3ROZXR3b3JrU25hcHNob3QsIG5ldHdvcmtTbmFwc2hvdCk7CisgICAgICAgIGZpbmFsIGxvbmcgcGVyc2lzdFRocmVzaG9sZCA9IG1TZXR0aW5ncy5nZXRQZXJzaXN0VGhyZXNob2xkKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGlmYWNlIDogcGVyc2lzdERlbHRhLmdldFVuaXF1ZUlmYWNlcygpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBwZXJzaXN0RGVsdGEuZmluZEluZGV4KGlmYWNlLCBVSURfQUxMLCBUQUdfTk9ORSk7CisgICAgICAgICAgICBpZiAoZm9yY2VQZXJzaXN0IHx8IHBlcnNpc3REZWx0YS5yeFtpbmRleF0gPiBwZXJzaXN0VGhyZXNob2xkCisgICAgICAgICAgICAgICAgICAgIHx8IHBlcnNpc3REZWx0YS50eFtpbmRleF0gPiBwZXJzaXN0VGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgd3JpdGVOZXR3b3JrU3RhdHNMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAobVVpZFN0YXRzTG9hZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVWlkU3RhdHNMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxhc3RQZXJzaXN0TmV0d29ya1NuYXBzaG90ID0gbmV0d29ya1NuYXBzaG90OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWxseSwgZGlzcGF0Y2ggdXBkYXRlZCBldmVudCB0byBhbnkgbGlzdGVuZXJzCisgICAgICAgIGZpbmFsIEludGVudCB1cGRhdGVkSW50ZW50ID0gbmV3IEludGVudChBQ1RJT05fTkVUV09SS19TVEFUU19VUERBVEVEKTsKKyAgICAgICAgdXBkYXRlZEludGVudC5zZXRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFkpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KHVwZGF0ZWRJbnRlbnQsIFJFQURfTkVUV09SS19VU0FHRV9ISVNUT1JZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUge0BsaW5rICNtTmV0d29ya1N0YXRzfSBoaXN0b3JpY2FsIHVzYWdlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtTmV0d29ya1BvbGxMb2NrZWQoTmV0d29ya1N0YXRzIG5ldHdvcmtTbmFwc2hvdCwgbG9uZyBjdXJyZW50VGltZSkgeworICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gdW5rbm93bklmYWNlID0gU2V0cy5uZXdIYXNoU2V0KCk7CisKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGRlbHRhID0gY29tcHV0ZVN0YXRzRGVsdGEobUxhc3ROZXR3b3JrU25hcHNob3QsIG5ldHdvcmtTbmFwc2hvdCk7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZVN0YXJ0ID0gY3VycmVudFRpbWUgLSBkZWx0YS5lbGFwc2VkUmVhbHRpbWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGEuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWZhY2UgPSBkZWx0YS5pZmFjZVtpXTsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCA9IG1BY3RpdmVJZmFjZXMuZ2V0KGlmYWNlKTsKKyAgICAgICAgICAgIGlmIChpZGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdW5rbm93bklmYWNlLmFkZChpZmFjZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgcnggPSBkZWx0YS5yeFtpXTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgdHggPSBkZWx0YS50eFtpXTsKKworICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzSGlzdG9yeSBoaXN0b3J5ID0gZmluZE9yQ3JlYXRlTmV0d29ya1N0YXRzTG9ja2VkKGlkZW50KTsKKyAgICAgICAgICAgIGhpc3RvcnkucmVjb3JkRGF0YSh0aW1lU3RhcnQsIGN1cnJlbnRUaW1lLCByeCwgdHgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdHJpbSBhbnkgaGlzdG9yeSBiZXlvbmQgbWF4CisgICAgICAgIGZpbmFsIGxvbmcgbWF4SGlzdG9yeSA9IG1TZXR0aW5ncy5nZXROZXR3b3JrTWF4SGlzdG9yeSgpOworICAgICAgICBmb3IgKE5ldHdvcmtTdGF0c0hpc3RvcnkgaGlzdG9yeSA6IG1OZXR3b3JrU3RhdHMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGhpc3RvcnkucmVtb3ZlQnVja2V0c0JlZm9yZShjdXJyZW50VGltZSAtIG1heEhpc3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgbUxhc3ROZXR3b3JrU25hcHNob3QgPSBuZXR3b3JrU25hcHNob3Q7CisKKyAgICAgICAgaWYgKExPR0QgJiYgdW5rbm93bklmYWNlLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJ1bmtub3duIGludGVyZmFjZXMgIiArIHVua25vd25JZmFjZS50b1N0cmluZygpICsgIiwgaWdub3JpbmcgdGhvc2Ugc3RhdHMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB7QGxpbmsgI21VaWRTdGF0c30gaGlzdG9yaWNhbCB1c2FnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVVpZFBvbGxMb2NrZWQoTmV0d29ya1N0YXRzIHVpZFNuYXBzaG90LCBsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgIGVuc3VyZVVpZFN0YXRzTG9hZGVkTG9ja2VkKCk7CisKKyAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzIGRlbHRhID0gY29tcHV0ZVN0YXRzRGVsdGEobUxhc3RVaWRTbmFwc2hvdCwgdWlkU25hcHNob3QpOworICAgICAgICBmaW5hbCBsb25nIHRpbWVTdGFydCA9IGN1cnJlbnRUaW1lIC0gZGVsdGEuZWxhcHNlZFJlYWx0aW1lOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGEuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWZhY2UgPSBkZWx0YS5pZmFjZVtpXTsKKyAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCA9IG1BY3RpdmVJZmFjZXMuZ2V0KGlmYWNlKTsKKyAgICAgICAgICAgIGlmIChpZGVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSBkZWx0YS51aWRbaV07CisgICAgICAgICAgICBmaW5hbCBpbnQgdGFnID0gZGVsdGEudGFnW2ldOworICAgICAgICAgICAgZmluYWwgbG9uZyByeCA9IGRlbHRhLnJ4W2ldOworICAgICAgICAgICAgZmluYWwgbG9uZyB0eCA9IGRlbHRhLnR4W2ldOworCisgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSBmaW5kT3JDcmVhdGVVaWRTdGF0c0xvY2tlZChpZGVudCwgdWlkLCB0YWcpOworICAgICAgICAgICAgaGlzdG9yeS5yZWNvcmREYXRhKHRpbWVTdGFydCwgY3VycmVudFRpbWUsIHJ4LCB0eCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0cmltIGFueSBoaXN0b3J5IGJleW9uZCBtYXgKKyAgICAgICAgZmluYWwgbG9uZyBtYXhVaWRIaXN0b3J5ID0gbVNldHRpbmdzLmdldFVpZE1heEhpc3RvcnkoKTsKKyAgICAgICAgZmluYWwgbG9uZyBtYXhUYWdIaXN0b3J5ID0gbVNldHRpbmdzLmdldFRhZ01heEhpc3RvcnkoKTsKKyAgICAgICAgZm9yIChMb25nU3BhcnNlQXJyYXk8TmV0d29ya1N0YXRzSGlzdG9yeT4gdWlkU3RhdHMgOiBtVWlkU3RhdHMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdWlkU3RhdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBhY2tlZCA9IHVpZFN0YXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgaGlzdG9yeSA9IHVpZFN0YXRzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgICAgICAgICAvLyBkZXRhaWxlZCB0YWdzIGFyZSB0cmltbWVkIHNvb25lciB0aGFuIHN1bW1hcnkgaW4gVEFHX05PTkUKKyAgICAgICAgICAgICAgICBpZiAodW5wYWNrVGFnKHBhY2tlZCkgPT0gVEFHX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5yZW1vdmVCdWNrZXRzQmVmb3JlKGN1cnJlbnRUaW1lIC0gbWF4VWlkSGlzdG9yeSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5yZW1vdmVCdWNrZXRzQmVmb3JlKGN1cnJlbnRUaW1lIC0gbWF4VGFnSGlzdG9yeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUxhc3RVaWRTbmFwc2hvdCA9IHVpZFNuYXBzaG90OworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFuIHVwIHtAbGluayAjbVVpZFN0YXRzfSBhZnRlciBVSUQgaXMgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlVWlkTG9ja2VkKGludCB1aWQpIHsKKyAgICAgICAgZW5zdXJlVWlkU3RhdHNMb2FkZWRMb2NrZWQoKTsKKworICAgICAgICAvLyBtaWdyYXRlIGFsbCBVSUQgc3RhdHMgaW50byBzcGVjaWFsICJyZW1vdmVkIiBidWNrZXQKKyAgICAgICAgZm9yIChOZXR3b3JrSWRlbnRpdHlTZXQgaWRlbnQgOiBtVWlkU3RhdHMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExvbmdTcGFyc2VBcnJheTxOZXR3b3JrU3RhdHNIaXN0b3J5PiB1aWRTdGF0cyA9IG1VaWRTdGF0cy5nZXQoaWRlbnQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1aWRTdGF0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGFja2VkID0gdWlkU3RhdHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHVucGFja1VpZChwYWNrZWQpID09IHVpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG1pZ3JhdGUgY29tYmluZWQgVEFHX05PTkUgaGlzdG9yeQorICAgICAgICAgICAgICAgICAgICBpZiAodW5wYWNrVGFnKHBhY2tlZCkgPT0gVEFHX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgdWlkSGlzdG9yeSA9IHVpZFN0YXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IHJlbW92ZWRIaXN0b3J5ID0gZmluZE9yQ3JlYXRlVWlkU3RhdHNMb2NrZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LCBVSURfUkVNT1ZFRCwgVEFHX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEhpc3RvcnkucmVjb3JkRW50aXJlSGlzdG9yeSh1aWRIaXN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1aWRTdGF0cy5yZW1vdmUocGFja2VkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBwdXNoIGtlcm5lbCBldmVudCB0byB3aXBlIHN0YXRzIGZvciBVSUQsIG90aGVyd2lzZSB3ZSByaXNrCisgICAgICAgIC8vIHBpY2tpbmcgdGhlbSB1cCBhZ2FpbiBkdXJpbmcgbmV4dCBwb2xsLgorCisgICAgICAgIC8vIHNpbmNlIHRoaXMgd2FzIHJhZGljYWwgcmV3cml0ZSwgcHVzaCB0byBkaXNrCisgICAgICAgIHdyaXRlVWlkU3RhdHNMb2NrZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0c0hpc3RvcnkgZmluZE9yQ3JlYXRlTmV0d29ya1N0YXRzTG9ja2VkKE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCkgeworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGV4aXN0aW5nID0gbU5ldHdvcmtTdGF0cy5nZXQoaWRlbnQpOworCisgICAgICAgIC8vIHVwZGF0ZSB3aGVuIG5vIGV4aXN0aW5nLCBvciB3aGVuIGJ1Y2tldCBkdXJhdGlvbiBjaGFuZ2VkCisgICAgICAgIGZpbmFsIGxvbmcgYnVja2V0RHVyYXRpb24gPSBtU2V0dGluZ3MuZ2V0TmV0d29ya0J1Y2tldER1cmF0aW9uKCk7CisgICAgICAgIE5ldHdvcmtTdGF0c0hpc3RvcnkgdXBkYXRlZCA9IG51bGw7CisgICAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB1cGRhdGVkID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoYnVja2V0RHVyYXRpb24sIDEwKTsKKyAgICAgICAgfSBlbHNlIGlmIChleGlzdGluZy5idWNrZXREdXJhdGlvbiAhPSBidWNrZXREdXJhdGlvbikgeworICAgICAgICAgICAgdXBkYXRlZCA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KAorICAgICAgICAgICAgICAgICAgICBidWNrZXREdXJhdGlvbiwgZXN0aW1hdGVSZXNpemVCdWNrZXRzKGV4aXN0aW5nLCBidWNrZXREdXJhdGlvbikpOworICAgICAgICAgICAgdXBkYXRlZC5yZWNvcmRFbnRpcmVIaXN0b3J5KGV4aXN0aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGRhdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1OZXR3b3JrU3RhdHMucHV0KGlkZW50LCB1cGRhdGVkKTsKKyAgICAgICAgICAgIHJldHVybiB1cGRhdGVkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBOZXR3b3JrU3RhdHNIaXN0b3J5IGZpbmRPckNyZWF0ZVVpZFN0YXRzTG9ja2VkKAorICAgICAgICAgICAgTmV0d29ya0lkZW50aXR5U2V0IGlkZW50LCBpbnQgdWlkLCBpbnQgdGFnKSB7CisgICAgICAgIGVuc3VyZVVpZFN0YXRzTG9hZGVkTG9ja2VkKCk7CisKKyAgICAgICAgTG9uZ1NwYXJzZUFycmF5PE5ldHdvcmtTdGF0c0hpc3Rvcnk+IHVpZFN0YXRzID0gbVVpZFN0YXRzLmdldChpZGVudCk7CisgICAgICAgIGlmICh1aWRTdGF0cyA9PSBudWxsKSB7CisgICAgICAgICAgICB1aWRTdGF0cyA9IG5ldyBMb25nU3BhcnNlQXJyYXk8TmV0d29ya1N0YXRzSGlzdG9yeT4oKTsKKyAgICAgICAgICAgIG1VaWRTdGF0cy5wdXQoaWRlbnQsIHVpZFN0YXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGxvbmcgcGFja2VkID0gcGFja1VpZEFuZFRhZyh1aWQsIHRhZyk7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgZXhpc3RpbmcgPSB1aWRTdGF0cy5nZXQocGFja2VkKTsKKworICAgICAgICAvLyB1cGRhdGUgd2hlbiBubyBleGlzdGluZywgb3Igd2hlbiBidWNrZXQgZHVyYXRpb24gY2hhbmdlZAorICAgICAgICBmaW5hbCBsb25nIGJ1Y2tldER1cmF0aW9uID0gbVNldHRpbmdzLmdldFVpZEJ1Y2tldER1cmF0aW9uKCk7CisgICAgICAgIE5ldHdvcmtTdGF0c0hpc3RvcnkgdXBkYXRlZCA9IG51bGw7CisgICAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB1cGRhdGVkID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoYnVja2V0RHVyYXRpb24sIDEwKTsKKyAgICAgICAgfSBlbHNlIGlmIChleGlzdGluZy5idWNrZXREdXJhdGlvbiAhPSBidWNrZXREdXJhdGlvbikgeworICAgICAgICAgICAgdXBkYXRlZCA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KAorICAgICAgICAgICAgICAgICAgICBidWNrZXREdXJhdGlvbiwgZXN0aW1hdGVSZXNpemVCdWNrZXRzKGV4aXN0aW5nLCBidWNrZXREdXJhdGlvbikpOworICAgICAgICAgICAgdXBkYXRlZC5yZWNvcmRFbnRpcmVIaXN0b3J5KGV4aXN0aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGRhdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVpZFN0YXRzLnB1dChwYWNrZWQsIHVwZGF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE5ldHdvcmtTdGF0c0xvY2tlZCgpIHsKKyAgICAgICAgaWYgKExPR1YpIFNsb2cudihUQUcsICJyZWFkTmV0d29ya1N0YXRzTG9ja2VkKCkiKTsKKworICAgICAgICAvLyBjbGVhciBhbnkgZXhpc3Rpbmcgc3RhdHMgYW5kIHJlYWQgZnJvbSBkaXNrCisgICAgICAgIG1OZXR3b3JrU3RhdHMuY2xlYXIoKTsKKworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpcyA9IG1OZXR3b3JrRmlsZS5vcGVuUmVhZCgpOworICAgICAgICAgICAgZmluYWwgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShmaXMpOworCisgICAgICAgICAgICAvLyB2ZXJpZnkgZmlsZSBtYWdpYyBoZWFkZXIgaW50YWN0CisgICAgICAgICAgICBmaW5hbCBpbnQgbWFnaWMgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBpZiAobWFnaWMgIT0gRklMRV9NQUdJQykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigidW5leHBlY3RlZCBtYWdpYzogIiArIG1hZ2ljKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IHZlcnNpb24gPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFZFUlNJT05fTkVUV09SS19JTklUOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5ldHdvcmsgOj0gc2l6ZSAqKE5ldHdvcmtJZGVudGl0eVNldCBOZXR3b3JrU3RhdHNIaXN0b3J5KQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCA9IG5ldyBOZXR3b3JrSWRlbnRpdHlTZXQoaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzSGlzdG9yeSBoaXN0b3J5ID0gbmV3IE5ldHdvcmtTdGF0c0hpc3RvcnkoaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgbU5ldHdvcmtTdGF0cy5wdXQoaWRlbnQsIGhpc3RvcnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigidW5leHBlY3RlZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbWlzc2luZyBzdGF0cyBpcyBva2F5LCBwcm9iYWJseSBmaXJzdCBib290CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJwcm9ibGVtIHJlYWRpbmcgbmV0d29yayBzdGF0cyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgSW9VdGlscy5jbG9zZVF1aWV0bHkoZmlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVVaWRTdGF0c0xvYWRlZExvY2tlZCgpIHsKKyAgICAgICAgaWYgKCFtVWlkU3RhdHNMb2FkZWQpIHsKKyAgICAgICAgICAgIHJlYWRVaWRTdGF0c0xvY2tlZCgpOworICAgICAgICAgICAgbVVpZFN0YXRzTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkVWlkU3RhdHNMb2NrZWQoKSB7CisgICAgICAgIGlmIChMT0dWKSBTbG9nLnYoVEFHLCAicmVhZFVpZFN0YXRzTG9ja2VkKCkiKTsKKworICAgICAgICAvLyBjbGVhciBhbnkgZXhpc3Rpbmcgc3RhdHMgYW5kIHJlYWQgZnJvbSBkaXNrCisgICAgICAgIG1VaWRTdGF0cy5jbGVhcigpOworCisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmlzID0gbVVpZEZpbGUub3BlblJlYWQoKTsKKyAgICAgICAgICAgIGZpbmFsIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oZmlzKTsKKworICAgICAgICAgICAgLy8gdmVyaWZ5IGZpbGUgbWFnaWMgaGVhZGVyIGludGFjdAorICAgICAgICAgICAgZmluYWwgaW50IG1hZ2ljID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaWYgKG1hZ2ljICE9IEZJTEVfTUFHSUMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oInVuZXhwZWN0ZWQgbWFnaWM6ICIgKyBtYWdpYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSBWRVJTSU9OX1VJRF9JTklUOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVpZCA6PSBzaXplICooVUlEIE5ldHdvcmtTdGF0c0hpc3RvcnkpCisKKyAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGlzIGRhdGEgdmVyc2lvbiwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGdvb2QKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFwcGluZyBpbnRvIE5ldHdvcmtJZGVudGl0eVNldC4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgVkVSU0lPTl9VSURfV0lUSF9JREVOVDogeworICAgICAgICAgICAgICAgICAgICAvLyB1aWQgOj0gc2l6ZSAqKE5ldHdvcmtJZGVudGl0eVNldCBzaXplICooVUlEIE5ldHdvcmtTdGF0c0hpc3RvcnkpKQorCisgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhpcyBkYXRhIHZlcnNpb24sIHNpbmNlIHRoaXMgdmVyc2lvbiBvbmx5IGV4aXN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgc2hvcnQgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgVkVSU0lPTl9VSURfV0lUSF9UQUc6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdWlkIDo9IHNpemUgKihOZXR3b3JrSWRlbnRpdHlTZXQgc2l6ZSAqKFVJRCB0YWcgTmV0d29ya1N0YXRzSGlzdG9yeSkpCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpZmFjZVNpemUgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWZhY2VTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCA9IG5ldyBOZXR3b3JrSWRlbnRpdHlTZXQoaW4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRTaXplID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTG9uZ1NwYXJzZUFycmF5PE5ldHdvcmtTdGF0c0hpc3Rvcnk+IHVpZFN0YXRzID0gbmV3IExvbmdTcGFyc2VBcnJheTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1N0YXRzSGlzdG9yeT4oY2hpbGRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdWlkID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YWcgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwYWNrZWQgPSBwYWNrVWlkQW5kVGFnKHVpZCwgdGFnKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgaGlzdG9yeSA9IG5ldyBOZXR3b3JrU3RhdHNIaXN0b3J5KGluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRTdGF0cy5wdXQocGFja2VkLCBoaXN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbVVpZFN0YXRzLnB1dChpZGVudCwgdWlkU3RhdHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigidW5leHBlY3RlZCB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gbWlzc2luZyBzdGF0cyBpcyBva2F5LCBwcm9iYWJseSBmaXJzdCBib290CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNsb2cuZShUQUcsICJwcm9ibGVtIHJlYWRpbmcgdWlkIHN0YXRzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBJb1V0aWxzLmNsb3NlUXVpZXRseShmaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTmV0d29ya1N0YXRzTG9ja2VkKCkgeworICAgICAgICBpZiAoTE9HVikgU2xvZy52KFRBRywgIndyaXRlTmV0d29ya1N0YXRzTG9ja2VkKCkiKTsKKworICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBkdXBsaWNhdGluZyBzdGF0cyBhbmQgcmVsZWFzaW5nIGxvY2sgd2hpbGUgd3JpdGluZworCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcyA9IG1OZXR3b3JrRmlsZS5zdGFydFdyaXRlKCk7CisgICAgICAgICAgICBmaW5hbCBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGZvcyk7CisKKyAgICAgICAgICAgIG91dC53cml0ZUludChGSUxFX01BR0lDKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChWRVJTSU9OX05FVFdPUktfSU5JVCk7CisKKyAgICAgICAgICAgIG91dC53cml0ZUludChtTmV0d29ya1N0YXRzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKE5ldHdvcmtJZGVudGl0eVNldCBpZGVudCA6IG1OZXR3b3JrU3RhdHMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSBtTmV0d29ya1N0YXRzLmdldChpZGVudCk7CisgICAgICAgICAgICAgICAgaWRlbnQud3JpdGVUb1N0cmVhbShvdXQpOworICAgICAgICAgICAgICAgIGhpc3Rvcnkud3JpdGVUb1N0cmVhbShvdXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTmV0d29ya0ZpbGUuZmluaXNoV3JpdGUoZm9zKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbU5ldHdvcmtGaWxlLmZhaWxXcml0ZShmb3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVWlkU3RhdHNMb2NrZWQoKSB7CisgICAgICAgIGlmIChMT0dWKSBTbG9nLnYoVEFHLCAid3JpdGVVaWRTdGF0c0xvY2tlZCgpIik7CisKKyAgICAgICAgaWYgKCFtVWlkU3RhdHNMb2FkZWQpIHsKKyAgICAgICAgICAgIFNsb2cudyhUQUcsICJhc2tlZCB0byB3cml0ZSBVSUQgc3RhdHMgd2hlbiBub3QgbG9hZGVkOyBza2lwcGluZyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgZHVwbGljYXRpbmcgc3RhdHMgYW5kIHJlbGVhc2luZyBsb2NrIHdoaWxlIHdyaXRpbmcKKworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3MgPSBtVWlkRmlsZS5zdGFydFdyaXRlKCk7CisgICAgICAgICAgICBmaW5hbCBEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGZvcyk7CisKKyAgICAgICAgICAgIG91dC53cml0ZUludChGSUxFX01BR0lDKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChWRVJTSU9OX1VJRF9XSVRIX1RBRyk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gbVVpZFN0YXRzLnNpemUoKTsKKyAgICAgICAgICAgIG91dC53cml0ZUludChzaXplKTsKKyAgICAgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5U2V0IGlkZW50IDogbVVpZFN0YXRzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTG9uZ1NwYXJzZUFycmF5PE5ldHdvcmtTdGF0c0hpc3Rvcnk+IHVpZFN0YXRzID0gbVVpZFN0YXRzLmdldChpZGVudCk7CisgICAgICAgICAgICAgICAgaWRlbnQud3JpdGVUb1N0cmVhbShvdXQpOworCisgICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkU2l6ZSA9IHVpZFN0YXRzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY2hpbGRTaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcGFja2VkID0gdWlkU3RhdHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB1aWQgPSB1bnBhY2tVaWQocGFja2VkKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhZyA9IHVucGFja1RhZyhwYWNrZWQpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSB1aWRTdGF0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQodWlkKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KHRhZyk7CisgICAgICAgICAgICAgICAgICAgIGhpc3Rvcnkud3JpdGVUb1N0cmVhbShvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVVpZEZpbGUuZmluaXNoV3JpdGUoZm9zKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGZvcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbVVpZEZpbGUuZmFpbFdyaXRlKGZvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdywgU3RyaW5nW10gYXJncykgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oRFVNUCwgVEFHKTsKKworICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gYXJnU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKSB7CisgICAgICAgICAgICBhcmdTZXQuYWRkKGFyZyk7CisgICAgICAgIH0KKworICAgICAgICBzeW5jaHJvbml6ZWQgKG1TdGF0c0xvY2spIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIHRlc3RpbmcgY29kZSwgc2luY2UgaXQgY29ycnVwdHMgc3RhdHMKKyAgICAgICAgICAgIGlmIChhcmdTZXQuY29udGFpbnMoImdlbmVyYXRlIikpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZVJhbmRvbUxvY2tlZCgpOworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIkdlbmVyYXRlZCBzdHViIHN0YXRzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXJnU2V0LmNvbnRhaW5zKCJwb2xsIikpIHsKKyAgICAgICAgICAgICAgICBwZXJmb3JtUG9sbExvY2tlZCh0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCJGb3JjZWQgcG9sbCIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHcucHJpbnRsbigiQWN0aXZlIGludGVyZmFjZXM6Iik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBpZmFjZSA6IG1BY3RpdmVJZmFjZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBOZXR3b3JrSWRlbnRpdHlTZXQgaWRlbnQgPSBtQWN0aXZlSWZhY2VzLmdldChpZmFjZSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAgaWZhY2U9Iik7IHB3LnByaW50KGlmYWNlKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIGlkZW50PSIpOyBwdy5wcmludGxuKGlkZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdy5wcmludGxuKCJLbm93biBoaXN0b3JpY2FsIHN0YXRzOiIpOworICAgICAgICAgICAgZm9yIChOZXR3b3JrSWRlbnRpdHlTZXQgaWRlbnQgOiBtTmV0d29ya1N0YXRzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzSGlzdG9yeSBoaXN0b3J5ID0gbU5ldHdvcmtTdGF0cy5nZXQoaWRlbnQpOworICAgICAgICAgICAgICAgIHB3LnByaW50KCIgIGlkZW50PSIpOyBwdy5wcmludGxuKGlkZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGhpc3RvcnkuZHVtcCgiICAiLCBwdyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhcmdTZXQuY29udGFpbnMoImRldGFpbCIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgZXhwbGljaXRseSByZXF1ZXN0ZWQgd2l0aCBhcmd1bWVudCwgd2UncmUgb2theSB0byBsb2FkCisgICAgICAgICAgICAgICAgLy8gZnJvbSBkaXNrIGlmIG5vdCBhbHJlYWR5IGluIG1lbW9yeS4KKyAgICAgICAgICAgICAgICBlbnN1cmVVaWRTdGF0c0xvYWRlZExvY2tlZCgpOworCisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiRGV0YWlsZWQgVUlEIHN0YXRzOiIpOworICAgICAgICAgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5U2V0IGlkZW50IDogbVVpZFN0YXRzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgIGlkZW50PSIpOyBwdy5wcmludGxuKGlkZW50LnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExvbmdTcGFyc2VBcnJheTxOZXR3b3JrU3RhdHNIaXN0b3J5PiB1aWRTdGF0cyA9IG1VaWRTdGF0cy5nZXQoaWRlbnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVpZFN0YXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBhY2tlZCA9IHVpZFN0YXRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IHVucGFja1VpZChwYWNrZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRhZyA9IHVucGFja1RhZyhwYWNrZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTmV0d29ya1N0YXRzSGlzdG9yeSBoaXN0b3J5ID0gdWlkU3RhdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgVUlEPSIpOyBwdy5wcmludCh1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB0YWc9Iik7IHB3LnByaW50bG4odGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkuZHVtcCgiICAgICIsIHB3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIG9ubHkgZm9yIHRlbXBvcmFyeSB0ZXN0aW5nCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVSYW5kb21Mb2NrZWQoKSB7CisgICAgICAgIGxvbmcgbmV0d29ya0VuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBsb25nIG5ldHdvcmtTdGFydCA9IG5ldHdvcmtFbmQgLSBtU2V0dGluZ3MuZ2V0TmV0d29ya01heEhpc3RvcnkoKTsKKyAgICAgICAgbG9uZyBuZXR3b3JrUnggPSAzICogR0JfSU5fQllURVM7CisgICAgICAgIGxvbmcgbmV0d29ya1R4ID0gMiAqIEdCX0lOX0JZVEVTOworCisgICAgICAgIGxvbmcgdWlkRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGxvbmcgdWlkU3RhcnQgPSB1aWRFbmQgLSBtU2V0dGluZ3MuZ2V0VWlkTWF4SGlzdG9yeSgpOworICAgICAgICBsb25nIHVpZFJ4ID0gNTAwICogTUJfSU5fQllURVM7CisgICAgICAgIGxvbmcgdWlkVHggPSAxMDAgKiBNQl9JTl9CWVRFUzsKKworICAgICAgICBmaW5hbCBMaXN0PEFwcGxpY2F0aW9uSW5mbz4gaW5zdGFsbGVkQXBwcyA9IG1Db250ZXh0CisgICAgICAgICAgICAgICAgLmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0SW5zdGFsbGVkQXBwbGljYXRpb25zKDApOworCisgICAgICAgIG1OZXR3b3JrU3RhdHMuY2xlYXIoKTsKKyAgICAgICAgbVVpZFN0YXRzLmNsZWFyKCk7CisgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5U2V0IGlkZW50IDogbUFjdGl2ZUlmYWNlcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgZmluZE9yQ3JlYXRlTmV0d29ya1N0YXRzTG9ja2VkKGlkZW50KS5nZW5lcmF0ZVJhbmRvbSgKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya1N0YXJ0LCBuZXR3b3JrRW5kLCBuZXR3b3JrUngsIG5ldHdvcmtUeCk7CisKKyAgICAgICAgICAgIGZvciAoQXBwbGljYXRpb25JbmZvIGluZm8gOiBpbnN0YWxsZWRBcHBzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHVpZCA9IGluZm8udWlkOworICAgICAgICAgICAgICAgIGZpbmRPckNyZWF0ZVVpZFN0YXRzTG9ja2VkKGlkZW50LCB1aWQsIFRBR19OT05FKS5nZW5lcmF0ZVJhbmRvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpZFN0YXJ0LCB1aWRFbmQsIHVpZFJ4LCB1aWRUeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRlbHRhIGJldHdlZW4gdHdvIHtAbGluayBOZXR3b3JrU3RhdHN9IHNuYXBzaG90cywgd2hlcmUge0Bjb2RlCisgICAgICogYmVmb3JlfSBjYW4gYmUge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE5ldHdvcmtTdGF0cyBjb21wdXRlU3RhdHNEZWx0YShOZXR3b3JrU3RhdHMgYmVmb3JlLCBOZXR3b3JrU3RhdHMgY3VycmVudCkgeworICAgICAgICBpZiAoYmVmb3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50LnN1YnRyYWN0Q2xhbXBlZChiZWZvcmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBlc3RpbWF0ZU5ldHdvcmtCdWNrZXRzKCkgeworICAgICAgICByZXR1cm4gKGludCkgKG1TZXR0aW5ncy5nZXROZXR3b3JrTWF4SGlzdG9yeSgpIC8gbVNldHRpbmdzLmdldE5ldHdvcmtCdWNrZXREdXJhdGlvbigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBlc3RpbWF0ZVVpZEJ1Y2tldHMoKSB7CisgICAgICAgIHJldHVybiAoaW50KSAobVNldHRpbmdzLmdldFVpZE1heEhpc3RvcnkoKSAvIG1TZXR0aW5ncy5nZXRVaWRCdWNrZXREdXJhdGlvbigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZXN0aW1hdGVSZXNpemVCdWNrZXRzKE5ldHdvcmtTdGF0c0hpc3RvcnkgZXhpc3RpbmcsIGxvbmcgbmV3QnVja2V0RHVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChleGlzdGluZy5idWNrZXRDb3VudCAqIGV4aXN0aW5nLmJ1Y2tldER1cmF0aW9uIC8gbmV3QnVja2V0RHVyYXRpb24pOworICAgIH0KKworICAgIC8vIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwYWNrVWlkQW5kVGFnKGludCB1aWQsIGludCB0YWcpIHsKKyAgICAgICAgZmluYWwgbG9uZyB1aWRMb25nID0gdWlkOworICAgICAgICBmaW5hbCBsb25nIHRhZ0xvbmcgPSB0YWc7CisgICAgICAgIHJldHVybiAodWlkTG9uZyA8PCAzMikgfCAodGFnTG9uZyAmIDB4RkZGRkZGRkZMKTsKKyAgICB9CisKKyAgICAvLyBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGludCB1bnBhY2tVaWQobG9uZyBwYWNrZWQpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIChwYWNrZWQgPj4gMzIpOworICAgIH0KKworICAgIC8vIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgaW50IHVucGFja1RhZyhsb25nIHBhY2tlZCkgeworICAgICAgICByZXR1cm4gKGludCkgKHBhY2tlZCAmIDB4RkZGRkZGRkZMKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIGdpdmVuIHtAbGluayBOZXR3b3JrVGVtcGxhdGV9IG1hdGNoZXMgYW55IHtAbGluayBOZXR3b3JrSWRlbnRpdHl9CisgICAgICogaW4gdGhlIGdpdmVuIHtAbGluayBOZXR3b3JrSWRlbnRpdHlTZXR9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdGVtcGxhdGVNYXRjaGVzKE5ldHdvcmtUZW1wbGF0ZSB0ZW1wbGF0ZSwgTmV0d29ya0lkZW50aXR5U2V0IGlkZW50U2V0KSB7CisgICAgICAgIGZvciAoTmV0d29ya0lkZW50aXR5IGlkZW50IDogaWRlbnRTZXQpIHsKKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZS5tYXRjaGVzKGlkZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGV4dGVybmFsIHNldHRpbmdzIHRoYXQgcmVhZCBmcm9tIHtAbGluayBTZXR0aW5ncy5TZWN1cmV9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHROZXR3b3JrU3RhdHNTZXR0aW5ncyBpbXBsZW1lbnRzIE5ldHdvcmtTdGF0c1NldHRpbmdzIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworCisgICAgICAgIHB1YmxpYyBEZWZhdWx0TmV0d29ya1N0YXRzU2V0dGluZ3MoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBtUmVzb2x2ZXIgPSBjaGVja05vdE51bGwoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSk7CisgICAgICAgICAgICAvLyBUT0RPOiBhZGp1c3QgdGhlc2UgdGltaW5ncyBmb3IgcHJvZHVjdGlvbiBidWlsZHMKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9uZyBnZXRTZWN1cmVMb25nKFN0cmluZyBuYW1lLCBsb25nIGRlZikgeworICAgICAgICAgICAgcmV0dXJuIFNldHRpbmdzLlNlY3VyZS5nZXRMb25nKG1SZXNvbHZlciwgbmFtZSwgZGVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFBvbGxJbnRlcnZhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZWN1cmVMb25nKE5FVFNUQVRTX1BPTExfSU5URVJWQUwsIDE1ICogTUlOVVRFX0lOX01JTExJUyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UGVyc2lzdFRocmVzaG9sZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZWN1cmVMb25nKE5FVFNUQVRTX1BFUlNJU1RfVEhSRVNIT0xELCAxNiAqIEtCX0lOX0JZVEVTKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgbG9uZyBnZXROZXR3b3JrQnVja2V0RHVyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VjdXJlTG9uZyhORVRTVEFUU19ORVRXT1JLX0JVQ0tFVF9EVVJBVElPTiwgSE9VUl9JTl9NSUxMSVMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBsb25nIGdldE5ldHdvcmtNYXhIaXN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlY3VyZUxvbmcoTkVUU1RBVFNfTkVUV09SS19NQVhfSElTVE9SWSwgOTAgKiBEQVlfSU5fTUlMTElTKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRVaWRCdWNrZXREdXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZWN1cmVMb25nKE5FVFNUQVRTX1VJRF9CVUNLRVRfRFVSQVRJT04sIDIgKiBIT1VSX0lOX01JTExJUyk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VWlkTWF4SGlzdG9yeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTZWN1cmVMb25nKE5FVFNUQVRTX1VJRF9NQVhfSElTVE9SWSwgOTAgKiBEQVlfSU5fTUlMTElTKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRUYWdNYXhIaXN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlY3VyZUxvbmcoTkVUU1RBVFNfVEFHX01BWF9ISVNUT1JZLCAzMCAqIERBWV9JTl9NSUxMSVMpOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBsb25nIGdldFRpbWVDYWNoZU1heEFnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBEQVlfSU5fTUlMTElTOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9QYWNrYWdlTWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGUxZmJlMWMuLjVhOWRhZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1BhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RFRkFVTFQ7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLkNPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVEX1VTRVI7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9FTkFCTEVEOwogCiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYXBwLklNZWRpYUNvbnRhaW5lclNlcnZpY2U7CkBAIC03MDQ4LDcgKzcwNDksOCBAQAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBpbnQgbmV3U3RhdGUsIGZpbmFsIGludCBmbGFncykgewogICAgICAgICBpZiAoIShuZXdTdGF0ZSA9PSBDT01QT05FTlRfRU5BQkxFRF9TVEFURV9ERUZBVUxUCiAgICAgICAgICAgICAgIHx8IG5ld1N0YXRlID09IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0VOQUJMRUQKLSAgICAgICAgICAgICAgfHwgbmV3U3RhdGUgPT0gQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRUQpKSB7CisgICAgICAgICAgICAgIHx8IG5ld1N0YXRlID09IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVECisgICAgICAgICAgICAgIHx8IG5ld1N0YXRlID09IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVEX1VTRVIpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG5ldyBjb21wb25lbnQgc3RhdGU6ICIKICAgICAgICAgICAgICAgICAgICAgKyBuZXdTdGF0ZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1NldHRpbmdzLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9wbS9TZXR0aW5ncy5qYXZhCmluZGV4IDI3MjBiZjguLjVlZDc5ODggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3BtL1NldHRpbmdzLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvcG0vU2V0dGluZ3MuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ERUZBVUxUOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRElTQUJMRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5DT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRF9VU0VSOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuQ09NUE9ORU5UX0VOQUJMRURfU1RBVEVfRU5BQkxFRDsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuRmFzdFhtbFNlcmlhbGl6ZXI7CkBAIC0xOTEyLDYgKzE5MTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGlmIChwYWNrYWdlU2V0dGluZ3MuZW5hYmxlZCA9PSBDT01QT05FTlRfRU5BQkxFRF9TVEFURV9ESVNBQkxFRAorICAgICAgICAgICAgICAgIHx8IHBhY2thZ2VTZXR0aW5ncy5lbmFibGVkID09IENPTVBPTkVOVF9FTkFCTEVEX1NUQVRFX0RJU0FCTEVEX1VTRVIKICAgICAgICAgICAgICAgICB8fCAocGFja2FnZVNldHRpbmdzLnBrZyAhPSBudWxsICYmICFwYWNrYWdlU2V0dGluZ3MucGtnLmFwcGxpY2F0aW9uSW5mby5lbmFibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwYWNrYWdlU2V0dGluZ3MuZW5hYmxlZCA9PSBDT01QT05FTlRfRU5BQkxFRF9TVEFURV9ERUZBVUxUKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZU1hbmFnZXIuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JEZXZpY2VNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdmOWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JEZXZpY2VNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW4KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLnVzYjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ29udGVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkFjY2Vzc29yeTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CitpbXBvcnQgYW5kcm9pZC5vcy5zdG9yYWdlLlN0b3JhZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3Muc3RvcmFnZS5TdG9yYWdlVm9sdW1lOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm9zLlVFdmVudE9ic2VydmVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFVzYkRldmljZU1hbmFnZXIgbWFuYWdlcyBVU0Igc3RhdGUgaW4gZGV2aWNlIG1vZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2JEZXZpY2VNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBVc2JEZXZpY2VNYW5hZ2VyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPRyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9TVEFURV9NQVRDSCA9CisgICAgICAgICAgICAiREVWUEFUSD0vZGV2aWNlcy92aXJ0dWFsL2FuZHJvaWRfdXNiL2FuZHJvaWQwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTT1JZX1NUQVJUX01BVENIID0KKyAgICAgICAgICAgICJERVZQQVRIPS9kZXZpY2VzL3ZpcnR1YWwvbWlzYy91c2JfYWNjZXNzb3J5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVOQ1RJT05TX1BBVEggPQorICAgICAgICAgICAgIi9zeXMvY2xhc3MvYW5kcm9pZF91c2IvYW5kcm9pZDAvZnVuY3Rpb25zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfUEFUSCA9CisgICAgICAgICAgICAiL3N5cy9jbGFzcy9hbmRyb2lkX3VzYi9hbmRyb2lkMC9zdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1NfU1RPUkFHRV9GSUxFX1BBVEggPQorICAgICAgICAgICAgIi9zeXMvY2xhc3MvYW5kcm9pZF91c2IvZl9tYXNzX3N0b3JhZ2UvbHVuL2ZpbGUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19VUERBVEVfU1RBVEUgPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRU5BQkxFX0FEQiA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfUFJJTUFSWV9GVU5DVElPTiA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TRVRfREVGQVVMVF9GVU5DVElPTiA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19TWVNURU1fUkVBRFkgPSA0OworCisgICAgLy8gRGVsYXkgZm9yIGRlYm91bmNpbmcgVVNCIGRpc2Nvbm5lY3RzLgorICAgIC8vIFdlIG9mdGVuIGdldCByYXBpZCBjb25uZWN0L2Rpc2Nvbm5lY3QgZXZlbnRzIHdoZW4gZW5hYmxpbmcgVVNCIGZ1bmN0aW9ucywKKyAgICAvLyB3aGljaCBuZWVkIGRlYm91bmNpbmcuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDEwMDA7CisKKyAgICBwcml2YXRlIFVzYkhhbmRsZXIgbUhhbmRsZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIG1TeXN0ZW1SZWFkeTsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtQ29udGVudFJlc29sdmVyOworICAgIHByaXZhdGUgZmluYWwgVXNiU2V0dGluZ3NNYW5hZ2VyIG1TZXR0aW5nc01hbmFnZXI7CisgICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzVXNiQWNjZXNzb3J5OworCisgICAgLy8gZm9yIFVTQiBjb25uZWN0ZWQgbm90aWZpY2F0aW9uCisgICAgcHJpdmF0ZSBib29sZWFuIG1Vc2JOb3RpZmljYXRpb25TaG93bjsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVVzZVVzYk5vdGlmaWNhdGlvbjsKKyAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtVXNiTm90aWZpY2F0aW9uOworCisgICAgLy8gZm9yIGFkYiBjb25uZWN0ZWQgbm90aWZpY2F0aW9uCisgICAgcHJpdmF0ZSBib29sZWFuIG1BZGJOb3RpZmljYXRpb25TaG93bjsKKyAgICBwcml2YXRlIE5vdGlmaWNhdGlvbiBtQWRiTm90aWZpY2F0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBtQWRiRW5hYmxlZDsKKworCisgICAgcHJpdmF0ZSBjbGFzcyBBZGJTZXR0aW5nc09ic2VydmVyIGV4dGVuZHMgQ29udGVudE9ic2VydmVyIHsKKyAgICAgICAgcHVibGljIEFkYlNldHRpbmdzT2JzZXJ2ZXIoKSB7CisgICAgICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoYm9vbGVhbiBzZWxmQ2hhbmdlKSB7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZSA9IChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5BREJfRU5BQkxFRCwgMCkgPiAwKTsKKyAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKE1TR19FTkFCTEVfQURCLCBlbmFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVVzYk5vdGlmaWNhdGlvbihib29sZWFuIGNvbm5lY3RlZCkgeworICAgICAgICBpZiAobU5vdGlmaWNhdGlvbk1hbmFnZXIgPT0gbnVsbCB8fCAhbVVzZVVzYk5vdGlmaWNhdGlvbikgcmV0dXJuOworICAgICAgICBpZiAoY29ubmVjdGVkKSB7CisgICAgICAgICAgICBpZiAoIW1Vc2JOb3RpZmljYXRpb25TaG93bikgeworICAgICAgICAgICAgICAgIFJlc291cmNlcyByID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gci5nZXRUZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcudXNiX3ByZWZlcmVuY2VzX25vdGlmaWNhdGlvbl90aXRsZSk7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIG1lc3NhZ2UgPSByLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy51c2JfcHJlZmVyZWNlX25vdGlmaWNhdGlvbl9tZXNzYWdlKTsKKworICAgICAgICAgICAgICAgIGlmIChtVXNiTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVVzYk5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbVVzYk5vdGlmaWNhdGlvbi5pY29uID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c19kYXRhX3VzYjsKKyAgICAgICAgICAgICAgICAgICAgbVVzYk5vdGlmaWNhdGlvbi53aGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbVVzYk5vdGlmaWNhdGlvbi5mbGFncyA9IE5vdGlmaWNhdGlvbi5GTEFHX09OR09JTkdfRVZFTlQ7CisgICAgICAgICAgICAgICAgICAgIG1Vc2JOb3RpZmljYXRpb24udGlja2VyVGV4dCA9IHRpdGxlOworICAgICAgICAgICAgICAgICAgICBtVXNiTm90aWZpY2F0aW9uLmRlZmF1bHRzID0gMDsgLy8gcGxlYXNlIGJlIHF1aWV0CisgICAgICAgICAgICAgICAgICAgIG1Vc2JOb3RpZmljYXRpb24uc291bmQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBtVXNiTm90aWZpY2F0aW9uLnZpYnJhdGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKTsKKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc3lzdGVtdWkudXNiLlVzYlByZWZlcmVuY2VBY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KG1Db250ZXh0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LCAwKTsKKworICAgICAgICAgICAgICAgIG1Vc2JOb3RpZmljYXRpb24uc2V0TGF0ZXN0RXZlbnRJbmZvKG1Db250ZXh0LCB0aXRsZSwgbWVzc2FnZSwgcGkpOworCisgICAgICAgICAgICAgICAgbVVzYk5vdGlmaWNhdGlvblNob3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy51c2JfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uX3RpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgbVVzYk5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChtVXNiTm90aWZpY2F0aW9uU2hvd24pIHsKKyAgICAgICAgICAgIG1Vc2JOb3RpZmljYXRpb25TaG93biA9IGZhbHNlOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY2FuY2VsKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy51c2JfcHJlZmVyZW5jZXNfbm90aWZpY2F0aW9uX3RpdGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBZGJOb3RpZmljYXRpb24oYm9vbGVhbiBhZGJFbmFibGVkKSB7CisgICAgICAgIGlmIChtTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKSByZXR1cm47CisgICAgICAgIGlmIChhZGJFbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoIjAiLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicGVyc2lzdC5hZGIubm90aWZ5IikpKSByZXR1cm47CisKKyAgICAgICAgICAgIGlmICghbUFkYk5vdGlmaWNhdGlvblNob3duKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBtQ29udGV4dC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSByLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5hZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSk7CisgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIG1lc3NhZ2UgPSByLmdldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5hZGJfYWN0aXZlX25vdGlmaWNhdGlvbl9tZXNzYWdlKTsKKworICAgICAgICAgICAgICAgIGlmIChtQWRiTm90aWZpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbiA9IG5ldyBOb3RpZmljYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbi5pY29uID0gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kcmF3YWJsZS5zdGF0X3N5c19hZGI7CisgICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24ud2hlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb24uZmxhZ3MgPSBOb3RpZmljYXRpb24uRkxBR19PTkdPSU5HX0VWRU5UOworICAgICAgICAgICAgICAgICAgICBtQWRiTm90aWZpY2F0aW9uLnRpY2tlclRleHQgPSB0aXRsZTsKKyAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbi5kZWZhdWx0cyA9IDA7IC8vIHBsZWFzZSBiZSBxdWlldAorICAgICAgICAgICAgICAgICAgICBtQWRiTm90aWZpY2F0aW9uLnNvdW5kID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbUFkYk5vdGlmaWNhdGlvbi52aWJyYXRlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLkFDVElPTl9BUFBMSUNBVElPTl9ERVZFTE9QTUVOVF9TRVRUSU5HUyk7CisgICAgICAgICAgICAgICAgaW50ZW50LnNldEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVudC5GTEFHX0FDVElWSVRZX1JFU0VUX1RBU0tfSUZfTkVFREVEKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSBhcmUgaGFyZC1jb2RpbmcgdGhlIGNvbXBvbmVudCBiZWNhdXNlIHRoaXMgaXMKKyAgICAgICAgICAgICAgICAvLyBhbiBpbXBvcnRhbnQgc2VjdXJpdHkgVUkgdGhhdCB3ZSBkb24ndCB3YW50IGFueW9uZQorICAgICAgICAgICAgICAgIC8vIGludGVyY2VwdGluZy4KKyAgICAgICAgICAgICAgICBpbnRlbnQuc2V0Q29tcG9uZW50KG5ldyBDb21wb25lbnROYW1lKCJjb20uYW5kcm9pZC5zZXR0aW5ncyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuc2V0dGluZ3MuRGV2ZWxvcG1lbnRTZXR0aW5ncyIpKTsKKyAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gUGVuZGluZ0ludGVudC5nZXRBY3Rpdml0eShtQ29udGV4dCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVudCwgMCk7CisKKyAgICAgICAgICAgICAgICBtQWRiTm90aWZpY2F0aW9uLnNldExhdGVzdEV2ZW50SW5mbyhtQ29udGV4dCwgdGl0bGUsIG1lc3NhZ2UsIHBpKTsKKworICAgICAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb25TaG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcuYWRiX2FjdGl2ZV9ub3RpZmljYXRpb25fdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRiTm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtQWRiTm90aWZpY2F0aW9uU2hvd24pIHsKKyAgICAgICAgICAgIG1BZGJOb3RpZmljYXRpb25TaG93biA9IGZhbHNlOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIuY2FuY2VsKAorICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLnN0cmluZy5hZGJfYWN0aXZlX25vdGlmaWNhdGlvbl90aXRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIExpc3RlbnMgZm9yIHVldmVudCBtZXNzYWdlcyBmcm9tIHRoZSBrZXJuZWwgdG8gbW9uaXRvciB0aGUgVVNCIHN0YXRlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBVRXZlbnRPYnNlcnZlciBtVUV2ZW50T2JzZXJ2ZXIgPSBuZXcgVUV2ZW50T2JzZXJ2ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblVFdmVudChVRXZlbnRPYnNlcnZlci5VRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgeworICAgICAgICAgICAgICAgIFNsb2cudihUQUcsICJVU0IgVUVWRU5UOiAiICsgZXZlbnQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IGV2ZW50LmdldCgiVVNCX1NUQVRFIik7CisgICAgICAgICAgICBTdHJpbmcgYWNjZXNzb3J5ID0gZXZlbnQuZ2V0KCJBQ0NFU1NPUlkiKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIudXBkYXRlU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiU1RBUlQiLmVxdWFscyhhY2Nlc3NvcnkpKSB7CisgICAgICAgICAgICAgICAgU2xvZy5kKFRBRywgImdvdCBhY2Nlc3Nvcnkgc3RhcnQiKTsKKyAgICAgICAgICAgICAgICBzZXRQcmltYXJ5RnVuY3Rpb24oVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgVXNiRGV2aWNlTWFuYWdlcihDb250ZXh0IGNvbnRleHQsIFVzYlNldHRpbmdzTWFuYWdlciBzZXR0aW5nc01hbmFnZXIpIHsKKyAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtQ29udGVudFJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKKyAgICAgICAgbVNldHRpbmdzTWFuYWdlciA9IHNldHRpbmdzTWFuYWdlcjsKKyAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBtSGFzVXNiQWNjZXNzb3J5ID0gcG0uaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX1VTQl9BQ0NFU1NPUlkpOworCisgICAgICAgIC8vIGNyZWF0ZSBhIHRocmVhZCBmb3Igb3VyIEhhbmRsZXIKKyAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiVXNiRGV2aWNlTWFuYWdlciIsCisgICAgICAgICAgICAgICAgUHJvY2Vzcy5USFJFQURfUFJJT1JJVFlfQkFDS0dST1VORCkgeworICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Mb29wZXJQcmVwYXJlZCgpIHsKKyAgICAgICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBVc2JIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworCisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyID0gKE5vdGlmaWNhdGlvbk1hbmFnZXIpCisgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICAvLyBXZSBkbyBub3Qgc2hvdyB0aGUgVVNCIG5vdGlmaWNhdGlvbiBpZiB0aGUgcHJpbWFyeSB2b2x1bWUgc3VwcG9ydHMgbWFzcyBzdG9yYWdlLgorICAgICAgICAvLyBUaGUgbGVnYWN5IG1hc3Mgc3RvcmFnZSBVSSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAgICAgICAgYm9vbGVhbiBtYXNzU3RvcmFnZVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBTdG9yYWdlTWFuYWdlciBzdG9yYWdlTWFuYWdlciA9IChTdG9yYWdlTWFuYWdlcikKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU1RPUkFHRV9TRVJWSUNFKTsKKyAgICAgICAgU3RvcmFnZVZvbHVtZVtdIHZvbHVtZXMgPSBzdG9yYWdlTWFuYWdlci5nZXRWb2x1bWVMaXN0KCk7CisgICAgICAgIGlmICh2b2x1bWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIG1hc3NTdG9yYWdlU3VwcG9ydGVkID0gdm9sdW1lc1swXS5hbGxvd01hc3NTdG9yYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgbVVzZVVzYk5vdGlmaWNhdGlvbiA9ICFtYXNzU3RvcmFnZVN1cHBvcnRlZDsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIEFEQl9FTkFCTEVEIHNldHRpbmcgdmFsdWUgbWF0Y2hlcyB0aGUgY3VycmVudCBzdGF0ZQorICAgICAgICBTZXR0aW5ncy5TZWN1cmUucHV0SW50KG1Db250ZW50UmVzb2x2ZXIsIFNldHRpbmdzLlNlY3VyZS5BREJfRU5BQkxFRCwgbUFkYkVuYWJsZWQgPyAxIDogMCk7CisKKyAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfU1lTVEVNX1JFQURZKTsKKyAgICB9CisKKyAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFkZEZ1bmN0aW9uKFN0cmluZyBmdW5jdGlvbnMsIFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICBpZiAoIWNvbnRhaW5zRnVuY3Rpb24oZnVuY3Rpb25zLCBmdW5jdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChmdW5jdGlvbnMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25zICs9ICIsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ1bmN0aW9ucyArPSBmdW5jdGlvbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnVuY3Rpb25zOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdmVGdW5jdGlvbihTdHJpbmcgZnVuY3Rpb25zLCBTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBmdW5jdGlvbnMuc3BsaXQoIiwiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLmVxdWFscyhzcGxpdFtpXSkpIHsKKyAgICAgICAgICAgICAgICBzcGxpdFtpXSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gc3BsaXRbaV07CisgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc0Z1bmN0aW9uKFN0cmluZyBmdW5jdGlvbnMsIFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICBpbnQgaW5kZXggPSBmdW5jdGlvbnMuaW5kZXhPZihmdW5jdGlvbik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBmdW5jdGlvbnMuY2hhckF0KGluZGV4IC0gMSkgIT0gJywnKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGludCBjaGFyQWZ0ZXIgPSBpbmRleCArIGZ1bmN0aW9uLmxlbmd0aCgpOworICAgICAgICBpZiAoY2hhckFmdGVyIDwgZnVuY3Rpb25zLmxlbmd0aCgpICYmIGZ1bmN0aW9ucy5jaGFyQXQoY2hhckFmdGVyKSAhPSAnLCcpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBVc2JIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisKKyAgICAgICAgLy8gY3VycmVudCBVU0Igc3RhdGUKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29uZmlndXJlZDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbUN1cnJlbnRGdW5jdGlvbnM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1EZWZhdWx0RnVuY3Rpb25zOworICAgICAgICBwcml2YXRlIFVzYkFjY2Vzc29yeSBtQ3VycmVudEFjY2Vzc29yeTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EZWZlckFjY2Vzc29yeUF0dGFjaGVkOworCisgICAgICAgIHB1YmxpYyBVc2JIYW5kbGVyKCkgeworICAgICAgICAgICAgLy8gUmVhZCBpbml0aWFsIFVTQiBzdGF0ZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudEZ1bmN0aW9ucyA9IEZpbGVVdGlscy5yZWFkVGV4dEZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShGVU5DVElPTlNfUEFUSCksIDAsIG51bGwpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBtRGVmYXVsdEZ1bmN0aW9ucyA9IG1DdXJyZW50RnVuY3Rpb25zOworICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IEZpbGVVdGlscy5yZWFkVGV4dEZpbGUobmV3IEZpbGUoU1RBVEVfUEFUSCksIDAsIG51bGwpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZShzdGF0ZSk7CisKKyAgICAgICAgICAgICAgICBtQWRiRW5hYmxlZCA9IGNvbnRhaW5zRnVuY3Rpb24obUN1cnJlbnRGdW5jdGlvbnMsIFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0FEQik7CisKKyAgICAgICAgICAgICAgICAvLyBVcGdyYWRlIHN0ZXAgZm9yIHByZXZpb3VzIHZlcnNpb25zIHRoYXQgdXNlZCBwZXJzaXN0LnNlcnZpY2UuYWRiLmVuYWJsZQorICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnNlcnZpY2UuYWRiLmVuYWJsZSIsICIiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZW5hYmxlID0gdmFsdWUuY2hhckF0KDApOworICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlID09ICcxJykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWRiRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmFibGUgPT0gJzAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRBZGJFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC5zZXJ2aWNlLmFkYi5lbmFibGUiLCAiIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgb2JzZXJ2ZXIgdG8gbGlzdGVuIGZvciBzZXR0aW5ncyBjaGFuZ2VzCisgICAgICAgICAgICAgICAgbUNvbnRlbnRSZXNvbHZlci5yZWdpc3RlckNvbnRlbnRPYnNlcnZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzLlNlY3VyZS5nZXRVcmlGb3IoU2V0dGluZ3MuU2VjdXJlLkFEQl9FTkFCTEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG5ldyBBZGJTZXR0aW5nc09ic2VydmVyKCkpOworCisgICAgICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIFVTQiBjb25maWd1cmF0aW9uIGNoYW5nZXMKKyAgICAgICAgICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoVVNCX1NUQVRFX01BVENIKTsKKyAgICAgICAgICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoQUNDRVNTT1JZX1NUQVJUX01BVENIKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgIkVycm9yIGluaXRpYWxpemluZyBVc2JIYW5kbGVyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShpbnQgd2hhdCwgYm9vbGVhbiBhcmcpIHsKKyAgICAgICAgICAgIHJlbW92ZU1lc3NhZ2VzKHdoYXQpOworICAgICAgICAgICAgTWVzc2FnZSBtID0gTWVzc2FnZS5vYnRhaW4odGhpcywgd2hhdCk7CisgICAgICAgICAgICBtLmFyZzEgPSAoYXJnID8gMSA6IDApOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UobSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShpbnQgd2hhdCwgT2JqZWN0IGFyZykgeworICAgICAgICAgICAgcmVtb3ZlTWVzc2FnZXMod2hhdCk7CisgICAgICAgICAgICBNZXNzYWdlIG0gPSBNZXNzYWdlLm9idGFpbih0aGlzLCB3aGF0KTsKKyAgICAgICAgICAgIG0ub2JqID0gYXJnOworICAgICAgICAgICAgc2VuZE1lc3NhZ2UobSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShTdHJpbmcgc3RhdGUpIHsKKyAgICAgICAgICAgIGludCBjb25uZWN0ZWQsIGNvbmZpZ3VyZWQ7CisKKyAgICAgICAgICAgIGlmICgiRElTQ09OTkVDVEVEIi5lcXVhbHMoc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gMDsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVkID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkNPTk5FQ1RFRCIuZXF1YWxzKHN0YXRlKSkgeworICAgICAgICAgICAgICAgIGNvbm5lY3RlZCA9IDE7CisgICAgICAgICAgICAgICAgY29uZmlndXJlZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJDT05GSUdVUkVEIi5lcXVhbHMoc3RhdGUpKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVkID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2xvZy5lKFRBRywgInVua25vd24gc3RhdGUgIiArIHN0YXRlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1NUQVRFKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4odGhpcywgTVNHX1VQREFURV9TVEFURSk7CisgICAgICAgICAgICBtc2cuYXJnMSA9IGNvbm5lY3RlZDsKKyAgICAgICAgICAgIG1zZy5hcmcyID0gY29uZmlndXJlZDsKKyAgICAgICAgICAgIC8vIGRlYm91bmNlIGRpc2Nvbm5lY3RzIHRvIGF2b2lkIHByb2JsZW1zIGJyaW5naW5nIHVwIFVTQiB0ZXRoZXJpbmcKKyAgICAgICAgICAgIHNlbmRNZXNzYWdlRGVsYXllZChtc2csIChjb25uZWN0ZWQgPT0gMCkgPyBVUERBVEVfREVMQVkgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZXRVc2JDb25maWcoU3RyaW5nIGNvbmZpZykgeworICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgU3lzdGVtUHJvcGVydGllcy5zZXQoInN5cy51c2IuY29uZmlnIiwgY29uZmlnKTsKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgLy8gZ2l2ZSB1cCBhZnRlciAxIHNlY29uZC4KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIFN0YXRlIHRyYW5zaXRpb24gaXMgZG9uZSB3aGVuIHN5cy51c2IuY29uZi5kb25lIGlzIHNldCB0byB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmVxdWFscyhTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgic3lzLnVzYi5zdGF0ZSIpKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IGFnYWluIGluIDUwbXMKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRGdW5jdGlvbnMoU3RyaW5nIGZ1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKCFtQ3VycmVudEZ1bmN0aW9ucy5lcXVhbHMoZnVuY3Rpb25zKSkgeworICAgICAgICAgICAgICAgIGlmICghc2V0VXNiQ29uZmlnKCJub25lIikgfHwgIXNldFVzYkNvbmZpZyhmdW5jdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBzd2l0Y2ggVVNCIGNvbmZpZ3VyYXRpb24gdG8gIiArIGZ1bmN0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldmVydCB0byBwcmV2aW91cyBjb25maWd1cmF0aW9uIGlmIHdlIGZhaWwKKyAgICAgICAgICAgICAgICAgICAgc2V0VXNiQ29uZmlnKG1DdXJyZW50RnVuY3Rpb25zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEZ1bmN0aW9ucyA9IGZ1bmN0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0QWRiRW5hYmxlZChib29sZWFuIGVuYWJsZSkgeworICAgICAgICAgICAgaWYgKGVuYWJsZSAhPSBtQWRiRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIG1BZGJFbmFibGVkID0gZW5hYmxlOworICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbnM7CisgICAgICAgICAgICAgICAgaWYgKGVuYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgPSBhZGRGdW5jdGlvbihtQ3VycmVudEZ1bmN0aW9ucywgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQURCKTsKKyAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRGdW5jdGlvbnMgPSBhZGRGdW5jdGlvbihtRGVmYXVsdEZ1bmN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BREIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyA9IHJlbW92ZUZ1bmN0aW9uKG1DdXJyZW50RnVuY3Rpb25zLCBVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BREIpOworICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEZ1bmN0aW9ucyA9IHJlbW92ZUZ1bmN0aW9uKG1EZWZhdWx0RnVuY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0FEQik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuc2V0KCJwZXJzaXN0LnN5cy51c2IuY29uZmlnIiwgbURlZmF1bHRGdW5jdGlvbnMpOworICAgICAgICAgICAgICAgIHNldEN1cnJlbnRGdW5jdGlvbnMoZnVuY3Rpb25zKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVBZGJOb3RpZmljYXRpb24obUFkYkVuYWJsZWQgJiYgbUNvbm5lY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2V0RW5hYmxlZEZ1bmN0aW9ucyhTdHJpbmcgZnVuY3Rpb25MaXN0KSB7CisgICAgICAgICAgICBpZiAobUFkYkVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbkxpc3QgPSBhZGRGdW5jdGlvbihmdW5jdGlvbkxpc3QsIFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0FEQik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZ1bmN0aW9uTGlzdCA9IHJlbW92ZUZ1bmN0aW9uKGZ1bmN0aW9uTGlzdCwgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQURCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEN1cnJlbnRGdW5jdGlvbnMoZnVuY3Rpb25MaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50QWNjZXNzb3J5KCkgeworICAgICAgICAgICAgaWYgKCFtSGFzVXNiQWNjZXNzb3J5KSByZXR1cm47CisKKyAgICAgICAgICAgIGlmIChtQ29uZmlndXJlZCkgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuYXRpdmVHZXRBY2Nlc3NvcnlTdHJpbmdzKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEFjY2Vzc29yeSA9IG5ldyBVc2JBY2Nlc3Nvcnkoc3RyaW5ncyk7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVudGVyaW5nIFVTQiBhY2Nlc3NvcnkgbW9kZTogIiArIG1DdXJyZW50QWNjZXNzb3J5KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVmZXIgYWNjZXNzb3J5QXR0YWNoZWQgaWYgc3lzdGVtIGlzIG5vdCByZWFkeQorICAgICAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLmFjY2Vzc29yeUF0dGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlckFjY2Vzc29yeUF0dGFjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghbUNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBhY2Nlc3NvcnkgbW9kZSBpcyBvZmYKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVzdG9yZSBkZWZhdWx0IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImV4aXRlZCBVU0IgYWNjZXNzb3J5IG1vZGUiKTsKKyAgICAgICAgICAgICAgICBzZXRFbmFibGVkRnVuY3Rpb25zKG1EZWZhdWx0RnVuY3Rpb25zKTsKKworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEFjY2Vzc29yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuYWNjZXNzb3J5RGV0YWNoZWQobUN1cnJlbnRBY2Nlc3NvcnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QWNjZXNzb3J5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlVXNiU3RhdGUoKSB7CisgICAgICAgICAgICAvLyBzZW5kIGEgc3RpY2t5IGJyb2FkY2FzdCBjb250YWluaW5nIGN1cnJlbnQgVVNCIHN0YXRlCisgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfU1RBVEUpOworICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5VU0JfQ09OTkVDVEVELCBtQ29ubmVjdGVkKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLlVTQl9DT05GSUdVUkVELCBtQ29uZmlndXJlZCk7CisKKyAgICAgICAgICAgIGlmIChtQ3VycmVudEZ1bmN0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gZnVuY3Rpb25zID0gbUN1cnJlbnRGdW5jdGlvbnMuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bmN0aW9ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoZnVuY3Rpb25zW2ldLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Db250ZXh0LnNlbmRTdGlja3lCcm9hZGNhc3QoaW50ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisgICAgICAgICAgICBTdHJpbmcgZnVuY3Rpb247CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfU1RBVEU6CisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSAobXNnLmFyZzEgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25maWd1cmVkID0gKG1zZy5hcmcyID09IDEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2JOb3RpZmljYXRpb24obUNvbm5lY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYk5vdGlmaWNhdGlvbihtQWRiRW5hYmxlZCAmJiBtQ29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zRnVuY3Rpb24obUN1cnJlbnRGdW5jdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudEFjY2Vzc29yeSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtQ29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGRlZmF1bHRzIHdoZW4gVVNCIGlzIGRpc2Nvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudEZ1bmN0aW9ucyhtRGVmYXVsdEZ1bmN0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1SZWFkeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19FTkFCTEVfQURCOgorICAgICAgICAgICAgICAgICAgICBzZXRBZGJFbmFibGVkKG1zZy5hcmcxID09IDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfUFJJTUFSWV9GVU5DVElPTjoKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSAoU3RyaW5nKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiA9IG1EZWZhdWx0RnVuY3Rpb25zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNldEVuYWJsZWRGdW5jdGlvbnMoZnVuY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1TR19TRVRfREVGQVVMVF9GVU5DVElPTjoKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSAoU3RyaW5nKW1zZy5vYmo7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWRiRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSBhZGRGdW5jdGlvbihmdW5jdGlvbiwgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQURCKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLnNldCgicGVyc2lzdC5zeXMudXNiLmNvbmZpZyIsIGZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRGdW5jdGlvbnMgPSBmdW5jdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfU1lTVEVNX1JFQURZOgorICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2JOb3RpZmljYXRpb24obUNvbm5lY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUFkYk5vdGlmaWNhdGlvbihtQWRiRW5hYmxlZCAmJiBtQ29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNiU3RhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50QWNjZXNzb3J5ICE9IG51bGwgJiYgbURlZmVyQWNjZXNzb3J5QXR0YWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuYWNjZXNzb3J5QXR0YWNoZWQobUN1cnJlbnRBY2Nlc3NvcnkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVzYkFjY2Vzc29yeSBnZXRDdXJyZW50QWNjZXNzb3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50QWNjZXNzb3J5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcpIHsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgVVNCIERldmljZSBTdGF0ZToiKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBDdXJyZW50IEZ1bmN0aW9uczogIiArIG1DdXJyZW50RnVuY3Rpb25zKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBEZWZhdWx0IEZ1bmN0aW9uczogIiArIG1EZWZhdWx0RnVuY3Rpb25zKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBtQ29ubmVjdGVkOiAiICsgbUNvbm5lY3RlZCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgbUNvbmZpZ3VyZWQ6ICIgKyBtQ29uZmlndXJlZCk7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgbUN1cnJlbnRBY2Nlc3Nvcnk6ICIgKyBtQ3VycmVudEFjY2Vzc29yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXR1cm5zIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgVVNCIGFjY2Vzc29yeSAqLworICAgIHB1YmxpYyBVc2JBY2Nlc3NvcnkgZ2V0Q3VycmVudEFjY2Vzc29yeSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGVyLmdldEN1cnJlbnRBY2Nlc3NvcnkoKTsKKyAgICB9CisKKyAgICAvKiBvcGVucyB0aGUgY3VycmVudGx5IGF0dGFjaGVkIFVTQiBhY2Nlc3NvcnkgKi8KKyAgICAgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5BY2Nlc3NvcnkoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICAgICAgVXNiQWNjZXNzb3J5IGN1cnJlbnRBY2Nlc3NvcnkgPSBtSGFuZGxlci5nZXRDdXJyZW50QWNjZXNzb3J5KCk7CisgICAgICAgICAgICBpZiAoY3VycmVudEFjY2Vzc29yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gYWNjZXNzb3J5IGF0dGFjaGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWN1cnJlbnRBY2Nlc3NvcnkuZXF1YWxzKGFjY2Vzc29yeSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3IgPSBhY2Nlc3NvcnkudG9TdHJpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgYWNjZXNzb3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY3VycmVudEFjY2Vzc29yeTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKGFjY2Vzc29yeSk7CisgICAgICAgICAgICByZXR1cm4gbmF0aXZlT3BlbkFjY2Vzc29yeSgpOworICAgICAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmltYXJ5RnVuY3Rpb24oU3RyaW5nIGZ1bmN0aW9uKSB7CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKE1TR19TRVRfUFJJTUFSWV9GVU5DVElPTiwgZnVuY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRGdW5jdGlvbihTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgaWYgKGZ1bmN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKE1TR19TRVRfREVGQVVMVF9GVU5DVElPTiwgZnVuY3Rpb24pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hc3NTdG9yYWdlQmFja2luZ0ZpbGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgcGF0aCA9ICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ1RvRmlsZShNQVNTX1NUT1JBR0VfRklMRV9QQVRILCBwYXRoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICBTbG9nLmUoVEFHLCAiZmFpbGVkIHRvIHdyaXRlIHRvICIgKyBNQVNTX1NUT1JBR0VfRklMRV9QQVRIKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGR1bXAoRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIHB3KSB7CisgICAgICAgIGlmIChtSGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSGFuZGxlci5kdW1wKGZkLCBwdyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmdbXSBuYXRpdmVHZXRBY2Nlc3NvcnlTdHJpbmdzKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlT3BlbkFjY2Vzc29yeSgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZVNldHRpbmdzTWFuYWdlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZVNldHRpbmdzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTBiMTE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JEZXZpY2VTZXR0aW5nc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLnVzYjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkFjY2Vzc29yeTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JEZXZpY2U7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5GaWxlVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUJvb2xlYW5BcnJheTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuWG1sOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuY29udGVudC5QYWNrYWdlTW9uaXRvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkZhc3RYbWxTZXJpYWxpemVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7Ci0KLWltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwotaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sU2VyaWFsaXplcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1jbGFzcyBVc2JEZXZpY2VTZXR0aW5nc01hbmFnZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJVc2JEZXZpY2VTZXR0aW5nc01hbmFnZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgc1NldHRpbmdzRmlsZSA9IG5ldyBGaWxlKCIvZGF0YS9zeXN0ZW0vdXNiX2RldmljZV9tYW5hZ2VyLnhtbCIpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwotCi0gICAgLy8gVGVtcG9yYXJ5IG1hcHBpbmcgVVNCIGRldmljZSBuYW1lIHRvIGxpc3Qgb2YgVUlEcyB3aXRoIHBlcm1pc3Npb25zIGZvciB0aGUgZGV2aWNlCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3BhcnNlQm9vbGVhbkFycmF5PiBtRGV2aWNlUGVybWlzc2lvbk1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUJvb2xlYW5BcnJheT4oKTsKLSAgICAvLyBUZW1wb3JhcnkgbWFwcGluZyBVc2JBY2Nlc3NvcnkgdG8gbGlzdCBvZiBVSURzIHdpdGggcGVybWlzc2lvbnMgZm9yIHRoZSBhY2Nlc3NvcnkKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8VXNiQWNjZXNzb3J5LCBTcGFyc2VCb29sZWFuQXJyYXk+IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPFVzYkFjY2Vzc29yeSwgU3BhcnNlQm9vbGVhbkFycmF5PigpOwotICAgIC8vIE1hcHMgRGV2aWNlRmlsdGVyIHRvIHVzZXIgcHJlZmVycmVkIGFwcGxpY2F0aW9uIHBhY2thZ2UKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8RGV2aWNlRmlsdGVyLCBTdHJpbmc+IG1EZXZpY2VQcmVmZXJlbmNlTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPERldmljZUZpbHRlciwgU3RyaW5nPigpOwotICAgIC8vIE1hcHMgQWNjZXNzb3J5RmlsdGVyIHRvIHVzZXIgcHJlZmVycmVkIGFwcGxpY2F0aW9uIHBhY2thZ2UKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8QWNjZXNzb3J5RmlsdGVyLCBTdHJpbmc+IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPEFjY2Vzc29yeUZpbHRlciwgU3RyaW5nPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZGVzY3JpYmUgYSBVU0IgZGV2aWNlLgotICAgIC8vIFdoZW4gdXNlZCBpbiBIYXNoTWFwcyBhbGwgdmFsdWVzIG11c3QgYmUgc3BlY2lmaWVkLAotICAgIC8vIGJ1dCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQgZm9yIGFueSBvZiB0aGUgZmllbGRzIGluCi0gICAgLy8gdGhlIHBhY2thZ2UgbWV0YS1kYXRhLgotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERldmljZUZpbHRlciB7Ci0gICAgICAgIC8vIFVTQiBWZW5kb3IgSUQgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVuZG9ySWQ7Ci0gICAgICAgIC8vIFVTQiBQcm9kdWN0IElEIChvciAtMSBmb3IgdW5zcGVjaWZpZWQpCi0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVByb2R1Y3RJZDsKLSAgICAgICAgLy8gVVNCIGRldmljZSBvciBpbnRlcmZhY2UgY2xhc3MgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtQ2xhc3M7Ci0gICAgICAgIC8vIFVTQiBkZXZpY2Ugc3ViY2xhc3MgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtU3ViY2xhc3M7Ci0gICAgICAgIC8vIFVTQiBkZXZpY2UgcHJvdG9jb2wgKG9yIC0xIGZvciB1bnNwZWNpZmllZCkKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtUHJvdG9jb2w7Ci0KLSAgICAgICAgcHVibGljIERldmljZUZpbHRlcihpbnQgdmlkLCBpbnQgcGlkLCBpbnQgY2xhc3osIGludCBzdWJjbGFzcywgaW50IHByb3RvY29sKSB7Ci0gICAgICAgICAgICBtVmVuZG9ySWQgPSB2aWQ7Ci0gICAgICAgICAgICBtUHJvZHVjdElkID0gcGlkOwotICAgICAgICAgICAgbUNsYXNzID0gY2xhc3o7Ci0gICAgICAgICAgICBtU3ViY2xhc3MgPSBzdWJjbGFzczsKLSAgICAgICAgICAgIG1Qcm90b2NvbCA9IHByb3RvY29sOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERldmljZUZpbHRlcihVc2JEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgICAgICBtVmVuZG9ySWQgPSBkZXZpY2UuZ2V0VmVuZG9ySWQoKTsKLSAgICAgICAgICAgIG1Qcm9kdWN0SWQgPSBkZXZpY2UuZ2V0UHJvZHVjdElkKCk7Ci0gICAgICAgICAgICBtQ2xhc3MgPSBkZXZpY2UuZ2V0RGV2aWNlQ2xhc3MoKTsKLSAgICAgICAgICAgIG1TdWJjbGFzcyA9IGRldmljZS5nZXREZXZpY2VTdWJjbGFzcygpOwotICAgICAgICAgICAgbVByb3RvY29sID0gZGV2aWNlLmdldERldmljZVByb3RvY29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERldmljZUZpbHRlciByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpbnQgdmVuZG9ySWQgPSAtMTsKLSAgICAgICAgICAgIGludCBwcm9kdWN0SWQgPSAtMTsKLSAgICAgICAgICAgIGludCBkZXZpY2VDbGFzcyA9IC0xOwotICAgICAgICAgICAgaW50IGRldmljZVN1YmNsYXNzID0gLTE7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlUHJvdG9jb2wgPSAtMTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVOYW1lKGkpOwotICAgICAgICAgICAgICAgIC8vIEFsbCBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBpbnRzCi0gICAgICAgICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludChwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKCJ2ZW5kb3ItaWQiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB2ZW5kb3JJZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb2R1Y3QtaWQiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWQgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJjbGFzcyIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZUNsYXNzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic3ViY2xhc3MiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdWJjbGFzcyA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb3RvY29sIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlUHJvdG9jb2wgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERldmljZUZpbHRlcih2ZW5kb3JJZCwgcHJvZHVjdElkLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VDbGFzcywgZGV2aWNlU3ViY2xhc3MsIGRldmljZVByb3RvY29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKFhtbFNlcmlhbGl6ZXIgc2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInVzYi1kZXZpY2UiKTsKLSAgICAgICAgICAgIGlmIChtVmVuZG9ySWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAidmVuZG9yLWlkIiwgSW50ZWdlci50b1N0cmluZyhtVmVuZG9ySWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvZHVjdElkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInByb2R1Y3QtaWQiLCBJbnRlZ2VyLnRvU3RyaW5nKG1Qcm9kdWN0SWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2xhc3MgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAiY2xhc3MiLCBJbnRlZ2VyLnRvU3RyaW5nKG1DbGFzcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TdWJjbGFzcyAhPSAtMSkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJzdWJjbGFzcyIsIEludGVnZXIudG9TdHJpbmcobVN1YmNsYXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByb3RvY29sICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInByb3RvY29sIiwgSW50ZWdlci50b1N0cmluZyhtUHJvdG9jb2wpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJ1c2ItZGV2aWNlIik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF0Y2hlcyhpbnQgY2xhc3osIGludCBzdWJjbGFzcywgaW50IHByb3RvY29sKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtQ2xhc3MgPT0gLTEgfHwgY2xhc3ogPT0gbUNsYXNzKSAmJgotICAgICAgICAgICAgICAgICAgICAobVN1YmNsYXNzID09IC0xIHx8IHN1YmNsYXNzID09IG1TdWJjbGFzcykgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1Qcm90b2NvbCA9PSAtMSB8fCBwcm90b2NvbCA9PSBtUHJvdG9jb2wpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoVXNiRGV2aWNlIGRldmljZSkgewotICAgICAgICAgICAgaWYgKG1WZW5kb3JJZCAhPSAtMSAmJiBkZXZpY2UuZ2V0VmVuZG9ySWQoKSAhPSBtVmVuZG9ySWQpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtUHJvZHVjdElkICE9IC0xICYmIGRldmljZS5nZXRQcm9kdWN0SWQoKSAhPSBtUHJvZHVjdElkKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGRldmljZSBjbGFzcy9zdWJjbGFzcy9wcm90b2NvbAotICAgICAgICAgICAgaWYgKG1hdGNoZXMoZGV2aWNlLmdldERldmljZUNsYXNzKCksIGRldmljZS5nZXREZXZpY2VTdWJjbGFzcygpLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlUHJvdG9jb2woKSkpIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAvLyBpZiBkZXZpY2UgZG9lc24ndCBtYXRjaCwgY2hlY2sgdGhlIGludGVyZmFjZXMKLSAgICAgICAgICAgIGludCBjb3VudCA9IGRldmljZS5nZXRJbnRlcmZhY2VDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVXNiSW50ZXJmYWNlIGludGYgPSBkZXZpY2UuZ2V0SW50ZXJmYWNlKGkpOwotICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyhpbnRmLmdldEludGVyZmFjZUNsYXNzKCksIGludGYuZ2V0SW50ZXJmYWNlU3ViY2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGYuZ2V0SW50ZXJmYWNlUHJvdG9jb2woKSkpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKERldmljZUZpbHRlciBmKSB7Ci0gICAgICAgICAgICBpZiAobVZlbmRvcklkICE9IC0xICYmIGYubVZlbmRvcklkICE9IG1WZW5kb3JJZCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Qcm9kdWN0SWQgIT0gLTEgJiYgZi5tUHJvZHVjdElkICE9IG1Qcm9kdWN0SWQpIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgLy8gY2hlY2sgZGV2aWNlIGNsYXNzL3N1YmNsYXNzL3Byb3RvY29sCi0gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcyhmLm1DbGFzcywgZi5tU3ViY2xhc3MsIGYubVByb3RvY29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgLy8gY2FuJ3QgY29tcGFyZSBpZiB3ZSBoYXZlIHdpbGRjYXJkIHN0cmluZ3MKLSAgICAgICAgICAgIGlmIChtVmVuZG9ySWQgPT0gLTEgfHwgbVByb2R1Y3RJZCA9PSAtMSB8fAotICAgICAgICAgICAgICAgICAgICBtQ2xhc3MgPT0gLTEgfHwgbVN1YmNsYXNzID09IC0xIHx8IG1Qcm90b2NvbCA9PSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEZXZpY2VGaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gKERldmljZUZpbHRlcilvYmo7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChmaWx0ZXIubVZlbmRvcklkID09IG1WZW5kb3JJZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1Qcm9kdWN0SWQgPT0gbVByb2R1Y3RJZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1DbGFzcyA9PSBtQ2xhc3MgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5tU3ViY2xhc3MgPT0gbVN1YmNsYXNzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubVByb3RvY29sID09IG1Qcm90b2NvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVXNiRGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IChVc2JEZXZpY2Upb2JqOwotICAgICAgICAgICAgICAgIHJldHVybiAoZGV2aWNlLmdldFZlbmRvcklkKCkgPT0gbVZlbmRvcklkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0UHJvZHVjdElkKCkgPT0gbVByb2R1Y3RJZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZUNsYXNzKCkgPT0gbUNsYXNzICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlU3ViY2xhc3MoKSA9PSBtU3ViY2xhc3MgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VQcm90b2NvbCgpID09IG1Qcm90b2NvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoKChtVmVuZG9ySWQgPDwgMTYpIHwgbVByb2R1Y3RJZCkgXgotICAgICAgICAgICAgICAgICAgICAoKG1DbGFzcyA8PCAxNikgfCAobVN1YmNsYXNzIDw8IDgpIHwgbVByb3RvY29sKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiRGV2aWNlRmlsdGVyW21WZW5kb3JJZD0iICsgbVZlbmRvcklkICsgIixtUHJvZHVjdElkPSIgKyBtUHJvZHVjdElkICsKLSAgICAgICAgICAgICAgICAgICAgIixtQ2xhc3M9IiArIG1DbGFzcyArICIsbVN1YmNsYXNzPSIgKyBtU3ViY2xhc3MgKwotICAgICAgICAgICAgICAgICAgICAiLG1Qcm90b2NvbD0iICsgbVByb3RvY29sICsgIl0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgVVNCIGFjY2Vzc29yeS4KLSAgICAvLyBXaGVuIHVzZWQgaW4gSGFzaE1hcHMgYWxsIHZhbHVlcyBtdXN0IGJlIHNwZWNpZmllZCwKLSAgICAvLyBidXQgd2lsZGNhcmRzIGNhbiBiZSB1c2VkIGZvciBhbnkgb2YgdGhlIGZpZWxkcyBpbgotICAgIC8vIHRoZSBwYWNrYWdlIG1ldGEtZGF0YS4KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY2Nlc3NvcnlGaWx0ZXIgewotICAgICAgICAvLyBVU0IgYWNjZXNzb3J5IG1hbnVmYWN0dXJlciAob3IgbnVsbCBmb3IgdW5zcGVjaWZpZWQpCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbU1hbnVmYWN0dXJlcjsKLSAgICAgICAgLy8gVVNCIGFjY2Vzc29yeSBtb2RlbCAob3IgbnVsbCBmb3IgdW5zcGVjaWZpZWQpCi0gICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbU1vZGVsOwotICAgICAgICAvLyBVU0IgYWNjZXNzb3J5IHZlcnNpb24gKG9yIG51bGwgZm9yIHVuc3BlY2lmaWVkKQotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1WZXJzaW9uOwotCi0gICAgICAgIHB1YmxpYyBBY2Nlc3NvcnlGaWx0ZXIoU3RyaW5nIG1hbnVmYWN0dXJlciwgU3RyaW5nIG1vZGVsLCBTdHJpbmcgdmVyc2lvbikgewotICAgICAgICAgICAgbU1hbnVmYWN0dXJlciA9IG1hbnVmYWN0dXJlcjsKLSAgICAgICAgICAgIG1Nb2RlbCA9IG1vZGVsOwotICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFjY2Vzc29yeUZpbHRlcihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7Ci0gICAgICAgICAgICBtTWFudWZhY3R1cmVyID0gYWNjZXNzb3J5LmdldE1hbnVmYWN0dXJlcigpOwotICAgICAgICAgICAgbU1vZGVsID0gYWNjZXNzb3J5LmdldE1vZGVsKCk7Ci0gICAgICAgICAgICBtVmVyc2lvbiA9IGFjY2Vzc29yeS5nZXRWZXJzaW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIEFjY2Vzc29yeUZpbHRlciByZWFkKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQotICAgICAgICAgICAgICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTdHJpbmcgbWFudWZhY3R1cmVyID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBtb2RlbCA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIm1hbnVmYWN0dXJlciIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlciA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm1vZGVsIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ2ZXJzaW9uIi5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NvcnlGaWx0ZXIobWFudWZhY3R1cmVyLCBtb2RlbCwgdmVyc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIpdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInVzYi1hY2Nlc3NvcnkiKTsKLSAgICAgICAgICAgIGlmIChtTWFudWZhY3R1cmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAibWFudWZhY3R1cmVyIiwgbU1hbnVmYWN0dXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAibW9kZWwiLCBtTW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1WZXJzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAidmVyc2lvbiIsIG1WZXJzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJ1c2ItYWNjZXNzb3J5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFVzYkFjY2Vzc29yeSBhY2MpIHsKLSAgICAgICAgICAgIGlmIChtTWFudWZhY3R1cmVyICE9IG51bGwgJiYgIWFjYy5nZXRNYW51ZmFjdHVyZXIoKS5lcXVhbHMobU1hbnVmYWN0dXJlcikpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtTW9kZWwgIT0gbnVsbCAmJiAhYWNjLmdldE1vZGVsKCkuZXF1YWxzKG1Nb2RlbCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtVmVyc2lvbiAhPSBudWxsICYmICFhY2MuZ2V0VmVyc2lvbigpLmVxdWFscyhtVmVyc2lvbikpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhBY2Nlc3NvcnlGaWx0ZXIgZikgewotICAgICAgICAgICAgaWYgKG1NYW51ZmFjdHVyZXIgIT0gbnVsbCAmJiAhZi5tTWFudWZhY3R1cmVyLmVxdWFscyhtTWFudWZhY3R1cmVyKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Nb2RlbCAhPSBudWxsICYmICFmLm1Nb2RlbC5lcXVhbHMobU1vZGVsKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKG1WZXJzaW9uICE9IG51bGwgJiYgIWYubVZlcnNpb24uZXF1YWxzKG1WZXJzaW9uKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIC8vIGNhbid0IGNvbXBhcmUgaWYgd2UgaGF2ZSB3aWxkY2FyZCBzdHJpbmdzCi0gICAgICAgICAgICBpZiAobU1hbnVmYWN0dXJlciA9PSBudWxsIHx8IG1Nb2RlbCA9PSBudWxsIHx8IG1WZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgQWNjZXNzb3J5RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IChBY2Nlc3NvcnlGaWx0ZXIpb2JqOwotICAgICAgICAgICAgICAgIHJldHVybiAobU1hbnVmYWN0dXJlci5lcXVhbHMoZmlsdGVyLm1NYW51ZmFjdHVyZXIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtTW9kZWwuZXF1YWxzKGZpbHRlci5tTW9kZWwpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBtVmVyc2lvbi5lcXVhbHMoZmlsdGVyLm1WZXJzaW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgVXNiQWNjZXNzb3J5KSB7Ci0gICAgICAgICAgICAgICAgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSA9IChVc2JBY2Nlc3Nvcnkpb2JqOwotICAgICAgICAgICAgICAgIHJldHVybiAobU1hbnVmYWN0dXJlci5lcXVhbHMoYWNjZXNzb3J5LmdldE1hbnVmYWN0dXJlcigpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGVsLmVxdWFscyhhY2Nlc3NvcnkuZ2V0TW9kZWwoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WZXJzaW9uLmVxdWFscyhhY2Nlc3NvcnkuZ2V0VmVyc2lvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1NYW51ZmFjdHVyZXIgPT0gbnVsbCA/IDAgOiBtTWFudWZhY3R1cmVyLmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAgICAgICAgICAgKG1Nb2RlbCA9PSBudWxsID8gMCA6IG1Nb2RlbC5oYXNoQ29kZSgpKSBeCi0gICAgICAgICAgICAgICAgICAgIChtVmVyc2lvbiA9PSBudWxsID8gMCA6IG1WZXJzaW9uLmhhc2hDb2RlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJBY2Nlc3NvcnlGaWx0ZXJbbU1hbnVmYWN0dXJlcj1cIiIgKyBtTWFudWZhY3R1cmVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiLCBtTW9kZWw9XCIiICsgbU1vZGVsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiLCBtVmVyc2lvbj1cIiIgKyBtVmVyc2lvbiArICJcIl0iOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVBhY2thZ2VNb25pdG9yIGV4dGVuZHMgUGFja2FnZU1vbml0b3IgewotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGFja2FnZUFkZGVkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgewotICAgICAgICAgICAgaGFuZGxlUGFja2FnZVVwZGF0ZShwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhY2thZ2VDaGFuZ2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCwgU3RyaW5nW10gY29tcG9uZW50cykgewotICAgICAgICAgICAgaGFuZGxlUGFja2FnZVVwZGF0ZShwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhY2thZ2VSZW1vdmVkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHVpZCkgewotICAgICAgICAgICAgY2xlYXJEZWZhdWx0cyhwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTXlQYWNrYWdlTW9uaXRvciBtUGFja2FnZU1vbml0b3IgPSBuZXcgTXlQYWNrYWdlTW9uaXRvcigpOwotCi0gICAgcHVibGljIFVzYkRldmljZVNldHRpbmdzTWFuYWdlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJlYWRTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1QYWNrYWdlTW9uaXRvci5yZWdpc3Rlcihjb250ZXh0LCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZFByZWZlcmVuY2UoWG1sUHVsbFBhcnNlciBwYXJzZXIpCi0gICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOwotICAgICAgICBpbnQgY291bnQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoInBhY2thZ2UiLmVxdWFscyhwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKSkpIHsKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOwotICAgICAgICBpZiAoInVzYi1kZXZpY2UiLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IERldmljZUZpbHRlci5yZWFkKHBhcnNlcik7Ci0gICAgICAgICAgICBtRGV2aWNlUHJlZmVyZW5jZU1hcC5wdXQoZmlsdGVyLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoInVzYi1hY2Nlc3NvcnkiLmVxdWFscyhwYXJzZXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IEFjY2Vzc29yeUZpbHRlci5yZWFkKHBhcnNlcik7Ci0gICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5wdXQoZmlsdGVyLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVhZFNldHRpbmdzTG9ja2VkKCkgewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc1NldHRpbmdzRmlsZSk7Ci0gICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFhtbC5uZXdQdWxsUGFyc2VyKCk7Ci0gICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQoc3RyZWFtLCBudWxsKTsKLQotICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgIHdoaWxlIChwYXJzZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCJwcmVmZXJlbmNlIi5lcXVhbHModGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzZXR0aW5ncyBmaWxlIG5vdCBmb3VuZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXJyb3IgcmVhZGluZyBzZXR0aW5ncyBmaWxlLCBkZWxldGluZyB0byBzdGFydCBmcmVzaCIsIGUpOwotICAgICAgICAgICAgc1NldHRpbmdzRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVTZXR0aW5nc0xvY2tlZCgpIHsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmc3RyID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc1NldHRpbmdzRmlsZSk7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ3cml0aW5nIHNldHRpbmdzIHRvICIgKyBmc3RyKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHN0ciA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShmc3RyKTsKLSAgICAgICAgICAgIEZhc3RYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgRmFzdFhtbFNlcmlhbGl6ZXIoKTsKLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2V0T3V0cHV0KHN0ciwgInV0Zi04Iik7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0RG9jdW1lbnQobnVsbCwgdHJ1ZSk7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWxwdWxsLm9yZy92MS9kb2MvZmVhdHVyZXMuaHRtbCNpbmRlbnQtb3V0cHV0IiwgdHJ1ZSk7Ci0gICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJzZXR0aW5ncyIpOwotCi0gICAgICAgICAgICBmb3IgKERldmljZUZpbHRlciBmaWx0ZXIgOiBtRGV2aWNlUHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc3RhcnRUYWcobnVsbCwgInByZWZlcmVuY2UiKTsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAicGFja2FnZSIsIG1EZXZpY2VQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKLSAgICAgICAgICAgICAgICBmaWx0ZXIud3JpdGUoc2VyaWFsaXplcik7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5lbmRUYWcobnVsbCwgInByZWZlcmVuY2UiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyIDogbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJwcmVmZXJlbmNlIik7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInBhY2thZ2UiLCBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7Ci0gICAgICAgICAgICAgICAgZmlsdGVyLndyaXRlKHNlcmlhbGl6ZXIpOwotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJwcmVmZXJlbmNlIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJzZXR0aW5ncyIpOwotICAgICAgICAgICAgc2VyaWFsaXplci5lbmREb2N1bWVudCgpOwotCi0gICAgICAgICAgICBzdHIuZmx1c2goKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5zeW5jKGZzdHIpOwotICAgICAgICAgICAgc3RyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciB3cml0aW5nIHNldHRpbmdzIGZpbGUsIGRlbGV0aW5nIHRvIHN0YXJ0IGZyZXNoIiwgZSk7Ci0gICAgICAgICAgICBzU2V0dGluZ3NGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiBhIHBhY2thZ2UgbWF0Y2hlcyBhIGRldmljZSBvciBhY2Nlc3NvcnkuCi0gICAgLy8gT25seSBvbmUgb2YgZGV2aWNlIGFuZCBhY2Nlc3Nvcnkgc2hvdWxkIGJlIG5vbi1udWxsLgotICAgIHByaXZhdGUgYm9vbGVhbiBwYWNrYWdlTWF0Y2hlc0xvY2tlZChSZXNvbHZlSW5mbyBpbmZvLCBTdHJpbmcgbWV0YURhdGFOYW1lLAotICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSwgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICBBY3Rpdml0eUluZm8gYWkgPSBpbmZvLmFjdGl2aXR5SW5mbzsKLQotICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VyID0gYWkubG9hZFhtbE1ldGFEYXRhKG1QYWNrYWdlTWFuYWdlciwgbWV0YURhdGFOYW1lKTsKLSAgICAgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIm5vIG1ldGEtZGF0YSBmb3IgIiArIGluZm8pOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgIHdoaWxlIChwYXJzZXIuZ2V0RXZlbnRUeXBlKCkgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFnTmFtZSA9IHBhcnNlci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmICJ1c2ItZGV2aWNlIi5lcXVhbHModGFnTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IERldmljZUZpbHRlci5yZWFkKHBhcnNlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhY2Nlc3NvcnkgIT0gbnVsbCAmJiAidXNiLWFjY2Vzc29yeSIuZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgPSBBY2Nlc3NvcnlGaWx0ZXIucmVhZChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMoYWNjZXNzb3J5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBsb2FkIGNvbXBvbmVudCBpbmZvICIgKyBpbmZvLnRvU3RyaW5nKCksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IGdldERldmljZU1hdGNoZXNMb2NrZWQoVXNiRGV2aWNlIGRldmljZSwgSW50ZW50IGludGVudCkgewotICAgICAgICBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PFJlc29sdmVJbmZvPigpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiByZXNvbHZlSW5mb3MgPSBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRBY3Rpdml0aWVzKGludGVudCwKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgaW50IGNvdW50ID0gcmVzb2x2ZUluZm9zLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IHJlc29sdmVJbmZvcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocGFja2FnZU1hdGNoZXNMb2NrZWQocmVzb2x2ZUluZm8sIGludGVudC5nZXRBY3Rpb24oKSwgZGV2aWNlLCBudWxsKSkgewotICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKHJlc29sdmVJbmZvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWF0Y2hlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gZ2V0QWNjZXNzb3J5TWF0Y2hlc0xvY2tlZCgKLSAgICAgICAgICAgIFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZXNvbHZlSW5mbz4oKTsKLSAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gcmVzb2x2ZUluZm9zID0gbVBhY2thZ2VNYW5hZ2VyLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhpbnRlbnQsCi0gICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIGludCBjb3VudCA9IHJlc29sdmVJbmZvcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSByZXNvbHZlSW5mb3MuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VNYXRjaGVzTG9ja2VkKHJlc29sdmVJbmZvLCBpbnRlbnQuZ2V0QWN0aW9uKCksIG51bGwsIGFjY2Vzc29yeSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChyZXNvbHZlSW5mbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hdGNoZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGV2aWNlQXR0YWNoZWQoVXNiRGV2aWNlIGRldmljZSkgewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0FUVEFDSEVEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotCi0gICAgICAgIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlczsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtYXRjaGVzID0gZ2V0RGV2aWNlTWF0Y2hlc0xvY2tlZChkZXZpY2UsIGludGVudCk7Ci0gICAgICAgICAgICAvLyBMYXVuY2ggb3VyIGRlZmF1bHQgYWN0aXZpdHkgZGlyZWN0bHksIGlmIHdlIGhhdmUgb25lLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHdpbGwgc3RhcnQgdGhlIFVzYlJlc29sdmVyQWN0aXZpdHkgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlLgotICAgICAgICAgICAgZGVmYXVsdFBhY2thZ2UgPSBtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQobmV3IERldmljZUZpbHRlcihkZXZpY2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc29sdmVBY3Rpdml0eShpbnRlbnQsIG1hdGNoZXMsIGRlZmF1bHRQYWNrYWdlLCBkZXZpY2UsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRldmljZURldGFjaGVkKFVzYkRldmljZSBkZXZpY2UpIHsKLSAgICAgICAgLy8gY2xlYXIgdGVtcG9yYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZGV2aWNlCi0gICAgICAgIG1EZXZpY2VQZXJtaXNzaW9uTWFwLnJlbW92ZShkZXZpY2UuZ2V0RGV2aWNlTmFtZSgpKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0RFVEFDSEVEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICBMb2cuZChUQUcsICJ1c2JEZXZpY2VSZW1vdmVkLCBzZW5kaW5nICIgKyBpbnRlbnQpOwotICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWNjZXNzb3J5QXR0YWNoZWQoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChVc2JNYW5hZ2VyLkFDVElPTl9VU0JfQUNDRVNTT1JZX0FUVEFDSEVEKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotCi0gICAgICAgIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlczsKLSAgICAgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtYXRjaGVzID0gZ2V0QWNjZXNzb3J5TWF0Y2hlc0xvY2tlZChhY2Nlc3NvcnksIGludGVudCk7Ci0gICAgICAgICAgICAvLyBMYXVuY2ggb3VyIGRlZmF1bHQgYWN0aXZpdHkgZGlyZWN0bHksIGlmIHdlIGhhdmUgb25lLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHdpbGwgc3RhcnQgdGhlIFVzYlJlc29sdmVyQWN0aXZpdHkgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2hvb3NlLgotICAgICAgICAgICAgZGVmYXVsdFBhY2thZ2UgPSBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5nZXQobmV3IEFjY2Vzc29yeUZpbHRlcihhY2Nlc3NvcnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc29sdmVBY3Rpdml0eShpbnRlbnQsIG1hdGNoZXMsIGRlZmF1bHRQYWNrYWdlLCBudWxsLCBhY2Nlc3NvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjY2Vzc29yeURldGFjaGVkKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKLSAgICAgICAgLy8gY2xlYXIgdGVtcG9yYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgYWNjZXNzb3J5Ci0gICAgICAgIG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLnJlbW92ZShhY2Nlc3NvcnkpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KAotICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9BQ0NFU1NPUllfREVUQUNIRUQpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVzb2x2ZUFjdGl2aXR5KEludGVudCBpbnRlbnQsIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlcywKLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZSwgVXNiRGV2aWNlIGRldmljZSwgVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgewotICAgICAgICBpbnQgY291bnQgPSBtYXRjaGVzLnNpemUoKTsKLQotICAgICAgICAvLyBkb24ndCBzaG93IHRoZSByZXNvbHZlciBhY3Rpdml0eSBpZiB0aGVyZSBhcmUgbm8gY2hvaWNlcyBhdmFpbGFibGUKLSAgICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGlmIChhY2Nlc3NvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBhY2Nlc3NvcnkuZ2V0VXJpKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBVUkkgdG8gdXNlcgotICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBVc2JSZXNvbHZlckFjdGl2aXR5IHNvIHVzZXIgY2FuIGNob29zZSBhbiBhY3Rpdml0eQotICAgICAgICAgICAgICAgICAgICBJbnRlbnQgZGlhbG9nSW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JBY2Nlc3NvcnlVcmlBY3Rpdml0eSIpOwotICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpYWxvZ0ludGVudC5wdXRFeHRyYSgidXJpIiwgdXJpKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoZGlhbG9nSW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJ1bmFibGUgdG8gc3RhcnQgVXNiQWNjZXNzb3J5VXJpQWN0aXZpdHkiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZG8gbm90aGluZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb2x2ZUluZm8gZGVmYXVsdFJJID0gbnVsbDsKLSAgICAgICAgaWYgKGNvdW50ID09IDEgJiYgZGVmYXVsdFBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBzaW5nbGUgY2hvaWNlIGlzIG9uIHRoZSBzeXN0ZW0gcGFydGl0aW9uLgotICAgICAgICAgICAgLy8gSWYgc28sIHRyZWF0IGl0IGFzIG91ciBkZWZhdWx0IHdpdGhvdXQgY2FsbGluZyBVc2JSZXNvbHZlckFjdGl2aXR5Ci0gICAgICAgICAgICBSZXNvbHZlSW5mbyBySW5mbyA9IG1hdGNoZXMuZ2V0KDApOwotICAgICAgICAgICAgaWYgKHJJbmZvLmFjdGl2aXR5SW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgIHJJbmZvLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8gIT0gbnVsbCAmJgotICAgICAgICAgICAgICAgICAgICAockluZm8uYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby5mbGFncyAmIEFwcGxpY2F0aW9uSW5mby5GTEFHX1NZU1RFTSkgIT0gMCkgewotICAgICAgICAgICAgICAgIGRlZmF1bHRSSSA9IHJJbmZvOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRSSSA9PSBudWxsICYmIGRlZmF1bHRQYWNrYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIGRlZmF1bHQgYWN0aXZpdHkKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJJbmZvID0gbWF0Y2hlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJJbmZvLmFjdGl2aXR5SW5mbyAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UGFja2FnZS5lcXVhbHMockluZm8uYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UkkgPSBySW5mbzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRSSSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBncmFudCBwZXJtaXNzaW9uIGZvciBkZWZhdWx0IGFjdGl2aXR5Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBncmFudERldmljZVBlcm1pc3Npb24oZGV2aWNlLCBkZWZhdWx0UkkuYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby51aWQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3NvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGdyYW50QWNjZXNzb3J5UGVybWlzc2lvbihhY2Nlc3NvcnksIGRlZmF1bHRSSS5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvLnVpZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHN0YXJ0IGRlZmF1bHQgYWN0aXZpdHkgZGlyZWN0bHkKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnNldENvbXBvbmVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKGRlZmF1bHRSSS5hY3Rpdml0eUluZm8ucGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRSSS5hY3Rpdml0eUluZm8ubmFtZSkpOwotICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInN0YXJ0QWN0aXZpdHkgZmFpbGVkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJbnRlbnQgcmVzb2x2ZXJJbnRlbnQgPSBuZXcgSW50ZW50KCk7Ci0gICAgICAgICAgICByZXNvbHZlckludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RhcnQgVXNiQ29uZmlybUFjdGl2aXR5IGlmIHRoZXJlIGlzIG9ubHkgb25lIGNob2ljZQotICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JDb25maXJtQWN0aXZpdHkiKTsKLSAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5wdXRFeHRyYSgicmluZm8iLCBtYXRjaGVzLmdldCgwKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzdGFydCBVc2JSZXNvbHZlckFjdGl2aXR5IHNvIHVzZXIgY2FuIGNob29zZSBhbiBhY3Rpdml0eQotICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JSZXNvbHZlckFjdGl2aXR5Iik7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0UGFyY2VsYWJsZUFycmF5TGlzdEV4dHJhKCJybGlzdCIsIG1hdGNoZXMpOwotICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQsIGludGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnN0YXJ0QWN0aXZpdHkocmVzb2x2ZXJJbnRlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAidW5hYmxlIHRvIHN0YXJ0IGFjdGl2aXR5ICIgKyByZXNvbHZlckludGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2xlYXJDb21wYXRpYmxlTWF0Y2hlc0xvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUsIERldmljZUZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIGZvciAoRGV2aWNlRmlsdGVyIHRlc3QgOiBtRGV2aWNlUHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKHRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAucmVtb3ZlKHRlc3QpOwotICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VkOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhckNvbXBhdGlibGVNYXRjaGVzTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgQWNjZXNzb3J5RmlsdGVyIGZpbHRlcikgewotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChBY2Nlc3NvcnlGaWx0ZXIgdGVzdCA6IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXModGVzdCkpIHsKLSAgICAgICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5yZW1vdmUodGVzdCk7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5nZWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBhY2thZ2VVcGRhdGVMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBBY3Rpdml0eUluZm8gYUluZm8sCi0gICAgICAgICAgICBTdHJpbmcgbWV0YURhdGFOYW1lKSB7Ci0gICAgICAgIFhtbFJlc291cmNlUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJzZXIgPSBhSW5mby5sb2FkWG1sTWV0YURhdGEobVBhY2thZ2VNYW5hZ2VyLCBtZXRhRGF0YU5hbWUpOwotICAgICAgICAgICAgaWYgKHBhcnNlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7Ci0gICAgICAgICAgICB3aGlsZSAocGFyc2VyLmdldEV2ZW50VHlwZSgpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgidXNiLWRldmljZSIuZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIERldmljZUZpbHRlciBmaWx0ZXIgPSBEZXZpY2VGaWx0ZXIucmVhZChwYXJzZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYXJDb21wYXRpYmxlTWF0Y2hlc0xvY2tlZChwYWNrYWdlTmFtZSwgZmlsdGVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoInVzYi1hY2Nlc3NvcnkiLmVxdWFscyh0YWdOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyID0gQWNjZXNzb3J5RmlsdGVyLnJlYWQocGFyc2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyQ29tcGF0aWJsZU1hdGNoZXNMb2NrZWQocGFja2FnZU5hbWUsIGZpbHRlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gbG9hZCBjb21wb25lbnQgaW5mbyAiICsgYUluZm8udG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHBhcnNlci5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VkOwotICAgIH0KLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBhbnkgVVNCIGRldmljZXMgb3IgYWNjZXNzb3JpZXMuCi0gICAgLy8gSWYgc28sIGNsZWFyIGFueSBub24tbWF0Y2hpbmcgcHJlZmVyZW5jZXMgZm9yIG1hdGNoaW5nIGRldmljZXMvYWNjZXNzb3JpZXMuCi0gICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVBhY2thZ2VVcGRhdGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFBhY2thZ2VJbmZvIGluZm87Ci0gICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX0FDVElWSVRJRVMgfCBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiaGFuZGxlUGFja2FnZVVwZGF0ZSBjb3VsZCBub3QgZmluZCBwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSwgZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBY3Rpdml0eUluZm9bXSBhY3Rpdml0aWVzID0gaW5mby5hY3Rpdml0aWVzOwotICAgICAgICAgICAgaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpdml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG1ldGEtZGF0YSwgYm90aCBmb3IgZGV2aWNlcyBhbmQgYWNjZXNzb3JpZXMKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUGFja2FnZVVwZGF0ZUxvY2tlZChwYWNrYWdlTmFtZSwgYWN0aXZpdGllc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9ERVZJQ0VfQVRUQUNIRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlUGFja2FnZVVwZGF0ZUxvY2tlZChwYWNrYWdlTmFtZSwgYWN0aXZpdGllc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9BQ0NFU1NPUllfQVRUQUNIRUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVNldHRpbmdzTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtRGV2aWNlUGVybWlzc2lvbk1hcC5nZXQoZGV2aWNlLmdldERldmljZU5hbWUoKSk7Ci0gICAgICAgICAgICBpZiAodWlkTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHVpZExpc3QuZ2V0KEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAuZ2V0KGFjY2Vzc29yeSk7Ci0gICAgICAgICAgICBpZiAodWlkTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHVpZExpc3QuZ2V0KEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKGRldmljZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVXNlciBoYXMgbm90IGdpdmVuIHBlcm1pc3Npb24gdG8gZGV2aWNlICIgKyBkZXZpY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2hlY2tQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKLSAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKGFjY2Vzc29yeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiVXNlciBoYXMgbm90IGdpdmVuIHBlcm1pc3Npb24gdG8gYWNjZXNzb3J5ICIgKyBhY2Nlc3NvcnkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RQZXJtaXNzaW9uRGlhbG9nKEludGVudCBpbnRlbnQsIFN0cmluZyBwYWNrYWdlTmFtZSwgUGVuZGluZ0ludGVudCBwaSkgewotICAgICAgICBpbnQgdWlkID0gQmluZGVyLmdldENhbGxpbmdVaWQoKTsKLQotICAgICAgICAvLyBjb21wYXJlIHVpZCB3aXRoIHBhY2thZ2VOYW1lIHRvIGZvaWwgYXBwcyBwcmV0ZW5kaW5nIHRvIGJlIHNvbWVvbmUgZWxzZQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFJbmZvID0gbVBhY2thZ2VNYW5hZ2VyLmdldEFwcGxpY2F0aW9uSW5mbyhwYWNrYWdlTmFtZSwgMCk7Ci0gICAgICAgICAgICBpZiAoYUluZm8udWlkICE9IHVpZCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lcyBub3QgbWF0Y2ggY2FsbGVyJ3MgdWlkICIgKyB1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyBpZGVudGl0eSA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC5zeXN0ZW11aSIsCi0gICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnN5c3RlbXVpLnVzYi5Vc2JQZXJtaXNzaW9uQWN0aXZpdHkiKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEludGVudC5FWFRSQV9JTlRFTlQsIHBpKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwYWNrYWdlIiwgcGFja2FnZU5hbWUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInVpZCIsIHVpZCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAidW5hYmxlIHRvIHN0YXJ0IFVzYlBlcm1pc3Npb25BY3Rpdml0eSIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFBlcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotCi0gICAgICAgIC8vIHJlc3BvbmQgaW1tZWRpYXRlbHkgaWYgcGVybWlzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGdyYW50ZWQKLSAgICAgIGlmIChoYXNQZXJtaXNzaW9uKGRldmljZSkpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX1BFUk1JU1NJT05fR1JBTlRFRCwgdHJ1ZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBpLnNlbmQobUNvbnRleHQsIDAsIGludGVudCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJyZXF1ZXN0UGVybWlzc2lvbiBQZW5kaW5nSW50ZW50IHdhcyBjYW5jZWxsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0YXJ0IFVzYlBlcm1pc3Npb25BY3Rpdml0eSBzbyB1c2VyIGNhbiBjaG9vc2UgYW4gYWN0aXZpdHkKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOwotICAgICAgICByZXF1ZXN0UGVybWlzc2lvbkRpYWxvZyhpbnRlbnQsIHBhY2thZ2VOYW1lLCBwaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVxdWVzdFBlcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotCi0gICAgICAgIC8vIHJlc3BvbmQgaW1tZWRpYXRlbHkgaWYgcGVybWlzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGdyYW50ZWQKLSAgICAgICAgaWYgKGhhc1Blcm1pc3Npb24oYWNjZXNzb3J5KSkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfUEVSTUlTU0lPTl9HUkFOVEVELCB0cnVlKTsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwaS5zZW5kKG1Db250ZXh0LCAwLCBpbnRlbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicmVxdWVzdFBlcm1pc3Npb24gUGVuZGluZ0ludGVudCB3YXMgY2FuY2VsbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9BQ0NFU1NPUlksIGFjY2Vzc29yeSk7Ci0gICAgICAgIHJlcXVlc3RQZXJtaXNzaW9uRGlhbG9nKGludGVudCwgcGFja2FnZU5hbWUsIHBpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXZpY2VQYWNrYWdlKFVzYkRldmljZSBkZXZpY2UsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gbmV3IERldmljZUZpbHRlcihkZXZpY2UpOwotICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gKG1EZXZpY2VQcmVmZXJlbmNlTWFwLnJlbW92ZShmaWx0ZXIpICE9IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkID0gIXBhY2thZ2VOYW1lLmVxdWFscyhtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAucHV0KGZpbHRlciwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVTZXR0aW5nc0xvY2tlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWNjZXNzb3J5UGFja2FnZShVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IG5ldyBBY2Nlc3NvcnlGaWx0ZXIoYWNjZXNzb3J5KTsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9IChtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5yZW1vdmUoZmlsdGVyKSAhPSBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlZCA9ICFwYWNrYWdlTmFtZS5lcXVhbHMobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOwotICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLnB1dChmaWx0ZXIsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAgICAgICAgIHdyaXRlU2V0dGluZ3NMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdyYW50RGV2aWNlUGVybWlzc2lvbihVc2JEZXZpY2UgZGV2aWNlLCBpbnQgdWlkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VOYW1lID0gZGV2aWNlLmdldERldmljZU5hbWUoKTsKLSAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbURldmljZVBlcm1pc3Npb25NYXAuZ2V0KGRldmljZU5hbWUpOwotICAgICAgICAgICAgaWYgKHVpZExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVpZExpc3QgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KDEpOwotICAgICAgICAgICAgICAgIG1EZXZpY2VQZXJtaXNzaW9uTWFwLnB1dChkZXZpY2VOYW1lLCB1aWRMaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpZExpc3QucHV0KHVpZCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBncmFudEFjY2Vzc29yeVBlcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgaW50IHVpZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLmdldChhY2Nlc3NvcnkpOwotICAgICAgICAgICAgaWYgKHVpZExpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVpZExpc3QgPSBuZXcgU3BhcnNlQm9vbGVhbkFycmF5KDEpOwotICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLnB1dChhY2Nlc3NvcnksIHVpZExpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWlkTGlzdC5wdXQodWlkLCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0RlZmF1bHRzKFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobURldmljZVByZWZlcmVuY2VNYXAudmFsdWVzKCkuY29udGFpbnMocGFja2FnZU5hbWUpKSByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC52YWx1ZXMoKS5jb250YWlucyhwYWNrYWdlTmFtZSkpIHJldHVybiB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xlYXJEZWZhdWx0cyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKGNsZWFyUGFja2FnZURlZmF1bHRzTG9ja2VkKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHdyaXRlU2V0dGluZ3NMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhclBhY2thZ2VEZWZhdWx0c0xvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgYm9vbGVhbiBjbGVhcmVkID0gZmFsc2U7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtRGV2aWNlUHJlZmVyZW5jZU1hcC5jb250YWluc1ZhbHVlKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIG1ha2UgYSBjb3B5IG9mIHRoZSBrZXkgc2V0IHRvIGF2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLSAgICAgICAgICAgICAgICBPYmplY3RbXSBrZXlzID0gbURldmljZVByZWZlcmVuY2VNYXAua2V5U2V0KCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0ga2V5c1tpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoa2V5KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcmVmZXJlbmNlTWFwLnJlbW92ZShrZXkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuY29udGFpbnNWYWx1ZShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUga2V5IHNldCB0byBhdm9pZCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgT2JqZWN0W10ga2V5cyA9IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGtleSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsZWFyZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIERldmljZSBwZXJtaXNzaW9uczoiKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGRldmljZU5hbWUgOiBtRGV2aWNlUGVybWlzc2lvbk1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIiArIGRldmljZU5hbWUgKyAiOiAiKTsKLSAgICAgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1EZXZpY2VQZXJtaXNzaW9uTWFwLmdldChkZXZpY2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSB1aWRMaXN0LnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoSW50ZWdlci50b1N0cmluZyh1aWRMaXN0LmtleUF0KGkpKSArICIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHcucHJpbnRsbigiICBBY2Nlc3NvcnkgcGVybWlzc2lvbnM6Iik7Ci0gICAgICAgICAgICBmb3IgKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkgOiBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIiArIGFjY2Vzc29yeSArICI6ICIpOwotICAgICAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAuZ2V0KGFjY2Vzc29yeSk7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gdWlkTGlzdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50KEludGVnZXIudG9TdHJpbmcodWlkTGlzdC5rZXlBdChpKSkgKyAiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgRGV2aWNlIHByZWZlcmVuY2VzOiIpOwotICAgICAgICAgICAgZm9yIChEZXZpY2VGaWx0ZXIgZmlsdGVyIDogbURldmljZVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIgICAgIiArIGZpbHRlciArICI6ICIgKyBtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIgIEFjY2Vzc29yeSBwcmVmZXJlbmNlczoiKTsKLSAgICAgICAgICAgIGZvciAoQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA6IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICIgKyBmaWx0ZXIgKyAiOiAiICsgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkhvc3RNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiSG9zdE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjNiMDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkhvc3RNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW4KKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLnVzYjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLklVc2JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkNvbnN0YW50czsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JEZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiRW5kcG9pbnQ7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYk1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5vcy5VRXZlbnRPYnNlcnZlcjsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBVc2JIb3N0TWFuYWdlciBtYW5hZ2VzIFVTQiBzdGF0ZSBpbiBob3N0IG1vZGUuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2JIb3N0TWFuYWdlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFVzYkhvc3RNYW5hZ2VyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPRyA9IGZhbHNlOworCisgICAgLy8gY29udGFpbnMgYWxsIGNvbm5lY3RlZCBVU0IgZGV2aWNlcworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsVXNiRGV2aWNlPiBtRGV2aWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxVc2JEZXZpY2U+KCk7CisKKyAgICAvLyBVU0IgYnVzc2VzIHRvIGV4Y2x1ZGUgZnJvbSBVU0IgaG9zdCBzdXBwb3J0CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtSG9zdEJsYWNrbGlzdDsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIFVzYlNldHRpbmdzTWFuYWdlciBtU2V0dGluZ3NNYW5hZ2VyOworCisgICAgcHVibGljIFVzYkhvc3RNYW5hZ2VyKENvbnRleHQgY29udGV4dCwgVXNiU2V0dGluZ3NNYW5hZ2VyIHNldHRpbmdzTWFuYWdlcikgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIgPSBzZXR0aW5nc01hbmFnZXI7CisgICAgICAgIG1Ib3N0QmxhY2tsaXN0ID0gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmdBcnJheSgKKyAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LmNvbmZpZ191c2JIb3N0QmxhY2tsaXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNCbGFja0xpc3RlZChTdHJpbmcgZGV2aWNlTmFtZSkgeworICAgICAgICBpbnQgY291bnQgPSBtSG9zdEJsYWNrbGlzdC5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGRldmljZU5hbWUuc3RhcnRzV2l0aChtSG9zdEJsYWNrbGlzdFtpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogcmV0dXJucyB0cnVlIGlmIHRoZSBVU0IgZGV2aWNlIHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNCbGFja0xpc3RlZChpbnQgY2xhenosIGludCBzdWJDbGFzcywgaW50IHByb3RvY29sKSB7CisgICAgICAgIC8vIGJsYWNrbGlzdCBodWJzCisgICAgICAgIGlmIChjbGF6eiA9PSBVc2JDb25zdGFudHMuVVNCX0NMQVNTX0hVQikgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gYmxhY2tsaXN0IEhJRCBib290IGRldmljZXMgKG1vdXNlIGFuZCBrZXlib2FyZCkKKyAgICAgICAgaWYgKGNsYXp6ID09IFVzYkNvbnN0YW50cy5VU0JfQ0xBU1NfSElEICYmCisgICAgICAgICAgICAgICAgc3ViQ2xhc3MgPT0gVXNiQ29uc3RhbnRzLlVTQl9JTlRFUkZBQ0VfU1VCQ0xBU1NfQk9PVCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogQ2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkgdG8gcmVwb3J0IG5ldyBVU0IgZGV2aWNlcyAqLworICAgIHByaXZhdGUgdm9pZCB1c2JEZXZpY2VBZGRlZChTdHJpbmcgZGV2aWNlTmFtZSwgaW50IHZlbmRvcklELCBpbnQgcHJvZHVjdElELAorICAgICAgICAgICAgaW50IGRldmljZUNsYXNzLCBpbnQgZGV2aWNlU3ViY2xhc3MsIGludCBkZXZpY2VQcm90b2NvbCwKKyAgICAgICAgICAgIC8qIGFycmF5IG9mIHF1aW50dXBsZXMgY29udGFpbmluZyBpZCwgY2xhc3MsIHN1YmNsYXNzLCBwcm90b2NvbAorICAgICAgICAgICAgICAgYW5kIG51bWJlciBvZiBlbmRwb2ludHMgZm9yIGVhY2ggaW50ZXJmYWNlICovCisgICAgICAgICAgICBpbnRbXSBpbnRlcmZhY2VWYWx1ZXMsCisgICAgICAgICAgIC8qIGFycmF5IG9mIHF1YWRydXBsZXMgY29udGFpbmluZyBhZGRyZXNzLCBhdHRyaWJ1dGVzLCBtYXggcGFja2V0IHNpemUKKyAgICAgICAgICAgICAgYW5kIGludGVydmFsIGZvciBlYWNoIGVuZHBvaW50ICovCisgICAgICAgICAgICBpbnRbXSBlbmRwb2ludFZhbHVlcykgeworCisgICAgICAgIGlmIChpc0JsYWNrTGlzdGVkKGRldmljZU5hbWUpIHx8CisgICAgICAgICAgICAgICAgaXNCbGFja0xpc3RlZChkZXZpY2VDbGFzcywgZGV2aWNlU3ViY2xhc3MsIGRldmljZVByb3RvY29sKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1EZXZpY2VzLmdldChkZXZpY2VOYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGV2aWNlIGFscmVhZHkgb24gbURldmljZXMgbGlzdDogIiArIGRldmljZU5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG51bUludGVyZmFjZXMgPSBpbnRlcmZhY2VWYWx1ZXMubGVuZ3RoIC8gNTsKKyAgICAgICAgICAgIFBhcmNlbGFibGVbXSBpbnRlcmZhY2VzID0gbmV3IFVzYkludGVyZmFjZVtudW1JbnRlcmZhY2VzXTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gcmVwYWNrYWdlIGludGVyZmFjZVZhbHVlcyBhcyBhbiBhcnJheSBvZiBVc2JJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICBpbnQgaW50ZiwgZW5kcCwgaXZhbCA9IDAsIGV2YWwgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaW50ZiA9IDA7IGludGYgPCBudW1JbnRlcmZhY2VzOyBpbnRmKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZmFjZUlkID0gaW50ZXJmYWNlVmFsdWVzW2l2YWwrK107CisgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcmZhY2VDbGFzcyA9IGludGVyZmFjZVZhbHVlc1tpdmFsKytdOworICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJmYWNlU3ViY2xhc3MgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZmFjZVByb3RvY29sID0gaW50ZXJmYWNlVmFsdWVzW2l2YWwrK107CisgICAgICAgICAgICAgICAgICAgIGludCBudW1FbmRwb2ludHMgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKKworICAgICAgICAgICAgICAgICAgICBQYXJjZWxhYmxlW10gZW5kcG9pbnRzID0gbmV3IFVzYkVuZHBvaW50W251bUVuZHBvaW50c107CisgICAgICAgICAgICAgICAgICAgIGZvciAoZW5kcCA9IDA7IGVuZHAgPCBudW1FbmRwb2ludHM7IGVuZHArKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHJlc3MgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZXMgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heFBhY2tldFNpemUgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVydmFsID0gZW5kcG9pbnRWYWx1ZXNbZXZhbCsrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50c1tlbmRwXSA9IG5ldyBVc2JFbmRwb2ludChhZGRyZXNzLCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQYWNrZXRTaXplLCBpbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBpZiBhbnkgaW50ZXJmYWNlcyBhcmUgYmxhY2tsaXN0ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhY2tMaXN0ZWQoaW50ZXJmYWNlQ2xhc3MsIGludGVyZmFjZVN1YmNsYXNzLCBpbnRlcmZhY2VQcm90b2NvbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzW2ludGZdID0gbmV3IFVzYkludGVyZmFjZShpbnRlcmZhY2VJZCwgaW50ZXJmYWNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlU3ViY2xhc3MsIGludGVyZmFjZVByb3RvY29sLCBlbmRwb2ludHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gYmV3YXJlIG9mIGluZGV4IG91dCBvZiBib3VuZCBleGNlcHRpb25zLCB3aGljaCBtaWdodCBoYXBwZW4gaWYKKyAgICAgICAgICAgICAgICAvLyBhIGRldmljZSBkb2VzIG5vdCBzZXQgYk51bUVuZHBvaW50cyBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBwYXJzaW5nIFVTQiBkZXNjcmlwdG9ycyIsIGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IG5ldyBVc2JEZXZpY2UoZGV2aWNlTmFtZSwgdmVuZG9ySUQsIHByb2R1Y3RJRCwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ2xhc3MsIGRldmljZVN1YmNsYXNzLCBkZXZpY2VQcm90b2NvbCwgaW50ZXJmYWNlcyk7CisgICAgICAgICAgICBtRGV2aWNlcy5wdXQoZGV2aWNlTmFtZSwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuZGV2aWNlQXR0YWNoZWQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENhbGxlZCBmcm9tIEpOSSBpbiBtb25pdG9yVXNiSG9zdEJ1cyB0byByZXBvcnQgVVNCIGRldmljZSByZW1vdmFsICovCisgICAgcHJpdmF0ZSB2b2lkIHVzYkRldmljZVJlbW92ZWQoU3RyaW5nIGRldmljZU5hbWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IG1EZXZpY2VzLnJlbW92ZShkZXZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuZGV2aWNlRGV0YWNoZWQoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN5c3RlbVJlYWR5KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSB0aHJlYWQgdG8gY2FsbCBpbnRvIG5hdGl2ZSBjb2RlIHRvIHdhaXQgZm9yIFVTQiBob3N0IGV2ZW50cy4KKyAgICAgICAgICAgIC8vIFRoaXMgdGhyZWFkIHdpbGwgY2FsbCB1cyBiYWNrIG9uIHVzYkRldmljZUFkZGVkIGFuZCB1c2JEZXZpY2VSZW1vdmVkLgorICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBtb25pdG9yVXNiSG9zdEJ1cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBuZXcgVGhyZWFkKG51bGwsIHJ1bm5hYmxlLCAiVXNiU2VydmljZSBob3N0IHRocmVhZCIpLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5IGF0dGFjaGVkIFVTQiBkZXZpY2VzICovCisgICAgcHVibGljIHZvaWQgZ2V0RGV2aWNlTGlzdChCdW5kbGUgZGV2aWNlcykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbURldmljZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnB1dFBhcmNlbGFibGUobmFtZSwgbURldmljZXMuZ2V0KG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE9wZW5zIHRoZSBzcGVjaWZpZWQgVVNCIGRldmljZSAqLworICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuRGV2aWNlKFN0cmluZyBkZXZpY2VOYW1lKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChpc0JsYWNrTGlzdGVkKGRldmljZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJVU0IgZGV2aWNlIGlzIG9uIGEgcmVzdHJpY3RlZCBidXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVzYkRldmljZSBkZXZpY2UgPSBtRGV2aWNlcy5nZXQoZGV2aWNlTmFtZSk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgaW4gbURldmljZXMsIGl0IGVpdGhlciBkb2VzIG5vdCBleGlzdCBvciBpcyBibGFja2xpc3RlZAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiZGV2aWNlICIgKyBkZXZpY2VOYW1lICsgIiBkb2VzIG5vdCBleGlzdCBvciBpcyByZXN0cmljdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU9wZW5EZXZpY2UoZGV2aWNlTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wKEZpbGVEZXNjcmlwdG9yIGZkLCBQcmludFdyaXRlciBwdykgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIFVTQiBIb3N0IFN0YXRlOiIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG1EZXZpY2VzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICIgKyBuYW1lICsgIjogIiArIG1EZXZpY2VzLmdldChuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG1vbml0b3JVc2JIb3N0QnVzKCk7CisgICAgcHJpdmF0ZSBuYXRpdmUgUGFyY2VsRmlsZURlc2NyaXB0b3IgbmF0aXZlT3BlbkRldmljZShTdHJpbmcgZGV2aWNlTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYlNlcnZpY2UuamF2YQppbmRleCBhMTUxYWYwLi4xOTM2MzhmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXJ2aWNlLmphdmEKQEAgLTEwLDYwNyArMTAsMTY4IEBACiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW4KICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyLnVzYjsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5JVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JBY2Nlc3Nvcnk7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiQ29uc3RhbnRzOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkRldmljZTsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JFbmRwb2ludDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JJbnRlcmZhY2U7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVFdmVudE9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU2xvZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogVXNiU2VydmljZSBtb25pdG9ycyBmb3IgY2hhbmdlcyB0byBVU0Igc3RhdGUuCi0gKiBUaGlzIGluY2x1ZGVzIGNvZGUgZm9yIGJvdGggVVNCIGhvc3Qgc3VwcG9ydCAod2hlcmUgdGhlIGFuZHJvaWQgZGV2aWNlIGlzIHRoZSBob3N0KQotICogYXMgd2VsbCBhcyBVU0IgZGV2aWNlIHN1cHBvcnQgKGFuZHJvaWQgZGV2aWNlIGlzIGNvbm5lY3RlZCB0byBhIFVTQiBob3N0KS4KLSAqIEFjY2Vzc29yeSBtb2RlIGlzIGEgc3BlY2lhbCBjYXNlIG9mIFVTQiBkZXZpY2UgbW9kZSwgd2hlcmUgdGhlIGFuZHJvaWQgZGV2aWNlIGlzCi0gKiBjb25uZWN0ZWQgdG8gYSBVU0IgaG9zdCB0aGF0IHN1cHBvcnRzIHRoZSBhbmRyb2lkIGFjY2Vzc29yeSBwcm90b2NvbC4KKyAqIFVzYlNlcnZpY2UgbWFuYWdlcyBhbGwgVVNCIHJlbGF0ZWQgc3RhdGUsIGluY2x1ZGluZyBib3RoIGhvc3QgYW5kIGRldmljZSBzdXBwb3J0LgorICogSG9zdCByZWxhdGVkIGV2ZW50cyBhbmQgY2FsbHMgYXJlIGRlbGVnYXRlZCB0byBVc2JIb3N0TWFuYWdlciwgYW5kIGRldmljZSByZWxhdGVkCisgKiBzdXBwb3J0IGlzIGRlbGVnYXRlZCB0byBVc2JEZXZpY2VNYW5hZ2VyLgogICovCiBwdWJsaWMgY2xhc3MgVXNiU2VydmljZSBleHRlbmRzIElVc2JNYW5hZ2VyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSBVc2JTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIExPRyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05ORUNURURfTUFUQ0ggPQotICAgICAgICAgICAgIkRFVlBBVEg9L2RldmljZXMvdmlydHVhbC9zd2l0Y2gvdXNiX2Nvbm5lY3RlZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQl9DT05GSUdVUkFUSU9OX01BVENIID0KLSAgICAgICAgICAgICJERVZQQVRIPS9kZXZpY2VzL3ZpcnR1YWwvc3dpdGNoL3VzYl9jb25maWd1cmF0aW9uIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0ZVTkNUSU9OU19NQVRDSCA9Ci0gICAgICAgICAgICAiREVWUEFUSD0vZGV2aWNlcy92aXJ0dWFsL3VzYl9jb21wb3NpdGUvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0NPTk5FQ1RFRF9QQVRIID0KLSAgICAgICAgICAgICIvc3lzL2NsYXNzL3N3aXRjaC91c2JfY29ubmVjdGVkL3N0YXRlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNCX0NPTkZJR1VSQVRJT05fUEFUSCA9Ci0gICAgICAgICAgICAiL3N5cy9jbGFzcy9zd2l0Y2gvdXNiX2NvbmZpZ3VyYXRpb24vc3RhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0JfQ09NUE9TSVRFX0NMQVNTX1BBVEggPQotICAgICAgICAgICAgIi9zeXMvY2xhc3MvdXNiX2NvbXBvc2l0ZSI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9TVEFURSA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19GVU5DVElPTl9FTkFCTEVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0ZVTkNUSU9OX0RJU0FCTEVEID0gMjsKLQotICAgIC8vIERlbGF5IGZvciBkZWJvdW5jaW5nIFVTQiBkaXNjb25uZWN0cy4KLSAgICAvLyBXZSBvZnRlbiBnZXQgcmFwaWQgY29ubmVjdC9kaXNjb25uZWN0IGV2ZW50cyB3aGVuIGVuYWJsaW5nIFVTQiBmdW5jdGlvbnMsCi0gICAgLy8gd2hpY2ggbmVlZCBkZWJvdW5jaW5nLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAxMDAwOwotCi0gICAgLy8gY3VycmVudCBjb25uZWN0ZWQgYW5kIGNvbmZpZ3VyYXRpb24gc3RhdGUKLSAgICBwcml2YXRlIGludCBtQ29ubmVjdGVkOwotICAgIHByaXZhdGUgaW50IG1Db25maWd1cmF0aW9uOwotCi0gICAgLy8gbGFzdCBicm9hZGNhc3RlZCBjb25uZWN0ZWQgYW5kIGNvbmZpZ3VyYXRpb24gc3RhdGUKLSAgICBwcml2YXRlIGludCBtTGFzdENvbm5lY3RlZCA9IC0xOwotICAgIHByaXZhdGUgaW50IG1MYXN0Q29uZmlndXJhdGlvbiA9IC0xOwotCi0gICAgLy8gbGlzdHMgb2YgZW5hYmxlZCBhbmQgZGlzYWJsZWQgVVNCIGZ1bmN0aW9ucyAoZm9yIFVTQiBkZXZpY2UgbW9kZSkKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IG1FbmFibGVkRnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRGlzYWJsZWRGdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgIC8vIGNvbnRhaW5zIGFsbCBjb25uZWN0ZWQgVVNCIGRldmljZXMgKGZvciBVU0IgaG9zdCBtb2RlKQotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsVXNiRGV2aWNlPiBtRGV2aWNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxVc2JEZXZpY2U+KCk7Ci0KLSAgICAvLyBVU0IgYnVzc2VzIHRvIGV4Y2x1ZGUgZnJvbSBVU0IgaG9zdCBzdXBwb3J0Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtSG9zdEJsYWNrbGlzdDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtU3lzdGVtUmVhZHk7Ci0KLSAgICBwcml2YXRlIFVzYkFjY2Vzc29yeSBtQ3VycmVudEFjY2Vzc29yeTsKLSAgICAvLyBVU0IgZnVuY3Rpb25zIHRoYXQgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgdG8gcmVzdG9yZSBhZnRlciBleGl0aW5nIGFjY2Vzc29yeSBtb2RlCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBtRGVmYXVsdEZ1bmN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyIG1EZXZpY2VNYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSGFzVXNiSG9zdDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUhhc1VzYkFjY2Vzc29yeTsKKyAgICBwcml2YXRlIFVzYkRldmljZU1hbmFnZXIgbURldmljZU1hbmFnZXI7CisgICAgcHJpdmF0ZSBVc2JIb3N0TWFuYWdlciBtSG9zdE1hbmFnZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBVc2JTZXR0aW5nc01hbmFnZXIgbVNldHRpbmdzTWFuYWdlcjsKIAotICAgIHByaXZhdGUgZmluYWwgdm9pZCByZWFkQ3VycmVudEFjY2Vzc29yeUxvY2tlZCgpIHsKLSAgICAgICAgaWYgKG1IYXNVc2JBY2Nlc3NvcnkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MgPSBuYXRpdmVHZXRBY2Nlc3NvcnlTdHJpbmdzKCk7Ci0gICAgICAgICAgICBpZiAoc3RyaW5ncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRBY2Nlc3NvcnkgPSBuZXcgVXNiQWNjZXNzb3J5KHN0cmluZ3MpOwotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgImVudGVyaW5nIFVTQiBhY2Nlc3NvcnkgbW9kZTogIiArIG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmFjY2Vzc29yeUF0dGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIm5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MgZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhhbmRsZXMgVVNCIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIGV2ZW50cyAoZGV2aWNlIG1vZGUpCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIGZ1bmN0aW9uRW5hYmxlZExvY2tlZChTdHJpbmcgZnVuY3Rpb24sIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKCFtRW5hYmxlZEZ1bmN0aW9ucy5jb250YWlucyhmdW5jdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURpc2FibGVkRnVuY3Rpb25zLnJlbW92ZShmdW5jdGlvbik7Ci0KLSAgICAgICAgICAgIGlmIChVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BQ0NFU1NPUlkuZXF1YWxzKGZ1bmN0aW9uKSkgewotICAgICAgICAgICAgICAgIHJlYWRDdXJyZW50QWNjZXNzb3J5TG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIW1EaXNhYmxlZEZ1bmN0aW9ucy5jb250YWlucyhmdW5jdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtRGlzYWJsZWRGdW5jdGlvbnMuYWRkKGZ1bmN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FbmFibGVkRnVuY3Rpb25zLnJlbW92ZShmdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIExpc3RlbnMgZm9yIHVldmVudCBtZXNzYWdlcyBmcm9tIHRoZSBrZXJuZWwgdG8gbW9uaXRvciB0aGUgVVNCIHN0YXRlIChkZXZpY2UgbW9kZSkKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFVFdmVudE9ic2VydmVyIG1VRXZlbnRPYnNlcnZlciA9IG5ldyBVRXZlbnRPYnNlcnZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVUV2ZW50KFVFdmVudE9ic2VydmVyLlVFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgU2xvZy52KFRBRywgIlVTQiBVRVZFTlQ6ICIgKyBldmVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0KCJTV0lUQ0hfTkFNRSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0ZSA9IGV2ZW50LmdldCgiU1dJVENIX1NUQVRFIik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBzdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50U3RhdGUgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgidXNiX2Nvbm5lY3RlZCIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGludFN0YXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgYW4gSW50ZW50IGJyb2FkY2FzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVib3VuY2UgZGlzY29ubmVjdHMgdG8gYXZvaWQgcHJvYmxlbXMgYnJpbmdpbmcgdXAgVVNCIHRldGhlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobUNvbm5lY3RlZCA9PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJ1c2JfY29uZmlndXJhdGlvbiIuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyYXRpb24gPSBpbnRTdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFuIEludGVudCBicm9hZGNhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJlYWR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShtQ29ubmVjdGVkID09IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNsb2cuZShUQUcsICJDb3VsZCBub3QgcGFyc2Ugc3dpdGNoIHN0YXRlIGZyb20gZXZlbnQgIiArIGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbiA9IGV2ZW50LmdldCgiRlVOQ1RJT04iKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuYWJsZWRTdHIgPSBldmVudC5nZXQoIkVOQUJMRUQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uICE9IG51bGwgJiYgZW5hYmxlZFN0ciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSBkbyBub3QgYnJvYWRjYXN0IGEgY2hhbmdlIHdoZW4gYSBmdW5jdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UganVzdCByZWNvcmQgdGhlIHN0YXRlIGNoYW5nZSBmb3IgdGhlIG5leHQgYnJvYWRjYXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoYXQgPSAoIjEiLmVxdWFscyhlbmFibGVkU3RyKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19GVU5DVElPTl9FTkFCTEVEIDogTVNHX0ZVTkNUSU9OX0RJU0FCTEVEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4obUhhbmRsZXIsIHdoYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbXNnLm9iaiA9IGZ1bmN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbUJvb3RDb21wbGV0ZWRSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgLy8gaGFuZGxlIGFjY2Vzc29yaWVzIGF0dGFjaGVkIGF0IGJvb3QgdGltZQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEFjY2Vzc29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmFjY2Vzc29yeUF0dGFjaGVkKG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwogCiAgICAgcHVibGljIFVzYlNlcnZpY2UoQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbURldmljZU1hbmFnZXIgPSBuZXcgVXNiRGV2aWNlU2V0dGluZ3NNYW5hZ2VyKGNvbnRleHQpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyID0gbmV3IFVzYlNldHRpbmdzTWFuYWdlcihjb250ZXh0KTsKICAgICAgICAgUGFja2FnZU1hbmFnZXIgcG0gPSBtQ29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBtSGFzVXNiSG9zdCA9IHBtLmhhc1N5c3RlbUZlYXR1cmUoUGFja2FnZU1hbmFnZXIuRkVBVFVSRV9VU0JfSE9TVCk7Ci0gICAgICAgIG1IYXNVc2JBY2Nlc3NvcnkgPSBwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVVNCX0FDQ0VTU09SWSk7Ci0KLSAgICAgICAgbUhvc3RCbGFja2xpc3QgPSBjb250ZXh0LmdldFJlc291cmNlcygpLmdldFN0cmluZ0FycmF5KAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkuY29uZmlnX3VzYkhvc3RCbGFja2xpc3QpOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluaXQoKTsgIC8vIHNldCBpbml0aWFsIHN0YXR1cwotCi0gICAgICAgICAgICAvLyBXYXRjaCBmb3IgVVNCIGNvbmZpZ3VyYXRpb24gY2hhbmdlcwotICAgICAgICAgICAgaWYgKG1Db25maWd1cmF0aW9uID49IDApIHsKLSAgICAgICAgICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoVVNCX0NPTk5FQ1RFRF9NQVRDSCk7Ci0gICAgICAgICAgICAgICAgbVVFdmVudE9ic2VydmVyLnN0YXJ0T2JzZXJ2aW5nKFVTQl9DT05GSUdVUkFUSU9OX01BVENIKTsKLSAgICAgICAgICAgICAgICBtVUV2ZW50T2JzZXJ2ZXIuc3RhcnRPYnNlcnZpbmcoVVNCX0ZVTkNUSU9OU19NQVRDSCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChwbS5oYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfVVNCX0hPU1QpKSB7CisgICAgICAgICAgICBtSG9zdE1hbmFnZXIgPSBuZXcgVXNiSG9zdE1hbmFnZXIoY29udGV4dCwgbVNldHRpbmdzTWFuYWdlcik7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzEwMjRdOwotICAgICAgICBib29sZWFuIGluQWNjZXNzb3J5TW9kZSA9IGZhbHNlOwotCi0gICAgICAgIC8vIFJlYWQgaW5pdGlhbCBVU0Igc3RhdGUgKGRldmljZSBtb2RlKQotICAgICAgICBtQ29uZmlndXJhdGlvbiA9IC0xOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVJlYWRlciBmaWxlID0gbmV3IEZpbGVSZWFkZXIoVVNCX0NPTk5FQ1RFRF9QQVRIKTsKLSAgICAgICAgICAgIGludCBsZW4gPSBmaWxlLnJlYWQoYnVmZmVyLCAwLCAxMDI0KTsKLSAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBJbnRlZ2VyLnZhbHVlT2YoKG5ldyBTdHJpbmcoYnVmZmVyLCAwLCBsZW4pKS50cmltKCkpOwotCi0gICAgICAgICAgICBmaWxlID0gbmV3IEZpbGVSZWFkZXIoVVNCX0NPTkZJR1VSQVRJT05fUEFUSCk7Ci0gICAgICAgICAgICBsZW4gPSBmaWxlLnJlYWQoYnVmZmVyLCAwLCAxMDI0KTsKLSAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgIG1Db25maWd1cmF0aW9uID0gSW50ZWdlci52YWx1ZU9mKChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgbGVuKSkudHJpbSgpKTsKLQotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIlRoaXMga2VybmVsIGRvZXMgbm90IGhhdmUgVVNCIGNvbmZpZ3VyYXRpb24gc3dpdGNoIHN1cHBvcnQiKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cuZShUQUcsICIiICwgZSk7CisgICAgICAgIGlmIChuZXcgRmlsZSgiL3N5cy9jbGFzcy9hbmRyb2lkX3VzYiIpLmV4aXN0cygpKSB7CisgICAgICAgICAgICBtRGV2aWNlTWFuYWdlciA9IG5ldyBVc2JEZXZpY2VNYW5hZ2VyKGNvbnRleHQsIG1TZXR0aW5nc01hbmFnZXIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtQ29uZmlndXJhdGlvbiA8IDApIHsKLSAgICAgICAgICAgIC8vIFRoaXMgbWF5IGhhcHBlbiBpbiB0aGUgZW11bGF0b3Igb3IgZGV2aWNlcyB3aXRob3V0IFVTQiBkZXZpY2UgbW9kZSBzdXBwb3J0Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFkIGluaXRpYWwgbGlzdCBvZiBlbmFibGVkIGFuZCBkaXNhYmxlZCBmdW5jdGlvbnMgKGRldmljZSBtb2RlKQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGUoVVNCX0NPTVBPU0lURV9DTEFTU19QQVRIKS5saXN0RmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlc1tpXSwgImVuYWJsZSIpOwotICAgICAgICAgICAgICAgIEZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgMTAyNCk7Ci0gICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlID0gSW50ZWdlci52YWx1ZU9mKChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgbGVuKSkudHJpbSgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gZmlsZXNbaV0uZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkRnVuY3Rpb25zLmFkZChmdW5jdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BQ0NFU1NPUlkuZXF1YWxzKGZ1bmN0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBVU0IgYWNjZXNzb3J5IGRyaXZlciBpcyBvbiBieSBkZWZhdWx0LCBidXQgaXQgbWlnaHQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmFibGVkIGJlZm9yZSB0aGUgVVNCIHNlcnZpY2UgaGFzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgICAgICAgICAgICAgaW5BY2Nlc3NvcnlNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQURCLmVxdWFscyhmdW5jdGlvbk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGIgaXMgZW5hYmxlZC9kaXNhYmxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBhZGJkIGRhZW1vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGRvbid0IHRyZWF0IGl0IGFzIGEgZGVmYXVsdCBmdW5jdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0RnVuY3Rpb25zLmFkZChmdW5jdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbURpc2FibGVkRnVuY3Rpb25zLmFkZChmdW5jdGlvbk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFNsb2cudyhUQUcsICJUaGlzIGtlcm5lbCBkb2VzIG5vdCBoYXZlIFVTQiBjb21wb3NpdGUgY2xhc3Mgc3VwcG9ydCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU2xvZy5lKFRBRywgIiIgLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhbiBhY2Nlc3Nvcnkgc3dpdGNoZWQgdGhlIGRyaXZlciB0byBhY2Nlc3NvcnkgbW9kZQotICAgICAgICAvLyBiZWZvcmUgdGhlIGZyYW1ld29yayBmaW5pc2hlZCBib290aW5nCi0gICAgICAgIGlmIChpbkFjY2Vzc29yeU1vZGUpIHsKLSAgICAgICAgICAgIHJlYWRDdXJyZW50QWNjZXNzb3J5TG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIC8vIEZJWE1FIC0gaWYgd2UgYm9vdGVkIGluIGFjY2Vzc29yeSBtb2RlLCB0aGVuIHdlIGhhdmUgbm8gd2F5IHRvIGZpZ3VyZSBvdXQKLSAgICAgICAgICAgIC8vIHdoaWNoIGZ1bmN0aW9ucyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgotICAgICAgICAgICAgLy8gRm9yIG5vdywgYXNzdW1lIHRoYXQgTVRQIG9yIG1hc3Mgc3RvcmFnZSBhcmUgdGhlIG9ubHkgcG9zc2liaWxpdGllcwotICAgICAgICAgICAgaWYgKG1EaXNhYmxlZEZ1bmN0aW9ucy5jb250YWlucyhVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9NVFApKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRGdW5jdGlvbnMuYWRkKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX01UUCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1EaXNhYmxlZEZ1bmN0aW9ucy5jb250YWlucyhVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9NQVNTX1NUT1JBR0UpKSB7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRGdW5jdGlvbnMuYWRkKFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX01BU1NfU1RPUkFHRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCbGFja0xpc3RlZChTdHJpbmcgZGV2aWNlTmFtZSkgewotICAgICAgICBpbnQgY291bnQgPSBtSG9zdEJsYWNrbGlzdC5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGRldmljZU5hbWUuc3RhcnRzV2l0aChtSG9zdEJsYWNrbGlzdFtpXSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogcmV0dXJucyB0cnVlIGlmIHRoZSBVU0IgZGV2aWNlIHNob3VsZCBub3QgYmUgYWNjZXNzaWJsZSBieSBhcHBsaWNhdGlvbnMgKGhvc3QgbW9kZSkgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCbGFja0xpc3RlZChpbnQgY2xhenosIGludCBzdWJDbGFzcywgaW50IHByb3RvY29sKSB7Ci0gICAgICAgIC8vIGJsYWNrbGlzdCBodWJzCi0gICAgICAgIGlmIChjbGF6eiA9PSBVc2JDb25zdGFudHMuVVNCX0NMQVNTX0hVQikgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgLy8gYmxhY2tsaXN0IEhJRCBib290IGRldmljZXMgKG1vdXNlIGFuZCBrZXlib2FyZCkKLSAgICAgICAgaWYgKGNsYXp6ID09IFVzYkNvbnN0YW50cy5VU0JfQ0xBU1NfSElEICYmCi0gICAgICAgICAgICAgICAgc3ViQ2xhc3MgPT0gVXNiQ29uc3RhbnRzLlVTQl9JTlRFUkZBQ0VfU1VCQ0xBU1NfQk9PVCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogQ2FsbGVkIGZyb20gSk5JIGluIG1vbml0b3JVc2JIb3N0QnVzKCkgdG8gcmVwb3J0IG5ldyBVU0IgZGV2aWNlcyAoaG9zdCBtb2RlKSAqLwotICAgIHByaXZhdGUgdm9pZCB1c2JEZXZpY2VBZGRlZChTdHJpbmcgZGV2aWNlTmFtZSwgaW50IHZlbmRvcklELCBpbnQgcHJvZHVjdElELAotICAgICAgICAgICAgaW50IGRldmljZUNsYXNzLCBpbnQgZGV2aWNlU3ViY2xhc3MsIGludCBkZXZpY2VQcm90b2NvbCwKLSAgICAgICAgICAgIC8qIGFycmF5IG9mIHF1aW50dXBsZXMgY29udGFpbmluZyBpZCwgY2xhc3MsIHN1YmNsYXNzLCBwcm90b2NvbAotICAgICAgICAgICAgICAgYW5kIG51bWJlciBvZiBlbmRwb2ludHMgZm9yIGVhY2ggaW50ZXJmYWNlICovCi0gICAgICAgICAgICBpbnRbXSBpbnRlcmZhY2VWYWx1ZXMsCi0gICAgICAgICAgIC8qIGFycmF5IG9mIHF1YWRydXBsZXMgY29udGFpbmluZyBhZGRyZXNzLCBhdHRyaWJ1dGVzLCBtYXggcGFja2V0IHNpemUKLSAgICAgICAgICAgICAgYW5kIGludGVydmFsIGZvciBlYWNoIGVuZHBvaW50ICovCi0gICAgICAgICAgICBpbnRbXSBlbmRwb2ludFZhbHVlcykgewotCi0gICAgICAgIGlmIChpc0JsYWNrTGlzdGVkKGRldmljZU5hbWUpIHx8Ci0gICAgICAgICAgICAgICAgaXNCbGFja0xpc3RlZChkZXZpY2VDbGFzcywgZGV2aWNlU3ViY2xhc3MsIGRldmljZVByb3RvY29sKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1EZXZpY2VzLmdldChkZXZpY2VOYW1lKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZGV2aWNlIGFscmVhZHkgb24gbURldmljZXMgbGlzdDogIiArIGRldmljZU5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IG51bUludGVyZmFjZXMgPSBpbnRlcmZhY2VWYWx1ZXMubGVuZ3RoIC8gNTsKLSAgICAgICAgICAgIFBhcmNlbGFibGVbXSBpbnRlcmZhY2VzID0gbmV3IFVzYkludGVyZmFjZVtudW1JbnRlcmZhY2VzXTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVwYWNrYWdlIGludGVyZmFjZVZhbHVlcyBhcyBhbiBhcnJheSBvZiBVc2JJbnRlcmZhY2UKLSAgICAgICAgICAgICAgICBpbnQgaW50ZiwgZW5kcCwgaXZhbCA9IDAsIGV2YWwgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50ZiA9IDA7IGludGYgPCBudW1JbnRlcmZhY2VzOyBpbnRmKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZmFjZUlkID0gaW50ZXJmYWNlVmFsdWVzW2l2YWwrK107Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbnRlcmZhY2VDbGFzcyA9IGludGVyZmFjZVZhbHVlc1tpdmFsKytdOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJmYWNlU3ViY2xhc3MgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGludGVyZmFjZVByb3RvY29sID0gaW50ZXJmYWNlVmFsdWVzW2l2YWwrK107Ci0gICAgICAgICAgICAgICAgICAgIGludCBudW1FbmRwb2ludHMgPSBpbnRlcmZhY2VWYWx1ZXNbaXZhbCsrXTsKLQotICAgICAgICAgICAgICAgICAgICBQYXJjZWxhYmxlW10gZW5kcG9pbnRzID0gbmV3IFVzYkVuZHBvaW50W251bUVuZHBvaW50c107Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoZW5kcCA9IDA7IGVuZHAgPCBudW1FbmRwb2ludHM7IGVuZHArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkZHJlc3MgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZXMgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heFBhY2tldFNpemUgPSBlbmRwb2ludFZhbHVlc1tldmFsKytdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVydmFsID0gZW5kcG9pbnRWYWx1ZXNbZXZhbCsrXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50c1tlbmRwXSA9IG5ldyBVc2JFbmRwb2ludChhZGRyZXNzLCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQYWNrZXRTaXplLCBpbnRlcnZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBpZiBhbnkgaW50ZXJmYWNlcyBhcmUgYmxhY2tsaXN0ZWQKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhY2tMaXN0ZWQoaW50ZXJmYWNlQ2xhc3MsIGludGVyZmFjZVN1YmNsYXNzLCBpbnRlcmZhY2VQcm90b2NvbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzW2ludGZdID0gbmV3IFVzYkludGVyZmFjZShpbnRlcmZhY2VJZCwgaW50ZXJmYWNlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlU3ViY2xhc3MsIGludGVyZmFjZVByb3RvY29sLCBlbmRwb2ludHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gYmV3YXJlIG9mIGluZGV4IG91dCBvZiBib3VuZCBleGNlcHRpb25zLCB3aGljaCBtaWdodCBoYXBwZW4gaWYKLSAgICAgICAgICAgICAgICAvLyBhIGRldmljZSBkb2VzIG5vdCBzZXQgYk51bUVuZHBvaW50cyBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJlcnJvciBwYXJzaW5nIFVTQiBkZXNjcmlwdG9ycyIsIGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IG5ldyBVc2JEZXZpY2UoZGV2aWNlTmFtZSwgdmVuZG9ySUQsIHByb2R1Y3RJRCwKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ2xhc3MsIGRldmljZVN1YmNsYXNzLCBkZXZpY2VQcm90b2NvbCwgaW50ZXJmYWNlcyk7Ci0gICAgICAgICAgICBtRGV2aWNlcy5wdXQoZGV2aWNlTmFtZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmRldmljZUF0dGFjaGVkKGRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDYWxsZWQgZnJvbSBKTkkgaW4gbW9uaXRvclVzYkhvc3RCdXMgdG8gcmVwb3J0IFVTQiBkZXZpY2UgcmVtb3ZhbCAoaG9zdCBtb2RlKSAqLwotICAgIHByaXZhdGUgdm9pZCB1c2JEZXZpY2VSZW1vdmVkKFN0cmluZyBkZXZpY2VOYW1lKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFVzYkRldmljZSBkZXZpY2UgPSBtRGV2aWNlcy5yZW1vdmUoZGV2aWNlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtRGV2aWNlTWFuYWdlci5kZXZpY2VEZXRhY2hlZChkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRIb3N0U3VwcG9ydCgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgdGhyZWFkIHRvIGNhbGwgaW50byBuYXRpdmUgY29kZSB0byB3YWl0IGZvciBVU0IgaG9zdCBldmVudHMuCi0gICAgICAgIC8vIFRoaXMgdGhyZWFkIHdpbGwgY2FsbCB1cyBiYWNrIG9uIHVzYkRldmljZUFkZGVkIGFuZCB1c2JEZXZpY2VSZW1vdmVkLgotICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yVXNiSG9zdEJ1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBuZXcgVGhyZWFkKG51bGwsIHJ1bm5hYmxlLCAiVXNiU2VydmljZSBob3N0IHRocmVhZCIpLnN0YXJ0KCk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3lzdGVtUmVhZHkoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtSGFzVXNiSG9zdCkgewotICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG1vbml0b3JpbmcgZm9yIGNvbm5lY3RlZCBVU0IgZGV2aWNlcwotICAgICAgICAgICAgICAgIGluaXRIb3N0U3VwcG9ydCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICAgICAgaWYgKG1DdXJyZW50QWNjZXNzb3J5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhY2Nlc3NvcnlBdHRhY2hlZCBhdCBzeXN0ZW1SZWFkeSIpOwotICAgICAgICAgICAgICAgIC8vIGl0cyBzdGlsbCB0b28gZWFybHkgdG8gaGFuZGxlIGFjY2Vzc29yaWVzLCBzbyBhZGQgYSBCT09UX0NPTVBMRVRFRCByZWNlaXZlcgotICAgICAgICAgICAgICAgIC8vIHRvIGhhbmRsZSB0aGlzIGxhdGVyLgotICAgICAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobUJvb3RDb21wbGV0ZWRSZWNlaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9CT09UX0NPTVBMRVRFRCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN5c3RlbVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLnN5c3RlbVJlYWR5KCk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFNlbmRzIGEgbWVzc2FnZSB0byB1cGRhdGUgdGhlIFVTQiBjb25uZWN0ZWQgYW5kIGNvbmZpZ3VyZWQgc3RhdGUgKGRldmljZSBtb2RlKS4KLSAgICAgKiBJZiBkZWxheWVkIGlzIHRydWUsIHRoZW4gd2UgYWRkIGEgc21hbGwgZGVsYXkgaW4gc2VuZGluZyB0aGUgbWVzc2FnZSB0byBkZWJvdW5jZQotICAgICAqIHRoZSBVU0IgY29ubmVjdGlvbiB3aGVuIGVuYWJsaW5nIFVTQiB0ZXRoZXJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHVwZGF0ZShib29sZWFuIGRlbGF5ZWQpIHsKLSAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX1VQREFURV9TVEFURSk7Ci0gICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2VEZWxheWVkKE1TR19VUERBVEVfU1RBVEUsIGRlbGF5ZWQgPyBVUERBVEVfREVMQVkgOiAwKTsKKyAgICAgICAgaWYgKG1Ib3N0TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSG9zdE1hbmFnZXIuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYXR0YWNoZWQgVVNCIGRldmljZXMgKGhvc3QgbWRvZSkgKi8KICAgICBwdWJsaWMgdm9pZCBnZXREZXZpY2VMaXN0KEJ1bmRsZSBkZXZpY2VzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBtRGV2aWNlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIGRldmljZXMucHV0UGFyY2VsYWJsZShuYW1lLCBtRGV2aWNlcy5nZXQobmFtZSkpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobUhvc3RNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Ib3N0TWFuYWdlci5nZXREZXZpY2VMaXN0KGRldmljZXMpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyogT3BlbnMgdGhlIHNwZWNpZmllZCBVU0IgZGV2aWNlIChob3N0IG1vZGUpICovCiAgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5EZXZpY2UoU3RyaW5nIGRldmljZU5hbWUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKGlzQmxhY2tMaXN0ZWQoZGV2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlVTQiBkZXZpY2UgaXMgb24gYSByZXN0cmljdGVkIGJ1cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVXNiRGV2aWNlIGRldmljZSA9IG1EZXZpY2VzLmdldChkZXZpY2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCBpbiBtRGV2aWNlcywgaXQgZWl0aGVyIGRvZXMgbm90IGV4aXN0IG9yIGlzIGJsYWNrbGlzdGVkCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2UgIiArIGRldmljZU5hbWUgKyAiIGRvZXMgbm90IGV4aXN0IG9yIGlzIHJlc3RyaWN0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihkZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU9wZW5EZXZpY2UoZGV2aWNlTmFtZSk7CisgICAgICAgIGlmIChtSG9zdE1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1Ib3N0TWFuYWdlci5vcGVuRGV2aWNlKGRldmljZU5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiByZXR1cm5zIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgVVNCIGFjY2Vzc29yeSAoZGV2aWNlIG1vZGUpICovCiAgICAgcHVibGljIFVzYkFjY2Vzc29yeSBnZXRDdXJyZW50QWNjZXNzb3J5KCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRBY2Nlc3Nvcnk7CisgICAgICAgIGlmIChtRGV2aWNlTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbURldmljZU1hbmFnZXIuZ2V0Q3VycmVudEFjY2Vzc29yeSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBvcGVucyB0aGUgY3VycmVudGx5IGF0dGFjaGVkIFVTQiBhY2Nlc3NvcnkgKGRldmljZSBtb2RlKSAqLwogICAgIHB1YmxpYyBQYXJjZWxGaWxlRGVzY3JpcHRvciBvcGVuQWNjZXNzb3J5KFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50QWNjZXNzb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBhY2Nlc3NvcnkgYXR0YWNoZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUN1cnJlbnRBY2Nlc3NvcnkuZXF1YWxzKGFjY2Vzc29yeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGFjY2Vzc29yeS50b1N0cmluZygpICsgIiBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IGFjY2Vzc29yeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1DdXJyZW50QWNjZXNzb3J5KTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2Nlc3Nvcnkgbm90IGF0dGFjaGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRGV2aWNlTWFuYWdlci5jaGVja1Blcm1pc3Npb24obUN1cnJlbnRBY2Nlc3NvcnkpOwotICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU9wZW5BY2Nlc3NvcnkoKTsKKyAgICAgICAgaWYgKG1EZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlTWFuYWdlci5vcGVuQWNjZXNzb3J5KGFjY2Vzc29yeSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldERldmljZVBhY2thZ2UoVXNiRGV2aWNlIGRldmljZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUFOQUdFX1VTQiwgbnVsbCk7Ci0gICAgICAgIG1EZXZpY2VNYW5hZ2VyLnNldERldmljZVBhY2thZ2UoZGV2aWNlLCBwYWNrYWdlTmFtZSk7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuc2V0RGV2aWNlUGFja2FnZShkZXZpY2UsIHBhY2thZ2VOYW1lKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcnlQYWNrYWdlKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIFN0cmluZyBwYWNrYWdlTmFtZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9VU0IsIG51bGwpOwotICAgICAgICBtRGV2aWNlTWFuYWdlci5zZXRBY2Nlc3NvcnlQYWNrYWdlKGFjY2Vzc29yeSwgcGFja2FnZU5hbWUpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLnNldEFjY2Vzc29yeVBhY2thZ2UoYWNjZXNzb3J5LCBwYWNrYWdlTmFtZSk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaGFzRGV2aWNlUGVybWlzc2lvbihVc2JEZXZpY2UgZGV2aWNlKSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlTWFuYWdlci5oYXNQZXJtaXNzaW9uKGRldmljZSk7CisgICAgICAgIHJldHVybiBtU2V0dGluZ3NNYW5hZ2VyLmhhc1Blcm1pc3Npb24oZGV2aWNlKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNBY2Nlc3NvcnlQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VNYW5hZ2VyLmhhc1Blcm1pc3Npb24oYWNjZXNzb3J5KTsKKyAgICAgICAgcmV0dXJuIG1TZXR0aW5nc01hbmFnZXIuaGFzUGVybWlzc2lvbihhY2Nlc3NvcnkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlcXVlc3REZXZpY2VQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UsIFN0cmluZyBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgbURldmljZU1hbmFnZXIucmVxdWVzdFBlcm1pc3Npb24oZGV2aWNlLCBwYWNrYWdlTmFtZSwgcGkpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLnJlcXVlc3RQZXJtaXNzaW9uKGRldmljZSwgcGFja2FnZU5hbWUsIHBpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0QWNjZXNzb3J5UGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBTdHJpbmcgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICAgIG1EZXZpY2VNYW5hZ2VyLnJlcXVlc3RQZXJtaXNzaW9uKGFjY2Vzc29yeSwgcGFja2FnZU5hbWUsIHBpKTsKKyAgICAgICAgbVNldHRpbmdzTWFuYWdlci5yZXF1ZXN0UGVybWlzc2lvbihhY2Nlc3NvcnksIHBhY2thZ2VOYW1lLCBwaSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZ3JhbnREZXZpY2VQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UsIGludCB1aWQpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKLSAgICAgICAgbURldmljZU1hbmFnZXIuZ3JhbnREZXZpY2VQZXJtaXNzaW9uKGRldmljZSwgdWlkKTsKKyAgICAgICAgbVNldHRpbmdzTWFuYWdlci5ncmFudERldmljZVBlcm1pc3Npb24oZGV2aWNlLCB1aWQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGdyYW50QWNjZXNzb3J5UGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBpbnQgdWlkKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUFOQUdFX1VTQiwgbnVsbCk7Ci0gICAgICAgIG1EZXZpY2VNYW5hZ2VyLmdyYW50QWNjZXNzb3J5UGVybWlzc2lvbihhY2Nlc3NvcnksIHVpZCk7CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuZ3JhbnRBY2Nlc3NvcnlQZXJtaXNzaW9uKGFjY2Vzc29yeSwgdWlkKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNEZWZhdWx0cyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VNYW5hZ2VyLmhhc0RlZmF1bHRzKHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIG1TZXR0aW5nc01hbmFnZXIuaGFzRGVmYXVsdHMocGFja2FnZU5hbWUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFyRGVmYXVsdHMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uTUFOQUdFX1VTQiwgbnVsbCk7Ci0gICAgICAgIG1EZXZpY2VNYW5hZ2VyLmNsZWFyRGVmYXVsdHMocGFja2FnZU5hbWUpOworICAgICAgICBtU2V0dGluZ3NNYW5hZ2VyLmNsZWFyRGVmYXVsdHMocGFja2FnZU5hbWUpOwogICAgIH0KIAotICAgIC8qCi0gICAgICogVGhpcyBoYW5kbGVyIGlzIGZvciBkZWZlcnJlZCBoYW5kbGluZyBvZiBldmVudHMgcmVsYXRlZCB0byBkZXZpY2UgbW9kZSBhbmQgYWNjZXNzb3JpZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7Ci0gICAgICAgIHByaXZhdGUgdm9pZCBhZGRFbmFibGVkRnVuY3Rpb25zTG9ja2VkKEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIC8vIGluY2x1ZGUgc3RhdGUgb2YgYWxsIFVTQiBmdW5jdGlvbnMgaW4gb3VyIGV4dHJhcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW5hYmxlZEZ1bmN0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShtRW5hYmxlZEZ1bmN0aW9ucy5nZXQoaSksIFVzYk1hbmFnZXIuVVNCX0ZVTkNUSU9OX0VOQUJMRUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGlzYWJsZWRGdW5jdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEobURpc2FibGVkRnVuY3Rpb25zLmdldChpKSwgVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fRElTQUJMRUQpOwotICAgICAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlGdW5jdGlvbihTdHJpbmcgZnVuY3Rpb24pIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKKyAgICAgICAgaWYgKG1EZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLnNldFByaW1hcnlGdW5jdGlvbihmdW5jdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVU0IgZGV2aWNlIG1vZGUgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19VUERBVEVfU1RBVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZCAhPSBtTGFzdENvbm5lY3RlZCB8fCBtQ29uZmlndXJhdGlvbiAhPSBtTGFzdENvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVc2JNYW5hZ2VyLmlzRnVuY3Rpb25FbmFibGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2JNYW5hZ2VyLlVTQl9GVU5DVElPTl9BQ0NFU1NPUlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWNjZXNzb3J5IG1vZGUgaXMgb2ZmLCBhbmQgcmVzdG9yZSBkZWZhdWx0IGZ1bmN0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXhpdGVkIFVTQiBhY2Nlc3NvcnkgbW9kZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVc2JNYW5hZ2VyLnNldEZ1bmN0aW9uRW5hYmxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVXNiTWFuYWdlci5VU0JfRlVOQ1RJT05fQUNDRVNTT1JZLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjb3VsZCBub3QgZGlzYWJsZSBhY2Nlc3NvcnkgZnVuY3Rpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1EZWZhdWx0RnVuY3Rpb25zLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbiA9IG1EZWZhdWx0RnVuY3Rpb25zLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVVzYk1hbmFnZXIuc2V0RnVuY3Rpb25FbmFibGVkKGZ1bmN0aW9uLCB0cnVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJjb3VsZCBub3QgcmVlbmFibGUgZnVuY3Rpb24gIiArIGZ1bmN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudEFjY2Vzc29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZU1hbmFnZXIuYWNjZXNzb3J5RGV0YWNoZWQobUN1cnJlbnRBY2Nlc3NvcnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QWNjZXNzb3J5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRlbnRSZXNvbHZlciBjciA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZXR0aW5ncy5TZWN1cmUuZ2V0SW50KGNyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLkRFVklDRV9QUk9WSVNJT05FRCwgMCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG9nLmkoVEFHLCAiRGV2aWNlIG5vdCBwcm92aXNpb25lZCwgc2tpcHBpbmcgVVNCIGJyb2FkY2FzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RDb25uZWN0ZWQgPSBtQ29ubmVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29uZmlndXJhdGlvbiA9IG1Db25maWd1cmF0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBhIHN0aWNreSBicm9hZGNhc3QgY29udGFpbmluZyBjdXJyZW50IFVTQiBzdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KFVzYk1hbmFnZXIuQUNUSU9OX1VTQl9TVEFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFUExBQ0VfUEVORElORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuVVNCX0NPTk5FQ1RFRCwgbUNvbm5lY3RlZCAhPSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5VU0JfQ09ORklHVVJBVElPTiwgbUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVuYWJsZWRGdW5jdGlvbnNMb2NrZWQoaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zZW5kU3RpY2t5QnJvYWRjYXN0KGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfRlVOQ1RJT05fRU5BQkxFRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfRlVOQ1RJT05fRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkVuYWJsZWRMb2NrZWQoKFN0cmluZyltc2cub2JqLCBtc2cud2hhdCA9PSBNU0dfRlVOQ1RJT05fRU5BQkxFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEZ1bmN0aW9uKFN0cmluZyBmdW5jdGlvbikgeworICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLk1BTkFHRV9VU0IsIG51bGwpOworICAgICAgICBpZiAobURldmljZU1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbURldmljZU1hbmFnZXIuc2V0RGVmYXVsdEZ1bmN0aW9uKGZ1bmN0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVTQiBkZXZpY2UgbW9kZSBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KLSAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1hc3NTdG9yYWdlQmFja2luZ0ZpbGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfVVNCLCBudWxsKTsKKyAgICAgICAgaWYgKG1EZXZpY2VNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1EZXZpY2VNYW5hZ2VyLnNldE1hc3NTdG9yYWdlQmFja2luZ0ZpbGUocGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVU0IgZGV2aWNlIG1vZGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcsIFN0cmluZ1tdIGFyZ3MpIHsKQEAgLTYyMiw0MCArMTgzLDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwdy5wcmludGxuKCJVU0IgTWFuYWdlciBTdGF0ZToiKTsKKyAgICAgICAgcHcucHJpbnRsbigiVVNCIE1hbmFnZXIgU3RhdGU6Iik7CiAKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgVVNCIERldmljZSBTdGF0ZToiKTsKLSAgICAgICAgICAgIHB3LnByaW50KCIgICAgRW5hYmxlZCBGdW5jdGlvbnM6ICIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRW5hYmxlZEZ1bmN0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHB3LnByaW50KG1FbmFibGVkRnVuY3Rpb25zLmdldChpKSArICIgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIHB3LnByaW50KCIgICAgRGlzYWJsZWQgRnVuY3Rpb25zOiAiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbURpc2FibGVkRnVuY3Rpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQobURpc2FibGVkRnVuY3Rpb25zLmdldChpKSArICIgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIHB3LnByaW50KCIgICAgRGVmYXVsdCBGdW5jdGlvbnM6ICIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRGVmYXVsdEZ1bmN0aW9ucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHB3LnByaW50KG1EZWZhdWx0RnVuY3Rpb25zLmdldChpKSArICIgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKLSAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICBtQ29ubmVjdGVkOiAiICsgbUNvbm5lY3RlZCArICIsIG1Db25maWd1cmF0aW9uOiAiICsgbUNvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgcHcucHJpbnRsbigiICAgIG1DdXJyZW50QWNjZXNzb3J5OiAiICsgbUN1cnJlbnRBY2Nlc3NvcnkpOwotCi0gICAgICAgICAgICBwdy5wcmludGxuKCIgIFVTQiBIb3N0IFN0YXRlOiIpOwotICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG1EZXZpY2VzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICIgKyBuYW1lICsgIjogIiArIG1EZXZpY2VzLmdldChuYW1lKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtRGV2aWNlTWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBtRGV2aWNlTWFuYWdlci5kdW1wKGZkLCBwdyk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1Ib3N0TWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtSG9zdE1hbmFnZXIuZHVtcChmZCwgcHcpOworICAgICAgICB9CisgICAgICAgIG1TZXR0aW5nc01hbmFnZXIuZHVtcChmZCwgcHcpOwogICAgIH0KLQotICAgIC8vIGhvc3Qgc3VwcG9ydAotICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgbW9uaXRvclVzYkhvc3RCdXMoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVPcGVuRGV2aWNlKFN0cmluZyBkZXZpY2VOYW1lKTsKLSAgICAvLyBhY2Nlc3Nvcnkgc3VwcG9ydAotICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZ1tdIG5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MoKTsKLSAgICBwcml2YXRlIG5hdGl2ZSBQYXJjZWxGaWxlRGVzY3JpcHRvciBuYXRpdmVPcGVuQWNjZXNzb3J5KCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2V0dGluZ3NNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2V0dGluZ3NNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExMzY3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXR0aW5nc01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDEwMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci51c2I7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5BY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFjdGl2aXR5SW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5YbWxSZXNvdXJjZVBhcnNlcjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JBY2Nlc3Nvcnk7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS51c2IuVXNiRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUudXNiLlVzYkludGVyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLnVzYi5Vc2JNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuRmlsZVV0aWxzOworaW1wb3J0IGFuZHJvaWQub3MuUHJvY2VzczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VCb29sZWFuQXJyYXk7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmNvbnRlbnQuUGFja2FnZU1vbml0b3I7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5GYXN0WG1sU2VyaWFsaXplcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLlhtbFV0aWxzOworCitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFNlcmlhbGl6ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworY2xhc3MgVXNiU2V0dGluZ3NNYW5hZ2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVXNiU2V0dGluZ3NNYW5hZ2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlIHNTZXR0aW5nc0ZpbGUgPSBuZXcgRmlsZSgiL2RhdGEvc3lzdGVtL3VzYl9kZXZpY2VfbWFuYWdlci54bWwiKTsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKKworICAgIC8vIFRlbXBvcmFyeSBtYXBwaW5nIFVTQiBkZXZpY2UgbmFtZSB0byBsaXN0IG9mIFVJRHMgd2l0aCBwZXJtaXNzaW9ucyBmb3IgdGhlIGRldmljZQorICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFNwYXJzZUJvb2xlYW5BcnJheT4gbURldmljZVBlcm1pc3Npb25NYXAgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTcGFyc2VCb29sZWFuQXJyYXk+KCk7CisgICAgLy8gVGVtcG9yYXJ5IG1hcHBpbmcgVXNiQWNjZXNzb3J5IHRvIGxpc3Qgb2YgVUlEcyB3aXRoIHBlcm1pc3Npb25zIGZvciB0aGUgYWNjZXNzb3J5CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFVzYkFjY2Vzc29yeSwgU3BhcnNlQm9vbGVhbkFycmF5PiBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxVc2JBY2Nlc3NvcnksIFNwYXJzZUJvb2xlYW5BcnJheT4oKTsKKyAgICAvLyBNYXBzIERldmljZUZpbHRlciB0byB1c2VyIHByZWZlcnJlZCBhcHBsaWNhdGlvbiBwYWNrYWdlCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPERldmljZUZpbHRlciwgU3RyaW5nPiBtRGV2aWNlUHJlZmVyZW5jZU1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxEZXZpY2VGaWx0ZXIsIFN0cmluZz4oKTsKKyAgICAvLyBNYXBzIEFjY2Vzc29yeUZpbHRlciB0byB1c2VyIHByZWZlcnJlZCBhcHBsaWNhdGlvbiBwYWNrYWdlCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEFjY2Vzc29yeUZpbHRlciwgU3RyaW5nPiBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcCA9CisgICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2Nlc3NvcnlGaWx0ZXIsIFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgVVNCIGRldmljZS4KKyAgICAvLyBXaGVuIHVzZWQgaW4gSGFzaE1hcHMgYWxsIHZhbHVlcyBtdXN0IGJlIHNwZWNpZmllZCwKKyAgICAvLyBidXQgd2lsZGNhcmRzIGNhbiBiZSB1c2VkIGZvciBhbnkgb2YgdGhlIGZpZWxkcyBpbgorICAgIC8vIHRoZSBwYWNrYWdlIG1ldGEtZGF0YS4KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXZpY2VGaWx0ZXIgeworICAgICAgICAvLyBVU0IgVmVuZG9yIElEIChvciAtMSBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlbmRvcklkOworICAgICAgICAvLyBVU0IgUHJvZHVjdCBJRCAob3IgLTEgZm9yIHVuc3BlY2lmaWVkKQorICAgICAgICBwdWJsaWMgZmluYWwgaW50IG1Qcm9kdWN0SWQ7CisgICAgICAgIC8vIFVTQiBkZXZpY2Ugb3IgaW50ZXJmYWNlIGNsYXNzIChvciAtMSBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbUNsYXNzOworICAgICAgICAvLyBVU0IgZGV2aWNlIHN1YmNsYXNzIChvciAtMSBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVN1YmNsYXNzOworICAgICAgICAvLyBVU0IgZGV2aWNlIHByb3RvY29sIChvciAtMSBmb3IgdW5zcGVjaWZpZWQpCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVByb3RvY29sOworCisgICAgICAgIHB1YmxpYyBEZXZpY2VGaWx0ZXIoaW50IHZpZCwgaW50IHBpZCwgaW50IGNsYXN6LCBpbnQgc3ViY2xhc3MsIGludCBwcm90b2NvbCkgeworICAgICAgICAgICAgbVZlbmRvcklkID0gdmlkOworICAgICAgICAgICAgbVByb2R1Y3RJZCA9IHBpZDsKKyAgICAgICAgICAgIG1DbGFzcyA9IGNsYXN6OworICAgICAgICAgICAgbVN1YmNsYXNzID0gc3ViY2xhc3M7CisgICAgICAgICAgICBtUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZXZpY2VGaWx0ZXIoVXNiRGV2aWNlIGRldmljZSkgeworICAgICAgICAgICAgbVZlbmRvcklkID0gZGV2aWNlLmdldFZlbmRvcklkKCk7CisgICAgICAgICAgICBtUHJvZHVjdElkID0gZGV2aWNlLmdldFByb2R1Y3RJZCgpOworICAgICAgICAgICAgbUNsYXNzID0gZGV2aWNlLmdldERldmljZUNsYXNzKCk7CisgICAgICAgICAgICBtU3ViY2xhc3MgPSBkZXZpY2UuZ2V0RGV2aWNlU3ViY2xhc3MoKTsKKyAgICAgICAgICAgIG1Qcm90b2NvbCA9IGRldmljZS5nZXREZXZpY2VQcm90b2NvbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBEZXZpY2VGaWx0ZXIgcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IHZlbmRvcklkID0gLTE7CisgICAgICAgICAgICBpbnQgcHJvZHVjdElkID0gLTE7CisgICAgICAgICAgICBpbnQgZGV2aWNlQ2xhc3MgPSAtMTsKKyAgICAgICAgICAgIGludCBkZXZpY2VTdWJjbGFzcyA9IC0xOworICAgICAgICAgICAgaW50IGRldmljZVByb3RvY29sID0gLTE7CisKKyAgICAgICAgICAgIGludCBjb3VudCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVDb3VudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlTmFtZShpKTsKKyAgICAgICAgICAgICAgICAvLyBBbGwgYXR0cmlidXRlIHZhbHVlcyBhcmUgaW50cworICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IEludGVnZXIucGFyc2VJbnQocGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpKTsKKworICAgICAgICAgICAgICAgIGlmICgidmVuZG9yLWlkIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmVuZG9ySWQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwcm9kdWN0LWlkIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiY2xhc3MiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VDbGFzcyA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInN1YmNsYXNzIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3ViY2xhc3MgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwcm90b2NvbCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZVByb3RvY29sID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXZpY2VGaWx0ZXIodmVuZG9ySWQsIHByb2R1Y3RJZCwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlQ2xhc3MsIGRldmljZVN1YmNsYXNzLCBkZXZpY2VQcm90b2NvbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShYbWxTZXJpYWxpemVyIHNlcmlhbGl6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJ1c2ItZGV2aWNlIik7CisgICAgICAgICAgICBpZiAobVZlbmRvcklkICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInZlbmRvci1pZCIsIEludGVnZXIudG9TdHJpbmcobVZlbmRvcklkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVByb2R1Y3RJZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJwcm9kdWN0LWlkIiwgSW50ZWdlci50b1N0cmluZyhtUHJvZHVjdElkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUNsYXNzICE9IC0xKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgImNsYXNzIiwgSW50ZWdlci50b1N0cmluZyhtQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3ViY2xhc3MgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmF0dHJpYnV0ZShudWxsLCAic3ViY2xhc3MiLCBJbnRlZ2VyLnRvU3RyaW5nKG1TdWJjbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Qcm90b2NvbCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJwcm90b2NvbCIsIEludGVnZXIudG9TdHJpbmcobVByb3RvY29sKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhudWxsLCAidXNiLWRldmljZSIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoaW50IGNsYXN6LCBpbnQgc3ViY2xhc3MsIGludCBwcm90b2NvbCkgeworICAgICAgICAgICAgcmV0dXJuICgobUNsYXNzID09IC0xIHx8IGNsYXN6ID09IG1DbGFzcykgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TdWJjbGFzcyA9PSAtMSB8fCBzdWJjbGFzcyA9PSBtU3ViY2xhc3MpICYmCisgICAgICAgICAgICAgICAgICAgIChtUHJvdG9jb2wgPT0gLTEgfHwgcHJvdG9jb2wgPT0gbVByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFVzYkRldmljZSBkZXZpY2UpIHsKKyAgICAgICAgICAgIGlmIChtVmVuZG9ySWQgIT0gLTEgJiYgZGV2aWNlLmdldFZlbmRvcklkKCkgIT0gbVZlbmRvcklkKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobVByb2R1Y3RJZCAhPSAtMSAmJiBkZXZpY2UuZ2V0UHJvZHVjdElkKCkgIT0gbVByb2R1Y3RJZCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICAvLyBjaGVjayBkZXZpY2UgY2xhc3Mvc3ViY2xhc3MvcHJvdG9jb2wKKyAgICAgICAgICAgIGlmIChtYXRjaGVzKGRldmljZS5nZXREZXZpY2VDbGFzcygpLCBkZXZpY2UuZ2V0RGV2aWNlU3ViY2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZVByb3RvY29sKCkpKSByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gaWYgZGV2aWNlIGRvZXNuJ3QgbWF0Y2gsIGNoZWNrIHRoZSBpbnRlcmZhY2VzCisgICAgICAgICAgICBpbnQgY291bnQgPSBkZXZpY2UuZ2V0SW50ZXJmYWNlQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFVzYkludGVyZmFjZSBpbnRmID0gZGV2aWNlLmdldEludGVyZmFjZShpKTsKKyAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMoaW50Zi5nZXRJbnRlcmZhY2VDbGFzcygpLCBpbnRmLmdldEludGVyZmFjZVN1YmNsYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRmLmdldEludGVyZmFjZVByb3RvY29sKCkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhEZXZpY2VGaWx0ZXIgZikgeworICAgICAgICAgICAgaWYgKG1WZW5kb3JJZCAhPSAtMSAmJiBmLm1WZW5kb3JJZCAhPSBtVmVuZG9ySWQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtUHJvZHVjdElkICE9IC0xICYmIGYubVByb2R1Y3RJZCAhPSBtUHJvZHVjdElkKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGRldmljZSBjbGFzcy9zdWJjbGFzcy9wcm90b2NvbAorICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXMoZi5tQ2xhc3MsIGYubVN1YmNsYXNzLCBmLm1Qcm90b2NvbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIC8vIGNhbid0IGNvbXBhcmUgaWYgd2UgaGF2ZSB3aWxkY2FyZCBzdHJpbmdzCisgICAgICAgICAgICBpZiAobVZlbmRvcklkID09IC0xIHx8IG1Qcm9kdWN0SWQgPT0gLTEgfHwKKyAgICAgICAgICAgICAgICAgICAgbUNsYXNzID09IC0xIHx8IG1TdWJjbGFzcyA9PSAtMSB8fCBtUHJvdG9jb2wgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRGV2aWNlRmlsdGVyKSB7CisgICAgICAgICAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IChEZXZpY2VGaWx0ZXIpb2JqOworICAgICAgICAgICAgICAgIHJldHVybiAoZmlsdGVyLm1WZW5kb3JJZCA9PSBtVmVuZG9ySWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5tUHJvZHVjdElkID09IG1Qcm9kdWN0SWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5tQ2xhc3MgPT0gbUNsYXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIubVN1YmNsYXNzID09IG1TdWJjbGFzcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm1Qcm90b2NvbCA9PSBtUHJvdG9jb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFVzYkRldmljZSkgeworICAgICAgICAgICAgICAgIFVzYkRldmljZSBkZXZpY2UgPSAoVXNiRGV2aWNlKW9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGRldmljZS5nZXRWZW5kb3JJZCgpID09IG1WZW5kb3JJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldFByb2R1Y3RJZCgpID09IG1Qcm9kdWN0SWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5nZXREZXZpY2VDbGFzcygpID09IG1DbGFzcyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmdldERldmljZVN1YmNsYXNzKCkgPT0gbVN1YmNsYXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuZ2V0RGV2aWNlUHJvdG9jb2woKSA9PSBtUHJvdG9jb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKCgobVZlbmRvcklkIDw8IDE2KSB8IG1Qcm9kdWN0SWQpIF4KKyAgICAgICAgICAgICAgICAgICAgKChtQ2xhc3MgPDwgMTYpIHwgKG1TdWJjbGFzcyA8PCA4KSB8IG1Qcm90b2NvbCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkRldmljZUZpbHRlclttVmVuZG9ySWQ9IiArIG1WZW5kb3JJZCArICIsbVByb2R1Y3RJZD0iICsgbVByb2R1Y3RJZCArCisgICAgICAgICAgICAgICAgICAgICIsbUNsYXNzPSIgKyBtQ2xhc3MgKyAiLG1TdWJjbGFzcz0iICsgbVN1YmNsYXNzICsKKyAgICAgICAgICAgICAgICAgICAgIixtUHJvdG9jb2w9IiArIG1Qcm90b2NvbCArICJdIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZXNjcmliZSBhIFVTQiBhY2Nlc3NvcnkuCisgICAgLy8gV2hlbiB1c2VkIGluIEhhc2hNYXBzIGFsbCB2YWx1ZXMgbXVzdCBiZSBzcGVjaWZpZWQsCisgICAgLy8gYnV0IHdpbGRjYXJkcyBjYW4gYmUgdXNlZCBmb3IgYW55IG9mIHRoZSBmaWVsZHMgaW4KKyAgICAvLyB0aGUgcGFja2FnZSBtZXRhLWRhdGEuCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWNjZXNzb3J5RmlsdGVyIHsKKyAgICAgICAgLy8gVVNCIGFjY2Vzc29yeSBtYW51ZmFjdHVyZXIgKG9yIG51bGwgZm9yIHVuc3BlY2lmaWVkKQorICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1NYW51ZmFjdHVyZXI7CisgICAgICAgIC8vIFVTQiBhY2Nlc3NvcnkgbW9kZWwgKG9yIG51bGwgZm9yIHVuc3BlY2lmaWVkKQorICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1Nb2RlbDsKKyAgICAgICAgLy8gVVNCIGFjY2Vzc29yeSB2ZXJzaW9uIChvciBudWxsIGZvciB1bnNwZWNpZmllZCkKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtVmVyc2lvbjsKKworICAgICAgICBwdWJsaWMgQWNjZXNzb3J5RmlsdGVyKFN0cmluZyBtYW51ZmFjdHVyZXIsIFN0cmluZyBtb2RlbCwgU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgICAgIG1NYW51ZmFjdHVyZXIgPSBtYW51ZmFjdHVyZXI7CisgICAgICAgICAgICBtTW9kZWwgPSBtb2RlbDsKKyAgICAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY2Nlc3NvcnlGaWx0ZXIoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICAgICAgbU1hbnVmYWN0dXJlciA9IGFjY2Vzc29yeS5nZXRNYW51ZmFjdHVyZXIoKTsKKyAgICAgICAgICAgIG1Nb2RlbCA9IGFjY2Vzc29yeS5nZXRNb2RlbCgpOworICAgICAgICAgICAgbVZlcnNpb24gPSBhY2Nlc3NvcnkuZ2V0VmVyc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBBY2Nlc3NvcnlGaWx0ZXIgcmVhZChYbWxQdWxsUGFyc2VyIHBhcnNlcikKKyAgICAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIG1hbnVmYWN0dXJlciA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgbW9kZWwgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBudWxsOworCisgICAgICAgICAgICBpbnQgY291bnQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlQ291bnQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcGFyc2VyLmdldEF0dHJpYnV0ZU5hbWUoaSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKGkpOworCisgICAgICAgICAgICAgICAgaWYgKCJtYW51ZmFjdHVyZXIiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtb2RlbCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgidmVyc2lvbiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJldHVybiBuZXcgQWNjZXNzb3J5RmlsdGVyKG1hbnVmYWN0dXJlciwgbW9kZWwsIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoWG1sU2VyaWFsaXplciBzZXJpYWxpemVyKXRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJ1c2ItYWNjZXNzb3J5Iik7CisgICAgICAgICAgICBpZiAobU1hbnVmYWN0dXJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgIm1hbnVmYWN0dXJlciIsIG1NYW51ZmFjdHVyZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Nb2RlbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgIm1vZGVsIiwgbU1vZGVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInZlcnNpb24iLCBtVmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhudWxsLCAidXNiLWFjY2Vzc29yeSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhVc2JBY2Nlc3NvcnkgYWNjKSB7CisgICAgICAgICAgICBpZiAobU1hbnVmYWN0dXJlciAhPSBudWxsICYmICFhY2MuZ2V0TWFudWZhY3R1cmVyKCkuZXF1YWxzKG1NYW51ZmFjdHVyZXIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobU1vZGVsICE9IG51bGwgJiYgIWFjYy5nZXRNb2RlbCgpLmVxdWFscyhtTW9kZWwpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobVZlcnNpb24gIT0gbnVsbCAmJiAhYWNjLmdldFZlcnNpb24oKS5lcXVhbHMobVZlcnNpb24pKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQWNjZXNzb3J5RmlsdGVyIGYpIHsKKyAgICAgICAgICAgIGlmIChtTWFudWZhY3R1cmVyICE9IG51bGwgJiYgIWYubU1hbnVmYWN0dXJlci5lcXVhbHMobU1hbnVmYWN0dXJlcikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtTW9kZWwgIT0gbnVsbCAmJiAhZi5tTW9kZWwuZXF1YWxzKG1Nb2RlbCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtVmVyc2lvbiAhPSBudWxsICYmICFmLm1WZXJzaW9uLmVxdWFscyhtVmVyc2lvbikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAvLyBjYW4ndCBjb21wYXJlIGlmIHdlIGhhdmUgd2lsZGNhcmQgc3RyaW5ncworICAgICAgICAgICAgaWYgKG1NYW51ZmFjdHVyZXIgPT0gbnVsbCB8fCBtTW9kZWwgPT0gbnVsbCB8fCBtVmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFjY2Vzc29yeUZpbHRlcikgeworICAgICAgICAgICAgICAgIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgPSAoQWNjZXNzb3J5RmlsdGVyKW9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1NYW51ZmFjdHVyZXIuZXF1YWxzKGZpbHRlci5tTWFudWZhY3R1cmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGVsLmVxdWFscyhmaWx0ZXIubU1vZGVsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbVZlcnNpb24uZXF1YWxzKGZpbHRlci5tVmVyc2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFVzYkFjY2Vzc29yeSkgeworICAgICAgICAgICAgICAgIFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkgPSAoVXNiQWNjZXNzb3J5KW9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1NYW51ZmFjdHVyZXIuZXF1YWxzKGFjY2Vzc29yeS5nZXRNYW51ZmFjdHVyZXIoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Nb2RlbC5lcXVhbHMoYWNjZXNzb3J5LmdldE1vZGVsKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtVmVyc2lvbi5lcXVhbHMoYWNjZXNzb3J5LmdldFZlcnNpb24oKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKChtTWFudWZhY3R1cmVyID09IG51bGwgPyAwIDogbU1hbnVmYWN0dXJlci5oYXNoQ29kZSgpKSBeCisgICAgICAgICAgICAgICAgICAgIChtTW9kZWwgPT0gbnVsbCA/IDAgOiBtTW9kZWwuaGFzaENvZGUoKSkgXgorICAgICAgICAgICAgICAgICAgICAobVZlcnNpb24gPT0gbnVsbCA/IDAgOiBtVmVyc2lvbi5oYXNoQ29kZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQWNjZXNzb3J5RmlsdGVyW21NYW51ZmFjdHVyZXI9XCIiICsgbU1hbnVmYWN0dXJlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgbU1vZGVsPVwiIiArIG1Nb2RlbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiwgbVZlcnNpb249XCIiICsgbVZlcnNpb24gKyAiXCJdIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTXlQYWNrYWdlTW9uaXRvciBleHRlbmRzIFBhY2thZ2VNb25pdG9yIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBvblBhY2thZ2VBZGRlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1aWQpIHsKKyAgICAgICAgICAgIGhhbmRsZVBhY2thZ2VVcGRhdGUocGFja2FnZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25QYWNrYWdlQ2hhbmdlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1aWQsIFN0cmluZ1tdIGNvbXBvbmVudHMpIHsKKyAgICAgICAgICAgIGhhbmRsZVBhY2thZ2VVcGRhdGUocGFja2FnZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25QYWNrYWdlUmVtb3ZlZChTdHJpbmcgcGFja2FnZU5hbWUsIGludCB1aWQpIHsKKyAgICAgICAgICAgIGNsZWFyRGVmYXVsdHMocGFja2FnZU5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIE15UGFja2FnZU1vbml0b3IgbVBhY2thZ2VNb25pdG9yID0gbmV3IE15UGFja2FnZU1vbml0b3IoKTsKKworICAgIHB1YmxpYyBVc2JTZXR0aW5nc01hbmFnZXIoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICByZWFkU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICBtUGFja2FnZU1vbml0b3IucmVnaXN0ZXIoY29udGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRQcmVmZXJlbmNlKFhtbFB1bGxQYXJzZXIgcGFyc2VyKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKyAgICAgICAgaW50IGNvdW50ID0gcGFyc2VyLmdldEF0dHJpYnV0ZUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKCJwYWNrYWdlIi5lcXVhbHMocGFyc2VyLmdldEF0dHJpYnV0ZU5hbWUoaSkpKSB7CisgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgWG1sVXRpbHMubmV4dEVsZW1lbnQocGFyc2VyKTsKKyAgICAgICAgaWYgKCJ1c2ItZGV2aWNlIi5lcXVhbHMocGFyc2VyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIERldmljZUZpbHRlciBmaWx0ZXIgPSBEZXZpY2VGaWx0ZXIucmVhZChwYXJzZXIpOworICAgICAgICAgICAgbURldmljZVByZWZlcmVuY2VNYXAucHV0KGZpbHRlciwgcGFja2FnZU5hbWUpOworICAgICAgICB9IGVsc2UgaWYgKCJ1c2ItYWNjZXNzb3J5Ii5lcXVhbHMocGFyc2VyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgPSBBY2Nlc3NvcnlGaWx0ZXIucmVhZChwYXJzZXIpOworICAgICAgICAgICAgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAucHV0KGZpbHRlciwgcGFja2FnZU5hbWUpOworICAgICAgICB9CisgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRTZXR0aW5nc0xvY2tlZCgpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBYbWwubmV3UHVsbFBhcnNlcigpOworICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KHN0cmVhbSwgbnVsbCk7CisKKyAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgICAgICAgICB3aGlsZSAocGFyc2VyLmdldEV2ZW50VHlwZSgpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgicHJlZmVyZW5jZSIuZXF1YWxzKHRhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRQcmVmZXJlbmNlKHBhcnNlcik7CisgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0dGluZ3MgZmlsZSBub3QgZm91bmQiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIHJlYWRpbmcgc2V0dGluZ3MgZmlsZSwgZGVsZXRpbmcgdG8gc3RhcnQgZnJlc2giLCBlKTsKKyAgICAgICAgICAgIHNTZXR0aW5nc0ZpbGUuZGVsZXRlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2V0dGluZ3NMb2NrZWQoKSB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZnN0ciA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNTZXR0aW5nc0ZpbGUpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAid3JpdGluZyBzZXR0aW5ncyB0byAiICsgZnN0cik7CisgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBzdHIgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZnN0cik7CisgICAgICAgICAgICBGYXN0WG1sU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEZhc3RYbWxTZXJpYWxpemVyKCk7CisgICAgICAgICAgICBzZXJpYWxpemVyLnNldE91dHB1dChzdHIsICJ1dGYtOCIpOworICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydERvY3VtZW50KG51bGwsIHRydWUpOworICAgICAgICAgICAgc2VyaWFsaXplci5zZXRGZWF0dXJlKCJodHRwOi8veG1scHVsbC5vcmcvdjEvZG9jL2ZlYXR1cmVzLmh0bWwjaW5kZW50LW91dHB1dCIsIHRydWUpOworICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhudWxsLCAic2V0dGluZ3MiKTsKKworICAgICAgICAgICAgZm9yIChEZXZpY2VGaWx0ZXIgZmlsdGVyIDogbURldmljZVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnN0YXJ0VGFnKG51bGwsICJwcmVmZXJlbmNlIik7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5hdHRyaWJ1dGUobnVsbCwgInBhY2thZ2UiLCBtRGV2aWNlUHJlZmVyZW5jZU1hcC5nZXQoZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgZmlsdGVyLndyaXRlKHNlcmlhbGl6ZXIpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kVGFnKG51bGwsICJwcmVmZXJlbmNlIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA6IG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplci5zdGFydFRhZyhudWxsLCAicHJlZmVyZW5jZSIpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuYXR0cmlidXRlKG51bGwsICJwYWNrYWdlIiwgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOworICAgICAgICAgICAgICAgIGZpbHRlci53cml0ZShzZXJpYWxpemVyKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhudWxsLCAicHJlZmVyZW5jZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJpYWxpemVyLmVuZFRhZyhudWxsLCAic2V0dGluZ3MiKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIuZW5kRG9jdW1lbnQoKTsKKworICAgICAgICAgICAgc3RyLmZsdXNoKCk7CisgICAgICAgICAgICBGaWxlVXRpbHMuc3luYyhmc3RyKTsKKyAgICAgICAgICAgIHN0ci5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiZXJyb3Igd3JpdGluZyBzZXR0aW5ncyBmaWxlLCBkZWxldGluZyB0byBzdGFydCBmcmVzaCIsIGUpOworICAgICAgICAgICAgc1NldHRpbmdzRmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrcyB0byBzZWUgaWYgYSBwYWNrYWdlIG1hdGNoZXMgYSBkZXZpY2Ugb3IgYWNjZXNzb3J5LgorICAgIC8vIE9ubHkgb25lIG9mIGRldmljZSBhbmQgYWNjZXNzb3J5IHNob3VsZCBiZSBub24tbnVsbC4KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFja2FnZU1hdGNoZXNMb2NrZWQoUmVzb2x2ZUluZm8gaW5mbywgU3RyaW5nIG1ldGFEYXRhTmFtZSwKKyAgICAgICAgICAgIFVzYkRldmljZSBkZXZpY2UsIFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKKyAgICAgICAgQWN0aXZpdHlJbmZvIGFpID0gaW5mby5hY3Rpdml0eUluZm87CisKKyAgICAgICAgWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlciA9IGFpLmxvYWRYbWxNZXRhRGF0YShtUGFja2FnZU1hbmFnZXIsIG1ldGFEYXRhTmFtZSk7CisgICAgICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJubyBtZXRhLWRhdGEgZm9yICIgKyBpbmZvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgICAgICAgICB3aGlsZSAocGFyc2VyLmdldEV2ZW50VHlwZSgpICE9IFhtbFB1bGxQYXJzZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbCAmJiAidXNiLWRldmljZSIuZXF1YWxzKHRhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbHRlciBmaWx0ZXIgPSBEZXZpY2VGaWx0ZXIucmVhZChwYXJzZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm1hdGNoZXMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWNjZXNzb3J5ICE9IG51bGwgJiYgInVzYi1hY2Nlc3NvcnkiLmVxdWFscyh0YWdOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBBY2Nlc3NvcnlGaWx0ZXIgZmlsdGVyID0gQWNjZXNzb3J5RmlsdGVyLnJlYWQocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKGFjY2Vzc29yeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFhtbFV0aWxzLm5leHRFbGVtZW50KHBhcnNlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gbG9hZCBjb21wb25lbnQgaW5mbyAiICsgaW5mby50b1N0cmluZygpLCBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgIT0gbnVsbCkgcGFyc2VyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBnZXREZXZpY2VNYXRjaGVzTG9ja2VkKFVzYkRldmljZSBkZXZpY2UsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgQXJyYXlMaXN0PFJlc29sdmVJbmZvPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDxSZXNvbHZlSW5mbz4oKTsKKyAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gcmVzb2x2ZUluZm9zID0gbVBhY2thZ2VNYW5hZ2VyLnF1ZXJ5SW50ZW50QWN0aXZpdGllcyhpbnRlbnQsCisgICAgICAgICAgICAgICAgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisgICAgICAgIGludCBjb3VudCA9IHJlc29sdmVJbmZvcy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gPSByZXNvbHZlSW5mb3MuZ2V0KGkpOworICAgICAgICAgICAgaWYgKHBhY2thZ2VNYXRjaGVzTG9ja2VkKHJlc29sdmVJbmZvLCBpbnRlbnQuZ2V0QWN0aW9uKCksIGRldmljZSwgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFkZChyZXNvbHZlSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IGdldEFjY2Vzc29yeU1hdGNoZXNMb2NrZWQoCisgICAgICAgICAgICBVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5LCBJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIEFycmF5TGlzdDxSZXNvbHZlSW5mbz4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+KCk7CisgICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IHJlc29sdmVJbmZvcyA9IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudEFjdGl2aXRpZXMoaW50ZW50LAorICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOworICAgICAgICBpbnQgY291bnQgPSByZXNvbHZlSW5mb3Muc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gcmVzb2x2ZUluZm9zLmdldChpKTsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTWF0Y2hlc0xvY2tlZChyZXNvbHZlSW5mbywgaW50ZW50LmdldEFjdGlvbigpLCBudWxsLCBhY2Nlc3NvcnkpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQocmVzb2x2ZUluZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRldmljZUF0dGFjaGVkKFVzYkRldmljZSBkZXZpY2UpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiTWFuYWdlci5BQ1RJT05fVVNCX0RFVklDRV9BVFRBQ0hFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKworICAgICAgICBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IG1hdGNoZXM7CisgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbWF0Y2hlcyA9IGdldERldmljZU1hdGNoZXNMb2NrZWQoZGV2aWNlLCBpbnRlbnQpOworICAgICAgICAgICAgLy8gTGF1bmNoIG91ciBkZWZhdWx0IGFjdGl2aXR5IGRpcmVjdGx5LCBpZiB3ZSBoYXZlIG9uZS4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSB3aWxsIHN0YXJ0IHRoZSBVc2JSZXNvbHZlckFjdGl2aXR5IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZS4KKyAgICAgICAgICAgIGRlZmF1bHRQYWNrYWdlID0gbURldmljZVByZWZlcmVuY2VNYXAuZ2V0KG5ldyBEZXZpY2VGaWx0ZXIoZGV2aWNlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXNvbHZlQWN0aXZpdHkoaW50ZW50LCBtYXRjaGVzLCBkZWZhdWx0UGFja2FnZSwgZGV2aWNlLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXZpY2VEZXRhY2hlZChVc2JEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIC8vIGNsZWFyIHRlbXBvcmFyeSBwZXJtaXNzaW9ucyBmb3IgdGhlIGRldmljZQorICAgICAgICBtRGV2aWNlUGVybWlzc2lvbk1hcC5yZW1vdmUoZGV2aWNlLmdldERldmljZU5hbWUoKSk7CisKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiTWFuYWdlci5BQ1RJT05fVVNCX0RFVklDRV9ERVRBQ0hFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgTG9nLmQoVEFHLCAidXNiRGV2aWNlUmVtb3ZlZCwgc2VuZGluZyAiICsgaW50ZW50KTsKKyAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFjY2Vzc29yeUF0dGFjaGVkKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoVXNiTWFuYWdlci5BQ1RJT05fVVNCX0FDQ0VTU09SWV9BVFRBQ0hFRCk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0FDQ0VTU09SWSwgYWNjZXNzb3J5KTsKKyAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKworICAgICAgICBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IG1hdGNoZXM7CisgICAgICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZTsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgbWF0Y2hlcyA9IGdldEFjY2Vzc29yeU1hdGNoZXNMb2NrZWQoYWNjZXNzb3J5LCBpbnRlbnQpOworICAgICAgICAgICAgLy8gTGF1bmNoIG91ciBkZWZhdWx0IGFjdGl2aXR5IGRpcmVjdGx5LCBpZiB3ZSBoYXZlIG9uZS4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSB3aWxsIHN0YXJ0IHRoZSBVc2JSZXNvbHZlckFjdGl2aXR5IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZS4KKyAgICAgICAgICAgIGRlZmF1bHRQYWNrYWdlID0gbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAuZ2V0KG5ldyBBY2Nlc3NvcnlGaWx0ZXIoYWNjZXNzb3J5KSk7CisgICAgICAgIH0KKworICAgICAgICByZXNvbHZlQWN0aXZpdHkoaW50ZW50LCBtYXRjaGVzLCBkZWZhdWx0UGFja2FnZSwgbnVsbCwgYWNjZXNzb3J5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY2Nlc3NvcnlEZXRhY2hlZChVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7CisgICAgICAgIC8vIGNsZWFyIHRlbXBvcmFyeSBwZXJtaXNzaW9ucyBmb3IgdGhlIGFjY2Vzc29yeQorICAgICAgICBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5yZW1vdmUoYWNjZXNzb3J5KTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgKKyAgICAgICAgICAgICAgICBVc2JNYW5hZ2VyLkFDVElPTl9VU0JfQUNDRVNTT1JZX0RFVEFDSEVEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KGludGVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVBY3Rpdml0eShJbnRlbnQgaW50ZW50LCBBcnJheUxpc3Q8UmVzb2x2ZUluZm8+IG1hdGNoZXMsCisgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFBhY2thZ2UsIFVzYkRldmljZSBkZXZpY2UsIFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnkpIHsKKyAgICAgICAgaW50IGNvdW50ID0gbWF0Y2hlcy5zaXplKCk7CisKKyAgICAgICAgLy8gZG9uJ3Qgc2hvdyB0aGUgcmVzb2x2ZXIgYWN0aXZpdHkgaWYgdGhlcmUgYXJlIG5vIGNob2ljZXMgYXZhaWxhYmxlCisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYWNjZXNzb3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdXJpID0gYWNjZXNzb3J5LmdldFVyaSgpOworICAgICAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCAmJiB1cmkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRpc3BsYXkgVVJJIHRvIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgVXNiUmVzb2x2ZXJBY3Rpdml0eSBzbyB1c2VyIGNhbiBjaG9vc2UgYW4gYWN0aXZpdHkKKyAgICAgICAgICAgICAgICAgICAgSW50ZW50IGRpYWxvZ0ludGVudCA9IG5ldyBJbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhbG9nSW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS51c2IuVXNiQWNjZXNzb3J5VXJpQWN0aXZpdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhbG9nSW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgZGlhbG9nSW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOworICAgICAgICAgICAgICAgICAgICBkaWFsb2dJbnRlbnQucHV0RXh0cmEoInVyaSIsIHVyaSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGRpYWxvZ0ludGVudCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAidW5hYmxlIHRvIHN0YXJ0IFVzYkFjY2Vzc29yeVVyaUFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFJlc29sdmVJbmZvIGRlZmF1bHRSSSA9IG51bGw7CisgICAgICAgIGlmIChjb3VudCA9PSAxICYmIGRlZmF1bHRQYWNrYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBvdXIgc2luZ2xlIGNob2ljZSBpcyBvbiB0aGUgc3lzdGVtIHBhcnRpdGlvbi4KKyAgICAgICAgICAgIC8vIElmIHNvLCB0cmVhdCBpdCBhcyBvdXIgZGVmYXVsdCB3aXRob3V0IGNhbGxpbmcgVXNiUmVzb2x2ZXJBY3Rpdml0eQorICAgICAgICAgICAgUmVzb2x2ZUluZm8gckluZm8gPSBtYXRjaGVzLmdldCgwKTsKKyAgICAgICAgICAgIGlmIChySW5mby5hY3Rpdml0eUluZm8gIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBySW5mby5hY3Rpdml0eUluZm8uYXBwbGljYXRpb25JbmZvICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHJJbmZvLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8uZmxhZ3MgJiBBcHBsaWNhdGlvbkluZm8uRkxBR19TWVNURU0pICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UkkgPSBySW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZhdWx0UkkgPT0gbnVsbCAmJiBkZWZhdWx0UGFja2FnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBsb29rIGZvciBkZWZhdWx0IGFjdGl2aXR5CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBSZXNvbHZlSW5mbyBySW5mbyA9IG1hdGNoZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChySW5mby5hY3Rpdml0eUluZm8gIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFBhY2thZ2UuZXF1YWxzKHJJbmZvLmFjdGl2aXR5SW5mby5wYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFJJID0gckluZm87CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZhdWx0UkkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gZ3JhbnQgcGVybWlzc2lvbiBmb3IgZGVmYXVsdCBhY3Rpdml0eQorICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ3JhbnREZXZpY2VQZXJtaXNzaW9uKGRldmljZSwgZGVmYXVsdFJJLmFjdGl2aXR5SW5mby5hcHBsaWNhdGlvbkluZm8udWlkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzb3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBncmFudEFjY2Vzc29yeVBlcm1pc3Npb24oYWNjZXNzb3J5LCBkZWZhdWx0UkkuYWN0aXZpdHlJbmZvLmFwcGxpY2F0aW9uSW5mby51aWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdGFydCBkZWZhdWx0IGFjdGl2aXR5IGRpcmVjdGx5CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludGVudC5zZXRDb21wb25lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShkZWZhdWx0UkkuYWN0aXZpdHlJbmZvLnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UkkuYWN0aXZpdHlJbmZvLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KGludGVudCk7CisgICAgICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJzdGFydEFjdGl2aXR5IGZhaWxlZCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW50ZW50IHJlc29sdmVySW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworCisgICAgICAgICAgICBpZiAoY291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IFVzYkNvbmZpcm1BY3Rpdml0eSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBjaG9pY2UKKyAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnN5c3RlbXVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS51c2IuVXNiQ29uZmlybUFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbnRlbnQucHV0RXh0cmEoInJpbmZvIiwgbWF0Y2hlcy5nZXQoMCkpOworCisgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfREVWSUNFLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgVXNiUmVzb2x2ZXJBY3Rpdml0eSBzbyB1c2VyIGNhbiBjaG9vc2UgYW4gYWN0aXZpdHkKKyAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnN5c3RlbXVpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS51c2IuVXNiUmVzb2x2ZXJBY3Rpdml0eSIpOworICAgICAgICAgICAgICAgIHJlc29sdmVySW50ZW50LnB1dFBhcmNlbGFibGVBcnJheUxpc3RFeHRyYSgicmxpc3QiLCBtYXRjaGVzKTsKKyAgICAgICAgICAgICAgICByZXNvbHZlckludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfSU5URU5ULCBpbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtQ29udGV4dC5zdGFydEFjdGl2aXR5KHJlc29sdmVySW50ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFjdGl2aXR5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgInVuYWJsZSB0byBzdGFydCBhY3Rpdml0eSAiICsgcmVzb2x2ZXJJbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNsZWFyQ29tcGF0aWJsZU1hdGNoZXNMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lLCBEZXZpY2VGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBmb3IgKERldmljZUZpbHRlciB0ZXN0IDogbURldmljZVByZWZlcmVuY2VNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIubWF0Y2hlcyh0ZXN0KSkgeworICAgICAgICAgICAgICAgIG1EZXZpY2VQcmVmZXJlbmNlTWFwLnJlbW92ZSh0ZXN0KTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xlYXJDb21wYXRpYmxlTWF0Y2hlc0xvY2tlZChTdHJpbmcgcGFja2FnZU5hbWUsIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGZvciAoQWNjZXNzb3J5RmlsdGVyIHRlc3QgOiBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGZpbHRlci5tYXRjaGVzKHRlc3QpKSB7CisgICAgICAgICAgICAgICAgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAucmVtb3ZlKHRlc3QpOworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVQYWNrYWdlVXBkYXRlTG9ja2VkKFN0cmluZyBwYWNrYWdlTmFtZSwgQWN0aXZpdHlJbmZvIGFJbmZvLAorICAgICAgICAgICAgU3RyaW5nIG1ldGFEYXRhTmFtZSkgeworICAgICAgICBYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBudWxsOworICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcGFyc2VyID0gYUluZm8ubG9hZFhtbE1ldGFEYXRhKG1QYWNrYWdlTWFuYWdlciwgbWV0YURhdGFOYW1lKTsKKyAgICAgICAgICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOworICAgICAgICAgICAgd2hpbGUgKHBhcnNlci5nZXRFdmVudFR5cGUoKSAhPSBYbWxQdWxsUGFyc2VyLkVORF9ET0NVTUVOVCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0YWdOYW1lID0gcGFyc2VyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoInVzYi1kZXZpY2UiLmVxdWFscyh0YWdOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWx0ZXIgZmlsdGVyID0gRGV2aWNlRmlsdGVyLnJlYWQocGFyc2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyQ29tcGF0aWJsZU1hdGNoZXNMb2NrZWQocGFja2FnZU5hbWUsIGZpbHRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCJ1c2ItYWNjZXNzb3J5Ii5lcXVhbHModGFnTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzb3J5RmlsdGVyIGZpbHRlciA9IEFjY2Vzc29yeUZpbHRlci5yZWFkKHBhcnNlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckNvbXBhdGlibGVNYXRjaGVzTG9ja2VkKHBhY2thZ2VOYW1lLCBmaWx0ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBYbWxVdGlscy5uZXh0RWxlbWVudChwYXJzZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIGxvYWQgY29tcG9uZW50IGluZm8gIiArIGFJbmZvLnRvU3RyaW5nKCksIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBhcnNlciAhPSBudWxsKSBwYXJzZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHBhY2thZ2Ugc3VwcG9ydHMgYW55IFVTQiBkZXZpY2VzIG9yIGFjY2Vzc29yaWVzLgorICAgIC8vIElmIHNvLCBjbGVhciBhbnkgbm9uLW1hdGNoaW5nIHByZWZlcmVuY2VzIGZvciBtYXRjaGluZyBkZXZpY2VzL2FjY2Vzc29yaWVzLgorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVQYWNrYWdlVXBkYXRlKFN0cmluZyBwYWNrYWdlTmFtZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBQYWNrYWdlSW5mbyBpbmZvOworICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW5mbyA9IG1QYWNrYWdlTWFuYWdlci5nZXRQYWNrYWdlSW5mbyhwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9BQ1RJVklUSUVTIHwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7CisgICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgImhhbmRsZVBhY2thZ2VVcGRhdGUgY291bGQgbm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUsIGUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWN0aXZpdHlJbmZvW10gYWN0aXZpdGllcyA9IGluZm8uYWN0aXZpdGllczsKKyAgICAgICAgICAgIGlmIChhY3Rpdml0aWVzID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0aXZpdGllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBtZXRhLWRhdGEsIGJvdGggZm9yIGRldmljZXMgYW5kIGFjY2Vzc29yaWVzCisgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBhY2thZ2VVcGRhdGVMb2NrZWQocGFja2FnZU5hbWUsIGFjdGl2aXRpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBVc2JNYW5hZ2VyLkFDVElPTl9VU0JfREVWSUNFX0FUVEFDSEVEKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGhhbmRsZVBhY2thZ2VVcGRhdGVMb2NrZWQocGFja2FnZU5hbWUsIGFjdGl2aXRpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBVc2JNYW5hZ2VyLkFDVElPTl9VU0JfQUNDRVNTT1JZX0FUVEFDSEVEKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgd3JpdGVTZXR0aW5nc0xvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUGVybWlzc2lvbihVc2JEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIFNwYXJzZUJvb2xlYW5BcnJheSB1aWRMaXN0ID0gbURldmljZVBlcm1pc3Npb25NYXAuZ2V0KGRldmljZS5nZXREZXZpY2VOYW1lKCkpOworICAgICAgICAgICAgaWYgKHVpZExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1aWRMaXN0LmdldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc1Blcm1pc3Npb24oVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLmdldChhY2Nlc3NvcnkpOworICAgICAgICAgICAgaWYgKHVpZExpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1aWRMaXN0LmdldChCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihVc2JEZXZpY2UgZGV2aWNlKSB7CisgICAgICAgIGlmICghaGFzUGVybWlzc2lvbihkZXZpY2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlVzZXIgaGFzIG5vdCBnaXZlbiBwZXJtaXNzaW9uIHRvIGRldmljZSAiICsgZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5KSB7CisgICAgICAgIGlmICghaGFzUGVybWlzc2lvbihhY2Nlc3NvcnkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlVzZXIgaGFzIG5vdCBnaXZlbiBwZXJtaXNzaW9uIHRvIGFjY2Vzc29yeSAiICsgYWNjZXNzb3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXF1ZXN0UGVybWlzc2lvbkRpYWxvZyhJbnRlbnQgaW50ZW50LCBTdHJpbmcgcGFja2FnZU5hbWUsIFBlbmRpbmdJbnRlbnQgcGkpIHsKKyAgICAgICAgaW50IHVpZCA9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCk7CisKKyAgICAgICAgLy8gY29tcGFyZSB1aWQgd2l0aCBwYWNrYWdlTmFtZSB0byBmb2lsIGFwcHMgcHJldGVuZGluZyB0byBiZSBzb21lb25lIGVsc2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uSW5mbyBhSW5mbyA9IG1QYWNrYWdlTWFuYWdlci5nZXRBcHBsaWNhdGlvbkluZm8ocGFja2FnZU5hbWUsIDApOworICAgICAgICAgICAgaWYgKGFJbmZvLnVpZCAhPSB1aWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IG1hdGNoIGNhbGxlcidzIHVpZCAiICsgdWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIiBub3QgZm91bmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgaWRlbnRpdHkgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQuc3lzdGVtdWkiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5zeXN0ZW11aS51c2IuVXNiUGVybWlzc2lvbkFjdGl2aXR5Iik7CisgICAgICAgIGludGVudC5hZGRGbGFncyhJbnRlbnQuRkxBR19BQ1RJVklUWV9ORVdfVEFTSyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShJbnRlbnQuRVhUUkFfSU5URU5ULCBwaSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYSgicGFja2FnZSIsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJ1aWQiLCB1aWQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNvbnRleHQuc3RhcnRBY3Rpdml0eShpbnRlbnQpOworICAgICAgICB9IGNhdGNoIChBY3Rpdml0eU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgInVuYWJsZSB0byBzdGFydCBVc2JQZXJtaXNzaW9uQWN0aXZpdHkiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQZXJtaXNzaW9uKFVzYkRldmljZSBkZXZpY2UsIFN0cmluZyBwYWNrYWdlTmFtZSwgUGVuZGluZ0ludGVudCBwaSkgeworICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKworICAgICAgICAvLyByZXNwb25kIGltbWVkaWF0ZWx5IGlmIHBlcm1pc3Npb24gaGFzIGFscmVhZHkgYmVlbiBncmFudGVkCisgICAgICBpZiAoaGFzUGVybWlzc2lvbihkZXZpY2UpKSB7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9ERVZJQ0UsIGRldmljZSk7CisgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoVXNiTWFuYWdlci5FWFRSQV9QRVJNSVNTSU9OX0dSQU5URUQsIHRydWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwaS5zZW5kKG1Db250ZXh0LCAwLCBpbnRlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoUGVuZGluZ0ludGVudC5DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicmVxdWVzdFBlcm1pc3Npb24gUGVuZGluZ0ludGVudCB3YXMgY2FuY2VsbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBzdGFydCBVc2JQZXJtaXNzaW9uQWN0aXZpdHkgc28gdXNlciBjYW4gY2hvb3NlIGFuIGFjdGl2aXR5CisgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0RFVklDRSwgZGV2aWNlKTsKKyAgICAgICAgcmVxdWVzdFBlcm1pc3Npb25EaWFsb2coaW50ZW50LCBwYWNrYWdlTmFtZSwgcGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIFN0cmluZyBwYWNrYWdlTmFtZSwgUGVuZGluZ0ludGVudCBwaSkgeworICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKKworICAgICAgICAvLyByZXNwb25kIGltbWVkaWF0ZWx5IGlmIHBlcm1pc3Npb24gaGFzIGFscmVhZHkgYmVlbiBncmFudGVkCisgICAgICAgIGlmIChoYXNQZXJtaXNzaW9uKGFjY2Vzc29yeSkpIHsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX0FDQ0VTU09SWSwgYWNjZXNzb3J5KTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShVc2JNYW5hZ2VyLkVYVFJBX1BFUk1JU1NJT05fR1JBTlRFRCwgdHJ1ZSk7CisgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcGkuc2VuZChtQ29udGV4dCwgMCwgaW50ZW50KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExvZy53KFRBRywgInJlcXVlc3RQZXJtaXNzaW9uIFBlbmRpbmdJbnRlbnQgd2FzIGNhbmNlbGxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFVzYk1hbmFnZXIuRVhUUkFfQUNDRVNTT1JZLCBhY2Nlc3NvcnkpOworICAgICAgICByZXF1ZXN0UGVybWlzc2lvbkRpYWxvZyhpbnRlbnQsIHBhY2thZ2VOYW1lLCBwaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGV2aWNlUGFja2FnZShVc2JEZXZpY2UgZGV2aWNlLCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgRGV2aWNlRmlsdGVyIGZpbHRlciA9IG5ldyBEZXZpY2VGaWx0ZXIoZGV2aWNlKTsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IChtRGV2aWNlUHJlZmVyZW5jZU1hcC5yZW1vdmUoZmlsdGVyKSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9ICFwYWNrYWdlTmFtZS5lcXVhbHMobURldmljZVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOworICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VQcmVmZXJlbmNlTWFwLnB1dChmaWx0ZXIsIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIHdyaXRlU2V0dGluZ3NMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yeVBhY2thZ2UoVXNiQWNjZXNzb3J5IGFjY2Vzc29yeSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgPSBuZXcgQWNjZXNzb3J5RmlsdGVyKGFjY2Vzc29yeSk7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAucmVtb3ZlKGZpbHRlcikgIT0gbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAhcGFja2FnZU5hbWUuZXF1YWxzKG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5wdXQoZmlsdGVyLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBncmFudERldmljZVBlcm1pc3Npb24oVXNiRGV2aWNlIGRldmljZSwgaW50IHVpZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBTdHJpbmcgZGV2aWNlTmFtZSA9IGRldmljZS5nZXREZXZpY2VOYW1lKCk7CisgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1EZXZpY2VQZXJtaXNzaW9uTWFwLmdldChkZXZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmICh1aWRMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1aWRMaXN0ID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgxKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlUGVybWlzc2lvbk1hcC5wdXQoZGV2aWNlTmFtZSwgdWlkTGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aWRMaXN0LnB1dCh1aWQsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ3JhbnRBY2Nlc3NvcnlQZXJtaXNzaW9uKFVzYkFjY2Vzc29yeSBhY2Nlc3NvcnksIGludCB1aWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5nZXQoYWNjZXNzb3J5KTsKKyAgICAgICAgICAgIGlmICh1aWRMaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1aWRMaXN0ID0gbmV3IFNwYXJzZUJvb2xlYW5BcnJheSgxKTsKKyAgICAgICAgICAgICAgICBtQWNjZXNzb3J5UGVybWlzc2lvbk1hcC5wdXQoYWNjZXNzb3J5LCB1aWRMaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpZExpc3QucHV0KHVpZCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNEZWZhdWx0cyhTdHJpbmcgcGFja2FnZU5hbWUpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgaWYgKG1EZXZpY2VQcmVmZXJlbmNlTWFwLnZhbHVlcygpLmNvbnRhaW5zKHBhY2thZ2VOYW1lKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAobUFjY2Vzc29yeVByZWZlcmVuY2VNYXAudmFsdWVzKCkuY29udGFpbnMocGFja2FnZU5hbWUpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFyRGVmYXVsdHMoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGlmIChjbGVhclBhY2thZ2VEZWZhdWx0c0xvY2tlZChwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNldHRpbmdzTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2xlYXJQYWNrYWdlRGVmYXVsdHNMb2NrZWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIGJvb2xlYW4gY2xlYXJlZCA9IGZhbHNlOworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBpZiAobURldmljZVByZWZlcmVuY2VNYXAuY29udGFpbnNWYWx1ZShwYWNrYWdlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUga2V5IHNldCB0byBhdm9pZCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgT2JqZWN0W10ga2V5cyA9IG1EZXZpY2VQcmVmZXJlbmNlTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleXNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMobURldmljZVByZWZlcmVuY2VNYXAuZ2V0KGtleSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlUHJlZmVyZW5jZU1hcC5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmNvbnRhaW5zVmFsdWUocGFja2FnZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGtleSBzZXQgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIE9iamVjdFtdIGtleXMgPSBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5rZXlTZXQoKS50b0FycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBrZXkgPSBrZXlzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuZXF1YWxzKG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmdldChrZXkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFjY2Vzc29yeVByZWZlcmVuY2VNYXAucmVtb3ZlKGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjbGVhcmVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVtcChGaWxlRGVzY3JpcHRvciBmZCwgUHJpbnRXcml0ZXIgcHcpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgcHcucHJpbnRsbigiICBEZXZpY2UgcGVybWlzc2lvbnM6Iik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBkZXZpY2VOYW1lIDogbURldmljZVBlcm1pc3Npb25NYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgICIgKyBkZXZpY2VOYW1lICsgIjogIik7CisgICAgICAgICAgICAgICAgU3BhcnNlQm9vbGVhbkFycmF5IHVpZExpc3QgPSBtRGV2aWNlUGVybWlzc2lvbk1hcC5nZXQoZGV2aWNlTmFtZSk7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gdWlkTGlzdC5zaXplKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KEludGVnZXIudG9TdHJpbmcodWlkTGlzdC5rZXlBdChpKSkgKyAiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdy5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB3LnByaW50bG4oIiAgQWNjZXNzb3J5IHBlcm1pc3Npb25zOiIpOworICAgICAgICAgICAgZm9yIChVc2JBY2Nlc3NvcnkgYWNjZXNzb3J5IDogbUFjY2Vzc29yeVBlcm1pc3Npb25NYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgICIgKyBhY2Nlc3NvcnkgKyAiOiAiKTsKKyAgICAgICAgICAgICAgICBTcGFyc2VCb29sZWFuQXJyYXkgdWlkTGlzdCA9IG1BY2Nlc3NvcnlQZXJtaXNzaW9uTWFwLmdldChhY2Nlc3NvcnkpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IHVpZExpc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvU3RyaW5nKHVpZExpc3Qua2V5QXQoaSkpICsgIiAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludGxuKCIgIERldmljZSBwcmVmZXJlbmNlczoiKTsKKyAgICAgICAgICAgIGZvciAoRGV2aWNlRmlsdGVyIGZpbHRlciA6IG1EZXZpY2VQcmVmZXJlbmNlTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnRsbigiICAgICIgKyBmaWx0ZXIgKyAiOiAiICsgbURldmljZVByZWZlcmVuY2VNYXAuZ2V0KGZpbHRlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcucHJpbnRsbigiICBBY2Nlc3NvcnkgcHJlZmVyZW5jZXM6Iik7CisgICAgICAgICAgICBmb3IgKEFjY2Vzc29yeUZpbHRlciBmaWx0ZXIgOiBtQWNjZXNzb3J5UHJlZmVyZW5jZU1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIiAgICAiICsgZmlsdGVyICsgIjogIiArIG1BY2Nlc3NvcnlQcmVmZXJlbmNlTWFwLmdldChmaWx0ZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0JsYWNrRnJhbWUuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0JsYWNrRnJhbWUuamF2YQppbmRleCBmOWY1NzU4Li5kOGZkN2ZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9CbGFja0ZyYW1lLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vQmxhY2tGcmFtZS5qYXZhCkBAIC0zOCw2ICszOCw5IEBACiAgICAgICAgICAgICB0b3AgPSB0OwogICAgICAgICAgICAgc3VyZmFjZSA9IG5ldyBTdXJmYWNlKHNlc3Npb24sIDAsICJCbGFja1N1cmZhY2UiLAogICAgICAgICAgICAgICAgICAgICAtMSwgdywgaCwgUGl4ZWxGb3JtYXQuT1BBUVVFLCBTdXJmYWNlLkZYX1NVUkZBQ0VfRElNKTsKKyAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUyB8fAorICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1NVUkZBQ0VfQUxMT0MpIFNsb2cuaShXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgQkxBQ0sgIiArIHN1cmZhY2UgKyAiOiBDUkVBVEUgbGF5ZXI9IiArIGxheWVyKTsKICAgICAgICAgICAgIHN1cmZhY2Uuc2V0QWxwaGEoMS4wZik7CiAgICAgICAgICAgICBzdXJmYWNlLnNldExheWVyKGxheWVyKTsKICAgICAgICAgfQpAQCAtMTA0LDYgKzEwNywxMCBAQAogICAgICAgICBpZiAobUJsYWNrU3VyZmFjZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1CbGFja1N1cmZhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CbGFja1N1cmZhY2VzW2ldICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLlNIT1dfVFJBTlNBQ1RJT05TIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19TVVJGQUNFX0FMTE9DKSBTbG9nLmkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBCTEFDSyAiICsgbUJsYWNrU3VyZmFjZXNbaV0uc3VyZmFjZSArICI6IERFU1RST1kiKTsKICAgICAgICAgICAgICAgICAgICAgbUJsYWNrU3VyZmFjZXNbaV0uc3VyZmFjZS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgIG1CbGFja1N1cmZhY2VzW2ldID0gbnVsbDsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9EaW1BbmltYXRvci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vRGltQW5pbWF0b3IuamF2YQppbmRleCBhMjY2ZDcwLi5hMzI5M2U4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9EaW1BbmltYXRvci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0RpbUFuaW1hdG9yLmphdmEKQEAgLTQxLDggKzQxLDkgQEAKIAogICAgIERpbUFuaW1hdG9yIChTdXJmYWNlU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICAgICAgIGlmIChtRGltU3VyZmFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlMpIFNsb2cuaShXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICIgIERJTSAiCi0gICAgICAgICAgICAgICAgICAgICsgbURpbVN1cmZhY2UgKyAiOiBDUkVBVEUiKTsKKyAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUyB8fAorICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1NVUkZBQ0VfQUxMT0MpIFNsb2cuaShXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRElNICIgKyBtRGltU3VyZmFjZSArICI6IENSRUFURSIpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtRGltU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHNlc3Npb24sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRGltQW5pbWF0b3IiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vRGltU3VyZmFjZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vRGltU3VyZmFjZS5qYXZhCmluZGV4IDIyMGM3ZmIuLmQ3YmI4YjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0RpbVN1cmZhY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9EaW1TdXJmYWNlLmphdmEKQEAgLTMyLDggKzMyLDkgQEAKIAogICAgIERpbVN1cmZhY2UoU3VyZmFjZVNlc3Npb24gc2Vzc2lvbikgewogICAgICAgICBpZiAobURpbVN1cmZhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLlNIT1dfVFJBTlNBQ1RJT05TKSBTbG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiICBESU0gIgotICAgICAgICAgICAgICAgICAgICArIG1EaW1TdXJmYWNlICsgIjogQ1JFQVRFIik7CisgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlMgfHwKKyAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19TVVJGQUNFX0FMTE9DKSBTbG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIERJTSAiICsgbURpbVN1cmZhY2UgKyAiOiBDUkVBVEUiKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbURpbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShzZXNzaW9uLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIkRpbVN1cmZhY2UiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1hbmFnZXIuamF2YQppbmRleCA2OWJkZTQxZi4uZWU2OTMxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRNYW5hZ2VyLmphdmEKQEAgLTIzLDEwICsyMywxNCBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5Db250ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlUXVldWU7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TZXR0aW5nTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC51dGlsLlNsb2c7CiBpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIGltcG9ydCBhbmRyb2lkLnZpZXcuSW5wdXRDaGFubmVsOwpAQCAtNTcsNyArNjEsNyBAQAogICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2tzIG1DYWxsYmFja3M7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogICAgIHByaXZhdGUgZmluYWwgV2luZG93TWFuYWdlclNlcnZpY2UgbVdpbmRvd01hbmFnZXJTZXJ2aWNlOwotICAgIAorCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlSW5pdChDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICBDYWxsYmFja3MgY2FsbGJhY2tzLCBNZXNzYWdlUXVldWUgbWVzc2FnZVF1ZXVlKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTdGFydCgpOwpAQCAtODgsNiArOTIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnRbXSBuYXRpdmVHZXRJbnB1dERldmljZUlkcygpOwogICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBib29sZWFuIG5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyhJbnB1dENoYW5uZWwgZnJvbUNoYW5uZWwsCiAgICAgICAgICAgICBJbnB1dENoYW5uZWwgdG9DaGFubmVsKTsKKyAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgdm9pZCBuYXRpdmVTZXRQb2ludGVyU3BlZWQoaW50IHNwZWVkKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG5hdGl2ZUR1bXAoKTsKICAgICAKICAgICAvLyBJbnB1dCBldmVudCBpbmplY3Rpb24gY29uc3RhbnRzIGRlZmluZWQgaW4gSW5wdXREaXNwYXRjaGVyLmguCkBAIC0xMzEsMTAgKzEzNiwxMyBAQAogICAgICAgICBTbG9nLmkoVEFHLCAiSW5pdGlhbGl6aW5nIGlucHV0IG1hbmFnZXIiKTsKICAgICAgICAgbmF0aXZlSW5pdChtQ29udGV4dCwgbUNhbGxiYWNrcywgbG9vcGVyLmdldFF1ZXVlKCkpOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewogICAgICAgICBTbG9nLmkoVEFHLCAiU3RhcnRpbmcgaW5wdXQgbWFuYWdlciIpOwogICAgICAgICBuYXRpdmVTdGFydCgpOworCisgICAgICAgIHJlZ2lzdGVyUG9pbnRlclNwZWVkU2V0dGluZ09ic2VydmVyKCk7CisgICAgICAgIHVwZGF0ZVBvaW50ZXJTcGVlZEZyb21TZXR0aW5ncygpOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5U2l6ZShpbnQgZGlzcGxheUlkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKQEAgLTQwMyw2ICs0MTEsNDIgQEAKICAgICAgICAgcmV0dXJuIG5hdGl2ZVRyYW5zZmVyVG91Y2hGb2N1cyhmcm9tQ2hhbm5lbCwgdG9DaGFubmVsKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXIgc3BlZWQuCisgICAgICogQHBhcmFtIHNwZWVkIFRoZSBwb2ludGVyIHNwZWVkIGFzIGEgdmFsdWUgYmV0d2VlbiAtNyAoc2xvd2VzdCkgYW5kIDcgKGZhc3Rlc3QpCisgICAgICogd2hlcmUgMCBpcyB0aGUgZGVmYXVsdCBzcGVlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb2ludGVyU3BlZWQoaW50IHNwZWVkKSB7CisgICAgICAgIHNwZWVkID0gTWF0aC5taW4oTWF0aC5tYXgoc3BlZWQsIC03KSwgNyk7CisgICAgICAgIG5hdGl2ZVNldFBvaW50ZXJTcGVlZChzcGVlZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdXBkYXRlUG9pbnRlclNwZWVkRnJvbVNldHRpbmdzKCkgeworICAgICAgICBpbnQgc3BlZWQgPSBnZXRQb2ludGVyU3BlZWRTZXR0aW5nKDApOworICAgICAgICBzZXRQb2ludGVyU3BlZWQoc3BlZWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclBvaW50ZXJTcGVlZFNldHRpbmdPYnNlcnZlcigpIHsKKyAgICAgICAgbUNvbnRleHQuZ2V0Q29udGVudFJlc29sdmVyKCkucmVnaXN0ZXJDb250ZW50T2JzZXJ2ZXIoCisgICAgICAgICAgICAgICAgU2V0dGluZ3MuU3lzdGVtLmdldFVyaUZvcihTZXR0aW5ncy5TeXN0ZW0uUE9JTlRFUl9TUEVFRCksIHRydWUsCisgICAgICAgICAgICAgICAgbmV3IENvbnRlbnRPYnNlcnZlcihtV2luZG93TWFuYWdlclNlcnZpY2UubUgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKGJvb2xlYW4gc2VsZkNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUG9pbnRlclNwZWVkRnJvbVNldHRpbmdzKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRQb2ludGVyU3BlZWRTZXR0aW5nKGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaW50IHNwZWVkID0gZGVmYXVsdFZhbHVlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3BlZWQgPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAorICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncy5TeXN0ZW0uUE9JTlRFUl9TUEVFRCk7CisgICAgICAgIH0gY2F0Y2ggKFNldHRpbmdOb3RGb3VuZEV4Y2VwdGlvbiBzbmZlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNwZWVkOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGR1bXAoUHJpbnRXcml0ZXIgcHcpIHsKICAgICAgICAgU3RyaW5nIGR1bXBTdHIgPSBuYXRpdmVEdW1wKCk7CiAgICAgICAgIGlmIChkdW1wU3RyICE9IG51bGwpIHsKQEAgLTU3Myw2ICs2MTcsMjYgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgaW50IGdldEhvdmVyVGFwVGltZW91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBWaWV3Q29uZmlndXJhdGlvbi5nZXRIb3ZlclRhcFRpbWVvdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgaW50IGdldEhvdmVyVGFwU2xvcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBWaWV3Q29uZmlndXJhdGlvbi5nZXRIb3ZlclRhcFNsb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgaW50IGdldERvdWJsZVRhcFRpbWVvdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gVmlld0NvbmZpZ3VyYXRpb24uZ2V0RG91YmxlVGFwVGltZW91dCgpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TG9uZ1ByZXNzVGltZW91dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBWaWV3Q29uZmlndXJhdGlvbi5nZXRMb25nUHJlc3NUaW1lb3V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICAgICAgcHVibGljIGludCBnZXRNYXhFdmVudHNQZXJTZWNvbmQoKSB7CiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMDsKICAgICAgICAgICAgIHRyeSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dE1vbml0b3IuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0lucHV0TW9uaXRvci5qYXZhCmluZGV4IDlkYzkyZDMuLjNiZThhZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0lucHV0TW9uaXRvci5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0lucHV0TW9uaXRvci5qYXZhCkBAIC0xMjgsNiArMTI4LDggQEAKICAgICAgICAgaW5wdXRXaW5kb3cubGF5ZXIgPSBtU2VydmljZS5tRHJhZ1N0YXRlLmdldERyYWdMYXllckx3KCk7CiAgICAgICAgIGlucHV0V2luZG93Lm93bmVyUGlkID0gUHJvY2Vzcy5teVBpZCgpOwogICAgICAgICBpbnB1dFdpbmRvdy5vd25lclVpZCA9IFByb2Nlc3MubXlVaWQoKTsKKyAgICAgICAgaW5wdXRXaW5kb3cuaW5wdXRGZWF0dXJlcyA9IDA7CisgICAgICAgIGlucHV0V2luZG93LnNjYWxlRmFjdG9yID0gMS4wZjsKIAogICAgICAgICAvLyBUaGUgZHJhZyB3aW5kb3cgY292ZXJzIHRoZSBlbnRpcmUgZGlzcGxheQogICAgICAgICBpbnB1dFdpbmRvdy5mcmFtZUxlZnQgPSAwOwpAQCAtMjA0LDcgKzIwNiw4IEBACiAgICAgICAgICAgICBpbnB1dFdpbmRvdy5sYXllciA9IGNoaWxkLm1MYXllcjsKICAgICAgICAgICAgIGlucHV0V2luZG93Lm93bmVyUGlkID0gY2hpbGQubVNlc3Npb24ubVBpZDsKICAgICAgICAgICAgIGlucHV0V2luZG93Lm93bmVyVWlkID0gY2hpbGQubVNlc3Npb24ubVVpZDsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgaW5wdXRXaW5kb3cuaW5wdXRGZWF0dXJlcyA9IGNoaWxkLm1BdHRycy5pbnB1dEZlYXR1cmVzOworCiAgICAgICAgICAgICBmaW5hbCBSZWN0IGZyYW1lID0gY2hpbGQubUZyYW1lOwogICAgICAgICAgICAgaW5wdXRXaW5kb3cuZnJhbWVMZWZ0ID0gZnJhbWUubGVmdDsKICAgICAgICAgICAgIGlucHV0V2luZG93LmZyYW1lVG9wID0gZnJhbWUudG9wOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRXaW5kb3cuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL0lucHV0V2luZG93LmphdmEKaW5kZXggNTc4MTIwZS4uNjU1ZDczNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vSW5wdXRXaW5kb3cuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9JbnB1dFdpbmRvdy5qYXZhCkBAIC03NSw2ICs3NSw5IEBACiAgICAgcHVibGljIGludCBvd25lclBpZDsKICAgICBwdWJsaWMgaW50IG93bmVyVWlkOwogCisgICAgLy8gV2luZG93IGlucHV0IGZlYXR1cmVzLgorICAgIHB1YmxpYyBpbnQgaW5wdXRGZWF0dXJlczsKKwogICAgIHB1YmxpYyB2b2lkIHJlY3ljbGUoKSB7CiAgICAgICAgIGlucHV0V2luZG93SGFuZGxlID0gbnVsbDsKICAgICAgICAgaW5wdXRDaGFubmVsID0gbnVsbDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NjcmVlblJvdGF0aW9uQW5pbWF0aW9uLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5qYXZhCmluZGV4IGJiMDE2MzMuLjg0NzA5MTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1NjcmVlblJvdGF0aW9uQW5pbWF0aW9uLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU2NyZWVuUm90YXRpb25BbmltYXRpb24uamF2YQpAQCAtNjksNyArNjksNyBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1EaXNwbGF5ID0gZGlzcGxheTsKIAotICAgICAgICBkaXNwbGF5LmdldE1ldHJpY3MobURpc3BsYXlNZXRyaWNzKTsKKyAgICAgICAgZGlzcGxheS5nZXRSZWFsTWV0cmljcyhtRGlzcGxheU1ldHJpY3MpOwogCiAgICAgICAgIEJpdG1hcCBzY3JlZW5zaG90ID0gU3VyZmFjZS5zY3JlZW5zaG90KDAsIDApOwogCkBAIC0xMDIsNiArMTAyLDEwIEBACiAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIlVuYWJsZSB0byBhbGxvY2F0ZSBmcmVlemUgc3VyZmFjZSIsIGUpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlMgfHwKKyAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19TVVJGQUNFX0FMTE9DKSBTbG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZSRUVaRSAiICsgbVN1cmZhY2UgKyAiOiBDUkVBVEUiKTsKKwogICAgICAgICAgICAgc2V0Um90YXRpb24oZGlzcGxheS5nZXRSb3RhdGlvbigpKTsKIAogICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG51bGwpIHsKQEAgLTI0NCw3ICsyNDgsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgbURpc3BsYXkuZ2V0TWV0cmljcyhtRGlzcGxheU1ldHJpY3MpOworICAgICAgICBtRGlzcGxheS5nZXRSZWFsTWV0cmljcyhtRGlzcGxheU1ldHJpY3MpOwogCiAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGFuaW1hdGlvbnMuICBUaGlzIGlzIGEgaGFjaywgcmVkZWZpbmluZyB3aGF0ICJwYXJlbnQiCiAgICAgICAgIC8vIG1lYW5zIHRvIGFsbG93IHN1cHBseWluZyB0aGUgbGFzdCBhbmQgbmV4dCBzaXplLiAgSW4gdGhpcyBkZWZpbml0aW9uCkBAIC0yODQsNiArMjg4LDkgQEAKIAogICAgIHB1YmxpYyB2b2lkIGtpbGwoKSB7CiAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlMgfHwKKyAgICAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19TVVJGQUNFX0FMTE9DKSBTbG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZSRUVaRSAiICsgbVN1cmZhY2UgKyAiOiBERVNUUk9ZIik7CiAgICAgICAgICAgICBtU3VyZmFjZS5kZXN0cm95KCk7CiAgICAgICAgICAgICBtU3VyZmFjZSA9IG51bGw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1N0YXJ0aW5nRGF0YS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RhcnRpbmdEYXRhLmphdmEKaW5kZXggNjI1ZmNmZS4uNDZiYjQ4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RhcnRpbmdEYXRhLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RhcnRpbmdEYXRhLmphdmEKQEAgLTE2LDE4ICsxNiwyMyBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLnNlcnZlci53bTsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29tcGF0aWJpbGl0eUluZm87CisKIGZpbmFsIGNsYXNzIFN0YXJ0aW5nRGF0YSB7CiAgICAgZmluYWwgU3RyaW5nIHBrZzsKICAgICBmaW5hbCBpbnQgdGhlbWU7CisgICAgZmluYWwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbzsKICAgICBmaW5hbCBDaGFyU2VxdWVuY2Ugbm9uTG9jYWxpemVkTGFiZWw7CiAgICAgZmluYWwgaW50IGxhYmVsUmVzOwogICAgIGZpbmFsIGludCBpY29uOwogICAgIGZpbmFsIGludCB3aW5kb3dGbGFnczsKIAotICAgIFN0YXJ0aW5nRGF0YShTdHJpbmcgX3BrZywgaW50IF90aGVtZSwgQ2hhclNlcXVlbmNlIF9ub25Mb2NhbGl6ZWRMYWJlbCwKKyAgICBTdGFydGluZ0RhdGEoU3RyaW5nIF9wa2csIGludCBfdGhlbWUsIENvbXBhdGliaWxpdHlJbmZvIF9jb21wYXRJbmZvLAorICAgICAgICAgICAgQ2hhclNlcXVlbmNlIF9ub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgIGludCBfbGFiZWxSZXMsIGludCBfaWNvbiwgaW50IF93aW5kb3dGbGFncykgewogICAgICAgICBwa2cgPSBfcGtnOwogICAgICAgICB0aGVtZSA9IF90aGVtZTsKKyAgICAgICAgY29tcGF0SW5mbyA9IF9jb21wYXRJbmZvOwogICAgICAgICBub25Mb2NhbGl6ZWRMYWJlbCA9IF9ub25Mb2NhbGl6ZWRMYWJlbDsKICAgICAgICAgbGFiZWxSZXMgPSBfbGFiZWxSZXM7CiAgICAgICAgIGljb24gPSBfaWNvbjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1N0cmljdE1vZGVGbGFzaC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RyaWN0TW9kZUZsYXNoLmphdmEKaW5kZXggMmM2MjA4MC4uNzFiNTk1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RyaWN0TW9kZUZsYXNoLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vU3RyaWN0TW9kZUZsYXNoLmphdmEKQEAgLTM5LDcgKzM5LDcgQEAKIAogICAgIHB1YmxpYyBTdHJpY3RNb2RlRmxhc2goRGlzcGxheSBkaXNwbGF5LCBTdXJmYWNlU2Vzc2lvbiBzZXNzaW9uKSB7CiAgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIGRtID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGRpc3BsYXkuZ2V0TWV0cmljcyhkbSk7CisgICAgICAgIGRpc3BsYXkuZ2V0UmVhbE1ldHJpY3MoZG0pOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHNlc3Npb24sIDAsICJTdHJpY3RNb2RlRmxhc2giLCAtMSwgMSwgMSwgUGl4ZWxGb3JtYXQuVFJBTlNMVUNFTlQsIDApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2F0ZXJtYXJrLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYXRlcm1hcmsuamF2YQppbmRleCAyMjEyNmYzLi4zNzVhYmU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYXRlcm1hcmsuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XYXRlcm1hcmsuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgV2F0ZXJtYXJrKERpc3BsYXkgZGlzcGxheSwgU3VyZmFjZVNlc3Npb24gc2Vzc2lvbiwgU3RyaW5nW10gdG9rZW5zKSB7CiAgICAgICAgIGZpbmFsIERpc3BsYXlNZXRyaWNzIGRtID0gbmV3IERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGRpc3BsYXkuZ2V0TWV0cmljcyhkbSk7CisgICAgICAgIGRpc3BsYXkuZ2V0UmVhbE1ldHJpY3MoZG0pOwogCiAgICAgICAgIGlmIChmYWxzZSkgewogICAgICAgICAgICAgTG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiKioqKioqKioqKioqKioqKioqKioqKiogV0FURVJNQVJLIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCAwOGZlYTFiLi4xYzg3ZjViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZJUlNUX0FQUExJQ0FUSU9OX1dJTkRPVzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZJUlNUX1NVQl9XSU5ET1c7CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX0JMVVJfQkVISU5EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19DT01QQVRJQkxFX1dJTkRPVzsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfRElNX0JFSElORDsKIGltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT047CiBpbXBvcnQgc3RhdGljIGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX05PVF9GT0NVU0FCTEU7CkBAIC0xNTMsMTIgKzE1NCwxNCBAQAogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1dJTkRPV19NT1ZFTUVOVCA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RPS0VOX01PVkVNRU5UID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfT1JJRU5UQVRJT04gPSBmYWxzZTsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19BUFBfT1JJRU5UQVRJT04gPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19DT05GSUdVUkFUSU9OID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfQVBQX1RSQU5TSVRJT05TID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfU1RBUlRJTkdfV0lORE9XID0gZmFsc2U7CiAgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfUkVPUkRFUiA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1dBTExQQVBFUiA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RSQUcgPSBmYWxzZTsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1NVUkZBQ0VfQUxMT0MgPSBmYWxzZTsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1RSQU5TQUNUSU9OUyA9IGZhbHNlOwogICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEhJREVfU1RBQ0tfQ1JBV0xTID0gdHJ1ZTsKIApAQCAtNDA4LDYgKzQxMSw4IEBACiAgICAgaW50IG1CYXNlRGlzcGxheUhlaWdodCA9IDA7CiAgICAgaW50IG1DdXJEaXNwbGF5V2lkdGggPSAwOwogICAgIGludCBtQ3VyRGlzcGxheUhlaWdodCA9IDA7CisgICAgaW50IG1BcHBEaXNwbGF5V2lkdGggPSAwOworICAgIGludCBtQXBwRGlzcGxheUhlaWdodCA9IDA7CiAgICAgaW50IG1Sb3RhdGlvbiA9IDA7CiAgICAgaW50IG1SZXF1ZXN0ZWRSb3RhdGlvbiA9IDA7CiAgICAgaW50IG1Gb3JjZWRBcHBPcmllbnRhdGlvbiA9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fVU5TUEVDSUZJRUQ7CkBAIC00MjMsOCArNDI4LDggQEAKICAgICBib29sZWFuIG1EaXNwbGF5RnJvemVuID0gZmFsc2U7CiAgICAgYm9vbGVhbiBtV2FpdGluZ0ZvckNvbmZpZyA9IGZhbHNlOwogICAgIGJvb2xlYW4gbVdpbmRvd3NGcmVlemluZ1NjcmVlbiA9IGZhbHNlOwotICAgIGxvbmcgbUZyZWV6ZUdjUGVuZGluZyA9IDA7CiAgICAgaW50IG1BcHBzRnJlZXppbmdTY3JlZW4gPSAwOworICAgIGludCBtTGFzdFdpbmRvd0ZvcmNlZE9yaWVudGF0aW9uID0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9VTlNQRUNJRklFRDsKIAogICAgIGludCBtTGF5b3V0U2VxID0gMDsKICAgICAKQEAgLTQ1OSw2ICs0NjQsMTAgQEAKIAogICAgIERpc3BsYXkgbURpc3BsYXk7CiAKKyAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtRGlzcGxheU1ldHJpY3MgPSBuZXcgRGlzcGxheU1ldHJpY3MoKTsKKyAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtVG1wRGlzcGxheU1ldHJpY3MgPSBuZXcgRGlzcGxheU1ldHJpY3MoKTsKKyAgICBmaW5hbCBEaXNwbGF5TWV0cmljcyBtQ29tcGF0RGlzcGxheU1ldHJpY3MgPSBuZXcgRGlzcGxheU1ldHJpY3MoKTsKKwogICAgIEggbUggPSBuZXcgSCgpOwogCiAgICAgV2luZG93U3RhdGUgbUN1cnJlbnRGb2N1cyA9IG51bGw7CkBAIC02MDAsOCArNjA5LDcgQEAKIAogICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gbVRlbXBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKIAotICAgIC8vIFRoZSBmcmFtZSB1c2UgdG8gbGltaXQgdGhlIHNpemUgb2YgdGhlIGFwcCBydW5uaW5nIGluIGNvbXBhdGliaWxpdHkgbW9kZS4KLSAgICBSZWN0IG1Db21wYXRpYmxlU2NyZWVuRnJhbWUgPSBuZXcgUmVjdCgpOworICAgIC8vIFRoZSBkZXNpcmVkIHNjYWxpbmcgZmFjdG9yIGZvciBjb21wYXRpYmxlIGFwcHMuCiAgICAgZmxvYXQgbUNvbXBhdGlibGVTY3JlZW5TY2FsZTsKIAogICAgIHB1YmxpYyBzdGF0aWMgV2luZG93TWFuYWdlclNlcnZpY2UgbWFpbihDb250ZXh0IGNvbnRleHQsCkBAIC0xNDMzLDggKzE0NDEsOCBAQAogICAgIGludCBhZGp1c3RXYWxscGFwZXJXaW5kb3dzTG9ja2VkKCkgewogICAgICAgICBpbnQgY2hhbmdlZCA9IDA7CiAKLSAgICAgICAgZmluYWwgaW50IGR3ID0gbUN1ckRpc3BsYXlXaWR0aDsKLSAgICAgICAgZmluYWwgaW50IGRoID0gbUN1ckRpc3BsYXlIZWlnaHQ7CisgICAgICAgIGZpbmFsIGludCBkdyA9IG1BcHBEaXNwbGF5V2lkdGg7CisgICAgICAgIGZpbmFsIGludCBkaCA9IG1BcHBEaXNwbGF5SGVpZ2h0OwogCiAgICAgICAgIC8vIEZpcnN0IGZpbmQgdG9wLW1vc3Qgd2luZG93IHRoYXQgaGFzIGFza2VkIHRvIGJlIG9uIHRvcCBvZiB0aGUKICAgICAgICAgLy8gd2FsbHBhcGVyOyBhbGwgd2FsbHBhcGVycyBnbyBiZWhpbmQgaXQuCkBAIC0xODUyLDggKzE4NjAsOCBAQAogICAgIH0KIAogICAgIGJvb2xlYW4gdXBkYXRlV2FsbHBhcGVyT2Zmc2V0TG9ja2VkKFdpbmRvd1N0YXRlIGNoYW5naW5nVGFyZ2V0LCBib29sZWFuIHN5bmMpIHsKLSAgICAgICAgZmluYWwgaW50IGR3ID0gbUN1ckRpc3BsYXlXaWR0aDsKLSAgICAgICAgZmluYWwgaW50IGRoID0gbUN1ckRpc3BsYXlIZWlnaHQ7CisgICAgICAgIGZpbmFsIGludCBkdyA9IG1BcHBEaXNwbGF5V2lkdGg7CisgICAgICAgIGZpbmFsIGludCBkaCA9IG1BcHBEaXNwbGF5SGVpZ2h0OwogCiAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwogCkBAIC0xODkzLDggKzE5MDEsOCBAQAogCiAgICAgdm9pZCB1cGRhdGVXYWxscGFwZXJWaXNpYmlsaXR5TG9ja2VkKCkgewogICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUgPSBpc1dhbGxwYXBlclZpc2libGUobVdhbGxwYXBlclRhcmdldCk7Ci0gICAgICAgIGZpbmFsIGludCBkdyA9IG1DdXJEaXNwbGF5V2lkdGg7Ci0gICAgICAgIGZpbmFsIGludCBkaCA9IG1DdXJEaXNwbGF5SGVpZ2h0OworICAgICAgICBmaW5hbCBpbnQgZHcgPSBtQXBwRGlzcGxheVdpZHRoOworICAgICAgICBmaW5hbCBpbnQgZGggPSBtQXBwRGlzcGxheUhlaWdodDsKIAogICAgICAgICBpbnQgY3VyVG9rZW5JbmRleCA9IG1XYWxscGFwZXJUb2tlbnMuc2l6ZSgpOwogICAgICAgICB3aGlsZSAoY3VyVG9rZW5JbmRleCA+IDApIHsKQEAgLTI0ODYsNiArMjQ5NCw4IEBACiAKICAgICAgICAgICAgIGlmIChERUJVR19MQVlPVVQpIFNsb2cudihUQUcsICJSZWxheW91dCAiICsgd2luICsgIjogIiArIHdpbi5tQXR0cnMpOwogCisgICAgICAgICAgICB3aW4ubUVuZm9yY2VTaXplQ29tcGF0ID0gKHdpbi5tQXR0cnMuZmxhZ3MgJiBGTEFHX0NPTVBBVElCTEVfV0lORE9XKSAhPSAwOworCiAgICAgICAgICAgICBpZiAoKGF0dHJDaGFuZ2VzICYgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuQUxQSEFfQ0hBTkdFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHdpbi5tQWxwaGEgPSBhdHRycy5hbHBoYTsKICAgICAgICAgICAgIH0KQEAgLTI3MDEsNyArMjcxMSw3IEBACiAgICAgICAgICAgICBjb25maWdDaGFuZ2VkID0gdXBkYXRlT3JpZW50YXRpb25Gcm9tQXBwVG9rZW5zTG9ja2VkKGZhbHNlKTsKICAgICAgICAgICAgIHBlcmZvcm1MYXlvdXRBbmRQbGFjZVN1cmZhY2VzTG9ja2VkKCk7CiAgICAgICAgICAgICBpZiAoZGlzcGxheWVkICYmIHdpbi5tSXNXYWxscGFwZXIpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVXYWxscGFwZXJPZmZzZXRMb2NrZWQod2luLCBtQ3VyRGlzcGxheVdpZHRoLCBtQ3VyRGlzcGxheUhlaWdodCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHVwZGF0ZVdhbGxwYXBlck9mZnNldExvY2tlZCh3aW4sIG1BcHBEaXNwbGF5V2lkdGgsIG1BcHBEaXNwbGF5SGVpZ2h0LCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAod2luLm1BcHBUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgd2luLm1BcHBUb2tlbi51cGRhdGVSZXBvcnRlZFZpc2liaWxpdHlMb2NrZWQoKTsKQEAgLTMxODYsNiArMzE5NiwxNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgZ2V0T3JpZW50YXRpb25Gcm9tV2luZG93c0xvY2tlZCgpIHsKKyAgICAgICAgaWYgKG1EaXNwbGF5RnJvemVuIHx8IG1PcGVuaW5nQXBwcy5zaXplKCkgPiAwIHx8IG1DbG9zaW5nQXBwcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGxheSBpcyBmcm96ZW4sIHNvbWUgYWN0aXZpdGllcyBtYXkgYmUgaW4gdGhlIG1pZGRsZQorICAgICAgICAgICAgLy8gb2YgcmVzdGFydGluZywgYW5kIHRodXMgaGF2ZSByZW1vdmVkIHRoZWlyIG9sZCB3aW5kb3cuICBJZiB0aGUKKyAgICAgICAgICAgIC8vIHdpbmRvdyBoYXMgdGhlIGZsYWcgdG8gaGlkZSB0aGUgbG9jayBzY3JlZW4sIHRoZW4gdGhlIGxvY2sgc2NyZWVuCisgICAgICAgICAgICAvLyBjYW4gcmUtYXBwZWFyIGFuZCBpbmZsaWN0IGl0cyBvd24gb3JpZW50YXRpb24gb24gdXMuICBLZWVwIHRoZQorICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gc3RhYmxlIHVudGlsIHRoaXMgYWxsIHNldHRsZXMgZG93bi4KKyAgICAgICAgICAgIHJldHVybiBtTGFzdFdpbmRvd0ZvcmNlZE9yaWVudGF0aW9uOworICAgICAgICB9CisKICAgICAgICAgaW50IHBvcyA9IG1XaW5kb3dzLnNpemUoKSAtIDE7CiAgICAgICAgIHdoaWxlIChwb3MgPj0gMCkgewogICAgICAgICAgICAgV2luZG93U3RhdGUgd3Rva2VuID0gbVdpbmRvd3MuZ2V0KHBvcyk7CkBAIC0zMTkzLDcgKzMyMTIsNyBAQAogICAgICAgICAgICAgaWYgKHd0b2tlbi5tQXBwVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhpdCBhbiBhcHBsaWNhdGlvbiB3aW5kb3cuIHNvIHRoZSBvcmllbnRhdGlvbiB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlCiAgICAgICAgICAgICAgICAgLy8gYXBwIHdpbmRvdy4gTm8gcG9pbnQgaW4gY29udGludWluZyBmdXJ0aGVyLgotICAgICAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1VOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIHJldHVybiAobUxhc3RXaW5kb3dGb3JjZWRPcmllbnRhdGlvbj1BY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1VOU1BFQ0lGSUVEKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghd3Rva2VuLmlzVmlzaWJsZUx3KCkgfHwgIXd0b2tlbi5tUG9saWN5VmlzaWJpbGl0eUFmdGVyQW5pbSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMzIwMywxMCArMzIyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAocmVxID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fQkVISU5EKSl7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiByZXE7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtTGFzdFdpbmRvd0ZvcmNlZE9yaWVudGF0aW9uPXJlcSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fVU5TUEVDSUZJRUQ7CisgICAgICAgIHJldHVybiAobUxhc3RXaW5kb3dGb3JjZWRPcmllbnRhdGlvbj1BY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1VOU1BFQ0lGSUVEKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldE9yaWVudGF0aW9uRnJvbUFwcFRva2Vuc0xvY2tlZCgpIHsKQEAgLTMyMTksMTYgKzMyMzgsMjMgQEAKICAgICAgICAgd2hpbGUgKHBvcyA+PSAwKSB7CiAgICAgICAgICAgICBBcHBXaW5kb3dUb2tlbiB3dG9rZW4gPSBtQXBwVG9rZW5zLmdldChwb3MpOwogICAgICAgICAgICAgcG9zLS07CisKKyAgICAgICAgICAgIGlmIChERUJVR19BUFBfT1JJRU5UQVRJT04pIFNsb2cudihUQUcsICJDaGVja2luZyBhcHAgb3JpZW50YXRpb246ICIgKyB3dG9rZW4pOworCiAgICAgICAgICAgICAvLyBpZiB3ZSdyZSBhYm91dCB0byB0ZWFyIGRvd24gdGhpcyB3aW5kb3cgYW5kIG5vdCBzZWVrIGZvcgogICAgICAgICAgICAgLy8gdGhlIGJlaGluZCBhY3Rpdml0eSwgZG9uJ3QgdXNlIGl0IGZvciBvcmllbnRhdGlvbgogICAgICAgICAgICAgaWYgKCFmaW5kaW5nQmVoaW5kCiAgICAgICAgICAgICAgICAgICAgICYmICghd3Rva2VuLmhpZGRlbiAmJiB3dG9rZW4uaGlkZGVuUmVxdWVzdGVkKSkgeworICAgICAgICAgICAgICAgIGlmIChERUJVR19PUklFTlRBVElPTikgU2xvZy52KFRBRywgIlNraXBwaW5nICIgKyB3dG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAtLSBnb2luZyB0byBoaWRlIik7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICghaGF2ZUdyb3VwKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaWdub3JlIGFueSBoaWRkZW4gYXBwbGljYXRpb25zIG9uIHRoZSB0b3AuCiAgICAgICAgICAgICAgICAgaWYgKHd0b2tlbi5oaWRkZW5SZXF1ZXN0ZWQgfHwgd3Rva2VuLndpbGxCZUhpZGRlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfT1JJRU5UQVRJT04pIFNsb2cudihUQUcsICJTa2lwcGluZyAiICsgd3Rva2VuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0tIGhpZGRlbiBvbiB0b3AiKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGhhdmVHcm91cCA9IHRydWU7CkBAIC0zMjQyLDYgKzMyNjgsOCBAQAogICAgICAgICAgICAgICAgIC8vIHVzZXIncyBvcmllbnRhdGlvbi4KICAgICAgICAgICAgICAgICBpZiAobGFzdE9yaWVudGF0aW9uICE9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fQkVISU5ECiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXN0RnVsbHNjcmVlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfT1JJRU5UQVRJT04pIFNsb2cudihUQUcsICJEb25lIGF0ICIgKyB3dG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLS0gZW5kIG9mIGdyb3VwLCByZXR1cm4gIiArIGxhc3RPcmllbnRhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0T3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzI1MiwxNiArMzI4MCwyMSBAQAogICAgICAgICAgICAgbGFzdEZ1bGxzY3JlZW4gPSB3dG9rZW4uYXBwRnVsbHNjcmVlbjsKICAgICAgICAgICAgIGlmIChsYXN0RnVsbHNjcmVlbgogICAgICAgICAgICAgICAgICAgICAmJiBvciAhPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0JFSElORCkgeworICAgICAgICAgICAgICAgIGlmIChERUJVR19PUklFTlRBVElPTikgU2xvZy52KFRBRywgIkRvbmUgYXQgIiArIHd0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0tIGZ1bGwgc2NyZWVuLCByZXR1cm4gIiArIG9yKTsKICAgICAgICAgICAgICAgICByZXR1cm4gb3I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiB0aGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgYW4gZXhwbGljaXQgb3JpZW50YXRpb24sCiAgICAgICAgICAgICAvLyB0aGVuIHVzZSBpdC4KICAgICAgICAgICAgIGlmIChvciAhPSBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1VOU1BFQ0lGSUVECiAgICAgICAgICAgICAgICAgICAgICYmIG9yICE9IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fQkVISU5EKSB7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHX09SSUVOVEFUSU9OKSBTbG9nLnYoVEFHLCAiRG9uZSBhdCAiICsgd3Rva2VuCisgICAgICAgICAgICAgICAgICAgICAgICArICIgLS0gZXhwbGljaXRseSBzZXQsIHJldHVybiAiICsgb3IpOwogICAgICAgICAgICAgICAgIHJldHVybiBvcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmRpbmdCZWhpbmQgfD0gKG9yID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fQkVISU5EKTsKICAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfT1JJRU5UQVRJT04pIFNsb2cudihUQUcsICJObyBhcHAgaXMgcmVxdWVzdGluZyBhbiBvcmllbnRhdGlvbiIpOwogICAgICAgICByZXR1cm4gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9VTlNQRUNJRklFRDsKICAgICB9CiAKQEAgLTMzMzQsMTUgKzMzNjcsNiBAQAogICAgICAqIGFuZHJvaWQub3MuSUJpbmRlcikKICAgICAgKi8KICAgICBib29sZWFuIHVwZGF0ZU9yaWVudGF0aW9uRnJvbUFwcFRva2Vuc0xvY2tlZChib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKLSAgICAgICAgaWYgKG1EaXNwbGF5RnJvemVuIHx8IG1PcGVuaW5nQXBwcy5zaXplKCkgPiAwIHx8IG1DbG9zaW5nQXBwcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgZGlzcGxheSBpcyBmcm96ZW4sIHNvbWUgYWN0aXZpdGllcyBtYXkgYmUgaW4gdGhlIG1pZGRsZQotICAgICAgICAgICAgLy8gb2YgcmVzdGFydGluZywgYW5kIHRodXMgaGF2ZSByZW1vdmVkIHRoZWlyIG9sZCB3aW5kb3cuICBJZiB0aGUKLSAgICAgICAgICAgIC8vIHdpbmRvdyBoYXMgdGhlIGZsYWcgdG8gaGlkZSB0aGUgbG9jayBzY3JlZW4sIHRoZW4gdGhlIGxvY2sgc2NyZWVuCi0gICAgICAgICAgICAvLyBjYW4gcmUtYXBwZWFyIGFuZCBpbmZsaWN0IGl0cyBvd24gb3JpZW50YXRpb24gb24gdXMuICBLZWVwIHRoZQotICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gc3RhYmxlIHVudGlsIHRoaXMgYWxsIHNldHRsZXMgZG93bi4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCiAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwogICAgICAgICBsb25nIGlkZW50ID0gQmluZGVyLmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CkBAIC0zNTI0LDcgKzM1NDgsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldEFwcFN0YXJ0aW5nV2luZG93KElCaW5kZXIgdG9rZW4sIFN0cmluZyBwa2csCi0gICAgICAgICAgICBpbnQgdGhlbWUsIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwgaW50IGxhYmVsUmVzLCBpbnQgaWNvbiwKKyAgICAgICAgICAgIGludCB0aGVtZSwgQ29tcGF0aWJpbGl0eUluZm8gY29tcGF0SW5mbywKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBub25Mb2NhbGl6ZWRMYWJlbCwgaW50IGxhYmVsUmVzLCBpbnQgaWNvbiwKICAgICAgICAgICAgIGludCB3aW5kb3dGbGFncywgSUJpbmRlciB0cmFuc2ZlckZyb20sIGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGFuZHJvaWQuTWFuaWZlc3QucGVybWlzc2lvbi5NQU5BR0VfQVBQX1RPS0VOUywKICAgICAgICAgICAgICAgICAic2V0QXBwU3RhcnRpbmdJY29uKCkiKSkgewpAQCAtMzY3NCw4ICszNjk5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVN0YXJ0aW5nSWNvbkluVHJhbnNpdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICB3dG9rZW4uc3RhcnRpbmdEYXRhID0gbmV3IFN0YXJ0aW5nRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgcGtnLCB0aGVtZSwgbm9uTG9jYWxpemVkTGFiZWwsCisgICAgICAgICAgICB3dG9rZW4uc3RhcnRpbmdEYXRhID0gbmV3IFN0YXJ0aW5nRGF0YShwa2csIHRoZW1lLCBjb21wYXRJbmZvLCBub25Mb2NhbGl6ZWRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxSZXMsIGljb24sIHdpbmRvd0ZsYWdzKTsKICAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG1ILm9idGFpbk1lc3NhZ2UoSC5BRERfU1RBUlRJTkcsIHd0b2tlbik7CiAgICAgICAgICAgICAvLyBOb3RlOiB3ZSByZWFsbHkgd2FudCB0byBkbyBzZW5kTWVzc2FnZUF0RnJvbnRPZlF1ZXVlKCkgYmVjYXVzZSB3ZQpAQCAtNDc4Myw4ICs0ODA3LDggQEAKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKICAgICAgICAgICAgIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAotICAgICAgICAgICAgZHcgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheVdpZHRoKG1Sb3RhdGlvbiwgbUN1ckRpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICBkaCA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5SGVpZ2h0KG1Sb3RhdGlvbiwgbUN1ckRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgZHcgPSBtQXBwRGlzcGxheVdpZHRoOworICAgICAgICAgICAgZGggPSBtQXBwRGlzcGxheUhlaWdodDsKIAogICAgICAgICAgICAgaW50IGFib3ZlQXBwTGF5ZXIgPSBtUG9saWN5LndpbmRvd1R5cGVUb0xheWVyTHcoCiAgICAgICAgICAgICAgICAgICAgIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLlRZUEVfQVBQTElDQVRJT04pICogVFlQRV9MQVlFUl9NVUxUSVBMSUVSCkBAIC00OTUwLDkgKzQ5NzQsMTEgQEAKICAgICAgKiBNVVNUIENBTEwgc2V0TmV3Q29uZmlndXJhdGlvbigpIFRPIFVORlJFRVpFIFRIRSBTQ1JFRU4uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2V0Um90YXRpb25VbmNoZWNrZWRMb2NrZWQoaW50IHJvdGF0aW9uLCBpbnQgYW5pbUZsYWdzLCBib29sZWFuIGluVHJhbnNhY3Rpb24pIHsKLSAgICAgICAgaWYgKG1EcmFnU3RhdGUgIT0gbnVsbCB8fCBtU2NyZWVuUm90YXRpb25BbmltYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUG90ZW50aWFsIHJvdGF0aW9uIGR1cmluZyBhIGRyYWcuICBEb24ndCBkbyB0aGUgcm90YXRpb24gbm93LCBidXQgbWFrZQotICAgICAgICAgICAgLy8gYSBub3RlIHRvIHBlcmZvcm0gdGhlIHJvdGF0aW9uIGxhdGVyLgorICAgICAgICBpZiAobURyYWdTdGF0ZSAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgKG1TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbiAhPSBudWxsICYmIG1TY3JlZW5Sb3RhdGlvbkFuaW1hdGlvbi5pc0FuaW1hdGluZygpKSkgeworICAgICAgICAgICAgLy8gUG90ZW50aWFsIHJvdGF0aW9uIGR1cmluZyBhIGRyYWcgb3Igd2hpbGUgd2FpdGluZyBmb3IgYSBwcmV2aW91cyBvcmllbnRhdGlvbgorICAgICAgICAgICAgLy8gY2hhbmdlIHRvIGZpbmlzaCAocm90YXRpb24gYW5pbWF0aW9uIHdpbGwgYmUgZGlzbWlzc2VkKS4KKyAgICAgICAgICAgIC8vIERvbid0IGRvIHRoZSByb3RhdGlvbiBub3csIGJ1dCBtYWtlIGEgbm90ZSB0byBwZXJmb3JtIHRoZSByb3RhdGlvbiBsYXRlci4KICAgICAgICAgICAgIGlmIChERUJVR19PUklFTlRBVElPTikgU2xvZy52KFRBRywgIkRlZmVycmluZyByb3RhdGlvbi4iKTsKICAgICAgICAgICAgIGlmIChyb3RhdGlvbiAhPSBXaW5kb3dNYW5hZ2VyUG9saWN5LlVTRV9MQVNUX1JPVEFUSU9OKSB7CiAgICAgICAgICAgICAgICAgbURlZmVycmVkUm90YXRpb24gPSByb3RhdGlvbjsKQEAgLTUwMzksNyArNTA2NSw3IEBACiAgICAgICAgICAgICBtV2FpdGluZ0ZvckNvbmZpZyA9IHRydWU7CiAgICAgICAgICAgICBtTGF5b3V0TmVlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgIHN0YXJ0RnJlZXppbmdEaXNwbGF5TG9ja2VkKGluVHJhbnNhY3Rpb24pOwotICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNldHRpbmcgcm90YXRpb24gdG8gIiArIHJvdGF0aW9uICsgIiwgYW5pbUZsYWdzPSIgKyBhbmltRmxhZ3MpOworICAgICAgICAgICAgLy9TbG9nLmkoVEFHLCAiU2V0dGluZyByb3RhdGlvbiB0byAiICsgcm90YXRpb24gKyAiLCBhbmltRmxhZ3M9IiArIGFuaW1GbGFncyk7CiAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnNldERpc3BsYXlPcmllbnRhdGlvbigwLCByb3RhdGlvbik7CiAgICAgICAgICAgICBpZiAobURpc3BsYXlFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgLy8gTk9URTogV2UgZGlzYWJsZSB0aGUgcm90YXRpb24gaW4gdGhlIGVtdWxhdG9yIGJlY2F1c2UKQEAgLTU1MDksNiArNTUzNSw1NiBAQAogICAgICAgICByZXR1cm4gY3VyU2l6ZTsKICAgICB9CiAKKyAgICBwcml2YXRlIGludCBjb21wdXRlU21hbGxlc3RXaWR0aChib29sZWFuIHJvdGF0ZWQsIGludCBkdywgaW50IGRoLCBmbG9hdCBkZW5zaXR5KSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVzdCB3aWR0aCB0aGF0IHdpbGwgb2NjdXIgdW5kZXIgbm9ybWFsCisgICAgICAgIC8vIG9wZXJhdGlvbi4gIFRvIHRoaXMsIHN0YXJ0IHdpdGggdGhlIGJhc2Ugc2NyZWVuIHNpemUgYW5kIGNvbXB1dGUgdGhlCisgICAgICAgIC8vIHdpZHRoIHVuZGVyIHRoZSBkaWZmZXJlbnQgcG9zc2libGUgcm90YXRpb25zLiAgV2UgbmVlZCB0byB1bi1yb3RhdGUKKyAgICAgICAgLy8gdGhlIGN1cnJlbnQgc2NyZWVuIGRpbWVuc2lvbnMgYmVmb3JlIGRvaW5nIHRoaXMuCisgICAgICAgIGludCB1bnJvdER3LCB1bnJvdERoOworICAgICAgICBpZiAocm90YXRlZCkgeworICAgICAgICAgICAgdW5yb3REdyA9IGRoOworICAgICAgICAgICAgdW5yb3REaCA9IGR3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5yb3REdyA9IGR3OworICAgICAgICAgICAgdW5yb3REaCA9IGRoOworICAgICAgICB9CisgICAgICAgIGludCBzdyA9IHJlZHVjZUNvbmZpZ1dpZHRoU2l6ZSh1bnJvdER3LCBTdXJmYWNlLlJPVEFUSU9OXzAsIGRlbnNpdHksIHVucm90RHcpOworICAgICAgICBzdyA9IHJlZHVjZUNvbmZpZ1dpZHRoU2l6ZShzdywgU3VyZmFjZS5ST1RBVElPTl85MCwgZGVuc2l0eSwgdW5yb3REaCk7CisgICAgICAgIHN3ID0gcmVkdWNlQ29uZmlnV2lkdGhTaXplKHN3LCBTdXJmYWNlLlJPVEFUSU9OXzE4MCwgZGVuc2l0eSwgdW5yb3REdyk7CisgICAgICAgIHN3ID0gcmVkdWNlQ29uZmlnV2lkdGhTaXplKHN3LCBTdXJmYWNlLlJPVEFUSU9OXzI3MCwgZGVuc2l0eSwgdW5yb3REaCk7CisgICAgICAgIHJldHVybiBzdzsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZWR1Y2VDb21wYXRDb25maWdXaWR0aFNpemUoaW50IGN1clNpemUsIGludCByb3RhdGlvbiwgRGlzcGxheU1ldHJpY3MgZG0sCisgICAgICAgICAgICBpbnQgZHcsIGludCBkaCkgeworICAgICAgICBkbS51bnNjYWxlZFdpZHRoUGl4ZWxzID0gbVBvbGljeS5nZXROb25EZWNvckRpc3BsYXlXaWR0aChyb3RhdGlvbiwgZHcpOworICAgICAgICBkbS51bnNjYWxlZEhlaWdodFBpeGVscyA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5SGVpZ2h0KHJvdGF0aW9uLCBkaCk7CisgICAgICAgIGZsb2F0IHNjYWxlID0gQ29tcGF0aWJpbGl0eUluZm8uY29tcHV0ZUNvbXBhdGlibGVTY2FsaW5nKGRtLCBudWxsKTsKKyAgICAgICAgaW50IHNpemUgPSAoaW50KSgoKGRtLnVuc2NhbGVkV2lkdGhQaXhlbHMgLyBzY2FsZSkgLyBkbS5kZW5zaXR5KSArIC41Zik7CisgICAgICAgIGlmIChjdXJTaXplID09IDAgfHwgc2l6ZSA8IGN1clNpemUpIHsKKyAgICAgICAgICAgIGN1clNpemUgPSBzaXplOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJTaXplOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXB1dGVDb21wYXRTbWFsbGVzdFdpZHRoKGJvb2xlYW4gcm90YXRlZCwgRGlzcGxheU1ldHJpY3MgZG0sIGludCBkdywgaW50IGRoKSB7CisgICAgICAgIG1UbXBEaXNwbGF5TWV0cmljcy5zZXRUbyhkbSk7CisgICAgICAgIGRtID0gbVRtcERpc3BsYXlNZXRyaWNzOworICAgICAgICBpbnQgdW5yb3REdywgdW5yb3REaDsKKyAgICAgICAgaWYgKHJvdGF0ZWQpIHsKKyAgICAgICAgICAgIHVucm90RHcgPSBkaDsKKyAgICAgICAgICAgIHVucm90RGggPSBkdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVucm90RHcgPSBkdzsKKyAgICAgICAgICAgIHVucm90RGggPSBkaDsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3cgPSByZWR1Y2VDb21wYXRDb25maWdXaWR0aFNpemUoMCwgU3VyZmFjZS5ST1RBVElPTl8wLCBkbSwgdW5yb3REdywgdW5yb3REaCk7CisgICAgICAgIHN3ID0gcmVkdWNlQ29tcGF0Q29uZmlnV2lkdGhTaXplKHN3LCBTdXJmYWNlLlJPVEFUSU9OXzkwLCBkbSwgdW5yb3REaCwgdW5yb3REdyk7CisgICAgICAgIHN3ID0gcmVkdWNlQ29tcGF0Q29uZmlnV2lkdGhTaXplKHN3LCBTdXJmYWNlLlJPVEFUSU9OXzE4MCwgZG0sIHVucm90RHcsIHVucm90RGgpOworICAgICAgICBzdyA9IHJlZHVjZUNvbXBhdENvbmZpZ1dpZHRoU2l6ZShzdywgU3VyZmFjZS5ST1RBVElPTl8yNzAsIGRtLCB1bnJvdERoLCB1bnJvdER3KTsKKyAgICAgICAgcmV0dXJuIHN3OworICAgIH0KKwogICAgIGJvb2xlYW4gY29tcHV0ZU5ld0NvbmZpZ3VyYXRpb25Mb2NrZWQoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKICAgICAgICAgaWYgKG1EaXNwbGF5ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTU1NTQsMjEgKzU2MzAsMjYgQEAKICAgICAgICAgfQogICAgICAgICBjb25maWcub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKIAotICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IG5ldyBEaXNwbGF5TWV0cmljcygpOworICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IG1EaXNwbGF5TWV0cmljczsKICAgICAgICAgbURpc3BsYXkuZ2V0UmVhbE1ldHJpY3MoZG0pOwogCiAgICAgICAgIC8vIE92ZXJyaWRlIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCB3aXRoIHdoYXQgd2UgYXJlIGNvbXB1dGluZywKICAgICAgICAgLy8gdG8gYmUgc3VyZSB0aGV5IHJlbWFpbiBjb25zaXN0ZW50LgotICAgICAgICBkbS53aWR0aFBpeGVscyA9IGRtLnJlYWxXaWR0aFBpeGVscyA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5V2lkdGgoCi0gICAgICAgICAgICAgICAgbVJvdGF0aW9uLCBkdyk7Ci0gICAgICAgIGRtLmhlaWdodFBpeGVscyA9IGRtLnJlYWxIZWlnaHRQaXhlbHMgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheUhlaWdodCgKLSAgICAgICAgICAgICAgICBtUm90YXRpb24sIGRoKTsKKyAgICAgICAgZG0ud2lkdGhQaXhlbHMgPSBkbS51bnNjYWxlZFdpZHRoUGl4ZWxzID0gbUFwcERpc3BsYXlXaWR0aAorICAgICAgICAgICAgICAgID0gbVBvbGljeS5nZXROb25EZWNvckRpc3BsYXlXaWR0aChtUm90YXRpb24sIGR3KTsKKyAgICAgICAgZG0uaGVpZ2h0UGl4ZWxzID0gZG0udW5zY2FsZWRIZWlnaHRQaXhlbHMgPSBtQXBwRGlzcGxheUhlaWdodAorICAgICAgICAgICAgICAgID0gbVBvbGljeS5nZXROb25EZWNvckRpc3BsYXlIZWlnaHQobVJvdGF0aW9uLCBkaCk7CiAKLSAgICAgICAgbUNvbXBhdGlibGVTY3JlZW5TY2FsZSA9IENvbXBhdGliaWxpdHlJbmZvLnVwZGF0ZUNvbXBhdGlibGVTY3JlZW5GcmFtZSgKLSAgICAgICAgICAgICAgICBkbSwgbUNvbXBhdGlibGVTY3JlZW5GcmFtZSwgbnVsbCk7CisgICAgICAgIG1Db21wYXRpYmxlU2NyZWVuU2NhbGUgPSBDb21wYXRpYmlsaXR5SW5mby5jb21wdXRlQ29tcGF0aWJsZVNjYWxpbmcoZG0sCisgICAgICAgICAgICAgICAgbUNvbXBhdERpc3BsYXlNZXRyaWNzKTsKIAogICAgICAgICBjb25maWcuc2NyZWVuV2lkdGhEcCA9IChpbnQpKG1Qb2xpY3kuZ2V0Q29uZmlnRGlzcGxheVdpZHRoKG1Sb3RhdGlvbiwgZHcpIC8gZG0uZGVuc2l0eSk7CiAgICAgICAgIGNvbmZpZy5zY3JlZW5IZWlnaHREcCA9IChpbnQpKG1Qb2xpY3kuZ2V0Q29uZmlnRGlzcGxheUhlaWdodChtUm90YXRpb24sIGRoKSAvIGRtLmRlbnNpdHkpOworICAgICAgICBjb25maWcuc21hbGxlc3RTY3JlZW5XaWR0aERwID0gY29tcHV0ZVNtYWxsZXN0V2lkdGgocm90YXRlZCwgZHcsIGRoLCBkbS5kZW5zaXR5KTsKKworICAgICAgICBjb25maWcuY29tcGF0U2NyZWVuV2lkdGhEcCA9IChpbnQpKGNvbmZpZy5zY3JlZW5XaWR0aERwIC8gbUNvbXBhdGlibGVTY3JlZW5TY2FsZSk7CisgICAgICAgIGNvbmZpZy5jb21wYXRTY3JlZW5IZWlnaHREcCA9IChpbnQpKGNvbmZpZy5zY3JlZW5IZWlnaHREcCAvIG1Db21wYXRpYmxlU2NyZWVuU2NhbGUpOworICAgICAgICBjb25maWcuY29tcGF0U21hbGxlc3RTY3JlZW5XaWR0aERwID0gY29tcHV0ZUNvbXBhdFNtYWxsZXN0V2lkdGgocm90YXRlZCwgZG0sIGR3LCBkaCk7CiAKICAgICAgICAgLy8gV2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHNtYWxsZXN0IHdpZHRoIHRoYXQgd2lsbCBvY2N1ciB1bmRlciBub3JtYWwKICAgICAgICAgLy8gb3BlcmF0aW9uLiAgVG8gdGhpcywgc3RhcnQgd2l0aCB0aGUgYmFzZSBzY3JlZW4gc2l6ZSBhbmQgY29tcHV0ZSB0aGUKQEAgLTU5NTEsNiArNjAzMiwxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGVtcG9yYXJpbHkgc2V0IHRoZSBwb2ludGVyIHNwZWVkLiAgRG9lcyBub3Qgc2F2ZSB0aGUgbmV3IHNldHRpbmcuCisgICAgICogVXNlZCBieSB0aGUgc2V0dGluZ3MgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9pbnRlclNwZWVkKGludCBzcGVlZCkgeworICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLlNFVF9QT0lOVEVSX1NQRUVELAorICAgICAgICAgICAgICAgICJzZXRQb2ludGVyU3BlZWQoKSIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oIlJlcXVpcmVzIFNFVF9QT0lOVEVSX1NQRUVEIHBlcm1pc3Npb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dE1hbmFnZXIuc2V0UG9pbnRlclNwZWVkKHNwZWVkKTsKKyAgICB9CisKICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGdldEZvY3VzZWRXaW5kb3coKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobVdpbmRvd01hcCkgewogICAgICAgICAgICAgcmV0dXJuIGdldEZvY3VzZWRXaW5kb3dMb2NrZWQoKTsKQEAgLTU5OTAsOCArNjA4NCw4IEBACiAgICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5V2lkdGggPSBtSW5pdGlhbERpc3BsYXlIZWlnaHQ7CiAgICAgICAgICAgICAgICAgbUluaXRpYWxEaXNwbGF5SGVpZ2h0ID0gdG1wOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJhc2VEaXNwbGF5V2lkdGggPSBtQ3VyRGlzcGxheVdpZHRoID0gbUluaXRpYWxEaXNwbGF5V2lkdGg7Ci0gICAgICAgICAgICBtQmFzZURpc3BsYXlIZWlnaHQgPSBtQ3VyRGlzcGxheUhlaWdodCA9IG1Jbml0aWFsRGlzcGxheUhlaWdodDsKKyAgICAgICAgICAgIG1CYXNlRGlzcGxheVdpZHRoID0gbUN1ckRpc3BsYXlXaWR0aCA9IG1BcHBEaXNwbGF5V2lkdGggPSBtSW5pdGlhbERpc3BsYXlXaWR0aDsKKyAgICAgICAgICAgIG1CYXNlRGlzcGxheUhlaWdodCA9IG1DdXJEaXNwbGF5SGVpZ2h0ID0gbUFwcERpc3BsYXlIZWlnaHQgPSBtSW5pdGlhbERpc3BsYXlIZWlnaHQ7CiAgICAgICAgICAgICBtSW5wdXRNYW5hZ2VyLnNldERpc3BsYXlTaXplKDAsIG1EaXNwbGF5LmdldFJhd1dpZHRoKCksIG1EaXNwbGF5LmdldFJhd0hlaWdodCgpKTsKICAgICAgICAgICAgIG1Qb2xpY3kuc2V0SW5pdGlhbERpc3BsYXlTaXplKG1Jbml0aWFsRGlzcGxheVdpZHRoLCBtSW5pdGlhbERpc3BsYXlIZWlnaHQpOwogICAgICAgICB9CkBAIC02MTQwLDkgKzYyMzQsOCBAQAogICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IG1Qb2xpY3kuYWRkU3RhcnRpbmdXaW5kb3coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Rva2VuLnRva2VuLCBzZC5wa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QudGhlbWUsIHNkLm5vbkxvY2FsaXplZExhYmVsLCBzZC5sYWJlbFJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZC5pY29uLCBzZC53aW5kb3dGbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Rva2VuLnRva2VuLCBzZC5wa2csIHNkLnRoZW1lLCBzZC5jb21wYXRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkLm5vbkxvY2FsaXplZExhYmVsLCBzZC5sYWJlbFJlcywgc2QuaWNvbiwgc2Qud2luZG93RmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU2xvZy53KFRBRywgIkV4Y2VwdGlvbiB3aGVuIGFkZGluZyBzdGFydGluZyB3aW5kb3ciLCBlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjM0Myw3ICs2NDM2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheUZyb3plbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjQ5Myw4ICs2NTg1LDggQEAKIAogICAgIHB1YmxpYyB2b2lkIGdldERpc3BsYXlTaXplKFBvaW50IHNpemUpIHsKICAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKLSAgICAgICAgICAgIHNpemUueCA9IG1DdXJEaXNwbGF5V2lkdGg7Ci0gICAgICAgICAgICBzaXplLnkgPSBtQ3VyRGlzcGxheUhlaWdodDsKKyAgICAgICAgICAgIHNpemUueCA9IG1BcHBEaXNwbGF5V2lkdGg7CisgICAgICAgICAgICBzaXplLnkgPSBtQXBwRGlzcGxheUhlaWdodDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjYyNiw2ICs2NzE4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5TdGF0dXNCYXJIaWRlKCkgeworICAgICAgICByZXR1cm4gbVBvbGljeS5jYW5TdGF0dXNCYXJIaWRlKCk7CisgICAgfQorCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIEludGVybmFscwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY5OTAsOSArNzA4Niw4IEBACiAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgZmluYWwgaW50IGR3ID0gbUN1ckRpc3BsYXlXaWR0aDsKICAgICAgICAgZmluYWwgaW50IGRoID0gbUN1ckRpc3BsYXlIZWlnaHQ7Ci0KLSAgICAgICAgZmluYWwgaW50IGlubmVyRHcgPSBtUG9saWN5LmdldE5vbkRlY29yRGlzcGxheVdpZHRoKG1Sb3RhdGlvbiwgZHcpOwotICAgICAgICBmaW5hbCBpbnQgaW5uZXJEaCA9IG1Qb2xpY3kuZ2V0Tm9uRGVjb3JEaXNwbGF5SGVpZ2h0KG1Sb3RhdGlvbiwgZGgpOworICAgICAgICBmaW5hbCBpbnQgaW5uZXJEdyA9IG1BcHBEaXNwbGF5V2lkdGg7CisgICAgICAgIGZpbmFsIGludCBpbm5lckRoID0gbUFwcERpc3BsYXlIZWlnaHQ7CiAKICAgICAgICAgaW50IGk7CiAKQEAgLTgwMzAsNyArODEyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGltQW5pbWF0b3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpbUFuaW1hdG9yID0gbmV3IERpbUFuaW1hdG9yKG1GeFNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaW1BbmltYXRvci5zaG93KGR3LCBkaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaW1BbmltYXRvci5zaG93KGlubmVyRHcsIGlubmVyRGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGltQW5pbWF0b3IudXBkYXRlUGFyYW1ldGVycyhtQ29udGV4dC5nZXRSZXNvdXJjZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBjdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODQyMCw3ICs4NTE1LDggQEAKICAgICAgICAgICAgICAgICAvLyBzdXJmYWNlIGFuZCBhc2sgdGhlIGFwcCB0byByZXF1ZXN0IGFub3RoZXIgb25lLgogICAgICAgICAgICAgICAgIFNsb2cudyhUQUcsICJMb29rcyBsaWtlIHdlIGhhdmUgcmVjbGFpbWVkIHNvbWUgbWVtb3J5LCBjbGVhcmluZyBzdXJmYWNlIGZvciByZXRyeS4iKTsKICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgbG9nU3VyZmFjZSh3aW4sICJSRUNPVkVSIERFU1RST1kiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVFJBTlNBQ1RJT05TIHx8IFNIT1dfU1VSRkFDRV9BTExPQykgbG9nU3VyZmFjZSh3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFQ09WRVIgREVTVFJPWSIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgd2luLm1TdXJmYWNlU2hvd24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgd2luLm1TdXJmYWNlID0gbnVsbDsKQEAgLTg1NTcsMTkgKzg2NTMsNiBAQAogCiAgICAgICAgIG1TY3JlZW5Gcm96ZW5Mb2NrLmFjcXVpcmUoKTsKIAotICAgICAgICBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICAvL1Nsb2cuaShUQUcsICJGcmVlemluZywgZ2MgcGVuZGluZzogIiArIG1GcmVlemVHY1BlbmRpbmcgKyAiLCBub3cgIiArIG5vdyk7Ci0gICAgICAgIGlmIChtRnJlZXplR2NQZW5kaW5nICE9IDApIHsKLSAgICAgICAgICAgIGlmIChub3cgPiAobUZyZWV6ZUdjUGVuZGluZysxMDAwKSkgewotICAgICAgICAgICAgICAgIC8vU2xvZy5pKFRBRywgIkdjISAgIiArIG5vdyArICIgPiAiICsgKG1GcmVlemVHY1BlbmRpbmcrMTAwMCkpOwotICAgICAgICAgICAgICAgIG1ILnJlbW92ZU1lc3NhZ2VzKEguRk9SQ0VfR0MpOwotICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0gICAgICAgICAgICAgICAgbUZyZWV6ZUdjUGVuZGluZyA9IG5vdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GcmVlemVHY1BlbmRpbmcgPSBub3c7Ci0gICAgICAgIH0KLQogICAgICAgICBtRGlzcGxheUZyb3plbiA9IHRydWU7CiAgICAgICAgIAogICAgICAgICBtSW5wdXRNb25pdG9yLmZyZWV6ZUlucHV0RGlzcGF0Y2hpbmdMdygpOwpAQCAtODkyNCw5ICs5MDA3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbUFwcHNGcmVlemluZ1NjcmVlbj0iKTsgcHcucHJpbnQobUFwcHNGcmVlemluZ1NjcmVlbik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbVdhaXRpbmdGb3JDb25maWc9Iik7IHB3LnByaW50bG4obVdhaXRpbmdGb3JDb25maWcpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbVJvdGF0aW9uPSIpOyBwdy5wcmludChtUm90YXRpb24pOwotICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1Gb3JjZWRBcHBPcmllbnRhdGlvbj0iKTsgcHcucHJpbnQobUZvcmNlZEFwcE9yaWVudGF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBtUmVxdWVzdGVkUm90YXRpb249Iik7IHB3LnByaW50KG1SZXF1ZXN0ZWRSb3RhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgbUFsdE9yaWVudGF0aW9uPSIpOyBwdy5wcmludGxuKG1BbHRPcmllbnRhdGlvbik7CisgICAgICAgICAgICBwdy5wcmludCgiICBtTGFzdFdpbmRvd0ZvcmNlZE9yaWVudGF0aW9uIik7IHB3LnByaW50KG1MYXN0V2luZG93Rm9yY2VkT3JpZW50YXRpb24pOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG1Gb3JjZWRBcHBPcmllbnRhdGlvbj0iKTsgcHcucHJpbnRsbihtRm9yY2VkQXBwT3JpZW50YXRpb24pOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbURlZmVycmVkUm90YXRpb249Iik7IHB3LnByaW50KG1EZWZlcnJlZFJvdGF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiwgbURlZmVycmVkUm90YXRpb25BbmltRmxhZ3M9Iik7IHB3LnByaW50bG4obURlZmVycmVkUm90YXRpb25BbmltRmxhZ3MpOwogICAgICAgICAgICAgcHcucHJpbnQoIiAgbUFuaW1hdGlvblBlbmRpbmc9Iik7IHB3LnByaW50KG1BbmltYXRpb25QZW5kaW5nKTsKQEAgLTg5NjUsNiArOTA0OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChtQmFzZURpc3BsYXlXaWR0aCk7IHB3LnByaW50KCJ4Iik7IHB3LnByaW50KG1CYXNlRGlzcGxheUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGN1cj0iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG1DdXJEaXNwbGF5V2lkdGgpOyBwdy5wcmludCgieCIpOyBwdy5wcmludChtQ3VyRGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGFwcD0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KG1BcHBEaXNwbGF5V2lkdGgpOyBwdy5wcmludCgieCIpOyBwdy5wcmludChtQXBwRGlzcGxheUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHJlYWw9Iik7IHB3LnByaW50KG1EaXNwbGF5LmdldFJlYWxXaWR0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCJ4Iik7IHB3LnByaW50KG1EaXNwbGF5LmdldFJlYWxIZWlnaHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIHJhdz0iKTsgcHcucHJpbnQobURpc3BsYXkuZ2V0UmF3V2lkdGgoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93U3RhdGUuamF2YQppbmRleCAxNDQzNDFiLi41ODc2ODVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dTdGF0ZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd1N0YXRlLmphdmEKQEAgLTU0LDYgKzU0LDEwIEBACiAgKiBBIHdpbmRvdyBpbiB0aGUgd2luZG93IG1hbmFnZXIuCiAgKi8KIGZpbmFsIGNsYXNzIFdpbmRvd1N0YXRlIGltcGxlbWVudHMgV2luZG93TWFuYWdlclBvbGljeS5XaW5kb3dTdGF0ZSB7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVklTSUJJTElUWSA9IFdpbmRvd01hbmFnZXJTZXJ2aWNlLkRFQlVHX1ZJU0lCSUxJVFk7CisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19UUkFOU0FDVElPTlMgPSBXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUzsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9XX1NVUkZBQ0VfQUxMT0MgPSBXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1NVUkZBQ0VfQUxMT0M7CisKICAgICBmaW5hbCBXaW5kb3dNYW5hZ2VyU2VydmljZSBtU2VydmljZTsKICAgICBmaW5hbCBTZXNzaW9uIG1TZXNzaW9uOwogICAgIGZpbmFsIElXaW5kb3cgbUNsaWVudDsKQEAgLTcxLDcgKzc1LDcgQEAKICAgICBmaW5hbCBib29sZWFuIG1Jc0ltV2luZG93OwogICAgIGZpbmFsIGJvb2xlYW4gbUlzV2FsbHBhcGVyOwogICAgIGZpbmFsIGJvb2xlYW4gbUlzRmxvYXRpbmdMYXllcjsKLSAgICBmaW5hbCBib29sZWFuIG1FbmZvcmNlU2l6ZUNvbXBhdDsKKyAgICBib29sZWFuIG1FbmZvcmNlU2l6ZUNvbXBhdDsKICAgICBpbnQgbVZpZXdWaXNpYmlsaXR5OwogICAgIGJvb2xlYW4gbVBvbGljeVZpc2liaWxpdHkgPSB0cnVlOwogICAgIGJvb2xlYW4gbVBvbGljeVZpc2liaWxpdHlBZnRlckFuaW0gPSB0cnVlOwpAQCAtNjAwLDcgKzYwNCw3IEBACiAgICAgICAgICAgICBpZiAoKG1BdHRycy5mbGFncyZXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcy5GTEFHX1NFQ1VSRSkgIT0gMCkgewogICAgICAgICAgICAgICAgIGZsYWdzIHw9IFN1cmZhY2UuU0VDVVJFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLkRFQlVHX1ZJU0lCSUxJVFkpIFNsb2cudigKKyAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiQ3JlYXRpbmcgc3VyZmFjZSBpbiBzZXNzaW9uICIKICAgICAgICAgICAgICAgICArIG1TZXNzaW9uLm1TdXJmYWNlU2Vzc2lvbiArICIgd2luZG93ICIgKyB0aGlzCiAgICAgICAgICAgICAgICAgKyAiIHc9IiArIG1Db21wYXRGcmFtZS53aWR0aCgpCkBAIC02MzksNyArNjQzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLm1TdXJmYWNlU2Vzc2lvbiwgbVNlc3Npb24ubVBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1BdHRycy5nZXRUaXRsZSgpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCB3LCBoLCBmb3JtYXQsIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlMpIFNsb2cuaShXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICIgIENSRUFURSBTVVJGQUNFICIKKyAgICAgICAgICAgICAgICBpZiAoU0hPV19UUkFOU0FDVElPTlMgfHwgU0hPV19TVVJGQUNFX0FMTE9DKSBTbG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgIiAgQ1JFQVRFIFNVUkZBQ0UgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VyZmFjZSArICIgSU4gU0VTU0lPTiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIG1TZXNzaW9uLm1TdXJmYWNlU2Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBwaWQ9IiArIG1TZXNzaW9uLm1QaWQgKyAiIGZvcm1hdD0iCkBAIC02NTksNyArNjY0LDcgQEAKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICJHb3Qgc3VyZmFjZTogIiArIG1TdXJmYWNlCiAgICAgICAgICAgICAgICAgKyAiLCBzZXQgbGVmdD0iICsgbUZyYW1lLmxlZnQgKyAiIHRvcD0iICsgbUZyYW1lLnRvcAogICAgICAgICAgICAgICAgICsgIiwgYW5pbUxheWVyPSIgKyBtQW5pbUxheWVyKTsKLSAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUykgeworICAgICAgICAgICAgaWYgKFNIT1dfVFJBTlNBQ1RJT05TKSB7CiAgICAgICAgICAgICAgICAgU2xvZy5pKFdpbmRvd01hbmFnZXJTZXJ2aWNlLlRBRywgIj4+PiBPUEVOIFRSQU5TQUNUSU9OIGNyZWF0ZVN1cmZhY2VMb2NrZWQiKTsKICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5sb2dTdXJmYWNlKHRoaXMsICJDUkVBVEUgcG9zPSgiICsgbUZyYW1lLmxlZnQKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwiICsgbUZyYW1lLnRvcCArICIpICgiICsKQEAgLTY3Nyw3ICs2ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZVNob3duID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChtQXR0cnMuZmxhZ3MmV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuRkxBR19ESVRIRVIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUykgV2luZG93TWFuYWdlclNlcnZpY2UubG9nU3VyZmFjZSh0aGlzLCAiRElUSEVSIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19UUkFOU0FDVElPTlMpIFdpbmRvd01hbmFnZXJTZXJ2aWNlLmxvZ1N1cmZhY2UodGhpcywgIkRJVEhFUiIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2Uuc2V0RmxhZ3MoU3VyZmFjZS5TVVJGQUNFX0RJVEhFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZS5TVVJGQUNFX0RJVEhFUik7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY4OCw3ICs2OTMsNyBAQAogICAgICAgICAgICAgICAgIG1MYXN0SGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgU3VyZmFjZS5jbG9zZVRyYW5zYWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLlNIT1dfVFJBTlNBQ1RJT05TKSBTbG9nLmkoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiPDw8IENMT1NFIFRSQU5TQUNUSU9OIGNyZWF0ZVN1cmZhY2VMb2NrZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoU0hPV19UUkFOU0FDVElPTlMpIFNsb2cuaShXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICI8PDwgQ0xPU0UgVFJBTlNBQ1RJT04gY3JlYXRlU3VyZmFjZUxvY2tlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLmxvY2FsTE9HVikgU2xvZy52KAogICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICJDcmVhdGVkIHN1cmZhY2UgIiArIHRoaXMpOwpAQCAtNzI1LDcgKzczMCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLkRFQlVHX1ZJU0lCSUxJVFkpIHsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfVklTSUJJTElUWSkgewogICAgICAgICAgICAgICAgICAgICBSdW50aW1lRXhjZXB0aW9uIGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBpZiAoIVdpbmRvd01hbmFnZXJTZXJ2aWNlLkhJREVfU1RBQ0tfQ1JBV0xTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKQEAgLTczNCwxMyArNzM5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIFNsb2cudyhXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICJXaW5kb3cgIiArIHRoaXMgKyAiIGRlc3Ryb3lpbmcgc3VyZmFjZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VyZmFjZSArICIsIHNlc3Npb24gIiArIG1TZXNzaW9uLCBlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLlNIT1dfVFJBTlNBQ1RJT05TKSB7CisgICAgICAgICAgICAgICAgaWYgKFNIT1dfVFJBTlNBQ1RJT05TIHx8IFNIT1dfU1VSRkFDRV9BTExPQykgewogICAgICAgICAgICAgICAgICAgICBSdW50aW1lRXhjZXB0aW9uIGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBpZiAoIVdpbmRvd01hbmFnZXJTZXJ2aWNlLkhJREVfU1RBQ0tfQ1JBV0xTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGUuZmlsbEluU3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUykgV2luZG93TWFuYWdlclNlcnZpY2UubG9nU3VyZmFjZSh0aGlzLCAiREVTVFJPWSIsIGUpOworICAgICAgICAgICAgICAgICAgICBXaW5kb3dNYW5hZ2VyU2VydmljZS5sb2dTdXJmYWNlKHRoaXMsICJERVNUUk9ZIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TdXJmYWNlLmRlc3Ryb3koKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewpAQCAtNzU2LDcgKzc2MSw3IEBACiAKICAgICBib29sZWFuIGZpbmlzaERyYXdpbmdMb2NrZWQoKSB7CiAgICAgICAgIGlmIChtRHJhd1BlbmRpbmcpIHsKLSAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUyB8fCBXaW5kb3dNYW5hZ2VyU2VydmljZS5ERUJVR19PUklFTlRBVElPTikgU2xvZy52KAorICAgICAgICAgICAgaWYgKFNIT1dfVFJBTlNBQ1RJT05TIHx8IFdpbmRvd01hbmFnZXJTZXJ2aWNlLkRFQlVHX09SSUVOVEFUSU9OKSBTbG9nLnYoCiAgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiZmluaXNoRHJhd2luZ0xvY2tlZDogIiArIG1TdXJmYWNlKTsKICAgICAgICAgICAgIG1Db21taXREcmF3UGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICBtRHJhd1BlbmRpbmcgPSBmYWxzZTsKQEAgLTc4Myw3ICs3ODgsNyBAQAogCiAgICAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB3aGlsZSBpbnNpZGUgYSB0cmFuc2FjdGlvbi4KICAgICBib29sZWFuIHBlcmZvcm1TaG93TG9ja2VkKCkgewotICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuREVCVUdfVklTSUJJTElUWSkgeworICAgICAgICBpZiAoREVCVUdfVklTSUJJTElUWSkgewogICAgICAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBlID0gbnVsbDsKICAgICAgICAgICAgIGlmICghV2luZG93TWFuYWdlclNlcnZpY2UuSElERV9TVEFDS19DUkFXTFMpIHsKICAgICAgICAgICAgICAgICBlID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKQEAgLTc5NCw5ICs3OTksOSBAQAogICAgICAgICAgICAgICAgICAgICArICIgc3RhcnRpbmc9IiArIChtQXR0cnMudHlwZSA9PSBUWVBFX0FQUExJQ0FUSU9OX1NUQVJUSU5HKSwgZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1SZWFkeVRvU2hvdyAmJiBpc1JlYWR5Rm9yRGlzcGxheSgpKSB7Ci0gICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuU0hPV19UUkFOU0FDVElPTlMgfHwgV2luZG93TWFuYWdlclNlcnZpY2UuREVCVUdfT1JJRU5UQVRJT04pIFdpbmRvd01hbmFnZXJTZXJ2aWNlLmxvZ1N1cmZhY2UodGhpcywKKyAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUyB8fCBXaW5kb3dNYW5hZ2VyU2VydmljZS5ERUJVR19PUklFTlRBVElPTikgV2luZG93TWFuYWdlclNlcnZpY2UubG9nU3VyZmFjZSh0aGlzLAogICAgICAgICAgICAgICAgICAgICAiU0hPVyAocGVyZm9ybVNob3dMb2NrZWQpIiwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoV2luZG93TWFuYWdlclNlcnZpY2UuREVCVUdfVklTSUJJTElUWSkgU2xvZy52KFdpbmRvd01hbmFnZXJTZXJ2aWNlLlRBRywgIlNob3dpbmcgIiArIHRoaXMKKyAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiU2hvd2luZyAiICsgdGhpcwogICAgICAgICAgICAgICAgICAgICArICIgZHVyaW5nIGFuaW1hdGlvbjogcG9saWN5VmlzPSIgKyBtUG9saWN5VmlzaWJpbGl0eQogICAgICAgICAgICAgICAgICAgICArICIgYXR0SGlkZGVuPSIgKyBtQXR0YWNoZWRIaWRkZW4KICAgICAgICAgICAgICAgICAgICAgKyAiIHRvay5oaWRkZW5SZXF1ZXN0ZWQ9IgpAQCAtOTU4LDcgKzk2Myw3IEBACiAgICAgICAgIG1IYXNUcmFuc2Zvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICBtSGFzTG9jYWxUcmFuc2Zvcm1hdGlvbiA9IGZhbHNlOwogICAgICAgICBpZiAobVBvbGljeVZpc2liaWxpdHkgIT0gbVBvbGljeVZpc2liaWxpdHlBZnRlckFuaW0pIHsKLSAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5ERUJVR19WSVNJQklMSVRZKSB7CisgICAgICAgICAgICBpZiAoREVCVUdfVklTSUJJTElUWSkgewogICAgICAgICAgICAgICAgIFNsb2cudihXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICJQb2xpY3kgdmlzaWJpbGl0eSBjaGFuZ2luZyBhZnRlciBhbmltIGluICIgKyB0aGlzICsgIjogIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBtUG9saWN5VmlzaWJpbGl0eUFmdGVyQW5pbSk7CiAgICAgICAgICAgICB9CkBAIC0xMDIwLDcgKzEwMjUsNyBAQAogICAgICAgICBpZiAobVN1cmZhY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgbVNlcnZpY2UubURlc3Ryb3lTdXJmYWNlLmFkZCh0aGlzKTsKICAgICAgICAgICAgIG1EZXN0cm95aW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5TSE9XX1RSQU5TQUNUSU9OUykgV2luZG93TWFuYWdlclNlcnZpY2UubG9nU3VyZmFjZSh0aGlzLCAiSElERSAoZmluaXNoRXhpdCkiLCBudWxsKTsKKyAgICAgICAgICAgIGlmIChTSE9XX1RSQU5TQUNUSU9OUykgV2luZG93TWFuYWdlclNlcnZpY2UubG9nU3VyZmFjZSh0aGlzLCAiSElERSAoZmluaXNoRXhpdCkiLCBudWxsKTsKICAgICAgICAgICAgIG1TdXJmYWNlU2hvd24gPSBmYWxzZTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbVN1cmZhY2UuaGlkZSgpOwpAQCAtMTQxNCw5ICsxNDE5LDkgQEAKICAgICAgICAgaWYgKG1Qb2xpY3lWaXNpYmlsaXR5ICYmIG1Qb2xpY3lWaXNpYmlsaXR5QWZ0ZXJBbmltKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFdpbmRvd01hbmFnZXJTZXJ2aWNlLkRFQlVHX1ZJU0lCSUxJVFkpIFNsb2cudihXaW5kb3dNYW5hZ2VyU2VydmljZS5UQUcsICJQb2xpY3kgdmlzaWJpbGl0eSB0cnVlOiAiICsgdGhpcyk7CisgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiUG9saWN5IHZpc2liaWxpdHkgdHJ1ZTogIiArIHRoaXMpOwogICAgICAgICBpZiAoZG9BbmltYXRpb24pIHsKLSAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5ERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiZG9BbmltYXRpb246IG1Qb2xpY3lWaXNpYmlsaXR5PSIKKyAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiZG9BbmltYXRpb246IG1Qb2xpY3lWaXNpYmlsaXR5PSIKICAgICAgICAgICAgICAgICAgICAgKyBtUG9saWN5VmlzaWJpbGl0eSArICIgbUFuaW1hdGlvbj0iICsgbUFuaW1hdGlvbik7CiAgICAgICAgICAgICBpZiAobVNlcnZpY2UubURpc3BsYXlGcm96ZW4gfHwgIW1TZXJ2aWNlLm1Qb2xpY3kuaXNTY3JlZW5PbigpKSB7CiAgICAgICAgICAgICAgICAgZG9BbmltYXRpb24gPSBmYWxzZTsKQEAgLTE0NjIsNyArMTQ2Nyw3IEBACiAgICAgICAgIGlmIChkb0FuaW1hdGlvbikgewogICAgICAgICAgICAgbVBvbGljeVZpc2liaWxpdHlBZnRlckFuaW0gPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChXaW5kb3dNYW5hZ2VyU2VydmljZS5ERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiUG9saWN5IHZpc2liaWxpdHkgZmFsc2U6ICIgKyB0aGlzKTsKKyAgICAgICAgICAgIGlmIChERUJVR19WSVNJQklMSVRZKSBTbG9nLnYoV2luZG93TWFuYWdlclNlcnZpY2UuVEFHLCAiUG9saWN5IHZpc2liaWxpdHkgZmFsc2U6ICIgKyB0aGlzKTsKICAgICAgICAgICAgIG1Qb2xpY3lWaXNpYmlsaXR5QWZ0ZXJBbmltID0gZmFsc2U7CiAgICAgICAgICAgICBtUG9saWN5VmlzaWJpbGl0eSA9IGZhbHNlOwogICAgICAgICAgICAgLy8gV2luZG93IGlzIG5vIGxvbmdlciB2aXNpYmxlIC0tIG1ha2Ugc3VyZSBpZiB3ZSB3ZXJlIHdhaXRpbmcKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9BbmRyb2lkLm1rIGIvc2VydmljZXMvam5pL0FuZHJvaWQubWsKaW5kZXggNGU5M2ZlMi4uZjMzOTIwZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvam5pL0FuZHJvaWQubWsKQEAgLTEyLDkgKzEyLDExIEBACiAgICAgY29tX2FuZHJvaWRfc2VydmVyX0xpZ2h0c1NlcnZpY2UuY3BwIFwKICAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIuY3BwIFwKLSAgICBjb21fYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZS5jcHAgXAorICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyLmNwcCBcCisgICAgY29tX2FuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyLmNwcCBcCiAgICAgY29tX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZS5jcHAgXAogICAgIGNvbV9hbmRyb2lkX3NlcnZlcl9sb2NhdGlvbl9HcHNMb2NhdGlvblByb3ZpZGVyLmNwcCBcCisgICAgY29tX2FuZHJvaWRfc2VydmVyX2Nvbm5lY3Rpdml0eV9WcG4uY3BwIFwKICAgICBvbmxvYWQuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgKz0gXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwCmluZGV4IDFmMTBkOWMuLjhhNDZhYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAKQEAgLTUzLDYgKzUzLDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gVGhlIGV4cG9uZW50IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb2ludGVyIHNwZWVkIHNjYWxpbmcgZmFjdG9yLgorLy8gVGhlIHNjYWxpbmcgZmFjdG9yIGlzIGNhbGN1bGF0ZWQgYXMgMiBeIChzcGVlZCAqIGV4cG9uZW50KSwKKy8vIHdoZXJlIHRoZSBzcGVlZCByYW5nZXMgZnJvbSAtNyB0byArIDcgYW5kIGlzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorc3RhdGljIGNvbnN0IGZsb2F0IFBPSU5URVJfU1BFRURfRVhQT05FTlQgPSAxLjBmIC8gNDsKKwogc3RhdGljIHN0cnVjdCB7CiAgICAgam1ldGhvZElEIG5vdGlmeUNvbmZpZ3VyYXRpb25DaGFuZ2VkOwogICAgIGptZXRob2RJRCBub3RpZnlMaWRTd2l0Y2hDaGFuZ2VkOwpAQCAtNzEsNiArNzYsMTAgQEAKICAgICBqbWV0aG9kSUQgZ2V0S2V5UmVwZWF0VGltZW91dDsKICAgICBqbWV0aG9kSUQgZ2V0S2V5UmVwZWF0RGVsYXk7CiAgICAgam1ldGhvZElEIGdldE1heEV2ZW50c1BlclNlY29uZDsKKyAgICBqbWV0aG9kSUQgZ2V0SG92ZXJUYXBUaW1lb3V0OworICAgIGptZXRob2RJRCBnZXRIb3ZlclRhcFNsb3A7CisgICAgam1ldGhvZElEIGdldERvdWJsZVRhcFRpbWVvdXQ7CisgICAgam1ldGhvZElEIGdldExvbmdQcmVzc1RpbWVvdXQ7CiAgICAgam1ldGhvZElEIGdldFBvaW50ZXJMYXllcjsKICAgICBqbWV0aG9kSUQgZ2V0UG9pbnRlckljb247CiB9IGdDYWxsYmFja3NDbGFzc0luZm87CkBAIC0xMDQsNiArMTEzLDE2IEBACiAKIC8vIC0tLSBHbG9iYWwgZnVuY3Rpb25zIC0tLQogCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0YXRpYyBUIG1pbihjb25zdCBUJiBhLCBjb25zdCBUJiBiKSB7CisgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdGljIFQgbWF4KGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpIHsKKyAgICByZXR1cm4gYSA+IGIgPyBhIDogYjsKK30KKwogc3RhdGljIGpvYmplY3QgZ2V0SW5wdXRBcHBsaWNhdGlvbkhhbmRsZU9iakxvY2FsUmVmKEpOSUVudiogZW52LAogICAgICAgICBjb25zdCBzcDxJbnB1dEFwcGxpY2F0aW9uSGFuZGxlPiYgaW5wdXRBcHBsaWNhdGlvbkhhbmRsZSkgewogICAgIGlmIChpbnB1dEFwcGxpY2F0aW9uSGFuZGxlID09IE5VTEwpIHsKQEAgLTE2MiwxNSArMTgxLDEzIEBACiAgICAgdm9pZCBzZXRGb2N1c2VkQXBwbGljYXRpb24oSk5JRW52KiBlbnYsIGpvYmplY3QgYXBwbGljYXRpb25PYmopOwogICAgIHZvaWQgc2V0SW5wdXREaXNwYXRjaE1vZGUoYm9vbCBlbmFibGVkLCBib29sIGZyb3plbik7CiAgICAgdm9pZCBzZXRTeXN0ZW1VaVZpc2liaWxpdHkoaW50MzJfdCB2aXNpYmlsaXR5KTsKKyAgICB2b2lkIHNldFBvaW50ZXJTcGVlZChpbnQzMl90IHNwZWVkKTsKIAogICAgIC8qIC0tLSBJbnB1dFJlYWRlclBvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiAtLS0gKi8KIAogICAgIHZpcnR1YWwgYm9vbCBnZXREaXNwbGF5SW5mbyhpbnQzMl90IGRpc3BsYXlJZCwKICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLCBpbnQzMl90KiBoZWlnaHQsIGludDMyX3QqIG9yaWVudGF0aW9uKTsKLSAgICB2aXJ0dWFsIGJvb2wgZmlsdGVyVG91Y2hFdmVudHMoKTsKLSAgICB2aXJ0dWFsIGJvb2wgZmlsdGVySnVtcHlUb3VjaEV2ZW50cygpOwotICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRWaXJ0dWFsS2V5UXVpZXRUaW1lKCk7Ci0gICAgdmlydHVhbCB2b2lkIGdldEV4Y2x1ZGVkRGV2aWNlTmFtZXMoVmVjdG9yPFN0cmluZzg+JiBvdXRFeGNsdWRlZERldmljZU5hbWVzKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0UmVhZGVyQ29uZmlndXJhdGlvbihJbnB1dFJlYWRlckNvbmZpZ3VyYXRpb24qIG91dENvbmZpZyk7CiAgICAgdmlydHVhbCBzcDxQb2ludGVyQ29udHJvbGxlckludGVyZmFjZT4gb2J0YWluUG9pbnRlckNvbnRyb2xsZXIoaW50MzJfdCBkZXZpY2VJZCk7CiAKICAgICAvKiAtLS0gSW5wdXREaXNwYXRjaGVyUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIC0tLSAqLwpAQCAtMTgxLDEwICsxOTgsOSBAQAogICAgIHZpcnR1YWwgbnNlY3NfdCBub3RpZnlBTlIoY29uc3Qgc3A8SW5wdXRBcHBsaWNhdGlvbkhhbmRsZT4mIGlucHV0QXBwbGljYXRpb25IYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBzcDxJbnB1dFdpbmRvd0hhbmRsZT4mIGlucHV0V2luZG93SGFuZGxlKTsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SW5wdXRDaGFubmVsQnJva2VuKGNvbnN0IHNwPElucHV0V2luZG93SGFuZGxlPiYgaW5wdXRXaW5kb3dIYW5kbGUpOwotICAgIHZpcnR1YWwgbnNlY3NfdCBnZXRLZXlSZXBlYXRUaW1lb3V0KCk7Ci0gICAgdmlydHVhbCBuc2Vjc190IGdldEtleVJlcGVhdERlbGF5KCk7Ci0gICAgdmlydHVhbCBpbnQzMl90IGdldE1heEV2ZW50c1BlclNlY29uZCgpOwogICAgIHZpcnR1YWwgYm9vbCBmaWx0ZXJJbnB1dEV2ZW50KGNvbnN0IElucHV0RXZlbnQqIGlucHV0RXZlbnQsIHVpbnQzMl90IHBvbGljeUZsYWdzKTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24oSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbiogb3V0Q29uZmlnKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNLZXlSZXBlYXRFbmFibGVkKCk7CiAgICAgdmlydHVhbCB2b2lkIGludGVyY2VwdEtleUJlZm9yZVF1ZXVlaW5nKGNvbnN0IEtleUV2ZW50KiBrZXlFdmVudCwgdWludDMyX3QmIHBvbGljeUZsYWdzKTsKICAgICB2aXJ0dWFsIHZvaWQgaW50ZXJjZXB0TW90aW9uQmVmb3JlUXVldWVpbmcobnNlY3NfdCB3aGVuLCB1aW50MzJfdCYgcG9saWN5RmxhZ3MpOwogICAgIHZpcnR1YWwgYm9vbCBpbnRlcmNlcHRLZXlCZWZvcmVEaXNwYXRjaGluZyhjb25zdCBzcDxJbnB1dFdpbmRvd0hhbmRsZT4mIGlucHV0V2luZG93SGFuZGxlLApAQCAtMjA2LDE4ICsyMjIsNiBAQAogICAgIGpvYmplY3QgbUNhbGxiYWNrc09iajsKICAgICBzcDxMb29wZXI+IG1Mb29wZXI7CiAKLSAgICAvLyBDYWNoZWQgZmlsdGVyaW5nIHBvbGljaWVzLgotICAgIGludDMyX3QgbUZpbHRlclRvdWNoRXZlbnRzOwotICAgIGludDMyX3QgbUZpbHRlckp1bXB5VG91Y2hFdmVudHM7Ci0gICAgbnNlY3NfdCBtVmlydHVhbEtleVF1aWV0VGltZTsKLQotICAgIC8vIENhY2hlZCBrZXkgcmVwZWF0IHBvbGljeS4KLSAgICBuc2Vjc190IG1LZXlSZXBlYXRUaW1lb3V0OwotICAgIG5zZWNzX3QgbUtleVJlcGVhdERlbGF5OwotCi0gICAgLy8gQ2FjaGVkIHRocm90dGxpbmcgcG9saWN5LgotICAgIGludDMyX3QgbU1heEV2ZW50c1BlclNlY29uZDsKLQogICAgIE11dGV4IG1Mb2NrOwogICAgIHN0cnVjdCBMb2NrZWQgewogICAgICAgICAvLyBEaXNwbGF5IHNpemUgaW5mb3JtYXRpb24uCkBAIC0yMjcsNiArMjMxLDEyIEBACiAgICAgICAgIC8vIFN5c3RlbSBVSSB2aXNpYmlsaXR5LgogICAgICAgICBpbnQzMl90IHN5c3RlbVVpVmlzaWJpbGl0eTsKIAorICAgICAgICAvLyBQb2ludGVyIHNwZWVkLgorICAgICAgICBpbnQzMl90IHBvaW50ZXJTcGVlZDsKKworICAgICAgICAvLyBUcnVlIGlmIHBvaW50ZXIgZ2VzdHVyZXMgYXJlIGVuYWJsZWQuCisgICAgICAgIGJvb2wgcG9pbnRlckdlc3R1cmVzRW5hYmxlZDsKKwogICAgICAgICAvLyBTcHJpdGUgY29udHJvbGxlciBzaW5nbGV0b24sIGNyZWF0ZWQgb24gZmlyc3QgdXNlLgogICAgICAgICBzcDxTcHJpdGVDb250cm9sbGVyPiBzcHJpdGVDb250cm9sbGVyOwogCkBAIC0yNTMsMTAgKzI2Myw3IEBACiAKIE5hdGl2ZUlucHV0TWFuYWdlcjo6TmF0aXZlSW5wdXRNYW5hZ2VyKGpvYmplY3QgY29udGV4dE9iaiwKICAgICAgICAgam9iamVjdCBjYWxsYmFja3NPYmosIGNvbnN0IHNwPExvb3Blcj4mIGxvb3BlcikgOgotICAgICAgICBtTG9vcGVyKGxvb3BlciksCi0gICAgICAgIG1GaWx0ZXJUb3VjaEV2ZW50cygtMSksIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzKC0xKSwgbVZpcnR1YWxLZXlRdWlldFRpbWUoLTEpLAotICAgICAgICBtS2V5UmVwZWF0VGltZW91dCgtMSksIG1LZXlSZXBlYXREZWxheSgtMSksCi0gICAgICAgIG1NYXhFdmVudHNQZXJTZWNvbmQoLTEpIHsKKyAgICAgICAgbUxvb3Blcihsb29wZXIpIHsKICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwogCiAgICAgbUNvbnRleHRPYmogPSBlbnYtPk5ld0dsb2JhbFJlZihjb250ZXh0T2JqKTsKQEAgLTI2OSw2ICsyNzYsOCBAQAogICAgICAgICBtTG9ja2VkLmRpc3BsYXlPcmllbnRhdGlvbiA9IFJPVEFUSU9OXzA7CiAKICAgICAgICAgbUxvY2tlZC5zeXN0ZW1VaVZpc2liaWxpdHkgPSBBU1lTVEVNX1VJX1ZJU0lCSUxJVFlfU1RBVFVTX0JBUl9WSVNJQkxFOworICAgICAgICBtTG9ja2VkLnBvaW50ZXJTcGVlZCA9IDA7CisgICAgICAgIG1Mb2NrZWQucG9pbnRlckdlc3R1cmVzRW5hYmxlZCA9IHRydWU7CiAgICAgfQogCiAgICAgc3A8RXZlbnRIdWI+IGV2ZW50SHViID0gbmV3IEV2ZW50SHViKCk7CkBAIC0zNjksNzQgKzM3OCw3NyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWJvb2wgTmF0aXZlSW5wdXRNYW5hZ2VyOjpmaWx0ZXJUb3VjaEV2ZW50cygpIHsKLSAgICBpZiAobUZpbHRlclRvdWNoRXZlbnRzIDwgMCkgewotICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwotCi0gICAgICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmZpbHRlclRvdWNoRXZlbnRzKTsKLSAgICAgICAgaWYgKGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZmlsdGVyVG91Y2hFdmVudHMiKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtRmlsdGVyVG91Y2hFdmVudHMgPSByZXN1bHQgPyAxIDogMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1GaWx0ZXJUb3VjaEV2ZW50czsKLX0KLQotYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmZpbHRlckp1bXB5VG91Y2hFdmVudHMoKSB7Ci0gICAgaWYgKG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzIDwgMCkgewotICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwotCi0gICAgICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmZpbHRlckp1bXB5VG91Y2hFdmVudHMpOwotICAgICAgICBpZiAoY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJmaWx0ZXJKdW1weVRvdWNoRXZlbnRzIikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZpbHRlckp1bXB5VG91Y2hFdmVudHMgPSByZXN1bHQgPyAxIDogMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1GaWx0ZXJKdW1weVRvdWNoRXZlbnRzOwotfQotCi1uc2Vjc190IE5hdGl2ZUlucHV0TWFuYWdlcjo6Z2V0VmlydHVhbEtleVF1aWV0VGltZSgpIHsKLSAgICBpZiAobVZpcnR1YWxLZXlRdWlldFRpbWUgPCAwKSB7Ci0gICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Ci0KLSAgICAgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldFZpcnR1YWxLZXlRdWlldFRpbWVNaWxsaXMpOwotICAgICAgICBpZiAoY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRWaXJ0dWFsS2V5UXVpZXRUaW1lTWlsbGlzIikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBtVmlydHVhbEtleVF1aWV0VGltZSA9IG1pbGxpc2Vjb25kc190b19uYW5vc2Vjb25kcyhyZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gbVZpcnR1YWxLZXlRdWlldFRpbWU7Ci19Ci0KLXZvaWQgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRFeGNsdWRlZERldmljZU5hbWVzKFZlY3RvcjxTdHJpbmc4PiYgb3V0RXhjbHVkZWREZXZpY2VOYW1lcykgewotICAgIG91dEV4Y2x1ZGVkRGV2aWNlTmFtZXMuY2xlYXIoKTsKLQordm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OmdldFJlYWRlckNvbmZpZ3VyYXRpb24oSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uKiBvdXRDb25maWcpIHsKICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwogCi0gICAgam9iamVjdEFycmF5IHJlc3VsdCA9IGpvYmplY3RBcnJheShlbnYtPkNhbGxPYmplY3RNZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICBqYm9vbGVhbiBmaWx0ZXJUb3VjaEV2ZW50cyA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZmlsdGVyVG91Y2hFdmVudHMpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJmaWx0ZXJUb3VjaEV2ZW50cyIpKSB7CisgICAgICAgIG91dENvbmZpZy0+ZmlsdGVyVG91Y2hFdmVudHMgPSBmaWx0ZXJUb3VjaEV2ZW50czsKKyAgICB9CisKKyAgICBqYm9vbGVhbiBmaWx0ZXJKdW1weVRvdWNoRXZlbnRzID0gZW52LT5DYWxsQm9vbGVhbk1ldGhvZChtQ2FsbGJhY2tzT2JqLAorICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5maWx0ZXJKdW1weVRvdWNoRXZlbnRzKTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZmlsdGVySnVtcHlUb3VjaEV2ZW50cyIpKSB7CisgICAgICAgIG91dENvbmZpZy0+ZmlsdGVySnVtcHlUb3VjaEV2ZW50cyA9IGZpbHRlckp1bXB5VG91Y2hFdmVudHM7CisgICAgfQorCisgICAgamludCB2aXJ0dWFsS2V5UXVpZXRUaW1lID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldFZpcnR1YWxLZXlRdWlldFRpbWVNaWxsaXMpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRWaXJ0dWFsS2V5UXVpZXRUaW1lTWlsbGlzIikpIHsKKyAgICAgICAgb3V0Q29uZmlnLT52aXJ0dWFsS2V5UXVpZXRUaW1lID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHZpcnR1YWxLZXlRdWlldFRpbWUpOworICAgIH0KKworICAgIG91dENvbmZpZy0+ZXhjbHVkZWREZXZpY2VOYW1lcy5jbGVhcigpOworICAgIGpvYmplY3RBcnJheSBleGNsdWRlZERldmljZU5hbWVzID0gam9iamVjdEFycmF5KGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQ2FsbGJhY2tzT2JqLAogICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRFeGNsdWRlZERldmljZU5hbWVzKSk7Ci0gICAgaWYgKCEgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRFeGNsdWRlZERldmljZU5hbWVzIikgJiYgcmVzdWx0KSB7Ci0gICAgICAgIGpzaXplIGxlbmd0aCA9IGVudi0+R2V0QXJyYXlMZW5ndGgocmVzdWx0KTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0RXhjbHVkZWREZXZpY2VOYW1lcyIpICYmIGV4Y2x1ZGVkRGV2aWNlTmFtZXMpIHsKKyAgICAgICAganNpemUgbGVuZ3RoID0gZW52LT5HZXRBcnJheUxlbmd0aChleGNsdWRlZERldmljZU5hbWVzKTsKICAgICAgICAgZm9yIChqc2l6ZSBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBqc3RyaW5nIGl0ZW0gPSBqc3RyaW5nKGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KHJlc3VsdCwgaSkpOwotCisgICAgICAgICAgICBqc3RyaW5nIGl0ZW0gPSBqc3RyaW5nKGVudi0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGV4Y2x1ZGVkRGV2aWNlTmFtZXMsIGkpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZU5hbWVDaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoaXRlbSwgTlVMTCk7Ci0gICAgICAgICAgICBvdXRFeGNsdWRlZERldmljZU5hbWVzLmFkZChTdHJpbmc4KGRldmljZU5hbWVDaGFycykpOworICAgICAgICAgICAgb3V0Q29uZmlnLT5leGNsdWRlZERldmljZU5hbWVzLmFkZChTdHJpbmc4KGRldmljZU5hbWVDaGFycykpOwogICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoaXRlbSwgZGV2aWNlTmFtZUNoYXJzKTsKLQogICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihpdGVtKTsKICAgICAgICAgfQotICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHJlc3VsdCk7CisgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZXhjbHVkZWREZXZpY2VOYW1lcyk7CiAgICAgfQorCisgICAgamludCBob3ZlclRhcFRpbWVvdXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0SG92ZXJUYXBUaW1lb3V0KTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0SG92ZXJUYXBUaW1lb3V0IikpIHsKKyAgICAgICAgamludCBkb3VibGVUYXBUaW1lb3V0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXREb3VibGVUYXBUaW1lb3V0KTsKKyAgICAgICAgaWYgKCFjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldERvdWJsZVRhcFRpbWVvdXQiKSkgeworICAgICAgICAgICAgamludCBsb25nUHJlc3NUaW1lb3V0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0TG9uZ1ByZXNzVGltZW91dCk7CisgICAgICAgICAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0TG9uZ1ByZXNzVGltZW91dCIpKSB7CisgICAgICAgICAgICAgICAgb3V0Q29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcEludGVydmFsID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKGhvdmVyVGFwVGltZW91dCk7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IGVuc3VyZSB0aGF0IHRoZSB0YXAtZHJhZyBpbnRlcnZhbCBpcyBzaWduaWZpY2FudGx5IHNob3J0ZXIgdGhhbgorICAgICAgICAgICAgICAgIC8vIHRoZSBsb25nLXByZXNzIHRpbWVvdXQgYmVjYXVzZSB0aGUgdGFwIGlzIGhlbGQgZG93biBmb3IgdGhlIGVudGlyZSBkdXJhdGlvbgorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBkb3VibGUtdGFwIHRpbWVvdXQuCisgICAgICAgICAgICAgICAgamludCB0YXBEcmFnSW50ZXJ2YWwgPSBtYXgobWluKGxvbmdQcmVzc1RpbWVvdXQgLSAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVUYXBUaW1lb3V0KSwgaG92ZXJUYXBUaW1lb3V0KTsKKyAgICAgICAgICAgICAgICBvdXRDb25maWctPnBvaW50ZXJHZXN0dXJlVGFwRHJhZ0ludGVydmFsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kc190b19uYW5vc2Vjb25kcyh0YXBEcmFnSW50ZXJ2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgamludCBob3ZlclRhcFNsb3AgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0SG92ZXJUYXBTbG9wKTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0SG92ZXJUYXBTbG9wIikpIHsKKyAgICAgICAgb3V0Q29uZmlnLT5wb2ludGVyR2VzdHVyZVRhcFNsb3AgPSBob3ZlclRhcFNsb3A7CisgICAgfQorCisgICAgeyAvLyBhY3F1aXJlIGxvY2sKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKworICAgICAgICBvdXRDb25maWctPnBvaW50ZXJWZWxvY2l0eUNvbnRyb2xQYXJhbWV0ZXJzLnNjYWxlID0gZXhwMmYobUxvY2tlZC5wb2ludGVyU3BlZWQKKyAgICAgICAgICAgICAgICAqIFBPSU5URVJfU1BFRURfRVhQT05FTlQpOworICAgICAgICBvdXRDb25maWctPnBvaW50ZXJHZXN0dXJlc0VuYWJsZWQgPSBtTG9ja2VkLnBvaW50ZXJHZXN0dXJlc0VuYWJsZWQ7CisgICAgfSAvLyByZWxlYXNlIGxvY2sKIH0KIAogc3A8UG9pbnRlckNvbnRyb2xsZXJJbnRlcmZhY2U+IE5hdGl2ZUlucHV0TWFuYWdlcjo6b2J0YWluUG9pbnRlckNvbnRyb2xsZXIoaW50MzJfdCBkZXZpY2VJZCkgewpAQCAtNTU3LDU5ICs1NjksMzcgQEAKICAgICB9CiB9CiAKLW5zZWNzX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRLZXlSZXBlYXRUaW1lb3V0KCkgewotICAgIGlmICghIGlzU2NyZWVuT24oKSkgewotICAgICAgICAvLyBEaXNhYmxlIGtleSByZXBlYXQgd2hlbiB0aGUgc2NyZWVuIGlzIG9mZi4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtS2V5UmVwZWF0VGltZW91dCA8IDApIHsKLSAgICAgICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Cit2b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6Z2V0RGlzcGF0Y2hlckNvbmZpZ3VyYXRpb24oSW5wdXREaXNwYXRjaGVyQ29uZmlndXJhdGlvbiogb3V0Q29uZmlnKSB7CisgICAgSk5JRW52KiBlbnYgPSBqbmlFbnYoKTsKIAotICAgICAgICAgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRLZXlSZXBlYXRUaW1lb3V0KTsKLSAgICAgICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldEtleVJlcGVhdFRpbWVvdXQiKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IDUwMDsKLSAgICAgICAgICAgIH0KKyAgICBqaW50IGtleVJlcGVhdFRpbWVvdXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKKyAgICAgICAgICAgIGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0S2V5UmVwZWF0VGltZW91dCk7CisgICAgaWYgKCFjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldEtleVJlcGVhdFRpbWVvdXQiKSkgeworICAgICAgICBvdXRDb25maWctPmtleVJlcGVhdFRpbWVvdXQgPSBtaWxsaXNlY29uZHNfdG9fbmFub3NlY29uZHMoa2V5UmVwZWF0VGltZW91dCk7CisgICAgfQogCi0gICAgICAgICAgICBtS2V5UmVwZWF0VGltZW91dCA9IG1pbGxpc2Vjb25kc190b19uYW5vc2Vjb25kcyhyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtS2V5UmVwZWF0VGltZW91dDsKKyAgICBqaW50IGtleVJlcGVhdERlbGF5ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCisgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldEtleVJlcGVhdERlbGF5KTsKKyAgICBpZiAoIWNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soZW52LCAiZ2V0S2V5UmVwZWF0RGVsYXkiKSkgeworICAgICAgICBvdXRDb25maWctPmtleVJlcGVhdERlbGF5ID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKGtleVJlcGVhdERlbGF5KTsKKyAgICB9CisKKyAgICBqaW50IG1heEV2ZW50c1BlclNlY29uZCA9IGVudi0+Q2FsbEludE1ldGhvZChtQ2FsbGJhY2tzT2JqLAorICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRNYXhFdmVudHNQZXJTZWNvbmQpOworICAgIGlmICghY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsICJnZXRNYXhFdmVudHNQZXJTZWNvbmQiKSkgeworICAgICAgICBvdXRDb25maWctPm1heEV2ZW50c1BlclNlY29uZCA9IG1heEV2ZW50c1BlclNlY29uZDsKICAgICB9CiB9CiAKLW5zZWNzX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRLZXlSZXBlYXREZWxheSgpIHsKLSAgICBpZiAobUtleVJlcGVhdERlbGF5IDwgMCkgewotICAgICAgICBKTklFbnYqIGVudiA9IGpuaUVudigpOwotCi0gICAgICAgIGppbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1DYWxsYmFja3NPYmosCi0gICAgICAgICAgICAgICAgZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRLZXlSZXBlYXREZWxheSk7Ci0gICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldEtleVJlcGVhdERlbGF5IikpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IDUwOwotICAgICAgICB9Ci0KLSAgICAgICAgbUtleVJlcGVhdERlbGF5ID0gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiBtS2V5UmVwZWF0RGVsYXk7Ci19Ci0KLWludDMyX3QgTmF0aXZlSW5wdXRNYW5hZ2VyOjpnZXRNYXhFdmVudHNQZXJTZWNvbmQoKSB7Ci0gICAgaWYgKG1NYXhFdmVudHNQZXJTZWNvbmQgPCAwKSB7Ci0gICAgICAgIEpOSUVudiogZW52ID0gam5pRW52KCk7Ci0KLSAgICAgICAgamludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUNhbGxiYWNrc09iaiwKLSAgICAgICAgICAgICAgICBnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldE1heEV2ZW50c1BlclNlY29uZCk7Ci0gICAgICAgIGlmIChjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgImdldE1heEV2ZW50c1BlclNlY29uZCIpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSA2MDsKLSAgICAgICAgfQotCi0gICAgICAgIG1NYXhFdmVudHNQZXJTZWNvbmQgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBtTWF4RXZlbnRzUGVyU2Vjb25kOworYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzS2V5UmVwZWF0RW5hYmxlZCgpIHsKKyAgICAvLyBPbmx5IGVuYWJsZSBhdXRvbWF0aWMga2V5IHJlcGVhdGluZyB3aGVuIHRoZSBzY3JlZW4gaXMgb24uCisgICAgcmV0dXJuIGlzU2NyZWVuT24oKTsKIH0KIAogdm9pZCBOYXRpdmVJbnB1dE1hbmFnZXI6OnNldElucHV0V2luZG93cyhKTklFbnYqIGVudiwgam9iamVjdEFycmF5IHdpbmRvd09iakFycmF5KSB7CiAgICAgVmVjdG9yPElucHV0V2luZG93PiB3aW5kb3dzOwogCisgICAgYm9vbCBuZXdQb2ludGVyR2VzdHVyZXNFbmFibGVkID0gdHJ1ZTsKICAgICBqc2l6ZSBsZW5ndGggPSBlbnYtPkdldEFycmF5TGVuZ3RoKHdpbmRvd09iakFycmF5KTsKICAgICBmb3IgKGpzaXplIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgam9iamVjdCB3aW5kb3dPYmogPSBlbnYtPkdldE9iamVjdEFycmF5RWxlbWVudCh3aW5kb3dPYmpBcnJheSwgaSk7CkBAIC02MjIsMTEgKzYxMiwyOSBAQAogICAgICAgICBhbmRyb2lkX3NlcnZlcl9JbnB1dFdpbmRvd190b05hdGl2ZShlbnYsIHdpbmRvd09iaiwgJndpbmRvdyk7CiAgICAgICAgIGlmICh3aW5kb3cuaW5wdXRDaGFubmVsID09IE5VTEwpIHsKICAgICAgICAgICAgIHdpbmRvd3MucG9wKCk7CisgICAgICAgIH0gZWxzZSBpZiAod2luZG93Lmhhc0ZvY3VzKSB7CisgICAgICAgICAgICBpZiAod2luZG93LmlucHV0RmVhdHVyZXMgJiBJbnB1dFdpbmRvdzo6SU5QVVRfRkVBVFVSRV9ESVNBQkxFX1RPVUNIX1BBRF9HRVNUVVJFUykgeworICAgICAgICAgICAgICAgIG5ld1BvaW50ZXJHZXN0dXJlc0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKHdpbmRvd09iaik7CiAgICAgfQogCiAgICAgbUlucHV0TWFuYWdlci0+Z2V0RGlzcGF0Y2hlcigpLT5zZXRJbnB1dFdpbmRvd3Mod2luZG93cyk7CisKKyAgICB1aW50MzJfdCBjaGFuZ2VzID0gMDsKKyAgICB7IC8vIGFjcXVpcmUgbG9jaworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworCisgICAgICAgIGlmIChtTG9ja2VkLnBvaW50ZXJHZXN0dXJlc0VuYWJsZWQgIT0gbmV3UG9pbnRlckdlc3R1cmVzRW5hYmxlZCkgeworICAgICAgICAgICAgbUxvY2tlZC5wb2ludGVyR2VzdHVyZXNFbmFibGVkID0gbmV3UG9pbnRlckdlc3R1cmVzRW5hYmxlZDsKKyAgICAgICAgICAgIGNoYW5nZXMgfD0gSW5wdXRSZWFkZXJDb25maWd1cmF0aW9uOjpDSEFOR0VfUE9JTlRFUl9HRVNUVVJFX0VOQUJMRU1FTlQ7CisgICAgICAgIH0KKyAgICB9IC8vIHJlbGVhc2UgbG9jaworCisgICAgaWYgKGNoYW5nZXMpIHsKKyAgICAgICAgbUlucHV0TWFuYWdlci0+Z2V0UmVhZGVyKCktPnJlcXVlc3RSZWZyZXNoQ29uZmlndXJhdGlvbihjaGFuZ2VzKTsKKyAgICB9CiB9CiAKIHZvaWQgTmF0aXZlSW5wdXRNYW5hZ2VyOjpzZXRGb2N1c2VkQXBwbGljYXRpb24oSk5JRW52KiBlbnYsIGpvYmplY3QgYXBwbGljYXRpb25PYmopIHsKQEAgLTY2NSw2ICs2NzMsMjIgQEAKICAgICAgICAgICAgIDogUG9pbnRlckNvbnRyb2xsZXI6OklOQUNUSVZJVFlfVElNRU9VVF9OT1JNQUwpOwogfQogCit2b2lkIE5hdGl2ZUlucHV0TWFuYWdlcjo6c2V0UG9pbnRlclNwZWVkKGludDMyX3Qgc3BlZWQpIHsKKyAgICB7IC8vIGFjcXVpcmUgbG9jaworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworCisgICAgICAgIGlmIChtTG9ja2VkLnBvaW50ZXJTcGVlZCA9PSBzcGVlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgTE9HSSgiU2V0dGluZyBwb2ludGVyIHNwZWVkIHRvICVkLiIsIHNwZWVkKTsKKyAgICAgICAgbUxvY2tlZC5wb2ludGVyU3BlZWQgPSBzcGVlZDsKKyAgICB9IC8vIHJlbGVhc2UgbG9jaworCisgICAgbUlucHV0TWFuYWdlci0+Z2V0UmVhZGVyKCktPnJlcXVlc3RSZWZyZXNoQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIElucHV0UmVhZGVyQ29uZmlndXJhdGlvbjo6Q0hBTkdFX1BPSU5URVJfU1BFRUQpOworfQorCiBib29sIE5hdGl2ZUlucHV0TWFuYWdlcjo6aXNTY3JlZW5PbigpIHsKICAgICByZXR1cm4gYW5kcm9pZF9zZXJ2ZXJfUG93ZXJNYW5hZ2VyU2VydmljZV9pc1NjcmVlbk9uKCk7CiB9CkBAIC0xMjU0LDYgKzEyNzgsMTUgQEAKICAgICAgICAgICAgIHRyYW5zZmVyVG91Y2hGb2N1cyhmcm9tQ2hhbm5lbCwgdG9DaGFubmVsKTsKIH0KIAorc3RhdGljIHZvaWQgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZVNldFBvaW50ZXJTcGVlZChKTklFbnYqIGVudiwKKyAgICAgICAgamNsYXNzIGNsYXp6LCBqaW50IHNwZWVkKSB7CisgICAgaWYgKGNoZWNrSW5wdXRNYW5hZ2VyVW5pdGlhbGl6ZWQoZW52KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZ05hdGl2ZUlucHV0TWFuYWdlci0+c2V0UG9pbnRlclNwZWVkKHNwZWVkKTsKK30KKwogc3RhdGljIGpzdHJpbmcgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUR1bXAoSk5JRW52KiBlbnYsIGpjbGFzcyBjbGF6eikgewogICAgIGlmIChjaGVja0lucHV0TWFuYWdlclVuaXRpYWxpemVkKGVudikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMzEwLDYgKzEzNDMsOCBAQAogICAgICAgICAgICAgKHZvaWQqKSBhbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXJfbmF0aXZlR2V0SW5wdXRDb25maWd1cmF0aW9uIH0sCiAgICAgeyAibmF0aXZlVHJhbnNmZXJUb3VjaEZvY3VzIiwgIihMYW5kcm9pZC92aWV3L0lucHV0Q2hhbm5lbDtMYW5kcm9pZC92aWV3L0lucHV0Q2hhbm5lbDspWiIsCiAgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVUcmFuc2ZlclRvdWNoRm9jdXMgfSwKKyAgICB7ICJuYXRpdmVTZXRQb2ludGVyU3BlZWQiLCAiKEkpViIsCisgICAgICAgICAgICAodm9pZCopIGFuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlcl9uYXRpdmVTZXRQb2ludGVyU3BlZWQgfSwKICAgICB7ICJuYXRpdmVEdW1wIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwKICAgICAgICAgICAgICh2b2lkKikgYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyX25hdGl2ZUR1bXAgfSwKIH07CkBAIC0xMzg4LDYgKzE0MjMsMTggQEAKICAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0S2V5UmVwZWF0RGVsYXksIGNsYXp6LAogICAgICAgICAgICAgImdldEtleVJlcGVhdERlbGF5IiwgIigpSSIpOwogCisgICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldEhvdmVyVGFwVGltZW91dCwgY2xhenosCisgICAgICAgICAgICAiZ2V0SG92ZXJUYXBUaW1lb3V0IiwgIigpSSIpOworCisgICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldEhvdmVyVGFwU2xvcCwgY2xhenosCisgICAgICAgICAgICAiZ2V0SG92ZXJUYXBTbG9wIiwgIigpSSIpOworCisgICAgR0VUX01FVEhPRF9JRChnQ2FsbGJhY2tzQ2xhc3NJbmZvLmdldERvdWJsZVRhcFRpbWVvdXQsIGNsYXp6LAorICAgICAgICAgICAgImdldERvdWJsZVRhcFRpbWVvdXQiLCAiKClJIik7CisKKyAgICBHRVRfTUVUSE9EX0lEKGdDYWxsYmFja3NDbGFzc0luZm8uZ2V0TG9uZ1ByZXNzVGltZW91dCwgY2xhenosCisgICAgICAgICAgICAiZ2V0TG9uZ1ByZXNzVGltZW91dCIsICIoKUkiKTsKKwogICAgIEdFVF9NRVRIT0RfSUQoZ0NhbGxiYWNrc0NsYXNzSW5mby5nZXRNYXhFdmVudHNQZXJTZWNvbmQsIGNsYXp6LAogICAgICAgICAgICAgImdldE1heEV2ZW50c1BlclNlY29uZCIsICIoKUkiKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dFdpbmRvdy5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0V2luZG93LmNwcAppbmRleCAwMTJjZTIxLi4wNDI2ZjYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0V2luZG93LmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0V2luZG93LmNwcApAQCAtNDgsNiArNDgsNyBAQAogICAgIGpmaWVsZElEIGxheWVyOwogICAgIGpmaWVsZElEIG93bmVyUGlkOwogICAgIGpmaWVsZElEIG93bmVyVWlkOworICAgIGpmaWVsZElEIGlucHV0RmVhdHVyZXM7CiB9IGdJbnB1dFdpbmRvd0NsYXNzSW5mbzsKIAogCkBAIC0xMzAsNiArMTMxLDggQEAKICAgICAgICAgICAgIGdJbnB1dFdpbmRvd0NsYXNzSW5mby5vd25lclBpZCk7CiAgICAgb3V0SW5wdXRXaW5kb3ctPm93bmVyVWlkID0gZW52LT5HZXRJbnRGaWVsZChpbnB1dFdpbmRvd09iaiwKICAgICAgICAgICAgIGdJbnB1dFdpbmRvd0NsYXNzSW5mby5vd25lclVpZCk7CisgICAgb3V0SW5wdXRXaW5kb3ctPmlucHV0RmVhdHVyZXMgPSBlbnYtPkdldEludEZpZWxkKGlucHV0V2luZG93T2JqLAorICAgICAgICAgICAgZ0lucHV0V2luZG93Q2xhc3NJbmZvLmlucHV0RmVhdHVyZXMpOwogfQogCiAKQEAgLTIwNiw2ICsyMDksOSBAQAogCiAgICAgR0VUX0ZJRUxEX0lEKGdJbnB1dFdpbmRvd0NsYXNzSW5mby5vd25lclVpZCwgY2xhenosCiAgICAgICAgICAgICAib3duZXJVaWQiLCAiSSIpOworCisgICAgR0VUX0ZJRUxEX0lEKGdJbnB1dFdpbmRvd0NsYXNzSW5mby5pbnB1dEZlYXR1cmVzLCBjbGF6eiwKKyAgICAgICAgICAgICJpbnB1dEZlYXR1cmVzIiwgIkkiKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1NDE3MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlci5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlVzYkRldmljZU1hbmFnZXJKTkkiCisjaW5jbHVkZSAidXRpbHMvTG9nLmgiCisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2ZfYWNjZXNzb3J5Lmg+CisKKyNkZWZpbmUgRFJJVkVSX05BTUUgIi9kZXYvdXNiX2FjY2Vzc29yeSIKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworc3RhdGljIHN0cnVjdCBwYXJjZWxfZmlsZV9kZXNjcmlwdG9yX29mZnNldHNfdAoreworICAgIGpjbGFzcyBtQ2xhc3M7CisgICAgam1ldGhvZElEIG1Db25zdHJ1Y3RvcjsKK30gZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0czsKKworc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgeworICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKKyAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKKyAgICAgICAgTE9HRV9FWChlbnYpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfYWNjZXNzb3J5X3N0cmluZyhKTklFbnYgKmVudiwgaW50IGZkLCBpbnQgY21kLCBqb2JqZWN0QXJyYXkgc3RyQXJyYXksIGludCBpbmRleCkKK3sKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworCisgICAgYnVmZmVyWzBdID0gMDsKKyAgICBpbnQgbGVuZ3RoID0gaW9jdGwoZmQsIGNtZCwgYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyWzBdKSB7CisgICAgICAgIGpzdHJpbmcgb2JqID0gZW52LT5OZXdTdHJpbmdVVEYoYnVmZmVyKTsKKyAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoc3RyQXJyYXksIGluZGV4LCBvYmopOworICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7CisgICAgfQorfQorCisKK3N0YXRpYyBqb2JqZWN0QXJyYXkgYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcl9nZXRBY2Nlc3NvcnlTdHJpbmdzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgaW50IGZkID0gb3BlbihEUklWRVJfTkFNRSwgT19SRFdSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuICVzIiwgRFJJVkVSX05BTUUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgamNsYXNzIHN0cmluZ0NsYXNzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKTsKKyAgICBqb2JqZWN0QXJyYXkgc3RyQXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KDYsIHN0cmluZ0NsYXNzLCBOVUxMKTsKKyAgICBpZiAoIXN0ckFycmF5KSBnb3RvIG91dDsKKyAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19NQU5VRkFDVFVSRVIsIHN0ckFycmF5LCAwKTsKKyAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19NT0RFTCwgc3RyQXJyYXksIDEpOworICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX0RFU0NSSVBUSU9OLCBzdHJBcnJheSwgMik7CisgICAgc2V0X2FjY2Vzc29yeV9zdHJpbmcoZW52LCBmZCwgQUNDRVNTT1JZX0dFVF9TVFJJTkdfVkVSU0lPTiwgc3RyQXJyYXksIDMpOworICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1VSSSwgc3RyQXJyYXksIDQpOworICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1NFUklBTCwgc3RyQXJyYXksIDUpOworCitvdXQ6CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiBzdHJBcnJheTsKK30KKworc3RhdGljIGpvYmplY3QgYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcl9vcGVuQWNjZXNzb3J5KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgaW50IGZkID0gb3BlbihEUklWRVJfTkFNRSwgT19SRFdSKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuICVzIiwgRFJJVkVSX05BTUUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGpuaUNyZWF0ZUZpbGVEZXNjcmlwdG9yKGVudiwgZmQpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7CisgICAgeyAibmF0aXZlR2V0QWNjZXNzb3J5U3RyaW5ncyIsICAiKClbTGphdmEvbGFuZy9TdHJpbmc7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyX2dldEFjY2Vzc29yeVN0cmluZ3MgfSwKKyAgICB7ICJuYXRpdmVPcGVuQWNjZXNzb3J5IiwgICAgICAgICIoKUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcl9vcGVuQWNjZXNzb3J5IH0sCit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiRGV2aWNlTWFuYWdlcihKTklFbnYgKmVudikKK3sKKyAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JEZXZpY2VNYW5hZ2VyIik7CisgICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZU1hbmFnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBMT0dfRkFUQUxfSUYoY2xhenogPT0gTlVMTCwgIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3IiKTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1DbGFzcyA9IChqY2xhc3MpIGVudi0+TmV3R2xvYmFsUmVmKGNsYXp6KTsKKyAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICI8aW5pdD4iLCAiKExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOylWIik7CisgICAgTE9HX0ZBVEFMX0lGKGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID09IE5VTEwsCisgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBjb25zdHJ1Y3RvciBmb3IgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworCisgICAgcmV0dXJuIGpuaVJlZ2lzdGVyTmF0aXZlTWV0aG9kcyhlbnYsICJjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYkRldmljZU1hbmFnZXIiLAorICAgICAgICAgICAgbWV0aG9kX3RhYmxlLCBORUxFTShtZXRob2RfdGFibGUpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXIuY3BwIGIvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhYmY1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJVc2JIb3N0TWFuYWdlckpOSSIKKyNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgIkpOSUhlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKKyNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKKworI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworCitzdGF0aWMgc3RydWN0IHBhcmNlbF9maWxlX2Rlc2NyaXB0b3Jfb2Zmc2V0c190Cit7CisgICAgamNsYXNzIG1DbGFzczsKKyAgICBqbWV0aG9kSUQgbUNvbnN0cnVjdG9yOworfSBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzOworCitzdGF0aWMgam1ldGhvZElEIG1ldGhvZF91c2JEZXZpY2VBZGRlZDsKK3N0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQ7CisKK3N0YXRpYyB2b2lkIGNoZWNrQW5kQ2xlYXJFeGNlcHRpb25Gcm9tQ2FsbGJhY2soSk5JRW52KiBlbnYsIGNvbnN0IGNoYXIqIG1ldGhvZE5hbWUpIHsKKyAgICBpZiAoZW52LT5FeGNlcHRpb25DaGVjaygpKSB7CisgICAgICAgIExPR0UoIkFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGJ5IGNhbGxiYWNrICclcycuIiwgbWV0aG9kTmFtZSk7CisgICAgICAgIExPR0VfRVgoZW52KTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIH0KK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX2FkZGVkKGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQqIGNsaWVudF9kYXRhKSB7CisgICAgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciogZGVzYzsKKyAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaXRlciBpdGVyOworCisgICAgc3RydWN0IHVzYl9kZXZpY2UgKmRldmljZSA9IHVzYl9kZXZpY2Vfb3BlbihkZXZuYW1lKTsKKyAgICBpZiAoIWRldmljZSkgeworICAgICAgICBMT0dFKCJ1c2JfZGV2aWNlX29wZW4gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgam9iamVjdCB0aGl6ID0gKGpvYmplY3QpY2xpZW50X2RhdGE7CisgICAgVmVjdG9yPGludD4gaW50ZXJmYWNlVmFsdWVzOworICAgIFZlY3RvcjxpbnQ+IGVuZHBvaW50VmFsdWVzOworICAgIGNvbnN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciogZGV2aWNlRGVzYyA9IHVzYl9kZXZpY2VfZ2V0X2RldmljZV9kZXNjcmlwdG9yKGRldmljZSk7CisKKyAgICB1aW50MTZfdCB2ZW5kb3JJZCA9IHVzYl9kZXZpY2VfZ2V0X3ZlbmRvcl9pZChkZXZpY2UpOworICAgIHVpbnQxNl90IHByb2R1Y3RJZCA9IHVzYl9kZXZpY2VfZ2V0X3Byb2R1Y3RfaWQoZGV2aWNlKTsKKyAgICB1aW50OF90IGRldmljZUNsYXNzID0gZGV2aWNlRGVzYy0+YkRldmljZUNsYXNzOworICAgIHVpbnQ4X3QgZGV2aWNlU3ViQ2xhc3MgPSBkZXZpY2VEZXNjLT5iRGV2aWNlU3ViQ2xhc3M7CisgICAgdWludDhfdCBwcm90b2NvbCA9IGRldmljZURlc2MtPmJEZXZpY2VQcm90b2NvbDsKKworICAgIHVzYl9kZXNjcmlwdG9yX2l0ZXJfaW5pdChkZXZpY2UsICZpdGVyKTsKKworICAgIHdoaWxlICgoZGVzYyA9IHVzYl9kZXNjcmlwdG9yX2l0ZXJfbmV4dCgmaXRlcikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICppbnRlcmZhY2UgPSAoc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIC8vIHB1c2ggY2xhc3MsIHN1YmNsYXNzLCBwcm90b2NvbCBhbmQgbnVtYmVyIG9mIGVuZHBvaW50cyBpbnRvIGludGVyZmFjZVZhbHVlcyB2ZWN0b3IKKyAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlTnVtYmVyKTsKKyAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlQ2xhc3MpOworICAgICAgICAgICAgaW50ZXJmYWNlVmFsdWVzLmFkZChpbnRlcmZhY2UtPmJJbnRlcmZhY2VTdWJDbGFzcyk7CisgICAgICAgICAgICBpbnRlcmZhY2VWYWx1ZXMuYWRkKGludGVyZmFjZS0+YkludGVyZmFjZVByb3RvY29sKTsKKyAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iTnVtRW5kcG9pbnRzKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXNjLT5iRGVzY3JpcHRvclR5cGUgPT0gVVNCX0RUX0VORFBPSU5UKSB7CisgICAgICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50ID0gKHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqKWRlc2M7CisKKyAgICAgICAgICAgIC8vIHB1c2ggYWRkcmVzcywgYXR0cmlidXRlcywgbWF4IHBhY2tldCBzaXplIGFuZCBpbnRlcnZhbCBpbnRvIGVuZHBvaW50VmFsdWVzIHZlY3RvcgorICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKTsKKyAgICAgICAgICAgIGVuZHBvaW50VmFsdWVzLmFkZChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGVuZHBvaW50VmFsdWVzLmFkZChfX2xlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSkpOworICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5iSW50ZXJ2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworCisgICAgLy8gaGFuZGxlIGdlbmVyaWMgZGV2aWNlIG5vdGlmaWNhdGlvbgorICAgIGludCBsZW5ndGggPSBpbnRlcmZhY2VWYWx1ZXMuc2l6ZSgpOworICAgIGppbnRBcnJheSBpbnRlcmZhY2VBcnJheSA9IGVudi0+TmV3SW50QXJyYXkobGVuZ3RoKTsKKyAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGludGVyZmFjZUFycmF5LCAwLCBsZW5ndGgsIGludGVyZmFjZVZhbHVlcy5hcnJheSgpKTsKKworICAgIGxlbmd0aCA9IGVuZHBvaW50VmFsdWVzLnNpemUoKTsKKyAgICBqaW50QXJyYXkgZW5kcG9pbnRBcnJheSA9IGVudi0+TmV3SW50QXJyYXkobGVuZ3RoKTsKKyAgICBlbnYtPlNldEludEFycmF5UmVnaW9uKGVuZHBvaW50QXJyYXksIDAsIGxlbmd0aCwgZW5kcG9pbnRWYWx1ZXMuYXJyYXkoKSk7CisKKyAgICBqc3RyaW5nIGRldmljZU5hbWUgPSBlbnYtPk5ld1N0cmluZ1VURihkZXZuYW1lKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKHRoaXosIG1ldGhvZF91c2JEZXZpY2VBZGRlZCwKKyAgICAgICAgICAgIGRldmljZU5hbWUsIHZlbmRvcklkLCBwcm9kdWN0SWQsIGRldmljZUNsYXNzLAorICAgICAgICAgICAgZGV2aWNlU3ViQ2xhc3MsIHByb3RvY29sLCBpbnRlcmZhY2VBcnJheSwgZW5kcG9pbnRBcnJheSk7CisKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGludGVyZmFjZUFycmF5KTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGVuZHBvaW50QXJyYXkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGV2aWNlTmFtZSk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JfZGV2aWNlX3JlbW92ZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKKyAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKKworICAgIGpzdHJpbmcgZGV2aWNlTmFtZSA9IGVudi0+TmV3U3RyaW5nVVRGKGRldm5hbWUpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkRldmljZVJlbW92ZWQsIGRldmljZU5hbWUpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGV2aWNlTmFtZSk7CisgICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyX21vbml0b3JVc2JIb3N0QnVzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCit7CisgICAgc3RydWN0IHVzYl9ob3N0X2NvbnRleHQqIGNvbnRleHQgPSB1c2JfaG9zdF9pbml0KCk7CisgICAgaWYgKCFjb250ZXh0KSB7CisgICAgICAgIExPR0UoInVzYl9ob3N0X2luaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdGhpcyB3aWxsIG5ldmVyIHJldHVybiBzbyBpdCBpcyBzYWZlIHRvIHBhc3MgdGhpeiBkaXJlY3RseQorICAgIHVzYl9ob3N0X3J1bihjb250ZXh0LCB1c2JfZGV2aWNlX2FkZGVkLCB1c2JfZGV2aWNlX3JlbW92ZWQsIE5VTEwsICh2b2lkICopdGhpeik7Cit9CisKK3N0YXRpYyBqb2JqZWN0IGFuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyX29wZW5EZXZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBkZXZpY2VOYW1lKQoreworICAgIGNvbnN0IGNoYXIgKmRldmljZU5hbWVTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGRldmljZU5hbWUsIE5VTEwpOworICAgIHN0cnVjdCB1c2JfZGV2aWNlKiBkZXZpY2UgPSB1c2JfZGV2aWNlX29wZW4oZGV2aWNlTmFtZVN0cik7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZGV2aWNlTmFtZSwgZGV2aWNlTmFtZVN0cik7CisKKyAgICBpZiAoIWRldmljZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpbnQgZmQgPSB1c2JfZGV2aWNlX2dldF9mZChkZXZpY2UpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGludCBuZXdGRCA9IGR1cChmZCk7CisgICAgdXNiX2RldmljZV9jbG9zZShkZXZpY2UpOworCisgICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGpuaUNyZWF0ZUZpbGVEZXNjcmlwdG9yKGVudiwgbmV3RkQpOworICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCisgICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7Cit9CisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7CisgICAgeyAibW9uaXRvclVzYkhvc3RCdXMiLCAiKClWIiwgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYkhvc3RNYW5hZ2VyX21vbml0b3JVc2JIb3N0QnVzIH0sCisgICAgeyAibmF0aXZlT3BlbkRldmljZSIsICAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvcjsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilhbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlcl9vcGVuRGV2aWNlIH0sCit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiSG9zdE1hbmFnZXIoSk5JRW52ICplbnYpCit7CisgICAgamNsYXNzIGNsYXp6ID0gZW52LT5GaW5kQ2xhc3MoImNvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiSG9zdE1hbmFnZXIiKTsKKyAgICBpZiAoY2xhenogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIGNvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiSG9zdE1hbmFnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiRGV2aWNlQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiRGV2aWNlQWRkZWQiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSUlJW0lbSSlWIik7CisgICAgaWYgKG1ldGhvZF91c2JEZXZpY2VBZGRlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiRGV2aWNlQWRkZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZXRob2RfdXNiRGV2aWNlUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JEZXZpY2VSZW1vdmVkIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOworICAgIGlmIChtZXRob2RfdXNiRGV2aWNlUmVtb3ZlZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiRGV2aWNlUmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOworICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiKTsKKyAgICBMT0dfRkFUQUxfSUYoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIGZvciBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7CisKKyAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiSG9zdE1hbmFnZXIiLAorICAgICAgICAgICAgbWV0aG9kX3RhYmxlLCBORUxFTShtZXRob2RfdGFibGUpKTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2QwNGY2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiVXNiU2VydmljZSIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlICJhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaCIKLSNpbmNsdWRlICJ1dGlscy9WZWN0b3IuaCIKLQotI2luY2x1ZGUgPHVzYmhvc3QvdXNiaG9zdC5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9mX2FjY2Vzc29yeS5oPgotCi0jZGVmaW5lIERSSVZFUl9OQU1FICIvZGV2L3VzYl9hY2Nlc3NvcnkiCi0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFyY2VsX2ZpbGVfZGVzY3JpcHRvcl9vZmZzZXRzX3QKLXsKLSAgICBqY2xhc3MgbUNsYXNzOwotICAgIGptZXRob2RJRCBtQ29uc3RydWN0b3I7Ci19IGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHM7Ci0KLXN0YXRpYyBqbWV0aG9kSUQgbWV0aG9kX3VzYkRldmljZUFkZGVkOwotc3RhdGljIGptZXRob2RJRCBtZXRob2RfdXNiRGV2aWNlUmVtb3ZlZDsKLQotc3RhdGljIHZvaWQgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhKTklFbnYqIGVudiwgY29uc3QgY2hhciogbWV0aG9kTmFtZSkgewotICAgIGlmIChlbnYtPkV4Y2VwdGlvbkNoZWNrKCkpIHsKLSAgICAgICAgTE9HRSgiQW4gZXhjZXB0aW9uIHdhcyB0aHJvd24gYnkgY2FsbGJhY2sgJyVzJy4iLCBtZXRob2ROYW1lKTsKLSAgICAgICAgTE9HRV9FWChlbnYpOwotICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHVzYl9kZXZpY2VfYWRkZWQoY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCogY2xpZW50X2RhdGEpIHsKLSAgICBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyKiBkZXNjOwotICAgIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9pdGVyIGl0ZXI7Ci0KLSAgICBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldm5hbWUpOwotICAgIGlmICghZGV2aWNlKSB7Ci0gICAgICAgIExPR0UoInVzYl9kZXZpY2Vfb3BlbiBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBKTklFbnYqIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqb2JqZWN0IHRoaXogPSAoam9iamVjdCljbGllbnRfZGF0YTsKLSAgICBWZWN0b3I8aW50PiBpbnRlcmZhY2VWYWx1ZXM7Ci0gICAgVmVjdG9yPGludD4gZW5kcG9pbnRWYWx1ZXM7Ci0gICAgY29uc3QgdXNiX2RldmljZV9kZXNjcmlwdG9yKiBkZXZpY2VEZXNjID0gdXNiX2RldmljZV9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IoZGV2aWNlKTsKLQotICAgIHVpbnQxNl90IHZlbmRvcklkID0gdXNiX2RldmljZV9nZXRfdmVuZG9yX2lkKGRldmljZSk7Ci0gICAgdWludDE2X3QgcHJvZHVjdElkID0gdXNiX2RldmljZV9nZXRfcHJvZHVjdF9pZChkZXZpY2UpOwotICAgIHVpbnQ4X3QgZGV2aWNlQ2xhc3MgPSBkZXZpY2VEZXNjLT5iRGV2aWNlQ2xhc3M7Ci0gICAgdWludDhfdCBkZXZpY2VTdWJDbGFzcyA9IGRldmljZURlc2MtPmJEZXZpY2VTdWJDbGFzczsKLSAgICB1aW50OF90IHByb3RvY29sID0gZGV2aWNlRGVzYy0+YkRldmljZVByb3RvY29sOwotCi0gICAgdXNiX2Rlc2NyaXB0b3JfaXRlcl9pbml0KGRldmljZSwgJml0ZXIpOwotCi0gICAgd2hpbGUgKChkZXNjID0gdXNiX2Rlc2NyaXB0b3JfaXRlcl9uZXh0KCZpdGVyKSkgIT0gTlVMTCkgewotICAgICAgICBpZiAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlID09IFVTQl9EVF9JTlRFUkZBQ0UpIHsKLSAgICAgICAgICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKmludGVyZmFjZSA9IChzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yICopZGVzYzsKLQotICAgICAgICAgICAgLy8gcHVzaCBjbGFzcywgc3ViY2xhc3MsIHByb3RvY29sIGFuZCBudW1iZXIgb2YgZW5kcG9pbnRzIGludG8gaW50ZXJmYWNlVmFsdWVzIHZlY3RvcgotICAgICAgICAgICAgaW50ZXJmYWNlVmFsdWVzLmFkZChpbnRlcmZhY2UtPmJJbnRlcmZhY2VOdW1iZXIpOwotICAgICAgICAgICAgaW50ZXJmYWNlVmFsdWVzLmFkZChpbnRlcmZhY2UtPmJJbnRlcmZhY2VDbGFzcyk7Ci0gICAgICAgICAgICBpbnRlcmZhY2VWYWx1ZXMuYWRkKGludGVyZmFjZS0+YkludGVyZmFjZVN1YkNsYXNzKTsKLSAgICAgICAgICAgIGludGVyZmFjZVZhbHVlcy5hZGQoaW50ZXJmYWNlLT5iSW50ZXJmYWNlUHJvdG9jb2wpOwotICAgICAgICAgICAgaW50ZXJmYWNlVmFsdWVzLmFkZChpbnRlcmZhY2UtPmJOdW1FbmRwb2ludHMpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9PSBVU0JfRFRfRU5EUE9JTlQpIHsKLSAgICAgICAgICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQgPSAoc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICopZGVzYzsKLQotICAgICAgICAgICAgLy8gcHVzaCBhZGRyZXNzLCBhdHRyaWJ1dGVzLCBtYXggcGFja2V0IHNpemUgYW5kIGludGVydmFsIGludG8gZW5kcG9pbnRWYWx1ZXMgdmVjdG9yCi0gICAgICAgICAgICBlbmRwb2ludFZhbHVlcy5hZGQoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwotICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgZW5kcG9pbnRWYWx1ZXMuYWRkKF9fbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSk7Ci0gICAgICAgICAgICBlbmRwb2ludFZhbHVlcy5hZGQoZW5kcG9pbnQtPmJJbnRlcnZhbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB1c2JfZGV2aWNlX2Nsb3NlKGRldmljZSk7Ci0KLSAgICAvLyBoYW5kbGUgZ2VuZXJpYyBkZXZpY2Ugbm90aWZpY2F0aW9uCi0gICAgaW50IGxlbmd0aCA9IGludGVyZmFjZVZhbHVlcy5zaXplKCk7Ci0gICAgamludEFycmF5IGludGVyZmFjZUFycmF5ID0gZW52LT5OZXdJbnRBcnJheShsZW5ndGgpOwotICAgIGVudi0+U2V0SW50QXJyYXlSZWdpb24oaW50ZXJmYWNlQXJyYXksIDAsIGxlbmd0aCwgaW50ZXJmYWNlVmFsdWVzLmFycmF5KCkpOwotCi0gICAgbGVuZ3RoID0gZW5kcG9pbnRWYWx1ZXMuc2l6ZSgpOwotICAgIGppbnRBcnJheSBlbmRwb2ludEFycmF5ID0gZW52LT5OZXdJbnRBcnJheShsZW5ndGgpOwotICAgIGVudi0+U2V0SW50QXJyYXlSZWdpb24oZW5kcG9pbnRBcnJheSwgMCwgbGVuZ3RoLCBlbmRwb2ludFZhbHVlcy5hcnJheSgpKTsKLQotICAgIGpzdHJpbmcgZGV2aWNlTmFtZSA9IGVudi0+TmV3U3RyaW5nVVRGKGRldm5hbWUpOwotICAgIGVudi0+Q2FsbFZvaWRNZXRob2QodGhpeiwgbWV0aG9kX3VzYkRldmljZUFkZGVkLAotICAgICAgICAgICAgZGV2aWNlTmFtZSwgdmVuZG9ySWQsIHByb2R1Y3RJZCwgZGV2aWNlQ2xhc3MsCi0gICAgICAgICAgICBkZXZpY2VTdWJDbGFzcywgcHJvdG9jb2wsIGludGVyZmFjZUFycmF5LCBlbmRwb2ludEFycmF5KTsKLQotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoaW50ZXJmYWNlQXJyYXkpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZW5kcG9pbnRBcnJheSk7Ci0gICAgZW52LT5EZWxldGVMb2NhbFJlZihkZXZpY2VOYW1lKTsKLSAgICBjaGVja0FuZENsZWFyRXhjZXB0aW9uRnJvbUNhbGxiYWNrKGVudiwgX19GVU5DVElPTl9fKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVzYl9kZXZpY2VfcmVtb3ZlZChjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkKiBjbGllbnRfZGF0YSkgewotICAgIEpOSUVudiogZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpvYmplY3QgdGhpeiA9IChqb2JqZWN0KWNsaWVudF9kYXRhOwotCi0gICAganN0cmluZyBkZXZpY2VOYW1lID0gZW52LT5OZXdTdHJpbmdVVEYoZGV2bmFtZSk7Ci0gICAgZW52LT5DYWxsVm9pZE1ldGhvZCh0aGl6LCBtZXRob2RfdXNiRGV2aWNlUmVtb3ZlZCwgZW52LT5OZXdTdHJpbmdVVEYoZGV2bmFtZSkpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoZGV2aWNlTmFtZSk7Ci0gICAgY2hlY2tBbmRDbGVhckV4Y2VwdGlvbkZyb21DYWxsYmFjayhlbnYsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2VfbW9uaXRvclVzYkhvc3RCdXMoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeikKLXsKLSAgICBzdHJ1Y3QgdXNiX2hvc3RfY29udGV4dCogY29udGV4dCA9IHVzYl9ob3N0X2luaXQoKTsKLSAgICBpZiAoIWNvbnRleHQpIHsKLSAgICAgICAgTE9HRSgidXNiX2hvc3RfaW5pdCBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyB0aGlzIHdpbGwgbmV2ZXIgcmV0dXJuIHNvIGl0IGlzIHNhZmUgdG8gcGFzcyB0aGl6IGRpcmVjdGx5Ci0gICAgdXNiX2hvc3RfcnVuKGNvbnRleHQsIHVzYl9kZXZpY2VfYWRkZWQsIHVzYl9kZXZpY2VfcmVtb3ZlZCwgTlVMTCwgKHZvaWQgKil0aGl6KTsKLX0KLQotc3RhdGljIGpvYmplY3QgYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZV9vcGVuRGV2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgZGV2aWNlTmFtZSkKLXsKLSAgICBjb25zdCBjaGFyICpkZXZpY2VOYW1lU3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhkZXZpY2VOYW1lLCBOVUxMKTsKLSAgICBzdHJ1Y3QgdXNiX2RldmljZSogZGV2aWNlID0gdXNiX2RldmljZV9vcGVuKGRldmljZU5hbWVTdHIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGRldmljZU5hbWUsIGRldmljZU5hbWVTdHIpOwotCi0gICAgaWYgKCFkZXZpY2UpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaW50IGZkID0gdXNiX2RldmljZV9nZXRfZmQoZGV2aWNlKTsKLSAgICBpZiAoZmQgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpbnQgbmV3RkQgPSBkdXAoZmQpOwotICAgIHVzYl9kZXZpY2VfY2xvc2UoZGV2aWNlKTsKLQotICAgIGpvYmplY3QgZmlsZURlc2NyaXB0b3IgPSBqbmlDcmVhdGVGaWxlRGVzY3JpcHRvcihlbnYsIG5ld0ZEKTsKLSAgICBpZiAoZmlsZURlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGVudi0+TmV3T2JqZWN0KGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzLAotICAgICAgICBnUGFyY2VsRmlsZURlc2NyaXB0b3JPZmZzZXRzLm1Db25zdHJ1Y3RvciwgZmlsZURlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfYWNjZXNzb3J5X3N0cmluZyhKTklFbnYgKmVudiwgaW50IGZkLCBpbnQgY21kLCBqb2JqZWN0QXJyYXkgc3RyQXJyYXksIGludCBpbmRleCkKLXsKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotCi0gICAgYnVmZmVyWzBdID0gMDsKLSAgICBpbnQgbGVuZ3RoID0gaW9jdGwoZmQsIGNtZCwgYnVmZmVyKTsKLSAgICBpZiAoYnVmZmVyWzBdKSB7Ci0gICAgICAgIGpzdHJpbmcgb2JqID0gZW52LT5OZXdTdHJpbmdVVEYoYnVmZmVyKTsKLSAgICAgICAgZW52LT5TZXRPYmplY3RBcnJheUVsZW1lbnQoc3RyQXJyYXksIGluZGV4LCBvYmopOwotICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKG9iaik7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBqb2JqZWN0QXJyYXkgYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZV9nZXRBY2Nlc3NvcnlTdHJpbmdzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCi17Ci0gICAgaW50IGZkID0gb3BlbihEUklWRVJfTkFNRSwgT19SRFdSKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuICVzIiwgRFJJVkVSX05BTUUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgamNsYXNzIHN0cmluZ0NsYXNzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKTsKLSAgICBqb2JqZWN0QXJyYXkgc3RyQXJyYXkgPSBlbnYtPk5ld09iamVjdEFycmF5KDYsIHN0cmluZ0NsYXNzLCBOVUxMKTsKLSAgICBpZiAoIXN0ckFycmF5KSBnb3RvIG91dDsKLSAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19NQU5VRkFDVFVSRVIsIHN0ckFycmF5LCAwKTsKLSAgICBzZXRfYWNjZXNzb3J5X3N0cmluZyhlbnYsIGZkLCBBQ0NFU1NPUllfR0VUX1NUUklOR19NT0RFTCwgc3RyQXJyYXksIDEpOwotICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX0RFU0NSSVBUSU9OLCBzdHJBcnJheSwgMik7Ci0gICAgc2V0X2FjY2Vzc29yeV9zdHJpbmcoZW52LCBmZCwgQUNDRVNTT1JZX0dFVF9TVFJJTkdfVkVSU0lPTiwgc3RyQXJyYXksIDMpOwotICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1VSSSwgc3RyQXJyYXksIDQpOwotICAgIHNldF9hY2Nlc3Nvcnlfc3RyaW5nKGVudiwgZmQsIEFDQ0VTU09SWV9HRVRfU1RSSU5HX1NFUklBTCwgc3RyQXJyYXksIDUpOwotCi1vdXQ6Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiBzdHJBcnJheTsKLX0KLQotc3RhdGljIGpvYmplY3QgYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZV9vcGVuQWNjZXNzb3J5KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopCi17Ci0gICAgaW50IGZkID0gb3BlbihEUklWRVJfTkFNRSwgT19SRFdSKTsKLSAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgIExPR0UoImNvdWxkIG5vdCBvcGVuICVzIiwgRFJJVkVSX05BTUUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgam9iamVjdCBmaWxlRGVzY3JpcHRvciA9IGpuaUNyZWF0ZUZpbGVEZXNjcmlwdG9yKGVudiwgZmQpOwotICAgIGlmIChmaWxlRGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gZW52LT5OZXdPYmplY3QoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ2xhc3MsCi0gICAgICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yLCBmaWxlRGVzY3JpcHRvcik7Ci19Ci0KLXN0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kX3RhYmxlW10gPSB7Ci0gICAgeyAibW9uaXRvclVzYkhvc3RCdXMiLCAiKClWIiwgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2VfbW9uaXRvclVzYkhvc3RCdXMgfSwKLSAgICB7ICJuYXRpdmVPcGVuRGV2aWNlIiwgICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL1BhcmNlbEZpbGVEZXNjcmlwdG9yOyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKWFuZHJvaWRfc2VydmVyX1VzYlNlcnZpY2Vfb3BlbkRldmljZSB9LAotICAgIHsgIm5hdGl2ZUdldEFjY2Vzc29yeVN0cmluZ3MiLCAiKClbTGphdmEvbGFuZy9TdHJpbmc7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZV9nZXRBY2Nlc3NvcnlTdHJpbmdzIH0sCi0gICAgeyAibmF0aXZlT3BlbkFjY2Vzc29yeSIsIigpTGFuZHJvaWQvb3MvUGFyY2VsRmlsZURlc2NyaXB0b3I7IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZV9vcGVuQWNjZXNzb3J5IH0sCi19OwotCi1pbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZShKTklFbnYgKmVudikKLXsKLSAgICBqY2xhc3MgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiY29tL2FuZHJvaWQvc2VydmVyL3VzYi9Vc2JTZXJ2aWNlIik7Ci0gICAgaWYgKGNsYXp6ID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgiQ2FuJ3QgZmluZCBjb20vYW5kcm9pZC9zZXJ2ZXIvdXNiL1VzYlNlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtZXRob2RfdXNiRGV2aWNlQWRkZWQgPSBlbnYtPkdldE1ldGhvZElEKGNsYXp6LCAidXNiRGV2aWNlQWRkZWQiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0lJSUlJW0lbSSlWIik7Ci0gICAgaWYgKG1ldGhvZF91c2JEZXZpY2VBZGRlZCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiRGV2aWNlQWRkZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtZXRob2RfdXNiRGV2aWNlUmVtb3ZlZCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenosICJ1c2JEZXZpY2VSZW1vdmVkIiwgIihMamF2YS9sYW5nL1N0cmluZzspViIpOwotICAgIGlmIChtZXRob2RfdXNiRGV2aWNlUmVtb3ZlZCA9PSBOVUxMKSB7Ci0gICAgICAgIExPR0UoIkNhbid0IGZpbmQgdXNiRGV2aWNlUmVtb3ZlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgY2xhenogPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9QYXJjZWxGaWxlRGVzY3JpcHRvciIpOwotICAgIExPR19GQVRBTF9JRihjbGF6eiA9PSBOVUxMLCAiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvciIpOwotICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNsYXNzID0gKGpjbGFzcykgZW52LT5OZXdHbG9iYWxSZWYoY2xhenopOwotICAgIGdQYXJjZWxGaWxlRGVzY3JpcHRvck9mZnNldHMubUNvbnN0cnVjdG9yID0gZW52LT5HZXRNZXRob2RJRChjbGF6eiwgIjxpbml0PiIsICIoTGphdmEvaW8vRmlsZURlc2NyaXB0b3I7KVYiKTsKLSAgICBMT0dfRkFUQUxfSUYoZ1BhcmNlbEZpbGVEZXNjcmlwdG9yT2Zmc2V0cy5tQ29uc3RydWN0b3IgPT0gTlVMTCwKLSAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIGZvciBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yIik7Ci0KLSAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci91c2IvVXNiU2VydmljZSIsCi0gICAgICAgICAgICBtZXRob2RfdGFibGUsIE5FTEVNKG1ldGhvZF90YWJsZSkpOwotfQotCi19OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9jb25uZWN0aXZpdHlfVnBuLmNwcCBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfY29ubmVjdGl2aXR5X1Zwbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ZmJmZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfY29ubmVjdGl2aXR5X1Zwbi5jcHAKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorCisjZGVmaW5lIExPR19UQUcgIlZwbkpuaSIKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2X3JvdXRlLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJKTklIZWxwLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkCit7CisKK3N0YXRpYyBpbmxpbmUgaW5fYWRkcl90ICphc19pbl9hZGRyKHNvY2thZGRyICpzYSkgeworICAgIHJldHVybiAmKChzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIuc19hZGRyOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFNZU1RFTV9FUlJPUiAtMQorI2RlZmluZSBCQURfQVJHVU1FTlQgLTIKKworc3RhdGljIGludCBjcmVhdGVfaW50ZXJmYWNlKGludCBtdHUsIGNoYXIgKm5hbWUsIGludCAqaW5kZXgpCit7CisgICAgaW50IHR1biA9IG9wZW4oIi9kZXYvdHVuIiwgT19SRFdSKTsKKyAgICBpbnQgaW5ldDQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgaW50IGZsYWdzOworCisgICAgaWZyZXEgaWZyNDsKKyAgICBtZW1zZXQoJmlmcjQsIDAsIHNpemVvZihpZnI0KSk7CisKKyAgICAvLyBBbGxvY2F0ZSBpbnRlcmZhY2UuCisgICAgaWZyNC5pZnJfZmxhZ3MgPSBJRkZfVFVOIHwgSUZGX05PX1BJOworICAgIGlmIChpb2N0bCh0dW4sIFRVTlNFVElGRiwgJmlmcjQpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBhbGxvY2F0ZSBUVU46ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBBY3RpdmF0ZSBpbnRlcmZhY2UuCisgICAgaWZyNC5pZnJfZmxhZ3MgPSBJRkZfVVA7CisgICAgaWYgKGlvY3RsKGluZXQ0LCBTSU9DU0lGRkxBR1MsICZpZnI0KSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgYWN0aXZhdGUgJXM6ICVzIiwgaWZyNC5pZnJfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBTZXQgTVRVIGlmIGl0IGlzIHNwZWNpZmllZC4KKyAgICBpZnI0Lmlmcl9tdHUgPSBtdHU7CisgICAgaWYgKG10dSA+IDAgJiYgaW9jdGwoaW5ldDQsIFNJT0NTSUZNVFUsICZpZnI0KSkgeworICAgICAgICBMT0dFKCJDYW5ub3Qgc2V0IE1UVSBvbiAlczogJXMiLCBpZnI0Lmlmcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIEdldCBpbnRlcmZhY2UgaW5kZXguCisgICAgaWYgKGlvY3RsKGluZXQ0LCBTSU9HSUZJTkRFWCwgJmlmcjQpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBnZXQgaW5kZXggb2YgJXM6ICVzIiwgaWZyNC5pZnJfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBNYWtlIGl0IG5vbi1ibG9ja2luZy4KKyAgICBmbGFncyA9IGZjbnRsKHR1biwgRl9HRVRGTCwgMCk7CisgICAgaWYgKGZsYWdzID09IC0xIHx8IGZjbnRsKHR1biwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSkgeworICAgICAgICBMT0dFKCJDYW5ub3Qgc2V0IG5vbi1ibG9ja2luZyBvbiAlczogJXMiLCBpZnI0Lmlmcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHN0cmNweShuYW1lLCBpZnI0Lmlmcl9uYW1lKTsKKyAgICAqaW5kZXggPSBpZnI0Lmlmcl9pZmluZGV4OworICAgIGNsb3NlKGluZXQ0KTsKKyAgICByZXR1cm4gdHVuOworCitlcnJvcjoKKyAgICBjbG9zZSh0dW4pOworICAgIGNsb3NlKGluZXQ0KTsKKyAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworfQorCitzdGF0aWMgaW50IHNldF9hZGRyZXNzZXMoY29uc3QgY2hhciAqbmFtZSwgaW50IGluZGV4LCBjb25zdCBjaGFyICphZGRyZXNzZXMpCit7CisgICAgaW50IGluZXQ0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIGludCBpbmV0NiA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7CisKKyAgICBpZnJlcSBpZnI0OworICAgIG1lbXNldCgmaWZyNCwgMCwgc2l6ZW9mKGlmcjQpKTsKKyAgICBzdHJjcHkoaWZyNC5pZnJfbmFtZSwgbmFtZSk7CisgICAgaWZyNC5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworCisgICAgaW42X2lmcmVxIGlmcjY7CisgICAgbWVtc2V0KCZpZnI2LCAwLCBzaXplb2YoaWZyNikpOworICAgIGlmcjYuaWZyNl9pZmluZGV4ID0gaW5kZXg7CisKKyAgICBjaGFyIGFkZHJlc3NbNjVdOworICAgIGludCBwcmVmaXg7CisKKyAgICBpbnQgY2hhcnM7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIHdoaWxlIChzc2NhbmYoYWRkcmVzc2VzLCAiICU2NFteL10vJWQgJW4iLCBhZGRyZXNzLCAmcHJlZml4LCAmY2hhcnMpID09IDIpIHsKKyAgICAgICAgYWRkcmVzc2VzICs9IGNoYXJzOworCisgICAgICAgIGlmIChzdHJjaHIoYWRkcmVzcywgJzonKSkgeworICAgICAgICAgICAgLy8gQWRkIGFuIElQdjYgYWRkcmVzcy4KKyAgICAgICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGFkZHJlc3MsICZpZnI2LmlmcjZfYWRkcikgIT0gMSB8fAorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPCAwIHx8IHByZWZpeCA+IDEyOCkgeworICAgICAgICAgICAgICAgIGNvdW50ID0gQkFEX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZnI2LmlmcjZfcHJlZml4bGVuID0gcHJlZml4OworICAgICAgICAgICAgaWYgKGlvY3RsKGluZXQ2LCBTSU9DU0lGQUREUiwgJmlmcjYpKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSAoZXJybm8gPT0gRUlOVkFMKSA/IEJBRF9BUkdVTUVOVCA6IFNZU1RFTV9FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEFkZCBhbiBJUHY0IGFkZHJlc3MuCisgICAgICAgICAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQsIGFkZHJlc3MsIGFzX2luX2FkZHIoJmlmcjQuaWZyX2FkZHIpKSAhPSAxIHx8CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA8IDAgfHwgcHJlZml4ID4gMzIpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IEJBRF9BUkdVTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihpZnI0Lmlmcl9uYW1lLCAiJXM6JWQiLCBuYW1lLCBjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW9jdGwoaW5ldDQsIFNJT0NTSUZBRERSLCAmaWZyNCkpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IChlcnJubyA9PSBFSU5WQUwpID8gQkFEX0FSR1VNRU5UIDogU1lTVEVNX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbl9hZGRyX3QgbWFzayA9IHByZWZpeCA/ICh+MCA8PCAoMzIgLSBwcmVmaXgpKSA6IDA7CisgICAgICAgICAgICAqYXNfaW5fYWRkcigmaWZyNC5pZnJfYWRkcikgPSBodG9ubChtYXNrKTsKKyAgICAgICAgICAgIGlmIChpb2N0bChpbmV0NCwgU0lPQ1NJRk5FVE1BU0ssICZpZnI0KSkgeworICAgICAgICAgICAgICAgIGNvdW50ID0gKGVycm5vID09IEVJTlZBTCkgPyBCQURfQVJHVU1FTlQgOiBTWVNURU1fRVJST1I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiQWRkcmVzcyBhZGRlZCBvbiAlczogJXMvJWQiLCBuYW1lLCBhZGRyZXNzLCBwcmVmaXgpOworICAgICAgICArK2NvdW50OworICAgIH0KKworICAgIGlmIChjb3VudCA9PSBCQURfQVJHVU1FTlQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBhZGRyZXNzOiAlcy8lZCIsIGFkZHJlc3MsIHByZWZpeCk7CisgICAgfSBlbHNlIGlmIChjb3VudCA9PSBTWVNURU1fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGFkZCBhZGRyZXNzOiAlcy8lZDogJXMiLCBhZGRyZXNzLCBwcmVmaXgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIGlmICgqYWRkcmVzc2VzKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYWRkcmVzczogJXMiLCBhZGRyZXNzZXMpOworICAgICAgICBjb3VudCA9IEJBRF9BUkdVTUVOVDsKKyAgICB9CisKKyAgICBjbG9zZShpbmV0NCk7CisgICAgY2xvc2UoaW5ldDYpOworICAgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBzZXRfcm91dGVzKGNvbnN0IGNoYXIgKm5hbWUsIGludCBpbmRleCwgY29uc3QgY2hhciAqcm91dGVzKQoreworICAgIGludCBpbmV0NCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpbnQgaW5ldDYgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworCisgICAgcnRlbnRyeSBydDQ7CisgICAgbWVtc2V0KCZydDQsIDAsIHNpemVvZihydDQpKTsKKyAgICBydDQucnRfZGV2ID0gKGNoYXIgKiluYW1lOworICAgIHJ0NC5ydF9mbGFncyA9IFJURl9VUDsKKyAgICBydDQucnRfZHN0LnNhX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgcnQ0LnJ0X2dlbm1hc2suc2FfZmFtaWx5ID0gQUZfSU5FVDsKKworICAgIGluNl9ydG1zZyBydDY7CisgICAgbWVtc2V0KCZydDYsIDAsIHNpemVvZihydDYpKTsKKyAgICBydDYucnRtc2dfaWZpbmRleCA9IGluZGV4OworICAgIHJ0Ni5ydG1zZ19mbGFncyA9IFJURl9VUDsKKworICAgIGNoYXIgYWRkcmVzc1s2NV07CisgICAgaW50IHByZWZpeDsKKworICAgIGludCBjaGFyczsKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgd2hpbGUgKHNzY2FuZihyb3V0ZXMsICIgJTY0W14vXS8lZCAlbiIsIGFkZHJlc3MsICZwcmVmaXgsICZjaGFycykgPT0gMikgeworICAgICAgICByb3V0ZXMgKz0gY2hhcnM7CisKKyAgICAgICAgaWYgKHN0cmNocihhZGRyZXNzLCAnOicpKSB7CisgICAgICAgICAgICAvLyBBZGQgYW4gSVB2NiByb3V0ZS4KKyAgICAgICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGFkZHJlc3MsICZydDYucnRtc2dfZHN0KSAhPSAxIHx8CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA8IDEgfHwgcHJlZml4ID4gMTI4KSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBCQURfQVJHVU1FTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ0Ni5ydG1zZ19kc3RfbGVuID0gcHJlZml4OworICAgICAgICAgICAgaWYgKGlvY3RsKGluZXQ2LCBTSU9DQUREUlQsICZydDYpICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICAgICAgICAgIGNvdW50ID0gKGVycm5vID09IEVJTlZBTCkgPyBCQURfQVJHVU1FTlQgOiBTWVNURU1fRVJST1I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBZGQgYW4gSVB2NCByb3V0ZS4KKyAgICAgICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVCwgYWRkcmVzcywgYXNfaW5fYWRkcigmcnQ0LnJ0X2RzdCkpICE9IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4IDwgMSB8fCBwcmVmaXggPiAzMikgeworICAgICAgICAgICAgICAgIGNvdW50ID0gQkFEX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbl9hZGRyX3QgbWFzayA9IHByZWZpeCA/ICh+MCA8PCAoMzIgLSBwcmVmaXgpKSA6IDA7CisgICAgICAgICAgICAqYXNfaW5fYWRkcigmcnQ0LnJ0X2dlbm1hc2spID0gaHRvbmwobWFzayk7CisgICAgICAgICAgICBpZiAoaW9jdGwoaW5ldDQsIFNJT0NBRERSVCwgJnJ0NCkgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSAoZXJybm8gPT0gRUlOVkFMKSA/IEJBRF9BUkdVTUVOVCA6IFNZU1RFTV9FUlJPUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMT0dWKCJSb3V0ZSBhZGRlZCBvbiAlczogJXMvJWQiLCBuYW1lLCBhZGRyZXNzLCBwcmVmaXgpOworICAgICAgICArK2NvdW50OworICAgIH0KKworICAgIGlmIChjb3VudCA9PSBCQURfQVJHVU1FTlQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCByb3V0ZTogJXMvJWQiLCBhZGRyZXNzLCBwcmVmaXgpOworICAgIH0gZWxzZSBpZiAoY291bnQgPT0gU1lTVEVNX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBhZGQgcm91dGU6ICVzLyVkOiAlcyIsCisgICAgICAgICAgICAgICAgYWRkcmVzcywgcHJlZml4LCBzdHJlcnJvcihlcnJubykpOworICAgIH0gZWxzZSBpZiAoKnJvdXRlcykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHJvdXRlOiAlcyIsIHJvdXRlcyk7CisgICAgICAgIGNvdW50ID0gQkFEX0FSR1VNRU5UOworICAgIH0KKworICAgIGNsb3NlKGluZXQ0KTsKKyAgICBjbG9zZShpbmV0Nik7CisgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGdldF9pbnRlcmZhY2VfbmFtZShjaGFyICpuYW1lLCBpbnQgdHVuKQoreworICAgIGlmcmVxIGlmcjQ7CisgICAgaWYgKGlvY3RsKHR1biwgVFVOR0VUSUZGLCAmaWZyNCkpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGdldCBpbnRlcmZhY2UgbmFtZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgIH0KKyAgICBzdHJjcHkobmFtZSwgaWZyNC5pZnJfbmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzZXRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGluZXQ0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisgICAgaWZyZXEgaWZyNDsKKyAgICBpZnI0Lmlmcl9mbGFncyA9IDA7CisgICAgc3RybmNweShpZnI0Lmlmcl9uYW1lLCBuYW1lLCBJRk5BTVNJWik7CisKKyAgICBpZiAoaW9jdGwoaW5ldDQsIFNJT0NTSUZGTEFHUywgJmlmcjQpICYmIGVycm5vICE9IEVOT0RFVikgeworICAgICAgICBMT0dFKCJDYW5ub3QgcmVzZXQgJXM6ICVzIiwgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgY2xvc2UoaW5ldDQpOworICAgICAgICByZXR1cm4gU1lTVEVNX0VSUk9SOworICAgIH0KKyAgICBjbG9zZShpbmV0NCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGluZXQ0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisgICAgaWZyZXEgaWZyNDsKKyAgICBzdHJuY3B5KGlmcjQuaWZyX25hbWUsIG5hbWUsIElGTkFNU0laKTsKKyAgICBpZnI0Lmlmcl9mbGFncyA9IDA7CisKKyAgICBpZiAoaW9jdGwoaW5ldDQsIFNJT0NHSUZGTEFHUywgJmlmcjQpICYmIGVycm5vICE9IEVOT0RFVikgeworICAgICAgICBMT0dFKCJDYW5ub3QgY2hlY2sgJXM6ICVzIiwgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisgICAgY2xvc2UoaW5ldDQpOworICAgIHJldHVybiBpZnI0Lmlmcl9mbGFnczsKK30KKworc3RhdGljIGludCBiaW5kX3RvX2ludGVyZmFjZShpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgbmFtZSwgc3RybGVuKG5hbWUpKSkgeworICAgICAgICBMT0dFKCJDYW5ub3QgYmluZCBzb2NrZXQgdG8gJXM6ICVzIiwgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIFNZU1RFTV9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKEpOSUVudiAqZW52LCBpbnQgZXJyb3IsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgaWYgKGVycm9yID09IFNZU1RFTV9FUlJPUikgeworICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihlbnYsICJqYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uIiwgbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIG1lc3NhZ2UpOworICAgIH0KK30KKworc3RhdGljIGppbnQgZXN0YWJsaXNoKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosCisgICAgICAgIGppbnQgbXR1LCBqc3RyaW5nIGpBZGRyZXNzZXMsIGpzdHJpbmcgalJvdXRlcykKK3sKKyAgICBjaGFyIG5hbWVbSUZOQU1TSVpdOworICAgIGludCBpbmRleDsKKyAgICBpbnQgdHVuID0gY3JlYXRlX2ludGVyZmFjZShtdHUsIG5hbWUsICZpbmRleCk7CisgICAgaWYgKHR1biA8IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb24oZW52LCB0dW4sICJDYW5ub3QgY3JlYXRlIGludGVyZmFjZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIExPR0QoIiVzIGlzIGNyZWF0ZWQiLCBuYW1lKTsKKworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3NlczsKKyAgICBjb25zdCBjaGFyICpyb3V0ZXM7CisgICAgaW50IGNvdW50OworCisgICAgLy8gQWRkcmVzc2VzIGFyZSByZXF1aXJlZC4KKyAgICBhZGRyZXNzZXMgPSBqQWRkcmVzc2VzID8gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqQWRkcmVzc2VzLCBOVUxMKSA6IE5VTEw7CisgICAgaWYgKCFhZGRyZXNzZXMpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJhZGRyZXNzIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGNvdW50ID0gc2V0X2FkZHJlc3NlcyhuYW1lLCBpbmRleCwgYWRkcmVzc2VzKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqQWRkcmVzc2VzLCBhZGRyZXNzZXMpOworICAgIGlmIChjb3VudCA8PSAwKSB7CisgICAgICAgIHRocm93RXhjZXB0aW9uKGVudiwgY291bnQsICJDYW5ub3Qgc2V0IGFkZHJlc3MiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgTE9HRCgiQ29uZmlndXJlZCAlZCBhZGRyZXNzKGVzKSBvbiAlcyIsIGNvdW50LCBuYW1lKTsKKworICAgIC8vIFJvdXRlcyBhcmUgb3B0aW9uYWwuCisgICAgcm91dGVzID0galJvdXRlcyA/IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoalJvdXRlcywgTlVMTCkgOiBOVUxMOworICAgIGlmIChyb3V0ZXMpIHsKKyAgICAgICAgY291bnQgPSBzZXRfcm91dGVzKG5hbWUsIGluZGV4LCByb3V0ZXMpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqUm91dGVzLCByb3V0ZXMpOworICAgICAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihlbnYsIGNvdW50LCAiQ2Fubm90IHNldCByb3V0ZSIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJDb25maWd1cmVkICVkIHJvdXRlKHMpIG9uICVzIiwgY291bnQsIG5hbWUpOworICAgIH0KKworICAgIHJldHVybiB0dW47CisKK2Vycm9yOgorICAgIGNsb3NlKHR1bik7CisgICAgTE9HRCgiJXMgaXMgZGVzdHJveWVkIiwgbmFtZSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMganN0cmluZyBnZXROYW1lKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGppbnQgZmQpCit7CisgICAgY2hhciBuYW1lW0lGTkFNU0laXTsKKyAgICBpZiAoZ2V0X2ludGVyZmFjZV9uYW1lKG5hbWUsIGZkKSA8IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb24oZW52LCBTWVNURU1fRVJST1IsICJDYW5ub3QgZ2V0IGludGVyZmFjZSBuYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gZW52LT5OZXdTdHJpbmdVVEYobmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgak5hbWUpCit7CisgICAgY29uc3QgY2hhciAqbmFtZSA9IGpOYW1lID8KKyAgICAgICAgICAgIGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoak5hbWUsIE5VTEwpIDogTlVMTDsKKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgam5pVGhyb3dOdWxsUG9pbnRlckV4Y2VwdGlvbihlbnYsICJuYW1lIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHJlc2V0X2ludGVyZmFjZShuYW1lKSA8IDApIHsKKyAgICAgICAgdGhyb3dFeGNlcHRpb24oZW52LCBTWVNURU1fRVJST1IsICJDYW5ub3QgcmVzZXQgaW50ZXJmYWNlIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiJXMgaXMgZGVhY3RpdmF0ZWQiLCBuYW1lKTsKKyAgICB9CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak5hbWUsIG5hbWUpOworfQorCitzdGF0aWMgamludCBjaGVjayhKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGpOYW1lKQoreworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBqTmFtZSA/CisgICAgICAgICAgICBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpOYW1lLCBOVUxMKSA6IE5VTEw7CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIGpuaVRocm93TnVsbFBvaW50ZXJFeGNlcHRpb24oZW52LCAibmFtZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGZsYWdzID0gY2hlY2tfaW50ZXJmYWNlKG5hbWUpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpOYW1lLCBuYW1lKTsKKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIHByb3RlY3QoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwgamludCBmZCwganN0cmluZyBqTmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lID0gak5hbWUgPworICAgICAgICAgICAgZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqTmFtZSwgTlVMTCkgOiBOVUxMOworICAgIGlmICghbmFtZSkgeworICAgICAgICBqbmlUaHJvd051bGxQb2ludGVyRXhjZXB0aW9uKGVudiwgIm5hbWUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYmluZF90b19pbnRlcmZhY2UoZmQsIG5hbWUpIDwgMCkgeworICAgICAgICB0aHJvd0V4Y2VwdGlvbihlbnYsIFNZU1RFTV9FUlJPUiwgIkNhbm5vdCBwcm90ZWN0IHNvY2tldCIpOworICAgIH0KKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqTmFtZSwgbmFtZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBKTklOYXRpdmVNZXRob2QgZ01ldGhvZHNbXSA9IHsKKyAgICB7Im5hdGl2ZUVzdGFibGlzaCIsICIoSUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylJIiwgKHZvaWQgKillc3RhYmxpc2h9LAorICAgIHsibmF0aXZlR2V0TmFtZSIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKWdldE5hbWV9LAorICAgIHsibmF0aXZlUmVzZXQiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIiwgKHZvaWQgKilyZXNldH0sCisgICAgeyJuYXRpdmVDaGVjayIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUkiLCAodm9pZCAqKWNoZWNrfSwKKyAgICB7Im5hdGl2ZVByb3RlY3QiLCAiKElMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopcHJvdGVjdH0sCit9OworCitpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfY29ubmVjdGl2aXR5X1ZwbihKTklFbnYgKmVudikKK3sKKyAgICByZXR1cm4gam5pUmVnaXN0ZXJOYXRpdmVNZXRob2RzKGVudiwgImNvbS9hbmRyb2lkL3NlcnZlci9jb25uZWN0aXZpdHkvVnBuIiwKKyAgICAgICAgICAgIGdNZXRob2RzLCBORUxFTShnTWV0aG9kcykpOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvam5pL29ubG9hZC5jcHAgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAppbmRleCAwYzQ2ZWVlLi45ZGZmNDhiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcAorKysgYi9zZXJ2aWNlcy9qbmkvb25sb2FkLmNwcApAQCAtMjksMTAgKzI5LDEyIEBACiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Qb3dlck1hbmFnZXJTZXJ2aWNlKEpOSUVudiogZW52KTsKLWludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JTZXJ2aWNlKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JEZXZpY2VNYW5hZ2VyKEpOSUVudiogZW52KTsKK2ludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlcihKTklFbnYqIGVudik7CiBpbnQgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVmlicmF0b3JTZXJ2aWNlKEpOSUVudiogZW52KTsKIGludCByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9TeXN0ZW1TZXJ2ZXIoSk5JRW52KiBlbnYpOwogaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoSk5JRW52KiBlbnYpOworaW50IHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2Nvbm5lY3Rpdml0eV9WcG4oSk5JRW52KiBlbnYpOwogfTsKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CkBAIC01NywxMCArNTksMTIgQEAKICAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9MaWdodHNTZXJ2aWNlKGVudik7CiAgICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfQWxhcm1NYW5hZ2VyU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX0JhdHRlcnlTZXJ2aWNlKGVudik7Ci0gICAgcmVnaXN0ZXJfYW5kcm9pZF9zZXJ2ZXJfVXNiU2VydmljZShlbnYpOworICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1VzYkRldmljZU1hbmFnZXIoZW52KTsKKyAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9Vc2JIb3N0TWFuYWdlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1ZpYnJhdG9yU2VydmljZShlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX1N5c3RlbVNlcnZlcihlbnYpOwogICAgIHJlZ2lzdGVyX2FuZHJvaWRfc2VydmVyX2xvY2F0aW9uX0dwc0xvY2F0aW9uUHJvdmlkZXIoZW52KTsKKyAgICByZWdpc3Rlcl9hbmRyb2lkX3NlcnZlcl9jb25uZWN0aXZpdHlfVnBuKGVudik7CiAKICAgICByZXR1cm4gSk5JX1ZFUlNJT05fMV80OwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDU3YTNiMTUuLmJhM2U2ZTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTgsNyArOCw2IEBACiAgICAgTGluZWFyQWNjZWxlcmF0aW9uU2Vuc29yLmNwcCBcCiAgICAgT3JpZW50YXRpb25TZW5zb3IuY3BwIFwKICAgICBSb3RhdGlvblZlY3RvclNlbnNvci5jcHAgXAotICAgIFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5jcHAgXAogICAgIFNlbnNvckRldmljZS5jcHAgXAogICAgIFNlbnNvckZ1c2lvbi5jcHAgXAogICAgIFNlbnNvckludGVyZmFjZS5jcHAgXApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9Db3JyZWN0ZWRHeXJvU2Vuc29yLmNwcCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvQ29ycmVjdGVkR3lyb1NlbnNvci5jcHAKaW5kZXggOWI3NWI3MC4uMTg1NzQ0MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9Db3JyZWN0ZWRHeXJvU2Vuc29yLmNwcAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0NvcnJlY3RlZEd5cm9TZW5zb3IuY3BwCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgIGNvbnN0IHNlbnNvcnNfZXZlbnRfdCYgZXZlbnQpCiB7CiAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU0VOU09SX1RZUEVfR1lST1NDT1BFKSB7Ci0gICAgICAgIGNvbnN0IHZlYzNfdCBiaWFzKG1TZW5zb3JGdXNpb24uZ2V0R3lyb0JpYXMoKSAqIG1TZW5zb3JGdXNpb24uZ2V0RXN0aW1hdGVkUmF0ZSgpKTsKKyAgICAgICAgY29uc3QgdmVjM190IGJpYXMobVNlbnNvckZ1c2lvbi5nZXRHeXJvQmlhcygpKTsKICAgICAgICAgKm91dEV2ZW50ID0gZXZlbnQ7CiAgICAgICAgIG91dEV2ZW50LT5kYXRhWzBdIC09IGJpYXMueDsKICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMV0gLT0gYmlhcy55OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uY3BwCmluZGV4IDU2YWM5ZjkuLmQ3MDZhZjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvRnVzaW9uLmNwcAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0Z1c2lvbi5jcHAKQEAgLTI0LDE1ICsyNCwzMiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLXN0YXRpYyBpbmxpbmUgVFlQRSBzcXIoVFlQRSB4KSB7Ci0gICAgcmV0dXJuIHgqeDsKLX0KKy8qCisgKiBneXJvVkFSIGdpdmVzIHRoZSBtZWFzdXJlZCB2YXJpYW5jZSBvZiB0aGUgZ3lybydzIG91dHB1dCBwZXIKKyAqIEh6IChvciB2YXJpYW5jZSBhdCAxIEh6KS4gVGhpcyBpcyBhbiAiaW50cmluc2ljIiBwYXJhbWV0ZXIgb2YgdGhlIGd5cm8sCisgKiB3aGljaCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5LgorICoKKyAqIFRoZSB2YXJpYW5jZSBvZiBneXJvJ3Mgb3V0cHV0IGF0IGEgZ2l2ZW4gc2FtcGxpbmcgcGVyaW9kIGNhbiBiZQorICogY2FsY3VsYXRlZCBhczoKKyAqICAgICAgdmFyaWFuY2UoVCkgPSBneXJvVkFSIC8gVAorICoKKyAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgSU5URUdSQVRFRCBPVVRQVVQgYXQgYSBnaXZlbiBzYW1wbGluZyBwZXJpb2QgY2FuIGJlCisgKiBjYWxjdWxhdGVkIGFzOgorICogICAgICAgdmFyaWFuY2VfaW50ZWdyYXRlX291dHB1dChUKSA9IGd5cm9WQVIgKiBUCisgKgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgZ3lyb1ZBUiA9IDFlLTc7ICAgICAgLy8gKHJhZC9zKV4yIC8gSHoKK3N0YXRpYyBjb25zdCBmbG9hdCBiaWFzVkFSID0gMWUtODsgICAgICAvLyAocmFkL3MpXjIgLyBzIChndWVzc2VkKQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBjbGFtcChUIHYpIHsKLSAgICByZXR1cm4gdiA8IDAgPyAwIDogdjsKLX0KKy8qCisgKiBTdGFuZGFyZCBkZXZpYXRpb25zIG9mIGFjY2VsZXJvbWV0ZXIgYW5kIG1hZ25ldG9tZXRlcgorICovCitzdGF0aWMgY29uc3QgZmxvYXQgYWNjU1RERVYgID0gMC4wNWY7ICAgLy8gbS9zXjIgKG1lYXN1cmVkIDAuMDggLyBDREQgMC4wNSkKK3N0YXRpYyBjb25zdCBmbG9hdCBtYWdTVERFViAgPSAwLjVmOyAgICAvLyB1VCAgICAobWVhc3VyZWQgMC43ICAvIENERCAwLjUpCisKK3N0YXRpYyBjb25zdCBmbG9hdCBGUkVFX0ZBTExfVEhSRVNIT0xEID0gMC45ODFmOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRSwgc2l6ZV90IEMsIHNpemVfdCBSPgogc3RhdGljIG1hdDxUWVBFLCBSLCBSPiBzY2FsZUNvdmFyaWFuY2UoCkBAIC03MSwzMyArODgsNiBAQAogICAgIHJldHVybiByOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLXN0YXRpYyBtYXQ8VFlQRSwgMywgMz4gTVJQc1RvTWF0cml4KGNvbnN0IHZlYzxUWVBFLCAzPiYgcCkgewotICAgIG1hdDxUWVBFLCAzLCAzPiByZXMoMSk7Ci0gICAgY29uc3QgbWF0PFRZUEUsIDMsIDM+IHB4KGNyb3NzTWF0cml4KHAsIDApKTsKLSAgICBjb25zdCBUWVBFIHB0cChkb3RfcHJvZHVjdChwLHApKTsKLSAgICBjb25zdCBUWVBFIHQgPSA0L3NxcigxK3B0cCk7Ci0gICAgcmVzIC09IHQgKiAoMS1wdHApICogcHg7Ci0gICAgcmVzICs9IHQgKiAyICogc3FyKHB4KTsKLSAgICByZXR1cm4gcmVzOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLXZlYzxUWVBFLCAzPiBtYXRyaXhUb01SUHMoY29uc3QgbWF0PFRZUEUsIDMsIDM+JiBSKSB7Ci0gICAgLy8gbWF0cml4IHRvIE1SUHMKLSAgICB2ZWM8VFlQRSwgMz4gcTsKLSAgICBjb25zdCBmbG9hdCBIeCA9IFJbMF0ueDsKLSAgICBjb25zdCBmbG9hdCBNeSA9IFJbMV0ueTsKLSAgICBjb25zdCBmbG9hdCBBeiA9IFJbMl0uejsKLSAgICBjb25zdCBmbG9hdCB3ID0gMSAvICgxICsgc3FydGYoIGNsYW1wKCBIeCArIE15ICsgQXogKyAxKSAqIDAuMjVmICkpOwotICAgIHEueCA9IHNxcnRmKCBjbGFtcCggSHggLSBNeSAtIEF6ICsgMSkgKiAwLjI1ZiApICogdzsKLSAgICBxLnkgPSBzcXJ0ZiggY2xhbXAoLUh4ICsgTXkgLSBBeiArIDEpICogMC4yNWYgKSAqIHc7Ci0gICAgcS56ID0gc3FydGYoIGNsYW1wKC1IeCAtIE15ICsgQXogKyAxKSAqIDAuMjVmICkgKiB3OwotICAgIHEueCA9IGNvcHlzaWduZihxLngsIFJbMl0ueSAtIFJbMV0ueik7Ci0gICAgcS55ID0gY29weXNpZ25mKHEueSwgUlswXS56IC0gUlsyXS54KTsKLSAgICBxLnogPSBjb3B5c2lnbmYocS56LCBSWzFdLnggLSBSWzBdLnkpOwotICAgIHJldHVybiBxOwotfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFLCBzaXplX3QgU0laRT4KIGNsYXNzIENvdmFyaWFuY2UgewpAQCAtMTI4LDExICsxMTgsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRnVzaW9uOjpGdXNpb24oKSB7Ci0gICAgLy8gcHJvY2VzcyBub2lzZSBjb3ZhcmlhbmNlIG1hdHJpeAotICAgIGNvbnN0IGZsb2F0IHcxID0gZ3lyb1NUREVWOwotICAgIGNvbnN0IGZsb2F0IHcyID0gYmlhc1NUREVWOwotICAgIFFbMF0gPSB3MSp3MTsKLSAgICBRWzFdID0gdzIqdzI7CisgICAgUGhpWzBdWzFdID0gMDsKKyAgICBQaGlbMV1bMV0gPSAxOwogCiAgICAgQmEueCA9IDA7CiAgICAgQmEueSA9IDA7CkBAIC0xNDYsMjUgKzEzMyw1NyBAQAogfQogCiB2b2lkIEZ1c2lvbjo6aW5pdCgpIHsKLSAgICAvLyBpbml0aWFsIGVzdGltYXRlOiBFeyB4KHQwKSB9Ci0gICAgeCA9IDA7Ci0KLSAgICAvLyBpbml0aWFsIGNvdmFyaWFuY2U6IFZhcnsgeCh0MCkgfQotICAgIFAgPSAwOwotCiAgICAgbUluaXRTdGF0ZSA9IDA7CisgICAgbUd5cm9SYXRlID0gMDsKICAgICBtQ291bnRbMF0gPSAwOwogICAgIG1Db3VudFsxXSA9IDA7CiAgICAgbUNvdW50WzJdID0gMDsKICAgICBtRGF0YSA9IDA7CiB9CiAKK3ZvaWQgRnVzaW9uOjppbml0RnVzaW9uKGNvbnN0IHZlYzRfdCYgcSwgZmxvYXQgZFQpCit7CisgICAgLy8gaW5pdGlhbCBlc3RpbWF0ZTogRXsgeCh0MCkgfQorICAgIHgwID0gcTsKKyAgICB4MSA9IDA7CisKKyAgICAvLyBwcm9jZXNzIG5vaXNlIGNvdmFyaWFuY2UgbWF0cml4OiBHLlEuR3QsIHdpdGgKKyAgICAvLworICAgIC8vICBHID0gfCAtMSAwIHwgICAgICAgIFEgPSB8IHEwMCBxMTAgfAorICAgIC8vICAgICAgfCAgMCAxIHwgICAgICAgICAgICB8IHEwMSBxMTEgfAorICAgIC8vCisgICAgLy8gcTAwID0gc3ZeMi5kdCArIDEvMy5zdV4yLmR0XjMKKyAgICAvLyBxMTAgPSBxMDEgPSAxLzIuc3VeMi5kdF4yCisgICAgLy8gcTExID0gc3VeMi5kdAorICAgIC8vCisKKyAgICAvLyB2YXJpYW5jZSBvZiBpbnRlZ3JhdGVkIG91dHB1dCBhdCAxL2RUIEh6CisgICAgLy8gKHJhbmRvbSBkcmlmdCkKKyAgICBjb25zdCBmbG9hdCBxMDAgPSBneXJvVkFSICogZFQ7CisKKyAgICAvLyB2YXJpYW5jZSBvZiBkcmlmdCByYXRlIHJhbXAKKyAgICBjb25zdCBmbG9hdCBxMTEgPSBiaWFzVkFSICogZFQ7CisKKyAgICBjb25zdCBmbG9hdCB1ICAgPSBxMTEgLyBkVDsKKyAgICBjb25zdCBmbG9hdCBxMTAgPSAwLjVmKnUqZFQqZFQ7CisgICAgY29uc3QgZmxvYXQgcTAxID0gcTEwOworCisgICAgR1FHdFswXVswXSA9ICBxMDA7ICAgICAgLy8gcmFkXjIKKyAgICBHUUd0WzFdWzBdID0gLXExMDsKKyAgICBHUUd0WzBdWzFdID0gLXEwMTsKKyAgICBHUUd0WzFdWzFdID0gIHExMTsgICAgICAvLyAocmFkL3MpXjIKKworICAgIC8vIGluaXRpYWwgY292YXJpYW5jZTogVmFyeyB4KHQwKSB9CisgICAgLy8gVE9ETzogaW5pdGlhbGl6ZSBQIGNvcnJlY3RseQorICAgIFAgPSAwOworfQorCiBib29sIEZ1c2lvbjo6aGFzRXN0aW1hdGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIChtSW5pdFN0YXRlID09IChNQUd8QUNDfEdZUk8pKTsKIH0KIAotYm9vbCBGdXNpb246OmNoZWNrSW5pdENvbXBsZXRlKGludCB3aGF0LCBjb25zdCB2ZWMzX3QmIGQpIHsKLSAgICBpZiAobUluaXRTdGF0ZSA9PSAoTUFHfEFDQ3xHWVJPKSkKK2Jvb2wgRnVzaW9uOjpjaGVja0luaXRDb21wbGV0ZShpbnQgd2hhdCwgY29uc3QgdmVjM190JiBkLCBmbG9hdCBkVCkgeworICAgIGlmIChoYXNFc3RpbWF0ZSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIGlmICh3aGF0ID09IEFDQykgewpAQCAtMTc2LDcgKzE5NSw4IEBACiAgICAgICAgIG1Db3VudFsxXSsrOwogICAgICAgICBtSW5pdFN0YXRlIHw9IE1BRzsKICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gR1lSTykgewotICAgICAgICBtRGF0YVsyXSArPSBkOworICAgICAgICBtR3lyb1JhdGUgPSBkVDsKKyAgICAgICAgbURhdGFbMl0gKz0gZCpkVDsKICAgICAgICAgbUNvdW50WzJdKys7CiAgICAgICAgIGlmIChtQ291bnRbMl0gPT0gNjQpIHsKICAgICAgICAgICAgIC8vIDY0IHNhbXBsZXMgaXMgZ29vZCBlbm91Z2ggdG8gZXN0aW1hdGUgdGhlIGd5cm8gZHJpZnQgYW5kCkBAIC0xOTksMzcgKzIxOSwyOSBAQAogICAgICAgICBlYXN0ICo9IDEvbGVuZ3RoKGVhc3QpOwogICAgICAgICB2ZWMzX3Qgbm9ydGgoY3Jvc3NfcHJvZHVjdCh1cCwgZWFzdCkpOwogICAgICAgICBSIDw8IGVhc3QgPDwgbm9ydGggPDwgdXA7Ci0gICAgICAgIHhbMF0gPSBtYXRyaXhUb01SUHMoUik7CisgICAgICAgIGNvbnN0IHZlYzRfdCBxID0gbWF0cml4VG9RdWF0KFIpOwogCi0gICAgICAgIC8vIE5PVEU6IHdlIGNvdWxkIHRyeSB0byB1c2UgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGd5cm8gZGF0YQotICAgICAgICAvLyB0byBlc3RpbWF0ZSB0aGUgaW5pdGlhbCBiaWFzLCBidXQgdGhpcyBvbmx5IHdvcmtzIGlmCi0gICAgICAgIC8vIHRoZSBkZXZpY2UgaXMgbm90IG1vdmluZy4gRm9yIG5vdywgd2UgZG9uJ3QgdXNlIHRoYXQgdmFsdWUKLSAgICAgICAgLy8gYW5kIHN0YXJ0IHdpdGggYSBiaWFzIG9mIDAuCi0gICAgICAgIHhbMV0gPSAwOwotCi0gICAgICAgIC8vIGluaXRpYWwgY292YXJpYW5jZQotICAgICAgICBQID0gMDsKKyAgICAgICAgaW5pdEZ1c2lvbihxLCBtR3lyb1JhdGUpOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBGdXNpb246OmhhbmRsZUd5cm8oY29uc3QgdmVjM190JiB3LCBmbG9hdCBkVCkgewotICAgIGNvbnN0IHZlYzNfdCB3ZFQodyAqIGRUKTsgICAvLyByYWQvcyAqIHMgLT4gcmFkCi0gICAgaWYgKCFjaGVja0luaXRDb21wbGV0ZShHWVJPLCB3ZFQpKQorICAgIGlmICghY2hlY2tJbml0Q29tcGxldGUoR1lSTywgdywgZFQpKQogICAgICAgICByZXR1cm47CiAKLSAgICBwcmVkaWN0KHdkVCk7CisgICAgcHJlZGljdCh3LCBkVCk7CiB9CiAKIHN0YXR1c190IEZ1c2lvbjo6aGFuZGxlQWNjKGNvbnN0IHZlYzNfdCYgYSkgewotICAgIGlmIChsZW5ndGgoYSkgPCAwLjk4MWYpCisgICAgLy8gaWdub3JlIGFjY2VsZXJhdGlvbiBkYXRhIGlmIHdlJ3JlIGNsb3NlIHRvIGZyZWUtZmFsbAorICAgIGlmIChsZW5ndGgoYSkgPCBGUkVFX0ZBTExfVEhSRVNIT0xEKQogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogCiAgICAgaWYgKCFjaGVja0luaXRDb21wbGV0ZShBQ0MsIGEpKQogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgLy8gaWdub3JlIGFjY2VsZXJhdGlvbiBkYXRhIGlmIHdlJ3JlIGNsb3NlIHRvIGZyZWUtZmFsbAogICAgIGNvbnN0IGZsb2F0IGwgPSAxL2xlbmd0aChhKTsKICAgICB1cGRhdGUoYSpsLCBCYSwgYWNjU1RERVYqbCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMjUxLDIwICsyNjMsNiBAQAogICAgIGNvbnN0IGZsb2F0IGwgPSAxIC8gbGVuZ3RoKG5vcnRoKTsKICAgICBub3J0aCAqPSBsOwogCi0jaWYgMAotICAgIC8vIGluIHByYWN0aWNlIHRoZSBtYWduZXRpYy1maWVsZCBzZW5zb3IgaXMgc28gd3JvbmcKLSAgICAvLyB0aGF0IHRoZXJlIGlzIG5vIHBvaW50IHRyeWluZyB0byB1c2UgaXQgdG8gY29uc3RhbnRseQotICAgIC8vIGNvcnJlY3QgdGhlIGd5cm8uIGluc3RlYWQsIHdlIHVzZSB0aGUgbWFnLXNlbnNvciBvbmx5IHdoZW4KLSAgICAvLyB0aGUgZGV2aWNlIHBvaW50cyBub3J0aCAoanVzdCB0byBnaXZlIHVzIGEgcmVmZXJlbmNlKS4KLSAgICAvLyBXZSdyZSBob3BpbmcgdGhhdCBpdCdsbCBhY3R1YWxseSBwb2ludCBub3J0aCwgaWYgaXQgZG9lc24ndAotICAgIC8vIHdlJ2xsIGJlIG9mZnNldCwgYnV0IGF0IGxlYXN0IHRoZSBpbnN0YW50YW5lb3VzIHBvc3R1cmUKLSAgICAvLyBvZiB0aGUgZGV2aWNlIHdpbGwgYmUgY29ycmVjdC4KLQotICAgIGNvbnN0IGZsb2F0IGNvc18zMCA9IDAuODY2MDI1NGY7Ci0gICAgaWYgKGRvdF9wcm9kdWN0KG5vcnRoLCBCbSkgPCBjb3NfMzApCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0jZW5kaWYKLQogICAgIHVwZGF0ZShub3J0aCwgQm0sIG1hZ1NUREVWKmwpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTI3Myw3ICsyNzEsNyBAQAogICAgIGlmIChpc25hbmYobGVuZ3RoKHYpKSkgewogICAgICAgICBMT0dXKCI5LWF4aXMgZnVzaW9uIGRpdmVyZ2VkLiByZXNldGluZyBzdGF0ZS4iKTsKICAgICAgICAgUCA9IDA7Ci0gICAgICAgIHhbMV0gPSAwOworICAgICAgICB4MSA9IDA7CiAgICAgICAgIG1Jbml0U3RhdGUgPSAwOwogICAgICAgICBtQ291bnRbMF0gPSAwOwogICAgICAgICBtQ291bnRbMV0gPSAwOwpAQCAtMjg0LDE0NSArMjgyLDg5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZlYzNfdCBGdXNpb246OmdldEF0dGl0dWRlKCkgY29uc3QgewotICAgIHJldHVybiB4WzBdOwordmVjNF90IEZ1c2lvbjo6Z2V0QXR0aXR1ZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHgwOwogfQogCiB2ZWMzX3QgRnVzaW9uOjpnZXRCaWFzKCkgY29uc3QgewotICAgIHJldHVybiB4WzFdOworICAgIHJldHVybiB4MTsKIH0KIAogbWF0MzNfdCBGdXNpb246OmdldFJvdGF0aW9uTWF0cml4KCkgY29uc3QgewotICAgIHJldHVybiBNUlBzVG9NYXRyaXgoeFswXSk7CisgICAgcmV0dXJuIHF1YXRUb01hdHJpeCh4MCk7CiB9CiAKLW1hdDMzX3QgRnVzaW9uOjpnZXRGKGNvbnN0IHZlYzNfdCYgcCkgewotICAgIGNvbnN0IGZsb2F0IHAwID0gcC54OwotICAgIGNvbnN0IGZsb2F0IHAxID0gcC55OwotICAgIGNvbnN0IGZsb2F0IHAyID0gcC56OwotCi0gICAgLy8gZihwLCB3KQotICAgIGNvbnN0IGZsb2F0IHAwcDEgPSBwMCpwMTsKLSAgICBjb25zdCBmbG9hdCBwMHAyID0gcDAqcDI7Ci0gICAgY29uc3QgZmxvYXQgcDFwMiA9IHAxKnAyOwotICAgIGNvbnN0IGZsb2F0IHAwcDAgPSBwMCpwMDsKLSAgICBjb25zdCBmbG9hdCBwMXAxID0gcDEqcDE7Ci0gICAgY29uc3QgZmxvYXQgcDJwMiA9IHAyKnAyOwotICAgIGNvbnN0IGZsb2F0IHBwID0gMC41ZiAqICgxIC0gKHAwcDAgKyBwMXAxICsgcDJwMikpOwotCi0gICAgbWF0MzNfdCBGOwotICAgIEZbMF1bMF0gPSAwLjVmKihwMHAwICsgcHApOwotICAgIEZbMF1bMV0gPSAwLjVmKihwMHAxICsgcDIpOwotICAgIEZbMF1bMl0gPSAwLjVmKihwMHAyIC0gcDEpOwotICAgIEZbMV1bMF0gPSAwLjVmKihwMHAxIC0gcDIpOwotICAgIEZbMV1bMV0gPSAwLjVmKihwMXAxICsgcHApOwotICAgIEZbMV1bMl0gPSAwLjVmKihwMXAyICsgcDApOwotICAgIEZbMl1bMF0gPSAwLjVmKihwMHAyICsgcDEpOwotICAgIEZbMl1bMV0gPSAwLjVmKihwMXAyIC0gcDApOwotICAgIEZbMl1bMl0gPSAwLjVmKihwMnAyICsgcHApOworbWF0MzRfdCBGdXNpb246OmdldEYoY29uc3QgdmVjNF90JiBxKSB7CisgICAgbWF0MzRfdCBGOworICAgIEZbMF0ueCA9IHEudzsgICBGWzFdLnggPS1xLno7ICAgRlsyXS54ID0gcS55OworICAgIEZbMF0ueSA9IHEuejsgICBGWzFdLnkgPSBxLnc7ICAgRlsyXS55ID0tcS54OworICAgIEZbMF0ueiA9LXEueTsgICBGWzFdLnogPSBxLng7ICAgRlsyXS56ID0gcS53OworICAgIEZbMF0udyA9LXEueDsgICBGWzFdLncgPS1xLnk7ICAgRlsyXS53ID0tcS56OwogICAgIHJldHVybiBGOwogfQogCi1tYXQzM190IEZ1c2lvbjo6Z2V0ZEZkcChjb25zdCB2ZWMzX3QmIHAsIGNvbnN0IHZlYzNfdCYgd2UpIHsKK3ZvaWQgRnVzaW9uOjpwcmVkaWN0KGNvbnN0IHZlYzNfdCYgdywgZmxvYXQgZFQpIHsKKyAgICBjb25zdCB2ZWM0X3QgcSAgPSB4MDsKKyAgICBjb25zdCB2ZWMzX3QgYiAgPSB4MTsKKyAgICBjb25zdCB2ZWMzX3Qgd2UgPSB3IC0gYjsKKyAgICBjb25zdCB2ZWM0X3QgZHEgPSBnZXRGKHEpKigoMC41ZipkVCkqd2UpOworICAgIHgwID0gbm9ybWFsaXplX3F1YXQocSArIGRxKTsKIAotICAgIC8vIGRGID0gfCBBID0gZGYvZHAgIC1GIHwKLSAgICAvLyAgICAgIHwgICAwICAgICAgICAgMCB8CisgICAgLy8gUChrKzEpID0gRipQKGspKkZ0ICsgRypRKkd0CiAKLSAgICBtYXQzM190IEE7Ci0gICAgQVswXVswXSA9IEFbMV1bMV0gPSBBWzJdWzJdID0gMC41ZiAqIChwLngqd2UueCArIHAueSp3ZS55ICsgcC56KndlLnopOwotICAgIEFbMF1bMV0gPSAwLjVmICogKHAueSp3ZS54IC0gcC54KndlLnkgLSB3ZS56KTsKLSAgICBBWzBdWzJdID0gMC41ZiAqIChwLnoqd2UueCAtIHAueCp3ZS56ICsgd2UueSk7Ci0gICAgQVsxXVsyXSA9IDAuNWYgKiAocC56KndlLnkgLSBwLnkqd2UueiAtIHdlLngpOwotICAgIEFbMV1bMF0gPSAtQVswXVsxXTsKLSAgICBBWzJdWzBdID0gLUFbMF1bMl07Ci0gICAgQVsyXVsxXSA9IC1BWzFdWzJdOwotICAgIHJldHVybiBBOwotfQorICAgIC8vICBQaGkgPSB8IFBoaTAwIFBoaTEwIHwKKyAgICAvLyAgICAgICAgfCAgIDAgICAgIDEgICB8CisgICAgY29uc3QgbWF0MzNfdCBJMzMoMSk7CisgICAgY29uc3QgbWF0MzNfdCBJMzNkVChkVCk7CisgICAgY29uc3QgbWF0MzNfdCB3eChjcm9zc01hdHJpeCh3ZSwgMCkpOworICAgIGNvbnN0IG1hdDMzX3Qgd3gyKHd4Knd4KTsKKyAgICBjb25zdCBmbG9hdCBsd2VkVCA9IGxlbmd0aCh3ZSkqZFQ7CisgICAgY29uc3QgZmxvYXQgaWx3ZSA9IDEvbGVuZ3RoKHdlKTsKKyAgICBjb25zdCBmbG9hdCBrMCA9ICgxLWNvc2YobHdlZFQpKSooaWx3ZSppbHdlKTsKKyAgICBjb25zdCBmbG9hdCBrMSA9IHNpbmYobHdlZFQpOwogCi12b2lkIEZ1c2lvbjo6cHJlZGljdChjb25zdCB2ZWMzX3QmIHcpIHsKLSAgICAvLyBmKHAsIHcpCi0gICAgdmVjM190JiBwKHhbMF0pOworICAgIFBoaVswXVswXSA9IEkzMyAtIHd4KihrMSppbHdlKSArIHd4MiprMDsKKyAgICBQaGlbMV1bMF0gPSB3eCprMCAtIEkzM2RUIC0gd3gyKihpbHdlKmlsd2UqaWx3ZSkqKGx3ZWRULWsxKTsKIAotICAgIC8vIFRoZXJlIGlzIGEgZGlzY29udGludWl0eSBhdCAyLnBpLCB0byBhdm9pZCBpdCB3ZSBuZWVkIHRvIHN3aXRjaCB0bwotICAgIC8vIHRoZSBzaGFkb3cgb2YgcCB3aGVuIHBULnAgZ2V0cyB0b28gYmlnLgotICAgIGNvbnN0IGZsb2F0IHB0cChkb3RfcHJvZHVjdChwLHApKTsKLSAgICBpZiAocHRwID49IDIuMGYpIHsKLSAgICAgICAgcCA9IC1wICogKDEvcHRwKTsKLSAgICB9Ci0KLSAgICBjb25zdCBtYXQzM190IEYoZ2V0RihwKSk7Ci0KLSAgICAvLyBjb21wdXRlIHcgd2l0aCB0aGUgYmlhcyBjb3JyZWN0aW9uOgotICAgIC8vICB3X2VzdGltYXRlZCA9IHcgLSBiX2VzdGltYXRlZAotICAgIGNvbnN0IHZlYzNfdCYgYih4WzFdKTsKLSAgICBjb25zdCB2ZWMzX3Qgd2UodyAtIGIpOwotCi0gICAgLy8gcHJlZGljdGlvbgotICAgIGNvbnN0IHZlYzNfdCBkWChGKndlKTsKLQotICAgIGlmICghY2hlY2tTdGF0ZShkWCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHAgKz0gZFg7Ci0KLSAgICBjb25zdCBtYXQzM190IEEoZ2V0ZEZkcChwLCB3ZSkpOwotCi0gICAgLy8gRyAgPSB8IEcwICAwIHwgID0gIHwgLUYgIDAgfAotICAgIC8vICAgICAgfCAgMCAgMSB8ICAgICB8ICAwICAxIHwKLQotICAgIC8vIFAgKz0gQSpQICsgUCpBdCArIEYqUSpGdAotICAgIGNvbnN0IG1hdDMzX3QgQVAoQSp0cmFuc3Bvc2UoUFswXVswXSkpOwotICAgIGNvbnN0IG1hdDMzX3QgUEF0KFBbMF1bMF0qdHJhbnNwb3NlKEEpKTsKLSAgICBjb25zdCBtYXQzM190IEZQU3QoRip0cmFuc3Bvc2UoUFsxXVswXSkpOwotICAgIGNvbnN0IG1hdDMzX3QgUFNGdChQWzFdWzBdKnRyYW5zcG9zZShGKSk7Ci0gICAgY29uc3QgbWF0MzNfdCBGUUZ0KHNjYWxlQ292YXJpYW5jZShGLCBRWzBdKSk7Ci0gICAgUFswXVswXSArPSBBUCArIFBBdCAtIEZQU3QgLSBQU0Z0ICsgRlFGdDsKLSAgICBQWzFdWzBdICs9IEEqUFsxXVswXSAtIEYqUFsxXVsxXTsKLSAgICBQWzFdWzFdICs9IFFbMV07CisgICAgUCA9IFBoaSpQKnRyYW5zcG9zZShQaGkpICsgR1FHdDsKIH0KIAogdm9pZCBGdXNpb246OnVwZGF0ZShjb25zdCB2ZWMzX3QmIHosIGNvbnN0IHZlYzNfdCYgQmksIGZsb2F0IHNpZ21hKSB7Ci0gICAgY29uc3QgdmVjM190IHAoeFswXSk7CisgICAgdmVjNF90IHEoeDApOwogICAgIC8vIG1lYXN1cmVkIHZlY3RvciBpbiBib2R5IHNwYWNlOiBoKHApID0gQShwKSpCaQotICAgIGNvbnN0IG1hdDMzX3QgQShNUlBzVG9NYXRyaXgocCkpOworICAgIGNvbnN0IG1hdDMzX3QgQShxdWF0VG9NYXRyaXgocSkpOwogICAgIGNvbnN0IHZlYzNfdCBCYihBKkJpKTsKIAogICAgIC8vIFNlbnNpdGl2aXR5IG1hdHJpeCBIID0gZGgocCkvZHAKICAgICAvLyBIID0gWyBMIDAgXQotICAgIGNvbnN0IGZsb2F0IHB0cChkb3RfcHJvZHVjdChwLHApKTsKLSAgICBjb25zdCBtYXQzM190IHB4KGNyb3NzTWF0cml4KHAsIDAuNWYqKHB0cC0xKSkpOwotICAgIGNvbnN0IG1hdDMzX3QgcHB0KHAqdHJhbnNwb3NlKHApKTsKLSAgICBjb25zdCBtYXQzM190IEwoKDggLyBzcXIoMStwdHApKSpjcm9zc01hdHJpeChCYiwgMCkqKHBwdC1weCkpOworICAgIGNvbnN0IG1hdDMzX3QgTChjcm9zc01hdHJpeChCYiwgMCkpOwogCi0gICAgLy8gdXBkYXRlLi4uCisgICAgLy8gZ2Fpbi4uLgorICAgIC8vIEsgPSBQKkh0IC8gW0gqUCpIdCArIFJdCisgICAgdmVjPG1hdDMzX3QsIDI+IEs7CiAgICAgY29uc3QgbWF0MzNfdCBSKHNpZ21hKnNpZ21hKTsKICAgICBjb25zdCBtYXQzM190IFMoc2NhbGVDb3ZhcmlhbmNlKEwsIFBbMF1bMF0pICsgUik7CiAgICAgY29uc3QgbWF0MzNfdCBTaShpbnZlcnQoUykpOwogICAgIGNvbnN0IG1hdDMzX3QgTHRTaSh0cmFuc3Bvc2UoTCkqU2kpOwotCi0gICAgdmVjPG1hdDMzX3QsIDI+IEs7CiAgICAgS1swXSA9IFBbMF1bMF0gKiBMdFNpOwogICAgIEtbMV0gPSB0cmFuc3Bvc2UoUFsxXVswXSkqTHRTaTsKIAotICAgIGNvbnN0IHZlYzNfdCBlKHogLSBCYik7Ci0gICAgY29uc3QgdmVjM190IEswZShLWzBdKmUpOwotICAgIGNvbnN0IHZlYzNfdCBLMWUoS1sxXSplKTsKLQotICAgIGlmICghY2hlY2tTdGF0ZShLMGUpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWNoZWNrU3RhdGUoSzFlKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgeFswXSArPSBLMGU7Ci0gICAgeFsxXSArPSBLMWU7Ci0KKyAgICAvLyB1cGRhdGUuLi4KICAgICAvLyBQIC09IEsqSCpQOwogICAgIGNvbnN0IG1hdDMzX3QgSzBMKEtbMF0gKiBMKTsKICAgICBjb25zdCBtYXQzM190IEsxTChLWzFdICogTCk7CiAgICAgUFswXVswXSAtPSBLMEwqUFswXVswXTsKICAgICBQWzFdWzFdIC09IEsxTCpQWzFdWzBdOwogICAgIFBbMV1bMF0gLT0gSzBMKlBbMV1bMF07CisgICAgUFswXVsxXSA9IHRyYW5zcG9zZShQWzFdWzBdKTsKKworICAgIGNvbnN0IHZlYzNfdCBlKHogLSBCYik7CisgICAgY29uc3QgdmVjM190IGRxKEtbMF0qZSk7CisgICAgY29uc3QgdmVjM190IGRiKEtbMV0qZSk7CisKKyAgICBxICs9IGdldEYocSkqKDAuNWYqZHEpOworICAgIHgwID0gbm9ybWFsaXplX3F1YXQocSk7CisgICAgeDEgKz0gZGI7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0Z1c2lvbi5oIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9GdXNpb24uaAppbmRleCA1NzFhNDE1Li41NTY5NDRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0Z1c2lvbi5oCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvRnVzaW9uLmgKQEAgLTE5LDQyICsxOSwzOSBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKLSNpbmNsdWRlICJ2ZWMuaCIKKyNpbmNsdWRlICJxdWF0LmgiCiAjaW5jbHVkZSAibWF0LmgiCisjaW5jbHVkZSAidmVjLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordHlwZWRlZiBtYXQ8ZmxvYXQsIDMsIDQ+IG1hdDM0X3Q7CisKIGNsYXNzIEZ1c2lvbiB7CiAgICAgLyoKICAgICAgKiB0aGUgc3RhdGUgdmVjdG9yIGlzIG1hZGUgb2YgdHdvIHN1Yi12ZWN0b3IgY29udGFpbmluZyByZXNwZWN0aXZlbHk6CiAgICAgICogLSBtb2RpZmllZCBSb2RyaWd1ZXMgcGFyYW1ldGVycwogICAgICAqIC0gdGhlIGVzdGltYXRlZCBneXJvIGJpYXMKICAgICAgKi8KLSAgICB2ZWM8dmVjM190LCAyPiB4OworICAgIHF1YXRfdCAgeDA7CisgICAgdmVjM190ICB4MTsKIAogICAgIC8qCiAgICAgICogdGhlIHByZWRpY2F0ZWQgY292YXJpYW5jZSBtYXRyaXggaXMgbWFkZSBvZiA0IDN4MyBzdWItbWF0cmljZXMgYW5kIGl0CiAgICAgICogc2VtaS1kZWZpbml0ZSBwb3NpdGl2ZS4KICAgICAgKgogICAgICAqIFAgPSB8IFAwMCAgUDEwIHwgPSB8IFAwMCAgUDEwIHwKLSAgICAgKiAgICAgfCBQMDEgIFAxMSB8ICAgfCBQMTB0ICBRMSB8CisgICAgICogICAgIHwgUDAxICBQMTEgfCAgIHwgUDEwdCBQMTEgfAogICAgICAqCiAgICAgICogU2luY2UgUDAxID0gdHJhbnNwb3NlKFAxMCksIHRoZSBjb2RlIGJlbG93IG5ldmVyIGNhbGN1bGF0ZXMgb3IKLSAgICAgKiBzdG9yZXMgUDAxLiBQMTEgaXMgYWx3YXlzIGVxdWFsIHRvIFExLCBzbyB3ZSBkb24ndCBzdG9yZSBpdCBlaXRoZXIuCisgICAgICogc3RvcmVzIFAwMS4KICAgICAgKi8KICAgICBtYXQ8bWF0MzNfdCwgMiwgMj4gUDsKIAogICAgIC8qCi0gICAgICogdGhlIHByb2Nlc3Mgbm9pc2UgY292YXJpYW5jZSBtYXRyaXggaXMgbWFkZSBvZiAyIDN4MyBzdWItbWF0cmljZXMKLSAgICAgKiBRMCBlbmNvZGVzIHRoZSBhdHRpdHVkZSdzIG5vaXNlCi0gICAgICogUTEgZW5jb2RlcyB0aGUgYmlhcycgbm9pc2UKKyAgICAgKiB0aGUgcHJvY2VzcyBub2lzZSBjb3ZhcmlhbmNlIG1hdHJpeAogICAgICAqLwotICAgIHZlYzxtYXQzM190LCAyPiBROwotCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGd5cm9TVERFViA9IDEuMGUtNTsgIC8vIHJhZC9zIChtZWFzdXJlZCAxLjJlLTUpCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IGFjY1NUREVWICA9IDAuMDVmOyAgIC8vIG0vc14yIChtZWFzdXJlZCAwLjA4IC8gQ0REIDAuMDUpCi0gICAgc3RhdGljIGNvbnN0IGZsb2F0IG1hZ1NUREVWICA9IDAuNWY7ICAgIC8vIHVUICAgIChtZWFzdXJlZCAwLjcgIC8gQ0REIDAuNSkKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgYmlhc1NUREVWID0gMmUtOTsgICAgLy8gcmFkL3NeMiAoZ3Vlc3NlZCkKKyAgICBtYXQ8bWF0MzNfdCwgMiwgMj4gR1FHdDsKIAogcHVibGljOgogICAgIEZ1c2lvbigpOwpAQCAtNjIsMjMgKzU5LDI1IEBACiAgICAgdm9pZCBoYW5kbGVHeXJvKGNvbnN0IHZlYzNfdCYgdywgZmxvYXQgZFQpOwogICAgIHN0YXR1c190IGhhbmRsZUFjYyhjb25zdCB2ZWMzX3QmIGEpOwogICAgIHN0YXR1c190IGhhbmRsZU1hZyhjb25zdCB2ZWMzX3QmIG0pOwotICAgIHZlYzNfdCBnZXRBdHRpdHVkZSgpIGNvbnN0OworICAgIHZlYzRfdCBnZXRBdHRpdHVkZSgpIGNvbnN0OwogICAgIHZlYzNfdCBnZXRCaWFzKCkgY29uc3Q7CiAgICAgbWF0MzNfdCBnZXRSb3RhdGlvbk1hdHJpeCgpIGNvbnN0OwogICAgIGJvb2wgaGFzRXN0aW1hdGUoKSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICBtYXQ8bWF0MzNfdCwgMiwgMj4gUGhpOwogICAgIHZlYzNfdCBCYSwgQm07CiAgICAgdWludDMyX3QgbUluaXRTdGF0ZTsKKyAgICBmbG9hdCBtR3lyb1JhdGU7CiAgICAgdmVjPHZlYzNfdCwgMz4gbURhdGE7CiAgICAgc2l6ZV90IG1Db3VudFszXTsKICAgICBlbnVtIHsgQUNDPTB4MSwgTUFHPTB4MiwgR1lSTz0weDQgfTsKLSAgICBib29sIGNoZWNrSW5pdENvbXBsZXRlKGludCwgY29uc3QgdmVjM190Jik7CisgICAgYm9vbCBjaGVja0luaXRDb21wbGV0ZShpbnQsIGNvbnN0IHZlYzNfdCYgdywgZmxvYXQgZCA9IDApOworICAgIHZvaWQgaW5pdEZ1c2lvbihjb25zdCB2ZWM0X3QmIHEwLCBmbG9hdCBkVCk7CiAgICAgYm9vbCBjaGVja1N0YXRlKGNvbnN0IHZlYzNfdCYgdik7Ci0gICAgdm9pZCBwcmVkaWN0KGNvbnN0IHZlYzNfdCYgdyk7CisgICAgdm9pZCBwcmVkaWN0KGNvbnN0IHZlYzNfdCYgdywgZmxvYXQgZFQpOwogICAgIHZvaWQgdXBkYXRlKGNvbnN0IHZlYzNfdCYgeiwgY29uc3QgdmVjM190JiBCaSwgZmxvYXQgc2lnbWEpOwotICAgIHN0YXRpYyBtYXQzM190IGdldEYoY29uc3QgdmVjM190JiBwKTsKLSAgICBzdGF0aWMgbWF0MzNfdCBnZXRkRmRwKGNvbnN0IHZlYzNfdCYgcCwgY29uc3QgdmVjM190JiB3ZSk7CisgICAgc3RhdGljIG1hdDM0X3QgZ2V0Rihjb25zdCB2ZWM0X3QmIHApOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvR3Jhdml0eVNlbnNvci5jcHAgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuY3BwCmluZGV4IDU0MWZhZDIuLmM1NzcxNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvR3Jhdml0eVNlbnNvci5jcHAKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9HcmF2aXR5U2Vuc29yLmNwcApAQCAtMzEsMTAgKzMxLDcgQEAKIAogR3Jhdml0eVNlbnNvcjo6R3Jhdml0eVNlbnNvcihzZW5zb3JfdCBjb25zdCogbGlzdCwgc2l6ZV90IGNvdW50KQogICAgIDogbVNlbnNvckRldmljZShTZW5zb3JEZXZpY2U6OmdldEluc3RhbmNlKCkpLAotICAgICAgbVNlbnNvckZ1c2lvbihTZW5zb3JGdXNpb246OmdldEluc3RhbmNlKCkpLAotICAgICAgbUFjY1RpbWUoMCksCi0gICAgICBtTG93UGFzcyhNX1NRUlQxXzIsIDEuNWYpLAotICAgICAgbVgobUxvd1Bhc3MpLCBtWShtTG93UGFzcyksIG1aKG1Mb3dQYXNzKQorICAgICAgbVNlbnNvckZ1c2lvbihTZW5zb3JGdXNpb246OmdldEluc3RhbmNlKCkpCiB7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBpZiAobGlzdFtpXS50eXBlID09IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpIHsKQEAgLTUwLDMwICs0NywxNCBAQAogICAgIGNvbnN0IHN0YXRpYyBkb3VibGUgTlMyUyA9IDEuMCAvIDEwMDAwMDAwMDAuMDsKICAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSKSB7CiAgICAgICAgIHZlYzNfdCBnOwotICAgICAgICBpZiAobVNlbnNvckZ1c2lvbi5oYXNHeXJvKCkpIHsKLSAgICAgICAgICAgIGlmICghbVNlbnNvckZ1c2lvbi5oYXNFc3RpbWF0ZSgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGNvbnN0IG1hdDMzX3QgUihtU2Vuc29yRnVzaW9uLmdldFJvdGF0aW9uTWF0cml4KCkpOwotICAgICAgICAgICAgLy8gRklYTUU6IHdlIG5lZWQgdG8gZXN0aW1hdGUgdGhlIGxlbmd0aCBvZiBncmF2aXR5IGJlY2F1c2UKLSAgICAgICAgICAgIC8vIHRoZSBhY2NlbGVyb21ldGVyIG1heSBoYXZlIGEgc21hbGwgc2NhbGluZyBlcnJvci4gVGhpcwotICAgICAgICAgICAgLy8gdHJhbnNsYXRlcyB0byBhbiBvZmZzZXQgaW4gdGhlIGxpbmVhci1hY2NlbGVyYXRpb24gc2Vuc29yLgotICAgICAgICAgICAgZyA9IFJbMl0gKiBHUkFWSVRZX0VBUlRIOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgZG91YmxlIG5vdyA9IGV2ZW50LnRpbWVzdGFtcCAqIE5TMlM7Ci0gICAgICAgICAgICBpZiAobUFjY1RpbWUgPT0gMCkgewotICAgICAgICAgICAgICAgIGcueCA9IG1YLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLngpOwotICAgICAgICAgICAgICAgIGcueSA9IG1ZLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLnkpOwotICAgICAgICAgICAgICAgIGcueiA9IG1aLmluaXQoZXZlbnQuYWNjZWxlcmF0aW9uLnopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgZFQgPSBub3cgLSBtQWNjVGltZTsKLSAgICAgICAgICAgICAgICBtTG93UGFzcy5zZXRTYW1wbGluZ1BlcmlvZChkVCk7Ci0gICAgICAgICAgICAgICAgZy54ID0gbVgoZXZlbnQuYWNjZWxlcmF0aW9uLngpOwotICAgICAgICAgICAgICAgIGcueSA9IG1ZKGV2ZW50LmFjY2VsZXJhdGlvbi55KTsKLSAgICAgICAgICAgICAgICBnLnogPSBtWihldmVudC5hY2NlbGVyYXRpb24ueik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnICo9IChHUkFWSVRZX0VBUlRIIC8gbGVuZ3RoKGcpKTsKLSAgICAgICAgICAgIG1BY2NUaW1lID0gbm93OwotICAgICAgICB9CisgICAgICAgIGlmICghbVNlbnNvckZ1c2lvbi5oYXNFc3RpbWF0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjb25zdCBtYXQzM190IFIobVNlbnNvckZ1c2lvbi5nZXRSb3RhdGlvbk1hdHJpeCgpKTsKKyAgICAgICAgLy8gRklYTUU6IHdlIG5lZWQgdG8gZXN0aW1hdGUgdGhlIGxlbmd0aCBvZiBncmF2aXR5IGJlY2F1c2UKKyAgICAgICAgLy8gdGhlIGFjY2VsZXJvbWV0ZXIgbWF5IGhhdmUgYSBzbWFsbCBzY2FsaW5nIGVycm9yLiBUaGlzCisgICAgICAgIC8vIHRyYW5zbGF0ZXMgdG8gYW4gb2Zmc2V0IGluIHRoZSBsaW5lYXItYWNjZWxlcmF0aW9uIHNlbnNvci4KKyAgICAgICAgZyA9IFJbMl0gKiBHUkFWSVRZX0VBUlRIOworCiAgICAgICAgICpvdXRFdmVudCA9IGV2ZW50OwogICAgICAgICBvdXRFdmVudC0+ZGF0YVswXSA9IGcueDsKICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMV0gPSBnLnk7CkBAIC04Niw0MiArNjcsMjQgQEAKIH0KIAogc3RhdHVzX3QgR3Jhdml0eVNlbnNvcjo6YWN0aXZhdGUodm9pZCogaWRlbnQsIGJvb2wgZW5hYmxlZCkgewotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAobVNlbnNvckZ1c2lvbi5oYXNHeXJvKCkpIHsKLSAgICAgICAgZXJyID0gbVNlbnNvckZ1c2lvbi5hY3RpdmF0ZSh0aGlzLCBlbmFibGVkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBtU2Vuc29yRGV2aWNlLmFjdGl2YXRlKHRoaXMsIG1BY2NlbGVyb21ldGVyLmdldEhhbmRsZSgpLCBlbmFibGVkKTsKLSAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtQWNjVGltZSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKKyAgICByZXR1cm4gbVNlbnNvckZ1c2lvbi5hY3RpdmF0ZSh0aGlzLCBlbmFibGVkKTsKIH0KIAotc3RhdHVzX3QgR3Jhdml0eVNlbnNvcjo6c2V0RGVsYXkodm9pZCogaWRlbnQsIGludCBoYW5kbGUsIGludDY0X3QgbnMpCi17Ci0gICAgaWYgKG1TZW5zb3JGdXNpb24uaGFzR3lybygpKSB7Ci0gICAgICAgIHJldHVybiBtU2Vuc29yRnVzaW9uLnNldERlbGF5KHRoaXMsIG5zKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlbnNvckRldmljZS5zZXREZWxheSh0aGlzLCBtQWNjZWxlcm9tZXRlci5nZXRIYW5kbGUoKSwgbnMpOwotICAgIH0KK3N0YXR1c190IEdyYXZpdHlTZW5zb3I6OnNldERlbGF5KHZvaWQqIGlkZW50LCBpbnQgaGFuZGxlLCBpbnQ2NF90IG5zKSB7CisgICAgcmV0dXJuIG1TZW5zb3JGdXNpb24uc2V0RGVsYXkodGhpcywgbnMpOwogfQogCiBTZW5zb3IgR3Jhdml0eVNlbnNvcjo6Z2V0U2Vuc29yKCkgY29uc3QgewogICAgIHNlbnNvcl90IGh3U2Vuc29yOwogICAgIGh3U2Vuc29yLm5hbWUgICAgICAgPSAiR3Jhdml0eSBTZW5zb3IiOwogICAgIGh3U2Vuc29yLnZlbmRvciAgICAgPSAiR29vZ2xlIEluYy4iOwotICAgIGh3U2Vuc29yLnZlcnNpb24gICAgPSBtU2Vuc29yRnVzaW9uLmhhc0d5cm8oKSA/IDMgOiAyOworICAgIGh3U2Vuc29yLnZlcnNpb24gICAgPSAzOwogICAgIGh3U2Vuc29yLmhhbmRsZSAgICAgPSAnX2dydic7CiAgICAgaHdTZW5zb3IudHlwZSAgICAgICA9IFNFTlNPUl9UWVBFX0dSQVZJVFk7CiAgICAgaHdTZW5zb3IubWF4UmFuZ2UgICA9IEdSQVZJVFlfRUFSVEggKiAyOwogICAgIGh3U2Vuc29yLnJlc29sdXRpb24gPSBtQWNjZWxlcm9tZXRlci5nZXRSZXNvbHV0aW9uKCk7Ci0gICAgaHdTZW5zb3IucG93ZXIgICAgICA9IG1TZW5zb3JGdXNpb24uaGFzR3lybygpID8KLSAgICAgICAgICAgIG1TZW5zb3JGdXNpb24uZ2V0UG93ZXJVc2FnZSgpIDogbUFjY2VsZXJvbWV0ZXIuZ2V0UG93ZXJVc2FnZSgpOwotICAgIGh3U2Vuc29yLm1pbkRlbGF5ICAgPSBtU2Vuc29yRnVzaW9uLmhhc0d5cm8oKSA/Ci0gICAgICAgICAgICBtU2Vuc29yRnVzaW9uLmdldE1pbkRlbGF5KCkgOiBtQWNjZWxlcm9tZXRlci5nZXRNaW5EZWxheSgpOworICAgIGh3U2Vuc29yLnBvd2VyICAgICAgPSBtU2Vuc29yRnVzaW9uLmdldFBvd2VyVXNhZ2UoKTsKKyAgICBod1NlbnNvci5taW5EZWxheSAgID0gbVNlbnNvckZ1c2lvbi5nZXRNaW5EZWxheSgpOwogICAgIFNlbnNvciBzZW5zb3IoJmh3U2Vuc29yKTsKICAgICByZXR1cm4gc2Vuc29yOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9HcmF2aXR5U2Vuc29yLmggYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuaAppbmRleCAwY2EzYTNjLi5hYzE3N2M0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuaAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL0dyYXZpdHlTZW5zb3IuaApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGd1aS9TZW5zb3IuaD4KIAogI2luY2x1ZGUgIlNlbnNvckludGVyZmFjZS5oIgotI2luY2x1ZGUgIlNlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5oIgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM2LDEwICszNSw2IEBACiAgICAgU2Vuc29yRGV2aWNlJiBtU2Vuc29yRGV2aWNlOwogICAgIFNlbnNvckZ1c2lvbiYgbVNlbnNvckZ1c2lvbjsKICAgICBTZW5zb3IgbUFjY2VsZXJvbWV0ZXI7Ci0gICAgZG91YmxlIG1BY2NUaW1lOwotCi0gICAgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyIG1Mb3dQYXNzOwotICAgIENhc2NhZGVkQmlxdWFkRmlsdGVyPGZsb2F0PiBtWCwgbVksIG1aOwogCiBwdWJsaWM6CiAgICAgR3Jhdml0eVNlbnNvcihzZW5zb3JfdCBjb25zdCogbGlzdCwgc2l6ZV90IGNvdW50KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvT3JpZW50YXRpb25TZW5zb3IuY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9PcmllbnRhdGlvblNlbnNvci5jcHAKaW5kZXggYzllNTA4MC4uMDM3YWRhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9PcmllbnRhdGlvblNlbnNvci5jcHAKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9PcmllbnRhdGlvblNlbnNvci5jcHAKQEAgLTUwLDkgKzUwLDEwIEBACiAgICAgICAgICAgICAgICAgZ1swXSArPSAzNjA7CiAKICAgICAgICAgICAgICpvdXRFdmVudCA9IGV2ZW50OwotICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMF0gPSBnLng7Ci0gICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVsxXSA9IGcueTsKLSAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzJdID0gZy56OworICAgICAgICAgICAgb3V0RXZlbnQtPm9yaWVudGF0aW9uLmF6aW11dGggPSBnLng7CisgICAgICAgICAgICBvdXRFdmVudC0+b3JpZW50YXRpb24ucGl0Y2ggICA9IGcueTsKKyAgICAgICAgICAgIG91dEV2ZW50LT5vcmllbnRhdGlvbi5yb2xsICAgID0gZy56OworICAgICAgICAgICAgb3V0RXZlbnQtPm9yaWVudGF0aW9uLnN0YXR1cyAgPSBTRU5TT1JfU1RBVFVTX0FDQ1VSQUNZX0hJR0g7CiAgICAgICAgICAgICBvdXRFdmVudC0+c2Vuc29yID0gJ195cHInOwogICAgICAgICAgICAgb3V0RXZlbnQtPnR5cGUgPSBTRU5TT1JfVFlQRV9PUklFTlRBVElPTjsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9Sb3RhdGlvblZlY3RvclNlbnNvci5jcHAgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1JvdGF0aW9uVmVjdG9yU2Vuc29yLmNwcAppbmRleCBjYmE4OWM5Li41ZWE5NTY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1JvdGF0aW9uVmVjdG9yU2Vuc29yLmNwcAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1JvdGF0aW9uVmVjdG9yU2Vuc29yLmNwcApAQCAtMjcsMTEgKzI3LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBjbGFtcChUIHYpIHsKLSAgICByZXR1cm4gdiA8IDAgPyAwIDogdjsKLX0KLQogUm90YXRpb25WZWN0b3JTZW5zb3I6OlJvdGF0aW9uVmVjdG9yU2Vuc29yKCkKICAgICA6IG1TZW5zb3JEZXZpY2UoU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpKSwKICAgICAgIG1TZW5zb3JGdXNpb24oU2Vuc29yRnVzaW9uOjpnZXRJbnN0YW5jZSgpKQpAQCAtNDMsMjkgKzM4LDEyIEBACiB7CiAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUikgewogICAgICAgICBpZiAobVNlbnNvckZ1c2lvbi5oYXNFc3RpbWF0ZSgpKSB7Ci0gICAgICAgICAgICBjb25zdCBtYXQzM190IFIobVNlbnNvckZ1c2lvbi5nZXRSb3RhdGlvbk1hdHJpeCgpKTsKLQotICAgICAgICAgICAgLy8gbWF0cml4IHRvIHJvdGF0aW9uIHZlY3RvciAobm9ybWFsaXplZCBxdWF0ZXJuaW9uKQotICAgICAgICAgICAgY29uc3QgZmxvYXQgSHggPSBSWzBdLng7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCBNeSA9IFJbMV0ueTsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IEF6ID0gUlsyXS56OwotCi0gICAgICAgICAgICBmbG9hdCBxdyA9IHNxcnRmKCBjbGFtcCggSHggKyBNeSArIEF6ICsgMSkgKiAwLjI1ZiApOwotICAgICAgICAgICAgZmxvYXQgcXggPSBzcXJ0ZiggY2xhbXAoIEh4IC0gTXkgLSBBeiArIDEpICogMC4yNWYgKTsKLSAgICAgICAgICAgIGZsb2F0IHF5ID0gc3FydGYoIGNsYW1wKC1IeCArIE15IC0gQXogKyAxKSAqIDAuMjVmICk7Ci0gICAgICAgICAgICBmbG9hdCBxeiA9IHNxcnRmKCBjbGFtcCgtSHggLSBNeSArIEF6ICsgMSkgKiAwLjI1ZiApOwotICAgICAgICAgICAgcXggPSBjb3B5c2lnbmYocXgsIFJbMl0ueSAtIFJbMV0ueik7Ci0gICAgICAgICAgICBxeSA9IGNvcHlzaWduZihxeSwgUlswXS56IC0gUlsyXS54KTsKLSAgICAgICAgICAgIHF6ID0gY29weXNpZ25mKHF6LCBSWzFdLnggLSBSWzBdLnkpOwotCi0gICAgICAgICAgICAvLyB0aGlzIHF1YXRlcm5pb24gaXMgZ3VhcmFudGVlZCB0byBiZSBub3JtYWxpemVkLCBieSBjb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgIC8vIG9mIHRoZSByb3RhdGlvbiBtYXRyaXguCi0KKyAgICAgICAgICAgIGNvbnN0IHZlYzRfdCBxKG1TZW5zb3JGdXNpb24uZ2V0QXR0aXR1ZGUoKSk7CiAgICAgICAgICAgICAqb3V0RXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzBdID0gcXg7Ci0gICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVsxXSA9IHF5OwotICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMl0gPSBxejsKLSAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzNdID0gcXc7CisgICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVswXSA9IHEueDsKKyAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzFdID0gcS55OworICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMl0gPSBxLno7CisgICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVszXSA9IHEudzsKICAgICAgICAgICAgIG91dEV2ZW50LT5zZW5zb3IgPSAnX3Jvdic7CiAgICAgICAgICAgICBvdXRFdmVudC0+dHlwZSA9IFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUjsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtODYsNyArNjQsNyBAQAogICAgIHNlbnNvcl90IGh3U2Vuc29yOwogICAgIGh3U2Vuc29yLm5hbWUgICAgICAgPSAiUm90YXRpb24gVmVjdG9yIFNlbnNvciI7CiAgICAgaHdTZW5zb3IudmVuZG9yICAgICA9ICJHb29nbGUgSW5jLiI7Ci0gICAgaHdTZW5zb3IudmVyc2lvbiAgICA9IG1TZW5zb3JGdXNpb24uaGFzR3lybygpID8gMyA6IDI7CisgICAgaHdTZW5zb3IudmVyc2lvbiAgICA9IDM7CiAgICAgaHdTZW5zb3IuaGFuZGxlICAgICA9ICdfcm92JzsKICAgICBod1NlbnNvci50eXBlICAgICAgID0gU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SOwogICAgIGh3U2Vuc29yLm1heFJhbmdlICAgPSAxOwpAQCAtOTgsNSArNzYsNTQgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0d5cm9EcmlmdFNlbnNvcjo6R3lyb0RyaWZ0U2Vuc29yKCkKKyAgICA6IG1TZW5zb3JEZXZpY2UoU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpKSwKKyAgICAgIG1TZW5zb3JGdXNpb24oU2Vuc29yRnVzaW9uOjpnZXRJbnN0YW5jZSgpKQoreworfQorCitib29sIEd5cm9EcmlmdFNlbnNvcjo6cHJvY2VzcyhzZW5zb3JzX2V2ZW50X3QqIG91dEV2ZW50LAorICAgICAgICBjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KQoreworICAgIGlmIChldmVudC50eXBlID09IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIpIHsKKyAgICAgICAgaWYgKG1TZW5zb3JGdXNpb24uaGFzRXN0aW1hdGUoKSkgeworICAgICAgICAgICAgY29uc3QgdmVjM190IGIobVNlbnNvckZ1c2lvbi5nZXRHeXJvQmlhcygpKTsKKyAgICAgICAgICAgICpvdXRFdmVudCA9IGV2ZW50OworICAgICAgICAgICAgb3V0RXZlbnQtPmRhdGFbMF0gPSBiLng7CisgICAgICAgICAgICBvdXRFdmVudC0+ZGF0YVsxXSA9IGIueTsKKyAgICAgICAgICAgIG91dEV2ZW50LT5kYXRhWzJdID0gYi56OworICAgICAgICAgICAgb3V0RXZlbnQtPnNlbnNvciA9ICdfZ2JzJzsKKyAgICAgICAgICAgIG91dEV2ZW50LT50eXBlID0gU0VOU09SX1RZUEVfQUNDRUxFUk9NRVRFUjsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgR3lyb0RyaWZ0U2Vuc29yOjphY3RpdmF0ZSh2b2lkKiBpZGVudCwgYm9vbCBlbmFibGVkKSB7CisgICAgcmV0dXJuIG1TZW5zb3JGdXNpb24uYWN0aXZhdGUodGhpcywgZW5hYmxlZCk7Cit9CisKK3N0YXR1c190IEd5cm9EcmlmdFNlbnNvcjo6c2V0RGVsYXkodm9pZCogaWRlbnQsIGludCBoYW5kbGUsIGludDY0X3QgbnMpIHsKKyAgICByZXR1cm4gbVNlbnNvckZ1c2lvbi5zZXREZWxheSh0aGlzLCBucyk7Cit9CisKK1NlbnNvciBHeXJvRHJpZnRTZW5zb3I6OmdldFNlbnNvcigpIGNvbnN0IHsKKyAgICBzZW5zb3JfdCBod1NlbnNvcjsKKyAgICBod1NlbnNvci5uYW1lICAgICAgID0gIkd5cm9zY29wZSBCaWFzIChkZWJ1ZykiOworICAgIGh3U2Vuc29yLnZlbmRvciAgICAgPSAiR29vZ2xlIEluYy4iOworICAgIGh3U2Vuc29yLnZlcnNpb24gICAgPSAxOworICAgIGh3U2Vuc29yLmhhbmRsZSAgICAgPSAnX2dicyc7CisgICAgaHdTZW5zb3IudHlwZSAgICAgICA9IFNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVI7CisgICAgaHdTZW5zb3IubWF4UmFuZ2UgICA9IDE7CisgICAgaHdTZW5zb3IucmVzb2x1dGlvbiA9IDEuMGYgLyAoMTw8MjQpOworICAgIGh3U2Vuc29yLnBvd2VyICAgICAgPSBtU2Vuc29yRnVzaW9uLmdldFBvd2VyVXNhZ2UoKTsKKyAgICBod1NlbnNvci5taW5EZWxheSAgID0gbVNlbnNvckZ1c2lvbi5nZXRNaW5EZWxheSgpOworICAgIFNlbnNvciBzZW5zb3IoJmh3U2Vuc29yKTsKKyAgICByZXR1cm4gc2Vuc29yOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvUm90YXRpb25WZWN0b3JTZW5zb3IuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvUm90YXRpb25WZWN0b3JTZW5zb3IuaAppbmRleCBhYzc2NDg3Li5iYjk3ZmUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1JvdGF0aW9uVmVjdG9yU2Vuc29yLmgKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9Sb3RhdGlvblZlY3RvclNlbnNvci5oCkBAIC0yNCw3ICsyNCw2IEBACiAKICNpbmNsdWRlICJTZW5zb3JEZXZpY2UuaCIKICNpbmNsdWRlICJTZW5zb3JJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIuaCIKIAogI2luY2x1ZGUgIkZ1c2lvbi5oIgogI2luY2x1ZGUgIlNlbnNvckZ1c2lvbi5oIgpAQCAtNDcsNiArNDYsMjAgQEAKICAgICB2aXJ0dWFsIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogfTsKIAorY2xhc3MgR3lyb0RyaWZ0U2Vuc29yIDogcHVibGljIFNlbnNvckludGVyZmFjZSB7CisgICAgU2Vuc29yRGV2aWNlJiBtU2Vuc29yRGV2aWNlOworICAgIFNlbnNvckZ1c2lvbiYgbVNlbnNvckZ1c2lvbjsKKworcHVibGljOgorICAgIEd5cm9EcmlmdFNlbnNvcigpOworICAgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHNlbnNvcnNfZXZlbnRfdCogb3V0RXZlbnQsCisgICAgICAgICAgICBjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFjdGl2YXRlKHZvaWQqIGlkZW50LCBib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGVsYXkodm9pZCogaWRlbnQsIGludCBoYW5kbGUsIGludDY0X3QgbnMpOworICAgIHZpcnR1YWwgU2Vuc29yIGdldFNlbnNvcigpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Cit9OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmNwcCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2ZGQ0Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0KLSNpbmNsdWRlICJTZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIuaCIKLSNpbmNsdWRlICJ2ZWMuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXI6OlNlY29uZE9yZGVyTG93UGFzc0ZpbHRlcihmbG9hdCBRLCBmbG9hdCBmYykKLSAgICA6IGlRKDEuMGYgLyBRKSwgZmMoZmMpCi17Ci19Ci0KLXZvaWQgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyOjpzZXRTYW1wbGluZ1BlcmlvZChmbG9hdCBkVCkKLXsKLSAgICBLID0gdGFuZihmbG9hdChNX1BJKSAqIGZjICogZFQpOwotICAgIGlEID0gMS4wZiAvIChLKksgKyBLKmlRICsgMSk7Ci0gICAgYTAgPSBLKksqaUQ7Ci0gICAgYTEgPSAyLjBmICogYTA7Ci0gICAgYjEgPSAyLjBmKihLKksgLSAxKSppRDsKLSAgICBiMiA9IChLKksgLSBLKmlRICsgMSkqaUQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotQmlxdWFkRmlsdGVyPFQ+OjpCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKQotICAgIDogcyhzKQotewotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotVCBCaXF1YWRGaWx0ZXI8VD46OmluaXQoY29uc3QgVCYgeCkKLXsKLSAgICB4MSA9IHgyID0geDsKLSAgICB5MSA9IHkyID0geDsKLSAgICByZXR1cm4geDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLVQgQmlxdWFkRmlsdGVyPFQ+OjpvcGVyYXRvcigpKGNvbnN0IFQmIHgpCi17Ci0gICAgVCB5ID0gKHggKyB4Mikqcy5hMCArIHgxKnMuYTEgLSB5MSpzLmIxIC0geTIqcy5iMjsKLSAgICB4MiA9IHgxOwotICAgIHkyID0geTE7Ci0gICAgeDEgPSB4OwotICAgIHkxID0geTsKLSAgICByZXR1cm4geTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1DYXNjYWRlZEJpcXVhZEZpbHRlcjxUPjo6Q2FzY2FkZWRCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKQotICAgIDogbUEocyksIG1CKHMpCi17Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1UIENhc2NhZGVkQmlxdWFkRmlsdGVyPFQ+Ojppbml0KGNvbnN0IFQmIHgpCi17Ci0gICAgbUEuaW5pdCh4KTsKLSAgICBtQi5pbml0KHgpOwotICAgIHJldHVybiB4OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotVCBDYXNjYWRlZEJpcXVhZEZpbHRlcjxUPjo6b3BlcmF0b3IoKShjb25zdCBUJiB4KQotewotICAgIHJldHVybiBtQihtQSh4KSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSBjbGFzcyBCaXF1YWRGaWx0ZXI8ZmxvYXQ+OwotdGVtcGxhdGUgY2xhc3MgQ2FzY2FkZWRCaXF1YWRGaWx0ZXI8ZmxvYXQ+OwotdGVtcGxhdGUgY2xhc3MgQmlxdWFkRmlsdGVyPHZlYzNfdD47Ci10ZW1wbGF0ZSBjbGFzcyBDYXNjYWRlZEJpcXVhZEZpbHRlcjx2ZWMzX3Q+OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5oIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZWNvbmRPcmRlckxvd1Bhc3NGaWx0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjMjQ0Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlY29uZE9yZGVyTG93UGFzc0ZpbHRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRUNPTkRfT1JERVJfTE9XX1BBU1NfRklMVEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9TRUNPTkRfT1JERVJfTE9XX1BBU1NfRklMVEVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBCaXF1YWRGaWx0ZXI7Ci0KLS8qCi0gKiBTdGF0ZSBvZiBhIDJuZCBvcmRlciBsb3ctcGFzcyBJSVIgZmlsdGVyCi0gKi8KLWNsYXNzIFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlciB7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBmcmllbmQgY2xhc3MgQmlxdWFkRmlsdGVyOwotICAgIGZsb2F0IGlRLCBmYzsKLSAgICBmbG9hdCBLLCBpRDsKLSAgICBmbG9hdCBhMCwgYTE7Ci0gICAgZmxvYXQgYjEsIGIyOwotcHVibGljOgotICAgIFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlcihmbG9hdCBRLCBmbG9hdCBmYyk7Ci0gICAgdm9pZCBzZXRTYW1wbGluZ1BlcmlvZChmbG9hdCBkVCk7Ci19OwotCi0vKgotICogSW1wbGVtZW50cyBhIEJpcXVhZCBJSVIgZmlsdGVyCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBCaXF1YWRGaWx0ZXIgewotICAgIFQgeDEsIHgyOwotICAgIFQgeTEsIHkyOwotICAgIGNvbnN0IFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlciYgczsKLXB1YmxpYzoKLSAgICBCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKTsKLSAgICBUIGluaXQoY29uc3QgVCYgaW4pOwotICAgIFQgb3BlcmF0b3IoKShjb25zdCBUJiBpbik7Ci19OwotCi0vKgotICogVHdvIGNhc2NhZGVkIGJpcXVhZCBJSVIgZmlsdGVycwotICogKDQtcG9sZXMgSUlSKQotICovCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgQ2FzY2FkZWRCaXF1YWRGaWx0ZXIgewotICAgIEJpcXVhZEZpbHRlcjxUPiBtQTsKLSAgICBCaXF1YWRGaWx0ZXI8VD4gbUI7Ci1wdWJsaWM6Ci0gICAgQ2FzY2FkZWRCaXF1YWRGaWx0ZXIoY29uc3QgU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyJiBzKTsKLSAgICBUIGluaXQoY29uc3QgVCYgaW4pOwotICAgIFQgb3BlcmF0b3IoKShjb25zdCBUJiBpbik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NFQ09ORF9PUkRFUl9MT1dfUEFTU19GSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uY3BwIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uY3BwCmluZGV4IGQ0MjI2ZWMxLi40ZWMwYzhjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckZ1c2lvbi5jcHAKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uY3BwCkBAIC0yNSw5ICsyNSw3IEBACiAKIFNlbnNvckZ1c2lvbjo6U2Vuc29yRnVzaW9uKCkKICAgICA6IG1TZW5zb3JEZXZpY2UoU2Vuc29yRGV2aWNlOjpnZXRJbnN0YW5jZSgpKSwKLSAgICAgIG1FbmFibGVkKGZhbHNlKSwgbUhhc0d5cm8oZmFsc2UpLCBtR3lyb1RpbWUoMCksIG1Sb3RhdGlvbk1hdHJpeCgxKSwKLSAgICAgIG1Mb3dQYXNzKE1fU1FSVDFfMiwgMS4wZiksIG1BY2NEYXRhKG1Mb3dQYXNzKSwKLSAgICAgIG1GaWx0ZXJlZE1hZygwLjBmKSwgbUZpbHRlcmVkQWNjKDAuMGYpCisgICAgICBtRW5hYmxlZChmYWxzZSksIG1HeXJvVGltZSgwKQogewogICAgIHNlbnNvcl90IGNvbnN0KiBsaXN0OwogICAgIHNpemVfdCBjb3VudCA9IG1TZW5zb3JEZXZpY2UuZ2V0U2Vuc29yTGlzdCgmbGlzdCk7CkBAIC00Miw1NSArNDAsMzIgQEAKICAgICAgICAgICAgIG1HeXJvID0gU2Vuc29yKGxpc3QgKyBpKTsKICAgICAgICAgICAgIC8vIDIwMCBIeiBmb3IgZ3lybyBldmVudHMgaXMgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBwcmVjaXNpb24KICAgICAgICAgICAgIC8vIGFuZCBwb3dlci9jcHUgdXNhZ2UuCi0gICAgICAgICAgICBtVGFyZ2V0RGVsYXlOcyA9IDEwMDAwMDAwMDBMTC8yMDA7Ci0gICAgICAgICAgICBtR3lyb1JhdGUgPSAxMDAwMDAwMDAwLjBmIC8gbVRhcmdldERlbGF5TnM7Ci0gICAgICAgICAgICBtSGFzR3lybyA9IHRydWU7CisgICAgICAgICAgICBtR3lyb1JhdGUgPSAyMDA7CisgICAgICAgICAgICBtVGFyZ2V0RGVsYXlOcyA9IDEwMDAwMDAwMDBMTC9tR3lyb1JhdGU7CiAgICAgICAgIH0KICAgICB9CiAgICAgbUZ1c2lvbi5pbml0KCk7Ci0gICAgbUFjY0RhdGEuaW5pdCh2ZWMzX3QoMC4wZikpOwogfQogCiB2b2lkIFNlbnNvckZ1c2lvbjo6cHJvY2Vzcyhjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KSB7Ci0KLSAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9HWVJPU0NPUEUgJiYgbUhhc0d5cm8pIHsKKyAgICBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9HWVJPU0NPUEUpIHsKICAgICAgICAgaWYgKG1HeXJvVGltZSAhPSAwKSB7CiAgICAgICAgICAgICBjb25zdCBmbG9hdCBkVCA9IChldmVudC50aW1lc3RhbXAgLSBtR3lyb1RpbWUpIC8gMTAwMDAwMDAwMC4wZjsKICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGZyZXEgPSAxIC8gZFQ7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCBhbHBoYSA9IDIgLyAoMiArIGRUKTsgLy8gMnMgdGltZS1jb25zdGFudAotICAgICAgICAgICAgbUd5cm9SYXRlID0gbUd5cm9SYXRlKmFscGhhICsgIGZyZXEqKDEgLSBhbHBoYSk7CisgICAgICAgICAgICBpZiAoZnJlcSA+PSAxMDAgJiYgZnJlcTwxMDAwKSB7IC8vIGZpbHRlciB2YWx1ZXMgb2J2aW91c2x5IHdyb25nCisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYWxwaGEgPSAxIC8gKDEgKyBkVCk7IC8vIDFzIHRpbWUtY29uc3RhbnQKKyAgICAgICAgICAgICAgICBtR3lyb1JhdGUgPSBmcmVxICsgKG1HeXJvUmF0ZSAtIGZyZXEpKmFscGhhOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1HeXJvVGltZSA9IGV2ZW50LnRpbWVzdGFtcDsKICAgICAgICAgbUZ1c2lvbi5oYW5kbGVHeXJvKHZlYzNfdChldmVudC5kYXRhKSwgMS4wZi9tR3lyb1JhdGUpOwogICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9NQUdORVRJQ19GSUVMRCkgewogICAgICAgICBjb25zdCB2ZWMzX3QgbWFnKGV2ZW50LmRhdGEpOwotICAgICAgICBpZiAobUhhc0d5cm8pIHsKLSAgICAgICAgICAgIG1GdXNpb24uaGFuZGxlTWFnKG1hZyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCBsKGxlbmd0aChtYWcpKTsKLSAgICAgICAgICAgIGlmIChsPjUgJiYgbDwxMDApIHsKLSAgICAgICAgICAgICAgICBtRmlsdGVyZWRNYWcgPSBtYWcgKiAoMS9sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtRnVzaW9uLmhhbmRsZU1hZyhtYWcpOwogICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBTRU5TT1JfVFlQRV9BQ0NFTEVST01FVEVSKSB7CiAgICAgICAgIGNvbnN0IHZlYzNfdCBhY2MoZXZlbnQuZGF0YSk7Ci0gICAgICAgIGlmIChtSGFzR3lybykgewotICAgICAgICAgICAgbUZ1c2lvbi5oYW5kbGVBY2MoYWNjKTsKLSAgICAgICAgICAgIG1Sb3RhdGlvbk1hdHJpeCA9IG1GdXNpb24uZ2V0Um90YXRpb25NYXRyaXgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IGwobGVuZ3RoKGFjYykpOwotICAgICAgICAgICAgaWYgKGwgPiAwLjk4MWYpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGxpbmVhci1hY2NlbGVyYXRpb24gY29tcG9uZW50cwotICAgICAgICAgICAgICAgIG1GaWx0ZXJlZEFjYyA9IG1BY2NEYXRhKGFjYyAqICgxL2wpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZW5ndGgobUZpbHRlcmVkQWNjKT4wICYmIGxlbmd0aChtRmlsdGVyZWRNYWcpPjApIHsKLSAgICAgICAgICAgICAgICB2ZWMzX3QgdXAobUZpbHRlcmVkQWNjKTsKLSAgICAgICAgICAgICAgICB2ZWMzX3QgZWFzdChjcm9zc19wcm9kdWN0KG1GaWx0ZXJlZE1hZywgdXApKTsKLSAgICAgICAgICAgICAgICBlYXN0ICo9IDEvbGVuZ3RoKGVhc3QpOwotICAgICAgICAgICAgICAgIHZlYzNfdCBub3J0aChjcm9zc19wcm9kdWN0KHVwLCBlYXN0KSk7Ci0gICAgICAgICAgICAgICAgbVJvdGF0aW9uTWF0cml4IDw8IGVhc3QgPDwgbm9ydGggPDwgdXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUZ1c2lvbi5oYW5kbGVBY2MoYWNjKTsKKyAgICAgICAgbUF0dGl0dWRlID0gbUZ1c2lvbi5nZXRBdHRpdHVkZSgpOwogICAgIH0KIH0KIApAQCAtMTE2LDQwICs5MSwzMSBAQAogCiAgICAgbVNlbnNvckRldmljZS5hY3RpdmF0ZShpZGVudCwgbUFjYy5nZXRIYW5kbGUoKSwgZW5hYmxlZCk7CiAgICAgbVNlbnNvckRldmljZS5hY3RpdmF0ZShpZGVudCwgbU1hZy5nZXRIYW5kbGUoKSwgZW5hYmxlZCk7Ci0gICAgaWYgKG1IYXNHeXJvKSB7Ci0gICAgICAgIG1TZW5zb3JEZXZpY2UuYWN0aXZhdGUoaWRlbnQsIG1HeXJvLmdldEhhbmRsZSgpLCBlbmFibGVkKTsKLSAgICB9CisgICAgbVNlbnNvckRldmljZS5hY3RpdmF0ZShpZGVudCwgbUd5cm8uZ2V0SGFuZGxlKCksIGVuYWJsZWQpOwogCiAgICAgY29uc3QgYm9vbCBuZXdTdGF0ZSA9IG1DbGllbnRzLnNpemUoKSAhPSAwOwogICAgIGlmIChuZXdTdGF0ZSAhPSBtRW5hYmxlZCkgewogICAgICAgICBtRW5hYmxlZCA9IG5ld1N0YXRlOwogICAgICAgICBpZiAobmV3U3RhdGUpIHsKICAgICAgICAgICAgIG1GdXNpb24uaW5pdCgpOworICAgICAgICAgICAgbUd5cm9UaW1lID0gMDsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IFNlbnNvckZ1c2lvbjo6c2V0RGVsYXkodm9pZCogaWRlbnQsIGludDY0X3QgbnMpIHsKLSAgICBpZiAobUhhc0d5cm8pIHsKLSAgICAgICAgbVNlbnNvckRldmljZS5zZXREZWxheShpZGVudCwgbUFjYy5nZXRIYW5kbGUoKSwgbnMpOwotICAgICAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KGlkZW50LCBtTWFnLmdldEhhbmRsZSgpLCBtczJucygyMCkpOwotICAgICAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KGlkZW50LCBtR3lyby5nZXRIYW5kbGUoKSwgbVRhcmdldERlbGF5TnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHN0YXRpYyBkb3VibGUgTlMyUyA9IDEuMCAvIDEwMDAwMDAwMDAuMDsKLSAgICAgICAgbVNlbnNvckRldmljZS5zZXREZWxheShpZGVudCwgbUFjYy5nZXRIYW5kbGUoKSwgbnMpOwotICAgICAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KGlkZW50LCBtTWFnLmdldEhhbmRsZSgpLCBtYXgobnMsIG1NYWcuZ2V0TWluRGVsYXlOcygpKSk7Ci0gICAgICAgIG1Mb3dQYXNzLnNldFNhbXBsaW5nUGVyaW9kKG5zKk5TMlMpOwotICAgIH0KKyAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KGlkZW50LCBtQWNjLmdldEhhbmRsZSgpLCBucyk7CisgICAgbVNlbnNvckRldmljZS5zZXREZWxheShpZGVudCwgbU1hZy5nZXRIYW5kbGUoKSwgbXMybnMoMjApKTsKKyAgICBtU2Vuc29yRGV2aWNlLnNldERlbGF5KGlkZW50LCBtR3lyby5nZXRIYW5kbGUoKSwgbVRhcmdldERlbGF5TnMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogCiBmbG9hdCBTZW5zb3JGdXNpb246OmdldFBvd2VyVXNhZ2UoKSBjb25zdCB7Ci0gICAgZmxvYXQgcG93ZXIgPSBtQWNjLmdldFBvd2VyVXNhZ2UoKSArIG1NYWcuZ2V0UG93ZXJVc2FnZSgpOwotICAgIGlmIChtSGFzR3lybykgewotICAgICAgICBwb3dlciArPSBtR3lyby5nZXRQb3dlclVzYWdlKCk7Ci0gICAgfQorICAgIGZsb2F0IHBvd2VyID0gICBtQWNjLmdldFBvd2VyVXNhZ2UoKSArCisgICAgICAgICAgICAgICAgICAgIG1NYWcuZ2V0UG93ZXJVc2FnZSgpICsKKyAgICAgICAgICAgICAgICAgICAgbUd5cm8uZ2V0UG93ZXJVc2FnZSgpOwogICAgIHJldHVybiBwb3dlcjsKIH0KIApAQCAtMTU5LDE3ICsxMjUsMTcgQEAKIAogdm9pZCBTZW5zb3JGdXNpb246OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSB7CiAgICAgY29uc3QgRnVzaW9uJiBmdXNpb24obUZ1c2lvbik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRnVzaW9uICglcykgJXMgKCVkIGNsaWVudHMpLCBneXJvLXJhdGU9JTcuMmZIeiwgIgotICAgICAgICAgICAgIk1SUFM9PCAlZywgJWcsICVnID4gKCVnKSwgIgotICAgICAgICAgICAgIkJJQVM9PCAlZywgJWcsICVnID5cbiIsCi0gICAgICAgICAgICBtSGFzR3lybyA/ICI5LWF4aXMiIDogIjYtYXhpcyIsCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiOS1heGlzIGZ1c2lvbiAlcyAoJWQgY2xpZW50cyksIGd5cm8tcmF0ZT0lNy4yZkh6LCAiCisgICAgICAgICAgICAicT08ICVnLCAlZywgJWcsICVnID4gKCVnKSwgIgorICAgICAgICAgICAgImI9PCAlZywgJWcsICVnID5cbiIsCiAgICAgICAgICAgICBtRW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCiAgICAgICAgICAgICBtQ2xpZW50cy5zaXplKCksCiAgICAgICAgICAgICBtR3lyb1JhdGUsCiAgICAgICAgICAgICBmdXNpb24uZ2V0QXR0aXR1ZGUoKS54LAogICAgICAgICAgICAgZnVzaW9uLmdldEF0dGl0dWRlKCkueSwKICAgICAgICAgICAgIGZ1c2lvbi5nZXRBdHRpdHVkZSgpLnosCi0gICAgICAgICAgICBkb3RfcHJvZHVjdChmdXNpb24uZ2V0QXR0aXR1ZGUoKSwgZnVzaW9uLmdldEF0dGl0dWRlKCkpLAorICAgICAgICAgICAgZnVzaW9uLmdldEF0dGl0dWRlKCkudywKKyAgICAgICAgICAgIGxlbmd0aChmdXNpb24uZ2V0QXR0aXR1ZGUoKSksCiAgICAgICAgICAgICBmdXNpb24uZ2V0QmlhcygpLngsCiAgICAgICAgICAgICBmdXNpb24uZ2V0QmlhcygpLnksCiAgICAgICAgICAgICBmdXNpb24uZ2V0QmlhcygpLnopOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yRnVzaW9uLmgKaW5kZXggYzdlYWIxMi4uNGM5OWJjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JGdXNpb24uaAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvckZ1c2lvbi5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgogCiAjaW5jbHVkZSAiRnVzaW9uLmgiCi0jaW5jbHVkZSAiU2Vjb25kT3JkZXJMb3dQYXNzRmlsdGVyLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NSwxNSArNDQsMTAgQEAKICAgICBTZW5zb3IgbUd5cm87CiAgICAgRnVzaW9uIG1GdXNpb247CiAgICAgYm9vbCBtRW5hYmxlZDsKLSAgICBib29sIG1IYXNHeXJvOwogICAgIGZsb2F0IG1HeXJvUmF0ZTsKICAgICBuc2Vjc190IG1UYXJnZXREZWxheU5zOwogICAgIG5zZWNzX3QgbUd5cm9UaW1lOwotICAgIG1hdDMzX3QgbVJvdGF0aW9uTWF0cml4OwotICAgIFNlY29uZE9yZGVyTG93UGFzc0ZpbHRlciBtTG93UGFzczsKLSAgICBCaXF1YWRGaWx0ZXI8dmVjM190PiBtQWNjRGF0YTsKLSAgICB2ZWMzX3QgbUZpbHRlcmVkTWFnOwotICAgIHZlYzNfdCBtRmlsdGVyZWRBY2M7CisgICAgdmVjNF90IG1BdHRpdHVkZTsKICAgICBTb3J0ZWRWZWN0b3I8dm9pZCo+IG1DbGllbnRzOwogCiAgICAgU2Vuc29yRnVzaW9uKCk7CkBAIC02Miw5ICs1Niw5IEBACiAgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHNlbnNvcnNfZXZlbnRfdCYgZXZlbnQpOwogCiAgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtRW5hYmxlZDsgfQotICAgIGJvb2wgaGFzR3lybygpIGNvbnN0IHsgcmV0dXJuIG1IYXNHeXJvOyB9Ci0gICAgYm9vbCBoYXNFc3RpbWF0ZSgpIGNvbnN0IHsgcmV0dXJuICFtSGFzR3lybyB8fCBtRnVzaW9uLmhhc0VzdGltYXRlKCk7IH0KLSAgICBtYXQzM190IGdldFJvdGF0aW9uTWF0cml4KCkgY29uc3QgeyByZXR1cm4gbVJvdGF0aW9uTWF0cml4OyB9CisgICAgYm9vbCBoYXNFc3RpbWF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1GdXNpb24uaGFzRXN0aW1hdGUoKTsgfQorICAgIG1hdDMzX3QgZ2V0Um90YXRpb25NYXRyaXgoKSBjb25zdCB7IHJldHVybiBtRnVzaW9uLmdldFJvdGF0aW9uTWF0cml4KCk7IH0KKyAgICB2ZWM0X3QgZ2V0QXR0aXR1ZGUoKSBjb25zdCB7IHJldHVybiBtQXR0aXR1ZGU7IH0KICAgICB2ZWMzX3QgZ2V0R3lyb0JpYXMoKSBjb25zdCB7IHJldHVybiBtRnVzaW9uLmdldEJpYXMoKTsgfQogICAgIGZsb2F0IGdldEVzdGltYXRlZFJhdGUoKSBjb25zdCB7IHJldHVybiBtR3lyb1JhdGU7IH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5jcHAKaW5kZXggNWI4NmQxMC4uMGFlNzkyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvclNlcnZpY2UuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKwogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDYsNiArNDgsMTUgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisvKgorICogTm90ZXM6CisgKgorICogLSB3aGF0IGFib3V0IGEgZ3lyby1jb3JyZWN0ZWQgbWFnbmV0aWMtZmllbGQgc2Vuc29yPworICogLSBydW4gbWFnIHNlbnNvciBmcm9tIHRpbWUgdG8gdGltZSB0byBmb3JjZSBjYWxpYnJhdGlvbgorICogLSBncmF2aXR5IHNlbnNvciBsZW5ndGggaXMgd3JvbmcgKD0+IGRyaWZ0IGluIGxpbmVhci1hY2Mgc2Vuc29yKQorICoKKyAqLworCiBTZW5zb3JTZXJ2aWNlOjpTZW5zb3JTZXJ2aWNlKCkKICAgICA6IG1EdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKQpAQCAtNTksNiArNzAsOCBAQAogICAgIFNlbnNvckRldmljZSYgZGV2KFNlbnNvckRldmljZTo6Z2V0SW5zdGFuY2UoKSk7CiAKICAgICBpZiAoZGV2LmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNzaXplX3Qgb3JpZW50YXRpb25JbmRleCA9IC0xOworICAgICAgICBib29sIGhhc0d5cm8gPSBmYWxzZTsKICAgICAgICAgdWludDMyX3QgdmlydHVhbFNlbnNvcnNOZWVkcyA9CiAgICAgICAgICAgICAgICAgKDE8PFNFTlNPUl9UWVBFX0dSQVZJVFkpIHwKICAgICAgICAgICAgICAgICAoMTw8U0VOU09SX1RZUEVfTElORUFSX0FDQ0VMRVJBVElPTikgfApAQCAtNjksNiArODIsMTIgQEAKICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICAgICAgcmVnaXN0ZXJTZW5zb3IoIG5ldyBIYXJkd2FyZVNlbnNvcihsaXN0W2ldKSApOwogICAgICAgICAgICAgc3dpdGNoIChsaXN0W2ldLnR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbkluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9HWVJPU0NPUEU6CisgICAgICAgICAgICAgICAgICAgIGhhc0d5cm8gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFTlNPUl9UWVBFX0dSQVZJVFk6CiAgICAgICAgICAgICAgICAgY2FzZSBTRU5TT1JfVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OOgogICAgICAgICAgICAgICAgIGNhc2UgU0VOU09SX1RZUEVfUk9UQVRJT05fVkVDVE9SOgpAQCAtODIsMjEgKzEwMSwzOCBAQAogICAgICAgICAvLyByZWdpc3RlcmVkKQogICAgICAgICBjb25zdCBTZW5zb3JGdXNpb24mIGZ1c2lvbihTZW5zb3JGdXNpb246OmdldEluc3RhbmNlKCkpOwogCi0gICAgICAgIC8vIEFsd2F5cyBpbnN0YW50aWF0ZSBBbmRyb2lkJ3MgdmlydHVhbCBzZW5zb3JzLiBTaW5jZSB0aGV5IGFyZQotICAgICAgICAvLyBpbnN0YW50aWF0ZWQgYmVoaW5kIHNlbnNvcnMgZnJvbSB0aGUgSEFMLCB0aGV5IHdvbid0Ci0gICAgICAgIC8vIGludGVyZmVyZSB3aXRoIGFwcGxpY2F0aW9ucywgdW5sZXNzIHRoZXkgbG9va3Mgc3BlY2lmaWNhbGx5Ci0gICAgICAgIC8vIGZvciB0aGVtIChieSBuYW1lKS4KKyAgICAgICAgaWYgKGhhc0d5cm8pIHsKKyAgICAgICAgICAgIC8vIEFsd2F5cyBpbnN0YW50aWF0ZSBBbmRyb2lkJ3MgdmlydHVhbCBzZW5zb3JzLiBTaW5jZSB0aGV5IGFyZQorICAgICAgICAgICAgLy8gaW5zdGFudGlhdGVkIGJlaGluZCBzZW5zb3JzIGZyb20gdGhlIEhBTCwgdGhleSB3b24ndAorICAgICAgICAgICAgLy8gaW50ZXJmZXJlIHdpdGggYXBwbGljYXRpb25zLCB1bmxlc3MgdGhleSBsb29rcyBzcGVjaWZpY2FsbHkKKyAgICAgICAgICAgIC8vIGZvciB0aGVtIChieSBuYW1lKS4KIAotICAgICAgICByZWdpc3RlclZpcnR1YWxTZW5zb3IoIG5ldyBSb3RhdGlvblZlY3RvclNlbnNvcigpICk7Ci0gICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IEdyYXZpdHlTZW5zb3IobGlzdCwgY291bnQpICk7Ci0gICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IExpbmVhckFjY2VsZXJhdGlvblNlbnNvcihsaXN0LCBjb3VudCkgKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IFJvdGF0aW9uVmVjdG9yU2Vuc29yKCkgKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyVmlydHVhbFNlbnNvciggbmV3IEdyYXZpdHlTZW5zb3IobGlzdCwgY291bnQpICk7CisgICAgICAgICAgICByZWdpc3RlclZpcnR1YWxTZW5zb3IoIG5ldyBMaW5lYXJBY2NlbGVyYXRpb25TZW5zb3IobGlzdCwgY291bnQpICk7CiAKLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIGd5cm8sIHdlIGhhdmUgdGhlIG9wdGlvbiBvZiBlbmFibGluZyB0aGVzZQotICAgICAgICAvLyAiYmV0dGVyIiBvcmllbnRhdGlvbiBhbmQgZ3lybyBzZW5zb3JzCi0gICAgICAgIGlmIChmdXNpb24uaGFzR3lybygpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogT3JpZW50YXRpb25TZW5zb3IgYnVnZ3kgd2hlbiBub3QgcG9pbnRpbmcgbm9ydGgKKyAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBvcHRpb25hbAogICAgICAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsU2Vuc29yKCBuZXcgT3JpZW50YXRpb25TZW5zb3IoKSApOwogICAgICAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsU2Vuc29yKCBuZXcgQ29ycmVjdGVkR3lyb1NlbnNvcihsaXN0LCBjb3VudCkgKTsKKworICAgICAgICAgICAgLy8gdmlydHVhbCBkZWJ1Z2dpbmcgc2Vuc29ycy4uLgorICAgICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5zZW5zb3JzIiwgdmFsdWUsICIwIik7CisgICAgICAgICAgICBpZiAoYXRvaSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlclZpcnR1YWxTZW5zb3IoIG5ldyBHeXJvRHJpZnRTZW5zb3IoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlbnNvciBsaXN0IHJldHVybmVkIHRvIHVzZXJzCisgICAgICAgIG1Vc2VyU2Vuc29yTGlzdCA9IG1TZW5zb3JMaXN0OworICAgICAgICBpZiAoaGFzR3lybyAmJgorICAgICAgICAgICAgICAgICh2aXJ0dWFsU2Vuc29yc05lZWRzICYgKDE8PFNFTlNPUl9UWVBFX1JPVEFUSU9OX1ZFQ1RPUikpKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIHRoZSBmYW5jeSBzZW5zb3IgZnVzaW9uLCBhbmQgaXQncyBub3QgcHJvdmlkZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBIQUwsIHVzZSBvdXIgb3duIChmdXNlZCkgb3JpZW50YXRpb24gc2Vuc29yIGJ5IHJlbW92aW5nIHRoZQorICAgICAgICAgICAgLy8gSEFMIHN1cHBsaWVkIG9uZSBmb3JtIHRoZSB1c2VyIGxpc3QuCisgICAgICAgICAgICBpZiAob3JpZW50YXRpb25JbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbVVzZXJTZW5zb3JMaXN0LnJlbW92ZUl0ZW1zQXQob3JpZW50YXRpb25JbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBydW4oIlNlbnNvclNlcnZpY2UiLCBQUklPUklUWV9VUkdFTlRfRElTUExBWSk7CkBAIC0yOTQsOSArMzMwLDkgQEAKIH0KIAogU3RyaW5nOCBTZW5zb3JTZXJ2aWNlOjpnZXRTZW5zb3JOYW1lKGludCBoYW5kbGUpIGNvbnN0IHsKLSAgICBzaXplX3QgY291bnQgPSBtU2Vuc29yTGlzdC5zaXplKCk7CisgICAgc2l6ZV90IGNvdW50ID0gbVVzZXJTZW5zb3JMaXN0LnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IFNlbnNvciYgc2Vuc29yKG1TZW5zb3JMaXN0W2ldKTsKKyAgICAgICAgY29uc3QgU2Vuc29yJiBzZW5zb3IobVVzZXJTZW5zb3JMaXN0W2ldKTsKICAgICAgICAgaWYgKHNlbnNvci5nZXRIYW5kbGUoKSA9PSBoYW5kbGUpIHsKICAgICAgICAgICAgIHJldHVybiBzZW5zb3IuZ2V0TmFtZSgpOwogICAgICAgICB9CkBAIC0zMDcsNyArMzQzLDcgQEAKIAogVmVjdG9yPFNlbnNvcj4gU2Vuc29yU2VydmljZTo6Z2V0U2Vuc29yTGlzdCgpCiB7Ci0gICAgcmV0dXJuIG1TZW5zb3JMaXN0OworICAgIHJldHVybiBtVXNlclNlbnNvckxpc3Q7CiB9CiAKIHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+IFNlbnNvclNlcnZpY2U6OmNyZWF0ZVNlbnNvckV2ZW50Q29ubmVjdGlvbigpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvclNlcnZpY2UuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCmluZGV4IDc3YTdlMzQuLjRkMGYxZDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCkBAIC0xMTQsNiArMTE0LDcgQEAKIAogICAgIC8vIGNvbnN0YW50cwogICAgIFZlY3RvcjxTZW5zb3I+IG1TZW5zb3JMaXN0OworICAgIFZlY3RvcjxTZW5zb3I+IG1Vc2VyU2Vuc29yTGlzdDsKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50LCBTZW5zb3JJbnRlcmZhY2UqPiBtU2Vuc29yTWFwOwogICAgIFZlY3RvcjxTZW5zb3JJbnRlcmZhY2UgKj4gbVZpcnR1YWxTZW5zb3JMaXN0OwogICAgIFBlcm1pc3Npb24gbUR1bXA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3F1YXQuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvcXVhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYTFhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3F1YXQuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1FVQVRfSAorI2RlZmluZSBBTkRST0lEX1FVQVRfSAorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAidmVjLmgiCisjaW5jbHVkZSAibWF0LmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KK21hdDxUWVBFLCAzLCAzPiBxdWF0VG9NYXRyaXgoY29uc3QgdmVjPFRZUEUsIDQ+JiBxKSB7CisgICAgbWF0PFRZUEUsIDMsIDM+IFI7CisgICAgVFlQRSBxMChxLncpOworICAgIFRZUEUgcTEocS54KTsKKyAgICBUWVBFIHEyKHEueSk7CisgICAgVFlQRSBxMyhxLnopOworICAgIFRZUEUgc3FfcTEgPSAyICogcTEgKiBxMTsKKyAgICBUWVBFIHNxX3EyID0gMiAqIHEyICogcTI7CisgICAgVFlQRSBzcV9xMyA9IDIgKiBxMyAqIHEzOworICAgIFRZUEUgcTFfcTIgPSAyICogcTEgKiBxMjsKKyAgICBUWVBFIHEzX3EwID0gMiAqIHEzICogcTA7CisgICAgVFlQRSBxMV9xMyA9IDIgKiBxMSAqIHEzOworICAgIFRZUEUgcTJfcTAgPSAyICogcTIgKiBxMDsKKyAgICBUWVBFIHEyX3EzID0gMiAqIHEyICogcTM7CisgICAgVFlQRSBxMV9xMCA9IDIgKiBxMSAqIHEwOworICAgIFJbMF1bMF0gPSAxIC0gc3FfcTIgLSBzcV9xMzsKKyAgICBSWzBdWzFdID0gcTFfcTIgLSBxM19xMDsKKyAgICBSWzBdWzJdID0gcTFfcTMgKyBxMl9xMDsKKyAgICBSWzFdWzBdID0gcTFfcTIgKyBxM19xMDsKKyAgICBSWzFdWzFdID0gMSAtIHNxX3ExIC0gc3FfcTM7CisgICAgUlsxXVsyXSA9IHEyX3EzIC0gcTFfcTA7CisgICAgUlsyXVswXSA9IHExX3EzIC0gcTJfcTA7CisgICAgUlsyXVsxXSA9IHEyX3EzICsgcTFfcTA7CisgICAgUlsyXVsyXSA9IDEgLSBzcV9xMSAtIHNxX3EyOworICAgIHJldHVybiBSOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KK3ZlYzxUWVBFLCA0PiBtYXRyaXhUb1F1YXQoY29uc3QgbWF0PFRZUEUsIDMsIDM+JiBSKSB7CisgICAgLy8gbWF0cml4IHRvIHF1YXRlcm5pb24KKworICAgIHN0cnVjdCB7CisgICAgICAgIGlubGluZSBUWVBFIG9wZXJhdG9yKCkoVFlQRSB2KSB7CisgICAgICAgICAgICByZXR1cm4gdiA8IDAgPyAwIDogdjsKKyAgICAgICAgfQorICAgIH0gY2xhbXA7CisKKyAgICB2ZWM8VFlQRSwgND4gcTsKKyAgICBjb25zdCBmbG9hdCBIeCA9IFJbMF0ueDsKKyAgICBjb25zdCBmbG9hdCBNeSA9IFJbMV0ueTsKKyAgICBjb25zdCBmbG9hdCBBeiA9IFJbMl0uejsKKyAgICBxLnggPSBzcXJ0ZiggY2xhbXAoIEh4IC0gTXkgLSBBeiArIDEpICogMC4yNWYgKTsKKyAgICBxLnkgPSBzcXJ0ZiggY2xhbXAoLUh4ICsgTXkgLSBBeiArIDEpICogMC4yNWYgKTsKKyAgICBxLnogPSBzcXJ0ZiggY2xhbXAoLUh4IC0gTXkgKyBBeiArIDEpICogMC4yNWYgKTsKKyAgICBxLncgPSBzcXJ0ZiggY2xhbXAoIEh4ICsgTXkgKyBBeiArIDEpICogMC4yNWYgKTsKKyAgICBxLnggPSBjb3B5c2lnbmYocS54LCBSWzJdLnkgLSBSWzFdLnopOworICAgIHEueSA9IGNvcHlzaWduZihxLnksIFJbMF0ueiAtIFJbMl0ueCk7CisgICAgcS56ID0gY29weXNpZ25mKHEueiwgUlsxXS54IC0gUlswXS55KTsKKyAgICAvLyBndWFyYW50ZWVkIHRvIGJlIHVuaXQtcXVhdGVybmlvbgorICAgIHJldHVybiBxOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KK3ZlYzxUWVBFLCA0PiBub3JtYWxpemVfcXVhdChjb25zdCB2ZWM8VFlQRSwgND4mIHEpIHsKKyAgICB2ZWM8VFlQRSwgND4gcihxKTsKKyAgICBpZiAoci53IDwgMCkgeworICAgICAgICByID0gLXI7CisgICAgfQorICAgIHJldHVybiBub3JtYWxpemUocik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgdmVjNF90IHF1YXRfdDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKiBBTkRST0lEX1FVQVRfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc2Vuc29yc2VydmljZS92ZWMuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvdmVjLmgKaW5kZXggNzM2ZmYzNy4uZjc0Y2NjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc2Vuc29yc2VydmljZS92ZWMuaAorKysgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL3ZlYy5oCkBAIC0yMDgsNiArMjA4LDE1IEBACiB9CiAKIHRlbXBsYXRlIDwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgUz4gY2xhc3MgViwKKyAgICB0eXBlbmFtZSBUWVBFLAorICAgIHNpemVfdCBTSVpFCis+CitWPFRZUEUsIFNJWkU+IFBVUkUgbm9ybWFsaXplKGNvbnN0IFY8VFlQRSwgU0laRT4mIHYpIHsKKyAgICByZXR1cm4gdiAqICgxL2xlbmd0aCh2KSk7Cit9CisKK3RlbXBsYXRlIDwKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgUz4gY2xhc3MgVkxIUywKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzaXplX3QgUz4gY2xhc3MgVlJIUywKICAgICB0eXBlbmFtZSBUWVBFCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA5ZGFhYWQ4Li5jNjE4MjYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKQEAgLTIsMTggKzIsMTggQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgY2x6LmNwcC5hcm0gXAotICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwIFwKKyAgICBMYXllci5jcHAgCQkJCQkJCQlcCisgICAgTGF5ZXJCYXNlLmNwcCAJCQkJCQkJXAorICAgIExheWVyRGltLmNwcCAJCQkJCQkJXAorICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwIAlcCiAgICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwIFwKLSAgICBEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgXAotICAgIEdMRXh0ZW5zaW9ucy5jcHAgXAotICAgIExheWVyLmNwcCBcCi0gICAgTGF5ZXJCYXNlLmNwcCBcCi0gICAgTGF5ZXJEaW0uY3BwIFwKLSAgICBNZXNzYWdlUXVldWUuY3BwIFwKLSAgICBTdXJmYWNlRmxpbmdlci5jcHAgXAotICAgIFRleHR1cmVNYW5hZ2VyLmNwcCBcCi0gICAgVHJhbnNmb3JtLmNwcAorICAgIERpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcCAJCQlcCisgICAgR0xFeHRlbnNpb25zLmNwcCAJCQkJCQlcCisgICAgTWVzc2FnZVF1ZXVlLmNwcCAJCQkJCQlcCisgICAgU3VyZmFjZUZsaW5nZXIuY3BwIAkJCQkJCVwKKyAgICBTdXJmYWNlVGV4dHVyZUxheWVyLmNwcCAJCQkJXAorICAgIFRyYW5zZm9ybS5jcHAgCQkJCQkJCVwKKyAgICAKIAogTE9DQUxfQ0ZMQUdTOj0gLURMT0dfVEFHPVwiU3VyZmFjZUZsaW5nZXJcIgogTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCmluZGV4IDhkZjJiOTIuLjJiYWI2YTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKQEAgLTE4LDggKzE4LDkgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zMSwxMiArMzIsMTIgQEAKICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9TdXJmYWNlLmg+CiAKICNpbmNsdWRlICJjbHouaCIKKyNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCisjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKICNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKICNpbmNsdWRlICJMYXllci5oIgogI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgiCi0KKyNpbmNsdWRlICJTdXJmYWNlVGV4dHVyZUxheWVyLmgiCiAKICNkZWZpbmUgREVCVUdfUkVTSVpFICAgIDAKIApAQCAtNTIsMTAyICs1Myw4MyBAQAogTGF5ZXI6OkxheWVyKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLAogICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KQogICAgIDogICBMYXllckJhc2VDbGllbnQoZmxpbmdlciwgZGlzcGxheSwgY2xpZW50KSwKKyAgICAgICAgbVRleHR1cmVOYW1lKC0xVSksCisgICAgICAgIG1RdWV1ZWRGcmFtZXMoMCksCisgICAgICAgIG1DdXJyZW50VHJhbnNmb3JtKDApLAorICAgICAgICBtQ3VycmVudE9wYWNpdHkodHJ1ZSksCiAgICAgICAgIG1Gb3JtYXQoUElYRUxfRk9STUFUX05PTkUpLAogICAgICAgICBtR0xFeHRlbnNpb25zKEdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKSksCi0gICAgICAgIG1OZWVkc0JsZW5kaW5nKHRydWUpLAorICAgICAgICBtT3BhcXVlTGF5ZXIodHJ1ZSksCiAgICAgICAgIG1OZWVkc0RpdGhlcmluZyhmYWxzZSksCiAgICAgICAgIG1TZWN1cmUoZmFsc2UpLAogICAgICAgICBtUHJvdGVjdGVkQnlBcHAoZmFsc2UpLAotICAgICAgICBtVGV4dHVyZU1hbmFnZXIoKSwKLSAgICAgICAgbUJ1ZmZlck1hbmFnZXIobVRleHR1cmVNYW5hZ2VyKSwKLSAgICAgICAgbVdpZHRoKDApLCBtSGVpZ2h0KDApLAotICAgICAgICBtTmVlZHNTY2FsaW5nKGZhbHNlKSwgbUZpeGVkU2l6ZShmYWxzZSkKKyAgICAgICAgbUZpeGVkU2l6ZShmYWxzZSkKIHsKKyAgICBtQ3VycmVudENyb3AubWFrZUludmFsaWQoKTsKKyAgICBnbEdlblRleHR1cmVzKDEsICZtVGV4dHVyZU5hbWUpOworfQorCit2b2lkIExheWVyOjpkZXN0cm95KFJlZkJhc2UgY29uc3QqIGJhc2UpIHsKKyAgICBtRmxpbmdlci0+ZGVzdHJveUxheWVyKHN0YXRpY19jYXN0PExheWVyQmFzZSBjb25zdCo+KGJhc2UpKTsKK30KKwordm9pZCBMYXllcjo6b25GaXJzdFJlZigpCit7CisgICAgTGF5ZXJCYXNlQ2xpZW50OjpvbkZpcnN0UmVmKCk7CisgICAgc2V0RGVzdHJveWVyKHRoaXMpOworCisgICAgc3RydWN0IEZyYW1lUXVldWVkTGlzdGVuZXIgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmU6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgeworICAgICAgICBGcmFtZVF1ZXVlZExpc3RlbmVyKExheWVyKiBsYXllcikgOiBtTGF5ZXIobGF5ZXIpIHsgfQorICAgIHByaXZhdGU6CisgICAgICAgIHdwPExheWVyPiBtTGF5ZXI7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgeworICAgICAgICAgICAgc3A8TGF5ZXI+IHRoYXQobUxheWVyLnByb21vdGUoKSk7CisgICAgICAgICAgICBpZiAodGhhdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhhdC0+b25GcmFtZVF1ZXVlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBtU3VyZmFjZVRleHR1cmUgPSBuZXcgU3VyZmFjZVRleHR1cmVMYXllcihtVGV4dHVyZU5hbWUsIHRoaXMpOworICAgIG1TdXJmYWNlVGV4dHVyZS0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihuZXcgRnJhbWVRdWV1ZWRMaXN0ZW5lcih0aGlzKSk7CisgICAgbVN1cmZhY2VUZXh0dXJlLT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSk7CisgICAgbVN1cmZhY2VUZXh0dXJlLT5zZXRCdWZmZXJDb3VudFNlcnZlcigyKTsKIH0KIAogTGF5ZXI6On5MYXllcigpCiB7Ci0gICAgLy8gRklYTUU6IG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gVUkgdGhyZWFkCi0gICAgRUdMRGlzcGxheSBkcHkobUZsaW5nZXItPmdyYXBoaWNQbGFuZSgwKS5nZXRFR0xEaXNwbGF5KCkpOwotICAgIG1CdWZmZXJNYW5hZ2VyLmRlc3Ryb3koZHB5KTsKKyAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGV4dHVyZU5hbWUpOworfQogCi0gICAgLy8gd2UgY2FuIHVzZSBnZXRVc2VyQ2xpZW50VW5zYWZlIGhlcmUgYmVjYXVzZSB3ZSBrbm93IHdlJ3JlCi0gICAgLy8gc2luZ2xlLXRocmVhZGVkIGF0IHRoYXQgcG9pbnQuCi0gICAgc3A8VXNlckNsaWVudD4gb3VyQ2xpZW50KG1Vc2VyQ2xpZW50UmVmLmdldFVzZXJDbGllbnRVbnNhZmUoKSk7Ci0gICAgaWYgKG91ckNsaWVudCAhPSAwKSB7Ci0gICAgICAgIG91ckNsaWVudC0+ZGV0YWNoTGF5ZXIodGhpcyk7Cit2b2lkIExheWVyOjpvbkZyYW1lUXVldWVkKCkgeworICAgIGlmIChhbmRyb2lkX2F0b21pY19vcigxLCAmbVF1ZXVlZEZyYW1lcykgPT0gMCkgeworICAgICAgICBtRmxpbmdlci0+c2lnbmFsRXZlbnQoKTsKICAgICB9CiB9CiAKLXZvaWQgTGF5ZXI6OmRlc3Ryb3koKSBjb25zdCB7Ci0gICAgbUZsaW5nZXItPmRlc3Ryb3lMYXllcih0aGlzKTsKLX0KLQotc3RhdHVzX3QgTGF5ZXI6OnNldFRva2VuKGNvbnN0IHNwPFVzZXJDbGllbnQ+JiB1c2VyQ2xpZW50LAotICAgICAgICBTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50MzJfdCB0b2tlbikKLXsKLSAgICBzcDxTaGFyZWRCdWZmZXJTZXJ2ZXI+IGxjYmxrID0gbmV3IFNoYXJlZEJ1ZmZlclNlcnZlcigKLSAgICAgICAgICAgIHNoYXJlZENsaWVudCwgdG9rZW4sIG1CdWZmZXJNYW5hZ2VyLmdldERlZmF1bHRCdWZmZXJDb3VudCgpLAotICAgICAgICAgICAgZ2V0SWRlbnRpdHkoKSk7Ci0KLQotICAgIHNwPFVzZXJDbGllbnQ+IG91ckNsaWVudChtVXNlckNsaWVudFJlZi5nZXRDbGllbnQoKSk7Ci0KLSAgICAvKgotICAgICAqICBIZXJlIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB1c2VyQ2xpZW50ICE9IG91ckNsaWVudAotICAgICAqICAoc2VlIFVzZXJDbGllbnQ6OmdldFRva2VuRm9yU3VyZmFjZSgpKS4KLSAgICAgKgotICAgICAqICBXZSByZWxlYXNlIHRoZSB0b2tlbiB1c2VkIGJ5IHRoaXMgc3VyZmFjZSBpbiBvdXJDbGllbnQgYmVsb3cuCi0gICAgICogIFRoaXMgc2hvdWxkIGJlIHNhZmUgdG8gZG8gc28gbm93LCBzaW5jZSB0aGlzIGxheWVyIHdvbid0IGJlIGF0dGFjaGVkCi0gICAgICogIHRvIHRoaXMgY2xpZW50LCBpdCBzaG91bGQgYmUgb2theSB0byByZXVzZSB0aGF0IGlkLgotICAgICAqCi0gICAgICogIElmIHRoaXMgY2F1c2VzIHByb2JsZW1zLCBhbiBvdGhlciBzb2x1dGlvbiB3b3VsZCBiZSB0byBrZWVwIGEgbGlzdAotICAgICAqICBvZiBhbGwgdGhlIHtVc2VyQ2xpZW50LCB0b2tlbn0gZXZlciB1c2VkIGFuZCByZWxlYXNlIHRoZW0gd2hlbiB0aGUKLSAgICAgKiAgTGF5ZXIgaXMgZGVzdHJveWVkLgotICAgICAqCi0gICAgICovCi0KLSAgICBpZiAob3VyQ2xpZW50ICE9IDApIHsKLSAgICAgICAgb3VyQ2xpZW50LT5kZXRhY2hMYXllcih0aGlzKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtVXNlckNsaWVudFJlZi5zZXRUb2tlbih1c2VyQ2xpZW50LCBsY2JsaywgdG9rZW4pOwotICAgIExPR0VfSUYoZXJyICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgIkNsaWVudFJlZjo6c2V0VG9rZW4oJXAsICVwLCAldSkgZmFpbGVkIiwKLSAgICAgICAgICAgIHVzZXJDbGllbnQuZ2V0KCksIGxjYmxrLmdldCgpLCB0b2tlbik7Ci0KLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gZnJlZSB0aGUgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdXJmYWNlCi0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50MzJfdCBMYXllcjo6Z2V0VG9rZW4oKSBjb25zdAotewotICAgIHJldHVybiBtVXNlckNsaWVudFJlZi5nZXRUb2tlbigpOwotfQotCi1zcDxVc2VyQ2xpZW50PiBMYXllcjo6Z2V0Q2xpZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVVzZXJDbGllbnRSZWYuZ2V0Q2xpZW50KCk7Ci19Ci0KIC8vIGNhbGxlZCB3aXRoIFN1cmZhY2VGbGluZ2VyOjptU3RhdGVMb2NrIGFzIHNvb24gYXMgdGhlIGxheWVyIGlzIGVudGVyZWQKIC8vIGluIHRoZSBwdXJnYXRvcnkgbGlzdAogdm9pZCBMYXllcjo6b25SZW1vdmVkKCkKIHsKLSAgICBDbGllbnRSZWY6OkFjY2VzcyBzaGFyZWRDbGllbnQobVVzZXJDbGllbnRSZWYpOwotICAgIFNoYXJlZEJ1ZmZlclNlcnZlciogbGNibGsoc2hhcmVkQ2xpZW50LmdldCgpKTsKLSAgICBpZiAobGNibGspIHsKLSAgICAgICAgLy8gd2FrZSB1cCB0aGUgY29uZGl0aW9uCi0gICAgICAgIGxjYmxrLT5zZXRTdGF0dXMoTk9fSU5JVCk7Ci0gICAgfQogfQogCi1zcDxMYXllckJhc2VDbGllbnQ6OlN1cmZhY2U+IExheWVyOjpjcmVhdGVTdXJmYWNlKCkgY29uc3QKK3NwPElTdXJmYWNlPiBMYXllcjo6Y3JlYXRlU3VyZmFjZSgpCiB7Ci0gICAgc3A8U3VyZmFjZT4gc3VyKG5ldyBTdXJmYWNlTGF5ZXIobUZsaW5nZXIsIGNvbnN0X2Nhc3Q8TGF5ZXIgKj4odGhpcykpKTsKKyAgICBjbGFzcyBCU3VyZmFjZSA6IHB1YmxpYyBCblN1cmZhY2UsIHB1YmxpYyBMYXllckNsZWFuZXIgeworICAgICAgICB3cDxjb25zdCBMYXllcj4gbU93bmVyOworICAgICAgICB2aXJ0dWFsIHNwPElTdXJmYWNlVGV4dHVyZT4gZ2V0U3VyZmFjZVRleHR1cmUoKSBjb25zdCB7CisgICAgICAgICAgICBzcDxJU3VyZmFjZVRleHR1cmU+IHJlczsKKyAgICAgICAgICAgIHNwPGNvbnN0IExheWVyPiB0aGF0KCBtT3duZXIucHJvbW90ZSgpICk7CisgICAgICAgICAgICBpZiAodGhhdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzID0gdGhhdC0+bVN1cmZhY2VUZXh0dXJlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIHB1YmxpYzoKKyAgICAgICAgQlN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPExheWVyPiYgbGF5ZXIpCisgICAgICAgICAgICA6IExheWVyQ2xlYW5lcihmbGluZ2VyLCBsYXllciksIG1Pd25lcihsYXllcikgeyB9CisgICAgfTsKKyAgICBzcDxJU3VyZmFjZT4gc3VyKG5ldyBCU3VyZmFjZShtRmxpbmdlciwgdGhpcykpOwogICAgIHJldHVybiBzdXI7CiB9CiAKQEAgLTE3NSwxNyArMTU3LDE0IEBACiAgICAgY29uc3QgdWludDMyX3QgaHdGbGFncyA9IGh3LmdldEZsYWdzKCk7CiAgICAgCiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICBtV2lkdGggID0gdzsKLSAgICBtSGVpZ2h0ID0gaDsKLQotICAgIG1SZXFGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgbVJlcVdpZHRoID0gdzsKLSAgICBtUmVxSGVpZ2h0ID0gaDsKIAogICAgIG1TZWN1cmUgPSAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplU2VjdXJlKSA/IHRydWUgOiBmYWxzZTsKICAgICBtUHJvdGVjdGVkQnlBcHAgPSAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplUHJvdGVjdGVkQnlBcHApID8gdHJ1ZSA6IGZhbHNlOwotICAgIG1OZWVkc0JsZW5kaW5nID0gKGluZm8uaF9hbHBoYSAtIGluZm8ubF9hbHBoYSkgPiAwICYmCi0gICAgICAgICAgICAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplT3BhcXVlKSA9PSAwOworICAgIG1PcGFxdWVMYXllciA9IChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVPcGFxdWUpOworICAgIG1DdXJyZW50T3BhY2l0eSA9IGdldE9wYWNpdHlGb3JGb3JtYXQoZm9ybWF0KTsKKworICAgIG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlclNpemUodywgaCk7CisgICAgbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KGZvcm1hdCk7CiAKICAgICAvLyB3ZSB1c2UgdGhlIHJlZCBpbmRleAogICAgIGludCBkaXNwbGF5UmVkU2l6ZSA9IGRpc3BsYXlJbmZvLmdldFNpemUoUGl4ZWxGb3JtYXRJbmZvOjpJTkRFWF9SRUQpOwpAQCAtMjE2LDEwICsxOTUsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIFRyYW5zZm9ybSB0cihUcmFuc2Zvcm0obU9yaWVudGF0aW9uKSAqIFRyYW5zZm9ybShtQnVmZmVyVHJhbnNmb3JtKSk7CisgICAgLy8gRklYTUU6IHNob3VsZG4ndCB3ZSB0YWtlIHRoZSBzdGF0ZSdzIHRyYW5zZm9ybSBpbnRvIGFjY291bnQgaGVyZT8KKworICAgIFRyYW5zZm9ybSB0cihUcmFuc2Zvcm0obU9yaWVudGF0aW9uKSAqIFRyYW5zZm9ybShtQ3VycmVudFRyYW5zZm9ybSkpOwogICAgIGh3Y2wtPnRyYW5zZm9ybSA9IHRyLmdldE9yaWVudGF0aW9uKCk7CiAKLSAgICBpZiAobmVlZHNCbGVuZGluZygpKSB7CisgICAgaWYgKCFpc09wYXF1ZSgpKSB7CiAgICAgICAgIGh3Y2wtPmJsZW5kaW5nID0gbVByZW11bHRpcGxpZWRBbHBoYSA/CiAgICAgICAgICAgICAgICAgSFdDX0JMRU5ESU5HX1BSRU1VTFQgOiBIV0NfQkxFTkRJTkdfQ09WRVJBR0U7CiAgICAgfQpAQCAtMjM2LDcgKzIxNyw3IEBACiB9CiAKIHZvaWQgTGF5ZXI6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgewotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CisgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcihtQWN0aXZlQnVmZmVyKTsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBjbGllbnQgbmV2ZXIgZHJldyBpbnRvIHRoaXMgbGF5ZXIgeWV0LAogICAgICAgICAvLyBvciBpZiB3ZSByYW4gb3V0IG9mIG1lbW9yeS4gSW4gdGhhdCBjYXNlLCBkb24ndCBsZXQKQEAgLTI0NywxMSArMjI4LDExIEBACiAgICAgfQogICAgIGh3Y2wtPmhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOwogCi0gICAgaWYgKCFtQnVmZmVyQ3JvcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5sZWZ0ICAgPSBtQnVmZmVyQ3JvcC5sZWZ0OwotICAgICAgICBod2NsLT5zb3VyY2VDcm9wLnRvcCAgICA9IG1CdWZmZXJDcm9wLnRvcDsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5yaWdodCAgPSBtQnVmZmVyQ3JvcC5yaWdodDsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5ib3R0b20gPSBtQnVmZmVyQ3JvcC5ib3R0b207CisgICAgaWYgKGlzQ3JvcHBlZCgpKSB7CisgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AubGVmdCAgID0gbUN1cnJlbnRDcm9wLmxlZnQ7CisgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gbUN1cnJlbnRDcm9wLnRvcDsKKyAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5yaWdodCAgPSBtQ3VycmVudENyb3AucmlnaHQ7CisgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AuYm90dG9tID0gbUN1cnJlbnRDcm9wLmJvdHRvbTsKICAgICB9IGVsc2UgewogICAgICAgICBod2NsLT5zb3VyY2VDcm9wLmxlZnQgICA9IDA7CiAgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKQEAgLTI2MCw1MSArMjQxLDEyIEBACiAgICAgfQogfQogCi12b2lkIExheWVyOjpyZWxvYWRUZXh0dXJlKGNvbnN0IFJlZ2lvbiYgZGlydHkpCi17Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyKG1CdWZmZXJNYW5hZ2VyLmdldEFjdGl2ZUJ1ZmZlcigpKTsKLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgLy8gdGhpcyBzaXR1YXRpb24gY2FuIGhhcHBlbiBpZiB3ZSByYW4gb3V0IG9mIG1lbW9yeSBmb3IgaW5zdGFuY2UuCi0gICAgICAgIC8vIG5vdCBtdWNoIHdlIGNhbiBkby4gY29udGludWUgdG8gdXNlIHdoYXRldmVyIHRleHR1cmUgd2FzIGJvdW5kCi0gICAgICAgIC8vIHRvIHRoaXMgY29udGV4dC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtR0xFeHRlbnNpb25zLmhhdmVEaXJlY3RUZXh0dXJlKCkpIHsKLSAgICAgICAgRUdMRGlzcGxheSBkcHkobUZsaW5nZXItPmdyYXBoaWNQbGFuZSgwKS5nZXRFR0xEaXNwbGF5KCkpOwotICAgICAgICBpZiAobUJ1ZmZlck1hbmFnZXIuaW5pdEVnbEltYWdlKGRweSwgYnVmZmVyKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gbm90IHN1cmUgd2hhdCB3ZSBjYW4gZG8gaGVyZS4uLgotICAgICAgICAgICAgZ290byBzbG93cGF0aDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci1zbG93cGF0aDoKLSAgICAgICAgR0dMU3VyZmFjZSB0OwotICAgICAgICBpZiAoYnVmZmVyLT51c2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBidWZmZXItPmxvY2soJnQsIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTik7Ci0gICAgICAgICAgICBMT0dFX0lGKHJlcywgImVycm9yICVkICglcykgbG9ja2luZyBidWZmZXIgJXAiLAotICAgICAgICAgICAgICAgICAgICByZXMsIHN0cmVycm9yKHJlcyksIGJ1ZmZlci5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlck1hbmFnZXIubG9hZFRleHR1cmUoZGlydHksIHQpOwotICAgICAgICAgICAgICAgIGJ1ZmZlci0+dW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3ZSBjYW4ndCBkbyBhbnl0aGluZwotICAgICAgICB9Ci0gICAgfQorc3RhdGljIGlubGluZSB1aW50MTZfdCBwYWNrNTY1KGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgICByZXR1cm4gKHI8PDExKXwoZzw8NSl8YjsKIH0KLQotdm9pZCBMYXllcjo6ZHJhd0ZvclNyZWVuU2hvdCgpIGNvbnN0Ci17Ci0gICAgY29uc3QgYm9vbCBjdXJyZW50RmlsdGVyaW5nID0gbU5lZWRzRmlsdGVyaW5nOwotICAgIGNvbnN0X2Nhc3Q8TGF5ZXIqPih0aGlzKS0+bU5lZWRzRmlsdGVyaW5nID0gdHJ1ZTsKLSAgICBMYXllckJhc2U6OmRyYXdGb3JTcmVlblNob3QoKTsKLSAgICBjb25zdF9jYXN0PExheWVyKj4odGhpcyktPm1OZWVkc0ZpbHRlcmluZyA9IGN1cnJlbnRGaWx0ZXJpbmc7Ci19Ci0KIHZvaWQgTGF5ZXI6Om9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0CiB7Ci0gICAgVGV4dHVyZSB0ZXgobUJ1ZmZlck1hbmFnZXIuZ2V0QWN0aXZlVGV4dHVyZSgpKTsKLSAgICBpZiAodGV4Lm5hbWUgPT0gLTFMVSkgeworICAgIGlmIChDQ19VTkxJS0VMWShtQWN0aXZlQnVmZmVyID09IDApKSB7CiAgICAgICAgIC8vIHRoZSB0ZXh0dXJlIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCwgdGhpcyBMYXllciBoYXMKICAgICAgICAgLy8gaW4gZmFjdCBuZXZlciBiZWVuIGRyYXduIGludG8uIFRoaXMgaGFwcGVucyBmcmVxdWVudGx5IHdpdGgKICAgICAgICAgLy8gU3VyZmFjZVZpZXcgYmVjYXVzZSB0aGUgV2luZG93TWFuYWdlciBjYW4ndCBrbm93IHdoZW4gdGhlIGNsaWVudApAQCAtMzMwLDcgKzI3MiwyNSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZHJhd1dpdGhPcGVuR0woY2xpcCwgdGV4KTsKKworICAgIEdMZW51bSB0YXJnZXQgPSBtU3VyZmFjZVRleHR1cmUtPmdldEN1cnJlbnRUZXh0dXJlVGFyZ2V0KCk7CisgICAgZ2xCaW5kVGV4dHVyZSh0YXJnZXQsIG1UZXh0dXJlTmFtZSk7CisgICAgaWYgKGdldEZpbHRlcmluZygpIHx8IG5lZWRzRmlsdGVyaW5nKCkgfHwgaXNGaXhlZFNpemUoKSB8fCBpc0Nyb3BwZWQoKSkgeworICAgICAgICAvLyBUT0RPOiB3ZSBjb3VsZCBiZSBtb3JlIHN1YnRsZSB3aXRoIGlzRml4ZWRTaXplKCkKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4KHRhcmdldCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICAgICBnbFRleFBhcmFtZXRlcngodGFyZ2V0LCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4KHRhcmdldCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4KHRhcmdldCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICB9CisgICAgZ2xFbmFibGUodGFyZ2V0KTsKKyAgICBnbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSk7CisgICAgZ2xMb2FkTWF0cml4ZihtVGV4dHVyZU1hdHJpeCk7CisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisKKyAgICBkcmF3V2l0aE9wZW5HTChjbGlwKTsKKworICAgIGdsRGlzYWJsZSh0YXJnZXQpOwogfQogCiAvLyBBcyBkb2N1bWVudGVkIGluIGxpYmhhcmR3YXJlIGhlYWRlciwgZm9ybWF0cyBpbiB0aGUgcmFuZ2UKQEAgLTM0MCwxODYgKzMwMCwzNyBAQAogLy8gaGFyZHdhcmUuaCwgaW5zdGVhZCBvZiB1c2luZyBoYXJkLWNvZGVkIHZhbHVlcyBoZXJlLgogI2RlZmluZSBIQVJEV0FSRV9JU19ERVZJQ0VfRk9STUFUKGYpICgoZikgPj0gMHgxMDAgJiYgKGYpIDw9IDB4MUZGKQogCi1ib29sIExheWVyOjpuZWVkc0JsZW5kaW5nKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIGNvbnN0Citib29sIExheWVyOjpnZXRPcGFjaXR5Rm9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkKIHsKLSAgICAvLyBJZiBidWZmZXJzIHdoZXJlIHNldCB3aXRoIGVPcGFxdWUgZmxhZywgYWxsIGJ1ZmZlcnMgYXJlIGtub3duIHRvCi0gICAgLy8gYmUgb3BhcXVlIHdpdGhvdXQgaGF2aW5nIHRvIGNoZWNrIHRoZWlyIGFjdHVhbCBmb3JtYXQKLSAgICBpZiAobU5lZWRzQmxlbmRpbmcgJiYgYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gYnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpOwotCi0gICAgICAgIGlmIChIQVJEV0FSRV9JU19ERVZJQ0VfRk9STUFUKGZvcm1hdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBpeGVsRm9ybWF0SW5mbyBpbmZvOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRQaXhlbEZvcm1hdEluZm8oZm9ybWF0LCAmaW5mbyk7Ci0gICAgICAgIGlmICghZXJyICYmIGluZm8uaF9hbHBoYSA8PSBpbmZvLmxfYWxwaGEpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIGlmIChIQVJEV0FSRV9JU19ERVZJQ0VfRk9STUFUKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotCi0gICAgLy8gUmV0dXJuIG9wYWNpdHkgYXMgZGV0ZXJtaW5lZCBmcm9tIGZsYWdzIGFuZCBmb3JtYXQgb3B0aW9ucwotICAgIC8vIHBhc3NlZCB0byBzZXRCdWZmZXJzKCkKLSAgICByZXR1cm4gbU5lZWRzQmxlbmRpbmc7CisgICAgUGl4ZWxGb3JtYXRJbmZvIGluZm87CisgICAgc3RhdHVzX3QgZXJyID0gZ2V0UGl4ZWxGb3JtYXRJbmZvKFBpeGVsRm9ybWF0KGZvcm1hdCksICZpbmZvKTsKKyAgICAvLyBpbiBjYXNlIG9mIGVycm9yICh1bmtub3duIGZvcm1hdCksIHdlIGFzc3VtZSBubyBibGVuZGluZworICAgIHJldHVybiAoZXJyIHx8IGluZm8uaF9hbHBoYSA8PSBpbmZvLmxfYWxwaGEpOwogfQogCi1ib29sIExheWVyOjpuZWVkc0JsZW5kaW5nKCkgY29uc3QKLXsKLSAgICBpZiAobUJ1ZmZlck1hbmFnZXIuaGFzQWN0aXZlQnVmZmVyKCkpIHsKLSAgICAgICAgcmV0dXJuIG5lZWRzQmxlbmRpbmcobUJ1ZmZlck1hbmFnZXIuZ2V0QWN0aXZlQnVmZmVyKCkpOwotICAgIH0KIAotICAgIHJldHVybiBtTmVlZHNCbGVuZGluZzsKLX0KLQotYm9vbCBMYXllcjo6bmVlZHNGaWx0ZXJpbmcoKSBjb25zdAorYm9vbCBMYXllcjo6aXNPcGFxdWUoKSBjb25zdAogewotICAgIGlmICghKG1GbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6U0xPV19DT05GSUcpKSB7Ci0gICAgICAgIC8vIGlmIG91ciBidWZmZXIgaXMgbm90IHRoZSBzYW1lIHNpemUgdGhhbiBvdXJzZWx2ZXMsCi0gICAgICAgIC8vIHdlIG5lZWQgZmlsdGVyaW5nLgotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobU5lZWRzU2NhbGluZykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gTGF5ZXJCYXNlOjpuZWVkc0ZpbHRlcmluZygpOworICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBidWZmZXIgeWV0LCB3ZSdyZSB0cmFuc2x1Y2VudCByZWdhcmRsZXNzIG9mIHRoZQorICAgIC8vIGxheWVyJ3Mgb3BhcXVlIGZsYWcuCisgICAgaWYgKG1BY3RpdmVCdWZmZXIgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gaWYgdGhlIGxheWVyIGhhcyB0aGUgb3BhcXVlIGZsYWcsIHRoZW4gd2UncmUgYWx3YXlzIG9wYXF1ZSwKKyAgICAvLyBvdGhlcndpc2Ugd2UgdXNlIHRoZSBjdXJyZW50IGJ1ZmZlcidzIGZvcm1hdC4KKyAgICByZXR1cm4gbU9wYXF1ZUxheWVyIHx8IG1DdXJyZW50T3BhY2l0eTsKIH0KIAogYm9vbCBMYXllcjo6aXNQcm90ZWN0ZWQoKSBjb25zdAogewotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGFjdGl2ZUJ1ZmZlcihtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7CisgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGFjdGl2ZUJ1ZmZlcihtQWN0aXZlQnVmZmVyKTsKICAgICByZXR1cm4gKGFjdGl2ZUJ1ZmZlciAhPSAwKSAmJgogICAgICAgICAgICAgKGFjdGl2ZUJ1ZmZlci0+Z2V0VXNhZ2UoKSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKTsKIH0KIAotc3RhdHVzX3QgTGF5ZXI6OnNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkKLXsKLSAgICBDbGllbnRSZWY6OkFjY2VzcyBzaGFyZWRDbGllbnQobVVzZXJDbGllbnRSZWYpOwotICAgIFNoYXJlZEJ1ZmZlclNlcnZlciogbGNibGsoc2hhcmVkQ2xpZW50LmdldCgpKTsKLSAgICBpZiAoIWxjYmxrKSB7Ci0gICAgICAgIC8vIG9vcHMsIHRoZSBjbGllbnQgaXMgYWxyZWFkeSBnb25lCi0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICAvLyBOT1RFOiBsY2Jsay0+cmVzaXplKCkgaXMgcHJvdGVjdGVkIGJ5IGFuIGludGVybmFsIGxvY2sKLSAgICBzdGF0dXNfdCBlcnIgPSBsY2Jsay0+cmVzaXplKGJ1ZmZlckNvdW50KTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEVHTERpc3BsYXkgZHB5KG1GbGluZ2VyLT5ncmFwaGljUGxhbmUoMCkuZ2V0RUdMRGlzcGxheSgpKTsKLSAgICAgICAgbUJ1ZmZlck1hbmFnZXIucmVzaXplKGJ1ZmZlckNvdW50LCBtRmxpbmdlciwgZHB5KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zcDxHcmFwaGljQnVmZmVyPiBMYXllcjo6cmVxdWVzdEJ1ZmZlcihpbnQgaW5kZXgsCi0gICAgICAgIHVpbnQzMl90IHJlcVdpZHRoLCB1aW50MzJfdCByZXFIZWlnaHQsIHVpbnQzMl90IHJlcUZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgdXNhZ2UpCi17Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOwotCi0gICAgaWYgKGludDMyX3QocmVxV2lkdGggfCByZXFIZWlnaHQgfCByZXFGb3JtYXQpIDwgMCkKLSAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLQotICAgIGlmICgoIXJlcVdpZHRoICYmIHJlcUhlaWdodCkgfHwgKHJlcVdpZHRoICYmICFyZXFIZWlnaHQpKQotICAgICAgICByZXR1cm4gYnVmZmVyOwotCi0gICAgLy8gdGhpcyBlbnN1cmVzIG91ciBjbGllbnQgZG9lc24ndCBnbyBhd2F5IHdoaWxlIHdlJ3JlIGFjY2Vzc2luZwotICAgIC8vIHRoZSBzaGFyZWQgYXJlYS4KLSAgICBDbGllbnRSZWY6OkFjY2VzcyBzaGFyZWRDbGllbnQobVVzZXJDbGllbnRSZWYpOwotICAgIFNoYXJlZEJ1ZmZlclNlcnZlciogbGNibGsoc2hhcmVkQ2xpZW50LmdldCgpKTsKLSAgICBpZiAoIWxjYmxrKSB7Ci0gICAgICAgIC8vIG9vcHMsIHRoZSBjbGllbnQgaXMgYWxyZWFkeSBnb25lCi0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBjbGllbnQncyBTdXJmYWNlOjpkZXF1ZXVlKCkuIFRoaXMgY2FuIGhhcHBlbgotICAgICAqIGF0IGFueSB0aW1lLCBlc3BlY2lhbGx5IHdoaWxlIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgdXNpbmcgdGhlCi0gICAgICogYnVmZmVyICdpbmRleCcgYXMgb3VyIGZyb250IGJ1ZmZlci4KLSAgICAgKi8KLQotICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwotICAgIHVpbnQzMl90IHcsIGgsIGY7Ci0gICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgICAgICAvLyB6ZXJvIG1lYW5zIGRlZmF1bHQKLSAgICAgICAgY29uc3QgYm9vbCBmaXhlZFNpemUgPSByZXFXaWR0aCAmJiByZXFIZWlnaHQ7Ci0gICAgICAgIGlmICghcmVxRm9ybWF0KSByZXFGb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBpZiAoIXJlcVdpZHRoKSAgcmVxV2lkdGggPSBtV2lkdGg7Ci0gICAgICAgIGlmICghcmVxSGVpZ2h0KSByZXFIZWlnaHQgPSBtSGVpZ2h0OwotCi0gICAgICAgIHcgPSByZXFXaWR0aDsKLSAgICAgICAgaCA9IHJlcUhlaWdodDsKLSAgICAgICAgZiA9IHJlcUZvcm1hdDsKLQotICAgICAgICBpZiAoKHJlcVdpZHRoICE9IG1SZXFXaWR0aCkgfHwgKHJlcUhlaWdodCAhPSBtUmVxSGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgIChyZXFGb3JtYXQgIT0gbVJlcUZvcm1hdCkpIHsKLSAgICAgICAgICAgIG1SZXFXaWR0aCAgPSByZXFXaWR0aDsKLSAgICAgICAgICAgIG1SZXFIZWlnaHQgPSByZXFIZWlnaHQ7Ci0gICAgICAgICAgICBtUmVxRm9ybWF0ID0gcmVxRm9ybWF0OwotICAgICAgICAgICAgbUZpeGVkU2l6ZSA9IGZpeGVkU2l6ZTsKLSAgICAgICAgICAgIG1OZWVkc1NjYWxpbmcgPSBtV2lkdGggIT0gbVJlcVdpZHRoIHx8IG1IZWlnaHQgIT0gbVJlcUhlaWdodDsKLQotICAgICAgICAgICAgbGNibGstPnJlYWxsb2NhdGVBbGxFeGNlcHQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gaGVyZSB3ZSBoYXZlIHRvIHJlYWxsb2NhdGUgYSBuZXcgYnVmZmVyIGJlY2F1c2UgdGhlIGJ1ZmZlciBjb3VsZCBiZQotICAgIC8vIHVzZWQgYXMgdGhlIGZyb250IGJ1ZmZlciwgb3IgYnkgYSBjbGllbnQgaW4gb3VyIHByb2Nlc3MKLSAgICAvLyAoZWc6IHN0YXR1cyBiYXIpLCBhbmQgd2UgY2FuJ3QgcmVsZWFzZSB0aGUgaGFuZGxlIHVuZGVyIGl0cyBmZWV0LgotICAgIGNvbnN0IHVpbnQzMl90IGVmZmVjdGl2ZVVzYWdlID0gZ2V0RWZmZWN0aXZlVXNhZ2UodXNhZ2UpOwotICAgIGJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKHcsIGgsIGYsIGVmZmVjdGl2ZVVzYWdlKTsKLSAgICBlcnIgPSBidWZmZXItPmluaXRDaGVjaygpOwotCi0gICAgaWYgKGVyciB8fCBidWZmZXItPmhhbmRsZSA9PSAwKSB7Ci0gICAgICAgIEdyYXBoaWNCdWZmZXI6OmR1bXBBbGxvY2F0aW9uc1RvU3lzdGVtTG9nKCk7Ci0gICAgICAgIExPR0VfSUYoZXJyIHx8IGJ1ZmZlci0+aGFuZGxlID09IDAsCi0gICAgICAgICAgICAgICAgIkxheWVyOjpyZXF1ZXN0QnVmZmVyKHRoaXM9JXApLCBpbmRleD0lZCwgdz0lZCwgaD0lZCBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgdGhpcywgaW5kZXgsIHcsIGgsIHN0cmVycm9yKC1lcnIpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dEX0lGKERFQlVHX1JFU0laRSwKLSAgICAgICAgICAgICAgICAiTGF5ZXI6OnJlcXVlc3RCdWZmZXIodGhpcz0lcCksIGluZGV4PSVkLCB3PSVkLCBoPSVkLCBoYW5kbGU9JXAiLAotICAgICAgICAgICAgICAgIHRoaXMsIGluZGV4LCB3LCBoLCBidWZmZXItPmhhbmRsZSk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBOT19FUlJPUiAmJiBidWZmZXItPmhhbmRsZSAhPSAwKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1CdWZmZXJNYW5hZ2VyLmF0dGFjaEJ1ZmZlcihpbmRleCwgYnVmZmVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotdWludDMyX3QgTGF5ZXI6OmdldEVmZmVjdGl2ZVVzYWdlKHVpbnQzMl90IHVzYWdlKSBjb25zdAotewotICAgIC8qCi0gICAgICogIGJ1ZmZlcnMgdXNlZCBmb3Igc29mdHdhcmUgcmVuZGVyaW5nLCBidXQgaC93IGNvbXBvc2l0aW9uCi0gICAgICogIGFyZSBhbGxvY2F0ZWQgd2l0aCBTV19SRUFEX09GVEVOIHwgU1dfV1JJVEVfT0ZURU4gfCBIV19URVhUVVJFCi0gICAgICoKLSAgICAgKiAgYnVmZmVycyB1c2VkIGZvciBoL3cgcmVuZGVyaW5nIGFuZCBoL3cgY29tcG9zaXRpb24KLSAgICAgKiAgYXJlIGFsbG9jYXRlZCB3aXRoICBIV19SRU5ERVIgfCBIV19URVhUVVJFCi0gICAgICoKLSAgICAgKiAgYnVmZmVycyB1c2VkIHdpdGggaC93IHJlbmRlcmluZyBhbmQgZWl0aGVyIE5QT1Qgb3Igbm8gZWdsX2ltYWdlX2V4dAotICAgICAqICBhcmUgYWxsb2NhdGVkIHdpdGggU1dfUkVBRF9SQVJFTFkgfCBIV19SRU5ERVIKLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKG1TZWN1cmUpIHsKLSAgICAgICAgLy8gc2VjdXJlIGJ1ZmZlciwgZG9uJ3Qgc3RvcmUgaXQgaW50byB0aGUgR1BVCi0gICAgICAgIHVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfUkVBRF9PRlRFTiB8Ci0gICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfT0ZURU47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gaXQncyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgdXNhZ2UgZmxhZ3MgaGVyZSwgYnV0IGdlbmVyYWxseQotICAgICAgICAvLyB0aGUgcmVxdWVzdGVkIGZsYWdzIHNob3VsZCBiZSBob25vcmVkLgotICAgICAgICAvLyByZXF1ZXN0IEVHTEltYWdlIGZvciBhbGwgYnVmZmVycwotICAgICAgICB1c2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFOwotICAgIH0KLSAgICBpZiAobVByb3RlY3RlZEJ5QXBwKSB7Ci0gICAgICAgIC8vIG5lZWQgYSBoYXJkd2FyZS1wcm90ZWN0ZWQgcGF0aCB0byBleHRlcm5hbCB2aWRlbyBzaW5rCi0gICAgICAgIHVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX1BST1RFQ1RFRDsKLSAgICB9Ci0gICAgcmV0dXJuIHVzYWdlOwotfQotCiB1aW50MzJfdCBMYXllcjo6ZG9UcmFuc2FjdGlvbih1aW50MzJfdCBmbGFncykKIHsKICAgICBjb25zdCBMYXllcjo6U3RhdGUmIGZyb250KGRyYXdpbmdTdGF0ZSgpKTsKQEAgLTUzMSwxMCArMzQyLDEyIEBACiAgICAgaWYgKHNpemVDaGFuZ2VkKSB7CiAgICAgICAgIC8vIHRoZSBzaXplIGNoYW5nZWQsIHdlIG5lZWQgdG8gYXNrIG91ciBjbGllbnQgdG8gcmVxdWVzdCBhIG5ldyBidWZmZXIKICAgICAgICAgTE9HRF9JRihERUJVR19SRVNJWkUsCi0gICAgICAgICAgICAgICAgInJlc2l6ZSAobGF5ZXI9JXApLCByZXF1ZXN0ZWQgKCVkeCVkKSwgZHJhd2luZyAoJWQsJWQpIiwKKyAgICAgICAgICAgICAgICAicmVzaXplIChsYXllcj0lcCksIHJlcXVlc3RlZCAoJWR4JWQpLCBkcmF3aW5nICglZCwlZCksICIKKyAgICAgICAgICAgICAgICAiZml4ZWRTaXplPSVkIiwKICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgIGludCh0ZW1wLnJlcXVlc3RlZF93KSwgaW50KHRlbXAucmVxdWVzdGVkX2gpLAotICAgICAgICAgICAgICAgIGludChmcm9udC5yZXF1ZXN0ZWRfdyksIGludChmcm9udC5yZXF1ZXN0ZWRfaCkpOworICAgICAgICAgICAgICAgIGludChmcm9udC5yZXF1ZXN0ZWRfdyksIGludChmcm9udC5yZXF1ZXN0ZWRfaCksCisgICAgICAgICAgICAgICAgaXNGaXhlZFNpemUoKSk7CiAKICAgICAgICAgaWYgKCFpc0ZpeGVkU2l6ZSgpKSB7CiAgICAgICAgICAgICAvLyB3ZSdyZSBiZWluZyByZXNpemVkIGFuZCB0aGVyZSBpcyBhIGZyZWV6ZSBkaXNwbGF5IHJlcXVlc3QsCkBAIC01NTcsMTcgKzM3MCw3IEBACiAKICAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgbmV3IHNpemUsIGZvcm0gdGhpcyBwb2ludCBvbiwgd2hlbiB0aGUgY2xpZW50IHJlcXVlc3QKICAgICAgICAgICAgIC8vIGEgYnVmZmVyLCBpdCdsbCBnZXQgdGhlIG5ldyBzaXplLgotICAgICAgICAgICAgc2V0QnVmZmVyU2l6ZSh0ZW1wLnJlcXVlc3RlZF93LCB0ZW1wLnJlcXVlc3RlZF9oKTsKLQotICAgICAgICAgICAgQ2xpZW50UmVmOjpBY2Nlc3Mgc2hhcmVkQ2xpZW50KG1Vc2VyQ2xpZW50UmVmKTsKLSAgICAgICAgICAgIFNoYXJlZEJ1ZmZlclNlcnZlciogbGNibGsoc2hhcmVkQ2xpZW50LmdldCgpKTsKLSAgICAgICAgICAgIGlmIChsY2JsaykgewotICAgICAgICAgICAgICAgIC8vIGFsbCBidWZmZXJzIG5lZWQgcmVhbGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgbGNibGstPnJlYWxsb2NhdGVBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlY29yZCB0aGUgbmV3IHNpemUKLSAgICAgICAgICAgIHNldEJ1ZmZlclNpemUodGVtcC5yZXF1ZXN0ZWRfdywgdGVtcC5yZXF1ZXN0ZWRfaCk7CisgICAgICAgICAgICBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJTaXplKHRlbXAucmVxdWVzdGVkX3csIHRlbXAucmVxdWVzdGVkX2gpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01ODIsNzkgKzM4NSw2OSBAQAogICAgIHJldHVybiBMYXllckJhc2U6OmRvVHJhbnNhY3Rpb24oZmxhZ3MpOwogfQogCi12b2lkIExheWVyOjpzZXRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1XaWR0aCA9IHc7Ci0gICAgbUhlaWdodCA9IGg7Ci0gICAgbU5lZWRzU2NhbGluZyA9IG1XaWR0aCAhPSBtUmVxV2lkdGggfHwgbUhlaWdodCAhPSBtUmVxSGVpZ2h0OwotfQotCiBib29sIExheWVyOjppc0ZpeGVkU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHJldHVybiBtRml4ZWRTaXplOwogfQogCit2b2lkIExheWVyOjpzZXRGaXhlZFNpemUoYm9vbCBmaXhlZFNpemUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtRml4ZWRTaXplID0gZml4ZWRTaXplOworfQorCitib29sIExheWVyOjppc0Nyb3BwZWQoKSBjb25zdCB7CisgICAgcmV0dXJuICFtQ3VycmVudENyb3AuaXNFbXB0eSgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBwYWdlZmxpcCBoYW5kbGluZy4uLgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIExheWVyOjpsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpCiB7Ci0gICAgQ2xpZW50UmVmOjpBY2Nlc3Mgc2hhcmVkQ2xpZW50KG1Vc2VyQ2xpZW50UmVmKTsKLSAgICBTaGFyZWRCdWZmZXJTZXJ2ZXIqIGxjYmxrKHNoYXJlZENsaWVudC5nZXQoKSk7Ci0gICAgaWYgKCFsY2JsaykgewotICAgICAgICAvLyBjbGllbnQgZGllZAotICAgICAgICByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCgwLCAmbVF1ZXVlZEZyYW1lcykpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVGV4dHVyZS0+dXBkYXRlVGV4SW1hZ2UoKSA8IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQhCisgICAgICAgICAgICByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotICAgIHNzaXplX3QgYnVmID0gbGNibGstPnJldGlyZUFuZExvY2soKTsKLSAgICBpZiAoYnVmID09IE5PVF9FTk9VR0hfREFUQSkgewotICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCBhbiBlcnJvciwgaXQgc2ltcGx5IG1lYW5zIHRoZXJlIGlzIG5vdGhpbmcgdG8KLSAgICAgICAgLy8gcmV0aXJlLiBUaGUgYnVmZmVyIGlzIGxvY2tlZCBiZWNhdXNlIHdlIHdpbGwgdXNlIGl0Ci0gICAgICAgIC8vIGZvciBjb21wb3NpdGlvbiBsYXRlciBpbiB0aGUgbG9vcAotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgICAgICAvLyBzaWduYWwgYW5vdGhlciBldmVudCBpZiB3ZSBoYXZlIG1vcmUgZnJhbWVzIHdhaXRpbmcKKyAgICAgICAgaWYgKG1TdXJmYWNlVGV4dHVyZS0+Z2V0UXVldWVkQ291bnQoKSkgeworICAgICAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX29yKDEsICZtUXVldWVkRnJhbWVzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUZsaW5nZXItPnNpZ25hbEV2ZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIGlmIChidWYgPCBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJyZXRpcmVBbmRMb2NrKCkgYnVmZmVyIGluZGV4ICglZCkgb3V0IG9mIHJhbmdlIiwgaW50KGJ1ZikpOwotICAgICAgICBtUG9zdGVkRGlydHlSZWdpb24uY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KKyAgICAgICAgbUFjdGl2ZUJ1ZmZlciA9IG1TdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudEJ1ZmZlcigpOworICAgICAgICBtU3VyZmFjZVRleHR1cmUtPmdldFRyYW5zZm9ybU1hdHJpeChtVGV4dHVyZU1hdHJpeCk7CiAKLSAgICAvLyB3ZSByZXRpcmVkIGEgYnVmZmVyLCB3aGljaCBiZWNvbWVzIHRoZSBuZXcgZnJvbnQgYnVmZmVyCisgICAgICAgIGNvbnN0IFJlY3QgY3JvcChtU3VyZmFjZVRleHR1cmUtPmdldEN1cnJlbnRDcm9wKCkpOworICAgICAgICBjb25zdCB1aW50MzJfdCB0cmFuc2Zvcm0obVN1cmZhY2VUZXh0dXJlLT5nZXRDdXJyZW50VHJhbnNmb3JtKCkpOworICAgICAgICBpZiAoKGNyb3AgIT0gbUN1cnJlbnRDcm9wKSB8fCAodHJhbnNmb3JtICE9IG1DdXJyZW50VHJhbnNmb3JtKSkgeworICAgICAgICAgICAgbUN1cnJlbnRDcm9wID0gY3JvcDsKKyAgICAgICAgICAgIG1DdXJyZW50VHJhbnNmb3JtID0gdHJhbnNmb3JtOworICAgICAgICAgICAgbUZsaW5nZXItPmludmFsaWRhdGVId2NHZW9tZXRyeSgpOworICAgICAgICB9CiAKLSAgICBjb25zdCBib29sIG5vQWN0aXZlQnVmZmVyID0gIW1CdWZmZXJNYW5hZ2VyLmhhc0FjdGl2ZUJ1ZmZlcigpOwotICAgIGNvbnN0IGJvb2wgYWN0aXZlQmxlbmRpbmcgPQotICAgICAgICAgICAgbm9BY3RpdmVCdWZmZXIgPyB0cnVlIDogbmVlZHNCbGVuZGluZyhtQnVmZmVyTWFuYWdlci5nZXRBY3RpdmVCdWZmZXIoKSk7Ci0KLSAgICBpZiAobUJ1ZmZlck1hbmFnZXIuc2V0QWN0aXZlQnVmZmVySW5kZXgoYnVmKSA8IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoInJldGlyZUFuZExvY2soKSBidWZmZXIgaW5kZXggKCVkKSBvdXQgb2YgcmFuZ2UiLCBpbnQoYnVmKSk7Ci0gICAgICAgIG1Qb3N0ZWREaXJ0eVJlZ2lvbi5jbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG5vQWN0aXZlQnVmZmVyKSB7Ci0gICAgICAgIC8vIHdlIGRpZG4ndCBoYXZlIGFuIGFjdGl2ZSBidWZmZXIsIHdlIG5lZWQgdG8gcmVjb21wdXRlCi0gICAgICAgIC8vIG91ciB2aXNpYmxlIHJlZ2lvbgotICAgICAgICByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyA9IHRydWU7Ci0gICAgfQotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gbmV3RnJvbnRCdWZmZXIoZ2V0QnVmZmVyKGJ1ZikpOwotICAgIGlmIChuZXdGcm9udEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghbm9BY3RpdmVCdWZmZXIgJiYgYWN0aXZlQmxlbmRpbmcgIT0gbmVlZHNCbGVuZGluZyhuZXdGcm9udEJ1ZmZlcikpIHsKLSAgICAgICAgICAgIC8vIG5ldyBidWZmZXIgaGFzIGRpZmZlcmVudCBvcGFjaXR5IHRoYW4gcHJldmlvdXMgYWN0aXZlIGJ1ZmZlciwgbmVlZAotICAgICAgICAgICAgLy8gdG8gcmVjb21wdXRlIHZpc2libGUgcmVnaW9ucyBhY2NvcmRpbmdseQorICAgICAgICBjb25zdCBib29sIG9wYWNpdHkoZ2V0T3BhY2l0eUZvckZvcm1hdChtQWN0aXZlQnVmZmVyLT5mb3JtYXQpKTsKKyAgICAgICAgaWYgKG9wYWNpdHkgIT0gbUN1cnJlbnRPcGFjaXR5KSB7CisgICAgICAgICAgICBtQ3VycmVudE9wYWNpdHkgPSBvcGFjaXR5OwogICAgICAgICAgICAgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gZ2V0IHRoZSBkaXJ0eSByZWdpb24KLSAgICAgICAgLy8gY29tcHV0ZSB0aGUgcG9zdGVkIHJlZ2lvbgotICAgICAgICBjb25zdCBSZWdpb24gZGlydHkobGNibGstPmdldERpcnR5UmVnaW9uKGJ1ZikpOwotICAgICAgICBtUG9zdGVkRGlydHlSZWdpb24gPSBkaXJ0eS5pbnRlcnNlY3QoIG5ld0Zyb250QnVmZmVyLT5nZXRCb3VuZHMoKSApOworICAgICAgICBjb25zdCBHTGVudW0gdGFyZ2V0KG1TdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudFRleHR1cmVUYXJnZXQoKSk7CisgICAgICAgIGdsVGV4UGFyYW1ldGVyeCh0YXJnZXQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4KHRhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbGF5ZXIgc2l6ZSBhbmQgcmVsZWFzZSBmcmVlemUtbG9jawogICAgICAgICBjb25zdCBMYXllcjo6U3RhdGUmIGZyb250KGRyYXdpbmdTdGF0ZSgpKTsKKworICAgICAgICAvLyBGSVhNRTogbVBvc3RlZERpcnR5UmVnaW9uID0gZGlydHkgJiBib3VuZHMKKyAgICAgICAgbVBvc3RlZERpcnR5UmVnaW9uLnNldChmcm9udC53LCBmcm9udC5oKTsKKworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBuZXdGcm9udEJ1ZmZlcihtQWN0aXZlQnVmZmVyKTsKICAgICAgICAgaWYgKChuZXdGcm9udEJ1ZmZlci0+Z2V0V2lkdGgoKSAgPT0gZnJvbnQucmVxdWVzdGVkX3cgJiYKICAgICAgICAgICAgIG5ld0Zyb250QnVmZmVyLT5nZXRIZWlnaHQoKSA9PSBmcm9udC5yZXF1ZXN0ZWRfaCkgfHwKICAgICAgICAgICAgIGlzRml4ZWRTaXplKCkpCkBAIC02ODUsMzUgKzQ3OCw3IEBACiAgICAgICAgICAgICAvLyB3ZSBub3cgaGF2ZSB0aGUgY29ycmVjdCBzaXplLCB1bmZyZWV6ZSB0aGUgc2NyZWVuCiAgICAgICAgICAgICBtRnJlZXplTG9jay5jbGVhcigpOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSBjcm9wIHJlZ2lvbgotICAgICAgICBzZXRCdWZmZXJDcm9wKCBsY2Jsay0+Z2V0Q3JvcChidWYpICk7Ci0KLSAgICAgICAgLy8gZ2V0IHRoZSB0cmFuc2Zvcm1hdGlvbgotICAgICAgICBzZXRCdWZmZXJUcmFuc2Zvcm0oIGxjYmxrLT5nZXRUcmFuc2Zvcm0oYnVmKSApOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3Mgd2UgcmFuIG91dCBvZiBtZW1vcnkgd2hpbGUKLSAgICAgICAgLy8gYWxsb2NhdGluZyB0aGUgYnVmZmVyLiB3ZSdyZSBob3BpbmcgdGhhdCB0aGluZ3Mgd2lsbCBnZXQgYmFjawotICAgICAgICAvLyB0byBub3JtYWwgdGhlIG5leHQgdGltZSB0aGUgYXBwIHRyaWVzIHRvIGRyYXcgaW50byB0aGlzIGJ1ZmZlci4KLSAgICAgICAgLy8gbWVhbndoaWxlLCBwcmV0ZW5kIHRoZSBzY3JlZW4gZGlkbid0IHVwZGF0ZS4KLSAgICAgICAgbVBvc3RlZERpcnR5UmVnaW9uLmNsZWFyKCk7CiAgICAgfQotCi0gICAgaWYgKGxjYmxrLT5nZXRRdWV1ZWRDb3VudCgpKSB7Ci0gICAgICAgIC8vIHNpZ25hbCBhbiBldmVudCBpZiB3ZSBoYXZlIG1vcmUgYnVmZmVycyB3YWl0aW5nCi0gICAgICAgIG1GbGluZ2VyLT5zaWduYWxFdmVudCgpOwotICAgIH0KLQotICAgIC8qIGEgYnVmZmVyIHdhcyBwb3N0ZWQsIHNvIHdlIG5lZWQgdG8gY2FsbCByZWxvYWRUZXh0dXJlKCksIHdoaWNoCi0gICAgICogd2lsbCB1cGRhdGUgb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAoZWc6IEVHTEltYWdlS0hSIG9yCi0gICAgICogdGV4dHVyZSBuYW1lcykuIHdlIG5lZWQgdG8gZG8gdGhpcyBldmVuIGlmIG1Qb3N0ZWREaXJ0eVJlZ2lvbiBpcwotICAgICAqIGVtcHR5IC0tIGl0J3Mgb3J0aG9nb25hbCB0byB0aGUgZmFjdCB0aGF0IGEgbmV3IGJ1ZmZlciB3YXMgcG9zdGVkLAotICAgICAqIGZvciBpbnN0YW5jZSwgYSBkZWdlbmVyYXRlIGNhc2UgY291bGQgYmUgdGhhdCB0aGUgdXNlciBkaWQgYW4gZW1wdHkKLSAgICAgKiB1cGRhdGUgYnV0IHJlcGFpbnRlZCB0aGUgYnVmZmVyIHdpdGggYXBwcm9wcmlhdGUgY29udGVudCAoYWZ0ZXIgYQotICAgICAqIHJlc2l6ZSBmb3IgaW5zdGFuY2UpLgotICAgICAqLwotICAgIHJlbG9hZFRleHR1cmUoIG1Qb3N0ZWREaXJ0eVJlZ2lvbiApOwogfQogCiB2b2lkIExheWVyOjp1bmxvY2tQYWdlRmxpcCgKQEAgLTc0NiwzMjkgKzUxMSwzNiBAQAogewogICAgIExheWVyQmFzZUNsaWVudDo6ZHVtcChyZXN1bHQsIGJ1ZmZlciwgU0laRSk7CiAKLSAgICBDbGllbnRSZWY6OkFjY2VzcyBzaGFyZWRDbGllbnQobVVzZXJDbGllbnRSZWYpOwotICAgIFNoYXJlZEJ1ZmZlclNlcnZlciogbGNibGsoc2hhcmVkQ2xpZW50LmdldCgpKTsKLSAgICB1aW50MzJfdCB0b3RhbFRpbWUgPSAwOwotICAgIGlmIChsY2JsaykgewotICAgICAgICBTaGFyZWRCdWZmZXJTdGFjazo6U3RhdGlzdGljcyBzdGF0cyA9IGxjYmxrLT5nZXRTdGF0cygpOwotICAgICAgICB0b3RhbFRpbWU9IHN0YXRzLnRvdGFsVGltZTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCggbGNibGstPmR1bXAoIiAgICAgICIpICk7Ci0gICAgfQotCi0gICAgc3A8Y29uc3QgR3JhcGhpY0J1ZmZlcj4gYnVmMChnZXRCdWZmZXIoMCkpOwotICAgIHNwPGNvbnN0IEdyYXBoaWNCdWZmZXI+IGJ1ZjEoZ2V0QnVmZmVyKDEpKTsKLSAgICB1aW50MzJfdCB3MD0wLCBoMD0wLCBzMD0wOwotICAgIHVpbnQzMl90IHcxPTAsIGgxPTAsIHMxPTA7CisgICAgc3A8Y29uc3QgR3JhcGhpY0J1ZmZlcj4gYnVmMChtQWN0aXZlQnVmZmVyKTsKKyAgICB1aW50MzJfdCB3MD0wLCBoMD0wLCBzMD0wLCBmMD0wOwogICAgIGlmIChidWYwICE9IDApIHsKICAgICAgICAgdzAgPSBidWYwLT5nZXRXaWR0aCgpOwogICAgICAgICBoMCA9IGJ1ZjAtPmdldEhlaWdodCgpOwogICAgICAgICBzMCA9IGJ1ZjAtPmdldFN0cmlkZSgpOwotICAgIH0KLSAgICBpZiAoYnVmMSAhPSAwKSB7Ci0gICAgICAgIHcxID0gYnVmMS0+Z2V0V2lkdGgoKTsKLSAgICAgICAgaDEgPSBidWYxLT5nZXRIZWlnaHQoKTsKLSAgICAgICAgczEgPSBidWYxLT5nZXRTdHJpZGUoKTsKKyAgICAgICAgZjAgPSBidWYwLT5mb3JtYXQ7CiAgICAgfQogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKICAgICAgICAgICAgICIgICAgICAiCi0gICAgICAgICAgICAiZm9ybWF0PSUyZCwgWyUzdXglM3U6JTN1XSBbJTN1eCUzdTolM3VdLCIKLSAgICAgICAgICAgICIgZnJlZXplTG9jaz0lcCwgZHEtcS10aW1lPSV1IHVzXG4iLAotICAgICAgICAgICAgbUZvcm1hdCwgdzAsIGgwLCBzMCwgdzEsIGgxLCBzMSwKLSAgICAgICAgICAgIGdldEZyZWV6ZUxvY2soKS5nZXQoKSwgdG90YWxUaW1lKTsKKyAgICAgICAgICAgICJmb3JtYXQ9JTJkLCBhY3RpdmVCdWZmZXI9WyUzdXglM3U6JTN1LCUzdV0sIgorICAgICAgICAgICAgIiBmcmVlemVMb2NrPSVwLCBxdWV1ZWQtZnJhbWVzPSVkXG4iLAorICAgICAgICAgICAgbUZvcm1hdCwgdzAsIGgwLCBzMCxmMCwKKyAgICAgICAgICAgIGdldEZyZWV6ZUxvY2soKS5nZXQoKSwgbVF1ZXVlZEZyYW1lcyk7CiAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci19CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXllcjo6Q2xpZW50UmVmOjpDbGllbnRSZWYoKQotICAgIDogbUNvbnRyb2xCbG9jaygwKSwgbVRva2VuKC0xKSB7Ci19Ci0KLUxheWVyOjpDbGllbnRSZWY6On5DbGllbnRSZWYoKSB7Ci19Ci0KLWludDMyX3QgTGF5ZXI6OkNsaWVudFJlZjo6Z2V0VG9rZW4oKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbVRva2VuOwotfQotCi1zcDxVc2VyQ2xpZW50PiBMYXllcjo6Q2xpZW50UmVmOjpnZXRDbGllbnQoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbVVzZXJDbGllbnQucHJvbW90ZSgpOwotfQotCi1zdGF0dXNfdCBMYXllcjo6Q2xpZW50UmVmOjpzZXRUb2tlbihjb25zdCBzcDxVc2VyQ2xpZW50PiYgdWMsCi0gICAgICAgIGNvbnN0IHNwPFNoYXJlZEJ1ZmZlclNlcnZlcj4mIHNoYXJlZENsaWVudCwgaW50MzJfdCB0b2tlbikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICB7IC8vIHNjb3BlIGZvciBzdHJvbmcgbVVzZXJDbGllbnQgcmVmZXJlbmNlCi0gICAgICAgIHNwPFVzZXJDbGllbnQ+IHVzZXJDbGllbnQobVVzZXJDbGllbnQucHJvbW90ZSgpKTsKLSAgICAgICAgaWYgKHVzZXJDbGllbnQgIT0gMCAmJiBtQ29udHJvbEJsb2NrICE9IDApIHsKLSAgICAgICAgICAgIG1Db250cm9sQmxvY2stPnNldFN0YXR1cyhOT19JTklUKTsKLSAgICAgICAgfQorICAgIGlmIChtU3VyZmFjZVRleHR1cmUgIT0gMCkgeworICAgICAgICBtU3VyZmFjZVRleHR1cmUtPmR1bXAocmVzdWx0LCAiICAgICAgICAgICAgIiwgYnVmZmVyLCBTSVpFKTsKICAgICB9Ci0KLSAgICBtVXNlckNsaWVudCA9IHVjOwotICAgIG1Ub2tlbiA9IHRva2VuOwotICAgIG1Db250cm9sQmxvY2sgPSBzaGFyZWRDbGllbnQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxVc2VyQ2xpZW50PiBMYXllcjo6Q2xpZW50UmVmOjpnZXRVc2VyQ2xpZW50VW5zYWZlKCkgY29uc3QgewotICAgIHJldHVybiBtVXNlckNsaWVudC5wcm9tb3RlKCk7Ci19Ci0KLS8vIHRoaXMgY2xhc3MgZ2l2ZXMgdXMgYWNjZXNzIHRvIFNoYXJlZEJ1ZmZlclNlcnZlciBzYWZlbHkKLS8vIGl0IG1ha2VzIHN1cmUgdGhlIFVzZXJDbGllbnQgKGFuZCBpdHMgYXNzb2NpYXRlZCBzaGFyZWQgbWVtb3J5KQotLy8gd29uJ3QgZ28gYXdheSB3aGlsZSB3ZSdyZSBhY2Nlc3NpbmcgaXQuCi1MYXllcjo6Q2xpZW50UmVmOjpBY2Nlc3M6OkFjY2Vzcyhjb25zdCBDbGllbnRSZWYmIHJlZikKLSAgICA6IG1Db250cm9sQmxvY2soMCkKK3VpbnQzMl90IExheWVyOjpnZXRFZmZlY3RpdmVVc2FnZSh1aW50MzJfdCB1c2FnZSkgY29uc3QKIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wocmVmLm1Mb2NrKTsKLSAgICBtVXNlckNsaWVudFN0cm9uZ1JlZiA9IHJlZi5tVXNlckNsaWVudC5wcm9tb3RlKCk7Ci0gICAgaWYgKG1Vc2VyQ2xpZW50U3Ryb25nUmVmICE9IDApCi0gICAgICAgIG1Db250cm9sQmxvY2sgPSByZWYubUNvbnRyb2xCbG9jazsKLX0KLQotTGF5ZXI6OkNsaWVudFJlZjo6QWNjZXNzOjp+QWNjZXNzKCkKLXsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxheWVyOjpCdWZmZXJNYW5hZ2VyOjpCdWZmZXJNYW5hZ2VyKFRleHR1cmVNYW5hZ2VyJiB0bSkKLSAgICA6IG1OdW1CdWZmZXJzKE5VTV9CVUZGRVJTKSwgbVRleHR1cmVNYW5hZ2VyKHRtKSwKLSAgICAgIG1BY3RpdmVCdWZmZXJJbmRleCgtMSksIG1GYWlsb3ZlcihmYWxzZSkKLXsKLX0KLQotTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6On5CdWZmZXJNYW5hZ2VyKCkKLXsKLX0KLQotc3RhdHVzX3QgTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OnJlc2l6ZShzaXplX3Qgc2l6ZSwKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLCBFR0xEaXNwbGF5IGRweSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgaWYgKHNpemUgPCBtTnVtQnVmZmVycykgewotICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgdGV4dHVyZSwgbW92ZSBpdCBpbnRvIHNsb3QgMCBpZiBuZWVkZWQKLSAgICAgICAgaWYgKG1BY3RpdmVCdWZmZXJJbmRleCA+IDApIHsKLSAgICAgICAgICAgIEJ1ZmZlckRhdGEgYWN0aXZlQnVmZmVyRGF0YSA9IG1CdWZmZXJEYXRhW21BY3RpdmVCdWZmZXJJbmRleF07Ci0gICAgICAgICAgICBtQnVmZmVyRGF0YVttQWN0aXZlQnVmZmVySW5kZXhdID0gbUJ1ZmZlckRhdGFbMF07Ci0gICAgICAgICAgICBtQnVmZmVyRGF0YVswXSA9IGFjdGl2ZUJ1ZmZlckRhdGE7Ci0gICAgICAgICAgICBtQWN0aXZlQnVmZmVySW5kZXggPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRnJlZSB0aGUgYnVmZmVycyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gc2l6ZTsgaSA8IG1OdW1CdWZmZXJzOyBpKyspIHsKLSAgICAgICAgICAgIG1CdWZmZXJEYXRhW2ldLmJ1ZmZlciA9IDA7Ci0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG1lc3NhZ2UgdG8gZGVzdHJveSB0aGUgdGV4dHVyZXMgb24gU3VyZmFjZUZsaW5nZXIncyBHTAotICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgY2xhc3MgTWVzc2FnZURlc3Ryb3lUZXh0dXJlIDogcHVibGljIE1lc3NhZ2VCYXNlIHsKLSAgICAgICAgICAgICAgICBJbWFnZSBtVGV4dHVyZTsKLSAgICAgICAgICAgICAgICBFR0xEaXNwbGF5IG1EcHk7Ci0gICAgICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgIE1lc3NhZ2VEZXN0cm95VGV4dHVyZShjb25zdCBJbWFnZSYgdGV4dHVyZSwgRUdMRGlzcGxheSBkcHkpCi0gICAgICAgICAgICAgICAgICAgIDogbVRleHR1cmUodGV4dHVyZSksIG1EcHkoZHB5KSB7IH0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlcigpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OmRlc3Ryb3lUZXh0dXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGV4dHVyZSwgbURweSk7Ci0gICAgICAgICAgICAgICAgICAgIExPR0VfSUYoZXJyPDAsICJlcnJvciBkZXN0cm95aW5nIHRleHR1cmU6ICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZXh0dXJlLm5hbWUsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFhYWDogZXJyID09IDA7ICA/Pz8/Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgTWVzc2FnZURlc3Ryb3lUZXh0dXJlICptc2cgPSBuZXcgTWVzc2FnZURlc3Ryb3lUZXh0dXJlKAotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyRGF0YVtpXS50ZXh0dXJlLCBkcHkpOwotCi0gICAgICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGlzIHRleHR1cmUgdG8gYmUgY2xlYW5lZCB1cCBieQotICAgICAgICAgICAgLy8gQnVmZmVyTWFuYWdlcjo6ZGVzdHJveS4KLSAgICAgICAgICAgIG1CdWZmZXJEYXRhW2ldLnRleHR1cmUubmFtZSA9IC0xVTsKLSAgICAgICAgICAgIG1CdWZmZXJEYXRhW2ldLnRleHR1cmUuaW1hZ2UgPSBFR0xfTk9fSU1BR0VfS0hSOwotCi0gICAgICAgICAgICAvLyBQb3N0IHRoZSBtZXNzYWdlIHRvIHRoZSBTdXJmYWNlRmxpbmdlciBvYmplY3QuCi0gICAgICAgICAgICBmbGluZ2VyLT5wb3N0TWVzc2FnZUFzeW5jKG1zZyk7Ci0gICAgICAgIH0KKyAgICAvLyBUT0RPOiBzaG91bGQgd2UgZG8gc29tZXRoaW5nIHNwZWNpYWwgaWYgbVNlY3VyZSBpcyBzZXQ/CisgICAgaWYgKG1Qcm90ZWN0ZWRCeUFwcCkgeworICAgICAgICAvLyBuZWVkIGEgaGFyZHdhcmUtcHJvdGVjdGVkIHBhdGggdG8gZXh0ZXJuYWwgdmlkZW8gc2luaworICAgICAgICB1c2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9QUk9URUNURUQ7CiAgICAgfQotCi0gICAgbU51bUJ1ZmZlcnMgPSBzaXplOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gb25seSBmb3IgZGVidWdnaW5nCi1zcDxHcmFwaGljQnVmZmVyPiBMYXllcjo6QnVmZmVyTWFuYWdlcjo6Z2V0QnVmZmVyKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBtQnVmZmVyRGF0YVtpbmRleF0uYnVmZmVyOwotfQotCi1zdGF0dXNfdCBMYXllcjo6QnVmZmVyTWFuYWdlcjo6c2V0QWN0aXZlQnVmZmVySW5kZXgoc2l6ZV90IGluZGV4KSB7Ci0gICAgQnVmZmVyRGF0YSBjb25zdCAqIGNvbnN0IGJ1ZmZlcnMgPSBtQnVmZmVyRGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1BY3RpdmVCdWZmZXIgPSBidWZmZXJzW2luZGV4XS5idWZmZXI7Ci0gICAgbUFjdGl2ZUJ1ZmZlckluZGV4ID0gaW5kZXg7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zaXplX3QgTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OmdldEFjdGl2ZUJ1ZmZlckluZGV4KCkgY29uc3QgewotICAgIHJldHVybiBtQWN0aXZlQnVmZmVySW5kZXg7Ci19Ci0KLVRleHR1cmUgTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OmdldEFjdGl2ZVRleHR1cmUoKSBjb25zdCB7Ci0gICAgVGV4dHVyZSByZXM7Ci0gICAgaWYgKG1GYWlsb3ZlciB8fCBtQWN0aXZlQnVmZmVySW5kZXg8MCkgewotICAgICAgICByZXMgPSBtRmFpbG92ZXJUZXh0dXJlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PEltYWdlJj4ocmVzKSA9IG1CdWZmZXJEYXRhW21BY3RpdmVCdWZmZXJJbmRleF0udGV4dHVyZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3A8R3JhcGhpY0J1ZmZlcj4gTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OmdldEFjdGl2ZUJ1ZmZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFjdGl2ZUJ1ZmZlcjsKLX0KLQotYm9vbCBMYXllcjo6QnVmZmVyTWFuYWdlcjo6aGFzQWN0aXZlQnVmZmVyKCkgY29uc3QgewotICAgIHJldHVybiBtQWN0aXZlQnVmZmVySW5kZXggPj0gMDsKLX0KLQotc3A8R3JhcGhpY0J1ZmZlcj4gTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OmRldGFjaEJ1ZmZlcihzaXplX3QgaW5kZXgpCi17Ci0gICAgQnVmZmVyRGF0YSogY29uc3QgYnVmZmVycyA9IG1CdWZmZXJEYXRhOwotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcjsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGJ1ZmZlciA9IGJ1ZmZlcnNbaW5kZXhdLmJ1ZmZlcjsKLSAgICBidWZmZXJzW2luZGV4XS5idWZmZXIgPSAwOwotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLXN0YXR1c190IExheWVyOjpCdWZmZXJNYW5hZ2VyOjphdHRhY2hCdWZmZXIoc2l6ZV90IGluZGV4LAotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKQotewotICAgIEJ1ZmZlckRhdGEqIGNvbnN0IGJ1ZmZlcnMgPSBtQnVmZmVyRGF0YTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGJ1ZmZlcnNbaW5kZXhdLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBidWZmZXJzW2luZGV4XS50ZXh0dXJlLmRpcnR5ID0gdHJ1ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IExheWVyOjpCdWZmZXJNYW5hZ2VyOjpkZXN0cm95KEVHTERpc3BsYXkgZHB5KQotewotICAgIEJ1ZmZlckRhdGEqIGNvbnN0IGJ1ZmZlcnMgPSBtQnVmZmVyRGF0YTsKLSAgICBzaXplX3QgbnVtOwotICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG51bSA9IG1OdW1CdWZmZXJzOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPG51bSA7IGkrKykgewotICAgICAgICAgICAgYnVmZmVyc1tpXS5idWZmZXIgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8bnVtIDsgaSsrKSB7Ci0gICAgICAgIGRlc3Ryb3lUZXh0dXJlKCZidWZmZXJzW2ldLnRleHR1cmUsIGRweSk7Ci0gICAgfQotICAgIGRlc3Ryb3lUZXh0dXJlKCZtRmFpbG92ZXJUZXh0dXJlLCBkcHkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTGF5ZXI6OkJ1ZmZlck1hbmFnZXI6OmluaXRFZ2xJbWFnZShFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSBOT19JTklUOwotICAgIHNzaXplX3QgaW5kZXggPSBtQWN0aXZlQnVmZmVySW5kZXg7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgaWYgKCFtRmFpbG92ZXIpIHsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdGhhdCBsb2NrLCB0aGVyZSBpcyBhIGNoYW5jZSBvZiByYWNlIGNvbmRpdGlvbgotICAgICAgICAgICAgICAgLy8gd2hlcmUgd2hpbGUgY29tcG9zaW5nIGEgc3BlY2lmaWMgaW5kZXgsIHJlcXVlc3RCdWYKLSAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIHNhbWUgaW5kZXggY2FuIGJlIGV4ZWN1dGVkIGFuZCB0b3VjaCB0aGUgc2FtZSBkYXRhCi0gICAgICAgICAgICAgICAvLyB0aGF0IGlzIGJlaW5nIHVzZWQgaW4gaW5pdEVnbEltYWdlLgotICAgICAgICAgICAgICAgLy8gKGUuZy4gZGlydHkgZmxhZyBpbiB0ZXh0dXJlKQotICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgICAgIEltYWdlJiB0ZXh0dXJlKG1CdWZmZXJEYXRhW2luZGV4XS50ZXh0dXJlKTsKLSAgICAgICAgICAgICAgIGVyciA9IG1UZXh0dXJlTWFuYWdlci5pbml0RWdsSW1hZ2UoJnRleHR1cmUsIGRweSwgYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIEVHTEltYWdlIGZhaWxzLCB3ZSBzd2l0Y2ggdG8gcmVndWxhciB0ZXh0dXJlIG1vZGUsIGFuZCB3ZQotICAgICAgICAgICAgLy8gZnJlZSBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB1c2luZyBFR0xJbWFnZXMuCi0gICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbUZhaWxvdmVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZGVzdHJveVRleHR1cmUoJm1GYWlsb3ZlclRleHR1cmUsIGRweSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1GYWlsb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bSA9IG1OdW1CdWZmZXJzOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8bnVtIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lUZXh0dXJlKCZtQnVmZmVyRGF0YVtpXS50ZXh0dXJlLCBkcHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdlIGZhaWxlZCBvbmNlLCBkb24ndCB0cnkgYWdhaW4KLSAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBMYXllcjo6QnVmZmVyTWFuYWdlcjo6bG9hZFRleHR1cmUoCi0gICAgICAgIGNvbnN0IFJlZ2lvbiYgZGlydHksIGNvbnN0IEdHTFN1cmZhY2UmIHQpCi17Ci0gICAgcmV0dXJuIG1UZXh0dXJlTWFuYWdlci5sb2FkVGV4dHVyZSgmbUZhaWxvdmVyVGV4dHVyZSwgZGlydHksIHQpOwotfQotCi1zdGF0dXNfdCBMYXllcjo6QnVmZmVyTWFuYWdlcjo6ZGVzdHJveVRleHR1cmUoSW1hZ2UqIHRleCwgRUdMRGlzcGxheSBkcHkpCi17Ci0gICAgaWYgKHRleC0+bmFtZSAhPSAtMVUpIHsKLSAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4LT5uYW1lKTsKLSAgICAgICAgdGV4LT5uYW1lID0gLTFVOwotICAgIH0KLSAgICBpZiAodGV4LT5pbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgIGVnbERlc3Ryb3lJbWFnZUtIUihkcHksIHRleC0+aW1hZ2UpOwotICAgICAgICB0ZXgtPmltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTGF5ZXI6OlN1cmZhY2VMYXllcjo6U3VyZmFjZUxheWVyKGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXI+JiBvd25lcikKLSAgICA6IFN1cmZhY2UoZmxpbmdlciwgb3duZXItPmdldElkZW50aXR5KCksIG93bmVyKQotewotfQotCi1MYXllcjo6U3VyZmFjZUxheWVyOjp+U3VyZmFjZUxheWVyKCkKLXsKLX0KLQotc3A8R3JhcGhpY0J1ZmZlcj4gTGF5ZXI6OlN1cmZhY2VMYXllcjo6cmVxdWVzdEJ1ZmZlcihpbnQgaW5kZXgsCi0gICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpCi17Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOwotICAgIHNwPExheWVyPiBvd25lcihnZXRPd25lcigpKTsKLSAgICBpZiAob3duZXIgIT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgKiByZXF1ZXN0QnVmZmVyKCkgY2Fubm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZAotICAgICAgICAgKiBhcyBpdCBjb3VsZCBjYXVzZSBhIGRlYWQtbG9jaywgc2luY2UgaXQgbWF5IGhhdmUgdG8gd2FpdAotICAgICAgICAgKiBvbiBjb25kaXRpb25zIHVwZGF0ZWQgbXkgdGhlIG1haW4gdGhyZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgYnVmZmVyID0gb3duZXItPnJlcXVlc3RCdWZmZXIoaW5kZXgsIHcsIGgsIGZvcm1hdCwgdXNhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0dXNfdCBMYXllcjo6U3VyZmFjZUxheWVyOjpzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpCi17Ci0gICAgc3RhdHVzX3QgZXJyID0gREVBRF9PQkpFQ1Q7Ci0gICAgc3A8TGF5ZXI+IG93bmVyKGdldE93bmVyKCkpOwotICAgIGlmIChvd25lciAhPSAwKSB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIHNldEJ1ZmZlckNvdW50KCkgY2Fubm90IGJlIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZAotICAgICAgICAgKiBhcyBpdCBjb3VsZCBjYXVzZSBhIGRlYWQtbG9jaywgc2luY2UgaXQgbWF5IGhhdmUgdG8gd2FpdAotICAgICAgICAgKiBvbiBjb25kaXRpb25zIHVwZGF0ZWQgbXkgdGhlIG1haW4gdGhyZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgZXJyID0gb3duZXItPnNldEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKKyAgICByZXR1cm4gdXNhZ2U7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKaW5kZXggMjc4ZDY0ZS4uZTNmYzEzZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCkBAIC0yMCw5ICsyMCwxMSBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+CisKKyNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgogCiAjaW5jbHVkZSA8RUdML2VnbC5oPgogI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KQEAgLTMwLDggKzMyLDggQEAKICNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CiAKICNpbmNsdWRlICJMYXllckJhc2UuaCIKKyNpbmNsdWRlICJTdXJmYWNlVGV4dHVyZUxheWVyLmgiCiAjaW5jbHVkZSAiVHJhbnNmb3JtLmgiCi0jaW5jbHVkZSAiVGV4dHVyZU1hbmFnZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCwxMSArNDIsMTAgQEAKIGNsYXNzIEZyZWV6ZUxvY2s7CiBjbGFzcyBDbGllbnQ7CiBjbGFzcyBHTEV4dGVuc2lvbnM7Ci1jbGFzcyBVc2VyQ2xpZW50OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgTGF5ZXIgOiBwdWJsaWMgTGF5ZXJCYXNlQ2xpZW50CitjbGFzcyBMYXllciA6IHB1YmxpYyBMYXllckJhc2VDbGllbnQsIHByaXZhdGUgUmVmQmFzZTo6RGVzdHJveWVyCiB7CiBwdWJsaWM6CiAgICAgICAgICAgICBMYXllcihTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXksCkBAIC01OCwxNjQgKzU5LDU5IEBACiAgICAgc3RhdHVzX3Qgc2V0QnVmZmVycyh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCAKICAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgZmxhZ3M9MCk7CiAKLSAgICAvLyBhc3NvY2lhdGUgYSBVc2VyQ2xpZW50IHRvIHRoaXMgTGF5ZXIKLSAgICBzdGF0dXNfdCBzZXRUb2tlbihjb25zdCBzcDxVc2VyQ2xpZW50PiYgdWMsIFNoYXJlZENsaWVudCogc2MsIGludDMyX3QgaWR4KTsKLSAgICBpbnQzMl90IGdldFRva2VuKCkgY29uc3Q7Ci0gICAgc3A8VXNlckNsaWVudD4gZ2V0Q2xpZW50KCkgY29uc3Q7Ci0KICAgICAvLyBTZXQgdGhpcyBMYXllcidzIGJ1ZmZlcnMgc2l6ZQotICAgIHZvaWQgc2V0QnVmZmVyU2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKICAgICBib29sIGlzRml4ZWRTaXplKCkgY29uc3Q7CiAKICAgICAvLyBMYXllckJhc2UgaW50ZXJmYWNlCiAgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0UGVyRnJhbWVEYXRhKGh3Y19sYXllcl90KiBod2NsKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0ZvclNyZWVuU2hvdCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGRvVHJhbnNhY3Rpb24odWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyk7CiAgICAgdmlydHVhbCB2b2lkIGxvY2tQYWdlRmxpcChib29sJiByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyk7CiAgICAgdmlydHVhbCB2b2lkIHVubG9ja1BhZ2VGbGlwKGNvbnN0IFRyYW5zZm9ybSYgcGxhbmVUcmFuc2Zvcm0sIFJlZ2lvbiYgb3V0RGlydHlSZWdpb24pOwotICAgIHZpcnR1YWwgYm9vbCBuZWVkc0JsZW5kaW5nKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBuZWVkc0JsZW5kaW5nKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGlzT3BhcXVlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBib29sIG5lZWRzRGl0aGVyaW5nKCkgY29uc3QgICAgIHsgcmV0dXJuIG1OZWVkc0RpdGhlcmluZzsgfQotICAgIHZpcnR1YWwgYm9vbCBuZWVkc0ZpbHRlcmluZygpIGNvbnN0OwogICAgIHZpcnR1YWwgYm9vbCBpc1NlY3VyZSgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiBtU2VjdXJlOyB9CiAgICAgdmlydHVhbCBib29sIGlzUHJvdGVjdGVkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzcDxTdXJmYWNlPiBjcmVhdGVTdXJmYWNlKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIG9uUmVtb3ZlZCgpOwogCiAgICAgLy8gb25seSBmb3IgZGVidWdnaW5nCi0gICAgaW5saW5lIHNwPEdyYXBoaWNCdWZmZXI+IGdldEJ1ZmZlcihpbnQgaSkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1ZmZlck1hbmFnZXIuZ2V0QnVmZmVyKGkpOyB9Ci0gICAgLy8gb25seSBmb3IgZGVidWdnaW5nCi0gICAgaW5saW5lIGNvbnN0IHNwPEZyZWV6ZUxvY2s+JiAgZ2V0RnJlZXplTG9jaygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1GcmVlemVMb2NrOyB9CisgICAgaW5saW5lIGNvbnN0IHNwPEZyZWV6ZUxvY2s+JiAgZ2V0RnJlZXplTG9jaygpIGNvbnN0IHsgcmV0dXJuIG1GcmVlemVMb2NrOyB9CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KFJlZkJhc2UgY29uc3QqIGJhc2UpOworICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3Qgc2l6ZSkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCByZWxvYWRUZXh0dXJlKGNvbnN0IFJlZ2lvbiYgZGlydHkpOworICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlVGV4dHVyZUxheWVyOworICAgIHZvaWQgb25GcmFtZVF1ZXVlZCgpOworICAgIHZpcnR1YWwgc3A8SVN1cmZhY2U+IGNyZWF0ZVN1cmZhY2UoKTsKICAgICB1aW50MzJfdCBnZXRFZmZlY3RpdmVVc2FnZSh1aW50MzJfdCB1c2FnZSkgY29uc3Q7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gcmVxdWVzdEJ1ZmZlcihpbnQgYnVmZmVySWR4LAotICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7Ci0gICAgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KTsKKyAgICB2b2lkIHNldEZpeGVkU2l6ZShib29sIGZpeGVkU2l6ZSk7CisgICAgYm9vbCBpc0Nyb3BwZWQoKSBjb25zdDsKKyAgICBzdGF0aWMgYm9vbCBnZXRPcGFjaXR5Rm9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7CiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gICAgY2xhc3MgU3VyZmFjZUxheWVyIDogcHVibGljIExheWVyQmFzZUNsaWVudDo6U3VyZmFjZSB7Ci0gICAgcHVibGljOgotICAgICAgICBTdXJmYWNlTGF5ZXIoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLCBjb25zdCBzcDxMYXllcj4mIG93bmVyKTsKLSAgICAgICAgflN1cmZhY2VMYXllcigpOwotICAgIHByaXZhdGU6Ci0gICAgICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gcmVxdWVzdEJ1ZmZlcihpbnQgYnVmZmVySWR4LAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0gICAgICAgIHNwPExheWVyPiBnZXRPd25lcigpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxMYXllcio+KFN1cmZhY2U6OmdldE93bmVyKCkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBmcmllbmQgY2xhc3MgU3VyZmFjZUxheWVyOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIGNsYXNzIENsaWVudFJlZiB7Ci0gICAgICAgIENsaWVudFJlZihjb25zdCBDbGllbnRSZWYmIHJocyk7Ci0gICAgICAgIENsaWVudFJlZiYgb3BlcmF0b3IgPSAoY29uc3QgQ2xpZW50UmVmJiByaHMpOwotICAgICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgICAgICAvLyBiaW5kZXIgdGhyZWFkLCBwYWdlLWZsaXAgdGhyZWFkCi0gICAgICAgIHNwPFNoYXJlZEJ1ZmZlclNlcnZlcj4gbUNvbnRyb2xCbG9jazsKLSAgICAgICAgd3A8VXNlckNsaWVudD4gbVVzZXJDbGllbnQ7Ci0gICAgICAgIGludDMyX3QgbVRva2VuOwotICAgIHB1YmxpYzoKLSAgICAgICAgQ2xpZW50UmVmKCk7Ci0gICAgICAgIH5DbGllbnRSZWYoKTsKLSAgICAgICAgaW50MzJfdCBnZXRUb2tlbigpIGNvbnN0OwotICAgICAgICBzcDxVc2VyQ2xpZW50PiBnZXRDbGllbnQoKSBjb25zdDsKLSAgICAgICAgc3RhdHVzX3Qgc2V0VG9rZW4oY29uc3Qgc3A8VXNlckNsaWVudD4mIHVjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNoYXJlZEJ1ZmZlclNlcnZlcj4mIHNoYXJlZENsaWVudCwgaW50MzJfdCB0b2tlbik7Ci0gICAgICAgIHNwPFVzZXJDbGllbnQ+IGdldFVzZXJDbGllbnRVbnNhZmUoKSBjb25zdDsKLSAgICAgICAgY2xhc3MgQWNjZXNzIHsKLSAgICAgICAgICAgIEFjY2Vzcyhjb25zdCBBY2Nlc3MmIHJocyk7Ci0gICAgICAgICAgICBBY2Nlc3MmIG9wZXJhdG9yID0gKGNvbnN0IEFjY2VzcyYgcmhzKTsKLSAgICAgICAgICAgIHNwPFVzZXJDbGllbnQ+IG1Vc2VyQ2xpZW50U3Ryb25nUmVmOwotICAgICAgICAgICAgc3A8U2hhcmVkQnVmZmVyU2VydmVyPiBtQ29udHJvbEJsb2NrOwotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBY2Nlc3MoY29uc3QgQ2xpZW50UmVmJiByZWYpOwotICAgICAgICAgICAgfkFjY2VzcygpOwotICAgICAgICAgICAgaW5saW5lIFNoYXJlZEJ1ZmZlclNlcnZlciogZ2V0KCkgY29uc3QgeyByZXR1cm4gbUNvbnRyb2xCbG9jay5nZXQoKTsgfQotICAgICAgICB9OwotICAgICAgICBmcmllbmQgY2xhc3MgQWNjZXNzOwotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgY2xhc3MgQnVmZmVyTWFuYWdlciB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTlVNX0JVRkZFUlMgPSAyOwotICAgICAgICBzdHJ1Y3QgQnVmZmVyRGF0YSB7Ci0gICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAgIGJ1ZmZlcjsKLSAgICAgICAgICAgIEltYWdlICAgICAgICAgICAgICAgdGV4dHVyZTsKLSAgICAgICAgfTsKLSAgICAgICAgLy8gdGhpcyBsb2NrIHByb3RlY3QgbUJ1ZmZlckRhdGFbXS5idWZmZXIgYnV0IHNpbmNlIHRoZXJlCi0gICAgICAgIC8vIGlzIHZlcnkgbGl0dGxlIGNvbnRlbnRpb24sIHdlIGhhdmUgb25seSBvbmUgbGlrZSBmb3IKLSAgICAgICAgLy8gdGhlIHdob2xlIGFycmF5LCB3ZSBhbHNvIHVzZSBpdCB0byBwcm90ZWN0IG1OdW1CdWZmZXJzLgotICAgICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgICAgICBCdWZmZXJEYXRhICAgICAgICAgIG1CdWZmZXJEYXRhW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fQlVGRkVSX01BWF07Ci0gICAgICAgIHNpemVfdCAgICAgICAgICAgICAgbU51bUJ1ZmZlcnM7Ci0gICAgICAgIFRleHR1cmUgICAgICAgICAgICAgbUZhaWxvdmVyVGV4dHVyZTsKLSAgICAgICAgVGV4dHVyZU1hbmFnZXImICAgICBtVGV4dHVyZU1hbmFnZXI7Ci0gICAgICAgIHNzaXplX3QgICAgICAgICAgICAgbUFjdGl2ZUJ1ZmZlckluZGV4OwotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAgIG1BY3RpdmVCdWZmZXI7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUZhaWxvdmVyOwotICAgICAgICBzdGF0aWMgc3RhdHVzX3QgZGVzdHJveVRleHR1cmUoSW1hZ2UqIHRleCwgRUdMRGlzcGxheSBkcHkpOwotCi0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgc2l6ZV90IGdldERlZmF1bHRCdWZmZXJDb3VudCgpIHsgcmV0dXJuIE5VTV9CVUZGRVJTOyB9Ci0gICAgICAgIEJ1ZmZlck1hbmFnZXIoVGV4dHVyZU1hbmFnZXImIHRtKTsKLSAgICAgICAgfkJ1ZmZlck1hbmFnZXIoKTsKLQotICAgICAgICAvLyBkZXRhY2gvYXR0YWNoIGJ1ZmZlciBmcm9tL3RvIGdpdmVuIGluZGV4Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGRldGFjaEJ1ZmZlcihzaXplX3QgaW5kZXgpOwotICAgICAgICBzdGF0dXNfdCBhdHRhY2hCdWZmZXIoc2l6ZV90IGluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKTsKLSAgICAgICAgLy8gcmVzaXplIHRoZSBudW1iZXIgb2YgYWN0aXZlIGJ1ZmZlcnMKLSAgICAgICAgc3RhdHVzX3QgcmVzaXplKHNpemVfdCBzaXplLCBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgICAgICAgICAgRUdMRGlzcGxheSBkcHkpOwotCi0gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZnJvbSBHTCB0aHJlYWQKLQotICAgICAgICAvLyBzZXQvZ2V0IGFjdGl2ZSBidWZmZXIgaW5kZXgKLSAgICAgICAgc3RhdHVzX3Qgc2V0QWN0aXZlQnVmZmVySW5kZXgoc2l6ZV90IGluZGV4KTsKLSAgICAgICAgc2l6ZV90IGdldEFjdGl2ZUJ1ZmZlckluZGV4KCkgY29uc3Q7Ci0gICAgICAgIC8vIHJldHVybiB0aGUgYWN0aXZlIGJ1ZmZlcgotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnZXRBY3RpdmVCdWZmZXIoKSBjb25zdDsKLSAgICAgICAgLy8gcmV0dXJuIHdldGhlciB3ZSBoYXZlIGFuIGFjdGl2ZSBidWZmZXIKLSAgICAgICAgYm9vbCBoYXNBY3RpdmVCdWZmZXIoKSBjb25zdDsKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBhY3RpdmUgdGV4dHVyZSAob3IgZmFpbC1vdmVyKQotICAgICAgICBUZXh0dXJlIGdldEFjdGl2ZVRleHR1cmUoKSBjb25zdDsKLSAgICAgICAgLy8gZnJlZXMgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhbGwgYnVmZmVycwotICAgICAgICBzdGF0dXNfdCBkZXN0cm95KEVHTERpc3BsYXkgZHB5KTsKLSAgICAgICAgLy8gbG9hZCBiaXRtYXAgZGF0YSBpbnRvIHRoZSBhY3RpdmUgYnVmZmVyCi0gICAgICAgIHN0YXR1c190IGxvYWRUZXh0dXJlKGNvbnN0IFJlZ2lvbiYgZGlydHksIGNvbnN0IEdHTFN1cmZhY2UmIHQpOwotICAgICAgICAvLyBtYWtlIGFjdGl2ZSBidWZmZXIgYW4gRUdMSW1hZ2UgaWYgbmVlZGVkCi0gICAgICAgIHN0YXR1c190IGluaXRFZ2xJbWFnZShFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKTsKLQotICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIC8vIG9ubHkgZm9yIGRlYnVnZ2luZwotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnZXRCdWZmZXIoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBjb25zdGFudHMKKyAgICBzcDxTdXJmYWNlVGV4dHVyZUxheWVyPiBtU3VyZmFjZVRleHR1cmU7CisgICAgR0x1aW50IG1UZXh0dXJlTmFtZTsKIAogICAgIC8vIHRocmVhZC1zYWZlCi0gICAgQ2xpZW50UmVmIG1Vc2VyQ2xpZW50UmVmOworICAgIHZvbGF0aWxlIGludDMyX3QgbVF1ZXVlZEZyYW1lczsKKworICAgIC8vIG1haW4gdGhyZWFkCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUFjdGl2ZUJ1ZmZlcjsKKyAgICBHTGZsb2F0IG1UZXh0dXJlTWF0cml4WzE2XTsKKyAgICBSZWN0IG1DdXJyZW50Q3JvcDsKKyAgICB1aW50MzJfdCBtQ3VycmVudFRyYW5zZm9ybTsKKyAgICBib29sIG1DdXJyZW50T3BhY2l0eTsKIAogICAgIC8vIGNvbnN0YW50cwogICAgIFBpeGVsRm9ybWF0IG1Gb3JtYXQ7CiAgICAgY29uc3QgR0xFeHRlbnNpb25zJiBtR0xFeHRlbnNpb25zOwotICAgIGJvb2wgbU5lZWRzQmxlbmRpbmc7CisgICAgYm9vbCBtT3BhcXVlTGF5ZXI7CiAgICAgYm9vbCBtTmVlZHNEaXRoZXJpbmc7CiAKICAgICAvLyBwYWdlLWZsaXAgdGhyZWFkIChjdXJyZW50bHkgbWFpbiB0aHJlYWQpCkBAIC0yMjYsMTggKzEyMiw4IEBACiAgICAgLy8gcGFnZS1mbGlwIHRocmVhZCBhbmQgdHJhbnNhY3Rpb24gdGhyZWFkIChjdXJyZW50bHkgbWFpbiB0aHJlYWQpCiAgICAgc3A8RnJlZXplTG9jaz4gIG1GcmVlemVMb2NrOwogCi0gICAgLy8gc2VlIHRocmVhZGluZyB1c2FnZSBpbiBkZWNsYXJhdGlvbgotICAgIFRleHR1cmVNYW5hZ2VyIG1UZXh0dXJlTWFuYWdlcjsKLSAgICBCdWZmZXJNYW5hZ2VyIG1CdWZmZXJNYW5hZ2VyOwotCiAgICAgLy8gYmluZGVyIHRocmVhZCwgdHJhbnNhY3Rpb24gdGhyZWFkCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLSAgICB1aW50MzJfdCBtUmVxV2lkdGg7Ci0gICAgdWludDMyX3QgbVJlcUhlaWdodDsKLSAgICB1aW50MzJfdCBtUmVxRm9ybWF0OwotICAgIGJvb2wgbU5lZWRzU2NhbGluZzsKICAgICBib29sIG1GaXhlZFNpemU7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcAppbmRleCAwMjJmMjUxLi5iY2Q4YzgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyQmFzZS5jcHAKQEAgLTMyLDggKzMyLDYgQEAKICNpbmNsdWRlICJMYXllckJhc2UuaCIKICNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgogI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLSNpbmNsdWRlICJUZXh0dXJlTWFuYWdlci5oIgotCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDQsNyArNDIsNyBAQAogTGF5ZXJCYXNlOjpMYXllckJhc2UoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5KQogICAgIDogZHB5KGRpc3BsYXkpLCBjb250ZW50RGlydHkoZmFsc2UpLAogICAgICAgc2VxdWVuY2UodWludDMyX3QoYW5kcm9pZF9hdG9taWNfaW5jKCZzU2VxdWVuY2UpKSksCi0gICAgICBtRmxpbmdlcihmbGluZ2VyKSwKKyAgICAgIG1GbGluZ2VyKGZsaW5nZXIpLCBtRmlsdGVyaW5nKGZhbHNlKSwKICAgICAgIG1OZWVkc0ZpbHRlcmluZyhmYWxzZSksCiAgICAgICBtT3JpZW50YXRpb24oMCksCiAgICAgICBtTGVmdCgwKSwgbVRvcCgwKSwKQEAgLTU0LDggKzUyLDYgQEAKIHsKICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGZsaW5nZXItPmdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CiAgICAgbUZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLSAgICBtQnVmZmVyQ3JvcC5tYWtlSW52YWxpZCgpOwotICAgIG1CdWZmZXJUcmFuc2Zvcm0gPSAwOwogfQogCiBMYXllckJhc2U6On5MYXllckJhc2UoKQpAQCAtMzEwLDYgKzMwNiwxNiBAQAogICAgIGh3Y2wtPmhhbmRsZSA9IE5VTEw7CiB9CiAKK3ZvaWQgTGF5ZXJCYXNlOjpzZXRGaWx0ZXJpbmcoYm9vbCBmaWx0ZXJpbmcpCit7CisgICAgbUZpbHRlcmluZyA9IGZpbHRlcmluZzsKK30KKworYm9vbCBMYXllckJhc2U6OmdldEZpbHRlcmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1GaWx0ZXJpbmc7Cit9CisKIHZvaWQgTGF5ZXJCYXNlOjpkcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKIHsKICAgICAvLyByZXNldCBHTCBzdGF0ZQpAQCAtMzE4LDEwICszMjQsMTIgQEAKICAgICBvbkRyYXcoY2xpcCk7CiB9CiAKLXZvaWQgTGF5ZXJCYXNlOjpkcmF3Rm9yU3JlZW5TaG90KCkgY29uc3QKK3ZvaWQgTGF5ZXJCYXNlOjpkcmF3Rm9yU3JlZW5TaG90KCkKIHsKICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7CisgICAgc2V0RmlsdGVyaW5nKHRydWUpOwogICAgIG9uRHJhdyggUmVnaW9uKGh3LmJvdW5kcygpKSApOworICAgIHNldEZpbHRlcmluZyhmYWxzZSk7CiB9CiAKIHZvaWQgTGF5ZXJCYXNlOjpjbGVhcldpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwLCBHTGNsYW1wZiByZWQsCkBAIC0zMzIsOCArMzQwLDEyIEBACiAgICAgY29uc3QgdWludDMyX3QgZmJIZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKICAgICBnbENvbG9yNGYocmVkLGdyZWVuLGJsdWUsYWxwaGEpOwogCi0gICAgVGV4dHVyZU1hbmFnZXI6OmRlYWN0aXZhdGVUZXh0dXJlcygpOwotCisjaWYgZGVmaW5lZChHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsKQorICAgICAgICBpZiAoR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhdmVUZXh0dXJlRXh0ZXJuYWwoKSkgeworICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwogICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CiAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CiAKQEAgLTM1NCwyNCArMzY2LDExIEBACiAgICAgY2xlYXJXaXRoT3BlbkdMKGNsaXAsMCwwLDAsMCk7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZQotdm9pZCBzd2FwKFQmIGEsIFQmIGIpIHsKLSAgICBUIHQoYSk7Ci0gICAgYSA9IGI7Ci0gICAgYiA9IHQ7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpkcmF3V2l0aE9wZW5HTChjb25zdCBSZWdpb24mIGNsaXAsIGNvbnN0IFRleHR1cmUmIHRleHR1cmUpIGNvbnN0Cit2b2lkIExheWVyQmFzZTo6ZHJhd1dpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdAogewogICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKICAgICBjb25zdCB1aW50MzJfdCBmYkhlaWdodCA9IGh3LmdldEhlaWdodCgpOwogICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICAKLSAgICAvLyBiaW5kIG91ciB0ZXh0dXJlCi0gICAgVGV4dHVyZU1hbmFnZXI6OmFjdGl2YXRlVGV4dHVyZSh0ZXh0dXJlLCBuZWVkc0ZpbHRlcmluZygpKTsKLSAgICB1aW50MzJfdCB3aWR0aCAgPSB0ZXh0dXJlLndpZHRoOyAKLSAgICB1aW50MzJfdCBoZWlnaHQgPSB0ZXh0dXJlLmhlaWdodDsKIAogICAgIEdMZW51bSBzcmMgPSBtUHJlbXVsdGlwbGllZEFscGhhID8gR0xfT05FIDogR0xfU1JDX0FMUEhBOwogICAgIGlmIChVTkxJS0VMWShzLmFscGhhIDwgMHhGRikpIHsKQEAgLTM4Nyw3ICszODYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGdsQ29sb3I0ZigxLCAxLCAxLCAxKTsKICAgICAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgICAgaWYgKG5lZWRzQmxlbmRpbmcoKSkgeworICAgICAgICBpZiAoIWlzT3BhcXVlKCkpIHsKICAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKICAgICAgICAgICAgIGdsQmxlbmRGdW5jKHNyYywgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zOTUsODYgKzM5NCwyMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiAgY29tcHV0ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzCi0gICAgICogIGhlcmUsIHdlIGhhbmRsZSBOUE9ULCBjcm9wcGluZyBhbmQgYnVmZmVyIHRyYW5zZm9ybWF0aW9ucwotICAgICAqLwotCi0gICAgR0xmbG9hdCBjbCwgY3QsIGNyLCBjYjsKLSAgICBpZiAoIW1CdWZmZXJDcm9wLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBzb3VyY2UgaXMgY3JvcHBlZAotICAgICAgICBjb25zdCBHTGZsb2F0IHVzID0gKHRleHR1cmUuTlBPVEFkanVzdCA/IHRleHR1cmUud1NjYWxlIDogMS4wZikgLyB3aWR0aDsKLSAgICAgICAgY29uc3QgR0xmbG9hdCB2cyA9ICh0ZXh0dXJlLk5QT1RBZGp1c3QgPyB0ZXh0dXJlLmhTY2FsZSA6IDEuMGYpIC8gaGVpZ2h0OwotICAgICAgICBjbCA9IG1CdWZmZXJDcm9wLmxlZnQgICAqIHVzOwotICAgICAgICBjdCA9IG1CdWZmZXJDcm9wLnRvcCAgICAqIHZzOwotICAgICAgICBjciA9IG1CdWZmZXJDcm9wLnJpZ2h0ICAqIHVzOwotICAgICAgICBjYiA9IG1CdWZmZXJDcm9wLmJvdHRvbSAqIHZzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNsID0gMDsKLSAgICAgICAgY3QgPSAwOwotICAgICAgICBjciA9ICh0ZXh0dXJlLk5QT1RBZGp1c3QgPyB0ZXh0dXJlLndTY2FsZSA6IDEuMGYpOwotICAgICAgICBjYiA9ICh0ZXh0dXJlLk5QT1RBZGp1c3QgPyB0ZXh0dXJlLmhTY2FsZSA6IDEuMGYpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRm9yIHRoZSBidWZmZXIgdHJhbnNmb3JtYXRpb24sIHdlIGFwcGx5IHRoZSByb3RhdGlvbiBsYXN0LgotICAgICAqIFNpbmNlIHdlJ3JlIHRyYW5zZm9ybWluZyB0aGUgdGV4dHVyZS1jb29yZGluYXRlcywgd2UgbmVlZAotICAgICAqIHRvIGFwcGx5IHRoZSBpbnZlcnNlIG9mIHRoZSBidWZmZXIgdHJhbnNmb3JtYXRpb246Ci0gICAgICogICBpbnZlcnNlKCBGTElQX1YgLT4gRkxJUF9IIC0+IFJPVF85MCApCi0gICAgICogICA8PT4gaW52ZXJzZSggUk9UXzkwICogRkxJUF9IICogRkxJUF9WICkKLSAgICAgKiAgICA9ICBpbnZlcnNlKEZMSVBfVikgKiBpbnZlcnNlKEZMSVBfSCkgKiBpbnZlcnNlKFJPVF85MCkKLSAgICAgKiAgICA9ICBGTElQX1YgKiBGTElQX0ggKiBST1RfMjcwCi0gICAgICogICA8PT4gUk9UXzI3MCAtPiBGTElQX0ggLT4gRkxJUF9WCi0gICAgICoKLSAgICAgKiBUaGUgcm90YXRpb24gaXMgcGVyZm9ybWVkIGZpcnN0LCBpbiB0aGUgdGV4dHVyZSBjb29yZGluYXRlIHNwYWNlLgotICAgICAqCi0gICAgICovCi0KICAgICBzdHJ1Y3QgVGV4Q29vcmRzIHsKICAgICAgICAgR0xmbG9hdCB1OwogICAgICAgICBHTGZsb2F0IHY7CiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICAvLyBuYW1lIG9mIHRoZSBjb3JuZXJzIGluIHRoZSB0ZXh0dXJlIG1hcAotICAgICAgICBMQiA9IDAsIC8vIGxlZnQtYm90dG9tCi0gICAgICAgIExUID0gMSwgLy8gbGVmdC10b3AKLSAgICAgICAgUlQgPSAyLCAvLyByaWdodC10b3AKLSAgICAgICAgUkIgPSAzICAvLyByaWdodC1ib3R0b20KLSAgICB9OwotCi0gICAgLy8gdmVydGljZXMgaW4gc2NyZWVuIHNwYWNlCi0gICAgaW50IHZMVCA9IExCOwotICAgIGludCB2TEIgPSBMVDsKLSAgICBpbnQgdlJCID0gUlQ7Ci0gICAgaW50IHZSVCA9IFJCOwotCi0gICAgLy8gdGhlIHRleHR1cmUncyBzb3VyY2UgaXMgcm90YXRlZAotICAgIHVpbnQzMl90IHRyYW5zZm9ybSA9IG1CdWZmZXJUcmFuc2Zvcm07Ci0gICAgaWYgKHRyYW5zZm9ybSAmIEhBTF9UUkFOU0ZPUk1fUk9UXzkwKSB7Ci0gICAgICAgIHZMVCA9IFJCOwotICAgICAgICB2TEIgPSBMQjsKLSAgICAgICAgdlJCID0gTFQ7Ci0gICAgICAgIHZSVCA9IFJUOwotICAgIH0KLSAgICBpZiAodHJhbnNmb3JtICYgSEFMX1RSQU5TRk9STV9GTElQX1YpIHsKLSAgICAgICAgc3dhcCh2TFQsIHZMQik7Ci0gICAgICAgIHN3YXAodlJULCB2UkIpOwotICAgIH0KLSAgICBpZiAodHJhbnNmb3JtICYgSEFMX1RSQU5TRk9STV9GTElQX0gpIHsKLSAgICAgICAgc3dhcCh2TFQsIHZSVCk7Ci0gICAgICAgIHN3YXAodkxCLCB2UkIpOwotICAgIH0KLQogICAgIFRleENvb3JkcyB0ZXhDb29yZHNbNF07Ci0gICAgdGV4Q29vcmRzW3ZMVF0udSA9IGNsOwotICAgIHRleENvb3Jkc1t2TFRdLnYgPSBjdDsKLSAgICB0ZXhDb29yZHNbdkxCXS51ID0gY2w7Ci0gICAgdGV4Q29vcmRzW3ZMQl0udiA9IGNiOwotICAgIHRleENvb3Jkc1t2UkJdLnUgPSBjcjsKLSAgICB0ZXhDb29yZHNbdlJCXS52ID0gY2I7Ci0gICAgdGV4Q29vcmRzW3ZSVF0udSA9IGNyOwotICAgIHRleENvb3Jkc1t2UlRdLnYgPSBjdDsKKyAgICB0ZXhDb29yZHNbMF0udSA9IDA7CisgICAgdGV4Q29vcmRzWzBdLnYgPSAxOworICAgIHRleENvb3Jkc1sxXS51ID0gMDsKKyAgICB0ZXhDb29yZHNbMV0udiA9IDA7CisgICAgdGV4Q29vcmRzWzJdLnUgPSAxOworICAgIHRleENvb3Jkc1syXS52ID0gMDsKKyAgICB0ZXhDb29yZHNbM10udSA9IDE7CisgICAgdGV4Q29vcmRzWzNdLnYgPSAxOwogCiAgICAgaWYgKG5lZWRzRGl0aGVyaW5nKCkpIHsKICAgICAgICAgZ2xFbmFibGUoR0xfRElUSEVSKTsKQEAgLTQ5NywyMCArNDMwLDYgQEAKICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKIH0KIAotdm9pZCBMYXllckJhc2U6OnNldEJ1ZmZlckNyb3AoY29uc3QgUmVjdCYgY3JvcCkgewotICAgIGlmIChtQnVmZmVyQ3JvcCAhPSBjcm9wKSB7Ci0gICAgICAgIG1CdWZmZXJDcm9wID0gY3JvcDsKLSAgICAgICAgbUZsaW5nZXItPmludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgIH0KLX0KLQotdm9pZCBMYXllckJhc2U6OnNldEJ1ZmZlclRyYW5zZm9ybSh1aW50MzJfdCB0cmFuc2Zvcm0pIHsKLSAgICBpZiAobUJ1ZmZlclRyYW5zZm9ybSAhPSB0cmFuc2Zvcm0pIHsKLSAgICAgICAgbUJ1ZmZlclRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKLSAgICAgICAgbUZsaW5nZXItPmludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgIH0KLX0KLQogdm9pZCBMYXllckJhc2U6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAogewogICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7CkBAIC01MTgsMTAgKzQzNywxMCBAQAogICAgICAgICAgICAgIisgJXMgJXBcbiIKICAgICAgICAgICAgICIgICAgICAiCiAgICAgICAgICAgICAiej0lOWQsIHBvcz0oJTRkLCU0ZCksIHNpemU9KCU0ZCwlNGQpLCAiCi0gICAgICAgICAgICAibmVlZHNCbGVuZGluZz0lMWQsIG5lZWRzRGl0aGVyaW5nPSUxZCwgaW52YWxpZGF0ZT0lMWQsICIKKyAgICAgICAgICAgICJpc09wYXF1ZT0lMWQsIG5lZWRzRGl0aGVyaW5nPSUxZCwgaW52YWxpZGF0ZT0lMWQsICIKICAgICAgICAgICAgICJhbHBoYT0weCUwMngsIGZsYWdzPTB4JTA4eCwgdHI9WyUuMmYsICUuMmZdWyUuMmYsICUuMmZdXG4iLAogICAgICAgICAgICAgZ2V0VHlwZUlkKCksIHRoaXMsIHMueiwgdHgoKSwgdHkoKSwgcy53LCBzLmgsCi0gICAgICAgICAgICBuZWVkc0JsZW5kaW5nKCksIG5lZWRzRGl0aGVyaW5nKCksIGNvbnRlbnREaXJ0eSwKKyAgICAgICAgICAgIGlzT3BhcXVlKCksIG5lZWRzRGl0aGVyaW5nKCksIGNvbnRlbnREaXJ0eSwKICAgICAgICAgICAgIHMuYWxwaGEsIHMuZmxhZ3MsCiAgICAgICAgICAgICBzLnRyYW5zZm9ybVswXVswXSwgcy50cmFuc2Zvcm1bMF1bMV0sCiAgICAgICAgICAgICBzLnRyYW5zZm9ybVsxXVswXSwgcy50cmFuc2Zvcm1bMV1bMV0pOwpAQCAtNTU1LDkgKzQ3NCwyMiBAQAogICAgIH0KIH0KIAotc3A8TGF5ZXJCYXNlQ2xpZW50OjpTdXJmYWNlPiBMYXllckJhc2VDbGllbnQ6OmdldFN1cmZhY2UoKQorc3A8SVN1cmZhY2U+IExheWVyQmFzZUNsaWVudDo6Y3JlYXRlU3VyZmFjZSgpCiB7Ci0gICAgc3A8U3VyZmFjZT4gczsKKyAgICBjbGFzcyBCU3VyZmFjZSA6IHB1YmxpYyBCblN1cmZhY2UsIHB1YmxpYyBMYXllckNsZWFuZXIgeworICAgICAgICB2aXJ0dWFsIHNwPElTdXJmYWNlVGV4dHVyZT4gZ2V0U3VyZmFjZVRleHR1cmUoKSBjb25zdCB7IHJldHVybiAwOyB9CisgICAgcHVibGljOgorICAgICAgICBCU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpCisgICAgICAgICAgICA6IExheWVyQ2xlYW5lcihmbGluZ2VyLCBsYXllcikgeyB9CisgICAgfTsKKyAgICBzcDxJU3VyZmFjZT4gc3VyKG5ldyBCU3VyZmFjZShtRmxpbmdlciwgdGhpcykpOworICAgIHJldHVybiBzdXI7Cit9CisKK3NwPElTdXJmYWNlPiBMYXllckJhc2VDbGllbnQ6OmdldFN1cmZhY2UoKQoreworICAgIHNwPElTdXJmYWNlPiBzOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1IYXNTdXJmYWNlLApAQCAtNTczLDEyICs1MDUsNiBAQAogICAgIHJldHVybiBtQ2xpZW50U3VyZmFjZUJpbmRlcjsKIH0KIAotc3A8TGF5ZXJCYXNlQ2xpZW50OjpTdXJmYWNlPiBMYXllckJhc2VDbGllbnQ6OmNyZWF0ZVN1cmZhY2UoKSBjb25zdAotewotICAgIHJldHVybiBuZXcgU3VyZmFjZShtRmxpbmdlciwgbUlkZW50aXR5LAotICAgICAgICAgICAgY29uc3RfY2FzdDxMYXllckJhc2VDbGllbnQgKj4odGhpcykpOwotfQotCiB2b2lkIExheWVyQmFzZUNsaWVudDo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0CiB7CiAgICAgTGF5ZXJCYXNlOjpkdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKQEAgLTYwMSw0NCArNTI3LDE0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1MYXllckJhc2VDbGllbnQ6OlN1cmZhY2U6OlN1cmZhY2UoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKLSAgICAgICAgaW50IGlkZW50aXR5LAotICAgICAgICBjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBvd25lcikgCi0gICAgOiBtRmxpbmdlcihmbGluZ2VyKSwgbUlkZW50aXR5KGlkZW50aXR5KSwgbU93bmVyKG93bmVyKQoteworTGF5ZXJCYXNlQ2xpZW50OjpMYXllckNsZWFuZXI6OkxheWVyQ2xlYW5lcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCisgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKQorICAgIDogbUZsaW5nZXIoZmxpbmdlciksIG1MYXllcihsYXllcikgewogfQogCi1MYXllckJhc2VDbGllbnQ6OlN1cmZhY2U6On5TdXJmYWNlKCkgCi17Ci0gICAgLyoKLSAgICAgKiBUaGlzIGlzIGEgZ29vZCBwbGFjZSB0byBjbGVhbi11cCBhbGwgY2xpZW50IHJlc291cmNlcyAKLSAgICAgKi8KLQorTGF5ZXJCYXNlQ2xpZW50OjpMYXllckNsZWFuZXI6On5MYXllckNsZWFuZXIoKSB7CiAgICAgLy8gZGVzdHJveSBjbGllbnQgcmVzb3VyY2VzCi0gICAgbUZsaW5nZXItPmRlc3Ryb3lTdXJmYWNlKG1Pd25lcik7Ci19Ci0KLXNwPExheWVyQmFzZUNsaWVudD4gTGF5ZXJCYXNlQ2xpZW50OjpTdXJmYWNlOjpnZXRPd25lcigpIGNvbnN0IHsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IG93bmVyKG1Pd25lci5wcm9tb3RlKCkpOwotICAgIHJldHVybiBvd25lcjsKLX0KLQotc3RhdHVzX3QgTGF5ZXJCYXNlQ2xpZW50OjpTdXJmYWNlOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBCblN1cmZhY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotc3A8R3JhcGhpY0J1ZmZlcj4gTGF5ZXJCYXNlQ2xpZW50OjpTdXJmYWNlOjpyZXF1ZXN0QnVmZmVyKGludCBidWZmZXJJZHgsCi0gICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpCi17Ci0gICAgcmV0dXJuIE5VTEw7IAotfQotCi1zdGF0dXNfdCBMYXllckJhc2VDbGllbnQ6OlN1cmZhY2U6OnNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCkKLXsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgbUZsaW5nZXItPmRlc3Ryb3lTdXJmYWNlKG1MYXllcik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAppbmRleCA2YzQ5YTE5Li5mYWY3MWRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgogCiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPHByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaD4KICNpbmNsdWRlIDxwcml2YXRlL3N1cmZhY2VmbGluZ2VyL0xheWVyU3RhdGUuaD4KIAogI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9waXhlbGZsaW5nZXIuaD4KQEAgLTQzLDEzICs0MiwxMiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotY2xhc3MgRGlzcGxheUhhcmR3YXJlOwogY2xhc3MgQ2xpZW50OworY2xhc3MgRGlzcGxheUhhcmR3YXJlOwogY2xhc3MgR3JhcGhpY0J1ZmZlcjsKIGNsYXNzIEdyYXBoaWNQbGFuZTsKIGNsYXNzIExheWVyQmFzZUNsaWVudDsKIGNsYXNzIFN1cmZhY2VGbGluZ2VyOwotY2xhc3MgVGV4dHVyZTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEyMSw3ICsxMTksNyBAQAogICAgICAqIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBkcmF3aW5nLiAgCiAgICAgICovCiAgICAgdmlydHVhbCB2b2lkIGRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0ZvclNyZWVuU2hvdCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBkcmF3Rm9yU3JlZW5TaG90KCk7CiAgICAgCiAgICAgLyoqCiAgICAgICogb25EcmF3IC0gZHJhd3MgdGhlIHN1cmZhY2UuCkBAIC0xNzQsOSArMTcyLDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgdW5sb2NrUGFnZUZsaXAoY29uc3QgVHJhbnNmb3JtJiBwbGFuZVRyYW5zZm9ybSwgUmVnaW9uJiBvdXREaXJ0eVJlZ2lvbik7CiAgICAgCiAgICAgLyoqCi0gICAgICogbmVlZHNCbGVuZGluZyAtIHRydWUgaWYgdGhpcyBzdXJmYWNlIG5lZWRzIGJsZW5kaW5nCisgICAgICogaXNPcGFxdWUgLSB0cnVlIGlmIHRoaXMgc3VyZmFjZSBpcyBvcGFxdWUKICAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgbmVlZHNCbGVuZGluZygpIGNvbnN0ICB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc09wYXF1ZSgpIGNvbnN0ICB7IHJldHVybiB0cnVlOyB9CiAKICAgICAvKioKICAgICAgKiBuZWVkc0RpdGhlcmluZyAtIHRydWUgaWYgdGhpcyBzdXJmYWNlIG5lZWRzIGRpdGhlcmluZwpAQCAtMTg0LDExICsxODIsOSBAQAogICAgIHZpcnR1YWwgYm9vbCBuZWVkc0RpdGhlcmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAKICAgICAvKioKLSAgICAgKiBuZWVkc0xpbmVhckZpbHRlcmluZyAtIHRydWUgaWYgdGhpcyBzdXJmYWNlIG5lZWRzIGZpbHRlcmluZworICAgICAqIG5lZWRzTGluZWFyRmlsdGVyaW5nIC0gdHJ1ZSBpZiB0aGlzIHN1cmZhY2UncyBzdGF0ZSByZXF1aXJlcyBmaWx0ZXJpbmcKICAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgbmVlZHNGaWx0ZXJpbmcoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoIShtRmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNMT1dfQ09ORklHKSkgJiYgbU5lZWRzRmlsdGVyaW5nOwotICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgbmVlZHNGaWx0ZXJpbmcoKSBjb25zdCB7IHJldHVybiBtTmVlZHNGaWx0ZXJpbmc7IH0KIAogICAgIC8qKgogICAgICAqIGlzU2VjdXJlIC0gdHJ1ZSBpZiB0aGlzIHN1cmZhY2UgaXMgc2VjdXJlLCB0aGF0IGlzIGlmIGl0IHByZXZlbnRzCkBAIC0yMzEsMjEgKzIyNywyNSBAQAogICAgICAgICAgIHZvaWQgY2xlYXJXaXRoT3BlbkdMKGNvbnN0IFJlZ2lvbiYgY2xpcCwgR0xjbGFtcGYgciwgR0xjbGFtcGYgZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGNsYW1wZiBiLCBHTGNsYW1wZiBhbHBoYSkgY29uc3Q7CiAgICAgICAgICAgdm9pZCBjbGVhcldpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLSAgICAgICAgICB2b2lkIGRyYXdXaXRoT3BlbkdMKGNvbnN0IFJlZ2lvbiYgY2xpcCwgY29uc3QgVGV4dHVyZSYgdGV4dHVyZSkgY29uc3Q7Ci0gICAgICAgICAgCi0gICAgICAgICAgLy8gdGhlc2UgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgcG9zdC9kcmF3aW5nIHRocmVhZAotICAgICAgICAgIHZvaWQgc2V0QnVmZmVyQ3JvcChjb25zdCBSZWN0JiBjcm9wKTsKLSAgICAgICAgICB2b2lkIHNldEJ1ZmZlclRyYW5zZm9ybSh1aW50MzJfdCB0cmFuc2Zvcm0pOworICAgICAgICAgIHZvaWQgZHJhd1dpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKKworICAgICAgICAgIHZvaWQgc2V0RmlsdGVyaW5nKGJvb2wgZmlsdGVyaW5nKTsKKyAgICAgICAgICBib29sIGdldEZpbHRlcmluZygpIGNvbnN0OwogCiAgICAgICAgICAgICAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBtRmxhZ3M7CiAKLSAgICAgICAgICAgICAgICAvLyBwb3N0L2RyYXdpbmcgdGhyZWFkCi0gICAgICAgICAgICAgICAgUmVjdCBtQnVmZmVyQ3JvcDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBtQnVmZmVyVHJhbnNmb3JtOworcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAvLyBhY2Nlc3NlZCBvbmx5IGluIHRoZSBtYWluIHRocmVhZAorICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgZmlsdGVyaW5nIGlzIGZvcmNlZCBvbiBvciBub3QKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgbUZpbHRlcmluZzsKIAogICAgICAgICAgICAgICAgIC8vIGNhY2hlZCBkdXJpbmcgdmFsaWRhdGVWaXNpYmlsaXR5KCkKKyAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIGZpbHRlcmluZyBpcyBuZWVkZWQgYi9jIG9mIHRoZSBkcmF3aW5nc3RhdGUKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgbU5lZWRzRmlsdGVyaW5nOworCitwcm90ZWN0ZWQ6CisgICAgICAgICAgICAgICAgLy8gY2FjaGVkIGR1cmluZyB2YWxpZGF0ZVZpc2liaWxpdHkoKQogICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBtT3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgR0xmbG9hdCAgICAgICAgIG1WZXJ0aWNlc1s0XVsyXTsKICAgICAgICAgICAgICAgICBSZWN0ICAgICAgICAgICAgbVRyYW5zZm9ybWVkQm91bmRzOwpAQCAtMjgxLDUyICsyODEsMzggQEAKIGNsYXNzIExheWVyQmFzZUNsaWVudCA6IHB1YmxpYyBMYXllckJhc2UKIHsKIHB1YmxpYzoKLSAgICBjbGFzcyBTdXJmYWNlOwotCiAgICAgICAgICAgICBMYXllckJhc2VDbGllbnQoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KTsKLSAgICB2aXJ0dWFsIH5MYXllckJhc2VDbGllbnQoKTsKIAotICAgICAgICAgICAgc3A8U3VyZmFjZT4gZ2V0U3VyZmFjZSgpOworICAgICAgICAgICAgdmlydHVhbCB+TGF5ZXJCYXNlQ2xpZW50KCk7CisKKyAgICAgICAgICAgIHNwPElTdXJmYWNlPiBnZXRTdXJmYWNlKCk7CiAgICAgICAgICAgICB3cDxJQmluZGVyPiBnZXRTdXJmYWNlQmluZGVyKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzcDxTdXJmYWNlPiBjcmVhdGVTdXJmYWNlKCkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHNwPExheWVyQmFzZUNsaWVudD4gZ2V0TGF5ZXJCYXNlQ2xpZW50KCkgY29uc3QgewogICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxMYXllckJhc2VDbGllbnQqPih0aGlzKTsgfQorCiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRUeXBlSWQoKSBjb25zdCB7IHJldHVybiAiTGF5ZXJCYXNlQ2xpZW50IjsgfQogCiAgICAgdWludDMyX3QgZ2V0SWRlbnRpdHkoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpdHk7IH0KIAotICAgIGNsYXNzIFN1cmZhY2UgOiBwdWJsaWMgQm5TdXJmYWNlICB7Ci0gICAgcHVibGljOgotICAgICAgICBpbnQzMl90IGdldElkZW50aXR5KCkgY29uc3QgeyByZXR1cm4gbUlkZW50aXR5OyB9Ci0gICAgICAgIAotICAgIHByb3RlY3RlZDoKLSAgICAgICAgU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsIGludCBpZGVudGl0eSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBvd25lcik7Ci0gICAgICAgIHZpcnR1YWwgflN1cmZhY2UoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7Ci0gICAgICAgIHNwPExheWVyQmFzZUNsaWVudD4gZ2V0T3duZXIoKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gcmVxdWVzdEJ1ZmZlcihpbnQgYnVmZmVySWR4LAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBMYXllckJhc2VDbGllbnQ7Ci0gICAgICAgIHNwPFN1cmZhY2VGbGluZ2VyPiAgbUZsaW5nZXI7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgICAgbUlkZW50aXR5OwotICAgICAgICB3cDxMYXllckJhc2VDbGllbnQ+IG1Pd25lcjsKLSAgICB9OwotCi0gICAgZnJpZW5kIGNsYXNzIFN1cmZhY2U7Ci0KIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBzaXplKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgc2hvcnREdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogc2NyYXRjaCwgc2l6ZV90IHNpemUpIGNvbnN0OwogCisgICAgY2xhc3MgTGF5ZXJDbGVhbmVyIHsKKyAgICAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOworICAgICAgICB3cDxMYXllckJhc2VDbGllbnQ+IG1MYXllcjsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIH5MYXllckNsZWFuZXIoKTsKKyAgICBwdWJsaWM6CisgICAgICAgIExheWVyQ2xlYW5lcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpOworICAgIH07CisKIHByaXZhdGU6CisgICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSgpOworCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKICAgICBtdXRhYmxlIGJvb2wgbUhhc1N1cmZhY2U7CiAgICAgd3A8SUJpbmRlcj4gbUNsaWVudFN1cmZhY2VCaW5kZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5jcHAKaW5kZXggZjc5MTY2ZC4uNjU0ODE3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmNwcApAQCAtNjUsOCArNjUsNiBAQAogICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLQogICAgICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlcyk7CiAKICAgICAgICAgd2hpbGUgKGl0ICE9IGVuZCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmgKaW5kZXggNzVmOWE4OS4uODc3MGU2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5oCkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgIHZpcnR1YWwgfkxheWVyRGltKCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIG5lZWRzQmxlbmRpbmcoKSBjb25zdCAgICB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIGlzT3BhcXVlKCkgY29uc3QgICAgICAgICB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1NlY3VyZSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNQcm90ZWN0ZWRCeUFwcCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCBib29sIGlzUHJvdGVjdGVkQnlEUk0oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCmluZGV4IGI3YTUxYTQuLjk3ZWRmZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKQEAgLTUzLDYgKzUzLDggQEAKICNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCiAjaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCIKIAorI2luY2x1ZGUgPHByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaD4KKwogLyogaWRlYWxseSBBSURfR1JBUEhJQ1Mgd291bGQgYmUgaW4gYSBzZW1pLXB1YmxpYyBoZWFkZXIKICAqIG9yIHRoZXJlIHdvdWxkIGJlIGEgd2F5IHRvIG1hcCBhIHVzZXIvZ3JvdXAgbmFtZSB0byBpdHMgaWQKICAqLwpAQCAtMTMzLDE3ICsxMzUsNiBAQAogICAgIHJldHVybiBiY2xpZW50OwogfQogCi1zcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBTdXJmYWNlRmxpbmdlcjo6Y3JlYXRlQ2xpZW50Q29ubmVjdGlvbigpCi17Ci0gICAgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gYmNsaWVudDsKLSAgICBzcDxVc2VyQ2xpZW50PiBjbGllbnQobmV3IFVzZXJDbGllbnQodGhpcykpOwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC0+aW5pdENoZWNrKCk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBiY2xpZW50ID0gY2xpZW50OwotICAgIH0KLSAgICByZXR1cm4gYmNsaWVudDsKLX0KLQogc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpCiB7CiAgICAgc3A8R3JhcGhpY0J1ZmZlckFsbG9jPiBnYmEobmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKTsKQEAgLTMyMiwxMSArMzEzLDYgQEAKICAgICBtRXZlbnRRdWV1ZS5pbnZhbGlkYXRlKCk7CiB9CiAKLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnNpZ25hbCgpIGNvbnN0IHsKLSAgICAvLyB0aGlzIGlzIHRoZSBJUEMgY2FsbAotICAgIGNvbnN0X2Nhc3Q8U3VyZmFjZUZsaW5nZXIqPih0aGlzKS0+c2lnbmFsRXZlbnQoKTsKLX0KLQogYm9vbCBTdXJmYWNlRmxpbmdlcjo6YXV0aGVudGljYXRlU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7CiAgICAgc3A8SUJpbmRlcj4gc3VyZkJpbmRlcihzdXJmYWNlLT5hc0JpbmRlcigpKTsKQEAgLTY1OCw3ICs2NDQsNyBAQAogCiAgICAgICAgIC8vIGhhbmRsZSBoaWRkZW4gc3VyZmFjZXMgYnkgc2V0dGluZyB0aGUgdmlzaWJsZSByZWdpb24gdG8gZW1wdHkKICAgICAgICAgaWYgKExJS0VMWSghKHMuZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4pICYmIHMuYWxwaGEpKSB7Ci0gICAgICAgICAgICBjb25zdCBib29sIHRyYW5zbHVjZW50ID0gbGF5ZXItPm5lZWRzQmxlbmRpbmcoKTsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgdHJhbnNsdWNlbnQgPSAhbGF5ZXItPmlzT3BhcXVlKCk7CiAgICAgICAgICAgICBjb25zdCBSZWN0IGJvdW5kcyhsYXllci0+dmlzaWJsZUJvdW5kcygpKTsKICAgICAgICAgICAgIHZpc2libGVSZWdpb24uc2V0KGJvdW5kcyk7CiAgICAgICAgICAgICB2aXNpYmxlUmVnaW9uLmFuZFNlbGYoc2NyZWVuUmVnaW9uKTsKQEAgLTkyMSw3ICs5MDcsNyBAQAogICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChjdXJbaV0uaGludHMgJiBIV0NfSElOVF9DTEVBUl9GQikgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShsYXllci0+bmVlZHNCbGVuZGluZygpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGF5ZXItPmlzT3BhcXVlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50Lm9yU2VsZihsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC05NzksOCArOTY1LDYgQEAKICAgICAgICAgY29tcG9zZVN1cmZhY2VzKHJlcGFpbnQpOwogICAgIH0KIAotICAgIFRleHR1cmVNYW5hZ2VyOjpkZWFjdGl2YXRlVGV4dHVyZXMoKTsKLQogICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CiAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CiAgICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CkBAIC0xMDcwLDYgKzEwNTQsNyBAQAogICAgICAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7CiAgICAgICAgIH0KICAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7CisgICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICAgfQpAQCAtMTI2OSw3ICsxMjU0LDcgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllcjsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ6OlN1cmZhY2U+IHN1cmZhY2VIYW5kbGU7CisgICAgc3A8SVN1cmZhY2U+IHN1cmZhY2VIYW5kbGU7CiAKICAgICBpZiAoaW50MzJfdCh3fGgpIDwgMCkgewogICAgICAgICBMT0dFKCJjcmVhdGVTdXJmYWNlKCkgZmFpbGVkLCB3IG9yIGggaXMgbmVnYXRpdmUgKHc9JWQsIGg9JWQpIiwKQEAgLTEzMDAsMTMgKzEyODUsMTMgQEAKICAgICAgICAgc3VyZmFjZUhhbmRsZSA9IGxheWVyLT5nZXRTdXJmYWNlKCk7CiAgICAgICAgIGlmIChzdXJmYWNlSGFuZGxlICE9IDApIHsKICAgICAgICAgICAgIHBhcmFtcy0+dG9rZW4gPSB0b2tlbjsKLSAgICAgICAgICAgIHBhcmFtcy0+aWRlbnRpdHkgPSBzdXJmYWNlSGFuZGxlLT5nZXRJZGVudGl0eSgpOworICAgICAgICAgICAgcGFyYW1zLT5pZGVudGl0eSA9IGxheWVyLT5nZXRJZGVudGl0eSgpOwogICAgICAgICAgICAgcGFyYW1zLT53aWR0aCA9IHc7CiAgICAgICAgICAgICBwYXJhbXMtPmhlaWdodCA9IGg7CiAgICAgICAgICAgICBwYXJhbXMtPmZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgIGlmIChub3JtYWxMYXllciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgICAgICAgICAgICAgIG1MYXllck1hcC5hZGQoc3VyZmFjZUhhbmRsZS0+YXNCaW5kZXIoKSwgbm9ybWFsTGF5ZXIpOworICAgICAgICAgICAgICAgIG1MYXllck1hcC5hZGQobGF5ZXItPmdldFN1cmZhY2VCaW5kZXIoKSwgbm9ybWFsTGF5ZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE3ODIsNyArMTc2Nyw2IEBACiAKICAgICBHTGZsb2F0IHZ0eFs4XTsKICAgICBjb25zdCBHTGZsb2F0IHRleENvb3Jkc1s0XVsyXSA9IHsgezAsdn0sIHswLDB9LCB7dSwwfSwge3Usdn0gfTsKLSAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRuYW1lKTsKICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwogICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CkBAIC0xOTAwLDYgKzE4ODQsNyBAQAogICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CiAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7CiAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdG5hbWUpOworICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTE5MzAsNyArMTkxNSw2IEBACiAKICAgICBHTGZsb2F0IHZ0eFs4XTsKICAgICBjb25zdCBHTGZsb2F0IHRleENvb3Jkc1s0XVsyXSA9IHsgezAsdn0sIHswLDB9LCB7dSwwfSwge3Usdn0gfTsKLSAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRuYW1lKTsKICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFKTsKICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwpAQCAtMjA0NCw2ICsyMDI4LDcgQEAKICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwogICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwogICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRuYW1lKTsKKyAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0yNDA4LDIwICsyMzkzLDcyIEBACiAgICAgcmV0dXJuIGxiYzsKIH0KIAotc3A8SU1lbW9yeUhlYXA+IENsaWVudDo6Z2V0Q29udHJvbEJsb2NrKCkgY29uc3QgewotICAgIHJldHVybiAwOworCitzdGF0dXNfdCBDbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICAvLyB0aGVzZSBtdXN0IGJlIGNoZWNrZWQKKyAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CisgICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKKyAgICAgaWYgKFVOTElLRUxZKHBpZCAhPSBzZWxmX3BpZCAmJiB1aWQgIT0gQUlEX0dSQVBISUNTICYmIHVpZCAhPSAwKSkgeworICAgICAgICAgLy8gd2UncmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcywgZG8gdGhlIHJlYWwgY2hlY2sKKyAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfU1VSRkFDRV9GTElOR0VSIikpKQorICAgICAgICAgeworICAgICAgICAgICAgIExPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgb3Blbkdsb2JhbFRyYW5zYWN0aW9uIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgIH0KKyAgICAgfQorICAgICByZXR1cm4gQm5TdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KLXNzaXplX3QgQ2xpZW50OjpnZXRUb2tlbkZvclN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXIpIGNvbnN0IHsKLSAgICByZXR1cm4gLTE7Ci19CisKKwogc3A8SVN1cmZhY2U+IENsaWVudDo6Y3JlYXRlU3VyZmFjZSgKICAgICAgICAgSVN1cmZhY2VDb21wb3NlckNsaWVudDo6c3VyZmFjZV9kYXRhX3QqIHBhcmFtcywKICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MpCiB7Ci0gICAgcmV0dXJuIG1GbGluZ2VyLT5jcmVhdGVTdXJmYWNlKHBhcmFtcywgbmFtZSwgdGhpcywKLSAgICAgICAgICAgIGRpc3BsYXksIHcsIGgsIGZvcm1hdCwgZmxhZ3MpOworICAgIC8qCisgICAgICogY3JlYXRlU3VyZmFjZSBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBHTCB0aHJlYWQgc28gdGhhdCBpdCBjYW4KKyAgICAgKiBoYXZlIGFjY2VzcyB0byB0aGUgR0wgY29udGV4dC4KKyAgICAgKi8KKworICAgIGNsYXNzIE1lc3NhZ2VDcmVhdGVTdXJmYWNlIDogcHVibGljIE1lc3NhZ2VCYXNlIHsKKyAgICAgICAgc3A8SVN1cmZhY2U+IHJlc3VsdDsKKyAgICAgICAgU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXI7CisgICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXM7CisgICAgICAgIENsaWVudCogY2xpZW50OworICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lOworICAgICAgICBEaXNwbGF5SUQgZGlzcGxheTsKKyAgICAgICAgdWludDMyX3QgdywgaDsKKyAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0OworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICBwdWJsaWM6CisgICAgICAgIE1lc3NhZ2VDcmVhdGVTdXJmYWNlKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLAorICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgQ2xpZW50KiBjbGllbnQsCisgICAgICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICAgICAgICAgIDogZmxpbmdlcihmbGluZ2VyKSwgcGFyYW1zKHBhcmFtcyksIGNsaWVudChjbGllbnQpLCBuYW1lKG5hbWUpLAorICAgICAgICAgICAgICBkaXNwbGF5KGRpc3BsYXkpLCB3KHcpLCBoKGgpLCBmb3JtYXQoZm9ybWF0KSwgZmxhZ3MoZmxhZ3MpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBzcDxJU3VyZmFjZT4gZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gcmVzdWx0OyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVyKCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmxpbmdlci0+Y3JlYXRlU3VyZmFjZShwYXJhbXMsIG5hbWUsIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheSwgdywgaCwgZm9ybWF0LCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxNZXNzYWdlQmFzZT4gbXNnID0gbmV3IE1lc3NhZ2VDcmVhdGVTdXJmYWNlKG1GbGluZ2VyLmdldCgpLAorICAgICAgICAgICAgcGFyYW1zLCBuYW1lLCB0aGlzLCBkaXNwbGF5LCB3LCBoLCBmb3JtYXQsIGZsYWdzKTsKKyAgICBtRmxpbmdlci0+cG9zdE1lc3NhZ2VTeW5jKG1zZyk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2VDcmVhdGVTdXJmYWNlKj4oIG1zZy5nZXQoKSApLT5nZXRSZXN1bHQoKTsKIH0KIHN0YXR1c190IENsaWVudDo6ZGVzdHJveVN1cmZhY2UoU3VyZmFjZUlEIHNpZCkgewogICAgIHJldHVybiBtRmxpbmdlci0+cmVtb3ZlU3VyZmFjZSh0aGlzLCBzaWQpOwpAQCAtMjQzMiwxMTMgKzI0NjksNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVXNlckNsaWVudDo6VXNlckNsaWVudChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpCi0gICAgOiBjdHJsYmxrKDApLCBtQml0bWFwKDApLCBtRmxpbmdlcihmbGluZ2VyKQotewotICAgIGNvbnN0IGludCBwZ3NpemUgPSBnZXRwYWdlc2l6ZSgpOwotICAgIGNvbnN0IGludCBjYmxrc2l6ZSA9ICgoc2l6ZW9mKFNoYXJlZENsaWVudCkrKHBnc2l6ZS0xKSkmfihwZ3NpemUtMSkpOwotCi0gICAgbUNibGtIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKGNibGtzaXplLCAwLAotICAgICAgICAgICAgIlN1cmZhY2VGbGluZ2VyIENsaWVudCBjb250cm9sLWJsb2NrIik7Ci0KLSAgICBjdHJsYmxrID0gc3RhdGljX2Nhc3Q8U2hhcmVkQ2xpZW50ICo+KG1DYmxrSGVhcC0+Z2V0QmFzZSgpKTsKLSAgICBpZiAoY3RybGJsaykgeyAvLyBjb25zdHJ1Y3QgdGhlIHNoYXJlZCBzdHJ1Y3R1cmUgaW4tcGxhY2UuCi0gICAgICAgIG5ldyhjdHJsYmxrKSBTaGFyZWRDbGllbnQ7Ci0gICAgfQotfQotCi1Vc2VyQ2xpZW50Ojp+VXNlckNsaWVudCgpCi17Ci0gICAgaWYgKGN0cmxibGspIHsKLSAgICAgICAgY3RybGJsay0+flNoYXJlZENsaWVudCgpOyAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdoZW4gYSBVc2VyQ2xpZW50IGRpZXMsIGl0J3MgdW5jbGVhciB3aGF0IHRvIGRvIGV4YWN0bHkuCi0gICAgICogV2UgY291bGQgZ28gYWhlYWQgYW5kIGRlc3Ryb3kgYWxsIHN1cmZhY2VzIGxpbmtlZCB0byB0aGF0IGNsaWVudAotICAgICAqIGhvd2V2ZXIsIGl0IHdvdWxkbid0IGJlIGZhaXIgdG8gdGhlIG1haW4gQ2xpZW50Ci0gICAgICogKHVzdWFsbHkgdGhlIHRoZSB3aW5kb3ctbWFuYWdlciksIHdoaWNoIG1pZ2h0IHdhbnQgdG8gcmUtdGFyZ2V0Ci0gICAgICogdGhlIGxheWVyIHRvIGFub3RoZXIgVXNlckNsaWVudC4KLSAgICAgKiBJIHRoaW5rIHRoZSBiZXN0IGlzIHRvIGRvIG5vdGhpbmcsIG9yIG5vdCBtdWNoOyBpbiBtb3N0IGNhc2VzIHRoZQotICAgICAqIFdNIGl0c2VsZiB3aWxsIGdvIGFoZWFkIGFuZCBjbGVhbiB0aGluZ3MgdXAgd2hlbiBpdCBkZXRlY3RzIGEgY2xpZW50IG9mCi0gICAgICogaGlzIGhhcyBkaWVkLgotICAgICAqIFRoZSByZW1haW5pbmcgcXVlc3Rpb24gaXMgd2hhdCB0byBkaXNwbGF5PyBjdXJyZW50bHkgd2Uga2VlcAotICAgICAqIGp1c3Qga2VlcCB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgICovCi19Ci0KLXN0YXR1c190IFVzZXJDbGllbnQ6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gY3RybGJsayA9PSAwID8gTk9fSU5JVCA6IE5PX0VSUk9SOwotfQotCi12b2lkIFVzZXJDbGllbnQ6OmRldGFjaExheWVyKGNvbnN0IExheWVyKiBsYXllcikKLXsKLSAgICBpbnQzMl90IG5hbWUgPSBsYXllci0+Z2V0VG9rZW4oKTsKLSAgICBpZiAobmFtZSA+PSAwKSB7Ci0gICAgICAgIGludDMyX3QgbWFzayA9IDFMVTw8bmFtZTsKLSAgICAgICAgaWYgKChhbmRyb2lkX2F0b21pY19hbmQofm1hc2ssICZtQml0bWFwKSAmIG1hc2spID09IDApIHsKLSAgICAgICAgICAgIExPR1coInRva2VuICVkIHdhc24ndCBtYXJrZWQgYXMgdXNlZCAlMDh4IiwgbmFtZSwgaW50KG1CaXRtYXApKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3A8SU1lbW9yeUhlYXA+IFVzZXJDbGllbnQ6OmdldENvbnRyb2xCbG9jaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNibGtIZWFwOwotfQotCi1zc2l6ZV90IFVzZXJDbGllbnQ6OmdldFRva2VuRm9yU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cikgY29uc3QKLXsKLSAgICBpbnQzMl90IG5hbWUgPSBOQU1FX05PVF9GT1VORDsKLSAgICBzcDxMYXllcj4gbGF5ZXIobUZsaW5nZXItPmdldExheWVyKHN1cikpOwotICAgIGlmIChsYXllciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIC8vIGlmIHRoaXMgbGF5ZXIgYWxyZWFkeSBoYXMgYSB0b2tlbiwganVzdCByZXR1cm4gaXQKLSAgICBuYW1lID0gbGF5ZXItPmdldFRva2VuKCk7Ci0gICAgaWYgKChuYW1lID49IDApICYmIChsYXllci0+Z2V0Q2xpZW50KCkgPT0gdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgbmFtZSA9IDA7Ci0gICAgZG8gewotICAgICAgICBpbnQzMl90IG1hc2sgPSAxTFU8PG5hbWU7Ci0gICAgICAgIGlmICgoYW5kcm9pZF9hdG9taWNfb3IobWFzaywgJm1CaXRtYXApICYgbWFzaykgPT0gMCkgewotICAgICAgICAgICAgLy8gd2UgZm91bmQgYW5kIGxvY2tlZCB0aGF0IG5hbWUKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGxheWVyLT5zZXRUb2tlbigKLSAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxVc2VyQ2xpZW50Kj4odGhpcyksIGN0cmxibGssIG5hbWUpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIC8vIGZyZWUgdGhlIG5hbWUKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofm1hc2ssICZtQml0bWFwKTsKLSAgICAgICAgICAgICAgICBuYW1lID0gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCsrbmFtZSA+PSBpbnQzMl90KFNoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fTEFZRVJTX01BWCkpCi0gICAgICAgICAgICBuYW1lID0gTk9fTUVNT1JZOwotICAgIH0gd2hpbGUobmFtZSA+PSAwKTsKLQotICAgIC8vTE9HRCgiZ2V0VG9rZW5Gb3JTdXJmYWNlKCVwKSA9PiAlZCAoY2xpZW50PSVwLCBiaXRtYXA9JTA4bHgpIiwKLSAgICAvLyAgICAgICAgc3VyLT5hc0JpbmRlcigpLmdldCgpLCBuYW1lLCB0aGlzLCBtQml0bWFwKTsKLSAgICByZXR1cm4gbmFtZTsKLX0KLQotc3A8SVN1cmZhY2U+IFVzZXJDbGllbnQ6OmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCi0gICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIDA7Ci19Ci1zdGF0dXNfdCBVc2VyQ2xpZW50OjpkZXN0cm95U3VyZmFjZShTdXJmYWNlSUQgc2lkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotc3RhdHVzX3QgVXNlckNsaWVudDo6c2V0U3RhdGUoaW50MzJfdCBjb3VudCwgY29uc3QgbGF5ZXJfc3RhdGVfdCogc3RhdGVzKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogR3JhcGhpY0J1ZmZlckFsbG9jOjpHcmFwaGljQnVmZmVyQWxsb2MoKSB7fQogCiBHcmFwaGljQnVmZmVyQWxsb2M6On5HcmFwaGljQnVmZmVyQWxsb2MoKSB7fQpAQCAtMjU0NywxMSArMjQ3NywxMSBAQAogICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSB7CiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcih3LCBoLCBmb3JtYXQsIHVzYWdlKSk7CiAgICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlci0+aW5pdENoZWNrKCk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIExPR0UoImNyZWF0ZUdyYXBoaWNCdWZmZXI6IGluaXQgY2hlY2sgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAoZ3JhcGhpY0J1ZmZlci0+aGFuZGxlID09IDApIHsKLSAgICAgICAgTE9HRSgiY3JlYXRlR3JhcGhpY0J1ZmZlcjogdW5hYmxlIHRvIGNyZWF0ZSBHcmFwaGljQnVmZmVyIik7CisgICAgaWYgKGVyciAhPSAwIHx8IGdyYXBoaWNCdWZmZXItPmhhbmRsZSA9PSAwKSB7CisgICAgICAgIEdyYXBoaWNCdWZmZXI6OmR1bXBBbGxvY2F0aW9uc1RvU3lzdGVtTG9nKCk7CisgICAgICAgIExPR0UoIkdyYXBoaWNCdWZmZXJBbGxvYzo6Y3JlYXRlR3JhcGhpY0J1ZmZlcih3PSVkLCBoPSVkKSAiCisgICAgICAgICAgICAgImZhaWxlZCAoJXMpLCBoYW5kbGU9JXAiLAorICAgICAgICAgICAgICAgIHcsIGgsIHN0cmVycm9yKC1lcnIpLCBncmFwaGljQnVmZmVyLT5oYW5kbGUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAppbmRleCA5OTI4NjFhLi5hZjFlZjA0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKQEAgLTUwLDYgKzUwLDcgQEAKIGNsYXNzIEZyZWV6ZUxvY2s7CiBjbGFzcyBMYXllcjsKIGNsYXNzIExheWVyRGltOworc3RydWN0IHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Q7CiAKICNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKICNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKQEAgLTcyLDE0ICs3MywxNCBAQAogcHJpdmF0ZToKIAogICAgIC8vIElTdXJmYWNlQ29tcG9zZXJDbGllbnQgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0Q29udHJvbEJsb2NrKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IGdldFRva2VuRm9yU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cikgY29uc3Q7CiAgICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSgKICAgICAgICAgICAgIHN1cmZhY2VfZGF0YV90KiBwYXJhbXMsIGNvbnN0IFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgdWludDMyX3QgdywgdWludDMyX3QgaCxQaXhlbEZvcm1hdCBmb3JtYXQsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95U3VyZmFjZShTdXJmYWNlSUQgc3VyZmFjZUlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0YXRlKGludDMyX3QgY291bnQsIGNvbnN0IGxheWVyX3N0YXRlX3QqIHN0YXRlcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAorICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKIAogICAgIC8vIGNvbnN0YW50CiAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwpAQCAtOTIsNDAgKzkzLDYgQEAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogfTsKIAotY2xhc3MgVXNlckNsaWVudCA6IHB1YmxpYyBCblN1cmZhY2VDb21wb3NlckNsaWVudAotewotcHVibGljOgotICAgIC8vIHBvaW50ZXIgdG8gdGhpcyBjbGllbnQncyBjb250cm9sIGJsb2NrCi0gICAgU2hhcmVkQ2xpZW50KiBjdHJsYmxrOwotCi1wdWJsaWM6Ci0gICAgICAgIFVzZXJDbGllbnQoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyKTsKLSAgICAgICAgflVzZXJDbGllbnQoKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgLy8gcHJvdGVjdGVkIGJ5IFN1cmZhY2VGbGluZ2VyOjptU3RhdGVMb2NrCi0gICAgdm9pZCBkZXRhY2hMYXllcihjb25zdCBMYXllciogbGF5ZXIpOwotCi1wcml2YXRlOgotCi0gICAgLy8gSVN1cmZhY2VDb21wb3NlckNsaWVudCBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRDb250cm9sQmxvY2soKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0VG9rZW5Gb3JTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNwPElTdXJmYWNlPiBjcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgc3VyZmFjZV9kYXRhX3QqIHBhcmFtcywgY29uc3QgU3RyaW5nOCYgbmFtZSwKLSAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzdXJmYWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RhdGUoaW50MzJfdCBjb3VudCwgY29uc3QgbGF5ZXJfc3RhdGVfdCogc3RhdGVzKTsKLQotICAgIC8vIGF0b21pYy1vcHMKLSAgICBtdXRhYmxlIHZvbGF0aWxlIGludDMyX3QgbUJpdG1hcDsKLQotICAgIHNwPElNZW1vcnlIZWFwPiBtQ2Jsa0hlYXA7Ci0gICAgc3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwotfTsKLQogY2xhc3MgR3JhcGhpY0J1ZmZlckFsbG9jIDogcHVibGljIEJuR3JhcGhpY0J1ZmZlckFsbG9jCiB7CiBwdWJsaWM6CkBAIC0xOTksNyArMTY2LDYgQEAKIAogICAgIC8vIElTdXJmYWNlQ29tcG9zZXIgaW50ZXJmYWNlCiAgICAgdmlydHVhbCBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiAgY3JlYXRlQ29ubmVjdGlvbigpOwotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gIGNyZWF0ZUNsaWVudENvbm5lY3Rpb24oKTsKICAgICB2aXJ0dWFsIHNwPElHcmFwaGljQnVmZmVyQWxsb2M+ICAgICBjcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKTsKICAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiAgICAgICAgICAgICBnZXRDYmxrKCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgYm9vdEZpbmlzaGVkKCk7CkBAIC0yMDgsNyArMTc0LDYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICBmcmVlemVEaXNwbGF5KERpc3BsYXlJRCBkcHksIHVpbnQzMl90IGZsYWdzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICB1bmZyZWV6ZURpc3BsYXkoRGlzcGxheUlEIGRweSwgdWludDMyX3QgZmxhZ3MpOwogICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHksIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCgpIGNvbnN0OwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FwdHVyZVNjcmVlbihEaXNwbGF5SUQgZHB5LApAQCAtMjM1LDcgKzIwMCw2IEBACiAgICAgZnJpZW5kIGNsYXNzIENsaWVudDsKICAgICBmcmllbmQgY2xhc3MgTGF5ZXJCYXNlOwogICAgIGZyaWVuZCBjbGFzcyBMYXllckJhc2VDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIExheWVyQmFzZUNsaWVudDo6U3VyZmFjZTsKICAgICBmcmllbmQgY2xhc3MgTGF5ZXI7CiAgICAgZnJpZW5kIGNsYXNzIExheWVyRGltOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlVGV4dHVyZUxheWVyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmE5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlVGV4dHVyZUxheWVyLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJMYXllci5oIgorI2luY2x1ZGUgIlN1cmZhY2VUZXh0dXJlTGF5ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworU3VyZmFjZVRleHR1cmVMYXllcjo6U3VyZmFjZVRleHR1cmVMYXllcihHTHVpbnQgdGV4LCBjb25zdCBzcDxMYXllcj4mIGxheWVyKQorICAgIDogU3VyZmFjZVRleHR1cmUodGV4KSwgbUxheWVyKGxheWVyKSB7Cit9CisKK1N1cmZhY2VUZXh0dXJlTGF5ZXI6On5TdXJmYWNlVGV4dHVyZUxheWVyKCkgeworfQorCisKK3N0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OnNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpCit7CisgICAgLy9MT0dEKCIlcywgdz0ldSwgaD0ldSIsIF9fUFJFVFRZX0ZVTkNUSU9OX18sIHcsIGgpOworICAgIHJldHVybiBTdXJmYWNlVGV4dHVyZTo6c2V0RGVmYXVsdEJ1ZmZlclNpemUodywgaCk7Cit9CisKK3N0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OnNldERlZmF1bHRCdWZmZXJGb3JtYXQodWludDMyX3QgZm9ybWF0KQoreworICAgIG1EZWZhdWx0Rm9ybWF0ID0gZm9ybWF0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgU3VyZmFjZVRleHR1cmVMYXllcjo6c2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KSB7CisgICAgc3RhdHVzX3QgcmVzID0gU3VyZmFjZVRleHR1cmU6OnNldEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBTdXJmYWNlVGV4dHVyZUxheWVyOjpkZXF1ZXVlQnVmZmVyKGludCAqYnVmLAorICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSB7CisKKyAgICBzdGF0dXNfdCByZXMoTk9fSU5JVCk7CisgICAgc3A8TGF5ZXI+IGxheWVyKG1MYXllci5wcm9tb3RlKCkpOworICAgIGlmIChsYXllciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChmb3JtYXQgPT0gMCkKKyAgICAgICAgICAgIGZvcm1hdCA9IG1EZWZhdWx0Rm9ybWF0OworICAgICAgICB1aW50MzJfdCBlZmZlY3RpdmVVc2FnZSA9IGxheWVyLT5nZXRFZmZlY3RpdmVVc2FnZSh1c2FnZSk7CisgICAgICAgIC8vTE9HRCgiJXMsIHc9JXUsIGg9JXUsIGZvcm1hdD0ldSwgdXNhZ2U9JTA4eCwgZWZmZWN0aXZlVXNhZ2U9JTA4eCIsCisgICAgICAgIC8vICAgICAgICBfX1BSRVRUWV9GVU5DVElPTl9fLCB3LCBoLCBmb3JtYXQsIHVzYWdlLCBlZmZlY3RpdmVVc2FnZSk7CisgICAgICAgIHJlcyA9IFN1cmZhY2VUZXh0dXJlOjpkZXF1ZXVlQnVmZmVyKGJ1ZiwgdywgaCwgZm9ybWF0LCBlZmZlY3RpdmVVc2FnZSk7CisgICAgICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxheWVyLT5zZXRGaXhlZFNpemUodyAmJiBoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFmZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZVRleHR1cmVMYXllci5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1VSRkFDRV9URVhUVVJFX0xBWUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9TVVJGQUNFX1RFWFRVUkVfTEFZRVJfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExheWVyOworCitjbGFzcyBTdXJmYWNlVGV4dHVyZUxheWVyIDogcHVibGljIFN1cmZhY2VUZXh0dXJlCit7CisgICAgd3A8TGF5ZXI+IG1MYXllcjsKKyAgICB1aW50MzJfdCBtRGVmYXVsdEZvcm1hdDsKKworcHVibGljOgorICAgIFN1cmZhY2VUZXh0dXJlTGF5ZXIoR0x1aW50IHRleCwgY29uc3Qgc3A8TGF5ZXI+JiBsYXllcik7CisgICAgflN1cmZhY2VUZXh0dXJlTGF5ZXIoKTsKKworICAgIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOworICAgIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKKworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUJ1ZmZlcihpbnQgKmJ1ZiwgdWludDMyX3QgdywgdWludDMyX3QgaCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TVVJGQUNFX1RFWFRVUkVfTEFZRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9jbHouaAppbmRleCAwZGRmOTg2Li5jYTQ0NTU1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmgKQEAgLTIwLDE4ICsyMCwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWludCBjbHpfaW1wbChpbnQzMl90IHgpOwotCi1pbnQgaW5saW5lIGNseihpbnQzMl90IHgpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCitpbnQgaW5saW5lIGNseihpbnQzMl90IHgpIHsKICAgICByZXR1cm4gX19idWlsdGluX2Nseih4KTsKLSNlbHNlCi0gICAgcmV0dXJuIGNsel9pbXBsKHgpOwotI2VuZGlmCiB9CiAKLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0NMWl9IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggZjhkMTQyNi4uZWU1ZjNmNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMjQsNyArMjQsMTIgQEAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLkFDQ0VTU19ORVRXT1JLX1NUQVRFIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQlJPQURDQVNUX1NUSUNLWSIgLz4KICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX1NFQ1VSRV9TRVRUSU5HUyIgLz4KLSAgICAKKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlVQREFURV9ERVZJQ0VfU1RBVFMiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5NQU5BR0VfQVBQX1RPS0VOUyIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9ORVRXT1JLX1BPTElDWSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfTkVUV09SS19VU0FHRV9ISVNUT1JZIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ09OTkVDVElWSVRZX0lOVEVSTkFMIiAvPgorCiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YSBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclNlcnZpY2VUZXN0LmphdmEKaW5kZXggMmJjNjgyNS4uMzAyYTJkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyU2VydmljZVRlc3QuamF2YQorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC0xNTAsNyArMTUwLDggQEAKICAgICAgICAgU3RyaW5nIHNlY29uZE1vY2tTZXJ2aWNlQ2xhc3NOYW1lID0gTXlTZWNvbmRNb2NrQWNjZXNzaWJpbGl0eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOwogCiAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0d28gbW9jayBzZXJ2aWNlcwotICAgICAgICBmb3IgKFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvIDogbU1hbmFnZXJTZXJ2aWNlLmdldEFjY2Vzc2liaWxpdHlTZXJ2aWNlTGlzdCgpKSB7CisgICAgICAgIGZvciAoQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvIGluZm8gOiBtTWFuYWdlclNlcnZpY2UuZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpIHsKKyAgICAgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gaW5mby5nZXRSZXNvbHZlSW5mbygpLnNlcnZpY2VJbmZvOwogICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSkpIHsKICAgICAgICAgICAgICAgICBpZiAoZmlyc3RNb2NrU2VydmljZUNsYXNzTmFtZS5lcXVhbHMoc2VydmljZUluZm8ubmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgZmlyc3RNb2NrU2VydmljZUluc3RhbGxlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXJUZXN0LmphdmEKaW5kZXggMzhmZWQyMi4uMTQ2M2QzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL0FjY2Vzc2liaWxpdHlNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9BY2Nlc3NpYmlsaXR5TWFuYWdlclRlc3QuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogCiBpbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmFjY2Vzc2liaWxpdHlzZXJ2aWNlLkFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbzsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87CiBpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKIGltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OwpAQCAtNjIsMjAgKzYzLDIyIEBACiAgICAgQE1lZGl1bVRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGNyZWF0ZSBhIGxpc3Qgb2YgaW5zdGFsbGVkIGFjY2Vzc2liaWxpdHkgc2VydmljZXMgdGhlIG1vY2sgc2VydmljZSByZXR1cm5zCi0gICAgICAgIExpc3Q8U2VydmljZUluZm8+IGV4cGVjdGVkU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZpY2VJbmZvPigpOwotICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IG5ldyBTZXJ2aWNlSW5mbygpOwotICAgICAgICBzZXJ2aWNlSW5mby5uYW1lID0gIlRlc3RTZXJ2aWNlSW5mb05hbWUiOwotICAgICAgICBleHBlY3RlZFNlcnZpY2VzLmFkZChzZXJ2aWNlSW5mbyk7CisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiBleHBlY3RlZFNlcnZpY2VzID0gbmV3IEFycmF5TGlzdDxBY2Nlc3NpYmlsaXR5U2VydmljZUluZm8+KCk7CisgICAgICAgIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mbyBhY2Nlc3NpYmlsaXR5U2VydmljZUluZm8gPSBuZXcgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKCk7CisgICAgICAgIGFjY2Vzc2liaWxpdHlTZXJ2aWNlSW5mby5wYWNrYWdlTmFtZXMgPSBuZXcgU3RyaW5nW10geyAiZm9vLmJhciIgfTsKKyAgICAgICAgZXhwZWN0ZWRTZXJ2aWNlcy5hZGQoYWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvKTsKIAogICAgICAgICAvLyBjb25maWd1cmUgdGhlIG1vY2sgc2VydmljZSBiZWhhdmlvcgogICAgICAgICBJQWNjZXNzaWJpbGl0eU1hbmFnZXIgbW9ja1NlcnZpY2VJbnRlcmZhY2UgPSBtTW9ja1NlcnZpY2VJbnRlcmZhY2U7CiAgICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5hZGRDbGllbnQoYW55SUFjY2Vzc2liaWxpdHlNYW5hZ2VyQ2xpZW50KCkpKS5hbmRSZXR1cm4odHJ1ZSk7Ci0gICAgICAgIGV4cGVjdChtb2NrU2VydmljZUludGVyZmFjZS5nZXRBY2Nlc3NpYmlsaXR5U2VydmljZUxpc3QoKSkuYW5kUmV0dXJuKGV4cGVjdGVkU2VydmljZXMpOworICAgICAgICBleHBlY3QobW9ja1NlcnZpY2VJbnRlcmZhY2UuZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCkpLmFuZFJldHVybigKKyAgICAgICAgICAgICAgICBleHBlY3RlZFNlcnZpY2VzKTsKICAgICAgICAgcmVwbGF5KG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKIAogICAgICAgICAvLyBpbnZva2UgdGhlIG1ldGhvZCB1bmRlciB0ZXN0CiAgICAgICAgIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgQWNjZXNzaWJpbGl0eU1hbmFnZXIobUNvbnRleHQsIG1vY2tTZXJ2aWNlSW50ZXJmYWNlKTsKLSAgICAgICAgTGlzdDxTZXJ2aWNlSW5mbz4gcmVjZWl2ZWRTZXJ2aWNlcyA9IG1hbmFnZXIuZ2V0QWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CisgICAgICAgIExpc3Q8QWNjZXNzaWJpbGl0eVNlcnZpY2VJbmZvPiByZWNlaXZlZFNlcnZpY2VzID0KKyAgICAgICAgICAgIG1hbmFnZXIuZ2V0SW5zdGFsbGVkQWNjZXNzaWJpbGl0eVNlcnZpY2VMaXN0KCk7CiAKICAgICAgICAgLy8gY2hlY2sgZXhwZWN0ZWQgcmVzdWx0IChsaXN0IGVxdWFscygpIGNvbXBhcmVzIGl0IGNvbnRlbnRzIGFzIHdlbGwpCiAgICAgICAgIGFzc2VydEVxdWFscygiQWxsIGV4cGVjdGVkIHNlcnZpY2VzIG11c3QgYmUgcmV0dXJuZWQiLCByZWNlaXZlZFNlcnZpY2VzLCBleHBlY3RlZFNlcnZpY2VzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9Ccm9hZGNhc3RJbnRlcmNlcHRpbmdDb250ZXh0LmphdmEgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODg3OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKKy8qKgorICoge0BsaW5rIENvbnRleHRXcmFwcGVyfSB0aGF0IGNhbiBhdHRhY2ggbGlzdGVuZXJzIGZvciB1cGNvbWluZworICoge0BsaW5rIENvbnRleHQjc2VuZEJyb2FkY2FzdChJbnRlbnQpfS4KKyAqLworcHVibGljIGNsYXNzIEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0V3JhcHBlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJXYXRjaGluZ0NvbnRleHQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEJyb2FkY2FzdEludGVyY2VwdG9yPiBtSW50ZXJjZXB0b3JzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBwdWJsaWMgY2xhc3MgQnJvYWRjYXN0SW50ZXJjZXB0b3IgZXh0ZW5kcyBBYnN0cmFjdEZ1dHVyZTxJbnRlbnQ+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCcm9hZGNhc3RSZWNlaXZlciBtUmVjZWl2ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW50ZW50RmlsdGVyIG1GaWx0ZXI7CisKKyAgICAgICAgcHVibGljIEJyb2FkY2FzdEludGVyY2VwdG9yKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLCBJbnRlbnRGaWx0ZXIgZmlsdGVyKSB7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSByZWNlaXZlcjsKKyAgICAgICAgICAgIG1GaWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgICAgICBpZiAobUZpbHRlci5tYXRjaChnZXRDb250ZW50UmVzb2x2ZXIoKSwgaW50ZW50LCBmYWxzZSwgVEFHKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVJlY2VpdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dC50aGlzOworICAgICAgICAgICAgICAgICAgICBtUmVjZWl2ZXIub25SZWNlaXZlKGNvbnRleHQsIGludGVudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXQoaW50ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dChDb250ZXh0IGJhc2UpIHsKKyAgICAgICAgc3VwZXIoYmFzZSk7CisgICAgfQorCisgICAgcHVibGljIEZ1dHVyZTxJbnRlbnQ+IG5leHRCcm9hZGNhc3RJbnRlbnQoU3RyaW5nIGFjdGlvbikgeworICAgICAgICByZXR1cm4gbmV4dEJyb2FkY2FzdEludGVudChuZXcgSW50ZW50RmlsdGVyKGFjdGlvbikpOworICAgIH0KKworICAgIHB1YmxpYyBGdXR1cmU8SW50ZW50PiBuZXh0QnJvYWRjYXN0SW50ZW50KEludGVudEZpbHRlciBmaWx0ZXIpIHsKKyAgICAgICAgZmluYWwgQnJvYWRjYXN0SW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IgPSBuZXcgQnJvYWRjYXN0SW50ZXJjZXB0b3IobnVsbCwgZmlsdGVyKTsKKyAgICAgICAgc3luY2hyb25pemVkIChtSW50ZXJjZXB0b3JzKSB7CisgICAgICAgICAgICBtSW50ZXJjZXB0b3JzLmFkZChpbnRlcmNlcHRvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlbnQgcmVnaXN0ZXJSZWNlaXZlcihCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciwgSW50ZW50RmlsdGVyIGZpbHRlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnRlcmNlcHRvcnMpIHsKKyAgICAgICAgICAgIG1JbnRlcmNlcHRvcnMuYWRkKG5ldyBCcm9hZGNhc3RJbnRlcmNlcHRvcihyZWNlaXZlciwgZmlsdGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEludGVudCByZWdpc3RlclJlY2VpdmVyKEJyb2FkY2FzdFJlY2VpdmVyIHJlY2VpdmVyLCBJbnRlbnRGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgU3RyaW5nIGJyb2FkY2FzdFBlcm1pc3Npb24sIEhhbmRsZXIgc2NoZWR1bGVyKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlclJlY2VpdmVyKHJlY2VpdmVyLCBmaWx0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJSZWNlaXZlcihCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1JbnRlcmNlcHRvcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPEJyb2FkY2FzdEludGVyY2VwdG9yPiBpID0gbUludGVyY2VwdG9ycy5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQnJvYWRjYXN0SW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IgPSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZXIuZXF1YWxzKGludGVyY2VwdG9yLm1SZWNlaXZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZW5kQnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtSW50ZXJjZXB0b3JzKSB7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxCcm9hZGNhc3RJbnRlcmNlcHRvcj4gaSA9IG1JbnRlcmNlcHRvcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEJyb2FkY2FzdEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGludGVyY2VwdG9yLmRpc3BhdGNoQnJvYWRjYXN0KGludGVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZW5kU3RpY2t5QnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVN0aWNreUJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7CisgICAgICAgIC8vIGlnbm9yZWQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U1NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuc2VydmVyOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuQUNUSU9OX1VJRF9SRU1PVkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LkVYVFJBX1VJRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlci5DT05ORUNUSVZJVFlfQUNUSU9OOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lGSTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUE9MSUNZX05PTkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyLlBPTElDWV9SRUpFQ1RfTUVURVJFRF9CQUNLR1JPVU5EOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrUG9saWN5TWFuYWdlci5SVUxFX0FMTE9XX0FMTDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuUlVMRV9SRUpFQ1RfTUVURVJFRDsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1BvbGljeU1hbmFnZXIuY29tcHV0ZUxhc3RDeWNsZUJvdW5kYXJ5OworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdHMuVEFHX05PTkU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0cy5VSURfQUxMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGUuTUFUQ0hfV0lGSTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmFueUludDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmFyeUVxOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suY2FwdHVyZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNyZWF0ZU1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdExhc3RDYWxsOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOworCitpbXBvcnQgYW5kcm9pZC5hcHAuSUFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JUHJvY2Vzc09ic2VydmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSUNvbm5lY3Rpdml0eU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5uZXQuSU5ldHdvcmtQb2xpY3lMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JTmV0d29ya1N0YXRzU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtQb2xpY3k7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0czsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5JUG93ZXJNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja1BhY2thZ2VNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5MYXJnZVRlc3Q7CitpbXBvcnQgYW5kcm9pZC50ZXN0LnN1aXRlYnVpbGRlci5hbm5vdGF0aW9uLlN1cHByZXNzOworaW1wb3J0IGFuZHJvaWQudGV4dC5mb3JtYXQuVGltZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuVHJ1c3RlZFRpbWU7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtQb2xpY3lNYW5hZ2VyU2VydmljZTsKKworaW1wb3J0IG9yZy5lYXN5bW9jay5DYXB0dXJlOworaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2V9LgorICovCitATGFyZ2VUZXN0CitwdWJsaWMgY2xhc3MgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJOZXR3b3JrUG9saWN5TWFuYWdlclNlcnZpY2VUZXN0IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9TVEFSVCA9IDExOTQyMjA4MDAwMDBMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0lGQUNFID0gInRlc3QwIjsKKworICAgIHByaXZhdGUgc3RhdGljIE5ldHdvcmtUZW1wbGF0ZSBzVGVtcGxhdGVXaWZpID0gbmV3IE5ldHdvcmtUZW1wbGF0ZShNQVRDSF9XSUZJLCBudWxsKTsKKworICAgIHByaXZhdGUgQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dCBtU2VydmljZUNvbnRleHQ7CisgICAgcHJpdmF0ZSBGaWxlIG1Qb2xpY3lEaXI7CisKKyAgICBwcml2YXRlIElBY3Rpdml0eU1hbmFnZXIgbUFjdGl2aXR5TWFuYWdlcjsKKyAgICBwcml2YXRlIElQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKKyAgICBwcml2YXRlIElOZXR3b3JrU3RhdHNTZXJ2aWNlIG1TdGF0c1NlcnZpY2U7CisgICAgcHJpdmF0ZSBJTmV0d29ya1BvbGljeUxpc3RlbmVyIG1Qb2xpY3lMaXN0ZW5lcjsKKyAgICBwcml2YXRlIFRydXN0ZWRUaW1lIG1UaW1lOworICAgIHByaXZhdGUgSUNvbm5lY3Rpdml0eU1hbmFnZXIgbUNvbm5NYW5hZ2VyOworICAgIHByaXZhdGUgSU5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmTWFuYWdlcjsKKworICAgIHByaXZhdGUgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlIG1TZXJ2aWNlOworICAgIHByaXZhdGUgSVByb2Nlc3NPYnNlcnZlciBtUHJvY2Vzc09ic2VydmVyOworCisgICAgcHJpdmF0ZSBCaW5kZXIgbVN0dWJCaW5kZXIgPSBuZXcgQmluZGVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVUlEX0EgPSBhbmRyb2lkLm9zLlByb2Nlc3MuRklSU1RfQVBQTElDQVRJT05fVUlEICsgODAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSURfQiA9IGFuZHJvaWQub3MuUHJvY2Vzcy5GSVJTVF9BUFBMSUNBVElPTl9VSUQgKyA4MDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElEXzEgPSA0MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBJRF8yID0gNDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSURfMyA9IDQwMjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgLy8gaW50ZXJjZXB0IHZhcmlvdXMgYnJvYWRjYXN0cywgYW5kIHByZXRlbmQgdGhhdCB1aWRzIGhhdmUgcGFja2FnZXMKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0ID0gbmV3IEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQoZ2V0Q29udGV4dCgpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYWNrYWdlTWFuYWdlciBnZXRQYWNrYWdlTWFuYWdlcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vY2tQYWNrYWdlTWFuYWdlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYWNrYWdlc0ZvclVpZChpbnQgdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgImNvbS5leGFtcGxlIiB9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtUG9saWN5RGlyID0gZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCk7CisKKyAgICAgICAgbUFjdGl2aXR5TWFuYWdlciA9IGNyZWF0ZU1vY2soSUFjdGl2aXR5TWFuYWdlci5jbGFzcyk7CisgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBjcmVhdGVNb2NrKElQb3dlck1hbmFnZXIuY2xhc3MpOworICAgICAgICBtU3RhdHNTZXJ2aWNlID0gY3JlYXRlTW9jayhJTmV0d29ya1N0YXRzU2VydmljZS5jbGFzcyk7CisgICAgICAgIG1Qb2xpY3lMaXN0ZW5lciA9IGNyZWF0ZU1vY2soSU5ldHdvcmtQb2xpY3lMaXN0ZW5lci5jbGFzcyk7CisgICAgICAgIG1UaW1lID0gY3JlYXRlTW9jayhUcnVzdGVkVGltZS5jbGFzcyk7CisgICAgICAgIG1Db25uTWFuYWdlciA9IGNyZWF0ZU1vY2soSUNvbm5lY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworICAgICAgICBtTm90aWZNYW5hZ2VyID0gY3JlYXRlTW9jayhJTm90aWZpY2F0aW9uTWFuYWdlci5jbGFzcyk7CisKKyAgICAgICAgbVNlcnZpY2UgPSBuZXcgTmV0d29ya1BvbGljeU1hbmFnZXJTZXJ2aWNlKAorICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29udGV4dCwgbUFjdGl2aXR5TWFuYWdlciwgbVBvd2VyTWFuYWdlciwgbVN0YXRzU2VydmljZSwgbVRpbWUsIG1Qb2xpY3lEaXIpOworICAgICAgICBtU2VydmljZS5iaW5kQ29ubmVjdGl2aXR5TWFuYWdlcihtQ29ubk1hbmFnZXIpOworICAgICAgICBtU2VydmljZS5iaW5kTm90aWZpY2F0aW9uTWFuYWdlcihtTm90aWZNYW5hZ2VyKTsKKworICAgICAgICAvLyBSZW1vdGVDYWxsYmFja0xpc3QgbmVlZHMgYSBiaW5kZXIgdG8gdXNlIGFzIGtleQorICAgICAgICBleHBlY3QobVBvbGljeUxpc3RlbmVyLmFzQmluZGVyKCkpLmFuZFJldHVybihtU3R1YkJpbmRlcikuYXRMZWFzdE9uY2UoKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlLnJlZ2lzdGVyTGlzdGVuZXIobVBvbGljeUxpc3RlbmVyKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBjYXRjaCB0aGUgcmVnaXN0ZXJlZCBJUHJvY2Vzc09ic2VydmVyIGR1cmluZyBzeXN0ZW1SZWFkeSgpCisgICAgICAgIGZpbmFsIENhcHR1cmU8SVByb2Nlc3NPYnNlcnZlcj4gcHJvY2Vzc09ic2VydmVyID0gbmV3IENhcHR1cmU8SVByb2Nlc3NPYnNlcnZlcj4oKTsKKyAgICAgICAgbUFjdGl2aXR5TWFuYWdlci5yZWdpc3RlclByb2Nlc3NPYnNlcnZlcihjYXB0dXJlKHByb2Nlc3NPYnNlcnZlcikpOworICAgICAgICBleHBlY3RMYXN0Q2FsbCgpLmF0TGVhc3RPbmNlKCk7CisKKyAgICAgICAgLy8gZXhwZWN0IHRvIGFuc3dlciBzY3JlZW4gc3RhdHVzIGR1cmluZyBzeXN0ZW1SZWFkeSgpCisgICAgICAgIGV4cGVjdChtUG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKSkuYW5kUmV0dXJuKHRydWUpLmF0TGVhc3RPbmNlKCk7CisgICAgICAgIGV4cGVjdFRpbWUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZS5zeXN0ZW1SZWFkeSgpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIgPSBwcm9jZXNzT2JzZXJ2ZXIuZ2V0VmFsdWUoKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbVBvbGljeURpci5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TZXJ2aWNlQ29udGV4dCA9IG51bGw7CisgICAgICAgIG1Qb2xpY3lEaXIgPSBudWxsOworCisgICAgICAgIG1BY3Rpdml0eU1hbmFnZXIgPSBudWxsOworICAgICAgICBtUG93ZXJNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgbVN0YXRzU2VydmljZSA9IG51bGw7CisgICAgICAgIG1Qb2xpY3lMaXN0ZW5lciA9IG51bGw7CisgICAgICAgIG1UaW1lID0gbnVsbDsKKworICAgICAgICBtU2VydmljZSA9IG51bGw7CisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIgPSBudWxsOworCisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFN1cHByZXNzCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGljeUNoYW5nZVRyaWdnZXJzQnJvYWRjYXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1TZXJ2aWNlLnNldFVpZFBvbGljeShVSURfQSwgUE9MSUNZX05PTkUpOworCisgICAgICAgIC8vIGNoYW5nZSBiYWNrZ3JvdW5kIHBvbGljeSBhbmQgZXhwZWN0IGJyb2FkY2FzdAorICAgICAgICBmaW5hbCBGdXR1cmU8SW50ZW50PiBiYWNrZ3JvdW5kQ2hhbmdlZCA9IG1TZXJ2aWNlQ29udGV4dC5uZXh0QnJvYWRjYXN0SW50ZW50KAorICAgICAgICAgICAgICAgIENvbm5lY3Rpdml0eU1hbmFnZXIuQUNUSU9OX0JBQ0tHUk9VTkRfREFUQV9TRVRUSU5HX0NIQU5HRUQpOworCisgICAgICAgIG1TZXJ2aWNlLnNldFVpZFBvbGljeShVSURfQSwgUE9MSUNZX1JFSkVDVF9NRVRFUkVEX0JBQ0tHUk9VTkQpOworCisgICAgICAgIGJhY2tncm91bmRDaGFuZ2VkLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQaWRGb3JlZ3JvdW5kQ29tYmluZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVzaCBhbGwgdWlkIGludG8gYmFja2dyb3VuZAorICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8xLCBVSURfQSwgZmFsc2UpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8yLCBVSURfQSwgZmFsc2UpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8zLCBVSURfQiwgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5pc1VpZEZvcmVncm91bmQoVUlEX0EpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobVNlcnZpY2UuaXNVaWRGb3JlZ3JvdW5kKFVJRF9CKSk7CisKKyAgICAgICAgLy8gcHVzaCBvbmUgb2YgdGhlIHNoYXJlZCBwaWRzIGludG8gZm9yZWdyb3VuZAorICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8yLCBVSURfQSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUobVNlcnZpY2UuaXNVaWRGb3JlZ3JvdW5kKFVJRF9BKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQikpOworCisgICAgICAgIC8vIGFuZCBzd2FwIGFub3RoZXIgdWlkIGludG8gZm9yZWdyb3VuZAorICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8yLCBVSURfQSwgZmFsc2UpOworICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8zLCBVSURfQiwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQSkpOworICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQikpOworCisgICAgICAgIC8vIHB1c2ggYm90aCBwaWQgaW50byBmb3JlZ3JvdW5kCisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzEsIFVJRF9BLCB0cnVlKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMiwgVUlEX0EsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKG1TZXJ2aWNlLmlzVWlkRm9yZWdyb3VuZChVSURfQSkpOworCisgICAgICAgIC8vIHB1bGwgb25lIG91dCwgc2hvdWxkIHN0aWxsIGJlIGZvcmVncm91bmQKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtU2VydmljZS5pc1VpZEZvcmVncm91bmQoVUlEX0EpKTsKKworICAgICAgICAvLyBwdWxsIGZpbmFsIHBpZCBvdXQsIHNob3VsZCBub3cgYmUgYmFja2dyb3VuZAorICAgICAgICBtUHJvY2Vzc09ic2VydmVyLm9uRm9yZWdyb3VuZEFjdGl2aXRpZXNDaGFuZ2VkKFBJRF8yLCBVSURfQSwgZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShtU2VydmljZS5pc1VpZEZvcmVncm91bmQoVUlEX0EpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NyZWVuQ2hhbmdlc1J1bGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHB1c2ggc3RyaWN0IHBvbGljeSBmb3IgZm9yZWdyb3VuZCB1aWQsIHZlcmlmeSBBTExPVyBydWxlCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIHRydWUpOworICAgICAgICBtU2VydmljZS5zZXRVaWRQb2xpY3koVUlEX0EsIFBPTElDWV9SRUpFQ1RfTUVURVJFRF9CQUNLR1JPVU5EKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBub3cgdHVybiBzY3JlZW4gb2ZmIGFuZCB2ZXJpZnkgUkVKRUNUIHJ1bGUKKyAgICAgICAgZXhwZWN0KG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpKS5hbmRSZXR1cm4oZmFsc2UpLmF0TGVhc3RPbmNlKCk7CisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9SRUpFQ1RfTUVURVJFRCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fU0NSRUVOX09GRikpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIGFuZCB0dXJuIHNjcmVlbiBiYWNrIG9uLCB2ZXJpZnkgQUxMT1cgcnVsZSByZXN0b3JlZAorICAgICAgICBleHBlY3QobVBvd2VyTWFuYWdlci5pc1NjcmVlbk9uKCkpLmFuZFJldHVybih0cnVlKS5hdExlYXN0T25jZSgpOworICAgICAgICBleHBlY3RSdWxlc0NoYW5nZWQoVUlEX0EsIFJVTEVfQUxMT1dfQUxMKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9TQ1JFRU5fT04pKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9saWN5Tm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBQT0xJQ1lfTk9ORSBzaG91bGQgUlVMRV9BTExPVyBpbiBmb3JlZ3JvdW5kCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2Uuc2V0VWlkUG9saWN5KFVJRF9BLCBQT0xJQ1lfTk9ORSk7CisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzEsIFVJRF9BLCB0cnVlKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBQT0xJQ1lfTk9ORSBzaG91bGQgUlVMRV9BTExPVyBpbiBiYWNrZ3JvdW5kCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIGZhbHNlKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9saWN5UmVqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFBPTElDWV9SRUpFQ1Qgc2hvdWxkIFJVTEVfQUxMT1cgaW4gYmFja2dyb3VuZAorICAgICAgICBleHBlY3RSdWxlc0NoYW5nZWQoVUlEX0EsIFJVTEVfUkVKRUNUX01FVEVSRUQpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2Uuc2V0VWlkUG9saWN5KFVJRF9BLCBQT0xJQ1lfUkVKRUNUX01FVEVSRURfQkFDS0dST1VORCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gUE9MSUNZX1JFSkVDVCBzaG91bGQgUlVMRV9BTExPVyBpbiBmb3JlZ3JvdW5kCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIHRydWUpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIFBPTElDWV9SRUpFQ1Qgc2hvdWxkIFJVTEVfUkVKRUNUIGluIGJhY2tncm91bmQKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX1JFSkVDVF9NRVRFUkVEKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1Qcm9jZXNzT2JzZXJ2ZXIub25Gb3JlZ3JvdW5kQWN0aXZpdGllc0NoYW5nZWQoUElEXzEsIFVJRF9BLCBmYWxzZSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBvbGljeVJlamVjdEFkZFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBQT0xJQ1lfTk9ORSBzaG91bGQgaGF2ZSBSVUxFX0FMTE9XIGluIGJhY2tncm91bmQKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX0FMTE9XX0FMTCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZS5zZXRVaWRQb2xpY3koVUlEX0EsIFBPTElDWV9OT05FKTsKKyAgICAgICAgbVByb2Nlc3NPYnNlcnZlci5vbkZvcmVncm91bmRBY3Rpdml0aWVzQ2hhbmdlZChQSURfMSwgVUlEX0EsIGZhbHNlKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBhZGRpbmcgUE9MSUNZX1JFSkVDVCBzaG91bGQgY2F1c2UgUlVMRV9SRUpFQ1QKKyAgICAgICAgZXhwZWN0UnVsZXNDaGFuZ2VkKFVJRF9BLCBSVUxFX1JFSkVDVF9NRVRFUkVEKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlLnNldFVpZFBvbGljeShVSURfQSwgUE9MSUNZX1JFSkVDVF9NRVRFUkVEX0JBQ0tHUk9VTkQpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIHJlbW92aW5nIFBPTElDWV9SRUpFQ1Qgc2hvdWxkIHJldHVybiB1cyB0byBSVUxFX0FMTE9XCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2Uuc2V0VWlkUG9saWN5KFVJRF9BLCBQT0xJQ1lfTk9ORSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExhc3RDeWNsZUJvdW5kYXJ5VGhpc01vbnRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGFzc3VtZSBjeWNsZSBkYXkgb2YgIjV0aCIsIHdoaWNoIHNob3VsZCBiZSBpbiBzYW1lIG1vbnRoCisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBwYXJzZVRpbWUoIjIwMDctMTEtMTRUMDA6MDA6MDAuMDAwWiIpOworICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkQ3ljbGUgPSBwYXJzZVRpbWUoIjIwMDctMTEtMDVUMDA6MDA6MDAuMDAwWiIpOworCisgICAgICAgIGZpbmFsIE5ldHdvcmtQb2xpY3kgcG9saWN5ID0gbmV3IE5ldHdvcmtQb2xpY3koc1RlbXBsYXRlV2lmaSwgNSwgMTAyNEwsIDEwMjRMKTsKKyAgICAgICAgZmluYWwgbG9uZyBhY3R1YWxDeWNsZSA9IGNvbXB1dGVMYXN0Q3ljbGVCb3VuZGFyeShjdXJyZW50VGltZSwgcG9saWN5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkQ3ljbGUsIGFjdHVhbEN5Y2xlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdEN5Y2xlQm91bmRhcnlMYXN0TW9udGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXNzdW1lIGN5Y2xlIGRheSBvZiAiMjB0aCIsIHdoaWNoIHNob3VsZCBiZSBpbiBsYXN0IG1vbnRoCisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBwYXJzZVRpbWUoIjIwMDctMTEtMTRUMDA6MDA6MDAuMDAwWiIpOworICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkQ3ljbGUgPSBwYXJzZVRpbWUoIjIwMDctMTAtMjBUMDA6MDA6MDAuMDAwWiIpOworCisgICAgICAgIGZpbmFsIE5ldHdvcmtQb2xpY3kgcG9saWN5ID0gbmV3IE5ldHdvcmtQb2xpY3koc1RlbXBsYXRlV2lmaSwgMjAsIDEwMjRMLCAxMDI0TCk7CisgICAgICAgIGZpbmFsIGxvbmcgYWN0dWFsQ3ljbGUgPSBjb21wdXRlTGFzdEN5Y2xlQm91bmRhcnkoY3VycmVudFRpbWUsIHBvbGljeSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEN5Y2xlLCBhY3R1YWxDeWNsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExhc3RDeWNsZUJvdW5kYXJ5VGhpc01vbnRoRmVicnVhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXNzdW1lIGN5Y2xlIGRheSBvZiAiMzB0aCIgaW4gZmVicnVhcnk7IHNob3VsZCBnbyB0byBqYW51YXJ5CisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBwYXJzZVRpbWUoIjIwMDctMDItMTRUMDA6MDA6MDAuMDAwWiIpOworICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkQ3ljbGUgPSBwYXJzZVRpbWUoIjIwMDctMDEtMzBUMDA6MDA6MDAuMDAwWiIpOworCisgICAgICAgIGZpbmFsIE5ldHdvcmtQb2xpY3kgcG9saWN5ID0gbmV3IE5ldHdvcmtQb2xpY3koc1RlbXBsYXRlV2lmaSwgMzAsIDEwMjRMLCAxMDI0TCk7CisgICAgICAgIGZpbmFsIGxvbmcgYWN0dWFsQ3ljbGUgPSBjb21wdXRlTGFzdEN5Y2xlQm91bmRhcnkoY3VycmVudFRpbWUsIHBvbGljeSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEN5Y2xlLCBhY3R1YWxDeWNsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExhc3RDeWNsZUJvdW5kYXJ5TGFzdE1vbnRoRmVicnVhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXNzdW1lIGN5Y2xlIGRheSBvZiAiMzB0aCIgaW4gZmVicnVhcnksIHdoaWNoIHNob3VsZCBjbGFtcAorICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gcGFyc2VUaW1lKCIyMDA3LTAzLTE0VDAwOjAwOjAwLjAwMFoiKTsKKyAgICAgICAgZmluYWwgbG9uZyBleHBlY3RlZEN5Y2xlID0gcGFyc2VUaW1lKCIyMDA3LTAzLTAxVDAwOjAwOjAwLjAwMFoiKTsKKworICAgICAgICBmaW5hbCBOZXR3b3JrUG9saWN5IHBvbGljeSA9IG5ldyBOZXR3b3JrUG9saWN5KHNUZW1wbGF0ZVdpZmksIDMwLCAxMDI0TCwgMTAyNEwpOworICAgICAgICBmaW5hbCBsb25nIGFjdHVhbEN5Y2xlID0gY29tcHV0ZUxhc3RDeWNsZUJvdW5kYXJ5KGN1cnJlbnRUaW1lLCBwb2xpY3kpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDeWNsZSwgYWN0dWFsQ3ljbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXR3b3JrUG9saWN5QXBwbGllZEN5Y2xlTGFzdE1vbnRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZWxhcHNlZFJlYWx0aW1lID0gMDsKKyAgICAgICAgTmV0d29ya1N0YXRlW10gc3RhdGUgPSBudWxsOworICAgICAgICBOZXR3b3JrU3RhdHMgc3RhdHMgPSBudWxsOworCisgICAgICAgIGZpbmFsIGxvbmcgVElNRV9GRUJfMTUgPSAxMTcxNDk3NjAwMDAwTDsKKyAgICAgICAgZmluYWwgbG9uZyBUSU1FX01BUl8xMCA9IDExNzM0ODQ4MDAwMDBMOworICAgICAgICBmaW5hbCBpbnQgQ1lDTEVfREFZID0gMTU7CisKKyAgICAgICAgLy8gZmlyc3QsIHByZXRlbmQgdGhhdCB3aWZpIG5ldHdvcmsgY29tZXMgb25saW5lLiBubyBwb2xpY3kgYWN0aXZlLAorICAgICAgICAvLyB3aGljaCBtZWFucyB3ZSBzaG91bGRuJ3QgcHVzaCBsaW1pdCB0byBpbnRlcmZhY2UuCisgICAgICAgIHN0YXRlID0gbmV3IE5ldHdvcmtTdGF0ZVtdIHsgYnVpbGRXaWZpKCkgfTsKKyAgICAgICAgZXhwZWN0KG1Db25uTWFuYWdlci5nZXRBbGxOZXR3b3JrU3RhdGUoKSkuYW5kUmV0dXJuKHN0YXRlKS5hdExlYXN0T25jZSgpOworICAgICAgICBleHBlY3RUaW1lKFRJTUVfTUFSXzEwICsgZWxhcHNlZFJlYWx0aW1lKTsKKyAgICAgICAgZXhwZWN0TWV0ZXJlZElmYWNlc0NoYW5nZWQoKTsKKworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChDT05ORUNUSVZJVFlfQUNUSU9OKSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gbm93IGNoYW5nZSBjeWNsZSB0byBiZSBvbiAxNXRoLCBhbmQgdGVzdCBpbiBlYXJseSBtYXJjaCwgdG8gdmVyaWZ5IHdlCisgICAgICAgIC8vIHBpY2sgY3ljbGUgZGF5IGluIHByZXZpb3VzIG1vbnRoLgorICAgICAgICBleHBlY3QobUNvbm5NYW5hZ2VyLmdldEFsbE5ldHdvcmtTdGF0ZSgpKS5hbmRSZXR1cm4oc3RhdGUpLmF0TGVhc3RPbmNlKCk7CisgICAgICAgIGV4cGVjdFRpbWUoVElNRV9NQVJfMTAgKyBlbGFwc2VkUmVhbHRpbWUpOworCisgICAgICAgIC8vIHByZXRlbmQgdGhhdCA1MTIgYnl0ZXMgdG90YWwgaGF2ZSBoYXBwZW5lZAorICAgICAgICBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMoZWxhcHNlZFJlYWx0aW1lLCAxKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQUxMLCBUQUdfTk9ORSwgMjU2TCwgMjU2TCk7CisgICAgICAgIGV4cGVjdChtU3RhdHNTZXJ2aWNlLmdldFN1bW1hcnlGb3JOZXR3b3JrKHNUZW1wbGF0ZVdpZmksIFRJTUVfRkVCXzE1LCBUSU1FX01BUl8xMCkpCisgICAgICAgICAgICAgICAgLmFuZFJldHVybihzdGF0cykuYXRMZWFzdE9uY2UoKTsKKworICAgICAgICAvLyBleHBlY3QgdGhhdCBxdW90YSByZW1haW5pbmcgc2hvdWxkIGJlIDE1MzYgYnl0ZXMKKyAgICAgICAgLy8gVE9ETzogd3JpdGUgdXAgTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG1vY2sKKworICAgICAgICBleHBlY3RDbGVhck5vdGlmaWNhdGlvbnMoKTsKKyAgICAgICAgZXhwZWN0TWV0ZXJlZElmYWNlc0NoYW5nZWQoVEVTVF9JRkFDRSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIHNldE5ldHdvcmtQb2xpY2llcyhuZXcgTmV0d29ya1BvbGljeShzVGVtcGxhdGVXaWZpLCBDWUNMRV9EQVksIDEwMjRMLCAyMDQ4TCkpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVaWRSZW1vdmVkUG9saWN5Q2xlYXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBQT0xJQ1lfUkVKRUNUIHNob3VsZCBSVUxFX1JFSkVDVCBpbiBiYWNrZ3JvdW5kCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9SRUpFQ1RfTUVURVJFRCk7CisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZS5zZXRVaWRQb2xpY3koVUlEX0EsIFBPTElDWV9SRUpFQ1RfTUVURVJFRF9CQUNLR1JPVU5EKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyB1bmluc3RhbGwgc2hvdWxkIGNsZWFyIFJVTEVfUkVKRUNUCisgICAgICAgIGV4cGVjdFJ1bGVzQ2hhbmdlZChVSURfQSwgUlVMRV9BTExPV19BTEwpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1VJRF9SRU1PVkVEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1VJRCwgVUlEX0EpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgcGFyc2VUaW1lKFN0cmluZyB0aW1lKSB7CisgICAgICAgIGZpbmFsIFRpbWUgcmVzdWx0ID0gbmV3IFRpbWUoKTsKKyAgICAgICAgcmVzdWx0LnBhcnNlMzMzOSh0aW1lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b01pbGxpcyh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0TmV0d29ya1BvbGljaWVzKE5ldHdvcmtQb2xpY3kuLi4gcG9saWNpZXMpIHsKKyAgICAgICAgbVNlcnZpY2Uuc2V0TmV0d29ya1BvbGljaWVzKHBvbGljaWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOZXR3b3JrU3RhdGUgYnVpbGRXaWZpKCkgeworICAgICAgICBmaW5hbCBOZXR3b3JrSW5mbyBpbmZvID0gbmV3IE5ldHdvcmtJbmZvKFRZUEVfV0lGSSwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGZpbmFsIExpbmtQcm9wZXJ0aWVzIHByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcC5zZXRJbnRlcmZhY2VOYW1lKFRFU1RfSUZBQ0UpOworICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0ZShpbmZvLCBwcm9wLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0VGltZShsb25nIGN1cnJlbnRUaW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KG1UaW1lLmZvcmNlUmVmcmVzaCgpKS5hbmRSZXR1cm4oZmFsc2UpLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtVGltZS5oYXNDYWNoZSgpKS5hbmRSZXR1cm4odHJ1ZSkuYW55VGltZXMoKTsKKyAgICAgICAgZXhwZWN0KG1UaW1lLmN1cnJlbnRUaW1lTWlsbGlzKCkpLmFuZFJldHVybihjdXJyZW50VGltZSkuYW55VGltZXMoKTsKKyAgICAgICAgZXhwZWN0KG1UaW1lLmdldENhY2hlQWdlKCkpLmFuZFJldHVybigwTCkuYW55VGltZXMoKTsKKyAgICAgICAgZXhwZWN0KG1UaW1lLmdldENhY2hlQ2VydGFpbnR5KCkpLmFuZFJldHVybigwTCkuYW55VGltZXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0Q2xlYXJOb3RpZmljYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Ob3RpZk1hbmFnZXIuY2FuY2VsTm90aWZpY2F0aW9uV2l0aFRhZyhpc0EoU3RyaW5nLmNsYXNzKSwgaXNBKFN0cmluZy5jbGFzcyksIGFueUludCgpKTsKKyAgICAgICAgZXhwZWN0TGFzdENhbGwoKS5hbnlUaW1lcygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3RSdWxlc0NoYW5nZWQoaW50IHVpZCwgaW50IHBvbGljeSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1Qb2xpY3lMaXN0ZW5lci5vblVpZFJ1bGVzQ2hhbmdlZChlcSh1aWQpLCBlcShwb2xpY3kpKTsKKyAgICAgICAgZXhwZWN0TGFzdENhbGwoKS5hdExlYXN0T25jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3RNZXRlcmVkSWZhY2VzQ2hhbmdlZChTdHJpbmcuLi4gaWZhY2VzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbVBvbGljeUxpc3RlbmVyLm9uTWV0ZXJlZElmYWNlc0NoYW5nZWQoYXJ5RXEoaWZhY2VzKSk7CisgICAgICAgIGV4cGVjdExhc3RDYWxsKCkuYXRMZWFzdE9uY2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwbGF5KCkgeworICAgICAgICBFYXN5TW9jay5yZXBsYXkobUFjdGl2aXR5TWFuYWdlciwgbVBvd2VyTWFuYWdlciwgbVN0YXRzU2VydmljZSwgbVBvbGljeUxpc3RlbmVyLCBtVGltZSwKKyAgICAgICAgICAgICAgICBtQ29ubk1hbmFnZXIsIG1Ob3RpZk1hbmFnZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBbmRSZXNldCgpIHsKKyAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1BY3Rpdml0eU1hbmFnZXIsIG1Qb3dlck1hbmFnZXIsIG1TdGF0c1NlcnZpY2UsIG1Qb2xpY3lMaXN0ZW5lciwgbVRpbWUsCisgICAgICAgICAgICAgICAgbUNvbm5NYW5hZ2VyLCBtTm90aWZNYW5hZ2VyKTsKKyAgICAgICAgRWFzeU1vY2sucmVzZXQobUFjdGl2aXR5TWFuYWdlciwgbVBvd2VyTWFuYWdlciwgbVN0YXRzU2VydmljZSwgbVBvbGljeUxpc3RlbmVyLCBtVGltZSwKKyAgICAgICAgICAgICAgICBtQ29ubk1hbmFnZXIsIG1Ob3RpZk1hbmFnZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrU3RhdHNTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtTdGF0c1NlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2ZDA1OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrU3RhdHNTZXJ2aWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXI7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkludGVudC5BQ1RJT05fVUlEX1JFTU9WRUQ7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQuRVhUUkFfVUlEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLkNPTk5FQ1RJVklUWV9BQ1RJT047CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9NT0JJTEU7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXIuVFlQRV9XSUZJOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyLlRZUEVfV0lNQVg7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0cy5JRkFDRV9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0cy5UQUdfTk9ORTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzLlVJRF9BTEw7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQubmV0Lk5ldHdvcmtUZW1wbGF0ZS5NQVRDSF9NT0JJTEVfQUxMOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGUuTUFUQ0hfV0lGSTsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5uZXQuVHJhZmZpY1N0YXRzLlVJRF9SRU1PVkVEOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlscy5EQVlfSU5fTUlMTElTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuZm9ybWF0LkRhdGVVdGlscy5IT1VSX0lOX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuTUlOVVRFX0lOX01JTExJUzsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHMuV0VFS19JTl9NSUxMSVM7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnNlcnZlci5uZXQuTmV0d29ya1N0YXRzU2VydmljZS5BQ1RJT05fTkVUV09SS19TVEFUU19QT0xMOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zZXJ2ZXIubmV0Lk5ldHdvcmtTdGF0c1NlcnZpY2UucGFja1VpZEFuZFRhZzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLm5ldC5OZXR3b3JrU3RhdHNTZXJ2aWNlLnVucGFja1RhZzsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc2VydmVyLm5ldC5OZXR3b3JrU3RhdHNTZXJ2aWNlLnVucGFja1VpZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmFueUxvbmc7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jcmVhdGVNb2NrOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXE7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3RMYXN0Q2FsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5JQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5MaW5rUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrSW5mby5EZXRhaWxlZFN0YXRlOworaW1wb3J0IGFuZHJvaWQubmV0Lk5ldHdvcmtTdGF0ZTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrU3RhdHM7CitpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzSGlzdG9yeTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5OZXR3b3JrVGVtcGxhdGU7CitpbXBvcnQgYW5kcm9pZC5vcy5JTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlRlbGVwaG9ueU1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFuZHJvaWRUZXN0Q2FzZTsKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLmFubm90YXRpb24uTGFyZ2VUZXN0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlRydXN0ZWRUaW1lOworCitpbXBvcnQgY29tLmFuZHJvaWQuc2VydmVyLm5ldC5OZXR3b3JrU3RhdHNTZXJ2aWNlOworaW1wb3J0IGNvbS5hbmRyb2lkLnNlcnZlci5uZXQuTmV0d29ya1N0YXRzU2VydmljZS5OZXR3b3JrU3RhdHNTZXR0aW5nczsKKworaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIE5ldHdvcmtTdGF0c1NlcnZpY2V9LgorICovCitATGFyZ2VUZXN0CitwdWJsaWMgY2xhc3MgTmV0d29ya1N0YXRzU2VydmljZVRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmV0d29ya1N0YXRzU2VydmljZVRlc3QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSUZBQ0UgPSAidGVzdDAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEVTVF9TVEFSVCA9IDExOTQyMjA4MDAwMDBMOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNU0lfMSA9ICIzMTAwMDQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVNJXzIgPSAiMzEwMjYwIjsKKworICAgIHByaXZhdGUgc3RhdGljIE5ldHdvcmtUZW1wbGF0ZSBzVGVtcGxhdGVXaWZpID0gbmV3IE5ldHdvcmtUZW1wbGF0ZShNQVRDSF9XSUZJLCBudWxsKTsKKyAgICBwcml2YXRlIHN0YXRpYyBOZXR3b3JrVGVtcGxhdGUgc1RlbXBsYXRlSW1zaTEgPSBuZXcgTmV0d29ya1RlbXBsYXRlKE1BVENIX01PQklMRV9BTEwsIElNU0lfMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTmV0d29ya1RlbXBsYXRlIHNUZW1wbGF0ZUltc2kyID0gbmV3IE5ldHdvcmtUZW1wbGF0ZShNQVRDSF9NT0JJTEVfQUxMLCBJTVNJXzIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVJRF9SRUQgPSAxMDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVSURfQkxVRSA9IDEwMDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVJRF9HUkVFTiA9IDEwMDM7CisKKyAgICBwcml2YXRlIEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQgbVNlcnZpY2VDb250ZXh0OworICAgIHByaXZhdGUgRmlsZSBtU3RhdHNEaXI7CisKKyAgICBwcml2YXRlIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbU5ldE1hbmFnZXI7CisgICAgcHJpdmF0ZSBJQWxhcm1NYW5hZ2VyIG1BbGFybU1hbmFnZXI7CisgICAgcHJpdmF0ZSBUcnVzdGVkVGltZSBtVGltZTsKKyAgICBwcml2YXRlIE5ldHdvcmtTdGF0c1NldHRpbmdzIG1TZXR0aW5nczsKKyAgICBwcml2YXRlIElDb25uZWN0aXZpdHlNYW5hZ2VyIG1Db25uTWFuYWdlcjsKKworICAgIHByaXZhdGUgTmV0d29ya1N0YXRzU2VydmljZSBtU2VydmljZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0ID0gbmV3IEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQoZ2V0Q29udGV4dCgpKTsKKyAgICAgICAgbVN0YXRzRGlyID0gZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCk7CisKKyAgICAgICAgbU5ldE1hbmFnZXIgPSBjcmVhdGVNb2NrKElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuY2xhc3MpOworICAgICAgICBtQWxhcm1NYW5hZ2VyID0gY3JlYXRlTW9jayhJQWxhcm1NYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgbVRpbWUgPSBjcmVhdGVNb2NrKFRydXN0ZWRUaW1lLmNsYXNzKTsKKyAgICAgICAgbVNldHRpbmdzID0gY3JlYXRlTW9jayhOZXR3b3JrU3RhdHNTZXR0aW5ncy5jbGFzcyk7CisgICAgICAgIG1Db25uTWFuYWdlciA9IGNyZWF0ZU1vY2soSUNvbm5lY3Rpdml0eU1hbmFnZXIuY2xhc3MpOworCisgICAgICAgIG1TZXJ2aWNlID0gbmV3IE5ldHdvcmtTdGF0c1NlcnZpY2UoCisgICAgICAgICAgICAgICAgbVNlcnZpY2VDb250ZXh0LCBtTmV0TWFuYWdlciwgbUFsYXJtTWFuYWdlciwgbVRpbWUsIG1TdGF0c0RpciwgbVNldHRpbmdzKTsKKyAgICAgICAgbVNlcnZpY2UuYmluZENvbm5lY3Rpdml0eU1hbmFnZXIobUNvbm5NYW5hZ2VyKTsKKworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0U3lzdGVtUmVhZHkoKTsKKworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2Uuc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbVN0YXRzRGlyLmxpc3RGaWxlcygpKSB7CisgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgbVN0YXRzRGlyID0gbnVsbDsKKworICAgICAgICBtTmV0TWFuYWdlciA9IG51bGw7CisgICAgICAgIG1BbGFybU1hbmFnZXIgPSBudWxsOworICAgICAgICBtVGltZSA9IG51bGw7CisgICAgICAgIG1TZXR0aW5ncyA9IG51bGw7CisgICAgICAgIG1Db25uTWFuYWdlciA9IG51bGw7CisKKyAgICAgICAgbVNlcnZpY2UgPSBudWxsOworCisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE5ldHdvcmtTdGF0c1dpZmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBlbGFwc2VkUmVhbHRpbWUgPSAwOworCisgICAgICAgIC8vIHByZXRlbmQgdGhhdCB3aWZpIG5ldHdvcmsgY29tZXMgb25saW5lOyBzZXJ2aWNlIHNob3VsZCBhc2sgYWJvdXQgZnVsbAorICAgICAgICAvLyBuZXR3b3JrIHN0YXRlLCBhbmQgcG9sbCBhbnkgZXhpc3RpbmcgaW50ZXJmYWNlcyBiZWZvcmUgdXBkYXRpbmcuCisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdGUoYnVpbGRXaWZpU3RhdGUoKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c1N1bW1hcnkoYnVpbGRFbXB0eVN0YXRzKGVsYXBzZWRSZWFsdGltZSkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KENPTk5FQ1RJVklUWV9BQ1RJT04pKTsKKworICAgICAgICAvLyB2ZXJpZnkgc2VydmljZSBoYXMgZW1wdHkgaGlzdG9yeSBmb3Igd2lmaQorICAgICAgICBhc3NlcnROZXR3b3JrVG90YWwoc1RlbXBsYXRlV2lmaSwgMEwsIDBMKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBtb2RpZnkgc29tZSBudW1iZXIgb24gd2lmaSwgYW5kIHRyaWdnZXIgcG9sbCBldmVudAorICAgICAgICBlbGFwc2VkUmVhbHRpbWUgKz0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KG5ldyBOZXR3b3JrU3RhdHMoZWxhcHNlZFJlYWx0aW1lLCAxKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQUxMLCBUQUdfTk9ORSwgMTAyNEwsIDIwNDhMKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTCkpOworCisgICAgICAgIC8vIHZlcmlmeSBzZXJ2aWNlIHJlY29yZGVkIGhpc3RvcnkKKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZVdpZmksIDEwMjRMLCAyMDQ4TCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gYW5kIGJ1bXAgZm9yd2FyZCBhZ2Fpbiwgd2l0aCBjb3VudGVycyBnb2luZyBoaWdoZXIuIHRoaXMgaXMKKyAgICAgICAgLy8gaW1wb3J0YW50LCBzaW5jZSBwb2xsaW5nIHNob3VsZCBjb3JyZWN0bHkgc3VidHJhY3QgbGFzdCBzbmFwc2hvdC4KKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IERBWV9JTl9NSUxMSVM7CisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KG5ldyBOZXR3b3JrU3RhdHMoZWxhcHNlZFJlYWx0aW1lLCAxKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQUxMLCBUQUdfTk9ORSwgNDA5NkwsIDgxOTJMKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTCkpOworCisgICAgICAgIC8vIHZlcmlmeSBzZXJ2aWNlIHJlY29yZGVkIGhpc3RvcnkKKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZVdpZmksIDQwOTZMLCA4MTkyTCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdHNSZWJvb3RQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZWxhcHNlZFJlYWx0aW1lID0gMDsKKyAgICAgICAgYXNzZXJ0U3RhdHNGaWxlc0V4aXN0KGZhbHNlKTsKKworICAgICAgICAvLyBwcmV0ZW5kIHRoYXQgd2lmaSBuZXR3b3JrIGNvbWVzIG9ubGluZTsgc2VydmljZSBzaG91bGQgYXNrIGFib3V0IGZ1bGwKKyAgICAgICAgLy8gbmV0d29yayBzdGF0ZSwgYW5kIHBvbGwgYW55IGV4aXN0aW5nIGludGVyZmFjZXMgYmVmb3JlIHVwZGF0aW5nLgorICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRlKGJ1aWxkV2lmaVN0YXRlKCkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KGJ1aWxkRW1wdHlTdGF0cyhlbGFwc2VkUmVhbHRpbWUpKTsKKworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChDT05ORUNUSVZJVFlfQUNUSU9OKSk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHNlcnZpY2UgaGFzIGVtcHR5IGhpc3RvcnkgZm9yIHdpZmkKKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZVdpZmksIDBMLCAwTCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gbW9kaWZ5IHNvbWUgbnVtYmVyIG9uIHdpZmksIGFuZCB0cmlnZ2VyIHBvbGwgZXZlbnQKKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX0FMTCwgVEFHX05PTkUsIDEwMjRMLCAyMDQ4TCkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNEZXRhaWwobmV3IE5ldHdvcmtTdGF0cyhlbGFwc2VkUmVhbHRpbWUsIDIpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIFVJRF9SRUQsIFRBR19OT05FLCA1MTJMLCAyNTZMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQkxVRSwgVEFHX05PTkUsIDEyOEwsIDEyOEwpKTsKKworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChBQ1RJT05fTkVUV09SS19TVEFUU19QT0xMKSk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHNlcnZpY2UgcmVjb3JkZWQgaGlzdG9yeQorICAgICAgICBhc3NlcnROZXR3b3JrVG90YWwoc1RlbXBsYXRlV2lmaSwgMTAyNEwsIDIwNDhMKTsKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlV2lmaSwgVUlEX1JFRCwgNTEyTCwgMjU2TCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZVdpZmksIFVJRF9CTFVFLCAxMjhMLCAxMjhMKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBncmFjZWZ1bCBzaHV0ZG93biBzeXN0ZW0sIHdoaWNoIHNob3VsZCB0cmlnZ2VyIHBlcnNpc3Qgb2Ygc3RhdHMsIGFuZAorICAgICAgICAvLyBjbGVhciBhbnkgdmFsdWVzIGluIG1lbW9yeS4KKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChJbnRlbnQuQUNUSU9OX1NIVVRET1dOKSk7CisKKyAgICAgICAgLy8gdGFsayB3aXRoIHpvbWJpZSBzZXJ2aWNlIHRvIGFzc2VydCBzdGF0cyBoYXZlIGdvbmU7IGFuZCBhc3NlcnQgdGhhdAorICAgICAgICAvLyB3ZSBwZXJzaXN0ZWQgdGhlbSB0byBmaWxlLgorICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIGFzc2VydE5ldHdvcmtUb3RhbChzVGVtcGxhdGVXaWZpLCAwTCwgMEwpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIGFzc2VydFN0YXRzRmlsZXNFeGlzdCh0cnVlKTsKKworICAgICAgICAvLyBib290IHRocm91Z2ggc2VydmljZVJlYWR5KCkgYWdhaW4KKyAgICAgICAgZXhwZWN0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgIGV4cGVjdFN5c3RlbVJlYWR5KCk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlLnN5c3RlbVJlYWR5KCk7CisKKyAgICAgICAgLy8gYWZ0ZXIgc3lzdGVtUmVhZHkoKSwgd2Ugc2hvdWxkIGhhdmUgaGlzdG9yaWNhbCBzdGF0cyBsb2FkZWQgYWdhaW4KKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZVdpZmksIDEwMjRMLCAyMDQ4TCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZVdpZmksIFVJRF9SRUQsIDUxMkwsIDI1NkwpOworICAgICAgICBhc3NlcnRVaWRUb3RhbChzVGVtcGxhdGVXaWZpLCBVSURfQkxVRSwgMTI4TCwgMTI4TCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdHNCdWNrZXRSZXNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBlbGFwc2VkUmVhbHRpbWUgPSAwOworICAgICAgICBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSBudWxsOworICAgICAgICBsb25nW10gdG90YWwgPSBudWxsOworCisgICAgICAgIGFzc2VydFN0YXRzRmlsZXNFeGlzdChmYWxzZSk7CisKKyAgICAgICAgLy8gcHJldGVuZCB0aGF0IHdpZmkgbmV0d29yayBjb21lcyBvbmxpbmU7IHNlcnZpY2Ugc2hvdWxkIGFzayBhYm91dCBmdWxsCisgICAgICAgIC8vIG5ldHdvcmsgc3RhdGUsIGFuZCBwb2xsIGFueSBleGlzdGluZyBpbnRlcmZhY2VzIGJlZm9yZSB1cGRhdGluZy4KKyAgICAgICAgZXhwZWN0VGltZShURVNUX1NUQVJUICsgZWxhcHNlZFJlYWx0aW1lKTsKKyAgICAgICAgZXhwZWN0U2V0dGluZ3MoMEwsIEhPVVJfSU5fTUlMTElTLCBXRUVLX0lOX01JTExJUyk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0ZShidWlsZFdpZmlTdGF0ZSgpKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQ09OTkVDVElWSVRZX0FDVElPTikpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIG1vZGlmeSBzb21lIG51bWJlciBvbiB3aWZpLCBhbmQgdHJpZ2dlciBwb2xsIGV2ZW50CisgICAgICAgIGVsYXBzZWRSZWFsdGltZSArPSAyICogSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdFNldHRpbmdzKDBMLCBIT1VSX0lOX01JTExJUywgV0VFS19JTl9NSUxMSVMpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KG5ldyBOZXR3b3JrU3RhdHMoZWxhcHNlZFJlYWx0aW1lLCAxKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQUxMLCBUQUdfTk9ORSwgNTEyTCwgNTEyTCkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNEZXRhaWwoYnVpbGRFbXB0eVN0YXRzKGVsYXBzZWRSZWFsdGltZSkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKworICAgICAgICAvLyB2ZXJpZnkgc2VydmljZSByZWNvcmRlZCBoaXN0b3J5CisgICAgICAgIGhpc3RvcnkgPSBtU2VydmljZS5nZXRIaXN0b3J5Rm9yTmV0d29yayhuZXcgTmV0d29ya1RlbXBsYXRlKE1BVENIX1dJRkksIG51bGwpKTsKKyAgICAgICAgdG90YWwgPSBoaXN0b3J5LmdldFRvdGFsRGF0YShMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTEyTCwgdG90YWxbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoNTEyTCwgdG90YWxbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoSE9VUl9JTl9NSUxMSVMsIGhpc3RvcnkuYnVja2V0RHVyYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaGlzdG9yeS5idWNrZXRDb3VudCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gbm93IGNoYW5nZSBidWNrZXQgZHVyYXRpb24gc2V0dGluZyBhbmQgdHJpZ2dlciBhbm90aGVyIHBvbGwgd2l0aAorICAgICAgICAvLyBleGFjdCBzYW1lIHZhbHVlcywgd2hpY2ggc2hvdWxkIHJlc2l6ZSBleGlzdGluZyBidWNrZXRzLgorICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3RTZXR0aW5ncygwTCwgMzAgKiBNSU5VVEVfSU5fTUlMTElTLCBXRUVLX0lOX01JTExJUyk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c1N1bW1hcnkoYnVpbGRFbXB0eVN0YXRzKGVsYXBzZWRSZWFsdGltZSkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNEZXRhaWwoYnVpbGRFbXB0eVN0YXRzKGVsYXBzZWRSZWFsdGltZSkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKworICAgICAgICAvLyB2ZXJpZnkgaWRlbnRpY2FsIHN0YXRzLCBidXQgc3ByZWFkIGFjcm9zcyA0IGJ1Y2tldHMgbm93CisgICAgICAgIGhpc3RvcnkgPSBtU2VydmljZS5nZXRIaXN0b3J5Rm9yTmV0d29yayhuZXcgTmV0d29ya1RlbXBsYXRlKE1BVENIX1dJRkksIG51bGwpKTsKKyAgICAgICAgdG90YWwgPSBoaXN0b3J5LmdldFRvdGFsRGF0YShMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTEyTCwgdG90YWxbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoNTEyTCwgdG90YWxbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAgKiBNSU5VVEVfSU5fTUlMTElTLCBoaXN0b3J5LmJ1Y2tldER1cmF0aW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGhpc3RvcnkuYnVja2V0Q291bnQpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVpZFN0YXRzQWNyb3NzTmV0d29ya3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBlbGFwc2VkUmVhbHRpbWUgPSAwOworCisgICAgICAgIC8vIHByZXRlbmQgZmlyc3QgbW9iaWxlIG5ldHdvcmsgY29tZXMgb25saW5lCisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdGUoYnVpbGRNb2JpbGUzZ1N0YXRlKElNU0lfMSkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KGJ1aWxkRW1wdHlTdGF0cyhlbGFwc2VkUmVhbHRpbWUpKTsKKworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChDT05ORUNUSVZJVFlfQUNUSU9OKSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gY3JlYXRlIHNvbWUgdHJhZmZpYyBvbiBmaXJzdCBuZXR3b3JrCisgICAgICAgIGVsYXBzZWRSZWFsdGltZSArPSBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgZXhwZWN0VGltZShURVNUX1NUQVJUICsgZWxhcHNlZFJlYWx0aW1lKTsKKyAgICAgICAgZXhwZWN0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c1N1bW1hcnkobmV3IE5ldHdvcmtTdGF0cyhlbGFwc2VkUmVhbHRpbWUsIDEpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIFVJRF9BTEwsIFRBR19OT05FLCAyMDQ4TCwgNTEyTCkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNEZXRhaWwobmV3IE5ldHdvcmtTdGF0cyhlbGFwc2VkUmVhbHRpbWUsIDMpCisgICAgICAgICAgICAgICAgLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIFVJRF9SRUQsIFRBR19OT05FLCAxNTM2TCwgNTEyTCkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX1JFRCwgMHhGMDBELCA1MTJMLCA1MTJMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQkxVRSwgVEFHX05PTkUsIDUxMkwsIDBMKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTCkpOworCisgICAgICAgIC8vIHZlcmlmeSBzZXJ2aWNlIHJlY29yZGVkIGhpc3RvcnkKKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZUltc2kxLCAyMDQ4TCwgNTEyTCk7CisgICAgICAgIGFzc2VydE5ldHdvcmtUb3RhbChzVGVtcGxhdGVXaWZpLCAwTCwgMEwpOworICAgICAgICBhc3NlcnRVaWRUb3RhbChzVGVtcGxhdGVJbXNpMSwgVUlEX1JFRCwgMTUzNkwsIDUxMkwpOworICAgICAgICBhc3NlcnRVaWRUb3RhbChzVGVtcGxhdGVJbXNpMSwgVUlEX0JMVUUsIDUxMkwsIDBMKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBub3cgc3dpdGNoIG5ldHdvcmtzOyB0aGlzIGFsc28gdGVzdHMgdGhhdCB3ZSdyZSBva2F5IHdpdGggaW50ZXJmYWNlcworICAgICAgICAvLyBkaXNhcHBlYXJpbmcsIHRvIHZlcmlmeSB3ZSBkb24ndCBjb3VudCBiYWNrd2FyZHMuCisgICAgICAgIGVsYXBzZWRSZWFsdGltZSArPSBIT1VSX0lOX01JTExJUzsKKyAgICAgICAgZXhwZWN0VGltZShURVNUX1NUQVJUICsgZWxhcHNlZFJlYWx0aW1lKTsKKyAgICAgICAgZXhwZWN0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0ZShidWlsZE1vYmlsZTNnU3RhdGUoSU1TSV8yKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c1N1bW1hcnkoYnVpbGRFbXB0eVN0YXRzKGVsYXBzZWRSZWFsdGltZSkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNEZXRhaWwoYnVpbGRFbXB0eVN0YXRzKGVsYXBzZWRSZWFsdGltZSkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KENPTk5FQ1RJVklUWV9BQ1RJT04pKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChBQ1RJT05fTkVUV09SS19TVEFUU19QT0xMKSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gY3JlYXRlIHRyYWZmaWMgb24gc2Vjb25kIG5ldHdvcmsKKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX0FMTCwgVEFHX05PTkUsIDEyOEwsIDEwMjRMKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX0JMVUUsIFRBR19OT05FLCAxMjhMLCAxMDI0TCkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKworICAgICAgICAvLyB2ZXJpZnkgb3JpZ2luYWwgaGlzdG9yeSBzdGlsbCBpbnRhY3QKKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZUltc2kxLCAyMDQ4TCwgNTEyTCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZUltc2kxLCBVSURfUkVELCAxNTM2TCwgNTEyTCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZUltc2kxLCBVSURfQkxVRSwgNTEyTCwgMEwpOworCisgICAgICAgIC8vIGFuZCB2ZXJpZnkgbmV3IGhpc3RvcnkgYWxzbyByZWNvcmRlZCB1bmRlciBkaWZmZXJlbnQgdGVtcGxhdGUsIHdoaWNoCisgICAgICAgIC8vIHZlcmlmaWVzIHRoYXQgd2UgZGlkbid0IGNyb3NzIHRoZSBzdHJlYW1zLgorICAgICAgICBhc3NlcnROZXR3b3JrVG90YWwoc1RlbXBsYXRlSW1zaTIsIDEyOEwsIDEwMjRMKTsKKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZVdpZmksIDBMLCAwTCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZUltc2kyLCBVSURfQkxVRSwgMTI4TCwgMTAyNEwpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVpZFJlbW92ZWRJc01vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZWxhcHNlZFJlYWx0aW1lID0gMDsKKworICAgICAgICAvLyBwcmV0ZW5kIHRoYXQgbmV0d29yayBjb21lcyBvbmxpbmUKKyAgICAgICAgZXhwZWN0VGltZShURVNUX1NUQVJUICsgZWxhcHNlZFJlYWx0aW1lKTsKKyAgICAgICAgZXhwZWN0RGVmYXVsdFNldHRpbmdzKCk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0ZShidWlsZFdpZmlTdGF0ZSgpKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQ09OTkVDVElWSVRZX0FDVElPTikpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIGNyZWF0ZSBzb21lIHRyYWZmaWMKKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX0FMTCwgVEFHX05PTkUsIDQxMjhMLCA1NDRMKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX1JFRCwgVEFHX05PTkUsIDE2TCwgMTZMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQkxVRSwgVEFHX05PTkUsIDQwOTZMLCA1MTJMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfR1JFRU4sIFRBR19OT05FLCAxNkwsIDE2TCkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKworICAgICAgICAvLyB2ZXJpZnkgc2VydmljZSByZWNvcmRlZCBoaXN0b3J5CisgICAgICAgIGFzc2VydE5ldHdvcmtUb3RhbChzVGVtcGxhdGVXaWZpLCA0MTI4TCwgNTQ0TCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZVdpZmksIFVJRF9SRUQsIDE2TCwgMTZMKTsKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlV2lmaSwgVUlEX0JMVUUsIDQwOTZMLCA1MTJMKTsKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlV2lmaSwgVUlEX0dSRUVOLCAxNkwsIDE2TCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gbm93IHByZXRlbmQgdHdvIFVJRHMgYXJlIHVuaW5zdGFsbGVkLCB3aGljaCBzaG91bGQgbWlncmF0ZSBzdGF0cyB0bworICAgICAgICAvLyBzcGVjaWFsICJyZW1vdmVkIiBidWNrZXQuCisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoQUNUSU9OX1VJRF9SRU1PVkVEKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEVYVFJBX1VJRCwgVUlEX0JMVUUpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoRVhUUkFfVUlELCBVSURfUkVEKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QoaW50ZW50KTsKKworICAgICAgICAvLyBleGlzdGluZyB1aWQgYW5kIHRvdGFsIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkOyBidXQgcmVtb3ZlZCBVSUQKKyAgICAgICAgLy8gc2hvdWxkIGJlIGdvbmUgY29tcGxldGVseS4KKyAgICAgICAgYXNzZXJ0TmV0d29ya1RvdGFsKHNUZW1wbGF0ZVdpZmksIDQxMjhMLCA1NDRMKTsKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlV2lmaSwgVUlEX1JFRCwgMEwsIDBMKTsKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlV2lmaSwgVUlEX0JMVUUsIDBMLCAwTCk7CisgICAgICAgIGFzc2VydFVpZFRvdGFsKHNUZW1wbGF0ZVdpZmksIFVJRF9HUkVFTiwgMTZMLCAxNkwpOworICAgICAgICBhc3NlcnRVaWRUb3RhbChzVGVtcGxhdGVXaWZpLCBVSURfUkVNT1ZFRCwgNDExMkwsIDUyOEwpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVpZDNnNGdDb21iaW5lZEJ5VGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBlbGFwc2VkUmVhbHRpbWUgPSAwOworCisgICAgICAgIC8vIHByZXRlbmQgdGhhdCBuZXR3b3JrIGNvbWVzIG9ubGluZQorICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRlKGJ1aWxkTW9iaWxlM2dTdGF0ZShJTVNJXzEpKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQ09OTkVDVElWSVRZX0FDVElPTikpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworCisgICAgICAgIC8vIGNyZWF0ZSBzb21lIHRyYWZmaWMKKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX1JFRCwgVEFHX05PTkUsIDEwMjRMLCAxMDI0TCkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX1JFRCwgMHhGMDBELCA1MTJMLCA1MTJMKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTCkpOworCisgICAgICAgIC8vIHZlcmlmeSBzZXJ2aWNlIHJlY29yZGVkIGhpc3RvcnkKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlSW1zaTEsIFVJRF9SRUQsIDEwMjRMLCAxMDI0TCk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gbm93IHN3aXRjaCBvdmVyIHRvIDRnIG5ldHdvcmsKKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRlKGJ1aWxkTW9iaWxlNGdTdGF0ZSgpKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQ09OTkVDVElWSVRZX0FDVElPTikpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgICAgICAvLyBjcmVhdGUgdHJhZmZpYyBvbiBzZWNvbmQgbmV0d29yaworICAgICAgICBlbGFwc2VkUmVhbHRpbWUgKz0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KGJ1aWxkRW1wdHlTdGF0cyhlbGFwc2VkUmVhbHRpbWUpKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzRGV0YWlsKG5ldyBOZXR3b3JrU3RhdHMoZWxhcHNlZFJlYWx0aW1lLCAxKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfUkVELCBUQUdfTk9ORSwgNTEyTCwgMjU2TCkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCBBTExfTU9CSUxFIHRlbXBsYXRlIGNvbWJpbmVzIGJvdGgKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlSW1zaTEsIFVJRF9SRUQsIDE1MzZMLCAxMjgwTCk7CisKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2VkVWlkQW5kVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwMDAwMDAwMDBMLCBwYWNrVWlkQW5kVGFnKDAsIDB4MCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDNFOTAwMDAwMDAwTCwgcGFja1VpZEFuZFRhZygxMDAxLCAweDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAzRTkwMDAwRjAwREwsIHBhY2tVaWRBbmRUYWcoMTAwMSwgMHhGMDBEKSk7CisKKyAgICAgICAgbG9uZyBwYWNrZWQ7CisgICAgICAgIHBhY2tlZCA9IHBhY2tVaWRBbmRUYWcoSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCB1bnBhY2tVaWQocGFja2VkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1JTl9WQUxVRSwgdW5wYWNrVGFnKHBhY2tlZCkpOworCisgICAgICAgIHBhY2tlZCA9IHBhY2tVaWRBbmRUYWcoSW50ZWdlci5NSU5fVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUlOX1ZBTFVFLCB1bnBhY2tVaWQocGFja2VkKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgdW5wYWNrVGFnKHBhY2tlZCkpOworCisgICAgICAgIHBhY2tlZCA9IHBhY2tVaWRBbmRUYWcoMTAwMDUsIDB4RkZGRkZGRkYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDUsIHVucGFja1VpZChwYWNrZWQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkYsIHVucGFja1RhZyhwYWNrZWQpKTsKKyAgICAgICAgCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFN1bW1hcnlGb3JBbGxVaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBlbGFwc2VkUmVhbHRpbWUgPSAwOworCisgICAgICAgIC8vIHByZXRlbmQgdGhhdCBuZXR3b3JrIGNvbWVzIG9ubGluZQorICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRlKGJ1aWxkV2lmaVN0YXRlKCkpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KGJ1aWxkRW1wdHlTdGF0cyhlbGFwc2VkUmVhbHRpbWUpKTsKKworICAgICAgICByZXBsYXkoKTsKKyAgICAgICAgbVNlcnZpY2VDb250ZXh0LnNlbmRCcm9hZGNhc3QobmV3IEludGVudChDT05ORUNUSVZJVFlfQUNUSU9OKSk7CisgICAgICAgIHZlcmlmeUFuZFJlc2V0KCk7CisKKyAgICAgICAgLy8gY3JlYXRlIHNvbWUgdHJhZmZpYyBmb3IgdHdvIGFwcHMKKyAgICAgICAgZWxhcHNlZFJlYWx0aW1lICs9IEhPVVJfSU5fTUlMTElTOworICAgICAgICBleHBlY3RUaW1lKFRFU1RfU1RBUlQgKyBlbGFwc2VkUmVhbHRpbWUpOworICAgICAgICBleHBlY3REZWZhdWx0U2V0dGluZ3MoKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzU3VtbWFyeShidWlsZEVtcHR5U3RhdHMoZWxhcHNlZFJlYWx0aW1lKSk7CisgICAgICAgIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMSkKKyAgICAgICAgICAgICAgICAuYWRkRW50cnkoVEVTVF9JRkFDRSwgVUlEX1JFRCwgVEFHX05PTkUsIDUwTCwgNTBMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfUkVELCAweEYwMEQsIDEwTCwgMTBMKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQkxVRSwgVEFHX05PTkUsIDEwMjRMLCA1MTJMKSk7CisKKyAgICAgICAgcmVwbGF5KCk7CisgICAgICAgIG1TZXJ2aWNlQ29udGV4dC5zZW5kQnJvYWRjYXN0KG5ldyBJbnRlbnQoQUNUSU9OX05FVFdPUktfU1RBVFNfUE9MTCkpOworCisgICAgICAgIC8vIHZlcmlmeSBzZXJ2aWNlIHJlY29yZGVkIGhpc3RvcnkKKyAgICAgICAgYXNzZXJ0VWlkVG90YWwoc1RlbXBsYXRlV2lmaSwgVUlEX1JFRCwgNTBMLCA1MEwpOworICAgICAgICBhc3NlcnRVaWRUb3RhbChzVGVtcGxhdGVXaWZpLCBVSURfQkxVRSwgMTAyNEwsIDUxMkwpOworICAgICAgICB2ZXJpZnlBbmRSZXNldCgpOworICAgICAgICAKKyAgICAgICAgLy8gbm93IGNyZWF0ZSBtb3JlIHRyYWZmaWMgaW4gbmV4dCBob3VyLCBidXQgb25seSBmb3Igb25lIGFwcAorICAgICAgICBlbGFwc2VkUmVhbHRpbWUgKz0gSE9VUl9JTl9NSUxMSVM7CisgICAgICAgIGV4cGVjdFRpbWUoVEVTVF9TVEFSVCArIGVsYXBzZWRSZWFsdGltZSk7CisgICAgICAgIGV4cGVjdERlZmF1bHRTZXR0aW5ncygpOworICAgICAgICBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KGJ1aWxkRW1wdHlTdGF0cyhlbGFwc2VkUmVhbHRpbWUpKTsKKyAgICAgICAgZXhwZWN0TmV0d29ya1N0YXRzRGV0YWlsKG5ldyBOZXR3b3JrU3RhdHMoZWxhcHNlZFJlYWx0aW1lLCAxKQorICAgICAgICAgICAgICAgIC5hZGRFbnRyeShURVNUX0lGQUNFLCBVSURfQkxVRSwgVEFHX05PTkUsIDIwNDhMLCAxMDI0TCkpOworCisgICAgICAgIHJlcGxheSgpOworICAgICAgICBtU2VydmljZUNvbnRleHQuc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEFDVElPTl9ORVRXT1JLX1NUQVRTX1BPTEwpKTsKKworICAgICAgICAvLyBmaXJzdCB2ZXJpZnkgZW50aXJlIGhpc3RvcnkgcHJlc2VudAorICAgICAgICBOZXR3b3JrU3RhdHMgc3RhdHMgPSBtU2VydmljZS5nZXRTdW1tYXJ5Rm9yQWxsVWlkKAorICAgICAgICAgICAgICAgIHNUZW1wbGF0ZVdpZmksIExvbmcuTUlOX1ZBTFVFLCBMb25nLk1BWF9WQUxVRSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBzdGF0cy5zaXplKTsKKyAgICAgICAgYXNzZXJ0U3RhdHNFbnRyeShzdGF0cywgMCwgSUZBQ0VfQUxMLCBVSURfUkVELCBUQUdfTk9ORSwgNTBMLCA1MEwpOworICAgICAgICBhc3NlcnRTdGF0c0VudHJ5KHN0YXRzLCAxLCBJRkFDRV9BTEwsIFVJRF9SRUQsIDB4RjAwRCwgMTBMLCAxMEwpOworICAgICAgICBhc3NlcnRTdGF0c0VudHJ5KHN0YXRzLCAyLCBJRkFDRV9BTEwsIFVJRF9CTFVFLCBUQUdfTk9ORSwgMjA0OEwsIDEwMjRMKTsKKworICAgICAgICAvLyBub3cgdmVyaWZ5IHRoYXQgcmVjZW50IGhpc3Rvcnkgb25seSBjb250YWlucyBvbmUgdWlkCisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBURVNUX1NUQVJUICsgZWxhcHNlZFJlYWx0aW1lOworICAgICAgICBzdGF0cyA9IG1TZXJ2aWNlLmdldFN1bW1hcnlGb3JBbGxVaWQoCisgICAgICAgICAgICAgICAgc1RlbXBsYXRlV2lmaSwgY3VycmVudFRpbWUgLSBIT1VSX0lOX01JTExJUywgY3VycmVudFRpbWUsIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RhdHMuc2l6ZSk7CisgICAgICAgIGFzc2VydFN0YXRzRW50cnkoc3RhdHMsIDAsIElGQUNFX0FMTCwgVUlEX0JMVUUsIFRBR19OT05FLCAxMDI0TCwgNTEyTCk7CisKKyAgICAgICAgdmVyaWZ5QW5kUmVzZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TmV0d29ya1RvdGFsKE5ldHdvcmtUZW1wbGF0ZSB0ZW1wbGF0ZSwgbG9uZyByeCwgbG9uZyB0eCkgeworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHNIaXN0b3J5IGhpc3RvcnkgPSBtU2VydmljZS5nZXRIaXN0b3J5Rm9yTmV0d29yayh0ZW1wbGF0ZSk7CisgICAgICAgIGZpbmFsIGxvbmdbXSB0b3RhbCA9IGhpc3RvcnkuZ2V0VG90YWxEYXRhKExvbmcuTUlOX1ZBTFVFLCBMb25nLk1BWF9WQUxVRSwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyeCwgdG90YWxbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHModHgsIHRvdGFsWzFdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VWlkVG90YWwoTmV0d29ya1RlbXBsYXRlIHRlbXBsYXRlLCBpbnQgdWlkLCBsb25nIHJ4LCBsb25nIHR4KSB7CisgICAgICAgIGZpbmFsIE5ldHdvcmtTdGF0c0hpc3RvcnkgaGlzdG9yeSA9IG1TZXJ2aWNlLmdldEhpc3RvcnlGb3JVaWQodGVtcGxhdGUsIHVpZCwgVEFHX05PTkUpOworICAgICAgICBmaW5hbCBsb25nW10gdG90YWwgPSBoaXN0b3J5LmdldFRvdGFsRGF0YShMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMocngsIHRvdGFsWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR4LCB0b3RhbFsxXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdFN5c3RlbVJlYWR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1BbGFybU1hbmFnZXIucmVtb3ZlKGlzQShQZW5kaW5nSW50ZW50LmNsYXNzKSk7CisgICAgICAgIGV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKKworICAgICAgICBtQWxhcm1NYW5hZ2VyLnNldEluZXhhY3RSZXBlYXRpbmcoCisgICAgICAgICAgICAgICAgZXEoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUUpLCBhbnlMb25nKCksIGFueUxvbmcoKSwgaXNBKFBlbmRpbmdJbnRlbnQuY2xhc3MpKTsKKyAgICAgICAgZXhwZWN0TGFzdENhbGwoKS5hdExlYXN0T25jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3ROZXR3b3JrU3RhdGUoTmV0d29ya1N0YXRlLi4uIHN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KG1Db25uTWFuYWdlci5nZXRBbGxOZXR3b3JrU3RhdGUoKSkuYW5kUmV0dXJuKHN0YXRlKS5hdExlYXN0T25jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3ROZXR3b3JrU3RhdHNTdW1tYXJ5KE5ldHdvcmtTdGF0cyBzdW1tYXJ5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KG1OZXRNYW5hZ2VyLmdldE5ldHdvcmtTdGF0c1N1bW1hcnkoKSkuYW5kUmV0dXJuKHN1bW1hcnkpLmF0TGVhc3RPbmNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdE5ldHdvcmtTdGF0c0RldGFpbChOZXR3b3JrU3RhdHMgZGV0YWlsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KG1OZXRNYW5hZ2VyLmdldE5ldHdvcmtTdGF0c0RldGFpbCgpKS5hbmRSZXR1cm4oZGV0YWlsKS5hdExlYXN0T25jZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3REZWZhdWx0U2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0U2V0dGluZ3MoMEwsIEhPVVJfSU5fTUlMTElTLCBXRUVLX0lOX01JTExJUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdFNldHRpbmdzKGxvbmcgcGVyc2lzdFRocmVzaG9sZCwgbG9uZyBidWNrZXREdXJhdGlvbiwgbG9uZyBtYXhIaXN0b3J5KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChtU2V0dGluZ3MuZ2V0UG9sbEludGVydmFsKCkpLmFuZFJldHVybihIT1VSX0lOX01JTExJUykuYW55VGltZXMoKTsKKyAgICAgICAgZXhwZWN0KG1TZXR0aW5ncy5nZXRQZXJzaXN0VGhyZXNob2xkKCkpLmFuZFJldHVybihwZXJzaXN0VGhyZXNob2xkKS5hbnlUaW1lcygpOworICAgICAgICBleHBlY3QobVNldHRpbmdzLmdldE5ldHdvcmtCdWNrZXREdXJhdGlvbigpKS5hbmRSZXR1cm4oYnVja2V0RHVyYXRpb24pLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtU2V0dGluZ3MuZ2V0TmV0d29ya01heEhpc3RvcnkoKSkuYW5kUmV0dXJuKG1heEhpc3RvcnkpLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtU2V0dGluZ3MuZ2V0VWlkQnVja2V0RHVyYXRpb24oKSkuYW5kUmV0dXJuKGJ1Y2tldER1cmF0aW9uKS5hbnlUaW1lcygpOworICAgICAgICBleHBlY3QobVNldHRpbmdzLmdldFVpZE1heEhpc3RvcnkoKSkuYW5kUmV0dXJuKG1heEhpc3RvcnkpLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtU2V0dGluZ3MuZ2V0VGFnTWF4SGlzdG9yeSgpKS5hbmRSZXR1cm4obWF4SGlzdG9yeSkuYW55VGltZXMoKTsKKyAgICAgICAgZXhwZWN0KG1TZXR0aW5ncy5nZXRUaW1lQ2FjaGVNYXhBZ2UoKSkuYW5kUmV0dXJuKERBWV9JTl9NSUxMSVMpLmFueVRpbWVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdFRpbWUobG9uZyBjdXJyZW50VGltZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChtVGltZS5mb3JjZVJlZnJlc2goKSkuYW5kUmV0dXJuKGZhbHNlKS5hbnlUaW1lcygpOworICAgICAgICBleHBlY3QobVRpbWUuaGFzQ2FjaGUoKSkuYW5kUmV0dXJuKHRydWUpLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtVGltZS5jdXJyZW50VGltZU1pbGxpcygpKS5hbmRSZXR1cm4oY3VycmVudFRpbWUpLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtVGltZS5nZXRDYWNoZUFnZSgpKS5hbmRSZXR1cm4oMEwpLmFueVRpbWVzKCk7CisgICAgICAgIGV4cGVjdChtVGltZS5nZXRDYWNoZUNlcnRhaW50eSgpKS5hbmRSZXR1cm4oMEwpLmFueVRpbWVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFN0YXRzRmlsZXNFeGlzdChib29sZWFuIGV4aXN0KSB7CisgICAgICAgIGZpbmFsIEZpbGUgbmV0d29ya0ZpbGUgPSBuZXcgRmlsZShtU3RhdHNEaXIsICJuZXRzdGF0cy5iaW4iKTsKKyAgICAgICAgZmluYWwgRmlsZSB1aWRGaWxlID0gbmV3IEZpbGUobVN0YXRzRGlyLCAibmV0c3RhdHNfdWlkLmJpbiIpOworICAgICAgICBpZiAoZXhpc3QpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobmV0d29ya0ZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1aWRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldHdvcmtGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHVpZEZpbGUuZXhpc3RzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTdGF0c0VudHJ5KAorICAgICAgICAgICAgTmV0d29ya1N0YXRzIHN0YXRzLCBpbnQgaSwgU3RyaW5nIGlmYWNlLCBpbnQgdWlkLCBpbnQgdGFnLCBsb25nIHJ4LCBsb25nIHR4KSB7CisgICAgICAgIGFzc2VydEVxdWFscyhpZmFjZSwgc3RhdHMuaWZhY2VbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHModWlkLCBzdGF0cy51aWRbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHModGFnLCBzdGF0cy50YWdbaV0pOworICAgICAgICBhc3NlcnRFcXVhbHMocngsIHN0YXRzLnJ4W2ldKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHR4LCBzdGF0cy50eFtpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTmV0d29ya1N0YXRlIGJ1aWxkV2lmaVN0YXRlKCkgeworICAgICAgICBmaW5hbCBOZXR3b3JrSW5mbyBpbmZvID0gbmV3IE5ldHdvcmtJbmZvKFRZUEVfV0lGSSwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGZpbmFsIExpbmtQcm9wZXJ0aWVzIHByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcC5zZXRJbnRlcmZhY2VOYW1lKFRFU1RfSUZBQ0UpOworICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0ZShpbmZvLCBwcm9wLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOZXR3b3JrU3RhdGUgYnVpbGRNb2JpbGUzZ1N0YXRlKFN0cmluZyBzdWJzY3JpYmVySWQpIHsKKyAgICAgICAgZmluYWwgTmV0d29ya0luZm8gaW5mbyA9IG5ldyBOZXR3b3JrSW5mbygKKyAgICAgICAgICAgICAgICBUWVBFX01PQklMRSwgVGVsZXBob255TWFuYWdlci5ORVRXT1JLX1RZUEVfVU1UUywgbnVsbCwgbnVsbCk7CisgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGZpbmFsIExpbmtQcm9wZXJ0aWVzIHByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcC5zZXRJbnRlcmZhY2VOYW1lKFRFU1RfSUZBQ0UpOworICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0ZShpbmZvLCBwcm9wLCBudWxsLCBzdWJzY3JpYmVySWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE5ldHdvcmtTdGF0ZSBidWlsZE1vYmlsZTRnU3RhdGUoKSB7CisgICAgICAgIGZpbmFsIE5ldHdvcmtJbmZvIGluZm8gPSBuZXcgTmV0d29ya0luZm8oVFlQRV9XSU1BWCwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGluZm8uc2V0RGV0YWlsZWRTdGF0ZShEZXRhaWxlZFN0YXRlLkNPTk5FQ1RFRCwgbnVsbCwgbnVsbCk7CisgICAgICAgIGZpbmFsIExpbmtQcm9wZXJ0aWVzIHByb3AgPSBuZXcgTGlua1Byb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcC5zZXRJbnRlcmZhY2VOYW1lKFRFU1RfSUZBQ0UpOworICAgICAgICByZXR1cm4gbmV3IE5ldHdvcmtTdGF0ZShpbmZvLCBwcm9wLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOZXR3b3JrU3RhdHMgYnVpbGRFbXB0eVN0YXRzKGxvbmcgZWxhcHNlZFJlYWx0aW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgTmV0d29ya1N0YXRzKGVsYXBzZWRSZWFsdGltZSwgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxheSgpIHsKKyAgICAgICAgRWFzeU1vY2sucmVwbGF5KG1OZXRNYW5hZ2VyLCBtQWxhcm1NYW5hZ2VyLCBtVGltZSwgbVNldHRpbmdzLCBtQ29ubk1hbmFnZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBbmRSZXNldCgpIHsKKyAgICAgICAgRWFzeU1vY2sudmVyaWZ5KG1OZXRNYW5hZ2VyLCBtQWxhcm1NYW5hZ2VyLCBtVGltZSwgbVNldHRpbmdzLCBtQ29ubk1hbmFnZXIpOworICAgICAgICBFYXN5TW9jay5yZXNldChtTmV0TWFuYWdlciwgbUFsYXJtTWFuYWdlciwgbVRpbWUsIG1TZXR0aW5ncywgbUNvbm5NYW5hZ2VyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlVGVzdC5qYXZhIGIvc2VydmljZXMvdGVzdHMvc2VydmljZXN0ZXN0cy9zcmMvY29tL2FuZHJvaWQvc2VydmVyL1Rocm90dGxlU2VydmljZVRlc3QuamF2YQppbmRleCBjYTMzZDMyLi4yZjI3NWMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy90ZXN0cy9zZXJ2aWNlc3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9zZXJ2ZXIvVGhyb3R0bGVTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3NlcnZpY2VzL3Rlc3RzL3NlcnZpY2VzdGVzdHMvc3JjL2NvbS9hbmRyb2lkL3NlcnZlci9UaHJvdHRsZVNlcnZpY2VUZXN0LmphdmEKQEAgLTI1LDE0ICsyNSw5IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXNldDsKIGltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkFic3RyYWN0RnV0dXJlOwotCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwogaW1wb3J0IGFuZHJvaWQubmV0LklOZXR3b3JrTWFuYWdlbWVudEV2ZW50T2JzZXJ2ZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya1N0YXRzOwogaW1wb3J0IGFuZHJvaWQubmV0LlRocm90dGxlTWFuYWdlcjsKQEAgLTQ4LDggKzQzLDYgQEAKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UcnVzdGVkVGltZTsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiAKIC8qKgpAQCAtNjYsNyArNTksNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfSUZBQ0UgPSAidGVzdDAiOwogCi0gICAgcHJpdmF0ZSBXYXRjaGluZ0NvbnRleHQgbVdhdGNoaW5nQ29udGV4dDsKKyAgICBwcml2YXRlIEJyb2FkY2FzdEludGVyY2VwdGluZ0NvbnRleHQgbVdhdGNoaW5nQ29udGV4dDsKICAgICBwcml2YXRlIElOZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UgbU1vY2tOTVNlcnZpY2U7CiAgICAgcHJpdmF0ZSBUcnVzdGVkVGltZSBtTW9ja1RpbWU7CiAKQEAgLTc2LDcgKzY5LDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogCi0gICAgICAgIG1XYXRjaGluZ0NvbnRleHQgPSBuZXcgV2F0Y2hpbmdDb250ZXh0KGdldENvbnRleHQoKSk7CisgICAgICAgIG1XYXRjaGluZ0NvbnRleHQgPSBuZXcgQnJvYWRjYXN0SW50ZXJjZXB0aW5nQ29udGV4dChnZXRDb250ZXh0KCkpOwogCiAgICAgICAgIG1Nb2NrTk1TZXJ2aWNlID0gY3JlYXRlTW9jayhJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLmNsYXNzKTsKICAgICAgICAgbU1vY2tUaW1lID0gY3JlYXRlTW9jayhUcnVzdGVkVGltZS5jbGFzcyk7CkBAIC0yOTUsMTEgKzI4OCwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdldEludGVyZmFjZUNvdW50ZXIobG9uZyByeCwgbG9uZyB0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFRPRE86IHByb3ZpZGUgZWxhcHNlZFJlYWx0aW1lIG1vY2sgdG8gbWF0Y2ggVGltZUF1dGhvcml0eQotICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMuQnVpbGRlciBzdGF0cyA9IG5ldyBOZXR3b3JrU3RhdHMuQnVpbGRlcigKLSAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSwgMSk7Ci0gICAgICAgIHN0YXRzLmFkZEVudHJ5KFRFU1RfSUZBQ0UsIE5ldHdvcmtTdGF0cy5VSURfQUxMLCByeCwgdHgpOworICAgICAgICBmaW5hbCBOZXR3b3JrU3RhdHMgc3RhdHMgPSBuZXcgTmV0d29ya1N0YXRzKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLCAxKTsKKyAgICAgICAgc3RhdHMuYWRkRW50cnkoVEVTVF9JRkFDRSwgTmV0d29ya1N0YXRzLlVJRF9BTEwsIE5ldHdvcmtTdGF0cy5UQUdfTk9ORSwgcngsIHR4KTsKIAotICAgICAgICBleHBlY3QobU1vY2tOTVNlcnZpY2UuZ2V0TmV0d29ya1N0YXRzU3VtbWFyeSgpKS5hbmRSZXR1cm4oc3RhdHMuYnVpbGQoKSkuYXRMZWFzdE9uY2UoKTsKKyAgICAgICAgZXhwZWN0KG1Nb2NrTk1TZXJ2aWNlLmdldE5ldHdvcmtTdGF0c1N1bW1hcnkoKSkuYW5kUmV0dXJuKHN0YXRzKS5hdExlYXN0T25jZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzU0LDY5ICszNDYsNCBAQAogCiAgICAgICAgIHBvbGxBY3Rpb24uZ2V0KCk7CiAgICAgfQotCi0KLSAgICAvKioKLSAgICAgKiB7QGxpbmsgQ29udGV4dFdyYXBwZXJ9IHRoYXQgY2FuIGF0dGFjaCBsaXN0ZW5lcnMgZm9yIHVwY29taW5nCi0gICAgICoge0BsaW5rIENvbnRleHQjc2VuZEJyb2FkY2FzdChJbnRlbnQpfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXYXRjaGluZ0NvbnRleHQgZXh0ZW5kcyBDb250ZXh0V3JhcHBlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxMb2NhbEJyb2FkY2FzdFJlY2VpdmVyPiBtUmVjZWl2ZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHVibGljIGNsYXNzIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgZXh0ZW5kcyBBYnN0cmFjdEZ1dHVyZTxJbnRlbnQ+IHsKLSAgICAgICAgICAgIHByaXZhdGUgSW50ZW50RmlsdGVyIG1GaWx0ZXI7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBMb2NhbEJyb2FkY2FzdFJlY2VpdmVyKEludGVudEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgICAgICBtRmlsdGVyID0gZmlsdGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaEJyb2FkY2FzdChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1GaWx0ZXIubWF0Y2goZ2V0Q29udGVudFJlc29sdmVyKCksIGludGVudCwgZmFsc2UsIFRBRykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldChpbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFdhdGNoaW5nQ29udGV4dChDb250ZXh0IGJhc2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGJhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZ1dHVyZTxJbnRlbnQ+IG5leHRCcm9hZGNhc3RJbnRlbnQoU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG5leHRCcm9hZGNhc3RJbnRlbnQobmV3IEludGVudEZpbHRlcihhY3Rpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGdXR1cmU8SW50ZW50PiBuZXh0QnJvYWRjYXN0SW50ZW50KEludGVudEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgIGZpbmFsIExvY2FsQnJvYWRjYXN0UmVjZWl2ZXIgcmVjZWl2ZXIgPSBuZXcgTG9jYWxCcm9hZGNhc3RSZWNlaXZlcihmaWx0ZXIpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgbVJlY2VpdmVycy5hZGQocmVjZWl2ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRCcm9hZGNhc3QoSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtUmVjZWl2ZXJzKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8TG9jYWxCcm9hZGNhc3RSZWNlaXZlcj4gaSA9IG1SZWNlaXZlcnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgTG9jYWxCcm9hZGNhc3RSZWNlaXZlciByZWNlaXZlciA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZXIuZGlzcGF0Y2hCcm9hZGNhc3QoaW50ZW50KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kU3RpY2t5QnJvYWRjYXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHNlbmRCcm9hZGNhc3QoaW50ZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVTdGlja3lCcm9hZGNhc3QoSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgLy8gaWdub3JlZAotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU2VydmljZVN0YXRlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGUuamF2YQppbmRleCBiYTA1ODM3Li5mY2U3Y2RjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGUuamF2YQpAQCAtMzg3LDYyICszODcsNzcgQEAKICAgICAgICAgICAgICAgICAmJiBtSXNFbWVyZ2VuY3lPbmx5ID09IHMubUlzRW1lcmdlbmN5T25seSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29udmVydCByYWRpbyB0ZWNobm9sb2d5IHRvIFN0cmluZworICAgICAqCisgICAgICogQHBhcmFtIHJhZGlvVGVjaG5vbG9neQorICAgICAqIEByZXR1cm4gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBSQVQKKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmFkaW9UZWNobm9sb2d5VG9TdHJpbmcoaW50IHJ0KSB7CisgICAgICAgIFN0cmluZyBydFN0cmluZzsKKworICAgICAgICBzd2l0Y2gocnQpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJVbmtub3duIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJHUFJTIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJFREdFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJVTVRTIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJDRE1BLUlTOTVBIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJDRE1BLUlTOTVCIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICIxeFJUVCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiRXZEby1yZXYuMCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiRXZEby1yZXYuQSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiSFNEUEEiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJIU1VQQSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgIHJ0U3RyaW5nID0gIkhTUEEiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJFdkRvLXJldi5CIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICAgICAgcnRTdHJpbmcgPSAiZUhSUEQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJMVEUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBydFN0cmluZyA9ICJIU1BBUCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJ0U3RyaW5nID0gIlVuZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJVbmV4cGVjdGVkIHJhZGlvVGVjaG5vbG9neT0iICsgcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydFN0cmluZyArICI6IiArIHJ0OworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyByYWRpb1RlY2hub2xvZ3kgPSBuZXcgU3RyaW5nKCJFcnJvciBpbiByYWRpb1RlY2hub2xvZ3kiKTsKLSAgICAgICAgc3dpdGNoKHRoaXMubVJhZGlvVGVjaG5vbG9neSkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiVW5rbm93biI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIkdQUlMiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJFREdFIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiVU1UUyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIklTOTVBIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiSVM5NUIiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICIxeFJUVCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIkV2RG8gcmV2LiAwIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICByYWRpb1RlY2hub2xvZ3kgPSAiRXZEbyByZXYuIEEiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJIU0RQQSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJIU1VQQSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJIU1BBIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIkV2RG8gcmV2LiBCIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gImVIUlBEIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgcmFkaW9UZWNobm9sb2d5ID0gIkxURSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgIHJhZGlvVGVjaG5vbG9neSA9ICJIU1BBUCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExvZy53KExPR19UQUcsICJtUmFkaW9UZWNobm9sb2d5IHZhcmlhYmxlIG91dCBvZiByYW5nZS4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJhZGlvVGVjaG5vbG9neSA9IHJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKG1SYWRpb1RlY2hub2xvZ3kpOwogCiAgICAgICAgIHJldHVybiAobVN0YXRlICsgIiAiICsgKG1Sb2FtaW5nID8gInJvYW1pbmciIDogImhvbWUiKQogICAgICAgICAgICAgICAgICsgIiAiICsgbU9wZXJhdG9yQWxwaGFMb25nCkBAIC01NTEsNyArNTY2LDcgQEAKICAgICAgKgogICAgICAqIEBoaWRlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2RtYUVyaVRleHQoU3RyaW5nIGxvbmdOYW1lKSB7CisgICAgcHVibGljIHZvaWQgc2V0T3BlcmF0b3JBbHBoYUxvbmcoU3RyaW5nIGxvbmdOYW1lKSB7CiAgICAgICAgIG1PcGVyYXRvckFscGhhTG9uZyA9IGxvbmdOYW1lOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JDb25zdGFudHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiNGFkZgotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQudGVsZXBob255OworCisvKioKKyAqIENvbnN0YW50cyB1c2VkIGluIFNNUyBDZWxsIEJyb2FkY2FzdCBtZXNzYWdlcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU21zQ2JDb25zdGFudHMgeworICAgIC8qKiBTdGFydCBvZiBQV1MgTWVzc2FnZSBJZGVudGlmaWVyIHJhbmdlIChpbmNsdWRlcyBFVFdTIGFuZCBDTUFTKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX1BXU19GSVJTVF9JREVOVElGSUVSID0gMHgxMTAwOworCisgICAgLyoqIEJpdG1hc2sgZm9yIG1lc3NhZ2VzIG9mIEVUV1MgdHlwZSAoaW5jbHVkaW5nIGZ1dHVyZSBleHRlbnNpb25zKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0VUV1NfVFlQRV9NQVNLICAgICAgID0gMHhGRkY4OworCisgICAgLyoqIFZhbHVlIGZvciBtZXNzYWdlcyBvZiBFVFdTIHR5cGUgYWZ0ZXIgYXBwbHlpbmcge0BsaW5rICNNRVNTQUdFX0lEX0VUV1NfVFlQRV9NQVNLfS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0VUV1NfVFlQRSAgICAgICAgICAgID0gMHgxMTAwOworCisgICAgLyoqIEVUV1MgTWVzc2FnZSBJZGVudGlmaWVyIGZvciBlYXJ0aHF1YWtlIHdhcm5pbmcgbWVzc2FnZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0VUV1NfRUFSVEhRVUFLRV9XQVJOSU5HICAgICAgPSAweDExMDA7CisKKyAgICAvKiogRVRXUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIHRzdW5hbWkgd2FybmluZyBtZXNzYWdlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfRVRXU19UU1VOQU1JX1dBUk5JTkcgICAgICAgICA9IDB4MTEwMTsKKworICAgIC8qKiBFVFdTIE1lc3NhZ2UgSWRlbnRpZmllciBmb3IgZWFydGhxdWFrZSBhbmQgdHN1bmFtaSBjb21iaW5lZCB3YXJuaW5nIG1lc3NhZ2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9FVFdTX0VBUlRIUVVBS0VfQU5EX1RTVU5BTUlfV0FSTklORyAgPSAweDExMDI7CisKKyAgICAvKiogRVRXUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIHRlc3QgbWVzc2FnZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0VUV1NfVEVTVF9NRVNTQUdFICAgICAgICAgICAgPSAweDExMDM7CisKKyAgICAvKiogRVRXUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gb3RoZXIgZW1lcmdlbmN5IHR5cGVzLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfRVRXU19PVEhFUl9FTUVSR0VOQ1lfVFlQRSAgICA9IDB4MTEwNDsKKworICAgIC8qKiBTdGFydCBvZiBDTUFTIE1lc3NhZ2UgSWRlbnRpZmllciByYW5nZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0NNQVNfRklSU1RfSURFTlRJRklFUiAgICAgICAgICAgICAgICA9IDB4MTExMjsKKworICAgIC8qKiBDTUFTIE1lc3NhZ2UgSWRlbnRpZmllciBmb3IgUHJlc2lkZW50aWFsIExldmVsIGFsZXJ0cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0NNQVNfQUxFUlRfUFJFU0lERU5USUFMX0xFVkVMICAgICAgICA9IDB4MTExMjsKKworICAgIC8qKiBDTUFTIE1lc3NhZ2UgSWRlbnRpZmllciBmb3IgRXh0cmVtZSBhbGVydHMsIFVyZ2VuY3k9SW1tZWRpYXRlLCBDZXJ0YWludHk9T2JzZXJ2ZWQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfSU1NRURJQVRFX09CU0VSVkVEID0gMHgxMTEzOworCisgICAgLyoqIENNQVMgTWVzc2FnZSBJZGVudGlmaWVyIGZvciBFeHRyZW1lIGFsZXJ0cywgVXJnZW5jeT1JbW1lZGlhdGUsIENlcnRhaW50eT1MaWtlbHkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfSU1NRURJQVRFX0xJS0VMWSAgPSAweDExMTQ7CisKKyAgICAvKiogQ01BUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIEV4dHJlbWUgYWxlcnRzLCBVcmdlbmN5PUV4cGVjdGVkLCBDZXJ0YWludHk9T2JzZXJ2ZWQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYVFJFTUVfRVhQRUNURURfT0JTRVJWRUQgPSAweDExMTU7CisKKyAgICAvKiogQ01BUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIEV4dHJlbWUgYWxlcnRzLCBVcmdlbmN5PUV4cGVjdGVkLCBDZXJ0YWludHk9TGlrZWx5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfQ01BU19BTEVSVF9FWFRSRU1FX0VYUEVDVEVEX0xJS0VMWSAgID0gMHgxMTE2OworCisgICAgLyoqIENNQVMgTWVzc2FnZSBJZGVudGlmaWVyIGZvciBTZXZlcmUgYWxlcnRzLCBVcmdlbmN5PUltbWVkaWF0ZSwgQ2VydGFpbnR5PU9ic2VydmVkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfSU1NRURJQVRFX09CU0VSVkVEID0gMHgxMTE3OworCisgICAgLyoqIENNQVMgTWVzc2FnZSBJZGVudGlmaWVyIGZvciBTZXZlcmUgYWxlcnRzLCBVcmdlbmN5PUltbWVkaWF0ZSwgQ2VydGFpbnR5PUxpa2VseS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0NNQVNfQUxFUlRfU0VWRVJFX0lNTUVESUFURV9MSUtFTFkgICA9IDB4MTExODsKKworICAgIC8qKiBDTUFTIE1lc3NhZ2UgSWRlbnRpZmllciBmb3IgU2V2ZXJlIGFsZXJ0cywgVXJnZW5jeT1FeHBlY3RlZCwgQ2VydGFpbnR5PU9ic2VydmVkLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfRVhQRUNURURfT0JTRVJWRUQgID0gMHgxMTE5OworCisgICAgLyoqIENNQVMgTWVzc2FnZSBJZGVudGlmaWVyIGZvciBTZXZlcmUgYWxlcnRzLCBVcmdlbmN5PUV4cGVjdGVkLCBDZXJ0YWludHk9TGlrZWx5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfQ01BU19BTEVSVF9TRVZFUkVfRVhQRUNURURfTElLRUxZICAgID0gMHgxMTFBOworCisgICAgLyoqIENNQVMgTWVzc2FnZSBJZGVudGlmaWVyIGZvciBDaGlsZCBBYmR1Y3Rpb24gRW1lcmdlbmN5IChBbWJlciBBbGVydCkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0NISUxEX0FCRFVDVElPTl9FTUVSR0VOQ1kgPSAweDExMUI7CisKKyAgICAvKiogQ01BUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIHRoZSBSZXF1aXJlZCBNb250aGx5IFRlc3QuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9DTUFTX0FMRVJUX1JFUVVJUkVEX01PTlRITFlfVEVTVCAgICAgPSAweDExMUM7CisKKyAgICAvKiogQ01BUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIENNQVMgRXhlcmNpc2UuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9JRF9DTUFTX0FMRVJUX0VYRVJDSVNFICAgICAgICAgICAgICAgICAgPSAweDExMUQ7CisKKyAgICAvKiogQ01BUyBNZXNzYWdlIElkZW50aWZpZXIgZm9yIG9wZXJhdG9yIGRlZmluZWQgdXNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfSURfQ01BU19BTEVSVF9PUEVSQVRPUl9ERUZJTkVEX1VTRSAgICAgID0gMHgxMTFFOworCisgICAgLyoqIEVuZCBvZiBDTUFTIE1lc3NhZ2UgSWRlbnRpZmllciByYW5nZSAoaW5jbHVkaW5nIGZ1dHVyZSBleHRlbnNpb25zKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX0NNQVNfTEFTVF9JREVOVElGSUVSICAgICAgICAgICAgICAgICA9IDB4MTEyRjsKKworICAgIC8qKiBFbmQgb2YgUFdTIE1lc3NhZ2UgSWRlbnRpZmllciByYW5nZSAoaW5jbHVkZXMgRVRXUywgQ01BUywgYW5kIGZ1dHVyZSBleHRlbnNpb25zKS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX0lEX1BXU19MQVNUX0lERU5USUZJRVIgICAgICAgICAgICAgICAgICA9IDB4MThGRjsKKworICAgIC8qKiBFVFdTIG1lc3NhZ2UgY29kZSBmbGFnIHRvIGFjdGl2YXRlIHRoZSBwb3B1cCBkaXNwbGF5LiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfQ09ERV9FVFdTX0FDVElWQVRFX1BPUFVQICAgICAgICAgICAgICAgID0gMHgxMDA7CisKKyAgICAvKiogRVRXUyBtZXNzYWdlIGNvZGUgZmxhZyB0byBhY3RpdmF0ZSB0aGUgZW1lcmdlbmN5IHVzZXIgYWxlcnQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9DT0RFX0VUV1NfRU1FUkdFTkNZX1VTRVJfQUxFUlQgICAgICAgICAgPSAweDIwMDsKKworICAgIC8qKiBFVFdTIHdhcm5pbmcgdHlwZSB2YWx1ZSBmb3IgZWFydGhxdWFrZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVFdTX1dBUk5JTkdfVFlQRV9FQVJUSFFVQUtFICAgICAgICAgICAgICAgICAgICA9IDB4MDA7CisKKyAgICAvKiogRVRXUyB3YXJuaW5nIHR5cGUgdmFsdWUgZm9yIHRzdW5hbWkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVRXU19XQVJOSU5HX1RZUEVfVFNVTkFNSSAgICAgICAgICAgICAgICAgICAgICAgPSAweDAxOworCisgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIHZhbHVlIGZvciBlYXJ0aHF1YWtlIGFuZCB0c3VuYW1pLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX0VBUlRIUVVBS0VfQU5EX1RTVU5BTUkgICAgICAgID0gMHgwMjsKKworICAgIC8qKiBFVFdTIHdhcm5pbmcgdHlwZSB2YWx1ZSBmb3IgdGVzdCBicm9hZGNhc3QuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVRXU19XQVJOSU5HX1RZUEVfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzOworCisgICAgLyoqIEVUV1Mgd2FybmluZyB0eXBlIHZhbHVlIGZvciBvdGhlciBub3RpZmljYXRpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVUV1NfV0FSTklOR19UWVBFX09USEVSICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDsKK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc0NiTWVzc2FnZS5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JNZXNzYWdlLmphdmEKaW5kZXggMzU0MzI3NS4uMzgzZTBmOSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JNZXNzYWdlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zQ2JNZXNzYWdlLmphdmEKQEAgLTE2LDcgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC50ZWxlcGhvbnk7CiAKK2ltcG9ydCBhbmRyb2lkLnRleHQuZm9ybWF0LlRpbWU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNDYkhlYWRlcjsKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKQEAgLTU4LDEwICs2MiwxMyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTbXNDYk1lc3NhZ2UocGR1KTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KExPR19UQUcsICJGYWlsZWQgcGFyc2luZyBTTVMtQ0IgcGR1IiwgZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIlNNU0NCIjsKKwogICAgIC8qKgogICAgICAqIExhbmd1YWdlcyBpbiB0aGUgMDAwMHh4eHggRENTIGdyb3VwIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzgsIHNlY3Rpb24gNS4KICAgICAgKi8KQEAgLTgwLDE1ICs4NywzNCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDQVJSSUFHRV9SRVRVUk4gPSAweDBkOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBEVV9CT0RZX1BBR0VfTEVOR1RIID0gODI7CisKICAgICBwcml2YXRlIFNtc0NiSGVhZGVyIG1IZWFkZXI7CiAKICAgICBwcml2YXRlIFN0cmluZyBtTGFuZ3VhZ2U7CiAKICAgICBwcml2YXRlIFN0cmluZyBtQm9keTsKIAorICAgIC8qKiBUaW1lc3RhbXAgb2YgRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiB3aXRoIHNlY3VyaXR5LiAqLworICAgIHByaXZhdGUgbG9uZyBtUHJpbWFyeU5vdGlmaWNhdGlvblRpbWVzdGFtcDsKKworICAgIC8qKiA0MyBieXRlIGRpZ2l0YWwgc2lnbmF0dXJlIG9mIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb24gd2l0aCBzZWN1cml0eS4gKi8KKyAgICBwcml2YXRlIGJ5dGVbXSBtUHJpbWFyeU5vdGlmaWNhdGlvbkRpZ2l0YWxTaWduYXR1cmU7CisKICAgICBwcml2YXRlIFNtc0NiTWVzc2FnZShieXRlW10gcGR1KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgbUhlYWRlciA9IG5ldyBTbXNDYkhlYWRlcihwZHUpOwotICAgICAgICBwYXJzZUJvZHkocGR1KTsKKyAgICAgICAgaWYgKG1IZWFkZXIuZm9ybWF0ID09IFNtc0NiSGVhZGVyLkZPUk1BVF9FVFdTX1BSSU1BUlkpIHsKKyAgICAgICAgICAgIG1Cb2R5ID0gIkVUV1MiOworICAgICAgICAgICAgLy8gRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiB3aXRoIHNlY3VyaXR5IGlzIDU2IG9jdGV0cyBpbiBsZW5ndGgKKyAgICAgICAgICAgIGlmIChwZHUubGVuZ3RoID49IFNtc0NiSGVhZGVyLlBEVV9MRU5HVEhfRVRXUykgeworICAgICAgICAgICAgICAgIG1QcmltYXJ5Tm90aWZpY2F0aW9uVGltZXN0YW1wID0gZ2V0VGltZXN0YW1wTWlsbGlzKHBkdSk7CisgICAgICAgICAgICAgICAgbVByaW1hcnlOb3RpZmljYXRpb25EaWdpdGFsU2lnbmF0dXJlID0gbmV3IGJ5dGVbNDNdOworICAgICAgICAgICAgICAgIC8vIGRpZ2l0YWwgc2lnbmF0dXJlIHN0YXJ0cyBhZnRlciA2IGJ5dGUgaGVhZGVyIGFuZCA3IGJ5dGUgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwZHUsIDEzLCBtUHJpbWFyeU5vdGlmaWNhdGlvbkRpZ2l0YWxTaWduYXR1cmUsIDAsIDQzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcnNlQm9keShwZHUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDksNiArMTc1LDYyIEBACiAgICAgICAgIHJldHVybiBtSGVhZGVyLnVwZGF0ZU51bWJlcjsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICogQHJldHVybiB7QGxpbmsgU21zQ2JIZWFkZXIjRk9STUFUX0dTTX0sIHtAbGluayBTbXNDYkhlYWRlciNGT1JNQVRfVU1UU30sIG9yCisgICAgICogICAgICAgICB7QGxpbmsgU21zQ2JIZWFkZXIjRk9STUFUX0VUV1NfUFJJTUFSWX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1lc3NhZ2VGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBtSGVhZGVyLmZvcm1hdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbnMsIHJldHVybiB0aGUgZW1lcmdlbmN5IHVzZXIgYWxlcnQgZmxhZy4KKyAgICAgKiBAcmV0dXJuIHRydWUgdG8gbm90aWZ5IHRlcm1pbmFsIHRvIGFjdGl2YXRlIGVtZXJnZW5jeSB1c2VyIGFsZXJ0OyBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRFdHdzRW1lcmdlbmN5VXNlckFsZXJ0KCkgeworICAgICAgICByZXR1cm4gbUhlYWRlci5ldHdzRW1lcmdlbmN5VXNlckFsZXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9ucywgcmV0dXJuIHRoZSBwb3B1cCBmbGFnLgorICAgICAqIEByZXR1cm4gdHJ1ZSB0byBub3RpZnkgdGVybWluYWwgdG8gYWN0aXZhdGUgZGlzcGxheSBwb3B1cDsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RXR3c1BvcHVwKCkgeworICAgICAgICByZXR1cm4gbUhlYWRlci5ldHdzUG9wdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb25zLCByZXR1cm4gdGhlIHdhcm5pbmcgdHlwZS4KKyAgICAgKiBAcmV0dXJuIGEgdmFsdWUgc3VjaCBhcyB7QGxpbmsgU21zQ2JDb25zdGFudHMjRVRXU19XQVJOSU5HX1RZUEVfRUFSVEhRVUFLRX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEV0d3NXYXJuaW5nVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IZWFkZXIuZXR3c1dhcm5pbmdUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBFVFdTIHByaW1hcnkgbm90aWZpY2F0aW9ucywgcmV0dXJuIHRoZSBXYXJuaW5nLVNlY3VyaXR5LUluZm9ybWF0aW9uIHRpbWVzdGFtcC4KKyAgICAgKiBAcmV0dXJuIGEgdGltZXN0YW1wIGluIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIGZvcm1hdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRFdHdzU2VjdXJpdHlUaW1lc3RhbXAoKSB7CisgICAgICAgIHJldHVybiBtUHJpbWFyeU5vdGlmaWNhdGlvblRpbWVzdGFtcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3IgRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbnMsIHJldHVybiB0aGUgNDMgYnl0ZSBkaWdpdGFsIHNpZ25hdHVyZS4KKyAgICAgKiBAcmV0dXJuIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIGEgY29weSBvZiB0aGUgZGlnaXRhbCBzaWduYXR1cmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEV0d3NTZWN1cml0eVNpZ25hdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QcmltYXJ5Tm90aWZpY2F0aW9uRGlnaXRhbFNpZ25hdHVyZS5jbG9uZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCB1bnBhY2sgdGhlIGJvZHkgdGV4dCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIGluIHRoZSBEQ1MuCisgICAgICogQWZ0ZXIgY29tcGxldGluZyBzdWNjZXNzZnVsbHkgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIGFzc2lnbmVkIHRoZSBib2R5CisgICAgICogdGV4dCBpbnRvIG1Cb2R5LCBhbmQgb3B0aW9uYWxseSB0aGUgbGFuZ3VhZ2UgY29kZSBpbnRvIG1MYW5ndWFnZQorICAgICAqCisgICAgICogQHBhcmFtIHBkdSBUaGUgcGR1CisgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQm9keShieXRlW10gcGR1KSB7CiAgICAgICAgIGludCBlbmNvZGluZzsKICAgICAgICAgYm9vbGVhbiBoYXNMYW5ndWFnZUluZGljYXRvciA9IGZhbHNlOwpAQCAtMjIxLDI4ICszMDMsODEgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtSGVhZGVyLmZvcm1hdCA9PSBTbXNDYkhlYWRlci5GT1JNQVRfVU1UUykgeworICAgICAgICAgICAgLy8gUGF5bG9hZCBtYXkgY29udGFpbiBtdWx0aXBsZSBwYWdlcworICAgICAgICAgICAgaW50IG5yUGFnZXMgPSBwZHVbU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEhdOworCisgICAgICAgICAgICBpZiAocGR1Lmxlbmd0aCA8IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIICsgMSArIChQRFVfQk9EWV9QQUdFX0xFTkdUSCArIDEpCisgICAgICAgICAgICAgICAgICAgICogbnJQYWdlcykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBkdSBsZW5ndGggIiArIHBkdS5sZW5ndGggKyAiIGRvZXMgbm90IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbnJQYWdlcyArICIgcGFnZXMiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnJQYWdlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gRWFjaCBwYWdlIGlzIDgyIGJ5dGVzIGZvbGxvd2VkIGJ5IGEgbGVuZ3RoIG9jdGV0IGluZGljYXRpbmcKKyAgICAgICAgICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHVzZWZ1bCBvY3RldHMgd2l0aGluIHRob3NlIDgyCisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIICsgMSArIChQRFVfQk9EWV9QQUdFX0xFTkdUSCArIDEpICogaTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcGR1W29mZnNldCArIFBEVV9CT0RZX1BBR0VfTEVOR1RIXTsKKworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiBQRFVfQk9EWV9QQUdFX0xFTkdUSCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWdlIGxlbmd0aCAiICsgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZSAiICsgUERVX0JPRFlfUEFHRV9MRU5HVEgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh1bnBhY2tCb2R5KHBkdSwgZW5jb2RpbmcsIG9mZnNldCwgbGVuZ3RoLCBoYXNMYW5ndWFnZUluZGljYXRvcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvZHkgPSBzYi50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUGF5bG9hZCBpcyBvbmUgc2luZ2xlIHBhZ2UKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSDsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBwZHUubGVuZ3RoIC0gb2Zmc2V0OworCisgICAgICAgICAgICBtQm9keSA9IHVucGFja0JvZHkocGR1LCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgsIGhhc0xhbmd1YWdlSW5kaWNhdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVucGFjayBib2R5IHRleHQgZnJvbSB0aGUgcGR1IHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZywgcG9zaXRpb24gYW5kCisgICAgICogbGVuZ3RoIHdpdGhpbiB0aGUgcGR1CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGR1IFRoZSBwZHUKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGVuY29kaW5nLCBhcyBkZXJpdmVkIGZyb20gdGhlIERDUworICAgICAqIEBwYXJhbSBvZmZzZXQgUG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgdG8gdW5wYWNrCisgICAgICogQHBhcmFtIGxlbmd0aCBOdW1iZXIgb2YgYnl0ZXMgdG8gdW5wYWNrCisgICAgICogQHBhcmFtIGhhc0xhbmd1YWdlSW5kaWNhdG9yIHRydWUgaWYgdGhlIGJvZHkgdGV4dCBpcyBwcmVjZWRlZCBieSBhCisgICAgICogICAgICAgICAgICBsYW5ndWFnZSBpbmRpY2F0b3IuIElmIHNvLCB0aGlzIG1ldGhvZCB3aWxsIGFzIGEgc2lkZS1lZmZlY3QKKyAgICAgKiAgICAgICAgICAgIGFzc2lnbiB0aGUgZXh0cmFjdGVkIGxhbmd1YWdlIGNvZGUgaW50byBtTGFuZ3VhZ2UKKyAgICAgKiBAcmV0dXJuIEJvZHkgdGV4dAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHVucGFja0JvZHkoYnl0ZVtdIHBkdSwgaW50IGVuY29kaW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgYm9vbGVhbiBoYXNMYW5ndWFnZUluZGljYXRvcikgeworICAgICAgICBTdHJpbmcgYm9keSA9IG51bGw7CisKICAgICAgICAgc3dpdGNoIChlbmNvZGluZykgewogICAgICAgICAgICAgY2FzZSBTbXNNZXNzYWdlLkVOQ09ESU5HXzdCSVQ6Ci0gICAgICAgICAgICAgICAgbUJvZHkgPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcocGR1LCBTbXNDYkhlYWRlci5QRFVfSEVBREVSX0xFTkdUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChwZHUubGVuZ3RoIC0gU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEgpICogOCAvIDcpOworICAgICAgICAgICAgICAgIGJvZHkgPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcocGR1LCBvZmZzZXQsIGxlbmd0aCAqIDggLyA3KTsKIAotICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBtQm9keSAhPSBudWxsICYmIG1Cb2R5Lmxlbmd0aCgpID4gMikgewotICAgICAgICAgICAgICAgICAgICBtTGFuZ3VhZ2UgPSBtQm9keS5zdWJzdHJpbmcoMCwgMik7Ci0gICAgICAgICAgICAgICAgICAgIG1Cb2R5ID0gbUJvZHkuc3Vic3RyaW5nKDMpOworICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBib2R5ICE9IG51bGwgJiYgYm9keS5sZW5ndGgoKSA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGFuZ3VhZ2UgaXMgdHdvIEdTTSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IGEgQ1IuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgYm9keSB0ZXh0IGlzIG9mZnNldCBieSAzIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgIG1MYW5ndWFnZSA9IGJvZHkuc3Vic3RyaW5nKDAsIDIpOworICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5zdWJzdHJpbmcoMyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIFNtc01lc3NhZ2UuRU5DT0RJTkdfMTZCSVQ6Ci0gICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IFNtc0NiSGVhZGVyLlBEVV9IRUFERVJfTEVOR1RIOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhc0xhbmd1YWdlSW5kaWNhdG9yICYmIHBkdS5sZW5ndGggPj0gU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEggKyAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYW5ndWFnZSA9IEdzbUFscGhhYmV0LmdzbTdCaXRQYWNrZWRUb1N0cmluZyhwZHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU21zQ2JIZWFkZXIuUERVX0hFQURFUl9MRU5HVEgsIDIpOworICAgICAgICAgICAgICAgIGlmIChoYXNMYW5ndWFnZUluZGljYXRvciAmJiBwZHUubGVuZ3RoID49IG9mZnNldCArIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTGFuZ3VhZ2UgaXMgdHdvIEdTTSBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYWN0dWFsIGJvZHkgdGV4dCBpcyBvZmZzZXQgYnkgMiBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgbUxhbmd1YWdlID0gR3NtQWxwaGFiZXQuZ3NtN0JpdFBhY2tlZFRvU3RyaW5nKHBkdSwgb2Zmc2V0LCAyKTsKICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Cb2R5ID0gbmV3IFN0cmluZyhwZHUsIG9mZnNldCwgKHBkdS5sZW5ndGggJiAweGZmZmUpIC0gb2Zmc2V0LCAidXRmLTE2Iik7CisgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBuZXcgU3RyaW5nKHBkdSwgb2Zmc2V0LCAobGVuZ3RoICYgMHhmZmZlKSwgInV0Zi0xNiIpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBFZWVlawogICAgICAgICAgICAgICAgIH0KQEAgLTI1MiwxNiArMzg3LDczIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUJvZHkgIT0gbnVsbCkgeworICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBSZW1vdmUgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbUJvZHkubGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIGlmIChtQm9keS5jaGFyQXQoaSkgIT0gQ0FSUklBR0VfUkVUVVJOKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Cb2R5ID0gbUJvZHkuc3Vic3RyaW5nKDAsIGkgKyAxKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBib2R5Lmxlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYm9keS5jaGFyQXQoaSkgIT0gQ0FSUklBR0VfUkVUVVJOKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBib2R5LnN1YnN0cmluZygwLCBpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Cb2R5ID0gIiI7CisgICAgICAgICAgICBib2R5ID0gIiI7CiAgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYm9keTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYW4gRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAgYW5kIHJldHVybnMgYSBjdXJyZW50VGltZU1pbGxpcygpLXN0eWxlCisgICAgICogdGltZXN0YW1wLiBDb3BpZWQgZnJvbSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuZ3NtLlNtc01lc3NhZ2UuCisgICAgICogQHBhcmFtIHBkdSB0aGUgRVRXUyBwcmltYXJ5IG5vdGlmaWNhdGlvbiBQRFUgdG8gZGVjb2RlCisgICAgICogQHJldHVybiB0aGUgVVRDIHRpbWVzdGFtcCBmcm9tIHRoZSBXYXJuaW5nLVNlY3VyaXR5LUluZm9ybWF0aW9uIHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyBnZXRUaW1lc3RhbXBNaWxsaXMoYnl0ZVtdIHBkdSkgeworICAgICAgICAvLyBUaW1lc3RhbXAgc3RhcnRzIGFmdGVyIENCIGhlYWRlciwgaW4gcGR1WzZdCisgICAgICAgIGludCB5ZWFyID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KHBkdVs2XSk7CisgICAgICAgIGludCBtb250aCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludChwZHVbN10pOworICAgICAgICBpbnQgZGF5ID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KHBkdVs4XSk7CisgICAgICAgIGludCBob3VyID0gSWNjVXRpbHMuZ3NtQmNkQnl0ZVRvSW50KHBkdVs5XSk7CisgICAgICAgIGludCBtaW51dGUgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1WzEwXSk7CisgICAgICAgIGludCBzZWNvbmQgPSBJY2NVdGlscy5nc21CY2RCeXRlVG9JbnQocGR1WzExXSk7CisKKyAgICAgICAgLy8gRm9yIHRoZSB0aW1lem9uZSwgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZQorICAgICAgICAvLyBsZWFzdCBzaWduaWZpY2FudCBuaWJibGUgaXMgdGhlIHNpZ24gYnl0ZQorICAgICAgICAvLyAobWVhbmluZyB0aGUgbWF4IHJhbmdlIG9mIHRoaXMgZmllbGQgaXMgNzkgcXVhcnRlci1ob3VycywKKyAgICAgICAgLy8gd2hpY2ggaXMgbW9yZSB0aGFuIGVub3VnaCkKKworICAgICAgICBieXRlIHR6Qnl0ZSA9IHBkdVsxMl07CisKKyAgICAgICAgLy8gTWFzayBvdXQgc2lnbiBiaXQuCisgICAgICAgIGludCB0aW1lem9uZU9mZnNldCA9IEljY1V0aWxzLmdzbUJjZEJ5dGVUb0ludCgoYnl0ZSkgKHR6Qnl0ZSAmICh+MHgwOCkpKTsKKworICAgICAgICB0aW1lem9uZU9mZnNldCA9ICgodHpCeXRlICYgMHgwOCkgPT0gMCkgPyB0aW1lem9uZU9mZnNldCA6IC10aW1lem9uZU9mZnNldDsKKworICAgICAgICBUaW1lIHRpbWUgPSBuZXcgVGltZShUaW1lLlRJTUVaT05FX1VUQyk7CisKKyAgICAgICAgLy8gSXQncyAyMDA2LiAgU2hvdWxkIEkgcmVhbGx5IHN1cHBvcnQgeWVhcnMgPCAyMDAwPworICAgICAgICB0aW1lLnllYXIgPSB5ZWFyID49IDkwID8geWVhciArIDE5MDAgOiB5ZWFyICsgMjAwMDsKKyAgICAgICAgdGltZS5tb250aCA9IG1vbnRoIC0gMTsKKyAgICAgICAgdGltZS5tb250aERheSA9IGRheTsKKyAgICAgICAgdGltZS5ob3VyID0gaG91cjsKKyAgICAgICAgdGltZS5taW51dGUgPSBtaW51dGU7CisgICAgICAgIHRpbWUuc2Vjb25kID0gc2Vjb25kOworCisgICAgICAgIC8vIFRpbWV6b25lIG9mZnNldCBpcyBpbiBxdWFydGVyIGhvdXJzLgorICAgICAgICByZXR1cm4gdGltZS50b01pbGxpcyh0cnVlKSAtICh0aW1lem9uZU9mZnNldCAqIDE1ICogNjAgKiAxMDAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgdGV4dCB0byB0aGUgbWVzc2FnZSBib2R5LiBUaGlzIGlzIHVzZWQgdG8gY29uY2F0ZW5hdGUgbXVsdGktcGFnZSBHU00gYnJvYWRjYXN0cy4KKyAgICAgKiBAcGFyYW0gYm9keSB0aGUgdGV4dCB0byBhcHBlbmQgdG8gdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXBwZW5kVG9Cb2R5KFN0cmluZyBib2R5KSB7CisgICAgICAgIG1Cb2R5ID0gbUJvZHkgKyBib2R5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU21zQ2JNZXNzYWdleyIgKyBtSGVhZGVyLnRvU3RyaW5nKCkgKyAiLCBsYW5ndWFnZT0iICsgbUxhbmd1YWdlICsKKyAgICAgICAgICAgICAgICAiLCBib2R5PVwiIiArIG1Cb2R5ICsgIlwifSI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvU21zTWFuYWdlci5qYXZhCmluZGV4IDZhMzQ2YWYuLjViZGMxNDYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1Ntc01hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9TbXNNYW5hZ2VyLmphdmEKQEAgLTM0NSw3ICszNDUsNyBAQAogICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllci4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUgdGhlIHNhbWUKICAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIsIHRoZXkgbXVzdCBib3RoIGRpc2FibGUgaXQgZm9yIHRoZSBkZXZpY2UgdG8gc3RvcAogICAgICAqIHJlY2VpdmluZyB0aG9zZSBtZXNzYWdlcy4gQWxsIHJlY2VpdmVkIG1lc3NhZ2VzIHdpbGwgYmUgYnJvYWRjYXN0IGluIGFuCi0gICAgICogaW50ZW50IHdpdGggdGhlIGFjdGlvbiAiYW5kcm9pZC5wcm92aWRlci50ZWxlcGhvbnkuU01TX0NCX1JFQ0VJVkVEIi4KKyAgICAgKiBpbnRlbnQgd2l0aCB0aGUgYWN0aW9uICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TTVNfQ0JfUkVDRUlWRUQiLgogICAgICAqIE5vdGU6IFRoaXMgY2FsbCBpcyBibG9ja2luZywgY2FsbGVycyBtYXkgd2FudCB0byBhdm9pZCBjYWxsaW5nIGl0IGZyb20KICAgICAgKiB0aGUgbWFpbiB0aHJlYWQgb2YgYW4gYXBwbGljYXRpb24uCiAgICAgICoKQEAgLTQwMSw2ICs0MDEsNjggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFbmFibGUgcmVjZXB0aW9uIG9mIGNlbGwgYnJvYWRjYXN0IChTTVMtQ0IpIG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuCisgICAgICogbWVzc2FnZSBpZGVudGlmaWVyIHJhbmdlLiBOb3RlIHRoYXQgaWYgdHdvIGRpZmZlcmVudCBjbGllbnRzIGVuYWJsZSB0aGUgc2FtZQorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllciwgdGhleSBtdXN0IGJvdGggZGlzYWJsZSBpdCBmb3IgdGhlIGRldmljZSB0byBzdG9wCisgICAgICogcmVjZWl2aW5nIHRob3NlIG1lc3NhZ2VzLiBBbGwgcmVjZWl2ZWQgbWVzc2FnZXMgd2lsbCBiZSBicm9hZGNhc3QgaW4gYW4KKyAgICAgKiBpbnRlbnQgd2l0aCB0aGUgYWN0aW9uICJhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TTVNfQ0JfUkVDRUlWRUQiLgorICAgICAqIE5vdGU6IFRoaXMgY2FsbCBpcyBibG9ja2luZywgY2FsbGVycyBtYXkgd2FudCB0byBhdm9pZCBjYWxsaW5nIGl0IGZyb20KKyAgICAgKiB0aGUgbWFpbiB0aHJlYWQgb2YgYW4gYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRNZXNzYWdlSWQgZmlyc3QgbWVzc2FnZSBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiBUUyAyMy4wNDEKKyAgICAgKiBAcGFyYW0gZW5kTWVzc2FnZUlkIGxhc3QgbWVzc2FnZSBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiBUUyAyMy4wNDEKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICogQHNlZSAjZGlzYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShpbnQsIGludCkKKyAgICAgKgorICAgICAqIHtAaGlkZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVDZWxsQnJvYWRjYXN0UmFuZ2UoaW50IHN0YXJ0TWVzc2FnZUlkLCBpbnQgZW5kTWVzc2FnZUlkKSB7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJU21zIGljY0lTbXMgPSBJU21zLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiaXNtcyIpKTsKKyAgICAgICAgICAgIGlmIChpY2NJU21zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gaWNjSVNtcy5lbmFibGVDZWxsQnJvYWRjYXN0UmFuZ2Uoc3RhcnRNZXNzYWdlSWQsIGVuZE1lc3NhZ2VJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gaWdub3JlIGl0CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHJlY2VwdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCAoU01TLUNCKSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbgorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllciByYW5nZS4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUgdGhlIHNhbWUKKyAgICAgKiBtZXNzYWdlIGlkZW50aWZpZXIsIHRoZXkgbXVzdCBib3RoIGRpc2FibGUgaXQgZm9yIHRoZSBkZXZpY2UgdG8gc3RvcAorICAgICAqIHJlY2VpdmluZyB0aG9zZSBtZXNzYWdlcy4KKyAgICAgKiBOb3RlOiBUaGlzIGNhbGwgaXMgYmxvY2tpbmcsIGNhbGxlcnMgbWF5IHdhbnQgdG8gYXZvaWQgY2FsbGluZyBpdCBmcm9tCisgICAgICogdGhlIG1haW4gdGhyZWFkIG9mIGFuIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0TWVzc2FnZUlkIGZpcnN0IG1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHBhcmFtIGVuZE1lc3NhZ2VJZCBsYXN0IG1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSAjZW5hYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCwgaW50KQorICAgICAqCisgICAgICoge0BoaWRlfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0UmFuZ2UoaW50IHN0YXJ0TWVzc2FnZUlkLCBpbnQgZW5kTWVzc2FnZUlkKSB7CisgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJU21zIGljY0lTbXMgPSBJU21zLlN0dWIuYXNJbnRlcmZhY2UoU2VydmljZU1hbmFnZXIuZ2V0U2VydmljZSgiaXNtcyIpKTsKKyAgICAgICAgICAgIGlmIChpY2NJU21zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gaWNjSVNtcy5kaXNhYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKHN0YXJ0TWVzc2FnZUlkLCBlbmRNZXNzYWdlSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBpdAorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbGlzdCBvZiA8Y29kZT5TbXNNZXNzYWdlPC9jb2RlPnMgZnJvbSBhIGxpc3Qgb2YgUmF3U21zRGF0YQogICAgICAqIHJlY29yZHMgcmV0dXJuZWQgYnkgPGNvZGU+Z2V0QWxsTWVzc2FnZXNGcm9tSWNjKCk8L2NvZGU+CiAgICAgICoKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2FuZHJvaWQvdGVsZXBob255L1RlbGVwaG9ueU1hbmFnZXIuamF2YQppbmRleCA4NzMyZTIxLi4xODRkNjY1IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9hbmRyb2lkL3RlbGVwaG9ueS9UZWxlcGhvbnlNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCkBAIC0xOTEsNiArMTkxLDEwIEBACiAgICAgICogICB7QGxpbmsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uI1JFQURfUEhPTkVfU1RBVEUgUkVBRF9QSE9ORV9TVEFURX0KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldERldmljZUlkKCkgeworICAgICAgICBpZiAoIWlzVm9pY2VDYXBhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBnZXRTdWJzY3JpYmVySW5mbygpLmdldERldmljZUlkKCk7CiAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewpAQCAtNDI2LDggKzQzMCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19UWVBFX0xURSA9IDEzOwogICAgIC8qKiBDdXJyZW50IG5ldHdvcmsgaXMgZUhSUEQgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX1RZUEVfRUhSUEQgPSAxNDsKLSAgICAvKiogQ3VycmVudCBuZXR3b3JrIGlzIEhTUEErCi0gICAgICogQGhpZGUgKi8KKyAgICAvKiogQ3VycmVudCBuZXR3b3JrIGlzIEhTUEErICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19UWVBFX0hTUEFQID0gMTU7CiAKICAgICAvKioKQEAgLTQ1MCw2ICs0NTMsNyBAQAogICAgICAqIEBzZWUgI05FVFdPUktfVFlQRV9JREVOCiAgICAgICogQHNlZSAjTkVUV09SS19UWVBFX0xURQogICAgICAqIEBzZWUgI05FVFdPUktfVFlQRV9FSFJQRAorICAgICAqIEBzZWUgI05FVFdPUktfVFlQRV9IU1BBUAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TmV0d29ya1R5cGUoKSB7CiAgICAgICAgIHRyeXsKQEAgLTQ2OSw2ICs0NzMsNDYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKiBVbmtub3duIG5ldHdvcmsgY2xhc3MuIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0NMQVNTX1VOS05PV04gPSAwOworICAgIC8qKiBDbGFzcyBvZiBicm9hZGx5IGRlZmluZWQgIjJHIiBuZXR3b3Jrcy4ge0BoaWRlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ0xBU1NfMl9HID0gMTsKKyAgICAvKiogQ2xhc3Mgb2YgYnJvYWRseSBkZWZpbmVkICIzRyIgbmV0d29ya3MuIHtAaGlkZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0NMQVNTXzNfRyA9IDI7CisgICAgLyoqIENsYXNzIG9mIGJyb2FkbHkgZGVmaW5lZCAiNEciIG5ldHdvcmtzLiB7QGhpZGV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVUV09SS19DTEFTU180X0cgPSAzOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGdlbmVyYWwgY2xhc3Mgb2YgbmV0d29yayB0eXBlLCBzdWNoIGFzICIzRyIgb3IgIjRHIi4gSW4gY2FzZXMKKyAgICAgKiB3aGVyZSBjbGFzc2lmaWNhdGlvbiBpcyBjb250ZW50aW91cywgdGhpcyBtZXRob2QgaXMgY29uc2VydmF0aXZlLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXROZXR3b3JrQ2xhc3MoaW50IG5ldHdvcmtUeXBlKSB7CisgICAgICAgIHN3aXRjaCAobmV0d29ya1R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFX0dQUlM6CisgICAgICAgICAgICBjYXNlIE5FVFdPUktfVFlQRV9FREdFOgorICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfQ0RNQToKKyAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFXzF4UlRUOgorICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfSURFTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTkVUV09SS19DTEFTU18yX0c7CisgICAgICAgICAgICBjYXNlIE5FVFdPUktfVFlQRV9VTVRTOgorICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfRVZET18wOgorICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfRVZET19BOgorICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfSFNEUEE6CisgICAgICAgICAgICBjYXNlIE5FVFdPUktfVFlQRV9IU1VQQToKKyAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFX0hTUEE6CisgICAgICAgICAgICBjYXNlIE5FVFdPUktfVFlQRV9FVkRPX0I6CisgICAgICAgICAgICBjYXNlIE5FVFdPUktfVFlQRV9FSFJQRDoKKyAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFX0hTUEFQOgorICAgICAgICAgICAgICAgIHJldHVybiBORVRXT1JLX0NMQVNTXzNfRzsKKyAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFX0xURToKKyAgICAgICAgICAgICAgICByZXR1cm4gTkVUV09SS19DTEFTU180X0c7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBORVRXT1JLX0NMQVNTX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYWRpbyB0ZWNobm9sb2d5IChuZXR3b3JrIHR5cGUpCiAgICAgICogY3VycmVudGx5IGluIHVzZSBvbiB0aGUgZGV2aWNlLgpAQCAtNDc3LDcgKzUyMSwxMiBAQAogICAgICAqIEBoaWRlIHBlbmRpbmcgQVBJIGNvdW5jaWwgcmV2aWV3CiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROZXR3b3JrVHlwZU5hbWUoKSB7Ci0gICAgICAgIHN3aXRjaCAoZ2V0TmV0d29ya1R5cGUoKSkgeworICAgICAgICByZXR1cm4gZ2V0TmV0d29ya1R5cGVOYW1lKGdldE5ldHdvcmtUeXBlKCkpOworICAgIH0KKworICAgIC8qKiB7QGhpZGV9ICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmV0d29ya1R5cGVOYW1lKGludCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfR1BSUzoKICAgICAgICAgICAgICAgICByZXR1cm4gIkdQUlMiOwogICAgICAgICAgICAgY2FzZSBORVRXT1JLX1RZUEVfRURHRToKQEAgLTUwNiw2ICs1NTUsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAiQ0RNQSAtIGVIUlBEIjsKICAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFX0lERU46CiAgICAgICAgICAgICAgICAgcmV0dXJuICJpREVOIjsKKyAgICAgICAgICAgIGNhc2UgTkVUV09SS19UWVBFX0hTUEFQOgorICAgICAgICAgICAgICAgIHJldHVybiAiSFNQQSsiOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQmFzZUNvbW1hbmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQmFzZUNvbW1hbmRzLmphdmEKaW5kZXggMGM0NTgxYi4uODQyN2QxNCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0Jhc2VDb21tYW5kcy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9CYXNlQ29tbWFuZHMuamF2YQpAQCAtOTYsOCArOTYsMTAgQEAKICAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtUmVzdHJpY3RlZFN0YXRlUmVnaXN0cmFudDsKICAgICBwcm90ZWN0ZWQgUmVnaXN0cmFudCBtR3NtQnJvYWRjYXN0U21zUmVnaXN0cmFudDsKIAotICAgIC8vIE5ldHdvcmsgTW9kZSByZWNlaXZlZCBmcm9tIFBob25lRmFjdG9yeQotICAgIHByb3RlY3RlZCBpbnQgbU5ldHdvcmtNb2RlOworICAgIC8vIFByZWZlcnJlZCBuZXR3b3JrIHR5cGUgcmVjZWl2ZWQgZnJvbSBQaG9uZUZhY3RvcnkuCisgICAgLy8gVGhpcyBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiB0byB0aGUKKyAgICAvLyB2ZW5kb3IgcmlsIHNvIGl0IHN0YXJ0cyB1cCBpbiB0aGUgY29ycmVjdCBtb2RlLgorICAgIHByb3RlY3RlZCBpbnQgbVByZWZlcnJlZE5ldHdvcmtUeXBlOwogICAgIC8vIENETUEgc3Vic2NyaXB0aW9uIHJlY2VpdmVkIGZyb20gUGhvbmVGYWN0b3J5CiAgICAgcHJvdGVjdGVkIGludCBtQ2RtYVN1YnNjcmlwdGlvbjsKICAgICAvLyBUeXBlIG9mIFBob25lLCBHU00gb3IgQ0RNQS4gU2V0IGJ5IENETUFQaG9uZSBvciBHU01QaG9uZS4KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKaW5kZXggN2FiYWUwOS4uMTcxYjM3MSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0NhbGxNYW5hZ2VyLmphdmEKQEAgLTE4MDMsMzMgKzE4MDMsMzMgQEAKICAgICAgICAgQ2FsbCBjYWxsOwogICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCi0gICAgICAgIGIuYXBwZW5kKCIjIyMjIyMjIyMjIyBEdW1wIENhbGxNYW5hZ2VyICMjIyMjIyMjIyMjIyIpOwotICAgICAgICBiLmFwcGVuZCgiXG5DYWxsTWFuYWdlciBzdGF0ZSA9ICIgKyBnZXRTdGF0ZSgpKTsKKyAgICAgICAgYi5hcHBlbmQoIkNhbGxNYW5hZ2VyIHsiKTsKKyAgICAgICAgYi5hcHBlbmQoIlxuc3RhdGUgPSAiICsgZ2V0U3RhdGUoKSk7CiAgICAgICAgIGNhbGwgPSBnZXRBY3RpdmVGZ0NhbGwoKTsKLSAgICAgICAgYi5hcHBlbmQoIlxuICAgLSBGb3JlZ3JvdW5kOiAiICsgZ2V0QWN0aXZlRmdDYWxsU3RhdGUoKSk7CisgICAgICAgIGIuYXBwZW5kKCJcbi0gRm9yZWdyb3VuZDogIiArIGdldEFjdGl2ZUZnQ2FsbFN0YXRlKCkpOwogICAgICAgICBiLmFwcGVuZCgiIGZyb20gIiArIGNhbGwuZ2V0UGhvbmUoKSk7Ci0gICAgICAgIGIuYXBwZW5kKCJcbiAgICAgQ29ubjogIikuYXBwZW5kKGdldEZnQ2FsbENvbm5lY3Rpb25zKCkpOworICAgICAgICBiLmFwcGVuZCgiXG4gIENvbm46ICIpLmFwcGVuZChnZXRGZ0NhbGxDb25uZWN0aW9ucygpKTsKICAgICAgICAgY2FsbCA9IGdldEZpcnN0QWN0aXZlQmdDYWxsKCk7Ci0gICAgICAgIGIuYXBwZW5kKCJcbiAgIC0gQmFja2dyb3VuZDogIiArIGNhbGwuZ2V0U3RhdGUoKSk7CisgICAgICAgIGIuYXBwZW5kKCJcbi0gQmFja2dyb3VuZDogIiArIGNhbGwuZ2V0U3RhdGUoKSk7CiAgICAgICAgIGIuYXBwZW5kKCIgZnJvbSAiICsgY2FsbC5nZXRQaG9uZSgpKTsKLSAgICAgICAgYi5hcHBlbmQoIlxuICAgICBDb25uOiAiKS5hcHBlbmQoZ2V0QmdDYWxsQ29ubmVjdGlvbnMoKSk7CisgICAgICAgIGIuYXBwZW5kKCJcbiAgQ29ubjogIikuYXBwZW5kKGdldEJnQ2FsbENvbm5lY3Rpb25zKCkpOwogICAgICAgICBjYWxsID0gZ2V0Rmlyc3RBY3RpdmVSaW5naW5nQ2FsbCgpOwotICAgICAgICBiLmFwcGVuZCgiXG4gICAtIFJpbmdpbmc6ICIgK2NhbGwuZ2V0U3RhdGUoKSk7CisgICAgICAgIGIuYXBwZW5kKCJcbi0gUmluZ2luZzogIiArY2FsbC5nZXRTdGF0ZSgpKTsKICAgICAgICAgYi5hcHBlbmQoIiBmcm9tICIgKyBjYWxsLmdldFBob25lKCkpOwogCiAgICAgICAgIGZvciAoUGhvbmUgcGhvbmUgOiBnZXRBbGxQaG9uZXMoKSkgewogICAgICAgICAgICAgaWYgKHBob25lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBiLmFwcGVuZCgiXG4gUGhvbmU6ICIgKyBwaG9uZSArICIsIG5hbWUgPSAiICsgcGhvbmUuZ2V0UGhvbmVOYW1lKCkKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiXG5QaG9uZTogIiArIHBob25lICsgIiwgbmFtZSA9ICIgKyBwaG9uZS5nZXRQaG9uZU5hbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzdGF0ZSA9ICIgKyBwaG9uZS5nZXRTdGF0ZSgpKTsKICAgICAgICAgICAgICAgICBjYWxsID0gcGhvbmUuZ2V0Rm9yZWdyb3VuZENhbGwoKTsKLSAgICAgICAgICAgICAgICBiLmFwcGVuZCgiXG4gICAtIEZvcmVncm91bmQ6ICIpLmFwcGVuZChjYWxsKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiXG4tIEZvcmVncm91bmQ6ICIpLmFwcGVuZChjYWxsKTsKICAgICAgICAgICAgICAgICBjYWxsID0gcGhvbmUuZ2V0QmFja2dyb3VuZENhbGwoKTsKICAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIEJhY2tncm91bmQ6ICIpLmFwcGVuZChjYWxsKTsKICAgICAgICAgICAgICAgICBjYWxsID0gcGhvbmUuZ2V0UmluZ2luZ0NhbGwoKTsKICAgICAgICAgICAgICAgICBiLmFwcGVuZCgiIFJpbmdpbmc6ICIpLmFwcGVuZChjYWxsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBiLmFwcGVuZCgiXG4jIyMjIyMjIyMjIEVuZCBEdW1wIENhbGxNYW5hZ2VyICMjIyMjIyMjIyMiKTsKKyAgICAgICAgYi5hcHBlbmQoIlxufSIpOwogICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mby5qYXZhCmluZGV4IDAxNDkwMWQuLjQ1N2ZhN2FhIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mby5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubG9jYXRpb24uQ291bnRyeURldGVjdG9yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkNvbnRhY3RzQ29udHJhY3QuQ29tbW9uRGF0YUtpbmRzLlBob25lOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5EYXRhOwpAQCAtMjksNiArMzAsMTMgQEAKIGltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmkxOG4ucGhvbmVudW1iZXJzLk51bWJlclBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuUGhvbmVOdW1iZXJPZmZsaW5lR2VvY29kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZU51bWJlclV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5pMThuLnBob25lbnVtYmVycy5QaG9uZW51bWJlci5QaG9uZU51bWJlcjsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKIAogLyoqCiAgKiBMb29rcyB1cCBjYWxsZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBwaG9uZSBudW1iZXIuCkBAIC03Miw3ICs4MCw4IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBuYW1lOwogICAgIHB1YmxpYyBTdHJpbmcgcGhvbmVOdW1iZXI7Ci0gICAgcHVibGljIFN0cmluZyBub21hbGl6ZWROdW1iZXI7CisgICAgcHVibGljIFN0cmluZyBub3JtYWxpemVkTnVtYmVyOworICAgIHB1YmxpYyBTdHJpbmcgZ2VvRGVzY3JpcHRpb247CiAKICAgICBwdWJsaWMgU3RyaW5nIGNuYXBOYW1lOwogICAgIHB1YmxpYyBpbnQgbnVtYmVyUHJlc2VudGF0aW9uOwpAQCAtMTMxLDcgKzE0MCw3IEBACiAgICAgICAgIGluZm8uaXNDYWNoZWRQaG90b0N1cnJlbnQgPSBmYWxzZTsKICAgICAgICAgaW5mby5jb250YWN0RXhpc3RzID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKFZEQkcpIExvZy52KFRBRywgImNvbnN0cnVjdCBjYWxsZXJJbmZvIGZyb20gY3Vyc29yIik7CisgICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICJnZXRDYWxsZXJJbmZvKCkgYmFzZWQgb24gY3Vyc29yLi4uIik7CiAKICAgICAgICAgaWYgKGN1cnNvciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpIHsKQEAgLTE1Niw3ICsxNjUsNyBAQAogICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBub3JtYWxpemVkIG51bWJlcgogICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KFBob25lTG9va3VwLk5PUk1BTElaRURfTlVNQkVSKTsKICAgICAgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5ub21hbGl6ZWROdW1iZXIgPSBjdXJzb3IuZ2V0U3RyaW5nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5ub3JtYWxpemVkTnVtYmVyID0gY3Vyc29yLmdldFN0cmluZyhjb2x1bW5JbmRleCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgdGhlIGxhYmVsL3R5cGUgY29tYm8KQEAgLTIzNiw2ICsyNDUsOCBAQAogICAgICAqIHdpdGggYWxsIHJlbGV2YW50IGZpZWxkcyBlbXB0eSBvciBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ2FsbGVySW5mbyBnZXRDYWxsZXJJbmZvKENvbnRleHQgY29udGV4dCwgU3RyaW5nIG51bWJlcikgeworICAgICAgICBpZiAoVkRCRykgTG9nLnYoVEFHLCAiZ2V0Q2FsbGVySW5mbygpIGJhc2VkIG9uIG51bWJlci4uLiIpOworCiAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShudW1iZXIpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQpAQCAtNDczLDYgKzQ4NCw2NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhpcyBDYWxsZXJJbmZvJ3MgZ2VvRGVzY3JpcHRpb24gZmllbGQsIGJhc2VkIG9uIHRoZSByYXcKKyAgICAgKiBwaG9uZSBudW1iZXIgaW4gdGhlIHBob25lTnVtYmVyIGZpZWxkLgorICAgICAqCisgICAgICogKE5vdGUgdGhhdCB0aGUgdmFyaW91cyBnZXRDYWxsZXJJbmZvKCkgbWV0aG9kcyBkbyAqbm90KiBzZXQgdGhlCisgICAgICogZ2VvRGVzY3JpcHRpb24gYXV0b21hdGljYWxseTsgeW91IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZAorICAgICAqIGV4cGxpY2l0bHkgdG8gZ2V0IGl0LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IHVzZWQgdG8gbG9vayB1cCB0aGUgY3VycmVudCBsb2NhbGUgLyBjb3VudHJ5CisgICAgICogQHBhcmFtIGZhbGxiYWNrTnVtYmVyIGlmIHRoaXMgQ2FsbGVySW5mbydzIHBob25lTnVtYmVyIGZpZWxkIGlzIGVtcHR5LAorICAgICAqICAgICAgICB0aGlzIHNwZWNpZmllcyBhIGZhbGxiYWNrIG51bWJlciB0byB1c2UgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVHZW9EZXNjcmlwdGlvbihDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmYWxsYmFja051bWJlcikgeworICAgICAgICBTdHJpbmcgbnVtYmVyID0gVGV4dFV0aWxzLmlzRW1wdHkocGhvbmVOdW1iZXIpID8gZmFsbGJhY2tOdW1iZXIgOiBwaG9uZU51bWJlcjsKKyAgICAgICAgZ2VvRGVzY3JpcHRpb24gPSBnZXRHZW9EZXNjcmlwdGlvbihjb250ZXh0LCBudW1iZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBnZW9ncmFwaGljYWwgZGVzY3JpcHRpb24gc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIG51bWJlci4KKyAgICAgKiBAc2VlIGNvbS5nb29nbGUuaTE4bi5waG9uZW51bWJlcnMuUGhvbmVOdW1iZXJPZmZsaW5lR2VvY29kZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0R2VvRGVzY3JpcHRpb24oQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbnVtYmVyKSB7CisgICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICJnZXRHZW9EZXNjcmlwdGlvbignIiArIG51bWJlciArICInKS4uLiIpOworCisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShudW1iZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFBob25lTnVtYmVyVXRpbCB1dGlsID0gUGhvbmVOdW1iZXJVdGlsLmdldEluc3RhbmNlKCk7CisgICAgICAgIFBob25lTnVtYmVyT2ZmbGluZUdlb2NvZGVyIGdlb2NvZGVyID0gUGhvbmVOdW1iZXJPZmZsaW5lR2VvY29kZXIuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICBTdHJpbmcgY291bnRyeUlzbzsKKyAgICAgICAgTG9jYWxlIGxvY2FsZSA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLmxvY2FsZTsKKyAgICAgICAgQ291bnRyeURldGVjdG9yIGRldGVjdG9yID0gKENvdW50cnlEZXRlY3RvcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAorICAgICAgICAgICAgICAgIENvbnRleHQuQ09VTlRSWV9ERVRFQ1RPUik7CisgICAgICAgIGlmIChkZXRlY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICBjb3VudHJ5SXNvID0gZGV0ZWN0b3IuZGV0ZWN0Q291bnRyeSgpLmdldENvdW50cnlJc28oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvdW50cnlJc28gPSBsb2NhbGUuZ2V0Q291bnRyeSgpOworICAgICAgICAgICAgTG9nLncoVEFHLCAiTm8gQ291bnRyeURldGVjdG9yOyBmYWxsaW5nIGJhY2sgdG8gY291bnRyeUlzbyBiYXNlZCBvbiBsb2NhbGU6ICIKKyAgICAgICAgICAgICAgICAgICsgY291bnRyeUlzbyk7CisgICAgICAgIH0KKworICAgICAgICBQaG9uZU51bWJlciBwbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwbiA9IHV0aWwucGFyc2UobnVtYmVyLCBjb3VudHJ5SXNvKTsKKyAgICAgICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICItIHBhcnNlZCBudW1iZXI6ICIgKyBwbik7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlclBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgImdldEdlb0Rlc2NyaXB0aW9uOiBOdW1iZXJQYXJzZUV4Y2VwdGlvbiBmb3IgaW5jb21pbmcgbnVtYmVyICciICsgbnVtYmVyICsgIiciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBnZW9jb2Rlci5nZXREZXNjcmlwdGlvbkZvck51bWJlcihwbiwgbG9jYWxlKTsKKyAgICAgICAgICAgIGlmIChWREJHKSBMb2cudihUQUcsICItIGdvdCBkZXNjcmlwdGlvbjogJyIgKyBkZXNjcmlwdGlvbiArICInIik7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVidWcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnN0YW5jZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtNDgyLDggKzU1MywxMSBAQAogCiAgICAgICAgIGlmIChWRVJCT1NFX0RFQlVHKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoMzg0KQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkgKyAiIHsgIikKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXG5uYW1lOiAiICsgbmFtZSkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXG5waG9uZU51bWJlcjogIiArIHBob25lTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbm5vcm1hbGl6ZWROdW1iZXI6ICIgKyBub3JtYWxpemVkTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbmdlb0Rlc2NyaXB0aW9uOiAiICsgZ2VvRGVzY3JpcHRpb24pCiAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuY25hcE5hbWU6ICIgKyBjbmFwTmFtZSkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXG5udW1iZXJQcmVzZW50YXRpb246ICIgKyBudW1iZXJQcmVzZW50YXRpb24pCiAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxubmFtZVByZXNlbnRhdGlvbjogIiArIG5hbWVQcmVzZW50YXRpb24pCkBAIC01MDIsMTAgKzU3NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbmVtZXJnZW5jeTogIiArIG1Jc0VtZXJnZW5jeSkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXG52b2ljZW1haWwgIiArIG1Jc1ZvaWNlTWFpbCkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXG5jb250YWN0RXhpc3RzICIgKyBjb250YWN0RXhpc3RzKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgfSIpCiAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKDEyOCkKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiQ2FsbGVySW5mbyB7ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSArICIgeyAiKQogICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lICIgKyAoKG5hbWUgPT0gbnVsbCkgPyAibnVsbCIgOiAibm9uLW51bGwiKSkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCBwaG9uZU51bWJlciAiICsgKChwaG9uZU51bWJlciA9PSBudWxsKSA/ICJudWxsIiA6ICJub24tbnVsbCIpKQogICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgfSIpCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvQ2FsbGVySW5mb0FzeW5jUXVlcnkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhCmluZGV4IGM0N2UwNzYuLmJiZDQyMzIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9DYWxsZXJJbmZvQXN5bmNRdWVyeS5qYXZhCkBAIC0zNCw5ICszNCwxMSBAQAogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIC8qKgotICogQVNZTkNIUk9OT1VTIFFVRVJZIEFQSQorICogSGVscGVyIGNsYXNzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJ1biBhc3luY2hyb25vdXMgY2FsbGVyLWlkIGxvb2t1cCBxdWVyaWVzLgorICogQHNlZSBDYWxsZXJJbmZvCisgKgorICoge0BoaWRlfQogICovCi0KIHB1YmxpYyBjbGFzcyBDYWxsZXJJbmZvQXN5bmNRdWVyeSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJDYWxsZXJJbmZvQXN5bmNRdWVyeSI7CkBAIC0yMzksMTIgKzI0MSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1DYWxsZXJJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsIHN0ZXA6IGxvb2sgdXAgdGhlIGdlb2NvZGVkIGRlc2NyaXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBkbyB0aGlzIG9ubHkgaWYgd2UgKmRvbid0KiBoYXZlIGEgdmFsaWQgbmFtZSAoaS5lLiBpZgorICAgICAgICAgICAgICAgICAgICAvLyBubyBjb250YWN0cyBtYXRjaGVkIHRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIGluY29taW5nIGNhbGwpLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGF0J3MgdGhlIG9ubHkgY2FzZSB3aGVyZSB0aGUgaW5jb21pbmctY2FsbCBVSSBjYXJlcworICAgICAgICAgICAgICAgICAgICAvLyBhYm91dCB0aGlzIGZpZWxkLgorICAgICAgICAgICAgICAgICAgICAvLyAoVE9ETzogQnV0IGlmIHdlIGV2ZXIgd2FudCB0aGUgVUkgdG8gc2hvdyB0aGUgZ2VvRGVzY3JpcHRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB3aGVuIHdlICpkbyogbWF0Y2ggYSBjb250YWN0LCB3ZSdsbCBuZWVkIHRvIGVpdGhlciBjYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUdlb0Rlc2NyaXB0aW9uKCkgdW5jb25kaXRpb25hbGx5IGhlcmUsIG9yIHBvc3NpYmx5IGFkZCBhCisgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBwYXJhbWV0ZXIgdG8gQ2FsbGVySW5mb0FzeW5jUXVlcnkuc3RhcnRRdWVyeSgpIHRvIGZvcmNlCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBnZW9EZXNjcmlwdGlvbiBmaWVsZCB0byBiZSBwb3B1bGF0ZWQuKQorICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobUNhbGxlckluZm8ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdHVhbGx5IHdoZW4gbm8gY29udGFjdHMgbWF0Y2ggdGhlIGluY29taW5nIHBob25lIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBDYWxsZXJJbmZvIG9iamVjdCBpcyB0b3RhbGx5IGJsYW5rIGhlcmUgKGkuZS4gbm8gbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gKm9yKiBwaG9uZU51bWJlcikuICBTbyB3ZSBuZWVkIHRvIHBhc3MgaW4gY3cubnVtYmVyIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZhbGxiYWNrIG51bWJlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvLnVwZGF0ZUdlb0Rlc2NyaXB0aW9uKG1RdWVyeUNvbnRleHQsIGN3Lm51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIG51bWJlciBlbnRlcmVkIGJ5IHRoZSB1c2VyIGZvciBkaXNwbGF5LgogICAgICAgICAgICAgICAgICAgICBpZiAoIVRleHRVdGlscy5pc0VtcHR5KGN3Lm51bWJlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cnlEZXRlY3RvciBkZXRlY3RvciA9IChDb3VudHJ5RGV0ZWN0b3IpIG1RdWVyeUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5DT1VOVFJZX0RFVEVDVE9SKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvLnBob25lTnVtYmVyID0gUGhvbmVOdW1iZXJVdGlscy5mb3JtYXROdW1iZXIoY3cubnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGVySW5mby5ub21hbGl6ZWROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsZXJJbmZvLm5vcm1hbGl6ZWROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdG9yLmRldGVjdENvdW50cnkoKS5nZXRDb3VudHJ5SXNvKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNDEyLDcgKzQzMyw3IEBACiAgICAgICogTWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBDYWxsZXJJbmZvQXN5bmNRdWVyeUhhbmRsZXIgb2JqZWN0LCBlbnN1cmluZyBjb3JyZWN0CiAgICAgICogc3RhdGUgb2YgY29udGV4dCBhbmQgdXJpLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhbGxvY2F0ZSAoQ29udGV4dCBjb250ZXh0LCBVcmkgY29udGFjdFJlZikgeworICAgIHByaXZhdGUgdm9pZCBhbGxvY2F0ZShDb250ZXh0IGNvbnRleHQsIFVyaSBjb250YWN0UmVmKSB7CiAgICAgICAgIGlmICgoY29udGV4dCA9PSBudWxsKSB8fCAoY29udGFjdFJlZiA9PSBudWxsKSl7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUXVlcnlQb29sRXhjZXB0aW9uKCJCYWQgY29udGV4dCBvciBxdWVyeSB1cmkuIik7CiAgICAgICAgIH0KQEAgLTQyNCw3ICs0NDUsNyBAQAogICAgIC8qKgogICAgICAqIFJlbGVhc2VzIHRoZSByZWxldmFudCBkYXRhLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWxlYXNlICgpIHsKKyAgICBwcml2YXRlIHZvaWQgcmVsZWFzZSgpIHsKICAgICAgICAgbUhhbmRsZXIubVF1ZXJ5Q29udGV4dCA9IG51bGw7CiAgICAgICAgIG1IYW5kbGVyLm1RdWVyeVVyaSA9IG51bGw7CiAgICAgICAgIG1IYW5kbGVyLm1DYWxsZXJJbmZvID0gbnVsbDsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ2FsbFN0YXRlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNhbGxTdGF0ZS5qYXZhCmluZGV4IDFkNjdkNDUuLmY1NjUxZTAgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ2FsbFN0YXRlLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDYWxsU3RhdGUuamF2YQpAQCAtMjAyLDcgKzIwMiw3IEBACiAKICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5TVUNDRVNTOwogICAgICAgICAgICAgfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5kKExPR19UQUcsICJvblNldHVwQ29tcGxldGVkOiBVbmtub3duSG9zdEV4Y2VwdGlvbiAiICsgZSk7CisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldExpbmtQcm9wZXJ0aWVzOiBVbmtub3duSG9zdEV4Y2VwdGlvbiAiICsgZSk7CiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBTZXR1cFJlc3VsdC5FUlJfVW5hY2NlcHRhYmxlUGFyYW1ldGVyOwogICAgICAgICAgICAgfQpAQCAtMjE2LDggKzIxNiwxMCBAQAogCiAgICAgICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIHNvIGNsZWFyIHByb3BlcnRpZXMKICAgICAgICAgaWYgKHJlc3VsdCAhPSBTZXR1cFJlc3VsdC5TVUNDRVNTKSB7Ci0gICAgICAgICAgICBpZihEQkcpIExvZy5kKExPR19UQUcsCi0gICAgICAgICAgICAgICAgICAgICJvblNldHVwQ29ubmVjdGlvbkNvbXBsZXRlZCB3aXRoIGFuIGVycm9yLCBjbGVhcmluZyBMaW5rUHJvcGVydGllcyIpOworICAgICAgICAgICAgaWYoREJHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgInNldExpbmtQcm9wZXJ0aWVzOiBlcnJvciBjbGVhcmluZyBMaW5rUHJvcGVydGllcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXM9IiArIHN0YXR1cyArICIgcmVzdWx0PSIgKyByZXN1bHQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb24uamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCmluZGV4IDM2MzZiYWEuLjVjMDMwZmQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbi5qYXZhCkBAIC02Miw2ICs2Miw3IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhQ29ubmVjdGlvbiBleHRlbmRzIFN0YXRlTWFjaGluZSB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERCRyA9IHRydWU7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFZEQkcgPSBmYWxzZTsKIAogICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IG1Db3VudExvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgbUNvdW50OwpAQCAtMTQxLDcgKzE0Miw3IEBACiAgICAgICAgIHN0YXRpYyB7CiAgICAgICAgICAgICBzRXJyb3JDb2RlVG9GYWlsQ2F1c2VNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBGYWlsQ2F1c2U+KCk7CiAgICAgICAgICAgICBmb3IgKEZhaWxDYXVzZSBmYyA6IHZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgc0Vycm9yQ29kZVRvRmFpbENhdXNlTWFwLnB1dChmYy5vcmRpbmFsKCksIGZjKTsKKyAgICAgICAgICAgICAgICBzRXJyb3JDb2RlVG9GYWlsQ2F1c2VNYXAucHV0KGZjLmdldEVycm9yQ29kZSgpLCBmYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjI3LDcgKzIyOCw2IEBACiAgICAgICAgIG1JZCA9IGlkOwogICAgICAgICBtUmV0cnlNZ3IgPSBybTsKICAgICAgICAgdGhpcy5jaWQgPSAtMTsKLSAgICAgICAgY2xlYXJTZXR0aW5ncygpOwogCiAgICAgICAgIHNldERiZyhmYWxzZSk7CiAgICAgICAgIGFkZFN0YXRlKG1EZWZhdWx0U3RhdGUpOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAgICAgICAgICAgICBsYXN0RmFpbFRpbWUgPSB0aW1lU3RhbXA7CiAgICAgICAgICAgICBBc3luY1Jlc3VsdC5mb3JNZXNzYWdlKGNvbm5lY3Rpb25Db21wbGV0ZWRNc2csIGNhdXNlLCBuZXcgRXhjZXB0aW9uKCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChEQkcpIGxvZygibm90aWZ5Q29ubmVjdGlvbiBhdCAiICsgdGltZVN0YW1wICsgIiBjYXVzZT0iICsgY2F1c2UpOworICAgICAgICBpZiAoREJHKSBsb2coIm5vdGlmeUNvbm5lY3Rpb25Db21wbGV0ZWQgYXQgIiArIHRpbWVTdGFtcCArICIgY2F1c2U9IiArIGNhdXNlKTsKIAogICAgICAgICBjb25uZWN0aW9uQ29tcGxldGVkTXNnLnNlbmRUb1RhcmdldCgpOwogICAgIH0KQEAgLTMwMSwxNiArMzAxLDE3IEBACiAgICAgICogQHBhcmFtIGRwIGlzIHRoZSBEaXNjb25uZWN0UGFyYW1zLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBub3RpZnlEaXNjb25uZWN0Q29tcGxldGVkKERpc2Nvbm5lY3RQYXJhbXMgZHApIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJOb3RpZnlEaXNjb25uZWN0Q29tcGxldGVkIik7CisgICAgICAgIGlmIChWREJHKSBsb2coIk5vdGlmeURpc2Nvbm5lY3RDb21wbGV0ZWQiKTsKIAogICAgICAgICBpZiAoZHAub25Db21wbGV0ZWRNc2cgIT0gbnVsbCkgewogICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBkcC5vbkNvbXBsZXRlZE1zZzsKLSAgICAgICAgICAgIGxvZyhTdHJpbmcuZm9ybWF0KCJtc2c9JXMgbXNnLm9iaj0lcyIsIG1zZy50b1N0cmluZygpLAorICAgICAgICAgICAgaWYgKFZEQkcpIHsKKyAgICAgICAgICAgICAgICBsb2coU3RyaW5nLmZvcm1hdCgibXNnPSVzIG1zZy5vYmo9JXMiLCBtc2cudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgKChtc2cub2JqIGluc3RhbmNlb2YgU3RyaW5nKSA/IChTdHJpbmcpIG1zZy5vYmogOiAiPG5vLXJlYXNvbj4iKSkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQXN5bmNSZXN1bHQuZm9yTWVzc2FnZShtc2cpOwogICAgICAgICAgICAgbXNnLnNlbmRUb1RhcmdldCgpOwogICAgICAgICB9Ci0gICAgICAgIGNsZWFyU2V0dGluZ3MoKTsKICAgICAgICAgaWYgKERCRykgbG9nKCJOb3RpZnlEaXNjb25uZWN0Q29tcGxldGVkIERpc2Nvbm5lY3RQYXJhbXM9IiArIGRwKTsKICAgICB9CiAKQEAgLTQ3Miw3ICs0NzMsNyBAQAogICAgICAgICAgICAgcmVzdWx0ID0gRGF0YUNhbGxTdGF0ZS5TZXR1cFJlc3VsdC5FUlJfUmlsRXJyb3I7CiAgICAgICAgICAgICByZXN1bHQubUZhaWxDYXVzZSA9IEZhaWxDYXVzZS5mcm9tSW50KHJlc3BvbnNlLnN0YXR1cyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2coIm9uU2V0dXBDb25uZWN0aW9uQ29tcGxldGVkIHJlY2VpdmVkIERhdGFDYWxsU3RhdGU6ICIgKyByZXNwb25zZSk7CisgICAgICAgICAgICBpZiAoREJHKSBsb2coIm9uU2V0dXBDb25uZWN0aW9uQ29tcGxldGVkIHJlY2VpdmVkIERhdGFDYWxsU3RhdGU6ICIgKyByZXNwb25zZSk7CiAgICAgICAgICAgICBjaWQgPSByZXNwb25zZS5jaWQ7CiAgICAgICAgICAgICAvLyBzZXQgbGluayBwcm9wZXJ0aWVzIGJhc2VkIG9uIGRhdGEgY2FsbCByZXNwb25zZQogICAgICAgICAgICAgcmVzdWx0ID0gc2V0TGlua1Byb3BlcnRpZXMocmVzcG9uc2UsIG1MaW5rUHJvcGVydGllcyk7CkBAIC01NTgsNTMgKzU1OSw1MyBAQAogICAgICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewogICAgICAgICAgICAgICAgIGNhc2UgQXN5bmNDaGFubmVsLkNNRF9DSEFOTkVMX0ZVTExfQ09OTkVDVElPTjogewogICAgICAgICAgICAgICAgICAgICBpZiAobUFjICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGlzY29ubmVjdGluZyB0byBwcmV2aW91cyBjb25uZWN0aW9uIG1BYz0iICsgbUFjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRpc2Nvbm5lY3RpbmcgdG8gcHJldmlvdXMgY29ubmVjdGlvbiBtQWM9IiArIG1BYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBBc3luY0NoYW5uZWwuQ01EX0NIQU5ORUxfRlVMTFlfQ09OTkVDVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0NoYW5uZWwuU1RBVFVTX0ZVTExfQ09OTkVDVElPTl9SRUZVU0VEX0FMUkVBRFlfQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BYyA9IG5ldyBBc3luY0NoYW5uZWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1BYy5jb25uZWN0ZWQobnVsbCwgZ2V0SGFuZGxlcigpLCBtc2cucmVwbHlUbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRjRGVmYXVsdFN0YXRlOiBGVUxMX0NPTk5FQ1RJT04gcmVwbHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJEY0RlZmF1bHRTdGF0ZTogRlVMTF9DT05ORUNUSU9OIHJlcGx5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUFjLnJlcGx5VG9NZXNzYWdlKG1zZywgQXN5bmNDaGFubmVsLkNNRF9DSEFOTkVMX0ZVTExZX0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNDaGFubmVsLlNUQVRVU19TVUNDRVNTRlVMLCBtSWQsICJoaSIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIEFzeW5jQ2hhbm5lbC5DTURfQ0hBTk5FTF9ESVNDT05ORUNUOiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiQ01EX0NIQU5ORUxfRElTQ09OTkVDVCIpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJDTURfQ0hBTk5FTF9ESVNDT05ORUNUIik7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIEFzeW5jQ2hhbm5lbC5DTURfQ0hBTk5FTF9ESVNDT05ORUNURUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDTURfQ0hBTk5FTF9ESVNDT05ORUNURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiQ01EX0NIQU5ORUxfRElTQ09OTkVDVEVEIik7CiAgICAgICAgICAgICAgICAgICAgIG1BYyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX0lTX0lOQUNUSVZFOiB7CiAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdmFsID0gZ2V0Q3VycmVudFN0YXRlKCkgPT0gbUluYWN0aXZlU3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUkVRX0lTX0lOQUNUSVZFICBpc0luYWN0aXZlPSIgKyB2YWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJSRVFfSVNfSU5BQ1RJVkUgIGlzSW5hY3RpdmU9IiArIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX0lTX0lOQUNUSVZFLCB2YWwgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX0dFVF9DSUQ6IHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJSRVFfR0VUX0NJRCAgY2lkPSIgKyBjaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJSRVFfR0VUX0NJRCAgY2lkPSIgKyBjaWQpOwogICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBEYXRhQ29ubmVjdGlvbkFjLlJTUF9HRVRfQ0lELCBjaWQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQ29ubmVjdGlvbkFjLlJFUV9HRVRfQVBOU0VUVElORzogewotICAgICAgICAgICAgICAgICAgICBsb2coIlJFUV9HRVRfQVBOU0VUVElORyAgYXBuU2V0dGluZz0iICsgbUFwbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIlJFUV9HRVRfQVBOU0VUVElORyAgYXBuU2V0dGluZz0iICsgbUFwbik7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX0dFVF9BUE5TRVRUSU5HLCBtQXBuKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgRGF0YUNvbm5lY3Rpb25BYy5SRVFfR0VUX0xJTktfUFJPUEVSVElFUzogewogICAgICAgICAgICAgICAgICAgICBMaW5rUHJvcGVydGllcyBscCA9IG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpOwotICAgICAgICAgICAgICAgICAgICBsb2coIlJFUV9HRVRfTElOS19QUk9QRVJUSUVTIGxpbmtQcm9wZXJ0aWVzIiArIGxwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiUkVRX0dFVF9MSU5LX1BST1BFUlRJRVMgbGlua1Byb3BlcnRpZXMiICsgbHApOwogICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBEYXRhQ29ubmVjdGlvbkFjLlJTUF9HRVRfTElOS19QUk9QRVJUSUVTLCBscCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX1NFVF9MSU5LX1BST1BFUlRJRVNfSFRUUF9QUk9YWTogewogICAgICAgICAgICAgICAgICAgICBQcm94eVByb3BlcnRpZXMgcHJveHkgPSAoUHJveHlQcm9wZXJ0aWVzKSBtc2cub2JqOwotICAgICAgICAgICAgICAgICAgICBsb2coIlJFUV9TRVRfTElOS19QUk9QRVJUSUVTX0hUVFBfUFJPWFkgcHJveHk9IiArIHByb3h5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiUkVRX1NFVF9MSU5LX1BST1BFUlRJRVNfSFRUUF9QUk9YWSBwcm94eT0iICsgcHJveHkpOwogICAgICAgICAgICAgICAgICAgICBtTGlua1Byb3BlcnRpZXMuc2V0SHR0cFByb3h5KHByb3h5KTsKICAgICAgICAgICAgICAgICAgICAgbUFjLnJlcGx5VG9NZXNzYWdlKG1zZywgRGF0YUNvbm5lY3Rpb25BYy5SU1BfU0VUX0xJTktfUFJPUEVSVElFU19IVFRQX1BST1hZKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02MTIsNyArNjEzLDcgQEAKICAgICAgICAgICAgICAgICBjYXNlIERhdGFDb25uZWN0aW9uQWMuUkVRX1VQREFURV9MSU5LX1BST1BFUlRJRVNfREFUQV9DQUxMX1NUQVRFOiB7CiAgICAgICAgICAgICAgICAgICAgIERhdGFDYWxsU3RhdGUgbmV3U3RhdGUgPSAoRGF0YUNhbGxTdGF0ZSkgbXNnLm9iajsKICAgICAgICAgICAgICAgICAgICAgRGF0YUNvbm5lY3Rpb25BYy5MaW5rUHJvcGVydHlDaGFuZ2VBY3Rpb24gYWN0aW9uID0gdXBkYXRlTGlua1Byb3BlcnR5KG5ld1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgeworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJSRVFfVVBEQVRFX0xJTktfUFJPUEVSVElFU19EQVRBX0NBTExfU1RBVEUgYWN0aW9uPSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFjdGlvbiArICIgbmV3U3RhdGU9IiArIG5ld1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjIzLDE4ICs2MjQsMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQ29ubmVjdGlvbkFjLlJFUV9HRVRfTElOS19DQVBBQklMSVRJRVM6IHsKICAgICAgICAgICAgICAgICAgICAgTGlua0NhcGFiaWxpdGllcyBsYyA9IG5ldyBMaW5rQ2FwYWJpbGl0aWVzKG1DYXBhYmlsaXRpZXMpOwotICAgICAgICAgICAgICAgICAgICBsb2coIlJFUV9HRVRfTElOS19DQVBBQklMSVRJRVMgbGlua0NhcGFiaWxpdGllcyIgKyBsYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIlJFUV9HRVRfTElOS19DQVBBQklMSVRJRVMgbGlua0NhcGFiaWxpdGllcyIgKyBsYyk7CiAgICAgICAgICAgICAgICAgICAgIG1BYy5yZXBseVRvTWVzc2FnZShtc2csIERhdGFDb25uZWN0aW9uQWMuUlNQX0dFVF9MSU5LX0NBUEFCSUxJVElFUywgbGMpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBEYXRhQ29ubmVjdGlvbkFjLlJFUV9SRVNFVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJEY0RlZmF1bHRTdGF0ZTogbXNnLndoYXQ9UkVRX1JFU0VUIik7Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFyU2V0dGluZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGNEZWZhdWx0U3RhdGU6IG1zZy53aGF0PVJFUV9SRVNFVCIpOwogICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBEYXRhQ29ubmVjdGlvbkFjLlJTUF9SRVNFVCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtSW5hY3RpdmVTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRGF0YUNvbm5lY3Rpb25BYy5SRVFfR0VUX1JFRkNPVU5UOiB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiUkVRX0dFVF9SRUZDT1VOVCAgcmVmQ291bnQ9IiArIG1SZWZDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIlJFUV9HRVRfUkVGQ09VTlQgIHJlZkNvdW50PSIgKyBtUmVmQ291bnQpOwogICAgICAgICAgICAgICAgICAgICBtQWMucmVwbHlUb01lc3NhZ2UobXNnLCBEYXRhQ29ubmVjdGlvbkFjLlJTUF9HRVRfUkVGQ09VTlQsIG1SZWZDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTY2Niw3ICs2NjYsOCBAQAogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEY0RlZmF1bHRTdGF0ZTogc2hvdWxkbid0IGhhcHBlbiBidXQgaWdub3JlIG1zZy53aGF0PSIgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRjRGVmYXVsdFN0YXRlOiBzaG91bGRuJ3QgaGFwcGVuIGJ1dCBpZ25vcmUgbXNnLndoYXQ9MHgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhtc2cud2hhdCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjg1LDEzICs2ODYsMTMgQEAKICAgICAgICAgcHJpdmF0ZSBEaXNjb25uZWN0UGFyYW1zIG1EaXNjb25uZWN0UGFyYW1zID0gbnVsbDsKIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbnRlck5vdGlmaWNhdGlvblBhcmFtcyhDb25uZWN0aW9uUGFyYW1zIGNwLCBGYWlsQ2F1c2UgY2F1c2UpIHsKLSAgICAgICAgICAgIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBzZXRFbnRlck5vdGljYXRpb25QYXJhbXMgY3AsY2F1c2UiKTsKKyAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRjSW5hY3RpdmVTdGF0ZTogc2V0RW50ZXJOb3RpY2F0aW9uUGFyYW1zIGNwLGNhdXNlIik7CiAgICAgICAgICAgICBtQ29ubmVjdGlvblBhcmFtcyA9IGNwOwogICAgICAgICAgICAgbUZhaWxDYXVzZSA9IGNhdXNlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0RW50ZXJOb3RpZmljYXRpb25QYXJhbXMoRGlzY29ubmVjdFBhcmFtcyBkcCkgewotICAgICAgICAgIGxvZygiRGNJbmFjdGl2ZVN0YXRlOiBzZXRFbnRlck5vdGljYXRpb25QYXJhbXMgZHAiKTsKKyAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRjSW5hY3RpdmVTdGF0ZTogc2V0RW50ZXJOb3RpY2F0aW9uUGFyYW1zIGRwIik7CiAgICAgICAgICAgICBtRGlzY29ubmVjdFBhcmFtcyA9IGRwOwogICAgICAgICB9CiAKQEAgLTcwNywxMyArNzA4LDE0IEBACiAgICAgICAgICAgICAgKiBjYWxsIHRvIGlzSW5hY3RpdmUuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICgobUNvbm5lY3Rpb25QYXJhbXMgIT0gbnVsbCkgJiYgKG1GYWlsQ2F1c2UgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkRjSW5hY3RpdmVTdGF0ZTogZW50ZXIgbm90aWZ5Q29ubmVjdENvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgIGlmIChWREJHKSBsb2coIkRjSW5hY3RpdmVTdGF0ZTogZW50ZXIgbm90aWZ5Q29ubmVjdENvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgIG5vdGlmeUNvbm5lY3RDb21wbGV0ZWQobUNvbm5lY3Rpb25QYXJhbXMsIG1GYWlsQ2F1c2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1EaXNjb25uZWN0UGFyYW1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgbG9nKCJEY0luYWN0aXZlU3RhdGU6IGVudGVyIG5vdGlmeURpc2Nvbm5lY3RDb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJEY0luYWN0aXZlU3RhdGU6IGVudGVyIG5vdGlmeURpc2Nvbm5lY3RDb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICBub3RpZnlEaXNjb25uZWN0Q29tcGxldGVkKG1EaXNjb25uZWN0UGFyYW1zKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyU2V0dGluZ3MoKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNzUxLDcgKzc1MywxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRGNJbmFjdGl2ZVN0YXRlIG5vdGhhbmRsZWQgbXNnLndoYXQ9IiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGNJbmFjdGl2ZVN0YXRlIG5vdGhhbmRsZWQgbXNnLndoYXQ9MHgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhtc2cud2hhdCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IE5PVF9IQU5ETEVEOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTg1Niw3ICs4NjEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkRjQWN0aXZhdGluZ1N0YXRlIG5vdCBoYW5kbGVkIG1zZy53aGF0PSIgKyBtc2cud2hhdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChWREJHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRjQWN0aXZhdGluZ1N0YXRlIG5vdCBoYW5kbGVkIG1zZy53aGF0PTB4IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcobXNnLndoYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBOT1RfSEFORExFRDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NzMsNyArODgxLDcgQEAKICAgICAgICAgcHJpdmF0ZSBGYWlsQ2F1c2UgbUZhaWxDYXVzZSA9IG51bGw7CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0RW50ZXJOb3RpZmljYXRpb25QYXJhbXMoQ29ubmVjdGlvblBhcmFtcyBjcCwgRmFpbENhdXNlIGNhdXNlKSB7Ci0gICAgICAgICAgICBsb2coIkRjSW5hY3RpdmVTdGF0ZTogc2V0RW50ZXJOb3RpY2F0aW9uUGFyYW1zIGNwLGNhdXNlIik7CisgICAgICAgICAgICBpZiAoVkRCRykgbG9nKCJEY0luYWN0aXZlU3RhdGU6IHNldEVudGVyTm90aWNhdGlvblBhcmFtcyBjcCxjYXVzZSIpOwogICAgICAgICAgICAgbUNvbm5lY3Rpb25QYXJhbXMgPSBjcDsKICAgICAgICAgICAgIG1GYWlsQ2F1c2UgPSBjYXVzZTsKICAgICAgICAgfQpAQCAtODg3LDcgKzg5NSw3IEBACiAgICAgICAgICAgICAgKiBjYWxsIHRvIGlzQWN0aXZlLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoKG1Db25uZWN0aW9uUGFyYW1zICE9IG51bGwpICYmIChtRmFpbENhdXNlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJEY0FjdGl2ZVN0YXRlOiBlbnRlciBub3RpZnlDb25uZWN0Q29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgaWYgKFZEQkcpIGxvZygiRGNBY3RpdmVTdGF0ZTogZW50ZXIgbm90aWZ5Q29ubmVjdENvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgIG5vdGlmeUNvbm5lY3RDb21wbGV0ZWQobUNvbm5lY3Rpb25QYXJhbXMsIG1GYWlsQ2F1c2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05MzAsNyArOTM4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJEY0FjdGl2ZVN0YXRlIG5vdGhhbmRsZWQgbXNnLndoYXQ9IiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGNBY3RpdmVTdGF0ZSBub3QgaGFuZGxlZCBtc2cud2hhdD0weCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1zZy53aGF0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gTk9UX0hBTkRMRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtOTcyLDcgKzk4MywxMCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRGNEaXNjb25uZWN0aW5nU3RhdGUgbm90IGhhbmRsZWQgbXNnLndoYXQ9IiArIG1zZy53aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZEQkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGNEaXNjb25uZWN0aW5nU3RhdGUgbm90IGhhbmRsZWQgbXNnLndoYXQ9MHgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhtc2cud2hhdCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IE5PVF9IQU5ETEVEOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTEwMTQsOSArMTAyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEY0Rpc2Nvbm5lY3Rpb25FcnJvckNyZWF0aW5nQ29ubmVjdGlvbiBub3QgaGFuZGxlZCBtc2cud2hhdD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLndoYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoVkRCRykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJEY0Rpc2Nvbm5lY3Rpb25FcnJvckNyZWF0aW5nQ29ubmVjdGlvbiBub3QgaGFuZGxlZCBtc2cud2hhdD0weCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKG1zZy53aGF0KSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gTk9UX0hBTkRMRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uQWMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvbkFjLmphdmEKaW5kZXggYTBkOWIwZi4uNjJiOTBhZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uQWMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25BYy5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAgKiBBc3luY0NoYW5uZWwgdG8gYSBEYXRhQ29ubmVjdGlvbgogICovCiBwdWJsaWMgY2xhc3MgRGF0YUNvbm5lY3Rpb25BYyBleHRlbmRzIEFzeW5jQ2hhbm5lbCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEQkcgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUxvZ1RhZzsKIAogICAgIHB1YmxpYyBEYXRhQ29ubmVjdGlvbiBkYXRhQ29ubmVjdGlvbjsKQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgICAgICBpZiAoKHJlc3BvbnNlICE9IG51bGwpICYmIChyZXNwb25zZS53aGF0ID09IFJTUF9SRVNFVCkpIHsKICAgICAgICAgICAgIGlmIChEQkcpIGxvZygicmVzdFN5bmMgb2siKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygicmVzdFN5bmMgZXJyb3IgcmVzcG9uc2U9IiArIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGxvZygicmVzdFN5bmMgZXJyb3IgcmVzcG9uc2U9IiArIHJlc3BvbnNlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0RhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IDVkZGZjZDEuLjk3N2I0MTIgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTE0NSw4ICsxNDUsMTAgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQTl9UWVBFX0tFWSA9ICJhcG5UeXBlIjsKIAotICAgIC8qKiBEZWxheSBiZXR3ZWVuIEFQTiBhdHRlbXB0cyAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFQTl9ERUxBWV9NSUxMSVMgPSA1MDAwOworICAgIC8qKiBEZWxheSBiZXR3ZWVuIEFQTiBhdHRlbXB0cy4KKyAgICAgICAgTm90ZSB0aGUgcHJvcGVydHkgb3ZlcnJpZGUgbWVjaGFuaXNtIGlzIHRoZXJlIGp1c3QgZm9yIHRlc3RpbmcgcHVycG9zZSBvbmx5LiAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFQTl9ERUxBWV9NSUxMSVMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Qcm9wZXJ0aWVzLmdldEludCgicGVyc2lzdC5yYWRpby5hcG5fZGVsYXkiLCA1MDAwKTsKIAogICAgIC8vIHJlc3BvbmRzIHRvIHRoZSBzZXRJbnRlcm5hbERhdGFFbmFibGVkIGNhbGwgLSB1c2VkIGludGVybmFsbHkgdG8gdHVybiBvZmYgZGF0YQogICAgIC8vIGZvciBleGFtcGxlIGR1cmluZyBlbWVyZ2VuY3kgY2FsbHMKQEAgLTMwNCw3ICszMDYsNyBAQAogICAgICAgICAgICAgICAgIG1Jc1NjcmVlbk9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3RvcE5ldFN0YXRQb2xsKCk7CiAgICAgICAgICAgICAgICAgc3RhcnROZXRTdGF0UG9sbCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKGdldEFjdGlvbkludGVudFJlY29ubmVjdEFsYXJtKCkpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5zdGFydHNXaXRoKGdldEFjdGlvbkludGVudFJlY29ubmVjdEFsYXJtKCkpKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJSZWNvbm5lY3QgYWxhcm0uIFByZXZpb3VzIHN0YXRlIHdhcyAiICsgbVN0YXRlKTsKICAgICAgICAgICAgICAgICBvbkFjdGlvbkludGVudFJlY29ubmVjdEFsYXJtKGludGVudCk7CiAKQEAgLTUwOSw3ICs1MTEsNiBAQAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9uVm9pY2VDYWxsRW5kZWQoKTsKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkNsZWFuVXBDb25uZWN0aW9uKGJvb2xlYW4gdGVhckRvd24sIGludCBhcG5JZCwgU3RyaW5nIHJlYXNvbik7CiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25DbGVhblVwQWxsQ29ubmVjdGlvbnMoU3RyaW5nIGNhdXNlKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZSgpOwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzRGF0YVBvc3NpYmxlKFN0cmluZyBhcG5UeXBlKTsKIAogICAgIEBPdmVycmlkZQpAQCAtNzUyLDcgKzc1Myw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJpbGl0eShTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBlaXRoZXIganVzdCB0dXJuZWQgYWxsIG9mZiBiZWNhdXNlIHdlIGxvc3QgYXZhaWxhYmlsaXR5CiAgICAgICAgIC8vIG9yIGFsbCB3ZXJlIG9mZiBhbmQgY291bGQgbm93IGdvIG9uLCBzbyBvbmx5IGhhdmUgb2ZmIGFwbnMgdG8gd29ycnkgYWJvdXQKLSAgICAgICAgbm90aWZ5T2ZmQXBuc09mQXZhaWxhYmlsaXR5KHJlYXNvbiwgaXNEYXRhUG9zc2libGUoKSk7CisgICAgICAgIG5vdGlmeU9mZkFwbnNPZkF2YWlsYWJpbGl0eShyZWFzb24sIGlzRGF0YVBvc3NpYmxlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0FwblR5cGVFbmFibGVkKFN0cmluZyBhcG5UeXBlKSB7CkBAIC05NjgsMTEgKzk2OSw3IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKG1zZyk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNBbnlBY3RpdmVEYXRhQ29ubmVjdGlvbnMoKSB7Ci0gICAgICAgIC8vIFRPRE86IFJlbWVtYmVyIGlmIHRoZXJlIGFyZSBhbnkgY29ubmVjdGVkIG9yCi0gICAgICAgIC8vIGxvb3AgYXNraW5nIGVhY2ggREMvQVBOPwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNBbnlBY3RpdmVEYXRhQ29ubmVjdGlvbnMoKTsKIAogICAgIHByb3RlY3RlZCB2b2lkIG9uU2V0RGF0YUVuYWJsZWQoYm9vbGVhbiBlbmFibGUpIHsKICAgICAgICAgYm9vbGVhbiBwcmV2RW5hYmxlZCA9IGdldEFueURhdGFFbmFibGVkKCk7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtQWxwaGFiZXQuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhCmluZGV4IGM3YzkxZTQuLmEzZjRmMWYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21BbHBoYWJldC5qYXZhCkBAIC04Niw2ICs4Niw4IEBACiAgICAgICogR1NNX0VYVEVOREVEX0VTQ0FQRSBpZiB0aGlzIGNoYXJhY3RlciBpcyBpbiB0aGUgZXh0ZW5kZWQgdGFibGUuCiAgICAgICogSW4gdGhpcyBjYXNlLCB5b3UgbXVzdCBjYWxsIGNoYXJUb0dzbUV4dGVuZGVkKCkgZm9yIHRoZSB2YWx1ZQogICAgICAqIHRoYXQgc2hvdWxkIGZvbGxvdyBHU01fRVhURU5ERURfRVNDQVBFIGluIHRoZSBHU00gYWxwaGFiZXQgc3RyaW5nLgorICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gY29udmVydAorICAgICAqIEByZXR1cm4gdGhlIEdTTSA3IGJpdCB0YWJsZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludAogICAgIGNoYXJUb0dzbShjaGFyIGMpIHsKQEAgLTk5LDEyICsxMDEsMTUgQEAKIAogICAgIC8qKgogICAgICAqIENvbnZlcnRzIGEgY2hhciB0byBhIEdTTSA3IGJpdCB0YWJsZSBpbmRleC4KKyAgICAgKiBSZXR1cm5zIEdTTV9FWFRFTkRFRF9FU0NBUEUgaWYgdGhpcyBjaGFyYWN0ZXIgaXMgaW4gdGhlIGV4dGVuZGVkIHRhYmxlLgorICAgICAqIEluIHRoaXMgY2FzZSwgeW91IG11c3QgY2FsbCBjaGFyVG9Hc21FeHRlbmRlZCgpIGZvciB0aGUgdmFsdWUgdGhhdAorICAgICAqIHNob3VsZCBmb2xsb3cgR1NNX0VYVEVOREVEX0VTQ0FQRSBpbiB0aGUgR1NNIGFscGhhYmV0IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gY29udmVydAogICAgICAqIEBwYXJhbSB0aHJvd0V4Y2VwdGlvbiBJZiB0cnVlLCB0aHJvd3MgRW5jb2RlRXhjZXB0aW9uIG9uIGludmFsaWQgY2hhci4KICAgICAgKiAgIElmIGZhbHNlLCByZXR1cm5zIEdTTSBhbHBoYWJldCAnICcgY2hhci4KLSAgICAgKgotICAgICAqIFJldHVybnMgR1NNX0VYVEVOREVEX0VTQ0FQRSBpZiB0aGlzIGNoYXJhY3RlciBpcyBpbiB0aGUgZXh0ZW5kZWQgdGFibGUKLSAgICAgKiBJbiB0aGlzIGNhc2UsIHlvdSBtdXN0IGNhbGwgY2hhclRvR3NtRXh0ZW5kZWQoKSBmb3IgdGhlIHZhbHVlIHRoYXQKLSAgICAgKiBzaG91bGQgZm9sbG93IEdTTV9FWFRFTkRFRF9FU0NBUEUgaW4gdGhlIEdTTSBhbHBoYWJldCBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBlbmNvZGUgZXJyb3Igd2hlbiB0aHJvd0V4Y2VwdGlvbiBpcyB0cnVlCisgICAgICogQHJldHVybiB0aGUgR1NNIDcgYml0IHRhYmxlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50CiAgICAgY2hhclRvR3NtKGNoYXIgYywgYm9vbGVhbiB0aHJvd0V4Y2VwdGlvbikgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiB7CkBAIC0xMzMsNiArMTM4LDggQEAKICAgICAgKiBDb252ZXJ0cyBhIGNoYXIgdG8gYW4gZXh0ZW5kZWQgR1NNIDcgYml0IHRhYmxlIGluZGV4LgogICAgICAqIEV4dGVuZGVkIGNoYXJzIHNob3VsZCBiZSBlc2NhcGVkIHdpdGggR1NNX0VYVEVOREVEX0VTQ0FQRS4KICAgICAgKiBSZXR1cm5zICcgJyBpbiBHU00gYWxwaGFiZXQgaWYgdGhlcmUncyBubyBwb3NzaWJsZSBtYXRjaC4KKyAgICAgKiBAcGFyYW0gYyB0aGUgY2hhcmFjdGVyIHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBHU00gNyBiaXQgZXh0ZW5kZWQgdGFibGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQKICAgICBjaGFyVG9Hc21FeHRlbmRlZChjaGFyIGMpIHsKQEAgLTE1NSw2ICsxNjIsOSBAQAogICAgICAqIGdzbUV4dGVuZGVkVG9DaGFyKCkuCiAgICAgICoKICAgICAgKiBJZiBhbiB1bm1hcHBhYmxlIHZhbHVlIGlzIHBhc3NlZCAob25lIGdyZWF0ZXIgdGhhbiAxMjcpLCAnICcgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3NtQ2hhciB0aGUgR1NNIDcgYml0IHRhYmxlIGluZGV4IHRvIGNvbnZlcnQKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGNoYXJhY3RlcgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2hhcgogICAgIGdzbVRvQ2hhcihpbnQgZ3NtQ2hhcikgewpAQCAtMTc0LDYgKzE4NCw5IEBACiAgICAgICoKICAgICAgKiBJZiBhbiB1bm1hcHBhYmxlIHZhbHVlIGlzIHBhc3NlZCwgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBHU00gNyBiaXQKICAgICAgKiBkZWZhdWx0IHRhYmxlIHdpbGwgYmUgdXNlZCAodGFibGUgNi4yLjEuMSBvZiBUUyAyMy4wMzgpLgorICAgICAqCisgICAgICogQHBhcmFtIGdzbUNoYXIgdGhlIEdTTSA3IGJpdCBleHRlbmRlZCB0YWJsZSBpbmRleCB0byBjb252ZXJ0CisgICAgICogQHJldHVybiB0aGUgZGVjb2RlZCBjaGFyYWN0ZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNoYXIKICAgICBnc21FeHRlbmRlZFRvQ2hhcihpbnQgZ3NtQ2hhcikgewpAQCAtMjQ0LDYgKzI1NywyNiBAQAogICAgICAqIHNlcHRldHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBzdHJpbmcgdG8gZW5jb2RlCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBpZiBTdHJpbmcgaXMgdG9vIGxhcmdlIHRvIGVuY29kZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHN0cmluZ1RvR3NtN0JpdFBhY2tlZChTdHJpbmcgZGF0YSkKKyAgICAgICAgICAgIHRocm93cyBFbmNvZGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3RyaW5nVG9Hc203Qml0UGFja2VkKGRhdGEsIDAsIHRydWUsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgU3RyaW5nIGludG8gYSBieXRlIGFycmF5IGNvbnRhaW5pbmcKKyAgICAgKiB0aGUgNy1iaXQgcGFja2VkIEdTTSBBbHBoYWJldCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RyaW5nLgorICAgICAqCisgICAgICogVW5lbmNvZGFibGUgY2hhcnMgYXJlIGVuY29kZWQgYXMgc3BhY2VzCisgICAgICoKKyAgICAgKiBCeXRlIDAgaW4gdGhlIHJldHVybmVkIGJ5dGUgYXJyYXkgaXMgdGhlIGNvdW50IG9mIHNlcHRldHMgdXNlZAorICAgICAqIFRoZSByZXR1cm5lZCBieXRlIGFycmF5IGlzIHRoZSBtaW5pbXVtIHNpemUgcmVxdWlyZWQgdG8gc3RvcmUKKyAgICAgKiB0aGUgcGFja2VkIHNlcHRldHMuIFRoZSByZXR1cm5lZCBhcnJheSBjYW5ub3QgY29udGFpbiBtb3JlIHRoYW4gMjU1CisgICAgICogc2VwdGV0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHN0cmluZyB0byBlbmNvZGUKICAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VUYWJsZSB0aGUgNyBiaXQgbGFuZ3VhZ2UgdGFibGUsIG9yIDAgZm9yIHRoZSBkZWZhdWx0IEdTTSBhbHBoYWJldAogICAgICAqIEBwYXJhbSBsYW5ndWFnZVNoaWZ0VGFibGUgdGhlIDcgYml0IHNpbmdsZSBzaGlmdCBsYW5ndWFnZSB0YWJsZSwgb3IgMCBmb3IgdGhlIGRlZmF1bHQKICAgICAgKiAgICAgR1NNIGV4dGVuc2lvbiB0YWJsZQpAQCAtNDQ5LDYgKzQ4MiwxMSBAQAogICAgICAqCiAgICAgICogRmllbGQgbWF5IGJlIHBhZGRlZCB3aXRoIHRyYWlsaW5nIDB4ZmYncy4gVGhlIGRlY29kZSBzdG9wcwogICAgICAqIGF0IHRoZSBmaXJzdCAweGZmIGVuY291bnRlcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgdGhlIGJ5dGUgYXJyYXkgdG8gZGVjb2RlCisgICAgICogQHBhcmFtIG9mZnNldCBhcnJheSBvZmZzZXQgZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gZGVjb2RlCisgICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGRlY29kZQorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgc3RyaW5nCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcKICAgICBnc204Qml0VW5wYWNrZWRUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewpAQCAtNTMyLDYgKzU3MCw4IEBACiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIHN0cmluZyBpbnRvIGFuIDgtYml0IHVucGFja2VkIEdTTSBhbHBoYWJldCBieXRlIGFycmF5LgogICAgICAqIEFsd2F5cyB1c2VzIEdTTSBkZWZhdWx0IDctYml0IGFscGhhYmV0IGFuZCBleHRlbnNpb24gdGFibGUuCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBlbmNvZGUKKyAgICAgKiBAcmV0dXJuIHRoZSA4LWJpdCBHU00gZW5jb2RlZCBieXRlIGFycmF5IGZvciB0aGUgc3RyaW5nCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10KICAgICBzdHJpbmdUb0dzbThCaXRQYWNrZWQoU3RyaW5nIHMpIHsKQEAgLTU1MCwxMSArNTkwLDEzIEBACiAKICAgICAvKioKICAgICAgKiBXcml0ZSBhIFN0cmluZyBpbnRvIGEgR1NNIDgtYml0IHVucGFja2VkIGZpZWxkIG9mCi0gICAgICogQHBhcmFtIGxlbmd0aCBzaXplIGF0IEBwYXJhbSBvZmZzZXQgaW4gQHBhcmFtIGRlc3QKLSAgICAgKgogICAgICAqIEZpZWxkIGlzIHBhZGRlZCB3aXRoIDB4ZmYncywgc3RyaW5nIGlzIHRydW5jYXRlZCBpZiBuZWNlc3NhcnkKKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gZW5jb2RlCisgICAgICogQHBhcmFtIGRlc3QgdGhlIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkKKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBvZmZzZXQgZm9yIHRoZSBlbmNvZGVkIHN0cmluZworICAgICAqIEBwYXJhbSBsZW5ndGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCiAgICAgICovCi0KICAgICBwdWJsaWMgc3RhdGljIHZvaWQKICAgICBzdHJpbmdUb0dzbThCaXRVbnBhY2tlZEZpZWxkKFN0cmluZyBzLCBieXRlIGRlc3RbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgICAgICBpbnQgb3V0Qnl0ZUluZGV4ID0gb2Zmc2V0OwpAQCAtNTk2LDYgKzYzOCw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgNy1iaXQgR1NNIGFscGhhYmV0IGNoYXJhY3RlcnMKICAgICAgKiBuZWVkZWQgdG8gcmVwcmVzZW50IHRoaXMgY2hhcmFjdGVyLiBDb3VudHMgdW5lbmNvZGFibGUgY2hhciBhcyAxIHNlcHRldC4KKyAgICAgKiBAcGFyYW0gYyB0aGUgY2hhcmFjdGVyIHRvIGV4YW1pbmUKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VwdGV0cyBmb3IgdGhpcyBjaGFyYWN0ZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludAogICAgIGNvdW50R3NtU2VwdGV0cyhjaGFyIGMpIHsKQEAgLTYxMCw4ICs2NTQsMTEgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiA3LWJpdCBHU00gYWxwaGFiZXQgY2hhcmFjdGVycwogICAgICAqIG5lZWRlZCB0byByZXByZXNlbnQgdGhpcyBjaGFyYWN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgNyBiaXQgR1NNIGFscGhhYmV0LgorICAgICAqIEBwYXJhbSBjIHRoZSBjaGFyYWN0ZXIgdG8gZXhhbWluZQogICAgICAqIEBwYXJhbSB0aHJvd3NFeGNlcHRpb24gSWYgdHJ1ZSwgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiBpZiB1bmVuY29kYWJsZQotICAgICAqIGNoYXIuIE90aGVyd2lzZSwgY291bnRzIGludmFsaWQgY2hhciBhcyAxIHNlcHRldAorICAgICAqIGNoYXIuIE90aGVyd2lzZSwgY291bnRzIGludmFsaWQgY2hhciBhcyAxIHNlcHRldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VwdGV0cyBmb3IgdGhpcyBjaGFyYWN0ZXIKKyAgICAgKiBAdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiB0aGUgY2hhcmFjdGVyIGNhbid0IGJlIGVuY29kZWQgYW5kIHRocm93c0V4Y2VwdGlvbiBpcyB0cnVlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQKICAgICBjb3VudEdzbVNlcHRldHMoY2hhciBjLCBib29sZWFuIHRocm93c0V4Y2VwdGlvbikgdGhyb3dzIEVuY29kZUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVNtcy5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lTbXMuYWlkbAppbmRleCA5MGRlNWUxLi43MzVmOTg2IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVNtcy5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JU21zLmFpZGwKQEAgLTE3MCw0ICsxNzAsMzIgQEAKICAgICAgKi8KICAgICBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcik7CiAKKyAgICAvKioKKyAgICAgKiBFbmFibGUgcmVjZXB0aW9uIG9mIGNlbGwgYnJvYWRjYXN0IChTTVMtQ0IpIG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuCisgICAgICogbWVzc2FnZSBpZGVudGlmaWVyIHJhbmdlLiBOb3RlIHRoYXQgaWYgdHdvIGRpZmZlcmVudCBjbGllbnRzIGVuYWJsZQorICAgICAqIGEgbWVzc2FnZSBpZGVudGlmaWVyIHJhbmdlLCB0aGV5IG11c3QgYm90aCBkaXNhYmxlIGl0IGZvciB0aGUgZGV2aWNlCisgICAgICogdG8gc3RvcCByZWNlaXZpbmcgdGhvc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRNZXNzYWdlSWQgZmlyc3QgbWVzc2FnZSBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiBUUyAyMy4wNDEKKyAgICAgKiBAcGFyYW0gZW5kTWVzc2FnZUlkIGxhc3QgbWVzc2FnZSBpZGVudGlmaWVyIGFzIHNwZWNpZmllZCBpbiBUUyAyMy4wNDEKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICoKKyAgICAgKiBAc2VlICNkaXNhYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCwgaW50KQorICAgICAqLworICAgIGJvb2xlYW4gZW5hYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCBzdGFydE1lc3NhZ2VJZCwgaW50IGVuZE1lc3NhZ2VJZCk7CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIHJlY2VwdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCAoU01TLUNCKSBtZXNzYWdlcyB3aXRoIHRoZSBnaXZlbgorICAgICAqIG1lc3NhZ2UgaWRlbnRpZmllciByYW5nZS4gTm90ZSB0aGF0IGlmIHR3byBkaWZmZXJlbnQgY2xpZW50cyBlbmFibGUKKyAgICAgKiBhIG1lc3NhZ2UgaWRlbnRpZmllciByYW5nZSwgdGhleSBtdXN0IGJvdGggZGlzYWJsZSBpdCBmb3IgdGhlIGRldmljZQorICAgICAqIHRvIHN0b3AgcmVjZWl2aW5nIHRob3NlIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0TWVzc2FnZUlkIGZpcnN0IG1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHBhcmFtIGVuZE1lc3NhZ2VJZCBsYXN0IG1lc3NhZ2UgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gVFMgMjMuMDQxCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqCisgICAgICogQHNlZSAjZW5hYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCwgaW50KQorICAgICAqLworICAgIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShpbnQgc3RhcnRNZXNzYWdlSWQsIGludCBlbmRNZXNzYWdlSWQpOworCiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0lUZWxlcGhvbnkuYWlkbAppbmRleCBkYTIzM2NjLi4xOTQ0MWNkIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSVRlbGVwaG9ueS5haWRsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JVGVsZXBob255LmFpZGwKQEAgLTE0NSw2ICsxNDUsMTUgQEAKICAgICBib29sZWFuIHN1cHBseVBpbihTdHJpbmcgcGluKTsKIAogICAgIC8qKgorICAgICAqIFN1cHBseSBwdWsgdG8gdW5sb2NrIHRoZSBTSU0gYW5kIHNldCBTSU0gcGluIHRvIG5ldyBwaW4uCisgICAgICogIEJsb2NrcyB1bnRpbCBhIHJlc3VsdCBpcyBkZXRlcm1pbmVkLgorICAgICAqIEBwYXJhbSBwdWsgVGhlIHB1ayB0byBjaGVjay4KKyAgICAgKiAgICAgICAgcGluIFRoZSBuZXcgcGluIHRvIGJlIHNldCBpbiBTSU0KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgYSBzdWNjZXNzLgorICAgICAqLworICAgIGJvb2xlYW4gc3VwcGx5UHVrKFN0cmluZyBwdWssIFN0cmluZyBwaW4pOworCisgICAgLyoqCiAgICAgICogSGFuZGxlcyBQSU4gTU1JIGNvbW1hbmRzIChQSU4vUElOMi9QVUsvUFVLMiksIHdoaWNoIGFyZSBpbml0aWF0ZWQKICAgICAgKiB3aXRob3V0IFNFTkQgKHNvIDxjb2RlPmRpYWw8L2NvZGU+IGlzIG5vdCBhcHByb3ByaWF0ZSkuCiAgICAgICoKQEAgLTI1NCw3ICsyNjMsNyBAQAogICAgICAgKiBSZXR1cm5zIHRoZSBuZXR3b3JrIHR5cGUKICAgICAgICovCiAgICAgaW50IGdldE5ldHdvcmtUeXBlKCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBhbiBJQ0MgY2FyZCBpcyBwcmVzZW50CiAgICAgICovCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmQuamF2YQppbmRleCBhNTE2YjQ5Li4wMjYxN2M4IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZC5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkLmphdmEKQEAgLTg0LDYgKzg0LDkgQEAKICAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBJTlRFTlRfVkFMVUVfTE9DS0VEX09OX1BVSyA9ICJQVUsiOwogICAgIC8qIE5FVFdPUksgbWVhbnMgSUNDIGlzIGxvY2tlZCBvbiBORVRXT1JLIFBFUlNPTkFMSVpBVElPTiAqLwogICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIElOVEVOVF9WQUxVRV9MT0NLRURfTkVUV09SSyA9ICJORVRXT1JLIjsKKyAgICAvKiBQRVJNX0RJU0FCTEVEIG1lYW5zIElDQyBpcyBwZXJtYW5lbnRseSBkaXNhYmxlZCBkdWUgdG8gcHVrIGZhaWxzICovCisgICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgSU5URU5UX1ZBTFVFX0FCU0VOVF9PTl9QRVJNX0RJU0FCTEVEID0gIlBFUk1fRElTQUJMRUQiOworCiAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9JQ0NfTE9DS0VEX09SX0FCU0VOVCA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9JQ0NfU1RBVFVTX0RPTkUgPSAyOwpAQCAtMTEyLDcgKzExNSw4IEBACiAgICAgICAgIFBVS19SRVFVSVJFRCwKICAgICAgICAgTkVUV09SS19MT0NLRUQsCiAgICAgICAgIFJFQURZLAotICAgICAgICBOT1RfUkVBRFk7CisgICAgICAgIE5PVF9SRUFEWSwKKyAgICAgICAgUEVSTV9ESVNBQkxFRDsKIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1BpbkxvY2tlZCgpIHsKICAgICAgICAgICAgIHJldHVybiAoKHRoaXMgPT0gUElOX1JFUVVJUkVEKSB8fCAodGhpcyA9PSBQVUtfUkVRVUlSRUQpKTsKQEAgLTEyMCw3ICsxMjQsOCBAQAogCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGljY0NhcmRFeGlzdCgpIHsKICAgICAgICAgICAgIHJldHVybiAoKHRoaXMgPT0gUElOX1JFUVVJUkVEKSB8fCAodGhpcyA9PSBQVUtfUkVRVUlSRUQpCi0gICAgICAgICAgICAgICAgICAgIHx8ICh0aGlzID09IE5FVFdPUktfTE9DS0VEKSB8fCAodGhpcyA9PSBSRUFEWSkpOworICAgICAgICAgICAgICAgICAgICB8fCAodGhpcyA9PSBORVRXT1JLX0xPQ0tFRCkgfHwgKHRoaXMgPT0gUkVBRFkpCisgICAgICAgICAgICAgICAgICAgIHx8ICh0aGlzID09IFBFUk1fRElTQUJMRUQpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDE2LDYgKzQyMSw3IEBACiAgICAgICAgIGJvb2xlYW4gdHJhbnNpdGlvbmVkSW50b1BpbkxvY2tlZDsKICAgICAgICAgYm9vbGVhbiB0cmFuc2l0aW9uZWRJbnRvQWJzZW50OwogICAgICAgICBib29sZWFuIHRyYW5zaXRpb25lZEludG9OZXR3b3JrTG9ja2VkOworICAgICAgICBib29sZWFuIHRyYW5zaXRpb25lZEludG9QZXJtQmxvY2tlZDsKICAgICAgICAgYm9vbGVhbiBpc0ljY0NhcmRSZW1vdmVkOwogICAgICAgICBib29sZWFuIGlzSWNjQ2FyZEFkZGVkOwogCkBAIC00MzQsNiArNDQwLDggQEAKICAgICAgICAgdHJhbnNpdGlvbmVkSW50b0Fic2VudCA9IChvbGRTdGF0ZSAhPSBTdGF0ZS5BQlNFTlQgJiYgbmV3U3RhdGUgPT0gU3RhdGUuQUJTRU5UKTsKICAgICAgICAgdHJhbnNpdGlvbmVkSW50b05ldHdvcmtMb2NrZWQgPSAob2xkU3RhdGUgIT0gU3RhdGUuTkVUV09SS19MT0NLRUQKICAgICAgICAgICAgICAgICAmJiBuZXdTdGF0ZSA9PSBTdGF0ZS5ORVRXT1JLX0xPQ0tFRCk7CisgICAgICAgIHRyYW5zaXRpb25lZEludG9QZXJtQmxvY2tlZCA9IChvbGRTdGF0ZSAhPSBTdGF0ZS5QRVJNX0RJU0FCTEVECisgICAgICAgICAgICAgICAgJiYgbmV3U3RhdGUgPT0gU3RhdGUuUEVSTV9ESVNBQkxFRCk7CiAgICAgICAgIGlzSWNjQ2FyZFJlbW92ZWQgPSAob2xkU3RhdGUgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgb2xkU3RhdGUuaWNjQ2FyZEV4aXN0KCkgJiYgbmV3U3RhdGUgPT0gU3RhdGUuQUJTRU5UKTsKICAgICAgICAgaXNJY2NDYXJkQWRkZWQgPSAob2xkU3RhdGUgPT0gU3RhdGUuQUJTRU5UICYmCkBAIC00NTQsNiArNDYyLDEwIEBACiAgICAgICAgICAgICBtTmV0d29ya0xvY2tlZFJlZ2lzdHJhbnRzLm5vdGlmeVJlZ2lzdHJhbnRzKCk7CiAgICAgICAgICAgICBicm9hZGNhc3RJY2NTdGF0ZUNoYW5nZWRJbnRlbnQoSU5URU5UX1ZBTFVFX0lDQ19MT0NLRUQsCiAgICAgICAgICAgICAgICAgICBJTlRFTlRfVkFMVUVfTE9DS0VEX05FVFdPUkspOworICAgICAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb25lZEludG9QZXJtQmxvY2tlZCkgeworICAgICAgICAgICAgaWYgKG1EYmcpIGxvZygiTm90aWZ5IFNJTSBwZXJtYW5lbnRseSBkaXNhYmxlZC4iKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdEljY1N0YXRlQ2hhbmdlZEludGVudChJTlRFTlRfVkFMVUVfSUNDX0FCU0VOVCwKKyAgICAgICAgICAgICAgICAgICAgSU5URU5UX1ZBTFVFX0FCU0VOVF9PTl9QRVJNX0RJU0FCTEVEKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc0ljY0NhcmRSZW1vdmVkKSB7CkBAIC03MjIsNTIgKzczNCw5MSBAQAogICAgICAgICAgICAgY3VycmVudFJhZGlvU3RhdGUgPT0gUmFkaW9TdGF0ZS5SVUlNX1JFQURZIHx8CiAgICAgICAgICAgICAoY3VycmVudFJhZGlvU3RhdGUgPT0gUmFkaW9TdGF0ZS5OVl9SRUFEWSAmJgogICAgICAgICAgICAgICAgICAgICAobVBob25lLmdldEx0ZU9uQ2RtYU1vZGUoKSA9PSBQaG9uZS5MVEVfT05fQ0RNQV9UUlVFKSkpIHsKLSAgICAgICAgICAgIGludCBpbmRleDsKKworICAgICAgICAgICAgU3RhdGUgY3NpbVN0YXRlID0KKyAgICAgICAgICAgICAgICBnZXRBcHBTdGF0ZShtSWNjQ2FyZFN0YXR1cy5nZXRDZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXgoKSk7CisgICAgICAgICAgICBTdGF0ZSB1c2ltU3RhdGUgPQorICAgICAgICAgICAgICAgIGdldEFwcFN0YXRlKG1JY2NDYXJkU3RhdHVzLmdldEdzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleCgpKTsKKworICAgICAgICAgICAgaWYobURiZykgbG9nKCJVU0lNPSIgKyB1c2ltU3RhdGUgKyAiIENTSU09IiArIGNzaW1TdGF0ZSk7CisKKyAgICAgICAgICAgIGlmIChtUGhvbmUuZ2V0THRlT25DZG1hTW9kZSgpID09IFBob25lLkxURV9PTl9DRE1BX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAvLyBVSUNDIGNhcmQgY29udGFpbnMgYm90aCBVU0lNIGFuZCBDU0lNCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGNvbnNvbGlkYXRlZCBzdGF0dXMKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29uc29saWRhdGVkU3RhdGUoY3NpbVN0YXRlLCB1c2ltU3RhdGUsIGNzaW1TdGF0ZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBDRE1BIHJhZGlvIHRlY2hub2xvZ3kKICAgICAgICAgICAgIGlmIChjdXJyZW50UmFkaW9TdGF0ZSA9PSBSYWRpb1N0YXRlLlJVSU1fTE9DS0VEX09SX0FCU0VOVCB8fAogICAgICAgICAgICAgICAgIGN1cnJlbnRSYWRpb1N0YXRlID09IFJhZGlvU3RhdGUuUlVJTV9SRUFEWSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUljY0NhcmRTdGF0dXMuZ2V0Q2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNzaW1TdGF0ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUljY0NhcmRTdGF0dXMuZ2V0R3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEljY0NhcmRBcHBsaWNhdGlvbiBhcHA7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IEljY0NhcmRTdGF0dXMuQ0FSRF9NQVhfQVBQUykgewotICAgICAgICAgICAgICAgIGFwcCA9IG1JY2NDYXJkU3RhdHVzLmdldEFwcGxpY2F0aW9uKGluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIltJY2NDYXJkXSBJbnZhbGlkIFN1YnNjcmlwdGlvbiBBcHBsaWNhdGlvbiBpbmRleDoiICsgaW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLkFCU0VOVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFwcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUobUxvZ1RhZywgIltJY2NDYXJkXSBTdWJzY3JpcHRpb24gQXBwbGljYXRpb24gaW4gbm90IHByZXNlbnQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGNoZWNrIGlmIFBJTiByZXF1aXJlZAotICAgICAgICAgICAgaWYgKGFwcC5hcHBfc3RhdGUuaXNQaW5SZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUElOX1JFUVVJUkVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFwcC5hcHBfc3RhdGUuaXNQdWtSZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUFVLX1JFUVVJUkVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFwcC5hcHBfc3RhdGUuaXNTdWJzY3JpcHRpb25QZXJzb0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLk5FVFdPUktfTE9DS0VEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFwcC5hcHBfc3RhdGUuaXNBcHBSZWFkeSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUkVBRFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXBwLmFwcF9zdGF0ZS5pc0FwcE5vdFJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5OT1RfUkVBRFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5OT1RfUkVBRFk7CisgICAgICAgICAgICByZXR1cm4gdXNpbVN0YXRlOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuQUJTRU5UOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RhdGUgZ2V0QXBwU3RhdGUoaW50IGFwcEluZGV4KSB7CisgICAgICAgIEljY0NhcmRBcHBsaWNhdGlvbiBhcHA7CisgICAgICAgIGlmIChhcHBJbmRleCA+PSAwICYmIGFwcEluZGV4IDwgSWNjQ2FyZFN0YXR1cy5DQVJEX01BWF9BUFBTKSB7CisgICAgICAgICAgICBhcHAgPSBtSWNjQ2FyZFN0YXR1cy5nZXRBcHBsaWNhdGlvbihhcHBJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMb2cuZShtTG9nVGFnLCAiW0ljY0NhcmRdIEludmFsaWQgU3Vic2NyaXB0aW9uIEFwcGxpY2F0aW9uIGluZGV4OiIgKyBhcHBJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXBwID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKG1Mb2dUYWcsICJbSWNjQ2FyZF0gU3Vic2NyaXB0aW9uIEFwcGxpY2F0aW9uIGluIG5vdCBwcmVzZW50Iik7CisgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiBQSU4gcmVxdWlyZWQKKyAgICAgICAgaWYgKGFwcC5waW4xLmlzUGVybUJsb2NrZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuUEVSTV9ESVNBQkxFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwLmFwcF9zdGF0ZS5pc1BpblJlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLlBJTl9SRVFVSVJFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwLmFwcF9zdGF0ZS5pc1B1a1JlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLlBVS19SRVFVSVJFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwLmFwcF9zdGF0ZS5pc1N1YnNjcmlwdGlvblBlcnNvRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gSWNjQ2FyZC5TdGF0ZS5ORVRXT1JLX0xPQ0tFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwLmFwcF9zdGF0ZS5pc0FwcFJlYWR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLlJFQURZOworICAgICAgICB9CisgICAgICAgIGlmIChhcHAuYXBwX3N0YXRlLmlzQXBwTm90UmVhZHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuTk9UX1JFQURZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJY2NDYXJkLlN0YXRlLk5PVF9SRUFEWTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0YXRlIGdldENvbnNvbGlkYXRlZFN0YXRlKFN0YXRlIGxlZnQsIFN0YXRlIHJpZ2h0LCBTdGF0ZSBwcmVmZXJyZWRTdGF0ZSkgeworICAgICAgICAvLyBDaGVjayBpZiBlaXRoZXIgaXMgYWJzZW50LgorICAgICAgICBpZiAocmlnaHQgPT0gSWNjQ2FyZC5TdGF0ZS5BQlNFTlQpIHJldHVybiBsZWZ0OworICAgICAgICBpZiAobGVmdCA9PSBJY2NDYXJkLlN0YXRlLkFCU0VOVCkgcmV0dXJuIHJpZ2h0OworCisgICAgICAgIC8vIE9ubHkgaWYgYm90aCBhcmUgcmVhZHksIHJldHVybiByZWFkeQorICAgICAgICBpZiAoKGxlZnQgPT0gSWNjQ2FyZC5TdGF0ZS5SRUFEWSkgJiYgKHJpZ2h0ID09IEljY0NhcmQuU3RhdGUuUkVBRFkpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdGUuUkVBRFk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDYXNlIG9uZSBpcyByZWFkeSwgYnV0IHRoZSBvdGhlciBpcyBub3QuCisgICAgICAgIGlmICgoKHJpZ2h0ID09IEljY0NhcmQuU3RhdGUuTk9UX1JFQURZKSAmJiAobGVmdCA9PSBJY2NDYXJkLlN0YXRlLlJFQURZKSkgfHwKKyAgICAgICAgICAgICgobGVmdCA9PSBJY2NDYXJkLlN0YXRlLk5PVF9SRUFEWSkgJiYgKHJpZ2h0ID09IEljY0NhcmQuU3RhdGUuUkVBRFkpKSkgeworICAgICAgICAgICAgcmV0dXJuIEljY0NhcmQuU3RhdGUuTk9UX1JFQURZOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIG90aGVyIHN0YXRlIGlzIGFzc3VtZWQgdG8gYmUgb25lIG9mIGxvY2tlZCBzdGF0ZQorICAgICAgICBpZiAocmlnaHQgPT0gSWNjQ2FyZC5TdGF0ZS5OT1RfUkVBRFkpIHJldHVybiBsZWZ0OworICAgICAgICBpZiAobGVmdCA9PSBJY2NDYXJkLlN0YXRlLk5PVF9SRUFEWSkgcmV0dXJuIHJpZ2h0OworCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIEZXIGN1cnJlbnRseSBqdXN0IGFzc3VtZXMgdGhlIHN0YXR1cyB3aWxsIGJlCisgICAgICAgIC8vIGNvbnNpc3RlbnQgYWNyb3NzIHRoZSBhcHBsaWNhdGlvbnMuLi4KKyAgICAgICAgcmV0dXJuIHByZWZlcnJlZFN0YXRlOworICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25PbkljYyhJY2NDYXJkQXBwbGljYXRpb24uQXBwVHlwZSB0eXBlKSB7CiAgICAgICAgIGlmIChtSWNjQ2FyZFN0YXR1cyA9PSBudWxsKSByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZEFwcGxpY2F0aW9uLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZEFwcGxpY2F0aW9uLmphdmEKaW5kZXggNGNmMjFlZS4uYWJiNzQwZSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmRBcHBsaWNhdGlvbi5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkQXBwbGljYXRpb24uamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueTsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NDYXJkU3RhdHVzLlBpblN0YXRlOworCiAKIC8qKgogICogU2VlIGFsc28gUklMX0FwcFN0YXR1cyBpbiBpbmNsdWRlL3RlbGVwaG9ueS9yaWwuaApAQCAtMTA0LDggKzEwNiw4IEBACiAgICAgcHVibGljIFN0cmluZyAgICAgICAgIGFwcF9sYWJlbDsKICAgICAvLyBhcHBsaWNhYmxlIHRvIFVTSU0gYW5kIENTSU0KICAgICBwdWJsaWMgaW50ICAgICAgICAgICAgcGluMV9yZXBsYWNlZDsKLSAgICBwdWJsaWMgaW50ICAgICAgICAgICAgcGluMTsKLSAgICBwdWJsaWMgaW50ICAgICAgICAgICAgcGluMjsKKyAgICBwdWJsaWMgUGluU3RhdGUgICAgICAgICAgICBwaW4xOworICAgIHB1YmxpYyBQaW5TdGF0ZSAgICAgICAgICAgIHBpbjI7CiAKICAgICBBcHBUeXBlIEFwcFR5cGVGcm9tUklMSW50KGludCB0eXBlKSB7CiAgICAgICAgIEFwcFR5cGUgbmV3VHlwZTsKQEAgLTE3Nyw0ICsxNzksNDggQEAKICAgICAgICAgcmV0dXJuIG5ld1N1YlN0YXRlOwogICAgIH0KIAorICAgIFBpblN0YXRlIFBpblN0YXRlRnJvbVJJTEludChpbnQgc3RhdGUpIHsKKyAgICAgICAgUGluU3RhdGUgbmV3UGluU3RhdGU7CisgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG5ld1BpblN0YXRlID0gUGluU3RhdGUuUElOU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBuZXdQaW5TdGF0ZSA9IFBpblN0YXRlLlBJTlNUQVRFX0VOQUJMRURfTk9UX1ZFUklGSUVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIG5ld1BpblN0YXRlID0gUGluU3RhdGUuUElOU1RBVEVfRU5BQkxFRF9WRVJJRklFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBuZXdQaW5TdGF0ZSA9IFBpblN0YXRlLlBJTlNUQVRFX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIG5ld1BpblN0YXRlID0gUGluU3RhdGUuUElOU1RBVEVfRU5BQkxFRF9CTE9DS0VEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIG5ld1BpblN0YXRlID0gUGluU3RhdGUuUElOU1RBVEVfRU5BQkxFRF9QRVJNX0JMT0NLRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgUklMX1BpblN0YXRlOiAiICsgc3RhdGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXdQaW5TdGF0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoInsiKS5hcHBlbmQoYXBwX3R5cGUpLmFwcGVuZCgiLCIpLmFwcGVuZChhcHBfc3RhdGUpOworICAgICAgICBpZiAoYXBwX3N0YXRlID09IEFwcFN0YXRlLkFQUFNUQVRFX1NVQlNDUklQVElPTl9QRVJTTykgeworICAgICAgICAgICAgc2IuYXBwZW5kKCIsIikuYXBwZW5kKHBlcnNvX3N1YnN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwX3R5cGUgPT0gQXBwVHlwZS5BUFBUWVBFX0NTSU0gfHwKKyAgICAgICAgICAgICAgICBhcHBfdHlwZSA9PSBBcHBUeXBlLkFQUFRZUEVfVVNJTSB8fAorICAgICAgICAgICAgICAgIGFwcF90eXBlID09IEFwcFR5cGUuQVBQVFlQRV9JU0lNKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIixwaW4xPSIpLmFwcGVuZChwaW4xKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLHBpbjI9IikuYXBwZW5kKHBpbjIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgifSIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZFN0YXR1cy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NhcmRTdGF0dXMuamF2YQppbmRleCA3MTk5NjE2Li5jNzUxYTIxIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ2FyZFN0YXR1cy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDYXJkU3RhdHVzLmphdmEKQEAgLTQyLDcgKzQyLDE5IEBACiAgICAgICAgIFBJTlNUQVRFX0VOQUJMRURfVkVSSUZJRUQsCiAgICAgICAgIFBJTlNUQVRFX0RJU0FCTEVELAogICAgICAgICBQSU5TVEFURV9FTkFCTEVEX0JMT0NLRUQsCi0gICAgICAgIFBJTlNUQVRFX0VOQUJMRURfUEVSTV9CTE9DS0VECisgICAgICAgIFBJTlNUQVRFX0VOQUJMRURfUEVSTV9CTE9DS0VEOworCisgICAgICAgIGJvb2xlYW4gaXNQZXJtQmxvY2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IFBJTlNUQVRFX0VOQUJMRURfUEVSTV9CTE9DS0VEOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc1BpblJlcXVpcmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMgPT0gUElOU1RBVEVfRU5BQkxFRF9OT1RfVkVSSUZJRUQ7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzUHVrUmVxdWlyZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBQSU5TVEFURV9FTkFCTEVEX0JMT0NLRUQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIENhcmRTdGF0ZSAgbUNhcmRTdGF0ZTsKQEAgLTE0NCw0ICsxNTYsMzMgQEAKICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbnMuZ2V0KGluZGV4KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBJY2NDYXJkQXBwbGljYXRpb24gYXBwOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoIkljY0NhcmRTdGF0ZSB7IikuYXBwZW5kKG1DYXJkU3RhdGUpLmFwcGVuZCgiLCIpCisgICAgICAgIC5hcHBlbmQobVVuaXZlcnNhbFBpblN0YXRlKQorICAgICAgICAuYXBwZW5kKCIsbnVtX2FwcHM9IikuYXBwZW5kKG1OdW1BcHBsaWNhdGlvbnMpCisgICAgICAgIC5hcHBlbmQoIixnc21faWQ9IikuYXBwZW5kKG1Hc21VbXRzU3Vic2NyaXB0aW9uQXBwSW5kZXgpOworICAgICAgICBpZiAobUdzbVVtdHNTdWJzY3JpcHRpb25BcHBJbmRleCA+PTAKKyAgICAgICAgICAgICAgICAmJiBtR3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4IDxDQVJEX01BWF9BUFBTKSB7CisgICAgICAgICAgICBhcHAgPSBnZXRBcHBsaWNhdGlvbihtR3NtVW10c1N1YnNjcmlwdGlvbkFwcEluZGV4KTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChhcHAgPT0gbnVsbCA/ICJudWxsIiA6IGFwcCk7CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIixjbWRhX2lkPSIpLmFwcGVuZChtQ2RtYVN1YnNjcmlwdGlvbkFwcEluZGV4KTsKKyAgICAgICAgaWYgKG1DZG1hU3Vic2NyaXB0aW9uQXBwSW5kZXggPj0wCisgICAgICAgICAgICAgICAgJiYgbUNkbWFTdWJzY3JpcHRpb25BcHBJbmRleCA8Q0FSRF9NQVhfQVBQUykgeworICAgICAgICAgICAgYXBwID0gZ2V0QXBwbGljYXRpb24obUNkbWFTdWJzY3JpcHRpb25BcHBJbmRleCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoYXBwID09IG51bGwgPyAibnVsbCIgOiBhcHApOworICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCIsaXNtX2lkPSIpLmFwcGVuZChtSW1zU3Vic2NyaXB0aW9uQXBwSW5kZXgpOworCisgICAgICAgIHNiLmFwcGVuZCgifSIpOworCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NvbnN0YW50cy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0NvbnN0YW50cy5qYXZhCmluZGV4IGI0MGY5NDUuLjFiYTZkZmUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NDb25zdGFudHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjQ29uc3RhbnRzLmphdmEKQEAgLTU4LDYgKzU4LDE2IEBACiAgICAgc3RhdGljIGZpbmFsIGludCBFRl9DU1QgPSAweDZmMzI7CiAgICAgc3RhdGljIGZpbmFsIGludCBFRl9SVUlNX1NQTiA9MHg2RjQxOwogCisgICAgLy8gRVRTSSBUUy4xMDIuMjIxCisgICAgc3RhdGljIGZpbmFsIGludCBFRl9QTCA9IDB4MkYwNTsKKyAgICAvLyAzR1BQMiBDLlMwMDY1CisgICAgc3RhdGljIGZpbmFsIGludCBFRl9DU0lNX0xJID0gMHg2RjNBOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfQ1NJTV9TUE4gPTB4NkY0MTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVGX0NTSU1fTUROID0gMHg2RjQ0OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfQ1NJTV9JTVNJTSA9IDB4NkYyMjsKKyAgICBzdGF0aWMgZmluYWwgaW50IEVGX0NTSU1fQ0RNQUhPTUUgPSAweDZGMjg7CisgICAgc3RhdGljIGZpbmFsIGludCBFRl9DU0lNX0VQUkwgPSAweDZGNUE7CisKICAgICAvL0lTSU0gYWNjZXNzCiAgICAgc3RhdGljIGZpbmFsIGludCBFRl9JTVBVID0gMHg2ZjA0OwogICAgIHN0YXRpYyBmaW5hbCBpbnQgRUZfSU1QSSA9IDB4NmYwMjsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NGaWxlSGFuZGxlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEKaW5kZXggOTJkZGQyYy4uOTNiOWI3OSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY0ZpbGVIYW5kbGVyLmphdmEKQEAgLTUyOSw2ICs1MjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIE1GX1NJTSArIERGX1RFTEVDT007CiAKICAgICAgICAgY2FzZSBFRl9JQ0NJRDoKKyAgICAgICAgY2FzZSBFRl9QTDoKICAgICAgICAgICAgIHJldHVybiBNRl9TSU07CiAgICAgICAgIGNhc2UgRUZfSU1HOgogICAgICAgICAgICAgcmV0dXJuIE1GX1NJTSArIERGX1RFTEVDT00gKyBERl9HUkFQSElDUzsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDJmMjJkNzQuLjQ1NTYyY2EgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NQaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Bob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIAogLyoqCiAgKiBTaW1QaG9uZUJvb2tJbnRlcmZhY2VNYW5hZ2VyIHRvIHByb3ZpZGUgYW4gaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIHRvCkBAIC02MywxNCArNjQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdG90YWwgIiArIHJlY29yZFNpemVbMV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAjcmVjb3JkICIgKyByZWNvcmRTaXplWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLm5vdGlmeUFsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UGVuZGluZyhhcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfRE9ORToKICAgICAgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpIG1zZy5vYmo7CiAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAoYXIuZXhjZXB0aW9uID09IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlQZW5kaW5nKGFyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX0xPQURfRE9ORToKQEAgLTg0LDExICs4NSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlQZW5kaW5nKGFyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBub3RpZnlQZW5kaW5nKEFzeW5jUmVzdWx0IGFyKSB7CisgICAgICAgICAgICBpZiAoYXIudXNlck9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXRvbWljQm9vbGVhbiBzdGF0dXMgPSAoQXRvbWljQm9vbGVhbikgYXIudXNlck9iajsKKyAgICAgICAgICAgIHN0YXR1cy5zZXQodHJ1ZSk7CisgICAgICAgICAgICBtTG9jay5ub3RpZnlBbGwoKTsKKyAgICAgICAgfQogICAgIH07CiAKICAgICBwdWJsaWMgSWNjUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcihQaG9uZUJhc2UgcGhvbmUpIHsKQEAgLTE1MCwxNSArMTYwLDEyIEBACiAgICAgICAgIHN5bmNocm9uaXplZChtTG9jaykgewogICAgICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9VUERBVEVfRE9ORSk7CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9VUERBVEVfRE9ORSwgc3RhdHVzKTsKICAgICAgICAgICAgIEFkblJlY29yZCBvbGRBZG4gPSBuZXcgQWRuUmVjb3JkKG9sZFRhZywgb2xkUGhvbmVOdW1iZXIpOwogICAgICAgICAgICAgQWRuUmVjb3JkIG5ld0FkbiA9IG5ldyBBZG5SZWNvcmQobmV3VGFnLCBuZXdQaG9uZU51bWJlcik7CiAgICAgICAgICAgICBhZG5DYWNoZS51cGRhdGVBZG5CeVNlYXJjaChlZmlkLCBvbGRBZG4sIG5ld0FkbiwgcGluMiwgcmVzcG9uc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZCgiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSBieSBzZWFyY2giKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhaXRGb3JSZXN1bHQoc3RhdHVzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VjY2VzczsKICAgICB9CkBAIC0xOTcsMTQgKzIwNCwxMSBAQAogICAgICAgICBzeW5jaHJvbml6ZWQobUxvY2spIHsKICAgICAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gbUJhc2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfVVBEQVRFX0RPTkUpOworICAgICAgICAgICAgQXRvbWljQm9vbGVhbiBzdGF0dXMgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gbUJhc2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfVVBEQVRFX0RPTkUsIHN0YXR1cyk7CiAgICAgICAgICAgICBBZG5SZWNvcmQgbmV3QWRuID0gbmV3IEFkblJlY29yZChuZXdUYWcsIG5ld1Bob25lTnVtYmVyKTsKICAgICAgICAgICAgIGFkbkNhY2hlLnVwZGF0ZUFkbkJ5SW5kZXgoZWZpZCwgbmV3QWRuLCBpbmRleCwgcGluMiwgcmVzcG9uc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZCgiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIHVwZGF0ZSBieSBpbmRleCIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgd2FpdEZvclJlc3VsdChzdGF0dXMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdWNjZXNzOwogICAgIH0KQEAgLTI0MywxNSArMjQ3LDEyIEBACiAKICAgICAgICAgc3luY2hyb25pemVkKG1Mb2NrKSB7CiAgICAgICAgICAgICBjaGVja1RocmVhZCgpOwotICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1CYXNlSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0xPQURfRE9ORSk7CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9MT0FEX0RPTkUsIHN0YXR1cyk7CiAgICAgICAgICAgICBhZG5DYWNoZS5yZXF1ZXN0TG9hZEFsbEFkbkxpa2UoZWZpZCwgYWRuQ2FjaGUuZXh0ZW5zaW9uRWZGb3JFZihlZmlkKSwgcmVzcG9uc2UpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTG9jay53YWl0KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbG9nZCgiaW50ZXJydXB0ZWQgd2hpbGUgdHJ5aW5nIHRvIGxvYWQgZnJvbSB0aGUgU0lNIik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB3YWl0Rm9yUmVzdWx0KHN0YXR1cyk7CiAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZWNvcmRzOworICAgICAgICByZXR1cm4gcmVjb3JkczsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja1RocmVhZCgpIHsKQEAgLTI2NSw2ICsyNjYsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JSZXN1bHQoQXRvbWljQm9vbGVhbiBzdGF0dXMpIHsKKyAgICAgICAgd2hpbGUgKCFzdGF0dXMuZ2V0KCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbUxvY2sud2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2QoImludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byB1cGRhdGUgYnkgc2VhcmNoIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIGludCB1cGRhdGVFZkZvckljY1R5cGUoaW50IGVmaWQpIHsKICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHRyeWluZyB0byByZWFkIEFETiByZWNvcmRzCiAgICAgICAgIGlmIChlZmlkID09IEljY0NvbnN0YW50cy5FRl9BRE4pIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NSZWNvcmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjUmVjb3Jkcy5qYXZhCmluZGV4IDEwYTNiNjkuLjNhMjc5MDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NSZWNvcmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1JlY29yZHMuamF2YQpAQCAtMjg4LDYgKzI4OCwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3ZXRoZXIgU0lNIGlzIGluIHByb3Zpc2lvbmVkIHN0YXRlIG9yIG5vdC4KKyAgICAgKiBPdmVycmlkZGVuIG9ubHkgaWYgU0lNIGNhbiBiZSBkeW5hbWljYWxseSBwcm92aXNpb25lZCB2aWEgT1RBLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHByb3Zpc2lvbmVkCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aXNpb25lZCAoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIFdyaXRlIHN0cmluZyB0byBsb2cgZmlsZQogICAgICAqCiAgICAgICogQHBhcmFtIHMgaXMgdGhlIHN0cmluZyB0byB3cml0ZQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKaW5kZXggNWZlZjZkZS4uOTc2MzI2NSAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZW5kVGV4dChTdHJpbmcgZGVzdEFkZHIsIFN0cmluZyBzY0FkZHIsCiAgICAgICAgICAgICBTdHJpbmcgdGV4dCwgUGVuZGluZ0ludGVudCBzZW50SW50ZW50LCBQZW5kaW5nSW50ZW50IGRlbGl2ZXJ5SW50ZW50KSB7Ci0gICAgICAgIG1QaG9uZS5nZXRDb250ZXh0KCkuZW5mb3JjZUNhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICBtUGhvbmUuZ2V0Q29udGV4dCgpLmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLlNFTkRfU01TIiwKICAgICAgICAgICAgICAgICAiU2VuZGluZyBTTVMgbWVzc2FnZSIpOwogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoIlNNUyIsIExvZy5WRVJCT1NFKSkgewpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXJQcm94eS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ljY1Ntc0ludGVyZmFjZU1hbmFnZXJQcm94eS5qYXZhCmluZGV4IDUwNDkyNDkuLjU0ZGU1MDggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NTbXNJbnRlcmZhY2VNYW5hZ2VyUHJveHkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjU21zSW50ZXJmYWNlTWFuYWdlclByb3h5LmphdmEKQEAgLTc2LDQgKzc2LDEzIEBACiAgICAgICAgIHJldHVybiBtSWNjU21zSW50ZXJmYWNlTWFuYWdlci5kaXNhYmxlQ2VsbEJyb2FkY2FzdChtZXNzYWdlSWRlbnRpZmllcik7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCBzdGFydE1lc3NhZ2VJZCwgaW50IGVuZE1lc3NhZ2VJZCkKKyAgICAgICAgICAgIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBtSWNjU21zSW50ZXJmYWNlTWFuYWdlci5lbmFibGVDZWxsQnJvYWRjYXN0UmFuZ2Uoc3RhcnRNZXNzYWdlSWQsIGVuZE1lc3NhZ2VJZCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShpbnQgc3RhcnRNZXNzYWdlSWQsIGludCBlbmRNZXNzYWdlSWQpCisgICAgICAgICAgICB0aHJvd3MgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbUljY1Ntc0ludGVyZmFjZU1hbmFnZXIuZGlzYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShzdGFydE1lc3NhZ2VJZCwgZW5kTWVzc2FnZUlkKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSWNjVXRpbHMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCmluZGV4IGMzYjBmZmMuLmE5NjZmNzYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JY2NVdGlscy5qYXZhCkBAIC02Myw2ICs2MywyOSBAQAogICAgICAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRGVjb2RlIGNkbWEgYnl0ZSBpbnRvIFN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZworICAgIGNkbWFCY2RUb1N0cmluZyhieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7CisKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgY291bnQgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IHY7CisgICAgICAgICAgICB2ID0gZGF0YVtpXSAmIDB4ZjsKKyAgICAgICAgICAgIGlmICh2ID4gOSkgIHYgPSAwOworICAgICAgICAgICAgcmV0LmFwcGVuZCgoY2hhcikoJzAnICsgdikpOworCisgICAgICAgICAgICBpZiAoKytjb3VudCA9PSBsZW5ndGgpIGJyZWFrOworCisgICAgICAgICAgICB2ID0gKGRhdGFbaV0gPj4gNCkgJiAweGY7CisgICAgICAgICAgICBpZiAodiA+IDkpICB2ID0gMDsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoKGNoYXIpKCcwJyArIHYpKTsKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC50b1N0cmluZygpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIERlY29kZXMgYSBHU00tc3R5bGUgQkNEIGJ5dGUsIHJldHVybmluZyBhbiBpbnQgcmFuZ2luZyBmcm9tIDAtOTkuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSW50UmFuZ2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSW50UmFuZ2VNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwYmM0NAotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9JbnRSYW5nZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQ2xpZW50cyBjYW4gZW5hYmxlIHJlY2VwdGlvbiBvZiBTTVMtQ0IgbWVzc2FnZXMgZm9yIHNwZWNpZmljIHJhbmdlcyBvZgorICogbWVzc2FnZSBpZGVudGlmaWVycyAoY2hhbm5lbHMpLiBUaGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50bHkKKyAqIGVuYWJsZWQgbWVzc2FnZSBpZGVudGlmaWVycyBhbmQgY2FsbHMgYWJzdHJhY3QgbWV0aG9kcyB0byB1cGRhdGUgdGhlCisgKiByYWRpbyB3aGVuIHRoZSByYW5nZSBvZiBlbmFibGVkIG1lc3NhZ2UgaWRlbnRpZmllcnMgY2hhbmdlcy4KKyAqCisgKiBBbiB1cGRhdGUgaXMgYSBjYWxsIHRvIHtAbGluayAjc3RhcnRVcGRhdGV9IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZQorICogY2FsbHMgdG8ge0BsaW5rICNhZGRSYW5nZX0gZm9sbG93ZWQgYnkgYSBjYWxsIHRvIHtAbGluayAjZmluaXNoVXBkYXRlfS4KKyAqIENhbGxzIHRvIHtAbGluayAjZW5hYmxlUmFuZ2V9IGFuZCB7QGxpbmsgI2Rpc2FibGVSYW5nZX0gd2lsbCBwZXJmb3JtCisgKiBhbiBpbmNyZW1lbnRhbCB1cGRhdGUgb3BlcmF0aW9uIGlmIHRoZSBlbmFibGVkIHJhbmdlcyBoYXZlIGNoYW5nZWQuCisgKiBBIGZ1bGwgdXBkYXRlIG9wZXJhdGlvbiAoaS5lLiBhZnRlciBhIHJhZGlvIHJlc2V0KSBjYW4gYmUgcGVyZm9ybWVkCisgKiBieSBhIGNhbGwgdG8ge0BsaW5rICN1cGRhdGVSYW5nZXN9LgorICoKKyAqIENsaWVudHMgYXJlIGlkZW50aWZpZWQgYnkgU3RyaW5nICh0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgSUQKKyAqIG9mIHRoZSBjYWxsZXIpIHNvIHRoYXQgYSBjYWxsIHRvIHJlbW92ZSBhIHJhbmdlIGNhbiBiZSBtYXBwZWQgdG8gdGhlCisgKiBjbGllbnQgdGhhdCBlbmFibGVkIHRoYXQgcmFuZ2UgKG9yIGVsc2UgcmVqZWN0ZWQpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW50UmFuZ2VNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIEluaXRpYWwgY2FwYWNpdHkgZm9yIEludFJhbmdlIGNsaWVudHMgYXJyYXkgbGlzdC4gVGhlcmUgd2lsbCBiZQorICAgICAqIGZldyBjZWxsIGJyb2FkY2FzdCBsaXN0ZW5lcnMgb24gYSB0eXBpY2FsIGRldmljZSwgc28gdGhpcyBjYW4gYmUgc21hbGwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOSVRJQUxfQ0xJRU5UU19BUlJBWV9TSVpFID0gNDsKKworICAgIC8qKgorICAgICAqIE9uZSBvciBtb3JlIGNsaWVudHMgZm9ybWluZyB0aGUgY29udGludW91cyByYW5nZSBbc3RhcnRJZCwgZW5kSWRdLgorICAgICAqIDxwPldoZW4gYSBjbGllbnQgaXMgYWRkZWQsIHRoZSBJbnRSYW5nZSBtYXkgbWVyZ2Ugd2l0aCBvbmUgb3IgbW9yZQorICAgICAqIGFkamFjZW50IEludFJhbmdlcyB0byBmb3JtIGEgc2luZ2xlIGNvbWJpbmVkIEludFJhbmdlLgorICAgICAqIDxwPldoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCwgdGhlIEludFJhbmdlIG1heSBkaXZpZGUgaW50byBzZXZlcmFsCisgICAgICogbm9uLWNvbnRpZ3VvdXMgSW50UmFuZ2VzLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgSW50UmFuZ2UgeworICAgICAgICBpbnQgc3RhcnRJZDsKKyAgICAgICAgaW50IGVuZElkOworICAgICAgICAvLyBzb3J0ZWQgYnkgZWFybGllc3Qgc3RhcnQgaWQKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PENsaWVudFJhbmdlPiBjbGllbnRzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSW50UmFuZ2Ugd2l0aCBhIHNpbmdsZSBjbGllbnQuCisgICAgICAgICAqIEBwYXJhbSBzdGFydElkIHRoZSBmaXJzdCBpZCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICogQHBhcmFtIGVuZElkIHRoZSBsYXN0IGlkIGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSBjbGllbnQgcmVxdWVzdGluZyB0aGUgZW5hYmxlZCByYW5nZQorICAgICAgICAgKi8KKyAgICAgICAgSW50UmFuZ2UoaW50IHN0YXJ0SWQsIGludCBlbmRJZCwgU3RyaW5nIGNsaWVudCkgeworICAgICAgICAgICAgdGhpcy5zdGFydElkID0gc3RhcnRJZDsKKyAgICAgICAgICAgIHRoaXMuZW5kSWQgPSBlbmRJZDsKKyAgICAgICAgICAgIGNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJhbmdlPihJTklUSUFMX0NMSUVOVFNfQVJSQVlfU0laRSk7CisgICAgICAgICAgICBjbGllbnRzLmFkZChuZXcgQ2xpZW50UmFuZ2Uoc3RhcnRJZCwgZW5kSWQsIGNsaWVudCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBJbnRSYW5nZSBmb3IgYW4gZXhpc3RpbmcgQ2xpZW50UmFuZ2UuCisgICAgICAgICAqIEBwYXJhbSBjbGllbnRSYW5nZSB0aGUgaW5pdGlhbCBDbGllbnRSYW5nZSB0byBhZGQKKyAgICAgICAgICovCisgICAgICAgIEludFJhbmdlKENsaWVudFJhbmdlIGNsaWVudFJhbmdlKSB7CisgICAgICAgICAgICBzdGFydElkID0gY2xpZW50UmFuZ2Uuc3RhcnRJZDsKKyAgICAgICAgICAgIGVuZElkID0gY2xpZW50UmFuZ2UuZW5kSWQ7CisgICAgICAgICAgICBjbGllbnRzID0gbmV3IEFycmF5TGlzdDxDbGllbnRSYW5nZT4oSU5JVElBTF9DTElFTlRTX0FSUkFZX1NJWkUpOworICAgICAgICAgICAgY2xpZW50cy5hZGQoY2xpZW50UmFuZ2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBJbnRSYW5nZSBmcm9tIGFuIGV4aXN0aW5nIEludFJhbmdlLiBUaGlzIGlzIHVzZWQgZm9yCisgICAgICAgICAqIHJlbW92aW5nIGEgQ2xpZW50UmFuZ2UsIGJlY2F1c2UgbmV3IEludFJhbmdlcyBtYXkgbmVlZCB0byBiZSBjcmVhdGVkCisgICAgICAgICAqIGZvciBhbnkgZ2FwcyB0aGF0IG9wZW4gdXAgYWZ0ZXIgdGhlIENsaWVudFJhbmdlIGlzIHJlbW92ZWQuIEEgY29weQorICAgICAgICAgKiBpcyBtYWRlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgSW50UmFuZ2UgcHJlY2VkaW5nIHRoZSBlbGVtZW50CisgICAgICAgICAqIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZC4gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMKKyAgICAgICAgICogSW50UmFuZ2Ugb3IgdG8gYSBuZXcgSW50UmFuZ2Ugd2hlbiBhIGdhcCBpcyBmb3VuZC4KKyAgICAgICAgICogQHBhcmFtIGludFJhbmdlIHRoZSBvcmlnaW5hbCBJbnRSYW5nZSB0byBjb3B5IGVsZW1lbnRzIGZyb20KKyAgICAgICAgICogQHBhcmFtIG51bUVsZW1lbnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29weSBmcm9tIHRoZSBvcmlnaW5hbAorICAgICAgICAgKi8KKyAgICAgICAgSW50UmFuZ2UoSW50UmFuZ2UgaW50UmFuZ2UsIGludCBudW1FbGVtZW50cykgeworICAgICAgICAgICAgdGhpcy5zdGFydElkID0gaW50UmFuZ2Uuc3RhcnRJZDsKKyAgICAgICAgICAgIHRoaXMuZW5kSWQgPSBpbnRSYW5nZS5lbmRJZDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50cyA9IG5ldyBBcnJheUxpc3Q8Q2xpZW50UmFuZ2U+KGludFJhbmdlLmNsaWVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG51bUVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHMuYWRkKGludFJhbmdlLmNsaWVudHMuZ2V0KGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnNlcnQgbmV3IENsaWVudFJhbmdlIGluIG9yZGVyIGJ5IHN0YXJ0IGlkLgorICAgICAgICAgKiA8cD5JZiB0aGUgbmV3IENsaWVudFJhbmdlIGlzIGtub3duIHRvIGJlIHNvcnRlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlCisgICAgICAgICAqIGV4aXN0aW5nIENsaWVudFJhbmdlcywgb3IgYXQgYSBwYXJ0aWN1bGFyIGluZGV4LCBpdCBjYW4gYmUgYWRkZWQKKyAgICAgICAgICogdG8gdGhlIGNsaWVudHMgYXJyYXkgbGlzdCBkaXJlY3RseSwgaW5zdGVhZCBvZiB2aWEgdGhpcyBtZXRob2QuCisgICAgICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGNhbiBiZSBjaGFuZ2VkIGZyb20gbGluZWFyIHRvIGJpbmFyeSBzZWFyY2ggaWYgdGhlCisgICAgICAgICAqIG51bWJlciBvZiBjbGllbnRzIGdyb3dzIGxhcmdlIGVub3VnaCB0aGF0IGl0IHdvdWxkIG1ha2UgYSBkaWZmZXJlbmNlLgorICAgICAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIG5ldyBDbGllbnRSYW5nZSB0byBpbnNlcnQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgaW5zZXJ0KENsaWVudFJhbmdlIHJhbmdlKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gY2xpZW50cy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIENsaWVudFJhbmdlIG5leHRSYW5nZSA9IGNsaWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydElkIDw9IG5leHRSYW5nZS5zdGFydElkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBkdXBsaWNhdGUgcmFuZ2VzIGZyb20gdGhlIHNhbWUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2UuZXF1YWxzKG5leHRSYW5nZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMuYWRkKGksIHJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xpZW50cy5hZGQocmFuZ2UpOyAgICAvLyBhcHBlbmQgdG8gZW5kIG9mIGxpc3QKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtZXNzYWdlIGlkIHJhbmdlIGZvciBhIHNpbmdsZSBjbGllbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRSYW5nZSB7CisgICAgICAgIGZpbmFsIGludCBzdGFydElkOworICAgICAgICBmaW5hbCBpbnQgZW5kSWQ7CisgICAgICAgIGZpbmFsIFN0cmluZyBjbGllbnQ7CisKKyAgICAgICAgQ2xpZW50UmFuZ2UoaW50IHN0YXJ0SWQsIGludCBlbmRJZCwgU3RyaW5nIGNsaWVudCkgeworICAgICAgICAgICAgdGhpcy5zdGFydElkID0gc3RhcnRJZDsKKyAgICAgICAgICAgIHRoaXMuZW5kSWQgPSBlbmRJZDsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgQ2xpZW50UmFuZ2UpIHsKKyAgICAgICAgICAgICAgICBDbGllbnRSYW5nZSBvdGhlciA9IChDbGllbnRSYW5nZSkgbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRJZCA9PSBvdGhlci5zdGFydElkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRJZCA9PSBvdGhlci5lbmRJZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmVxdWFscyhvdGhlci5jbGllbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoc3RhcnRJZCAqIDMxICsgZW5kSWQpICogMzEgKyBjbGllbnQuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgaW50ZWdlciByYW5nZXMsIG9uZSBwZXIgY2xpZW50LCBzb3J0ZWQgYnkgc3RhcnQgaWQuCisgICAgICovCisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50UmFuZ2U+IG1SYW5nZXMgPSBuZXcgQXJyYXlMaXN0PEludFJhbmdlPigpOworCisgICAgcHJvdGVjdGVkIEludFJhbmdlTWFuYWdlcigpIHt9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSByYW5nZSBmb3IgdGhlIHNwZWNpZmllZCBjbGllbnQgYW5kIHVwZGF0ZSByYW5nZXMKKyAgICAgKiBpZiBuZWNlc3NhcnkuIElmIHtAbGluayAjZmluaXNoVXBkYXRlfSByZXR1cm5zIGZhaWx1cmUsCisgICAgICogZmFsc2UgaXMgcmV0dXJuZWQgYW5kIHRoZSByYW5nZSBpcyBub3QgYWRkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRJZCB0aGUgZmlyc3QgaWQgaW5jbHVkZWQgaW4gdGhlIHJhbmdlCisgICAgICogQHBhcmFtIGVuZElkIHRoZSBsYXN0IGlkIGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAqIEBwYXJhbSBjbGllbnQgdGhlIGNsaWVudCByZXF1ZXN0aW5nIHRoZSBlbmFibGVkIHJhbmdlCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBlbmFibGVSYW5nZShpbnQgc3RhcnRJZCwgaW50IGVuZElkLCBTdHJpbmcgY2xpZW50KSB7CisgICAgICAgIGludCBsZW4gPSBtUmFuZ2VzLnNpemUoKTsKKworICAgICAgICAvLyBlbXB0eSByYW5nZSBsaXN0OiBhZGQgdGhlIGluaXRpYWwgSW50UmFuZ2UKKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAodHJ5QWRkU2luZ2xlUmFuZ2Uoc3RhcnRJZCwgZW5kSWQsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgbVJhbmdlcy5hZGQobmV3IEludFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIGZhaWxlZCB0byB1cGRhdGUgcmFkaW8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IHN0YXJ0SW5kZXggPSAwOyBzdGFydEluZGV4IDwgbGVuOyBzdGFydEluZGV4KyspIHsKKyAgICAgICAgICAgIEludFJhbmdlIHJhbmdlID0gbVJhbmdlcy5nZXQoc3RhcnRJbmRleCk7CisgICAgICAgICAgICBpZiAoc3RhcnRJZCA8IHJhbmdlLnN0YXJ0SWQpIHsKKyAgICAgICAgICAgICAgICAvLyB0ZXN0IGlmIG5ldyByYW5nZSBjb21wbGV0ZWx5IHByZWNlZGVzIHRoaXMgcmFuZ2UKKyAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgWzEsIDRdIGFuZCBbNSwgNl0gY29hbGVzY2UgdG8gWzEsIDZdCisgICAgICAgICAgICAgICAgaWYgKChlbmRJZCArIDEpIDwgcmFuZ2Uuc3RhcnRJZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgbmV3IGludCByYW5nZSBiZWZvcmUgcHJldmlvdXMgZmlyc3QgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUFkZFNpbmdsZVJhbmdlKHN0YXJ0SWQsIGVuZElkLCB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5hZGQoc3RhcnRJbmRleCwgbmV3IEludFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIGZhaWxlZCB0byB1cGRhdGUgcmFkaW8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW5kSWQgPD0gcmFuZ2UuZW5kSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5kIHRoZSBzdGFydCBvZiB0aGlzIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZGRTaW5nbGVSYW5nZShzdGFydElkLCByYW5nZS5zdGFydElkIC0gMSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0SWQgPSBzdGFydElkOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY2xpZW50cy5hZGQoMCwgbmV3IENsaWVudFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIGZhaWxlZCB0byB1cGRhdGUgcmFkaW8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbGFzdCByYW5nZSB0aGF0IGNhbiBjb2FsZXNjZSBpbnRvIHRoZSBuZXcgY29tYmluZWQgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgZW5kSW5kZXggPSBzdGFydEluZGV4KzE7IGVuZEluZGV4IDwgbGVuOyBlbmRJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnRSYW5nZSBlbmRSYW5nZSA9IG1SYW5nZXMuZ2V0KGVuZEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZW5kSWQgKyAxKSA8IGVuZFJhbmdlLnN0YXJ0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gYWRkIGVudGlyZSBuZXcgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5QWRkU2luZ2xlUmFuZ2Uoc3RhcnRJZCwgZW5kSWQsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0SWQgPSBzdGFydElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmRJZCA9IGVuZElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgbmV3IENsaWVudFJhbmdlIGJlZm9yZSBleGlzdGluZyByYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY2xpZW50cy5hZGQoMCwgbmV3IENsaWVudFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29hbGVzY2UgcmFuZ2Ugd2l0aCBmb2xsb3dpbmcgcmFuZ2VzIHVwIHRvIGVuZEluZGV4LTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVhY2ggcmFuZ2UgYWZ0ZXIgYWRkaW5nIGl0cyBlbGVtZW50cywgc28gdGhlIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBuZXh0IHJhbmdlIHRvIGpvaW4gaXMgYWx3YXlzIHN0YXJ0SW5kZXgrMS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaSBpcyB0aGUgaW5kZXggaWYgbm8gZWxlbWVudHMgd2VyZSByZW1vdmVkOiB3ZSBvbmx5IGNhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdXQgdGhlIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMsIG5vdCB0aGUgdmFsdWUgb2YgaS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvaW5JbmRleCA9IHN0YXJ0SW5kZXggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gam9pbkluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50UmFuZ2Ugam9pblJhbmdlID0gbVJhbmdlcy5nZXQoam9pbkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmNsaWVudHMuYWRkQWxsKGpvaW5SYW5nZS5jbGllbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SYW5nZXMucmVtb3ZlKGpvaW5SYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIGZhaWxlZCB0byB1cGRhdGUgcmFkaW8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZElkIDw9IGVuZFJhbmdlLmVuZElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHJhbmdlIGZyb20gc3RhcnQgaWQgdG8gc3RhcnQgb2YgbGFzdCBvdmVybGFwcGluZyByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgZnJvbSBlbmRSYW5nZS5zdGFydElkIHRvIGVuZElkIGFyZSBhbHJlYWR5IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5QWRkU2luZ2xlUmFuZ2Uoc3RhcnRJZCwgZW5kUmFuZ2Uuc3RhcnRJZCAtIDEsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0SWQgPSBzdGFydElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5lbmRJZCA9IGVuZFJhbmdlLmVuZElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgbmV3IENsaWVudFJhbmdlIGJlZm9yZSBleGlzdGluZyByYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY2xpZW50cy5hZGQoMCwgbmV3IENsaWVudFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29hbGVzY2UgcmFuZ2Ugd2l0aCBmb2xsb3dpbmcgcmFuZ2VzIHVwIHRvIGVuZEluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBlYWNoIHJhbmdlIGFmdGVyIGFkZGluZyBpdHMgZWxlbWVudHMsIHNvIHRoZSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgbmV4dCByYW5nZSB0byBqb2luIGlzIGFsd2F5cyBzdGFydEluZGV4KzEuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkgaXMgdGhlIGluZGV4IGlmIG5vIGVsZW1lbnRzIHdlcmUgcmVtb3ZlZDogd2Ugb25seSBjYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3V0IHRoZSBudW1iZXIgb2YgbG9vcCBpdGVyYXRpb25zLCBub3QgdGhlIHZhbHVlIG9mIGkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2luSW5kZXggPSBzdGFydEluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGpvaW5JbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRSYW5nZSBqb2luUmFuZ2UgPSBtUmFuZ2VzLmdldChqb2luSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY2xpZW50cy5hZGRBbGwoam9pblJhbmdlLmNsaWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5yZW1vdmUoam9pblJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gZmFpbGVkIHRvIHVwZGF0ZSByYWRpbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZElkIGV4dGVuZHMgcGFzdCBhbGwgZXhpc3RpbmcgSW50UmFuZ2VzOiBjb21iaW5lIHRoZW0gYWxsIHRvZ2V0aGVyCisgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZGRTaW5nbGVSYW5nZShzdGFydElkLCBlbmRJZCwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLnN0YXJ0SWQgPSBzdGFydElkOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuZW5kSWQgPSBlbmRJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBuZXcgQ2xpZW50UmFuZ2UgYmVmb3JlIGV4aXN0aW5nIHJhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY2xpZW50cy5hZGQoMCwgbmV3IENsaWVudFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvYWxlc2NlIHJhbmdlIHdpdGggZm9sbG93aW5nIHJhbmdlcyB1cCB0byBsZW4tMQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVhY2ggcmFuZ2UgYWZ0ZXIgYWRkaW5nIGl0cyBlbGVtZW50cywgc28gdGhlIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgbmV4dCByYW5nZSB0byBqb2luIGlzIGFsd2F5cyBzdGFydEluZGV4KzEuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpIGlzIHRoZSBpbmRleCBpZiBubyBlbGVtZW50cyB3ZXJlIHJlbW92ZWQ6IHdlIG9ubHkgY2FyZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdXQgdGhlIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMsIG5vdCB0aGUgdmFsdWUgb2YgaS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2luSW5kZXggPSBzdGFydEluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBqb2luSW5kZXg7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludFJhbmdlIGpvaW5SYW5nZSA9IG1SYW5nZXMuZ2V0KGpvaW5JbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuY2xpZW50cy5hZGRBbGwoam9pblJhbmdlLmNsaWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SYW5nZXMucmVtb3ZlKGpvaW5SYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBmYWlsZWQgdG8gdXBkYXRlIHJhZGlvCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChzdGFydElkICsgMSkgPD0gcmFuZ2UuZW5kSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5kSWQgPD0gcmFuZ2UuZW5kSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcGxldGVseSBjb250YWluZWQgaW4gZXhpc3RpbmcgcmFuZ2U7IG5vIHJhZGlvIGNoYW5nZXMKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0KG5ldyBDbGllbnRSYW5nZShzdGFydElkLCBlbmRJZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbGFzdCByYW5nZSB0aGF0IGNhbiBjb2FsZXNjZSBpbnRvIHRoZSBuZXcgY29tYmluZWQgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gc3RhcnRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgdGVzdEluZGV4ID0gc3RhcnRJbmRleCsxOyB0ZXN0SW5kZXggPCBsZW47IHRlc3RJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnRSYW5nZSB0ZXN0UmFuZ2UgPSBtUmFuZ2VzLmdldCh0ZXN0SW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlbmRJZCArIDEpIDwgdGVzdFJhbmdlLnN0YXJ0SWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kSW5kZXggPSB0ZXN0SW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gYWRqYWNlbnQgSW50UmFuZ2VzIHRvIGNvbWJpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCByYW5nZSBmcm9tIHJhbmdlLmVuZElkKzEgdG8gZW5kSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgZnJvbSBzdGFydElkIHRvIHJhbmdlLmVuZElkIGFyZSBhbHJlYWR5IGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZGRTaW5nbGVSYW5nZShyYW5nZS5lbmRJZCArIDEsIGVuZElkLCB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZElkID0gZW5kSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UuaW5zZXJ0KG5ldyBDbGllbnRSYW5nZShzdGFydElkLCBlbmRJZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBmYWlsZWQgdG8gdXBkYXRlIHJhZGlvCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGxhc3QgcmFuZ2UgdG8gY29hbGVzY2UgaW50byBzdGFydCByYW5nZQorICAgICAgICAgICAgICAgICAgICBJbnRSYW5nZSBlbmRSYW5nZSA9IG1SYW5nZXMuZ2V0KGVuZEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVmFsdWVzIGZyb20gc3RhcnRJZCB0byByYW5nZS5lbmRJZCBoYXZlIGFscmVhZHkgYmVlbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICAvLyBpZiBlbmRJZCA+IGVuZFJhbmdlLmVuZElkLCB0aGVuIGVuYWJsZSByYW5nZSBmcm9tIHJhbmdlLmVuZElkKzEgdG8gZW5kSWQsCisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgZW5hYmxlIHJhbmdlIGZyb20gcmFuZ2UuZW5kSWQrMSB0byBlbmRSYW5nZS5zdGFydElkLTEsIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGZyb20gZW5kUmFuZ2Uuc3RhcnRJZCB0byBlbmRJZCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZC4KKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld1JhbmdlRW5kSWQgPSAoZW5kSWQgPD0gZW5kUmFuZ2UuZW5kSWQpID8gZW5kUmFuZ2Uuc3RhcnRJZCAtIDEgOiBlbmRJZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUFkZFNpbmdsZVJhbmdlKHJhbmdlLmVuZElkICsgMSwgbmV3UmFuZ2VFbmRJZCwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZElkID0gZW5kSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQgbmV3IENsaWVudFJhbmdlIGluIHBsYWNlCisgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5pbnNlcnQobmV3IENsaWVudFJhbmdlKHN0YXJ0SWQsIGVuZElkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvYWxlc2NlIHJhbmdlIHdpdGggZm9sbG93aW5nIHJhbmdlcyB1cCB0byBlbmRJbmRleC0xCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZWFjaCByYW5nZSBhZnRlciBhZGRpbmcgaXRzIGVsZW1lbnRzLCBzbyB0aGUgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBuZXh0IHJhbmdlIHRvIGpvaW4gaXMgYWx3YXlzIHN0YXJ0SW5kZXgrMSAoam9pbkluZGV4KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkgaXMgdGhlIGluZGV4IGlmIG5vIGVsZW1lbnRzIGhhZCBiZWVuIHJlbW92ZWQ6IHdlIG9ubHkgY2FyZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWJvdXQgdGhlIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMsIG5vdCB0aGUgdmFsdWUgb2YgaS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2luSW5kZXggPSBzdGFydEluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBqb2luSW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50UmFuZ2Ugam9pblJhbmdlID0gbVJhbmdlcy5nZXQoam9pbkluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS5jbGllbnRzLmFkZEFsbChqb2luUmFuZ2UuY2xpZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5yZW1vdmUoam9pblJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vIGZhaWxlZCB0byB1cGRhdGUgcmFkaW8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGVuZCBuZXcgcmFuZ2UgYWZ0ZXIgZXhpc3RpbmcgSW50UmFuZ2VzCisgICAgICAgIGlmICh0cnlBZGRTaW5nbGVSYW5nZShzdGFydElkLCBlbmRJZCwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIG1SYW5nZXMuYWRkKG5ldyBJbnRSYW5nZShzdGFydElkLCBlbmRJZCwgY2xpZW50KSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBmYWlsZWQgdG8gdXBkYXRlIHJhZGlvCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlIGEgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgY2xpZW50IGFuZCB1cGRhdGUgcmFuZ2VzCisgICAgICogaWYgbmVjZXNzYXJ5LiBJZiB7QGxpbmsgI2ZpbmlzaFVwZGF0ZX0gcmV0dXJucyBmYWlsdXJlLAorICAgICAqIGZhbHNlIGlzIHJldHVybmVkIGFuZCB0aGUgcmFuZ2UgaXMgbm90IHJlbW92ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRJZCB0aGUgZmlyc3QgaWQgaW5jbHVkZWQgaW4gdGhlIHJhbmdlCisgICAgICogQHBhcmFtIGVuZElkIHRoZSBsYXN0IGlkIGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAqIEBwYXJhbSBjbGllbnQgdGhlIGNsaWVudCByZXF1ZXN0aW5nIHRvIGRpc2FibGUgdGhlIHJhbmdlCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBkaXNhYmxlUmFuZ2UoaW50IHN0YXJ0SWQsIGludCBlbmRJZCwgU3RyaW5nIGNsaWVudCkgeworICAgICAgICBpbnQgbGVuID0gbVJhbmdlcy5zaXplKCk7CisKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIEludFJhbmdlIHJhbmdlID0gbVJhbmdlcy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoc3RhcnRJZCA8IHJhbmdlLnN0YXJ0SWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gbm90IGZvdW5kCisgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZElkIDw9IHJhbmdlLmVuZElkKSB7CisgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIEludFJhbmdlIHRoYXQgZW5jbG9zZXMgdGhlIGNsaWVudCByYW5nZSwgaWYgYW55CisgICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBpdCBpbiB0aGUgY2xpZW50cyBsaXN0CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PENsaWVudFJhbmdlPiBjbGllbnRzID0gcmFuZ2UuY2xpZW50czsKKworICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBjb21tb24gY2FzZSBvZiBJbnRSYW5nZSBjb250YWluaW5nIG9uZSBDbGllbnRSYW5nZQorICAgICAgICAgICAgICAgIGludCBjckxlbmd0aCA9IGNsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChjckxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENsaWVudFJhbmdlIGNyID0gY2xpZW50cy5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjci5zdGFydElkID09IHN0YXJ0SWQgJiYgY3IuZW5kSWQgPT0gZW5kSWQgJiYgY3IuY2xpZW50LmVxdWFscyhjbGllbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHJhbmdlIGluIHJhZGlvIHRoZW4gcmVtb3ZlIHRoZSBlbnRpcmUgSW50UmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZGRTaW5nbGVSYW5nZShzdGFydElkLCBlbmRJZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBmYWlsZWQgdG8gdXBkYXRlIHJhZGlvCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gbm90IGZvdW5kCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzZXZlcmFsIENsaWVudFJhbmdlczogcmVtb3ZlIG9uZSwgcG90ZW50aWFsbHkgc3BsaXR0aW5nIGludG8gbWFueSBJbnRSYW5nZXMuCisgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgc3RhcnQgYW5kIGVuZCBpZCBmb3IgdGhlIG9yaWdpbmFsIEludFJhbmdlCisgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGUgcmFkaW8gdXBkYXRlIGZhaWxzIGFuZCB3ZSBoYXZlIHRvIHJldmVydCBpdC4gSWYgdGhlCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHN1Y2NlZWRzLCB3ZSByZW1vdmUgdGhlIGNsaWVudCByYW5nZSBhbmQgaW5zZXJ0IHRoZSBuZXcgSW50UmFuZ2VzLgorICAgICAgICAgICAgICAgIGludCBsYXJnZXN0RW5kSWQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsgIC8vIGxhcmdlc3QgZW5kIGlkZW50aWZpZXIgZm91bmQKKyAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGNySW5kZXg9MDsgY3JJbmRleCA8IGNyTGVuZ3RoOyBjckluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xpZW50UmFuZ2UgY3IgPSBjbGllbnRzLmdldChjckluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyLnN0YXJ0SWQgPT0gc3RhcnRJZCAmJiBjci5lbmRJZCA9PSBlbmRJZCAmJiBjci5jbGllbnQuZXF1YWxzKGNsaWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoZSBDbGllbnRSYW5nZSB0byByZW1vdmUsIGNoZWNrIGlmIGl0J3MgdGhlIGxhc3QgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjckluZGV4ID09IGNyTGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5lbmRJZCA9PSBsYXJnZXN0RW5kSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2hhbm5lbHMgdG8gcmVtb3ZlIGZyb20gcmFkaW87IHJldHVybiBzdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMucmVtb3ZlKGNySW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXNhYmxlIHRoZSBjaGFubmVscyBhdCB0aGUgZW5kIGFuZCBsb3dlciB0aGUgZW5kIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZGRTaW5nbGVSYW5nZShsYXJnZXN0RW5kSWQgKyAxLCByYW5nZS5lbmRJZCwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzLnJlbW92ZShjckluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZElkID0gbGFyZ2VzdEVuZElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIEludFJhbmdlIHNvIHRoYXQgd2UgY2FuIHJlbW92ZSBlbGVtZW50cyBhbmQgbW9kaWZ5IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgYW5kIGVuZCBpZCdzIGluIHRoZSBjb3B5LCBsZWF2aW5nIHRoZSBvcmlnaW5hbCB1bm1vZGlmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnRpbCBhZnRlciB0aGUgcmFkaW8gdXBkYXRlIHN1Y2NlZWRzCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRSYW5nZSByYW5nZUNvcHkgPSBuZXcgSW50UmFuZ2UocmFuZ2UsIGNySW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JJbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgdGhlIGZpcnN0IENsaWVudFJhbmdlLCBzbyB3ZSBtYXkgbmVlZCB0byBpbmNyZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBpZCBvZiB0aGUgSW50UmFuZ2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Uga25vdyB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIENsaWVudFJhbmdlcyBpbiB0aGUgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBjbGllbnRzLmdldCgxKSBzaG91bGQgYWx3YXlzIHN1Y2NlZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRTdGFydElkID0gY2xpZW50cy5nZXQoMSkuc3RhcnRJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFN0YXJ0SWQgIT0gcmFuZ2Uuc3RhcnRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmFuZ2UocmFuZ2Uuc3RhcnRJZCwgbmV4dFN0YXJ0SWQgLSAxLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlQ29weS5zdGFydElkID0gbmV4dFN0YXJ0SWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXQgbGFyZ2VzdEVuZElkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdEVuZElkID0gY2xpZW50cy5nZXQoMSkuZW5kSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggcmVtYWluaW5nIENsaWVudFJhbmdlcywgY3JlYXRpbmcgbmV3IEludFJhbmdlcyB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhIGdhcCBpbiB0aGUgc2VxdWVuY2UuIEFmdGVyIHJhZGlvIHVwZGF0ZSBzdWNjZWVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgb3JpZ2luYWwgSW50UmFuZ2UgYW5kIGFwcGVuZCBuZXdSYW5nZXMgdG8gbVJhbmdlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbGVhdmUgdGhlIG9yaWdpbmFsIEludFJhbmdlIGluIG1SYW5nZXMgYW5kIHJldHVybiBmYWxzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxJbnRSYW5nZT4gbmV3UmFuZ2VzID0gbmV3IEFycmF5TGlzdDxJbnRSYW5nZT4oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgSW50UmFuZ2UgY3VycmVudFJhbmdlID0gcmFuZ2VDb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbmV4dEluZGV4ID0gY3JJbmRleCArIDE7IG5leHRJbmRleCA8IGNyTGVuZ3RoOyBuZXh0SW5kZXgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFJhbmdlIG5leHRDciA9IGNsaWVudHMuZ2V0KG5leHRJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDci5zdGFydElkID4gbGFyZ2VzdEVuZElkICsgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VXBkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSYW5nZShsYXJnZXN0RW5kSWQgKyAxLCBuZXh0Q3Iuc3RhcnRJZCAtIDEsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhbmdlLmVuZElkID0gbGFyZ2VzdEVuZElkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZXMuYWRkKGN1cnJlbnRSYW5nZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZSA9IG5ldyBJbnRSYW5nZShuZXh0Q3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZS5jbGllbnRzLmFkZChuZXh0Q3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENyLmVuZElkID4gbGFyZ2VzdEVuZElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RFbmRJZCA9IG5leHRDci5lbmRJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgY2hhbm5lbHMgYmV0d2VlbiBsYXJnZXN0RW5kSWQgYW5kIGVuZElkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFyZ2VzdEVuZElkIDwgZW5kSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJhbmdlKGxhcmdlc3RFbmRJZCArIDEsIGVuZElkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFJhbmdlLmVuZElkID0gbGFyZ2VzdEVuZElkOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmFuZ2VzLmFkZChjdXJyZW50UmFuZ2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlU3RhcnRlZCAmJiAhZmluaXNoVXBkYXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gZmFpbGVkIHRvIHVwZGF0ZSByYWRpbworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBvcmlnaW5hbCBJbnRSYW5nZSB3aXRoIG5ld1JhbmdlcworICAgICAgICAgICAgICAgICAgICAgICAgbVJhbmdlcy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUmFuZ2VzLmFkZEFsbChpLCBuZXdSYW5nZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgdGhlIENsaWVudFJhbmdlIHRvIHJlbW92ZTsgc2F2ZSBoaWdoZXN0IGVuZCBJRCBzZWVuIHNvIGZhcgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyLmVuZElkID4gbGFyZ2VzdEVuZElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdEVuZElkID0gY3IuZW5kSWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7ICAgLy8gbm90IGZvdW5kCisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhIGNvbXBsZXRlIHVwZGF0ZSBvcGVyYXRpb24gKGVuYWJsZSBhbGwgcmFuZ2VzKS4gVXNlZnVsCisgICAgICogYWZ0ZXIgYSByYWRpbyByZXNldC4gQ2FsbHMge0BsaW5rICNzdGFydFVwZGF0ZX0sIGZvbGxvd2VkIGJ5IHplcm8gb3IKKyAgICAgKiBtb3JlIGNhbGxzIHRvIHtAbGluayAjYWRkUmFuZ2V9LCBmb2xsb3dlZCBieSB7QGxpbmsgI2ZpbmlzaFVwZGF0ZX0uCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVJhbmdlcygpIHsKKyAgICAgICAgc3RhcnRVcGRhdGUoKTsKKyAgICAgICAgSXRlcmF0b3I8SW50UmFuZ2U+IGl0ZXJhdG9yID0gbVJhbmdlcy5pdGVyYXRvcigpOworICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJbnRSYW5nZSByYW5nZSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGludCBzdGFydCA9IHJhbmdlLnN0YXJ0SWQ7CisgICAgICAgICAgICBpbnQgZW5kID0gcmFuZ2UuZW5kSWQ7CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIHJhbmdlcyBvZiBbc3RhcnRJZCwgZW5kSWRdCisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgSW50UmFuZ2UgbmV4dE5vZGUgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgLy8gW3N0YXJ0SWRBLCBlbmRJZEFdLCBbZW5kSWRBICsgMSwgZW5kSWRCXSAtPiBbc3RhcnRJZEEsIGVuZElkQl0KKyAgICAgICAgICAgICAgICBpZiAobmV4dE5vZGUuc3RhcnRJZCA8PSAoZW5kICsgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHROb2RlLmVuZElkID4gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBuZXh0Tm9kZS5lbmRJZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFJhbmdlKHN0YXJ0LCBlbmQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5leHROb2RlLnN0YXJ0SWQ7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IG5leHROb2RlLmVuZElkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZCBmaW5hbCByYW5nZQorICAgICAgICAgICAgYWRkUmFuZ2Uoc3RhcnQsIGVuZCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmlzaFVwZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBkaXNhYmxlIGEgc2luZ2xlIHJhbmdlIG9mIG1lc3NhZ2UgaWRlbnRpZmllcnMuCisgICAgICogQHBhcmFtIHN0YXJ0SWQgdGhlIGZpcnN0IGlkIGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAqIEBwYXJhbSBlbmRJZCB0aGUgbGFzdCBpZCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWQgdHJ1ZSB0byBlbmFibGUgcmFuZ2UsIGZhbHNlIHRvIGRpc2FibGUgcmFuZ2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHRyeUFkZFNpbmdsZVJhbmdlKGludCBzdGFydElkLCBpbnQgZW5kSWQsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKKyAgICAgICAgc3RhcnRVcGRhdGUoKTsKKyAgICAgICAgYWRkUmFuZ2Uoc3RhcnRJZCwgZW5kSWQsIHNlbGVjdGVkKTsKKyAgICAgICAgcmV0dXJuIGZpbmlzaFVwZGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBsaXN0IG9mIGVuYWJsZWQgcmFuZ2VzIGhhcyBjaGFuZ2VkLiBUaGlzIHdpbGwgYmUKKyAgICAgKiBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgY2FsbHMgdG8ge0BsaW5rICNhZGRSYW5nZX0gZm9sbG93ZWQgYnkKKyAgICAgKiBhIGNhbGwgdG8ge0BsaW5rICNmaW5pc2hVcGRhdGV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YXJ0VXBkYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYWZ0ZXIge0BsaW5rICNzdGFydFVwZGF0ZX0gdG8gaW5kaWNhdGUgYSByYW5nZSBvZiBlbmFibGVkCisgICAgICogb3IgZGlzYWJsZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0SWQgdGhlIGZpcnN0IGlkIGluY2x1ZGVkIGluIHRoZSByYW5nZQorICAgICAqIEBwYXJhbSBlbmRJZCB0aGUgbGFzdCBpZCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UKKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWQgdHJ1ZSB0byBlbmFibGUgcmFuZ2UsIGZhbHNlIHRvIGRpc2FibGUgcmFuZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRSYW5nZShpbnQgc3RhcnRJZCwgaW50IGVuZElkLCBib29sZWFuIHNlbGVjdGVkKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgcmFuZ2UgdXBkYXRlIHN0YXJ0ZWQgYnkgdGhlCisgICAgICogcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgI3N0YXJ0VXBkYXRlfS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZmluaXNoVXBkYXRlKCk7Cit9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvTWNjVGFibGUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCmluZGV4IGZkZTFiNTkuLmNkY2U4NDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9NY2NUYWJsZS5qYXZhCkBAIC0yMzQsNyArMjM0LDcgQEAKICAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBNY2NUYWJsZS5jb3VudHJ5Q29kZUZvck1jYyhtY2MpOwogCiAgICAgICAgIExvZy5kKExPR19UQUcsICJsb2NhbGUgc2V0IHRvICIrbGFuZ3VhZ2UrIl8iK2NvdW50cnkpOwotICAgICAgICBwaG9uZS5zZXRTeXN0ZW1Mb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpOworICAgICAgICBwaG9uZS5zZXRTeXN0ZW1Mb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHRydWUpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lQmFzZS5qYXZhCmluZGV4IGI3N2UxMzQuLjQwYTcwYTggMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUJhc2UuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVCYXNlLmphdmEKQEAgLTU4MCw3ICs1ODAsNyBAQAogICAgICAgICAgICAgICAgIGlmIChsLmxlbmd0aCgpID49NSkgewogICAgICAgICAgICAgICAgICAgICBjb3VudHJ5ID0gbC5zdWJzdHJpbmcoMywgNSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldFN5c3RlbUxvY2FsZShsYW5ndWFnZSwgY291bnRyeSk7CisgICAgICAgICAgICAgICAgc2V0U3lzdGVtTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoIWNvdW50cnkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CkBAIC02MDIsMTAgKzYwMiwxNCBAQAogICAgICAqIFV0aWxpdHkgY29kZSB0byBzZXQgdGhlIHN5c3RlbSBsb2NhbGUgaWYgaXQncyBub3Qgc2V0IGFscmVhZHkKICAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgVHdvIGNoYXJhY3RlciBsYW5ndWFnZSBjb2RlIGRlc2lyZWQKICAgICAgKiBAcGFyYW0gY291bnRyeSBUd28gY2hhcmFjdGVyIGNvdW50cnkgY29kZSBkZXNpcmVkCisgICAgICogQHBhcmFtIGZyb21NY2MgSW5kaWNhdGluZyB3aGV0aGVyIHRoZSBsb2NhbGUgaXMgc2V0IGFjY29yZGluZyB0byBNQ0MgdGFibGUuCisgICAgICogICAgICAgICAgICAgICAgVGhpcyBmbGFnIHdpbCBiZSBpZ25vcmVkIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgICAgICogICAgICAgICAgICAgICAgVE9ETzogVXNlIGEgc291cmNlIGVudW1lcmF0aW9uIHNvIHRoYXQgc291cmNlIG9mIHRoZSBsb2NhbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgcHJpb3JpdGl6ZWQuCiAgICAgICoKICAgICAgKiAge0BoaWRlfQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUxvY2FsZShTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBjb3VudHJ5KSB7CisgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtTG9jYWxlKFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGNvdW50cnksIGJvb2xlYW4gZnJvbU1jYykgewogICAgICAgICBTdHJpbmcgbCA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnN5cy5sYW5ndWFnZSIpOwogICAgICAgICBTdHJpbmcgYyA9IFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJwZXJzaXN0LnN5cy5jb3VudHJ5Iik7CiAKQEAgLTEwMjMsNyArMTAyNyw3IEBACiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoKSB7Ci0gICAgICAgIHJldHVybiAoKG1EYXRhQ29ubmVjdGlvblRyYWNrZXIgIT0gbnVsbCkgJiYgKG1EYXRhQ29ubmVjdGlvblRyYWNrZXIuaXNEYXRhUG9zc2libGUoKSkpOworICAgICAgICByZXR1cm4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoUGhvbmUuQVBOX1RZUEVfREVGQVVMVCk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNEYXRhQ29ubmVjdGl2aXR5UG9zc2libGUoU3RyaW5nIGFwblR5cGUpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUZhY3RvcnkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZUZhY3RvcnkuamF2YQppbmRleCA2YTJkN2M5Li43NGJhZTQ0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVGYWN0b3J5LmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lRmFjdG9yeS5qYXZhCkBAIC00Nyw4ICs0Nyw2IEBACiAgICAgc3RhdGljIHByaXZhdGUgTG9vcGVyIHNMb29wZXI7CiAgICAgc3RhdGljIHByaXZhdGUgQ29udGV4dCBzQ29udGV4dDsKIAotICAgIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVycmVkTmV0d29ya01vZGUgPSBSSUxDb25zdGFudHMuUFJFRkVSUkVEX05FVFdPUktfTU9ERTsKLQogICAgIHN0YXRpYyBmaW5hbCBpbnQgcHJlZmVycmVkQ2RtYVN1YnNjcmlwdGlvbiA9IFJJTENvbnN0YW50cy5QUkVGRVJSRURfQ0RNQV9TVUJTQ1JJUFRJT047CiAKICAgICAvLyoqKioqIENsYXNzIE1ldGhvZHMKQEAgLTk5LDcgKzk3LDExIEBACiAKICAgICAgICAgICAgICAgICBzUGhvbmVOb3RpZmllciA9IG5ldyBEZWZhdWx0UGhvbmVOb3RpZmllcigpOwogCi0gICAgICAgICAgICAgICAgLy9HZXQgcHJlZmVycmVkTmV0d29ya01vZGUgZnJvbSBTZXR0aW5ncy5TeXN0ZW0KKyAgICAgICAgICAgICAgICAvLyBHZXQgcHJlZmVycmVkIG5ldHdvcmsgbW9kZQorICAgICAgICAgICAgICAgIGludCBwcmVmZXJyZWROZXR3b3JrTW9kZSA9IFJJTENvbnN0YW50cy5QUkVGRVJSRURfTkVUV09SS19NT0RFOworICAgICAgICAgICAgICAgIGlmIChCYXNlQ29tbWFuZHMuZ2V0THRlT25DZG1hTW9kZVN0YXRpYygpID09IFBob25lLkxURV9PTl9DRE1BX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkTmV0d29ya01vZGUgPSBQaG9uZS5OVF9NT0RFX0dMT0JBTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW50IG5ldHdvcmtNb2RlID0gU2V0dGluZ3MuU2VjdXJlLmdldEludChjb250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3MuU2VjdXJlLlBSRUZFUlJFRF9ORVRXT1JLX01PREUsIHByZWZlcnJlZE5ldHdvcmtNb2RlKTsKICAgICAgICAgICAgICAgICBMb2cuaShMT0dfVEFHLCAiTmV0d29yayBNb2RlIHNldCB0byAiICsgSW50ZWdlci50b1N0cmluZyhuZXR3b3JrTW9kZSkpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9QaG9uZVByb3h5LmphdmEKaW5kZXggNjhmMWM1Zi4uYzIyMTJkYiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1Bob25lUHJveHkuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUGhvbmVQcm94eS5qYXZhCkBAIC02NTQsNyArNjU0LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1BY3RpdmVQaG9uZS5pc0RhdGFDb25uZWN0aXZpdHlQb3NzaWJsZSgpOworICAgICAgICByZXR1cm4gbUFjdGl2ZVBob25lLmlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKFBob25lLkFQTl9UWVBFX0RFRkFVTFQpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRGF0YUNvbm5lY3Rpdml0eVBvc3NpYmxlKFN0cmluZyBhcG5UeXBlKSB7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKaW5kZXggMDYyMWNmZC4uNzZmMWFiN2UgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9SSUwuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvUklMLmphdmEKQEAgLTYxMSwxNCArNjExLDE0IEBACiAKICAgICAvLyoqKioqIENvbnN0cnVjdG9ycwogCi0gICAgcHVibGljIFJJTChDb250ZXh0IGNvbnRleHQsIGludCBuZXR3b3JrTW9kZSwgaW50IGNkbWFTdWJzY3JpcHRpb24pIHsKKyAgICBwdWJsaWMgUklMKENvbnRleHQgY29udGV4dCwgaW50IHByZWZlcnJlZE5ldHdvcmtUeXBlLCBpbnQgY2RtYVN1YnNjcmlwdGlvbikgewogICAgICAgICBzdXBlcihjb250ZXh0KTsKICAgICAgICAgaWYgKFJJTEpfTE9HRCkgewotICAgICAgICAgICAgcmlsakxvZygiUklMKGNvbnRleHQsIG5ldHdvcmtNb2RlPSIgKyBuZXR3b3JrTW9kZSArCisgICAgICAgICAgICByaWxqTG9nKCJSSUwoY29udGV4dCwgcHJlZmVycmVkTmV0d29ya1R5cGU9IiArIHByZWZlcnJlZE5ldHdvcmtUeXBlICsKICAgICAgICAgICAgICAgICAgICAgIiBjZG1hU3Vic2NyaXB0aW9uPSIgKyBjZG1hU3Vic2NyaXB0aW9uICsgIikiKTsKICAgICAgICAgfQogICAgICAgICBtQ2RtYVN1YnNjcmlwdGlvbiAgPSBjZG1hU3Vic2NyaXB0aW9uOwotICAgICAgICBtTmV0d29ya01vZGUgPSBuZXR3b3JrTW9kZTsKKyAgICAgICAgbVByZWZlcnJlZE5ldHdvcmtUeXBlID0gcHJlZmVycmVkTmV0d29ya1R5cGU7CiAgICAgICAgIG1QaG9uZVR5cGUgPSBSSUxDb25zdGFudHMuTk9fUEhPTkU7CiAKICAgICAgICAgUG93ZXJNYW5hZ2VyIHBtID0gKFBvd2VyTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKQEAgLTE4MTMsNiArMTgxMyw4IEBACiAgICAgICAgIHJyLm1wLndyaXRlSW50KDEpOwogICAgICAgICByci5tcC53cml0ZUludChuZXR3b3JrVHlwZSk7CiAKKyAgICAgICAgbVByZWZlcnJlZE5ldHdvcmtUeXBlID0gbmV0d29ya1R5cGU7CisKICAgICAgICAgaWYgKFJJTEpfTE9HRCkgcmlsakxvZyhyci5zZXJpYWxTdHJpbmcoKSArICI+ICIgKyByZXF1ZXN0VG9TdHJpbmcocnIubVJlcXVlc3QpCiAgICAgICAgICAgICAgICAgKyAiIDogIiArIG5ldHdvcmtUeXBlKTsKIApAQCAtMjIyMiw3ICsyMjI0LDcgQEAKICAgICAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfU1RLX0hBTkRMRV9DQUxMX1NFVFVQX1JFUVVFU1RFRF9GUk9NX1NJTTogcmV0ID0gIHJlc3BvbnNlSW50cyhwKTsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX0VYUExJQ0lUX0NBTExfVFJBTlNGRVI6IHJldCA9ICByZXNwb25zZVZvaWQocCk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9TRVRfUFJFRkVSUkVEX05FVFdPUktfVFlQRTogcmV0ID0gIHJlc3BvbnNlVm9pZChwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJJTF9SRVFVRVNUX0dFVF9QUkVGRVJSRURfTkVUV09SS19UWVBFOiByZXQgPSAgcmVzcG9uc2VJbnRzKHApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfR0VUX1BSRUZFUlJFRF9ORVRXT1JLX1RZUEU6IHJldCA9ICByZXNwb25zZUdldFByZWZlcnJlZE5ldHdvcmtUeXBlKHApOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfR0VUX05FSUdIQk9SSU5HX0NFTExfSURTOiByZXQgPSByZXNwb25zZUNlbGxMaXN0KHApOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgUklMX1JFUVVFU1RfU0VUX0xPQ0FUSU9OX1VQREFURVM6IHJldCA9ICByZXNwb25zZVZvaWQocCk7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBSSUxfUkVRVUVTVF9DRE1BX1NFVF9TVUJTQ1JJUFRJT05fU09VUkNFOiByZXQgPSAgcmVzcG9uc2VWb2lkKHApOyBicmVhazsKQEAgLTI3MzcsNyArMjczOSw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBJbml0aWFsIGNvbmRpdGlvbnMKICAgICAgICAgICAgICAgICBzZXRSYWRpb1Bvd2VyKGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgICAgICBzZXRQcmVmZXJyZWROZXR3b3JrVHlwZShtTmV0d29ya01vZGUsIG51bGwpOworICAgICAgICAgICAgICAgIHNldFByZWZlcnJlZE5ldHdvcmtUeXBlKG1QcmVmZXJyZWROZXR3b3JrVHlwZSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgc2V0Q2RtYVN1YnNjcmlwdGlvblNvdXJjZShtQ2RtYVN1YnNjcmlwdGlvbiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5UmVnaXN0cmFudHNSaWxDb25uZWN0aW9uQ2hhbmdlZCgoKGludFtdKXJldClbMF0pOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjg4OCw3ICsyODkwLDcgQEAKIAogICAgICAgICBTdHJpbmcgcyA9IHAucmVhZFN0cmluZygpOwogCi0gICAgICAgIGlmIChSSUxKX0xPR0QpIHJpbGpMb2coIjwgaWNjSU86ICIKKyAgICAgICAgaWYgKFJJTEpfTE9HVikgcmlsakxvZygiPCBpY2NJTzogIgogICAgICAgICAgICAgICAgICsgIiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHN3MSkKICAgICAgICAgICAgICAgICArICIgMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhzdzIpICsgIiAiCiAgICAgICAgICAgICAgICAgKyBzKTsKQEAgLTI5MjIsOCArMjkyNCw4IEBACiAgICAgICAgICAgICBjYS5haWQgICAgICAgICAgICA9IHAucmVhZFN0cmluZygpOwogICAgICAgICAgICAgY2EuYXBwX2xhYmVsICAgICAgPSBwLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIGNhLnBpbjFfcmVwbGFjZWQgID0gcC5yZWFkSW50KCk7Ci0gICAgICAgICAgICBjYS5waW4xICAgICAgICAgICA9IHAucmVhZEludCgpOwotICAgICAgICAgICAgY2EucGluMiAgICAgICAgICAgPSBwLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGNhLnBpbjEgICAgICAgICAgID0gY2EuUGluU3RhdGVGcm9tUklMSW50KHAucmVhZEludCgpKTsKKyAgICAgICAgICAgIGNhLnBpbjIgICAgICAgICAgID0gY2EuUGluU3RhdGVGcm9tUklMSW50KHAucmVhZEludCgpKTsKICAgICAgICAgICAgIHN0YXR1cy5hZGRBcHBsaWNhdGlvbihjYSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTMwNTEsNyArMzA1Myw3IEBACiAgICAgcmVzcG9uc2VTZXR1cERhdGFDYWxsKFBhcmNlbCBwKSB7CiAgICAgICAgIGludCB2ZXIgPSBwLnJlYWRJbnQoKTsKICAgICAgICAgaW50IG51bSA9IHAucmVhZEludCgpOwotICAgICAgICBpZiAoUklMSl9MT0dEKSByaWxqTG9nKCJyZXNwb25zZVNldHVwRGF0YUNhbGwgdmVyPSIgKyB2ZXIgKyAiIG51bT0iICsgbnVtKTsKKyAgICAgICAgaWYgKFJJTEpfTE9HVikgcmlsakxvZygicmVzcG9uc2VTZXR1cERhdGFDYWxsIHZlcj0iICsgdmVyICsgIiBudW09IiArIG51bSk7CiAKICAgICAgICAgRGF0YUNhbGxTdGF0ZSBkYXRhQ2FsbDsKIApAQCAtMzE2MSw2ICszMTYzLDE4IEBACiAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgIH0KIAorICAgIHByaXZhdGUgT2JqZWN0IHJlc3BvbnNlR2V0UHJlZmVycmVkTmV0d29ya1R5cGUoUGFyY2VsIHApIHsKKyAgICAgICBpbnQgW10gcmVzcG9uc2UgPSAoaW50W10pIHJlc3BvbnNlSW50cyhwKTsKKworICAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPj0gMSkgeworICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIHRoZSByZXNwb25zZSBmb3IgZ2V0UHJlZmVycmVkTmV0d29ya1R5cGUKKyAgICAgICAgICAgLy8gd2UnbGwgYXNzdW1lIHRoYXQgaXQgc2hvdWxkIGJlIHRoZSB2YWx1ZSB3ZSB3YW50IHRoZQorICAgICAgICAgICAvLyB2ZW5kb3IgcmlsIHRvIHRha2UgaWYgd2UgcmVlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHRvIGl0LgorICAgICAgICAgICBtUHJlZmVycmVkTmV0d29ya1R5cGUgPSByZXNwb25zZVswXTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKwogICAgIHByaXZhdGUgT2JqZWN0IHJlc3BvbnNlR21zQnJvYWRjYXN0Q29uZmlnKFBhcmNlbCBwKSB7CiAgICAgICAgIGludCBudW07CiAgICAgICAgIEFycmF5TGlzdDxTbXNCcm9hZGNhc3RDb25maWdJbmZvPiByZXNwb25zZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOGVmYzlhYS4uNzZlNzE5YwotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TTVNEaXNwYXRjaGVyLmphdmEKQEAgLTMyLDExICszMiw5IEBACiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5TUUxFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUG93ZXJNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuU3RhdEZzOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueTsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlRlbGVwaG9ueS5TbXMuSW50ZW50czsKQEAgLTkwOCwzNyArOTA2LDYgQEAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZW5kTXVsdGlwYXJ0U21zIChTbXNUcmFja2VyIHRyYWNrZXIpOwogCiAgICAgLyoqCi0gICAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBjZWxsIGJyb2FkY2FzdCBTTVMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWN0aXZhdGUKLSAgICAgKiAgICAgICAgICAgIDAgPSBhY3RpdmF0ZSwgMSA9IGRlYWN0aXZhdGUKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiAgICAgICAgICAgIENhbGxiYWNrIG1lc3NhZ2UgaXMgZW1wdHkgb24gY29tcGxldGlvbgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpOwotCi0gICAgLyoqCi0gICAgICogUXVlcnkgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBjZWxsIGJyb2FkY2FzdCBTTVMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UKLSAgICAgKiAgICAgICAgICAgIENhbGxiYWNrIG1lc3NhZ2UgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgbW9kZW0gb24gY29tcGxldGlvbgotICAgICAqICAgICAgICAgICAgQHNlZSAjc2V0Q2VsbEJyb2FkY2FzdENvbmZpZwotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoTWVzc2FnZSByZXNwb25zZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25maWd1cmUgY2VsbCBicm9hZGNhc3QgU01TLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ1ZhbHVlc0FycmF5Ci0gICAgICogICAgICAgICAgVGhlIGZpcnN0IGVsZW1lbnQgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHRyaXBsZXMgdGhhdCBmb2xsb3cuCi0gICAgICogICAgICAgICAgQSB0cmlwbGUgaXMgbWFkZSB1cCBvZiB0aGUgc2VydmljZSBjYXRlZ29yeSwgdGhlIGxhbmd1YWdlIGlkZW50aWZpZXIKLSAgICAgKiAgICAgICAgICBhbmQgYSBib29sZWFuIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhdGVnb3J5IGlzIHNldCBhY3RpdmUuCi0gICAgICogQHBhcmFtIHJlc3BvbnNlCi0gICAgICogICAgICAgICAgICBDYWxsYmFjayBtZXNzYWdlIGlzIGVtcHR5IG9uIGNvbXBsZXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKTsKLQotICAgIC8qKgogICAgICAqIFNlbmQgYW4gYWNrbm93bGVkZ2UgbWVzc2FnZS4KICAgICAgKiBAcGFyYW0gc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCBsYXN0IG1lc3NhZ2Ugd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZC4KICAgICAgKiBAcGFyYW0gcmVzdWx0IHJlc3VsdCBjb2RlIGluZGljYXRpbmcgYW55IGVycm9yCkBAIC0xMDY1LDE0ICsxMDMyLDE3IEBACiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVCcm9hZGNhc3RTbXMoQXN5bmNSZXN1bHQgYXIpOwogCi0gICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hCcm9hZGNhc3RQZHVzKGJ5dGVbXVtdIHBkdXMpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoImFuZHJvaWQucHJvdmlkZXIudGVsZXBob255LlNNU19DQl9SRUNFSVZFRCIpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoInBkdXMiLCBwZHVzKTsKLQotICAgICAgICBpZiAoZmFsc2UpCisgICAgcHJvdGVjdGVkIHZvaWQgZGlzcGF0Y2hCcm9hZGNhc3RQZHVzKGJ5dGVbXVtdIHBkdXMsIGJvb2xlYW4gaXNFbWVyZ2VuY3lNZXNzYWdlKSB7CisgICAgICAgIGlmIChpc0VtZXJnZW5jeU1lc3NhZ2UpIHsKKyAgICAgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudHMuU01TX0VNRVJHRU5DWV9DQl9SRUNFSVZFRF9BQ1RJT04pOworICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKCJwZHVzIiwgcGR1cyk7CisgICAgICAgICAgICBMb2cuZChUQUcsICJEaXNwYXRjaGluZyAiICsgcGR1cy5sZW5ndGggKyAiIGVtZXJnZW5jeSBTTVMgQ0IgcGR1cyIpOworICAgICAgICAgICAgZGlzcGF0Y2goaW50ZW50LCAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfRU1FUkdFTkNZX0JST0FEQ0FTVCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50cy5TTVNfQ0JfUkVDRUlWRURfQUNUSU9OKTsKKyAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgicGR1cyIsIHBkdXMpOwogICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGlzcGF0Y2hpbmcgIiArIHBkdXMubGVuZ3RoICsgIiBTTVMgQ0IgcGR1cyIpOwotCi0gICAgICAgIGRpc3BhdGNoKGludGVudCwgImFuZHJvaWQucGVybWlzc2lvbi5SRUNFSVZFX1NNUyIpOworICAgICAgICAgICAgZGlzcGF0Y2goaW50ZW50LCAiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ0VJVkVfU01TIik7CisgICAgICAgIH0KICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDY5NTgwNWMuLjAxYjgwN2QgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9TZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1NlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtNTQsNiArNTQsMTIgQEAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtRGVzaXJlZFBvd2VyU3RhdGU7CiAKICAgICAvKioKKyAgICAgKiAgVmFsdWVzIGNvcnJlc3BvbmQgdG8gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfIGRlZmluaXRpb25zLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgbVJhZGlvVGVjaG5vbG9neSA9IDA7CisgICAgcHJvdGVjdGVkIGludCBtTmV3UmFkaW9UZWNobm9sb2d5ID0gMDsKKworICAgIC8qKgogICAgICAqIEJ5IGRlZmF1bHQsIHN0cmVuZ3RoIHBvbGxpbmcgaXMgZW5hYmxlZC4gIEhvd2V2ZXIsIGlmIHdlJ3JlCiAgICAgICogZ2V0dGluZyB1bnNvbGljaXRlZCBzaWduYWwgc3RyZW5ndGggdXBkYXRlcyBmcm9tIHRoZSByYWRpbywgc2V0CiAgICAgICogdmFsdWUgdG8gdHJ1ZSBhbmQgZG9uJ3QgYm90aGVyIHBvbGxpbmcgYW55IG1vcmUuCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvV2FwUHVzaE92ZXJTbXMuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9XYXBQdXNoT3ZlclNtcy5qYXZhCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Xc3BUeXBlRGVjb2Rlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L1dzcFR5cGVEZWNvZGVyLmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjOGRkNzE4Li43MzI2MGZiCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Xc3BUeXBlRGVjb2Rlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Xc3BUeXBlRGVjb2Rlci5qYXZhCkBAIC0xOTQsNiArMTk0LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9CX1BVU0hfQ08gPSAiYXBwbGljYXRpb24vdm5kLndhcC5jb2MiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRV9CX01NUyA9ICJhcHBsaWNhdGlvbi92bmQud2FwLm1tcy1tZXNzYWdlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RZUEVfQl9QVVNIX1NZTkNNTF9OT1RJID0gImFwcGxpY2F0aW9uL3ZuZC5zeW5jbWwubm90aWZpY2F0aW9uIjsKIAogICAgIGJ5dGVbXSB3c3BEYXRhOwogICAgIGludCAgICBkYXRhTGVuZ3RoOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQUxURVBob25lLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BTFRFUGhvbmUuamF2YQppbmRleCA1ODZlNmIzLi42YTk1YjY3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BTFRFUGhvbmUuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DRE1BTFRFUGhvbmUuamF2YQpAQCAtNTgsMzkgKzU4LDIwIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdFNzdEljYygpIHsKICAgICAgICAgbVNTVCA9IG5ldyBDZG1hTHRlU2VydmljZVN0YXRlVHJhY2tlcih0aGlzKTsKLSAgICAgICAgbUljY1JlY29yZHMgPSBuZXcgU0lNUmVjb3Jkcyh0aGlzKTsKKyAgICAgICAgbUljY1JlY29yZHMgPSBuZXcgQ2RtYUx0ZVVpY2NSZWNvcmRzKHRoaXMpOwogICAgICAgICBtSWNjQ2FyZCA9IG5ldyBTaW1DYXJkKHRoaXMsIExPR19UQUcsIERCRyk7CisgICAgICAgIG1JY2NGaWxlSGFuZGxlciA9IG5ldyBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyKHRoaXMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBEYXRhU3RhdGUgZ2V0RGF0YUNvbm5lY3Rpb25TdGF0ZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICAvLyBUT0RPOiBSZW1vdmUgaW5zdGFuY2VvZiBpZiBwb3NzaWJsZS4KLSAgICAgICAgYm9vbGVhbiBpc0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1EYXRhQ29ubmVjdGlvblRyYWNrZXIgaW5zdGFuY2VvZiBDZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyKSB7Ci0gICAgICAgICAgICBsb2coImdldERhdGFDb25uZWN0aW9uU3RhdGUgaXNDZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyIik7Ci0gICAgICAgICAgICBpc0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nKCJnZXREYXRhQ29ubmVjdGlvblN0YXRlIE5PVCBDZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyIik7Ci0gICAgICAgIH0KICAgICAgICAgRGF0YVN0YXRlIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAKLSAgICAgICAgaWYgKCFpc0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIgJiYgKFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJhZGIuY29ubmVjdGVkIiwgIiIpLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgPiAwKSkgewotICAgICAgICAgICAgLy8gV2UncmUgY29ubmVjdGVkIHRvIGFuIEFEQiBob3N0IGFuZCB3ZSBoYXZlIFVTQiBuZXR3b3JraW5nCi0gICAgICAgICAgICAvLyB0dXJuZWQgb24uIE5vIG1hdHRlciB3aGF0IHRoZSByYWRpbyBzdGF0ZSBpcywKLSAgICAgICAgICAgIC8vIHdlIHJlcG9ydCBkYXRhIGNvbm5lY3RlZAotCi0gICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuQ09OTkVDVEVEOwotICAgICAgICB9IGVsc2UgaWYgKG1TU1QgPT0gbnVsbCkgeworICAgICAgICBpZiAobVNTVCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBSYWRpbyBUZWNobm9sb2d5IENoYW5nZSBpcyBvbmdvbmluZywgZGlzcG9zZSgpIGFuZAotICAgICAgICAgICAgLy8gcmVtb3ZlUmVmZXJlbmNlcygpIGhhdmUKLSAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBjYWxsZWQKKyAgICAgICAgICAgIC8vIHJlbW92ZVJlZmVyZW5jZXMoKSBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQKIAogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKLSAgICAgICAgfSBlbHNlIGlmIChtU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpICE9IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBvdXQgb2Ygc2VydmljZSwgb3BlbiBUQ1Agc29ja2V0cyBtYXkgc3RpbGwgd29yawotICAgICAgICAgICAgLy8gYnV0IG5vIGRhdGEgd2lsbCBmbG93Ci0gICAgICAgICAgICByZXQgPSBEYXRhU3RhdGUuRElTQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgaWYgKG1EYXRhQ29ubmVjdGlvblRyYWNrZXIuaXNBcG5UeXBlRW5hYmxlZChhcG5UeXBlKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MCw2ICsxMjEsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1Mb2NhbGUoU3RyaW5nIGxhbmd1YWdlLCBTdHJpbmcgY291bnRyeSwgYm9vbGVhbiBmcm9tTWNjKSB7CisgICAgICAgIC8vIEF2b2lkIHN5c3RlbSBsb2NhbGUgaXMgc2V0IGZyb20gTUNDIHRhYmxlIGlmIENETUFMVEVQaG9uZSBpcyB1c2VkLgorICAgICAgICAvLyBUaGUgbG9jYWxlIHdpbGwgYmUgcGlja2VkIHVwIGJhc2VkIG9uIEVGcGwvRUZsaSBvbmNlIENTSU0gcmVjb3JkcyBhcmUgbG9hZGVkLgorICAgICAgICBpZiAoZnJvbU1jYykgcmV0dXJuOworCisgICAgICAgIHN1cGVyLnNldFN5c3RlbUxvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgcykgewogICAgICAgICBpZiAoREJHKQogICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIltDRE1BTFRFUGhvbmVdICIgKyBzKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ0RNQVBob25lLmphdmEKaW5kZXggNGZhMzY5YzMuLmJhYzE1YTYgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NETUFQaG9uZS5qYXZhCkBAIC0xNTYsMTMgKzE1NiwxMyBAQAogICAgICAgICBtU1NUID0gbmV3IENkbWFTZXJ2aWNlU3RhdGVUcmFja2VyKHRoaXMpOwogICAgICAgICBtSWNjUmVjb3JkcyA9IG5ldyBSdWltUmVjb3Jkcyh0aGlzKTsKICAgICAgICAgbUljY0NhcmQgPSBuZXcgUnVpbUNhcmQodGhpcywgTE9HX1RBRywgREJHKTsKKyAgICAgICAgbUljY0ZpbGVIYW5kbGVyID0gbmV3IFJ1aW1GaWxlSGFuZGxlcih0aGlzKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KENvbnRleHQgY29udGV4dCwgUGhvbmVOb3RpZmllciBub3RpZmllcikgewogICAgICAgICBtQ00uc2V0UGhvbmVUeXBlKFBob25lLlBIT05FX1RZUEVfQ0RNQSk7CiAgICAgICAgIG1DVCA9IG5ldyBDZG1hQ2FsbFRyYWNrZXIodGhpcyk7CiAgICAgICAgIG1TTVMgPSBuZXcgQ2RtYVNNU0Rpc3BhdGNoZXIodGhpcyk7Ci0gICAgICAgIG1JY2NGaWxlSGFuZGxlciA9IG5ldyBSdWltRmlsZUhhbmRsZXIodGhpcyk7CiAgICAgICAgIG1EYXRhQ29ubmVjdGlvblRyYWNrZXIgPSBuZXcgQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlciAodGhpcyk7CiAgICAgICAgIG1SdWltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlciA9IG5ldyBSdWltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlcih0aGlzKTsKICAgICAgICAgbVJ1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyID0gbmV3IFJ1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyKHRoaXMsIG1TTVMpOwpAQCAtMzM3LDcgKzMzNyw3IEBACiAgICAgcHVibGljIERhdGFBY3Rpdml0eVN0YXRlIGdldERhdGFBY3Rpdml0eVN0YXRlKCkgewogICAgICAgICBEYXRhQWN0aXZpdHlTdGF0ZSByZXQgPSBEYXRhQWN0aXZpdHlTdGF0ZS5OT05FOwogCi0gICAgICAgIGlmIChtU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpID09IFNlcnZpY2VTdGF0ZS5TVEFURV9JTl9TRVJWSUNFKSB7CisgICAgICAgIGlmIChtU1NULmdldEN1cnJlbnREYXRhQ29ubmVjdGlvblN0YXRlKCkgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UpIHsKIAogICAgICAgICAgICAgc3dpdGNoIChtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmdldEFjdGl2aXR5KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIERBVEFJTjoKQEAgLTYxOCw3ICs2MTgsNyBAQAogICAgICAgICAgICAgIC8vIGFscmVhZHkgYmVlbiBjYWxsZWQKIAogICAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNTVC5nZXRDdXJyZW50Q2RtYURhdGFDb25uZWN0aW9uU3RhdGUoKSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgeworICAgICAgICB9IGVsc2UgaWYgKG1TU1QuZ2V0Q3VycmVudERhdGFDb25uZWN0aW9uU3RhdGUoKSAhPSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSkgewogICAgICAgICAgICAgLy8gSWYgd2UncmUgb3V0IG9mIHNlcnZpY2UsIG9wZW4gVENQIHNvY2tldHMgbWF5IHN0aWxsIHdvcmsKICAgICAgICAgICAgIC8vIGJ1dCBubyBkYXRhIHdpbGwgZmxvdwogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKQEAgLTExMjEsNyArMTEyMSw4IEBACiAgICAgICogQHBhcmFtIHJlc3BvbnNlIENhbGxiYWNrIG1lc3NhZ2UgaXMgZW1wdHkgb24gY29tcGxldGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgbVNNUy5hY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoYWN0aXZhdGUsIHJlc3BvbnNlKTsKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIltDRE1BUGhvbmVdIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcygpIGlzIG9ic29sZXRlOyB1c2UgU21zTWFuYWdlciIpOworICAgICAgICByZXNwb25zZS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzAsNyArMTEzMSw4IEBACiAgICAgICogQHBhcmFtIHJlc3BvbnNlIENhbGxiYWNrIG1lc3NhZ2UgaXMgZW1wdHkgb24gY29tcGxldGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoTWVzc2FnZSByZXNwb25zZSkgewotICAgICAgICBtU01TLmdldENlbGxCcm9hZGNhc3RTbXNDb25maWcocmVzcG9uc2UpOworICAgICAgICBMb2cuZShMT0dfVEFHLCAiW0NETUFQaG9uZV0gZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZygpIGlzIG9ic29sZXRlOyB1c2UgU21zTWFuYWdlciIpOworICAgICAgICByZXNwb25zZS5zZW5kVG9UYXJnZXQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzksNyArMTE0MSw4IEBACiAgICAgICogQHBhcmFtIHJlc3BvbnNlIENhbGxiYWNrIG1lc3NhZ2UgaXMgZW1wdHkgb24gY29tcGxldGlvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENlbGxCcm9hZGNhc3RTbXNDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgbVNNUy5zZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ1ZhbHVlc0FycmF5LCByZXNwb25zZSk7CisgICAgICAgIExvZy5lKExPR19UQUcsICJbQ0RNQVBob25lXSBzZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKCkgaXMgb2Jzb2xldGU7IHVzZSBTbXNNYW5hZ2VyIik7CisgICAgICAgIHJlc3BvbnNlLnNlbmRUb1RhcmdldCgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IGUzZTNkNzguLjgwMDYxNWMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFEYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKQEAgLTE3NSw3ICsxNzUsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgaW50IHBzU3RhdGUgPSBtQ2RtYVBob25lLm1TU1QuZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlKCk7CisgICAgICAgIGludCBwc1N0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldEN1cnJlbnREYXRhQ29ubmVjdGlvblN0YXRlKCk7CiAgICAgICAgIGJvb2xlYW4gcm9hbWluZyA9IChtUGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpICYmICFnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKTsKICAgICAgICAgYm9vbGVhbiBkZXNpcmVkUG93ZXJTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXREZXNpcmVkUG93ZXJTdGF0ZSgpOwogCkBAIC0yMTQsMzUgKzIxNCwxNSBAQAogICAgICAgICByZXR1cm4gYWxsb3dlZDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAotICAgICAqIHBvc3NpYmxlIGFyZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YSBpcyBkaXNhbGxvd2VkIChyb2FtaW5nLCBwb3dlciBzdGF0ZSwgdm9pY2UgY2FsbCwgZXRjKS48L2xpPgotICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCi0gICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCi0gICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBkYXRhQWxsb3dlZCA9IGlzRGF0YUFsbG93ZWQoKTsKLSAgICAgICAgYm9vbGVhbiBhbnlEYXRhRW5hYmxlZCA9IGdldEFueURhdGFFbmFibGVkKCk7Ci0gICAgICAgIGJvb2xlYW4gcG9zc2libGUgPSAoZGF0YUFsbG93ZWQKLSAgICAgICAgICAgICAgICAmJiAhKGFueURhdGFFbmFibGVkICYmIChtU3RhdGUgPT0gU3RhdGUuRkFJTEVEIHx8IG1TdGF0ZSA9PSBTdGF0ZS5JRExFKSkpOwotICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRykgewotICAgICAgICAgICAgbG9nKCJpc0RhdGFQb3NzaWJsZSgpICIgKyBwb3NzaWJsZSArICIsIGRhdGFBbGxvd2VkPSIgKyBkYXRhQWxsb3dlZCArCi0gICAgICAgICAgICAgICAgICAgICIgYW55RGF0YUVuYWJsZWQ9IiArIGFueURhdGFFbmFibGVkICsgIiBkYXRhU3RhdGU9IiArIG1TdGF0ZSk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNEYXRhUG9zc2libGUoU3RyaW5nIGFwblR5cGUpIHsKKyAgICAgICAgYm9vbGVhbiBwb3NzaWJsZSA9IGlzRGF0YUFsbG93ZWQoKSAmJiAhKGdldEFueURhdGFFbmFibGVkKCkgJiYKKyAgICAgICAgICAgICAgICAobVN0YXRlID09IFN0YXRlLkZBSUxFRCB8fCBtU3RhdGUgPT0gU3RhdGUuSURMRSkpOworICAgICAgICBpZiAoIXBvc3NpYmxlICYmIERCRyAmJiBpc0RhdGFBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGF0YSBub3QgcG9zc2libGUuICBObyBjb3ZlcmFnZTogZGF0YVN0YXRlID0gIiArIG1TdGF0ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBvc3NpYmxlOwogICAgIH0KLSAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZShTdHJpbmcgYXBuVHlwZSkgewotICAgICAgICByZXR1cm4gaXNEYXRhUG9zc2libGUoKTsKLSAgICB9Ci0KIAogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlTZXR1cERhdGEoU3RyaW5nIHJlYXNvbikgewogICAgICAgICBpZiAoREJHKSBsb2coIioqKnRyeVNldHVwRGF0YSBkdWUgdG8gIiArIChyZWFzb24gPT0gbnVsbCA/ICIodW5zcGVjaWZpZWQpIiA6IHJlYXNvbikpOwpAQCAtMjU4LDcgKzIzOCw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBwc1N0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICBpbnQgcHNTdGF0ZSA9IG1DZG1hUGhvbmUubVNTVC5nZXRDdXJyZW50RGF0YUNvbm5lY3Rpb25TdGF0ZSgpOwogICAgICAgICBib29sZWFuIHJvYW1pbmcgPSBtUGhvbmUuZ2V0U2VydmljZVN0YXRlKCkuZ2V0Um9hbWluZygpOwogICAgICAgICBib29sZWFuIGRlc2lyZWRQb3dlclN0YXRlID0gbUNkbWFQaG9uZS5tU1NULmdldERlc2lyZWRQb3dlclN0YXRlKCk7CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IGQ3OWYwYTFlLi4zMThjZjM3IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9DZG1hTHRlU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYTsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5EYXRhQ29ubmVjdGlvblRyYWNrZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255Lk1jY1RhYmxlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5FdmVudExvZ1RhZ3M7CkBAIC0yNiwyOCArMjUsMjIgQEAKIGltcG9ydCBhbmRyb2lkLnRlbGVwaG9ueS5TZXJ2aWNlU3RhdGU7CiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuY2RtYS5DZG1hQ2VsbExvY2F0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlZ2lzdHJhbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZWdpc3RyYW50TGlzdDsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jUmVzdWx0OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKKwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBhbmRyb2lkLnV0aWwuRXZlbnRMb2c7CiAKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuUmVzdHJpY3RlZFN0YXRlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc20uR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyOwogCiBwdWJsaWMgY2xhc3MgQ2RtYUx0ZVNlcnZpY2VTdGF0ZVRyYWNrZXIgZXh0ZW5kcyBDZG1hU2VydmljZVN0YXRlVHJhY2tlciB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkNETUEiOwotCiAgICAgQ0RNQUxURVBob25lIG1DZG1hTHRlUGhvbmU7CiAKICAgICBwcml2YXRlIFNlcnZpY2VTdGF0ZSAgbUx0ZVNTOyAgLy8gVGhlIGxhc3QgTFRFIHN0YXRlIGZyb20gVm9pY2UgUmVnaXN0cmF0aW9uCiAKICAgICBwdWJsaWMgQ2RtYUx0ZVNlcnZpY2VTdGF0ZVRyYWNrZXIoQ0RNQUxURVBob25lIHBob25lKSB7CiAgICAgICAgIHN1cGVyKHBob25lKTsKKyAgICAgICAgY20ucmVnaXN0ZXJGb3JTSU1SZWFkeSh0aGlzLCBFVkVOVF9TSU1fUkVBRFksIG51bGwpOwogICAgICAgICBtQ2RtYUx0ZVBob25lID0gcGhvbmU7CiAKICAgICAgICAgbUx0ZVNTID0gbmV3IFNlcnZpY2VTdGF0ZSgpOwpAQCAtNTUsMTUgKzQ4LDQ0IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgY20udW5yZWdpc3RlckZvclNJTVJlYWR5KHRoaXMpOworICAgICAgICBzdXBlci5kaXNwb3NlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICBBc3luY1Jlc3VsdCBhcjsKICAgICAgICAgaW50W10gaW50czsKICAgICAgICAgU3RyaW5nW10gc3RyaW5nczsKLSAgICAgICAgaWYgKG1zZy53aGF0ID09IEVWRU5UX1BPTExfU1RBVEVfR1BSUykgeworICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7CisgICAgICAgIGNhc2UgRVZFTlRfUE9MTF9TVEFURV9HUFJTOgogICAgICAgICAgICAgaWYgKERCRykgbG9nKCJoYW5kbGVNZXNzYWdlIEVWRU5UX1BPTExfU1RBVEVfR1BSUyIpOwogICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpbXNnLm9iajsKICAgICAgICAgICAgIGhhbmRsZVBvbGxTdGF0ZVJlc3VsdChtc2cud2hhdCwgYXIpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfU0lNX1JFQURZOgorICAgICAgICAgICAgaWYgKERCRykgbG9nKCJoYW5kbGVNZXNzYWdlIEVWRU5UX1NJTV9SRUFEWSIpOworICAgICAgICAgICAgaXNTdWJzY3JpcHRpb25Gcm9tUnVpbSA9IGZhbHNlOworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgU0lNX1JFQ09SRFNfTE9BREVEIGR5bmFtaWNhbGx5LgorICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBhdm9pZCBjb25maWxjdCB3aXRoIFJVSU1fUkVBRFkgc2NlbmFyaW8pCisgICAgICAgICAgICBwaG9uZS5tSWNjUmVjb3Jkcy5yZWdpc3RlckZvclJlY29yZHNMb2FkZWQodGhpcywgRVZFTlRfU0lNX1JFQ09SRFNfTE9BREVELCBudWxsKTsKKyAgICAgICAgICAgIHBvbGxTdGF0ZSgpOworICAgICAgICAgICAgLy8gU2lnbmFsIHN0cmVuZ3RoIHBvbGxpbmcgc3RvcHMgd2hlbiByYWRpbyBpcyBvZmYuCisgICAgICAgICAgICBxdWV1ZU5leHRTaWduYWxTdHJlbmd0aFBvbGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1NJTV9SRUNPUkRTX0xPQURFRDoKKyAgICAgICAgICAgIENkbWFMdGVVaWNjUmVjb3JkcyBzaW0gPSAoQ2RtYUx0ZVVpY2NSZWNvcmRzKXBob25lLm1JY2NSZWNvcmRzOworICAgICAgICAgICAgaWYgKChzaW0gIT0gbnVsbCkgJiYgc2ltLmlzUHJvdmlzaW9uZWQoKSkgeworICAgICAgICAgICAgICAgIG1NZG4gPSBzaW0uZ2V0TWRuKCk7CisgICAgICAgICAgICAgICAgbU1pbiA9IHNpbS5nZXRNaW4oKTsKKyAgICAgICAgICAgICAgICBwYXJzZVNpZE5pZChzaW0uZ2V0U2lkKCksIHNpbS5nZXROaWQoKSk7CisgICAgICAgICAgICAgICAgbVBybFZlcnNpb24gPSBzaW0uZ2V0UHJsVmVyc2lvbigpOzsKKyAgICAgICAgICAgICAgICBtSXNNaW5JbmZvUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgIHVwZGF0ZU90YXNwU3RhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTcxLDM5ICsxOTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmV0d29ya1R5cGVUb1N0cmluZyhpbnQgdHlwZSkgewotICAgICAgICBTdHJpbmcgcmV0ID0gInVua25vd24iOwotCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9JUzk1QToKLSAgICAgICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfSVM5NUI6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIkNETUEiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV8xeFJUVDoKLSAgICAgICAgICAgICAgICByZXQgPSAiQ0RNQSAtIDF4UlRUIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET18wOgotICAgICAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gRXZEbyByZXYuIDAiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPX0E6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIkNETUEgLSBFdkRvIHJldi4gQSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQjoKLSAgICAgICAgICAgICAgICByZXQgPSAiQ0RNQSAtIEV2RG8gcmV2LiBCIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfTFRFOgotICAgICAgICAgICAgICAgIHJldCA9ICJMVEUiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FSFJQRDoKLSAgICAgICAgICAgICAgICByZXQgPSAiQ0RNQSAtIGVIUlBEIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc2xvZ2UoIm5ldHdvcmtUeXBlVG9TdHJpbmc6IFdyb25nIG5ldHdvcmssIGNhbiBub3QgcmV0dXJuIGEgc3RyaW5nLiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgcG9sbFN0YXRlRG9uZSgpIHsKICAgICAgICAgLy8gZGV0ZXJtaW5lIGRhdGEgTmV0d29ya1R5cGUgZnJvbSBib3RoIExFVCBhbmQgQ0RNQSBTUwpAQCAtMjY3LDEzICsyNTYsMjAgQEAKICAgICAgICAgICAgICAobmV3TmV0d29ya1R5cGUgPD0gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET19BKSk7CiAKICAgICAgICAgaWYgKERCRykgewotICAgICAgICAgICAgbG9nKCJwb2xsU3RhdGVEb25lOiBoYXNSZWdpc3RlcmVkID0gIgotICAgICAgICAgICAgICAgICsgaGFzUmVnaXN0ZXJlZCArICIgaGFzQ2RtYURhdGFDb25uZWN0aW9uQXR0YWNoZWQgPSAiCi0gICAgICAgICAgICAgICAgKyBoYXNDZG1hRGF0YUNvbm5lY3Rpb25BdHRhY2hlZCArICIgaGFzQ2RtYURhdGFDb25uZWN0aW9uQ2hhbmdlZCA9ICIKLSAgICAgICAgICAgICAgICArIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkNoYW5nZWQgKyAiIGhhc05ldHdvcmtUeXBlQ2hhbmdlZCA9ICIKLSAgICAgICAgICAgICAgICArIGhhc05ldHdvcmtUeXBlQ2hhbmdlZCArICIgaGFzNGdIYW5kb2ZmID0gIiArIGhhczRnSGFuZG9mZgotICAgICAgICAgICAgICAgICsgIiBoYXNNdWx0aUFwblN1cHBvcnQgPSAiICsgaGFzTXVsdGlBcG5TdXBwb3J0ICsgIiBoYXNMb3N0TXVsdGlBcG5TdXBwb3J0ID0gIgotICAgICAgICAgICAgICAgICsgaGFzTG9zdE11bHRpQXBuU3VwcG9ydCk7CisgICAgICAgICAgICBsb2coInBvbGxTdGF0ZURvbmU6IgorICAgICAgICAgICAgICAgICsgIiBoYXNSZWdpc3RlcmVkPSIgKyBoYXNSZWdpc3RlcmVkCisgICAgICAgICAgICAgICAgKyAiIGhhc0RlZWdpc3RlcmVkPSIgKyBoYXNEZXJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICArICIgaGFzQ2RtYURhdGFDb25uZWN0aW9uQXR0YWNoZWQ9IiArIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkF0dGFjaGVkCisgICAgICAgICAgICAgICAgKyAiIGhhc0NkbWFEYXRhQ29ubmVjdGlvbkRldGFjaGVkPSIgKyBoYXNDZG1hRGF0YUNvbm5lY3Rpb25EZXRhY2hlZAorICAgICAgICAgICAgICAgICsgIiBoYXNDZG1hRGF0YUNvbm5lY3Rpb25DaGFuZ2VkPSIgKyBoYXNDZG1hRGF0YUNvbm5lY3Rpb25DaGFuZ2VkCisgICAgICAgICAgICAgICAgKyAiIGhhc05ldHdvcmtUeXBlQ2hhbmdlZCA9ICIgKyBoYXNOZXR3b3JrVHlwZUNoYW5nZWQKKyAgICAgICAgICAgICAgICArICIgaGFzQ2hhbmdlZD0iICsgaGFzQ2hhbmdlZAorICAgICAgICAgICAgICAgICsgIiBoYXNSb2FtaW5nT249IiArIGhhc1JvYW1pbmdPbgorICAgICAgICAgICAgICAgICsgIiBoYXNSb2FtaW5nT2ZmPSIgKyBoYXNSb2FtaW5nT2ZmCisgICAgICAgICAgICAgICAgKyAiIGhhc0xvY2F0aW9uQ2hhbmdlZD0iICsgaGFzTG9jYXRpb25DaGFuZ2VkCisgICAgICAgICAgICAgICAgKyAiIGhhczRnSGFuZG9mZiA9ICIgKyBoYXM0Z0hhbmRvZmYKKyAgICAgICAgICAgICAgICArICIgaGFzTXVsdGlBcG5TdXBwb3J0PSIgKyBoYXNNdWx0aUFwblN1cHBvcnQKKyAgICAgICAgICAgICAgICArICIgaGFzTG9zdE11bHRpQXBuU3VwcG9ydD0iICsgaGFzTG9zdE11bHRpQXBuU3VwcG9ydCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQWRkIGFuIGV2ZW50IGxvZyB3aGVuIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlcwogICAgICAgICBpZiAoc3MuZ2V0U3RhdGUoKSAhPSBuZXdTUy5nZXRTdGF0ZSgpCkBAIC0zMDEsNyArMjk3LDcgQEAKICAgICAgICAgICAgICAgICAmJiAocGhvbmUubURhdGFDb25uZWN0aW9uVHJhY2tlciBpbnN0YW5jZW9mIEdzbURhdGFDb25uZWN0aW9uVHJhY2tlcikpIHsKICAgICAgICAgICAgIGlmIChEQkcpbG9nKCJHc21EYXRhQ29ubmVjdGlvblRyYWNrZXIgZGlzcG9zZWQiKTsKICAgICAgICAgICAgIHBob25lLm1EYXRhQ29ubmVjdGlvblRyYWNrZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgcGhvbmUubURhdGFDb25uZWN0aW9uVHJhY2tlciA9IG5ldyBDZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyKChDRE1BUGhvbmUpcGhvbmUpOworICAgICAgICAgICAgcGhvbmUubURhdGFDb25uZWN0aW9uVHJhY2tlciA9IG5ldyBDZG1hRGF0YUNvbm5lY3Rpb25UcmFja2VyKHBob25lKTsKICAgICAgICAgfQogCiAgICAgICAgIENkbWFDZWxsTG9jYXRpb24gdGNsID0gY2VsbExvYzsKQEAgLTMxNSw3ICszMTEsNyBAQAogCiAgICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKICAgICAgICAgICAgIHBob25lLnNldFN5c3RlbVByb3BlcnR5KFRlbGVwaG9ueVByb3BlcnRpZXMuUFJPUEVSVFlfREFUQV9ORVRXT1JLX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIG5ldHdvcmtUeXBlVG9TdHJpbmcobmV0d29ya1R5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgU2VydmljZVN0YXRlLnJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKG5ldHdvcmtUeXBlKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFzUmVnaXN0ZXJlZCkgewpAQCAtMzM2LDcgKzMzMiwxNCBAQAogICAgICAgICAgICAgICAgICAgICBlcmlUZXh0ID0gcGhvbmUuZ2V0Q29udGV4dCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5zdHJpbmcucm9hbWluZ1RleHRTZWFyY2hpbmcpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNzLnNldENkbWFFcmlUZXh0KGVyaVRleHQpOworICAgICAgICAgICAgICAgIHNzLnNldE9wZXJhdG9yQWxwaGFMb25nKGVyaVRleHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNtLmdldFNpbVN0YXRlKCkuaXNTSU1SZWFkeSgpKSB7CisgICAgICAgICAgICAgICAgLy8gU0lNIGlzIGZvdW5kIG9uIHRoZSBkZXZpY2UuIFJlYWQgdGhlIG9wZXJhdG9yIG5hbWUgZnJvbSB0aGUgY2FyZC4KKyAgICAgICAgICAgICAgICBzcy5zZXRPcGVyYXRvckFscGhhTG9uZyhwaG9uZS5tSWNjUmVjb3Jkcy5nZXRTZXJ2aWNlUHJvdmlkZXJOYW1lKCkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgU0lNIGNhcmQgaXMgcHJlc2VudCwgRXJpIHdpbGwgbm90IGJlIHVzZWQuIFR1cm4gaXQgb2ZmCisgICAgICAgICAgICAgICAgc3Muc2V0Q2RtYUVyaUljb25JbmRleChFcmlJbmZvLlJPQU1JTkdfSU5ESUNBVE9SX09GRik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyBvcGVyYXRvck51bWVyaWM7CkBAIC00MDAsNiArNDAzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2lnbmFsU3RyZW5ndGhSZXN1bHQoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgU2lnbmFsU3RyZW5ndGggb2xkU2lnbmFsU3RyZW5ndGggPSBtU2lnbmFsU3RyZW5ndGg7CiAKQEAgLTQ0MSw2ICs0NDUsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhQWxsb3dlZCgpIHsKICAgICAgICAgLy8gTm90ZTogaXQgbmVlZHMgdG8gYmUgY29uZmlybWVkIHdoaWNoIENETUEgbmV0d29yayB0eXBlcwogICAgICAgICAvLyBjYW4gc3VwcG9ydCB2b2ljZSBhbmQgZGF0YSBjYWxscyBjb25jdXJyZW50bHkuCkBAIC00NDksNiArNDU0LDE2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIE9UQVNQX05PVF9ORUVERUQgYXMgaXRzIG5vdCBuZWVkZWQgZm9yIExURQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIGludCBnZXRPdGFzcCgpIHsKKyAgICAgICAgaW50IHByb3Zpc2lvbmluZ1N0YXRlID0gT1RBU1BfTk9UX05FRURFRDsKKyAgICAgICAgaWYgKERCRykgbG9nKCJnZXRPdGFzcDogc3RhdGU9IiArIHByb3Zpc2lvbmluZ1N0YXRlKTsKKyAgICAgICAgcmV0dXJuIHByb3Zpc2lvbmluZ1N0YXRlOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgcykgewogICAgICAgICBMb2cuZChMT0dfVEFHLCAiW0NkbWFMdGVTU1RdICIgKyBzKTsKQEAgLTQ1OCw4ICs0NzMsNCBAQAogICAgIHByb3RlY3RlZCB2b2lkIGxvZ2UoU3RyaW5nIHMpIHsKICAgICAgICAgTG9nLmUoTE9HX1RBRywgIltDZG1hTHRlU1NUXSAiICsgcyk7CiAgICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNsb2dlKFN0cmluZyBzKSB7Ci0gICAgICAgIExvZy5lKExPR19UQUcsICJbQ2RtYUx0ZVNTVF0gIiArIHMpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjRmlsZUhhbmRsZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjRmlsZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ3YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ29uc3RhbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NGaWxlSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CisKKy8qKgorICoge0BoaWRlfQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2RtYUx0ZVVpY2NGaWxlSGFuZGxlciBleHRlbmRzIEljY0ZpbGVIYW5kbGVyIHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiQ0RNQSI7CisKKyAgICBDZG1hTHRlVWljY0ZpbGVIYW5kbGVyKENETUFMVEVQaG9uZSBwaG9uZSkgeworICAgICAgICBzdXBlcihwaG9uZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFRlBhdGgoaW50IGVmaWQpIHsKKyAgICAgICAgc3dpdGNoKGVmaWQpIHsKKyAgICAgICAgY2FzZSBFRl9DU0lNX1NQTjoKKyAgICAgICAgY2FzZSBFRl9DU0lNX0xJOgorICAgICAgICBjYXNlIEVGX0NTSU1fTUROOgorICAgICAgICBjYXNlIEVGX0NTSU1fSU1TSU06CisgICAgICAgIGNhc2UgRUZfQ1NJTV9DRE1BSE9NRToKKyAgICAgICAgY2FzZSBFRl9DU0lNX0VQUkw6CisgICAgICAgICAgICByZXR1cm4gTUZfU0lNICsgREZfQ0RNQTsKKyAgICAgICAgY2FzZSBFRl9BRDoKKyAgICAgICAgICAgIHJldHVybiBNRl9TSU0gKyBERl9HU007CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldENvbW1vbkljY0VGUGF0aChlZmlkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBsb2FkRUZUcmFuc3BhcmVudChpbnQgZmlsZWlkLCBNZXNzYWdlIG9uTG9hZGVkKSB7CisgICAgICAgIGlmIChmaWxlaWQgPT0gRUZfQ1NJTV9FUFJMKSB7CisgICAgICAgICAgICAvLyBFbnRpcmUgUFJMIGNvdWxkIGJlIGh1Z2UuIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4KKyAgICAgICAgICAgIC8vIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSByZWNvcmQuCisgICAgICAgICAgICBwaG9uZS5tQ00uaWNjSU8oQ09NTUFORF9SRUFEX0JJTkFSWSwgZmlsZWlkLCBnZXRFRlBhdGgoZmlsZWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCA0LCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9idGFpbk1lc3NhZ2UoRVZFTlRfUkVBRF9CSU5BUllfRE9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVpZCwgMCwgb25Mb2FkZWQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmxvYWRFRlRyYW5zcGFyZW50KGZpbGVpZCwgb25Mb2FkZWQpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dkKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmQoTE9HX1RBRywgIltDZG1hTHRlVWljY0ZpbGVIYW5kbGVyXSAiICsgbXNnKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2dlKFN0cmluZyBtc2cpIHsKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIltDZG1hTHRlVWljY0ZpbGVIYW5kbGVyXSAiICsgbXNnKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjUmVjb3Jkcy5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYUx0ZVVpY2NSZWNvcmRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzNiNWQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFMdGVVaWNjUmVjb3Jkcy5qYXZhCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlRlbGVwaG9ueVByb3BlcnRpZXMuUFJPUEVSVFlfSUNDX09QRVJBVE9SX0FMUEhBOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5Hc21BbHBoYWJldDsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjQ2FyZEFwcGxpY2F0aW9uLkFwcFR5cGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0ZpbGVIYW5kbGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5JY2NVdGlsczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuTWNjVGFibGU7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlBob25lQmFzZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuY2RtYS5zbXMuVXNlckRhdGE7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TSU1SZWNvcmRzOworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNSZXN1bHQ7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtUHJvcGVydGllczsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDZG1hTHRlVWljY1JlY29yZHMgZXh0ZW5kcyBTSU1SZWNvcmRzIHsKKyAgICAvLyBGcm9tIENTSU0gYXBwbGljYXRpb24KKyAgICBwcml2YXRlIGJ5dGVbXSBtRUZwbCA9IG51bGw7CisgICAgcHJpdmF0ZSBieXRlW10gbUVGbGkgPSBudWxsOworICAgIGJvb2xlYW4gY3NpbVNwbkRpc3BsYXlDb25kaXRpb24gPSBmYWxzZTsKKyAgICBwcml2YXRlIFN0cmluZyBtTWRuOworICAgIHByaXZhdGUgU3RyaW5nIG1NaW47CisgICAgcHJpdmF0ZSBTdHJpbmcgbVBybFZlcnNpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgbUhvbWVTeXN0ZW1JZDsKKyAgICBwcml2YXRlIFN0cmluZyBtSG9tZU5ldHdvcmtJZDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfUExfRE9ORSA9IENTSU1fRVZFTlRfQkFTRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NTSU1fTElfRE9ORSA9IENTSU1fRVZFTlRfQkFTRSArIDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9DU0lNX1NQTl9ET05FID0gQ1NJTV9FVkVOVF9CQVNFICsgMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NTSU1fTUROX0RPTkUgPSBDU0lNX0VWRU5UX0JBU0UgKyAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQ1NJTV9JTVNJTV9ET05FID0gQ1NJTV9FVkVOVF9CQVNFICsgNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NTSU1fQ0RNQUhPTUVfRE9ORSA9IENTSU1fRVZFTlRfQkFTRSArIDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9DU0lNX0VQUkxfRE9ORSA9IENTSU1fRVZFTlRfQkFTRSArIDY7CisKKyAgICBwdWJsaWMgQ2RtYUx0ZVVpY2NSZWNvcmRzKFBob25lQmFzZSBwKSB7CisgICAgICAgIHN1cGVyKHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKKyAgICAgICAgQXN5bmNSZXN1bHQgYXI7CisgICAgICAgIGJ5dGUgZGF0YVtdOworCisgICAgICAgIGJvb2xlYW4gaXNDc2ltUmVjb3JkTG9hZFJlc3BvbnNlID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsgc3dpdGNoIChtc2cud2hhdCkgeworICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfUExfRE9ORToKKyAgICAgICAgICAgICAgICAvLyBSZWZlciB0byBFVFNJIFRTLjEwMi4yMjEKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkVGX0dFVF9FRl9QTF9ET05FIik7CisgICAgICAgICAgICAgICAgaXNDc2ltUmVjb3JkTG9hZFJlc3BvbnNlID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KSBtc2cub2JqOworCisgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJhci5leGNlcHRpb24gPSAiICsgYXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUVGcGwgPSAoYnl0ZVtdKSBhci5yZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJFRl9QTD0iICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhtRUZwbCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEVWRU5UX0dFVF9DU0lNX0xJX0RPTkU6CisgICAgICAgICAgICAgICAgLy8gUmVmZXIgdG8gQy5TMDA2NSA1LjIuMjYKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkVWRU5UX0dFVF9DU0lNX0xJX0RPTkUiKTsKKyAgICAgICAgICAgICAgICBpc0NzaW1SZWNvcmRMb2FkUmVzcG9uc2UgPSB0cnVlOworCisgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJhci5leGNlcHRpb24gPSAiICsgYXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUVGbGkgPSAoYnl0ZVtdKSBhci5yZXN1bHQ7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCBjc2ltIGVmbGkgZGF0YSB0byBpc28gNjM5IGZvcm1hdAorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUVGbGkubGVuZ3RoOyBpKz0yKSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtRUZsaVtpKzFdKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMTogbUVGbGlbaV0gPSAnZSc7IG1FRmxpW2krMV0gPSAnbic7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjogbUVGbGlbaV0gPSAnZic7IG1FRmxpW2krMV0gPSAncic7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMzogbUVGbGlbaV0gPSAnZSc7IG1FRmxpW2krMV0gPSAncyc7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNDogbUVGbGlbaV0gPSAnaic7IG1FRmxpW2krMV0gPSAnYSc7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNTogbUVGbGlbaV0gPSAnayc7IG1FRmxpW2krMV0gPSAnbyc7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNjogbUVGbGlbaV0gPSAneic7IG1FRmxpW2krMV0gPSAnaCc7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNzogbUVGbGlbaV0gPSAnaCc7IG1FRmxpW2krMV0gPSAnZSc7YnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IG1FRmxpW2ldID0gJyAnOyBtRUZsaVtpKzFdID0gJyAnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJFRl9MST0iICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhtRUZsaSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFVkVOVF9HRVRfQ1NJTV9TUE5fRE9ORToKKyAgICAgICAgICAgICAgICAvLyBSZWZlciB0byBDLlMwMDY1IDUuMi4zMgorICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRVZFTlRfR0VUX0NTSU1fU1BOX0RPTkUiKTsKKyAgICAgICAgICAgICAgICBpc0NzaW1SZWNvcmRMb2FkUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KSBtc2cub2JqOworCisgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJhci5leGNlcHRpb249IiArIGFyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbkdldENTaW1TcG5Eb25lKGFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX0NTSU1fTUROX0RPTkU6CisgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJFVkVOVF9HRVRfQ1NJTV9NRE5fRE9ORSIpOworICAgICAgICAgICAgICAgIGlzQ3NpbVJlY29yZExvYWRSZXNwb25zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYXIgPSAoQXN5bmNSZXN1bHQpIG1zZy5vYmo7CisgICAgICAgICAgICAgICAgaWYgKGFyLmV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKExPR19UQUcsICJhci5leGNlcHRpb249IiArIGFyLmV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbkdldENTaW1NZG5Eb25lKGFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX0NTSU1fSU1TSU1fRE9ORToKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkVWRU5UX0dFVF9DU0lNX0lNU0lNX0RPTkUiKTsKKyAgICAgICAgICAgICAgICBpc0NzaW1SZWNvcmRMb2FkUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiYXIuZXhjZXB0aW9uPSIgKyBhci5leGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb25HZXRDU2ltSW1zaW1Eb25lKGFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX0NTSU1fQ0RNQUhPTUVfRE9ORToKKyAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkVWRU5UX0dFVF9DU0lNX0NETUFIT01FX0RPTkUiKTsKKyAgICAgICAgICAgICAgICBpc0NzaW1SZWNvcmRMb2FkUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGFyID0gKEFzeW5jUmVzdWx0KSBtc2cub2JqOworICAgICAgICAgICAgICAgIGlmIChhci5leGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShMT0dfVEFHLCAiYXIuZXhjZXB0aW9uPSIgKyBhci5leGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb25HZXRDU2ltQ2RtYUhvbWVEb25lKGFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRVZFTlRfR0VUX0NTSU1fRVBSTF9ET05FOgorICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiRVZFTlRfR0VUX0NTSU1fRVBSTF9ET05FIik7CisgICAgICAgICAgICAgICAgaXNDc2ltUmVjb3JkTG9hZFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBhciA9IChBc3luY1Jlc3VsdCkgbXNnLm9iajsKKyAgICAgICAgICAgICAgICBpZiAoYXIuZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgImFyLmV4Y2VwdGlvbj0iICsgYXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9uR2V0Q1NpbUVwcmxEb25lKGFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc3VwZXIuaGFuZGxlTWVzc2FnZShtc2cpOworICAgICAgICB9fWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4YykgeworICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkV4Y2VwdGlvbiBwYXJzaW5nIFNJTSByZWNvcmQiLCBleGMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGlzQ3NpbVJlY29yZExvYWRSZXNwb25zZSkgeworICAgICAgICAgICAgICAgIG9uUmVjb3JkTG9hZGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlY29yZExvYWRlZCgpIHsKKyAgICAgICAgLy8gT25lIHJlY29yZCBsb2FkZWQgc3VjY2Vzc2Z1bGx5IG9yIGZhaWxlZCwgSW4gZWl0aGVyIGNhc2UKKyAgICAgICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHJlY29yZHNUb0xvYWQgY291bnQKKyAgICAgICAgcmVjb3Jkc1RvTG9hZCAtPSAxOworCisgICAgICAgIGlmIChyZWNvcmRzVG9Mb2FkID09IDAgJiYgcmVjb3Jkc1JlcXVlc3RlZCA9PSB0cnVlKSB7CisgICAgICAgICAgICBvbkFsbFJlY29yZHNMb2FkZWQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWNvcmRzVG9Mb2FkIDwgMCkgeworICAgICAgICAgICAgTG9nLmUoTE9HX1RBRywgIlNJTVJlY29yZHM6IHJlY29yZHNUb0xvYWQgPDAsIHByb2dyYW1tZXIgZXJyb3Igc3VzcGVjdGVkIik7CisgICAgICAgICAgICByZWNvcmRzVG9Mb2FkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQWxsUmVjb3Jkc0xvYWRlZCgpIHsKKyAgICAgICAgc3VwZXIub25BbGxSZWNvcmRzTG9hZGVkKCk7CisgICAgICAgIHNldExvY2FsZUZyb21Dc2ltKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmV0Y2hTaW1SZWNvcmRzKCkgeworICAgICAgICBJY2NGaWxlSGFuZGxlciBpY2NGaCA9IHBob25lLmdldEljY0ZpbGVIYW5kbGVyKCk7CisgICAgICAgIHJlY29yZHNSZXF1ZXN0ZWQgPSB0cnVlOworCisgICAgICAgIHBob25lLm1DTS5nZXRJTVNJKG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0lNU0lfRE9ORSkpOworICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisKKyAgICAgICAgaWNjRmgubG9hZEVGVHJhbnNwYXJlbnQoRUZfSUNDSUQsIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0lDQ0lEX0RPTkUpKTsKKyAgICAgICAgcmVjb3Jkc1RvTG9hZCsrOworCisgICAgICAgIGljY0ZoLmxvYWRFRlRyYW5zcGFyZW50KEVGX0FELCBvYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9BRF9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKworICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9QTCwgb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfUExfRE9ORSkpOworICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisKKyAgICAgICAgaWNjRmgubG9hZEVGVHJhbnNwYXJlbnQoRUZfQ1NJTV9MSSwgb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQ1NJTV9MSV9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKworICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9DU0lNX1NQTiwgb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQ1NJTV9TUE5fRE9ORSkpOworICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisKKyAgICAgICAgaWNjRmgubG9hZEVGTGluZWFyRml4ZWQoRUZfQ1NJTV9NRE4sIDEsIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0NTSU1fTUROX0RPTkUpKTsKKyAgICAgICAgcmVjb3Jkc1RvTG9hZCsrOworCisgICAgICAgIGljY0ZoLmxvYWRFRlRyYW5zcGFyZW50KEVGX0NTSU1fSU1TSU0sIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0NTSU1fSU1TSU1fRE9ORSkpOworICAgICAgICByZWNvcmRzVG9Mb2FkKys7CisKKyAgICAgICAgaWNjRmgubG9hZEVGTGluZWFyRml4ZWRBbGwoRUZfQ1NJTV9DRE1BSE9NRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShFVkVOVF9HRVRfQ1NJTV9DRE1BSE9NRV9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKworICAgICAgICBpY2NGaC5sb2FkRUZUcmFuc3BhcmVudChFRl9DU0lNX0VQUkwsIG9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX0NTSU1fRVBSTF9ET05FKSk7CisgICAgICAgIHJlY29yZHNUb0xvYWQrKzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25HZXRDU2ltU3BuRG9uZShBc3luY1Jlc3VsdCBhcikgeworICAgICAgICBieXRlW10gZGF0YSA9IChieXRlW10pIGFyLnJlc3VsdDsKKyAgICAgICAgaWYgKERCRykgbG9nKCJDU0lNX1NQTj0iICsKKyAgICAgICAgICAgICAgICAgICAgIEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcoZGF0YSkpOworCisgICAgICAgIC8vIEMuUzAwNjUgZm9yIEVGX1NQTiBkZWNvZGluZworICAgICAgICBjc2ltU3BuRGlzcGxheUNvbmRpdGlvbiA9ICgoMHgwMiAmIGRhdGFbMF0pID4gMCk/dHJ1ZTpmYWxzZTsKKworICAgICAgICBpbnQgZW5jb2RpbmcgPSBkYXRhWzFdOworICAgICAgICBpbnQgbGFuZ3VhZ2UgPSBkYXRhWzJdOworICAgICAgICBieXRlW10gc3BuRGF0YSA9IG5ldyBieXRlWzMyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAzLCBzcG5EYXRhLCAwLCAoZGF0YS5sZW5ndGggPCAzMik/ZGF0YS5sZW5ndGg6MzIpOworCisgICAgICAgIGludCBudW1CeXRlczsKKyAgICAgICAgZm9yIChudW1CeXRlcyA9IDA7IG51bUJ5dGVzIDwgc3BuRGF0YS5sZW5ndGg7IG51bUJ5dGVzKyspIHsKKyAgICAgICAgICAgIGlmICgoc3BuRGF0YVtudW1CeXRlc10gJiAweEZGKSA9PSAweEZGKSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChudW1CeXRlcyA9PSAwKSB7CisgICAgICAgICAgICBzcG4gPSAiIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykgeworICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19PQ1RFVDoKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfTEFUSU46CisgICAgICAgICAgICAgICAgc3BuID0gbmV3IFN0cmluZyhzcG5EYXRhLCAwLCBudW1CeXRlcywgIklTTy04ODU5LTEiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfSUE1OgorICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19HU01fN0JJVF9BTFBIQUJFVDoKKyAgICAgICAgICAgIGNhc2UgVXNlckRhdGEuRU5DT0RJTkdfN0JJVF9BU0NJSToKKyAgICAgICAgICAgICAgICBzcG4gPSBHc21BbHBoYWJldC5nc203Qml0UGFja2VkVG9TdHJpbmcoc3BuRGF0YSwgMCwgKG51bUJ5dGVzKjgpLzcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBVc2VyRGF0YS5FTkNPRElOR19VTklDT0RFXzE2OgorICAgICAgICAgICAgICAgIHNwbiA9ICBuZXcgU3RyaW5nKHNwbkRhdGEsIDAsIG51bUJ5dGVzLCAidXRmLTE2Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGxvZygiU1BOIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nKCJzcG4gZGVjb2RlIGVycm9yOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgbG9nKCJzcG49IiArIHNwbik7CisgICAgICAgIGlmIChEQkcpIGxvZygic3BuQ29uZGl0aW9uPSIgKyBjc2ltU3BuRGlzcGxheUNvbmRpdGlvbik7CisgICAgICAgIHBob25lLnNldFN5c3RlbVByb3BlcnR5KFBST1BFUlRZX0lDQ19PUEVSQVRPUl9BTFBIQSwgc3BuKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25HZXRDU2ltTWRuRG9uZShBc3luY1Jlc3VsdCBhcikgeworICAgICAgICBieXRlW10gZGF0YSA9IChieXRlW10pIGFyLnJlc3VsdDsKKyAgICAgICAgaWYgKERCRykgbG9nKCJDU0lNX01ETj0iICsgSWNjVXRpbHMuYnl0ZXNUb0hleFN0cmluZyhkYXRhKSk7CisgICAgICAgIGludCBtZG5EaWdpdHNOdW0gPSAweDBGICYgZGF0YVswXTsKKyAgICAgICAgbU1kbiA9IEljY1V0aWxzLmNkbWFCY2RUb1N0cmluZyhkYXRhLCAxLCBtZG5EaWdpdHNOdW0pOworICAgICAgICBpZiAoREJHKSBsb2coIkNTSU0gTUROPSIgKyBtTWRuKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25HZXRDU2ltSW1zaW1Eb25lKEFzeW5jUmVzdWx0IGFyKSB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gKGJ5dGVbXSkgYXIucmVzdWx0OworICAgICAgICBpZiAoREJHKSBsb2coIkNTSU1fSU1TSU09IiArIEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcoZGF0YSkpOworICAgICAgICAvLyBDLlMwMDY1IHNlY3Rpb24gNS4yLjIgZm9yIElNU0lfTSBlbmNvZGluZworICAgICAgICAvLyBDLlMwMDA1IHNlY3Rpb24gMi4zLjEgZm9yIE1JTiBlbmNvZGluZyBpbiBJTVNJX00uCisgICAgICAgIGJvb2xlYW4gcHJvdmlzaW9uZWQgPSAoKGRhdGFbN10gJiAweDgwKSA9PSAweDgwKTsKKworICAgICAgICBpZiAocHJvdmlzaW9uZWQpIHsKKyAgICAgICAgICAgIGludCBmaXJzdDNkaWdpdHMgPSAoKDB4MDMgJiBkYXRhWzJdKSA8PCA4KSArICgweEZGICYgZGF0YVsxXSk7CisgICAgICAgICAgICBpbnQgc2Vjb25kM2RpZ2l0cyA9ICgoKDB4RkYgJiBkYXRhWzVdKSA8PCA4KSB8ICgweEZGICYgZGF0YVs0XSkpID4+IDY7CisgICAgICAgICAgICBpbnQgZGlnaXQ3ID0gMHgwRiAmIChkYXRhWzRdID4+IDIpOworICAgICAgICAgICAgaWYgKGRpZ2l0NyA+IDB4MDkpIGRpZ2l0NyA9IDA7CisgICAgICAgICAgICBpbnQgbGFzdDNkaWdpdHMgPSAoKDB4MDMgJiBkYXRhWzRdKSA8PCA4KSB8ICgweEZGICYgZGF0YVszXSk7CisgICAgICAgICAgICBmaXJzdDNkaWdpdHMgPSBhZGpzdE1pbkRpZ2l0cyhmaXJzdDNkaWdpdHMpOworICAgICAgICAgICAgc2Vjb25kM2RpZ2l0cyA9IGFkanN0TWluRGlnaXRzKHNlY29uZDNkaWdpdHMpOworICAgICAgICAgICAgbGFzdDNkaWdpdHMgPSBhZGpzdE1pbkRpZ2l0cyhsYXN0M2RpZ2l0cyk7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KExvY2FsZS5VUywgIiUwM2QiLCBmaXJzdDNkaWdpdHMpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJTAzZCIsIHNlY29uZDNkaWdpdHMpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJWQiLCBkaWdpdDcpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJTAzZCIsIGxhc3QzZGlnaXRzKSk7CisgICAgICAgICAgICBpZiAoREJHKSBsb2coIm1pbiBwcmVzZW50PSIgKyBidWlsZGVyLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBtTWluID0gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKERCRykgbG9nKCJtaW4gbm90IHByZXNlbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGFkanN0TWluRGlnaXRzIChpbnQgZGlnaXRzKSB7CisgICAgICAgIC8vIFBlciBDLlMwMDA1IHNlY3Rpb24gMi4zLjEuCisgICAgICAgIGRpZ2l0cyArPSAxMTE7CisgICAgICAgIGRpZ2l0cyA9IChkaWdpdHMgJSAxMCA9PSAwKT8oZGlnaXRzIC0gMTApOmRpZ2l0czsKKyAgICAgICAgZGlnaXRzID0gKChkaWdpdHMgLyAxMCkgJSAxMCA9PSAwKT8oZGlnaXRzIC0gMTAwKTpkaWdpdHM7CisgICAgICAgIGRpZ2l0cyA9ICgoZGlnaXRzIC8gMTAwKSAlIDEwID09IDApPyhkaWdpdHMgLSAxMDAwKTpkaWdpdHM7CisgICAgICAgIHJldHVybiBkaWdpdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uR2V0Q1NpbUNkbWFIb21lRG9uZShBc3luY1Jlc3VsdCBhcikgeworICAgICAgICAvLyBQZXIgQy5TMDA2NSBzZWN0aW9uIDUuMi44CisgICAgICAgIEFycmF5TGlzdDxieXRlW10+IGRhdGFMaXN0ID0gKEFycmF5TGlzdDxieXRlW10+KSBhci5yZXN1bHQ7CisgICAgICAgIGlmIChEQkcpIGxvZygiQ1NJTV9DRE1BSE9NRSBkYXRhIHNpemU9IiArIGRhdGFMaXN0LnNpemUoKSk7CisgICAgICAgIGlmIChkYXRhTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNpZEJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbmlkQnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBmb3IgKGJ5dGVbXSBkYXRhIDogZGF0YUxpc3QpIHsKKyAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PSA1KSB7CisgICAgICAgICAgICAgICAgaW50IHNpZCA9ICgoZGF0YVsxXSAmIDB4RkYpIDw8IDgpIHwgKGRhdGFbMF0gJiAweEZGKTsKKyAgICAgICAgICAgICAgICBpbnQgbmlkID0gKChkYXRhWzNdICYgMHhGRikgPDwgOCkgfCAoZGF0YVsyXSAmIDB4RkYpOworICAgICAgICAgICAgICAgIHNpZEJ1Zi5hcHBlbmQoc2lkKS5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICBuaWRCdWYuYXBwZW5kKG5pZCkuYXBwZW5kKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nICIsIgorICAgICAgICBzaWRCdWYuc2V0TGVuZ3RoKHNpZEJ1Zi5sZW5ndGgoKS0xKTsKKyAgICAgICAgbmlkQnVmLnNldExlbmd0aChuaWRCdWYubGVuZ3RoKCktMSk7CisKKyAgICAgICAgbUhvbWVTeXN0ZW1JZCA9IHNpZEJ1Zi50b1N0cmluZygpOworICAgICAgICBtSG9tZU5ldHdvcmtJZCA9IG5pZEJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbkdldENTaW1FcHJsRG9uZShBc3luY1Jlc3VsdCBhcikgeworICAgICAgICAvLyBDLlMwMDY1IHNlY3Rpb24gNS4yLjU3IGZvciBFRmVwcmwgZW5jb2RpbmcKKyAgICAgICAgLy8gQy5TMDAxNiBzZWN0aW9uIDMuNS41IGZvciBQUkwgZm9ybWF0LgorICAgICAgICBieXRlW10gZGF0YSA9IChieXRlW10pIGFyLnJlc3VsdDsKKyAgICAgICAgaWYgKERCRykgbG9nKCJDU0lNX0VQUkw9IiArIEljY1V0aWxzLmJ5dGVzVG9IZXhTdHJpbmcoZGF0YSkpOworCisgICAgICAgIC8vIE9ubHkgbmVlZCB0aGUgZmlyc3QgNCBieXRlcyBvZiByZWNvcmQKKyAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMykgeworICAgICAgICAgICAgaW50IHBybElkID0gKChkYXRhWzJdICYgMHhGRikgPDwgOCkgfCAoZGF0YVszXSAmIDB4RkYpOworICAgICAgICAgICAgbVBybFZlcnNpb24gPSBJbnRlZ2VyLnRvU3RyaW5nKHBybElkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREJHKSBsb2coIkNTSU0gUFJMIHZlcnNpb249IiArIG1QcmxWZXJzaW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0TG9jYWxlRnJvbUNzaW0oKSB7CisgICAgICAgIFN0cmluZyBwcmVmTGFuZyA9IG51bGw7CisgICAgICAgIC8vIGNoZWNrIEVGbGkgdGhlbiBFRnBsCisgICAgICAgIHByZWZMYW5nID0gZmluZEJlc3RMYW5ndWFnZShtRUZsaSk7CisKKyAgICAgICAgaWYgKHByZWZMYW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZWZMYW5nID0gZmluZEJlc3RMYW5ndWFnZShtRUZwbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlZkxhbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY2hlY2sgY291bnRyeSBjb2RlIGZyb20gU0lNCisgICAgICAgICAgICBTdHJpbmcgaW1zaSA9IGdldElNU0koKTsKKyAgICAgICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChpbXNpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3VudHJ5ID0gTWNjVGFibGUuY291bnRyeUNvZGVGb3JNY2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGltc2kuc3Vic3RyaW5nKDAsMykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygiU2V0dGluZyBsb2NhbGUgdG8gIiArIHByZWZMYW5nICsgIl8iICsgY291bnRyeSk7CisgICAgICAgICAgICBwaG9uZS5zZXRTeXN0ZW1Mb2NhbGUocHJlZkxhbmcsIGNvdW50cnksIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZyAoIk5vIHN1aXRhYmxlIENTSU0gc2VsZWN0ZWQgbG9jYWxlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBmaW5kQmVzdExhbmd1YWdlKGJ5dGVbXSBsYW5ndWFnZXMpIHsKKyAgICAgICAgU3RyaW5nIGJlc3RNYXRjaCA9IG51bGw7CisgICAgICAgIFN0cmluZ1tdIGxvY2FsZXMgPSBwaG9uZS5nZXRDb250ZXh0KCkuZ2V0QXNzZXRzKCkuZ2V0TG9jYWxlcygpOworCisgICAgICAgIGlmICgobGFuZ3VhZ2VzID09IG51bGwpIHx8IChsb2NhbGVzID09IG51bGwpKSByZXR1cm4gbnVsbDsKKworICAgICAgICAvLyBFYWNoIDItYnl0ZXMgY29uc2lzdHMgb2Ygb25lIGxhbmd1YWdlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyAoaSArIDEpIDwgbGFuZ3VhZ2VzLmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyBsYW5nID0gbmV3IFN0cmluZyhsYW5ndWFnZXMsIGksIDIsICJJU08tODg1OS0xIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW2pdICE9IG51bGwgJiYgbG9jYWxlc1tqXS5sZW5ndGgoKSA+PSAyICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVzW2pdLnN1YnN0cmluZygwLCAyKS5lcXVhbHMobGFuZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW5nOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiZXN0TWF0Y2ggIT0gbnVsbCkgYnJlYWs7CisgICAgICAgICAgICB9IGNhdGNoKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nICgiRmFpbGVkIHRvIHBhcnNlIFNJTSBsYW5ndWFnZSByZWNvcmRzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gbm8gbWF0Y2ggZm91bmQuIHJldHVybiBudWxsCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgcykgeworICAgICAgICBpZiAoREJHKSBMb2cuZChMT0dfVEFHLCAiW0NTSU1dICIgKyBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1kbigpIHsKKyAgICAgICAgcmV0dXJuIG1NZG47CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNaW4oKSB7CisgICAgICAgIHJldHVybiBtTWluOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lkKCkgeworICAgICAgICByZXR1cm4gbUhvbWVTeXN0ZW1JZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5pZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Ib21lTmV0d29ya0lkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJsVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1QcmxWZXJzaW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJvdmlzaW9uZWQoKSB7CisgICAgICAgIC8vIElmIFVJQ0MgY2FyZCBoYXMgQ1NJTSBhcHAsIGxvb2sgZm9yIE1ETiBhbmQgTUlOIGZpZWxkCisgICAgICAgIC8vIHRvIGRldGVybWluZSBpZiB0aGUgU0lNIGlzIHByb3Zpc2lvbmVkLiAgT3RoZXJ3aXNlLAorICAgICAgICAvLyBjb25zaWRlciB0aGUgU0lNIGlzIHByb3Zpc2lvbmVkLiAoZm9yIGNhc2Ugb2Ygb3JkaW5hbAorICAgICAgICAvLyBVU0lNIG9ubHkgVUlDQy4pCisgICAgICAgIGlmIChwaG9uZS5tSWNjQ2FyZC5pc0FwcGxpY2F0aW9uT25JY2MoQXBwVHlwZS5BUFBUWVBFX0NTSU0pICYmCisgICAgICAgICAgICAoKG1NZG4gPT0gbnVsbCkgfHwgKG1NaW4gPT0gbnVsbCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBjZjZiNzhhLi4wN2IwZjRmCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTTVNEaXNwYXRjaGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNNU0Rpc3BhdGNoZXIuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5TbXNNZXNzYWdlQmFzZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zTWVzc2FnZUJhc2UuVGV4dEVuY29kaW5nRGV0YWlsczsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuVGVsZXBob255UHJvcGVydGllczsKK2ltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuV3NwVHlwZURlY29kZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWEuc21zLlNtc0VudmVsb3BlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5jZG1hLnNtcy5Vc2VyRGF0YTsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC51dGlsLkhleER1bXA7CkBAIC01MCw2ICs1MSw4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworCiAKIGZpbmFsIGNsYXNzIENkbWFTTVNEaXNwYXRjaGVyIGV4dGVuZHMgU01TRGlzcGF0Y2hlciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDRE1BIjsKQEAgLTU3LDYgKzYwLDkgQEAKICAgICBwcml2YXRlIGJ5dGVbXSBtTGFzdERpc3BhdGNoZWRTbXNGaW5nZXJwcmludDsKICAgICBwcml2YXRlIGJ5dGVbXSBtTGFzdEFja25vd2xlZGdlZFNtc0ZpbmdlcnByaW50OwogCisgICAgcHJpdmF0ZSBib29sZWFuIG1DaGVja0ZvckR1cGxpY2F0ZVBvcnRzSW5PbWFkbVdhcFB1c2ggPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0Qm9vbGVhbigKKyAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYm9vbC5jb25maWdfZHVwbGljYXRlX3BvcnRfb21hZG1fd2FwcHVzaCk7CisKICAgICBDZG1hU01TRGlzcGF0Y2hlcihDRE1BUGhvbmUgcGhvbmUpIHsKICAgICAgICAgc3VwZXIocGhvbmUpOwogICAgIH0KQEAgLTI1Myw2ICsyNTksMTMgQEAKICAgICAgICAgICAgIHNvdXJjZVBvcnQgfD0gMHhGRiAmIHBkdVtpbmRleCsrXTsKICAgICAgICAgICAgIGRlc3RpbmF0aW9uUG9ydCA9ICgweEZGICYgcGR1W2luZGV4KytdKSA8PCA4OwogICAgICAgICAgICAgZGVzdGluYXRpb25Qb3J0IHw9IDB4RkYgJiBwZHVbaW5kZXgrK107CisgICAgICAgICAgICAvLyBTb21lIGNhcnJpZXJzIGluY29ycmVjdGx5IHNlbmQgZHVwbGljYXRlIHBvcnQgZmllbGRzIGluIG9tYWRtIHdhcCBwdXNoZXMuCisgICAgICAgICAgICAvLyBJZiBjb25maWd1cmVkLCBjaGVjayBmb3IgdGhhdCBoZXJlCisgICAgICAgICAgICBpZiAobUNoZWNrRm9yRHVwbGljYXRlUG9ydHNJbk9tYWRtV2FwUHVzaCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZVBvcnRPbWFkbVdhcHB1c2gocGR1LGluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgNDsgLy8gc2tpcCBkdXBsaWNhdGUgcG9ydCBmaWVsZHMKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBMb29rdXAgYWxsIG90aGVyIHJlbGF0ZWQgcGFydHMKQEAgLTI3Myw3ICsyODYsNyBAQAogICAgICAgICAgICAgaWYgKGN1cnNvckNvdW50ICE9IHRvdGFsU2VnbWVudHMgLSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbGwgdGhlIHBhcnRzIHlldCwgc3RvcmUgdGhpcyBvbmUgYXdheQogICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJkYXRlIiwgbmV3IExvbmcoMCkpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoImRhdGUiLCAobG9uZykgMCk7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgicGR1IiwgSGV4RHVtcC50b0hleFN0cmluZyhwZHUsIGluZGV4LCBwZHUubGVuZ3RoIC0gaW5kZXgpKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KCJhZGRyZXNzIiwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dCgicmVmZXJlbmNlX251bWJlciIsIHJlZmVyZW5jZU51bWJlcik7CkBAIC00ODIsMjQgKzQ5NSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgbUNtLnNldENkbWFCcm9hZGNhc3RBY3RpdmF0aW9uKChhY3RpdmF0ZSA9PSAwKSwgcmVzcG9uc2UpOwotICAgIH0KLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKSB7Ci0gICAgICAgIG1DbS5nZXRDZG1hQnJvYWRjYXN0Q29uZmlnKHJlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgbUNtLnNldENkbWFCcm9hZGNhc3RDb25maWcoY29uZmlnVmFsdWVzQXJyYXksIHJlc3BvbnNlKTsKLSAgICB9Ci0KICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCcm9hZGNhc3RTbXMoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgLy8gTm90IHN1cHBvcnRlZAogICAgICAgICBMb2cuZShUQUcsICJFcnJvciEgTm90IGltcGxlbWVudGVkIGZvciBDRE1BLiIpOwpAQCAtNTIwLDQgKzUxNSw0MiBAQAogICAgICAgICAgICAgcmV0dXJuIENvbW1hbmRzSW50ZXJmYWNlLkNETUFfU01TX0ZBSUxfQ0FVU0VfRU5DT0RJTkdfUFJPQkxFTTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIE9wdGlvbmFsIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVjZWl2ZWQgV2FwUHVzaCBpcyBhbiBPTUFETSBub3RpZmljYXRpb24gd2l0aCBlcnJvbmVvdXMKKyAgICAgKiBleHRyYSBwb3J0IGZpZWxkcy4KKyAgICAgKiAtIFNvbWUgY2FycmllcnMgbWFrZSB0aGlzIG1pc3Rha2UuCisgICAgICogZXg6IE1TR1RZUEUtVG90YWxTZWdtZW50cy1DdXJyZW50U2VnbWVudAorICAgICAqICAgICAgIC1Tb3VyY2VQb3J0RGVzdFBvcnQtU291cmNlUG9ydERlc3RQb3J0LU9NQURNIFBEVQorICAgICAqIEBwYXJhbSBvcmlnUGR1IFRoZSBXQVAtV0RQIFBEVSBzZWdtZW50CisgICAgICogQHBhcmFtIGluZGV4IEN1cnJlbnQgSW5kZXggd2hpbGUgcGFyc2luZyB0aGUgUERVLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBPcmlnUGR1IGlzIE9tYURNIFB1c2ggTWVzc2FnZSB3aGljaCBoYXMgZHVwbGljYXRlIHBvcnRzLgorICAgICAqICAgICAgICAgRmFsc2UgaWYgT3JpZ1BkdSBpcyBOT1QgT21hRE0gUHVzaCBNZXNzYWdlIHdoaWNoIGhhcyBkdXBsaWNhdGUgcG9ydHMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRHVwbGljYXRlUG9ydE9tYWRtV2FwcHVzaChieXRlW10gb3JpZ1BkdSwgaW50IGluZGV4KSB7CisgICAgICAgIGluZGV4ICs9IDQ7CisgICAgICAgIGJ5dGVbXSBvbWFQZHUgPSBuZXcgYnl0ZVtvcmlnUGR1Lmxlbmd0aCAtIGluZGV4XTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnUGR1LCBpbmRleCwgb21hUGR1LCAwLCBvbWFQZHUubGVuZ3RoKTsKKworICAgICAgICBXc3BUeXBlRGVjb2RlciBwZHVEZWNvZGVyID0gbmV3IFdzcFR5cGVEZWNvZGVyKG9tYVBkdSk7CisgICAgICAgIGludCB3c3BJbmRleCA9IDI7CisKKyAgICAgICAgLy8gUHJvY2VzcyBoZWFkZXIgbGVuZ3RoIGZpZWxkCisgICAgICAgIGlmIChwZHVEZWNvZGVyLmRlY29kZVVpbnR2YXJJbnRlZ2VyKHdzcEluZGV4KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd3NwSW5kZXggKz0gcGR1RGVjb2Rlci5nZXREZWNvZGVkRGF0YUxlbmd0aCgpOyAvLyBhZHZhbmNlIHRvIG5leHQgZmllbGQKKworICAgICAgICAvLyBQcm9jZXNzIGNvbnRlbnQgdHlwZSBmaWVsZAorICAgICAgICBpZiAocGR1RGVjb2Rlci5kZWNvZGVDb250ZW50VHlwZSh3c3BJbmRleCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHBkdURlY29kZXIuZ2V0VmFsdWVTdHJpbmcoKTsKKyAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUuZXF1YWxzKFdzcFR5cGVEZWNvZGVyLkNPTlRFTlRfVFlQRV9CX1BVU0hfU1lOQ01MX05PVEkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKaW5kZXggMzVhOThlZGMuLjVlYmRkMjIgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL0NkbWFTZXJ2aWNlU3RhdGVUcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvQ2RtYVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YQpAQCAtMTI5LDE1ICsxMjksMTUgQEAKICAgICAvKiogQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyZWQgbmV0d29yayBpbiBDRE1BIChlaXRoZXIgT05TIG9yIEVSSSB0ZXh0KS4gKi8KICAgICBwcml2YXRlIFN0cmluZyBjdXJQbG1uID0gbnVsbDsKIAotICAgIHByaXZhdGUgU3RyaW5nIG1NZG47CisgICAgcHJvdGVjdGVkIFN0cmluZyBtTWRuOwogICAgIHByaXZhdGUgaW50IG1Ib21lU3lzdGVtSWRbXSA9IG51bGw7CiAgICAgcHJpdmF0ZSBpbnQgbUhvbWVOZXR3b3JrSWRbXSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU1pbjsKLSAgICBwcml2YXRlIFN0cmluZyBtUHJsVmVyc2lvbjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWluSW5mb1JlYWR5ID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIFN0cmluZyBtTWluOworICAgIHByb3RlY3RlZCBTdHJpbmcgbVBybFZlcnNpb247CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUlzTWluSW5mb1JlYWR5ID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNFcmlUZXh0TG9hZGVkID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaXB0aW9uRnJvbVJ1aW0gPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnNjcmlwdGlvbkZyb21SdWltID0gZmFsc2U7CiAKICAgICAvKiBVc2VkIG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gKi8KICAgICBwcml2YXRlIFN0cmluZyBtUmVnaXN0cmF0aW9uRGVuaWVkUmVhc29uOwpAQCAtMjUzLDYgKzI1Myw3IEBACiAKICAgICAgICAgc3dpdGNoIChtc2cud2hhdCkgewogICAgICAgICBjYXNlIEVWRU5UX1JBRElPX0FWQUlMQUJMRToKKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygiaGFuZGxlTWVzc2FnZTogRVZFTlRfUkFESU9fQVZBSUxBQkxFIik7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVWRU5UX1JVSU1fUkVBRFk6CkBAIC0yNjYsNyArMjY3LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY20uZ2V0Q0RNQVN1YnNjcmlwdGlvbihvYnRhaW5NZXNzYWdlKEVWRU5UX1BPTExfU1RBVEVfQ0RNQV9TVUJTQ1JJUFRJT04pKTsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiUmVjZWl2ZSBFVkVOVF9SVUlNX1JFQURZIGFuZCBTZW5kIFJlcXVlc3QgZ2V0Q0RNQVN1YnNjcmlwdGlvbi4iKTsKKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygiaGFuZGxlTWVzc2FnZTogRVZFTlRfUlVJTV9SRUFEWSwgU2VuZCBSZXF1ZXN0IGdldENETUFTdWJzY3JpcHRpb24uIik7CiAKICAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIG5ldHdvcmsgc2VsZWN0aW9uLgogICAgICAgICAgICAgcG9sbFN0YXRlKCk7CkBAIC0yODAsNiArMjgxLDcgQEAKICAgICAgICAgICAgIC8vIEZvciBOb24tUlVJTSBwaG9uZXMsIHRoZSBzdWJzY3JpcHRpb24gaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluCiAgICAgICAgICAgICAvLyBOb24gVm9sYXRpbGUuIEhlcmUgd2hlbiBOb24tVm9sYXRpbGUgaXMgcmVhZHksIHdlIGNhbiBwb2xsIHRoZSBDRE1BCiAgICAgICAgICAgICAvLyBzdWJzY3JpcHRpb24gaW5mby4KKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygiaGFuZGxlTWVzc2FnZTogRVZFTlRfTlZfUkVBRFksIFNlbmQgUmVxdWVzdCBnZXRDRE1BU3Vic2NyaXB0aW9uLiIpOwogICAgICAgICAgICAgY20uZ2V0Q0RNQVN1YnNjcmlwdGlvbiggb2J0YWluTWVzc2FnZShFVkVOVF9QT0xMX1NUQVRFX0NETUFfU1VCU0NSSVBUSU9OKSk7CiAgICAgICAgICAgICBwb2xsU3RhdGUoKTsKICAgICAgICAgICAgIC8vIFNpZ25hbCBzdHJlbmd0aCBwb2xsaW5nIHN0b3BzIHdoZW4gcmFkaW8gaXMgb2ZmLgpAQCAtMzcxLDUzICszNzMsMTUgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgY2RtYVN1YnNjcmlwdGlvbltdID0gKFN0cmluZ1tdKWFyLnJlc3VsdDsKICAgICAgICAgICAgICAgICBpZiAoY2RtYVN1YnNjcmlwdGlvbiAhPSBudWxsICYmIGNkbWFTdWJzY3JpcHRpb24ubGVuZ3RoID49IDUpIHsKICAgICAgICAgICAgICAgICAgICAgbU1kbiA9IGNkbWFTdWJzY3JpcHRpb25bMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjZG1hU3Vic2NyaXB0aW9uWzFdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNpZCA9IGNkbWFTdWJzY3JpcHRpb25bMV0uc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ib21lU3lzdGVtSWQgPSBuZXcgaW50W3NpZC5sZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaWQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSG9tZVN5c3RlbUlkW2ldID0gSW50ZWdlci5wYXJzZUludChzaWRbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dlKCJlcnJvciBwYXJzaW5nIHN5c3RlbSBpZDogIiArIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJHRVRfQ0RNQV9TVUJTQ1JJUFRJT046IFNJRD0iICsgY2RtYVN1YnNjcmlwdGlvblsxXSApOworICAgICAgICAgICAgICAgICAgICBwYXJzZVNpZE5pZChjZG1hU3Vic2NyaXB0aW9uWzFdLCBjZG1hU3Vic2NyaXB0aW9uWzJdKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoY2RtYVN1YnNjcmlwdGlvblsyXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBuaWQgPSBjZG1hU3Vic2NyaXB0aW9uWzJdLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSG9tZU5ldHdvcmtJZCA9IG5ldyBpbnRbbmlkLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5pZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ib21lTmV0d29ya0lkW2ldID0gSW50ZWdlci5wYXJzZUludChuaWRbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dlKCJHRVRfQ0RNQV9TVUJTQ1JJUFRJT046IGVycm9yIHBhcnNpbmcgbmV0d29yayBpZDogIiArIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKERCRykgbG9nKCJHRVRfQ0RNQV9TVUJTQ1JJUFRJT046IE5JRD0iICsgY2RtYVN1YnNjcmlwdGlvblsyXSk7CiAgICAgICAgICAgICAgICAgICAgIG1NaW4gPSBjZG1hU3Vic2NyaXB0aW9uWzNdOwogICAgICAgICAgICAgICAgICAgICBtUHJsVmVyc2lvbiA9IGNkbWFTdWJzY3JpcHRpb25bNF07CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIGxvZygiR0VUX0NETUFfU1VCU0NSSVBUSU9OOiBNRE49IiArIG1NZG4pOwogCiAgICAgICAgICAgICAgICAgICAgIG1Jc01pbkluZm9SZWFkeSA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICAgICAgaW50IG90YXNwTW9kZSA9IGdldE90YXNwKCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvbGRPdGFzcE1vZGUgPSBtQ3VycmVudE90YXNwTW9kZTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRPdGFzcE1vZGUgPSBvdGFzcE1vZGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGFwcHMgc3Vic2NyaXB0aW9uIGluZm8gaXMgcmVhZHkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNkbWFGb3JTdWJzY3JpcHRpb25JbmZvUmVhZHlSZWdpc3RyYW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSBsb2coIkdFVF9DRE1BX1NVQlNDUklQVElPTjogY2FsbCBub3RpZnlSZWdpc3RyYW50cygpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZG1hRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5UmVnaXN0cmFudHMubm90aWZ5UmVnaXN0cmFudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAob2xkT3Rhc3BNb2RlICE9IG1DdXJyZW50T3Rhc3BNb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJHRVRfQ0RNQV9TVUJTQ1JJUFRJT046IGNhbGwgbm90aWZ5T3Rhc3BDaGFuZ2VkIG9sZCBvdGFzcE1vZGU9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZE90YXNwTW9kZSArICIgbmV3IG90YXNwTW9kZT0iICsgbUN1cnJlbnRPdGFzcE1vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmUubm90aWZ5T3Rhc3BDaGFuZ2VkKG1DdXJyZW50T3Rhc3BNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVPdGFzcFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIHBob25lLmdldEljY0NhcmQoKS5icm9hZGNhc3RJY2NTdGF0ZUNoYW5nZWRJbnRlbnQoSWNjQ2FyZC5JTlRFTlRfVkFMVUVfSUNDX0lNU0ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTg3MSwzNiArODM1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5ldHdvcmtUeXBlVG9TdHJpbmcoaW50IHR5cGUpIHsKLSAgICAgICAgU3RyaW5nIHJldCA9ICJ1bmtub3duIjsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9JUzk1QToKLSAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9JUzk1QjoKLSAgICAgICAgICAgIHJldCA9ICJDRE1BIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZXzF4UlRUOgotICAgICAgICAgICAgcmV0ID0gIkNETUEgLSAxeFJUVCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FVkRPXzA6Ci0gICAgICAgICAgICByZXQgPSAiQ0RNQSAtIEV2RG8gcmV2LiAwIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0VWRE9fQToKLSAgICAgICAgICAgIHJldCA9ICJDRE1BIC0gRXZEbyByZXYuIEEiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZET19COgotICAgICAgICAgICAgcmV0ID0gIkNETUEgLSBFdkRvIHJldi4gQiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBzbG9nKCJXcm9uZyBuZXR3b3JrLiBDYW4gbm90IHJldHVybiBhIHN0cmluZy4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQogICAgIHByb3RlY3RlZCB2b2lkIGZpeFRpbWVab25lKFN0cmluZyBpc29Db3VudHJ5Q29kZSkgewogICAgICAgICBUaW1lWm9uZSB6b25lID0gbnVsbDsKICAgICAgICAgLy8gSWYgdGhlIG9mZnNldCBpcyAoMCwgZmFsc2UpIGFuZCB0aGUgdGltZSB6b25lIHByb3BlcnR5CkBAIC05OTgsNyArOTMyLDcgQEAKIAogICAgICAgICBpZiAoaGFzTmV0d29ya1R5cGVDaGFuZ2VkKSB7CiAgICAgICAgICAgICBwaG9uZS5zZXRTeXN0ZW1Qcm9wZXJ0eShUZWxlcGhvbnlQcm9wZXJ0aWVzLlBST1BFUlRZX0RBVEFfTkVUV09SS19UWVBFLAotICAgICAgICAgICAgICAgICAgICBuZXR3b3JrVHlwZVRvU3RyaW5nKG5ldHdvcmtUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VTdGF0ZS5yYWRpb1RlY2hub2xvZ3lUb1N0cmluZyhuZXR3b3JrVHlwZSkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc1JlZ2lzdGVyZWQpIHsKQEAgLTEwMTcsNyArOTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXJpVGV4dCA9IHBob25lLmdldENvbnRleHQoKS5nZXRUZXh0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3RyaW5nLnJvYW1pbmdUZXh0U2VhcmNoaW5nKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzcy5zZXRDZG1hRXJpVGV4dChlcmlUZXh0KTsKKyAgICAgICAgICAgICAgICBzcy5zZXRPcGVyYXRvckFscGhhTG9uZyhlcmlUZXh0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nIG9wZXJhdG9yTnVtZXJpYzsKQEAgLTExMjAsNyArMTA1NCw3IEBACiAgICAgICogVGhpcyBjb2RlIHNob3VsZCBwcm9iYWJseSBiZSBob2lzdGVkIHRvIHRoZSBiYXNlIGNsYXNzIHNvCiAgICAgICogdGhlIGZpeCwgd2hlbiBhZGRlZCwgd29ya3MgZm9yIGJvdGguCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkCisgICAgcHJvdGVjdGVkIHZvaWQKICAgICBxdWV1ZU5leHRTaWduYWxTdHJlbmd0aFBvbGwoKSB7CiAgICAgICAgIGlmIChkb250UG9sbFNpZ25hbFN0cmVuZ3RoIHx8IChjbS5nZXRSYWRpb1N0YXRlKCkuaXNHc20oKSkpIHsKICAgICAgICAgICAgIC8vIFRoZSByYWRpbyBpcyB0ZWxsaW5nIHVzIGFib3V0IHNpZ25hbCBzdHJlbmd0aCBjaGFuZ2VzCkBAIC0xMjE3LDE4ICsxMTUxLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgQ0RNQSBkYXRhIGNvbm5lY3Rpb24gc3RhdGUuIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZXzF4UlRUIG9yCi0gICAgICogU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfRVZETyBpcyB0aGUgc2FtZSBhcyAiYXR0YWNoZWQiIGFuZAotICAgICAqIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX1VOS05PV04gaXMgdGhlIHNhbWUgYXMgZGV0YWNoZWQuCi0gICAgICovCi0gICAgLypwYWNrYWdlKi8gaW50IGdldEN1cnJlbnRDZG1hRGF0YUNvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhQ29ubmVjdGlvblN0YXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICogVE9ETzogSW4gdGhlIGZ1dHVyZSwgd2UgbmVlZCByZW1vdmUgZ2V0Q3VycmVudENkbWFEYXRhQ29ubmVjdGlvblN0YXRlCi0gICAgKi8KICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnREYXRhQ29ubmVjdGlvblN0YXRlKCkgewogICAgICAgICByZXR1cm4gbURhdGFDb25uZWN0aW9uU3RhdGU7CiAgICAgfQpAQCAtMTY2Miw2ICsxNTg0LDUzIEBACiAgICAgICAgIGNtLnNldFJhZGlvUG93ZXIoZmFsc2UsIG51bGwpOwogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlU2lkTmlkIChTdHJpbmcgc2lkU3RyLCBTdHJpbmcgbmlkU3RyKSB7CisgICAgICAgIGlmIChzaWRTdHIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gc2lkID0gc2lkU3RyLnNwbGl0KCIsIik7CisgICAgICAgICAgICBtSG9tZVN5c3RlbUlkID0gbmV3IGludFtzaWQubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbUhvbWVTeXN0ZW1JZFtpXSA9IEludGVnZXIucGFyc2VJbnQoc2lkW2ldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZSgiZXJyb3IgcGFyc2luZyBzeXN0ZW0gaWQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChEQkcpIGxvZygiQ0RNQV9TVUJTQ1JJUFRJT046IFNJRD0iICsgc2lkU3RyKTsKKworICAgICAgICBpZiAobmlkU3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIG5pZCA9IG5pZFN0ci5zcGxpdCgiLCIpOworICAgICAgICAgICAgbUhvbWVOZXR3b3JrSWQgPSBuZXcgaW50W25pZC5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtSG9tZU5ldHdvcmtJZFtpXSA9IEludGVnZXIucGFyc2VJbnQobmlkW2ldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZSgiQ0RNQV9TVUJTQ1JJUFRJT046IGVycm9yIHBhcnNpbmcgbmV0d29yayBpZDogIiArIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKERCRykgbG9nKCJDRE1BX1NVQlNDUklQVElPTjogTklEPSIgKyBuaWRTdHIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU90YXNwU3RhdGUoKSB7CisgICAgICAgIGludCBvdGFzcE1vZGUgPSBnZXRPdGFzcCgpOworICAgICAgICBpbnQgb2xkT3Rhc3BNb2RlID0gbUN1cnJlbnRPdGFzcE1vZGU7CisgICAgICAgIG1DdXJyZW50T3Rhc3BNb2RlID0gb3Rhc3BNb2RlOworCisgICAgICAgIC8vIE5vdGlmeSBhcHBzIHN1YnNjcmlwdGlvbiBpbmZvIGlzIHJlYWR5CisgICAgICAgIGlmIChjZG1hRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5UmVnaXN0cmFudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKERCRykgbG9nKCJDRE1BX1NVQlNDUklQVElPTjogY2FsbCBub3RpZnlSZWdpc3RyYW50cygpIik7CisgICAgICAgICAgICBjZG1hRm9yU3Vic2NyaXB0aW9uSW5mb1JlYWR5UmVnaXN0cmFudHMubm90aWZ5UmVnaXN0cmFudHMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2xkT3Rhc3BNb2RlICE9IG1DdXJyZW50T3Rhc3BNb2RlKSB7CisgICAgICAgICAgICBpZiAoREJHKSB7CisgICAgICAgICAgICAgICAgbG9nKCJDRE1BX1NVQlNDUklQVElPTjogY2FsbCBub3RpZnlPdGFzcENoYW5nZWQgb2xkIG90YXNwTW9kZT0iICsKKyAgICAgICAgICAgICAgICAgICAgb2xkT3Rhc3BNb2RlICsgIiBuZXcgb3Rhc3BNb2RlPSIgKyBtQ3VycmVudE90YXNwTW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwaG9uZS5ub3RpZnlPdGFzcENoYW5nZWQobUN1cnJlbnRPdGFzcE1vZGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBzKSB7CiAgICAgICAgIExvZy5kKExPR19UQUcsICJbQ2RtYVNTVF0gIiArIHMpOwpAQCAtMTY3MSw4ICsxNjQwLDQgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBsb2dlKFN0cmluZyBzKSB7CiAgICAgICAgIExvZy5lKExPR19UQUcsICJbQ2RtYVNTVF0gIiArIHMpOwogICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2xvZyhTdHJpbmcgcykgewotICAgICAgICBMb2cuZChMT0dfVEFHLCAiW0NkbWFTU1RdICIgKyBzKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQppbmRleCBjZTMzMDY2Li4wNGVlMmRkOCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmNkbWE7CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKwogaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogCkBAIC01NiwxNCArNTgsMTEgQEAKICAgICAgICAgICAgIHJlY29yZFNpemUgPSBuZXcgaW50WzNdOwogCiAgICAgICAgICAgICAvL1VzaW5nIG1CYXNlSGFuZGxlciwgbm8gZGlmZmVyZW5jZSBpbiBFVkVOVF9HRVRfU0laRV9ET05FIGhhbmRsaW5nCi0gICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlID0gbUJhc2VIYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfR0VUX1NJWkVfRE9ORSk7CisgICAgICAgICAgICBBdG9taWNCb29sZWFuIHN0YXR1cyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9HRVRfU0laRV9ET05FLCBzdGF0dXMpOwogCiAgICAgICAgICAgICBwaG9uZS5nZXRJY2NGaWxlSGFuZGxlcigpLmdldEVGTGluZWFyUmVjb3JkU2l6ZShlZmlkLCByZXNwb25zZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Mb2NrLndhaXQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBsb2dkKCJpbnRlcnJ1cHRlZCB3aGlsZSB0cnlpbmcgdG8gbG9hZCBmcm9tIHRoZSBSVUlNIik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB3YWl0Rm9yUmVzdWx0KHN0YXR1cyk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVjb3JkU2l6ZTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1SZWNvcmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltUmVjb3Jkcy5qYXZhCmluZGV4IGVlNjNlZGUuLjlhZjJkMjYgMTAwNzU1Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1SZWNvcmRzLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVJlY29yZHMuamF2YQpAQCAtMTE5LDggKzExOSwxMSBAQAogCiAgICAgICAgIGFkbkNhY2hlLnJlc2V0KCk7CiAKLSAgICAgICAgcGhvbmUuc2V0U3lzdGVtUHJvcGVydHkoUFJPUEVSVFlfSUNDX09QRVJBVE9SX05VTUVSSUMsIG51bGwpOwotICAgICAgICBwaG9uZS5zZXRTeXN0ZW1Qcm9wZXJ0eShQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfSVNPX0NPVU5UUlksIG51bGwpOworICAgICAgICAvLyBEb24ndCBjbGVhbiB1cCBQUk9QRVJUWV9JQ0NfT1BFUkFUT1JfSVNPX0NPVU5UUlkgYW5kCisgICAgICAgIC8vIFBST1BFUlRZX0lDQ19PUEVSQVRPUl9OVU1FUklDIGhlcmUuIFNpbmNlIG5vdCBhbGwgQ0RNQQorICAgICAgICAvLyBkZXZpY2VzIGhhdmUgUlVJTSwgdGhlc2UgcHJvcGVydGllcyBzaG91bGQga2VlcCB0aGUgb3JpZ2luYWwKKyAgICAgICAgLy8gdmFsdWVzLCBlLmcuIGJ1aWxkIHRpbWUgc2V0dGluZ3MsIHdoZW4gdGhlcmUgaXMgbm8gUlVJTSBidXQKKyAgICAgICAgLy8gc2V0IG5ldyB2YWx1ZXMgd2hlbiBSVUlNIGlzIGF2YWlsYWJsZSBhbmQgbG9hZGVkLgogCiAgICAgICAgIC8vIHJlY29yZHNSZXF1ZXN0ZWQgaXMgc2V0IHRvIGZhbHNlIGluZGljYXRpbmcgdGhhdCB0aGUgU0lNCiAgICAgICAgIC8vIHJlYWQgcmVxdWVzdHMgbWFkZSBzbyBmYXIgYXJlIG5vdCB2YWxpZC4gVGhpcyBpcyBzZXQgdG8KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9SdWltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDI5ZjNiYzEuLjljZDA1OWQgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvUnVpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YQpAQCAtMjAzLDYgKzIwMywxOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCBzdGFydE1lc3NhZ2VJZCwgaW50IGVuZE1lc3NhZ2VJZCkgeworICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBOb3QgaW1wbGVtZW50ZWQgZm9yIENETUEuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlQ2VsbEJyb2FkY2FzdFJhbmdlKGludCBzdGFydE1lc3NhZ2VJZCwgaW50IGVuZE1lc3NhZ2VJZCkgeworICAgICAgICAvLyBOb3QgaW1wbGVtZW50ZWQKKyAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBOb3QgaW1wbGVtZW50ZWQgZm9yIENETUEuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1zZykgewogICAgICAgICBMb2cuZChMT0dfVEFHLCAiW1J1aW1TbXNJbnRlcmZhY2VNYW5hZ2VyXSAiICsgbXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvY2RtYS9TbXNNZXNzYWdlLmphdmEKaW5kZXggM2Y0Y2Q2Ny4uYmU1YzYxNiAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2NkbWEvU21zTWVzc2FnZS5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9jZG1hL1Ntc01lc3NhZ2UuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOworaW1wb3J0IGFuZHJvaWQudGVsZXBob255LlBob25lTnVtYmVyVXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LlNtc0hlYWRlcjsKQEAgLTgwNiw3ICs4MDcsMTIgQEAKICAgICAgICAgICogbWVjaGFuaXNtLCBhbmQgYXZvaWQgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbnMuCiAgICAgICAgICAqLwogCi0gICAgICAgIENkbWFTbXNBZGRyZXNzIGRlc3RBZGRyID0gQ2RtYVNtc0FkZHJlc3MucGFyc2UoZGVzdEFkZHJTdHIpOworICAgICAgICAvKioKKyAgICAgICAgICogTm9ydGggQW1lcmljYSBQbHVzIENvZGUgOgorICAgICAgICAgKiBDb252ZXJ0ICsgY29kZSB0byAwMTEgYW5kIGRpYWwgb3V0IGZvciBpbnRlcm5hdGlvbmFsIFNNUworICAgICAgICAgKi8KKyAgICAgICAgQ2RtYVNtc0FkZHJlc3MgZGVzdEFkZHIgPSBDZG1hU21zQWRkcmVzcy5wYXJzZSgKKyAgICAgICAgICAgICAgICBQaG9uZU51bWJlclV0aWxzLmNkbWFDaGVja0FuZFByb2Nlc3NQbHVzQ29kZShkZXN0QWRkclN0cikpOwogICAgICAgICBpZiAoZGVzdEFkZHIgPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAKICAgICAgICAgQmVhcmVyRGF0YSBiZWFyZXJEYXRhID0gbmV3IEJlYXJlckRhdGEoKTsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR1NNUGhvbmUuamF2YQppbmRleCAzY2NjMDNkLi5kMzU3ZWFjIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dTTVBob25lLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9HU01QaG9uZS5qYXZhCkBAIC0zMDEsNiArMzAxLDkgQEAKICAgICAgICAgICAgIHJldCA9IERhdGFTdGF0ZS5ESVNDT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSBpZiAobURhdGFDb25uZWN0aW9uVHJhY2tlci5pc0FwblR5cGVFbmFibGVkKGFwblR5cGUpID09IGZhbHNlIHx8CiAgICAgICAgICAgICAgICAgbURhdGFDb25uZWN0aW9uVHJhY2tlci5pc0FwblR5cGVBY3RpdmUoYXBuVHlwZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIC8vVE9ETzogaXNBcG5UeXBlQWN0aXZlKCkgaXMganVzdCBjaGVja2luZyB3aGV0aGVyIEFwbkNvbnRleHQgaG9sZHMKKyAgICAgICAgICAgIC8vICAgICAgRGF0YWNvbm5lY3Rpb24gb3Igbm90LiBDaGVja2luZyBlYWNoIEFwblN0YXRlIGJlbG93IHNob3VsZAorICAgICAgICAgICAgLy8gICAgICBwcm92aWRlIHRoZSBzYW1lIHN0YXRlLiBDYWxsaW5nIGlzQXBuVHlwZUFjdGl2ZSgpIGNhbiBiZSByZW1vdmVkLgogICAgICAgICAgICAgcmV0ID0gRGF0YVN0YXRlLkRJU0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIHsgLyogbVNTVC5ncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UgKi8KICAgICAgICAgICAgIHN3aXRjaCAobURhdGFDb25uZWN0aW9uVHJhY2tlci5nZXRTdGF0ZShhcG5UeXBlKSkgewpAQCAtMTQyNywxNiArMTQzMCwzNSBAQAogICAgICAgICByZXR1cm4gdGhpcy5tSWNjRmlsZUhhbmRsZXI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBjZWxsIGJyb2FkY2FzdCBTTVMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aXZhdGUgMCA9IGFjdGl2YXRlLCAxID0gZGVhY3RpdmF0ZQorICAgICAqIEBwYXJhbSByZXNwb25zZSBDYWxsYmFjayBtZXNzYWdlIGlzIGVtcHR5IG9uIGNvbXBsZXRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoaW50IGFjdGl2YXRlLCBNZXNzYWdlIHJlc3BvbnNlKSB7Ci0gICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOworICAgICAgICBMb2cuZShMT0dfVEFHLCAiW0dTTVBob25lXSBhY3RpdmF0ZUNlbGxCcm9hZGNhc3RTbXMoKSBpcyBvYnNvbGV0ZTsgdXNlIFNtc01hbmFnZXIiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBjZG1hIGNlbGwgYnJvYWRjYXN0IFNNUy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBDYWxsYmFjayBtZXNzYWdlIGlzIGVtcHR5IG9uIGNvbXBsZXRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBnZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgTG9nLmUoTE9HX1RBRywgIkVycm9yISBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGltcGxlbWVudGVkIGZvciBHU00uIik7CisgICAgICAgIExvZy5lKExPR19UQUcsICJbR1NNUGhvbmVdIGdldENlbGxCcm9hZGNhc3RTbXNDb25maWcoKSBpcyBvYnNvbGV0ZTsgdXNlIFNtc01hbmFnZXIiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhpbnRbXSBjb25maWdWYWx1ZXNBcnJheSwgTWVzc2FnZSByZXNwb25zZSl7Ci0gICAgICAgIExvZy5lKExPR19UQUcsICJFcnJvciEgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgR1NNLiIpOworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBjZG1hIGNlbGwgYnJvYWRjYXN0IFNNUy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBDYWxsYmFjayBtZXNzYWdlIGlzIGVtcHR5IG9uIGNvbXBsZXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDZWxsQnJvYWRjYXN0U21zQ29uZmlnKGludFtdIGNvbmZpZ1ZhbHVlc0FycmF5LCBNZXNzYWdlIHJlc3BvbnNlKSB7CisgICAgICAgIExvZy5lKExPR19UQUcsICJbR1NNUGhvbmVdIHNldENlbGxCcm9hZGNhc3RTbXNDb25maWcoKSBpcyBvYnNvbGV0ZTsgdXNlIFNtc01hbmFnZXIiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2VuZFRvVGFyZ2V0KCk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNDc3BQbG1uRW5hYmxlZCgpIHsKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbURhdGFDb25uZWN0aW9uVHJhY2tlci5qYXZhCmluZGV4IGUxYTZmZWYuLjE5YzA2ZjYgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtRGF0YUNvbm5lY3Rpb25UcmFja2VyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21EYXRhQ29ubmVjdGlvblRyYWNrZXIuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkNvbnRlbnRPYnNlcnZlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Db25uZWN0aXZpdHlNYW5hZ2VyOwpAQCAtMjA0LDI4ICsyMDUsNiBAQAogICAgICAgICByZXR1cm4gKGFwbkNvbnRleHQuZ2V0RGF0YUNvbm5lY3Rpb24oKSAhPSBudWxsKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGUgb25seSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIHdlIHJlcG9ydCB0aGF0IGRhdGEgY29ubmVjdGl2aXR5IGlzIG5vdAotICAgICAqIHBvc3NpYmxlIGFyZQotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+RGF0YSBpcyBkaXNhbGxvd2VkIChyb2FtaW5nLCBwb3dlciBzdGF0ZSwgdm9pY2UgY2FsbCwgZXRjKS48L2xpPgotICAgICAqIDxsaT5UaGUgY3VycmVudCBkYXRhIHN0YXRlIGlzIHtAY29kZSBESVNDT05ORUNURUR9IGZvciBhIHJlYXNvbiBvdGhlciB0aGFuCi0gICAgICogaGF2aW5nIGV4cGxpY2l0bHkgZGlzYWJsZWQgY29ubmVjdGl2aXR5LiBJbiBvdGhlciB3b3JkcywgZGF0YSBpcyBub3QgYXZhaWxhYmxlCi0gICAgICogYmVjYXVzZSB0aGUgcGhvbmUgaXMgb3V0IG9mIGNvdmVyYWdlIG9yIHNvbWUgbGlrZSByZWFzb24uPC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGRhdGEgY29ubmVjdGl2aXR5IGlzIHBvc3NpYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KLSAgICAgKiBUT0RPIC0gZG8gcGVyLWFwbiBub3RpZmljYXRpb25zIG9mIGF2YWlsYWJpbGl0eSB1c2luZyBkZXBlbmRlbmN5TWV0IHZhbHVlcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RhdGFQb3NzaWJsZSgpIHsKLSAgICAgICAgYm9vbGVhbiBwb3NzaWJsZSA9IChpc0RhdGFBbGxvd2VkKCkKLSAgICAgICAgICAgICAgICAmJiAhKGdldEFueURhdGFFbmFibGVkKCkgJiYgKGdldE92ZXJhbGxTdGF0ZSgpID09IFN0YXRlLkZBSUxFRCkpKTsKLSAgICAgICAgaWYgKCFwb3NzaWJsZSAmJiBEQkcgJiYgaXNEYXRhQWxsb3dlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2coIkRhdGEgbm90IHBvc3NpYmxlLiAgTm8gY292ZXJhZ2U6IGRhdGFTdGF0ZSA9ICIgKyBnZXRPdmVyYWxsU3RhdGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBvc3NpYmxlOwotICAgIH0KLQogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzRGF0YVBvc3NpYmxlKFN0cmluZyBhcG5UeXBlKSB7CiAgICAgICAgIEFwbkNvbnRleHQgYXBuQ29udGV4dCA9IG1BcG5Db250ZXh0cy5nZXQoYXBuVHlwZSk7CkBAIC01ODIsNiArNTYxLDcgQEAKICAgICAgICAgYm9vbGVhbiBhbGxvd2VkID0KICAgICAgICAgICAgICAgICAgICAgKGdwcnNTdGF0ZSA9PSBTZXJ2aWNlU3RhdGUuU1RBVEVfSU5fU0VSVklDRSB8fCBtQXV0b0F0dGFjaE9uQ3JlYXRpb24pICYmCiAgICAgICAgICAgICAgICAgICAgIG1QaG9uZS5tSWNjUmVjb3Jkcy5nZXRSZWNvcmRzTG9hZGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbVBob25lLm1JY2NSZWNvcmRzLmlzUHJvdmlzaW9uZWQoKSAmJgogICAgICAgICAgICAgICAgICAgICBtUGhvbmUuZ2V0U3RhdGUoKSA9PSBQaG9uZS5TdGF0ZS5JRExFICYmCiAgICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbERhdGFFbmFibGVkICYmCiAgICAgICAgICAgICAgICAgICAgICghbVBob25lLmdldFNlcnZpY2VTdGF0ZSgpLmdldFJvYW1pbmcoKSB8fCBnZXREYXRhT25Sb2FtaW5nRW5hYmxlZCgpKSAmJgpAQCAtNTkzLDYgKzU3Myw3IEBACiAgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBncHJzPSAiICsgZ3Byc1N0YXRlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFtUGhvbmUubUljY1JlY29yZHMuZ2V0UmVjb3Jkc0xvYWRlZCgpKSByZWFzb24gKz0gIiAtIFNJTSBub3QgbG9hZGVkIjsKKyAgICAgICAgICAgIGlmICghbVBob25lLm1JY2NSZWNvcmRzLmlzUHJvdmlzaW9uZWQoKSkgcmVhc29uICs9ICIgLSBTSU0gbm90IHByb3Zpc2lvbmVkIjsKICAgICAgICAgICAgIGlmIChtUGhvbmUuZ2V0U3RhdGUoKSAhPSBQaG9uZS5TdGF0ZS5JRExFKSB7CiAgICAgICAgICAgICAgICAgcmVhc29uICs9ICIgLSBQaG9uZVN0YXRlPSAiICsgbVBob25lLmdldFN0YXRlKCk7CiAgICAgICAgICAgICB9CkBAIC02MDcsMzMgKzU4OCw2IEBACiAgICAgICAgIHJldHVybiBhbGxvd2VkOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIGFwbkNvbnRleHQKLSAgICAgKgotICAgICAqIEBwYXJhbSBhcG5Db250ZXh0Ci0gICAgICogQHBhcmFtIHRlYXJEb3duCi0gICAgICogQHJldHVybiBub25lCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2VBcG5Db250ZXh0KEFwbkNvbnRleHQgYXBuQ29udGV4dCwgYm9vbGVhbiB0ZWFyRG93bikgewotICAgICAgICBpZiAoYXBuQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREJHKSBsb2dlKCJyZWxlYXNlQXBuQ29udGV4dDogYXBuQ29udGV4dCBudWxsIHNob3VsZCBub3QgaGFwcGVuLCBpZ25vcmUiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBEYXRhQ29ubmVjdGlvbiBkYyA9IGFwbkNvbnRleHQuZ2V0RGF0YUNvbm5lY3Rpb24oKTsKLSAgICAgICAgaWYgKGRjID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZ2UoInJlbGVhc2VBcG5Db250ZXh0OiBhcG5Db250ZXh0IGRjID09IG51bGwgc2hvdWxkIG5vdCBoYXBwZW4sIGlnbm9yZSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0ZWFyRG93bikgewotICAgICAgICAgICAgaWYgKERCRykgbG9nKCJyZWxlYXNlQXBuQ29udGV4dDogdGVhcmluZyBkb3duIik7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG9idGFpbk1lc3NhZ2UoRVZFTlRfRElTQ09OTkVDVF9ET05FLCBhcG5Db250ZXh0KTsKLSAgICAgICAgICAgIGFwbkNvbnRleHQuZ2V0RGF0YUNvbm5lY3Rpb24oKS50ZWFyRG93bihhcG5Db250ZXh0LmdldFJlYXNvbigpLCBtc2cpOwotICAgICAgICB9Ci0gICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb24obnVsbCk7Ci0gICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb25BYyhudWxsKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBzZXR1cERhdGFPblJlYWR5QXBucyhTdHJpbmcgcmVhc29uKSB7CiAgICAgICAgIC8vIE9ubHkgY2hlY2sgZm9yIGRlZmF1bHQgQVBOIHN0YXRlCiAgICAgICAgIGZvciAoQXBuQ29udGV4dCBhcG5Db250ZXh0IDogbUFwbkNvbnRleHRzLnZhbHVlcygpKSB7CkBAIC04MDIsMTcgKzc1NiwxNyBAQAogICAgICAgICB9CiAKICAgICAgICAgRGF0YUNvbm5lY3Rpb25BYyBkY2FjID0gYXBuQ29udGV4dC5nZXREYXRhQ29ubmVjdGlvbkFjKCk7Ci0gICAgICAgIGlmIChkY2FjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh0ZWFyRG93bikgewotICAgICAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0U3RhdGUoU3RhdGUuRElTQ09OTkVDVElORyk7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUFwbkNvbnRleHQoYXBuQ29udGV4dCwgdGVhckRvd24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkY2FjLnJlc2V0U3luYygpOwotICAgICAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0U3RhdGUoU3RhdGUuSURMRSk7Ci0gICAgICAgICAgICAgICAgbVBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKGFwbkNvbnRleHQuZ2V0UmVhc29uKCksIGFwbkNvbnRleHQuZ2V0QXBuVHlwZSgpKTsKLSAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uKG51bGwpOwotICAgICAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb25BYyhudWxsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHRlYXJEb3duICYmIChkY2FjICE9IG51bGwpKSB7CisgICAgICAgICAgICBpZiAoREJHKSBsb2coImNsZWFuVXBDb25uZWN0aW9uOiB0ZWFyaW5nIGRvd24iKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gb2J0YWluTWVzc2FnZShFVkVOVF9ESVNDT05ORUNUX0RPTkUsIGFwbkNvbnRleHQpOworICAgICAgICAgICAgYXBuQ29udGV4dC5nZXREYXRhQ29ubmVjdGlvbigpLnRlYXJEb3duKGFwbkNvbnRleHQuZ2V0UmVhc29uKCksIG1zZyk7CisgICAgICAgICAgICBhcG5Db250ZXh0LnNldFN0YXRlKFN0YXRlLkRJU0NPTk5FQ1RJTkcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRjYWMgIT0gbnVsbCkgZGNhYy5yZXNldFN5bmMoKTsKKyAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0U3RhdGUoU3RhdGUuSURMRSk7CisgICAgICAgICAgICBtUGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oYXBuQ29udGV4dC5nZXRSZWFzb24oKSwgYXBuQ29udGV4dC5nZXRBcG5UeXBlKCkpOworICAgICAgICAgICAgYXBuQ29udGV4dC5zZXREYXRhQ29ubmVjdGlvbihudWxsKTsKKyAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb25BYyhudWxsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQyNyw3ICsxMzgxLDEzIEBACiAKICAgICAgICAgQWxhcm1NYW5hZ2VyIGFtID0KICAgICAgICAgICAgIChBbGFybU1hbmFnZXIpIG1QaG9uZS5nZXRDb250ZXh0KCkuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFMQVJNX1NFUlZJQ0UpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJTlRFTlRfUkVDT05ORUNUX0FMQVJNKTsKKworICAgICAgICAvLyBUT0RPIDogUmVnaXN0ZXIgdGhlIHJlY2VpdmVyIG9ubHkgb25jZSBtYXliZSBpbiBiYXNlY2xhc3MuCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CisgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSU5URU5UX1JFQ09OTkVDVF9BTEFSTSArICcuJythcG5Db250ZXh0LmdldEFwblR5cGUoKSk7CisgICAgICAgIG1QaG9uZS5nZXRDb250ZXh0KCkucmVnaXN0ZXJSZWNlaXZlcihtSW50ZW50UmVjZWl2ZXIsIGZpbHRlciwgbnVsbCwgbVBob25lKTsKKworICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChJTlRFTlRfUkVDT05ORUNUX0FMQVJNICsgJy4nICsgYXBuQ29udGV4dC5nZXRBcG5UeXBlKCkpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoSU5URU5UX1JFQ09OTkVDVF9BTEFSTV9FWFRSQV9SRUFTT04sIGFwbkNvbnRleHQuZ2V0UmVhc29uKCkpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoSU5URU5UX1JFQ09OTkVDVF9BTEFSTV9FWFRSQV9UWVBFLCBhcG5Db250ZXh0LmdldEFwblR5cGUoKSk7CiAgICAgICAgIGFwbkNvbnRleHQuc2V0UmVjb25uZWN0SW50ZW50KFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0ICgKQEAgLTE2OTcsNyArMTY1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIGFwbkNvbnRleHQuc2V0U3RhdGUoU3RhdGUuRkFJTEVEKTsKICAgICAgICAgICAgICAgICAgICAgbVBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9BUE5fRkFJTEVELCBhcG5Db250ZXh0LmdldEFwblR5cGUoKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUFwbkNvbnRleHQoYXBuQ29udGV4dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uKG51bGwpOworICAgICAgICAgICAgICAgICAgICBhcG5Db250ZXh0LnNldERhdGFDb25uZWN0aW9uQWMobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChEQkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygib25EYXRhU2V0dXBDb21wbGV0ZTogcGVybWFuZW50IGVycm9yIGFwbj0lcyIgKyBhcG5TdHJpbmcgKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTczMiw2ICsxNjkzLDggQEAKIAogICAgICAgICBhcG5Db250ZXh0LnNldFN0YXRlKFN0YXRlLklETEUpOwogICAgICAgICBhcG5Db250ZXh0LnNldEFwblNldHRpbmcobnVsbCk7CisgICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb24obnVsbCk7CisgICAgICAgIGFwbkNvbnRleHQuc2V0RGF0YUNvbm5lY3Rpb25BYyhudWxsKTsKIAogICAgICAgICBtUGhvbmUubm90aWZ5RGF0YUNvbm5lY3Rpb24oYXBuQ29udGV4dC5nZXRSZWFzb24oKSwgYXBuQ29udGV4dC5nZXRBcG5UeXBlKCkpOwogCkBAIC0xODg3LDcgKzE4NTAsNyBAQAogICAgICAgICAgICAgaWYgKCFkYy5jb25maWd1cmVSZXRyeShTeXN0ZW1Qcm9wZXJ0aWVzLmdldCgicm8uZ3NtLmRhdGFfcmV0cnlfY29uZmlnIikpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFkYy5jb25maWd1cmVSZXRyeShERUZBVUxUX0RBVEFfUkVUUllfQ09ORklHKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBsb2cgYW4gZXJyb3IgYW5kIGRlZmF1bHQgdG8gYSBzaW1wbGUgbGluZWFyIHNlcXVlbmNlLgotICAgICAgICAgICAgICAgICAgICBsb2dlKCJjcmVhdGVEYXRhQ29ubmVjdGlvbjogQ291bGQgbm90IGNvbmZpZ3VyZSB1c2luZyAiICsKKyAgICAgICAgICAgICAgICAgICAgbG9nZSgiY29uZmlndXJlUmV0cnk6IENvdWxkIG5vdCBjb25maWd1cmUgdXNpbmcgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRFRkFVTFRfREFUQV9SRVRSWV9DT05GSUc9IiArIERFRkFVTFRfREFUQV9SRVRSWV9DT05GSUcpOwogICAgICAgICAgICAgICAgICAgICBkYy5jb25maWd1cmVSZXRyeSgyMCwgMjAwMCwgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTg5Niw3ICsxODU5LDcgQEAKICAgICAgICAgICAgIGlmICghZGMuY29uZmlndXJlUmV0cnkoU3lzdGVtUHJvcGVydGllcy5nZXQoInJvLmdzbS4ybmRfZGF0YV9yZXRyeV9jb25maWciKSkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWRjLmNvbmZpZ3VyZVJldHJ5KFNFQ09OREFSWV9EQVRBX1JFVFJZX0NPTkZJRykpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiwgbG9nIGFuIGVycm9yIGFuZCBkZWZhdWx0IHRvIGEgc2ltcGxlIHNlcXVlbmNlLgotICAgICAgICAgICAgICAgICAgICBsb2dlKCJjcmVhdGVEYXRhQ29ubmVjdGlvbjogQ291bGQgbm90ZSBjb25maWd1cmUgdXNpbmcgIiArCisgICAgICAgICAgICAgICAgICAgIGxvZ2UoImNvbmZpZ3VyZVJldHJ5OiBDb3VsZCBub3RlIGNvbmZpZ3VyZSB1c2luZyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VDT05EQVJZX0RBVEFfUkVUUllfQ09ORklHPSIgKyBTRUNPTkRBUllfREFUQV9SRVRSWV9DT05GSUcpOwogICAgICAgICAgICAgICAgICAgICBkYy5jb25maWd1cmVSZXRyeSgibWF4X3JldHJpZXM9MywgMzMzLCAzMzMsIDMzMyIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE5MDksNyArMTg3Miw3IEBACiAgICAgICAgICAgICBpZiAoREJHKSBsb2coImRlc3Ryb3lEYXRhQ29ubmVjdGlvbnM6IGNsZWFyIG1EYXRhQ29ubmVjdGlvbkxpc3QiKTsKICAgICAgICAgICAgIG1EYXRhQ29ubmVjdGlvbnMuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChEQkcpIGxvZygiZGVzdHJveURhdGFDb25uZWN0aW9uTGlzdCBtRGF0YUNvbm5lY2l0b25MaXN0IGlzIGVtcHR5LCBpZ25vcmUiKTsKKyAgICAgICAgICAgIGlmIChEQkcpIGxvZygiZGVzdHJveURhdGFDb25uZWN0aW9uczogbURhdGFDb25uZWNpdG9uTGlzdCBpcyBlbXB0eSwgaWdub3JlIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9Hc21TTVNEaXNwYXRjaGVyLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiMDIxOTY3Li41MmNhNDUzCi0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU01TRGlzcGF0Y2hlci5qYXZhCkBAIC0zOTEsMzAgKzM5MSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioge0Bpbmhlcml0RG9jfSAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFjdGl2YXRlQ2VsbEJyb2FkY2FzdFNtcyhpbnQgYWN0aXZhdGUsIE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KLSAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKLSAgICAgICAgcmVzcG9uc2UucmVjeWNsZSgpOwotICAgIH0KLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2VsbEJyb2FkY2FzdFNtc0NvbmZpZyhNZXNzYWdlIHJlc3BvbnNlKXsKLSAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KLSAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKLSAgICAgICAgcmVzcG9uc2UucmVjeWNsZSgpOwotICAgIH0KLQotICAgIC8qKiB7QGluaGVyaXREb2N9ICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljICB2b2lkIHNldENlbGxCcm9hZGNhc3RDb25maWcoaW50W10gY29uZmlnVmFsdWVzQXJyYXksIE1lc3NhZ2UgcmVzcG9uc2UpIHsKLSAgICAgICAgLy8gVW5sZXNzIENCUyBpcyBpbXBsZW1lbnRlZCBmb3IgR1NNLCB0aGlzIHBvaW50IHNob3VsZCBiZSB1bnJlYWNoYWJsZS4KLSAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IhIFRoZSBmdW5jdGlvbmFsaXR5IGNlbGwgYnJvYWRjYXN0IHNtcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEdTTS4iKTsKLSAgICAgICAgcmVzcG9uc2UucmVjeWNsZSgpOwotICAgIH0KLQogICAgIHByaXZhdGUgaW50IHJlc3VsdFRvQ2F1c2UoaW50IHJjKSB7CiAgICAgICAgIHN3aXRjaCAocmMpIHsKICAgICAgICAgICAgIGNhc2UgQWN0aXZpdHkuUkVTVUxUX09LOgpAQCAtNTA2LDkgKzQ4MiwxMCBAQAogICAgIH0KIAogICAgIC8vIFRoaXMgbWFwIGhvbGRzIGluY29tcGxldGUgY29uY2F0ZW5hdGVkIG1lc3NhZ2VzIHdhaXRpbmcgZm9yIGFzc2VtYmx5Ci0gICAgcHJpdmF0ZSBIYXNoTWFwPFNtc0NiQ29uY2F0SW5mbywgYnl0ZVtdW10+IG1TbXNDYlBhZ2VNYXAgPQorICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTbXNDYkNvbmNhdEluZm8sIGJ5dGVbXVtdPiBtU21zQ2JQYWdlTWFwID0KICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFNtc0NiQ29uY2F0SW5mbywgYnl0ZVtdW10+KCk7CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCcm9hZGNhc3RTbXMoQXN5bmNSZXN1bHQgYXIpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ5dGVbXVtdIHBkdXMgPSBudWxsOwpAQCAtNTIwLDkgKzQ5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgaSArIDggJiYgaiA8IHJlY2VpdmVkUGR1Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IHJlY2VpdmVkUGR1W2pdICYgMHhmZjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiIDwgMHgxMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYikpLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYikpLmFwcGVuZCgnICcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgc2IudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTY3LDcgKzU0NCw4IEBACiAgICAgICAgICAgICAgICAgcGR1c1swXSA9IHJlY2VpdmVkUGR1OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkaXNwYXRjaEJyb2FkY2FzdFBkdXMocGR1cyk7CisgICAgICAgICAgICBib29sZWFuIGlzRW1lcmdlbmN5TWVzc2FnZSA9IFNtc0NiSGVhZGVyLmlzRW1lcmdlbmN5TWVzc2FnZShoZWFkZXIubWVzc2FnZUlkZW50aWZpZXIpOworICAgICAgICAgICAgZGlzcGF0Y2hCcm9hZGNhc3RQZHVzKHBkdXMsIGlzRW1lcmdlbmN5TWVzc2FnZSk7CiAKICAgICAgICAgICAgIC8vIFJlbW92ZSBtZXNzYWdlcyB0aGF0IGFyZSBvdXQgb2Ygc2NvcGUgdG8gcHJldmVudCB0aGUgbWFwIGZyb20KICAgICAgICAgICAgIC8vIGdyb3dpbmcgaW5kZWZpbml0ZWx5LCBjb250YWluaW5nIGluY29tcGxldGUgbWVzc2FnZXMgdGhhdCB3ZXJlCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL0dzbVNlcnZpY2VTdGF0ZVRyYWNrZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCmluZGV4IDQzNTI4MzEuLjkzZjRiNGUgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vR3NtU2VydmljZVN0YXRlVHJhY2tlci5qYXZhCkBAIC04NCwxMiArODQsNiBAQAogICAgIHByaXZhdGUgaW50IG1OZXdSZWFzb25EYXRhRGVuaWVkID0gLTE7CiAKICAgICAvKioKLSAgICAgKiAgVmFsdWVzIGNvcnJlc3BvbmQgdG8gU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IG5ldHdvcmtUeXBlID0gMDsKLSAgICBwcml2YXRlIGludCBuZXdOZXR3b3JrVHlwZSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBHU00gcm9hbWluZyBzdGF0dXMgc29sZWx5IGJhc2VkIG9uIFRTIDI3LjAwNyA3LjIgQ1JFRy4gT25seSB1c2VkIGJ5CiAgICAgICogaGFuZGxlUG9sbFN0YXRlUmVzdWx0IHRvIHN0b3JlIENSRUcgcm9hbWluZyByZXN1bHQuCiAgICAgICovCkBAIC02MjgsNyArNjIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBuZXdHUFJTU3RhdGUgPSByZWdDb2RlVG9TZXJ2aWNlU3RhdGUocmVnU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICBtRGF0YVJvYW1pbmcgPSByZWdDb2RlSXNSb2FtaW5nKHJlZ1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3TmV0d29ya1R5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgICAgICBtTmV3UmFkaW9UZWNobm9sb2d5ID0gdHlwZTsKICAgICAgICAgICAgICAgICAgICAgbmV3U1Muc2V0UmFkaW9UZWNobm9sb2d5KHR5cGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC03NDgsMzcgKzc0Miw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV0d29ya1R5cGVUb1N0cmluZyhpbnQgdHlwZSkgewotICAgICAgICAvL05ldHdvcmsgVHlwZSBmcm9tIEdQUlNfUkVHSVNUUkFUSU9OX1NUQVRFCi0gICAgICAgIFN0cmluZyByZXQgPSAidW5rbm93biI7Ci0KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0dQUlM6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIkdQUlMiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9FREdFOgotICAgICAgICAgICAgICAgIHJldCA9ICJFREdFIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU2VydmljZVN0YXRlLlJBRElPX1RFQ0hOT0xPR1lfVU1UUzoKLSAgICAgICAgICAgICAgICByZXQgPSAiVU1UUyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0hTRFBBOgotICAgICAgICAgICAgICAgIHJldCA9ICJIU0RQQSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0hTVVBBOgotICAgICAgICAgICAgICAgIHJldCA9ICJIU1VQQSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX0hTUEE6Ci0gICAgICAgICAgICAgICAgcmV0ID0gIkhTUEEiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzbG9nZSgiV3JvbmcgbmV0d29yayB0eXBlOiAiICsgSW50ZWdlci50b1N0cmluZyh0eXBlKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBwb2xsU3RhdGVEb25lKCkgewogICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICBsb2coIlBvbGwgU2VydmljZVN0YXRlIGRvbmU6ICIgKwpAQCAtNzg4LDggKzc1MSw4IEBACiAgICAgICAgICAgICAgICAgIiBtTmV3TWF4RGF0YUNhbGxzPSIgKyBtTmV3TWF4RGF0YUNhbGxzICsKICAgICAgICAgICAgICAgICAiIG9sZFJlYXNvbkRhdGFEZW5pZWQ9IiArIG1SZWFzb25EYXRhRGVuaWVkICsKICAgICAgICAgICAgICAgICAiIG1OZXdSZWFzb25EYXRhRGVuaWVkPSIgKyBtTmV3UmVhc29uRGF0YURlbmllZCArCi0gICAgICAgICAgICAgICAgIiBvbGRUeXBlPSIgKyBuZXR3b3JrVHlwZVRvU3RyaW5nKG5ldHdvcmtUeXBlKSArCi0gICAgICAgICAgICAgICAgIiBuZXdUeXBlPSIgKyBuZXR3b3JrVHlwZVRvU3RyaW5nKG5ld05ldHdvcmtUeXBlKSk7CisgICAgICAgICAgICAgICAgIiBvbGRUeXBlPSIgKyBTZXJ2aWNlU3RhdGUucmFkaW9UZWNobm9sb2d5VG9TdHJpbmcobVJhZGlvVGVjaG5vbG9neSkgKworICAgICAgICAgICAgICAgICIgbmV3VHlwZT0iICsgU2VydmljZVN0YXRlLnJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKG1OZXdSYWRpb1RlY2hub2xvZ3kpKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gaGFzUmVnaXN0ZXJlZCA9CkBAIC04MDgsNyArNzcxLDcgQEAKICAgICAgICAgICAgICAgICBncHJzU3RhdGUgPT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0UKICAgICAgICAgICAgICAgICAmJiBuZXdHUFJTU3RhdGUgIT0gU2VydmljZVN0YXRlLlNUQVRFX0lOX1NFUlZJQ0U7CiAKLSAgICAgICAgYm9vbGVhbiBoYXNOZXR3b3JrVHlwZUNoYW5nZWQgPSBuZXR3b3JrVHlwZSAhPSBuZXdOZXR3b3JrVHlwZTsKKyAgICAgICAgYm9vbGVhbiBoYXNSYWRpb1RlY2hub2xvZ3lDaGFuZ2VkID0gbVJhZGlvVGVjaG5vbG9neSAhPSBtTmV3UmFkaW9UZWNobm9sb2d5OwogCiAgICAgICAgIGJvb2xlYW4gaGFzQ2hhbmdlZCA9ICFuZXdTUy5lcXVhbHMoc3MpOwogCkBAIC04MzgsMzAgKzgwMSwzMiBAQAogICAgICAgICAvLyBBZGQgYW4gZXZlbnQgbG9nIHdoZW4gbmV0d29yayB0eXBlIHN3aXRjaGVkCiAgICAgICAgIC8vIFRPRE86IHdlIG1heSBhZGQgZmlsdGVyaW5nIHRvIHJlZHVjZSB0aGUgZXZlbnQgbG9nZ2VkLAogICAgICAgICAvLyBpLmUuIGNoZWNrIHByZWZlcnJlZCBuZXR3b3JrIHNldHRpbmcsIG9ubHkgc3dpdGNoIHRvIDJHLCBldGMKLSAgICAgICAgaWYgKGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgeworICAgICAgICBpZiAoaGFzUmFkaW9UZWNobm9sb2d5Q2hhbmdlZCkgewogICAgICAgICAgICAgaW50IGNpZCA9IC0xOwogICAgICAgICAgICAgR3NtQ2VsbExvY2F0aW9uIGxvYyA9ICgoR3NtQ2VsbExvY2F0aW9uKXBob25lLmdldENlbGxMb2NhdGlvbigpKTsKICAgICAgICAgICAgIGlmIChsb2MgIT0gbnVsbCkgY2lkID0gbG9jLmdldENpZCgpOwotICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuR1NNX1JBVF9TV0lUQ0hFRCwgY2lkLCBuZXR3b3JrVHlwZSwgbmV3TmV0d29ya1R5cGUpOworICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuR1NNX1JBVF9TV0lUQ0hFRCwgY2lkLCBtUmFkaW9UZWNobm9sb2d5LAorICAgICAgICAgICAgICAgICAgICBtTmV3UmFkaW9UZWNobm9sb2d5KTsKICAgICAgICAgICAgIGlmIChEQkcpIHsKLSAgICAgICAgICAgICAgICBsb2coIlJBVCBzd2l0Y2hlZCAiICsgbmV0d29ya1R5cGVUb1N0cmluZyhuZXR3b3JrVHlwZSkgKyAiIC0+ICIKLSAgICAgICAgICAgICAgICAgICAgKyBuZXR3b3JrVHlwZVRvU3RyaW5nKG5ld05ldHdvcmtUeXBlKSArICIgYXQgY2VsbCAiICsgY2lkKTsKKyAgICAgICAgICAgICAgICBsb2coIlJBVCBzd2l0Y2hlZCAiICsgU2VydmljZVN0YXRlLnJhZGlvVGVjaG5vbG9neVRvU3RyaW5nKG1SYWRpb1RlY2hub2xvZ3kpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgLT4gIiArIFNlcnZpY2VTdGF0ZS5yYWRpb1RlY2hub2xvZ3lUb1N0cmluZyhtTmV3UmFkaW9UZWNobm9sb2d5KSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGF0IGNlbGwgIiArIGNpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBncHJzU3RhdGUgPSBuZXdHUFJTU3RhdGU7CiAgICAgICAgIG1SZWFzb25EYXRhRGVuaWVkID0gbU5ld1JlYXNvbkRhdGFEZW5pZWQ7CiAgICAgICAgIG1NYXhEYXRhQ2FsbHMgPSBtTmV3TWF4RGF0YUNhbGxzOwotICAgICAgICBuZXR3b3JrVHlwZSA9IG5ld05ldHdvcmtUeXBlOworICAgICAgICBtUmFkaW9UZWNobm9sb2d5ID0gbU5ld1JhZGlvVGVjaG5vbG9neTsKICAgICAgICAgLy8gdGhpcyBuZXcgc3RhdGUgaGFzIGJlZW4gYXBwbGllZCAtIGZvcmdldCBpdCB1bnRpbCB3ZSBnZXQgYSBuZXcgbmV3IHN0YXRlCi0gICAgICAgIG5ld05ldHdvcmtUeXBlID0gMDsKKyAgICAgICAgbU5ld1JhZGlvVGVjaG5vbG9neSA9IDA7CiAKIAogICAgICAgICBuZXdTUy5zZXRTdGF0ZU91dE9mU2VydmljZSgpOyAvLyBjbGVhbiBzbGF0ZSBmb3IgbmV4dCB0aW1lCiAKLSAgICAgICAgaWYgKGhhc05ldHdvcmtUeXBlQ2hhbmdlZCkgeworICAgICAgICBpZiAoaGFzUmFkaW9UZWNobm9sb2d5Q2hhbmdlZCkgewogICAgICAgICAgICAgcGhvbmUuc2V0U3lzdGVtUHJvcGVydHkoVGVsZXBob255UHJvcGVydGllcy5QUk9QRVJUWV9EQVRBX05FVFdPUktfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgbmV0d29ya1R5cGVUb1N0cmluZyhuZXR3b3JrVHlwZSkpOworICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlU3RhdGUucmFkaW9UZWNobm9sb2d5VG9TdHJpbmcobVJhZGlvVGVjaG5vbG9neSkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc1JlZ2lzdGVyZWQpIHsKQEAgLTk0OSw3ICs5MTQsNyBAQAogICAgICAgICAgICAgbURldGFjaGVkUmVnaXN0cmFudHMubm90aWZ5UmVnaXN0cmFudHMoKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChoYXNOZXR3b3JrVHlwZUNoYW5nZWQpIHsKKyAgICAgICAgaWYgKGhhc1JhZGlvVGVjaG5vbG9neUNoYW5nZWQpIHsKICAgICAgICAgICAgIHBob25lLm5vdGlmeURhdGFDb25uZWN0aW9uKFBob25lLlJFQVNPTl9OV19UWVBFX0NIQU5HRUQsIFBob25lLkFQTl9UWVBFX0FMTCk7CiAgICAgICAgIH0KIApAQCAtMTI4NSw3ICsxMjUwLDcgQEAKICAgICAgKiB0aGF0IGNvdWxkIHN1cHBvcnQgdm9pY2UgYW5kIGRhdGEgc2ltdWx0YW5lb3VzbHkuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNDb25jdXJyZW50Vm9pY2VBbmREYXRhQWxsb3dlZCgpIHsKLSAgICAgICAgcmV0dXJuIChuZXR3b3JrVHlwZSA+PSBTZXJ2aWNlU3RhdGUuUkFESU9fVEVDSE5PTE9HWV9VTVRTKTsKKyAgICAgICAgcmV0dXJuIChtUmFkaW9UZWNobm9sb2d5ID49IFNlcnZpY2VTdGF0ZS5SQURJT19URUNITk9MT0dZX1VNVFMpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TSU1SZWNvcmRzLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMuamF2YQppbmRleCA4OTFjN2NiLi5iMGJhZDU2IDEwMDc1NQotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMuamF2YQorKysgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NJTVJlY29yZHMuamF2YQpAQCAtNDUsMTIgKzQ1LDEyIEBACiAvKioKICAqIHtAaGlkZX0KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNJTVJlY29yZHMgZXh0ZW5kcyBJY2NSZWNvcmRzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiR1NNIjsKK3B1YmxpYyBjbGFzcyBTSU1SZWNvcmRzIGV4dGVuZHMgSWNjUmVjb3JkcyB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJHU00iOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUkFTSF9SSUwgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREJHID0gdHJ1ZTsKIAogICAgIC8vICoqKioqIEluc3RhbmNlIFZhcmlhYmxlcwogCkBAIC0xMjAsMTMgKzEyMCwxMyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NJTV9SRUFEWSA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JBRElPX09GRl9PUl9OT1RfQVZBSUxBQkxFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0lNU0lfRE9ORSA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9JQ0NJRF9ET05FID0gNDsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfSU1TSV9ET05FID0gMzsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfSUNDSURfRE9ORSA9IDQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9NQklfRE9ORSA9IDU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9NQkROX0RPTkUgPSA2OwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfTVdJU19ET05FID0gNzsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX1ZPSUNFX01BSUxfSU5ESUNBVE9SX0NQSFNfRE9ORSA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9BRF9ET05FID0gOTsgLy8gQWRtaW4gZGF0YSBvbiBTSU0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQURfRE9ORSA9IDk7IC8vIEFkbWluIGRhdGEgb24gU0lNCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0dFVF9NU0lTRE5fRE9ORSA9IDEwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQ1BIU19NQUlMQk9YX0RPTkUgPSAxMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX1NQTl9ET05FID0gMTI7CkBAIC0xNDcsNiArMTQ3LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfR0VUX0NGSVNfRE9ORSA9IDMyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9HRVRfQ1NQX0NQSFNfRE9ORSA9IDMzOwogCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1NJTV9FVkVOVF9CQVNFID0gMTAwOworCiAgICAgLy8gTG9va3VwIHRhYmxlIGZvciBjYXJyaWVycyBrbm93biB0byBwcm9kdWNlIFNJTXMgd2hpY2ggaW5jb3JyZWN0bHkgaW5kaWNhdGUgTU5DIGxlbmd0aC4KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1DQ01OQ19DT0RFU19IQVZJTkdfM0RJR0lUU19NTkMgPSB7CkBAIC0xODEsOCArMTgzLDExIEBACiAgICAgICAgIC8vIHJlY29yZHNUb0xvYWQgaXMgc2V0IHRvIDAgYmVjYXVzZSBubyByZXF1ZXN0cyBhcmUgbWFkZSB5ZXQKICAgICAgICAgcmVjb3Jkc1RvTG9hZCA9IDA7CiAKLQotICAgICAgICBwLm1DTS5yZWdpc3RlckZvclNJTVJlYWR5KHRoaXMsIEVWRU5UX1NJTV9SRUFEWSwgbnVsbCk7CisgICAgICAgIC8vIFNJTVJlY29yZCBpcyB1c2VkIGJ5IENETUErTFRFIG1vZGUsIGFuZCBTSU1fUkVBRFkgZXZlbnQKKyAgICAgICAgLy8gd2lsbCBiZSBzdWJzY3JpYmVkIGJ5IENkbWFMdGVTZXJ2aWNlU3RhdGVUcmFja2VyLgorICAgICAgICBpZiAocGhvbmUuZ2V0THRlT25DZG1hTW9kZSgpICE9IFBob25lLkxURV9PTl9DRE1BX1RSVUUpIHsKKyAgICAgICAgICAgIHAubUNNLnJlZ2lzdGVyRm9yU0lNUmVhZHkodGhpcywgRVZFTlRfU0lNX1JFQURZLCBudWxsKTsKKyAgICAgICAgfQogICAgICAgICBwLm1DTS5yZWdpc3RlckZvck9mZk9yTm90QXZhaWxhYmxlKAogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgRVZFTlRfUkFESU9fT0ZGX09SX05PVF9BVkFJTEFCTEUsIG51bGwpOwogICAgICAgICBwLm1DTS5zZXRPblNtc09uU2ltKHRoaXMsIEVWRU5UX1NNU19PTl9TSU0sIG51bGwpOwpAQCAtMTk2LDcgKzIwMSw5IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKICAgICAgICAgLy9VbnJlZ2lzdGVyIGZvciBhbGwgZXZlbnRzCi0gICAgICAgIHBob25lLm1DTS51bnJlZ2lzdGVyRm9yU0lNUmVhZHkodGhpcyk7CisgICAgICAgIGlmIChwaG9uZS5nZXRMdGVPbkNkbWFNb2RlKCkgIT0gUGhvbmUuTFRFX09OX0NETUFfVFJVRSkgeworICAgICAgICAgICAgcGhvbmUubUNNLnVucmVnaXN0ZXJGb3JTSU1SZWFkeSh0aGlzKTsKKyAgICAgICAgfQogICAgICAgICBwaG9uZS5tQ00udW5yZWdpc3RlckZvck9mZk9yTm90QXZhaWxhYmxlKCB0aGlzKTsKICAgICAgICAgcGhvbmUubUNNLnVucmVnaXN0ZXJGb3JJY2NSZWZyZXNoKHRoaXMpOwogICAgIH0KQEAgLTEyODAsNyArMTI4Nyw3IEBACiAgICAgICAgIGZldGNoU2ltUmVjb3JkcygpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBmZXRjaFNpbVJlY29yZHMoKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgZmV0Y2hTaW1SZWNvcmRzKCkgewogICAgICAgICByZWNvcmRzUmVxdWVzdGVkID0gdHJ1ZTsKICAgICAgICAgSWNjRmlsZUhhbmRsZXIgaWNjRmggPSBwaG9uZS5nZXRJY2NGaWxlSGFuZGxlcigpOwogCmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVBob25lQm9va0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDM3N2Y4ZjAuLjM1YmEwZDEgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltUGhvbmVCb29rSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbTsKIAoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKQEAgLTU2LDE0ICs1OCwxMSBAQAogICAgICAgICAgICAgcmVjb3JkU2l6ZSA9IG5ldyBpbnRbM107CiAKICAgICAgICAgICAgIC8vVXNpbmcgbUJhc2VIYW5kbGVyLCBubyBkaWZmZXJlbmNlIGluIEVWRU5UX0dFVF9TSVpFX0RPTkUgaGFuZGxpbmcKLSAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2UgPSBtQmFzZUhhbmRsZXIub2J0YWluTWVzc2FnZShFVkVOVF9HRVRfU0laRV9ET05FKTsKKyAgICAgICAgICAgIEF0b21pY0Jvb2xlYW4gc3RhdHVzID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1CYXNlSGFuZGxlci5vYnRhaW5NZXNzYWdlKEVWRU5UX0dFVF9TSVpFX0RPTkUsIHN0YXR1cyk7CiAKICAgICAgICAgICAgIHBob25lLmdldEljY0ZpbGVIYW5kbGVyKCkuZ2V0RUZMaW5lYXJSZWNvcmRTaXplKGVmaWQsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUxvY2sud2FpdCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxvZ2QoImludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byBsb2FkIGZyb20gdGhlIFNJTSIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgd2FpdEZvclJlc3VsdChzdGF0dXMpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlY29yZFNpemU7CmRpZmYgLS1naXQgYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1NpbVNtc0ludGVyZmFjZU1hbmFnZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCmluZGV4IDVhYmJhNmUuLjhkMGU1ZDMgMTAwNjQ0Ci0tLSBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCisrKyBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU2ltU21zSW50ZXJmYWNlTWFuYWdlci5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkljY0NvbnN0YW50czsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjU21zSW50ZXJmYWNlTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuSWNjVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LkludFJhbmdlTWFuYWdlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU01TRGlzcGF0Y2hlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnkuU21zUmF3RGF0YTsKIApAQCAtNTMsNiArNTQsOSBAQAogICAgIHByaXZhdGUgSGFzaE1hcDxJbnRlZ2VyLCBIYXNoU2V0PFN0cmluZz4+IG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucyA9CiAgICAgICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBIYXNoU2V0PFN0cmluZz4+KCk7CiAKKyAgICBwcml2YXRlIENlbGxCcm9hZGNhc3RSYW5nZU1hbmFnZXIgbUNlbGxCcm9hZGNhc3RSYW5nZU1hbmFnZXIgPQorICAgICAgICAgICAgbmV3IENlbGxCcm9hZGNhc3RSYW5nZU1hbmFnZXIoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9MT0FEX0RPTkUgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9VUERBVEVfRE9ORSA9IDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1NFVF9CUk9BRENBU1RfQUNUSVZBVElPTl9ET05FID0gMzsKQEAgLTIxMyw3ICsyMTcsMTUgQEAKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgewotICAgICAgICBpZiAoREJHKSBsb2coImVuYWJsZUNlbGxCcm9hZGNhc3QiKTsKKyAgICAgICAgcmV0dXJuIGVuYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShtZXNzYWdlSWRlbnRpZmllciwgbWVzc2FnZUlkZW50aWZpZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0KGludCBtZXNzYWdlSWRlbnRpZmllcikgeworICAgICAgICByZXR1cm4gZGlzYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShtZXNzYWdlSWRlbnRpZmllciwgbWVzc2FnZUlkZW50aWZpZXIpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZUNlbGxCcm9hZGNhc3RSYW5nZShpbnQgc3RhcnRNZXNzYWdlSWQsIGludCBlbmRNZXNzYWdlSWQpIHsKKyAgICAgICAgaWYgKERCRykgbG9nKCJlbmFibGVDZWxsQnJvYWRjYXN0UmFuZ2UiKTsKIAogICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBtUGhvbmUuZ2V0Q29udGV4dCgpOwogCkBAIC0yMjMsMzAgKzIzNSwyMiBAQAogCiAgICAgICAgIFN0cmluZyBjbGllbnQgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0TmFtZUZvclVpZCgKICAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IGNsaWVudHMgPSBtQ2VsbEJyb2FkY2FzdFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2VJZGVudGlmaWVyKTsKIAotICAgICAgICBpZiAoY2xpZW50cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IG1lc3NhZ2UgaWRlbnRpZmllcgotICAgICAgICAgICAgY2xpZW50cyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5wdXQobWVzc2FnZUlkZW50aWZpZXIsIGNsaWVudHMpOwotCi0gICAgICAgICAgICBpZiAoIXVwZGF0ZUNlbGxCcm9hZGNhc3RDb25maWcoKSkgewotICAgICAgICAgICAgICAgIG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5yZW1vdmUobWVzc2FnZUlkZW50aWZpZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2VsbEJyb2FkY2FzdFJhbmdlTWFuYWdlci5lbmFibGVSYW5nZShzdGFydE1lc3NhZ2VJZCwgZW5kTWVzc2FnZUlkLCBjbGllbnQpKSB7CisgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBhZGQgY2VsbCBicm9hZGNhc3Qgc3Vic2NyaXB0aW9uIGZvciBNSUQgcmFuZ2UgIiArIHN0YXJ0TWVzc2FnZUlkCisgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZW5kTWVzc2FnZUlkICsgIiBmcm9tIGNsaWVudCAiICsgY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGNsaWVudHMuYWRkKGNsaWVudCk7Ci0KICAgICAgICAgaWYgKERCRykKLSAgICAgICAgICAgIGxvZygiQWRkZWQgY2VsbCBicm9hZGNhc3Qgc3Vic2NyaXB0aW9uIGZvciBNSUQgIiArIG1lc3NhZ2VJZGVudGlmaWVyCi0gICAgICAgICAgICAgICAgICAgICsgIiBmcm9tIGNsaWVudCAiICsgY2xpZW50KTsKKyAgICAgICAgICAgIGxvZygiQWRkZWQgY2VsbCBicm9hZGNhc3Qgc3Vic2NyaXB0aW9uIGZvciBNSUQgcmFuZ2UgIiArIHN0YXJ0TWVzc2FnZUlkCisgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZW5kTWVzc2FnZUlkICsgIiBmcm9tIGNsaWVudCAiICsgY2xpZW50KTsKIAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlQ2VsbEJyb2FkY2FzdChpbnQgbWVzc2FnZUlkZW50aWZpZXIpIHsKLSAgICAgICAgaWYgKERCRykgbG9nKCJkaXNhYmxlQ2VsbEJyb2FkY2FzdCIpOworICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVDZWxsQnJvYWRjYXN0UmFuZ2UoaW50IHN0YXJ0TWVzc2FnZUlkLCBpbnQgZW5kTWVzc2FnZUlkKSB7CisgICAgICAgIGlmIChEQkcpIGxvZygiZGlzYWJsZUNlbGxCcm9hZGNhc3RSYW5nZSIpOwogCiAgICAgICAgIENvbnRleHQgY29udGV4dCA9IG1QaG9uZS5nZXRDb250ZXh0KCk7CiAKQEAgLTI1NiwzOSArMjYwLDU2IEBACiAKICAgICAgICAgU3RyaW5nIGNsaWVudCA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXROYW1lRm9yVWlkKAogICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICBIYXNoU2V0PFN0cmluZz4gY2xpZW50cyA9IG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZUlkZW50aWZpZXIpOwogCi0gICAgICAgIGlmIChjbGllbnRzICE9IG51bGwgJiYgY2xpZW50cy5yZW1vdmUoY2xpZW50KSkgewotICAgICAgICAgICAgaWYgKERCRykKLSAgICAgICAgICAgICAgICBsb2coIlJlbW92ZWQgY2VsbCBicm9hZGNhc3Qgc3Vic2NyaXB0aW9uIGZvciBNSUQgIiArIG1lc3NhZ2VJZGVudGlmaWVyCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSBjbGllbnQgIiArIGNsaWVudCk7Ci0KLSAgICAgICAgICAgIGlmIChjbGllbnRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1DZWxsQnJvYWRjYXN0U3Vic2NyaXB0aW9ucy5yZW1vdmUobWVzc2FnZUlkZW50aWZpZXIpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNlbGxCcm9hZGNhc3RDb25maWcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIW1DZWxsQnJvYWRjYXN0UmFuZ2VNYW5hZ2VyLmRpc2FibGVSYW5nZShzdGFydE1lc3NhZ2VJZCwgZW5kTWVzc2FnZUlkLCBjbGllbnQpKSB7CisgICAgICAgICAgICBsb2coIkZhaWxlZCB0byByZW1vdmUgY2VsbCBicm9hZGNhc3Qgc3Vic2NyaXB0aW9uIGZvciBNSUQgcmFuZ2UgIiArIHN0YXJ0TWVzc2FnZUlkCisgICAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZW5kTWVzc2FnZUlkICsgIiBmcm9tIGNsaWVudCAiICsgY2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKERCRykKKyAgICAgICAgICAgIGxvZygiUmVtb3ZlZCBjZWxsIGJyb2FkY2FzdCBzdWJzY3JpcHRpb24gZm9yIE1JRCByYW5nZSAiICsgc3RhcnRNZXNzYWdlSWQKKyAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBlbmRNZXNzYWdlSWQgKyAiIGZyb20gY2xpZW50ICIgKyBjbGllbnQpOworCisgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVDZWxsQnJvYWRjYXN0Q29uZmlnKCkgewotICAgICAgICBTZXQ8SW50ZWdlcj4gbWVzc2FnZUlkZW50aWZpZXJzID0gbUNlbGxCcm9hZGNhc3RTdWJzY3JpcHRpb25zLmtleVNldCgpOworICAgIGNsYXNzIENlbGxCcm9hZGNhc3RSYW5nZU1hbmFnZXIgZXh0ZW5kcyBJbnRSYW5nZU1hbmFnZXIgeworICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTbXNCcm9hZGNhc3RDb25maWdJbmZvPiBtQ29uZmlnTGlzdCA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTbXNCcm9hZGNhc3RDb25maWdJbmZvPigpOwogCi0gICAgICAgIGlmIChtZXNzYWdlSWRlbnRpZmllcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU21zQnJvYWRjYXN0Q29uZmlnSW5mb1tdIGNvbmZpZ3MgPQotICAgICAgICAgICAgICAgICAgICBuZXcgU21zQnJvYWRjYXN0Q29uZmlnSW5mb1ttZXNzYWdlSWRlbnRpZmllcnMuc2l6ZSgpXTsKLSAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBsaXN0IG9mIGVuYWJsZWQgcmFuZ2VzIGhhcyBjaGFuZ2VkLiBUaGlzIHdpbGwgYmUKKyAgICAgICAgICogZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGNhbGxzIHRvIHtAbGluayAjYWRkUmFuZ2V9IGZvbGxvd2VkIGJ5CisgICAgICAgICAqIGEgY2FsbCB0byB7QGxpbmsgI2ZpbmlzaFVwZGF0ZX0uCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzdGFydFVwZGF0ZSgpIHsKKyAgICAgICAgICAgIG1Db25maWdMaXN0LmNsZWFyKCk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgbWVzc2FnZUlkZW50aWZpZXIgOiBtZXNzYWdlSWRlbnRpZmllcnMpIHsKLSAgICAgICAgICAgICAgICBjb25maWdzW2krK10gPSBuZXcgU21zQnJvYWRjYXN0Q29uZmlnSW5mbyhtZXNzYWdlSWRlbnRpZmllciwgbWVzc2FnZUlkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBhZnRlciB7QGxpbmsgI3N0YXJ0VXBkYXRlfSB0byBpbmRpY2F0ZSBhIHJhbmdlIG9mIGVuYWJsZWQKKyAgICAgICAgICogdmFsdWVzLgorICAgICAgICAgKiBAcGFyYW0gc3RhcnRJZCB0aGUgZmlyc3QgaWQgaW5jbHVkZWQgaW4gdGhlIHJhbmdlCisgICAgICAgICAqIEBwYXJhbSBlbmRJZCB0aGUgbGFzdCBpZCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFJhbmdlKGludCBzdGFydElkLCBpbnQgZW5kSWQsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgIG1Db25maWdMaXN0LmFkZChuZXcgU21zQnJvYWRjYXN0Q29uZmlnSW5mbyhzdGFydElkLCBlbmRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHNlbGVjdGVkKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSByYW5nZSB1cGRhdGUgc3RhcnRlZCBieSB0aGUKKyAgICAgICAgICogcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgI3N0YXJ0VXBkYXRlfS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaFVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0Q2VsbEJyb2FkY2FzdEFjdGl2YXRpb24oZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTbXNCcm9hZGNhc3RDb25maWdJbmZvW10gY29uZmlncyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnTGlzdC50b0FycmF5KG5ldyBTbXNCcm9hZGNhc3RDb25maWdJbmZvW21Db25maWdMaXN0LnNpemUoKV0pOworICAgICAgICAgICAgICAgIHJldHVybiBzZXRDZWxsQnJvYWRjYXN0Q29uZmlnKGNvbmZpZ3MpICYmIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKHRydWUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc2V0Q2VsbEJyb2FkY2FzdENvbmZpZyhjb25maWdzKSAmJiBzZXRDZWxsQnJvYWRjYXN0QWN0aXZhdGlvbih0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRDZWxsQnJvYWRjYXN0QWN0aXZhdGlvbihmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxNCw3ICszMzUsNyBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKGJvb2xlYW4gYWN0aXZhdGUpIHsKICAgICAgICAgaWYgKERCRykKLSAgICAgICAgICAgIGxvZygiQ2FsbGluZyBzZXRDZWxsQnJvYWRjYXN0QWN0aXZhdGlvbigiICsgYWN0aXZhdGUgKyAiKSIpOworICAgICAgICAgICAgbG9nKCJDYWxsaW5nIHNldENlbGxCcm9hZGNhc3RBY3RpdmF0aW9uKCIgKyBhY3RpdmF0ZSArICcpJyk7CiAKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewogICAgICAgICAgICAgTWVzc2FnZSByZXNwb25zZSA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoRVZFTlRfU0VUX0JST0FEQ0FTVF9BQ1RJVkFUSU9OX0RPTkUpOwpkaWZmIC0tZ2l0IGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNCcm9hZGNhc3RDb25maWdJbmZvLmphdmEgYi90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0Jyb2FkY2FzdENvbmZpZ0luZm8uamF2YQppbmRleCA0NWY1MGJjNC4uNjZlN2NlMCAxMDA2NDQKLS0tIGEvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNCcm9hZGNhc3RDb25maWdJbmZvLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNCcm9hZGNhc3RDb25maWdJbmZvLmphdmEKQEAgLTMwLDExICszMCwxMSBAQAogICogYW5kIDkuNC40LjIuMyBmb3IgVU1UUy4KICAqIEFsbCBvdGhlciB2YWx1ZXMgY2FuIGJlIHRyZWF0ZWQgYXMgZW1wdHkgQ0JNIGRhdGEgY29kaW5nIHNjaGVtZS4KICAqCi0gKiBzZWxlY3RlZCBmYWxzZSBtZWFucyBtZXNzYWdlIHR5cGVzIHNwZWNpZmllZCBpbiA8ZnJvbVNlcnZpY2VJZCwgdG9TZXJ2aWNlSWQ+Ci0gKiBhbmQgPGZyb21Db2RlU2NoZW1lLCB0b0NvZGVTY2hlbWU+YXJlIG5vdCBhY2NlcHRlZCwgd2hpbGUgdHJ1ZSBtZWFucyBhY2NlcHRlZC4KKyAqIHNlbGVjdGVkIGZhbHNlIG1lYW5zIG1lc3NhZ2UgdHlwZXMgc3BlY2lmaWVkIGluIHtAY29kZSA8ZnJvbVNlcnZpY2VJZCwgdG9TZXJ2aWNlSWQ+fQorICogYW5kIHtAY29kZSA8ZnJvbUNvZGVTY2hlbWUsIHRvQ29kZVNjaGVtZT59IGFyZSBub3QgYWNjZXB0ZWQsIHdoaWxlIHRydWUgbWVhbnMgYWNjZXB0ZWQuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgU21zQnJvYWRjYXN0Q29uZmlnSW5mbyB7CitwdWJsaWMgZmluYWwgY2xhc3MgU21zQnJvYWRjYXN0Q29uZmlnSW5mbyB7CiAgICAgcHJpdmF0ZSBpbnQgZnJvbVNlcnZpY2VJZDsKICAgICBwcml2YXRlIGludCB0b1NlcnZpY2VJZDsKICAgICBwcml2YXRlIGludCBmcm9tQ29kZVNjaGVtZTsKQEAgLTQ2LDExICs0NiwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBTbXNCcm9hZGNhc3RDb25maWdJbmZvKGludCBmcm9tSWQsIGludCB0b0lkLCBpbnQgZnJvbVNjaGVtZSwKICAgICAgICAgICAgIGludCB0b1NjaGVtZSwgYm9vbGVhbiBzZWxlY3RlZCkgewotICAgICAgICBzZXRGcm9tU2VydmljZUlkKGZyb21JZCk7Ci0gICAgICAgIHNldFRvU2VydmljZUlkKHRvSWQpOwotICAgICAgICBzZXRGcm9tQ29kZVNjaGVtZShmcm9tU2NoZW1lKTsKLSAgICAgICAgc2V0VG9Db2RlU2NoZW1lKHRvU2NoZW1lKTsKLSAgICAgICAgdGhpcy5zZXRTZWxlY3RlZChzZWxlY3RlZCk7CisgICAgICAgIGZyb21TZXJ2aWNlSWQgPSBmcm9tSWQ7CisgICAgICAgIHRvU2VydmljZUlkID0gdG9JZDsKKyAgICAgICAgZnJvbUNvZGVTY2hlbWUgPSBmcm9tU2NoZW1lOworICAgICAgICB0b0NvZGVTY2hlbWUgPSB0b1NjaGVtZTsKKyAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI2LDggKzEyNiw4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJTbXNCcm9hZGNhc3RDb25maWdJbmZvOiBJZCBbIiArCi0gICAgICAgICAgICBnZXRGcm9tU2VydmljZUlkKCkgKyAiLCIgKyBnZXRUb1NlcnZpY2VJZCgpICsgIl0gQ29kZSBbIiArCi0gICAgICAgICAgICBnZXRGcm9tQ29kZVNjaGVtZSgpICsgIiwiICsgZ2V0VG9Db2RlU2NoZW1lKCkgKyAiXSAiICsKLSAgICAgICAgICAgIChpc1NlbGVjdGVkKCkgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiKTsKKyAgICAgICAgICAgICAgICBmcm9tU2VydmljZUlkICsgJywnICsgdG9TZXJ2aWNlSWQgKyAiXSBDb2RlIFsiICsKKyAgICAgICAgICAgICAgICBmcm9tQ29kZVNjaGVtZSArICcsJyArIHRvQ29kZVNjaGVtZSArICJdICIgKworICAgICAgICAgICAgKHNlbGVjdGVkID8gIkVOQUJMRUQiIDogIkRJU0FCTEVEIik7CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JIZWFkZXIuamF2YSBiL3RlbGVwaG9ueS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9nc20vU21zQ2JIZWFkZXIuamF2YQppbmRleCA1ZjI3Y2ZjLi44ZTZiNzliIDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvZ3NtL1Ntc0NiSGVhZGVyLmphdmEKKysrIGIvdGVsZXBob255L2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L2dzbS9TbXNDYkhlYWRlci5qYXZhCkBAIC0xNiw5ICsxNiw0NCBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLnRlbGVwaG9ueS5nc207CiAKLXB1YmxpYyBjbGFzcyBTbXNDYkhlYWRlciB7CitpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBTbXNDYkhlYWRlciBpbXBsZW1lbnRzIFNtc0NiQ29uc3RhbnRzIHsKKyAgICAvKioKKyAgICAgKiBMZW5ndGggb2YgU01TLUNCIGhlYWRlcgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBEVV9IRUFERVJfTEVOR1RIID0gNjsKIAorICAgIC8qKgorICAgICAqIEdTTSBwZHUgZm9ybWF0LCBhcyBkZWZpbmVkIGluIDNncHAgVFMgMjMuMDQxLCBzZWN0aW9uIDkuNC4xCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0dTTSA9IDE7CisKKyAgICAvKioKKyAgICAgKiBVTVRTIHBkdSBmb3JtYXQsIGFzIGRlZmluZWQgaW4gM2dwcCBUUyAyMy4wNDEsIHNlY3Rpb24gOS40LjIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JNQVRfVU1UUyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBHU00gcGR1IGZvcm1hdCwgYXMgZGVmaW5lZCBpbiAzZ3BwIFRTIDIzLjA0MSwgc2VjdGlvbiA5LjQuMS4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0VUV1NfUFJJTUFSWSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIHR5cGUgdmFsdWUgYXMgZGVmaW5lZCBpbiAzZ3BwIFRTIDI1LjMyNCwgc2VjdGlvbiAxMS4xLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1RZUEVfQ0JTX01FU1NBR0UgPSAxOworCisgICAgLyoqCisgICAgICogTGVuZ3RoIG9mIEdTTSBwZHVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUERVX0xFTkdUSF9HU00gPSA4ODsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbGVuZ3RoIG9mIEVUV1MgcHJpbWFyeSBtZXNzYWdlIEdTTSBwZHVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUERVX0xFTkdUSF9FVFdTID0gNTY7CisKICAgICBwdWJsaWMgZmluYWwgaW50IGdlb2dyYXBoaWNhbFNjb3BlOwogCiAgICAgcHVibGljIGZpbmFsIGludCBtZXNzYWdlQ29kZTsKQEAgLTMzLDI3ICs2OCwxNDcgQEAKIAogICAgIHB1YmxpYyBmaW5hbCBpbnQgbnJPZlBhZ2VzOwogCisgICAgcHVibGljIGZpbmFsIGludCBmb3JtYXQ7CisKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBldHdzRW1lcmdlbmN5VXNlckFsZXJ0OworCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXR3c1BvcHVwOworCisgICAgcHVibGljIGZpbmFsIGludCBldHdzV2FybmluZ1R5cGU7CisKICAgICBwdWJsaWMgU21zQ2JIZWFkZXIoYnl0ZVtdIHBkdSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwZHUgPT0gbnVsbCB8fCBwZHUubGVuZ3RoIDwgUERVX0hFQURFUl9MRU5HVEgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgUERVIik7CiAgICAgICAgIH0KIAotICAgICAgICBnZW9ncmFwaGljYWxTY29wZSA9IChwZHVbMF0gJiAweGMwKSA+PiA2OwotICAgICAgICBtZXNzYWdlQ29kZSA9ICgocGR1WzBdICYgMHgzZikgPDwgNCkgfCAoKHBkdVsxXSAmIDB4ZjApID4+IDQpOwotICAgICAgICB1cGRhdGVOdW1iZXIgPSBwZHVbMV0gJiAweDBmOwotICAgICAgICBtZXNzYWdlSWRlbnRpZmllciA9IChwZHVbMl0gPDwgOCkgfCBwZHVbM107Ci0gICAgICAgIGRhdGFDb2RpbmdTY2hlbWUgPSBwZHVbNF07CisgICAgICAgIGlmIChwZHUubGVuZ3RoIDw9IFBEVV9MRU5HVEhfRVRXUykgeworICAgICAgICAgICAgZm9ybWF0ID0gRk9STUFUX0VUV1NfUFJJTUFSWTsKKyAgICAgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gLTE7IC8vbm90IGFwcGxpY2FibGUKKyAgICAgICAgICAgIG1lc3NhZ2VDb2RlID0gLTE7CisgICAgICAgICAgICB1cGRhdGVOdW1iZXIgPSAtMTsKKyAgICAgICAgICAgIG1lc3NhZ2VJZGVudGlmaWVyID0gKChwZHVbMl0gJiAweGZmKSA8PCA4KSB8IChwZHVbM10gJiAweGZmKTsKKyAgICAgICAgICAgIGRhdGFDb2RpbmdTY2hlbWUgPSAtMTsKKyAgICAgICAgICAgIHBhZ2VJbmRleCA9IC0xOworICAgICAgICAgICAgbnJPZlBhZ2VzID0gLTE7CisgICAgICAgICAgICBldHdzRW1lcmdlbmN5VXNlckFsZXJ0ID0gKHBkdVs0XSAmIDB4MSkgIT0gMDsKKyAgICAgICAgICAgIGV0d3NQb3B1cCA9IChwZHVbNV0gJiAweDgwKSAhPSAwOworICAgICAgICAgICAgZXR3c1dhcm5pbmdUeXBlID0gKHBkdVs0XSAmIDB4ZmUpID4+IDE7CisgICAgICAgIH0gZWxzZSBpZiAocGR1Lmxlbmd0aCA8PSBQRFVfTEVOR1RIX0dTTSkgeworICAgICAgICAgICAgLy8gR1NNIHBkdXMgYXJlIG5vIG1vcmUgdGhhbiA4OCBieXRlcworICAgICAgICAgICAgZm9ybWF0ID0gRk9STUFUX0dTTTsKKyAgICAgICAgICAgIGdlb2dyYXBoaWNhbFNjb3BlID0gKHBkdVswXSAmIDB4YzApID4+IDY7CisgICAgICAgICAgICBtZXNzYWdlQ29kZSA9ICgocGR1WzBdICYgMHgzZikgPDwgNCkgfCAoKHBkdVsxXSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgdXBkYXRlTnVtYmVyID0gcGR1WzFdICYgMHgwZjsKKyAgICAgICAgICAgIG1lc3NhZ2VJZGVudGlmaWVyID0gKChwZHVbMl0gJiAweGZmKSA8PCA4KSB8IChwZHVbM10gJiAweGZmKTsKKyAgICAgICAgICAgIGRhdGFDb2RpbmdTY2hlbWUgPSBwZHVbNF0gJiAweGZmOwogCi0gICAgICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHBhZ2UgcGFyYW1ldGVyCi0gICAgICAgIGludCBwYWdlSW5kZXggPSAocGR1WzVdICYgMHhmMCkgPj4gNDsKLSAgICAgICAgaW50IG5yT2ZQYWdlcyA9IHBkdVs1XSAmIDB4MGY7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBwYWdlIHBhcmFtZXRlcgorICAgICAgICAgICAgaW50IHBhZ2VJbmRleCA9IChwZHVbNV0gJiAweGYwKSA+PiA0OworICAgICAgICAgICAgaW50IG5yT2ZQYWdlcyA9IHBkdVs1XSAmIDB4MGY7CiAKLSAgICAgICAgaWYgKHBhZ2VJbmRleCA9PSAwIHx8IG5yT2ZQYWdlcyA9PSAwIHx8IHBhZ2VJbmRleCA+IG5yT2ZQYWdlcykgeworICAgICAgICAgICAgaWYgKHBhZ2VJbmRleCA9PSAwIHx8IG5yT2ZQYWdlcyA9PSAwIHx8IHBhZ2VJbmRleCA+IG5yT2ZQYWdlcykgeworICAgICAgICAgICAgICAgIHBhZ2VJbmRleCA9IDE7CisgICAgICAgICAgICAgICAgbnJPZlBhZ2VzID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBwYWdlSW5kZXg7CisgICAgICAgICAgICB0aGlzLm5yT2ZQYWdlcyA9IG5yT2ZQYWdlczsKKyAgICAgICAgICAgIGV0d3NFbWVyZ2VuY3lVc2VyQWxlcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGV0d3NQb3B1cCA9IGZhbHNlOworICAgICAgICAgICAgZXR3c1dhcm5pbmdUeXBlID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVTVRTIHBkdXMgYXJlIGFsd2F5cyBhdCBsZWFzdCA5MCBieXRlcyBzaW5jZSB0aGUgcGF5bG9hZCBpbmNsdWRlcworICAgICAgICAgICAgLy8gYSBudW1iZXItb2YtcGFnZXMgb2N0ZXQgYW5kIGFsc28gb25lIGxlbmd0aCBvY3RldCBwZXIgcGFnZQorICAgICAgICAgICAgZm9ybWF0ID0gRk9STUFUX1VNVFM7CisKKyAgICAgICAgICAgIGludCBtZXNzYWdlVHlwZSA9IHBkdVswXTsKKworICAgICAgICAgICAgaWYgKG1lc3NhZ2VUeXBlICE9IE1FU1NBR0VfVFlQRV9DQlNfTUVTU0FHRSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSAiICsgbWVzc2FnZVR5cGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXNzYWdlSWRlbnRpZmllciA9ICgocGR1WzFdICYgMHhmZikgPDwgOCkgfCBwZHVbMl0gJiAweGZmOworICAgICAgICAgICAgZ2VvZ3JhcGhpY2FsU2NvcGUgPSAocGR1WzNdICYgMHhjMCkgPj4gNjsKKyAgICAgICAgICAgIG1lc3NhZ2VDb2RlID0gKChwZHVbM10gJiAweDNmKSA8PCA0KSB8ICgocGR1WzRdICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICB1cGRhdGVOdW1iZXIgPSBwZHVbNF0gJiAweDBmOworICAgICAgICAgICAgZGF0YUNvZGluZ1NjaGVtZSA9IHBkdVs1XSAmIDB4ZmY7CisKKyAgICAgICAgICAgIC8vIFdlIHdpbGwgYWx3YXlzIGNvbnNpZGVyIGEgVU1UUyBtZXNzYWdlIGFzIGhhdmluZyBvbmUgc2luZ2xlIHBhZ2UKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZXJlJ3Mgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGhlYWRlciwgZXZlbiB0aG91Z2ggdGhlCisgICAgICAgICAgICAvLyBhY3R1YWwgcGF5bG9hZCBtYXkgY29udGFpbiBzZXZlcmFsIHBhZ2VzLgogICAgICAgICAgICAgcGFnZUluZGV4ID0gMTsKICAgICAgICAgICAgIG5yT2ZQYWdlcyA9IDE7CisgICAgICAgICAgICBldHdzRW1lcmdlbmN5VXNlckFsZXJ0ID0gZmFsc2U7CisgICAgICAgICAgICBldHdzUG9wdXAgPSBmYWxzZTsKKyAgICAgICAgICAgIGV0d3NXYXJuaW5nVHlwZSA9IC0xOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIHRoaXMucGFnZUluZGV4ID0gcGFnZUluZGV4OwotICAgICAgICB0aGlzLm5yT2ZQYWdlcyA9IG5yT2ZQYWdlczsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgSUQgaXMgYW4gZW1lcmdlbmN5IChQV1MpIG1lc3NhZ2UgdHlwZS4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBzdGF0aWMgYW5kIHRha2VzIGFuIGFyZ3VtZW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkKKyAgICAgKiBDZWxsQnJvYWRjYXN0UmVjZWl2ZXIsIHdoaWNoIHN0b3JlcyBtZXNzYWdlIElEJ3MgaW4gU1FMaXRlIHJhdGhlciB0aGFuIFBEVS4KKyAgICAgKiBAcGFyYW0gaWQgdGhlIG1lc3NhZ2UgaWRlbnRpZmllciB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBpcyBlbWVyZ2VuY3kgdHlwZTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW1lcmdlbmN5TWVzc2FnZShpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIGlkID49IE1FU1NBR0VfSURfUFdTX0ZJUlNUX0lERU5USUZJRVIgJiYgaWQgPD0gTUVTU0FHRV9JRF9QV1NfTEFTVF9JREVOVElGSUVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBJRCBpcyBhbiBFVFdTIGVtZXJnZW5jeSBtZXNzYWdlIHR5cGUuCisgICAgICogVGhpcyBtZXRob2QgaXMgc3RhdGljIGFuZCB0YWtlcyBhbiBhcmd1bWVudCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5CisgICAgICogQ2VsbEJyb2FkY2FzdFJlY2VpdmVyLCB3aGljaCBzdG9yZXMgbWVzc2FnZSBJRCdzIGluIFNRTGl0ZSByYXRoZXIgdGhhbiBQRFUuCisgICAgICogQHBhcmFtIGlkIHRoZSBtZXNzYWdlIGlkZW50aWZpZXIgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgRVRXUyBlbWVyZ2VuY3kgdHlwZTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXR3c01lc3NhZ2UoaW50IGlkKSB7CisgICAgICAgIHJldHVybiAoaWQgJiBNRVNTQUdFX0lEX0VUV1NfVFlQRV9NQVNLKSA9PSBNRVNTQUdFX0lEX0VUV1NfVFlQRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgSUQgaXMgYSBDTUFTIGVtZXJnZW5jeSBtZXNzYWdlIHR5cGUuCisgICAgICogVGhpcyBtZXRob2QgaXMgc3RhdGljIGFuZCB0YWtlcyBhbiBhcmd1bWVudCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5CisgICAgICogQ2VsbEJyb2FkY2FzdFJlY2VpdmVyLCB3aGljaCBzdG9yZXMgbWVzc2FnZSBJRCdzIGluIFNRTGl0ZSByYXRoZXIgdGhhbiBQRFUuCisgICAgICogQHBhcmFtIGlkIHRoZSBtZXNzYWdlIGlkZW50aWZpZXIgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgQ01BUyBlbWVyZ2VuY3kgdHlwZTsgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ21hc01lc3NhZ2UoaW50IGlkKSB7CisgICAgICAgIHJldHVybiBpZCA+PSBNRVNTQUdFX0lEX0NNQVNfRklSU1RfSURFTlRJRklFUiAmJiBpZCA8PSBNRVNTQUdFX0lEX0NNQVNfTEFTVF9JREVOVElGSUVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBjb2RlIGluZGljYXRlcyBhbiBFVFdTIHBvcHVwIGFsZXJ0LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgdGFrZXMgYW4gYXJndW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieQorICAgICAqIENlbGxCcm9hZGNhc3RSZWNlaXZlciwgd2hpY2ggc3RvcmVzIG1lc3NhZ2UgY29kZXMgaW4gU1FMaXRlIHJhdGhlciB0aGFuIFBEVS4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1lc3NhZ2UgSUQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciBFVFdTIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZUNvZGUgdGhlIG1lc3NhZ2UgY29kZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb2RlIGluZGljYXRlcyBhIHBvcHVwIGFsZXJ0IHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFdHdzUG9wdXBBbGVydChpbnQgbWVzc2FnZUNvZGUpIHsKKyAgICAgICAgcmV0dXJuIChtZXNzYWdlQ29kZSAmIE1FU1NBR0VfQ09ERV9FVFdTX0FDVElWQVRFX1BPUFVQKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBjb2RlIGluZGljYXRlcyBhbiBFVFdTIGVtZXJnZW5jeSB1c2VyIGFsZXJ0LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHN0YXRpYyBhbmQgdGFrZXMgYW4gYXJndW1lbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieQorICAgICAqIENlbGxCcm9hZGNhc3RSZWNlaXZlciwgd2hpY2ggc3RvcmVzIG1lc3NhZ2UgY29kZXMgaW4gU1FMaXRlIHJhdGhlciB0aGFuIFBEVS4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIG1lc3NhZ2UgSUQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGZvciBFVFdTIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZUNvZGUgdGhlIG1lc3NhZ2UgY29kZSB0byBjaGVjaworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb2RlIGluZGljYXRlcyBhbiBlbWVyZ2VuY3kgdXNlciBhbGVydAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V0d3NFbWVyZ2VuY3lVc2VyQWxlcnQoaW50IG1lc3NhZ2VDb2RlKSB7CisgICAgICAgIHJldHVybiAobWVzc2FnZUNvZGUgJiBNRVNTQUdFX0NPREVfRVRXU19FTUVSR0VOQ1lfVVNFUl9BTEVSVCkgIT0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlNtc0NiSGVhZGVye0dTPSIgKyBnZW9ncmFwaGljYWxTY29wZSArICIsIG1lc3NhZ2VDb2RlPTB4IiArCisgICAgICAgICAgICAgICAgSW50ZWdlci50b0hleFN0cmluZyhtZXNzYWdlQ29kZSkgKyAiLCB1cGRhdGVOdW1iZXI9IiArIHVwZGF0ZU51bWJlciArCisgICAgICAgICAgICAgICAgIiwgbWVzc2FnZUlkZW50aWZpZXI9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyhtZXNzYWdlSWRlbnRpZmllcikgKworICAgICAgICAgICAgICAgICIsIERDUz0weCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGRhdGFDb2RpbmdTY2hlbWUpICsKKyAgICAgICAgICAgICAgICAiLCBwYWdlICIgKyBwYWdlSW5kZXggKyAiIG9mICIgKyBuck9mUGFnZXMgKyAnfSc7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvR3NtU21zQ2JUZXN0LmphdmEgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNDYlRlc3QuamF2YQppbmRleCA3MTM2ZWEwLi40MTdhYWM0IDEwMDY0NAotLS0gYS90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNDYlRlc3QuamF2YQorKysgYi90ZWxlcGhvbnkvdGVzdHMvdGVsZXBob255dGVzdHMvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3RlbGVwaG9ueS9Hc21TbXNDYlRlc3QuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgYW5kcm9pZC50ZWxlcGhvbnkuU21zQ2JNZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAogLyoqCiAgKiBUZXN0IGNhc2VzIGZvciBiYXNpYyBTbXNDYk1lc3NhZ2Ugb3BlcmF0aW9ucwpAQCAtNjksNiArNzAsMzYgQEAKICAgICAgICAgZG9UZXN0R2VvZ3JhcGhpY2FsU2NvcGVWYWx1ZShwZHUsIChieXRlKTB4QzAsIFNtc0NiTWVzc2FnZS5HRU9HUkFQSElDQUxfU0NPUEVfQ0VMTF9XSURFKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R2VvZ3JhcGhpY2FsU2NvcGVVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4NDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LAorICAgICAgICAgICAgICAgIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LCAoYnl0ZSkweDNBLAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LCAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLAorICAgICAgICAgICAgICAgIChieXRlKTB4QzksIChieXRlKTB4NjksIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNAorICAgICAgICB9OworCisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBnZW9ncmFwaGljYWwgc2NvcGUgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgU21zQ2JNZXNzYWdlLkdFT0dSQVBISUNBTF9TQ09QRV9DRUxMX1dJREUsIG1zZy5nZXRHZW9ncmFwaGljYWxTY29wZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk3Qml0KCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCkBAIC05Miw2ICsxMjMsODMgQEAKICAgICAgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5N0JpdFVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQxLCAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLAorICAgICAgICAgICAgICAgIChieXRlKTB4Q0IsIChieXRlKTB4RTYsIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLAorICAgICAgICAgICAgICAgIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4RUUsIChieXRlKTB4NjksIChieXRlKTB4M0EsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgxQSwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwRSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEYwLCAoYnl0ZSkweEI5LCAoYnl0ZSkweDBDLCAoYnl0ZSkweDkyLCAoYnl0ZSkweDk3LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzUsIChieXRlKTB4QjksIChieXRlKTB4MUIsIChieXRlKTB4MDQsIChieXRlKTB4MEYsIChieXRlKTB4OTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDOSwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHhGNywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM0CisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgR1NNIGRlZmF1bHQgYWxwaGFiZXQgbWVzc2FnZSB3aXRoIGNhcnJpYWdlIHJldHVybiBwYWRkaW5nIiwKKyAgICAgICAgICAgICAgICBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5N0JpdE11bHRpcGFnZVVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMSwgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDIsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEM2LCAoYnl0ZSkweEI0LCAoYnl0ZSkweDdDLCAoYnl0ZSkweDRFLCAoYnl0ZSkweDA3LCAoYnl0ZSkweEMxLAorICAgICAgICAgICAgICAgIChieXRlKTB4QzMsIChieXRlKTB4RTcsIChieXRlKTB4RjIsIChieXRlKTB4QUEsIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLAorICAgICAgICAgICAgICAgIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBBLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMywgKGJ5dGUpMHhGMiwgKGJ5dGUpMHhGOCwgKGJ5dGUpMHhFRCwgKGJ5dGUpMHgyNiwgKGJ5dGUpMHg4MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEUwLCAoYnl0ZSkweEUxLCAoYnl0ZSkweDczLCAoYnl0ZSkweEI5LCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LAorICAgICAgICAgICAgICAgIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwQQorICAgICAgICB9OworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUocGR1KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbXVsdGlwYWdlIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiRmlyc3QgcGFnZStTZWNvbmQgcGFnZSIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRGdWxsKCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCkBAIC0xMTcsNiArMjI1LDM4IEBACiAgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRGdWxsVW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDQwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NDEsIChieXRlKTB4RDAsIChieXRlKTB4NzEsIChieXRlKTB4REEsIChieXRlKTB4MDQsIChieXRlKTB4OTEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNiwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg5RCwgKGJ5dGUpMHg0RCwgKGJ5dGUpMHgwNywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDg1LCAoYnl0ZSkweEQ5LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDU4LCAoYnl0ZSkweDVDLAorICAgICAgICAgICAgICAgIChieXRlKTB4QTYsIChieXRlKTB4ODMsIChieXRlKTB4REEsIChieXRlKTB4RTUsIChieXRlKTB4RjksIChieXRlKTB4M0MsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg3QywgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhDNCwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhCNCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEZCLCAoYnl0ZSkweDBDLCAoYnl0ZSkweDJBLCAoYnl0ZSkweEUzLCAoYnl0ZSkweEMzLCAoYnl0ZSkweDYzLAorICAgICAgICAgICAgICAgIChieXRlKTB4M0EsIChieXRlKTB4M0IsIChieXRlKTB4MEYsIChieXRlKTB4Q0EsIChieXRlKTB4Q0QsIChieXRlKTB4NDAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2MywgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHgxRSwgKGJ5dGUpMHgxRSwgKGJ5dGUpMHhEMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweENCLCAoYnl0ZSkweEYyLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDg4LCAoYnl0ZSkweEZELCAoYnl0ZSkweDc2LAorICAgICAgICAgICAgICAgIChieXRlKTB4OUYsIChieXRlKTB4NTksIChieXRlKTB4QTAsIChieXRlKTB4NzYsIChieXRlKTB4MzksIChieXRlKTB4RUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0RSwgKGJ5dGUpMHhCQiwgKGJ5dGUpMHhDRiwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgzQSwgKGJ5dGUpMHhCQSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDJDLCAoYnl0ZSkweDJGLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEQyLCAoYnl0ZSkweDczLCAoYnl0ZSkweDkwLAorICAgICAgICAgICAgICAgIChieXRlKTB4RkIsIChieXRlKTB4MEQsIChieXRlKTB4ODIsIChieXRlKTB4ODcsIChieXRlKTB4QzksIChieXRlKTB4RTQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhCNCwgKGJ5dGUpMHhGQiwgKGJ5dGUpMHgxQywgKGJ5dGUpMHgwMiwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NTIKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBHU00gZGVmYXVsdCBhbHBoYWJldCBtZXNzYWdlIGJlaW5nIGV4YWN0bHkgOTMgY2hhcmFjdGVycyBsb25nLCAiICsKKyAgICAgICAgICAgICAgICAibWVhbmluZyB0aGVyZSBpcyBubyBwYWRkaW5nISIsCisgICAgICAgICAgICAgICAgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keTdCaXRXaXRoTGFuZ3VhZ2UoKSB7CiAgICAgICAgIGJ5dGVbXSBwZHUgPSB7CiAgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKQEAgLTE2Nyw2ICszMDcsMzggQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxhbmd1YWdlIGluZGljYXRvciBkZWNvZGVkIiwgInN2IiwgbXNnLmdldExhbmd1YWdlQ29kZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHk3Qml0V2l0aExhbmd1YWdlSW5Cb2R5VW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDEwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NzMsIChieXRlKTB4N0IsIChieXRlKTB4MjMsIChieXRlKTB4MDgsIChieXRlKTB4M0EsIChieXRlKTB4NEUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg5QiwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHg3MiwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHgxQywgKGJ5dGUpMHhBRSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEIzLCAoYnl0ZSkweEU5LCAoYnl0ZSkweEEwLCAoYnl0ZSkweDMwLCAoYnl0ZSkweDFCLCAoYnl0ZSkweDhFLAorICAgICAgICAgICAgICAgIChieXRlKTB4MEUsIChieXRlKTB4OEIsIChieXRlKTB4Q0IsIChieXRlKTB4NzQsIChieXRlKTB4NTAsIChieXRlKTB4QkIsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzQywgKGJ5dGUpMHg5RiwgKGJ5dGUpMHg4NywgKGJ5dGUpMHhDRiwgKGJ5dGUpMHg2NSwgKGJ5dGUpMHhEMCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDNELCAoYnl0ZSkweDRELCAoYnl0ZSkweDQ3LCAoYnl0ZSkweDgzLCAoYnl0ZSkweEM2LCAoYnl0ZSkweDYxLAorICAgICAgICAgICAgICAgIChieXRlKTB4QjksIChieXRlKTB4M0MsIChieXRlKTB4MUQsIChieXRlKTB4M0UsIChieXRlKTB4OTcsIChieXRlKTB4NDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMiwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHhCRCwgKGJ5dGUpMHgyRSwgKGJ5dGUpMHg3NywgKGJ5dGUpMHg4MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEUwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDM5LCAoYnl0ZSkweEVELCAoYnl0ZSkweDNFLAorICAgICAgICAgICAgICAgIChieXRlKTB4MzcsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LAorICAgICAgICAgICAgICAgIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHgwMCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MzcKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBHU00gZGVmYXVsdCBhbHBoYWJldCBtZXNzYWdlIHdpdGggY2FycmlhZ2UgcmV0dXJuIHBhZGRpbmciLAorICAgICAgICAgICAgICAgIG1zZy5nZXRNZXNzYWdlQm9keSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbGFuZ3VhZ2UgaW5kaWNhdG9yIGRlY29kZWQiLCAic3YiLCBtc2cuZ2V0TGFuZ3VhZ2VDb2RlKCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keThCaXQoKSB7CiAgICAgICAgIGJ5dGVbXSBwZHUgPSB7CiAgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHg0NCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKQEAgLTIxMCw2ICszODIsODEgQEAKICAgICAgICAgICAgICAgICAiQSBVQ1MyIG1lc3NhZ2UgY29udGFpbmluZyBhIFx1MDQzNCBjaGFyYWN0ZXIiLCBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VCb2R5VWNzMlVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0OCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDQxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDU1LAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NDMsIChieXRlKTB4MDAsIChieXRlKTB4NTMsIChieXRlKTB4MDAsIChieXRlKTB4MzIsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDczLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDczLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjcsIChieXRlKTB4MDAsIChieXRlKTB4NjUsIChieXRlKTB4MDAsIChieXRlKTB4MjAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY5LAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NkUsIChieXRlKTB4MDAsIChieXRlKTB4NjksIChieXRlKTB4MDAsIChieXRlKTB4NkUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjMsIChieXRlKTB4MDAsIChieXRlKTB4NjgsIChieXRlKTB4MDAsIChieXRlKTB4NjEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDc0LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY1LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4MEQsIChieXRlKTB4MDAsIChieXRlKTB4MEQsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDRFCisgICAgICAgIH07CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCA3LWJpdCBzdHJpbmcgZGVjb2RlZCIsCisgICAgICAgICAgICAgICAgIkEgVUNTMiBtZXNzYWdlIGNvbnRhaW5pbmcgYSBcdTA0MzQgY2hhcmFjdGVyIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keVVjczJNdWx0aXBhZ2VVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MDAsIChieXRlKTB4MzIsIChieXRlKTB4QzAsIChieXRlKTB4MDAsIChieXRlKTB4NDgsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAyLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwNiwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NDIsIChieXRlKTB4MDAsIChieXRlKTB4NDIsIChieXRlKTB4MDAsIChieXRlKTB4NDIsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELCAoYnl0ZSkweDBELAorICAgICAgICAgICAgICAgIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsIChieXRlKTB4MEQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwgKGJ5dGUpMHgwRCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDYKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG11bHRpcGFnZSBVQ1MyIHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQUFBQkJCIiwgbXNnLmdldE1lc3NhZ2VCb2R5KCkpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQm9keVVjczJXaXRoTGFuZ3VhZ2VJbkJvZHkoKSB7CiAgICAgICAgIGJ5dGVbXSBwZHUgPSB7CiAgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMiwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg3OCwKQEAgLTIzNCw2ICs0ODEsMzcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxhbmd1YWdlIGluZGljYXRvciBkZWNvZGVkIiwgInh4IiwgbXNnLmdldExhbmd1YWdlQ29kZSgpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUJvZHlVY3MyV2l0aExhbmd1YWdlSW5Cb2R5VW10cygpIHsKKyAgICAgICAgYnl0ZVtdIHBkdSA9IHsKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweEMwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDExLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NzgsIChieXRlKTB4M0MsIChieXRlKTB4MDAsIChieXRlKTB4NDEsIChieXRlKTB4MDAsIChieXRlKTB4MjAsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1NSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg0MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg1MywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDMyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZELAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjUsIChieXRlKTB4MDAsIChieXRlKTB4NzMsIChieXRlKTB4MDAsIChieXRlKTB4NzMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2NSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYzLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDZGLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NkUsIChieXRlKTB4MDAsIChieXRlKTB4NzQsIChieXRlKTB4MDAsIChieXRlKTB4NjEsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2RSwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2OSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDZFLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDY3LCAoYnl0ZSkweDAwLCAoYnl0ZSkweDIwLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjEsIChieXRlKTB4MDAsIChieXRlKTB4MjAsIChieXRlKTB4MDQsIChieXRlKTB4MzQsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgyMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2MywgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg2OCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDcyLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDYxLAorICAgICAgICAgICAgICAgIChieXRlKTB4MDAsIChieXRlKTB4NjMsIChieXRlKTB4MDAsIChieXRlKTB4NzQsIChieXRlKTB4MDAsIChieXRlKTB4NjUsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMCwgKGJ5dGUpMHg3MiwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgwRCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4NTAKKyAgICAgICAgfTsKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIDctYml0IHN0cmluZyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAiQSBVQ1MyIG1lc3NhZ2UgY29udGFpbmluZyBhIFx1MDQzNCBjaGFyYWN0ZXIiLCBtc2cuZ2V0TWVzc2FnZUJvZHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGxhbmd1YWdlIGluZGljYXRvciBkZWNvZGVkIiwgInh4IiwgbXNnLmdldExhbmd1YWdlQ29kZSgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUlkZW50aWZpZXIoKSB7CiAgICAgICAgIGJ5dGVbXSBwZHUgPSB7CiAgICAgICAgICAgICAgICAgKGJ5dGUpMHhDMCwgKGJ5dGUpMHgwMCwgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHg0MCwgKGJ5dGUpMHgxMSwgKGJ5dGUpMHg0MSwKQEAgLTI1Niw2ICs1MzQsMzUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgaWRlbnRpZmllciBkZWNvZGVkIiwgMTIzNDUsIG1zZy5nZXRNZXNzYWdlSWRlbnRpZmllcigpKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUlkZW50aWZpZXJVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4MkEsIChieXRlKTB4QTUsIChieXRlKTB4NDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LAorICAgICAgICAgICAgICAgIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LCAoYnl0ZSkweDNBLAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LCAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLAorICAgICAgICAgICAgICAgIChieXRlKTB4QzksIChieXRlKTB4NjksIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNAorICAgICAgICB9OworCisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGlkZW50aWZpZXIgZGVjb2RlZCIsIDEyMzQ1LCBtc2cuZ2V0TWVzc2FnZUlkZW50aWZpZXIoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldE1lc3NhZ2VDb2RlKCkgewogICAgICAgICBieXRlW10gcGR1ID0gewogICAgICAgICAgICAgICAgIChieXRlKTB4MkEsIChieXRlKTB4QTUsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4NDAsIChieXRlKTB4MTEsIChieXRlKTB4NDEsCkBAIC0yNzgsNiArNTg1LDM1IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBtZXNzYWdlIGNvZGUgZGVjb2RlZCIsIDY4MiwgbXNnLmdldE1lc3NhZ2VDb2RlKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXNzYWdlQ29kZVVtdHMoKSB7CisgICAgICAgIGJ5dGVbXSBwZHUgPSB7CisgICAgICAgICAgICAgICAgKGJ5dGUpMHgwMSwgKGJ5dGUpMHgzMCwgKGJ5dGUpMHgzOSwgKGJ5dGUpMHgyQSwgKGJ5dGUpMHhBNSwgKGJ5dGUpMHg0MCwKKworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQxLCAoYnl0ZSkweEQwLCAoYnl0ZSkweDcxLCAoYnl0ZSkweERBLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDkxLAorICAgICAgICAgICAgICAgIChieXRlKTB4Q0IsIChieXRlKTB4RTYsIChieXRlKTB4NzAsIChieXRlKTB4OUQsIChieXRlKTB4NEQsIChieXRlKTB4MDcsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg4NSwgKGJ5dGUpMHhEOSwgKGJ5dGUpMHg3MCwgKGJ5dGUpMHg3NCwgKGJ5dGUpMHg1OCwgKGJ5dGUpMHg1QywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEE2LCAoYnl0ZSkweDgzLCAoYnl0ZSkweERBLCAoYnl0ZSkweEU1LCAoYnl0ZSkweEY5LCAoYnl0ZSkweDNDLAorICAgICAgICAgICAgICAgIChieXRlKTB4N0MsIChieXRlKTB4MkUsIChieXRlKTB4ODMsIChieXRlKTB4RUUsIChieXRlKTB4NjksIChieXRlKTB4M0EsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgxQSwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgwRSwgKGJ5dGUpMHhDQiwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEYwLCAoYnl0ZSkweEI5LCAoYnl0ZSkweDBDLCAoYnl0ZSkweDkyLCAoYnl0ZSkweDk3LCAoYnl0ZSkweEU5LAorICAgICAgICAgICAgICAgIChieXRlKTB4NzUsIChieXRlKTB4QjksIChieXRlKTB4MUIsIChieXRlKTB4MDQsIChieXRlKTB4MEYsIChieXRlKTB4OTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhDOSwgKGJ5dGUpMHg2OSwgKGJ5dGUpMHhGNywgKGJ5dGUpMHhCOSwgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLAorICAgICAgICAgICAgICAgIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsIChieXRlKTB4QTMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELAorICAgICAgICAgICAgICAgIChieXRlKTB4NDYsIChieXRlKTB4QTMsIChieXRlKTB4RDEsIChieXRlKTB4MDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDM0CisgICAgICAgIH07CisKKyAgICAgICAgU21zQ2JNZXNzYWdlIG1zZyA9IFNtc0NiTWVzc2FnZS5jcmVhdGVGcm9tUGR1KHBkdSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1lc3NhZ2UgY29kZSBkZWNvZGVkIiwgNjgyLCBtc2cuZ2V0TWVzc2FnZUNvZGUoKSk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdGVzdEdldFVwZGF0ZU51bWJlcigpIHsKICAgICAgICAgYnl0ZVtdIHBkdSA9IHsKICAgICAgICAgICAgICAgICAoYnl0ZSkweDJBLCAoYnl0ZSkweEE1LCAoYnl0ZSkweDMwLCAoYnl0ZSkweDM5LCAoYnl0ZSkweDQwLCAoYnl0ZSkweDExLCAoYnl0ZSkweDQxLApAQCAtMjk5LDQgKzYzNSw3OCBAQAogCiAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB1cGRhdGUgbnVtYmVyIGRlY29kZWQiLCA1LCBtc2cuZ2V0VXBkYXRlTnVtYmVyKCkpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGVOdW1iZXJVbXRzKCkgeworICAgICAgICBieXRlW10gcGR1ID0geworICAgICAgICAgICAgICAgIChieXRlKTB4MDEsIChieXRlKTB4MzAsIChieXRlKTB4MzksIChieXRlKTB4MkEsIChieXRlKTB4QTUsIChieXRlKTB4NDAsCisKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDAxLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHg0MSwgKGJ5dGUpMHhEMCwgKGJ5dGUpMHg3MSwgKGJ5dGUpMHhEQSwgKGJ5dGUpMHgwNCwgKGJ5dGUpMHg5MSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweENCLCAoYnl0ZSkweEU2LCAoYnl0ZSkweDcwLCAoYnl0ZSkweDlELCAoYnl0ZSkweDRELCAoYnl0ZSkweDA3LAorICAgICAgICAgICAgICAgIChieXRlKTB4ODUsIChieXRlKTB4RDksIChieXRlKTB4NzAsIChieXRlKTB4NzQsIChieXRlKTB4NTgsIChieXRlKTB4NUMsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBNiwgKGJ5dGUpMHg4MywgKGJ5dGUpMHhEQSwgKGJ5dGUpMHhFNSwgKGJ5dGUpMHhGOSwgKGJ5dGUpMHgzQywKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDdDLCAoYnl0ZSkweDJFLCAoYnl0ZSkweDgzLCAoYnl0ZSkweEVFLCAoYnl0ZSkweDY5LCAoYnl0ZSkweDNBLAorICAgICAgICAgICAgICAgIChieXRlKTB4MUEsIChieXRlKTB4MzQsIChieXRlKTB4MEUsIChieXRlKTB4Q0IsIChieXRlKTB4RTUsIChieXRlKTB4RTksCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhGMCwgKGJ5dGUpMHhCOSwgKGJ5dGUpMHgwQywgKGJ5dGUpMHg5MiwgKGJ5dGUpMHg5NywgKGJ5dGUpMHhFOSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDc1LCAoYnl0ZSkweEI5LCAoYnl0ZSkweDFCLCAoYnl0ZSkweDA0LCAoYnl0ZSkweDBGLCAoYnl0ZSkweDkzLAorICAgICAgICAgICAgICAgIChieXRlKTB4QzksIChieXRlKTB4NjksIChieXRlKTB4RjcsIChieXRlKTB4QjksIChieXRlKTB4RDEsIChieXRlKTB4NjgsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwgKGJ5dGUpMHg0NiwgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDY4LCAoYnl0ZSkweDM0LCAoYnl0ZSkweDFBLCAoYnl0ZSkweDhELCAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLAorICAgICAgICAgICAgICAgIChieXRlKTB4RDEsIChieXRlKTB4NjgsIChieXRlKTB4MzQsIChieXRlKTB4MUEsIChieXRlKTB4OEQsIChieXRlKTB4NDYsCisgICAgICAgICAgICAgICAgKGJ5dGUpMHhBMywgKGJ5dGUpMHhEMSwgKGJ5dGUpMHg2OCwgKGJ5dGUpMHgzNCwgKGJ5dGUpMHgxQSwgKGJ5dGUpMHg4RCwKKyAgICAgICAgICAgICAgICAoYnl0ZSkweDQ2LCAoYnl0ZSkweEEzLCAoYnl0ZSkweEQxLCAoYnl0ZSkweDAwLAorCisgICAgICAgICAgICAgICAgKGJ5dGUpMHgzNAorICAgICAgICB9OworCisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShwZHUpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB1cGRhdGUgbnVtYmVyIGRlY29kZWQiLCA1LCBtc2cuZ2V0VXBkYXRlTnVtYmVyKCkpOworICAgIH0KKworICAgIC8qIEVUV1MgVGVzdCBtZXNzYWdlIGluY2x1ZGluZyBoZWFkZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZXR3c01lc3NhZ2VOb3JtYWwgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCIwMDAwMTEwMDExMDEiICsKKyAgICAgICAgICAgICIwRDBBNUJBRTU3Q0U3NzBDNTMxNzkwRTg1QzcxNkNCRjMwNDQ1NzMwNjVCOTMwNjc1NzMwIiArCisgICAgICAgICAgICAiOTcwNzc2N0E3NTFGMzAwMjVGMzczMDQ0NjNGQTMwOEMzMDZCNTA5OTMwNDgzMDY2NEUwQjMwNTUzMDQ0RkYwODZDMTc4QzYxNUU4MUZGMDkiICsKKyAgICAgICAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZXR3c01lc3NhZ2VDYW5jZWwgPSBJY2NVdGlscy5oZXhTdHJpbmdUb0J5dGVzKCIwMDAwMTEwMDExMDEiICsKKyAgICAgICAgICAgICIwRDBBNTE0ODMwN0IzMDY5MDAyODAwMzEwMDMwMDAzQTAwMzUiICsKKyAgICAgICAgICAgICIwMDMyMDAyOTMwNkU3RENBNjAyNTU3MzA5NzA3OTAxRjU4MzEzMDkyNTNENjZEODgzMDU3MzA3RTMwNTlGRjA4NkMxNzhDNjE1RTgxRkYwOSIgKworICAgICAgICAgICAgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZXR3c01lc3NhZ2VUZXN0ID0gSWNjVXRpbHMuaGV4U3RyaW5nVG9CeXRlcygiMDAwMDExMDMxMTAxIiArCisgICAgICAgICAgICAiMEQwQTVCQUU1N0NFNzcwQzUzMTc5MEU4NUM3MTZDQkYzMDQ0IiArCisgICAgICAgICAgICAiNTczMDY1QjkzMDY3NTczMDk3MDczMDAyNjNGQTMwOEMzMDZCNTA5OTMwNDgzMDY2NEUwQjMwNTUzMDQ0RkYwODZDMTc4QzYxNUU4MUZGMDkiICsKKyAgICAgICAgICAgICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpOworCisgICAgLy8gRklYTUU6IGFkZCBleGFtcGxlIG9mIEVUV1MgcHJpbWFyeSBub3RpZmljYXRpb24gUERVCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXR3c01lc3NhZ2VOb3JtYWwoKSB7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShldHdzTWVzc2FnZU5vcm1hbCk7CisgICAgICAgIExvZy5kKCJHc21TbXNDYlRlc3QiLCBtc2cudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR1MgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0R2VvZ3JhcGhpY2FsU2NvcGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSBjb2RlIG1pc21hdGNoIiwgMCwgbXNnLmdldE1lc3NhZ2VDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVwZGF0ZSBudW1iZXIgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0VXBkYXRlTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgSUQgbWlzbWF0Y2giLCAweDExMDAsIG1zZy5nZXRNZXNzYWdlSWRlbnRpZmllcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXR3c01lc3NhZ2VDYW5jZWwoKSB7CisgICAgICAgIFNtc0NiTWVzc2FnZSBtc2cgPSBTbXNDYk1lc3NhZ2UuY3JlYXRlRnJvbVBkdShldHdzTWVzc2FnZUNhbmNlbCk7CisgICAgICAgIExvZy5kKCJHc21TbXNDYlRlc3QiLCBtc2cudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR1MgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0R2VvZ3JhcGhpY2FsU2NvcGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSBjb2RlIG1pc21hdGNoIiwgMCwgbXNnLmdldE1lc3NhZ2VDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInVwZGF0ZSBudW1iZXIgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0VXBkYXRlTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UgSUQgbWlzbWF0Y2giLCAweDExMDAsIG1zZy5nZXRNZXNzYWdlSWRlbnRpZmllcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXR3c01lc3NhZ2VUZXN0KCkgeworICAgICAgICBTbXNDYk1lc3NhZ2UgbXNnID0gU21zQ2JNZXNzYWdlLmNyZWF0ZUZyb21QZHUoZXR3c01lc3NhZ2VUZXN0KTsKKyAgICAgICAgTG9nLmQoIkdzbVNtc0NiVGVzdCIsIG1zZy50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHUyBtaXNtYXRjaCIsIDAsIG1zZy5nZXRHZW9ncmFwaGljYWxTY29wZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlIGNvZGUgbWlzbWF0Y2giLCAwLCBtc2cuZ2V0TWVzc2FnZUNvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidXBkYXRlIG51bWJlciBtaXNtYXRjaCIsIDAsIG1zZy5nZXRVcGRhdGVOdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWVzc2FnZSBJRCBtaXNtYXRjaCIsIDB4MTEwMywgbXNnLmdldE1lc3NhZ2VJZGVudGlmaWVyKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ludFJhbmdlTWFuYWdlclRlc3QuamF2YSBiL3RlbGVwaG9ueS90ZXN0cy90ZWxlcGhvbnl0ZXN0cy9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvdGVsZXBob255L0ludFJhbmdlTWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWRjYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVsZXBob255L3Rlc3RzL3RlbGVwaG9ueXRlc3RzL3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC90ZWxlcGhvbnkvSW50UmFuZ2VNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5pbnRlcm5hbC50ZWxlcGhvbnk7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOworCitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudGVsZXBob255LmdzbS5TbXNCcm9hZGNhc3RDb25maWdJbmZvOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBUZXN0IGNhc2VzIGZvciB0aGUgSW50UmFuZ2VNYW5hZ2VyIGNsYXNzLgorICovCitwdWJsaWMgY2xhc3MgSW50UmFuZ2VNYW5hZ2VyVGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU01TX0NCX0NPREVfU0NIRU1FX01JTiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNNU19DQl9DT0RFX1NDSEVNRV9NQVggPSAyNTU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19TVEFSVF9VUERBVEVfQ0FMTEVEICAgPSAweDAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTEFHX0FERF9SQU5HRV9DQUxMRUQgICAgICA9IDB4MDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfRklOSVNIX1VQREFURV9DQUxMRUQgID0gMHgwNDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBTExfRkxBR1NfU0VUID0gRkxBR19TVEFSVF9VUERBVEVfQ0FMTEVEIHwgRkxBR19BRERfUkFOR0VfQ0FMTEVEIHwKKyAgICAgICAgICAgIEZMQUdfRklOSVNIX1VQREFURV9DQUxMRUQ7CisKKyAgICAvKiogRHVtbXkgSW50UmFuZ2VNYW5hZ2VyIGZvciB0ZXN0aW5nLiAqLworICAgIGNsYXNzIFRlc3RJbnRSYW5nZU1hbmFnZXIgZXh0ZW5kcyBJbnRSYW5nZU1hbmFnZXIgeworICAgICAgICBBcnJheUxpc3Q8U21zQnJvYWRjYXN0Q29uZmlnSW5mbz4gbUNvbmZpZ0xpc3QgPQorICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U21zQnJvYWRjYXN0Q29uZmlnSW5mbz4oKTsKKworICAgICAgICBpbnQgZmxhZ3M7CisgICAgICAgIGJvb2xlYW4gZmluaXNoVXBkYXRlUmV0dXJuVmFsdWUgPSB0cnVlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgbGlzdCBvZiBlbmFibGVkIHJhbmdlcyBoYXMgY2hhbmdlZC4gVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBjYWxscyB0byB7QGxpbmsgI2FkZFJhbmdlfSBmb2xsb3dlZCBieQorICAgICAgICAgKiBhIGNhbGwgdG8ge0BsaW5rICNmaW5pc2hVcGRhdGV9LgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRVcGRhdGUoKSB7CisgICAgICAgICAgICBtQ29uZmlnTGlzdC5jbGVhcigpOworICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19TVEFSVF9VUERBVEVfQ0FMTEVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCBhZnRlciB7QGxpbmsgI3N0YXJ0VXBkYXRlfSB0byBpbmRpY2F0ZSBhIHJhbmdlIG9mIGVuYWJsZWQKKyAgICAgICAgICogdmFsdWVzLgorICAgICAgICAgKiBAcGFyYW0gc3RhcnRJZCB0aGUgZmlyc3QgaWQgaW5jbHVkZWQgaW4gdGhlIHJhbmdlCisgICAgICAgICAqIEBwYXJhbSBlbmRJZCB0aGUgbGFzdCBpZCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UKKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFkZFJhbmdlKGludCBzdGFydElkLCBpbnQgZW5kSWQsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgIG1Db25maWdMaXN0LmFkZChuZXcgU21zQnJvYWRjYXN0Q29uZmlnSW5mbyhzdGFydElkLCBlbmRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHNlbGVjdGVkKSk7CisgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0FERF9SQU5HRV9DQUxMRUQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSByYW5nZSB1cGRhdGUgc3RhcnRlZCBieSB0aGUKKyAgICAgICAgICogcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgI3N0YXJ0VXBkYXRlfS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGZpbmlzaFVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRklOSVNIX1VQREFURV9DQUxMRUQ7CisgICAgICAgICAgICByZXR1cm4gZmluaXNoVXBkYXRlUmV0dXJuVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmVzZXQgdGhlIG9iamVjdCBmb3IgdGhlIG5leHQgdGVzdCBjYXNlLiAqLworICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICAgICAgbUNvbmZpZ0xpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJhbmdlTWFuYWdlcigpIHsKKyAgICAgICAgVGVzdEludFJhbmdlTWFuYWdlciB0ZXN0TWFuYWdlciA9IG5ldyBUZXN0SW50UmFuZ2VNYW5hZ2VyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXhwZWN0aW5nIGVtcHR5IGNvbmZpZ2xpc3QiLCAwLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0NvbmZpZ0luZm8oU21zQnJvYWRjYXN0Q29uZmlnSW5mbyBpbmZvLCBpbnQgZnJvbVNlcnZpY2VJZCwKKyAgICAgICAgICAgIGludCB0b1NlcnZpY2VJZCwgaW50IGZyb21Db2RlU2NoZW1lLCBpbnQgdG9Db2RlU2NoZW1lLCBib29sZWFuIHNlbGVjdGVkKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiZnJvbVNlcnZpY2VJZCIsIGZyb21TZXJ2aWNlSWQsIGluZm8uZ2V0RnJvbVNlcnZpY2VJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0b1NlcnZpY2VJZCIsIHRvU2VydmljZUlkLCBpbmZvLmdldFRvU2VydmljZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb21Db2RlU2NoZW1lIiwgZnJvbUNvZGVTY2hlbWUsIGluZm8uZ2V0RnJvbUNvZGVTY2hlbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidG9Db2RlU2NoZW1lIiwgdG9Db2RlU2NoZW1lLCBpbmZvLmdldFRvQ29kZVNjaGVtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZWxlY3RlZCIsIHNlbGVjdGVkLCBpbmZvLmlzU2VsZWN0ZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFNpbmdsZUNoYW5uZWwoKSB7CisgICAgICAgIFRlc3RJbnRSYW5nZU1hbmFnZXIgdGVzdE1hbmFnZXIgPSBuZXcgVGVzdEludFJhbmdlTWFuYWdlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGJlZm9yZSB0ZXN0IiwgMCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRUcnVlKCJlbmFibGluZyByYW5nZSIsIHRlc3RNYW5hZ2VyLmVuYWJsZVJhbmdlKDEyMywgMTIzLCAiY2xpZW50MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDEsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDEyMywgMTIzLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJ1cGRhdGluZyByYW5nZXMiLCB0ZXN0TWFuYWdlci51cGRhdGVSYW5nZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAxMjMsIDEyMywgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2luZ2xlQ2hhbm5lbCgpIHsKKyAgICAgICAgVGVzdEludFJhbmdlTWFuYWdlciB0ZXN0TWFuYWdlciA9IG5ldyBUZXN0SW50UmFuZ2VNYW5hZ2VyKCk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIiwgdGVzdE1hbmFnZXIuZW5hYmxlUmFuZ2UoMTIzLCAxMjMsICJjbGllbnQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIGVuYWJsZSIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UiLCB0ZXN0TWFuYWdlci5kaXNhYmxlUmFuZ2UoMTIzLCAxMjMsICJjbGllbnQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMTIzLCAxMjMsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgZmFsc2UpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJ1cGRhdGluZyByYW5nZXMiLCB0ZXN0TWFuYWdlci51cGRhdGVSYW5nZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEZMQUdfU1RBUlRfVVBEQVRFX0NBTExFRCB8IEZMQUdfRklOSVNIX1VQREFURV9DQUxMRUQsCisgICAgICAgICAgICAgICAgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDAsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUJhZENoYW5uZWwoKSB7CisgICAgICAgIFRlc3RJbnRSYW5nZU1hbmFnZXIgdGVzdE1hbmFnZXIgPSBuZXcgVGVzdEludFJhbmdlTWFuYWdlcigpOworICAgICAgICBhc3NlcnRGYWxzZSgiZGlzYWJsaW5nIG1pc3NpbmcgcmFuZ2UiLCB0ZXN0TWFuYWdlci5kaXNhYmxlUmFuZ2UoMTIzLCAxMjMsICJjbGllbnQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCAwLCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMCwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVHdvQ2hhbm5lbHMoKSB7CisgICAgICAgIFRlc3RJbnRSYW5nZU1hbmFnZXIgdGVzdE1hbmFnZXIgPSBuZXcgVGVzdEludFJhbmdlTWFuYWdlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGJlZm9yZSB0ZXN0IiwgMCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRUcnVlKCJlbmFibGluZyByYW5nZSAxIiwgdGVzdE1hbmFnZXIuZW5hYmxlUmFuZ2UoMTAwLCAxMjAsICJjbGllbnQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMTAwLCAxMjAsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIDIiLCB0ZXN0TWFuYWdlci5lbmFibGVSYW5nZSgyMDAsIDI1MCwgImNsaWVudDIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAyMDAsIDI1MCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidXBkYXRpbmcgcmFuZ2VzIiwgdGVzdE1hbmFnZXIudXBkYXRlUmFuZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMiwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMTAwLCAxMjAsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMSksIDIwMCwgMjUwLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVybGFwcGluZ0NoYW5uZWxzKCkgeworICAgICAgICBUZXN0SW50UmFuZ2VNYW5hZ2VyIHRlc3RNYW5hZ2VyID0gbmV3IFRlc3RJbnRSYW5nZU1hbmFnZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBiZWZvcmUgdGVzdCIsIDAsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5hYmxpbmcgcmFuZ2UgMSIsIHRlc3RNYW5hZ2VyLmVuYWJsZVJhbmdlKDEwMCwgMjAwLCAiY2xpZW50MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDEsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDEwMCwgMjAwLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJlbmFibGluZyByYW5nZSAyIiwgdGVzdE1hbmFnZXIuZW5hYmxlUmFuZ2UoMTUwLCAyNTAsICJjbGllbnQyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMjAxLCAyNTAsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoInVwZGF0aW5nIHJhbmdlcyIsIHRlc3RNYW5hZ2VyLnVwZGF0ZVJhbmdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDEsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDEwMCwgMjUwLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UgMSIsIHRlc3RNYW5hZ2VyLmRpc2FibGVSYW5nZSgxMDAsIDIwMCwgImNsaWVudDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAxMDAsIDE0OSwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCBmYWxzZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoImRpc2FibGluZyByYW5nZSAyIiwgdGVzdE1hbmFnZXIuZGlzYWJsZVJhbmdlKDE1MCwgMjUwLCAiY2xpZW50MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDEsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDE1MCwgMjUwLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIGZhbHNlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidXBkYXRpbmcgcmFuZ2VzIiwgdGVzdE1hbmFnZXIudXBkYXRlUmFuZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBGTEFHX1NUQVJUX1VQREFURV9DQUxMRUQgfCBGTEFHX0ZJTklTSF9VUERBVEVfQ0FMTEVELAorICAgICAgICAgICAgICAgIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAwLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVybGFwcGluZ0NoYW5uZWxzMigpIHsKKyAgICAgICAgVGVzdEludFJhbmdlTWFuYWdlciB0ZXN0TWFuYWdlciA9IG5ldyBUZXN0SW50UmFuZ2VNYW5hZ2VyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYmVmb3JlIHRlc3QiLCAwLCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIDEiLCB0ZXN0TWFuYWdlci5lbmFibGVSYW5nZSgxMDAsIDIwMCwgImNsaWVudDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAxMDAsIDIwMCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5hYmxpbmcgcmFuZ2UgMiIsIHRlc3RNYW5hZ2VyLmVuYWJsZVJhbmdlKDE1MCwgMjUwLCAiY2xpZW50MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDEsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDIwMSwgMjUwLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UgMiIsIHRlc3RNYW5hZ2VyLmRpc2FibGVSYW5nZSgxNTAsIDI1MCwgImNsaWVudDIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAyMDEsIDI1MCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCBmYWxzZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoInVwZGF0aW5nIHJhbmdlcyIsIHRlc3RNYW5hZ2VyLnVwZGF0ZVJhbmdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDEsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDEwMCwgMjAwLCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UgMSIsIHRlc3RNYW5hZ2VyLmRpc2FibGVSYW5nZSgxMDAsIDIwMCwgImNsaWVudDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAxMDAsIDIwMCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlT3ZlcmxhcHBpbmdDaGFubmVscygpIHsKKyAgICAgICAgVGVzdEludFJhbmdlTWFuYWdlciB0ZXN0TWFuYWdlciA9IG5ldyBUZXN0SW50UmFuZ2VNYW5hZ2VyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYmVmb3JlIHRlc3QiLCAwLCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIDEiLCB0ZXN0TWFuYWdlci5lbmFibGVSYW5nZSg2NywgOTk5OSwgImNsaWVudDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCA2NywgOTk5OSwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5hYmxpbmcgcmFuZ2UgMiIsIHRlc3RNYW5hZ2VyLmVuYWJsZVJhbmdlKDE1MCwgMjUwLCAiY2xpZW50MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgMCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDAsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIDMiLCB0ZXN0TWFuYWdlci5lbmFibGVSYW5nZSgyNSwgNzUsICJjbGllbnQzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMjUsIDY2LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJlbmFibGluZyByYW5nZSA0IiwgdGVzdE1hbmFnZXIuZW5hYmxlUmFuZ2UoMTIsIDUwMCwgImNsaWVudDQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAxMiwgMjQsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIDUiLCB0ZXN0TWFuYWdlci5lbmFibGVSYW5nZSg4MDAwLCA5OTk4LCAiY2xpZW50NSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgMCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDAsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoImVuYWJsaW5nIHJhbmdlIDYiLCB0ZXN0TWFuYWdlci5lbmFibGVSYW5nZSg1MDAwMCwgNjU1MzUsICJjbGllbnQ2IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgNTAwMDAsIDY1NTM1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJ1cGRhdGluZyByYW5nZXMiLCB0ZXN0TWFuYWdlci51cGRhdGVSYW5nZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAyLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAxMiwgOTk5OSwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgxKSwgNTAwMDAsIDY1NTM1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UgMSIsIHRlc3RNYW5hZ2VyLmRpc2FibGVSYW5nZSg2NywgOTk5OSwgImNsaWVudDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAyLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCA1MDEsIDc5OTksIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgZmFsc2UpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDEpLCA5OTk5LCA5OTk5LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIGZhbHNlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidXBkYXRpbmcgcmFuZ2VzIiwgdGVzdE1hbmFnZXIudXBkYXRlUmFuZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMywgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMTIsIDUwMCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgxKSwgODAwMCwgOTk5OCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgyKSwgNTAwMDAsIDY1NTM1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UgNCIsIHRlc3RNYW5hZ2VyLmRpc2FibGVSYW5nZSgxMiwgNTAwLCAiY2xpZW50NCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDMsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDEyLCAyNCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCBmYWxzZSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMSksIDc2LCAxNDksIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgZmFsc2UpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDIpLCAyNTEsIDUwMCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCBmYWxzZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoInVwZGF0aW5nIHJhbmdlcyIsIHRlc3RNYW5hZ2VyLnVwZGF0ZVJhbmdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGFncyBhZnRlciB0ZXN0IiwgQUxMX0ZMQUdTX1NFVCwgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDQsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMCksIDI1LCA3NSwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgxKSwgMTUwLCAyNTAsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMiksIDgwMDAsIDk5OTgsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrQ29uZmlnSW5mbyh0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5nZXQoMyksIDUwMDAwLCA2NTUzNSwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlzYWJsaW5nIHJhbmdlIDUiLCB0ZXN0TWFuYWdlci5kaXNhYmxlUmFuZ2UoODAwMCwgOTk5OCwgImNsaWVudDUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCA4MDAwLCA5OTk4LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIGZhbHNlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidXBkYXRpbmcgcmFuZ2VzIiwgdGVzdE1hbmFnZXIudXBkYXRlUmFuZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMywgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMjUsIDc1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDEpLCAxNTAsIDI1MCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgyKSwgNTAwMDAsIDY1NTM1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJkaXNhYmxpbmcgcmFuZ2UgNiIsIHRlc3RNYW5hZ2VyLmRpc2FibGVSYW5nZSg1MDAwMCwgNjU1MzUsICJjbGllbnQ2IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgNTAwMDAsIDY1NTM1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIGZhbHNlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgidXBkYXRpbmcgcmFuZ2VzIiwgdGVzdE1hbmFnZXIudXBkYXRlUmFuZ2VzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMiwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMjUsIDc1LCBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUlOLAorICAgICAgICAgICAgICAgIFNNU19DQl9DT0RFX1NDSEVNRV9NQVgsIHRydWUpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDEpLCAxNTAsIDI1MCwgU01TX0NCX0NPREVfU0NIRU1FX01JTiwKKyAgICAgICAgICAgICAgICBTTVNfQ0JfQ09ERV9TQ0hFTUVfTUFYLCB0cnVlKTsKKyAgICAgICAgdGVzdE1hbmFnZXIucmVzZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlzYWJsaW5nIHJhbmdlIDIiLCB0ZXN0TWFuYWdlci5kaXNhYmxlUmFuZ2UoMTUwLCAyNTAsICJjbGllbnQyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsYWdzIGFmdGVyIHRlc3QiLCBBTExfRkxBR1NfU0VULCB0ZXN0TWFuYWdlci5mbGFncyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29uZmlnbGlzdCBzaXplIiwgMSwgdGVzdE1hbmFnZXIubUNvbmZpZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY2hlY2tDb25maWdJbmZvKHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LmdldCgwKSwgMTUwLCAyNTAsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgZmFsc2UpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJ1cGRhdGluZyByYW5nZXMiLCB0ZXN0TWFuYWdlci51cGRhdGVSYW5nZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAyNSwgNzUsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgdHJ1ZSk7CisgICAgICAgIHRlc3RNYW5hZ2VyLnJlc2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoImRpc2FibGluZyByYW5nZSAzIiwgdGVzdE1hbmFnZXIuZGlzYWJsZVJhbmdlKDI1LCA3NSwgImNsaWVudDMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEFMTF9GTEFHU19TRVQsIHRlc3RNYW5hZ2VyLmZsYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb25maWdsaXN0IHNpemUiLCAxLCB0ZXN0TWFuYWdlci5tQ29uZmlnTGlzdC5zaXplKCkpOworICAgICAgICBjaGVja0NvbmZpZ0luZm8odGVzdE1hbmFnZXIubUNvbmZpZ0xpc3QuZ2V0KDApLCAyNSwgNzUsIFNNU19DQl9DT0RFX1NDSEVNRV9NSU4sCisgICAgICAgICAgICAgICAgU01TX0NCX0NPREVfU0NIRU1FX01BWCwgZmFsc2UpOworICAgICAgICB0ZXN0TWFuYWdlci5yZXNldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJ1cGRhdGluZyByYW5nZXMiLCB0ZXN0TWFuYWdlci51cGRhdGVSYW5nZXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxhZ3MgYWZ0ZXIgdGVzdCIsIEZMQUdfU1RBUlRfVVBEQVRFX0NBTExFRCB8IEZMQUdfRklOSVNIX1VQREFURV9DQUxMRUQsCisgICAgICAgICAgICAgICAgdGVzdE1hbmFnZXIuZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbmZpZ2xpc3Qgc2l6ZSIsIDAsIHRlc3RNYW5hZ2VyLm1Db25maWdMaXN0LnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9CdW5kbGVQcmludGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0J1bmRsZVByaW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0NzM3OS4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0J1bmRsZVByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQucnVubmVyLkJhc2VUZXN0UnVubmVyOwotaW1wb3J0IGp1bml0LnRleHR1aS5SZXN1bHRQcmludGVyOwotCi0KLS8qKgotICogU3ViY2xhc3Mgb2YgUmVzdWx0UHJpbnRlciB0aGF0IGFkZHMgdGVzdCBjYXNlIHJlc3VsdHMgdG8gYSBidW5kbGUuCi0gKiAKLSAqIHtAaGlkZX0gLSBUaGlzIGNsYXNzIGlzIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGJlIGdvaW5nIGF3YXkuICBQbGVhc2UgZG9uJ3QgdXNlIGl0LgotICovCi1wdWJsaWMgY2xhc3MgQnVuZGxlUHJpbnRlciBleHRlbmRzIFJlc3VsdFByaW50ZXIgewotCi0gICAgcHJpdmF0ZSBCdW5kbGUgbVJlc3VsdHM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1GYWlsdXJlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRXJyb3I7Ci0gICAgCi0gICAgcHVibGljIEJ1bmRsZVByaW50ZXIoUHJpbnRTdHJlYW0gd3JpdGVyLCBCdW5kbGUgcmVzdWx0KSB7Ci0gICAgICAgIHN1cGVyKHdyaXRlcik7Ci0gICAgICAgIG1SZXN1bHRzID0gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIG1SZXN1bHRzLnB1dFN0cmluZyhnZXRDb21ib05hbWUodGVzdCksIEJhc2VUZXN0UnVubmVyLmdldEZpbHRlcmVkVHJhY2UodCkpOwotICAgICAgICBtRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgIHN1cGVyLmFkZEVycm9yKHRlc3QsIHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7Ci0gICAgICAgIG1SZXN1bHRzLnB1dFN0cmluZyhnZXRDb21ib05hbWUodGVzdCksIEJhc2VUZXN0UnVubmVyLmdldEZpbHRlcmVkVHJhY2UodCkpOwotICAgICAgICBtRXJyb3IgPSB0cnVlOwotICAgICAgICBzdXBlci5hZGRGYWlsdXJlKHRlc3QsIHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIGlmICghbUZhaWx1cmUgJiYgIW1FcnJvcikgewotICAgICAgICAgICAgbVJlc3VsdHMucHV0U3RyaW5nKGdldENvbWJvTmFtZSh0ZXN0KSwgInBhc3NlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVuZFRlc3QodGVzdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICBtRmFpbHVyZSA9IGZhbHNlOwotICAgICAgICBtRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgc3VwZXIuc3RhcnRUZXN0KHRlc3QpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb21ib05hbWUoVGVzdCB0ZXN0KSB7Ci0gICAgICAgIHJldHVybiB0ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjoiICsgKChUZXN0Q2FzZSkgdGVzdCkuZ2V0TmFtZSgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvQnVuZGxlVGVzdExpc3RlbmVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L0J1bmRsZVRlc3RMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzI3MTNmLi4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvQnVuZGxlVGVzdExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQucnVubmVyLkJhc2VUZXN0UnVubmVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIEEge0BsaW5rIFRlc3RMaXN0ZW5lcn0gdGhhdCBhZGRzIHRlc3QgY2FzZSByZXN1bHRzIHRvIGEgYnVuZGxlLgotICogCi0gKiB7QGhpZGV9IC0gVGhpcyBjbGFzcyBpcyBkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSBnb2luZyBhd2F5LiAgUGxlYXNlIGRvbid0IHVzZSBpdC4KLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZVRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIFRlc3RMaXN0ZW5lciB7Ci0KLSAgICBwcml2YXRlIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRmFpbGVkOwotCi0gICAgcHVibGljIEJ1bmRsZVRlc3RMaXN0ZW5lcihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7Ci0gICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKGdldENvbWJvTmFtZSh0ZXN0KSwgQmFzZVRlc3RSdW5uZXIuZ2V0RmlsdGVyZWRUcmFjZSh0KSk7Ci0gICAgICAgIG1GYWlsZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewotICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhnZXRDb21ib05hbWUodGVzdCksIEJhc2VUZXN0UnVubmVyLmdldEZpbHRlcmVkVHJhY2UodCkpOwotICAgICAgICBtRmFpbGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICBpZiAoIW1GYWlsZWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKGdldENvbWJvTmFtZSh0ZXN0KSwgInBhc3NlZCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewotICAgICAgICBtRmFpbGVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q29tYm9OYW1lKFRlc3QgdGVzdCkgewotICAgICAgICByZXR1cm4gdGVzdC5nZXRDbGFzcygpLmdldE5hbWUoKSArICI6IiArICgoVGVzdENhc2UpIHRlc3QpLmdldE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvU2VydmljZUxvY2F0b3IuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvU2VydmljZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyNDAwOC4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1NlcnZpY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLS8qKgotICogQGhpZGUgLSBUaGlzIGlzIHBhcnQgb2YgYSBmcmFtZXdvcmsgdGhhdCBpcyB1bmRlciBkZXZlbG9wbWVudCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICogYWN0aXZlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUxvY2F0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGVzdEJyb3dzZXJDb250cm9sbGVyIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIgPQotICAgICAgICAgICAgbmV3IFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdEJyb3dzZXJDb250cm9sbGVyIGdldFRlc3RCcm93c2VyQ29udHJvbGxlcigpIHsKLSAgICAgICAgcmV0dXJuIG1UZXN0QnJvd3NlckNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0VGVzdEJyb3dzZXJDb250cm9sbGVyKFRlc3RCcm93c2VyQ29udHJvbGxlciB0ZXN0QnJvd3NlckNvbnRyb2xsZXIpIHsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlciA9IHRlc3RCcm93c2VyQ29udHJvbGxlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQWN0aXZpdHkuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTVmOTFlLi4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGhpZGUgLSBUaGlzIGlzIHBhcnQgb2YgYSBmcmFtZXdvcmsgdGhhdCBpcyB1bmRlciBkZXZlbG9wbWVudCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICogYWN0aXZlIGRldmVsb3BtZW50LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdEJyb3dzZXJBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eQotICAgICAgICBpbXBsZW1lbnRzIGFuZHJvaWQudGVzdC5UZXN0QnJvd3NlclZpZXcsIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIsCi0gICAgICAgIFRlc3RTdWl0ZVByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgVGVzdEJyb3dzZXJDb250cm9sbGVyIG1UZXN0QnJvd3NlckNvbnRyb2xsZXI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0VYVFJBX1BBQ0tBR0UgPSAicGFja2FnZSI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIgPSBTZXJ2aWNlTG9jYXRvci5nZXRUZXN0QnJvd3NlckNvbnRyb2xsZXIoKTsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUYXJnZXRQYWNrYWdlTmFtZShnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5yZWdpc3RlclZpZXcodGhpcyk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGFyZ2V0QnJvd3NlckFjdGl2aXR5Q2xhc3NOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICAgIC8vIEFwayBwYXRocyB1c2VkIHRvIHNlYXJjaCBmb3IgdGVzdCBjbGFzc2VzIHdoZW4gdXNpbmcgVGVzdFN1aXRlQnVpbGRlcnMuCi0gICAgICAgIFN0cmluZ1tdIGFwa1BhdGhzID0ge2dldFBhY2thZ2VDb2RlUGF0aCgpfTsKLSAgICAgICAgQ2xhc3NQYXRoUGFja2FnZUluZm9Tb3VyY2Uuc2V0QXBrUGF0aHMoYXBrUGF0aHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAgICAgICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IGdldFRlc3RTdWl0ZVRvQnJvd3NlKCk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGVzdFN1aXRlKHRlc3RTdWl0ZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9IHRlc3RTdWl0ZS5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFRpdGxlKG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgd2lsbCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgcmV0dXJuIHRoZSBUZXN0U3VpdGUgc3BlY2lmaWMgdG8gdGhlaXIgLmFway4KLSAgICAgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgZHVlIHRvIGFuIGludGVudCBmaXJlZCBmcm9tCi0gICAgICoge0BsaW5rICNvbkl0ZW1DbGljayhhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldywgYW5kcm9pZC52aWV3LlZpZXcsIGludCwgbG9uZyl9IHRoZW4gZ2V0IHRoZQotICAgICAqIHRhcmdldGVkIFRlc3RTdWl0ZSBmcm9tIHRoZSBpbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRlc3RTdWl0ZSB0byBicm93c2UKLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIFRlc3RTdWl0ZSBnZXRUZXN0U3VpdGVUb0Jyb3dzZSgpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IGdldEludGVudCgpOwotICAgICAgICBpZiAoSW50ZW50LkFDVElPTl9SVU4uZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXN0Q2xhc3NOYW1lID0gaW50ZW50LmdldERhdGEoKS50b1N0cmluZygpOwotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzPFRlc3Q+IHRlc3RDbGFzcyA9IChDbGFzczxUZXN0PikgZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3ModGVzdENsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlVXRpbC5jcmVhdGVUZXN0U3VpdGUodGVzdENsYXNzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKCJUZXN0QnJvd3NlckFjdGl2aXR5IiwgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZm9yICIgKyB0ZXN0Q2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKCJUZXN0QnJvd3NlckFjdGl2aXR5IiwgIklsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZm9yICIgKyB0ZXN0Q2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKCJUZXN0QnJvd3NlckFjdGl2aXR5IiwgIkluc3RhbnRpYXRpb25FeGNlcHRpb24gZm9yICIgKyB0ZXN0Q2xhc3NOYW1lLCBlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGdldCB0ZXN0IGNsYXNzZXMgdG8gYnJvd3dlcyBmcm9tIHN1YmNsYXNzCi0gICAgICAgICAgICByZXR1cm4gZ2V0VG9wVGVzdFN1aXRlKCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0U3VpdGUgZ2V0VGVzdFN1aXRlKCkgewotICAgICAgICByZXR1cm4gZ2V0VG9wVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBBIFRlc3RTdWl0ZSB0aGF0IHNob3VsZCBiZSBydW4gZm9yIGEgZ2l2ZW4gYXBwbGljYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFRlc3RTdWl0ZSBnZXRUb3BUZXN0U3VpdGUoKTsKLQotICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNsaWNrKEFkYXB0ZXJWaWV3IHBhcmVudCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuZ2V0SW50ZW50Rm9yVGVzdEF0KHBvc2l0aW9uKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEJVTkRMRV9FWFRSQV9QQUNLQUdFLCBnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgc3RhcnRBY3Rpdml0eShpbnRlbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRlc3ROYW1lcyhMaXN0PFN0cmluZz4gdGVzdE5hbWVzKSB7Ci0gICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFycmF5QWRhcHRlciA9IG5ldyBBcnJheUFkYXB0ZXI8U3RyaW5nPih0aGlzLAotICAgICAgICAgICAgICAgIFIubGF5b3V0LnRlc3RfbGlzdF9pdGVtLCB0ZXN0TmFtZXMpOwotICAgICAgICBzZXRMaXN0QWRhcHRlcihhcnJheUFkYXB0ZXIpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXIuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGUzOWYuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAaGlkZSAtIFRoaXMgaXMgcGFydCBvZiBhIGZyYW1ld29yayB0aGF0IGlzIHVuZGVyIGRldmVsb3BtZW50IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gKiBhY3RpdmUgZGV2ZWxvcG1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdEJyb3dzZXJDb250cm9sbGVyIHsKLSAgICBTdHJpbmcgQlVORExFX0VYVFJBX1RFU1RfTUVUSE9EX05BTUUgPSAidGVzdE1ldGhvZE5hbWUiOwotCi0gICAgSW50ZW50IGdldEludGVudEZvclRlc3RBdChpbnQgcG9zaXRpb24pOwotCi0gICAgdm9pZCBzZXRUZXN0U3VpdGUoVGVzdFN1aXRlIHRlc3RTdWl0ZSk7Ci0KLSAgICB2b2lkIHJlZ2lzdGVyVmlldyhUZXN0QnJvd3NlclZpZXcgdGVzdEJyb3dzZXJWaWV3KTsKLQotICAgIHZvaWQgc2V0VGFyZ2V0QnJvd3NlckFjdGl2aXR5Q2xhc3NOYW1lKFN0cmluZyB0YXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWUpOwotCi0gICAgdm9pZCBzZXRUYXJnZXRQYWNrYWdlTmFtZShTdHJpbmcgdGFyZ2V0UGFja2FnZU5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmODk3NS4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBjb20uZ29vZ2xlLmFuZHJvaWQuY29sbGVjdC5MaXN0czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBoaWRlIC0gVGhpcyBpcyBwYXJ0IG9mIGEgZnJhbWV3b3JrIHRoYXQgaXMgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3IKLSAqIGFjdGl2ZSBkZXZlbG9wbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwgaW1wbGVtZW50cyBUZXN0QnJvd3NlckNvbnRyb2xsZXIgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JVTk5FUl9BQ1RJVklUWV9DTEFTU19OQU1FID0KLSAgICAgICAgICAgImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzLlRlc3RSdW5uZXJBY3Rpdml0eSI7Ci0KLSAgICBwcml2YXRlIFRlc3RTdWl0ZSBtVGVzdFN1aXRlOwotICAgIHByaXZhdGUgVGVzdEJyb3dzZXJWaWV3IG1UZXN0QnJvd3NlclZpZXc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVTl9BTExfSU5ERVggPSAwOwotICAgIHByaXZhdGUgU3RyaW5nIG1UYXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRhcmdldFBhY2thZ2VOYW1lOwotCi0gICAgcHVibGljIHZvaWQgc2V0VGFyZ2V0UGFja2FnZU5hbWUoU3RyaW5nIHRhcmdldFBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIG1UYXJnZXRQYWNrYWdlTmFtZSA9IHRhcmdldFBhY2thZ2VOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlbnQgZ2V0SW50ZW50Rm9yVGVzdEF0KGludCBwb3NpdGlvbikgewotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fUlVOKTsKLSAgICAgICAgLy8gV2UgbXVzdCBhZGQgdGhlIGZvbGxvd2luZyB0d28gZmxhZ3MgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY3JlYXRlIGEgbmV3IGFjdGl2aXR5IHdoZW4KLSAgICAgICAgLy8gd2UgYnJvd3NlIG5lc3RlZCB0ZXN0IHN1aXRlcy4KLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLKTsKLSAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0spOwotCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldERlZmF1bHRQYWNrYWdlTmFtZUZvclRlc3RSdW5uZXIoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOwotICAgICAgICBTdHJpbmcgdGVzdE5hbWUgPSAiIjsKLSAgICAgICAgaWYgKHNob3VsZEFsbFRlc3RzQmVSdW4ocG9zaXRpb24pKSB7Ci0gICAgICAgICAgICB0ZXN0TmFtZSA9IG1UZXN0U3VpdGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgY2xhc3NOYW1lID0gVEVTVF9SVU5ORVJfQUNUSVZJVFlfQ0xBU1NfTkFNRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFRlc3QgdGVzdCA9IFRlc3RDYXNlVXRpbC5nZXRUZXN0QXRJbmRleChtVGVzdFN1aXRlLCBwb3NpdGlvbiAtIDEpOwotICAgICAgICAgICAgaWYgKFRlc3RTdWl0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3QuZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gKFRlc3RTdWl0ZSkgdGVzdDsKLSAgICAgICAgICAgICAgICB0ZXN0TmFtZSA9IHRlc3RTdWl0ZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gbVRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZTsKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IG1UYXJnZXRQYWNrYWdlTmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoVGVzdENhc2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0ZXN0LmdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICAgICAgVGVzdENhc2UgdGVzdENhc2UgPSAoVGVzdENhc2UpIHRlc3Q7Ci0gICAgICAgICAgICAgICAgdGVzdE5hbWUgPSB0ZXN0Q2FzZS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBURVNUX1JVTk5FUl9BQ1RJVklUWV9DTEFTU19OQU1FOwotICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0TWV0aG9kTmFtZSA9IHRlc3RDYXNlLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoQlVORExFX0VYVFJBX1RFU1RfTUVUSE9EX05BTUUsIHRlc3RNZXRob2ROYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludGVudC5zZXRDbGFzc05hbWUocGFja2FnZU5hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgIGludGVudC5zZXREYXRhKFVyaS5wYXJzZSh0ZXN0TmFtZSkpOwotCi0gICAgICAgIHJldHVybiBpbnRlbnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2VOYW1lRm9yVGVzdFJ1bm5lcigpIHsKLSAgICAgICAgcmV0dXJuIFRFU1RfUlVOTkVSX0FDVElWSVRZX0NMQVNTX05BTUUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgVEVTVF9SVU5ORVJfQUNUSVZJVFlfQ0xBU1NfTkFNRS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkQWxsVGVzdHNCZVJ1bihpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgcmV0dXJuIHBvc2l0aW9uID09IFJVTl9BTExfSU5ERVg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVzdFN1aXRlKFRlc3RTdWl0ZSB0ZXN0U3VpdGUpIHsKLSAgICAgICAgbVRlc3RTdWl0ZSA9IHRlc3RTdWl0ZTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICB0ZXN0Q2FzZU5hbWVzLmFkZCgiUnVuIEFsbCIpOwotICAgICAgICB0ZXN0Q2FzZU5hbWVzLmFkZEFsbChUZXN0Q2FzZVV0aWwuZ2V0VGVzdENhc2VOYW1lcyh0ZXN0U3VpdGUsIGZhbHNlKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyVmlldy5zZXRUZXN0TmFtZXModGVzdENhc2VOYW1lcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJWaWV3KFRlc3RCcm93c2VyVmlldyB0ZXN0QnJvd3NlclZpZXcpIHsKLSAgICAgICAgbVRlc3RCcm93c2VyVmlldyA9IHRlc3RCcm93c2VyVmlldzsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZShTdHJpbmcgdGFyZ2V0QnJvd3NlckFjdGl2aXR5Q2xhc3NOYW1lKSB7Ci0gICAgICAgIG1UYXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWUgPSB0YXJnZXRCcm93c2VyQWN0aXZpdHlDbGFzc05hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlclZpZXcuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTlmMTk2Li4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAaGlkZSAtIFRoaXMgaXMgcGFydCBvZiBhIGZyYW1ld29yayB0aGF0IGlzIHVuZGVyIGRldmVsb3BtZW50IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gKiBhY3RpdmUgZGV2ZWxvcG1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdEJyb3dzZXJWaWV3IHsKLSAgICB2b2lkIHNldFRlc3ROYW1lcyhMaXN0PFN0cmluZz4gdGVzdE5hbWVzKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdExpc3RBY3Rpdml0eS5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0TGlzdEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNzZhNzAuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9UZXN0TGlzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5NYXRyaXhDdXJzb3I7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OwotaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5DdXJzb3JBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvckFkYXB0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEFjdGl2aXR5IGJhc2UgY2xhc3MgdG8gdXNlIHRvIGltcGxlbWVudCB5b3VyIGFwcGxpY2F0aW9uJ3MgdGVzdHMuCi0gKgotICogPHA+SW1wbGVtZW50IHRoZSBnZXRUZXN0U3VpdGUoKSBtZXRob2QgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIHlvdXIKLSAqIHRlc3Qgc3VpdGUgY2xhc3MuCi0gKgotICogPHA+U2VlIHRoZSBhbmRyb2lkLnRlc3QgcGFja2FnZSBkb2N1bWVudGF0aW9uIChjbGljayB0aGUgbW9yZS4uLiBsaW5rKQotICogZm9yIGEgZnVsbCBkZXNjcmlwdGlvbgotICogCi0gKiB7QGhpZGV9IE5vdCBuZWVkZWQgZm9yIFNESwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdExpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7Ci0gICAgLyoqIFN1cHBsaWVkIGluIHRoZSBpbnRlbnQgZXh0cmFzIGlmIHdlIGFyZSBydW5uaW5nIHBlcmZvcm1hbmNlIHRlc3RzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1BTkNFX1RFU1RTID0gImFuZHJvaWQudGVzdC5wZXJmb3JtYW5jZSI7Ci0KLSAgICAvKiogIk1vZGUiIGdyb3VwIGluIHRoZSBtZW51LiAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9HUk9VUCA9IE1lbnUuRklSU1Q7Ci0KLSAgICAvKiogT3VyIHN1aXRlICovCi0gICAgU3RyaW5nIG1TdWl0ZTsKLQotICAgIC8qKiBPdXIgY2hpbGRyZW4gdGVzdHMgKi8KLSAgICBTdHJpbmdbXSBtVGVzdHM7Ci0KLSAgICAvKiogd2hpY2ggbW9kZSwgUkVHUkVTU0lPTiwgUEVSRk9STUFOQ0Ugb3IgUFJPRklMSU5HICovCi0gICAgcHJpdmF0ZSBpbnQgbU1vZGUgPSBUZXN0UnVubmVyLlJFR1JFU1NJT047Ci0KLSAgICAvKiogIlJlZ3Jlc3Npb24iIG1lbnUgaXRlbSAqLwotICAgIHByaXZhdGUgTWVudUl0ZW0gbVJlZ3Jlc3Npb25JdGVtOwotCi0gICAgLyoqICJQZXJmb3JtYW5jZSIgbWVudSBpdGVtICovCi0gICAgcHJpdmF0ZSBNZW51SXRlbSBtUGVyZm9ybWFuY2VJdGVtOwotCi0gICAgLyoqICJQcm9maWxpbmciIG1lbnUgaXRlbSAqLwotICAgIHByaXZhdGUgTWVudUl0ZW0gbVByb2ZpbGluZ0l0ZW07Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBzQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLSAgICAgICAgICAgIFN0cmluZyBzMSA9IG1ha2VDb21wYXJlTmFtZShhKTsKLSAgICAgICAgICAgIFN0cmluZyBzMiA9IG1ha2VDb21wYXJlTmFtZShiKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHMxLmNvbXBhcmVUb0lnbm9yZUNhc2UoczIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIHRoYXQgZG9lc24ndCBkbyBtdWNoLgotICAgICAqLwotICAgIHB1YmxpYyBUZXN0TGlzdEFjdGl2aXR5KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIHRvIHJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGNsYXNzZXMKLSAgICAgKiBvZiB0aGVpciB0ZXN0cy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGVzdCBzdWl0ZSBjbGFzcyBuYW1lCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRUZXN0U3VpdGUoKTsKLQotICAgIC8qKgotICAgICAqIFR5cGljYWwgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKLQotICAgICAgICBtTW9kZSA9IGludGVudC5nZXRJbnRFeHRyYShUZXN0TGlzdEFjdGl2aXR5LlBFUkZPUk1BTkNFX1RFU1RTLCBtTW9kZSk7Ci0KLQotICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX01BSU4pKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSB3ZXJlIGNhbGxlZCBhcyBNQUlOLCBnZXQgdGhlIHRlc3Qgc3VpdGVzLAotICAgICAgICAgICAgbVN1aXRlID0gZ2V0VGVzdFN1aXRlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhJbnRlbnQuQUNUSU9OX1JVTikpIHsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGJlZW4gcHJvdmlkZWQgYSBzdGF0dXMgY2hhbm5lbC4gIEJhaWwgb3V0IGFuZAotICAgICAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGluc3RlYWQuICBUaGlzIGlzIGhvdyB0aGUgVGVzdEhhcm5lc3MgZ2V0cyB1cwotICAgICAgICAgICAgLy8gbG9hZGVkIGluIG91ciBwcm9jZXNzIGZvciAiUnVuIEFsbCBUZXN0cy4iCi0gICAgICAgICAgICBJbnRlbnQgbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fUlVOLAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0RGF0YSgpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGludGVudC5nZXREYXRhKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFVyaS5wYXJzZShnZXRUZXN0U3VpdGUoKSkpOwotICAgICAgICAgICAgbnRlbnQuc2V0Q2xhc3NOYW1lKCJjb20uYW5kcm9pZC50ZXN0aGFybmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50ZXN0aGFybmVzcy5SdW5UZXN0Iik7Ci0gICAgICAgICAgICBudGVudC5wdXRFeHRyYXMoaW50ZW50KTsKLSAgICAgICAgICAgIG50ZW50LnB1dEV4dHJhKCJwYWNrYWdlIiwgZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgICAgICBzdGFydEFjdGl2aXR5KG50ZW50KTsKLSAgICAgICAgICAgIGZpbmlzaCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9WSUVXKSkgewotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgb25lIGluIHRoZSBpbnRlbnQKLSAgICAgICAgICAgIG1TdWl0ZSA9IGludGVudC5nZXREYXRhKCkgIT0gbnVsbCA/IGludGVudC5nZXREYXRhKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBjaGlsZHJlbiA9IFRlc3RSdW5uZXIuZ2V0Q2hpbGRyZW4odGhpcywgbVN1aXRlKTsKLQotICAgICAgICBBcnJheXMuc29ydChjaGlsZHJlbiwgc0NvbXBhcmF0b3IpOwotCi0gICAgICAgIGludCBsZW4gPSBjaGlsZHJlbi5sZW5ndGg7Ci0gICAgICAgIG1UZXN0cyA9IG5ldyBTdHJpbmdbbGVuXTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjaGlsZHJlbiwgMCwgbVRlc3RzLCAwLCBsZW4pOwotCi0gICAgICAgIHNldFRpdGxlKFRlc3RSdW5uZXIuZ2V0VGl0bGUobVN1aXRlKSk7Ci0KLSAgICAgICAgTWF0cml4Q3Vyc29yIGN1cnNvciA9IG5ldyBNYXRyaXhDdXJzb3IobmV3IFN0cmluZ1tdIHsgIm5hbWUiLCAiX2lkIiB9KTsKLSAgICAgICAgYWRkVGVzdFJvd3MoY3Vyc29yKTsKLQotICAgICAgICBDdXJzb3JBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgU2ltcGxlQ3Vyc29yQWRhcHRlcigKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwKLSAgICAgICAgICAgICAgICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsibmFtZSJ9LAotICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Y29tLmFuZHJvaWQuaW50ZXJuYWwuUi5pZC50ZXh0MX0pOwotICAgICAgICAKLSAgICAgICAgc2V0TGlzdEFkYXB0ZXIoYWRhcHRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFRlc3RSb3dzKE1hdHJpeEN1cnNvciBjdXJzb3IpIHsKLSAgICAgICAgaW50IGlkID0gMDsKLSAgICAgICAgY3Vyc29yLm5ld1JvdygpLmFkZCgiUnVuIEFsbCIpLmFkZChpZCsrKTsgICAgICAgCi0gICAgICAgIGZvciAoU3RyaW5nIHRlc3QgOiBtVGVzdHMpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFRlc3RSdW5uZXIuZ2V0VGl0bGUodGVzdCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gVGVzdFJ1bm5lci5pc1Rlc3RTdWl0ZSh0aGlzLCB0ZXN0KQotICAgICAgICAgICAgICAgICAgICA/ICJCcm93c2UgIiA6ICJSdW4gIjsKLQotICAgICAgICAgICAgLy8gSSdkIHJhdGhlciBkbyB0aGlzIHdpdGggYW4gaWNvbiBjb2x1bW4sIGJ1dCBJIGRvbid0IGtub3cgaG93Ci0gICAgICAgICAgICBjdXJzb3IubmV3Um93KCkuYWRkKHByZWZpeCArIHRpdGxlKS5hZGQoaWQrKyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZU9wdGlvbnNNZW51KG1lbnUpOwotICAgICAgICBtUmVncmVzc2lvbkl0ZW0gPSBtZW51LmFkZChNT0RFX0dST1VQLCAtMSwgMCwgIlJlZ3Jlc3Npb24gTW9kZSIpOwotICAgICAgICBtUGVyZm9ybWFuY2VJdGVtID0gbWVudS5hZGQoTU9ERV9HUk9VUCwgLTEsIDAsICJQZXJmb3JtYW5jZSBNb2RlIik7Ci0gICAgICAgIG1Qcm9maWxpbmdJdGVtID0gbWVudS5hZGQoTU9ERV9HUk9VUCwgLTEsIDAsICJQcm9maWxpbmcgTW9kZSIpOwotICAgICAgICBtZW51LnNldEdyb3VwQ2hlY2thYmxlKE1PREVfR1JPVVAsIHRydWUsIHRydWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBtUmVncmVzc2lvbkl0ZW0pIHsKLSAgICAgICAgICAgIG1Nb2RlID0gVGVzdFJ1bm5lci5SRUdSRVNTSU9OOwotICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT0gbVBlcmZvcm1hbmNlSXRlbSkgewotICAgICAgICAgICAgbU1vZGUgPSBUZXN0UnVubmVyLlBFUkZPUk1BTkNFOwotICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT0gbVByb2ZpbGluZ0l0ZW0pIHsKLSAgICAgICAgICAgIG1Nb2RlID0gVGVzdFJ1bm5lci5QUk9GSUxJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewotICAgICAgICBzdXBlci5vblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICBjYXNlIFRlc3RSdW5uZXIuUkVHUkVTU0lPTjoKLSAgICAgICAgICAgIG1SZWdyZXNzaW9uSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUZXN0UnVubmVyLlBFUkZPUk1BTkNFOgotICAgICAgICAgICAgbVBlcmZvcm1hbmNlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUZXN0UnVubmVyLlBST0ZJTElORzoKLSAgICAgICAgICAgIG1Qcm9maWxpbmdJdGVtLnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLQotICAgICAgICBpZiAocG9zaXRpb24gPT0gMCkgewotICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZSgiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzLlJ1bkFsbCIpOwotICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgidGVzdHMiLCBuZXcgU3RyaW5nW117bVN1aXRlfSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50ZXN0aGFybmVzcy5SdW5UZXN0Iik7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnNldEFjdGlvbihJbnRlbnQuQUNUSU9OX1JVTik7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKG1TdWl0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHRlc3QgPSBtVGVzdHNbcG9zaXRpb24gLSAxXTsKLSAgICAgICAgICAgIGlmIChUZXN0UnVubmVyLmlzVGVzdFN1aXRlKHRoaXMsIHRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShnZXRQYWNrYWdlTmFtZSgpLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKEludGVudC5BQ1RJT05fVklFVyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzc05hbWUoImNvbS5hbmRyb2lkLnRlc3RoYXJuZXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC50ZXN0aGFybmVzcy5SdW5UZXN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShVcmkucGFyc2UodGVzdCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFBFUkZPUk1BTkNFX1RFU1RTLCBtTW9kZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYSgicGFja2FnZSIsIGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBzdGFydEFjdGl2aXR5KGludGVudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFrZUNvbXBhcmVOYW1lKFN0cmluZyBzKSB7Ci0gICAgICAgIGludCBpbmRleCA9IHMubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBzLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdFJlY29yZGVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RSZWNvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzM2OGEwLi4wMDAwMDAwCi0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdFJlY29yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7Ci1pbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkZpbGVVdGlsczsKLWltcG9ydCBhbmRyb2lkLnRlc3QuVGVzdFJ1bm5lci5JbnRlcm1lZGlhdGVUaW1lOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICoge0BoaWRlfSBOb3QgbmVlZGVkIGZvciAxLjAgU0RLLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFJlY29yZGVyIGltcGxlbWVudHMgVGVzdFJ1bm5lci5MaXN0ZW5lciwgVGVzdExpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREFUQUJBU0VfVkVSU0lPTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU1FMaXRlRGF0YWJhc2Ugc0RiOwotICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbUZhaWxlZFRlc3RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU1FMaXRlRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0gICAgICAgIGlmIChzRGIgPT0gbnVsbCkgewotICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShFbnZpcm9ubWVudC5nZXREYXRhRGlyZWN0b3J5KCksICJ0ZXN0X3Jlc3VsdHMiKTsKLQotICAgICAgICAgICAgLyogVE9ETzogYWRkIGEgREIgdmVyc2lvbiBudW1iZXIgYW5kIGJvb3RzdHJhcC91cGdyYWRlIG1ldGhvZHMKLSAgICAgICAgICAgICogaWYgdGhlIGZvcm1hdCBvZiB0aGUgdGFibGUgY2hhbmdlcy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgZGJOYW1lID0gIlRlc3RIYXJuZXNzLmRiIjsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZGJOYW1lKTsKLSAgICAgICAgICAgIHNEYiA9IFNRTGl0ZURhdGFiYXNlLm9wZW5PckNyZWF0ZURhdGFiYXNlKGZpbGUuZ2V0UGF0aCgpLCBudWxsKTsKLQotICAgICAgICAgICAgaWYgKHNEYi5nZXRWZXJzaW9uKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGludCBjb2RlID0gRmlsZVV0aWxzLnNldFBlcm1pc3Npb25zKGZpbGUuZ2V0UGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLlNfSVJVU1IgfCBGaWxlVXRpbHMuU19JV1VTUiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5TX0lSR1JQIHwgRmlsZVV0aWxzLlNfSVdHUlAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuU19JUk9USCB8IEZpbGVVdGlscy5TX0lXT1RILCAtMSwgLTEpOwotICAgIAotICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoIlRlc3RSZWNvcmRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCBwZXJtaXNzaW9ucyBmb3IgIiArIGZpbGUuZ2V0UGF0aCgpICsgIiByZXR1cm5lZCA9ICIgKyBjb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc0RiLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHRlc3RzIChfaWQgSU5UIFBSSU1BUlkgS0VZLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIFRFWFQsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VsdCBURVhULCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gVEVYVCwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRlZCBJTlRFR0VSLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5pc2hlZCBJTlRFR0VSLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lIElOVEVHRVIsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbnMgSU5URUdFUiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGlvbnMgSU5URUdFUiwiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyZW50IElOVEVHRVIpOyIpOwotICAgICAgICAgICAgICAgICAgICBzRGIuc2V0VmVyc2lvbihEQVRBQkFTRV9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZSgiVGVzdFJlY29yZGVyIiwgImZhaWxlZCB0byBjcmVhdGUgdGFibGUgJ3Rlc3RzJyIsIGUpOwotICAgICAgICAgICAgICAgICAgICBzRGIgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzRGI7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RSZWNvcmRlcigpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydGVkKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygyKTsKLSAgICAgICAgbWFwLnB1dCgibmFtZSIsIGNsYXNzTmFtZSk7Ci0gICAgICAgIG1hcC5wdXQoInN0YXJ0ZWQiLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0KLSAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSB0aGUgcm93IGZpcnN0IGluIGNhc2Ugd2UndmUgcmFuIHRoaXMgdGVzdCBiZWZvcmUuCi0gICAgICAgIGludCByb3dzQWZmZWN0ZWQgPSBnZXREYXRhYmFzZSgpLnVwZGF0ZSgidGVzdHMiLCBtYXAsICJuYW1lID0gJyIgKyBjbGFzc05hbWUgKyAiJyIsIG51bGwpOwotCi0gICAgICAgIGlmIChyb3dzQWZmZWN0ZWQgPT0gMCkgewotICAgICAgICAgICAgZ2V0RGF0YWJhc2UoKS5pbnNlcnQoInRlc3RzIiwgbnVsbCwgbWFwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmlzaGVkKFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygxKTsKLSAgICAgICAgbWFwLnB1dCgiZmluaXNoZWQiLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0KLSAgICAgICAgZ2V0RGF0YWJhc2UoKS51cGRhdGUoInRlc3RzIiwgbWFwLCAibmFtZSA9ICciICsgY2xhc3NOYW1lICsgIiciLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtYW5jZShTdHJpbmcgY2xhc3NOYW1lLCBsb25nIGl0ZW1UaW1lTlMsIGludCBpdGVyYXRpb25zLCBMaXN0PEludGVybWVkaWF0ZVRpbWU+IGludGVybWVkaWF0ZXMpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyBtYXAgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICBtYXAucHV0KCJ0aW1lIiwgaXRlbVRpbWVOUyk7Ci0gICAgICAgIG1hcC5wdXQoIml0ZXJhdGlvbnMiLCBpdGVyYXRpb25zKTsKLQotICAgICAgICBnZXREYXRhYmFzZSgpLnVwZGF0ZSgidGVzdHMiLCBtYXAsICJuYW1lID0gJyIgKyBjbGFzc05hbWUgKyAiJyIsIG51bGwpOwotCi0gICAgICAgIGlmIChpbnRlcm1lZGlhdGVzICE9IG51bGwgJiYgaW50ZXJtZWRpYXRlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgbiA9IGludGVybWVkaWF0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUZXN0UnVubmVyLkludGVybWVkaWF0ZVRpbWUgdGltZSA9IGludGVybWVkaWF0ZXMuZ2V0KGkpOwotCi0gICAgICAgICAgICAgICAgZ2V0RGF0YWJhc2UoKS5leGVjU1FMKCJJTlNFUlQgSU5UTyB0ZXN0cyAobmFtZSwgdGltZSwgcGFyZW50KSBWQUxVRVMgKCciICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUubmFtZSArICInLCAiICsgdGltZS50aW1lSW5OUyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIihTRUxFQ1QgX2lkIEZST00gdGVzdHMgV0hFUkUgbmFtZSA9ICciICsgY2xhc3NOYW1lICsgIicpKTsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBhc3NlZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbWFwLnB1dCgicmVzdWx0IiwgInBhc3NlZCIpOwotCi0gICAgICAgIGdldERhdGFiYXNlKCkudXBkYXRlKCJ0ZXN0cyIsIG1hcCwgIm5hbWUgPSAnIiArIGNsYXNzTmFtZSArICInIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmFpbGVkKFN0cmluZyBjbGFzc05hbWUsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcHJpbnRXcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBDb250ZW50VmFsdWVzIG1hcCA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgIG1hcC5wdXQoInJlc3VsdCIsICJmYWlsZWQiKTsKLSAgICAgICAgbWFwLnB1dCgiZXhjZXB0aW9uIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIGdldERhdGFiYXNlKCkudXBkYXRlKCJ0ZXN0cyIsIG1hcCwgIm5hbWUgPSAnIiArIGNsYXNzTmFtZSArICInIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwb3J0cyBhIHRlc3QgY2FzZSBmYWlsdXJlLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSBOYW1lIG9mIHRoZSBjbGFzcy90ZXN0LgotICAgICAqIEBwYXJhbSByZWFzb24gICAgUmVhc29uIGZvciBmYWlsdXJlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZhaWxlZChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0gICAgICAgIENvbnRlbnRWYWx1ZXMgbWFwID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgbWFwLnB1dCgicmVzdWx0IiwgImZhaWxlZCIpOwotICAgICAgICAvLyBUaGUgcmVhc29uIGlzIHB1dCBhcyB0aGUgZXhjZXB0aW9uLgotICAgICAgICBtYXAucHV0KCJleGNlcHRpb24iLCByZWFzb24pOwotICAgICAgICBnZXREYXRhYmFzZSgpLnVwZGF0ZSgidGVzdHMiLCBtYXAsICJuYW1lID0gJyIgKyBjbGFzc05hbWUgKyAiJyIsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgbUZhaWxlZFRlc3RzLmFkZCh0ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICBmYWlsZWQodGVzdC50b1N0cmluZygpLCB0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKLSAgICAgICAgbUZhaWxlZFRlc3RzLmFkZCh0ZXN0LnRvU3RyaW5nKCkpOwotICAgICAgICBmYWlsZWQodGVzdC50b1N0cmluZygpLCB0LmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgZmluaXNoZWQodGVzdC50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKCFtRmFpbGVkVGVzdHMuY29udGFpbnModGVzdC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgcGFzc2VkKHRlc3QudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZhaWxlZFRlc3RzLnJlbW92ZSh0ZXN0LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChUZXN0IHRlc3QpIHsKLSAgICAgICAgc3RhcnRlZCh0ZXN0LnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdFJ1bm5lclZpZXcuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdFJ1bm5lclZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5MDk1MS4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RSdW5uZXJWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAaGlkZSAtIFRoaXMgaXMgcGFydCBvZiBhIGZyYW1ld29yayB0aGF0IGlzIHVuZGVyIGRldmVsb3BtZW50IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gKiBhY3RpdmUgZGV2ZWxvcG1lbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVzdFJ1bm5lclZpZXcgewotICAgIHZvaWQgc2V0VGVzdE5hbWVzKExpc3Q8U3RyaW5nPiB0ZXN0TmFtZXMpOwotCi0gICAgdm9pZCBzZXRJdGVtQ29sb3JBdChpbnQgcG9zaXRpb24sIGludCBjb2xvcik7Ci0KLSAgICB2b2lkIHNldEZhaWx1cmVDb3VudChpbnQgZmFpbHVyZUNvdW50KTsKLQotICAgIHZvaWQgc2V0UnVuQ291bnQoaW50IHJ1bkNvdW50KTsKLQotICAgIHZvaWQgc2V0RXJyb3JDb3VudChpbnQgZXJyb3JDb3VudCk7Ci0KLSAgICB2b2lkIHNldFRvdGFsQ291bnQoaW50IHRvdGFsQ291bnQpOwotCi0gICAgdm9pZCBzZXRQcm9ncmVzc0JhckNvbG9yKGludCBjb2xvcik7Ci0KLSAgICB2b2lkIHRlc3RzQ29tcGxldGVkKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci9zcmMvanVuaXQvcnVubmVyL2xvZ28uZ2lmIGIvdGVzdC1ydW5uZXIvc3JjL2p1bml0L3J1bm5lci9sb2dvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMTU0Ny4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvanVuaXQvcnVubmVyL2xvZ28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2p1bml0L3J1bm5lci9zbWFsbGxvZ28uZ2lmIGIvdGVzdC1ydW5uZXIvc3JjL2p1bml0L3J1bm5lci9zbWFsbGxvZ28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjI1ZWFmNi4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvanVuaXQvcnVubmVyL3NtYWxsbG9nby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1N0dWJUZXN0QnJvd3NlckFjdGl2aXR5LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1N0dWJUZXN0QnJvd3NlckFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZWQzY2UuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9TdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5IGV4dGVuZHMgVGVzdEJyb3dzZXJBY3Rpdml0eSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXN0U3VpdGUgbVRlc3RTdWl0ZTsKLQotICAgIHN0YXRpYyB2b2lkIHNldFRvcFRlc3RTdWl0ZShUZXN0U3VpdGUgdGVzdFN1aXRlKSB7Ci0gICAgICAgIG1UZXN0U3VpdGUgPSB0ZXN0U3VpdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRlc3RTdWl0ZSBnZXRUb3BUZXN0U3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBtVGVzdFN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJBY3Rpdml0eVRlc3QuamF2YSBiL3Rlc3QtcnVubmVyL3Rlc3RzL3NyYy9hbmRyb2lkL3Rlc3QvVGVzdEJyb3dzZXJBY3Rpdml0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1NDA5ZS4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQWN0aXZpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU2VydmljZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LklXaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotCi1pbXBvcnQgY29tLmdvb2dsZS5hbmRyb2lkLmNvbGxlY3QuTGlzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVGVzdEJyb3dzZXJBY3Rpdml0eVRlc3QgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0Q2FzZSB7Ci0KLSAgICBwcml2YXRlIFRlc3RCcm93c2VyQWN0aXZpdHkgbVRlc3RCcm93c2VyQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBTdHViVGVzdEJyb3dzZXJDb250cm9sbGVyIG1UZXN0QnJvd3NlckNvbnRyb2xsZXI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5zZXRUb3BUZXN0U3VpdGUobnVsbCk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIgPSBuZXcgU3R1YlRlc3RCcm93c2VyQ29udHJvbGxlcigpOwotICAgICAgICBTZXJ2aWNlTG9jYXRvci5zZXRUZXN0QnJvd3NlckNvbnRyb2xsZXIobVRlc3RCcm93c2VyQ29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG1UZXN0QnJvd3NlckFjdGl2aXR5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5LmZpbmlzaCgpOwotICAgICAgICB9Ci0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gbnVsbDsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaXN0Q29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5zZXRUb3BUZXN0U3VpdGUobmV3IFRlc3RTdWl0ZSgpKTsKLQotICAgICAgICBtVGVzdEJyb3dzZXJBY3Rpdml0eSA9IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLSAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcgPSBnZXRMaXN0VmlldygpOwotICAgICAgICAvLyBUaGVyZSBpcyBhbHdheXMgYW4gaXRlbSBvbiB0aGUgbGlzdCBmb3IgcnVubmluZyBhbGwgdGVzdHMuCi0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgaXRlbXMgb24gbGlzdCB2aWV3LiIsIDEsIGxpc3RWaWV3LmdldENvdW50KCkpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiU3R1YmJlZCBUZXN0IEJyb3dzZXIiLCBtVGVzdEJyb3dzZXJBY3Rpdml0eS5nZXRUaXRsZSgpLnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVMaXN0Q29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgiQWxsVGVzdHMiKTsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKGNyZWF0ZVRlc3RTdWl0ZSh0ZXN0Q2FzZU5hbWVzKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBjcmVhdGVBY3Rpdml0eSgpOwotCi0gICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKLSAgICAgICAgYXNzZXJ0TGlzdFZpZXdDb250ZW50cyh0ZXN0Q2FzZU5hbWVzLCBsaXN0Vmlldyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdExpc3RXaXRoVGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0ZXN0Q2FzZU5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCJBbGxUZXN0cyIsICJBcHBsZXMiLCAiQmFuYW5hcyIsICJPcmFuZ2VzIik7Ci0gICAgICAgIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LnNldFRvcFRlc3RTdWl0ZShjcmVhdGVUZXN0U3VpdGUodGVzdENhc2VOYW1lcykpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHkoKTsKLQotICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7Ci0gICAgICAgIGFzc2VydExpc3RWaWV3Q29udGVudHModGVzdENhc2VOYW1lcywgbGlzdFZpZXcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0V2l0aFRlc3RTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdChPbmVUZXN0VGVzdENhc2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKG5ldyBPbmVUZXN0SW5UZXN0U3VpdGUoKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBjcmVhdGVBY3Rpdml0eSgpOwotCi0gICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKLSAgICAgICAgYXNzZXJ0TGlzdFZpZXdDb250ZW50cyh0ZXN0Q2FzZU5hbWVzLCBsaXN0Vmlldyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdEFUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gdGVzdENhc2VOYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdCgiQWxsVGVzdHMiKTsKLSAgICAgICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IGNyZWF0ZVRlc3RTdWl0ZSh0ZXN0Q2FzZU5hbWVzKTsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKHRlc3RTdWl0ZSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUZXN0Q2FzZShPbmVUZXN0VGVzdENhc2UuY2xhc3MpOwotICAgICAgICBtVGVzdEJyb3dzZXJBY3Rpdml0eSA9IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLSAgICAgICAgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5TW9uaXRvciBhY3Rpdml0eU1vbml0b3IgPSBnZXRJbnN0cnVtZW50YXRpb24oKS5hZGRNb25pdG9yKAotICAgICAgICAgICAgICAgIFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwuVEVTVF9SVU5ORVJfQUNUSVZJVFlfQ0xBU1NfTkFNRSwgbnVsbCwgZmFsc2UpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFjdGl2aXR5TW9uaXRvci5nZXRIaXRzKCkpOwotCi0gICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldyA9IGdldExpc3RWaWV3KCk7Ci0gICAgICAgICAgICBpbnQgaW52b2tlZFRlc3RDYXNlSW5kZXggPSAwOwotICAgICAgICAgICAgbGlzdFZpZXcucGVyZm9ybUl0ZW1DbGljayhsaXN0VmlldywgaW52b2tlZFRlc3RDYXNlSW5kZXgsIDApOwotCi0gICAgICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IGFjdGl2aXR5TW9uaXRvci53YWl0Rm9yQWN0aXZpdHlXaXRoVGltZW91dCgyMDAwKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYWN0aXZpdHkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWN0aXZpdHlNb25pdG9yLmdldEhpdHMoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludm9rZWRUZXN0Q2FzZUluZGV4LCBtVGVzdEJyb3dzZXJDb250cm9sbGVyLmdldExhc3RQb3NpdGlvbigpKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgYWN0aXZpdHkuZmluaXNoKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5yZW1vdmVNb25pdG9yKGFjdGl2aXR5TW9uaXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRnJvbUludGVudFdpdGhPbmVUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0ZXN0Q2FzZU5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCJ0ZXN0T25lIik7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBsYXVuY2hUZXN0QnJvd3NlckFjdGl2aXR5KG5ldyBUZXN0U3VpdGUoT25lVGVzdFRlc3RDYXNlLmNsYXNzKSk7Ci0KLSAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcgPSBnZXRMaXN0VmlldygpOwotICAgICAgICBhc3NlcnRMaXN0Vmlld0NvbnRlbnRzKHRlc3RDYXNlTmFtZXMsIGxpc3RWaWV3KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTGlzdE9uU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuc2V0VG9wVGVzdFN1aXRlKG5ldyBUZXN0U3VpdGUoKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBjcmVhdGVBY3Rpdml0eSgpOwotCi0gICAgICAgIExpc3RWaWV3IGxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBpdGVtcyBvbiBsaXN0IHZpZXcuIiwgMSwgbGlzdFZpZXcuZ2V0Q291bnQoKSk7Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IHRlc3RDYXNlTmFtZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoIkFsbFRlc3RzIik7Ci0gICAgICAgIFN0dWJUZXN0QnJvd3NlckFjdGl2aXR5LnNldFRvcFRlc3RTdWl0ZShjcmVhdGVUZXN0U3VpdGUodGVzdENhc2VOYW1lcykpOwotCi0gICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLnJ1bk9uTWFpblN5bmMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICgoU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkpIG1UZXN0QnJvd3NlckFjdGl2aXR5KS5vblN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGxpc3RWaWV3ID0gZ2V0TGlzdFZpZXcoKTsKLSAgICAgICAgYXNzZXJ0TGlzdFZpZXdDb250ZW50cyh0ZXN0Q2FzZU5hbWVzLCBsaXN0Vmlldyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRpdGxlSGFzVGVzdFN1aXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFN1aXRlTmFtZSA9ICJjb20uYW5kcm9pZC5UZXN0U3VpdGUiOwotICAgICAgICBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5zZXRUb3BUZXN0U3VpdGUobmV3IFRlc3RTdWl0ZSh0ZXN0U3VpdGVOYW1lKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQWN0aXZpdHkgPSBjcmVhdGVBY3Rpdml0eSgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiVGVzdFN1aXRlIiwgbVRlc3RCcm93c2VyQWN0aXZpdHkuZ2V0VGl0bGUoKS50b1N0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBUZXN0U3VpdGUgY3JlYXRlVGVzdFN1aXRlKExpc3Q8U3RyaW5nPiB0ZXN0Q2FzZU5hbWVzKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVUZXN0U3VpdGUodGVzdENhc2VOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdGVzdENhc2VOYW1lcy5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUZXN0U3VpdGUgY3JlYXRlVGVzdFN1aXRlKFN0cmluZy4uLiB0ZXN0Q2FzZU5hbWVzKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHRlc3RDYXNlTmFtZSA6IHRlc3RDYXNlTmFtZXMpIHsKLSAgICAgICAgICAgIHRlc3RTdWl0ZS5hZGRUZXN0KG5ldyBGYWtlVGVzdENhc2UodGVzdENhc2VOYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdGVzdFN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFrZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotICAgICAgICBwdWJsaWMgRmFrZVRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT25lVGVzdFRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZVRlc3RJblRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoT25lVGVzdEluVGVzdFN1aXRlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoT25lVGVzdFRlc3RDYXNlLmNsYXNzKTsKLSAgICAgICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRMaXN0Vmlld0NvbnRlbnRzKExpc3Q8U3RyaW5nPiBleHBlY3RlZFRlc3RDYXNlTmFtZXMsIExpc3RWaWV3IGxpc3RWaWV3KSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiUnVuIEFsbCIsIGxpc3RWaWV3LmdldEl0ZW1BdFBvc2l0aW9uKDApLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGl0ZW1zIG9uIGxpc3Qgdmlldy4iLAotICAgICAgICAgICAgICAgIGV4cGVjdGVkVGVzdENhc2VOYW1lcy5zaXplKCkgKyAxLCBsaXN0Vmlldy5nZXRDb3VudCgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRlc3RDYXNlTmFtZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFRlc3RDYXNlTmFtZSA9IGV4cGVjdGVkVGVzdENhc2VOYW1lcy5nZXQoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0dWFsVGVzdENhc2VOYW1lID0gbGlzdFZpZXcuZ2V0SXRlbUF0UG9zaXRpb24oaSArIDEpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdGVzdCBjYXNlIG5hbWUuIEluZGV4OiAiICsgaSwKLSAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRUZXN0Q2FzZU5hbWUsIGFjdHVhbFRlc3RDYXNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3RWaWV3IGdldExpc3RWaWV3KCkgewotICAgICAgICByZXR1cm4gbVRlc3RCcm93c2VyQWN0aXZpdHkuZ2V0TGlzdFZpZXcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRlc3RCcm93c2VyQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGxhdW5jaEFjdGl2aXR5KGdldEFuZHJvaWRQYWNrYWdlTmFtZSgpLCBTdHViVGVzdEJyb3dzZXJBY3Rpdml0eS5jbGFzcywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbnRlbnQgY3JlYXRlSW50ZW50KFRlc3RTdWl0ZSB0ZXN0U3VpdGUpIHsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9SVU4pOwotICAgICAgICBpbnRlbnQuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gU3R1YlRlc3RCcm93c2VyQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRBbmRyb2lkUGFja2FnZU5hbWUoKTsKLSAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLSAgICAgICAgaW50ZW50LnNldERhdGEoVXJpLnBhcnNlKHRlc3RTdWl0ZS5nZXROYW1lKCkpKTsKLSAgICAgICAgcmV0dXJuIGludGVudDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBbmRyb2lkUGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUZXN0QnJvd3NlckFjdGl2aXR5IGxhdW5jaFRlc3RCcm93c2VyQWN0aXZpdHkoVGVzdFN1aXRlIHRlc3RTdWl0ZSkKLSAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5zZXRJblRvdWNoTW9kZShmYWxzZSk7Ci0KLSAgICAgICAgVGVzdEJyb3dzZXJBY3Rpdml0eSBhY3Rpdml0eSA9Ci0gICAgICAgICAgICAgICAgKFRlc3RCcm93c2VyQWN0aXZpdHkpIGdldEluc3RydW1lbnRhdGlvbigpLnN0YXJ0QWN0aXZpdHlTeW5jKAotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlSW50ZW50KHRlc3RTdWl0ZSkpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS53YWl0Rm9ySWRsZVN5bmMoKTsKLSAgICAgICAgcmV0dXJuIGFjdGl2aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0dWJUZXN0QnJvd3NlckNvbnRyb2xsZXIgZXh0ZW5kcyBUZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBvc2l0aW9uOwotICAgICAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBUZXN0Q2FzZT4gbVRlc3RDYXNlQ2xhc3M7Ci0KLSAgICAgICAgcHVibGljIEludGVudCBnZXRJbnRlbnRGb3JUZXN0QXQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbjsKLQotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoKTsKLSAgICAgICAgICAgIGludGVudC5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9SVU4pOwotCi0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbC5URVNUX1JVTk5FUl9BQ1RJVklUWV9DTEFTU19OQU1FOwotICAgICAgICAgICAgU3RyaW5nIHRlc3ROYW1lID0gbVRlc3RDYXNlQ2xhc3MuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikpOwotICAgICAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIGludGVudC5zZXREYXRhKFVyaS5wYXJzZSh0ZXN0TmFtZSkpOwotCi0gICAgICAgICAgICByZXR1cm4gaW50ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGVzdENhc2UoQ2xhc3M8PyBleHRlbmRzIFRlc3RDYXNlPiB0ZXN0Q2FzZUNsYXNzKSB7Ci0gICAgICAgICAgICBtVGVzdENhc2VDbGFzcyA9IHRlc3RDYXNlQ2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldExhc3RQb3NpdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9zaXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlckltcGxUZXN0LmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyQ29udHJvbGxlckltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMTU2MDYuLjAwMDAwMDAKLS0tIGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcml2YXRlIFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwgbVRlc3RCcm93c2VyQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIFRlc3RCcm93c2VyVmlld1N0dWIgbVRlc3RCcm93c2VyVmlldzsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIgPSBuZXcgVGVzdEJyb3dzZXJDb250cm9sbGVySW1wbCgpOwotICAgICAgICBtVGVzdEJyb3dzZXJWaWV3ID0gbmV3IFRlc3RCcm93c2VyVmlld1N0dWIoKTsKLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5yZWdpc3RlclZpZXcobVRlc3RCcm93c2VyVmlldyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNldFRlc3RTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB0ZXN0U3VpdGUuYWRkVGVzdFN1aXRlKER1bW15VGVzdENhc2UuY2xhc3MpOwotCi0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGVzdFN1aXRlKHRlc3RTdWl0ZSk7Ci0KLSAgICAgICAgdmVyaWZ5VGVzdE5hbWVzKEFycmF5cy5hc0xpc3QoIlJ1biBBbGwiLCBEdW1teVRlc3RDYXNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSksCi0gICAgICAgICAgICAgICAgbVRlc3RCcm93c2VyVmlldy5nZXRUZXN0TmFtZXMoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlUZXN0TmFtZXMoTGlzdDxTdHJpbmc+IGV4cGVjdGVkVGVzdE5hbWVzLAotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFjdHVhbFRlc3ROYW1lcykgewotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUZXN0TmFtZXMuc2l6ZSgpLCBhY3R1YWxUZXN0TmFtZXMuc2l6ZSgpKTsKLQotICAgICAgICAvLyBXZSB1c2UgZW5kc1dpdGggaW5zdGVhZCBvZiBlcXVhbHMgYmVjYXVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mCi0gICAgICAgIC8vIGNsYXNzLmdldFNpbXBsZU5hbWUoKSwgd2hlbiBjYWxsZWQgb24gYW4gaW5uZXIgY2xhc3MsIHZhcmllcwotICAgICAgICAvLyBmcm9tIG9uZSB2bSB0byBhbm90aGVyLgotICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgdGVzdCB0byBwYXNzIGluIG11bHRpcGxlIGVudmlyb25tZW50cy4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRlc3ROYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhY3R1YWxUZXN0TmFtZXMuZ2V0KGkpLmVuZHNXaXRoKGV4cGVjdGVkVGVzdE5hbWVzLmdldChpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEludGVudEZvclRlc3RTdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBUZXN0U3VpdGUgdGVzdFN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICB0ZXN0U3VpdGUuYWRkVGVzdFN1aXRlKER1bW15VGVzdENhc2UuY2xhc3MpOwotCi0gICAgICAgIFN0cmluZyB0YXJnZXRCcm93c2VyQWN0dml0eUNsYXNzTmFtZSA9ICJjb20uYW5kcm9pZC5ib2d1cy5EdW1teUFjdGl2aXR5IjsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGFyZ2V0UGFja2FnZU5hbWUgPSAiY29tLmFuZHJvaWQuYm9ndXMiOwotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnNldFRhcmdldEJyb3dzZXJBY3Rpdml0eUNsYXNzTmFtZSh0YXJnZXRCcm93c2VyQWN0dml0eUNsYXNzTmFtZSk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGVzdFN1aXRlKHRlc3RTdWl0ZSk7Ci0gICAgICAgIG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuc2V0VGFyZ2V0UGFja2FnZU5hbWUoZXhwZWN0ZWRUYXJnZXRQYWNrYWdlTmFtZSk7Ci0gICAgICAgIEludGVudCBpbnRlbnQgPSBtVGVzdEJyb3dzZXJDb250cm9sbGVyLmdldEludGVudEZvclRlc3RBdCgxKTsKLSAgICAgICAgdmVyaWZ5SW50ZW50KGludGVudCwgRHVtbXlUZXN0Q2FzZS5jbGFzcywgZXhwZWN0ZWRUYXJnZXRQYWNrYWdlTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0YXJnZXRCcm93c2VyQWN0dml0eUNsYXNzTmFtZSwgaW50ZW50LmdldENvbXBvbmVudCgpLmdldENsYXNzTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZW50Rm9yVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgVGVzdFN1aXRlIHRlc3RTdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgdGVzdFN1aXRlLmFkZFRlc3QobmV3IER1bW15VGVzdENhc2UoKSk7Ci0KLSAgICAgICAgbVRlc3RCcm93c2VyQ29udHJvbGxlci5zZXRUZXN0U3VpdGUodGVzdFN1aXRlKTsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG1UZXN0QnJvd3NlckNvbnRyb2xsZXIuZ2V0SW50ZW50Rm9yVGVzdEF0KDEpOwotICAgICAgICB2ZXJpZnlJbnRlbnQoaW50ZW50LCBEdW1teVRlc3RDYXNlLmNsYXNzLCAiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RCcm93c2VyQ29udHJvbGxlckltcGwuVEVTVF9SVU5ORVJfQUNUSVZJVFlfQ0xBU1NfTkFNRSwKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0Q29tcG9uZW50KCkuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3REdW1teVRlc3QiLAotICAgICAgICAgICAgICAgIGludGVudC5nZXRTdHJpbmdFeHRyYShUZXN0QnJvd3NlckNvbnRyb2xsZXIuQlVORExFX0VYVFJBX1RFU1RfTUVUSE9EX05BTUUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50ZW50Rm9yUnVuQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgRHVtbXlUZXN0U3VpdGUoKTsKLSAgICAgICAgdGVzdFN1aXRlLmFkZFRlc3RTdWl0ZShEdW1teVRlc3RDYXNlLmNsYXNzKTsKLQotICAgICAgICBtVGVzdEJyb3dzZXJDb250cm9sbGVyLnNldFRlc3RTdWl0ZSh0ZXN0U3VpdGUpOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbVRlc3RCcm93c2VyQ29udHJvbGxlci5nZXRJbnRlbnRGb3JUZXN0QXQoMCk7Ci0gICAgICAgIHZlcmlmeUludGVudChpbnRlbnQsIER1bW15VGVzdFN1aXRlLmNsYXNzLCAiY29tLmFuZHJvaWQudGVzdGhhcm5lc3MiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUludGVudChJbnRlbnQgaW50ZW50LCBDbGFzcyB0ZXN0Q2xhc3MsIFN0cmluZyBleHBlY3RlZFBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhJbnRlbnQuQUNUSU9OX1JVTiwgaW50ZW50LmdldEFjdGlvbigpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVudC5GTEFHX0FDVElWSVRZX05FV19UQVNLLAotICAgICAgICAgICAgICAgIGludGVudC5nZXRGbGFncygpICYgSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOwotICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZW50LkZMQUdfQUNUSVZJVFlfTVVMVElQTEVfVEFTSywKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0RmxhZ3MoKSAmIEludGVudC5GTEFHX0FDVElWSVRZX01VTFRJUExFX1RBU0spOwotICAgICAgICBhc3NlcnRFcXVhbHModGVzdENsYXNzLmdldE5hbWUoKSwgaW50ZW50LmdldERhdGEoKS50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGFja2FnZU5hbWUsIGludGVudC5nZXRDb21wb25lbnQoKS5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEdW1teVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0gICAgICAgIHByaXZhdGUgRHVtbXlUZXN0U3VpdGUoKSB7Ci0gICAgICAgICAgICBzdXBlcihEdW1teVRlc3RTdWl0ZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVtbXlUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAgICAgcHJpdmF0ZSBEdW1teVRlc3RDYXNlKCkgewotICAgICAgICAgICAgc3VwZXIoInRlc3REdW1teVRlc3QiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3REdW1teVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVGVzdEJyb3dzZXJWaWV3U3R1YiBpbXBsZW1lbnRzIFRlc3RCcm93c2VyVmlldyB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXN0TmFtZXM7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGVzdE5hbWVzKExpc3Q8U3RyaW5nPiB0ZXN0TmFtZXMpIHsKLSAgICAgICAgICAgIG1UZXN0TmFtZXMgPSB0ZXN0TmFtZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFRlc3ROYW1lcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVGVzdE5hbWVzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvdGVzdHMvc3JjL2FuZHJvaWQvdGVzdC9UZXN0QnJvd3NlclRlc3RzLmphdmEgYi90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1ZTJmOC4uMDAwMDAwMAotLS0gYS90ZXN0LXJ1bm5lci90ZXN0cy9zcmMvYW5kcm9pZC90ZXN0L1Rlc3RCcm93c2VyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotCi1wYWNrYWdlIGFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QnJvd3NlclRlc3RzIGV4dGVuZHMgVGVzdEJyb3dzZXJBY3Rpdml0eSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGVzdFN1aXRlIGdldFRvcFRlc3RTdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIHN1aXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0U3VpdGUgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSB0ZXN0U3VpdGUgPSBuZXcgVGVzdFN1aXRlKFRlc3RCcm93c2VyVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgdGVzdFN1aXRlLmFkZFRlc3RTdWl0ZShUZXN0QnJvd3NlckNvbnRyb2xsZXJJbXBsVGVzdC5jbGFzcyk7Ci0gICAgICAgIHRlc3RTdWl0ZS5hZGRUZXN0U3VpdGUoVGVzdENhc2VVdGlsVGVzdC5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIHRlc3RTdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaWZpU3RhdGVUcmFja2VyLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvV2lmaVN0YXRlVHJhY2tlci5qYXZhCnJlbmFtZSB0byB0ZXN0cy9CaURpVGVzdHMvQW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCA4YTc3NTE5Li40YTY4N2YyIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90ZXN0cy9CaURpVGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTksNyArMTksNyBAQAogICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCiAgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIj4KIAotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJCaURpVGVzdHMiPgorICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJCaURpVGVzdHMiIGFuZHJvaWQ6aGFyZHdhcmVBY2NlbGVyYXRlZD0idHJ1ZSI+CiAKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0QWN0aXZpdHkiCiAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzSGlkZGVuIj4KQEAgLTI5LDM0ICsyOSw2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0QmFzaWNBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuQmlEaVRlc3RDYW52YXNBY3Rpdml0eSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6d2luZG93U29mdElucHV0TW9kZT0ic3RhdGVBbHdheXNIaWRkZW4iPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5CaURpVGVzdExpbmVhckxheW91dEx0ckFjdGl2aXR5IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp3aW5kb3dTb2Z0SW5wdXRNb2RlPSJzdGF0ZUFsd2F5c0hpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLkJpRGlUZXN0TGluZWFyTGF5b3V0UnRsQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOndpbmRvd1NvZnRJbnB1dE1vZGU9InN0YXRlQWx3YXlzSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQogICAgIDwvYXBwbGljYXRpb24+CiAKLTwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2Jhc2ljLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2Jhc2ljLnhtbAppbmRleCBjNDgwN2ZmLi5kNDM4YjJjIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9iYXNpYy54bWwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvYmFzaWMueG1sCkBAIC0xNCwzNyArMTQsNDEgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhc2ljIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgogCi0gICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvbkJ1dHRvbkNsaWNrIgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl90ZXh0IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgotICAgICAgICAvPgotCi0gICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VkaXR0ZXh0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvYnV0dG9uIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VkaXR0ZXh0IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKICAgICA8L0xpbmVhckxheW91dD4KIAotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9jYW52YXMueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvY2FudmFzLnhtbAppbmRleCA3NzAwN2FmMy4uMDMxOWE4MyAxMDA2NDQKLS0tIGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvY2FudmFzLnhtbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9jYW52YXMueG1sCkBAIC0xNCwyMSArMTQsMjcgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhbnZhcyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KIAotICAgIDxTZWVrQmFyIGFuZHJvaWQ6aWQ9IkAraWQvc2Vla2JhciIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgIC8+CisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CiAKLSAgICA8dmlldyBjbGFzcz0iY29tLmFuZHJvaWQuYmlkaS5CaURpVGVzdFZpZXciCi0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGVzdHZpZXciCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAiCi0gICAgLz4KKyAgICAgICAgPFNlZWtCYXIgYW5kcm9pZDppZD0iQCtpZC9zZWVrYmFyIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAvPgogCi08L0xpbmVhckxheW91dD4KKyAgICAgICAgPHZpZXcgY2xhc3M9ImNvbS5hbmRyb2lkLmJpZGkuQmlEaVRlc3RWaWV3IgorICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Rlc3R2aWV3IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwIgorICAgICAgICAgICAgICAgIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9jdXN0b21fbGlzdF9pdGVtLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2N1c3RvbV9saXN0X2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OTQyNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9jdXN0b21fbGlzdF9pdGVtLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90ZXh0MSIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgorICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9hY3RpdmF0ZWRCYWNrZ3JvdW5kSW5kaWNhdG9yIgorLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9sb2NhbGUueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvZnJhbWVfbGF5b3V0X2xvY2FsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4MjIzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9sb2NhbGUueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhbWVfbGF5b3V0X2xvY2FsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiPgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGMDAwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDBGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRkZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8c3RhcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGRkYiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxlbmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxzdGFydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGODg4ODg4Ij4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgIDwvRnJhbWVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9mcmFtZV9sYXlvdXRfbHRyLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9sdHIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YWU5MTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvZnJhbWVfbGF5b3V0X2x0ci54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFtZV9sYXlvdXRfbHRyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCI+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkYwMDAwIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMEZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGRkYiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxzdGFydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHN0YXJ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRkZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218ZW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkY4ODg4ODgiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgPC9GcmFtZUxheW91dD4KKworPC9GcmFtZUxheW91dD4KZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9ydGwueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvZnJhbWVfbGF5b3V0X3J0bC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0OTA0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2ZyYW1lX2xheW91dF9ydGwueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnJhbWVfbGF5b3V0X3J0bCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCIKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiPgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InJpZ2h0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGMDAwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0ibGVmdHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDBGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRkZGIj4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8c3RhcnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGRkYiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxlbmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkZGRkZGMDAiPgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxzdGFydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWx8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGODg4ODg4Ij4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgIDwvRnJhbWVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X2xvY2FsZS54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X2xvY2FsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkYjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2xpbmVhcl9sYXlvdXRfbG9jYWxlLnhtbApAQCAtMCwwICsxLDI1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9saW5lYXJfbGF5b3V0X2xvY2FsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKyAgICAgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJpbmhlcml0Ij4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJydGwiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJpbmhlcml0Ij4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X2x0ci54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X2x0ci54bWwKaW5kZXggYTk1ZmIwZS4uMDYwMTEyZCAxMDA2NDQKLS0tIGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvbGluZWFyX2xheW91dF9sdHIueG1sCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2xpbmVhcl9sYXlvdXRfbHRyLnhtbApAQCAtMTQsMTczICsxNCwyNDAgQEAKICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9sYXlvdXR0ZXN0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJsdHIiPgotCi0gICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249ImluaGVyaXQiPgotCi0gICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgotICAgICAgICAvPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgLz4KLQorPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9saW5lYXJfbGF5b3V0X2x0ciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKyAgICAgICAgCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJpbmhlcml0Ij4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJydGwiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJpbmhlcml0Ij4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKICAgICA8L0xpbmVhckxheW91dD4KIAotICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJsdHIiPgotCi0gICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgotICAgICAgICAvPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgLz4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249InJ0bCI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAvPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249ImluaGVyaXQiPgotCi0gICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgotICAgICAgICAvPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgLz4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJsdHIiPgotCi0gICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgotICAgICAgICAvPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgLz4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpob3Jpem9udGFsRGlyZWN0aW9uPSJydGwiPgotCi0gICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgotICAgICAgICAvPgotCi0gICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgLz4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L0ZyYW1lTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2xpbmVhcl9sYXlvdXRfcnRsLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L2xpbmVhcl9sYXlvdXRfcnRsLnhtbAppbmRleCAwZDYwOTUwLi41M2VjYmNjIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9saW5lYXJfbGF5b3V0X3J0bC54bWwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvbGluZWFyX2xheW91dF9ydGwueG1sCkBAIC0xNCwxNzMgKzE0LDI0MCBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAK2lkL2xheW91dHRlc3QiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249InJ0bCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0iaW5oZXJpdCI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAvPgotCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpbmVhcl9sYXlvdXRfcnRsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgICAgICAKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImluaGVyaXQiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImluaGVyaXQiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0icnRsIj4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGV4dHZpZXciCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy90ZXh0dmlld190ZXh0IgorICAgICAgICAgICAgICAgICAgICAvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAogICAgIDwvTGluZWFyTGF5b3V0PgogCi0gICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249Imx0ciI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAvPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0icnRsIj4KLQotICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RleHR2aWV3IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvdGV4dHZpZXdfdGV4dCIKLSAgICAgICAgLz4KLQotICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgIC8+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6aG9yaXpvbnRhbERpcmVjdGlvbj0iaW5oZXJpdCI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAvPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249Imx0ciI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAvPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmhvcml6b250YWxEaXJlY3Rpb249InJ0bCI+Ci0KLSAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCi0gICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIzMmRpcCIKLSAgICAgICAgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC90ZXh0dmlldyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjMyZGlwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3RleHR2aWV3X3RleHQiCi0gICAgICAgIC8+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMzJkaXAiCi0gICAgICAgICAvPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvRnJhbWVMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9tYWluLnhtbAppbmRleCBlMzlkMWQ2Li4zNTQzZWI3IDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9tYWluLnhtbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9tYWluLnhtbApAQCAtMTQsMjggKzE0LDIwIEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxUYWJIb3N0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90YWJob3N0IgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCiAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CiAKLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvdGVzdGxpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIAogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjVkcCI+CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIvPgogCi0gICAgICAgIDxUYWJXaWRnZXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3RhYnMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKyAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC90ZXN0ZnJhbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIAorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjYiPgorICAgIDwvRnJhbWVMYXlvdXQ+CiAKLSAgICAgICAgPEZyYW1lTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90YWJjb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iNWRwIiAvPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvVGFiSG9zdD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0XzJfbG9jYWxlLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF8yX2xvY2FsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1YmY3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF8yX2xvY2FsZS54bWwKQEAgLTAsMCArMSwxODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVsYXRpdmVfbGF5b3V0XzJfbG9jYWxlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4Ij4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfMSIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6Ii8+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzEiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfMSIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfMSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfMSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzEiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfMSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8yIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiLz4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMiIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8yIi8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18yIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8yIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIi8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfMiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18yIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImluaGVyaXQiPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfMyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6Ii8+CisgICAgCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV8zIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzMiLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18zIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8zIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIi8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzMiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfMyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJydGwiPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF80IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiLz4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfNCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF80Ii8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va180IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV80IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIi8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va180IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSI+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF80IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiLz4KKyAgICAKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfNCIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va180IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIi8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworPC9GcmFtZUxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfMl9sdHIueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0XzJfbHRyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjU4NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0XzJfbHRyLnhtbApAQCAtMCwwICsxLDE4MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZWxhdGl2ZV9sYXlvdXRfMl9sdHIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwcHgiPgorCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8xIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiLz4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMSIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8xIi8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va18xIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV8xIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIi8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfMSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18xIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzIiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIvPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV8yIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzIiLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va18yIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIi8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0iaW5oZXJpdCI+CisgICAgCisgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9sYWJlbF8zIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlR5cGUgaGVyZToiLz4KKyAgICAKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzMiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfMyIvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzMiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzMiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfMyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va18zIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMHB4IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIvPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV80IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzQiLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va180IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIi8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIvPgorICAgIAorICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfNCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF80Ii8+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9va180IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9lbnRyeV80IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMHB4IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik9LIi8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3JlbGF0aXZlX2xheW91dF8yX3J0bC54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfMl9ydGwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOWYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfMl9ydGwueG1sCkBAIC0wLDAgKzEsMTgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JlbGF0aXZlX2xheW91dF8yX3J0bCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0icnRsIj4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCI+CisKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzEiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIvPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV8xIgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzEiLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzEiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzEiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va18xIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzEiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIi8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfMiIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6Ii8+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzIiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfMiIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfMiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfMiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzIiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfMiIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJpbmhlcml0Ij4KKyAgICAKKyAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL2xhYmVsXzMiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iVHlwZSBoZXJlOiIvPgorICAgIAorICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvZW50cnlfMyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9sYWJlbF8zIi8+CisgICAgCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfMyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfMyIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIvPgorICAgIAorICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9MZWZ0T2Y9IkBpZC9va18zIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblRvcD0iQGlkL29rXzMiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2FuY2VsIi8+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0icnRsIj4KKworICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfNCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6Ii8+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL2VudHJ5XzQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbGFiZWxfNCIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvb2tfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvZW50cnlfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJPSyIvPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL29rXzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduVG9wPSJAaWQvb2tfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiLz4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTBweCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorICAgIAorICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbGFiZWxfNCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJUeXBlIGhlcmU6Ii8+CisgICAgCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9lbnRyeV80IgorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2xhYmVsXzQiLz4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL29rXzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL2VudHJ5XzQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjEwcHgiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iT0siLz4KKyAgICAKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvb2tfNCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25Ub3A9IkBpZC9va180IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCIvPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0X2x0ci54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfbHRyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjFlYzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0X2x0ci54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZWxhdGl2ZV9sYXlvdXRfbHRyIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCI+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkYwMDAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMEZGIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxzdGFydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHN0YXJ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRkZGIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218ZW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkY4ODg4ODgiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorICAgIAorICAgIDwvRnJhbWVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0X3J0bC54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC9yZWxhdGl2ZV9sYXlvdXRfcnRsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDVkMTZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvcmVsYXRpdmVfbGF5b3V0X3J0bC54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEZyYW1lTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yZWxhdGl2ZV9sYXlvdXRfcnRsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0icnRsIgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDAwMCI+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHR8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkYwMDAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0fGNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMEZGIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGRkYiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorCisgICAgICAgIDxSZWxhdGl2ZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxzdGFydCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkZGRiI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGVuZCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRkZGRkYwMCI+CisgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+CisKKyAgICAgICAgPFJlbGF0aXZlTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHN0YXJ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRkZGIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218ZW5kIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGRkZGRjAwIj4KKyAgICAgICAgPC9SZWxhdGl2ZUxheW91dD4KKworICAgICAgICA8UmVsYXRpdmVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbHxjZW50ZXJfdmVydGljYWwiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkY4ODg4ODgiPgorICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgorICAgIAorICAgIDwvRnJhbWVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvdGFibGVfbGF5b3V0X2xvY2FsZS54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC90YWJsZV9sYXlvdXRfbG9jYWxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDJhZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvdGFibGVfbGF5b3V0X2xvY2FsZS54bWwKQEAgLTAsMCArMSwyNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGFibGVfbGF5b3V0X2xvY2FsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIj4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImluaGVyaXQiPgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9yaWdodF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYWZ0ZXJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJlbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9iZWZvcmVfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJzdGFydCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorICAgICAgICA8L1RhYmxlTGF5b3V0PgorCisgICAgICAgIDxUYWJsZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9hZnRlcl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImVuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9sZWZ0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InN0YXJ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisgICAgICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICAgICAgPFRhYmxlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RyZXRjaENvbHVtbnM9IjEsMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9yaWdodF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYWZ0ZXJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJlbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9iZWZvcmVfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJzdGFydCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorICAgICAgICA8L1RhYmxlTGF5b3V0PgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvdGFibGVfbGF5b3V0X2x0ci54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC90YWJsZV9sYXlvdXRfbHRyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMwODE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvdGFibGVfbGF5b3V0X2x0ci54bWwKQEAgLTAsMCArMSwyNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGFibGVfbGF5b3V0X2x0ciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIj4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImluaGVyaXQiPgorICAgIAorICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisgICAgCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9yaWdodF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYWZ0ZXJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJlbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9iZWZvcmVfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJzdGFydCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorICAgICAgICA8L1RhYmxlTGF5b3V0PgorCisgICAgICAgIDxUYWJsZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0icnRsIj4KKyAgICAKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9hZnRlcl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImVuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9sZWZ0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InN0YXJ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisgICAgICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICAgICAgPFRhYmxlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RyZXRjaENvbHVtbnM9IjEsMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsb2NhbGUiPgorICAgIAorICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3RhYmxlX2xheW91dF9ydGwueG1sIGIvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvdGFibGVfbGF5b3V0X3J0bC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlMDk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3RhYmxlX2xheW91dF9ydGwueG1sCkBAIC0wLDAgKzEsMjU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RhYmxlX2xheW91dF9ydGwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+CisKKyAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisKKyAgICAgICAgPFRhYmxlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RyZXRjaENvbHVtbnM9IjEsMiI+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9hZnRlcl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImVuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9sZWZ0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InN0YXJ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisgICAgICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICAgICAgPFRhYmxlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RyZXRjaENvbHVtbnM9IjEsMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJpbmhlcml0Ij4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgICAgICA8VGFibGVMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzdHJldGNoQ29sdW1ucz0iMSwyIgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249Imx0ciI+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24xX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX3JpZ2h0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9hZnRlcl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImVuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMl90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9sZWZ0X3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2JlZm9yZV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InN0YXJ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisgICAgICAgIDwvVGFibGVMYXlvdXQ+CisKKyAgICAgICAgPFRhYmxlTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3RyZXRjaENvbHVtbnM9IjEsMiIKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJydGwiPgorCisgICAgICAgICAgICA8VGFibGVSb3c+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uMV90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9yaWdodF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYWZ0ZXJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJlbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjJfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fbGVmdF90ZXh0IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjRkaXAiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbl9iZWZvcmVfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJzdGFydCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICA8L1RhYmxlUm93PgorICAgICAgICA8L1RhYmxlTGF5b3V0PgorCisgICAgICAgIDxUYWJsZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnN0cmV0Y2hDb2x1bW5zPSIxLDIiCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIj4KKworICAgICAgICAgICAgPFRhYmxlUm93PgorICAgICAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2J1dHRvbjFfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fcmlnaHRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2FmdGVyX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iZW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgIDwvVGFibGVSb3c+CisKKyAgICAgICAgICAgIDxUYWJsZVJvdz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b24yX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYnV0dG9uX2xlZnRfdGV4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjI0ZGlwIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgICAgICAgICAgICAgLz4KKyAgICAgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9idXR0b25fYmVmb3JlX3RleHQiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyNGRpcCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ic3RhcnQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9UYWJsZVJvdz4KKyAgICAgICAgPC9UYWJsZUxheW91dD4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3ZpZXdfcGFkZGluZy54bWwgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC92aWV3X3BhZGRpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTJkMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvcmVzL2xheW91dC92aWV3X3BhZGRpbmcueG1sCkBAIC0wLDAgKzEsMTU2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZXdfcGFkZGluZyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KKworICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGxlZnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkY4ODg4ODgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI0MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjMwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1MGRpcCI+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxsZWZ0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDBGRiI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218cmlnaHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRjAwIj4KKyAgICAgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGODg4ODg4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNDBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIzMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImluaGVyaXQiPgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8bGVmdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwRkYiPgorICAgICAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHJpZ2h0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxyaWdodCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjQwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMzBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjUwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8bGVmdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwRkYiPgorICAgICAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHJpZ2h0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxsZWZ0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGODg4ODg4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNDBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIzMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249InJ0bCI+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxsZWZ0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDBGRiI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218cmlnaHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRjAwIj4KKyAgICAgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGODg4ODg4IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNDBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIzMGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNTBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSI+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxsZWZ0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwMDBGRiI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218cmlnaHQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDBGRjAwIj4KKyAgICAgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICA8L0ZyYW1lTGF5b3V0PgorCis8L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3Jlcy9sYXlvdXQvdmlld19wYWRkaW5nX21peGVkLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3ZpZXdfcGFkZGluZ19taXhlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyZjU1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvbGF5b3V0L3ZpZXdfcGFkZGluZ19taXhlZC54bWwKQEAgLTAsMCArMSwxMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlld19wYWRkaW5nX21peGVkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorCisgICAgPEZyYW1lTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8bGVmdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjQwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1N0YXJ0PSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMzBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjUwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8bGVmdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwRkYiPgorICAgICAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHJpZ2h0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9InRvcHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjQwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0VuZD0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjMwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGxlZnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMEZGIj4KKyAgICAgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGMDAiPgorICAgICAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMzAwZHAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIzMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b218bGVmdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjQwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1N0YXJ0PSI1ZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMzBkaXAiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjUwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJydGwiPgorCisgICAgICAgICAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjEwMGRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3B8bGVmdCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMDAwRkYiPgorICAgICAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tfHJpZ2h0IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjAwRkYwMCI+CisgICAgICAgICAgICA8L0ZyYW1lTGF5b3V0PgorICAgICAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIzMDBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMwMGRwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IiNGRjg4ODg4OCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjIwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjQwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0VuZD0iNWRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjMwZGlwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1MGRpcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0icnRsIj4KKworICAgICAgICAgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIxMDBkcCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wfGxlZnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0ZGMDAwMEZGIj4KKyAgICAgICAgICAgIDwvRnJhbWVMYXlvdXQ+CisKKyAgICAgICAgICAgIDxGcmFtZUxheW91dAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTAwZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbXxyaWdodCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjRkYwMEZGMDAiPgorICAgICAgICAgICAgPC9GcmFtZUxheW91dD4KKyAgICAgICAgPC9GcmFtZUxheW91dD4KKworICAgIDwvRnJhbWVMYXlvdXQ+CisKKzwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDM3OTVkNGIuLmQwNjdlN2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0JpRGlUZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0xNiw2ICsxNiwxMiBAQAogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uX3RleHQiPkJ1dHRvbjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uMV90ZXh0Ij5CdXR0b24xPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJidXR0b24yX3RleHQiPkJ1dHRvbjI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbjNfdGV4dCI+QnV0dG9uMzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYnV0dG9uNF90ZXh0Ij5CdXR0b240PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJidXR0b25fcmlnaHRfdGV4dCI+UmlnaHQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9hZnRlcl90ZXh0Ij5FbmQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9sZWZ0X3RleHQiPkxlZnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9iZWZvcmVfdGV4dCI+U3RhcnQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJ1dHRvbl9yZXF1ZXN0bGF5b3V0X3RleHQiPlJlcXVlc3QgTGF5b3V0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXh0dmlld190ZXh0Ij5UaGlzIGlzIGEgdGV4dCBmb3IgYSBUZXh0Vmlldzwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWRpdHRleHRfdGV4dCI+bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tPC9zdHJpbmc+CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0QWN0aXZpdHkuamF2YQppbmRleCAwZDliNGY3Li5jNWUyMjczIDEwMDY0NAotLS0gYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEFjdGl2aXR5LmphdmEKQEAgLTE2LDEyICsxNiw1NiBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CiAKLWltcG9ydCBhbmRyb2lkLmFwcC5UYWJBY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRhYkhvc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1wdWJsaWMgY2xhc3MgQmlEaVRlc3RBY3Rpdml0eSBleHRlbmRzIFRhYkFjdGl2aXR5IHsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUFkYXB0ZXI7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DTEFTUyA9ICJjbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJ0aXRsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GUkFHTUVOVF9JRCA9ICJpZCI7CisgICAgCisgICAgcHJpdmF0ZSBMaXN0VmlldyBtTGlzdDsKKyAgICAKKyAgICBwcml2YXRlIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbU9uQ2xpY2tMaXN0ZW5lciA9IAorICAgICAgICAgICAgbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgICAgICAgICBvbkxpc3RJdGVtQ2xpY2soKExpc3RWaWV3KXBhcmVudCwgdiwgcG9zaXRpb24sIGlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbHYsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIC8vIFNob3cgdGhlIHRlc3QKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0Pilsdi5nZXRJdGVtQXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIGludCBmcmFnbWVudElkID0gKEludGVnZXIpIG1hcC5nZXQoS0VZX0ZSQUdNRU5UX0lEKTsKKyAgICAgICAgRnJhZ21lbnQgZnJhZ21lbnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5maW5kRnJhZ21lbnRCeUlkKGZyYWdtZW50SWQpOworICAgICAgICBpZiAoZnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgRnJhZ21lbnQ+IGNsYXp6ID0gKENsYXNzPD8gZXh0ZW5kcyBGcmFnbWVudD4pIG1hcC5nZXQoS0VZX0NMQVNTKTsgIAorICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgdGVzdCBmcmFnbWVudCB3aXRoIHRoZSBuZXcgb25lCisgICAgICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLmJlZ2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBmdC5yZXBsYWNlKFIuaWQudGVzdGZyYW1lLCBmcmFnbWVudCk7CisgICAgICAgICAgICAgICAgZnQuc2V0VHJhbnNpdGlvbihGcmFnbWVudFRyYW5zYWN0aW9uLlRSQU5TSVRfRlJBR01FTlRfRkFERSk7CisgICAgICAgICAgICAgICAgZnQuY29tbWl0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewpAQCAtMjksMzAgKzczLDU1IEBACiAKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CiAKLSAgICAgICAgVGFiSG9zdCB0YWJIb3N0ID0gZ2V0VGFiSG9zdCgpOwotICAgICAgICBUYWJIb3N0LlRhYlNwZWMgc3BlYzsKLSAgICAgICAgSW50ZW50IGludGVudDsKKyAgICAgICAgbUxpc3QgPSAoTGlzdFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnRlc3RsaXN0KTsKKyAgICAgICAgbUxpc3Quc2V0Q2hvaWNlTW9kZShMaXN0Vmlldy5DSE9JQ0VfTU9ERV9TSU5HTEUpOworICAgICAgICBtTGlzdC5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIFNpbXBsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVBZGFwdGVyKHRoaXMsIGdldFRlc3RzKCksCisgICAgICAgICAgICAgICAgUi5sYXlvdXQuY3VzdG9tX2xpc3RfaXRlbSwgbmV3IFN0cmluZ1tdeyJ0aXRsZSJ9LAorICAgICAgICAgICAgICAgIG5ldyBpbnRbXXthbmRyb2lkLlIuaWQudGV4dDF9KTsKKyAgICAgICAgbUxpc3Quc2V0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgCisgICAgICAgIG1MaXN0LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobU9uQ2xpY2tMaXN0ZW5lcik7CisgICAgfQogCi0gICAgICAgIC8vIENyZWF0ZSBhbiBJbnRlbnQgdG8gbGF1bmNoIGFuIEFjdGl2aXR5IGZvciB0aGUgdGFiICh0byBiZSByZXVzZWQpCi0gICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDbGFzcyh0aGlzLCBCaURpVGVzdEJhc2ljQWN0aXZpdHkuY2xhc3MpOworICAgIHByaXZhdGUgdm9pZCBhZGRJdGVtKExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gZGF0YSwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgRnJhZ21lbnQ+IGNsYXp6LCBpbnQgZnJhZ21lbnRJZCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHRlbXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgdGVtcC5wdXQoS0VZX1RJVExFLCBuYW1lKTsKKyAgICAgICAgdGVtcC5wdXQoS0VZX0NMQVNTLCBjbGF6eik7CisgICAgICAgIHRlbXAucHV0KEtFWV9GUkFHTUVOVF9JRCwgZnJhZ21lbnRJZCk7CisgICAgICAgIGRhdGEuYWRkKHRlbXApOworICAgIH0KIAotICAgICAgICAvLyBJbml0aWFsaXplIGEgVGFiU3BlYyBmb3IgZWFjaCB0YWIgYW5kIGFkZCBpdCB0byB0aGUgVGFiSG9zdAotICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJiYXNpYyIpLnNldEluZGljYXRvcigiQmFzaWMiKS5zZXRDb250ZW50KGludGVudCk7Ci0gICAgICAgIHRhYkhvc3QuYWRkVGFiKHNwZWMpOworICAgIHByaXZhdGUgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBnZXRUZXN0cygpIHsKKyAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7CiAKLSAgICAgICAgLy8gRG8gdGhlIHNhbWUgZm9yIHRoZSBvdGhlciB0YWJzCi0gICAgICAgIGludGVudCA9IG5ldyBJbnRlbnQoKS5zZXRDbGFzcyh0aGlzLCBCaURpVGVzdENhbnZhc0FjdGl2aXR5LmNsYXNzKTsKLSAgICAgICAgc3BlYyA9IHRhYkhvc3QubmV3VGFiU3BlYygiY2FudmFzIikuc2V0SW5kaWNhdG9yKCJDYW52YXMiKS5zZXRDb250ZW50KGludGVudCk7Ci0gICAgICAgIHRhYkhvc3QuYWRkVGFiKHNwZWMpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIkJhc2ljIiwgQmlEaVRlc3RCYXNpYy5jbGFzcywgUi5pZC5iYXNpYyk7CisgICAgICAgIGFkZEl0ZW0ocmVzdWx0LCAiQ2FudmFzIiwgQmlEaVRlc3RDYW52YXMuY2xhc3MsIFIuaWQuY2FudmFzKTsKKyAgICAgICAgCisgICAgICAgIGFkZEl0ZW0ocmVzdWx0LCAiTGluZWFyIExUUiIsIEJpRGlUZXN0TGluZWFyTGF5b3V0THRyLmNsYXNzLCBSLmlkLmxpbmVhcl9sYXlvdXRfbHRyKTsKKyAgICAgICAgYWRkSXRlbShyZXN1bHQsICJMaW5lYXIgUlRMIiwgQmlEaVRlc3RMaW5lYXJMYXlvdXRSdGwuY2xhc3MsIFIuaWQubGluZWFyX2xheW91dF9ydGwpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIkxpbmVhciBMT0MiLCBCaURpVGVzdExpbmVhckxheW91dExvY2FsZS5jbGFzcywgUi5pZC5saW5lYXJfbGF5b3V0X2xvY2FsZSk7CisgICAgICAgIAorICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIkZyYW1lIExUUiIsIEJpRGlUZXN0RnJhbWVMYXlvdXRMdHIuY2xhc3MsIFIuaWQuZnJhbWVfbGF5b3V0X2x0cik7CisgICAgICAgIGFkZEl0ZW0ocmVzdWx0LCAiRnJhbWUgUlRMIiwgQmlEaVRlc3RGcmFtZUxheW91dFJ0bC5jbGFzcywgUi5pZC5mcmFtZV9sYXlvdXRfcnRsKTsKKyAgICAgICAgYWRkSXRlbShyZXN1bHQsICJGcmFtZSBMT0MiLCBCaURpVGVzdEZyYW1lTGF5b3V0TG9jYWxlLmNsYXNzLCBSLmlkLmZyYW1lX2xheW91dF9sb2NhbGUpOworICAgICAgICAKKyAgICAgICAgYWRkSXRlbShyZXN1bHQsICJSZWxhdGl2ZSBMVFIiLCBCaURpVGVzdFJlbGF0aXZlTGF5b3V0THRyLmNsYXNzLCBSLmlkLnJlbGF0aXZlX2xheW91dF9sdHIpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlJlbGF0aXZlIFJUTCIsIEJpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGwuY2xhc3MsIFIuaWQucmVsYXRpdmVfbGF5b3V0X3J0bCk7CisgICAgICAgIAorICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlJlbGF0aXZlMiBMVFIiLCBCaURpVGVzdFJlbGF0aXZlTGF5b3V0Mkx0ci5jbGFzcywgUi5pZC5yZWxhdGl2ZV9sYXlvdXRfMl9sdHIpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlJlbGF0aXZlMiBSVEwiLCBCaURpVGVzdFJlbGF0aXZlTGF5b3V0MlJ0bC5jbGFzcywgUi5pZC5yZWxhdGl2ZV9sYXlvdXRfMl9ydGwpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlJlbGF0aXZlMiBMT0MiLCBCaURpVGVzdFJlbGF0aXZlTGF5b3V0MkxvY2FsZS5jbGFzcywgUi5pZC5yZWxhdGl2ZV9sYXlvdXRfMl9sb2NhbGUpOworICAgICAgICAKKyAgICAgICAgYWRkSXRlbShyZXN1bHQsICJUYWJsZSBMVFIiLCBCaURpVGVzdFRhYmxlTGF5b3V0THRyLmNsYXNzLCBSLmlkLnRhYmxlX2xheW91dF9sdHIpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlRhYmxlIFJUTCIsIEJpRGlUZXN0VGFibGVMYXlvdXRSdGwuY2xhc3MsIFIuaWQudGFibGVfbGF5b3V0X3J0bCk7CisgICAgICAgIGFkZEl0ZW0ocmVzdWx0LCAiVGFibGUgTE9DIiwgQmlEaVRlc3RUYWJsZUxheW91dExvY2FsZS5jbGFzcywgUi5pZC50YWJsZV9sYXlvdXRfbG9jYWxlKTsKIAotICAgICAgICBpbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q2xhc3ModGhpcywgQmlEaVRlc3RMaW5lYXJMYXlvdXRMdHJBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIHNwZWMgPSB0YWJIb3N0Lm5ld1RhYlNwZWMoImxheW91dC1sdHIiKS5zZXRJbmRpY2F0b3IoIkxpbmVhckxheW91dCBMVFIiKS5zZXRDb250ZW50KGludGVudCk7Ci0gICAgICAgIHRhYkhvc3QuYWRkVGFiKHNwZWMpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlZpZXdQYWRkaW5nIiwgQmlEaVRlc3RWaWV3UGFkZGluZy5jbGFzcywgUi5pZC52aWV3X3BhZGRpbmcpOworICAgICAgICBhZGRJdGVtKHJlc3VsdCwgIlZpZXdQYWRkaW5nIE1JWEVEIiwgQmlEaVRlc3RWaWV3UGFkZGluZ01peGVkLmNsYXNzLCBSLmlkLnZpZXdfcGFkZGluZ19taXhlZCk7CiAKLSAgICAgICAgaW50ZW50ID0gbmV3IEludGVudCgpLnNldENsYXNzKHRoaXMsIEJpRGlUZXN0TGluZWFyTGF5b3V0UnRsQWN0aXZpdHkuY2xhc3MpOwotICAgICAgICBzcGVjID0gdGFiSG9zdC5uZXdUYWJTcGVjKCJsYXlvdXQtcnRsIikuc2V0SW5kaWNhdG9yKCJMaW5lYXJMYXlvdXQgUlRMIikuc2V0Q29udGVudChpbnRlbnQpOwotICAgICAgICB0YWJIb3N0LmFkZFRhYihzcGVjKTsKLQotICAgICAgICB0YWJIb3N0LnNldEN1cnJlbnRUYWIoMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEJhc2ljLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RCYXNpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzkxOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RCYXNpYy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0QmFzaWMgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5iYXNpYywgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0QmFzaWNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0QmFzaWNBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYThkZTA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEJhc2ljQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEJpRGlUZXN0QmFzaWNBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5iYXNpYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0Q2FudmFzLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RDYW52YXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VkNzMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0Q2FudmFzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYmlkaS5CaURpVGVzdENvbnN0YW50cy5GT05UX01BWF9TSVpFOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5iaWRpLkJpRGlUZXN0Q29uc3RhbnRzLkZPTlRfTUlOX1NJWkU7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdENhbnZhcyBleHRlbmRzIEZyYWdtZW50IHsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVF9URVhUX1NJWkUgPSAoRk9OVF9NQVhfU0laRSAtIEZPTlRfTUlOX1NJWkUpIC8gMjsKKworICAgIHByaXZhdGUgQmlEaVRlc3RWaWV3IHRlc3RWaWV3OworICAgIHByaXZhdGUgU2Vla0JhciB0ZXh0U2l6ZVNlZWtCYXI7CisgICAgcHJpdmF0ZSBWaWV3IGN1cnJlbnRWaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBjdXJyZW50VmlldyA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuY2FudmFzLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRWaWV3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVmlld0NyZWF0ZWQoVmlldyB2aWV3LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uVmlld0NyZWF0ZWQodmlldywgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICB0ZXN0VmlldyA9IChCaURpVGVzdFZpZXcpIGN1cnJlbnRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLnRlc3R2aWV3KTsKKyAgICAgICAgdGVzdFZpZXcuc2V0Q3VycmVudFRleHRTaXplKElOSVRfVEVYVF9TSVpFKTsKKworICAgICAgICB0ZXh0U2l6ZVNlZWtCYXIgPSAoU2Vla0JhcikgY3VycmVudFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuc2Vla2Jhcik7CisgICAgICAgIHRleHRTaXplU2Vla0Jhci5zZXRQcm9ncmVzcyhJTklUX1RFWFRfU0laRSk7CisgICAgICAgIHRleHRTaXplU2Vla0Jhci5zZXRNYXgoRk9OVF9NQVhfU0laRSAtIEZPTlRfTUlOX1NJWkUpOworCisgICAgICAgIHRleHRTaXplU2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgdGVzdFZpZXcuc2V0Q3VycmVudFRleHRTaXplKEZPTlRfTUlOX1NJWkUgKyBwcm9ncmVzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RDYW52YXNBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0Q2FudmFzQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiNzVkNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RDYW52YXNBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuYmlkaS5CaURpVGVzdENvbnN0YW50cy5GT05UX01BWF9TSVpFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5iaWRpLkJpRGlUZXN0Q29uc3RhbnRzLkZPTlRfTUlOX1NJWkU7Ci0KLXB1YmxpYyBjbGFzcyBCaURpVGVzdENhbnZhc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgc3RhdGljIGZpbmFsIGludCBJTklUX1RFWFRfU0laRSA9IChGT05UX01BWF9TSVpFIC0gRk9OVF9NSU5fU0laRSkgLyAyOwotCi0gICAgcHJpdmF0ZSBCaURpVGVzdFZpZXcgdGVzdFZpZXc7Ci0gICAgcHJpdmF0ZSBTZWVrQmFyIHRleHRTaXplU2Vla0JhcjsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jYW52YXMpOwotCi0gICAgICAgIHRlc3RWaWV3ID0gKEJpRGlUZXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQudGVzdHZpZXcpOwotICAgICAgICB0ZXN0Vmlldy5zZXRDdXJyZW50VGV4dFNpemUoSU5JVF9URVhUX1NJWkUpOwotCi0gICAgICAgIHRleHRTaXplU2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5zZWVrYmFyKTsKLSAgICAgICAgdGV4dFNpemVTZWVrQmFyLnNldFByb2dyZXNzKElOSVRfVEVYVF9TSVpFKTsKLSAgICAgICAgdGV4dFNpemVTZWVrQmFyLnNldE1heChGT05UX01BWF9TSVpFIC0gRk9OVF9NSU5fU0laRSk7Ci0KLSAgICAgICAgdGV4dFNpemVTZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICB0ZXN0Vmlldy5zZXRDdXJyZW50VGV4dFNpemUoRk9OVF9NSU5fU0laRSArIHByb2dyZXNzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0TG9jYWxlLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RGcmFtZUxheW91dExvY2FsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMGJjZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RGcmFtZUxheW91dExvY2FsZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0RnJhbWVMYXlvdXRMb2NhbGUgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYW1lX2xheW91dF9sb2NhbGUsIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0RnJhbWVMYXlvdXRMdHIuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0THRyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5MDBkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdEZyYW1lTGF5b3V0THRyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RGcmFtZUxheW91dEx0ciBleHRlbmRzIEZyYWdtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuZnJhbWVfbGF5b3V0X2x0ciwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RGcmFtZUxheW91dFJ0bC5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0RnJhbWVMYXlvdXRSdGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjYxNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0RnJhbWVMYXlvdXRSdGwuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5iaWRpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdEZyYW1lTGF5b3V0UnRsIGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5mcmFtZV9sYXlvdXRfcnRsLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dExvY2FsZS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0TG9jYWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2ODZkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dExvY2FsZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0TGluZWFyTGF5b3V0TG9jYWxlIGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5saW5lYXJfbGF5b3V0X2xvY2FsZSwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0THRyLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RMaW5lYXJMYXlvdXRMdHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTkxOTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0THRyLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RMaW5lYXJMYXlvdXRMdHIgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmxpbmVhcl9sYXlvdXRfbHRyLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RMaW5lYXJMYXlvdXRMdHJBY3Rpdml0eS5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0THRyQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4ZjExZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RMaW5lYXJMYXlvdXRMdHJBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLQotcHVibGljIGNsYXNzIEJpRGlUZXN0TGluZWFyTGF5b3V0THRyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBwcml2YXRlIExpbmVhckxheW91dCBsYXlvdXQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubGluZWFyX2xheW91dF9sdHIpOwotCi0gICAgICAgIGxheW91dCA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmxheW91dHRlc3QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dFJ0bC5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0UnRsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlMjQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dFJ0bC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0TGluZWFyTGF5b3V0UnRsIGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5saW5lYXJfbGF5b3V0X3J0bCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0UnRsQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdExpbmVhckxheW91dFJ0bEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzA3OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0TGluZWFyTGF5b3V0UnRsQWN0aXZpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci0KLXB1YmxpYyBjbGFzcyBCaURpVGVzdExpbmVhckxheW91dFJ0bEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbGF5b3V0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxpbmVhcl9sYXlvdXRfcnRsKTsKLQotICAgICAgICBsYXlvdXQgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5sYXlvdXR0ZXN0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dDJMb2NhbGUuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0MkxvY2FsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1N2YxODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dDJMb2NhbGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5iaWRpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdFJlbGF0aXZlTGF5b3V0MkxvY2FsZSBleHRlbmRzIEZyYWdtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQucmVsYXRpdmVfbGF5b3V0XzJfbG9jYWxlLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0Mkx0ci5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXQyTHRyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3YjNhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0Mkx0ci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0UmVsYXRpdmVMYXlvdXQyTHRyIGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5yZWxhdGl2ZV9sYXlvdXRfMl9sdHIsIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXQyUnRsLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dDJSdGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTg1YTZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXQyUnRsLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RSZWxhdGl2ZUxheW91dDJSdGwgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnJlbGF0aXZlX2xheW91dF8yX3J0bCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dEx0ci5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRMdHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU0ZTdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0UmVsYXRpdmVMYXlvdXRMdHIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5iaWRpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdFJlbGF0aXZlTGF5b3V0THRyIGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5yZWxhdGl2ZV9sYXlvdXRfbHRyLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFJlbGF0aXZlTGF5b3V0UnRsLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dFJ0bC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTYwN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RSZWxhdGl2ZUxheW91dFJ0bC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0UmVsYXRpdmVMYXlvdXRSdGwgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnJlbGF0aXZlX2xheW91dF9ydGwsIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRMb2NhbGUuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFRhYmxlTGF5b3V0TG9jYWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3MmM5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFRhYmxlTGF5b3V0TG9jYWxlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RUYWJsZUxheW91dExvY2FsZSBleHRlbmRzIEZyYWdtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudGFibGVfbGF5b3V0X2xvY2FsZSwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RUYWJsZUxheW91dEx0ci5qYXZhIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRMdHIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjc1YjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0VGFibGVMYXlvdXRMdHIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5iaWRpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdFRhYmxlTGF5b3V0THRyIGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICByZXR1cm4gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC50YWJsZV9sYXlvdXRfbHRyLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFRhYmxlTGF5b3V0UnRsLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RUYWJsZUxheW91dFJ0bC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzIwZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RUYWJsZUxheW91dFJ0bC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJpZGk7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKKworcHVibGljIGNsYXNzIEJpRGlUZXN0VGFibGVMYXlvdXRSdGwgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnRhYmxlX2xheW91dF9ydGwsIGNvbnRhaW5lciwgZmFsc2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvQmlEaVRlc3RzL3NyYy9jb20vYW5kcm9pZC9iaWRpL0JpRGlUZXN0Vmlld1BhZGRpbmcuamF2YSBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFZpZXdQYWRkaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiNDEwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFZpZXdQYWRkaW5nLmphdmEKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK3BhY2thZ2UgY29tLmFuZHJvaWQuYmlkaTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworCitwdWJsaWMgY2xhc3MgQmlEaVRlc3RWaWV3UGFkZGluZyBleHRlbmRzIEZyYWdtZW50IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQudmlld19wYWRkaW5nLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RWaWV3UGFkZGluZ01peGVkLmphdmEgYi90ZXN0cy9CaURpVGVzdHMvc3JjL2NvbS9hbmRyb2lkL2JpZGkvQmlEaVRlc3RWaWV3UGFkZGluZ01peGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMjcwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0JpRGlUZXN0cy9zcmMvY29tL2FuZHJvaWQvYmlkaS9CaURpVGVzdFZpZXdQYWRkaW5nTWl4ZWQuamF2YQpAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorcGFja2FnZSBjb20uYW5kcm9pZC5iaWRpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CisKK3B1YmxpYyBjbGFzcyBCaURpVGVzdFZpZXdQYWRkaW5nTWl4ZWQgZXh0ZW5kcyBGcmFnbWVudCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHJldHVybiBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LnZpZXdfcGFkZGluZ19taXhlZCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRHBpVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvZHBpL0RwaVRlc3RBY3Rpdml0eS5qYXZhIGIvdGVzdHMvRHBpVGVzdC9zcmMvY29tL2dvb2dsZS9hbmRyb2lkL3Rlc3QvZHBpL0RwaVRlc3RBY3Rpdml0eS5qYXZhCmluZGV4IDJhNDBjNTcuLjAxYzFjNzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RwaVRlc3Qvc3JjL2NvbS9nb29nbGUvYW5kcm9pZC90ZXN0L2RwaS9EcGlUZXN0QWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9EcGlUZXN0L3NyYy9jb20vZ29vZ2xlL2FuZHJvaWQvdGVzdC9kcGkvRHBpVGVzdEFjdGl2aXR5LmphdmEKQEAgLTYzLDcgKzYzLDggQEAKICAgICAgICAgICAgICAgICAgICAgfCBBcHBsaWNhdGlvbkluZm8uRkxBR19SRVNJWkVBQkxFX0ZPUl9TQ1JFRU5TCiAgICAgICAgICAgICAgICAgICAgIHwgQXBwbGljYXRpb25JbmZvLkZMQUdfU1VQUE9SVFNfU0NSRUVOX0RFTlNJVElFUzsKICAgICAgICAgICAgICAgICBhcHAuZ2V0UmVzb3VyY2VzKCkuc2V0Q29tcGF0aWJpbGl0eUluZm8obmV3IENvbXBhdGliaWxpdHlJbmZvKGFpLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLnNjcmVlbkxheW91dCwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlcygpLmdldENvbmZpZ3VyYXRpb24oKS5zY3JlZW5MYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXRDb25maWd1cmF0aW9uKCkuc21hbGxlc3RTY3JlZW5XaWR0aERwLCBmYWxzZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChQYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm91Y2giLCBlKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDUzY2E0Y2UuLjFiNzIzNTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvR3JpZExheW91dFRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtNzYsNiArNzYsMjcgQEAKICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkFsaWdubWVudFRlc3QiIGFuZHJvaWQ6bGFiZWw9IkFsaWdubWVudFRlc3QiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJMaW5lYXJMYXlvdXRUZXN0IiBhbmRyb2lkOmxhYmVsPSJMaW5lYXJMYXlvdXRUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR3JpZExheW91dFRlc3QiIGFuZHJvaWQ6bGFiZWw9IkdyaWRMYXlvdXRUZXN0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CiAgICAgPC9hcHBsaWNhdGlvbj4KIAogCmRpZmYgLS1naXQgYS90ZXN0cy9HcmlkTGF5b3V0VGVzdC9yZXMvbGF5b3V0L2dyaWQzLnhtbCBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3Jlcy9sYXlvdXQvZ3JpZDMueG1sCmluZGV4IGFjZTdiNGMuLmJhOTExYzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3Jlcy9sYXlvdXQvZ3JpZDMueG1sCisrKyBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3Jlcy9sYXlvdXQvZ3JpZDMueG1sCkBAIC0xOSw1OSArMTksNjkgQEAKIAogICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKworICAgICAgICBhbmRyb2lkOnVzZURlZmF1bHRNYXJnaW5zPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmFsaWdubWVudE1vZGU9ImFsaWduQm91bmRzIgorCisgICAgICAgIGFuZHJvaWQ6Y29sdW1uQ291bnQ9IjQiCiAgICAgICAgID4KIAotICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iZmlsbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6d2lkdGg9IjIwMGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIxMDBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3Jvdz0iMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtbj0iMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbCIKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRW1haWwgYWNjb3VudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjQ4ZGlwIgorCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW5TcGFuPSI0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IllvdSBjYW4gY29uZmlndXJlIGVtYWlsIGluIGp1c3QgYSBmZXcgc3RlcHM6IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBkaXAiCisKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtblNwYW49IjQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJsZWZ0IgorICAgICAgICAgICAgLz4KKworICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJFbWFpbCBhZGRyZXNzOiIKKworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0icmlnaHQiCiAgICAgICAgICAgICAvPgogCiAgICAgPEVkaXRUZXh0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3c9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW49IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMTAwZGlwIgogICAgICAgICAgICAgLz4KIAotICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0ibGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3Jvdz0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtbj0iMCIKLSAgICAgICAgICAgIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlBhc3N3b3JkOiIKIAotICAgIDxFZGl0VGV4dAotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfcm93PSIxIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY29sdW1uPSIxIgotICAgICAgICAgICAgLz4KLQotICAgIDxCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0icmlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3c9IjIiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW49IjAiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJyaWdodCIKICAgICAgICAgICAgIC8+CiAKICAgICA8RWRpdFRleHQKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iNTBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMDBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3c9IjIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW49IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNTBkaXAiCisgICAgICAgICAgICAvPgorCisgICAgPFNwYWNlCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3c9IjQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW49IjIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3dXZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW5XZWlnaHQ9IjEiCiAgICAgICAgICAgICAvPgogCiAgICAgPEJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3c9IjMiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW49IjAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iTWFudWFsIHNldHVwIgorCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9yb3c9IjUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jb2x1bW49IjMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJmaWxsX2hvcml6b250YWwiCiAgICAgICAgICAgICAvPgogCi0gICAgPEVkaXRUZXh0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfcm93PSIzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY29sdW1uPSIxIgotICAgICAgICAgICAgLz4KKyAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9Ik5leHQiCiAKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NvbHVtbj0iMyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImZpbGxfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIC8+CiA8L0dyaWRMYXlvdXQ+CmRpZmYgLS1naXQgYS90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWJzdHJhY3RMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWJzdHJhY3RMYXlvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzYTg0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BYnN0cmFjdExheW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0LmxheW91dDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LkdyYXZpdHkuKjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGF5b3V0VGVzdCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSE9SSVpPTlRBTF9OQU1FUyA9IHsgIkxFRlQiLCAiQ0VOVEVSIiwgIlJJR0hUIiwgIkZJTEwiIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBIT1JJWk9OVEFMX0FMSUdOTUVOVFMgPSB7IExFRlQsIENFTlRFUiwgUklHSFQsIEZJTEwgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZFUlRJQ0FMX05BTUVTID0geyAiVE9QIiwgIkNFTlRFUiIsICJCQVNFTElORSIsICJCT1RUT00iLCAiRklMTCIgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIFZFUlRJQ0FMX0FMSUdOTUVOVFMgPSB7IFRPUCwgQ0VOVEVSLCBOT19HUkFWSVRZLCBCT1RUT00sIEZJTEwgfTsKKworICAgIHB1YmxpYyBWaWV3IGNyZWF0ZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBpbnQgc2l6ZSkgeworICAgICAgICBCdXR0b24gcmVzdWx0ID0gbmV3IEJ1dHRvbihjb250ZXh0KTsKKyAgICAgICAgcmVzdWx0LnNldFRleHQobmFtZSk7CisgICAgICAgIHJlc3VsdC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltYXRlKHYpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgVmlld0dyb3VwIGNyZWF0ZShDb250ZXh0IGNvbnRleHQpOworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgdGFnKCk7CisKKyAgICBwdWJsaWMgdm9pZCBhbmltYXRlKFZpZXcgdikgeworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGludCBOID0gMTAwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIFZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtcykgdi5nZXRMYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgIGxwLnRvcE1hcmdpbiA9IChscC50b3BNYXJnaW4gKyAxKSAlIDMxOworICAgICAgICAgICAgbHAubGVmdE1hcmdpbiA9IChscC5sZWZ0TWFyZ2luICsgMSkgJSAzMTsKKworICAgICAgICAgICAgdi5yZXF1ZXN0TGF5b3V0KCk7CisgICAgICAgICAgICB2LmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIFZpZXdHcm91cCBwID0gKFZpZXdHcm91cCkgdi5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIHAubGF5b3V0KDAsIDAsIDEwMDAgKyAoaSAlIDIpLCA1MDAgKyAoaSAlIDIpKTsKKyAgICAgICAgfQorICAgICAgICBMb2cuZCh0YWcoKSwgIlRpbWU6ICIgKyAoZmxvYXQpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSAvIE4gKiAxMDAwICsgIm1pY3MiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNyZWF0ZShnZXRCYXNlQ29udGV4dCgpKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0FjdGl2aXR5Mi5qYXZhIGIvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0FjdGl2aXR5Mi5qYXZhCmluZGV4IDYzNTk5MDMuLmUwMTBhMDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BY3Rpdml0eTIuamF2YQorKysgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWN0aXZpdHkyLmphdmEKQEAgLTIwLDExICsyMCwxNSBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgYW5kcm9pZC53aWRnZXQuKjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGFjZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKIAogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnRleHQuSW5wdXRUeXBlLlRZUEVfQ0xBU1NfVEVYVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm8uKjsKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLkVkaXRvckluZm8uVFlQRV9URVhUX1ZBUklBVElPTl9FTUFJTF9BRERSRVNTOworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnZpZXcuaW5wdXRtZXRob2QuRWRpdG9ySW5mby5UWVBFX1RFWFRfVkFSSUFUSU9OX1BBU1NXT1JEOwogaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5HcmlkTGF5b3V0Lio7CiAKIHB1YmxpYyBjbGFzcyBBY3Rpdml0eTIgZXh0ZW5kcyBBY3Rpdml0eSB7CkBAIC0zMiw2ICszNiw3IEBACiAgICAgcHVibGljIHN0YXRpYyBWaWV3IGNyZWF0ZShDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgR3JpZExheW91dCB2ZyA9IG5ldyBHcmlkTGF5b3V0KGNvbnRleHQpOwogICAgICAgICB2Zy5zZXRVc2VEZWZhdWx0TWFyZ2lucyh0cnVlKTsKKyAgICAgICAgdmcuc2V0QWxpZ25tZW50TW9kZShBTElHTl9CT1VORFMpOwogCiAgICAgICAgIEdyb3VwIHJvdzEgPSBuZXcgR3JvdXAoMSwgQ0VOVEVSKTsKICAgICAgICAgR3JvdXAgcm93MiA9IG5ldyBHcm91cCgyLCBDRU5URVIpOwpAQCAtNDEsMTIgKzQ2LDEyIEBACiAgICAgICAgIEdyb3VwIHJvdzYgPSBuZXcgR3JvdXAoNiwgQ0VOVEVSKTsKICAgICAgICAgR3JvdXAgcm93NyA9IG5ldyBHcm91cCg3LCBDRU5URVIpOwogCi0gICAgICAgIEdyb3VwIGNvbDFhID0gbmV3IEdyb3VwKDEsIDUsIENFTlRFUik7Ci0gICAgICAgIEdyb3VwIGNvbDFiID0gbmV3IEdyb3VwKDEsIDUsIExFRlQpOworICAgICAgICBHcm91cCBjb2wxYSA9IG5ldyBHcm91cCgxLCA0LCBDRU5URVIpOworICAgICAgICBHcm91cCBjb2wxYiA9IG5ldyBHcm91cCgxLCA0LCBMRUZUKTsKICAgICAgICAgR3JvdXAgY29sMWMgPSBuZXcgR3JvdXAoMSwgUklHSFQpOwotICAgICAgICBHcm91cCBjb2wyID0gIG5ldyBHcm91cCgyLCBMRUZUKTsKLSAgICAgICAgR3JvdXAgY29sMyA9ICBuZXcgR3JvdXAoMywgRklMTCk7Ci0gICAgICAgIEdyb3VwIGNvbDQgPSAgbmV3IEdyb3VwKDQsIEZJTEwpOworICAgICAgICBHcm91cCBjb2wyID0gbmV3IEdyb3VwKDIsIExFRlQpOworICAgICAgICBHcm91cCBjb2wzID0gbmV3IEdyb3VwKDMsIEZJTEwpOworICAgICAgICBHcm91cCBjb2w0ID0gbmV3IEdyb3VwKDQsIEZJTEwpOwogCiAgICAgICAgIHsKICAgICAgICAgICAgIFRleHRWaWV3IHYgPSBuZXcgVGV4dFZpZXcoY29udGV4dCk7CkBAIC01NCwyMCArNTksMTcgQEAKICAgICAgICAgICAgIHYuc2V0VGV4dCgiRW1haWwgc2V0dXAiKTsKICAgICAgICAgICAgIHZnLmFkZFZpZXcodiwgbmV3IExheW91dFBhcmFtcyhyb3cxLCBjb2wxYSkpOwogICAgICAgICB9Ci0KICAgICAgICAgewogICAgICAgICAgICAgVGV4dFZpZXcgdiA9IG5ldyBUZXh0Vmlldyhjb250ZXh0KTsKICAgICAgICAgICAgIHYuc2V0VGV4dFNpemUoMjApOwogICAgICAgICAgICAgdi5zZXRUZXh0KCJZb3UgY2FuIGNvbmZpZ3VyZSBlbWFpbCBpbiBqdXN0IGEgZmV3IHN0ZXBzOiIpOwogICAgICAgICAgICAgdmcuYWRkVmlldyh2LCBuZXcgTGF5b3V0UGFyYW1zKHJvdzIsIGNvbDFiKSk7CiAgICAgICAgIH0KLQogICAgICAgICB7CiAgICAgICAgICAgICBUZXh0VmlldyB2ID0gbmV3IFRleHRWaWV3KGNvbnRleHQpOwogICAgICAgICAgICAgdi5zZXRUZXh0KCJFbWFpbCBhZGRyZXNzOiIpOwogICAgICAgICAgICAgdmcuYWRkVmlldyh2LCBuZXcgTGF5b3V0UGFyYW1zKHJvdzMsIGNvbDFjKSk7CiAgICAgICAgIH0KLQogICAgICAgICB7CiAgICAgICAgICAgICBFZGl0VGV4dCB2ID0gbmV3IEVkaXRUZXh0KGNvbnRleHQpOwogICAgICAgICAgICAgdi5zZXRJbnB1dFR5cGUoVFlQRV9DTEFTU19URVhUIHwgVFlQRV9URVhUX1ZBUklBVElPTl9FTUFJTF9BRERSRVNTKTsKQEAgLTc3LDEzICs3OSwxMSBAQAogICAgICAgICAgICAgICAgIHZnLmFkZFZpZXcodiwgbHApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgewogICAgICAgICAgICAgVGV4dFZpZXcgdiA9IG5ldyBUZXh0Vmlldyhjb250ZXh0KTsKICAgICAgICAgICAgIHYuc2V0VGV4dCgiUGFzc3dvcmQ6Iik7CiAgICAgICAgICAgICB2Zy5hZGRWaWV3KHYsIG5ldyBMYXlvdXRQYXJhbXMocm93NCwgY29sMWMpKTsKICAgICAgICAgfQotCiAgICAgICAgIHsKICAgICAgICAgICAgIFRleHRWaWV3IHYgPSBuZXcgRWRpdFRleHQoY29udGV4dCk7CiAgICAgICAgICAgICB2LnNldElucHV0VHlwZShUWVBFX0NMQVNTX1RFWFQgfCBUWVBFX1RFWFRfVkFSSUFUSU9OX1BBU1NXT1JEKTsKQEAgLTkzLDcgKzkzLDYgQEAKICAgICAgICAgICAgICAgICB2Zy5hZGRWaWV3KHYsIGxwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIHsKICAgICAgICAgICAgIFNwYWNlIHYgPSBuZXcgU3BhY2UoY29udGV4dCk7CiAgICAgICAgICAgICB7CkBAIC0xMDMsMTMgKzEwMiwxMSBAQAogICAgICAgICAgICAgICAgIHZnLmFkZFZpZXcodiwgbHApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgewogICAgICAgICAgICAgQnV0dG9uIHYgPSBuZXcgQnV0dG9uKGNvbnRleHQpOwogICAgICAgICAgICAgdi5zZXRUZXh0KCJNYW51YWwgc2V0dXAiKTsKICAgICAgICAgICAgIHZnLmFkZFZpZXcodiwgbmV3IExheW91dFBhcmFtcyhyb3c2LCBjb2w0KSk7CiAgICAgICAgIH0KLQogICAgICAgICB7CiAgICAgICAgICAgICBCdXR0b24gdiA9IG5ldyBCdXR0b24oY29udGV4dCk7CiAgICAgICAgICAgICB2LnNldFRleHQoIk5leHQiKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9BbGlnbm1lbnRUZXN0LmphdmEgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWxpZ25tZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwNWM4M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvQWxpZ25tZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0LmxheW91dDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdQYXJlbnQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkVkaXRUZXh0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC4qOworCitwdWJsaWMgY2xhc3MgQWxpZ25tZW50VGVzdCAgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhPUklaT05UQUxfTkFNRVMgPSB7IkxFRlQiLCAiY2VudGVyIiwgImVhc3QiLCAiZmlsbCJ9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWxpZ25tZW50W10gSE9SSVpPTlRBTF9BTElHTk1FTlRTID0ge0xFRlQsIENFTlRFUiwgUklHSFQsIEZJTEx9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVSVElDQUxfTkFNRVMgPSB7Im5vcnRoIiwgImNlbnRlciIsICJiYXNlbGluZSIsICJzb3V0aCIsICJmaWxsIn07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbGlnbm1lbnRbXSBWRVJUSUNBTF9BTElHTk1FTlRTID0ge1RPUCwgQ0VOVEVSLCBCQVNFTElORSwgQk9UVE9NLCBGSUxMfTsKKyAgICBwcml2YXRlIHN0YXRpYyBDb250ZXh0IENPTlRFWFQ7CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWaWV3RmFjdG9yeSB7CisgICAgICAgIFZpZXcgY3JlYXRlKFN0cmluZyBuYW1lLCBpbnQgc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaWV3RmFjdG9yeSBCVVRUT05fRkFDVE9SWSA9IG5ldyBWaWV3RmFjdG9yeSgpIHsKKyAgICAgICAgcHVibGljIFZpZXcgY3JlYXRlKFN0cmluZyBuYW1lLCBpbnQgc2l6ZSkgeworICAgICAgICAgICAgQnV0dG9uIHJlc3VsdCA9IG5ldyBCdXR0b24oQ09OVEVYVCk7CisgICAgICAgICAgICByZXN1bHQuc2V0VGV4dChuYW1lKTsKKyAgICAgICAgICAgcmVzdWx0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICBhbmltYXRlKHYpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaWV3RmFjdG9yeSBMQUJFTF9GQUNUT1JZID0gbmV3IFZpZXdGYWN0b3J5KCkgeworICAgICAgICBwdWJsaWMgVmlldyBjcmVhdGUoU3RyaW5nIG5hbWUsIGludCBzaXplKSB7CisgICAgICAgICAgICBUZXh0VmlldyByZXN1bHQgPSBuZXcgVGV4dFZpZXcoQ09OVEVYVCk7CisgICAgICAgICAgICByZXN1bHQuc2V0VGV4dChuYW1lKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUZXh0U2l6ZSg0MCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmlld0ZhY3RvcnkgVEVYVF9GSUVMRF9GQUNUT1JZID0gbmV3IFZpZXdGYWN0b3J5KCkgeworICAgICAgICBwdWJsaWMgVmlldyBjcmVhdGUoU3RyaW5nIG5hbWUsIGludCBzaXplKSB7CisgICAgICAgICAgICBFZGl0VGV4dCByZXN1bHQgPSBuZXcgRWRpdFRleHQoQ09OVEVYVCk7CisgICAgICAgICAgICByZXN1bHQuc2V0VGV4dChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaWV3RmFjdG9yeVtdIEZBQ1RPUklFUyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAge0JVVFRPTl9GQUNUT1JZLCBMQUJFTF9GQUNUT1JZLCBURVhUX0ZJRUxEX0ZBQ1RPUll9OworCisgICAgcHVibGljIHN0YXRpYyBWaWV3R3JvdXAgY3JlYXRlKENvbnRleHQgY29udGV4dDEpIHsKKyAgICAgICAgQ09OVEVYVCA9IGNvbnRleHQxOworICAgICAgICBHcmlkTGF5b3V0IGNvbnRhaW5lciA9IG5ldyBHcmlkTGF5b3V0KGNvbnRleHQxKTsKKyAgICAgICAgY29udGFpbmVyLnNldFVzZURlZmF1bHRNYXJnaW5zKHRydWUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkVSVElDQUxfQUxJR05NRU5UUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgQWxpZ25tZW50IHZhID0gVkVSVElDQUxfQUxJR05NRU5UU1tpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgSE9SSVpPTlRBTF9BTElHTk1FTlRTLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgQWxpZ25tZW50IGhhID0gSE9SSVpPTlRBTF9BTElHTk1FTlRTW2pdOworICAgICAgICAgICAgICAgIEdyb3VwIHJvd0dyb3VwID0gbmV3IEdyb3VwKGksIHZhKTsKKyAgICAgICAgICAgICAgICBHcm91cCBjb2xHcm91cCA9IG5ldyBHcm91cChqLCBoYSk7CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxheW91dFBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMocm93R3JvdXAsIGNvbEdyb3VwKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFZFUlRJQ0FMX05BTUVTW2ldICsgIi0iICsgSE9SSVpPTlRBTF9OQU1FU1tqXTsKKyAgICAgICAgICAgICAgICBWaWV3RmFjdG9yeSBmYWN0b3J5ID0gRkFDVE9SSUVTWyhpICsgaikgJSBGQUNUT1JJRVMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyhmYWN0b3J5LmNyZWF0ZShuYW1lLCAyMCksIGxheW91dFBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhbmltYXRlKFZpZXcgdikgeworCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgaW50IE4gPSAxMDAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IHYuZ2V0TGF5b3V0UGFyYW1zKCk7CisgICAgICAgICAgICBscC53aWR0aCArPSAxOyAvLyB3aWR0aDsKKyAgICAgICAgICAgIGxwLmhlaWdodCArPSAxOyAvLyBoZWlnaHQ7CisgICAgICAgICAgICB2LnJlcXVlc3RMYXlvdXQoKTsKKyAgICAgICAgICAgIEdyaWRMYXlvdXQgcCA9IChHcmlkTGF5b3V0KSB2LmdldFBhcmVudCgpOworICAgICAgICAgICAgcC5sYXlvdXQoMCwgMCwgMTAwMCArIChpICUgMiksIDUwMCArIChpICUgMikpOworICAgICAgICB9CisgICAgICAgIGZsb2F0IHRpbWUgPSAoZmxvYXQpIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSAvIE4gKiAxMDAwOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWU6ICIgKyB0aW1lICsgIm1pY3MiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNyZWF0ZShnZXRCYXNlQ29udGV4dCgpKSk7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0dyaWRMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvR3JpZExheW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY4MWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvR3JpZExheW91dFRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvbGF5b3V0L0dyaWRMYXlvdXRUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5sYXlvdXQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkdyaWRMYXlvdXQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuR3JpZExheW91dC4qOworCitwdWJsaWMgY2xhc3MgR3JpZExheW91dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdExheW91dFRlc3QgeworICAgIHB1YmxpYyBWaWV3R3JvdXAgY3JlYXRlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBHcmlkTGF5b3V0IGNvbnRhaW5lciA9IG5ldyBHcmlkTGF5b3V0KGNvbnRleHQpOworICAgICAgICBjb250YWluZXIuc2V0T3JpZW50YXRpb24oVkVSVElDQUwpOworLy8gICAgICAgIGNvbnRhaW5lci5zZXRVc2VEZWZhdWx0TWFyZ2lucyh0cnVlKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZFUlRJQ0FMX0FMSUdOTUVOVFMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YSA9IFZFUlRJQ0FMX0FMSUdOTUVOVFNbaV07CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEhPUklaT05UQUxfQUxJR05NRU5UUy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgIGludCBoYSA9IEhPUklaT05UQUxfQUxJR05NRU5UU1tqXTsKKyAgICAgICAgICAgICAgICBHcmlkTGF5b3V0Lkdyb3VwIHJvd0dyb3VwID0gbmV3IEdyaWRMYXlvdXQuR3JvdXAoVU5ERUZJTkVELCBudWxsKTsKKyAgICAgICAgICAgICAgICBHcmlkTGF5b3V0Lkdyb3VwIGNvbEdyb3VwID0gbmV3IEdyaWRMYXlvdXQuR3JvdXAoVU5ERUZJTkVELCBudWxsKTsKKyAgICAgICAgICAgICAgICBHcmlkTGF5b3V0LkxheW91dFBhcmFtcyBscCA9IG5ldyBHcmlkTGF5b3V0LkxheW91dFBhcmFtcyhyb3dHcm91cCwgY29sR3JvdXApOworICAgICAgICAgICAgICAgIC8vR3JpZExheW91dC5MYXlvdXRQYXJhbXMgbHAgPSBuZXcgR3JpZExheW91dC5MYXlvdXRQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBscC5zZXRHcmF2aXR5KHZhIHwgaGEpOworICAgICAgICAgICAgICAgIFZpZXcgdiA9IGNyZWF0ZShjb250ZXh0LCBWRVJUSUNBTF9OQU1FU1tpXSArICItIiArIEhPUklaT05UQUxfTkFNRVNbal0sIDIwKTsKKyAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkVmlldyh2LCBscCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdGFnKCkgeworICAgICAgICByZXR1cm4gR3JpZExheW91dFRlc3QuY2xhc3MuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0dyaWRMYXlvdXRUZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2xheW91dC9MaW5lYXJMYXlvdXRUZXN0LmphdmEgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvTGluZWFyTGF5b3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjQ2NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9HcmlkTGF5b3V0VGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9sYXlvdXQvTGluZWFyTGF5b3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QubGF5b3V0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0Lio7CitpbXBvcnQgc3RhdGljIGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dC5MYXlvdXRQYXJhbXMuKjsKKworcHVibGljIGNsYXNzIExpbmVhckxheW91dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdExheW91dFRlc3QgeworICAgIHB1YmxpYyBWaWV3R3JvdXAgY3JlYXRlKENvbnRleHQgY29udGV4dCkgeworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gbmV3IExpbmVhckxheW91dChjb250ZXh0KTsKKyAgICAgICAgY29udGFpbmVyLnNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWRVJUSUNBTF9BTElHTk1FTlRTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmEgPSBWRVJUSUNBTF9BTElHTk1FTlRTW2ldOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBIT1JJWk9OVEFMX0FMSUdOTUVOVFMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaGEgPSBIT1JJWk9OVEFMX0FMSUdOTUVOVFNbal07CisgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zIGxwID0gbmV3IExheW91dFBhcmFtcyhXUkFQX0NPTlRFTlQsIFdSQVBfQ09OVEVOVCk7CisgICAgICAgICAgICAgICAgbHAuZ3Jhdml0eSA9IHZhIHwgaGE7CisgICAgICAgICAgICAgICAgVmlldyB2ID0gY3JlYXRlKGNvbnRleHQsIFZFUlRJQ0FMX05BTUVTW2ldICsgIi0iICsgSE9SSVpPTlRBTF9OQU1FU1tqXSwgMjApOworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KHYsIGxwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0YWcoKSB7CisgICAgICAgIHJldHVybiBMaW5lYXJMYXlvdXRUZXN0LmNsYXNzLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDAxZDMwZWIuLmM2NTAwMjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xOSw2ICsxOSw3IEBACiAKICAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiAvPgogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiAvPgorICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uV1JJVEVfRVhURVJOQUxfU1RPUkFHRSIgLz4KIAogICAgIDx1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYSIgLz4KICAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuYXV0b2ZvY3VzIiAvPgpAQCAtMzAsNiArMzEsMjQgQEAKICAgICAgICAgYW5kcm9pZDpoYXJkd2FyZUFjY2VsZXJhdGVkPSJ0cnVlIj4KIAogICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm5hbWU9IkdldEJpdG1hcEFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9HZXRCaXRtYXAiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICAKKyAgICAgICAgPGFjdGl2aXR5CisgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJTbWFsbENpcmNsZUFjdGl2aXR5IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9TbWFsbENpcmNsZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5CiAgICAgICAgICAgICAgICAgYW5kcm9pZDpuYW1lPSJDbGVhckFjdGl2aXR5IgogICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9Il9DbGVhciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0NsZWFyQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0NsZWFyQWN0aXZpdHkuamF2YQppbmRleCBiNDlkYjdjNS4uMWM4MmU5YiAxMDA2NDQKLS0tIGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvQ2xlYXJBY3Rpdml0eS5qYXZhCisrKyBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL0NsZWFyQWN0aXZpdHkuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcFNoYWRlcjsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGF0aDsKQEAgLTc5LDYgKzc4LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKICAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoIk9wZW5HTFJlbmRlcmVyIiwgNTAuMGYsIDUwLjBmLCBtQ2xlYXJQYWludCk7CisgICAgICAgICAgICAgICAgbUNsZWFyUGFpbnQuc2V0Q29sb3IoMHhmZjAwMDAwMCk7CisgICAgICAgICAgICAgICAgY2FudmFzLmRyYXdSZWN0KDgwMC4wZiwgMTAwLjBmLCA5MDAuMGYsIDIwMC4wZiwgbUNsZWFyUGFpbnQpOworICAgICAgICAgICAgICAgIG1DbGVhclBhaW50LnNldENvbG9yKDB4MDAwMGZmMDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvR0xUZXh0dXJlVmlld0FjdGl2aXR5LmphdmEgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HTFRleHR1cmVWaWV3QWN0aXZpdHkuamF2YQppbmRleCA3Zjk3MDk4Li45YmI1YmE4IDEwMDY0NAotLS0gYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HTFRleHR1cmVWaWV3QWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HTFRleHR1cmVWaWV3QWN0aXZpdHkuamF2YQpAQCAtNTIsMTMgKzUyLDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7Ci0gICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOwotICAgICAgICBtUmVuZGVyVGhyZWFkLmZpbmlzaCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgeworICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgICAgICAgIG1SZW5kZXJUaHJlYWQgPSBuZXcgUmVuZGVyVGhyZWFkKHN1cmZhY2UpOwogICAgICAgICBtUmVuZGVyVGhyZWFkLnN0YXJ0KCk7CiAKQEAgLTgxLDYgKzc1LDE2IEBACiAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVEZXN0cm95ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgeworICAgICAgICBtUmVuZGVyVGhyZWFkLmZpbmlzaCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVJlbmRlclRocmVhZC5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFJlbmRlclRocmVhZC5MT0dfVEFHLCAiQ291bGQgbm90IHdhaXQgZm9yIHJlbmRlciB0aHJlYWQiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmRlclRocmVhZCBleHRlbmRzIFRocmVhZCB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfVEFHID0gIkdMVGV4dHVyZVZpZXciOwogCkBAIC0xMDgsMjYgKzExMiwyMyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICBpbml0R0woKTsKIAotICAgICAgICAgICAgZmxvYXQgcmVkID0gMC4wZjsKKyAgICAgICAgICAgIGZsb2F0IHJlZCA9IDEuMGY7CiAgICAgICAgICAgICB3aGlsZSAoIW1GaW5pc2hlZCkgewogICAgICAgICAgICAgICAgIGNoZWNrQ3VycmVudCgpOwogCisgICAgICAgICAgICAgICAgTG9nLmQoTE9HX1RBRywgIlJlbmRlcmluZyBmcmFtZSIpOworCiAgICAgICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcihyZWQsIDAuMGYsIDAuMGYsIDEuMGYpOwotICAgICAgICAgICAgICAgIGludCBlcnJvciA9IEdMRVMyMC5nbEdldEVycm9yKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IEdMRVMyMC5HTF9OT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiR0wgZXJyb3IgPSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGVycm9yKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigpOwogCiAgICAgICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXIoR0xFUzIwLkdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgICAgIGVycm9yID0gR0xFUzIwLmdsR2V0RXJyb3IoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gR0xFUzIwLkdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJHTCBlcnJvciA9IDB4IiArIEludGVnZXIudG9IZXhTdHJpbmcoZXJyb3IpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCk7CiAKICAgICAgICAgICAgICAgICBpZiAoIW1FZ2wuZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHN3YXAgYnVmZmVycyIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjaGVja0VnbEVycm9yKCk7CisKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjApOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKQEAgLTE0MSw2ICsxNDIsMjAgQEAKICAgICAgICAgICAgIGZpbmlzaEdMKCk7CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tFZ2xFcnJvcigpIHsKKyAgICAgICAgICAgIGludCBlcnJvciA9IG1FZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBFR0wxMC5FR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIExvZy53KExPR19UQUcsICJFR0wgZXJyb3IgPSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGVycm9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tHbEVycm9yKCkgeworICAgICAgICAgICAgaW50IGVycm9yID0gR0xFUzIwLmdsR2V0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBHTEVTMjAuR0xfTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMb2cudyhMT0dfVEFHLCAiR0wgZXJyb3IgPSAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGVycm9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgZmluaXNoR0woKSB7CiAgICAgICAgICAgICBtRWdsLmVnbERlc3Ryb3lDb250ZXh0KG1FZ2xEaXNwbGF5LCBtRWdsQ29udGV4dCk7CiAgICAgICAgICAgICBtRWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7CmRpZmYgLS1naXQgYS90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9HZXRCaXRtYXBBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvR2V0Qml0bWFwQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTIzYWFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvR2V0Qml0bWFwQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQudGVzdC5od3VpOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkVudmlyb25tZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OworaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIEdldEJpdG1hcEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyIHsKKyAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhOworICAgIHByaXZhdGUgVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIEZyYW1lTGF5b3V0IGNvbnRlbnQgPSBuZXcgRnJhbWVMYXlvdXQodGhpcyk7CisKKyAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFRleHR1cmVWaWV3KHRoaXMpOworICAgICAgICBtVGV4dHVyZVZpZXcuc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzKTsKKyAgICAgICAgYnV0dG9uLnNldFRleHQoIkNvcHkgYml0bWFwIHRvIC9zZGNhcmQvdGV4dHVyZXZpZXcucG5nIik7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIEJpdG1hcCBiID0gbVRleHR1cmVWaWV3LmdldEJpdG1hcCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkgKyAiL3RleHR1cmV2aWV3LnBuZyIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgYi5jb21wcmVzcyhCaXRtYXAuQ29tcHJlc3NGb3JtYXQuUE5HLCAxMDAsIG91dCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBjb250ZW50LmFkZFZpZXcobVRleHR1cmVWaWV3LCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDUwMCwgNDAwLCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBjb250ZW50LmFkZFZpZXcoYnV0dG9uLCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgR3Jhdml0eS5DRU5URVJfSE9SSVpPTlRBTCB8IEdyYXZpdHkuQk9UVE9NKSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGNvbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1DYW1lcmEgPSBDYW1lcmEub3BlbigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ2FtZXJhLnNldFByZXZpZXdUZXh0dXJlKHN1cmZhY2UpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLmUoIlRleHR1cmVWaWV3IiwgIkNhbm5vdCBzZXQgcHJldmlldyB0ZXh0dXJlIHRhcmdldCEiLCB0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1DYW1lcmEuc3RhcnRQcmV2aWV3KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICAvLyBJZ25vcmVkLCB0aGUgQ2FtZXJhIGRvZXMgYWxsIHRoZSB3b3JrIGZvciB1cworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVEZXN0cm95ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgeworICAgICAgICBtQ2FtZXJhLnN0b3BQcmV2aWV3KCk7CisgICAgICAgIG1DYW1lcmEucmVsZWFzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NtYWxsQ2lyY2xlQWN0aXZpdHkuamF2YSBiL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1NtYWxsQ2lyY2xlQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzAyNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvU21hbGxDaXJjbGVBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3QuaHd1aTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYXRoOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiJ9KQorcHVibGljIGNsYXNzIFNtYWxsQ2lyY2xlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIGZpbmFsIExpbmVhckxheW91dCBsYXlvdXQgPSBuZXcgTGluZWFyTGF5b3V0KHRoaXMpOworICAgICAgICBsYXlvdXQuc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKKworICAgICAgICBWaWV3IHZpZXcgPSBuZXcgUGF0aFZpZXcodGhpcyk7CisgICAgICAgIGxheW91dC5hZGRWaWV3KHZpZXcsIG5ldyBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zKFBhdGhWaWV3LlNJWkUsIFBhdGhWaWV3LlNJWkUpKTsKKyAgICAgICAgdmlldyA9IG5ldyBQYXRoVmlldyh0aGlzKTsKKyAgICAgICAgdmlldy5zZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBudWxsKTsKKyAgICAgICAgbGF5b3V0LmFkZFZpZXcodmlldywgbmV3IExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMoUGF0aFZpZXcuU0laRSwgUGF0aFZpZXcuU0laRSkpOworCisgICAgICAgIHNldENvbnRlbnRWaWV3KGxheW91dCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFBhdGhWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFID0gMzc7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGFpbnQgbVBhaW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFBhdGggbVBhdGg7CisKKyAgICAgICAgUGF0aFZpZXcoQ29udGV4dCBjKSB7CisgICAgICAgICAgICBzdXBlcihjKTsKKworICAgICAgICAgICAgbVBhdGggPSBuZXcgUGF0aCgpOworICAgICAgICAgICAgbVBhdGguYWRkQ2lyY2xlKFNJWkUgKiAwLjVmLCBTSVpFICogMC41ZiwgU0laRSAqIDAuMjc1ZiwgUGF0aC5EaXJlY3Rpb24uQ1cpOworICAgICAgICAgICAgbVBhdGguYWRkQ2lyY2xlKFNJWkUgKiAwLjVmLCBTSVpFICogMC41ZiwgU0laRSAqIDAuMjI1ZiwgUGF0aC5EaXJlY3Rpb24uQ0NXKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbVBhaW50ID0gbmV3IFBhaW50KCk7CisgICAgICAgICAgICBtUGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ZmZmZmZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKKworICAgICAgICAgICAgY2FudmFzLmRyYXdQYXRoKG1QYXRoLCBtUGFpbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dHVyZVZpZXdBY3Rpdml0eS5qYXZhIGIvdGVzdHMvSHdBY2NlbGVyYXRpb25UZXN0L3NyYy9jb20vYW5kcm9pZC90ZXN0L2h3dWkvVGV4dHVyZVZpZXdBY3Rpdml0eS5qYXZhCmluZGV4IDJmZWRhNTcuLmZhMmUzOWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0h3QWNjZWxlcmF0aW9uVGVzdC9zcmMvY29tL2FuZHJvaWQvdGVzdC9od3VpL1RleHR1cmVWaWV3QWN0aXZpdHkuamF2YQorKysgYi90ZXN0cy9Id0FjY2VsZXJhdGlvblRlc3Qvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvaHd1aS9UZXh0dXJlVmlld0FjdGl2aXR5LmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0Lmh3dWk7CiAKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRvclNldDsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5PYmplY3RBbmltYXRvcjsKIGltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5WYWx1ZUFuaW1hdG9yOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwpAQCAtMjUsNiArMjYsNyBAQAogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzMsMjcgKzM1LDQ0IEBACiBwdWJsaWMgY2xhc3MgVGV4dHVyZVZpZXdBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGltcGxlbWVudHMgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7CiAgICAgcHJpdmF0ZSBDYW1lcmEgbUNhbWVyYTsKICAgICBwcml2YXRlIFRleHR1cmVWaWV3IG1UZXh0dXJlVmlldzsKKyAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1Db250ZW50OworICAgIHByaXZhdGUgQW5pbWF0b3JTZXQgbUFuaW1hdG9yU2V0OwogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCisgICAgICAgIG1Db250ZW50ID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworCiAgICAgICAgIG1UZXh0dXJlVmlldyA9IG5ldyBUZXh0dXJlVmlldyh0aGlzKTsKICAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIodGhpcyk7CiAKLSAgICAgICAgc2V0Q29udGVudFZpZXcobVRleHR1cmVWaWV3LCBuZXcgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zKDUwMCwgNDAwLCBHcmF2aXR5LkNFTlRFUikpOworICAgICAgICBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbih0aGlzKTsKKyAgICAgICAgYnV0dG9uLnNldFRleHQoIlJlbW92ZS9BZGQiKTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFkZGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGlmIChtQWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuaW1hdG9yU2V0LmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBtQ29udGVudC5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRlbnQuYWRkVmlldyhtVGV4dHVyZVZpZXcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQWRkZWQgPSAhbUFkZGVkOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBtQ29udGVudC5hZGRWaWV3KG1UZXh0dXJlVmlldywgbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcyg1MDAsIDQwMCwgR3Jhdml0eS5DRU5URVIpKTsKKyAgICAgICAgbUNvbnRlbnQuYWRkVmlldyhidXR0b24sIG5ldyBGcmFtZUxheW91dC5MYXlvdXRQYXJhbXMoCisgICAgICAgICAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKKyAgICAgICAgICAgICAgICBHcmF2aXR5LkNFTlRFUl9IT1JJWk9OVEFMIHwgR3Jhdml0eS5CT1RUT00pKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobUNvbnRlbnQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKLSAgICAgICAgc3VwZXIub25EZXN0cm95KCk7Ci0KLSAgICAgICAgbUNhbWVyYS5zdG9wUHJldmlldygpOwotICAgICAgICBtQ2FtZXJhLnJlbGVhc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKKyAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhLm9wZW4oKTsKIAogICAgICAgICB0cnkgewpAQCAtNjYsMjcgKzg1LDM1IEBACiAKICAgICAgICAgbVRleHR1cmVWaWV3LnNldENhbWVyYURpc3RhbmNlKDUwMDApOwogCi0gICAgICAgIE9iamVjdEFuaW1hdG9yIGFuaW1hdG9yID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChtVGV4dHVyZVZpZXcsICJyb3RhdGlvblkiLCAwLjBmLCAzNjAuMGYpOwotICAgICAgICBhbmltYXRvci5zZXRSZXBlYXRNb2RlKE9iamVjdEFuaW1hdG9yLlJFVkVSU0UpOwotICAgICAgICBhbmltYXRvci5zZXRSZXBlYXRDb3VudChPYmplY3RBbmltYXRvci5JTkZJTklURSk7Ci0gICAgICAgIGFuaW1hdG9yLnNldER1cmF0aW9uKDQwMDApOwotICAgICAgICBhbmltYXRvci5hZGRVcGRhdGVMaXN0ZW5lcihuZXcgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyKCkgeworICAgICAgICBPYmplY3RBbmltYXRvciByb3RhdGlvblkgPSBPYmplY3RBbmltYXRvci5vZkZsb2F0KG1UZXh0dXJlVmlldywgInJvdGF0aW9uWSIsIDAuMGYsIDM2MC4wZik7CisgICAgICAgIHJvdGF0aW9uWS5zZXRSZXBlYXRNb2RlKE9iamVjdEFuaW1hdG9yLlJFVkVSU0UpOworICAgICAgICByb3RhdGlvblkuc2V0UmVwZWF0Q291bnQoT2JqZWN0QW5pbWF0b3IuSU5GSU5JVEUpOworICAgICAgICByb3RhdGlvblkuc2V0RHVyYXRpb24oNDAwMCk7CisgICAgICAgIHJvdGF0aW9uWS5hZGRVcGRhdGVMaXN0ZW5lcihuZXcgVmFsdWVBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyKCkgewogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShWYWx1ZUFuaW1hdG9yIGFuaW1hdGlvbikgewogICAgICAgICAgICAgICAgICgoVmlldykgbVRleHR1cmVWaWV3LmdldFBhcmVudCgpKS5pbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwotICAgICAgICBhbmltYXRvci5zdGFydCgpOwogCi0gICAgICAgIGFuaW1hdG9yID0gT2JqZWN0QW5pbWF0b3Iub2ZGbG9hdChtVGV4dHVyZVZpZXcsICJhbHBoYSIsIDEuMGYsIDAuMGYpOwotICAgICAgICBhbmltYXRvci5zZXRSZXBlYXRNb2RlKE9iamVjdEFuaW1hdG9yLlJFVkVSU0UpOwotICAgICAgICBhbmltYXRvci5zZXRSZXBlYXRDb3VudChPYmplY3RBbmltYXRvci5JTkZJTklURSk7Ci0gICAgICAgIGFuaW1hdG9yLnNldER1cmF0aW9uKDQwMDApOwotICAgICAgICBhbmltYXRvci5zdGFydCgpOworICAgICAgICBPYmplY3RBbmltYXRvciBhbHBoYSA9IE9iamVjdEFuaW1hdG9yLm9mRmxvYXQobVRleHR1cmVWaWV3LCAiYWxwaGEiLCAxLjBmLCAwLjBmKTsKKyAgICAgICAgYWxwaGEuc2V0UmVwZWF0TW9kZShPYmplY3RBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgYWxwaGEuc2V0UmVwZWF0Q291bnQoT2JqZWN0QW5pbWF0b3IuSU5GSU5JVEUpOworICAgICAgICBhbHBoYS5zZXREdXJhdGlvbig0MDAwKTsKKworICAgICAgICBtQW5pbWF0b3JTZXQgPSBuZXcgQW5pbWF0b3JTZXQoKTsKKyAgICAgICAgbUFuaW1hdG9yU2V0LnBsYXkoYWxwaGEpLndpdGgocm90YXRpb25ZKTsKKyAgICAgICAgbUFuaW1hdG9yU2V0LnN0YXJ0KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICAgICAgICAvLyBJZ25vcmVkLCB0aGUgQ2FtZXJhIGRvZXMgYWxsIHRoZSB3b3JrIGZvciB1cwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVEZXN0cm95ZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgeworICAgICAgICBtQ2FtZXJhLnN0b3BQcmV2aWV3KCk7CisgICAgICAgIG1DYW1lcmEucmVsZWFzZSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZCT1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZCT1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjMmUwY2M2Li43ODhlODU2IDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9GQk9UZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0zLDExICszLDIwIEBACiAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZmJvdGVzdCI+CiAgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Il9GQk9UZXN0Ij4KICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iRkJPVGVzdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkZCTyBCYXNlIFRlc3QiCiAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5CbGFjay5Ob1RpdGxlQmFyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4gICAgICAgIAorICAgICAgICA8L2FjdGl2aXR5PgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJGQk9TeW5jIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iRkJPIFN5bmMgVGVzdCIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkJsYWNrLk5vVGl0bGVCYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgogICAgIDwvYXBwbGljYXRpb24+CiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9GQk9TeW5jLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9GQk9UZXN0L3NyYy9jb20vYW5kcm9pZC9mYm90ZXN0L0ZCT1N5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBhZDdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9GQk9TeW5jLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZmJvdGVzdDsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKKworaW1wb3J0IGphdmEubGFuZy5SdW50aW1lOworCitwdWJsaWMgY2xhc3MgRkJPU3luYyBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgRkJPU3luY1ZpZXcgbVZpZXc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgRkJPU3luY1ZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9vc2VzIGZvY3VzCisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIG1WaWV3LnJlc3VtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7CisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3LnBhdXNlKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9GQk9UZXN0L3NyYy9jb20vYW5kcm9pZC9mYm90ZXN0L0ZCT1N5bmNSUy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9GQk9TeW5jUlMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ExMTdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9GQk9TeW5jUlMuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZmJvdGVzdDsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5FbGVtZW50LkRhdGFUeXBlOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LkVsZW1lbnQuRGF0YUtpbmQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUHJvZ3JhbVN0b3JlLkRlcHRoRnVuYzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5UeXBlLkJ1aWxkZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworCitwdWJsaWMgY2xhc3MgRkJPU3luY1JTIHsKKworICAgIHB1YmxpYyBGQk9TeW5jUlMoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcykgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgaW5pdFJTKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoKSB7CisgICAgICAgIG1SUy5nZXRXaWR0aCgpOworICAgICAgICBtUlMuZ2V0SGVpZ2h0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFNhbXBsZXIgbVNhbXBsZXI7CisgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVBTQmFja2dyb3VuZDsKKyAgICBwcml2YXRlIFByb2dyYW1GcmFnbWVudCBtUEZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleCBtUFZCYWNrZ3JvdW5kOworICAgIHByaXZhdGUgUHJvZ3JhbVZlcnRleEZpeGVkRnVuY3Rpb24uQ29uc3RhbnRzIG1QVkE7CisKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbUdyaWRJbWFnZTsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbU9mZnNjcmVlbjsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbU9mZnNjcmVlbkRlcHRoOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtQWxsb2NQVjsKKyAgICBwcml2YXRlIEFsbG9jYXRpb24gbVJlYWRCYWNrVGVzdDsKKworICAgIHByaXZhdGUgRm9udCBtSXRhbGljOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4dEFsbG9jOworCisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9NZXNoSW5mbyBtTWVzaGVzOworICAgIHByaXZhdGUgU2NyaXB0Q19mYm9zeW5jIG1TY3JpcHQ7CisKKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uRG93bihmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX29uQWN0aW9uRG93bih4LCB5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvblNjYWxlKGZsb2F0IHNjYWxlKSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX29uQWN0aW9uU2NhbGUoc2NhbGUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uTW92ZShmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX29uQWN0aW9uTW92ZSh4LCB5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFBGUygpIHsKKyAgICAgICAgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIgYiA9IG5ldyBQcm9ncmFtU3RvcmUuQnVpbGRlcihtUlMpOworCisgICAgICAgIGIuc2V0RGVwdGhGdW5jKFByb2dyYW1TdG9yZS5EZXB0aEZ1bmMuTEVTUyk7CisgICAgICAgIGIuc2V0RGl0aGVyRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGIuc2V0RGVwdGhNYXNrRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbVBTQmFja2dyb3VuZCA9IGIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BGU0JhY2tncm91bmQobVBTQmFja2dyb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRQRigpIHsKKyAgICAgICAgU2FtcGxlci5CdWlsZGVyIGJzID0gbmV3IFNhbXBsZXIuQnVpbGRlcihtUlMpOworICAgICAgICBicy5zZXRNaW5pZmljYXRpb24oU2FtcGxlci5WYWx1ZS5MSU5FQVIpOworICAgICAgICBicy5zZXRNYWduaWZpY2F0aW9uKFNhbXBsZXIuVmFsdWUuTElORUFSKTsKKyAgICAgICAgYnMuc2V0V3JhcFMoU2FtcGxlci5WYWx1ZS5DTEFNUCk7CisgICAgICAgIGJzLnNldFdyYXBUKFNhbXBsZXIuVmFsdWUuQ0xBTVApOworICAgICAgICBtU2FtcGxlciA9IGJzLmNyZWF0ZSgpOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlciBiID0gbmV3IFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlcihtUlMpOworICAgICAgICBiLnNldFRleHR1cmUoUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkVudk1vZGUuUkVQTEFDRSwKKyAgICAgICAgICAgICAgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5Gb3JtYXQuUkdCQSwgMCk7CisgICAgICAgIG1QRkJhY2tncm91bmQgPSBiLmNyZWF0ZSgpOworICAgICAgICBtUEZCYWNrZ3JvdW5kLmJpbmRTYW1wbGVyKG1TYW1wbGVyLCAwKTsKKworICAgICAgICBtU2NyaXB0LnNldF9nUEZCYWNrZ3JvdW5kKG1QRkJhY2tncm91bmQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UFYoKSB7CisgICAgICAgIFByb2dyYW1WZXJ0ZXhGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIgcHZiID0gbmV3IFByb2dyYW1WZXJ0ZXhGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgbVBWQmFja2dyb3VuZCA9IHB2Yi5jcmVhdGUoKTsKKworICAgICAgICBtUFZBID0gbmV3IFByb2dyYW1WZXJ0ZXhGaXhlZEZ1bmN0aW9uLkNvbnN0YW50cyhtUlMpOworICAgICAgICAoKFByb2dyYW1WZXJ0ZXhGaXhlZEZ1bmN0aW9uKW1QVkJhY2tncm91bmQpLmJpbmRDb25zdGFudHMobVBWQSk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BWQmFja2dyb3VuZChtUFZCYWNrZ3JvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEltYWdlKCkgeworICAgICAgICBtR3JpZEltYWdlID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tQml0bWFwUmVzb3VyY2UobVJTLCBtUmVzLCBSLmRyYXdhYmxlLnJvYm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGlvbi5NaXBtYXBDb250cm9sLk1JUE1BUF9PTl9TWU5DX1RPX1RFWFRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX0dSQVBISUNTX1RFWFRVUkUpOworICAgICAgICBtU2NyaXB0LnNldF9nVEdyaWQobUdyaWRJbWFnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRUZXh0QWxsb2NhdGlvbihTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIGFsbG9jU3RyaW5nID0gIkRpc3BsYXlpbmcgZmlsZTogIiArIGZpbGVOYW1lOworICAgICAgICBtVGV4dEFsbG9jID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgYWxsb2NTdHJpbmcsIEFsbG9jYXRpb24uVVNBR0VfU0NSSVBUKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleHRBbGxvYyhtVGV4dEFsbG9jKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdE1lc2hlcyhGaWxlQTNEIG1vZGVsKSB7CisgICAgICAgIGludCBudW1FbnRyaWVzID0gbW9kZWwuZ2V0SW5kZXhFbnRyeUNvdW50KCk7CisgICAgICAgIGludCBudW1NZXNoZXMgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoaSk7CisgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCAmJiBlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBGaWxlQTNELkVudHJ5VHlwZS5NRVNIKSB7CisgICAgICAgICAgICAgICAgbnVtTWVzaGVzICsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bU1lc2hlcyA+IDApIHsKKyAgICAgICAgICAgIG1NZXNoZXMgPSBuZXcgU2NyaXB0RmllbGRfTWVzaEluZm8obVJTLCBudW1NZXNoZXMpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlQTNELkluZGV4RW50cnkgZW50cnkgPSBtb2RlbC5nZXRJbmRleEVudHJ5KGkpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmdldEVudHJ5VHlwZSgpID09IEZpbGVBM0QuRW50cnlUeXBlLk1FU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVzaCBtZXNoID0gZW50cnkuZ2V0TWVzaCgpOworICAgICAgICAgICAgICAgICAgICBtTWVzaGVzLnNldF9tTWVzaChpLCBtZXNoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIG1NZXNoZXMuc2V0X21OdW1JbmRleFNldHMoaSwgbWVzaC5nZXRQcmltaXRpdmVDb3VudCgpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lc2hlcy5jb3B5QWxsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUlNSdW50aW1lRXhjZXB0aW9uKCJObyB2YWxpZCBtZXNoZXMgaW4gZmlsZSIpOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dNZXNoZXMobU1lc2hlcyk7CisgICAgICAgIG1TY3JpcHQuaW52b2tlX3VwZGF0ZU1lc2hJbmZvKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9hZEEzREZpbGUoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgRmlsZUEzRCBtb2RlbCA9IEZpbGVBM0QuY3JlYXRlRnJvbUZpbGUobVJTLCBwYXRoKTsKKyAgICAgICAgaW5pdE1lc2hlcyhtb2RlbCk7CisgICAgICAgIGluaXRUZXh0QWxsb2NhdGlvbihwYXRoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdFJTKCkgeworCisgICAgICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19mYm9zeW5jKG1SUywgbVJlcywgUi5yYXcuZmJvc3luYyk7CisKKyAgICAgICAgaW5pdFBGUygpOworICAgICAgICBpbml0UEYoKTsKKyAgICAgICAgaW5pdFBWKCk7CisKKyAgICAgICAgbG9hZEltYWdlKCk7CisKKyAgICAgICAgVHlwZS5CdWlsZGVyIGIgPSBuZXcgVHlwZS5CdWlsZGVyKG1SUywgRWxlbWVudC5SR0JBXzg4ODgobVJTKSk7CisgICAgICAgIGIuc2V0WCg1MTIpLnNldFkoNTEyKTsKKyAgICAgICAgbU9mZnNjcmVlbiA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNyZWF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfVEVYVFVSRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfUkVOREVSX1RBUkdFVCk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dPZmZzY3JlZW4obU9mZnNjcmVlbik7CisKKyAgICAgICAgbVJlYWRCYWNrVGVzdCA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNyZWF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfVEVYVFVSRSk7CisgICAgICAgIG1TY3JpcHQuc2V0X2dSZWFkQmFja1Rlc3QobVJlYWRCYWNrVGVzdCk7CisKKyAgICAgICAgYiA9IG5ldyBUeXBlLkJ1aWxkZXIobVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50LmNyZWF0ZVBpeGVsKG1SUywgRGF0YVR5cGUuVU5TSUdORURfMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFLaW5kLlBJWEVMX0RFUFRIKSk7CisgICAgICAgIGIuc2V0WCg1MTIpLnNldFkoNTEyKTsKKyAgICAgICAgbU9mZnNjcmVlbkRlcHRoID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChtUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jcmVhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uLlVTQUdFX0dSQVBISUNTX1JFTkRFUl9UQVJHRVQpOworICAgICAgICBtU2NyaXB0LnNldF9nT2Zmc2NyZWVuRGVwdGgobU9mZnNjcmVlbkRlcHRoKTsKKworICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy5yb2JvdCk7CisgICAgICAgIGluaXRNZXNoZXMobW9kZWwpOworCisgICAgICAgIG1JdGFsaWMgPSBGb250LmNyZWF0ZShtUlMsIG1SZXMsICJzZXJpZiIsIEZvbnQuU3R5bGUuSVRBTElDLCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0l0YWxpYyhtSXRhbGljKTsKKworICAgICAgICBpbml0VGV4dEFsbG9jYXRpb24oIlIucmF3LnJvYm90Iik7CisKKyAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZCT1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2Zib3Rlc3QvRkJPU3luY1ZpZXcuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZCT1Rlc3Qvc3JjL2NvbS9hbmRyb2lkL2Zib3Rlc3QvRkJPU3luY1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg1NjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9GQk9TeW5jVmlldy5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mYm90ZXN0OworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU2NhbGVHZXN0dXJlRGV0ZWN0b3I7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworcHVibGljIGNsYXNzIEZCT1N5bmNWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIEZCT1N5bmNSUyBtUmVuZGVyOworCisgICAgcHJpdmF0ZSBTY2FsZUdlc3R1cmVEZXRlY3RvciBtU2NhbGVEZXRlY3RvcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1BPSU5URVJfSUQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSX0lEOworCisgICAgcHVibGljIEZCT1N5bmNWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgZW5zdXJlUmVuZGVyU2NyaXB0KCk7CisgICAgICAgIG1TY2FsZURldGVjdG9yID0gbmV3IFNjYWxlR2VzdHVyZURldGVjdG9yKGNvbnRleHQsIG5ldyBTY2FsZUxpc3RlbmVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSZW5kZXJTY3JpcHQoKSB7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CisgICAgICAgICAgICBzYy5zZXREZXB0aCgxNiwgMjQpOworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0R0woc2MpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGQk9TeW5jUlMoKTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKKyAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7CisgICAgICAgIGVuc3VyZVJlbmRlclNjcmlwdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBtUmVuZGVyLnN1cmZhY2VDaGFuZ2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIG1SZW5kZXIgPSBudWxsOworICAgICAgICBpZiAobVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0R0woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvYWRBM0RGaWxlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIG1SZW5kZXIubG9hZEEzREZpbGUocGF0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KSB7CisgICAgICAgIG1TY2FsZURldGVjdG9yLm9uVG91Y2hFdmVudChldik7CisKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgZmxvYXQgeCA9IGV2LmdldFgoKTsKKyAgICAgICAgZmxvYXQgeSA9IGV2LmdldFkoKTsKKworICAgICAgICBmaW5hbCBpbnQgYWN0aW9uID0gZXYuZ2V0QWN0aW9uKCk7CisKKyAgICAgICAgc3dpdGNoIChhY3Rpb24gJiBNb3Rpb25FdmVudC5BQ1RJT05fTUFTSykgeworICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOOiB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bih4LCB5KTsKKyAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQoMCk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fTU9WRTogeworICAgICAgICAgICAgaWYgKCFtU2NhbGVEZXRlY3Rvci5pc0luUHJvZ3Jlc3MoKSkgeworICAgICAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Nb3ZlKHgsIHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbkRvd24oeCwgeSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9VUDogeworICAgICAgICAgICAgbUFjdGl2ZVBvaW50ZXJJZCA9IElOVkFMSURfUE9JTlRFUl9JRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fQ0FOQ0VMOiB7CisgICAgICAgICAgICBtQWN0aXZlUG9pbnRlcklkID0gSU5WQUxJRF9QT0lOVEVSX0lEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1vdGlvbkV2ZW50LkFDVElPTl9QT0lOVEVSX1VQOiB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRlckluZGV4ID0gKGV2LmdldEFjdGlvbigpICYgTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgPj4gTW90aW9uRXZlbnQuQUNUSU9OX1BPSU5URVJfSU5ERVhfU0hJRlQ7CisgICAgICAgICAgICBmaW5hbCBpbnQgcG9pbnRlcklkID0gZXYuZ2V0UG9pbnRlcklkKHBvaW50ZXJJbmRleCk7CisgICAgICAgICAgICBpZiAocG9pbnRlcklkID09IG1BY3RpdmVQb2ludGVySWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdhcyBvdXIgYWN0aXZlIHBvaW50ZXIgZ29pbmcgdXAuIENob29zZSBhIG5ldworICAgICAgICAgICAgICAgIC8vIGFjdGl2ZSBwb2ludGVyIGFuZCBhZGp1c3QgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICAgICAgZmluYWwgaW50IG5ld1BvaW50ZXJJbmRleCA9IHBvaW50ZXJJbmRleCA9PSAwID8gMSA6IDA7CisgICAgICAgICAgICAgICAgeCA9IGV2LmdldFgobmV3UG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgICAgICB5ID0gZXYuZ2V0WShuZXdQb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKHgsIHkpOworICAgICAgICAgICAgICAgIG1BY3RpdmVQb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQobmV3UG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU2NhbGVMaXN0ZW5lciBleHRlbmRzIFNjYWxlR2VzdHVyZURldGVjdG9yLlNpbXBsZU9uU2NhbGVHZXN0dXJlTGlzdGVuZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25TY2FsZShTY2FsZUdlc3R1cmVEZXRlY3RvciBkZXRlY3RvcikgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvblNjYWxlKGRldGVjdG9yLmdldFNjYWxlRmFjdG9yKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9mYm9zeW5jLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRkJPVGVzdC9zcmMvY29tL2FuZHJvaWQvZmJvdGVzdC9mYm9zeW5jLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2NjYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9GQk9UZXN0L3NyYy9jb20vYW5kcm9pZC9mYm90ZXN0L2Zib3N5bmMucnMKQEAgLTAsMCArMSwyMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5mYm90ZXN0KQorCisjaW5jbHVkZSAicnNfZ3JhcGhpY3MucnNoIgorCityc19wcm9ncmFtX3ZlcnRleCBnUFZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworCityc19hbGxvY2F0aW9uIGdUR3JpZDsKKworcnNfcHJvZ3JhbV9zdG9yZSBnUEZTQmFja2dyb3VuZDsKKworcnNfZm9udCBnSXRhbGljOworcnNfYWxsb2NhdGlvbiBnVGV4dEFsbG9jOworCityc19hbGxvY2F0aW9uIGdPZmZzY3JlZW47Cityc19hbGxvY2F0aW9uIGdPZmZzY3JlZW5EZXB0aDsKK3JzX2FsbG9jYXRpb24gZ1JlYWRCYWNrVGVzdDsKKwordHlwZWRlZiBzdHJ1Y3QgTWVzaEluZm8geworICAgIHJzX21lc2ggbU1lc2g7CisgICAgaW50IG1OdW1JbmRleFNldHM7CisgICAgZmxvYXQzIGJCb3hNaW47CisgICAgZmxvYXQzIGJCb3hNYXg7Cit9IE1lc2hJbmZvX3Q7CisKK01lc2hJbmZvX3QgKmdNZXNoZXM7CisKK3N0YXRpYyBmbG9hdDMgZ0xvb2tBdDsKKworc3RhdGljIGZsb2F0IGdSb3RhdGVYOworc3RhdGljIGZsb2F0IGdSb3RhdGVZOworc3RhdGljIGZsb2F0IGdab29tOworCitzdGF0aWMgZmxvYXQgZ0xhc3RYOworc3RhdGljIGZsb2F0IGdMYXN0WTsKKwordm9pZCBvbkFjdGlvbkRvd24oZmxvYXQgeCwgZmxvYXQgeSkgeworICAgIGdMYXN0WCA9IHg7CisgICAgZ0xhc3RZID0geTsKK30KKwordm9pZCBvbkFjdGlvblNjYWxlKGZsb2F0IHNjYWxlKSB7CisKKyAgICBnWm9vbSAqPSAxLjBmIC8gc2NhbGU7CisgICAgZ1pvb20gPSBtYXgoMC4xZiwgbWluKGdab29tLCA1MDAuMGYpKTsKK30KKwordm9pZCBvbkFjdGlvbk1vdmUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgIGZsb2F0IGR4ID0gZ0xhc3RYIC0geDsKKyAgICBmbG9hdCBkeSA9IGdMYXN0WSAtIHk7CisKKyAgICBpZiAoZmFicyhkeSkgPD0gMi4wZikgeworICAgICAgICBkeSA9IDAuMGY7CisgICAgfQorICAgIGlmIChmYWJzKGR4KSA8PSAyLjBmKSB7CisgICAgICAgIGR4ID0gMC4wZjsKKyAgICB9CisKKyAgICBnUm90YXRlWSAtPSBkeDsKKyAgICBpZiAoZ1JvdGF0ZVkgPiAzNjApIHsKKyAgICAgICAgZ1JvdGF0ZVkgLT0gMzYwOworICAgIH0KKyAgICBpZiAoZ1JvdGF0ZVkgPCAwKSB7CisgICAgICAgIGdSb3RhdGVZICs9IDM2MDsKKyAgICB9CisKKyAgICBnUm90YXRlWCAtPSBkeTsKKyAgICBnUm90YXRlWCA9IG1pbihnUm90YXRlWCwgODAuMGYpOworICAgIGdSb3RhdGVYID0gbWF4KGdSb3RhdGVYLCAtODAuMGYpOworCisgICAgZ0xhc3RYID0geDsKKyAgICBnTGFzdFkgPSB5OworfQorCit2b2lkIGluaXQoKSB7CisgICAgZ1JvdGF0ZVggPSAwLjBmOworICAgIGdSb3RhdGVZID0gMC4wZjsKKyAgICBnWm9vbSA9IDUwLjBmOworICAgIGdMb29rQXQgPSAwLjBmOworfQorCit2b2lkIHVwZGF0ZU1lc2hJbmZvKCkgeworICAgIHJzX2FsbG9jYXRpb24gYWxsTWVzaGVzID0gcnNHZXRBbGxvY2F0aW9uKGdNZXNoZXMpOworICAgIGludCBzaXplID0gcnNBbGxvY2F0aW9uR2V0RGltWChhbGxNZXNoZXMpOworICAgIGdMb29rQXQgPSAwLjBmOworICAgIGZsb2F0IG1pblgsIG1pblksIG1pblosIG1heFgsIG1heFksIG1heFo7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgTWVzaEluZm9fdCAqaW5mbyA9IChNZXNoSW5mb190Kilyc0dldEVsZW1lbnRBdChhbGxNZXNoZXMsIGkpOworICAgICAgICByc2dNZXNoQ29tcHV0ZUJvdW5kaW5nQm94KGluZm8tPm1NZXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5YLCAmbWluWSwgJm1pblosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFgsICZtYXhZLCAmbWF4Wik7CisgICAgICAgIGluZm8tPmJCb3hNaW4gPSAobWluWCwgbWluWSwgbWluWik7CisgICAgICAgIGluZm8tPmJCb3hNYXggPSAobWF4WCwgbWF4WSwgbWF4Wik7CisgICAgICAgIGdMb29rQXQgKz0gKGluZm8tPmJCb3hNaW4gKyBpbmZvLT5iQm94TWF4KSowLjVmOworICAgIH0KKyAgICBnTG9va0F0ID0gZ0xvb2tBdCAvIChmbG9hdClzaXplOworfQorCitzdGF0aWMgdm9pZCByZW5kZXJBbGxNZXNoZXMoKSB7CisgICAgcnNfYWxsb2NhdGlvbiBhbGxNZXNoZXMgPSByc0dldEFsbG9jYXRpb24oZ01lc2hlcyk7CisgICAgaW50IHNpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKGFsbE1lc2hlcyk7CisgICAgZ0xvb2tBdCA9IDAuMGY7CisgICAgZmxvYXQgbWluWCwgbWluWSwgbWluWiwgbWF4WCwgbWF4WSwgbWF4WjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBNZXNoSW5mb190ICppbmZvID0gKE1lc2hJbmZvX3QqKXJzR2V0RWxlbWVudEF0KGFsbE1lc2hlcywgaSk7CisgICAgICAgIHJzZ0RyYXdNZXNoKGluZm8tPm1NZXNoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdEZXNjcmlwdGlvbigpIHsKKyAgICB1aW50IHdpZHRoID0gcnNnR2V0V2lkdGgoKTsKKyAgICB1aW50IGhlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworCisgICAgcnNnQmluZEZvbnQoZ0l0YWxpYyk7CisKKyAgICByc2dNZWFzdXJlVGV4dChnVGV4dEFsbG9jLCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICByc2dEcmF3VGV4dChnVGV4dEFsbG9jLCAyIC1sZWZ0LCBoZWlnaHQgLSAyICsgYm90dG9tKTsKK30KKworc3RhdGljIHZvaWQgcmVuZGVyT2Zmc2NyZWVuKGJvb2wgdXNlRGVwdGgpIHsKKworICAgIHJzZ0JpbmRDb2xvclRhcmdldChnT2Zmc2NyZWVuLCAwKTsKKyAgICBpZiAodXNlRGVwdGgpIHsKKyAgICAgICAgcnNnQmluZERlcHRoVGFyZ2V0KGdPZmZzY3JlZW5EZXB0aCk7CisgICAgICAgIHJzZ0NsZWFyRGVwdGgoMS4wZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnNnQ2xlYXJEZXB0aFRhcmdldCgpOworICAgIH0KKyAgICByc2dDbGVhckNvbG9yKDAuOGYsIDAuMGYsIDAuMGYsIDEuMGYpOworCisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmFja2dyb3VuZCk7CisgICAgcnNfbWF0cml4NHg0IHByb2o7CisgICAgZmxvYXQgYXNwZWN0ID0gKGZsb2F0KXJzQWxsb2NhdGlvbkdldERpbVgoZ09mZnNjcmVlbikgLyAoZmxvYXQpcnNBbGxvY2F0aW9uR2V0RGltWShnT2Zmc2NyZWVuKTsKKyAgICByc01hdHJpeExvYWRQZXJzcGVjdGl2ZSgmcHJvaiwgMzAuMGYsIGFzcGVjdCwgMS4wZiwgMTAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZFByb2plY3Rpb25NYXRyaXgoJnByb2opOworCisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUEZCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQRlNCYWNrZ3JvdW5kKTsKKyAgICByc2dCaW5kVGV4dHVyZShnUEZCYWNrZ3JvdW5kLCAwLCBnVEdyaWQpOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRJZGVudGl0eSgmbWF0cml4KTsKKyAgICAvLyBQb3NpdGlvbiBvdXIgbW9kZWxzIG9uIHRoZSBzY3JlZW4KKyAgICByc01hdHJpeFRyYW5zbGF0ZSgmbWF0cml4LCBnTG9va0F0LngsIGdMb29rQXQueSwgZ0xvb2tBdC56IC0gZ1pvb20pOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdSb3RhdGVYLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc01hdHJpeFJvdGF0ZSgmbWF0cml4LCBnUm90YXRlWSwgMC4wZiwgMS4wZiwgMC4wZik7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKworICAgIHJlbmRlckFsbE1lc2hlcygpOworCisgICAgLy8gUmVuZGVyIGludG8gdGhlIGZyYW1idWZmZXIKKyAgICByc2dDbGVhckFsbFJlbmRlclRhcmdldHMoKTsKK30KKworc3RhdGljIHZvaWQgZHJhd09mZnNjcmVlblJlc3VsdChpbnQgcG9zWCwgaW50IHBvc1ksIHJzX2FsbG9jYXRpb24gdGV4dHVyZSkgeworICAgIC8vIGRpc3BsYXkgdGhlIHJlc3VsdAorICAgIHJzX21hdHJpeDR4NCBwcm9qLCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkT3J0aG8oJnByb2osIDAsIHJzZ0dldFdpZHRoKCksIHJzZ0dldEhlaWdodCgpLCAwLCAtNTAwLCA1MDApOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisgICAgcnNNYXRyaXhMb2FkSWRlbnRpdHkoJm1hdHJpeCk7CisgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmbWF0cml4KTsKKyAgICByc2dCaW5kVGV4dHVyZShnUEZCYWNrZ3JvdW5kLCAwLCB0ZXh0dXJlKTsKKyAgICBmbG9hdCBzdGFydFggPSBwb3NYLCBzdGFydFkgPSBwb3NZOworICAgIGZsb2F0IHdpZHRoID0gMjU2LCBoZWlnaHQgPSAyNTY7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoc3RhcnRYLCBzdGFydFksIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYLCBzdGFydFkgKyBoZWlnaHQsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRYICsgd2lkdGgsIHN0YXJ0WSArIGhlaWdodCwgMCwgMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFggKyB3aWR0aCwgc3RhcnRZLCAwLCAxLCAxKTsKK30KKworaW50IHJvb3Qodm9pZCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigxLjBmLCAxLjBmLCAxLjBmLCAxLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgcmVuZGVyT2Zmc2NyZWVuKHRydWUpOworICAgIGRyYXdPZmZzY3JlZW5SZXN1bHQoMCwgMCwgZ09mZnNjcmVlbik7CisKKworICAgIHVpbnQzMl90IHcgPSByc0FsbG9jYXRpb25HZXREaW1YKGdPZmZzY3JlZW4pOworICAgIHVpbnQzMl90IGggPSByc0FsbG9jYXRpb25HZXREaW1ZKGdPZmZzY3JlZW4pOworICAgIHVpbnQzMl90IG51bUVsZW1lbnRzID0gdypoOworCisgICAgcnNnQWxsb2NhdGlvblN5bmNBbGwoZ09mZnNjcmVlbiwgUlNfQUxMT0NBVElPTl9VU0FHRV9HUkFQSElDU19SRU5ERVJfVEFSR0VUKTsKKworICAgIHJzQWxsb2NhdGlvbkNvcHkyRFJhbmdlKGdSZWFkQmFja1Rlc3QsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNfQUxMT0NBVElPTl9DVUJFTUFQX0ZBQ0VfUE9TSVRJVkVfWCwgdywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnT2Zmc2NyZWVuLCAwLCAwLCAwLCBSU19BTExPQ0FUSU9OX0NVQkVNQVBfRkFDRV9QT1NJVElWRV9YKTsKKworICAgIHJzZ0FsbG9jYXRpb25TeW5jQWxsKGdSZWFkQmFja1Rlc3QpOworICAgIGRyYXdPZmZzY3JlZW5SZXN1bHQoMCwgMzAwLCBnUmVhZEJhY2tUZXN0KTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVkJhY2tncm91bmQpOworICAgIHJzX21hdHJpeDR4NCBwcm9qOworICAgIGZsb2F0IGFzcGVjdCA9IChmbG9hdClyc2dHZXRXaWR0aCgpIC8gKGZsb2F0KXJzZ0dldEhlaWdodCgpOworICAgIHJzTWF0cml4TG9hZFBlcnNwZWN0aXZlKCZwcm9qLCAzMC4wZiwgYXNwZWN0LCAxLjBmLCAxMDAuMGYpOworICAgIHJzZ1Byb2dyYW1WZXJ0ZXhMb2FkUHJvamVjdGlvbk1hdHJpeCgmcHJvaik7CisKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1BGU0JhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUR3JpZCk7CisKKyAgICByc19tYXRyaXg0eDQgbWF0cml4OworICAgIHJzTWF0cml4TG9hZElkZW50aXR5KCZtYXRyaXgpOworICAgIC8vIFBvc2l0aW9uIG91ciBtb2RlbHMgb24gdGhlIHNjcmVlbgorICAgIHJzTWF0cml4VHJhbnNsYXRlKCZtYXRyaXgsIGdMb29rQXQueCwgZ0xvb2tBdC55LCBnTG9va0F0LnogLSBnWm9vbSk7CisgICAgcnNNYXRyaXhSb3RhdGUoJm1hdHJpeCwgZ1JvdGF0ZVgsIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGdSb3RhdGVZLCAwLjBmLCAxLjBmLCAwLjBmKTsKKyAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZtYXRyaXgpOworCisgICAgcmVuZGVyQWxsTWVzaGVzKCk7CisKKyAgICBkcmF3RGVzY3JpcHRpb24oKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3QvcmVzL2RyYXdhYmxlL2ZsYXJlcy5wbmcgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9QZXJmVGVzdC9yZXMvZHJhd2FibGUvZmxhcmVzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTVjOTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3QvcmVzL2RyYXdhYmxlL2ZsYXJlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3QvcmVzL2RyYXdhYmxlL2dsb2JlLnBuZyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1BlcmZUZXN0L3Jlcy9kcmF3YWJsZS9nbG9iZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjlkNjE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1BlcmZUZXN0L3Jlcy9kcmF3YWJsZS9nbG9iZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3QvcmVzL2RyYXdhYmxlL2xpZ2h0MS5qcGcgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9QZXJmVGVzdC9yZXMvZHJhd2FibGUvbGlnaHQxLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjJmMTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3QvcmVzL2RyYXdhYmxlL2xpZ2h0MS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3QvcmVzL2RyYXdhYmxlL3NwYWNlLmpwZyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1BlcmZUZXN0L3Jlcy9kcmF3YWJsZS9zcGFjZS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxZjZhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1BlcmZUZXN0L3Jlcy9kcmF3YWJsZS9zcGFjZS5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3Qvc3JjL2NvbS9hbmRyb2lkL3BlcmZ0ZXN0L1JzQmVuY2hSUy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3Qvc3JjL2NvbS9hbmRyb2lkL3BlcmZ0ZXN0L1JzQmVuY2hSUy5qYXZhCmluZGV4IDUzNzdmMTIuLjNmNTc3OTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1BlcmZUZXN0L3NyYy9jb20vYW5kcm9pZC9wZXJmdGVzdC9Sc0JlbmNoUlMuamF2YQorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9QZXJmVGVzdC9zcmMvY29tL2FuZHJvaWQvcGVyZnRlc3QvUnNCZW5jaFJTLmphdmEKQEAgLTM4LDEzICszOCwyMCBAQAogaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlByb2dyYW1TdG9yZS5CbGVuZERzdEZ1bmM7CiBpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0LlJTTWVzc2FnZUhhbmRsZXI7CiBpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuU2FtcGxlci5WYWx1ZTsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NZXNoLlByaW1pdGl2ZTsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5NYXRyaXg0ZjsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5Qcm9ncmFtVmVydGV4Rml4ZWRGdW5jdGlvbjsKKwogaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAKIAogcHVibGljIGNsYXNzIFJzQmVuY2hSUyB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJzQmVuY2hSUyI7Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUExFX1RFWFQgPSAiQmVuY2ggVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfVEVYVCA9CisgICAgICAiVGhpcyBpcyBhIHNhbXBsZSBsaXN0IG9mIHRleHQgdG8gc2hvdyBpbiB0aGUgbGlzdCB2aWV3IjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgUEFSVElDTEVTX0NPVU5UID0gMTIwMDA7CiAgICAgaW50IG1XaWR0aDsKICAgICBpbnQgbUhlaWdodDsKICAgICBpbnQgbUxvb3BzOwpAQCAtODEsNiArODgsNyBAQAogICAgIHByaXZhdGUgU2FtcGxlciBtTGluZWFyV3JhcDsKICAgICBwcml2YXRlIFNhbXBsZXIgbU1pcExpbmVhcldyYXA7CiAgICAgcHJpdmF0ZSBTYW1wbGVyIG1OZWFyZXN0Q2xhbXA7CisgICAgcHJpdmF0ZSBTYW1wbGVyIG1OZWFyZXNXcmFwOwogCiAgICAgcHJpdmF0ZSBQcm9ncmFtU3RvcmUgbVByb2dTdG9yZUJsZW5kTm9uZURlcHRoOwogICAgIHByaXZhdGUgUHJvZ3JhbVN0b3JlIG1Qcm9nU3RvcmVCbGVuZE5vbmU7CkBAIC0xMDUsNiArMTEzLDcgQEAKICAgICBwcml2YXRlIFNjcmlwdEZpZWxkX1ZlcnRleFNoYWRlckNvbnN0YW50czNfcyBtVlNDb25zdFBpeGVsOwogICAgIHByaXZhdGUgU2NyaXB0RmllbGRfRnJhZ2VudFNoYWRlckNvbnN0YW50czNfcyBtRlNDb25zdFBpeGVsOwogCisKICAgICBwcml2YXRlIFByb2dyYW1SYXN0ZXIgbUN1bGxCYWNrOwogICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtQ3VsbEZyb250OwogICAgIHByaXZhdGUgUHJvZ3JhbVJhc3RlciBtQ3VsbE5vbmU7CkBAIC0xMTMsMTYgKzEyMiwyNSBAQAogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4T3BhcXVlOwogICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4VHJhbnNwYXJlbnQ7CiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXhDaGVja2VyOworICAgIHByaXZhdGUgQWxsb2NhdGlvbiBtVGV4R2xvYmU7CiAKICAgICBwcml2YXRlIE1lc2ggbTEwYnkxME1lc2g7CiAgICAgcHJpdmF0ZSBNZXNoIG0xMDBieTEwME1lc2g7CiAgICAgcHJpdmF0ZSBNZXNoIG1XYnlITWVzaDsKICAgICBwcml2YXRlIE1lc2ggbVRvcnVzOworICAgIHByaXZhdGUgTWVzaCBtU2luZ2xlTWVzaDsKKyAgICBwcml2YXRlIE1lc2ggbVBhcnRpY2xlc01lc2g7CiAKICAgICBGb250IG1Gb250U2FuczsKICAgICBGb250IG1Gb250U2VyaWY7CiAgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIG1UZXh0QWxsb2M7CiAKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtVGV4dHVyZUFsbG9jczsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtU2FtcGxlVGV4dEFsbG9jczsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3NfcyBtU2FtcGxlTGlzdFZpZXdBbGxvY3M7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9WcENvbnN0cyBtUHZTdGFyQWxsb2M7CisKKwogICAgIHByaXZhdGUgU2NyaXB0Q19yc2JlbmNoIG1TY3JpcHQ7CiAKICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBtT3B0aW9uc0FSR0IgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7CkBAIC0yNTMsNiArMjcxLDI3IEBACiAgICAgICAgIHJldHVybiB0bWIuY3JlYXRlKHRydWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG1lc2ggd2l0aCBhIHNpbmdsZSBxdWFkIGZvciB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1lc2ggZ2V0U2luZ2xlTWVzaChmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0KSB7CisgICAgICAgIE1lc2guVHJpYW5nbGVNZXNoQnVpbGRlciB0bWIgPSBuZXcgTWVzaC5UcmlhbmdsZU1lc2hCdWlsZGVyKG1SUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBNZXNoLlRyaWFuZ2xlTWVzaEJ1aWxkZXIuVEVYVFVSRV8wKTsKKyAgICAgICAgZmxvYXQgeE9mZnNldCA9IHdpZHRoLzI7CisgICAgICAgIGZsb2F0IHlPZmZzZXQgPSBoZWlnaHQvMjsKKyAgICAgICAgdG1iLnNldFRleHR1cmUoMCwgMCk7CisgICAgICAgIHRtYi5hZGRWZXJ0ZXgoLTEuMGYgKiB4T2Zmc2V0LCAtMS4wZiAqIHlPZmZzZXQpOworICAgICAgICB0bWIuc2V0VGV4dHVyZSgxLCAwKTsKKyAgICAgICAgdG1iLmFkZFZlcnRleCh4T2Zmc2V0LCAtMS4wZiAqIHlPZmZzZXQpOworICAgICAgICB0bWIuc2V0VGV4dHVyZSgxLCAxKTsKKyAgICAgICAgdG1iLmFkZFZlcnRleCh4T2Zmc2V0LCB5T2Zmc2V0KTsKKyAgICAgICAgdG1iLnNldFRleHR1cmUoMCwgMSk7CisgICAgICAgIHRtYi5hZGRWZXJ0ZXgoLTEuMGYgKiB4T2Zmc2V0LCB5T2Zmc2V0KTsKKyAgICAgICAgdG1iLmFkZFRyaWFuZ2xlKDAsIDMsIDEpOworICAgICAgICB0bWIuYWRkVHJpYW5nbGUoMSwgMywgMik7CisgICAgICAgIHJldHVybiB0bWIuY3JlYXRlKHRydWUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBpbml0UHJvZ3JhbVN0b3JlKCkgewogICAgICAgICAvLyBVc2Ugc3RvY2sgdGhlIHN0b2NrIHByb2dyYW0gc3RvcmUgb2JqZWN0CiAgICAgICAgIG1Qcm9nU3RvcmVCbGVuZE5vbmVEZXB0aCA9IFByb2dyYW1TdG9yZS5CTEVORF9OT05FX0RFUFRIX1RFU1QobVJTKTsKQEAgLTI3Myw2ICszMTIsMTUgQEAKICAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kTm9uZShtUHJvZ1N0b3JlQmxlbmROb25lKTsKICAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dTdG9yZUJsZW5kQWxwaGEobVByb2dTdG9yZUJsZW5kQWxwaGEpOwogICAgICAgICBtU2NyaXB0LnNldF9nUHJvZ1N0b3JlQmxlbmRBZGQobVByb2dTdG9yZUJsZW5kQWRkKTsKKworICAgICAgICAvLyBGb3IgR0FMQVhZCisgICAgICAgIGJ1aWxkZXIgPSBuZXcgUHJvZ3JhbVN0b3JlLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnVpbGRlci5zZXRCbGVuZEZ1bmMoQmxlbmRTcmNGdW5jLk9ORSwgQmxlbmREc3RGdW5jLlpFUk8pOworICAgICAgICBtUlMuYmluZFByb2dyYW1TdG9yZShidWlsZGVyLmNyZWF0ZSgpKTsKKworICAgICAgICBidWlsZGVyLnNldEJsZW5kRnVuYyhCbGVuZFNyY0Z1bmMuU1JDX0FMUEhBLCBCbGVuZERzdEZ1bmMuT05FKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BTTGlnaHRzKGJ1aWxkZXIuY3JlYXRlKCkpOworCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtRnJhZ21lbnQoKSB7CkBAIC0yODksOCArMzM3LDU5IEBACiAKICAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dGcmFnbWVudENvbG9yKG1Qcm9nRnJhZ21lbnRDb2xvcik7CiAgICAgICAgIG1TY3JpcHQuc2V0X2dQcm9nRnJhZ21lbnRUZXh0dXJlKG1Qcm9nRnJhZ21lbnRUZXh0dXJlKTsKKworCisgICAgICAgIC8vIEZvciBHYWxheHkgbGl2ZSB3YWxscGFwZXIgZHJhd2luZworICAgICAgICBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnVpbGRlci5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlLlJFUExBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIuRm9ybWF0LlJHQiwgMCk7CisgICAgICAgIFByb2dyYW1GcmFnbWVudCBwZmIgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICBwZmIuYmluZFNhbXBsZXIobU5lYXJlc1dyYXAsIDApOworICAgICAgICBtU2NyaXB0LnNldF9nUEZCYWNrZ3JvdW5kKHBmYik7CisKKyAgICAgICAgYnVpbGRlciA9IG5ldyBQcm9ncmFtRnJhZ21lbnRGaXhlZEZ1bmN0aW9uLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgYnVpbGRlci5zZXRQb2ludFNwcml0ZVRleENvb3JkaW5hdGVSZXBsYWNlbWVudCh0cnVlKTsKKyAgICAgICAgYnVpbGRlci5zZXRUZXh0dXJlKFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlci5FbnZNb2RlLk1PRFVMQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyLkZvcm1hdC5SR0JBLCAwKTsKKyAgICAgICAgYnVpbGRlci5zZXRWYXJ5aW5nQ29sb3IodHJ1ZSk7CisgICAgICAgIFByb2dyYW1GcmFnbWVudCBwZnMgPSBidWlsZGVyLmNyZWF0ZSgpOworICAgICAgICBwZnMuYmluZFNhbXBsZXIobU1pcExpbmVhcldyYXAsIDApOworICAgICAgICBtU2NyaXB0LnNldF9nUEZTdGFycyhwZnMpOworCiAgICAgfQogCisgICAgcHJpdmF0ZSBNYXRyaXg0ZiBnZXRQcm9qZWN0aW9uTm9ybWFsaXplZChpbnQgdywgaW50IGgpIHsKKyAgICAgIC8vIHJhbmdlIC0xLDEgaW4gdGhlIG5hcnJvdyBheGlzIGF0IHogPSAwLgorICAgICAgTWF0cml4NGYgbTEgPSBuZXcgTWF0cml4NGYoKTsKKyAgICAgIE1hdHJpeDRmIG0yID0gbmV3IE1hdHJpeDRmKCk7CisKKyAgICAgIGlmKHcgPiBoKSB7CisgICAgICAgICAgZmxvYXQgYXNwZWN0ID0gKChmbG9hdCl3KSAvIGg7CisgICAgICAgICAgbTEubG9hZEZydXN0dW0oLWFzcGVjdCxhc3BlY3QsICAtMSwxLCAgMSwxMDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmbG9hdCBhc3BlY3QgPSAoKGZsb2F0KWgpIC8gdzsKKyAgICAgICAgICBtMS5sb2FkRnJ1c3R1bSgtMSwxLCAtYXNwZWN0LGFzcGVjdCwgMSwxMDApOworICAgICAgfQorCisgICAgICBtMi5sb2FkUm90YXRlKDE4MCwgMCwgMSwgMCk7CisgICAgICBtMS5sb2FkTXVsdGlwbHkobTEsIG0yKTsKKworICAgICAgbTIubG9hZFNjYWxlKC0yLCAyLCAxKTsKKyAgICAgIG0xLmxvYWRNdWx0aXBseShtMSwgbTIpOworCisgICAgICBtMi5sb2FkVHJhbnNsYXRlKDAsIDAsIDIpOworICAgICAgbTEubG9hZE11bHRpcGx5KG0xLCBtMik7CisgICAgICByZXR1cm4gbTE7CisgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm9qZWN0aW9uTWF0cmljZXMoKSB7CisgICAgICBNYXRyaXg0ZiBwcm9qTm9ybSA9IGdldFByb2plY3Rpb25Ob3JtYWxpemVkKG1CZW5jaG1hcmtEaW1YLCBtQmVuY2htYXJrRGltWSk7CisgICAgICBTY3JpcHRGaWVsZF9WcENvbnN0cy5JdGVtIGkgPSBuZXcgU2NyaXB0RmllbGRfVnBDb25zdHMuSXRlbSgpOworICAgICAgaS5Qcm9qID0gcHJvak5vcm07CisgICAgICBpLk1WUCA9IHByb2pOb3JtOworICAgICAgbVB2U3RhckFsbG9jLnNldChpLCAwLCB0cnVlKTsKKyAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9ncmFtVmVydGV4KCkgewogICAgICAgICBQcm9ncmFtVmVydGV4Rml4ZWRGdW5jdGlvbi5CdWlsZGVyIHB2YiA9IG5ldyBQcm9ncmFtVmVydGV4Rml4ZWRGdW5jdGlvbi5CdWlsZGVyKG1SUyk7CiAgICAgICAgIG1Qcm9nVmVydGV4ID0gcHZiLmNyZWF0ZSgpOwpAQCAtMzAyLDYgKzQwMSwzOSBAQAogICAgICAgICBtUFZBLnNldFByb2plY3Rpb24ocHJvaik7CiAKICAgICAgICAgbVNjcmlwdC5zZXRfZ1Byb2dWZXJ0ZXgobVByb2dWZXJ0ZXgpOworCisgICAgICAgIC8vIEZvciBnYWxheHkgbGl2ZSB3YWxscGFwZXIKKyAgICAgICAgbVB2U3RhckFsbG9jID0gbmV3IFNjcmlwdEZpZWxkX1ZwQ29uc3RzKG1SUywgMSk7CisgICAgICAgIG1TY3JpcHQuYmluZF92cENvbnN0YW50cyhtUHZTdGFyQWxsb2MpOworICAgICAgICB1cGRhdGVQcm9qZWN0aW9uTWF0cmljZXMoKTsKKworICAgICAgICBQcm9ncmFtVmVydGV4LkJ1aWxkZXIgc2IgPSBuZXcgUHJvZ3JhbVZlcnRleC5CdWlsZGVyKG1SUyk7CisgICAgICAgIFN0cmluZyB0ID0gICJ2YXJ5aW5nIHZlYzQgdmFyQ29sb3I7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgInZhcnlpbmcgdmVjMiB2YXJUZXgwO1xuIiArCisgICAgICAgICAgICAgICAgICAgICJ2b2lkIG1haW4oKSB7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgZmxvYXQgZGlzdCA9IEFUVFJJQl9wb3NpdGlvbi55O1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIGZsb2F0IGFuZ2xlID0gQVRUUklCX3Bvc2l0aW9uLng7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgZmxvYXQgeCA9IGRpc3QgKiBzaW4oYW5nbGUpO1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIGZsb2F0IHkgPSBkaXN0ICogY29zKGFuZ2xlKSAqIDAuODkyO1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIGZsb2F0IHAgPSBkaXN0ICogNS41O1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIGZsb2F0IHMgPSBjb3MocCk7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgZmxvYXQgdCA9IHNpbihwKTtcbiIgKworICAgICAgICAgICAgICAgICAgICAiICB2ZWM0IHBvcztcbiIgKworICAgICAgICAgICAgICAgICAgICAiICBwb3MueCA9IHQgKiB4ICsgcyAqIHk7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgcG9zLnkgPSBzICogeCAtIHQgKiB5O1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIHBvcy56ID0gQVRUUklCX3Bvc2l0aW9uLno7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgcG9zLncgPSAxLjA7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIiAgZ2xfUG9zaXRpb24gPSBVTklfTVZQICogcG9zO1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIGdsX1BvaW50U2l6ZSA9IEFUVFJJQl9jb2xvci5hICogMTAuMDtcbiIgKworICAgICAgICAgICAgICAgICAgICAiICB2YXJDb2xvci5yZ2IgPSBBVFRSSUJfY29sb3IucmdiO1xuIiArCisgICAgICAgICAgICAgICAgICAgICIgIHZhckNvbG9yLmEgPSAxLjA7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgIn1cbiI7CisgICAgICAgIHNiLnNldFNoYWRlcih0KTsKKyAgICAgICAgc2IuYWRkSW5wdXQobVBhcnRpY2xlc01lc2guZ2V0VmVydGV4QWxsb2NhdGlvbigwKS5nZXRUeXBlKCkuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgc2IuYWRkQ29uc3RhbnQobVB2U3RhckFsbG9jLmdldFR5cGUoKSk7CisgICAgICAgIFByb2dyYW1WZXJ0ZXggcHZzID0gc2IuY3JlYXRlKCk7CisgICAgICAgIHB2cy5iaW5kQ29uc3RhbnRzKG1QdlN0YXJBbGxvYy5nZXRBbGxvY2F0aW9uKCksIDApOworICAgICAgICBtU2NyaXB0LnNldF9nUFZTdGFycyhwdnMpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0Q3VzdG9tU2hhZGVycygpIHsKQEAgLTM5MiwxMSArNTI0LDE4IEBACiAgICAgICAgIG1UZXhPcGFxdWUgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmRhdGEpOwogICAgICAgICBtVGV4VHJhbnNwYXJlbnQgPSBsb2FkVGV4dHVyZUFSR0IoUi5kcmF3YWJsZS5sZWFmKTsKICAgICAgICAgbVRleENoZWNrZXIgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmNoZWNrZXIpOworICAgICAgICBtVGV4R2xvYmUgPSBsb2FkVGV4dHVyZVJHQihSLmRyYXdhYmxlLmdsb2JlKTsKIAogICAgICAgICBtU2NyaXB0LnNldF9nVGV4VG9ydXMobVRleFRvcnVzKTsKICAgICAgICAgbVNjcmlwdC5zZXRfZ1RleE9wYXF1ZShtVGV4T3BhcXVlKTsKICAgICAgICAgbVNjcmlwdC5zZXRfZ1RleFRyYW5zcGFyZW50KG1UZXhUcmFuc3BhcmVudCk7CiAgICAgICAgIG1TY3JpcHQuc2V0X2dUZXhDaGVja2VyKG1UZXhDaGVja2VyKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RleEdsb2JlKG1UZXhHbG9iZSk7CisKKyAgICAgICAgLy8gRm9yIEdhbGF4eSBsaXZlIHdhbGxwYXBlcgorICAgICAgICBtU2NyaXB0LnNldF9nVFNwYWNlKGxvYWRUZXh0dXJlUkdCKFIuZHJhd2FibGUuc3BhY2UpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RMaWdodDEobG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS5saWdodDEpKTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1RGbGFyZXMobG9hZFRleHR1cmVBUkdCKFIuZHJhd2FibGUuZmxhcmVzKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRGb250cygpIHsKQEAgLTQxMSw2ICs1NTAsMTkgQEAKICAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnRTZXJpZihtRm9udFNlcmlmKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGFydGljbGVzTWVzaCgpIHsKKyAgICAgICAgU2NyaXB0RmllbGRfUGFydGljbGUgcCA9IG5ldyBTY3JpcHRGaWVsZF9QYXJ0aWNsZShtUlMsIFBBUlRJQ0xFU19DT1VOVCk7CisKKyAgICAgICAgZmluYWwgTWVzaC5BbGxvY2F0aW9uQnVpbGRlciBtZXNoQnVpbGRlciA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIG1lc2hCdWlsZGVyLmFkZFZlcnRleEFsbG9jYXRpb24ocC5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBmaW5hbCBpbnQgdmVydGV4U2xvdCA9IG1lc2hCdWlsZGVyLmdldEN1cnJlbnRWZXJ0ZXhUeXBlSW5kZXgoKTsKKyAgICAgICAgbWVzaEJ1aWxkZXIuYWRkSW5kZXhTZXRUeXBlKFByaW1pdGl2ZS5QT0lOVCk7CisgICAgICAgIG1QYXJ0aWNsZXNNZXNoID0gbWVzaEJ1aWxkZXIuY3JlYXRlKCk7CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ1BhcnRpY2xlc01lc2gobVBhcnRpY2xlc01lc2gpOworICAgICAgICBtU2NyaXB0LmJpbmRfUGFydGljbGVzKHApOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBpbml0TWVzaCgpIHsKICAgICAgICAgbTEwYnkxME1lc2ggPSBnZXRNYnlOTWVzaChtQmVuY2htYXJrRGltWCwgbUJlbmNobWFya0RpbVksIDEwLCAxMCk7CiAgICAgICAgIG1TY3JpcHQuc2V0X2cxMGJ5MTBNZXNoKG0xMGJ5MTBNZXNoKTsKQEAgLTQxOCw2ICs1NzAsOCBAQAogICAgICAgICBtU2NyaXB0LnNldF9nMTAwYnkxMDBNZXNoKG0xMDBieTEwME1lc2gpOwogICAgICAgICBtV2J5SE1lc2g9IGdldE1ieU5NZXNoKG1CZW5jaG1hcmtEaW1YLCBtQmVuY2htYXJrRGltWSwgbUJlbmNobWFya0RpbVgvNCwgbUJlbmNobWFya0RpbVkvNCk7CiAgICAgICAgIG1TY3JpcHQuc2V0X2dXYnlITWVzaChtV2J5SE1lc2gpOworICAgICAgICBtU2luZ2xlTWVzaCA9IGdldFNpbmdsZU1lc2goMSwgMSk7ICAvLyBhIHVuaXQgc2l6ZSBtZXNoCisgICAgICAgIG1TY3JpcHQuc2V0X2dTaW5nbGVNZXNoKG1TaW5nbGVNZXNoKTsKIAogICAgICAgICBGaWxlQTNEIG1vZGVsID0gRmlsZUEzRC5jcmVhdGVGcm9tUmVzb3VyY2UobVJTLCBtUmVzLCBSLnJhdy50b3J1cyk7CiAgICAgICAgIEZpbGVBM0QuSW5kZXhFbnRyeSBlbnRyeSA9IG1vZGVsLmdldEluZGV4RW50cnkoMCk7CkBAIC00MjcsNiArNTgxLDggQEAKICAgICAgICAgICAgIG1Ub3J1cyA9IChNZXNoKWVudHJ5LmdldE9iamVjdCgpOwogICAgICAgICAgICAgbVNjcmlwdC5zZXRfZ1RvcnVzTWVzaChtVG9ydXMpOwogICAgICAgICB9CisKKyAgICAgICAgY3JlYXRlUGFydGljbGVzTWVzaCgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbml0U2FtcGxlcnMoKSB7CkBAIC00NDAsNiArNTk2LDcgQEAKICAgICAgICAgbUxpbmVhckNsYW1wID0gU2FtcGxlci5DTEFNUF9MSU5FQVIobVJTKTsKICAgICAgICAgbU5lYXJlc3RDbGFtcCA9IFNhbXBsZXIuQ0xBTVBfTkVBUkVTVChtUlMpOwogICAgICAgICBtTWlwTGluZWFyV3JhcCA9IFNhbXBsZXIuV1JBUF9MSU5FQVJfTUlQX0xJTkVBUihtUlMpOworICAgICAgICBtTmVhcmVzV3JhcCA9IFNhbXBsZXIuV1JBUF9ORUFSRVNUKG1SUyk7CiAKICAgICAgICAgbVNjcmlwdC5zZXRfZ0xpbmVhckNsYW1wKG1MaW5lYXJDbGFtcCk7CiAgICAgICAgIG1TY3JpcHQuc2V0X2dMaW5lYXJXcmFwKG1MaW5lYXJXcmFwKTsKQEAgLTQ5MywxMCArNjUwLDEwIEBACiAgICAgICAgIGluaXRTYW1wbGVycygpOwogICAgICAgICBpbml0UHJvZ3JhbVN0b3JlKCk7CiAgICAgICAgIGluaXRQcm9ncmFtRnJhZ21lbnQoKTsKKyAgICAgICAgaW5pdE1lc2goKTsKICAgICAgICAgaW5pdFByb2dyYW1WZXJ0ZXgoKTsKICAgICAgICAgaW5pdEZvbnRzKCk7CiAgICAgICAgIGxvYWRJbWFnZXMoKTsKLSAgICAgICAgaW5pdE1lc2goKTsKICAgICAgICAgaW5pdFByb2dyYW1SYXN0ZXIoKTsKICAgICAgICAgaW5pdEN1c3RvbVNoYWRlcnMoKTsKIApAQCAtNTE3LDYgKzY3NCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfUkVOREVSX1RBUkdFVCk7CiAgICAgICAgIG1TY3JpcHQuc2V0X2dSZW5kZXJCdWZmZXJEZXB0aChvZmZzY3JlZW4pOwogCisKKyAgICAgICAgbVRleHR1cmVBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgMTAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zLkl0ZW0gdGV4RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgdGV4RWxlbS5pdGVtID0gbG9hZFRleHR1cmVSR0IoUi5kcmF3YWJsZS5nbG9iZSk7CisgICAgICAgICAgICBtVGV4dHVyZUFsbG9jcy5zZXQodGV4RWxlbSwgaSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIG1UZXh0dXJlQWxsb2NzLmNvcHlBbGwoKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dUZXhMaXN0MTAwKG1UZXh0dXJlQWxsb2NzKTsKKworICAgICAgICBtU2FtcGxlVGV4dEFsbG9jcyA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MobVJTLCAxMDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSB0ZXh0RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgdGV4dEVsZW0uaXRlbSA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIFNBTVBMRV9URVhULCBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCk7CisgICAgICAgICAgICBtU2FtcGxlVGV4dEFsbG9jcy5zZXQodGV4dEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBtU2FtcGxlVGV4dEFsbG9jcy5jb3B5QWxsKCk7CisgICAgICAgIG1TY3JpcHQuYmluZF9nU2FtcGxlVGV4dExpc3QxMDAobVNhbXBsZVRleHRBbGxvY3MpOworCisgICAgICAgIG1TYW1wbGVMaXN0Vmlld0FsbG9jcyA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MobVJTLCAxMDAwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIHRleHRFbGVtID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtKCk7CisgICAgICAgICAgICB0ZXh0RWxlbS5pdGVtID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgTElTVF9URVhULCBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCk7CisgICAgICAgICAgICBtU2FtcGxlTGlzdFZpZXdBbGxvY3Muc2V0KHRleHRFbGVtLCBpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgbVNhbXBsZUxpc3RWaWV3QWxsb2NzLmNvcHlBbGwoKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dMaXN0Vmlld1RleHQobVNhbXBsZUxpc3RWaWV3QWxsb2NzKTsKKwogICAgICAgICBtUlMuYmluZFJvb3RTY3JpcHQobVNjcmlwdCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvUGVyZlRlc3Qvc3JjL2NvbS9hbmRyb2lkL3BlcmZ0ZXN0L3JzYmVuY2gucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9QZXJmVGVzdC9zcmMvY29tL2FuZHJvaWQvcGVyZnRlc3QvcnNiZW5jaC5ycwppbmRleCBlN2Y1Y2Q0Li42ZDgwYjBlIDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9QZXJmVGVzdC9zcmMvY29tL2FuZHJvaWQvcGVyZnRlc3QvcnNiZW5jaC5ycworKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9QZXJmVGVzdC9zcmMvY29tL2FuZHJvaWQvcGVyZnRlc3QvcnNiZW5jaC5ycwpAQCAtMjMsOSArMjMsNTAgQEAKIGNvbnN0IGludCBSU19NU0dfVEVTVF9ET05FID0gMTAwOwogY29uc3QgaW50IFJTX01TR19SRVNVTFRTX1JFQURZID0gMTAxOwogCi1jb25zdCBpbnQgZ01heE1vZGVzID0gMjU7Citjb25zdCBpbnQgZ01heE1vZGVzID0gMzE7CiBpbnQgZ01heExvb3BzOwogCisvLyBQYXJhbWV0ZXJzIGZvciBnYWxheHkgbGl2ZSB3YWxscGFwZXIKK3JzX2FsbG9jYXRpb24gZ1RTcGFjZTsKK3JzX2FsbG9jYXRpb24gZ1RMaWdodDE7Cityc19hbGxvY2F0aW9uIGdURmxhcmVzOworcnNfbWVzaCBnUGFydGljbGVzTWVzaDsKKworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZCYWNrZ3JvdW5kOworcnNfcHJvZ3JhbV9mcmFnbWVudCBnUEZTdGFyczsKK3JzX3Byb2dyYW1fdmVydGV4IGdQVlN0YXJzOworcnNfcHJvZ3JhbV92ZXJ0ZXggZ1BWQmtQcm9qOworcnNfcHJvZ3JhbV9zdG9yZSBnUFNMaWdodHM7CisKK2Zsb2F0IGdYT2Zmc2V0ID0gMC41ZjsKKworI2RlZmluZSBFTExJUFNFX1JBVElPIDAuODkyZgorI2RlZmluZSBQSSAzLjE0MTVmCisjZGVmaW5lIFRXT19QSSA2LjI4M2YKKyNkZWZpbmUgRUxMSVBTRV9UV0lTVCAwLjAyMzMzMzMzM2YKKworc3RhdGljIGZsb2F0IGFuZ2xlID0gNTAuZjsKK3N0YXRpYyBpbnQgZ09sZFdpZHRoOworc3RhdGljIGludCBnT2xkSGVpZ2h0Oworc3RhdGljIGludCBnV2lkdGg7CitzdGF0aWMgaW50IGdIZWlnaHQ7CitzdGF0aWMgZmxvYXQgZ1NwZWVkWzEyMDAwXTsKK3N0YXRpYyBpbnQgZ0dhbGF4eVJhZGl1cyA9IDMwMDsKK3N0YXRpYyByc19hbGxvY2F0aW9uIGdQYXJ0aWNsZXNCdWZmZXI7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIFBhcnRpY2xlIHsKKyAgICB1Y2hhcjQgY29sb3I7CisgICAgZmxvYXQzIHBvc2l0aW9uOworfSBQYXJ0aWNsZV90OworUGFydGljbGVfdCAqUGFydGljbGVzOworCit0eXBlZGVmIHN0cnVjdCBWcENvbnN0cyB7CisgICAgcnNfbWF0cml4NHg0IFByb2o7CisgICAgcnNfbWF0cml4NHg0IE1WUDsKK30gVnBDb25zdHNfdDsKK1ZwQ29uc3RzX3QgKnZwQ29uc3RhbnRzOworLy8gRW5kIG9mIHBhcmFtZXRlcnMgZm9yIGdhbGF4eSBsaXZlIHdhbGxwYXBlcgorCiAvLyBBbGxvY2F0aW9uIHRvIHNlbmQgdGVzdCBuYW1lcyBiYWNrIHRvIGphdmEKIGNoYXIgKmdTdHJpbmdCdWZmZXIgPSAwOwogLy8gQWxsb2NhdGlvbiB0byB3cml0ZSB0aGUgcmVzdWx0cyBpbnRvCkBAIC00NCwxMSArODUsMjEgQEAKIHJzX2FsbG9jYXRpb24gZ1RleFRvcnVzOwogcnNfYWxsb2NhdGlvbiBnVGV4VHJhbnNwYXJlbnQ7CiByc19hbGxvY2F0aW9uIGdUZXhDaGVja2VyOworcnNfYWxsb2NhdGlvbiBnVGV4R2xvYmU7CisKK3R5cGVkZWYgc3RydWN0IExpc3RBbGxvY3NfcyB7CisgICAgcnNfYWxsb2NhdGlvbiBpdGVtOworfSBMaXN0QWxsb2NzOworCitMaXN0QWxsb2NzICpnVGV4TGlzdDEwMDsKK0xpc3RBbGxvY3MgKmdTYW1wbGVUZXh0TGlzdDEwMDsKK0xpc3RBbGxvY3MgKmdMaXN0Vmlld1RleHQ7CiAKIHJzX21lc2ggZzEwYnkxME1lc2g7CiByc19tZXNoIGcxMDBieTEwME1lc2g7CiByc19tZXNoIGdXYnlITWVzaDsKIHJzX21lc2ggZ1RvcnVzTWVzaDsKK3JzX21lc2ggZ1NpbmdsZU1lc2g7CiAKIHJzX2ZvbnQgZ0ZvbnRTYW5zOwogcnNfZm9udCBnRm9udFNlcmlmOwpAQCAtMTAwLDYgKzE1MSwxNDEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ZiwgMC42ZiwgMC43ZiwgMS4wZiwKIH07CiAKKy8qKgorICAqIE1ldGhvZHMgdG8gZHJhdyB0aGUgZ2FsYXh5IGxpdmUgd2FsbCBwYXBlcgorICAqLworc3RhdGljIGZsb2F0IG1hcGYoZmxvYXQgbWluU3RhcnQsIGZsb2F0IG1pblN0b3AsIGZsb2F0IG1heFN0YXJ0LCBmbG9hdCBtYXhTdG9wLCBmbG9hdCB2YWx1ZSkgeworICAgIHJldHVybiBtYXhTdGFydCArIChtYXhTdGFydCAtIG1heFN0b3ApICogKCh2YWx1ZSAtIG1pblN0YXJ0KSAvIChtaW5TdG9wIC0gbWluU3RhcnQpKTsKK30KKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHN0YXJzLgorICovCitzdGF0aWMgZmxvYXQgcmFuZG9tR2F1c3MoKSB7CisgICAgZmxvYXQgeDE7CisgICAgZmxvYXQgeDI7CisgICAgZmxvYXQgdyA9IDIuZjsKKworICAgIHdoaWxlICh3ID49IDEuMGYpIHsKKyAgICAgICAgeDEgPSByc1JhbmQoMi4wZikgLSAxLjBmOworICAgICAgICB4MiA9IHJzUmFuZCgyLjBmKSAtIDEuMGY7CisgICAgICAgIHcgPSB4MSAqIHgxICsgeDIgKiB4MjsKKyAgICB9CisKKyAgICB3ID0gc3FydCgtMi4wZiAqIGxvZyh3KSAvIHcpOworICAgIHJldHVybiB4MSAqIHc7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBwcm9wZXJ0aWVzIGZvciBhIGdpdmVuIHN0YXIuCisgKi8KK3N0YXRpYyB2b2lkIGNyZWF0ZVBhcnRpY2xlKFBhcnRpY2xlX3QgKnBhcnQsIGludCBpZHgsIGZsb2F0IHNjYWxlKSB7CisgICAgZmxvYXQgZCA9IGZhYnMocmFuZG9tR2F1c3MoKSkgKiBnR2FsYXh5UmFkaXVzICogMC41ZiArIHJzUmFuZCg2NC4wZik7CisgICAgZmxvYXQgaWQgPSBkIC8gZ0dhbGF4eVJhZGl1czsKKyAgICBmbG9hdCB6ID0gcmFuZG9tR2F1c3MoKSAqIDAuNGYgKiAoMS4wZiAtIGlkKTsKKyAgICBmbG9hdCBwID0gLWQgKiBFTExJUFNFX1RXSVNUOworCisgICAgaWYgKGQgPCBnR2FsYXh5UmFkaXVzICogMC4zM2YpIHsKKyAgICAgICAgcGFydC0+Y29sb3IueCA9ICh1Y2hhcikgKDIyMCArIGlkICogMzUpOworICAgICAgICBwYXJ0LT5jb2xvci55ID0gMjIwOworICAgICAgICBwYXJ0LT5jb2xvci56ID0gMjIwOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnQtPmNvbG9yLnggPSAxODA7CisgICAgICAgIHBhcnQtPmNvbG9yLnkgPSAxODA7CisgICAgICAgIHBhcnQtPmNvbG9yLnogPSAodWNoYXIpIGNsYW1wKDE0MC5mICsgaWQgKiAxMTUuZiwgMTQwLmYsIDI1NS5mKTsKKyAgICB9CisgICAgLy8gU3Rhc2ggcG9pbnQgc2l6ZSAqIDEwIGluIEFscGhhCisgICAgcGFydC0+Y29sb3IudyA9ICh1Y2hhcikgKHJzUmFuZCgxLjJmLCAyLjFmKSAqIDYwKTsKKworICAgIGlmIChkID4gZ0dhbGF4eVJhZGl1cyAqIDAuMTVmKSB7CisgICAgICAgIHogKj0gMC42ZiAqICgxLjBmIC0gaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHogKj0gMC43MmY7CisgICAgfQorCisgICAgLy8gTWFwIHRvIHRoZSBwcm9qZWN0aW9uIGNvb3JkaW5hdGVzICh2aWV3cG9ydC54ID0gLTEuMCAtPiAxLjApCisgICAgZCA9IG1hcGYoLTQuMGYsIGdHYWxheHlSYWRpdXMgKyA0LjBmLCAwLjBmLCBzY2FsZSwgZCk7CisKKyAgICBwYXJ0LT5wb3NpdGlvbi54ID0gcnNSYW5kKFRXT19QSSk7CisgICAgcGFydC0+cG9zaXRpb24ueSA9IGQ7CisgICAgZ1NwZWVkW2lkeF0gPSByc1JhbmQoMC4wMDE1ZiwgMC4wMDI1ZikgKiAoMC41ZiArIChzY2FsZSAvIGQpKSAqIDAuOGY7CisKKyAgICBwYXJ0LT5wb3NpdGlvbi56ID0geiAvIDUuMGY7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhbGwgdGhlIHN0YXJ0cywgY2FsbGVkIGZyb20gSmF2YQorICovCit2b2lkIGluaXRQYXJ0aWNsZXMoKSB7CisgICAgUGFydGljbGVfdCAqcGFydCA9IFBhcnRpY2xlczsKKyAgICBmbG9hdCBzY2FsZSA9IGdHYWxheHlSYWRpdXMgLyAoZ1dpZHRoICogMC41Zik7CisgICAgaW50IGNvdW50ID0gcnNBbGxvY2F0aW9uR2V0RGltWChnUGFydGljbGVzQnVmZmVyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7CisgICAgICAgIGNyZWF0ZVBhcnRpY2xlKHBhcnQsIGksIHNjYWxlKTsKKyAgICAgICAgcGFydCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHJhd1NwYWNlKCkgeworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1BGQmFja2dyb3VuZCk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGQmFja2dyb3VuZCwgMCwgZ1RTcGFjZSk7CisgICAgcnNnRHJhd1F1YWRUZXhDb29yZHMoCisgICAgICAgICAgICAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmLAorICAgICAgICAgICAgZ1dpZHRoLCAwLjBmLCAwLjBmLCAyLjBmLCAxLjBmLAorICAgICAgICAgICAgZ1dpZHRoLCBnSGVpZ2h0LCAwLjBmLCAyLjBmLCAwLjBmLAorICAgICAgICAgICAgMC4wZiwgZ0hlaWdodCwgMC4wZiwgMC4wZiwgMC4wZik7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdMaWdodHMoKSB7CisgICAgcnNnQmluZFByb2dyYW1WZXJ0ZXgoZ1BWQmtQcm9qKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRkJhY2tncm91bmQpOworICAgIHJzZ0JpbmRUZXh0dXJlKGdQRkJhY2tncm91bmQsIDAsIGdUTGlnaHQxKTsKKworICAgIGZsb2F0IHNjYWxlID0gNTEyLjBmIC8gZ1dpZHRoOworICAgIGZsb2F0IHggPSAtc2NhbGUgLSBzY2FsZSAqIDAuMDVmOworICAgIGZsb2F0IHkgPSAtc2NhbGU7CisKKyAgICBzY2FsZSAqPSAyLjBmOworCisgICAgcnNnRHJhd1F1YWQoeCwgeSwgMC4wZiwKKyAgICAgICAgICAgICB4ICsgc2NhbGUgKiAxLjFmLCB5LCAwLjBmLAorICAgICAgICAgICAgIHggKyBzY2FsZSAqIDEuMWYsIHkgKyBzY2FsZSwgMC4wZiwKKyAgICAgICAgICAgICB4LCB5ICsgc2NhbGUsIDAuMGYpOworfQorCitzdGF0aWMgdm9pZCBkcmF3UGFydGljbGVzKGZsb2F0IG9mZnNldCkgeworICAgIGZsb2F0IGEgPSBvZmZzZXQgKiBhbmdsZTsKKyAgICBmbG9hdCBhYnNvbHV0ZUFuZ2xlID0gZmFicyhhKTsKKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkVHJhbnNsYXRlKCZtYXRyaXgsIDAuMGYsIDAuMGYsIDEwLjBmIC0gNi4wZiAqIGFic29sdXRlQW5nbGUgLyA1MC4wZik7CisgICAgaWYgKGdIZWlnaHQgPiBnV2lkdGgpIHsKKyAgICAgICAgcnNNYXRyaXhTY2FsZSgmbWF0cml4LCA2LjZmLCA2LjBmLCAxLjBmKTsKKyAgICB9IGVsc2UgeworICAgICAgICByc01hdHJpeFNjYWxlKCZtYXRyaXgsIDEyLjZmLCAxMi4wZiwgMS4wZik7CisgICAgfQorICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGFic29sdXRlQW5nbGUsIDEuMGYsIDAuMGYsIDAuMGYpOworICAgIHJzTWF0cml4Um90YXRlKCZtYXRyaXgsIGEsIDAuMGYsIDAuNGYsIDAuMWYpOworICAgIHJzTWF0cml4TG9hZCgmdnBDb25zdGFudHMtPk1WUCwgJnZwQ29uc3RhbnRzLT5Qcm9qKTsKKyAgICByc01hdHJpeE11bHRpcGx5KCZ2cENvbnN0YW50cy0+TVZQLCAmbWF0cml4KTsKKyAgICByc2dBbGxvY2F0aW9uU3luY0FsbChyc0dldEFsbG9jYXRpb24odnBDb25zdGFudHMpKTsKKworICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQVlN0YXJzKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQRlN0YXJzKTsKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQU0xpZ2h0cyk7CisgICAgcnNnQmluZFRleHR1cmUoZ1BGU3RhcnMsIDAsIGdURmxhcmVzKTsKKworICAgIFBhcnRpY2xlX3QgKnZ0eCA9IFBhcnRpY2xlczsKKyAgICBpbnQgY291bnQgPSByc0FsbG9jYXRpb25HZXREaW1YKGdQYXJ0aWNsZXNCdWZmZXIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB2dHgtPnBvc2l0aW9uLnggPSB2dHgtPnBvc2l0aW9uLnggKyBnU3BlZWRbaV07CisgICAgICAgIHZ0eCsrOworICAgIH0KKworICAgIHJzZ0RyYXdNZXNoKGdQYXJ0aWNsZXNNZXNoKTsKK30KKy8qIGVuZCBvZiBtZXRob2RzIGZvciBkcmF3aW5nIGdhbGF4eSAqLworCiBzdGF0aWMgdm9pZCBzZXR1cE9mZnNjcmVlblRhcmdldCgpIHsKICAgICByc2dCaW5kQ29sb3JUYXJnZXQoZ1JlbmRlckJ1ZmZlckNvbG9yLCAwKTsKICAgICByc2dCaW5kRGVwdGhUYXJnZXQoZ1JlbmRlckJ1ZmZlckRlcHRoKTsKQEAgLTE0Miw3ICszMjgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBiaW5kUHJvZ3JhbVZlcnRleE9ydGhvKCkgewotICAgIC8vIERlZmF1bHQgdmVydGV4IHNhaGRlcgorICAgIC8vIERlZmF1bHQgdmVydGV4IHNoYWRlcgogICAgIHJzZ0JpbmRQcm9ncmFtVmVydGV4KGdQcm9nVmVydGV4KTsKICAgICAvLyBTZXR1cCB0aGUgcHJvamVjdGlvbiBtYXRyaXgKICAgICByc19tYXRyaXg0eDQgcHJvajsKQEAgLTE4Nyw2ICszNzMsNyBAQAogICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kTm9uZSk7CiAgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CiAgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisKICAgICByc2dCaW5kVGV4dHVyZShnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ1RleE9wYXF1ZSk7CiAKICAgICBpZiAobWVzaE51bSA9PSAwKSB7CkBAIC0xOTgsNiArMzg1LDE2NiBAQAogICAgIH0KIH0KIAorLy8gRGlzcGxheSBzYW1wbGUgaW1hZ2VzIGluIGEgbWVzaCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlCitzdGF0aWMgdm9pZCBkaXNwbGF5SWNvbnMoaW50IG1lc2hNb2RlKSB7CisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworCisgICAgLy8gRnJhZ21lbnQgc2hhZGVyIHdpdGggdGV4dHVyZQorICAgIHJzZ0JpbmRQcm9ncmFtU3RvcmUoZ1Byb2dTdG9yZUJsZW5kQWxwaGEpOworICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudFRleHR1cmUpOworICAgIHJzZ0JpbmRTYW1wbGVyKGdQcm9nRnJhZ21lbnRUZXh0dXJlLCAwLCBnTGluZWFyQ2xhbXApOworCisgICAgaW50IG1lc2hDb3VudCA9IChpbnQpcG93KDEwLjBmLCAoZmxvYXQpKG1lc2hNb2RlICsgMSkpOworCisgICAgZmxvYXQgc2l6ZSA9IDUwLjA7CisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDsKKyAgICByc01hdHJpeExvYWRTY2FsZSgmbWF0cml4LCBzaXplLCBzaXplLCAxLjApOworCisgICAgZmxvYXQgeVBvcyA9IDA7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtZXNoQ291bnQ7IHkrKykgeworICAgICAgICB5UG9zID0gKHkgKyAxKSAqIDUwOworICAgICAgICBmbG9hdCB4UG9zID0gMDsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtZXNoQ291bnQ7IHgrKykgeworICAgICAgICAgICAgeFBvcyA9ICh4ICsgMSkgKiA1MDsKKyAgICAgICAgICAgIHJzX21hdHJpeDR4NCB0cmFuc01hdHJpeDsKKyAgICAgICAgICAgIHJzTWF0cml4TG9hZFRyYW5zbGF0ZSgmdHJhbnNNYXRyaXgsIHhQb3MsIHlQb3MsIDApOworICAgICAgICAgICAgcnNNYXRyaXhNdWx0aXBseSgmdHJhbnNNYXRyaXgsICZtYXRyaXgpOworICAgICAgICAgICAgcnNnUHJvZ3JhbVZlcnRleExvYWRNb2RlbE1hdHJpeCgmdHJhbnNNYXRyaXgpOworICAgICAgICAgICAgaW50IGkgPSAoeCArIHkgKiBtZXNoQ291bnQpICUgMTAwOworICAgICAgICAgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhMaXN0MTAwW2ldLml0ZW0pOworICAgICAgICAgICAgcnNnRHJhd01lc2goZ1NpbmdsZU1lc2gpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBEcmF3IG1lc2hlcyBpbiBhIHNpbmdsZSBwYWdlIHdpdGggdG9wIGxlZnQgY29ybmVyIGNvb3JkaW5hdGVzICh4U3RhcnQsIHlTdGFydCkKK3N0YXRpYyB2b2lkIGRyYXdNZXNoSW5QYWdlKGZsb2F0IHhTdGFydCwgZmxvYXQgeVN0YXJ0LCBpbnQgd1Jlc29sdXRpb24sIGludCBoUmVzb2x1dGlvbikgeworICAgIC8vIERyYXcgd1Jlc29sdXRpb24gKiBoUmVzb2x1dGlvbiBtZXNoZXMgaW4gb25lIHBhZ2UKKyAgICBmbG9hdCB3TWFyZ2luID0gMTAwLjBmOworICAgIGZsb2F0IGhNYXJnaW4gPSAxMDAuMGY7CisgICAgZmxvYXQgeFBhZCA9IDUwLjBmOworICAgIGZsb2F0IHlQYWQgPSAyMC4wZjsKKyAgICBmbG9hdCBzaXplID0gMTAwLjBmOyAgLy8gc2l6ZSBvZiBpbWFnZXMKKworICAgIC8vIGZvbnQgaW5mbworICAgIHJzX2ZvbnQgZm9udCA9IGdGb250U2FuczsKKyAgICByc2dCaW5kRm9udChmb250KTsKKyAgICByc2dGb250Q29sb3IoMS4wZiwgMS4wZiwgMS4wZiwgMS4wZik7CisKKyAgICAvLyBNZWFzdXJlIHRleHQgc2l6ZQorICAgIGludCBsZWZ0ID0gMCwgcmlnaHQgPSAwLCB0b3AgPSAwLCBib3R0b20gPSAwOworICAgIHJzZ01lYXN1cmVUZXh0KGdTYW1wbGVUZXh0TGlzdDEwMFswXS5pdGVtLCAmbGVmdCwgJnJpZ2h0LCAmdG9wLCAmYm90dG9tKTsKKyAgICBmbG9hdCB0ZXh0SGVpZ2h0ID0gKGZsb2F0KSh0b3AgLSBib3R0b20pOworICAgIGZsb2F0IHRleHRXaWR0aCA9IChmbG9hdCkocmlnaHQgLSBsZWZ0KTsKKworICAgIHJzX21hdHJpeDR4NCBtYXRyaXg7CisgICAgcnNNYXRyaXhMb2FkU2NhbGUoJm1hdHJpeCwgc2l6ZSwgc2l6ZSwgMS4wKTsKKworICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaFJlc29sdXRpb247IHkrKykgeworICAgICAgICBmbG9hdCB5UG9zID0geVN0YXJ0ICsgaE1hcmdpbiArIHkgKiBzaXplICsgeSAqIHlQYWQ7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd1Jlc29sdXRpb247IHgrKykgeworICAgICAgICAgICAgZmxvYXQgeFBvcyA9IHhTdGFydCArIHdNYXJnaW4gKyB4ICogc2l6ZSArIHggKiB4UGFkOworCisgICAgICAgICAgICByc19tYXRyaXg0eDQgdHJhbnNNYXRyaXg7CisgICAgICAgICAgICByc01hdHJpeExvYWRUcmFuc2xhdGUoJnRyYW5zTWF0cml4LCB4UG9zICsgc2l6ZS8yLCB5UG9zICsgc2l6ZS8yLCAwKTsKKyAgICAgICAgICAgIHJzTWF0cml4TXVsdGlwbHkoJnRyYW5zTWF0cml4LCAmbWF0cml4KTsgIC8vIHNjYWxlIHRoZSBtZXNoCisgICAgICAgICAgICByc2dQcm9ncmFtVmVydGV4TG9hZE1vZGVsTWF0cml4KCZ0cmFuc01hdHJpeCk7CisKKyAgICAgICAgICAgIGludCBpID0gKHkgKiB3UmVzb2x1dGlvbiArIHgpICUgMTAwOworICAgICAgICAgICAgcnNnQmluZFRleHR1cmUoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdUZXhMaXN0MTAwW2ldLml0ZW0pOworICAgICAgICAgICAgcnNnRHJhd01lc2goZ1NpbmdsZU1lc2gpOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ1NhbXBsZVRleHRMaXN0MTAwW2ldLml0ZW0sIHhQb3MsIHlQb3MgKyBzaXplICsgeVBhZC8yICsgdGV4dEhlaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIERpc3BsYXkgYm90aCBpbWFnZXMgYW5kIHRleHQgYXMgc2hvd24gaW4gbGF1bmNoZXIgYW5kIGhvbWVwYWdlCisvLyBtZXNoTW9kZSB3aWxsIGRlY2lkZSBob3cgbWFueSBwYWdlcyB3ZSBkcmF3CisvLyBtZXNoTW9kZSA9IDA6IGRyYXcgMyBwYWdlcyBvZiBtZXNoZXMKKy8vIG1lc2hNb2RlID0gMTogZHJhdyA1IHBhZ2VzIG9mIG1lc2hlcworc3RhdGljIHZvaWQgZGlzcGxheUltYWdlV2l0aFRleHQoaW50IHdSZXNvbHV0aW9uLCBpbnQgaFJlc29sdXRpb24sIGludCBtZXNoTW9kZSkgeworICAgIGJpbmRQcm9ncmFtVmVydGV4T3J0aG8oKTsKKworICAgIC8vIEZyYWdtZW50IHNoYWRlciB3aXRoIHRleHR1cmUKKyAgICByc2dCaW5kUHJvZ3JhbVN0b3JlKGdQcm9nU3RvcmVCbGVuZEFscGhhKTsKKyAgICByc2dCaW5kUHJvZ3JhbUZyYWdtZW50KGdQcm9nRnJhZ21lbnRUZXh0dXJlKTsKKyAgICByc2dCaW5kU2FtcGxlcihnUHJvZ0ZyYWdtZW50VGV4dHVyZSwgMCwgZ0xpbmVhckNsYW1wKTsKKworICAgIGRyYXdNZXNoSW5QYWdlKDAsIDAsIHdSZXNvbHV0aW9uLCBoUmVzb2x1dGlvbik7CisgICAgZHJhd01lc2hJblBhZ2UoLTEuMGYqZ1JlbmRlclN1cmZhY2VXLCAwLCB3UmVzb2x1dGlvbiwgaFJlc29sdXRpb24pOworICAgIGRyYXdNZXNoSW5QYWdlKDEuMGYqZ1JlbmRlclN1cmZhY2VXLCAwLCB3UmVzb2x1dGlvbiwgaFJlc29sdXRpb24pOworICAgIGlmIChtZXNoTW9kZSA9PSAxKSB7CisgICAgICAgIC8vIGRyYXcgYW5vdGhlciB0d28gcGFnZXMgb2YgbWVzaGVzCisgICAgICAgIGRyYXdNZXNoSW5QYWdlKC0yLjBmKmdSZW5kZXJTdXJmYWNlVywgMCwgd1Jlc29sdXRpb24sIGhSZXNvbHV0aW9uKTsKKyAgICAgICAgZHJhd01lc2hJblBhZ2UoMi4wZipnUmVuZGVyU3VyZmFjZVcsIDAsIHdSZXNvbHV0aW9uLCBoUmVzb2x1dGlvbik7CisgICAgfQorfQorCisvLyBEaXNwbGF5IGEgbGlzdCBvZiB0ZXh0IGFzIHRoZSBsaXN0IHZpZXcKK3N0YXRpYyB2b2lkIGRpc3BsYXlMaXN0VmlldygpIHsKKyAgICAvLyBzZXQgdGV4dCBjb2xvcgorICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjlmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udFNhbnMpOworCisgICAgLy8gZ2V0IHRoZSBzaXplIG9mIHRoZSBsaXN0CisgICAgcnNfYWxsb2NhdGlvbiB0ZXh0QWxsb2M7CisgICAgdGV4dEFsbG9jID0gcnNHZXRBbGxvY2F0aW9uKGdMaXN0Vmlld1RleHQpOworICAgIGludCBhbGxvY1NpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKHRleHRBbGxvYyk7CisKKyAgICBpbnQgbGlzdEl0ZW1IZWlnaHQgPSA4MDsKKyAgICBpbnQgeU9mZnNldCA9IGxpc3RJdGVtSGVpZ2h0OworCisgICAgLy8gc2V0IHRoZSBjb2xvciBmb3IgdGhlIGxpc3QgZGl2aWRlcgorICAgIHJzZ0JpbmRQcm9ncmFtRnJhZ21lbnQoZ1Byb2dGcmFnbWVudENvbG9yKTsKKyAgICByc2dQcm9ncmFtRnJhZ21lbnRDb25zdGFudENvbG9yKGdQcm9nRnJhZ21lbnRDb2xvciwgMS4wLCAxLjAsIDEuMCwgMSk7CisKKyAgICAvLyBkcmF3IHRoZSBsaXN0IHdpdGggZGl2aWRlcgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb2NTaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHlPZmZzZXQgLSBsaXN0SXRlbUhlaWdodCA+IGdSZW5kZXJTdXJmYWNlSCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcnNnRHJhd1JlY3QoMCwgeU9mZnNldCAtIDEsIGdSZW5kZXJTdXJmYWNlVywgeU9mZnNldCwgMCk7CisgICAgICAgIHJzZ0RyYXdUZXh0KGdMaXN0Vmlld1RleHRbaV0uaXRlbSwgMjAsIHlPZmZzZXQgLSAxMCk7CisgICAgICAgIHlPZmZzZXQgKz0gbGlzdEl0ZW1IZWlnaHQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3R2FsYXh5KCkgeworICAgIHJzZ0NsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMS5mKTsKKyAgICBnUGFydGljbGVzQnVmZmVyID0gcnNHZXRBbGxvY2F0aW9uKFBhcnRpY2xlcyk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUEZCYWNrZ3JvdW5kKTsKKworICAgIGdXaWR0aCA9IHJzZ0dldFdpZHRoKCk7CisgICAgZ0hlaWdodCA9IHJzZ0dldEhlaWdodCgpOworICAgIGlmICgoZ1dpZHRoICE9IGdPbGRXaWR0aCkgfHwgKGdIZWlnaHQgIT0gZ09sZEhlaWdodCkpIHsKKyAgICAgICAgaW5pdFBhcnRpY2xlcygpOworICAgICAgICBnT2xkV2lkdGggPSBnV2lkdGg7CisgICAgICAgIGdPbGRIZWlnaHQgPSBnSGVpZ2h0OworICAgIH0KKworICAgIGZsb2F0IG9mZnNldCA9IG1peCgtMS4wZiwgMS4wZiwgZ1hPZmZzZXQpOworICAgIGRyYXdTcGFjZSgpOworICAgIGRyYXdQYXJ0aWNsZXMob2Zmc2V0KTsKKyAgICBkcmF3TGlnaHRzKCk7Cit9CisKKy8vIERpc3BsYXkgaW1hZ2VzIGFuZCB0ZXh0IHdpdGggbGl2ZSB3YWxscGFwZXIgaW4gdGhlIGJhY2tncm91bmQKK3N0YXRpYyB2b2lkIGRpc3BhbHlMaXZlV2FsbFBhcGVyKGludCB3UmVzb2x1dGlvbiwgaW50IGhSZXNvbHV0aW9uKSB7CisgICAgYmluZFByb2dyYW1WZXJ0ZXhPcnRobygpOworCisgICAgZHJhd0dhbGF4eSgpOworCisgICAgcnNnQmluZFByb2dyYW1TdG9yZShnUHJvZ1N0b3JlQmxlbmRBbHBoYSk7CisgICAgcnNnQmluZFByb2dyYW1GcmFnbWVudChnUHJvZ0ZyYWdtZW50VGV4dHVyZSk7CisgICAgcnNnQmluZFNhbXBsZXIoZ1Byb2dGcmFnbWVudFRleHR1cmUsIDAsIGdMaW5lYXJDbGFtcCk7CisKKyAgICBkcmF3TWVzaEluUGFnZSgwLCAwLCB3UmVzb2x1dGlvbiwgaFJlc29sdXRpb24pOworICAgIGRyYXdNZXNoSW5QYWdlKC0xLjBmKmdSZW5kZXJTdXJmYWNlVywgMCwgd1Jlc29sdXRpb24sIGhSZXNvbHV0aW9uKTsKKyAgICBkcmF3TWVzaEluUGFnZSgxLjBmKmdSZW5kZXJTdXJmYWNlVywgMCwgd1Jlc29sdXRpb24sIGhSZXNvbHV0aW9uKTsKKyAgICBkcmF3TWVzaEluUGFnZSgtMi4wZipnUmVuZGVyU3VyZmFjZVcsIDAsIHdSZXNvbHV0aW9uLCBoUmVzb2x1dGlvbik7CisgICAgZHJhd01lc2hJblBhZ2UoMi4wZipnUmVuZGVyU3VyZmFjZVcsIDAsIHdSZXNvbHV0aW9uLCBoUmVzb2x1dGlvbik7Cit9CisKIHN0YXRpYyBmbG9hdCBnVG9ydXNSb3RhdGlvbiA9IDA7CiBzdGF0aWMgdm9pZCB1cGRhdGVNb2RlbE1hdHJpeChyc19tYXRyaXg0eDQgKm1hdHJpeCwgdm9pZCAqYnVmZmVyKSB7CiAgICAgaWYgKGJ1ZmZlciA9PSAwKSB7CkBAIC00OTcsNiArODQ0LDEyIEBACiAgICAgIkdlbyB0ZXN0IDI1LjZrIGhlYXZ5IGZyYWdtZW50IGhlYXZ5IHZlcnRleCIsCiAgICAgIkdlbyB0ZXN0IDUxLjJrIGhlYXZ5IGZyYWdtZW50IGhlYXZ5IHZlcnRleCIsCiAgICAgIkdlbyB0ZXN0IDIwNC44ayBzbWFsbCB0cmllcyBoZWF2eSBmcmFnbWVudCBoZWF2eSB2ZXJ0ZXgiLAorICAgICJVSSB0ZXN0IHdpdGggaWNvbiBkaXNwbGF5IDEwIGJ5IDEwIiwKKyAgICAiVUkgdGVzdCB3aXRoIGljb24gZGlzcGxheSAxMDAgYnkgMTAwIiwKKyAgICAiVUkgdGVzdCB3aXRoIGltYWdlIGFuZCB0ZXh0IGRpc3BsYXkgMyBwYWdlcyIsCisgICAgIlVJIHRlc3Qgd2l0aCBpbWFnZSBhbmQgdGV4dCBkaXNwbGF5IDUgcGFnZXMiLAorICAgICJVSSB0ZXN0IHdpdGggbGlzdCB2aWV3IiwKKyAgICAiVUkgdGVzdCB3aXRoIGxpdmUgd2FsbHBhcGVyIiwKIH07CiAKIHZvaWQgZ2V0VGVzdE5hbWUoaW50IHRlc3RJbmRleCkgewpAQCAtNTg5LDYgKzk0MiwyNCBAQAogICAgIGNhc2UgMjQ6CiAgICAgICAgIGRpc3BsYXlQaXhlbExpZ2h0U2FtcGxlcyg4LCB0cnVlKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgICAgZGlzcGxheUljb25zKDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI2OgorICAgICAgICBkaXNwbGF5SWNvbnMoMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6CisgICAgICAgIGRpc3BsYXlJbWFnZVdpdGhUZXh0KDcsIDUsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI4OgorICAgICAgICBkaXNwbGF5SW1hZ2VXaXRoVGV4dCg3LCA1LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgICAgZGlzcGxheUxpc3RWaWV3KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzA6CisgICAgICAgIGRpc3BhbHlMaXZlV2FsbFBhcGVyKDcsIDUpOworICAgICAgICBicmVhazsKICAgICB9CiB9CiAKQEAgLTYxMiw3ICs5ODMsNiBAQAogfQogCiBpbnQgcm9vdCh2b2lkKSB7Ci0KICAgICBnUmVuZGVyU3VyZmFjZVcgPSByc2dHZXRXaWR0aCgpOwogICAgIGdSZW5kZXJTdXJmYWNlSCA9IHJzZ0dldEhlaWdodCgpOwogICAgIHJzZ0NsZWFyQ29sb3IoMC4yZiwgMC4yZiwgMC4yZiwgMS4wZik7CkBAIC02NDAsNiArMTAxMCw3IEBACiAgICAgICAgIGdSZW5kZXJTdXJmYWNlVyA9IHJzZ0dldFdpZHRoKCk7CiAgICAgICAgIGdSZW5kZXJTdXJmYWNlSCA9IHJzZ0dldEhlaWdodCgpOwogICAgICAgICBpbnQgc2l6ZSA9IDg7CisgICAgICAgIC8vIGRyYXcgZWFjaCBmcmFtZSBhdCAoOCwgMy80IGdSZW5kZXJTdXJmYWNlSCkgd2l0aCBzaXplCiAgICAgICAgIGRyYXdPZmZzY3JlZW5SZXN1bHQoKGRyYXdQb3MrPXNpemUpJWdSZW5kZXJTdXJmYWNlVywgKGdSZW5kZXJTdXJmYWNlSCAqIDMpIC8gNCwgc2l6ZSwgc2l6ZSk7CiAgICAgfQogCkBAIC02NDksMTEgKzEwMjAsOSBAQAogICAgIGZsb2F0IGZwcyA9IChmbG9hdCkoZnJhbWVDb3VudCkgLyAoKGZsb2F0KShlbmQgLSBzdGFydCkqMC4wMDFmKTsKICAgICByc0RlYnVnKHRlc3ROYW1lc1tiZW5jaE1vZGVdLCBmcHMpOwogICAgIGdSZXN1bHRCdWZmZXJbYmVuY2hNb2RlXSA9IGZwczsKLQogICAgIGRyYXdPZmZzY3JlZW5SZXN1bHQoMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIGdSZW5kZXJTdXJmYWNlVyAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICBnUmVuZGVyU3VyZmFjZUggLyAyKTsKLQogICAgIGNvbnN0IGNoYXIqIHRleHQgPSB0ZXN0TmFtZXNbYmVuY2hNb2RlXTsKICAgICBpbnQgbGVmdCA9IDAsIHJpZ2h0ID0gMCwgdG9wID0gMCwgYm90dG9tID0gMDsKICAgICB1aW50IHdpZHRoID0gcnNnR2V0V2lkdGgoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9lbW9faW1fa2lzc2luZy5wbmcgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2tpc3NpbmcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGYwZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL2RyYXdhYmxlLWhkcGkvZW1vX2ltX2tpc3NpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24wLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI2MTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24xLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24xLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTkwMDljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24yLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJkNzBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24zLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb24zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTEyN2VlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb240LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb240LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI3ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb241LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb241LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk5MDNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb242LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb242LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg3OGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb243LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb243LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTM5N2NhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb244LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb244LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjNiMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb245LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb245LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MzNzcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbjkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb254LnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9ub3RpZmljYXRpb254LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY3Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL25vdGlmaWNhdGlvbngucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9waW5lYXBwbGUucG5nIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL3BpbmVhcHBsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYyZDNjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9waW5lYXBwbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9waW5lYXBwbGUyLnBuZyBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvZHJhd2FibGUtaGRwaS9waW5lYXBwbGUyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE0NmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9kcmF3YWJsZS1oZHBpL3BpbmVhcHBsZTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9yZXMvbGF5b3V0L25vdGlmaWNhdGlvbl9idWlsZGVyX3Rlc3QueG1sIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2J1aWxkZXJfdGVzdC54bWwKaW5kZXggM2MzN2E3My4uZTExOTljNyAxMDA2NDQKLS0tIGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2J1aWxkZXJfdGVzdC54bWwKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy9sYXlvdXQvbm90aWZpY2F0aW9uX2J1aWxkZXJfdGVzdC54bWwKQEAgLTEsMjI0ICsxLDIyMCBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxMaW5lYXJMYXlvdXQKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorPFNjcm9sbFZpZXcKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTJkcCIKLSAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iMTJkcCIKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgogICAgICAgICA+Ci0KICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjIwc3AiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgogICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodD0iMjRkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKICAgICAgICAgICAgID4KKwogICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIxMjBkcCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMSIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjEiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzEiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMiIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjIiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzIiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjMiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzMiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzQiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNSIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjUiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzUiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNiIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjYiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzYiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNyIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjciCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzciCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfOCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjgiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzgiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfOSIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjkiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uUGx1cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzkiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgICAgICAgICA8TGluZWFyTGF5b3V0CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMTAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZFRpdGxlIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSIxMCIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8+CisgICAgICAgICAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ub3RpZnlfMTAiCisgICAgICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5NaW51cyIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jbGVhcl8xIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRUaXRsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSIxIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NsZWFyX2FsbCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMmRwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjEyZHAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQ2xlYXIgQWxsIgogICAgICAgICAgICAgICAgICAgICAvPgogICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkQnV0dG9uLlBsdXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzEiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGVuIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlRlbiBub3RpZmljYXRpb25zIgogICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMiIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iMiIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV8yIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMyIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iMyIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV8zIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNCIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iNCIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV80IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iNSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV81IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNiIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iNiIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV82IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfNyIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iNyIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV83IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfOCIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iOCIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV84IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfOSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iOSIKLSAgICAgICAgICAgICAgICAgICAgLz4KLSAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZEJ1dHRvbi5QbHVzIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25vdGlmeV85IgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICA+Ci0gICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvSWRCdXR0b24uTWludXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfMTAiCi0gICAgICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9JZFRpdGxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IjEwIgotICAgICAgICAgICAgICAgICAgICAvPgotICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0lkQnV0dG9uLlBsdXMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbm90aWZ5XzEwIgotICAgICAgICAgICAgICAgICAgICAvPgorICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKLSAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2xlYXJfYWxsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMmRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNsZWFyIEFsbCIKLSAgICAgICAgICAgICAgICAvPgotICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZW4iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlRlbiBub3RpZmljYXRpb25zIgotICAgICAgICAgICAgICAgIC8+Ci0gICAgICAgICAgICAgICAgCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8U2Nyb2xsVmlldwotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgPgogICAgICAgICA8TGluZWFyTGF5b3V0CiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKQEAgLTgxOCw3ICs4MTQsNiBAQAogCiAKICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9TY3JvbGxWaWV3PgorICAgIDwvTGluZWFyTGF5b3V0PgogCi0KLTwvTGluZWFyTGF5b3V0PgorPC9TY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy92YWx1ZXMtc3c2MDBkcC9zdHlsZXMueG1sIGIvdGVzdHMvU3RhdHVzQmFyL3Jlcy92YWx1ZXMtc3c2MDBkcC9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTg0N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL3ZhbHVlcy1zdzYwMGRwL3N0eWxlcy54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cmVzb3VyY2VzPgorICAgIDxzdHlsZSBuYW1lPSJJZFRpdGxlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MzBzcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTdHlsZSI+Ym9sZDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IklkQnV0dG9uIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4xPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5SaWdodCI+OGRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0Ij44ZHA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iSWRCdXR0b24uTWludXMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPi08L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJJZEJ1dHRvbi5QbHVzIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij4rPC9pdGVtPgorICAgIDwvc3R5bGU+CisKKyAgICA8c3R5bGUgbmFtZT0iRmllbGRUaXRsZSI+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjIwOHNwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCisgICAgPHN0eWxlIG5hbWU9IkZpZWxkQ29udGVudHMiPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRBcHBlYXJhbmNlIj4/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlTWVkaXVtPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQiPjIwZHA8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworICAgIDxzdHlsZSBuYW1lPSJGaWVsZENvbnRlbnRzLkRpc2FibGVkIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjbGlja2FibGUiPmZhbHNlPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnZpc2liaWxpdHkiPmdvbmU8L2l0ZW0+CisgICAgPC9zdHlsZT4KKworPC9yZXNvdXJjZXM+CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL3Rlc3RzL1N0YXR1c0Jhci9yZXMvdmFsdWVzL3N0eWxlcy54bWwKaW5kZXggZTA1MWVmZC4uMTAzYTI1YSAxMDA2NDQKLS0tIGEvdGVzdHMvU3RhdHVzQmFyL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAorKysgYi90ZXN0cy9TdGF0dXNCYXIvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC0xNiwyMSArMTYsMjMgQEAKIDxyZXNvdXJjZXM+CiAKICAgICA8c3R5bGUgbmFtZT0iSWRUaXRsZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjMwc3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjIwc3A8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJJZEJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjBkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjEwZHA8L2l0ZW0+CiAgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjE8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0Ij44ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjhkcDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjFkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQiPjFkcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nTGVmdCI+NmRwPC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdSaWdodCI+NmRwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iSWRCdXR0b24uTWludXMiPgpAQCAtNDIsMTYgKzQ0LDE2IEBACiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJGaWVsZFRpdGxlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MjA4c3A8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dEFwcGVhcmFuY2UiPj9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VTbWFsbDwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPndyYXBfY29udGVudDwvaXRlbT4KICAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij53cmFwX2NvbnRlbnQ8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJGaWVsZENvbnRlbnRzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZU1lZGl1bTwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZSI+P2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsPC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQiPjIwZHA8L2l0ZW0+CisgICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0Ij40ZHA8L2l0ZW0+CiAgICAgPC9zdHlsZT4KIAogICAgIDxzdHlsZSBuYW1lPSJGaWVsZENvbnRlbnRzLkRpc2FibGVkIj4KZGlmZiAtLWdpdCBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEgYi90ZXN0cy9TdGF0dXNCYXIvc3JjL2NvbS9hbmRyb2lkL3N0YXR1c2JhcnRlc3QvU3RhdHVzQmFyVGVzdC5qYXZhCmluZGV4IDAxMjkxMTQuLmIyMTI1MzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1N0YXR1c0Jhci9zcmMvY29tL2FuZHJvaWQvc3RhdHVzYmFydGVzdC9TdGF0dXNCYXJUZXN0LmphdmEKKysrIGIvdGVzdHMvU3RhdHVzQmFyL3NyYy9jb20vYW5kcm9pZC9zdGF0dXNiYXJ0ZXN0L1N0YXR1c0JhclRlc3QuamF2YQpAQCAtMTQ1LDEzICsxNDUsMTAgQEAKICAgICAgICAgfSwKICAgICAgICAgbmV3IFRlc3QoIlByaW9yaXR5IG5vdGlmaWNhdGlvbiIpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbm90ID0gbmV3IE5vdGlmaWNhdGlvbihTdGF0dXNCYXJUZXN0LnRoaXMsCisgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdCA9IG5ldyBOb3RpZmljYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuZHJhd2FibGUuc3RhdF9zeXNfcGhvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbWluZyBjYWxsIGZyb206IEltcGVyaW91cyBMZWFkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS0oMTAwMCo2MCo2MCoyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBlcmlvdXMgTGVhZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig4ODgpIDU1NS01MDM4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS0oMTAwMCo2MCo2MCoyNCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICBub3QuZmxhZ3MgfD0gTm90aWZpY2F0aW9uLkZMQUdfSElHSF9QUklPUklUWTsKICAgICAgICAgICAgICAgICBJbnRlbnQgZnVsbFNjcmVlbkludGVudCA9IG5ldyBJbnRlbnQoU3RhdHVzQmFyVGVzdC50aGlzLCBUZXN0QWxlcnRBY3Rpdml0eS5jbGFzcyk7CkBAIC0yNDgsMTIgKzI0NSwxMCBAQAogICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3REZWxheWVkKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkoMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb3RpZmljYXRpb24oU3RhdHVzQmFyVGVzdC50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vdGlmaWNhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5pY19zdGF0dXNiYXJfbWlzc2VkY2FsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpY2sgdGljayB0aWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktKDEwMDAqNjAqNjAqMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQ1MykgMTIzLTIzMjgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS0oMTAwMCo2MCo2MCoyNCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDApOwpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVybWlzc2lvbi9zcmMvY29tL2FuZHJvaWQvZnJhbWV3b3JrL3Blcm1pc3Npb24vdGVzdHMvV2luZG93TWFuYWdlclBlcm1pc3Npb25UZXN0cy5qYXZhIGIvdGVzdHMvcGVybWlzc2lvbi9zcmMvY29tL2FuZHJvaWQvZnJhbWV3b3JrL3Blcm1pc3Npb24vdGVzdHMvV2luZG93TWFuYWdlclBlcm1pc3Npb25UZXN0cy5qYXZhCmluZGV4IGUwZjBmMDUuLmYwMTUzNzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Blcm1pc3Npb24vc3JjL2NvbS9hbmRyb2lkL2ZyYW1ld29yay9wZXJtaXNzaW9uL3Rlc3RzL1dpbmRvd01hbmFnZXJQZXJtaXNzaW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9wZXJtaXNzaW9uL3NyYy9jb20vYW5kcm9pZC9mcmFtZXdvcmsvcGVybWlzc2lvbi90ZXN0cy9XaW5kb3dNYW5hZ2VyUGVybWlzc2lvblRlc3RzLmphdmEKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbVdtLnNldEFwcFN0YXJ0aW5nV2luZG93KG51bGwsICJmb28iLCAwLCBudWxsLCAwLCAwLCAwLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICBtV20uc2V0QXBwU3RhcnRpbmdXaW5kb3cobnVsbCwgImZvbyIsIDAsIG51bGwsIG51bGwsIDAsIDAsIDAsIG51bGwsIGZhbHNlKTsKICAgICAgICAgICAgIGZhaWwoIklXaW5kb3dNYW5hZ2VyLnNldEFwcFN0YXJ0aW5nV2luZG93IGRpZCBub3QgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24gYXMiCiAgICAgICAgICAgICAgICAgICAgICsgIiBleHBlY3RlZCIpOwogICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L0FhcHRBc3NldHMuY3BwIGIvdG9vbHMvYWFwdC9BYXB0QXNzZXRzLmNwcAppbmRleCA0ODk0MTk2Li4yOWQyYjg3IDEwMDY0NAotLS0gYS90b29scy9hYXB0L0FhcHRBc3NldHMuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQWFwdEFzc2V0cy5jcHAKQEAgLTk2OSw2ICs5NjksMTEgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIAorICAgIGlmIChzdHJjbXAobmFtZSwgInR2ZHBpIikgPT0gMCkgeworICAgICAgICBpZiAob3V0KSBvdXQtPmRlbnNpdHkgPSBSZXNUYWJsZV9jb25maWc6OkRFTlNJVFlfVFY7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKICAgICBpZiAoc3RyY21wKG5hbWUsICJoZHBpIikgPT0gMCkgewogICAgICAgICBpZiAob3V0KSBvdXQtPmRlbnNpdHkgPSBSZXNUYWJsZV9jb25maWc6OkRFTlNJVFlfSElHSDsKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L0NvbW1hbmQuY3BwIGIvdG9vbHMvYWFwdC9Db21tYW5kLmNwcAppbmRleCA4YWM3NTkwLi43ODUyMTk3IDEwMDY0NAotLS0gYS90b29scy9hYXB0L0NvbW1hbmQuY3BwCisrKyBiL3Rvb2xzL2FhcHQvQ29tbWFuZC5jcHAKQEAgLTI5MSw2ICsyOTEsMjcgQEAKICAgICByZXR1cm4gdmFsdWUuZGF0YTsKIH0KIAorc3RhdGljIGludDMyX3QgZ2V0UmVzb2x2ZWRJbnRlZ2VyQXR0cmlidXRlKGNvbnN0IFJlc1RhYmxlKiByZXNUYWJsZSwgY29uc3QgUmVzWE1MVHJlZSYgdHJlZSwKKyAgICAgICAgdWludDMyX3QgYXR0clJlcywgU3RyaW5nOCogb3V0RXJyb3IsIGludDMyX3QgZGVmVmFsdWUgPSAtMSkKK3sKKyAgICBzc2l6ZV90IGlkeCA9IGluZGV4T2ZBdHRyaWJ1dGUodHJlZSwgYXR0clJlcyk7CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGRlZlZhbHVlOworICAgIH0KKyAgICBSZXNfdmFsdWUgdmFsdWU7CisgICAgaWYgKHRyZWUuZ2V0QXR0cmlidXRlVmFsdWUoaWR4LCAmdmFsdWUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICh2YWx1ZS5kYXRhVHlwZSA9PSBSZXNfdmFsdWU6OlRZUEVfUkVGRVJFTkNFKSB7CisgICAgICAgICAgICByZXNUYWJsZS0+cmVzb2x2ZVJlZmVyZW5jZSgmdmFsdWUsIDApOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5kYXRhVHlwZSA8IFJlc192YWx1ZTo6VFlQRV9GSVJTVF9JTlQKKyAgICAgICAgICAgICAgICB8fCB2YWx1ZS5kYXRhVHlwZSA+IFJlc192YWx1ZTo6VFlQRV9MQVNUX0lOVCkgeworICAgICAgICAgICAgaWYgKG91dEVycm9yICE9IE5VTEwpICpvdXRFcnJvciA9ICJhdHRyaWJ1dGUgaXMgbm90IGFuIGludGVnZXIgdmFsdWUiOworICAgICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2YWx1ZS5kYXRhOworfQorCiBzdGF0aWMgU3RyaW5nOCBnZXRSZXNvbHZlZEF0dHJpYnV0ZShjb25zdCBSZXNUYWJsZSogcmVzVGFibGUsIGNvbnN0IFJlc1hNTFRyZWUmIHRyZWUsCiAgICAgICAgIHVpbnQzMl90IGF0dHJSZXMsIFN0cmluZzgqIG91dEVycm9yKQogewpAQCAtMzIwLDExICszNDEsMTIgQEAKIC8vIFRoZXNlIGFyZSBhdHRyaWJ1dGUgcmVzb3VyY2UgY29uc3RhbnRzIGZvciB0aGUgcGxhdGZvcm0sIGFzIGZvdW5kCiAvLyBpbiBhbmRyb2lkLlIuYXR0cgogZW51bSB7CisgICAgTEFCRUxfQVRUUiA9IDB4MDEwMTAwMDEsCisgICAgSUNPTl9BVFRSID0gMHgwMTAxMDAwMiwKICAgICBOQU1FX0FUVFIgPSAweDAxMDEwMDAzLAogICAgIFZFUlNJT05fQ09ERV9BVFRSID0gMHgwMTAxMDIxYiwKICAgICBWRVJTSU9OX05BTUVfQVRUUiA9IDB4MDEwMTAyMWMsCi0gICAgTEFCRUxfQVRUUiA9IDB4MDEwMTAwMDEsCi0gICAgSUNPTl9BVFRSID0gMHgwMTAxMDAwMiwKKyAgICBTQ1JFRU5fT1JJRU5UQVRJT05fQVRUUiA9IDB4MDEwMTAwMWUsCiAgICAgTUlOX1NES19WRVJTSU9OX0FUVFIgPSAweDAxMDEwMjBjLAogICAgIE1BWF9TREtfVkVSU0lPTl9BVFRSID0gMHgwMTAxMDI3MSwKICAgICBSRVFfVE9VQ0hfU0NSRUVOX0FUVFIgPSAweDAxMDEwMjI3LApAQCAtMzQzLDYgKzM2NSw5IEBACiAgICAgUkVRVUlSRURfQVRUUiA9IDB4MDEwMTAyOGUsCiAgICAgU0NSRUVOX1NJWkVfQVRUUiA9IDB4MDEwMTAyY2EsCiAgICAgU0NSRUVOX0RFTlNJVFlfQVRUUiA9IDB4MDEwMTAyY2IsCisgICAgUkVRVUlSRVNfU01BTExFU1RfV0lEVEhfRFBfQVRUUiA9IDB4MDEwMTAzNjQsCisgICAgQ09NUEFUSUJMRV9XSURUSF9MSU1JVF9EUF9BVFRSID0gMHgwMTAxMDM2NSwKKyAgICBMQVJHRVNUX1dJRFRIX0xJTUlUX0RQX0FUVFIgPSAweDAxMDEwMzY2LAogfTsKIAogY29uc3QgY2hhciAqZ2V0Q29tcG9uZW50TmFtZShTdHJpbmc4ICZwa2dOYW1lLCBTdHJpbmc4ICZjb21wb25lbnROYW1lKSB7CkBAIC00MjMsNiArNDQ4LDI0IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAorICAgIC8vIE1ha2UgYSBkdW1teSBjb25maWcgZm9yIHJldHJpZXZpbmcgcmVzb3VyY2VzLi4uICB3ZSBuZWVkIHRvIHN1cHBseQorICAgIC8vIG5vbi1kZWZhdWx0IHZhbHVlcyBmb3Igc29tZSBjb25maWdzIHNvIHRoYXQgd2UgY2FuIHJldHJpZXZlIHJlc291cmNlcworICAgIC8vIGluIHRoZSBhcHAgdGhhdCBkb24ndCBoYXZlIGEgZGVmYXVsdC4gIFRoZSBtb3N0IGltcG9ydGFudCBvZiB0aGVzZSBpcworICAgIC8vIHRoZSBBUEkgdmVyc2lvbiBiZWNhdXNlIGtleSByZXNvdXJjZXMgbGlrZSBpY29ucyB3aWxsIGhhdmUgYW4gaW1wbGljaXQKKyAgICAvLyB2ZXJzaW9uIGlmIHRoZXkgYXJlIHVzaW5nIG5ld2VyIGNvbmZpZyB0eXBlcyBsaWtlIGRlbnNpdHkuCisgICAgUmVzVGFibGVfY29uZmlnIGNvbmZpZzsKKyAgICBjb25maWcubGFuZ3VhZ2VbMF0gPSAnZSc7CisgICAgY29uZmlnLmxhbmd1YWdlWzFdID0gJ24nOworICAgIGNvbmZpZy5jb3VudHJ5WzBdID0gJ1UnOworICAgIGNvbmZpZy5jb3VudHJ5WzFdID0gJ1MnOworICAgIGNvbmZpZy5vcmllbnRhdGlvbiA9IFJlc1RhYmxlX2NvbmZpZzo6T1JJRU5UQVRJT05fUE9SVDsKKyAgICBjb25maWcuZGVuc2l0eSA9IFJlc1RhYmxlX2NvbmZpZzo6REVOU0lUWV9NRURJVU07CisgICAgY29uZmlnLnNka1ZlcnNpb24gPSAxMDAwMDsgLy8gVmVyeSBoaWdoLgorICAgIGNvbmZpZy5zY3JlZW5XaWR0aERwID0gMzIwOworICAgIGNvbmZpZy5zY3JlZW5IZWlnaHREcCA9IDQ4MDsKKyAgICBjb25maWcuc21hbGxlc3RTY3JlZW5XaWR0aERwID0gMzIwOworICAgIGFzc2V0cy5zZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7CisKICAgICBjb25zdCBSZXNUYWJsZSYgcmVzID0gYXNzZXRzLmdldFJlc291cmNlcyhmYWxzZSk7CiAgICAgaWYgKCZyZXMgPT0gTlVMTCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBkdW1wIGZhaWxlZCBiZWNhdXNlIG5vIHJlc291cmNlIHRhYmxlIHdhcyBmb3VuZFxuIik7CkBAIC01NDIsNiArNTg1LDE5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiYmFkZ2luZyIsIG9wdGlvbikgPT0gMCkgeworICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+IGxvY2FsZXM7CisgICAgICAgICAgICByZXMuZ2V0TG9jYWxlcygmbG9jYWxlcyk7CisKKyAgICAgICAgICAgIFZlY3RvcjxSZXNUYWJsZV9jb25maWc+IGNvbmZpZ3M7CisgICAgICAgICAgICByZXMuZ2V0Q29uZmlndXJhdGlvbnMoJmNvbmZpZ3MpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gZGVuc2l0aWVzOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IE5DID0gY29uZmlncy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8TkM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBkZW5zID0gY29uZmlnc1tpXS5kZW5zaXR5OworICAgICAgICAgICAgICAgIGlmIChkZW5zID09IDApIGRlbnMgPSAxNjA7CisgICAgICAgICAgICAgICAgZGVuc2l0aWVzLmFkZChkZW5zKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc2l6ZV90IGxlbjsKICAgICAgICAgICAgIFJlc1hNTFRyZWU6OmV2ZW50X2NvZGVfdCBjb2RlOwogICAgICAgICAgICAgaW50IGRlcHRoID0gMDsKQEAgLTU5OCw2ICs2NTQsMTAgQEAKICAgICAgICAgICAgIGJvb2wgc3BlY1RvdWNoc2NyZWVuRmVhdHVyZSA9IGZhbHNlOyAvLyB0b3VjaHNjcmVlbi1yZWxhdGVkCiAgICAgICAgICAgICBib29sIHNwZWNNdWx0aXRvdWNoRmVhdHVyZSA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbCByZXFEaXN0aW5jdE11bHRpdG91Y2hGZWF0dXJlID0gZmFsc2U7CisgICAgICAgICAgICBib29sIHNwZWNTY3JlZW5Qb3J0cmFpdEZlYXR1cmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgc3BlY1NjcmVlbkxhbmRzY2FwZUZlYXR1cmUgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2wgcmVxU2NyZWVuUG9ydHJhaXRGZWF0dXJlID0gZmFsc2U7CisgICAgICAgICAgICBib29sIHJlcVNjcmVlbkxhbmRzY2FwZUZlYXR1cmUgPSBmYWxzZTsKICAgICAgICAgICAgIC8vIDIuMiBhbHNvIGFkZGVkIHNvbWUgb3RoZXIgZmVhdHVyZXMgdGhhdCBhcHBzIGNhbiByZXF1ZXN0LCBidXQgdGhhdAogICAgICAgICAgICAgLy8gaGF2ZSBubyBjb3JyZXNwb25kaW5nIHBlcm1pc3Npb24sIHNvIHdlIGNhbm5vdCBpbXBsZW1lbnQgYW55CiAgICAgICAgICAgICAvLyBiYWNrLWNvbXBhdGliaWxpdHkgaGV1cmlzdGljIGZvciB0aGVtLiBUaGUgYmVsb3cgYXJlIHRodXMgdW5uZWNlc3NhcnkKQEAgLTYxNCw2ICs2NzQsOSBAQAogICAgICAgICAgICAgaW50IGxhcmdlU2NyZWVuID0gMTsKICAgICAgICAgICAgIGludCB4bGFyZ2VTY3JlZW4gPSAxOwogICAgICAgICAgICAgaW50IGFueURlbnNpdHkgPSAxOworICAgICAgICAgICAgaW50IHJlcXVpcmVzU21hbGxlc3RXaWR0aERwID0gMDsKKyAgICAgICAgICAgIGludCBjb21wYXRpYmxlV2lkdGhMaW1pdERwID0gMDsKKyAgICAgICAgICAgIGludCBsYXJnZXN0V2lkdGhMaW1pdERwID0gMDsKICAgICAgICAgICAgIFN0cmluZzggcGtnOwogICAgICAgICAgICAgU3RyaW5nOCBhY3Rpdml0eU5hbWU7CiAgICAgICAgICAgICBTdHJpbmc4IGFjdGl2aXR5TGFiZWw7CkBAIC02MjgsMTAgKzY5MSwxMSBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoIDwgMykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpdGhpbkFjdGl2aXR5ICYmIGlzTWFpbkFjdGl2aXR5ICYmIGlzTGF1bmNoZXJBY3Rpdml0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFOYW1lID0gZ2V0Q29tcG9uZW50TmFtZShwa2csIGFjdGl2aXR5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJsYXVuY2hhYmxlLWFjdGl2aXR5OiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigibGF1bmNoYWJsZSBhY3Rpdml0eSBuYW1lPSclcyciLCBhTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIG5hbWU9JyVzJyAiLCBhTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigibGFiZWw9JyVzJyBpY29uPSclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgbGFiZWw9JyVzJyBpY29uPSclcydcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eUxhYmVsLnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlJY29uLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY5NiwyMyArNzYwLDUxIEBACiAgICAgICAgICAgICAgICAgICAgIHdpdGhpbkFwcGxpY2F0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gImFwcGxpY2F0aW9uIikgewogICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluQXBwbGljYXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBsYWJlbCA9IGdldFJlc29sdmVkQXR0cmlidXRlKCZyZXMsIHRyZWUsIExBQkVMX0FUVFIsICZlcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgZ2V0dGluZyAnYW5kcm9pZDpsYWJlbCcgYXR0cmlidXRlOiAlc1xuIiwgZXJyb3Iuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhaWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbGFiZWw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgTkwgPSBsb2NhbGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOTDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxlU3RyID0gIGxvY2FsZXNbaV0uc3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRzLnNldExvY2FsZShsb2NhbGVTdHIgIT0gTlVMTCA/IGxvY2FsZVN0ciA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGxsYWJlbCA9IGdldFJlc29sdmVkQXR0cmlidXRlKCZyZXMsIHRyZWUsIExBQkVMX0FUVFIsICZlcnJvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxsYWJlbCAhPSAiIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxlU3RyID09IE5VTEwgfHwgc3RybGVuKGxvY2FsZVN0cikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsbGFiZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImFwcGxpY2F0aW9uLWxhYmVsOiclcydcbiIsIGxsYWJlbC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT0gIiIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxsYWJlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiYXBwbGljYXRpb24tbGFiZWwtJXM6JyVzJ1xuIiwgbG9jYWxlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbGFiZWwuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJhcHBsaWNhdGlvbjogbGFiZWw9JyVzJyAiLCBsYWJlbC5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc1RhYmxlX2NvbmZpZyB0bXBDb25maWcgPSBjb25maWc7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgTkQgPSBkZW5zaXRpZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPE5EOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBDb25maWcuZGVuc2l0eSA9IGRlbnNpdGllc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NldHMuc2V0Q29uZmlndXJhdGlvbih0bXBDb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggaWNvbiA9IGdldFJlc29sdmVkQXR0cmlidXRlKCZyZXMsIHRyZWUsIElDT05fQVRUUiwgJmVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWNvbiAhPSAiIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImFwcGxpY2F0aW9uLWljb24tJWQ6JyVzJ1xuIiwgZGVuc2l0aWVzW2ldLCBpY29uLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NldHMuc2V0Q29uZmlndXJhdGlvbihjb25maWcpOworCiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGljb24gPSBnZXRSZXNvbHZlZEF0dHJpYnV0ZSgmcmVzLCB0cmVlLCBJQ09OX0FUVFIsICZlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIGdldHRpbmcgJ2FuZHJvaWQ6aWNvbicgYXR0cmlidXRlOiAlc1xuIiwgZXJyb3Iuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaWNvbj0nJXMnXG4iLCBpY29uLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGVzdE9ubHkgPSBnZXRJbnRlZ2VyQXR0cmlidXRlKHRyZWUsIFRFU1RfT05MWV9BVFRSLCAmZXJyb3IsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiBnZXR0aW5nICdhbmRyb2lkOnRlc3RPbmx5JyBhdHRyaWJ1dGU6ICVzXG4iLCBlcnJvci5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJhcHBsaWNhdGlvbjogbGFiZWw9JyVzJyAiLCBsYWJlbC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImljb249JyVzJ1xuIiwgaWNvbi5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdE9ubHkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigidGVzdE9ubHk9JyVkJ1xuIiwgdGVzdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzkyLDYgKzg4NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTEFSR0VfU0NSRUVOX0FUVFIsIE5VTEwsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgYW55RGVuc2l0eSA9IGdldEludGVnZXJBdHRyaWJ1dGUodHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZX0RFTlNJVFlfQVRUUiwgTlVMTCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA9IGdldEludGVnZXJBdHRyaWJ1dGUodHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRVNfU01BTExFU1RfV0lEVEhfRFBfQVRUUiwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxlV2lkdGhMaW1pdERwID0gZ2V0SW50ZWdlckF0dHJpYnV0ZSh0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QQVRJQkxFX1dJRFRIX0xJTUlUX0RQX0FUVFIsIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdFdpZHRoTGltaXREcCA9IGdldEludGVnZXJBdHRyaWJ1dGUodHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFSR0VTVF9XSURUSF9MSU1JVF9EUF9BVFRSLCBOVUxMLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gInVzZXMtZmVhdHVyZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbmFtZSA9IGdldEF0dHJpYnV0ZSh0cmVlLCBOQU1FX0FUVFIsICZlcnJvcik7CiAKQEAgLTgzNyw2ICs5MzUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgaGF2ZSBubyBjb3JyZXNwb25kaW5nIHBlcm1pc3Npb24gdG8gY2hlY2sgZm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgc2hvdWxkIGltcGx5IHRoZSBmb3VuZGF0aW9uYWwgdGVsZXBob255IHBlcm1pc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxVGVsZXBob255U3ViRmVhdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5wb3J0cmFpdCIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY1NjcmVlblBvcnRyYWl0RmVhdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lID09ICJhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5sYW5kc2NhcGUiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNTY3JlZW5MYW5kc2NhcGVGZWF0dXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ1c2VzLWZlYXR1cmUlczonJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxID8gIiIgOiAiLW5vdC1yZXF1aXJlZCIsIG5hbWUuc3RyaW5nKCkpOwpAQCAtOTQ0LDYgKzEwNDYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIGdldHRpbmcgJ2FuZHJvaWQ6aWNvbicgYXR0cmlidXRlOiAlc1xuIiwgZXJyb3Iuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvcmllbiA9IGdldFJlc29sdmVkSW50ZWdlckF0dHJpYnV0ZSgmcmVzLCB0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1JFRU5fT1JJRU5UQVRJT05fQVRUUiwgJmVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSAiIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmllbiA9PSAwIHx8IG9yaWVuID09IDYgfHwgb3JpZW4gPT0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0cyBsYW5kc2NhcGUsIHNlbnNvckxhbmRzY2FwZSwgb3IgcmV2ZXJzZUxhbmRzY2FwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxU2NyZWVuTGFuZHNjYXBlRmVhdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmllbiA9PSAxIHx8IG9yaWVuID09IDcgfHwgb3JpZW4gPT0gOSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0cyBwb3J0cmFpdCwgc2Vuc29yUG9ydHJhaXQsIG9yIHJldmVyc2VQb3J0cmFpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxU2NyZWVuUG9ydHJhaXRGZWF0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09ICJ1c2VzLWxpYnJhcnkiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYnJhcnlOYW1lID0gZ2V0QXR0cmlidXRlKHRyZWUsIE5BTUVfQVRUUiwgJmVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSAiIikgewpAQCAtMTEwMyw2ICsxMjE3LDE5IEBACiAgICAgICAgICAgICAgICAgcHJpbnRmKCJ1c2VzLWZlYXR1cmU6J2FuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4ubXVsdGl0b3VjaCdcbiIpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBMYW5kc2NhcGUvcG9ydHJhaXQtcmVsYXRlZCBjb21wYXRpYmlsaXR5IGxvZ2ljCisgICAgICAgICAgICBpZiAoIXNwZWNTY3JlZW5MYW5kc2NhcGVGZWF0dXJlICYmICFzcGVjU2NyZWVuUG9ydHJhaXRGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBoYXMgc3BlY2lmaWVkIGFueSBhY3Rpdml0aWVzIGluIGl0cyBtYW5pZmVzdAorICAgICAgICAgICAgICAgIC8vIHRoYXQgcmVxdWVzdCBhIHNwZWNpZmljIG9yaWVudGF0aW9uLCB0aGVuIGFzc3VtZSB0aGF0CisgICAgICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gaXMgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgaWYgKHJlcVNjcmVlbkxhbmRzY2FwZUZlYXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ1c2VzLWZlYXR1cmU6J2FuZHJvaWQuaGFyZHdhcmUuc2NyZWVuLmxhbmRzY2FwZSdcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVxU2NyZWVuUG9ydHJhaXRGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidXNlcy1mZWF0dXJlOidhbmRyb2lkLmhhcmR3YXJlLnNjcmVlbi5wb3J0cmFpdCdcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGhhc01haW5BY3Rpdml0eSkgewogICAgICAgICAgICAgICAgIHByaW50ZigibWFpblxuIik7CiAgICAgICAgICAgICB9CkBAIC0xMTI4LDYgKzEyNTUsMzQgQEAKICAgICAgICAgICAgICAgICBwcmludGYoIm90aGVyLXNlcnZpY2VzXG4iKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gRm9yIG1vZGVybiBhcHBzLCBpZiBzY3JlZW4gc2l6ZSBidWNrZXRzIGhhdmVuJ3QgYmVlbiBzcGVjaWZpZWQKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgbmV3IHdpZHRoIHJhbmdlcyBoYXZlLCB0aGVuIGluZmVyIHRoZSBidWNrZXRzIGZyb20gdGhlbS4KKyAgICAgICAgICAgIGlmIChzbWFsbFNjcmVlbiA+IDAgJiYgbm9ybWFsU2NyZWVuID4gMCAmJiBsYXJnZVNjcmVlbiA+IDAgJiYgeGxhcmdlU2NyZWVuID4gMAorICAgICAgICAgICAgICAgICAgICAmJiByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY29tcGF0V2lkdGggPSBjb21wYXRpYmxlV2lkdGhMaW1pdERwOworICAgICAgICAgICAgICAgIGlmIChjb21wYXRXaWR0aCA8PSAwKSBjb21wYXRXaWR0aCA9IHJlcXVpcmVzU21hbGxlc3RXaWR0aERwOworICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA8PSAyNDAgJiYgY29tcGF0V2lkdGggPj0gMjQwKSB7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsU2NyZWVuID0gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc21hbGxTY3JlZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAgPD0gMzIwICYmIGNvbXBhdFdpZHRoID49IDMyMCkgeworICAgICAgICAgICAgICAgICAgICBub3JtYWxTY3JlZW4gPSAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBub3JtYWxTY3JlZW4gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAgPD0gNDgwICYmIGNvbXBhdFdpZHRoID49IDQ4MCkgeworICAgICAgICAgICAgICAgICAgICBsYXJnZVNjcmVlbiA9IC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxhcmdlU2NyZWVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVzU21hbGxlc3RXaWR0aERwIDw9IDcyMCAmJiBjb21wYXRXaWR0aCA+PSA3MjApIHsKKyAgICAgICAgICAgICAgICAgICAgeGxhcmdlU2NyZWVuID0gLTE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeGxhcmdlU2NyZWVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIERldGVybWluZSBkZWZhdWx0IHZhbHVlcyBmb3IgYW55IHVuc3BlY2lmaWVkIHNjcmVlbiBzaXplcywKICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSB0YXJnZXQgU0RLIG9mIHRoZSBwYWNrYWdlLiAgQXMgb2YgNCAoZG9udXQpCiAgICAgICAgICAgICAvLyB0aGUgc2NyZWVuIHNpemUgc3VwcG9ydCB3YXMgaW50cm9kdWNlZCwgc28gYWxsIGRlZmF1bHQgdG8KQEAgLTExNDYsNyArMTMwMSw4IEBACiAgICAgICAgICAgICAgICAgeGxhcmdlU2NyZWVuID0gdGFyZ2V0U2RrID49IDkgPyAtMSA6IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYW55RGVuc2l0eSA+IDApIHsKLSAgICAgICAgICAgICAgICBhbnlEZW5zaXR5ID0gdGFyZ2V0U2RrID49IDQgPyAtMSA6IDA7CisgICAgICAgICAgICAgICAgYW55RGVuc2l0eSA9ICh0YXJnZXRTZGsgPj0gNCB8fCByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbXBhdGlibGVXaWR0aExpbWl0RHAgPiAwKSA/IC0xIDogMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByaW50Zigic3VwcG9ydHMtc2NyZWVuczoiKTsKICAgICAgICAgICAgIGlmIChzbWFsbFNjcmVlbiAhPSAwKSBwcmludGYoIiAnc21hbGwnIik7CkBAIC0xMTU0LDEyICsxMzEwLDE4IEBACiAgICAgICAgICAgICBpZiAobGFyZ2VTY3JlZW4gIT0gMCkgcHJpbnRmKCIgJ2xhcmdlJyIpOwogICAgICAgICAgICAgaWYgKHhsYXJnZVNjcmVlbiAhPSAwKSBwcmludGYoIiAneGxhcmdlJyIpOwogICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotCiAgICAgICAgICAgICBwcmludGYoInN1cHBvcnRzLWFueS1kZW5zaXR5OiAnJXMnXG4iLCBhbnlEZW5zaXR5ID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgICBpZiAocmVxdWlyZXNTbWFsbGVzdFdpZHRoRHAgPiAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJyZXF1aXJlcy1zbWFsbGVzdC13aWR0aDonJWQnXG4iLCByZXF1aXJlc1NtYWxsZXN0V2lkdGhEcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tcGF0aWJsZVdpZHRoTGltaXREcCA+IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNvbXBhdGlibGUtd2lkdGgtbGltaXQ6JyVkJ1xuIiwgY29tcGF0aWJsZVdpZHRoTGltaXREcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGFyZ2VzdFdpZHRoTGltaXREcCA+IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImxhcmdlc3Qtd2lkdGgtbGltaXQ6JyVkJ1xuIiwgbGFyZ2VzdFdpZHRoTGltaXREcCk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHByaW50ZigibG9jYWxlczoiKTsKLSAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiBsb2NhbGVzOwotICAgICAgICAgICAgcmVzLmdldExvY2FsZXMoJmxvY2FsZXMpOwogICAgICAgICAgICAgY29uc3Qgc2l6ZV90IE5MID0gbG9jYWxlcy5zaXplKCk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8Tkw7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2FsZVN0ciA9ICBsb2NhbGVzW2ldLnN0cmluZygpOwpAQCAtMTE3MCwxNiArMTMzMiw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAKLSAgICAgICAgICAgIFZlY3RvcjxSZXNUYWJsZV9jb25maWc+IGNvbmZpZ3M7Ci0gICAgICAgICAgICByZXMuZ2V0Q29uZmlndXJhdGlvbnMoJmNvbmZpZ3MpOwotICAgICAgICAgICAgU29ydGVkVmVjdG9yPGludD4gZGVuc2l0aWVzOwotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IE5DID0gY29uZmlncy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGk8TkM7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBkZW5zID0gY29uZmlnc1tpXS5kZW5zaXR5OwotICAgICAgICAgICAgICAgIGlmIChkZW5zID09IDApIGRlbnMgPSAxNjA7Ci0gICAgICAgICAgICAgICAgZGVuc2l0aWVzLmFkZChkZW5zKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcHJpbnRmKCJkZW5zaXRpZXM6Iik7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgTkQgPSBkZW5zaXRpZXMuc2l6ZSgpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPE5EOyBpKyspIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCmluZGV4IDVjNWI0ZmQuLjgxYjkyNGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKKysrIGIvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcApAQCAtMTk2MywxMCArMTk2MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbmx5UHVibGljKSBjb25zdAogewogICAgIFN0cmluZzE2IHBhY2thZ2UsIHR5cGUsIG5hbWU7CisgICAgYm9vbCByZWZPbmx5UHVibGljID0gdHJ1ZTsKICAgICBpZiAoIVJlc1RhYmxlOjpleHBhbmRSZXNvdXJjZVJlZigKICAgICAgICAgcmVmLnN0cmluZygpLCByZWYuc2l6ZSgpLCAmcGFja2FnZSwgJnR5cGUsICZuYW1lLAogICAgICAgICBkZWZUeXBlLCBkZWZQYWNrYWdlID8gZGVmUGFja2FnZTombUFzc2V0c1BhY2thZ2UsCi0gICAgICAgIG91dEVycm9yTXNnKSkgeworICAgICAgICBvdXRFcnJvck1zZywgJnJlZk9ubHlQdWJsaWMpKSB7CiAgICAgICAgIE5PSVNZKHByaW50ZigiRXhwYW5kaW5nIHJlc291cmNlOiByZWY9JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHJlZikuc3RyaW5nKCkpKTsKICAgICAgICAgTk9JU1kocHJpbnRmKCJFeHBhbmRpbmcgcmVzb3VyY2U6IGRlZlR5cGU9JXNcbiIsCkBAIC0xOTc5LDcgKzE5ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSkpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgdWludDMyX3QgcmVzID0gZ2V0UmVzSWQocGFja2FnZSwgdHlwZSwgbmFtZSwgb25seVB1YmxpYyk7CisgICAgdWludDMyX3QgcmVzID0gZ2V0UmVzSWQocGFja2FnZSwgdHlwZSwgbmFtZSwgb25seVB1YmxpYyAmJiByZWZPbmx5UHVibGljKTsKICAgICBOT0lTWShwcmludGYoIkV4cGFuZGVkIHJlc291cmNlOiBwPSVzLCB0PSVzLCBuPSVzLCByZXM9JWRcbiIsCiAgICAgICAgICAgICAgICAgIFN0cmluZzgocGFja2FnZSkuc3RyaW5nKCksIFN0cmluZzgodHlwZSkuc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgIFN0cmluZzgobmFtZSkuc3RyaW5nKCksIHJlcykpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmggYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuaAppbmRleCBiYmI4MTQwLi43MzRjNTQxIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1Jlc291cmNlVGFibGUuaAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuaApAQCAtMTYyLDEzICsxNjIsMTMgQEAKICAgICB1aW50MzJfdCBnZXRSZXNJZChjb25zdCBTdHJpbmcxNiYgcGFja2FnZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIG9ubHlQdWJsaWMgPSBmYWxzZSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbmx5UHVibGljID0gdHJ1ZSkgY29uc3Q7CiAKICAgICB1aW50MzJfdCBnZXRSZXNJZChjb25zdCBTdHJpbmcxNiYgcmVmLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2KiBkZWZUeXBlID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiogZGVmUGFja2FnZSA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIG91dEVycm9yTXNnID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIG9ubHlQdWJsaWMgPSBmYWxzZSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbmx5UHVibGljID0gdHJ1ZSkgY29uc3Q7CiAKICAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkUmVzb3VyY2VOYW1lKGNvbnN0IFN0cmluZzE2JiBzKTsKICAgICAKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzX0RlbGVnYXRlLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhc19EZWxlZ2F0ZS5qYXZhCmluZGV4IDkyMmNkNGMuLmI0NDQ4YTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzX0RlbGVnYXRlLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9DYW52YXNfRGVsZWdhdGUuamF2YQpAQCAtNDI1LDcgKzQyNSw3IEBACiAgICAgICAgIEFmZmluZVRyYW5zZm9ybSBtYXRyaXhUeCA9IG1hdHJpeERlbGVnYXRlLmdldEFmZmluZVRyYW5zZm9ybSgpOwogCiAgICAgICAgIC8vIGNvbWJpbmUgdGhlbSBzbyB0aGF0IHRoZSBnaXZlbiBtYXRyaXggaXMgYXBwbGllZCBhZnRlci4KLSAgICAgICAgY3VycmVudFR4LnByZUNvbmNhdGVuYXRlKG1hdHJpeFR4KTsKKyAgICAgICAgY3VycmVudFR4LmNvbmNhdGVuYXRlKG1hdHJpeFR4KTsKIAogICAgICAgICAvLyBnaXZlIGl0IHRvIHRoZSBncmFwaGljczJEIGFzIGEgbmV3IG1hdHJpeCByZXBsYWNpbmcgYWxsIHByZXZpb3VzIHRyYW5zZm9ybQogICAgICAgICBzbmFwc2hvdC5zZXRUcmFuc2Zvcm0oY3VycmVudFR4KTsKQEAgLTcxNyw3ICs3MTcsNyBAQAogICAgIC8qcGFja2FnZSovIHN0YXRpYyB2b2lkIG5hdGl2ZV9kcmF3Q2lyY2xlKGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICBmbG9hdCBjeCwgZmxvYXQgY3ksIGZsb2F0IHJhZGl1cywgaW50IHBhaW50KSB7CiAgICAgICAgIG5hdGl2ZV9kcmF3T3ZhbChuYXRpdmVDYW52YXMsCi0gICAgICAgICAgICAgICAgbmV3IFJlY3RGKGN4IC0gcmFkaXVzLCBjeSAtIHJhZGl1cywgcmFkaXVzKjIsIHJhZGl1cyoyKSwKKyAgICAgICAgICAgICAgICBuZXcgUmVjdEYoY3ggLSByYWRpdXMsIGN5IC0gcmFkaXVzLCByYWRpdXMsIHJhZGl1cyksCiAgICAgICAgICAgICAgICAgcGFpbnQpOwogICAgIH0KIApAQCAtMTA5Myw2ICsxMDkzLDMzIEBACiAgICAgfQogCiAgICAgQExheW91dGxpYkRlbGVnYXRlCisgICAgLypwYWNrYWdlKi8gc3RhdGljIHZvaWQgbmF0aXZlX2RyYXdUZXh0V2l0aEdseXBocyhpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gdGV4dCwKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvdW50LCBmbG9hdCB4LAorICAgICAgICAgICAgZmxvYXQgeSwgaW50IGZsYWdzLCBpbnQgcGFpbnQpIHsKKyAgICAgICAgbmF0aXZlX2RyYXdUZXh0KG5hdGl2ZUNhbnZhcywgdGV4dCwgaW5kZXgsIGNvdW50LCB4LCB5LCBmbGFncywgcGFpbnQpOworICAgIH0KKworICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQorICAgIC8qcGFja2FnZSovIHN0YXRpYyB2b2lkIG5hdGl2ZV9kcmF3VGV4dFdpdGhHbHlwaHMoaW50IG5hdGl2ZUNhbnZhcywgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGZsb2F0IHgsCisgICAgICAgICAgICBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCkgeworICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKyAgICAgICAgY2hhcltdIGJ1ZmZlciA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY291bnQpOworICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmZmVyLCAwKTsKKworICAgICAgICBuYXRpdmVfZHJhd1RleHQobmF0aXZlQ2FudmFzLCB0ZXh0LCAwLCBjb3VudCwgeCwgeSwgZmxhZ3MsIHBhaW50KTsKKyAgICB9CisKKyAgICBATGF5b3V0bGliRGVsZWdhdGUKKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgdm9pZCBuYXRpdmVfZHJhd0dseXBocyhpbnQgbmF0aXZlQ2FudmFzLCBjaGFyW10gZ2x5cGhzLAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY291bnQsIGZsb2F0IHgsCisgICAgICAgICAgICBmbG9hdCB5LCBpbnQgZmxhZ3MsIGludCBwYWludCkgeworICAgICAgICAvLyBGSVhNRQorICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkuZmlkZWxpdHlXYXJuaW5nKExheW91dExvZy5UQUdfVU5TVVBQT1JURUQsCisgICAgICAgICAgICAgICAgIkNhbnZhcy5kcmF3R2x5cGhzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgbnVsbCwgbnVsbCAvKmRhdGEqLyk7CisgICAgfQorCisgICAgQExheW91dGxpYkRlbGVnYXRlCiAgICAgLypwYWNrYWdlKi8gc3RhdGljIHZvaWQgbmF0aXZlX2RyYXdQb3NUZXh0KGludCBuYXRpdmVDYW52YXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgZmxvYXRbXSBwb3MsCmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL1BhaW50X0RlbGVnYXRlLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL2dyYXBoaWNzL1BhaW50X0RlbGVnYXRlLmphdmEKaW5kZXggMzczZjQ4Mi4uNzc3N2UxOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9ncmFwaGljcy9QYWludF9EZWxlZ2F0ZS5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvZ3JhcGhpY3MvUGFpbnRfRGVsZWdhdGUuamF2YQpAQCAtOTQwLDkgKzk0MCwxNiBAQAogICAgIH0KIAogICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQorICAgIC8qIHBhY2thZ2UgKi9zdGF0aWMgaW50IG5hdGl2ZV9nZXRUZXh0R2x5cGhzKGludCBuYXRpdmVfb2JqZWN0LCBTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LAorICAgICAgICAgICAgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsIGludCBmbGFncywgY2hhcltdIGdseXBocykgeworICAgICAgICAvLyBGSVhNRQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBATGF5b3V0bGliRGVsZWdhdGUKICAgICAvKnBhY2thZ2UqLyBzdGF0aWMgZmxvYXQgbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhpbnQgbmF0aXZlX29iamVjdCwKICAgICAgICAgICAgIGNoYXJbXSB0ZXh0LCBpbnQgaW5kZXgsIGludCBjb3VudCwgaW50IGNvbnRleHRJbmRleCwgaW50IGNvbnRleHRDb3VudCwKLSAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgpIHsKKyAgICAgICAgICAgIGludCBmbGFncywgZmxvYXRbXSBhZHZhbmNlcywgaW50IGFkdmFuY2VzSW5kZXgsIGludCByZXNlcnZlZCkgewogICAgICAgICAvLyBnZXQgdGhlIGRlbGVnYXRlIGZyb20gdGhlIG5hdGl2ZSBpbnQuCiAgICAgICAgIFBhaW50X0RlbGVnYXRlIGRlbGVnYXRlID0gc01hbmFnZXIuZ2V0RGVsZWdhdGUobmF0aXZlX29iamVjdCk7CiAgICAgICAgIGlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7CkBAIC05ODYsMTQgKzk5MywxNCBAQAogICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQogICAgIC8qcGFja2FnZSovIHN0YXRpYyBmbG9hdCBuYXRpdmVfZ2V0VGV4dFJ1bkFkdmFuY2VzKGludCBuYXRpdmVfb2JqZWN0LAogICAgICAgICAgICAgU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGNvbnRleHRTdGFydCwgaW50IGNvbnRleHRFbmQsCi0gICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4KSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MsIGZsb2F0W10gYWR2YW5jZXMsIGludCBhZHZhbmNlc0luZGV4LCBpbnQgcmVzZXJ2ZWQpIHsKICAgICAgICAgLy8gRklYTUU6IHN1cHBvcnQgY29udGV4dFN0YXJ0LCBjb250ZXh0RW5kIGFuZCBkaXJlY3Rpb24gZmxhZwogICAgICAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKICAgICAgICAgY2hhcltdIGJ1ZmZlciA9IFRlbXBvcmFyeUJ1ZmZlci5vYnRhaW4oY291bnQpOwogICAgICAgICBUZXh0VXRpbHMuZ2V0Q2hhcnModGV4dCwgc3RhcnQsIGVuZCwgYnVmZmVyLCAwKTsKIAogICAgICAgICByZXR1cm4gbmF0aXZlX2dldFRleHRSdW5BZHZhbmNlcyhuYXRpdmVfb2JqZWN0LCBidWZmZXIsIDAsIGNvdW50LCBjb250ZXh0U3RhcnQsCi0gICAgICAgICAgICAgICAgY29udGV4dEVuZCAtIGNvbnRleHRTdGFydCwgZmxhZ3MsIGFkdmFuY2VzLCBhZHZhbmNlc0luZGV4KTsKKyAgICAgICAgICAgICAgICBjb250ZXh0RW5kIC0gY29udGV4dFN0YXJ0LCBmbGFncywgYWR2YW5jZXMsIGFkdmFuY2VzSW5kZXgsIHJlc2VydmVkKTsKICAgICB9CiAKICAgICBATGF5b3V0bGliRGVsZWdhdGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvb3MvSGFuZGxlclRocmVhZF9EZWxlZ2F0ZS5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvYW5kcm9pZC9vcy9IYW5kbGVyVGhyZWFkX0RlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiZTk3YzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL29zL0hhbmRsZXJUaHJlYWRfRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zOworCitpbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5hbmRyb2lkLkJyaWRnZUNvbnRleHQ7CitpbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5pbXBsLlJlbmRlckFjdGlvbjsKK2ltcG9ydCBjb20uYW5kcm9pZC50b29scy5sYXlvdXRsaWIuYW5ub3RhdGlvbnMuTGF5b3V0bGliRGVsZWdhdGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRGVsZWdhdGUgb3ZlcnJpZGluZyBzZWxlY3RlZCBtZXRob2RzIG9mIGFuZHJvaWQub3MuSGFuZGxlclRocmVhZAorICoKKyAqIFRocm91Z2ggdGhlIGxheW91dGxpYl9jcmVhdGUgdG9vbCwgc2VsZWN0ZWQgbWV0aG9kcyBvZiBIYW5kbGVyIGhhdmUgYmVlbiByZXBsYWNlZAorICogYnkgY2FsbHMgdG8gbWV0aG9kcyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoaXMgZGVsZWdhdGUgY2xhc3MuCisgKgorICoKKyAqLworcHVibGljIGNsYXNzIEhhbmRsZXJUaHJlYWRfRGVsZWdhdGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPEJyaWRnZUNvbnRleHQsIExpc3Q8SGFuZGxlclRocmVhZD4+IHNUaHJlYWRzID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPEJyaWRnZUNvbnRleHQsIExpc3Q8SGFuZGxlclRocmVhZD4+KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW5VcChCcmlkZ2VDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgTGlzdDxIYW5kbGVyVGhyZWFkPiBsaXN0ID0gc1RocmVhZHMuZ2V0KGNvbnRleHQpOworICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEhhbmRsZXJUaHJlYWQgdGhyZWFkIDogbGlzdCkgeworICAgICAgICAgICAgICAgIHRocmVhZC5xdWl0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIHNUaHJlYWRzLnJlbW92ZShjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tIERlbGVnYXRlIG1ldGhvZHMKKworICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQorICAgIC8qcGFja2FnZSovIHN0YXRpYyB2b2lkIHJ1bihIYW5kbGVyVGhyZWFkIHRoZVRocmVhZCkgeworICAgICAgICAvLyByZWNvcmQgdGhlIHRocmVhZCBzbyB0aGF0IGl0IGNhbiBiZSBxdWl0KCkgb24gY2xlYW4gdXAuCisgICAgICAgIEJyaWRnZUNvbnRleHQgY29udGV4dCA9IFJlbmRlckFjdGlvbi5nZXRDdXJyZW50Q29udGV4dCgpOworICAgICAgICBMaXN0PEhhbmRsZXJUaHJlYWQ+IGxpc3QgPSBzVGhyZWFkcy5nZXQoY29udGV4dCk7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PEhhbmRsZXJUaHJlYWQ+KCk7CisgICAgICAgICAgICBzVGhyZWFkcy5wdXQoY29udGV4dCwgbGlzdCk7CisgICAgICAgIH0KKworICAgICAgICBsaXN0LmFkZCh0aGVUaHJlYWQpOworCisgICAgICAgIC8vIC0tLS0gU1RBUlQgREVGQVVMVCBJTVBMRU1FTlRBVElPTi4KKworICAgICAgICB0aGVUaHJlYWQubVRpZCA9IFByb2Nlc3MubXlUaWQoKTsKKyAgICAgICAgTG9vcGVyLnByZXBhcmUoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGVUaHJlYWQpIHsKKyAgICAgICAgICAgIHRoZVRocmVhZC5tTG9vcGVyID0gTG9vcGVyLm15TG9vcGVyKCk7CisgICAgICAgICAgICB0aGVUaHJlYWQubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgUHJvY2Vzcy5zZXRUaHJlYWRQcmlvcml0eSh0aGVUaHJlYWQubVByaW9yaXR5KTsKKyAgICAgICAgdGhlVGhyZWFkLm9uTG9vcGVyUHJlcGFyZWQoKTsKKyAgICAgICAgTG9vcGVyLmxvb3AoKTsKKyAgICAgICAgdGhlVGhyZWFkLm1UaWQgPSAtMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9hbmRyb2lkL3ZpZXcvTGF5b3V0SW5mbGF0ZXJfRGVsZWdhdGUuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlcl9EZWxlZ2F0ZS5qYXZhCmluZGV4IDBmM2NmNTcuLjNlZjMyODggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlcl9EZWxlZ2F0ZS5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2FuZHJvaWQvdmlldy9MYXlvdXRJbmZsYXRlcl9EZWxlZ2F0ZS5qYXZhCkBAIC0yMiw3ICsyMiwxMCBAQAogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIAoraW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLlhtbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKQEAgLTM1LDYgKzM4LDggQEAKICAqLwogcHVibGljIGNsYXNzIExheW91dEluZmxhdGVyX0RlbGVnYXRlIHsKIAorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzSXNJbkluY2x1ZGUgPSBmYWxzZTsKKwogICAgIC8qKgogICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdXNlZCB0byBkZXNjZW5kIGRvd24gdGhlIHhtbCBoaWVyYXJjaHkgYW5kIGluc3RhbnRpYXRlCiAgICAgICogdmlld3MsIGluc3RhbnRpYXRlIHRoZWlyIGNoaWxkcmVuLCBhbmQgdGhlbiBjYWxsIG9uRmluaXNoSW5mbGF0ZSgpLgpAQCAtOTQsNCArOTksMTI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICBATGF5b3V0bGliRGVsZWdhdGUKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2VJbmNsdWRlKAorICAgICAgICAgICAgTGF5b3V0SW5mbGF0ZXIgdGhpc0luZmxhdGVyLAorICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIsIFZpZXcgcGFyZW50LCBBdHRyaWJ1dGVTZXQgYXR0cnMpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGludCB0eXBlOworCisgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBWaWV3R3JvdXApIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBsYXlvdXQgPSBhdHRycy5nZXRBdHRyaWJ1dGVSZXNvdXJjZVZhbHVlKG51bGwsICJsYXlvdXQiLCAwKTsKKyAgICAgICAgICAgIGlmIChsYXlvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGF0dHJzLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5mbGF0ZUV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmaXkgYSBsYXlvdXQgaW4gdGhlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbmNsdWRlIHRhZzogPGluY2x1ZGUgbGF5b3V0PVwiQGxheW91dC9sYXlvdXRJRFwiIC8+Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZmxhdGVFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZml5IGEgdmFsaWQgbGF5b3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWZlcmVuY2UuIFRoZSBsYXlvdXQgSUQgIiArIHZhbHVlICsgIiBpcyBub3QgdmFsaWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBYbWxSZXNvdXJjZVBhcnNlciBjaGlsZFBhcnNlciA9CisgICAgICAgICAgICAgICAgICAgIHRoaXNJbmZsYXRlci5nZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0TGF5b3V0KGxheW91dCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVTZXQgY2hpbGRBdHRycyA9IFhtbC5hc0F0dHJpYnV0ZVNldChjaGlsZFBhcnNlcik7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gY2hpbGRQYXJzZXIubmV4dCgpKSAhPSBYbWxQdWxsUGFyc2VyLlNUQVJUX1RBRyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtcHR5LgorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gWG1sUHVsbFBhcnNlci5TVEFSVF9UQUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmZsYXRlRXhjZXB0aW9uKGNoaWxkUGFyc2VyLmdldFBvc2l0aW9uRGVzY3JpcHRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IE5vIHN0YXJ0IHRhZyBmb3VuZCEiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZFBhcnNlci5nZXROYW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKExheW91dEluZmxhdGVyLlRBR19NRVJHRS5lcXVhbHMoY2hpbGROYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5mbGF0ZSBhbGwgY2hpbGRyZW4uCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzSW5mbGF0ZXIuckluZmxhdGUoY2hpbGRQYXJzZXIsIHBhcmVudCwgY2hpbGRBdHRycywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmlldyB2aWV3ID0gdGhpc0luZmxhdGVyLmNyZWF0ZVZpZXdGcm9tVGFnKHBhcmVudCwgY2hpbGROYW1lLCBjaGlsZEF0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdHcm91cCBncm91cCA9IChWaWV3R3JvdXApIHBhcmVudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGxvYWQgdGhlIGxheW91dCBwYXJhbXMgc2V0IGluIHRoZSA8aW5jbHVkZSAvPiB0YWcuIElmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGV5IGRvbid0IGV4aXN0LCB3ZSB3aWxsIHJlbHkgb24gdGhlIGxheW91dCBwYXJhbXMgc2V0IGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jbHVkZWQgWE1MIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdXJpbmcgYSBsYXlvdXRwYXJhbXMgZ2VuZXJhdGlvbiwgYSBydW50aW1lIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGVpdGhlciBsYXlvdXRfd2lkdGggb3IgbGF5b3V0X2hlaWdodCBpcyBtaXNzaW5nLiBXZSBjYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBleGNlcHRpb24gYW5kIHNldCBsb2NhbFBhcmFtcyBhY2NvcmRpbmdseTogdHJ1ZSBtZWFucyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBsYXlvdXQgcGFyYW1zIGZyb20gdGhlIDxpbmNsdWRlIC8+IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIG1lYW5zIHdlIG5lZWQgdG8gcmVseSBvbiB0aGUgaW5jbHVkZWQgbGF5b3V0IHBhcmFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgcGFyYW1zID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLS0tLSBTVEFSVCBDSEFOR0VTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0lzSW5JbmNsdWRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0tIEVORCBDSEFOR0VTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBncm91cC5nZW5lcmF0ZUxheW91dFBhcmFtcyhhdHRycyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLS0gU1RBUlQgQ0hBTkdFUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNJc0luSW5jbHVkZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0tLS0gRU5EIENIQU5HRVMKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IGdyb3VwLmdlbmVyYXRlTGF5b3V0UGFyYW1zKGNoaWxkQXR0cnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0tIFNUQVJUIENIQU5HRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzSXNJbkluY2x1ZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtLS0tIEVORCBDSEFOR0VTCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZmxhdGUgYWxsIGNoaWxkcmVuLgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0luZmxhdGVyLnJJbmZsYXRlKGNoaWxkUGFyc2VyLCB2aWV3LCBjaGlsZEF0dHJzLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBvdmVycmlkZSB0aGUgaW5jbHVkZWQgbGF5b3V0J3MgYW5kcm9pZDppZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIHNldCBvbiB0aGUgPGluY2x1ZGUgLz4gdGFnIGl0c2VsZi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoaXNJbmZsYXRlci5tQ29udGV4dC5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXcsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gYS5nZXRSZXNvdXJjZUlkKGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdfaWQsIFZpZXcuTk9fSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpbGUgd2UncmUgYXQgaXQsIGxldCdzIHRyeSB0byBvdmVycmlkZSBhbmRyb2lkOnZpc2liaWxpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmlzaWJpbGl0eSA9IGEuZ2V0SW50KGNvbS5hbmRyb2lkLmludGVybmFsLlIuc3R5bGVhYmxlLlZpZXdfdmlzaWJpbGl0eSwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCAhPSBWaWV3Lk5PX0lEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRJZChpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodmlzaWJpbGl0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZFZpZXcodmlldyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZFBhcnNlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmZsYXRlRXhjZXB0aW9uKCI8aW5jbHVkZSAvPiBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBvZiBhIFZpZXdHcm91cCIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGN1cnJlbnREZXB0aCA9IHBhcnNlci5nZXREZXB0aCgpOworICAgICAgICB3aGlsZSAoKCh0eXBlID0gcGFyc2VyLm5leHQoKSkgIT0gWG1sUHVsbFBhcnNlci5FTkRfVEFHIHx8CisgICAgICAgICAgICAgICAgcGFyc2VyLmdldERlcHRoKCkgPiBjdXJyZW50RGVwdGgpICYmIHR5cGUgIT0gWG1sUHVsbFBhcnNlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgIC8vIEVtcHR5CisgICAgICAgIH0KKyAgICB9CisKKwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2UuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvQnJpZGdlLmphdmEKaW5kZXggMTQ0ZWM0Mi4uM2JhMzI1NyAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9CcmlkZ2UuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL0JyaWRnZS5qYXZhCkBAIC0xOTYsNyArMTk2LDcgQEAKICAgICAgICAgICAgICAgICBDYXBhYmlsaXR5LlVOQk9VTkRfUkVOREVSSU5HLAogICAgICAgICAgICAgICAgIENhcGFiaWxpdHkuQ1VTVE9NX0JBQ0tHUk9VTkRfQ09MT1IsCiAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eS5SRU5ERVIsCi0gICAgICAgICAgICAgICAgLy9DYXBhYmlsaXR5LkxBWU9VVF9PTkxZLCAvLyBkaXNhYmxlIHRvIHJ1biBvbiBBRFQgMTAuMCB3aGljaCBkb2Vzbid0IGluY2x1ZGUgdGhpcy4KKyAgICAgICAgICAgICAgICBDYXBhYmlsaXR5LkxBWU9VVF9PTkxZLAogICAgICAgICAgICAgICAgIENhcGFiaWxpdHkuRU1CRURERURfTEFZT1VULAogICAgICAgICAgICAgICAgIENhcGFiaWxpdHkuVklFV19NQU5JUFVMQVRJT04sCiAgICAgICAgICAgICAgICAgQ2FwYWJpbGl0eS5QTEFZX0FOSU1BVElPTiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VDb250ZXh0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlQ29udGV4dC5qYXZhCmluZGV4IGU1MzYwMjguLjQ3ZmE2OGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VDb250ZXh0LmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZUNvbnRleHQuamF2YQpAQCAtMjUsMTEgKzI1LDExIEBACiBpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZW5kZXJpbmcuYXBpLlN0eWxlUmVzb3VyY2VWYWx1ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLkJyaWRnZTsKIGltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLkJyaWRnZUNvbnN0YW50czsKK2ltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmltcGwuUGFyc2VyRmFjdG9yeTsKIGltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmltcGwuU3RhY2s7CiBpbXBvcnQgY29tLmFuZHJvaWQucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKIGltcG9ydCBjb20uYW5kcm9pZC51dGlsLlBhaXI7CiAKLWltcG9ydCBvcmcua3htbDIuaW8uS1htbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKQEAgLTcxLDcgKzcxLDYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTc5LDYgKzc4LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIAogLyoqCiAgKiBDdXN0b20gaW1wbGVtZW50YXRpb24gb2YgQ29udGV4dC9BY3Rpdml0eSB0byBoYW5kbGUgbm9uIGNvbXBpbGVkIHJlc291cmNlcy4KQEAgLTIwNSw2ICsyMDYsOSBAQAogICAgICAqIEBwYXJhbSBwYXJzZXIgdGhlIHBhcnNlciB0byBhZGQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHVzaFBhcnNlcihCcmlkZ2VYbWxCbG9ja1BhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgaWYgKFBhcnNlckZhY3RvcnkuTE9HX1BBUlNFUikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQVVNIICIgKyBwYXJzZXIuZ2V0UGFyc2VyKCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KICAgICAgICAgbVBhcnNlclN0YWNrLnB1c2gocGFyc2VyKTsKICAgICB9CiAKQEAgLTIxMiw3ICsyMTYsMTAgQEAKICAgICAgKiBSZW1vdmVzIHRoZSBwYXJzZXIgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwb3BQYXJzZXIoKSB7Ci0gICAgICAgIG1QYXJzZXJTdGFjay5wb3AoKTsKKyAgICAgICAgQnJpZGdlWG1sQmxvY2tQYXJzZXIgcGFyc2VyID0gbVBhcnNlclN0YWNrLnBvcCgpOworICAgICAgICBpZiAoUGFyc2VyRmFjdG9yeS5MT0dfUEFSU0VSKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBPUEQgIiArIHBhcnNlci5nZXRQYXJzZXIoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzAwLDEyICszMDcsMTcgQEAKIAogICAgIHB1YmxpYyBQYWlyPFZpZXcsIEJvb2xlYW4+IGluZmxhdGVWaWV3KFJlc291cmNlUmVmZXJlbmNlIHJlc291cmNlLCBWaWV3R3JvdXAgcGFyZW50LAogICAgICAgICAgICAgYm9vbGVhbiBhdHRhY2hUb1Jvb3QsIGJvb2xlYW4gc2tpcENhbGxiYWNrUGFyc2VyKSB7Ci0gICAgICAgIFN0cmluZyBsYXlvdXROYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOwogICAgICAgICBib29sZWFuIGlzUGxhdGZvcm1MYXlvdXQgPSByZXNvdXJjZS5pc0ZyYW1ld29yaygpOwogCiAgICAgICAgIGlmIChpc1BsYXRmb3JtTGF5b3V0ID09IGZhbHNlICYmIHNraXBDYWxsYmFja1BhcnNlciA9PSBmYWxzZSkgewogICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgY2FsbGJhY2sgY2FuIHByb3ZpZGUgdXMgd2l0aCBhIGN1c3RvbSBwYXJzZXIuCi0gICAgICAgICAgICBJTGF5b3V0UHVsbFBhcnNlciBwYXJzZXIgPSBtUHJvamVjdENhbGxiYWNrLmdldFBhcnNlcihsYXlvdXROYW1lKTsKKyAgICAgICAgICAgIElMYXlvdXRQdWxsUGFyc2VyIHBhcnNlcjsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFJlc291cmNlVmFsdWUpIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBtUHJvamVjdENhbGxiYWNrLmdldFBhcnNlcigoUmVzb3VyY2VWYWx1ZSkgcmVzb3VyY2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBtUHJvamVjdENhbGxiYWNrLmdldFBhcnNlcihyZXNvdXJjZS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGFyc2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBCcmlkZ2VYbWxCbG9ja1BhcnNlciBibG9ja1BhcnNlciA9IG5ldyBCcmlkZ2VYbWxCbG9ja1BhcnNlcihwYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCByZXNvdXJjZS5pc0ZyYW1ld29yaygpKTsKQEAgLTM0MCw5ICszNTIsNyBAQAogICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY3JlYXRlIGEgcHVsbCBwYXJzZXIgYXJvdW5kIHRoZSBsYXlvdXQgWE1MIGZpbGUsIGFuZCB0aGVuCiAgICAgICAgICAgICAgICAgLy8gZ2l2ZSB0aGF0IHRvIG91ciBYbWxCbG9ja1BhcnNlcgogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEtYbWxQYXJzZXIgcGFyc2VyID0gbmV3IEtYbWxQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoWG1sUHVsbFBhcnNlci5GRUFUVVJFX1BST0NFU1NfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZVJlYWRlcih4bWwpKTsKKyAgICAgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBQYXJzZXJGYWN0b3J5LmNyZWF0ZSh4bWwpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgcmVzb3VyY2UgcmVmIHRvIGhhdmUgY29ycmVjdCB2aWV3IGNvb2tpZXMKICAgICAgICAgICAgICAgICAgICAgbUJyaWRnZUluZmxhdGVyLnNldFJlc291cmNlUmVmZXJlbmNlKHJlc291cmNlKTsKQEAgLTM3Myw3ICszODMsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQnJpZGdlLmdldExvZygpLmVycm9yKExheW91dExvZy5UQUdfQlJPS0VOLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJMYXlvdXQgJXMlcyBkb2VzIG5vdCBleGlzdC4iLCBpc1BsYXRmb3JtTGF5b3V0ID8gImFuZHJvaWQ6IiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dE5hbWUpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXROYW1lKCkpLCBudWxsKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBQYWlyLm9mKG51bGwsIGZhbHNlKTsKQEAgLTUwOCwyMCArNTE4LDIwIEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2xlYW5bXSBmcmFtZXdvcmtBdHRyaWJ1dGVzID0gbmV3IGJvb2xlYW5bMV07Ci0gICAgICAgIFRyZWVNYXA8SW50ZWdlciwgU3RyaW5nPiBzdHlsZU5hbWVNYXAgPSBzZWFyY2hBdHRycyhhdHRycywgZnJhbWV3b3JrQXR0cmlidXRlcyk7CisgICAgICAgIEF0b21pY0Jvb2xlYW4gZnJhbWV3b3JrQXR0cmlidXRlcyA9IG5ldyBBdG9taWNCb29sZWFuKCk7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IGF0dHJOYW1lID0gbmV3IEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+KCk7CisgICAgICAgIFRyZWVNYXA8SW50ZWdlciwgU3RyaW5nPiBzdHlsZU5hbWVNYXAgPSBzZWFyY2hBdHRycyhhdHRycywgZnJhbWV3b3JrQXR0cmlidXRlcywgYXR0ck5hbWUpOwogCiAgICAgICAgIEJyaWRnZVR5cGVkQXJyYXkgdGEgPSAoKEJyaWRnZVJlc291cmNlcykgbVN5c3RlbVJlc291cmNlcykubmV3VHlwZUFycmF5KGF0dHJzLmxlbmd0aCwKLSAgICAgICAgICAgICAgICBpc1BsYXRmb3JtRmlsZSk7Ci0KLSAgICAgICAgLy8gcmVzb2x2ZSB0aGUgZGVmU3R5bGVBdHRyIHZhbHVlIGludG8gYSBJU3R5bGVSZXNvdXJjZVZhbHVlCi0gICAgICAgIFN0eWxlUmVzb3VyY2VWYWx1ZSBkZWZTdHlsZVZhbHVlcyA9IG51bGw7CisgICAgICAgICAgICAgICAgaXNQbGF0Zm9ybUZpbGUsIGZyYW1ld29ya0F0dHJpYnV0ZXMuZ2V0KCksIGF0dHJOYW1lLmdldCgpKTsKIAogICAgICAgICAvLyBsb29rIGZvciBhIGN1c3RvbSBzdHlsZS4KICAgICAgICAgU3RyaW5nIGN1c3RvbVN0eWxlID0gbnVsbDsKICAgICAgICAgaWYgKHNldCAhPSBudWxsKSB7CiAgICAgICAgICAgICBjdXN0b21TdHlsZSA9IHNldC5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsIC8qIG5hbWVzcGFjZSovLCAic3R5bGUiKTsKICAgICAgICAgfQorCisgICAgICAgIFN0eWxlUmVzb3VyY2VWYWx1ZSBjdXN0b21TdHlsZVZhbHVlcyA9IG51bGw7CiAgICAgICAgIGlmIChjdXN0b21TdHlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBSZXNvdXJjZVZhbHVlIGl0ZW0gPSBtUmVuZGVyUmVzb3VyY2VzLmZpbmRSZXNWYWx1ZShjdXN0b21TdHlsZSwKICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypmb3JjZUZyYW1ld29ya09ubHkqLyk7CkBAIC01MzAsODAgKzU0MCw4MSBAQAogICAgICAgICAgICAgaXRlbSA9IG1SZW5kZXJSZXNvdXJjZXMucmVzb2x2ZVJlc1ZhbHVlKGl0ZW0pOwogCiAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0eWxlUmVzb3VyY2VWYWx1ZSkgewotICAgICAgICAgICAgICAgIGRlZlN0eWxlVmFsdWVzID0gKFN0eWxlUmVzb3VyY2VWYWx1ZSlpdGVtOworICAgICAgICAgICAgICAgIGN1c3RvbVN0eWxlVmFsdWVzID0gKFN0eWxlUmVzb3VyY2VWYWx1ZSlpdGVtOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlZlN0eWxlVmFsdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChkZWZTdHlsZUF0dHIgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbmFtZSBmcm9tIHRoZSBpbnQuCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRlZlN0eWxlTmFtZSA9IHNlYXJjaEF0dHIoZGVmU3R5bGVBdHRyKTsKKyAgICAgICAgLy8gcmVzb2x2ZSB0aGUgZGVmU3R5bGVBdHRyIHZhbHVlIGludG8gYSBJU3R5bGVSZXNvdXJjZVZhbHVlCisgICAgICAgIFN0eWxlUmVzb3VyY2VWYWx1ZSBkZWZTdHlsZVZhbHVlcyA9IG51bGw7CiAKLSAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFByb3BNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcE1hcC5wdXQoInN0eWxlIiwgZGVmU3R5bGVOYW1lKTsKKyAgICAgICAgaWYgKGRlZlN0eWxlQXR0ciAhPSAwKSB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIG5hbWUgZnJvbSB0aGUgaW50LgorICAgICAgICAgICAgU3RyaW5nIGRlZlN0eWxlTmFtZSA9IHNlYXJjaEF0dHIoZGVmU3R5bGVBdHRyKTsKKworICAgICAgICAgICAgaWYgKGRlZmF1bHRQcm9wTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcE1hcC5wdXQoInN0eWxlIiwgZGVmU3R5bGVOYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHN0eWxlIGluIHRoZSBjdXJyZW50IHRoZW1lLCBhbmQgaXRzIHBhcmVudDoKKyAgICAgICAgICAgIFJlc291cmNlVmFsdWUgaXRlbSA9IG1SZW5kZXJSZXNvdXJjZXMuZmluZEl0ZW1JblRoZW1lKGRlZlN0eWxlTmFtZSk7CisKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpdGVtIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3R5bGUgZW50cnkuIFNlYXJjaCBmb3IgaXQuCisgICAgICAgICAgICAgICAgaXRlbSA9IG1SZW5kZXJSZXNvdXJjZXMuZmluZFJlc1ZhbHVlKGl0ZW0uZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qZm9yY2VGcmFtZXdvcmtPbmx5Ki8pOworCisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdHlsZVJlc291cmNlVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVmU3R5bGVWYWx1ZXMgPSAoU3R5bGVSZXNvdXJjZVZhbHVlKWl0ZW07CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkuZXJyb3IobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmluZCBzdHlsZSAnJXMnIGluIGN1cnJlbnQgdGhlbWUiLCBkZWZTdHlsZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKmRhdGEqLyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGVmU3R5bGVSZXMgIT0gMCkgeworICAgICAgICAgICAgUGFpcjxSZXNvdXJjZVR5cGUsIFN0cmluZz4gdmFsdWUgPSBCcmlkZ2UucmVzb2x2ZVJlc291cmNlSWQoZGVmU3R5bGVSZXMpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG1Qcm9qZWN0Q2FsbGJhY2sucmVzb2x2ZVJlc291cmNlSWQoZGVmU3R5bGVSZXMpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHN0eWxlIGluIHRoZSBjdXJyZW50IHRoZW1lLCBhbmQgaXRzIHBhcmVudDoKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVZhbHVlIGl0ZW0gPSBtUmVuZGVyUmVzb3VyY2VzLmZpbmRJdGVtSW5UaGVtZShkZWZTdHlsZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpdGVtIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3R5bGUgZW50cnkuIFNlYXJjaCBmb3IgaXQuCi0gICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBtUmVuZGVyUmVzb3VyY2VzLmZpbmRSZXNWYWx1ZShpdGVtLmdldFZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypmb3JjZUZyYW1ld29ya09ubHkqLyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdHlsZVJlc291cmNlVmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlVmFsdWVzID0gKFN0eWxlUmVzb3VyY2VWYWx1ZSlpdGVtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQnJpZGdlLmdldExvZygpLmVycm9yKG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmluZCBzdHlsZSAnJXMnIGluIGN1cnJlbnQgdGhlbWUiLCBkZWZTdHlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLypkYXRhKi8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVmU3R5bGVSZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIFBhaXI8UmVzb3VyY2VUeXBlLCBTdHJpbmc+IHZhbHVlID0gQnJpZGdlLnJlc29sdmVSZXNvdXJjZUlkKGRlZlN0eWxlUmVzKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1Qcm9qZWN0Q2FsbGJhY2sucmVzb2x2ZVJlc291cmNlSWQoZGVmU3R5bGVSZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5nZXRGaXJzdCgpID09IFJlc291cmNlVHlwZS5TVFlMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHN0eWxlIGluIHRoZSBjdXJyZW50IHRoZW1lLCBhbmQgaXRzIHBhcmVudDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVmFsdWUgaXRlbSA9IG1SZW5kZXJSZXNvdXJjZXMuZmluZEl0ZW1JblRoZW1lKHZhbHVlLmdldFNlY29uZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0eWxlUmVzb3VyY2VWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFByb3BNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFByb3BNYXAucHV0KCJzdHlsZSIsIGl0ZW0uZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlVmFsdWVzID0gKFN0eWxlUmVzb3VyY2VWYWx1ZSlpdGVtOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZ2V0Rmlyc3QoKSA9PSBSZXNvdXJjZVR5cGUuU1RZTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHN0eWxlIGluIHRoZSBjdXJyZW50IHRoZW1lLCBhbmQgaXRzIHBhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VWYWx1ZSBpdGVtID0gbVJlbmRlclJlc291cmNlcy5maW5kSXRlbUluVGhlbWUodmFsdWUuZ2V0U2Vjb25kKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0eWxlUmVzb3VyY2VWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0UHJvcE1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wTWFwLnB1dCgic3R5bGUiLCBpdGVtLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkuZXJyb3IobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHlsZSB3aXRoIGlkIDB4JXggKHJlc29sdmVkIHRvICclcycpIGRvZXMgbm90IGV4aXN0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlUmVzLCB2YWx1ZS5nZXRTZWNvbmQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qZGF0YSovKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlVmFsdWVzID0gKFN0eWxlUmVzb3VyY2VWYWx1ZSlpdGVtOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQnJpZGdlLmdldExvZygpLmVycm9yKG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc291Y2UgaWQgMHgleCBpcyBub3Qgb2YgdHlwZSBTVFlMRSAoaW5zdGVhZCAlcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlUmVzLCB2YWx1ZS5nZXRGaXJzdCgpLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHlsZSB3aXRoIGlkIDB4JXggKHJlc29sdmVkIHRvICclcycpIGRvZXMgbm90IGV4aXN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmU3R5bGVSZXMsIHZhbHVlLmdldFNlY29uZCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKmRhdGEqLyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkuZXJyb3IobnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBmaW5kIHN0eWxlIHdpdGggaWQgMHgleCBpbiBjdXJyZW50IHRoZW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlUmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNvdWNlIGlkIDB4JXggaXMgbm90IG9mIHR5cGUgU1RZTEUgKGluc3RlYWQgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZlN0eWxlUmVzLCB2YWx1ZS5nZXRGaXJzdCgpLnRvU3RyaW5nKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLypkYXRhKi8pOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQnJpZGdlLmdldExvZygpLmVycm9yKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGZpbmQgc3R5bGUgd2l0aCBpZCAweCV4IGluIGN1cnJlbnQgdGhlbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZTdHlsZVJlcyksCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8qZGF0YSovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBCcmlkZ2VDb25zdGFudHMuTlNfUkVTT1VSQ0VTOwotICAgICAgICBpZiAoZnJhbWV3b3JrQXR0cmlidXRlc1swXSA9PSBmYWxzZSkgeworICAgICAgICBpZiAoZnJhbWV3b3JrQXR0cmlidXRlcy5nZXQoKSA9PSBmYWxzZSkgewogICAgICAgICAgICAgLy8gbmVlZCB0byB1c2UgdGhlIGFwcGxpY2F0aW9uIG5hbWVzcGFjZQogICAgICAgICAgICAgbmFtZXNwYWNlID0gbVByb2plY3RDYWxsYmFjay5nZXROYW1lc3BhY2UoKTsKICAgICAgICAgfQpAQCAtNjIzLDggKzYzNCwxMyBAQAogICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVmFsdWUgcmVzVmFsdWUgPSBudWxsOwogCi0gICAgICAgICAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB2YWx1ZSBpbiB0aGUgZGVmU3R5bGUgZmlyc3QgKGFuZCBpdHMgcGFyZW50IGlmIG5lZWRlZCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlZlN0eWxlVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHZhbHVlIGluIHRoZSBjdXN0b20gc3R5bGUgZmlyc3QgKGFuZCBpdHMgcGFyZW50IGlmIG5lZWRlZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbVN0eWxlVmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc1ZhbHVlID0gbVJlbmRlclJlc291cmNlcy5maW5kSXRlbUluU3R5bGUoY3VzdG9tU3R5bGVWYWx1ZXMsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBsb29rIGZvciB0aGUgdmFsdWUgaW4gdGhlIGRlZmF1bHQgU3R5bGUgKGFuZCBpdHMgcGFyZW50IGlmIG5lZWRlZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc1ZhbHVlID09IG51bGwgJiYgZGVmU3R5bGVWYWx1ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzVmFsdWUgPSBtUmVuZGVyUmVzb3VyY2VzLmZpbmRJdGVtSW5TdHlsZShkZWZTdHlsZVZhbHVlcywgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtNjc1LDIzICs2OTEsMjUgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEJyaWRnZVR5cGVkQXJyYXkgY3JlYXRlU3R5bGVCYXNlZFR5cGVkQXJyYXkoU3R5bGVSZXNvdXJjZVZhbHVlIHN0eWxlLCBpbnRbXSBhdHRycykKICAgICAgICAgICAgIHRocm93cyBSZXNvdXJjZXMuTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBUcmVlTWFwPEludGVnZXIsIFN0cmluZz4gc3R5bGVOYW1lTWFwID0gc2VhcmNoQXR0cnMoYXR0cnMsIG51bGwpOwogCiAgICAgICAgIEJyaWRnZVR5cGVkQXJyYXkgdGEgPSAoKEJyaWRnZVJlc291cmNlcykgbVN5c3RlbVJlc291cmNlcykubmV3VHlwZUFycmF5KGF0dHJzLmxlbmd0aCwKLSAgICAgICAgICAgICAgICBmYWxzZSAvKiBwbGF0Zm9ybVJlc291cmNlRmxhZyAqLyk7CisgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIG51bGwpOwogCi0gICAgICAgIC8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgc3R5bGUgbWFwLCBhbmQgaW5pdCB0aGUgVHlwZWRBcnJheSB3aXRoCi0gICAgICAgIC8vIHRoZSBzdHlsZSB3ZSBnb3QgZnJvbSB0aGUgZHluYW1pYyBpZAotICAgICAgICBmb3IgKEVudHJ5PEludGVnZXIsIFN0cmluZz4gc3R5bGVBdHRyaWJ1dGUgOiBzdHlsZU5hbWVNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gc3R5bGVBdHRyaWJ1dGUuZ2V0S2V5KCkuaW50VmFsdWUoKTsKKyAgICAgICAgLy8gZm9yIGVhY2ggYXR0cmlidXRlLCBnZXQgaXRzIG5hbWUgc28gdGhhdCB3ZSBjYW4gc2VhcmNoIGl0IGluIHRoZSBzdHlsZQorICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBhdHRycy5sZW5ndGggOyBpKyspIHsKKyAgICAgICAgICAgIFBhaXI8UmVzb3VyY2VUeXBlLCBTdHJpbmc+IHJlc29sdmVkUmVzb3VyY2UgPSBCcmlkZ2UucmVzb2x2ZVJlc291cmNlSWQoYXR0cnNbaV0pOworICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0U2Vjb25kKCk7CisgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHZhbHVlIGluIHRoZSBnaXZlbiBzdHlsZQorICAgICAgICAgICAgICAgIFJlc291cmNlVmFsdWUgcmVzVmFsdWUgPSBtUmVuZGVyUmVzb3VyY2VzLmZpbmRJdGVtSW5TdHlsZShzdHlsZSwgYXR0ck5hbWUpOwogCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHN0eWxlQXR0cmlidXRlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHJlc1ZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x2ZSBpdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgbGVmdC4KKyAgICAgICAgICAgICAgICAgICAgdGEuYnJpZGdlU2V0VmFsdWUoaSwgYXR0ck5hbWUsIG1SZW5kZXJSZXNvdXJjZXMucmVzb2x2ZVJlc1ZhbHVlKHJlc1ZhbHVlKSk7CiAKLSAgICAgICAgICAgIC8vIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUsIG9yIGl0cyBwYXJlbnQgc3R5bGVzLgotICAgICAgICAgICAgUmVzb3VyY2VWYWx1ZSByZXNWYWx1ZSA9IG1SZW5kZXJSZXNvdXJjZXMuZmluZEl0ZW1JblN0eWxlKHN0eWxlLCBuYW1lKTsKLQotICAgICAgICAgICAgLy8gcmVzb2x2ZSBpdCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgbGVmdC4KLSAgICAgICAgICAgIHRhLmJyaWRnZVNldFZhbHVlKGluZGV4LCBuYW1lLCBtUmVuZGVyUmVzb3VyY2VzLnJlc29sdmVSZXNWYWx1ZShyZXNWYWx1ZSkpOworICAgICAgICAgICAgICAgICAgICByZXNWYWx1ZSA9IG1SZW5kZXJSZXNvdXJjZXMucmVzb2x2ZVJlc1ZhbHVlKHJlc1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0YS5zZWFsQXJyYXkoKTsKQEAgLTcxMCwxMCArNzI4LDEzIEBACiAgICAgICogdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgYXR0cmlidXRlIGxhdGVyIGluIHRoZSBUeXBlZEFycmF5LgogICAgICAqCiAgICAgICogQHBhcmFtIGF0dHJzIEFuIGF0dHJpYnV0ZSBhcnJheSByZWZlcmVuY2UgZ2l2ZW4gdG8gb2J0YWluU3R5bGVkQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gb3V0RnJhbWV3b3JrRmxhZyBvdXQgdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgYXR0ciBhcnJheSBpcyBhIGZyYW1ld29yayB2YWx1ZQorICAgICAqIEBwYXJhbSBvdXRBdHRyTmFtZSBvdXQgdmFsdWUgZm9yIHRoZSByZXNvbHZlZCBhdHRyIG5hbWUuCiAgICAgICogQHJldHVybiBBIHNvcnRlZCBtYXAgQXR0cmlidXRlLVZhbHVlIHRvIEF0dHJpYnV0ZS1OYW1lIGZvciBhbGwgYXR0cmlidXRlcyBkZWNsYXJlZCBieSB0aGUKICAgICAgKiAgICAgICAgIGF0dHJpYnV0ZSBhcnJheS4gUmV0dXJucyBudWxsIGlmIG5vdGhpbmcgaXMgZm91bmQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBUcmVlTWFwPEludGVnZXIsU3RyaW5nPiBzZWFyY2hBdHRycyhpbnRbXSBhdHRycywgYm9vbGVhbltdIG91dEZyYW1ld29ya0ZsYWcpIHsKKyAgICBwcml2YXRlIFRyZWVNYXA8SW50ZWdlcixTdHJpbmc+IHNlYXJjaEF0dHJzKGludFtdIGF0dHJzLCBBdG9taWNCb29sZWFuIG91dEZyYW1ld29ya0ZsYWcsCisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPiBvdXRBdHRyTmFtZSkgewogICAgICAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIGFycmF5IGZyb20gdGhlIGZyYW1ld29yayByZXNvdXJjZXMKICAgICAgICAgU3RyaW5nIGFycmF5TmFtZSA9IEJyaWRnZS5yZXNvbHZlUmVzb3VyY2VJZChhdHRycyk7CiAgICAgICAgIGlmIChhcnJheU5hbWUgIT0gbnVsbCkgewpAQCAtNzMwLDcgKzc1MSwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAob3V0RnJhbWV3b3JrRmxhZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0RnJhbWV3b3JrRmxhZ1swXSA9IHRydWU7CisgICAgICAgICAgICAgICAgb3V0RnJhbWV3b3JrRmxhZy5zZXQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0QXR0ck5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dEF0dHJOYW1lLnNldChhcnJheU5hbWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKQEAgLTc1Miw3ICs3NzYsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG91dEZyYW1ld29ya0ZsYWcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dEZyYW1ld29ya0ZsYWdbMF0gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBvdXRGcmFtZXdvcmtGbGFnLnNldChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0QXR0ck5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dEF0dHJOYW1lLnNldChhcnJheU5hbWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlczsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VJbmZsYXRlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZUluZmxhdGVyLmphdmEKaW5kZXggZDZiYmViZC4uNGE2MzkzZCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZUluZmxhdGVyLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZUluZmxhdGVyLmphdmEKQEAgLTIyLDEwICsyMiwxMCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVuZGVyaW5nLmFwaS5SZXNvdXJjZVJlZmVyZW5jZTsKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlbmRlcmluZy5hcGkuUmVzb3VyY2VWYWx1ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLkJyaWRnZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmltcGwuUGFyc2VyRmFjdG9yeTsKIGltcG9ydCBjb20uYW5kcm9pZC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwogaW1wb3J0IGNvbS5hbmRyb2lkLnV0aWwuUGFpcjsKIAotaW1wb3J0IG9yZy5reG1sMi5pby5LWG1sUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKQEAgLTM2LDcgKzM2LDYgQEAKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIAogLyoqCiAgKiBDdXN0b20gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExheW91dEluZmxhdGVyfSB0byBoYW5kbGUgY3VzdG9tIHZpZXdzLgpAQCAtMTc1LDkgKzE3NCw3IEBACiAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodmFsdWUuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEtYbWxQYXJzZXIgcGFyc2VyID0gbmV3IEtYbWxQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KG5ldyBGaWxlUmVhZGVyKGYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gUGFyc2VyRmFjdG9yeS5jcmVhdGUoZik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIEJyaWRnZVhtbEJsb2NrUGFyc2VyIGJyaWRnZVBhcnNlciA9IG5ldyBCcmlkZ2VYbWxCbG9ja1BhcnNlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLCBicmlkZ2VDb250ZXh0LCBmYWxzZSk7CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlUmVzb3VyY2VzLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlUmVzb3VyY2VzLmphdmEKaW5kZXggMjczZTQ5My4uMTc1NjQ5NmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VSZXNvdXJjZXMuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlUmVzb3VyY2VzLmphdmEKQEAgLTIxLDEyICsyMSwxMiBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVuZGVyaW5nLmFwaS5SZXNvdXJjZVZhbHVlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuQnJpZGdlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuQnJpZGdlQ29uc3RhbnRzOworaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuaW1wbC5QYXJzZXJGYWN0b3J5OwogaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuaW1wbC5SZXNvdXJjZUhlbHBlcjsKIGltcG9ydCBjb20uYW5kcm9pZC5uaW5lcGF0Y2guTmluZVBhdGNoOwogaW1wb3J0IGNvbS5hbmRyb2lkLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7CiBpbXBvcnQgY29tLmFuZHJvaWQudXRpbC5QYWlyOwogCi1pbXBvcnQgb3JnLmt4bWwyLmlvLktYbWxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCkBAIC00Niw3ICs0Niw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiAvKioKQEAgLTEyNiwxOCArMTI1LDIyIEBACiAgICAgICAgIG1Qcm9qZWN0Q2FsbGJhY2sgPSBwcm9qZWN0Q2FsbGJhY2s7CiAgICAgfQogCi0gICAgcHVibGljIEJyaWRnZVR5cGVkQXJyYXkgbmV3VHlwZUFycmF5KGludCBudW1FbnRyaWVzLCBib29sZWFuIHBsYXRmb3JtRmlsZSkgewotICAgICAgICByZXR1cm4gbmV3IEJyaWRnZVR5cGVkQXJyYXkodGhpcywgbUNvbnRleHQsIG51bUVudHJpZXMsIHBsYXRmb3JtRmlsZSk7CisgICAgcHVibGljIEJyaWRnZVR5cGVkQXJyYXkgbmV3VHlwZUFycmF5KGludCBudW1FbnRyaWVzLCBib29sZWFuIHBsYXRmb3JtRmlsZSwKKyAgICAgICAgICAgIGJvb2xlYW4gcGxhdGZvcm1TdHlsZWFibGUsIFN0cmluZyBzdHlsZWFibGVOYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgQnJpZGdlVHlwZWRBcnJheSh0aGlzLCBtQ29udGV4dCwgbnVtRW50cmllcywgcGxhdGZvcm1GaWxlLAorICAgICAgICAgICAgICAgIHBsYXRmb3JtU3R5bGVhYmxlLCBzdHlsZWFibGVOYW1lKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFJlc291cmNlVmFsdWUgZ2V0UmVzb3VyY2VWYWx1ZShpbnQgaWQsIGJvb2xlYW5bXSBwbGF0Zm9ybVJlc0ZsYWdfb3V0KSB7CisgICAgcHJpdmF0ZSBQYWlyPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gZ2V0UmVzb3VyY2VWYWx1ZShpbnQgaWQsIGJvb2xlYW5bXSBwbGF0Zm9ybVJlc0ZsYWdfb3V0KSB7CiAgICAgICAgIC8vIGZpcnN0IGdldCB0aGUgU3RyaW5nIHJlbGF0ZWQgdG8gdGhpcyBpZCBpbiB0aGUgZnJhbWV3b3JrCiAgICAgICAgIFBhaXI8UmVzb3VyY2VUeXBlLCBTdHJpbmc+IHJlc291cmNlSW5mbyA9IEJyaWRnZS5yZXNvbHZlUmVzb3VyY2VJZChpZCk7CiAKICAgICAgICAgaWYgKHJlc291cmNlSW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgICBwbGF0Zm9ybVJlc0ZsYWdfb3V0WzBdID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRSZW5kZXJSZXNvdXJjZXMoKS5nZXRGcmFtZXdvcmtSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJbmZvLmdldEZpcnN0KCksIHJlc291cmNlSW5mby5nZXRTZWNvbmQoKSk7CisgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IHJlc291cmNlSW5mby5nZXRTZWNvbmQoKTsKKworICAgICAgICAgICAgcmV0dXJuIFBhaXIub2YoYXR0cmlidXRlTmFtZSwgbUNvbnRleHQuZ2V0UmVuZGVyUmVzb3VyY2VzKCkuZ2V0RnJhbWV3b3JrUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSW5mby5nZXRGaXJzdCgpLCBhdHRyaWJ1dGVOYW1lKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBkaWRuJ3QgZmluZCBhIG1hdGNoIGluIHRoZSBmcmFtZXdvcms/IGxvb2sgaW4gdGhlIHByb2plY3QuCkBAIC0xNDYsOCArMTQ5LDEwIEBACiAKICAgICAgICAgICAgIGlmIChyZXNvdXJjZUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHBsYXRmb3JtUmVzRmxhZ19vdXRbMF0gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbnRleHQuZ2V0UmVuZGVyUmVzb3VyY2VzKCkuZ2V0UHJvamVjdFJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJbmZvLmdldEZpcnN0KCksIHJlc291cmNlSW5mby5nZXRTZWNvbmQoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSByZXNvdXJjZUluZm8uZ2V0U2Vjb25kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFpci5vZihhdHRyaWJ1dGVOYW1lLCBtQ29udGV4dC5nZXRSZW5kZXJSZXNvdXJjZXMoKS5nZXRQcm9qZWN0UmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUluZm8uZ2V0Rmlyc3QoKSwgYXR0cmlidXRlTmFtZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE1NiwxMCArMTYxLDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRHJhd2FibGUgZ2V0RHJhd2FibGUoaW50IGlkKSB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBSZXNvdXJjZVZhbHVlIHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKKyAgICAgICAgUGFpcjxTdHJpbmcsIFJlc291cmNlVmFsdWU+IHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKIAogICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlSGVscGVyLmdldERyYXdhYmxlKHZhbHVlLCBtQ29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0RHJhd2FibGUodmFsdWUuZ2V0U2Vjb25kKCksIG1Db250ZXh0KTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGlkIHdhcyBub3QgZm91bmQgb3Igbm90IHJlc29sdmVkLiBUaHJvdyBhIE5vdEZvdW5kRXhjZXB0aW9uLgpAQCAtMTcxLDExICsxNzYsMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0Q29sb3IoaW50IGlkKSB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBSZXNvdXJjZVZhbHVlIHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKKyAgICAgICAgUGFpcjxTdHJpbmcsIFJlc291cmNlVmFsdWU+IHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKIAogICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0Q29sb3IodmFsdWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlSGVscGVyLmdldENvbG9yKHZhbHVlLmdldFNlY29uZCgpLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkuZXJyb3IoTGF5b3V0TG9nLlRBR19SRVNPVVJDRVNfRk9STUFULCBlLmdldE1lc3NhZ2UoKSwgZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLypkYXRhKi8pOwpAQCAtMTkyLDEwICsxOTcsMTEgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDb2xvclN0YXRlTGlzdCBnZXRDb2xvclN0YXRlTGlzdChpbnQgaWQpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlVmFsdWUgcmVzVmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOworICAgICAgICBQYWlyPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gcmVzVmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOwogCiAgICAgICAgIGlmIChyZXNWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDb2xvclN0YXRlTGlzdCBzdGF0ZUxpc3QgPSBSZXNvdXJjZUhlbHBlci5nZXRDb2xvclN0YXRlTGlzdChyZXNWYWx1ZSwgbUNvbnRleHQpOworICAgICAgICAgICAgQ29sb3JTdGF0ZUxpc3Qgc3RhdGVMaXN0ID0gUmVzb3VyY2VIZWxwZXIuZ2V0Q29sb3JTdGF0ZUxpc3QocmVzVmFsdWUuZ2V0U2Vjb25kKCksCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0KTsKICAgICAgICAgICAgIGlmIChzdGF0ZUxpc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZUxpc3Q7CiAgICAgICAgICAgICB9CkBAIC0yMTAsMTAgKzIxNiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0KGludCBpZCkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VWYWx1ZSB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CisgICAgICAgIFBhaXI8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CiAKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldFNlY29uZCgpLmdldFZhbHVlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZCB3YXMgbm90IGZvdW5kIG9yIG5vdCByZXNvbHZlZC4gVGhyb3cgYSBOb3RGb3VuZEV4Y2VwdGlvbi4KQEAgLTIyNSwxNSArMjMxLDE2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgWG1sUmVzb3VyY2VQYXJzZXIgZ2V0TGF5b3V0KGludCBpZCkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VWYWx1ZSB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CisgICAgICAgIFBhaXI8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiB2ID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKIAotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICBSZXNvdXJjZVZhbHVlIHZhbHVlID0gdi5nZXRTZWNvbmQoKTsKICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gbnVsbDsKIAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgY3VycmVudCBwYXJzZXIgY2FuIHByb3ZpZGUgdXMgd2l0aCBhIGN1c3RvbSBwYXJzZXIuCiAgICAgICAgICAgICAgICAgaWYgKG1QbGF0Zm9ybVJlc291cmNlRmxhZ1swXSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBtUHJvamVjdENhbGxiYWNrLmdldFBhcnNlcih2YWx1ZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBwYXJzZXIgPSBtUHJvamVjdENhbGxiYWNrLmdldFBhcnNlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IG9uZSBtYW51YWxseSBpZiBuZWVkZWQuCkBAIC0yNDIsOSArMjQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHhtbC5pc0ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjcmVhdGUgYSBwdWxsIHBhcnNlciBhcm91bmQgdGhlIGxheW91dCBYTUwgZmlsZSwgYW5kIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgdGhhdCB0byBvdXIgWG1sQmxvY2tQYXJzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBLWG1sUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZShYbWxQdWxsUGFyc2VyLkZFQVRVUkVfUFJPQ0VTU19OQU1FU1BBQ0VTLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZVJlYWRlcih4bWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IFBhcnNlckZhY3RvcnkuY3JlYXRlKHhtbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTI3MCw5ICsyNzUsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBYbWxSZXNvdXJjZVBhcnNlciBnZXRBbmltYXRpb24oaW50IGlkKSB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBSZXNvdXJjZVZhbHVlIHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKKyAgICAgICAgUGFpcjxTdHJpbmcsIFJlc291cmNlVmFsdWU+IHYgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOwogCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFJlc291cmNlVmFsdWUgdmFsdWUgPSB2LmdldFNlY29uZCgpOwogICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBudWxsOwogCiAgICAgICAgICAgICB0cnkgewpAQCAtMjgwLDkgKzI4Niw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHhtbC5pc0ZpbGUoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIHB1bGwgcGFyc2VyIGFyb3VuZCB0aGUgbGF5b3V0IFhNTCBmaWxlLCBhbmQgdGhlbgogICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIHRoYXQgdG8gb3VyIFhtbEJsb2NrUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBLWG1sUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQobmV3IEZpbGVSZWFkZXIoeG1sKSk7CisgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IFBhcnNlckZhY3RvcnkuY3JlYXRlKHhtbCk7CiAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCcmlkZ2VYbWxCbG9ja1BhcnNlcihwYXJzZXIsIG1Db250ZXh0LCBtUGxhdGZvcm1SZXNvdXJjZUZsYWdbMF0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTMxNiwxMCArMzIwLDEwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmxvYXQgZ2V0RGltZW5zaW9uKGludCBpZCkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VWYWx1ZSB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CisgICAgICAgIFBhaXI8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CiAKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUuZ2V0U2Vjb25kKCkuZ2V0VmFsdWUoKTsKIAogICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmICh2LmVxdWFscyhCcmlkZ2VDb25zdGFudHMuTUFUQ0hfUEFSRU5UKSB8fApAQCAtMzI5LDcgKzMzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChSZXNvdXJjZUhlbHBlci5zdHJpbmdUb0Zsb2F0KHYsIG1UbXBWYWx1ZSkgJiYKKyAgICAgICAgICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIucGFyc2VGbG9hdEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmdldEZpcnN0KCksIHYsIG1UbXBWYWx1ZSwgdHJ1ZSAvKnJlcXVpcmVVbml0Ki8pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBtVG1wVmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRElNRU5TSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVG1wVmFsdWUuZ2V0RGltZW5zaW9uKG1NZXRyaWNzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zNDUsMTMgKzM1MCwxNCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXREaW1lbnNpb25QaXhlbE9mZnNldChpbnQgaWQpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlVmFsdWUgdmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOworICAgICAgICBQYWlyPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gdmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOwogCiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdiA9IHZhbHVlLmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgdiA9IHZhbHVlLmdldFNlY29uZCgpLmdldFZhbHVlKCk7CiAKICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIuc3RyaW5nVG9GbG9hdCh2LCBtVG1wVmFsdWUpICYmCisgICAgICAgICAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnBhcnNlRmxvYXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRGaXJzdCgpLCB2LCBtVG1wVmFsdWUsIHRydWUgLypyZXF1aXJlVW5pdCovKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgbVRtcFZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0RJTUVOU0lPTikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbE9mZnNldChtVG1wVmFsdWUuZGF0YSwgbU1ldHJpY3MpOwogICAgICAgICAgICAgICAgIH0KQEAgLTM2NywxMyArMzczLDE0IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldERpbWVuc2lvblBpeGVsU2l6ZShpbnQgaWQpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlVmFsdWUgdmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOworICAgICAgICBQYWlyPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gdmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOwogCiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdiA9IHZhbHVlLmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgdiA9IHZhbHVlLmdldFNlY29uZCgpLmdldFZhbHVlKCk7CiAKICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIuc3RyaW5nVG9GbG9hdCh2LCBtVG1wVmFsdWUpICYmCisgICAgICAgICAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnBhcnNlRmxvYXRBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRGaXJzdCgpLCB2LCBtVG1wVmFsdWUsIHRydWUgLypyZXF1aXJlVW5pdCovKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgbVRtcFZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0RJTUVOU0lPTikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHlwZWRWYWx1ZS5jb21wbGV4VG9EaW1lbnNpb25QaXhlbFNpemUobVRtcFZhbHVlLmRhdGEsIG1NZXRyaWNzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zODksMTAgKzM5NiwxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbnRlZ2VyKGludCBpZCkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VWYWx1ZSB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CisgICAgICAgIFBhaXI8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CiAKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdiA9IHZhbHVlLmdldFZhbHVlKCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmdldFNlY29uZCgpLmdldFZhbHVlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZS5nZXRTZWNvbmQoKS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgaW50IHJhZGl4ID0gMTA7CiAgICAgICAgICAgICBpZiAodi5zdGFydHNXaXRoKCIweCIpKSB7CiAgICAgICAgICAgICAgICAgdiA9IHYuc3Vic3RyaW5nKDIpOwpAQCAtNDQ0LDEwICs0NTEsMTAgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBpZCkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VWYWx1ZSB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CisgICAgICAgIFBhaXI8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CiAKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZ2V0U2Vjb25kKCkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUuZ2V0U2Vjb25kKCkuZ2V0VmFsdWUoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGlkIHdhcyBub3QgZm91bmQgb3Igbm90IHJlc29sdmVkLiBUaHJvdyBhIE5vdEZvdW5kRXhjZXB0aW9uLgpAQCAtNDYwLDEzICs0NjcsMTQgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBnZXRWYWx1ZShpbnQgaWQsIFR5cGVkVmFsdWUgb3V0VmFsdWUsIGJvb2xlYW4gcmVzb2x2ZVJlZnMpCiAgICAgICAgICAgICB0aHJvd3MgTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBSZXNvdXJjZVZhbHVlIHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKKyAgICAgICAgUGFpcjxTdHJpbmcsIFJlc291cmNlVmFsdWU+IHZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZShpZCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnKTsKIAogICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZS5nZXRTZWNvbmQoKS5nZXRWYWx1ZSgpOwogCiAgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnN0cmluZ1RvRmxvYXQodiwgb3V0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnBhcnNlRmxvYXRBdHRyaWJ1dGUodmFsdWUuZ2V0Rmlyc3QoKSwgdiwgb3V0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnJlcXVpcmVVbml0Ki8pKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ4OSwxOSArNDk3LDE3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgWG1sUmVzb3VyY2VQYXJzZXIgZ2V0WG1sKGludCBpZCkgdGhyb3dzIE5vdEZvdW5kRXhjZXB0aW9uIHsKLSAgICAgICAgUmVzb3VyY2VWYWx1ZSB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CisgICAgICAgIFBhaXI8U3RyaW5nLCBSZXNvdXJjZVZhbHVlPiB2YWx1ZSA9IGdldFJlc291cmNlVmFsdWUoaWQsIG1QbGF0Zm9ybVJlc291cmNlRmxhZyk7CiAKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUuZ2V0U2Vjb25kKCkuZ2V0VmFsdWUoKTsKIAogICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoaXMgaXMgYSBmaWxlCi0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodmFsdWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUodik7CiAgICAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEtYbWxQYXJzZXIgcGFyc2VyID0gbmV3IEtYbWxQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KG5ldyBGaWxlUmVhZGVyKGYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gUGFyc2VyRmFjdG9yeS5jcmVhdGUoZik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnJpZGdlWG1sQmxvY2tQYXJzZXIocGFyc2VyLCBtQ29udGV4dCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnWzBdKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01MzQsOSArNTQwLDcgQEAKIAogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEtYbWxQYXJzZXIgcGFyc2VyID0gbmV3IEtYbWxQYXJzZXIoKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgcGFyc2VyLnNldElucHV0KG5ldyBGaWxlUmVhZGVyKGYpKTsKKyAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gUGFyc2VyRmFjdG9yeS5jcmVhdGUoZik7CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgQnJpZGdlWG1sQmxvY2tQYXJzZXIocGFyc2VyLCBtQ29udGV4dCwgbVBsYXRmb3JtUmVzb3VyY2VGbGFnWzBdKTsKICAgICAgICAgfSBjYXRjaCAoWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlKSB7CkBAIC01NTMsMTAgKzU1NywxMCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIG9wZW5SYXdSZXNvdXJjZShpbnQgaWQpIHRocm93cyBOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlVmFsdWUgdmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOworICAgICAgICBQYWlyPFN0cmluZywgUmVzb3VyY2VWYWx1ZT4gdmFsdWUgPSBnZXRSZXNvdXJjZVZhbHVlKGlkLCBtUGxhdGZvcm1SZXNvdXJjZUZsYWcpOwogCiAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHZhbHVlLmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHZhbHVlLmdldFNlY29uZCgpLmdldFZhbHVlKCk7CiAKICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGlzIGlzIGEgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVR5cGVkQXJyYXkuamF2YSBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VUeXBlZEFycmF5LmphdmEKaW5kZXggYjlmNzY5Zi4uMjYwY2RjOCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVR5cGVkQXJyYXkuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlVHlwZWRBcnJheS5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5hbmRyb2lkOwogCitpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZW5kZXJpbmcuYXBpLkRlY2xhcmVTdHlsZWFibGVSZXNvdXJjZVZhbHVlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmlkZS5jb21tb24ucmVuZGVyaW5nLmFwaS5MYXlvdXRMb2c7CiBpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZW5kZXJpbmcuYXBpLlJlbmRlclJlc291cmNlczsKIGltcG9ydCBjb20uYW5kcm9pZC5pZGUuY29tbW9uLnJlbmRlcmluZy5hcGkuUmVzb3VyY2VWYWx1ZTsKQEAgLTIzLDEwICsyNCwxMCBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLnV0aWwuWG1sVXRpbHM7CiBpbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5CcmlkZ2U7CiBpbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5CcmlkZ2VDb25zdGFudHM7CitpbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5pbXBsLlBhcnNlckZhY3Rvcnk7CiBpbXBvcnQgY29tLmFuZHJvaWQubGF5b3V0bGliLmJyaWRnZS5pbXBsLlJlc291cmNlSGVscGVyOwogaW1wb3J0IGNvbS5hbmRyb2lkLnJlc291cmNlcy5SZXNvdXJjZVR5cGU7CiAKLWltcG9ydCBvcmcua3htbDIuaW8uS1htbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKQEAgLTM2LDEwICszNywxMCBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudXRpbC5UeXBlZFZhbHVlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcl9EZWxlZ2F0ZTsKIGltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC00OCwxOCArNDksMjMgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEJyaWRnZVR5cGVkQXJyYXkgZXh0ZW5kcyBUeXBlZEFycmF5IHsKIAotICAgIHByaXZhdGUgQnJpZGdlUmVzb3VyY2VzIG1CcmlkZ2VSZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBCcmlkZ2VDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgQnJpZGdlUmVzb3VyY2VzIG1CcmlkZ2VSZXNvdXJjZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBCcmlkZ2VDb250ZXh0IG1Db250ZXh0OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUGxhdGZvcm1GaWxlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUGxhdGZvcm1TdHlsZWFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVN0eWxlYWJsZU5hbWU7CisKICAgICBwcml2YXRlIFJlc291cmNlVmFsdWVbXSBtUmVzb3VyY2VEYXRhOwogICAgIHByaXZhdGUgU3RyaW5nW10gbU5hbWVzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtUGxhdGZvcm1GaWxlOwogCiAgICAgcHVibGljIEJyaWRnZVR5cGVkQXJyYXkoQnJpZGdlUmVzb3VyY2VzIHJlc291cmNlcywgQnJpZGdlQ29udGV4dCBjb250ZXh0LCBpbnQgbGVuLAotICAgICAgICAgICAgYm9vbGVhbiBwbGF0Zm9ybUZpbGUpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcGxhdGZvcm1GaWxlLCBib29sZWFuIHBsYXRmb3JtU3R5bGVhYmxlLCBTdHJpbmcgc3R5bGVhYmxlTmFtZSkgewogICAgICAgICBzdXBlcihudWxsLCBudWxsLCBudWxsLCAwKTsKICAgICAgICAgbUJyaWRnZVJlc291cmNlcyA9IHJlc291cmNlczsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwogICAgICAgICBtUGxhdGZvcm1GaWxlID0gcGxhdGZvcm1GaWxlOworICAgICAgICBtUGxhdGZvcm1TdHlsZWFibGUgPSBwbGF0Zm9ybVN0eWxlYWJsZTsKKyAgICAgICAgbVN0eWxlYWJsZU5hbWUgPSBzdHlsZWFibGVOYW1lOwogICAgICAgICBtUmVzb3VyY2VEYXRhID0gbmV3IFJlc291cmNlVmFsdWVbbGVuXTsKICAgICAgICAgbU5hbWVzID0gbmV3IFN0cmluZ1tsZW5dOwogICAgIH0KQEAgLTIwMSw3ICsyMDcsMTggQEAKICAgICAgICAgLy8gRmllbGQgaXMgbm90IG51bGwgYW5kIGlzIG5vdCBhbiBpbnRlZ2VyLgogICAgICAgICAvLyBDaGVjayBmb3IgcG9zc2libGUgY29uc3RhbnRzIGFuZCB0cnkgdG8gZmluZCB0aGVtLgogICAgICAgICAvLyBHZXQgdGhlIG1hcCBvZiBhdHRyaWJ1dGUtY29uc3RhbnQgLT4gSW50ZWdlclZhbHVlCi0gICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IEJyaWRnZS5nZXRFbnVtVmFsdWVzKG1OYW1lc1tpbmRleF0pOworICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtYXAgPSBudWxsOworICAgICAgICBpZiAobVBsYXRmb3JtU3R5bGVhYmxlKSB7CisgICAgICAgICAgICBtYXAgPSBCcmlkZ2UuZ2V0RW51bVZhbHVlcyhtTmFtZXNbaW5kZXhdKTsKKyAgICAgICAgfSBlbHNlIGlmIChtU3R5bGVhYmxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIHN0eWxlYWJsZSBtYXRjaGluZyB0aGUgcmVzb2x2ZWQgbmFtZQorICAgICAgICAgICAgUmVuZGVyUmVzb3VyY2VzIHJlcyA9IG1Db250ZXh0LmdldFJlbmRlclJlc291cmNlcygpOworICAgICAgICAgICAgUmVzb3VyY2VWYWx1ZSBzdHlsZWFibGUgPSByZXMuZ2V0UHJvamVjdFJlc291cmNlKFJlc291cmNlVHlwZS5ERUNMQVJFX1NUWUxFQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgbVN0eWxlYWJsZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0eWxlYWJsZSBpbnN0YW5jZW9mIERlY2xhcmVTdHlsZWFibGVSZXNvdXJjZVZhbHVlKSB7CisgICAgICAgICAgICAgICAgbWFwID0gKChEZWNsYXJlU3R5bGVhYmxlUmVzb3VyY2VWYWx1ZSkgc3R5bGVhYmxlKS5nZXRBdHRyaWJ1dGVWYWx1ZXMobU5hbWVzW2luZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIGFjY3VtdWxhdG9yIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgMSsgY29uc3RhbnRzLgpAQCAtMzEzLDkgKzMzMCw3IEBACiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHZhbHVlKTsKICAgICAgICAgaWYgKGYuaXNGaWxlKCkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgS1htbFBhcnNlciBwYXJzZXIgPSBuZXcgS1htbFBhcnNlcigpOwotICAgICAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZVJlYWRlcihmKSk7CisgICAgICAgICAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBQYXJzZXJGYWN0b3J5LmNyZWF0ZShmKTsKIAogICAgICAgICAgICAgICAgIEJyaWRnZVhtbEJsb2NrUGFyc2VyIGJsb2NrUGFyc2VyID0gbmV3IEJyaWRnZVhtbEJsb2NrUGFyc2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLCBtQ29udGV4dCwgcmVzVmFsdWUuaXNGcmFtZXdvcmsoKSk7CkBAIC0zNTksMjYgKzM3NCw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbnRlZ2VyKGludCBpbmRleCwgaW50IGRlZlZhbHVlKSB7Ci0gICAgICAgIGlmIChtUmVzb3VyY2VEYXRhW2luZGV4XSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVmVmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcyA9IG1SZXNvdXJjZURhdGFbaW5kZXhdLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgQnJpZGdlLmdldExvZygpLndhcm5pbmcoTGF5b3V0TG9nLlRBR19SRVNPVVJDRVNfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIGluIGF0dHJpYnV0ZSBcIiUyJHNcIiBjYW5ub250IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgbU5hbWVzW2luZGV4XSksIG51bGwgLypkYXRhKi8pOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgaXMgcmV0dXJuZWQgYmVsb3cuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGVmVmFsdWU7CisgICAgICAgIHJldHVybiBnZXRJbnQoaW5kZXgsIGRlZlZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQxNiw3ICs0MTIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnN0cmluZ1RvRmxvYXQocywgbVZhbHVlKSkgeworICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIucGFyc2VGbG9hdEF0dHJpYnV0ZShtTmFtZXNbaW5kZXhdLCBzLCBtVmFsdWUsIHRydWUgLypyZXF1aXJlVW5pdCovKSkgewogICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZS5nZXREaW1lbnNpb24obUJyaWRnZVJlc291cmNlcy5tTWV0cmljcyk7CiAgICAgICAgIH0KIApAQCAtNDcxLDQwICs0NjcsMjMgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldERpbWVuc2lvblBpeGVsU2l6ZShpbnQgaW5kZXgsIGludCBkZWZWYWx1ZSkgewotICAgICAgICBpZiAobVJlc291cmNlRGF0YVtpbmRleF0gPT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldERpbWVuc2lvbihpbmRleCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG1SZXNvdXJjZURhdGFbaW5kZXhdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG1SZXNvdXJjZURhdGFbaW5kZXhdLmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGxvb2tzIGxpa2Ugd2Ugd2VyZSB1bmFibGUgdG8gcmVzb2x2ZSB0aGUgZGltZW5zaW9uIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIEJyaWRnZS5nZXRMb2coKS53YXJuaW5nKExheW91dExvZy5UQUdfUkVTT1VSQ0VTX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIlMSRzXCIgaW4gYXR0cmlidXRlIFwiJTIkc1wiIGlzIG5vdCBhIHZhbGlkIGZvcm1hdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBtTmFtZXNbaW5kZXhdKSwgbnVsbCAvKmRhdGEqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gZGVmVmFsdWU7CiAgICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcyA9IG1SZXNvdXJjZURhdGFbaW5kZXhdLmdldFZhbHVlKCk7Ci0KLSAgICAgICAgaWYgKHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHMuZXF1YWxzKEJyaWRnZUNvbnN0YW50cy5NQVRDSF9QQVJFTlQpIHx8Ci0gICAgICAgICAgICAgICAgcy5lcXVhbHMoQnJpZGdlQ29uc3RhbnRzLkZJTExfUEFSRU5UKSkgewotICAgICAgICAgICAgcmV0dXJuIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocy5lcXVhbHMoQnJpZGdlQ29uc3RhbnRzLldSQVBfQ09OVEVOVCkpIHsKLSAgICAgICAgICAgIHJldHVybiBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwotICAgICAgICB9IGVsc2UgaWYgKFJlbmRlclJlc291cmNlcy5SRUZFUkVOQ0VfTlVMTC5lcXVhbHMocykpIHsKLSAgICAgICAgICAgIHJldHVybiBkZWZWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChSZXNvdXJjZUhlbHBlci5zdHJpbmdUb0Zsb2F0KHMsIG1WYWx1ZSkpIHsKLSAgICAgICAgICAgIGZsb2F0IGYgPSBtVmFsdWUuZ2V0RGltZW5zaW9uKG1CcmlkZ2VSZXNvdXJjZXMubU1ldHJpY3MpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgcmVzID0gKGludCkoZiswLjVmKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKLSAgICAgICAgICAgIGlmIChmID09IDApIHJldHVybiAwOwotICAgICAgICAgICAgaWYgKGYgPiAwKSByZXR1cm4gMTsKLSAgICAgICAgICAgIHJldHVybiBkZWZWYWx1ZTsgLy8gdGhpcyBpcyBiYXNpY2FsbHkgdW5yZWFjaGFibGUuCi0gICAgICAgIH0KLQotICAgICAgICAvLyBsb29rcyBsaWtlIHdlIHdlcmUgdW5hYmxlIHRvIHJlc29sdmUgdGhlIGRpbWVuc2lvbiB2YWx1ZQotICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkud2FybmluZyhMYXlvdXRMb2cuVEFHX1JFU09VUkNFU19GT1JNQVQsCi0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlwiJTEkc1wiIGluIGF0dHJpYnV0ZSBcIiUyJHNcIiBpcyBub3QgYSB2YWxpZCBmb3JtYXQuIiwKLSAgICAgICAgICAgICAgICAgICAgcywgbU5hbWVzW2luZGV4XSksIG51bGwgLypkYXRhKi8pOwotCi0gICAgICAgIHJldHVybiBkZWZWYWx1ZTsKICAgICB9CiAKICAgICAvKioKQEAgLTUyMSw3ICs1MDAsMjAgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldExheW91dERpbWVuc2lvbihpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXREaW1lbnNpb25QaXhlbFNpemUoaW5kZXgsIDApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgcmV0dXJuIGdldERpbWVuc2lvbihpbmRleCk7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICBpZiAoTGF5b3V0SW5mbGF0ZXJfRGVsZWdhdGUuc0lzSW5JbmNsdWRlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnJpZGdlLmdldExvZygpLndhcm5pbmcoTGF5b3V0TG9nLlRBR19SRVNPVVJDRVNfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3VwcGx5IGEgIiArIG5hbWUgKyAiIGF0dHJpYnV0ZS4iLCBudWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTUyOSw2ICs1MjEsMzYgQEAKICAgICAgICAgcmV0dXJuIGdldERpbWVuc2lvblBpeGVsU2l6ZShpbmRleCwgZGVmVmFsdWUpOwogICAgIH0KIAorICAgIHByaXZhdGUgaW50IGdldERpbWVuc2lvbihpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKG1SZXNvdXJjZURhdGFbaW5kZXhdID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcyA9IG1SZXNvdXJjZURhdGFbaW5kZXhdLmdldFZhbHVlKCk7CisKKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChzLmVxdWFscyhCcmlkZ2VDb25zdGFudHMuTUFUQ0hfUEFSRU5UKSB8fAorICAgICAgICAgICAgICAgIHMuZXF1YWxzKEJyaWRnZUNvbnN0YW50cy5GSUxMX1BBUkVOVCkpIHsKKyAgICAgICAgICAgIHJldHVybiBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOworICAgICAgICB9IGVsc2UgaWYgKHMuZXF1YWxzKEJyaWRnZUNvbnN0YW50cy5XUkFQX0NPTlRFTlQpKSB7CisgICAgICAgICAgICByZXR1cm4gTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVDsKKyAgICAgICAgfSBlbHNlIGlmIChSZW5kZXJSZXNvdXJjZXMuUkVGRVJFTkNFX05VTEwuZXF1YWxzKHMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnBhcnNlRmxvYXRBdHRyaWJ1dGUobU5hbWVzW2luZGV4XSwgcywgbVZhbHVlLCB0cnVlIC8qcmVxdWlyZVVuaXQqLykpIHsKKyAgICAgICAgICAgIGZsb2F0IGYgPSBtVmFsdWUuZ2V0RGltZW5zaW9uKG1CcmlkZ2VSZXNvdXJjZXMubU1ldHJpY3MpOworCisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzID0gKGludCkoZiswLjVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIGlmIChmID09IDApIHJldHVybiAwOworICAgICAgICAgICAgaWYgKGYgPiAwKSByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgYSBmcmFjdGlvbmFsIHVuaXQgYXR0cmlidXRlIGF0IDx2YXI+aW5kZXg8L3Zhcj4uCiAgICAgICoKQEAgLTU1NSwxNCArNTc3LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gZGVmVmFsdWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIuc3RyaW5nVG9GbG9hdCh2YWx1ZSwgbVZhbHVlKSkgeworICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIucGFyc2VGbG9hdEF0dHJpYnV0ZShtTmFtZXNbaW5kZXhdLCB2YWx1ZSwgbVZhbHVlLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qcmVxdWlyZVVuaXQqLykpIHsKICAgICAgICAgICAgIHJldHVybiBtVmFsdWUuZ2V0RnJhY3Rpb24oYmFzZSwgcGJhc2UpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbG9va3MgbGlrZSB3ZSB3ZXJlIHVuYWJsZSB0byByZXNvbHZlIHRoZSBmcmFjdGlvbiB2YWx1ZQogICAgICAgICBCcmlkZ2UuZ2V0TG9nKCkud2FybmluZyhMYXlvdXRMb2cuVEFHX1JFU09VUkNFU19GT1JNQVQsCiAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIlwiJTEkc1wiIGluIGF0dHJpYnV0ZSBcIiUyJHNcIiBjYW5ub250IGJlIGNvbnZlcnRlZCB0byBhIGZyYWN0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICJcIiUxJHNcIiBpbiBhdHRyaWJ1dGUgXCIlMiRzXCIgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIGZyYWN0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBtTmFtZXNbaW5kZXhdKSwgbnVsbCAvKmRhdGEqLyk7CiAKICAgICAgICAgcmV0dXJuIGRlZlZhbHVlOwpAQCAtNzU5LDcgKzc4Miw4IEBACiAKICAgICAgICAgU3RyaW5nIHMgPSBtUmVzb3VyY2VEYXRhW2luZGV4XS5nZXRWYWx1ZSgpOwogCi0gICAgICAgIHJldHVybiBSZXNvdXJjZUhlbHBlci5zdHJpbmdUb0Zsb2F0KHMsIG91dFZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlSGVscGVyLnBhcnNlRmxvYXRBdHRyaWJ1dGUobU5hbWVzW2luZGV4XSwgcywgb3V0VmFsdWUsCisgICAgICAgICAgICAgICAgZmFsc2UgLypyZXF1aXJlVW5pdCovKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VYbWxCbG9ja1BhcnNlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVhtbEJsb2NrUGFyc2VyLmphdmEKaW5kZXggNzBkYmFhNC4uMTAxNmIzMiAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVhtbEJsb2NrUGFyc2VyLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVhtbEJsb2NrUGFyc2VyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogCiBpbXBvcnQgY29tLmFuZHJvaWQuaWRlLmNvbW1vbi5yZW5kZXJpbmcuYXBpLklMYXlvdXRQdWxsUGFyc2VyOworaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuaW1wbC5QYXJzZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwpAQCAtNTQsNiArNTUsMTAgQEAKICAgICAgKiBAcGFyYW0gcGxhdGZvcm1GaWxlIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0aGUgZmlsZSBpcyBhIHBsYXRmb3JtIGZpbGUgb3Igbm90LgogICAgICAqLwogICAgIHB1YmxpYyBCcmlkZ2VYbWxCbG9ja1BhcnNlcihYbWxQdWxsUGFyc2VyIHBhcnNlciwgQnJpZGdlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHBsYXRmb3JtRmlsZSkgeworICAgICAgICBpZiAoUGFyc2VyRmFjdG9yeS5MT0dfUEFSU0VSKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNSVEUgIiArIHBhcnNlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1QYXJzZXIgPSBwYXJzZXI7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVBsYXRmb3JtRmlsZSA9IHBsYXRmb3JtRmlsZTsKQEAgLTY1LDYgKzcwLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgWG1sUHVsbFBhcnNlciBnZXRQYXJzZXIoKSB7CisgICAgICAgIHJldHVybiBtUGFyc2VyOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzUGxhdGZvcm1GaWxlKCkgewogICAgICAgICByZXR1cm4gbVBsYXRmb3JtRmlsZTsKICAgICB9CkBAIC0yNDcsMTggKzI1Niw2MyBAQAogICAgIHB1YmxpYyBpbnQgbmV4dCgpIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKFBhcnNlckZhY3RvcnkuTE9HX1BBUlNFUikgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU1RSVCAiICsgbVBhcnNlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuIFNUQVJUX0RPQ1VNRU5UOwogICAgICAgICB9CisKICAgICAgICAgaW50IGV2ID0gbVBhcnNlci5uZXh0KCk7CiAKKyAgICAgICAgaWYgKFBhcnNlckZhY3RvcnkuTE9HX1BBUlNFUikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJORVhUICIgKyBtUGFyc2VyLnRvU3RyaW5nKCkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICBldmVudFR5cGVUb1N0cmluZyhtRXZlbnRUeXBlKSArICIgLT4gIiArIGV2ZW50VHlwZVRvU3RyaW5nKGV2KSk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoZXYgPT0gRU5EX1RBRyAmJiBtUGFyc2VyLmdldERlcHRoKCkgPT0gMSkgewogICAgICAgICAgICAgLy8gZG9uZSB3aXRoIHBhcnNlciByZW1vdmUgaXQgZnJvbSB0aGUgY29udGV4dCBzdGFjay4KICAgICAgICAgICAgIGVuc3VyZVBvcHBlZCgpOworCisgICAgICAgICAgICBpZiAoUGFyc2VyRmFjdG9yeS5MT0dfUEFSU0VSKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIG1FdmVudFR5cGUgPSBldjsKICAgICAgICAgcmV0dXJuIGV2OwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGV2ZW50VHlwZVRvU3RyaW5nKGludCBldmVudFR5cGUpIHsKKyAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBUlRfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJTVEFSVF9ET0MiOworICAgICAgICAgICAgY2FzZSBFTkRfRE9DVU1FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFTkRfRE9DIjsKKyAgICAgICAgICAgIGNhc2UgU1RBUlRfVEFHOgorICAgICAgICAgICAgICAgIHJldHVybiAiU1RBUlRfVEFHIjsKKyAgICAgICAgICAgIGNhc2UgRU5EX1RBRzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVORF9UQUciOworICAgICAgICAgICAgY2FzZSBURVhUOgorICAgICAgICAgICAgICAgIHJldHVybiAiVEVYVCI7CisgICAgICAgICAgICBjYXNlIENEU0VDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNEU0VDVCI7CisgICAgICAgICAgICBjYXNlIEVOVElUWV9SRUY6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFTlRJVFlfUkVGIjsKKyAgICAgICAgICAgIGNhc2UgSUdOT1JBQkxFX1dISVRFU1BBQ0U6CisgICAgICAgICAgICAgICAgcmV0dXJuICJJR05PUkFCTEVfV0hJVEVTUEFDRSI7CisgICAgICAgICAgICBjYXNlIFBST0NFU1NJTkdfSU5TVFJVQ1RJT046CisgICAgICAgICAgICAgICAgcmV0dXJuICJQUk9DRVNTSU5HX0lOU1RSVUNUSU9OIjsKKyAgICAgICAgICAgIGNhc2UgQ09NTUVOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNPTU1FTlQiOworICAgICAgICAgICAgY2FzZSBET0NERUNMOgorICAgICAgICAgICAgICAgIHJldHVybiAiRE9DREVDTCI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gIj8/Pz8iOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHJlcXVpcmUoaW50IHR5cGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQogICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewogICAgICAgICBpZiAodHlwZSAhPSBnZXRFdmVudFR5cGUoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL0N1c3RvbUJhci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL0N1c3RvbUJhci5qYXZhCmluZGV4IDBjNGIwZDMuLmRmNzAxZDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYmFycy9DdXN0b21CYXIuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvQ3VzdG9tQmFyLmphdmEKQEAgLTIyLDExICsyMiwxMSBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuQnJpZGdlOwogaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuYW5kcm9pZC5CcmlkZ2VDb250ZXh0OwogaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuYW5kcm9pZC5CcmlkZ2VYbWxCbG9ja1BhcnNlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmltcGwuUGFyc2VyRmFjdG9yeTsKIGltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmltcGwuUmVzb3VyY2VIZWxwZXI7CiBpbXBvcnQgY29tLmFuZHJvaWQucmVzb3VyY2VzLkRlbnNpdHk7CiBpbXBvcnQgY29tLmFuZHJvaWQucmVzb3VyY2VzLlJlc291cmNlVHlwZTsKIAotaW1wb3J0IG9yZy5reG1sMi5pby5LWG1sUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXI7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKIApAQCAtNjAsNyArNjAsNyBAQAogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRleHRWaWV3IGdldFN0eWxlYWJsZVRleHRWaWV3KCk7CiAKLSAgICBwcm90ZWN0ZWQgQ3VzdG9tQmFyKENvbnRleHQgY29udGV4dCwgRGVuc2l0eSBkZW5zaXR5LCBTdHJpbmcgbGF5b3V0UGF0aCkKKyAgICBwcm90ZWN0ZWQgQ3VzdG9tQmFyKENvbnRleHQgY29udGV4dCwgRGVuc2l0eSBkZW5zaXR5LCBTdHJpbmcgbGF5b3V0UGF0aCwgU3RyaW5nIG5hbWUpCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKGNvbnRleHQpOwogICAgICAgICBzZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuSE9SSVpPTlRBTCk7CkBAIC02OSwxMSArNjksOCBAQAogICAgICAgICBMYXlvdXRJbmZsYXRlciBpbmZsYXRlciA9IChMYXlvdXRJbmZsYXRlcikgZ2V0Q29udGV4dCgpLmdldFN5c3RlbVNlcnZpY2UoCiAgICAgICAgICAgICAgICAgQ29udGV4dC5MQVlPVVRfSU5GTEFURVJfU0VSVklDRSk7CiAKLSAgICAgICAgS1htbFBhcnNlciBwYXJzZXIgPSBuZXcgS1htbFBhcnNlcigpOwotICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZShYbWxQdWxsUGFyc2VyLkZFQVRVUkVfUFJPQ0VTU19OQU1FU1BBQ0VTLCB0cnVlKTsKLSAgICAgICAgcGFyc2VyLnNldElucHV0KAotICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShsYXlvdXRQYXRoKSwKLSAgICAgICAgICAgICAgICAiVVRGOCIpOworICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFBhcnNlckZhY3RvcnkuY3JlYXRlKGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShsYXlvdXRQYXRoKSwKKyAgICAgICAgICAgICAgICBuYW1lKTsKIAogICAgICAgICBCcmlkZ2VYbWxCbG9ja1BhcnNlciBicmlkZ2VQYXJzZXIgPSBuZXcgQnJpZGdlWG1sQmxvY2tQYXJzZXIoCiAgICAgICAgICAgICAgICAgcGFyc2VyLCAoQnJpZGdlQ29udGV4dCkgY29udGV4dCwgZmFsc2UgLypwbGF0Zm9ybUZpbGUqLyk7CkBAIC0yMzAsNyArMjI3LDggQEAKIAogICAgICAgICAgICAgICAgIGlmICh0ZXh0U2l6ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUgb3V0ID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJlc291cmNlSGVscGVyLnN0cmluZ1RvRmxvYXQodGV4dFNpemUuZ2V0VmFsdWUoKSwgb3V0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoUmVzb3VyY2VIZWxwZXIucGFyc2VGbG9hdEF0dHJpYnV0ZSgidGV4dFNpemUiLCB0ZXh0U2l6ZS5nZXRWYWx1ZSgpLCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnJlcXVpcmVVbml0Ki8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0U2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmdldERpbWVuc2lvbihicmlkZ2VDb250ZXh0LmdldFJlc291cmNlcygpLm1NZXRyaWNzKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYmFycy9GYWtlQWN0aW9uQmFyLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvRmFrZUFjdGlvbkJhci5qYXZhCmluZGV4IDNhZjRlM2EuLmY2ZWRlYTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYmFycy9GYWtlQWN0aW9uQmFyLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL0Zha2VBY3Rpb25CYXIuamF2YQpAQCAtMjksNyArMjksNyBAQAogCiAgICAgcHVibGljIEZha2VBY3Rpb25CYXIoQ29udGV4dCBjb250ZXh0LCBEZW5zaXR5IGRlbnNpdHksIFN0cmluZyBsYWJlbCwgU3RyaW5nIGljb24pCiAgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGRlbnNpdHksICIvYmFycy9hY3Rpb25fYmFyLnhtbCIpOworICAgICAgICBzdXBlcihjb250ZXh0LCBkZW5zaXR5LCAiL2JhcnMvYWN0aW9uX2Jhci54bWwiLCAiYWN0aW9uX2Jhci54bWwiKTsKIAogICAgICAgICAvLyBDYW5ub3QgYWNjZXNzIHRoZSBpbnNpZGUgaXRlbXMgdGhyb3VnaCBpZCBiZWNhdXNlIG5vIFIuaWQgdmFsdWVzIGhhdmUgYmVlbgogICAgICAgICAvLyBjcmVhdGVkIGZvciB0aGVtLgpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL1Bob25lU3lzdGVtQmFyLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvUGhvbmVTeXN0ZW1CYXIuamF2YQppbmRleCA5ZmFiNTFhLi41NTY5ZTA2IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvUGhvbmVTeXN0ZW1CYXIuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvUGhvbmVTeXN0ZW1CYXIuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogcHVibGljIGNsYXNzIFBob25lU3lzdGVtQmFyIGV4dGVuZHMgQ3VzdG9tQmFyIHsKIAogICAgIHB1YmxpYyBQaG9uZVN5c3RlbUJhcihDb250ZXh0IGNvbnRleHQsIERlbnNpdHkgZGVuc2l0eSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICBzdXBlcihjb250ZXh0LCBkZW5zaXR5LCAiL2JhcnMvcGhvbmVfc3lzdGVtX2Jhci54bWwiKTsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgZGVuc2l0eSwgIi9iYXJzL3Bob25lX3N5c3RlbV9iYXIueG1sIiwgInBob25lX3N5c3RlbV9iYXIueG1sIik7CiAKICAgICAgICAgc2V0R3Jhdml0eShtR3Jhdml0eSB8IEdyYXZpdHkuUklHSFQpOwogICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoMHhGRjAwMDAwMCk7CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvVGFibGV0U3lzdGVtQmFyLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2JhcnMvVGFibGV0U3lzdGVtQmFyLmphdmEKaW5kZXggNWNhNjhmYS4uNDU2ZGRiNCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL1RhYmxldFN5c3RlbUJhci5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYmFycy9UYWJsZXRTeXN0ZW1CYXIuamF2YQpAQCAtMjksNyArMjksNyBAQAogcHVibGljIGNsYXNzIFRhYmxldFN5c3RlbUJhciBleHRlbmRzIEN1c3RvbUJhciB7CiAKICAgICBwdWJsaWMgVGFibGV0U3lzdGVtQmFyKENvbnRleHQgY29udGV4dCwgRGVuc2l0eSBkZW5zaXR5KSB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGRlbnNpdHksICIvYmFycy90YWJsZXRfc3lzdGVtX2Jhci54bWwiKTsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgZGVuc2l0eSwgIi9iYXJzL3RhYmxldF9zeXN0ZW1fYmFyLnhtbCIsICJ0YWJsZXRfc3lzdGVtX2Jhci54bWwiKTsKIAogICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoMHhGRjAwMDAwMCk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYmFycy9UaXRsZUJhci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL1RpdGxlQmFyLmphdmEKaW5kZXggZDc0MDFkOS4uNWY1ZWJjNCAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL1RpdGxlQmFyLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9iYXJzL1RpdGxlQmFyLmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKIAogICAgIHB1YmxpYyBUaXRsZUJhcihDb250ZXh0IGNvbnRleHQsIERlbnNpdHkgZGVuc2l0eSwgU3RyaW5nIGxhYmVsKQogICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gewotICAgICAgICBzdXBlcihjb250ZXh0LCBkZW5zaXR5LCAiL2JhcnMvdGl0bGVfYmFyLnhtbCIpOworICAgICAgICBzdXBlcihjb250ZXh0LCBkZW5zaXR5LCAiL2JhcnMvdGl0bGVfYmFyLnhtbCIsICJ0aXRsZV9iYXIueG1sIik7CiAKICAgICAgICAgLy8gQ2Fubm90IGFjY2VzcyB0aGUgaW5zaWRlIGl0ZW1zIHRocm91Z2ggaWQgYmVjYXVzZSBubyBSLmlkIHZhbHVlcyBoYXZlIGJlZW4KICAgICAgICAgLy8gY3JlYXRlZCBmb3IgdGhlbS4KZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvaW1wbC9QYXJzZXJGYWN0b3J5LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2ltcGwvUGFyc2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzVlYzMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2ltcGwvUGFyc2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuaW1wbDsKKworCitpbXBvcnQgb3JnLmt4bWwyLmlvLktYbWxQYXJzZXI7CitpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKK2ltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogQSBmYWN0b3J5IGZvciB7QGxpbmsgWG1sUHVsbFBhcnNlcn0uCisgKgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VyRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gTE9HX1BBUlNFUiA9IGZhbHNlOworCisgICAgcHVibGljIHN0YXRpYyBYbWxQdWxsUGFyc2VyIGNyZWF0ZShGaWxlIGYpCisgICAgICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgS1htbFBhcnNlciBwYXJzZXIgPSBpbnN0YW50aWF0ZVBhcnNlcihmLmdldE5hbWUoKSk7CisgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZUlucHV0U3RyZWFtKGYpLCBFTkNPRElORyk7CisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYbWxQdWxsUGFyc2VyIGNyZWF0ZShJbnB1dFN0cmVhbSBzdHJlYW0sIFN0cmluZyBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICBLWG1sUGFyc2VyIHBhcnNlciA9IGluc3RhbnRpYXRlUGFyc2VyKG5hbWUpOworICAgICAgICBwYXJzZXIuc2V0SW5wdXQoc3RyZWFtLCBFTkNPRElORyk7CisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgS1htbFBhcnNlciBpbnN0YW50aWF0ZVBhcnNlcihTdHJpbmcgbmFtZSkgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24geworICAgICAgICBLWG1sUGFyc2VyIHBhcnNlcjsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyc2VyID0gbmV3IEN1c3RvbVBhcnNlcihuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBLWG1sUGFyc2VyKCk7CisgICAgICAgIH0KKyAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoWG1sUHVsbFBhcnNlci5GRUFUVVJFX1BST0NFU1NfTkFNRVNQQUNFUywgdHJ1ZSk7CisgICAgICAgIHJldHVybiBwYXJzZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tUGFyc2VyIGV4dGVuZHMgS1htbFBhcnNlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1OYW1lOworCisgICAgICAgIEN1c3RvbVBhcnNlcihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1OYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9pbXBsL1JlbmRlckFjdGlvbi5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9pbXBsL1JlbmRlckFjdGlvbi5qYXZhCmluZGV4IDhlODBjMjEuLjYxOTRmNWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvaW1wbC9SZW5kZXJBY3Rpb24uamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2ltcGwvUmVuZGVyQWN0aW9uLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmFuZHJvaWQuQnJpZGdlQ29udGV4dDsKIGltcG9ydCBjb20uYW5kcm9pZC5yZXNvdXJjZXMuUmVzb3VyY2VUeXBlOwogCitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkX0RlbGVnYXRlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtMjI4LDYgKzIyOSwxMCBAQAogICAgIHByaXZhdGUgdm9pZCB0ZWFyRG93bigpIHsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlbW92ZSBzdGF0aWMgcmVmZXJlbmNlcywgb3RoZXJ3aXNlIHdlIGNvdWxkIG5vdCB1bmxvYWQgdGhlIGxpYgogICAgICAgICBtQ29udGV4dC5kaXNwb3NlUmVzb3VyY2VzKCk7CisKKyAgICAgICAgLy8gcXVpdCBIYW5kbGVyVGhyZWFkIGNyZWF0ZWQgZHVyaW5nIHRoaXMgc2Vzc2lvbi4KKyAgICAgICAgSGFuZGxlclRocmVhZF9EZWxlZ2F0ZS5jbGVhblVwKHNDdXJyZW50Q29udGV4dCk7CisKICAgICAgICAgc0N1cnJlbnRDb250ZXh0ID0gbnVsbDsKIAogICAgICAgICBCcmlkZ2Uuc2V0TG9nKG51bGwpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9pbXBsL1JlbmRlclNlc3Npb25JbXBsLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2ltcGwvUmVuZGVyU2Vzc2lvbkltcGwuamF2YQppbmRleCBiODAwNTE5Li5hYTMwZTI5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2ltcGwvUmVuZGVyU2Vzc2lvbkltcGwuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2ltcGwvUmVuZGVyU2Vzc2lvbkltcGwuamF2YQpAQCAtOTg0LDcgKzk4NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzX2Jhcl9oZWlnaHQiKTsKIAogICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUgdHlwZWRWYWx1ZSA9IFJlc291cmNlSGVscGVyLmdldFZhbHVlKHZhbHVlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlIHR5cGVkVmFsdWUgPSBSZXNvdXJjZUhlbHBlci5nZXRWYWx1ZSgic3RhdHVzX2Jhcl9oZWlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmdldFZhbHVlKCksIHRydWUgLypyZXF1aXJlVW5pdCovKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgcGl4ZWwgdmFsdWUgYmFzZWQgb24gdGhlIGRpc3BsYXkgbWV0cmljcwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0JhclNpemUgPSAoaW50KXR5cGVkVmFsdWUuZ2V0RGltZW5zaW9uKG1ldHJpY3MpOwpAQCAtMTAxNiw3ICsxMDE3LDggQEAKIAogICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG51bWVyaWNhbCB2YWx1ZSwgaWYgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB0eXBlZFZhbHVlID0gUmVzb3VyY2VIZWxwZXIuZ2V0VmFsdWUodmFsdWUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB0eXBlZFZhbHVlID0gUmVzb3VyY2VIZWxwZXIuZ2V0VmFsdWUoImFjdGlvbkJhclNpemUiLCB2YWx1ZS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnJlcXVpcmVVbml0Ki8pOwogICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgcGl4ZWwgdmFsdWUgYmFzZWQgb24gdGhlIGRpc3BsYXkgbWV0cmljcwogICAgICAgICAgICAgICAgICAgICBtQWN0aW9uQmFyU2l6ZSA9IChpbnQpdHlwZWRWYWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7CkBAIC0xMDQwLDcgKzEwNDIsOCBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBudW1lcmljYWwgdmFsdWUsIGlmIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBUeXBlZFZhbHVlIHR5cGVkVmFsdWUgPSBSZXNvdXJjZUhlbHBlci5nZXRWYWx1ZSh2YWx1ZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgVHlwZWRWYWx1ZSB0eXBlZFZhbHVlID0gUmVzb3VyY2VIZWxwZXIuZ2V0VmFsdWUoIndpbmRvd1RpdGxlU2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuZ2V0VmFsdWUoKSwgdHJ1ZSAvKnJlcXVpcmVVbml0Ki8pOwogICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBwaXhlbCB2YWx1ZSBiYXNlZCBvbiB0aGUgZGlzcGxheSBtZXRyaWNzCiAgICAgICAgICAgICAgICAgICAgICAgICBtVGl0bGVCYXJTaXplID0gKGludCl0eXBlZFZhbHVlLmdldERpbWVuc2lvbihtZXRyaWNzKTsKQEAgLTEwNjIsNyArMTA2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICJzdGF0dXNfYmFyX2hlaWdodCIpOwogCiAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUgdHlwZWRWYWx1ZSA9IFJlc291cmNlSGVscGVyLmdldFZhbHVlKHZhbHVlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIFR5cGVkVmFsdWUgdHlwZWRWYWx1ZSA9IFJlc291cmNlSGVscGVyLmdldFZhbHVlKCJzdGF0dXNfYmFyX2hlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRWYWx1ZSgpLCB0cnVlIC8qcmVxdWlyZVVuaXQqLyk7CiAgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBwaXhlbCB2YWx1ZSBiYXNlZCBvbiB0aGUgZGlzcGxheSBtZXRyaWNzCiAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1CYXJTaXplID0gKGludCl0eXBlZFZhbHVlLmdldERpbWVuc2lvbihtZXRyaWNzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvaW1wbC9SZXNvdXJjZUhlbHBlci5qYXZhIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9pbXBsL1Jlc291cmNlSGVscGVyLmphdmEKaW5kZXggOTZhYjMwZi4uNmRjYjY5MyAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9pbXBsL1Jlc291cmNlSGVscGVyLmphdmEKKysrIGIvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9pbXBsL1Jlc291cmNlSGVscGVyLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5uaW5lcGF0Y2guTmluZVBhdGNoQ2h1bms7CiBpbXBvcnQgY29tLmFuZHJvaWQucmVzb3VyY2VzLkRlbnNpdHk7CiAKLWltcG9ydCBvcmcua3htbDIuaW8uS1htbFBhcnNlcjsKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyOwogaW1wb3J0IG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CiAKQEAgLTQ0LDcgKzQzLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKQEAgLTEyMiw5ICsxMjAsNyBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGUgZnJhbWV3b3JrIGluZmxhdGUgdGhlIENvbG9yU3RhdGVMaXN0IGZyb20gdGhlIFhNTCBmaWxlLCBieQogICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRpbmcgYW4gWG1sUHVsbFBhcnNlcgotICAgICAgICAgICAgICAgICAgICBLWG1sUGFyc2VyIHBhcnNlciA9IG5ldyBLWG1sUGFyc2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKFhtbFB1bGxQYXJzZXIuRkVBVFVSRV9QUk9DRVNTX05BTUVTUEFDRVMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc2V0SW5wdXQobmV3IEZpbGVSZWFkZXIoZikpOworICAgICAgICAgICAgICAgICAgICBYbWxQdWxsUGFyc2VyIHBhcnNlciA9IFBhcnNlckZhY3RvcnkuY3JlYXRlKGYpOwogCiAgICAgICAgICAgICAgICAgICAgIEJyaWRnZVhtbEJsb2NrUGFyc2VyIGJsb2NrUGFyc2VyID0gbmV3IEJyaWRnZVhtbEJsb2NrUGFyc2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciwgY29udGV4dCwgcmVzVmFsdWUuaXNGcmFtZXdvcmsoKSk7CkBAIC0yMDQsOSArMjAwLDcgQEAKICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRoZSBmcmFtZXdvcmsgaW5mbGF0ZSB0aGUgRHJhd2FibGUgZnJvbSB0aGUgWE1MIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgIEtYbWxQYXJzZXIgcGFyc2VyID0gbmV3IEtYbWxQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnNldEZlYXR1cmUoWG1sUHVsbFBhcnNlci5GRUFUVVJFX1BST0NFU1NfTkFNRVNQQUNFUywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnNlci5zZXRJbnB1dChuZXcgRmlsZVJlYWRlcihmKSk7CisgICAgICAgICAgICAgICAgICAgIFhtbFB1bGxQYXJzZXIgcGFyc2VyID0gUGFyc2VyRmFjdG9yeS5jcmVhdGUoZik7CiAKICAgICAgICAgICAgICAgICAgICAgQnJpZGdlWG1sQmxvY2tQYXJzZXIgYmxvY2tQYXJzZXIgPSBuZXcgQnJpZGdlWG1sQmxvY2tQYXJzZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLCBjb250ZXh0LCB2YWx1ZS5pc0ZyYW1ld29yaygpKTsKQEAgLTM0MiwxMSArMzM2LDExIEBACiAgICAgfTsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJhdyB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICogUmV0dXJucyB0aGUgcmF3IHZhbHVlIGZyb20gdGhlIGdpdmVuIGF0dHJpYnV0ZSBmbG9hdC10eXBlIHZhbHVlIHN0cmluZy4KICAgICAgKiBUaGlzIG9iamVjdCBpcyBvbmx5IHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgb24gdG8ge0BsaW5rIFJlc291cmNlSGVscGVyfS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVkVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHN0cmluZ1RvRmxvYXQocywgbVZhbHVlKSkgeworICAgIHB1YmxpYyBzdGF0aWMgVHlwZWRWYWx1ZSBnZXRWYWx1ZShTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gcmVxdWlyZVVuaXQpIHsKKyAgICAgICAgaWYgKHBhcnNlRmxvYXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSwgbVZhbHVlLCByZXF1aXJlVW5pdCkpIHsKICAgICAgICAgICAgIHJldHVybiBtVmFsdWU7CiAgICAgICAgIH0KIApAQCAtMzU0LDIyICszNDgsMjcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb252ZXJ0IHRoZSBzdHJpbmcgaW50byBhIHtAbGluayBUeXBlZFZhbHVlfS4KLSAgICAgKiBAcGFyYW0gcwotICAgICAqIEBwYXJhbSBvdXRWYWx1ZQorICAgICAqIFBhcnNlIGEgZmxvYXQgYXR0cmlidXRlIGFuZCByZXR1cm4gdGhlIHBhcnNlZCB2YWx1ZSBpbnRvIGEgZ2l2ZW4gVHlwZWRWYWx1ZS4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuIENhbiBiZSBudWxsIGlmIDx2YXI+cmVxdWlyZVVuaXQ8L3Zhcj4gaXMgZmFsc2UuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqIEBwYXJhbSBvdXRWYWx1ZSB0aGUgVHlwZWRWYWx1ZSB0byByZWNlaXZlIHRoZSBwYXJzZWQgdmFsdWUKKyAgICAgKiBAcGFyYW0gcmVxdWlyZVVuaXQgd2hldGhlciB0aGUgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBhIHVuaXQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3MuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ1RvRmxvYXQoU3RyaW5nIHMsIFR5cGVkVmFsdWUgb3V0VmFsdWUpIHsKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcGFyc2VGbG9hdEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsCisgICAgICAgICAgICBUeXBlZFZhbHVlIG91dFZhbHVlLCBib29sZWFuIHJlcXVpcmVVbml0KSB7CisgICAgICAgIGFzc2VydCByZXF1aXJlVW5pdCA9PSBmYWxzZSB8fCBhdHRyaWJ1dGUgIT0gbnVsbDsKKwogICAgICAgICAvLyByZW1vdmUgdGhlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIKLSAgICAgICAgcyA9IHMudHJpbSgpOwotICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7CisgICAgICAgIGludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKIAogICAgICAgICBpZiAobGVuIDw9IDApIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUncyBubyBub24gYXNjaWkgY2hhcmFjdGVycy4KLSAgICAgICAgY2hhcltdIGJ1ZiA9IHMudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IHZhbHVlLnRvQ2hhckFycmF5KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGxlbiA7IGkrKykgewogICAgICAgICAgICAgaWYgKGJ1ZltpXSA+IDI1NSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM4Miw3ICszODEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gbm93IGxvb2sgZm9yIHRoZSBzdHJpbmcgdGhhdCBpcyBhZnRlciB0aGUgZmxvYXQuLi4KLSAgICAgICAgTWF0Y2hlciBtID0gc0Zsb2F0UGF0dGVybi5tYXRjaGVyKHMpOworICAgICAgICBNYXRjaGVyIG0gPSBzRmxvYXRQYXR0ZXJuLm1hdGNoZXIodmFsdWUpOwogICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgIFN0cmluZyBmX3N0ciA9IG0uZ3JvdXAoMSk7CiAgICAgICAgICAgICBTdHJpbmcgZW5kID0gbS5ncm91cCgyKTsKQEAgLTM5OCw0NSArMzk3LDcgQEAKICAgICAgICAgICAgIGlmIChlbmQubGVuZ3RoKCkgPiAwICYmIGVuZC5jaGFyQXQoMCkgIT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgLy8gTWlnaHQgYmUgYSB1bml0Li4uCiAgICAgICAgICAgICAgICAgaWYgKHBhcnNlVW5pdChlbmQsIG91dFZhbHVlLCBzRmxvYXRPdXQpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZiAqPSBzRmxvYXRPdXRbMF07Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVnID0gZiA8IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAtZjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSAobG9uZykoZiooMTw8MjMpKy41Zik7Ci0gICAgICAgICAgICAgICAgICAgIGludCByYWRpeDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdHMmMHg3ZmZmZmYpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB1c2UgMjNwMCBpZiB0aGVyZSBpcyBubyBmcmFjdGlvbiwganVzdCB0byBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGluZ3MgZWFzaWVyIHRvIHJlYWQuCi0gICAgICAgICAgICAgICAgICAgICAgICByYWRpeCA9IFR5cGVkVmFsdWUuQ09NUExFWF9SQURJWF8yM3AwOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyMzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYml0cyYweGZmZmZmZmZmZmY4MDAwMDBMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWduaXR1ZGUgaXMgemVybyAtLSBjYW4gZml0IGluIDAgYml0cyBvZiBwcmVjaXNpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICByYWRpeCA9IFR5cGVkVmFsdWUuQ09NUExFWF9SQURJWF8wcDIzOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChiaXRzJjB4ZmZmZmZmZmY4MDAwMDAwMEwpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hZ25pdHVkZSBjYW4gZml0IGluIDggYml0cyBvZiBwcmVjaXNpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICByYWRpeCA9IFR5cGVkVmFsdWUuQ09NUExFWF9SQURJWF84cDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSA4OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChiaXRzJjB4ZmZmZmZmODAwMDAwMDAwMEwpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hZ25pdHVkZSBjYW4gZml0IGluIDE2IGJpdHMgb2YgcHJlY2lzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXggPSBUeXBlZFZhbHVlLkNPTVBMRVhfUkFESVhfMTZwNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWduaXR1ZGUgbmVlZHMgZW50aXJlIHJhbmdlLCBzbyBubyBmcmFjdGlvbmFsIHBhcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICByYWRpeCA9IFR5cGVkVmFsdWUuQ09NUExFWF9SQURJWF8yM3AwOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgbWFudGlzc2EgPSAoaW50KSgKLSAgICAgICAgICAgICAgICAgICAgICAgIChiaXRzPj5zaGlmdCkgJiBUeXBlZFZhbHVlLkNPTVBMRVhfTUFOVElTU0FfTUFTSyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZWcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hbnRpc3NhID0gKC1tYW50aXNzYSkgJiBUeXBlZFZhbHVlLkNPTVBMRVhfTUFOVElTU0FfTUFTSzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZS5kYXRhIHw9Ci0gICAgICAgICAgICAgICAgICAgICAgICAocmFkaXg8PFR5cGVkVmFsdWUuQ09NUExFWF9SQURJWF9TSElGVCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgKG1hbnRpc3NhPDxUeXBlZFZhbHVlLkNPTVBMRVhfTUFOVElTU0FfU0hJRlQpOworICAgICAgICAgICAgICAgICAgICBjb21wdXRlVHlwZWRWYWx1ZShvdXRWYWx1ZSwgZiwgc0Zsb2F0T3V0WzBdKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ0Nyw4ICs0MDgsMjAgQEAKIAogICAgICAgICAgICAgaWYgKGVuZC5sZW5ndGgoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKG91dFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUudHlwZSA9IFR5cGVkVmFsdWUuVFlQRV9GTE9BVDsKLSAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUuZGF0YSA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKGYpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZVVuaXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFZhbHVlLnR5cGUgPSBUeXBlZFZhbHVlLlRZUEVfRkxPQVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZS5kYXRhID0gRmxvYXQuZmxvYXRUb0ludEJpdHMoZik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyB1bml0IHdoZW4gcmVxdWlyZWQ/IFVzZSBkcCBhbmQgb3V0IGFuIGVycm9yLgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlVbml0KHNVbml0TmFtZXNbMV0sIG91dFZhbHVlLCBzRmxvYXRPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVR5cGVkVmFsdWUob3V0VmFsdWUsIGYsIHNGbG9hdE91dFswXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEJyaWRnZS5nZXRMb2coKS5lcnJvcihMYXlvdXRMb2cuVEFHX1JFU09VUkNFU19SRVNPTFZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaW1lbnNpb24gXCIlMSRzXCIgaW4gYXR0cmlidXRlIFwiJTIkc1wiIGlzIG1pc3NpbmcgdW5pdCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBhdHRyaWJ1dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00NTcsMjAgKzQzMCw2NCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlVHlwZWRWYWx1ZShUeXBlZFZhbHVlIG91dFZhbHVlLCBmbG9hdCB2YWx1ZSwgZmxvYXQgc2NhbGUpIHsKKyAgICAgICAgdmFsdWUgKj0gc2NhbGU7CisgICAgICAgIGJvb2xlYW4gbmVnID0gdmFsdWUgPCAwOworICAgICAgICBpZiAobmVnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IC12YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBsb25nIGJpdHMgPSAobG9uZykodmFsdWUqKDE8PDIzKSsuNWYpOworICAgICAgICBpbnQgcmFkaXg7CisgICAgICAgIGludCBzaGlmdDsKKyAgICAgICAgaWYgKChiaXRzJjB4N2ZmZmZmKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBBbHdheXMgdXNlIDIzcDAgaWYgdGhlcmUgaXMgbm8gZnJhY3Rpb24sIGp1c3QgdG8gbWFrZQorICAgICAgICAgICAgLy8gdGhpbmdzIGVhc2llciB0byByZWFkLgorICAgICAgICAgICAgcmFkaXggPSBUeXBlZFZhbHVlLkNPTVBMRVhfUkFESVhfMjNwMDsKKyAgICAgICAgICAgIHNoaWZ0ID0gMjM7CisgICAgICAgIH0gZWxzZSBpZiAoKGJpdHMmMHhmZmZmZmZmZmZmODAwMDAwTCkgPT0gMCkgeworICAgICAgICAgICAgLy8gTWFnbml0dWRlIGlzIHplcm8gLS0gY2FuIGZpdCBpbiAwIGJpdHMgb2YgcHJlY2lzaW9uLgorICAgICAgICAgICAgcmFkaXggPSBUeXBlZFZhbHVlLkNPTVBMRVhfUkFESVhfMHAyMzsKKyAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICgoYml0cyYweGZmZmZmZmZmODAwMDAwMDBMKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBNYWduaXR1ZGUgY2FuIGZpdCBpbiA4IGJpdHMgb2YgcHJlY2lzaW9uLgorICAgICAgICAgICAgcmFkaXggPSBUeXBlZFZhbHVlLkNPTVBMRVhfUkFESVhfOHAxNTsKKyAgICAgICAgICAgIHNoaWZ0ID0gODsKKyAgICAgICAgfSBlbHNlIGlmICgoYml0cyYweGZmZmZmZjgwMDAwMDAwMDBMKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBNYWduaXR1ZGUgY2FuIGZpdCBpbiAxNiBiaXRzIG9mIHByZWNpc2lvbi4KKyAgICAgICAgICAgIHJhZGl4ID0gVHlwZWRWYWx1ZS5DT01QTEVYX1JBRElYXzE2cDc7CisgICAgICAgICAgICBzaGlmdCA9IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFnbml0dWRlIG5lZWRzIGVudGlyZSByYW5nZSwgc28gbm8gZnJhY3Rpb25hbCBwYXJ0LgorICAgICAgICAgICAgcmFkaXggPSBUeXBlZFZhbHVlLkNPTVBMRVhfUkFESVhfMjNwMDsKKyAgICAgICAgICAgIHNoaWZ0ID0gMjM7CisgICAgICAgIH0KKyAgICAgICAgaW50IG1hbnRpc3NhID0gKGludCkoCisgICAgICAgICAgICAoYml0cz4+c2hpZnQpICYgVHlwZWRWYWx1ZS5DT01QTEVYX01BTlRJU1NBX01BU0spOworICAgICAgICBpZiAobmVnKSB7CisgICAgICAgICAgICBtYW50aXNzYSA9ICgtbWFudGlzc2EpICYgVHlwZWRWYWx1ZS5DT01QTEVYX01BTlRJU1NBX01BU0s7CisgICAgICAgIH0KKyAgICAgICAgb3V0VmFsdWUuZGF0YSB8PQorICAgICAgICAgICAgKHJhZGl4PDxUeXBlZFZhbHVlLkNPTVBMRVhfUkFESVhfU0hJRlQpCisgICAgICAgICAgICB8IChtYW50aXNzYTw8VHlwZWRWYWx1ZS5DT01QTEVYX01BTlRJU1NBX1NISUZUKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHBhcnNlVW5pdChTdHJpbmcgc3RyLCBUeXBlZFZhbHVlIG91dFZhbHVlLCBmbG9hdFtdIG91dFNjYWxlKSB7CiAgICAgICAgIHN0ciA9IHN0ci50cmltKCk7CiAKICAgICAgICAgZm9yIChVbml0RW50cnkgdW5pdCA6IHNVbml0TmFtZXMpIHsKICAgICAgICAgICAgIGlmICh1bml0Lm5hbWUuZXF1YWxzKHN0cikpIHsKLSAgICAgICAgICAgICAgICBvdXRWYWx1ZS50eXBlID0gdW5pdC50eXBlOwotICAgICAgICAgICAgICAgIG91dFZhbHVlLmRhdGEgPSB1bml0LnVuaXQgPDwgVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfU0hJRlQ7Ci0gICAgICAgICAgICAgICAgb3V0U2NhbGVbMF0gPSB1bml0LnNjYWxlOwotCisgICAgICAgICAgICAgICAgYXBwbHlVbml0KHVuaXQsIG91dFZhbHVlLCBvdXRTY2FsZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseVVuaXQoVW5pdEVudHJ5IHVuaXQsIFR5cGVkVmFsdWUgb3V0VmFsdWUsIGZsb2F0W10gb3V0U2NhbGUpIHsKKyAgICAgICAgb3V0VmFsdWUudHlwZSA9IHVuaXQudHlwZTsKKyAgICAgICAgb3V0VmFsdWUuZGF0YSA9IHVuaXQudW5pdCA8PCBUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9TSElGVDsKKyAgICAgICAgb3V0U2NhbGVbMF0gPSB1bml0LnNjYWxlOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvbGliY29yZS9pY3UvSUNVX0RlbGVnYXRlLmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9saWJjb3JlL2ljdS9JQ1VfRGVsZWdhdGUuamF2YQppbmRleCBlNmRjNjQ2Li45OGY4NTI5IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9saWJjb3JlL2ljdS9JQ1VfRGVsZWdhdGUuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9saWJjb3JlL2ljdS9JQ1VfRGVsZWdhdGUuamF2YQpAQCAtNDQsNiArNDQsMTYgQEAKICAgICAvLyAtLS0gTmF0aXZlIG1ldGhvZHMgYWNjZXNzaW5nIElDVSdzIGRhdGFiYXNlLgogCiAgICAgQExheW91dGxpYkRlbGVnYXRlCisgICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZyBnZXRJY3VWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gInVua25vd25fbGF5b3V0bGliIjsKKyAgICB9CisKKyAgICBATGF5b3V0bGliRGVsZWdhdGUKKyAgICAvKnBhY2thZ2UqLyBzdGF0aWMgU3RyaW5nIGdldFVuaWNvZGVWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gIjUuMiI7CisgICAgfQorCisgICAgQExheW91dGxpYkRlbGVnYXRlCiAgICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZUJyZWFrSXRlcmF0b3JMb2NhbGVzTmF0aXZlKCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKICAgICB9CkBAIC03NCwxNyArODQsMjcgQEAKICAgICB9CiAKICAgICBATGF5b3V0bGliRGVsZWdhdGUKLSAgICAvKnBhY2thZ2UqLyBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbmN5Q29kZU5hdGl2ZShTdHJpbmcgbG9jYWxlKSB7CisgICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZUN1cnJlbmN5Q29kZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOworICAgIH0KKworICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQorICAgIC8qcGFja2FnZSovIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVuY3lDb2RlKFN0cmluZyBsb2NhbGUpIHsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIAogICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQotICAgIC8qcGFja2FnZSovIHN0YXRpYyBpbnQgZ2V0Q3VycmVuY3lGcmFjdGlvbkRpZ2l0c05hdGl2ZShTdHJpbmcgY3VycmVuY3lDb2RlKSB7CisgICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZyBnZXRDdXJyZW5jeURpc3BsYXlOYW1lKFN0cmluZyBsb2NhbGUsIFN0cmluZyBjdXJyZW5jeUNvZGUpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQorICAgIC8qcGFja2FnZSovIHN0YXRpYyBpbnQgZ2V0Q3VycmVuY3lGcmFjdGlvbkRpZ2l0cyhTdHJpbmcgY3VycmVuY3lDb2RlKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIEBMYXlvdXRsaWJEZWxlZ2F0ZQotICAgIC8qcGFja2FnZSovIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2xOYXRpdmUoU3RyaW5nIGxvY2FsZSwgU3RyaW5nIGN1cnJlbmN5Q29kZSkgeworICAgIC8qcGFja2FnZSovIHN0YXRpYyBTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIGxvY2FsZSwgU3RyaW5nIGN1cnJlbmN5Q29kZSkgewogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogCkBAIC0xMTQsNiArMTM0LDEyIEBACiAgICAgfQogCiAgICAgQExheW91dGxpYkRlbGVnYXRlCisgICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZyBhZGRMaWtlbHlTdWJ0YWdzKFN0cmluZyBsb2NhbGUpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKworCisgICAgQExheW91dGxpYkRlbGVnYXRlCiAgICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZ1tdIGdldElTT0xhbmd1YWdlc05hdGl2ZSgpIHsKICAgICAgICAgcmV0dXJuIExvY2FsZS5nZXRJU09MYW5ndWFnZXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlWG1sQmxvY2tQYXJzZXJUZXN0LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlWG1sQmxvY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggMzI1MmZiNDkuLjk2NDM2ZmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xheW91dGxpYi9icmlkZ2UvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VYbWxCbG9ja1BhcnNlclRlc3QuamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlWG1sQmxvY2tQYXJzZXJUZXN0LmphdmEKQEAgLTE2LDE0ICsxNiwxMSBAQAogCiBwYWNrYWdlIGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuYW5kcm9pZDsKIAotaW1wb3J0IGNvbS5hbmRyb2lkLmxheW91dGxpYi5icmlkZ2UuYW5kcm9pZC5CcmlkZ2VYbWxCbG9ja1BhcnNlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5sYXlvdXRsaWIuYnJpZGdlLmltcGwuUGFyc2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5reG1sMi5pby5LWG1sUGFyc2VyOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CiBpbXBvcnQgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcjsKIAotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKIHB1YmxpYyBjbGFzcyBCcmlkZ2VYbWxCbG9ja1BhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CkBAIC0zOSwxMiArMzYsMTIgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sQmxvY2tQYXJzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBuZXcgS1htbFBhcnNlcigpOwotICAgICAgICBwYXJzZXIgPSBuZXcgQnJpZGdlWG1sQmxvY2tQYXJzZXIocGFyc2VyLCBudWxsLCBmYWxzZSAvKiBwbGF0Zm9ybVJlc291cmNlRmxhZyAqLyk7CiAKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKAotICAgICAgICAgICAgImNvbS9hbmRyb2lkL2xheW91dGxpYi90ZXN0ZGF0YS9sYXlvdXQxLnhtbCIpOwotICAgICAgICBwYXJzZXIuc2V0SW5wdXQoaW5wdXQsIG51bGwgLyplbmNvZGluZyovKTsKKyAgICAgICAgWG1sUHVsbFBhcnNlciBwYXJzZXIgPSBQYXJzZXJGYWN0b3J5LmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImNvbS9hbmRyb2lkL2xheW91dGxpYi90ZXN0ZGF0YS9sYXlvdXQxLnhtbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgImxheW91dDEueG1sIik7CisKKyAgICAgICAgcGFyc2VyID0gbmV3IEJyaWRnZVhtbEJsb2NrUGFyc2VyKHBhcnNlciwgbnVsbCwgZmFsc2UgLyogcGxhdGZvcm1SZXNvdXJjZUZsYWcgKi8pOwogCiAgICAgICAgIGFzc2VydEVxdWFscyhYbWxQdWxsUGFyc2VyLlNUQVJUX0RPQ1VNRU5ULCBwYXJzZXIubmV4dCgpKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9zcmMvY29tL2FuZHJvaWQvdG9vbHMvbGF5b3V0bGliL2NyZWF0ZS9DcmVhdGVJbmZvLmphdmEgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NyZWF0ZUluZm8uamF2YQppbmRleCBlZmY2YmJjLi41YzYwMzE4IDEwMDY0NAotLS0gYS90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NyZWF0ZUluZm8uamF2YQorKysgYi90b29scy9sYXlvdXRsaWIvY3JlYXRlL3NyYy9jb20vYW5kcm9pZC90b29scy9sYXlvdXRsaWIvY3JlYXRlL0NyZWF0ZUluZm8uamF2YQpAQCAtOTksOCArOTksMTAgQEAKICAgICAgICAgImFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzJFRoZW1lI3Jlc29sdmVBdHRyaWJ1dGUiLAogICAgICAgICAiYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5I2ZpbmlzaERlY29kZSIsCiAgICAgICAgICJhbmRyb2lkLm9zLkhhbmRsZXIjc2VuZE1lc3NhZ2VBdFRpbWUiLAorICAgICAgICAiYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkI3J1biIsCiAgICAgICAgICJhbmRyb2lkLm9zLkJ1aWxkI2dldFN0cmluZyIsCiAgICAgICAgICJhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXIjckluZmxhdGUiLAorICAgICAgICAiYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyI3BhcnNlSW5jbHVkZSIsCiAgICAgICAgICJhbmRyb2lkLnZpZXcuVmlldyNpc0luRWRpdE1vZGUiLAogICAgICAgICAiY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5YbWxVdGlscyNjb252ZXJ0VmFsdWVUb0ludCIsCiAgICAgICAgIC8vIFRPRE86IGNvbW1lbnQgb3V0IG9uY2UgRGVsZWdhdGVDbGFzcyBpcyB3b3JraW5nCmRpZmYgLS1naXQgYS92b2lwL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NpcC9TaXBTZXJ2aWNlLmphdmEgYi92b2lwL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NpcC9TaXBTZXJ2aWNlLmphdmEKaW5kZXggZGM2Njk4OS4uNWFkNWQyNiAxMDA2NDQKLS0tIGEvdm9pcC9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9zaXAvU2lwU2VydmljZS5qYXZhCisrKyBiL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcFNlcnZpY2UuamF2YQpAQCAtNjAsNiArNjAsNyBAQAogaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwogaW1wb3J0IGphdmF4LnNpcC5TaXBFeGNlcHRpb247CiAKIC8qKgpAQCAtNjgsOCArNjksNyBAQAogcHVibGljIGZpbmFsIGNsYXNzIFNpcFNlcnZpY2UgZXh0ZW5kcyBJU2lwU2VydmljZS5TdHViIHsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTaXBTZXJ2aWNlIjsKICAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR1YgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19USU1FUiA9IERFQlVHICYmIGZhbHNlOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUElSWV9USU1FID0gMzYwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlRfRVhQSVJZX1RJTUUgPSAxMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0VYUElSWV9USU1FID0gNjA7CkBAIC03OCwxMiArNzgsMTMgQEAKICAgICBwcml2YXRlIFN0cmluZyBtTG9jYWxJcDsKICAgICBwcml2YXRlIFN0cmluZyBtTmV0d29ya1R5cGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0ZWQ7Ci0gICAgcHJpdmF0ZSBXYWtldXBUaW1lciBtVGltZXI7CisgICAgcHJpdmF0ZSBTaXBXYWtldXBUaW1lciBtVGltZXI7CiAgICAgcHJpdmF0ZSBXaWZpU2NhblByb2Nlc3MgbVdpZmlTY2FuUHJvY2VzczsKICAgICBwcml2YXRlIFdpZmlNYW5hZ2VyLldpZmlMb2NrIG1XaWZpTG9jazsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdpZmlPbmx5OworICAgIHByaXZhdGUgSW50ZXJ2YWxNZWFzdXJlbWVudFByb2Nlc3MgbUludGVydmFsTWVhc3VyZW1lbnRQcm9jZXNzOwogCi0gICAgcHJpdmF0ZSBNeUV4ZWN1dG9yIG1FeGVjdXRvcjsKKyAgICBwcml2YXRlIE15RXhlY3V0b3IgbUV4ZWN1dG9yID0gbmV3IE15RXhlY3V0b3IoKTsKIAogICAgIC8vIFNpcFByb2ZpbGUgVVJJIC0tPiBncm91cAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgU2lwU2Vzc2lvbkdyb3VwRXh0PiBtU2lwR3JvdXBzID0KQEAgLTk2LDYgKzk3LDcgQEAKICAgICBwcml2YXRlIENvbm5lY3Rpdml0eVJlY2VpdmVyIG1Db25uZWN0aXZpdHlSZWNlaXZlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gbVdpZmlFbmFibGVkOwogICAgIHByaXZhdGUgU2lwV2FrZUxvY2sgbU15V2FrZUxvY2s7CisgICAgcHJpdmF0ZSBpbnQgbUtlZXBBbGl2ZUludGVydmFsOwogCiAgICAgLyoqCiAgICAgICogU3RhcnRzIHRoZSBTSVAgc2VydmljZS4gRG8gbm90aGluZyBpZiB0aGUgU0lQIEFQSSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZQpAQCAtMTE2LDcgKzExOCw3IEBACiAgICAgICAgIG1NeVdha2VMb2NrID0gbmV3IFNpcFdha2VMb2NrKChQb3dlck1hbmFnZXIpCiAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuUE9XRVJfU0VSVklDRSkpOwogCi0gICAgICAgIG1UaW1lciA9IG5ldyBXYWtldXBUaW1lcihjb250ZXh0KTsKKyAgICAgICAgbVRpbWVyID0gbmV3IFNpcFdha2V1cFRpbWVyKGNvbnRleHQsIG1FeGVjdXRvcik7CiAgICAgICAgIG1XaWZpT25seSA9IFNpcE1hbmFnZXIuaXNTaXBXaWZpT25seShjb250ZXh0KTsKICAgICB9CiAKQEAgLTE1NywxMiArMTU5LDYgQEAKICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICIgLS0tIHVucmVnaXN0ZXIgcmVjZWl2ZXJzIik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBNeUV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotICAgICAgICAvLyBjcmVhdGUgbUV4ZWN1dG9yIGxhemlseQotICAgICAgICBpZiAobUV4ZWN1dG9yID09IG51bGwpIG1FeGVjdXRvciA9IG5ldyBNeUV4ZWN1dG9yKCk7Ci0gICAgICAgIHJldHVybiBtRXhlY3V0b3I7Ci0gICAgfQotCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTaXBQcm9maWxlW10gZ2V0TGlzdE9mUHJvZmlsZXMoKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBhbmRyb2lkLk1hbmlmZXN0LnBlcm1pc3Npb24uVVNFX1NJUCwgbnVsbCk7CkBAIC00NDEsMTIgKzQzNywxNCBAQAogCiAgICAgICAgICAgICBpZiAoY29ubmVjdGVkKSB7CiAgICAgICAgICAgICAgICAgbUxvY2FsSXAgPSBkZXRlcm1pbmVMb2NhbElwKCk7CisgICAgICAgICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsID0gLTE7CiAgICAgICAgICAgICAgICAgZm9yIChTaXBTZXNzaW9uR3JvdXBFeHQgZ3JvdXAgOiBtU2lwR3JvdXBzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGdyb3VwLm9uQ29ubmVjdGl2aXR5Q2hhbmdlZCh0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGlzV2lmaSAmJiAobVdpZmlMb2NrICE9IG51bGwpKSBzdG9wV2lmaVNjYW5uZXIoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbU15V2FrZUxvY2sucmVzZXQoKTsgLy8gaW4gY2FzZSB0aGVyZSdzIGEgbGVhaworICAgICAgICAgICAgICAgIHN0b3BQb3J0TWFwcGluZ01lYXN1cmVtZW50KCk7CiAgICAgICAgICAgICAgICAgaWYgKGlzV2lmaSAmJiAobVdpZmlMb2NrICE9IG51bGwpKSBzdGFydFdpZmlTY2FubmVyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKFNpcEV4Y2VwdGlvbiBlKSB7CkBAIC00NTQsNiArNDUyLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgc3RvcFBvcnRNYXBwaW5nTWVhc3VyZW1lbnQoKSB7CisgICAgICAgIGlmIChtSW50ZXJ2YWxNZWFzdXJlbWVudFByb2Nlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgbUludGVydmFsTWVhc3VyZW1lbnRQcm9jZXNzLnN0b3AoKTsKKyAgICAgICAgICAgIG1JbnRlcnZhbE1lYXN1cmVtZW50UHJvY2VzcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRQb3J0TWFwcGluZ0xpZmV0aW1lTWVhc3VyZW1lbnQoU2lwU2Vzc2lvbkdyb3VwIGdyb3VwKSB7CisgICAgICAgIG1JbnRlcnZhbE1lYXN1cmVtZW50UHJvY2VzcyA9IG5ldyBJbnRlcnZhbE1lYXN1cmVtZW50UHJvY2Vzcyhncm91cCk7CisgICAgICAgIG1JbnRlcnZhbE1lYXN1cmVtZW50UHJvY2Vzcy5zdGFydCgpOworICAgIH0KKwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUGVuZGluZ1Nlc3Npb24oSVNpcFNlc3Npb24gc2Vzc2lvbikgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2xlYW5VcFBlbmRpbmdTZXNzaW9ucygpOwpAQCAtNjg3LDYgKzY5Nyw5MyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBjbGFzcyBJbnRlcnZhbE1lYXN1cmVtZW50UHJvY2VzcyBleHRlbmRzIFNpcFNlc3Npb25BZGFwdGVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJcXElOVEVSVkFMLyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSU5URVJWQUwgPSAxMjA7IC8vIHNlY29uZHMKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9JTlRFUlZBTCA9IFNIT1JUX0VYUElSWV9USU1FOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFTU19USFJFU0hPTEQgPSA2OworICAgICAgICBwcml2YXRlIFNpcFNlc3Npb25Hcm91cEV4dCBtR3JvdXA7CisgICAgICAgIHByaXZhdGUgU2lwU2Vzc2lvbkdyb3VwLlNpcFNlc3Npb25JbXBsIG1TZXNzaW9uOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJ1bm5pbmc7CisgICAgICAgIHByaXZhdGUgaW50IG1NaW5JbnRlcnZhbCA9IDEwOworICAgICAgICBwcml2YXRlIGludCBtTWF4SW50ZXJ2YWwgPSBNQVhfSU5URVJWQUw7CisgICAgICAgIHByaXZhdGUgaW50IG1JbnRlcnZhbCA9IE1BWF9JTlRFUlZBTCAvIDI7CisgICAgICAgIHByaXZhdGUgaW50IG1QYXNzQ291bnRlciA9IDA7CisgICAgICAgIHByaXZhdGUgU2lwV2FrZXVwVGltZXIgbVRpbWVyID0gbmV3IFNpcFdha2V1cFRpbWVyKG1Db250ZXh0LCBtRXhlY3V0b3IpOworICAgICAgICAvLyBUT0RPOiBmaXggU2lwV2FrZXVwVGltZXIgc28gdGhhdCB3ZSBvbmx5IHVzZSBvbmUgaW5zdGFuY2Ugb2YgdGhlIHRpbWVyCisKKyAgICAgICAgcHVibGljIEludGVydmFsTWVhc3VyZW1lbnRQcm9jZXNzKFNpcFNlc3Npb25Hcm91cCBncm91cCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtR3JvdXAgPSAgbmV3IFNpcFNlc3Npb25Hcm91cEV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmdldExvY2FsUHJvZmlsZSgpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbiA9IChTaXBTZXNzaW9uR3JvdXAuU2lwU2Vzc2lvbkltcGwpCisgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXAuY3JlYXRlU2Vzc2lvbih0aGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3RhcnQgaW50ZXJ2YWwgbWVhc3VyZW1lbnQgZXJyb3I6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgaWYgKG1SdW5uaW5nKSByZXR1cm47CisgICAgICAgICAgICBtUnVubmluZyA9IHRydWU7CisgICAgICAgICAgICBtVGltZXIuc2V0KG1JbnRlcnZhbCAqIDEwMDAsIHRoaXMpOworICAgICAgICAgICAgaWYgKERFQlVHVikgTG9nLnYoVEFHLCAic3RhcnQgaW50ZXJ2YWwgbWVhc3VyZW1lbnQiKTsKKyAgICAgICAgICAgIHJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlc3RhcnQoKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKHRoaXMpOworICAgICAgICAgICAgbVRpbWVyLnNldChtSW50ZXJ2YWwgKiAxMDAwLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjYWxjdWxhdGVOZXdJbnRlcnZhbCgpIHsKKyAgICAgICAgICAgIGlmICghbVNlc3Npb24uaXNSZVJlZ2lzdGVyUmVxdWlyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICgrK21QYXNzQ291bnRlciAhPSBQQVNTX1RIUkVTSE9MRCkgcmV0dXJuOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaW50ZXJ2YWwsIHNpbmNlIHRoZSBjdXJyZW50IGludGVydmFsIGlzIGdvb2QgdG8KKyAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZSBwb3J0IG1hcHBpbmcuCisgICAgICAgICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsID0gbU1pbkludGVydmFsID0gbUludGVydmFsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgcnBvcnQgaXMgY2hhbmdlZCwgc2hvcnRlbiB0aGUgaW50ZXJ2YWwuCisgICAgICAgICAgICAgICAgbVNlc3Npb24uY2xlYXJSZVJlZ2lzdGVyUmVxdWlyZWQoKTsKKyAgICAgICAgICAgICAgICBtTWF4SW50ZXJ2YWwgPSBtSW50ZXJ2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKG1NYXhJbnRlcnZhbCAtIG1NaW5JbnRlcnZhbCkgPCBNSU5fSU5URVJWQUwpIHsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbUtlZXBBbGl2ZUludGVydmFsIGFuZCBzdG9wIG1lYXN1cmVtZW50LgorICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWwgPSBtTWluSW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHVikgTG9nLnYoVEFHLCAibWVhc3VyZWQgaW50ZXJ2YWw6ICIgKyBtS2VlcEFsaXZlSW50ZXJ2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIG5ldyBpbnRlcnZhbCBhbmQgY29udGludWUuCisgICAgICAgICAgICAgICAgbUludGVydmFsID0gKG1NYXhJbnRlcnZhbCArIG1NaW5JbnRlcnZhbCkgLyAyOworICAgICAgICAgICAgICAgIG1QYXNzQ291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHVikgeworICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICIgY3VycmVudCBpbnRlcnZhbDogIiArIG1LZWVwQWxpdmVJbnRlcnZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRlc3QgbmV3IGludGVydmFsOiAiICsgbUludGVydmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChTaXBTZXJ2aWNlLnRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1SdW5uaW5nKSByZXR1cm47CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVNlc3Npb24uc2VuZEtlZXBBbGl2ZSgpOworICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVOZXdJbnRlcnZhbCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiaW50ZXJ2YWwgbWVhc3VyZW1lbnQgZXJyb3I6ICIgKyB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBLZWVwQWxpdmVQcm9jZXNzIGlzIGNvbnRyb2xsZWQgYnkgQXV0b1JlZ2lzdHJhdGlvblByb2Nlc3MuCiAgICAgLy8gQWxsIG1ldGhvZHMgd2lsbCBiZSBpbnZva2VkIGluIHN5bmMgd2l0aCBTaXBTZXJ2aWNlLnRoaXMuCiAgICAgcHJpdmF0ZSBjbGFzcyBLZWVwQWxpdmVQcm9jZXNzIGltcGxlbWVudHMgUnVubmFibGUgewpAQCAtNjk0LDYgKzc5MSw3IEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlRFUlZBTCA9IDEwOwogICAgICAgICBwcml2YXRlIFNpcFNlc3Npb25Hcm91cC5TaXBTZXNzaW9uSW1wbCBtU2Vzc2lvbjsKICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgaW50IG1JbnRlcnZhbCA9IElOVEVSVkFMOwogCiAgICAgICAgIHB1YmxpYyBLZWVwQWxpdmVQcm9jZXNzKFNpcFNlc3Npb25Hcm91cC5TaXBTZXNzaW9uSW1wbCBzZXNzaW9uKSB7CiAgICAgICAgICAgICBtU2Vzc2lvbiA9IHNlc3Npb247CkBAIC03MDUsNiArODAzLDEyIEBACiAgICAgICAgICAgICBtVGltZXIuc2V0KElOVEVSVkFMICogMTAwMCwgdGhpcyk7CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgcmVzdGFydChpbnQgZHVyYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiUmVmcmVzaCBOQVQgcG9ydCBtYXBwaW5nICIgKyBkdXJhdGlvbiArICJzIGxhdGVyLiIpOworICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCh0aGlzKTsKKyAgICAgICAgICAgIG1UaW1lci5zZXQoZHVyYXRpb24gKiAxMDAwLCB0aGlzKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHRpbWVvdXQgaGFuZGxlcgogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFNpcFNlcnZpY2UudGhpcykgewpAQCAtNzIxLDYgKzgyNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbU15V2FrZUxvY2suYWNxdWlyZShtU2Vzc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5yZWdpc3RlcihFWFBJUllfVElNRSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1LZWVwQWxpdmVJbnRlcnZhbCA+IG1JbnRlcnZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUludGVydmFsID0gbUtlZXBBbGl2ZUludGVydmFsOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdGFydChtSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAia2VlcGFsaXZlIGVycm9yOiAiICsgdCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzYxLDYgKzg2OSwxNyBAQAogICAgICAgICAgICAgICAgIC8vIHJldHVybiByaWdodCBhd2F5IGlmIG5vIGFjdGl2ZSBuZXR3b3JrIGNvbm5lY3Rpb24uCiAgICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uID09IG51bGwpIHJldHVybjsKIAorICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU2lwU2VydmljZS50aGlzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0JlaGluZE5BVChtTG9jYWxJcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUludGVydmFsTWVhc3VyZW1lbnRQcm9jZXNzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1LZWVwQWxpdmVJbnRlcnZhbCA9PSAtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGtlZXAtYWxpdmUgaW50ZXJ2YWwgbWVhc3VyZW1lbnQsIGhlcmUgd2UgYWxsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBwcm9maWxlIG9ubHkgYXMgdGhlIHRhcmdldCBzZXJ2aWNlIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBtZWFzdXJlIHRoZSBsaWZlIHRpbWUgb2YgTkFUIHBvcnQgbWFwcGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9ydE1hcHBpbmdMaWZldGltZU1lYXN1cmVtZW50KGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHVucmVnaXN0cmF0aW9uIHRvIGNsZWFyIHVwIG9sZCByZWdpc3RyYXRpb24gYXQgc2VydmVyCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogd2hlbiByZmM1NjI2IGlzIGRlcGxveWVkLCB1c2UgcmVnLWlkIGFuZCBzaXAuaW5zdGFuY2UKICAgICAgICAgICAgICAgICAvLyBpbiByZWdpc3RyYXRpb24gdG8gYXZvaWQgYWRkaW5nIGR1cGxpY2F0ZSBlbnRyaWVzIHRvIHNlcnZlcgpAQCAtOTk4LDcgKzExMTcsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgSW50ZW50IGludGVudCkgewogICAgICAgICAgICAgLy8gUnVuIHRoZSBoYW5kbGVyIGluIE15RXhlY3V0b3IgdG8gYmUgcHJvdGVjdGVkIGJ5IHdha2UgbG9jawotICAgICAgICAgICAgZ2V0RXhlY3V0b3IoKS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIG1FeGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgIG9uUmVjZWl2ZUludGVybmFsKGNvbnRleHQsIGludGVudCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTEwMiw3ICsxMjIxLDcgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgICAgIC8vIGRlbGVnYXRlIHRvIG1FeGVjdXRvcgotICAgICAgICAgICAgICAgIGdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZWFsUnVuKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTExMjcsMzAwICsxMjQ2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRpbWVyIHRoYXQgY2FuIHNjaGVkdWxlIGV2ZW50cyB0byBvY2N1ciBldmVuIHdoZW4gdGhlIGRldmljZSBpcyBpbiBzbGVlcC4KLSAgICAgKiBPbmx5IHVzZWQgaW50ZXJuYWxseSBpbiB0aGlzIHBhY2thZ2UuCi0gICAgICovCi0gICAgY2xhc3MgV2FrZXVwVGltZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiX1NJUC5Xa1RpbWVyXyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUklHR0VSX1RJTUUgPSAiVHJpZ2dlclRpbWUiOwotCi0gICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKLQotICAgICAgICAvLyBydW5uYWJsZSAtLT4gdGltZSB0byBleGVjdXRlIGluIFN5c3RlbUNsb2NrCi0gICAgICAgIHByaXZhdGUgVHJlZVNldDxNeUV2ZW50PiBtRXZlbnRRdWV1ZSA9Ci0gICAgICAgICAgICAgICAgbmV3IFRyZWVTZXQ8TXlFdmVudD4obmV3IE15RXZlbnRDb21wYXJhdG9yKCkpOwotCi0gICAgICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtUGVuZGluZ0ludGVudDsKLQotICAgICAgICBwdWJsaWMgV2FrZXVwVGltZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICBtQWxhcm1NYW5hZ2VyID0gKEFsYXJtTWFuYWdlcikKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUxBUk1fU0VSVklDRSk7Ci0KLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKGdldEFjdGlvbigpKTsKLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcih0aGlzLCBmaWx0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0b3BzIHRoZSB0aW1lci4gTm8gZXZlbnQgY2FuIGJlIHNjaGVkdWxlZCBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcih0aGlzKTsKLSAgICAgICAgICAgIGlmIChtUGVuZGluZ0ludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5jYW5jZWwobVBlbmRpbmdJbnRlbnQpOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nSW50ZW50ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1FdmVudFF1ZXVlLmNsZWFyKCk7Ci0gICAgICAgICAgICBtRXZlbnRRdWV1ZSA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIHN0b3BwZWQoKSB7Ci0gICAgICAgICAgICBpZiAobUV2ZW50UXVldWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlRpbWVyIHN0b3BwZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFsYXJtKCkgewotICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5jYW5jZWwobVBlbmRpbmdJbnRlbnQpOwotICAgICAgICAgICAgbVBlbmRpbmdJbnRlbnQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlY2FsY3VsYXRlUGVyaW9kcygpIHsKLSAgICAgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHJldHVybjsKLQotICAgICAgICAgICAgTXlFdmVudCBmaXJzdEV2ZW50ID0gbUV2ZW50UXVldWUuZmlyc3QoKTsKLSAgICAgICAgICAgIGludCBtaW5QZXJpb2QgPSBmaXJzdEV2ZW50Lm1NYXhQZXJpb2Q7Ci0gICAgICAgICAgICBsb25nIG1pblRyaWdnZXJUaW1lID0gZmlyc3RFdmVudC5tVHJpZ2dlclRpbWU7Ci0gICAgICAgICAgICBmb3IgKE15RXZlbnQgZSA6IG1FdmVudFF1ZXVlKSB7Ci0gICAgICAgICAgICAgICAgZS5tUGVyaW9kID0gZS5tTWF4UGVyaW9kIC8gbWluUGVyaW9kICogbWluUGVyaW9kOwotICAgICAgICAgICAgICAgIGludCBpbnRlcnZhbCA9IChpbnQpIChlLm1MYXN0VHJpZ2dlclRpbWUgKyBlLm1NYXhQZXJpb2QKLSAgICAgICAgICAgICAgICAgICAgICAgIC0gbWluVHJpZ2dlclRpbWUpOwotICAgICAgICAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgLyBtaW5QZXJpb2QgKiBtaW5QZXJpb2Q7Ci0gICAgICAgICAgICAgICAgZS5tVHJpZ2dlclRpbWUgPSBtaW5UcmlnZ2VyVGltZSArIGludGVydmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJlZVNldDxNeUV2ZW50PiBuZXdRdWV1ZSA9IG5ldyBUcmVlU2V0PE15RXZlbnQ+KAotICAgICAgICAgICAgICAgICAgICBtRXZlbnRRdWV1ZS5jb21wYXJhdG9yKCkpOwotICAgICAgICAgICAgbmV3UXVldWUuYWRkQWxsKChDb2xsZWN0aW9uPE15RXZlbnQ+KSBtRXZlbnRRdWV1ZSk7Ci0gICAgICAgICAgICBtRXZlbnRRdWV1ZS5jbGVhcigpOwotICAgICAgICAgICAgbUV2ZW50UXVldWUgPSBuZXdRdWV1ZTsKLSAgICAgICAgICAgIGlmIChERUJVR19USU1FUikgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInF1ZXVlIHJlLWNhbGN1bGF0ZWQiKTsKLSAgICAgICAgICAgICAgICBwcmludFF1ZXVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEZXRlcm1pbmVzIHRoZSBwZXJpb2QgYW5kIHRoZSB0cmlnZ2VyIHRpbWUgb2YgdGhlIG5ldyBldmVudCBhbmQgaW5zZXJ0IGl0Ci0gICAgICAgIC8vIHRvIHRoZSBxdWV1ZS4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluc2VydEV2ZW50KE15RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICBpZiAobUV2ZW50UXVldWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnQubVRyaWdnZXJUaW1lID0gbm93ICsgZXZlbnQubVBlcmlvZDsKLSAgICAgICAgICAgICAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE15RXZlbnQgZmlyc3RFdmVudCA9IG1FdmVudFF1ZXVlLmZpcnN0KCk7Ci0gICAgICAgICAgICBpbnQgbWluUGVyaW9kID0gZmlyc3RFdmVudC5tUGVyaW9kOwotICAgICAgICAgICAgaWYgKG1pblBlcmlvZCA8PSBldmVudC5tTWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgZXZlbnQubVBlcmlvZCA9IGV2ZW50Lm1NYXhQZXJpb2QgLyBtaW5QZXJpb2QgKiBtaW5QZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaW50IGludGVydmFsID0gZXZlbnQubU1heFBlcmlvZDsKLSAgICAgICAgICAgICAgICBpbnRlcnZhbCAtPSAoaW50KSAoZmlyc3RFdmVudC5tVHJpZ2dlclRpbWUgLSBub3cpOwotICAgICAgICAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgLyBtaW5QZXJpb2QgKiBtaW5QZXJpb2Q7Ci0gICAgICAgICAgICAgICAgZXZlbnQubVRyaWdnZXJUaW1lID0gZmlyc3RFdmVudC5tVHJpZ2dlclRpbWUgKyBpbnRlcnZhbDsKLSAgICAgICAgICAgICAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gbm93ICsgZXZlbnQubVBlcmlvZDsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RFdmVudC5tVHJpZ2dlclRpbWUgPCB0cmlnZ2VyVGltZSkgewotICAgICAgICAgICAgICAgICAgICBldmVudC5tVHJpZ2dlclRpbWUgPSBmaXJzdEV2ZW50Lm1UcmlnZ2VyVGltZTsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQubUxhc3RUcmlnZ2VyVGltZSAtPSBldmVudC5tUGVyaW9kOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm1UcmlnZ2VyVGltZSA9IHRyaWdnZXJUaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnQpOwotICAgICAgICAgICAgICAgIHJlY2FsY3VsYXRlUGVyaW9kcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBwZXJpb2RpYyB0aW1lci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBlcmlvZCB0aGUgdGltZXIgcGVyaW9kOyBpbiBtaWxsaS1zZWNvbmQKLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIGlzIGNhbGxlZCBiYWNrIHdoZW4gdGhlIHRpbWVyIGdvZXMgb2ZmOyB0aGUgc2FtZSBjYWxsYmFjawotICAgICAgICAgKiAgICAgIGNhbiBiZSBzcGVjaWZpZWQgaW4gbXVsdGlwbGUgdGltZXIgZXZlbnRzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0KGludCBwZXJpb2QsIFJ1bm5hYmxlIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoc3RvcHBlZCgpKSByZXR1cm47Ci0KLSAgICAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7Ci0gICAgICAgICAgICBNeUV2ZW50IGV2ZW50ID0gbmV3IE15RXZlbnQocGVyaW9kLCBjYWxsYmFjaywgbm93KTsKLSAgICAgICAgICAgIGluc2VydEV2ZW50KGV2ZW50KTsKLQotICAgICAgICAgICAgaWYgKG1FdmVudFF1ZXVlLmZpcnN0KCkgPT0gZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAobUV2ZW50UXVldWUuc2l6ZSgpID4gMSkgY2FuY2VsQWxhcm0oKTsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZU5leHQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9uZyB0cmlnZ2VyVGltZSA9IGV2ZW50Lm1UcmlnZ2VyVGltZTsKLSAgICAgICAgICAgIGlmIChERUJVR19USU1FUikgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIiBhZGQgZXZlbnQgIiArIGV2ZW50ICsgIiBzY2hlZHVsZWQgYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBzaG93VGltZSh0cmlnZ2VyVGltZSkgKyAiIGF0ICIgKyBzaG93VGltZShub3cpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsICNldmVudHM9IiArIG1FdmVudFF1ZXVlLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRRdWV1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbmNlbHMgYWxsIHRoZSB0aW1lciBldmVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2FuY2VsKFJ1bm5hYmxlIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoc3RvcHBlZCgpIHx8IG1FdmVudFF1ZXVlLmlzRW1wdHkoKSkgcmV0dXJuOwotICAgICAgICAgICAgaWYgKERFQlVHX1RJTUVSKSBMb2cuZChUQUcsICJjYW5jZWw6IiArIGNhbGxiYWNrKTsKLQotICAgICAgICAgICAgTXlFdmVudCBmaXJzdEV2ZW50ID0gbUV2ZW50UXVldWUuZmlyc3QoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8TXlFdmVudD4gaXRlciA9IG1FdmVudFF1ZXVlLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIE15RXZlbnQgZXZlbnQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19USU1FUikgTG9nLmQoVEFHLCAiICAgIGNhbmNlbCBmb3VuZDoiICsgZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxBbGFybSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtRXZlbnRRdWV1ZS5maXJzdCgpICE9IGZpcnN0RXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxBbGFybSgpOwotICAgICAgICAgICAgICAgIGZpcnN0RXZlbnQgPSBtRXZlbnRRdWV1ZS5maXJzdCgpOwotICAgICAgICAgICAgICAgIGZpcnN0RXZlbnQubVBlcmlvZCA9IGZpcnN0RXZlbnQubU1heFBlcmlvZDsKLSAgICAgICAgICAgICAgICBmaXJzdEV2ZW50Lm1UcmlnZ2VyVGltZSA9IGZpcnN0RXZlbnQubUxhc3RUcmlnZ2VyVGltZQotICAgICAgICAgICAgICAgICAgICAgICAgKyBmaXJzdEV2ZW50Lm1QZXJpb2Q7Ci0gICAgICAgICAgICAgICAgcmVjYWxjdWxhdGVQZXJpb2RzKCk7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVOZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUdfVElNRVIpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZnRlciBjYW5jZWw6Iik7Ci0gICAgICAgICAgICAgICAgcHJpbnRRdWV1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlTmV4dCgpIHsKLSAgICAgICAgICAgIGlmIChzdG9wcGVkKCkgfHwgbUV2ZW50UXVldWUuaXNFbXB0eSgpKSByZXR1cm47Ci0KLSAgICAgICAgICAgIGlmIChtUGVuZGluZ0ludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBlbmRpbmdJbnRlbnQgaXMgbm90IG51bGwhIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE15RXZlbnQgZXZlbnQgPSBtRXZlbnRRdWV1ZS5maXJzdCgpOwotICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoZ2V0QWN0aW9uKCkpOwotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFRSSUdHRVJfVElNRSwgZXZlbnQubVRyaWdnZXJUaW1lKTsKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgcGVuZGluZ0ludGVudCA9IG1QZW5kaW5nSW50ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIDAsIGludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50LkZMQUdfVVBEQVRFX0NVUlJFTlQpOwotICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXQoQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLAotICAgICAgICAgICAgICAgICAgICBldmVudC5tVHJpZ2dlclRpbWUsIHBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgYWxyZWFkeSBwcm90ZWN0ZWQgYnkgQWxhcm1NYW5hZ2VyJ3Mgd2FrZSBsb2NrLgotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChnZXRBY3Rpb24oKS5lcXVhbHMoYWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAmJiBpbnRlbnQuZ2V0RXh0cmFzKCkuY29udGFpbnNLZXkoVFJJR0dFUl9USU1FKSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nSW50ZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gaW50ZW50LmdldExvbmdFeHRyYShUUklHR0VSX1RJTUUsIC0xTCk7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZSh0cmlnZ2VyVGltZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInVucmVjb2duaXplZCBpbnRlbnQ6ICIgKyBpbnRlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50UXVldWUoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChNeUV2ZW50IGV2ZW50IDogbUV2ZW50UXVldWUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICIgICAgICIgKyBldmVudCArICI6IHNjaGVkdWxlZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIHNob3dUaW1lKGV2ZW50Lm1UcmlnZ2VyVGltZSkgKyAiOiBsYXN0IGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc2hvd1RpbWUoZXZlbnQubUxhc3RUcmlnZ2VyVGltZSkpOwotICAgICAgICAgICAgICAgIGlmICgrK2NvdW50ID49IDUpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1FdmVudFF1ZXVlLnNpemUoKSA+IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICAgICAuLi4uLiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiICAgICA8ZW1wdHk+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGV4ZWN1dGUobG9uZyB0cmlnZ2VyVGltZSkgewotICAgICAgICAgICAgaWYgKERFQlVHX1RJTUVSKSBMb2cuZChUQUcsICJ0aW1lJ3MgdXAsIHRyaWdnZXJUaW1lID0gIgotICAgICAgICAgICAgICAgICAgICArIHNob3dUaW1lKHRyaWdnZXJUaW1lKSArICI6ICIgKyBtRXZlbnRRdWV1ZS5zaXplKCkpOwotICAgICAgICAgICAgaWYgKHN0b3BwZWQoKSB8fCBtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHJldHVybjsKLQotICAgICAgICAgICAgZm9yIChNeUV2ZW50IGV2ZW50IDogbUV2ZW50UXVldWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQubVRyaWdnZXJUaW1lICE9IHRyaWdnZXJUaW1lKSBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUdfVElNRVIpIExvZy5kKFRBRywgImV4ZWN1dGUgIiArIGV2ZW50KTsKLQotICAgICAgICAgICAgICAgIGV2ZW50Lm1MYXN0VHJpZ2dlclRpbWUgPSBldmVudC5tVHJpZ2dlclRpbWU7Ci0gICAgICAgICAgICAgICAgZXZlbnQubVRyaWdnZXJUaW1lICs9IGV2ZW50Lm1QZXJpb2Q7Ci0KLSAgICAgICAgICAgICAgICAvLyBydW4gdGhlIGNhbGxiYWNrIGluIHRoZSBoYW5kbGVyIHRocmVhZCB0byBwcmV2ZW50IGRlYWRsb2NrCi0gICAgICAgICAgICAgICAgZ2V0RXhlY3V0b3IoKS5leGVjdXRlKGV2ZW50Lm1DYWxsYmFjayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUdfVElNRVIpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJhZnRlciB0aW1lb3V0IGV4ZWN1dGlvbiIpOwotICAgICAgICAgICAgICAgIHByaW50UXVldWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjaGVkdWxlTmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBzaG93VGltZShsb25nIHRpbWUpIHsKLSAgICAgICAgICAgIGludCBtcyA9IChpbnQpICh0aW1lICUgMTAwMCk7Ci0gICAgICAgICAgICBpbnQgcyA9IChpbnQpICh0aW1lIC8gMTAwMCk7Ci0gICAgICAgICAgICBpbnQgbSA9IHMgLyA2MDsKLSAgICAgICAgICAgIHMgJT0gNjA7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJWQuJWQuJWQiLCBtLCBzLCBtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV2ZW50IHsKLSAgICAgICAgaW50IG1QZXJpb2Q7Ci0gICAgICAgIGludCBtTWF4UGVyaW9kOwotICAgICAgICBsb25nIG1UcmlnZ2VyVGltZTsKLSAgICAgICAgbG9uZyBtTGFzdFRyaWdnZXJUaW1lOwotICAgICAgICBSdW5uYWJsZSBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgTXlFdmVudChpbnQgcGVyaW9kLCBSdW5uYWJsZSBjYWxsYmFjaywgbG9uZyBub3cpIHsKLSAgICAgICAgICAgIG1QZXJpb2QgPSBtTWF4UGVyaW9kID0gcGVyaW9kOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICBtTGFzdFRyaWdnZXJUaW1lID0gbm93OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IHN1cGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcocy5pbmRleE9mKCJAIikpOwotICAgICAgICAgICAgcmV0dXJuIHMgKyAiOiIgKyAobVBlcmlvZCAvIDEwMDApICsgIjoiICsgKG1NYXhQZXJpb2QgLyAxMDAwKSArICI6IgotICAgICAgICAgICAgICAgICAgICArIHRvU3RyaW5nKG1DYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhPYmplY3QgbykgewotICAgICAgICAgICAgU3RyaW5nIHMgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBzLmluZGV4T2YoIiQiKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHMgPSBzLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAgICAgcmV0dXJuIHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUV2ZW50Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TXlFdmVudD4gewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTXlFdmVudCBlMSwgTXlFdmVudCBlMikgewotICAgICAgICAgICAgaWYgKGUxID09IGUyKSByZXR1cm4gMDsKLSAgICAgICAgICAgIGludCBkaWZmID0gZTEubU1heFBlcmlvZCAtIGUyLm1NYXhQZXJpb2Q7Ci0gICAgICAgICAgICBpZiAoZGlmZiA9PSAwKSBkaWZmID0gLTE7Ci0gICAgICAgICAgICByZXR1cm4gZGlmZjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgewotICAgICAgICAgICAgcmV0dXJuICh0aGlzID09IHRoYXQpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgTG9vcGVyIGNyZWF0ZUxvb3BlcigpIHsKICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2lwU2VydmljZS5FeGVjdXRvciIpOwogICAgICAgICB0aHJlYWQuc3RhcnQoKTsKQEAgLTE0MjksMTIgKzEyNTQsMTMgQEAKIAogICAgIC8vIEV4ZWN1dGVzIGltbWVkaWF0ZSB0YXNrcyBpbiBhIHNpbmdsZSB0aHJlYWQuCiAgICAgLy8gSG9sZC9yZWxlYXNlIHdha2UgbG9jayBmb3IgcnVubmluZyB0YXNrcwotICAgIHByaXZhdGUgY2xhc3MgTXlFeGVjdXRvciBleHRlbmRzIEhhbmRsZXIgeworICAgIHByaXZhdGUgY2xhc3MgTXlFeGVjdXRvciBleHRlbmRzIEhhbmRsZXIgaW1wbGVtZW50cyBFeGVjdXRvciB7CiAgICAgICAgIE15RXhlY3V0b3IoKSB7CiAgICAgICAgICAgICBzdXBlcihjcmVhdGVMb29wZXIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkIGV4ZWN1dGUoUnVubmFibGUgdGFzaykgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSB0YXNrKSB7CiAgICAgICAgICAgICBtTXlXYWtlTG9jay5hY3F1aXJlKHRhc2spOwogICAgICAgICAgICAgTWVzc2FnZS5vYnRhaW4odGhpcywgMC8qIGRvbid0IGNhcmUgKi8sIHRhc2spLnNlbmRUb1RhcmdldCgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS92b2lwL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NpcC9TaXBTZXNzaW9uR3JvdXAuamF2YSBiL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcFNlc3Npb25Hcm91cC5qYXZhCmluZGV4IGFhNjE2YTkuLjQ4MzdlYjkgMTAwNjQ0Ci0tLSBhL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcFNlc3Npb25Hcm91cC5qYXZhCisrKyBiL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcFNlc3Npb25Hcm91cC5qYXZhCkBAIC0zOTcsNyArMzk3LDcgQEAKIAogICAgICAgICAvLyBmb3IgcmVnaXN0cmF0aW9uCiAgICAgICAgIGJvb2xlYW4gbVJlUmVnaXN0ZXJGbGFnID0gZmFsc2U7Ci0gICAgICAgIGludCBtUlBvcnQ7CisgICAgICAgIGludCBtUlBvcnQgPSAwOwogCiAgICAgICAgIC8vIGxpZ2h0d2VpZ2h0IHRpbWVyCiAgICAgICAgIGNsYXNzIFNlc3Npb25UaW1lciB7CkBAIC00NDcsNyArNDQ3LDYgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IFNpcFNlc3Npb24uU3RhdGUuUkVBRFlfVE9fQ0FMTDsKICAgICAgICAgICAgIG1JbnZpdGVSZWNlaXZlZCA9IG51bGw7CiAgICAgICAgICAgICBtUGVlclNlc3Npb25EZXNjcmlwdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICBtUlBvcnQgPSAwOwogICAgICAgICAgICAgbUF1dGhlbnRpY2F0aW9uUmV0cnlDb3VudCA9IDA7CiAKICAgICAgICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIG1EaWFsb2cuZGVsZXRlKCk7CkBAIC01MjksMTIgKzUyOCw4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGFuc3dlckNhbGwoU3RyaW5nIHNlc3Npb25EZXNjcmlwdGlvbiwgaW50IHRpbWVvdXQpIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU2lwU2Vzc2lvbkdyb3VwLnRoaXMpIHsKICAgICAgICAgICAgICAgICBpZiAobVBlZXJQcm9maWxlID09IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWFuZChuZXcgTWFrZUNhbGxDb21tYW5kKG1QZWVyUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uRGVzY3JpcHRpb24sIHRpbWVvdXQpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTaXBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb0NvbW1hbmRBc3luYyhuZXcgTWFrZUNhbGxDb21tYW5kKG1QZWVyUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25EZXNjcmlwdGlvbiwgdGltZW91dCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3ZvaXAvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvc2lwL1NpcFdha2V1cFRpbWVyLmphdmEgYi92b2lwL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NpcC9TaXBXYWtldXBUaW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzI2YjAKLS0tIC9kZXYvbnVsbAorKysgYi92b2lwL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3NpcC9TaXBXYWtldXBUaW1lci5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5zZXJ2ZXIuc2lwOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWxhcm1NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkRhdGFncmFtU29ja2V0OworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YXguc2lwLlNpcEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaW1lciB0aGF0IGNhbiBzY2hlZHVsZSBldmVudHMgdG8gb2NjdXIgZXZlbiB3aGVuIHRoZSBkZXZpY2UgaXMgaW4gc2xlZXAuCisgKi8KK2NsYXNzIFNpcFdha2V1cFRpbWVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiX1NJUC5Xa1RpbWVyXyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSSUdHRVJfVElNRSA9ICJUcmlnZ2VyVGltZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19USU1FUiA9IFNpcFNlcnZpY2UuREVCVUcgJiYgZmFsc2U7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7CisgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKworICAgIC8vIHJ1bm5hYmxlIC0tPiB0aW1lIHRvIGV4ZWN1dGUgaW4gU3lzdGVtQ2xvY2sKKyAgICBwcml2YXRlIFRyZWVTZXQ8TXlFdmVudD4gbUV2ZW50UXVldWUgPQorICAgICAgICAgICAgbmV3IFRyZWVTZXQ8TXlFdmVudD4obmV3IE15RXZlbnRDb21wYXJhdG9yKCkpOworCisgICAgcHJpdmF0ZSBQZW5kaW5nSW50ZW50IG1QZW5kaW5nSW50ZW50OworCisgICAgcHJpdmF0ZSBFeGVjdXRvciBtRXhlY3V0b3I7CisKKyAgICBwdWJsaWMgU2lwV2FrZXVwVGltZXIoQ29udGV4dCBjb250ZXh0LCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1BbGFybU1hbmFnZXIgPSAoQWxhcm1NYW5hZ2VyKQorICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFMQVJNX1NFUlZJQ0UpOworCisgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKGdldEFjdGlvbigpKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKHRoaXMsIGZpbHRlcik7CisgICAgICAgIG1FeGVjdXRvciA9IGV4ZWN1dG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSB0aW1lci4gTm8gZXZlbnQgY2FuIGJlIHNjaGVkdWxlZCBhZnRlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0b3AoKSB7CisgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcih0aGlzKTsKKyAgICAgICAgaWYgKG1QZW5kaW5nSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1QZW5kaW5nSW50ZW50KTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW50ZW50ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBtRXZlbnRRdWV1ZS5jbGVhcigpOworICAgICAgICBtRXZlbnRRdWV1ZSA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzdG9wcGVkKCkgeworICAgICAgICBpZiAobUV2ZW50UXVldWUgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLncoVEFHLCAiVGltZXIgc3RvcHBlZCIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2FuY2VsQWxhcm0oKSB7CisgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1QZW5kaW5nSW50ZW50KTsKKyAgICAgICAgbVBlbmRpbmdJbnRlbnQgPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWNhbGN1bGF0ZVBlcmlvZHMoKSB7CisgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHJldHVybjsKKworICAgICAgICBNeUV2ZW50IGZpcnN0RXZlbnQgPSBtRXZlbnRRdWV1ZS5maXJzdCgpOworICAgICAgICBpbnQgbWluUGVyaW9kID0gZmlyc3RFdmVudC5tTWF4UGVyaW9kOworICAgICAgICBsb25nIG1pblRyaWdnZXJUaW1lID0gZmlyc3RFdmVudC5tVHJpZ2dlclRpbWU7CisgICAgICAgIGZvciAoTXlFdmVudCBlIDogbUV2ZW50UXVldWUpIHsKKyAgICAgICAgICAgIGUubVBlcmlvZCA9IGUubU1heFBlcmlvZCAvIG1pblBlcmlvZCAqIG1pblBlcmlvZDsKKyAgICAgICAgICAgIGludCBpbnRlcnZhbCA9IChpbnQpIChlLm1MYXN0VHJpZ2dlclRpbWUgKyBlLm1NYXhQZXJpb2QKKyAgICAgICAgICAgICAgICAgICAgLSBtaW5UcmlnZ2VyVGltZSk7CisgICAgICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsIC8gbWluUGVyaW9kICogbWluUGVyaW9kOworICAgICAgICAgICAgZS5tVHJpZ2dlclRpbWUgPSBtaW5UcmlnZ2VyVGltZSArIGludGVydmFsOworICAgICAgICB9CisgICAgICAgIFRyZWVTZXQ8TXlFdmVudD4gbmV3UXVldWUgPSBuZXcgVHJlZVNldDxNeUV2ZW50PigKKyAgICAgICAgICAgICAgICBtRXZlbnRRdWV1ZS5jb21wYXJhdG9yKCkpOworICAgICAgICBuZXdRdWV1ZS5hZGRBbGwoKENvbGxlY3Rpb248TXlFdmVudD4pIG1FdmVudFF1ZXVlKTsKKyAgICAgICAgbUV2ZW50UXVldWUuY2xlYXIoKTsKKyAgICAgICAgbUV2ZW50UXVldWUgPSBuZXdRdWV1ZTsKKyAgICAgICAgaWYgKERFQlVHX1RJTUVSKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJxdWV1ZSByZS1jYWxjdWxhdGVkIik7CisgICAgICAgICAgICBwcmludFF1ZXVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmVzIHRoZSBwZXJpb2QgYW5kIHRoZSB0cmlnZ2VyIHRpbWUgb2YgdGhlIG5ldyBldmVudCBhbmQgaW5zZXJ0IGl0CisgICAgLy8gdG8gdGhlIHF1ZXVlLgorICAgIHByaXZhdGUgdm9pZCBpbnNlcnRFdmVudChNeUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGV2ZW50Lm1UcmlnZ2VyVGltZSA9IG5vdyArIGV2ZW50Lm1QZXJpb2Q7CisgICAgICAgICAgICBtRXZlbnRRdWV1ZS5hZGQoZXZlbnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE15RXZlbnQgZmlyc3RFdmVudCA9IG1FdmVudFF1ZXVlLmZpcnN0KCk7CisgICAgICAgIGludCBtaW5QZXJpb2QgPSBmaXJzdEV2ZW50Lm1QZXJpb2Q7CisgICAgICAgIGlmIChtaW5QZXJpb2QgPD0gZXZlbnQubU1heFBlcmlvZCkgeworICAgICAgICAgICAgZXZlbnQubVBlcmlvZCA9IGV2ZW50Lm1NYXhQZXJpb2QgLyBtaW5QZXJpb2QgKiBtaW5QZXJpb2Q7CisgICAgICAgICAgICBpbnQgaW50ZXJ2YWwgPSBldmVudC5tTWF4UGVyaW9kOworICAgICAgICAgICAgaW50ZXJ2YWwgLT0gKGludCkgKGZpcnN0RXZlbnQubVRyaWdnZXJUaW1lIC0gbm93KTsKKyAgICAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgLyBtaW5QZXJpb2QgKiBtaW5QZXJpb2Q7CisgICAgICAgICAgICBldmVudC5tVHJpZ2dlclRpbWUgPSBmaXJzdEV2ZW50Lm1UcmlnZ2VyVGltZSArIGludGVydmFsOworICAgICAgICAgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvbmcgdHJpZ2dlclRpbWUgPSBub3cgKyBldmVudC5tUGVyaW9kOworICAgICAgICAgICAgaWYgKGZpcnN0RXZlbnQubVRyaWdnZXJUaW1lIDwgdHJpZ2dlclRpbWUpIHsKKyAgICAgICAgICAgICAgICBldmVudC5tVHJpZ2dlclRpbWUgPSBmaXJzdEV2ZW50Lm1UcmlnZ2VyVGltZTsKKyAgICAgICAgICAgICAgICBldmVudC5tTGFzdFRyaWdnZXJUaW1lIC09IGV2ZW50Lm1QZXJpb2Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV2ZW50Lm1UcmlnZ2VyVGltZSA9IHRyaWdnZXJUaW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50KTsKKyAgICAgICAgICAgIHJlY2FsY3VsYXRlUGVyaW9kcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIHBlcmlvZGljIHRpbWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBlcmlvZCB0aGUgdGltZXIgcGVyaW9kOyBpbiBtaWxsaS1zZWNvbmQKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgaXMgY2FsbGVkIGJhY2sgd2hlbiB0aGUgdGltZXIgZ29lcyBvZmY7IHRoZSBzYW1lIGNhbGxiYWNrCisgICAgICogICAgICBjYW4gYmUgc3BlY2lmaWVkIGluIG11bHRpcGxlIHRpbWVyIGV2ZW50cworICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoaW50IHBlcmlvZCwgUnVubmFibGUgY2FsbGJhY2spIHsKKyAgICAgICAgaWYgKHN0b3BwZWQoKSkgcmV0dXJuOworCisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CisgICAgICAgIE15RXZlbnQgZXZlbnQgPSBuZXcgTXlFdmVudChwZXJpb2QsIGNhbGxiYWNrLCBub3cpOworICAgICAgICBpbnNlcnRFdmVudChldmVudCk7CisKKyAgICAgICAgaWYgKG1FdmVudFF1ZXVlLmZpcnN0KCkgPT0gZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5zaXplKCkgPiAxKSBjYW5jZWxBbGFybSgpOworICAgICAgICAgICAgc2NoZWR1bGVOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gZXZlbnQubVRyaWdnZXJUaW1lOworICAgICAgICBpZiAoREVCVUdfVElNRVIpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIiBhZGQgZXZlbnQgIiArIGV2ZW50ICsgIiBzY2hlZHVsZWQgYXQgIgorICAgICAgICAgICAgICAgICAgICArIHNob3dUaW1lKHRyaWdnZXJUaW1lKSArICIgYXQgIiArIHNob3dUaW1lKG5vdykKKyAgICAgICAgICAgICAgICAgICAgKyAiLCAjZXZlbnRzPSIgKyBtRXZlbnRRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgcHJpbnRRdWV1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhbGwgdGhlIHRpbWVyIGV2ZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNhbmNlbChSdW5uYWJsZSBjYWxsYmFjaykgeworICAgICAgICBpZiAoc3RvcHBlZCgpIHx8IG1FdmVudFF1ZXVlLmlzRW1wdHkoKSkgcmV0dXJuOworICAgICAgICBpZiAoREVCVUdfVElNRVIpIExvZy5kKFRBRywgImNhbmNlbDoiICsgY2FsbGJhY2spOworCisgICAgICAgIE15RXZlbnQgZmlyc3RFdmVudCA9IG1FdmVudFF1ZXVlLmZpcnN0KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3I8TXlFdmVudD4gaXRlciA9IG1FdmVudFF1ZXVlLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBNeUV2ZW50IGV2ZW50ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZXZlbnQubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUdfVElNRVIpIExvZy5kKFRBRywgIiAgICBjYW5jZWwgZm91bmQ6IiArIGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUV2ZW50UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjYW5jZWxBbGFybSgpOworICAgICAgICB9IGVsc2UgaWYgKG1FdmVudFF1ZXVlLmZpcnN0KCkgIT0gZmlyc3RFdmVudCkgeworICAgICAgICAgICAgY2FuY2VsQWxhcm0oKTsKKyAgICAgICAgICAgIGZpcnN0RXZlbnQgPSBtRXZlbnRRdWV1ZS5maXJzdCgpOworICAgICAgICAgICAgZmlyc3RFdmVudC5tUGVyaW9kID0gZmlyc3RFdmVudC5tTWF4UGVyaW9kOworICAgICAgICAgICAgZmlyc3RFdmVudC5tVHJpZ2dlclRpbWUgPSBmaXJzdEV2ZW50Lm1MYXN0VHJpZ2dlclRpbWUKKyAgICAgICAgICAgICAgICAgICAgKyBmaXJzdEV2ZW50Lm1QZXJpb2Q7CisgICAgICAgICAgICByZWNhbGN1bGF0ZVBlcmlvZHMoKTsKKyAgICAgICAgICAgIHNjaGVkdWxlTmV4dCgpOworICAgICAgICB9CisgICAgICAgIGlmIChERUJVR19USU1FUikgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWZ0ZXIgY2FuY2VsOiIpOworICAgICAgICAgICAgcHJpbnRRdWV1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlTmV4dCgpIHsKKyAgICAgICAgaWYgKHN0b3BwZWQoKSB8fCBtRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHJldHVybjsKKworICAgICAgICBpZiAobVBlbmRpbmdJbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBlbmRpbmdJbnRlbnQgaXMgbm90IG51bGwhIik7CisgICAgICAgIH0KKworICAgICAgICBNeUV2ZW50IGV2ZW50ID0gbUV2ZW50UXVldWUuZmlyc3QoKTsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoZ2V0QWN0aW9uKCkpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoVFJJR0dFUl9USU1FLCBldmVudC5tVHJpZ2dlclRpbWUpOworICAgICAgICBQZW5kaW5nSW50ZW50IHBlbmRpbmdJbnRlbnQgPSBtUGVuZGluZ0ludGVudCA9CisgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QobUNvbnRleHQsIDAsIGludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQuRkxBR19VUERBVEVfQ1VSUkVOVCk7CisgICAgICAgIG1BbGFybU1hbmFnZXIuc2V0KEFsYXJtTWFuYWdlci5FTEFQU0VEX1JFQUxUSU1FX1dBS0VVUCwKKyAgICAgICAgICAgICAgICBldmVudC5tVHJpZ2dlclRpbWUsIHBlbmRpbmdJbnRlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgLy8gVGhpcyBjYWxsYmFjayBpcyBhbHJlYWR5IHByb3RlY3RlZCBieSBBbGFybU1hbmFnZXIncyB3YWtlIGxvY2suCisgICAgICAgIFN0cmluZyBhY3Rpb24gPSBpbnRlbnQuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChnZXRBY3Rpb24oKS5lcXVhbHMoYWN0aW9uKQorICAgICAgICAgICAgICAgICYmIGludGVudC5nZXRFeHRyYXMoKS5jb250YWluc0tleShUUklHR0VSX1RJTUUpKSB7CisgICAgICAgICAgICBtUGVuZGluZ0ludGVudCA9IG51bGw7CisgICAgICAgICAgICBsb25nIHRyaWdnZXJUaW1lID0gaW50ZW50LmdldExvbmdFeHRyYShUUklHR0VSX1RJTUUsIC0xTCk7CisgICAgICAgICAgICBleGVjdXRlKHRyaWdnZXJUaW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgInVucmVjb2duaXplZCBpbnRlbnQ6ICIgKyBpbnRlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByaW50UXVldWUoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoTXlFdmVudCBldmVudCA6IG1FdmVudFF1ZXVlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICIgICAgICIgKyBldmVudCArICI6IHNjaGVkdWxlZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICsgc2hvd1RpbWUoZXZlbnQubVRyaWdnZXJUaW1lKSArICI6IGxhc3QgYXQgIgorICAgICAgICAgICAgICAgICAgICArIHNob3dUaW1lKGV2ZW50Lm1MYXN0VHJpZ2dlclRpbWUpKTsKKyAgICAgICAgICAgIGlmICgrK2NvdW50ID49IDUpIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5zaXplKCkgPiBjb3VudCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiICAgICAuLi4uLiIpOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIiAgICAgPGVtcHR5PiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBleGVjdXRlKGxvbmcgdHJpZ2dlclRpbWUpIHsKKyAgICAgICAgaWYgKERFQlVHX1RJTUVSKSBMb2cuZChUQUcsICJ0aW1lJ3MgdXAsIHRyaWdnZXJUaW1lID0gIgorICAgICAgICAgICAgICAgICsgc2hvd1RpbWUodHJpZ2dlclRpbWUpICsgIjogIiArIG1FdmVudFF1ZXVlLnNpemUoKSk7CisgICAgICAgIGlmIChzdG9wcGVkKCkgfHwgbUV2ZW50UXVldWUuaXNFbXB0eSgpKSByZXR1cm47CisKKyAgICAgICAgZm9yIChNeUV2ZW50IGV2ZW50IDogbUV2ZW50UXVldWUpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5tVHJpZ2dlclRpbWUgIT0gdHJpZ2dlclRpbWUpIGJyZWFrOworICAgICAgICAgICAgaWYgKERFQlVHX1RJTUVSKSBMb2cuZChUQUcsICJleGVjdXRlICIgKyBldmVudCk7CisKKyAgICAgICAgICAgIGV2ZW50Lm1MYXN0VHJpZ2dlclRpbWUgPSBldmVudC5tVHJpZ2dlclRpbWU7CisgICAgICAgICAgICBldmVudC5tVHJpZ2dlclRpbWUgKz0gZXZlbnQubVBlcmlvZDsKKworICAgICAgICAgICAgLy8gcnVuIHRoZSBjYWxsYmFjayBpbiB0aGUgaGFuZGxlciB0aHJlYWQgdG8gcHJldmVudCBkZWFkbG9jaworICAgICAgICAgICAgbUV4ZWN1dG9yLmV4ZWN1dGUoZXZlbnQubUNhbGxiYWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUdfVElNRVIpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgImFmdGVyIHRpbWVvdXQgZXhlY3V0aW9uIik7CisgICAgICAgICAgICBwcmludFF1ZXVlKCk7CisgICAgICAgIH0KKyAgICAgICAgc2NoZWR1bGVOZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBzaG93VGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgaW50IG1zID0gKGludCkgKHRpbWUgJSAxMDAwKTsKKyAgICAgICAgaW50IHMgPSAoaW50KSAodGltZSAvIDEwMDApOworICAgICAgICBpbnQgbSA9IHMgLyA2MDsKKyAgICAgICAgcyAlPSA2MDsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVkLiVkLiVkIiwgbSwgcywgbXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RXZlbnQgeworICAgICAgICBpbnQgbVBlcmlvZDsKKyAgICAgICAgaW50IG1NYXhQZXJpb2Q7CisgICAgICAgIGxvbmcgbVRyaWdnZXJUaW1lOworICAgICAgICBsb25nIG1MYXN0VHJpZ2dlclRpbWU7CisgICAgICAgIFJ1bm5hYmxlIG1DYWxsYmFjazsKKworICAgICAgICBNeUV2ZW50KGludCBwZXJpb2QsIFJ1bm5hYmxlIGNhbGxiYWNrLCBsb25nIG5vdykgeworICAgICAgICAgICAgbVBlcmlvZCA9IG1NYXhQZXJpb2QgPSBwZXJpb2Q7CisgICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgIG1MYXN0VHJpZ2dlclRpbWUgPSBub3c7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gc3VwZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHMgPSBzLnN1YnN0cmluZyhzLmluZGV4T2YoIkAiKSk7CisgICAgICAgICAgICByZXR1cm4gcyArICI6IiArIChtUGVyaW9kIC8gMTAwMCkgKyAiOiIgKyAobU1heFBlcmlvZCAvIDEwMDApICsgIjoiCisgICAgICAgICAgICAgICAgICAgICsgdG9TdHJpbmcobUNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKE9iamVjdCBvKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHMuaW5kZXhPZigiJCIpOworICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgcyA9IHMuc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15RXZlbnRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxNeUV2ZW50PiB7CisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNeUV2ZW50IGUxLCBNeUV2ZW50IGUyKSB7CisgICAgICAgICAgICBpZiAoZTEgPT0gZTIpIHJldHVybiAwOworICAgICAgICAgICAgaW50IGRpZmYgPSBlMS5tTWF4UGVyaW9kIC0gZTIubU1heFBlcmlvZDsKKyAgICAgICAgICAgIGlmIChkaWZmID09IDApIGRpZmYgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICAgICAgICByZXR1cm4gKHRoaXMgPT0gdGhhdCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9TdXBwbGljYW50U3RhdGUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZS5qYXZhCmluZGV4IDZiNzkyMTAuLjUwOWIwMmMgMTAwNjQ0Ci0tLSBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZS5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZS5qYXZhCkBAIC0zOSw2ICszOSwxNSBAQAogICAgIERJU0NPTk5FQ1RFRCwKIAogICAgIC8qKgorICAgICAqIEludGVyZmFjZSBpcyBkaXNhYmxlZAorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgaWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGlzIGRpc2FibGVkLgorICAgICAqIHdwYV9zdXBwbGljYW50IHJlZnVzZXMgYW55IG5ldyBvcGVyYXRpb25zIHRoYXQgd291bGQKKyAgICAgKiB1c2UgdGhlIHJhZGlvIHVudGlsIHRoZSBpbnRlcmZhY2UgaGFzIGJlZW4gZW5hYmxlZC4KKyAgICAgKi8KKyAgICBJTlRFUkZBQ0VfRElTQUJMRUQsCisKKyAgICAvKioKICAgICAgKiBJbmFjdGl2ZSBzdGF0ZSAod3BhX3N1cHBsaWNhbnQgZGlzYWJsZWQpLgogICAgICAqIDxwLz4KICAgICAgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgaWYgdGhlcmUgYXJlIG5vIGVuYWJsZWQgbmV0d29ya3MgaW4gdGhlCkBAIC01Nyw2ICs2NiwxNSBAQAogICAgIFNDQU5OSU5HLAogCiAgICAgLyoqCisgICAgICogVHJ5aW5nIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIGEgQlNTL1NTSUQKKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBzdGF0ZSBpcyBlbnRlcmVkIHdoZW4gd3BhX3N1cHBsaWNhbnQgaGFzIGZvdW5kIGEgc3VpdGFibGUgQlNTCisgICAgICogdG8gYXV0aGVudGljYXRlIHdpdGggYW5kIHRoZSBkcml2ZXIgaXMgY29uZmlndXJlZCB0byB0cnkgdG8KKyAgICAgKiBhdXRoZW50aWNhdGUgd2l0aCB0aGlzIEJTUy4KKyAgICAgKi8KKyAgICBBVVRIRU5USUNBVElORywKKworICAgIC8qKgogICAgICAqIFRyeWluZyB0byBhc3NvY2lhdGUgd2l0aCBhIEJTUy9TU0lELgogICAgICAqIDxwLz4KICAgICAgKiBUaGlzIHN0YXRlIGlzIGVudGVyZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBoYXMgZm91bmQgYSBzdWl0YWJsZSBCU1MKQEAgLTE1Miw4ICsxNzAsMzMgQEAKICAgICAgICAgcmV0dXJuIHN0YXRlICE9IFVOSU5JVElBTElaRUQgJiYgc3RhdGUgIT0gSU5WQUxJRDsKICAgICB9CiAKKworICAgIC8qIFN1cHBsaWNhbnQgYXNzb2NpYXRpbmcgb3IgYXV0aGVudGljYXRpbmcgaXMgY29uc2lkZXJlZCBhIGhhbmRzaGFrZSBzdGF0ZSAqLworICAgIHN0YXRpYyBib29sZWFuIGlzSGFuZHNoYWtlU3RhdGUoU3VwcGxpY2FudFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBBVVRIRU5USUNBVElORzoKKyAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRJTkc6CisgICAgICAgICAgICBjYXNlIEFTU09DSUFURUQ6CisgICAgICAgICAgICBjYXNlIEZPVVJfV0FZX0hBTkRTSEFLRToKKyAgICAgICAgICAgIGNhc2UgR1JPVVBfSEFORFNIQUtFOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBDT01QTEVURUQ6CisgICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGNhc2UgSU5URVJGQUNFX0RJU0FCTEVEOgorICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKKyAgICAgICAgICAgIGNhc2UgU0NBTk5JTkc6CisgICAgICAgICAgICBjYXNlIERPUk1BTlQ6CisgICAgICAgICAgICBjYXNlIFVOSU5JVElBTElaRUQ6CisgICAgICAgICAgICBjYXNlIElOVkFMSUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHN1cHBsaWNhbnQgc3RhdGUiKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0YXRpYyBib29sZWFuIGlzQ29ubmVjdGluZyhTdXBwbGljYW50U3RhdGUgc3RhdGUpIHsKICAgICAgICAgc3dpdGNoKHN0YXRlKSB7CisgICAgICAgICAgICBjYXNlIEFVVEhFTlRJQ0FUSU5HOgogICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRFRDoKICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgpAQCAtMTYxLDYgKzIwNCw3IEBACiAgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfRElTQUJMRUQ6CiAgICAgICAgICAgICBjYXNlIElOQUNUSVZFOgogICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKICAgICAgICAgICAgIGNhc2UgRE9STUFOVDoKQEAgLTE3Miw2ICsyMTYsMjggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHN0YXRpYyBib29sZWFuIGlzRHJpdmVyQWN0aXZlKFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSkgeworICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgY2FzZSBET1JNQU5UOgorICAgICAgICAgICAgY2FzZSBJTkFDVElWRToKKyAgICAgICAgICAgIGNhc2UgQVVUSEVOVElDQVRJTkc6CisgICAgICAgICAgICBjYXNlIEFTU09DSUFUSU5HOgorICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVEVEOgorICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKKyAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgorICAgICAgICAgICAgY2FzZSBHUk9VUF9IQU5EU0hBS0U6CisgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGNhc2UgSU5URVJGQUNFX0RJU0FCTEVEOgorICAgICAgICAgICAgY2FzZSBVTklOSVRJQUxJWkVEOgorICAgICAgICAgICAgY2FzZSBJTlZBTElEOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBzdXBwbGljYW50IHN0YXRlIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogSW1wbGVtZW50IHRoZSBQYXJjZWxhYmxlIGludGVyZmFjZSB7QGhpZGV9ICovCiAgICAgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCkgewogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1N1cHBsaWNhbnRTdGF0ZVRyYWNrZXIuamF2YQppbmRleCA5YWUyNmRhLi4wYzRmOWY2IDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9TdXBwbGljYW50U3RhdGVUcmFja2VyLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvU3VwcGxpY2FudFN0YXRlVHJhY2tlci5qYXZhCkBAIC05OCwxMiArOTgsMTYgQEAKICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCAiU3VwcGxpY2FudCBzdGF0ZTogIiArIHN1cFN0YXRlLnRvU3RyaW5nKCkgKyAiXG4iKTsKIAogICAgICAgICBzd2l0Y2ggKHN1cFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIERJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgY2FzZSBESVNDT05ORUNURUQ6CiAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1EaXNjb25uZWN0U3RhdGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTlRFUkZBQ0VfRElTQUJMRUQ6CisgICAgICAgICAgICAgICAgLy93ZSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGRpc2Nvbm5lY3Rpb24gYWxyZWFkeSwgZG8gbm90aGluZworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTQ0FOTklORzoKICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uVG8obVNjYW5TdGF0ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFVVEhFTlRJQ0FUSU5HOgogICAgICAgICAgICAgY2FzZSBBU1NPQ0lBVElORzoKICAgICAgICAgICAgIGNhc2UgQVNTT0NJQVRFRDoKICAgICAgICAgICAgIGNhc2UgRk9VUl9XQVlfSEFORFNIQUtFOgpAQCAtMjUwLDEwICsyNTQsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgV2lmaVN0YXRlTWFjaGluZS5TVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKICAgICAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOwogICAgICAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGUgPSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkZPVVJfV0FZX0hBTkRTSEFLRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5HUk9VUF9IQU5EU0hBS0UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN1cHBsaWNhbnRTdGF0ZS5pc0hhbmRzaGFrZVN0YXRlKHN0YXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Mb29wRGV0ZWN0SW5kZXggPiBzdGF0ZS5vcmRpbmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcERldGVjdENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yOTYsMTIgKzI5NywxMSBAQAogICAgICAgICAgICAgICAgICAgICBTdGF0ZUNoYW5nZVJlc3VsdCBzdGF0ZUNoYW5nZVJlc3VsdCA9IChTdGF0ZUNoYW5nZVJlc3VsdCkgbWVzc2FnZS5vYmo7CiAgICAgICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSA9IHN0YXRlQ2hhbmdlUmVzdWx0LnN0YXRlOwogICAgICAgICAgICAgICAgICAgICBzZW5kU3VwcGxpY2FudFN0YXRlQ2hhbmdlZEJyb2FkY2FzdChzdGF0ZSwgbUF1dGhGYWlsdXJlSW5TdXBwbGljYW50QnJvYWRjYXN0KTsKLSAgICAgICAgICAgICAgICAgICAgLyogSWdub3JlIGEgcmUtYXV0aCBpbiBjb21wbGV0ZWQgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVEVEIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLkZPVVJfV0FZX0hBTkRTSEFLRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5HUk9VUF9IQU5EU0hBS0UgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBTdXBwbGljYW50U3RhdGUuQ09NUExFVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIElnbm9yZSBhbnkgY29ubmVjdGluZyBzdGF0ZSBpbiBjb21wbGV0ZWQgc3RhdGUuIEdyb3VwIHJlLWtleWluZworICAgICAgICAgICAgICAgICAgICAgKiBldmVudHMgYW5kIG90aGVyIGF1dGggZXZlbnRzIHRoYXQgZG8gbm90IGFmZmVjdCBjb25uZWN0aXZpdHkgYXJlCisgICAgICAgICAgICAgICAgICAgICAqIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChTdXBwbGljYW50U3RhdGUuaXNDb25uZWN0aW5nKHN0YXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbk9uU3VwcGxpY2FudFN0YXRlQ2hhbmdlKHN0YXRlQ2hhbmdlUmVzdWx0KTsKZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlDb25maWdTdG9yZS5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKaW5kZXggN2Y5ZmMzMS4uZDgzYjk2OCAxMDA2NDQKLS0tIGEvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUNvbmZpZ1N0b3JlLmphdmEKQEAgLTQ3OCw2ICs0NzgsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIGNsZWFyIElQIGNvbmZpZ3VyYXRpb24gZm9yIGEgZ2l2ZW4gbmV0d29yayBpZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNsZWFySXBDb25maWd1cmF0aW9uKGludCBuZXRJZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHNDb25maWd1cmVkTmV0d29ya3MpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNDb25maWd1cmVkTmV0d29ya3MuZ2V0KG5ldElkKTsKKyAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCAmJiBjb25maWcubGlua1Byb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENsZWFyIGV2ZXJ5dGhpbmcgZXhjZXB0IHByb3h5CisgICAgICAgICAgICAgICAgUHJveHlQcm9wZXJ0aWVzIHByb3h5ID0gY29uZmlnLmxpbmtQcm9wZXJ0aWVzLmdldEh0dHBQcm94eSgpOworICAgICAgICAgICAgICAgIGNvbmZpZy5saW5rUHJvcGVydGllcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGNvbmZpZy5saW5rUHJvcGVydGllcy5zZXRIdHRwUHJveHkocHJveHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAKICAgICAvKioKICAgICAgKiBGZXRjaCB0aGUgcHJveHkgcHJvcGVydGllcyBmb3IgYSBnaXZlbiBuZXR3b3JrIGlkCmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpSW5mby5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaUluZm8uamF2YQppbmRleCBmNjBhZTQ4Li5lMzY2MWJmIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpSW5mby5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlJbmZvLmphdmEKQEAgLTQxLDggKzQxLDEwIEBACiAKICAgICBzdGF0aWMgewogICAgICAgICBzdGF0ZU1hcC5wdXQoU3VwcGxpY2FudFN0YXRlLkRJU0NPTk5FQ1RFRCwgRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOworICAgICAgICBzdGF0ZU1hcC5wdXQoU3VwcGxpY2FudFN0YXRlLklOVEVSRkFDRV9ESVNBQkxFRCwgRGV0YWlsZWRTdGF0ZS5ESVNDT05ORUNURUQpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoU3VwcGxpY2FudFN0YXRlLklOQUNUSVZFLCBEZXRhaWxlZFN0YXRlLklETEUpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoU3VwcGxpY2FudFN0YXRlLlNDQU5OSU5HLCBEZXRhaWxlZFN0YXRlLlNDQU5OSU5HKTsKKyAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5BVVRIRU5USUNBVElORywgRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HKTsKICAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORywgRGV0YWlsZWRTdGF0ZS5DT05ORUNUSU5HKTsKICAgICAgICAgc3RhdGVNYXAucHV0KFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVEVELCBEZXRhaWxlZFN0YXRlLkNPTk5FQ1RJTkcpOwogICAgICAgICBzdGF0ZU1hcC5wdXQoU3VwcGxpY2FudFN0YXRlLkZPVVJfV0FZX0hBTkRTSEFLRSwgRGV0YWlsZWRTdGF0ZS5BVVRIRU5USUNBVElORyk7CmRpZmYgLS1naXQgYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaU1vbml0b3IuamF2YQppbmRleCA0YTQ1ODI1Li40ZWM0Y2ZjIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpTW9uaXRvci5qYXZhCisrKyBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlNb25pdG9yLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAqIDxwcmU+CiAgICAgICogQ1RSTC1FVkVOVC1EUklWRVItU1RBVEUgc3RhdGUKICAgICAgKiA8L3ByZT4KLSAgICAgKiA8Y29kZT5zdGF0ZTwvY29kZT4gaXMgZWl0aGVyIFNUQVJURUQgb3IgU1RPUFBFRAorICAgICAqIDxjb2RlPnN0YXRlPC9jb2RlPiBjYW4gYmUgSEFOR0VECiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRyaXZlclN0YXRlRXZlbnQgPSAiRFJJVkVSLVNUQVRFIjsKICAgICAvKioKQEAgLTMwNCwxMSArMzA0LDcgQEAKICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXRlLmVxdWFscygiU1RPUFBFRCIpKSB7Ci0gICAgICAgICAgICAgICAgbVdpZmlTdGF0ZU1hY2hpbmUubm90aWZ5RHJpdmVyU3RvcHBlZCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lcXVhbHMoIlNUQVJURUQiKSkgewotICAgICAgICAgICAgICAgIG1XaWZpU3RhdGVNYWNoaW5lLm5vdGlmeURyaXZlclN0YXJ0ZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXF1YWxzKCJIQU5HRUQiKSkgeworICAgICAgICAgICAgaWYgKHN0YXRlLmVxdWFscygiSEFOR0VEIikpIHsKICAgICAgICAgICAgICAgICBtV2lmaVN0YXRlTWFjaGluZS5ub3RpZnlEcml2ZXJIdW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YSBiL3dpZmkvamF2YS9hbmRyb2lkL25ldC93aWZpL1dpZmlTdGF0ZU1hY2hpbmUuamF2YQppbmRleCBiZDZkYTY0Li4yYTAzM2QxIDEwMDY0NAotLS0gYS93aWZpL2phdmEvYW5kcm9pZC9uZXQvd2lmaS9XaWZpU3RhdGVNYWNoaW5lLmphdmEKKysrIGIvd2lmaS9qYXZhL2FuZHJvaWQvbmV0L3dpZmkvV2lmaVN0YXRlTWFjaGluZS5qYXZhCkBAIC0yMTIsMjIgKzIxMiwxOCBAQAogICAgIHN0YXRpYyBmaW5hbCBpbnQgU1VQX0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgICAgICAgID0gQkFTRSArIDMxOwogICAgIC8qIENvbm5lY3Rpb24gdG8gc3VwcGxpY2FudCBsb3N0ICovCiAgICAgc3RhdGljIGZpbmFsIGludCBTVVBfRElTQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICAgPSBCQVNFICsgMzI7Ci0gICAgLyogRHJpdmVyIHN0YXJ0IGNvbXBsZXRlZCAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUQVJUX0VWRU5UICAgICAgICAgICAgICAgICAgID0gQkFTRSArIDMzOwotICAgIC8qIERyaXZlciBzdG9wIGNvbXBsZXRlZCAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgRFJJVkVSX1NUT1BfRVZFTlQgICAgICAgICAgICAgICAgICAgID0gQkFTRSArIDM0OwotICAgIC8qIE5ldHdvcmsgY29ubmVjdGlvbiBjb21wbGV0ZWQgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICA9IEJBU0UgKyAzNjsKKyAgIC8qIE5ldHdvcmsgY29ubmVjdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5FVFdPUktfQ09OTkVDVElPTl9FVkVOVCAgICAgICAgICAgICA9IEJBU0UgKyAzMzsKICAgICAvKiBOZXR3b3JrIGRpc2Nvbm5lY3Rpb24gY29tcGxldGVkICovCi0gICAgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgPSBCQVNFICsgMzc7CisgICAgc3RhdGljIGZpbmFsIGludCBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQgICAgICAgICAgPSBCQVNFICsgMzQ7CiAgICAgLyogU2NhbiByZXN1bHRzIGFyZSBhdmFpbGFibGUgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IEJBU0UgKyAzODsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNDQU5fUkVTVUxUU19FVkVOVCAgICAgICAgICAgICAgICAgICA9IEJBU0UgKyAzNTsKICAgICAvKiBTdXBwbGljYXRlIHN0YXRlIGNoYW5nZWQgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UICAgICAgICA9IEJBU0UgKyAzOTsKKyAgICBzdGF0aWMgZmluYWwgaW50IFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UICAgICAgICA9IEJBU0UgKyAzNjsKICAgICAvKiBQYXNzd29yZCBmYWlsdXJlIGFuZCBFQVAgYXV0aGVudGljYXRpb24gZmFpbHVyZSAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUSEVOVElDQVRJT05fRkFJTFVSRV9FVkVOVCAgICAgICAgID0gQkFTRSArIDQwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUSEVOVElDQVRJT05fRkFJTFVSRV9FVkVOVCAgICAgICAgID0gQkFTRSArIDM3OwogICAgIC8qIFdQUyBvdmVybGFwIGRldGVjdGVkICovCi0gICAgc3RhdGljIGZpbmFsIGludCBXUFNfT1ZFUkxBUF9FVkVOVCAgICAgICAgICAgICAgICAgICAgPSBCQVNFICsgNDE7CisgICAgc3RhdGljIGZpbmFsIGludCBXUFNfT1ZFUkxBUF9FVkVOVCAgICAgICAgICAgICAgICAgICAgPSBCQVNFICsgMzg7CiAKIAogICAgIC8qIFN1cHBsaWNhbnQgY29tbWFuZHMgKi8KQEAgLTEwMzIsOSArMTAyOCw2IEBACiAgICAgICAgIGJvb2xlYW4gd2lmaVRldGhlcmVkID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gd2lmaUF2YWlsYWJsZSA9IGZhbHNlOwogCi0gICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKLSAgICAgICAgSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZSBzZXJ2aWNlID0gSU5ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5TdHViLmFzSW50ZXJmYWNlKGIpOwotCiAgICAgICAgIGlmIChtQ20gPT0gbnVsbCkgewogICAgICAgICAgICAgbUNtID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DT05ORUNUSVZJVFlfU0VSVklDRSk7CiAgICAgICAgIH0KQEAgLTEwNDcsMTQgKzEwNDAsMTQgQEAKIAogICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VDb25maWd1cmF0aW9uIGlmY2cgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWZjZyA9IHNlcnZpY2UuZ2V0SW50ZXJmYWNlQ29uZmlnKGludGYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWZjZyA9IG53U2VydmljZS5nZXRJbnRlcmZhY2VDb25maWcoaW50Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZjZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVAvbmV0bWFzazogMTkyLjE2OC40My4xLzI1NS4yNTUuMjU1LjAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmNnLmFkZHIgPSBuZXcgTGlua0FkZHJlc3MoTmV0d29ya1V0aWxzLm51bWVyaWNUb0luZXRBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5Mi4xNjguNDMuMSIpLCAyNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZjZy5pbnRlcmZhY2VGbGFncyA9ICJbdXBdIjsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2Uuc2V0SW50ZXJmYWNlQ29uZmlnKGludGYsIGlmY2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG53U2VydmljZS5zZXRJbnRlcmZhY2VDb25maWcoaW50ZiwgaWZjZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjb25maWd1cmluZyBpbnRlcmZhY2UgIiArIGludGYgKyAiLCA6IiArIGUpOwpAQCAtMTM3OCw3ICsxMzcxLDcgQEAKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVAogICAgICAgICAgICAgICAgIHwgSW50ZW50LkZMQUdfUkVDRUlWRVJfUkVQTEFDRV9QRU5ESU5HKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX05FVFdPUktfSU5GTywgbU5ldHdvcmtJbmZvKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUywgbUxpbmtQcm9wZXJ0aWVzKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKFdpZmlNYW5hZ2VyLkVYVFJBX0xJTktfUFJPUEVSVElFUywgbmV3IExpbmtQcm9wZXJ0aWVzIChtTGlua1Byb3BlcnRpZXMpKTsKICAgICAgICAgaWYgKGJzc2lkICE9IG51bGwpCiAgICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoV2lmaU1hbmFnZXIuRVhUUkFfQlNTSUQsIGJzc2lkKTsKICAgICAgICAgbUNvbnRleHQuc2VuZFN0aWNreUJyb2FkY2FzdChpbnRlbnQpOwpAQCAtMTM5NCw3ICsxMzg3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgc2VuZExpbmtDb25maWd1cmF0aW9uQ2hhbmdlZEJyb2FkY2FzdCgpIHsKICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoV2lmaU1hbmFnZXIuTElOS19DT05GSUdVUkFUSU9OX0NIQU5HRURfQUNUSU9OKTsKICAgICAgICAgaW50ZW50LmFkZEZsYWdzKEludGVudC5GTEFHX1JFQ0VJVkVSX1JFR0lTVEVSRURfT05MWV9CRUZPUkVfQk9PVCk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMsIG1MaW5rUHJvcGVydGllcyk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShXaWZpTWFuYWdlci5FWFRSQV9MSU5LX1BST1BFUlRJRVMsIG5ldyBMaW5rUHJvcGVydGllcyhtTGlua1Byb3BlcnRpZXMpKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChpbnRlbnQpOwogICAgIH0KIApAQCAtMTQyMSwyNiArMTQxNCw1NSBAQAogICAgICAgICByZXR1cm4gbU5ldHdvcmtJbmZvLmdldERldGFpbGVkU3RhdGUoKTsKICAgICB9CiAKKworICAgIHByaXZhdGUgU3VwcGxpY2FudFN0YXRlIGhhbmRsZVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOworICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGUgPSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKKyAgICAgICAgLy8gU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgLy8gWzMxLTEzXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICAgICAgICAvLyBbOCAtIDBdIFN1cHBsaWNhbnQgc3RhdGUgKGFzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEpCisgICAgICAgIC8vIDUwMDIzIHN1cHBsaWNhbnRfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKKyAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIHN0YXRlLm9yZGluYWwoKSk7CisgICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOworICAgICAgICAvLyBOZXR3b3JrIGlkIGlzIG9ubHkgdmFsaWQgd2hlbiB3ZSBzdGFydCBjb25uZWN0aW5nCisgICAgICAgIGlmIChTdXBwbGljYW50U3RhdGUuaXNDb25uZWN0aW5nKHN0YXRlKSkgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChXaWZpQ29uZmlndXJhdGlvbi5JTlZBTElEX05FVFdPUktfSUQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORykgeworICAgICAgICAgICAgLyogQlNTSUQgaXMgdmFsaWQgb25seSBpbiBBU1NPQ0lBVElORyBzdGF0ZSAqLworICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKHN0YXRlQ2hhbmdlUmVzdWx0LkJTU0lEKTsKKyAgICAgICAgfQorCisgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKG1lc3NhZ2UpKTsKKyAgICAgICAgbVdwc1N0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihtZXNzYWdlKSk7CisKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlc2V0cyB0aGUgV2ktRmkgQ29ubmVjdGlvbnMgYnkgY2xlYXJpbmcgYW55IHN0YXRlLCByZXNldHRpbmcgYW55IHNvY2tldHMKICAgICAgKiB1c2luZyB0aGUgaW50ZXJmYWNlLCBzdG9wcGluZyBESENQICYgZGlzYWJsaW5nIGludGVyZmFjZQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOZXR3b3JrRGlzY29ubmVjdCgpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiUmVzZXQgY29ubmVjdGlvbnMgYW5kIHN0b3BwaW5nIERIQ1AiKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiU3RvcHBpbmcgREhDUCBhbmQgY2xlYXJpbmcgSVAiKTsKIAogICAgICAgICAvKgotICAgICAgICAgKiBSZXNldCBjb25uZWN0aW9ucyAmIHN0b3AgREhDUAorICAgICAgICAgKiBzdG9wIERIQ1AKICAgICAgICAgICovCi0gICAgICAgIE5ldHdvcmtVdGlscy5yZXNldENvbm5lY3Rpb25zKG1JbnRlcmZhY2VOYW1lKTsKLQogICAgICAgICBpZiAobURoY3BTdGF0ZU1hY2hpbmUgIT0gbnVsbCkgewogICAgICAgICAgICAgbURoY3BTdGF0ZU1hY2hpbmUuc2VuZE1lc3NhZ2UoRGhjcFN0YXRlTWFjaGluZS5DTURfU1RPUF9ESENQKTsKICAgICAgICAgICAgIG1EaGNwU3RhdGVNYWNoaW5lLnF1aXQoKTsKICAgICAgICAgICAgIG1EaGNwU3RhdGVNYWNoaW5lID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIC8qIERpc2FibGUgaW50ZXJmYWNlICovCi0gICAgICAgIE5ldHdvcmtVdGlscy5kaXNhYmxlSW50ZXJmYWNlKG1JbnRlcmZhY2VOYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG53U2VydmljZS5jbGVhckludGVyZmFjZUFkZHJlc3NlcyhtSW50ZXJmYWNlTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY2xlYXIgSVAgYWRkcmVzc2VzIG9uIGRpc2Nvbm5lY3QiICsgZSk7CisgICAgICAgIH0KIAogICAgICAgICAvKiBSZXNldCBkYXRhIHN0cnVjdHVyZXMgKi8KICAgICAgICAgbVdpZmlJbmZvLnNldEluZXRBZGRyZXNzKG51bGwpOwpAQCAtMTQ1NiwxMCArMTQ3OCwxMyBAQAogCiAgICAgICAgIC8qIENsZWFyIG5ldHdvcmsgcHJvcGVydGllcyAqLwogICAgICAgICBtTGlua1Byb3BlcnRpZXMuY2xlYXIoKTsKKyAgICAgICAgLyogQ2xlYXIgSVAgc2V0dGluZ3MgaWYgdGhlIG5ldHdvcmsgdXNlZCBESENQICovCisgICAgICAgIGlmICghV2lmaUNvbmZpZ1N0b3JlLmlzVXNpbmdTdGF0aWNJcChtTGFzdE5ldHdvcmtJZCkpIHsKKyAgICAgICAgICAgIFdpZmlDb25maWdTdG9yZS5jbGVhcklwQ29uZmlndXJhdGlvbihtTGFzdE5ldHdvcmtJZCk7CisgICAgICAgIH0KIAogICAgICAgICBtTGFzdEJzc2lkPSBudWxsOwogICAgICAgICBtTGFzdE5ldHdvcmtJZCA9IFdpZmlDb25maWd1cmF0aW9uLklOVkFMSURfTkVUV09SS19JRDsKLQogICAgIH0KIAogICAgIHZvaWQgaGFuZGxlUHJlRGhjcFNldHVwKCkgewpAQCAtMTUyMiw3ICsxNTQ3LDYgQEAKICAgICAgICAgICAgIGlmICghbGlua1Byb3BlcnRpZXMuZXF1YWxzKG1MaW5rUHJvcGVydGllcykpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJMaW5rIGNvbmZpZ3VyYXRpb24gY2hhbmdlZCBmb3IgbmV0SWQ6ICIgKyBtTGFzdE5ldHdvcmtJZAogICAgICAgICAgICAgICAgICAgICArICIgb2xkOiAiICsgbUxpbmtQcm9wZXJ0aWVzICsgIm5ldzogIiArIGxpbmtQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHMucmVzZXRDb25uZWN0aW9ucyhtSW50ZXJmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgbUxpbmtQcm9wZXJ0aWVzID0gbGlua1Byb3BlcnRpZXM7CiAgICAgICAgICAgICAgICAgc2VuZExpbmtDb25maWd1cmF0aW9uQ2hhbmdlZEJyb2FkY2FzdCgpOwogICAgICAgICAgICAgfQpAQCAtMTY3NCwxNCArMTY5OCw2IEBACiAgICAgICAgIHNlbmRNZXNzYWdlKFNDQU5fUkVTVUxUU19FVkVOVCk7CiAgICAgfQogCi0gICAgdm9pZCBub3RpZnlEcml2ZXJTdGFydGVkKCkgewotICAgICAgICBzZW5kTWVzc2FnZShEUklWRVJfU1RBUlRfRVZFTlQpOwotICAgIH0KLQotICAgIHZvaWQgbm90aWZ5RHJpdmVyU3RvcHBlZCgpIHsKLSAgICAgICAgc2VuZE1lc3NhZ2UoRFJJVkVSX1NUT1BfRVZFTlQpOwotICAgIH0KLQogICAgIHZvaWQgbm90aWZ5RHJpdmVySHVuZygpIHsKICAgICAgICAgc2V0V2lmaUVuYWJsZWQoZmFsc2UpOwogICAgICAgICBzZXRXaWZpRW5hYmxlZCh0cnVlKTsKQEAgLTE3MzcsOCArMTc1Myw2IEBACiAgICAgICAgICAgICAgICAgY2FzZSBDTURfUkVBU1NPQ0lBVEU6CiAgICAgICAgICAgICAgICAgY2FzZSBTVVBfQ09OTkVDVElPTl9FVkVOVDoKICAgICAgICAgICAgICAgICBjYXNlIFNVUF9ESVNDT05ORUNUSU9OX0VWRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUQVJUX0VWRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgRFJJVkVSX1NUT1BfRVZFTlQ6CiAgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0NPTk5FQ1RJT05fRVZFTlQ6CiAgICAgICAgICAgICAgICAgY2FzZSBORVRXT1JLX0RJU0NPTk5FQ1RJT05fRVZFTlQ6CiAgICAgICAgICAgICAgICAgY2FzZSBTQ0FOX1JFU1VMVFNfRVZFTlQ6CkBAIC0yMjg0LDEzICsyMjk4LDE5IEBACiAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NNZXNzYWdlKE1lc3NhZ2UgbWVzc2FnZSkgewogICAgICAgICAgICAgaWYgKERCRykgTG9nLmQoVEFHLCBnZXROYW1lKCkgKyBtZXNzYWdlLnRvU3RyaW5nKCkgKyAiXG4iKTsKICAgICAgICAgICAgIHN3aXRjaChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIERSSVZFUl9TVEFSVF9FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKKyAgICAgICAgICAgICAgICAgICAgU3VwcGxpY2FudFN0YXRlIHN0YXRlID0gaGFuZGxlU3VwcGxpY2FudFN0YXRlQ2hhbmdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAvKiBJZiBzdXBsaWNhbnQgaXMgZXhpdGluZyBvdXQgb2YgSU5URVJGQUNFX0RJU0FCTEVEIHN0YXRlIGludG8KKyAgICAgICAgICAgICAgICAgICAgICogYSBzdGF0ZSB0aGF0IGluZGljYXRlcyBkcml2ZXIgaGFzIHN0YXJ0ZWQsIGl0IGlzIHJlYWR5IHRvCisgICAgICAgICAgICAgICAgICAgICAqIHJlY2VpdmUgZHJpdmVyIGNvbW1hbmRzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoU3VwcGxpY2FudFN0YXRlLmlzRHJpdmVyQWN0aXZlKHN0YXRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGVkU3RhdGUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAvKiBRdWV1ZSBkcml2ZXIgY29tbWFuZHMgJiBjb25uZWN0aW9uIGV2ZW50cyAqLwogICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKICAgICAgICAgICAgICAgICBjYXNlIENNRF9TVE9QX0RSSVZFUjoKLSAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgogICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19DT05ORUNUSU9OX0VWRU5UOgogICAgICAgICAgICAgICAgIGNhc2UgTkVUV09SS19ESVNDT05ORUNUSU9OX0VWRU5UOgogICAgICAgICAgICAgICAgIGNhc2UgQVVUSEVOVElDQVRJT05fRkFJTFVSRV9FVkVOVDoKQEAgLTI0MjksOCArMjQ0OSwxMSBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CiAgICAgICAgICAgICBzd2l0Y2gobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBEUklWRVJfU1RPUF9FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdG9wcGVkU3RhdGUpOworICAgICAgICAgICAgICAgIGNhc2UgU1VQUExJQ0FOVF9TVEFURV9DSEFOR0VfRVZFTlQ6CisgICAgICAgICAgICAgICAgICAgIFN1cHBsaWNhbnRTdGF0ZSBzdGF0ZSA9IGhhbmRsZVN1cHBsaWNhbnRTdGF0ZUNoYW5nZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5JTlRFUkZBQ0VfRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtRHJpdmVyU3RvcHBlZFN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgLyogUXVldWUgZHJpdmVyIGNvbW1hbmRzICovCiAgICAgICAgICAgICAgICAgY2FzZSBDTURfU1RBUlRfRFJJVkVSOgpAQCAtMjQ2NSwxMSArMjQ4OCwyMyBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKICAgICAgICAgICAgIGlmIChEQkcpIExvZy5kKFRBRywgZ2V0TmFtZSgpICsgbWVzc2FnZS50b1N0cmluZygpICsgIlxuIik7CiAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKLSAgICAgICAgICAgICAgICAgICAgbVdha2VMb2NrLmFjcXVpcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5zdGFydERyaXZlckNvbW1hbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGluZ1N0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX0RSSVZFUjoKKyAgICAgICAgICAgICAgICAgICBtV2FrZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgICAgICAgIFdpZmlOYXRpdmUuc3RhcnREcml2ZXJDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgbVdha2VMb2NrLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNVUFBMSUNBTlRfU1RBVEVfQ0hBTkdFX0VWRU5UOgorICAgICAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGUgPSBoYW5kbGVTdXBwbGljYW50U3RhdGVDaGFuZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIC8qIEEgZHJpdmVyIHN0YXJ0IGNhdXNlcyBzdXBwbGljYW50IHRvIGZpcnN0IHJlcG9ydCBhbiBJTlRFUkZBQ0VfRElTQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICogc3RhdGUgYmVmb3JlIHRyYW5zaXRpb25pbmcgb3V0IG9mIGl0IGZvciBjb25uZWN0aW9uLiBTdGF5IGluCisgICAgICAgICAgICAgICAgICAgICAqIERyaXZlclN0b3BwZWRTdGF0ZSB1bnRpbCB3ZSBnZXQgYW4gSU5URVJGQUNFX0RJU0FCTEVEIHN0YXRlIGFuZCB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAqIHRvIERyaXZlclN0YXJ0aW5nIHVwb24gZ2V0dGluZyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAqIFRPRE86IEZpeCB0aGlzIHdoZW4gdGhlIHN1cHBsaWNhbnQgY2FuIGJlIG1hZGUgdG8ganVzdCB0cmFuc2l0aW9uIG91dCBvZgorICAgICAgICAgICAgICAgICAgICAgKiBJTlRFUkZBQ0VfRElTQUJMRUQgc3RhdGUgd2hlbiBkcml2ZXIgZ2V0cyBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3VwcGxpY2FudFN0YXRlLklOVEVSRkFDRV9ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvblRvKG1Ecml2ZXJTdGFydGluZ1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0hBTkRMRUQ7CkBAIC0yNTM1LDI5ICsyNTcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yQnJvYWRjYXN0KFdpZmlNYW5hZ2VyLldQU19PVkVSTEFQX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOwotICAgICAgICAgICAgICAgICAgICBTdXBwbGljYW50U3RhdGUgc3RhdGUgPSBzdGF0ZUNoYW5nZVJlc3VsdC5zdGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3VwcGxpY2FudCBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgLy8gWzMxLTEzXSBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICAgICAgICAgICAgICAgICAgICAvLyBbOCAtIDBdIFN1cHBsaWNhbnQgc3RhdGUgKGFzIGRlZmluZWQgaW4gU3VwcGxpY2FudFN0YXRlLmphdmEpCi0gICAgICAgICAgICAgICAgICAgIC8vIDUwMDIzIHN1cHBsaWNhbnRfc3RhdGVfY2hhbmdlZCAoY3VzdG9tfDF8NSkKLSAgICAgICAgICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFVkVOVExPR19TVVBQTElDQU5UX1NUQVRFX0NIQU5HRUQsIHN0YXRlLm9yZGluYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1XaWZpSW5mby5zZXRTdXBwbGljYW50U3RhdGUoc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBOZXR3b3JrIGlkIGlzIG9ubHkgdmFsaWQgd2hlbiB3ZSBzdGFydCBjb25uZWN0aW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChTdXBwbGljYW50U3RhdGUuaXNDb25uZWN0aW5nKHN0YXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChzdGF0ZUNoYW5nZVJlc3VsdC5uZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldE5ldHdvcmtJZChXaWZpQ29uZmlndXJhdGlvbi5JTlZBTElEX05FVFdPUktfSUQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN1cHBsaWNhbnRTdGF0ZS5BU1NPQ0lBVElORykgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogQlNTSUQgaXMgdmFsaWQgb25seSBpbiBBU1NPQ0lBVElORyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbVdpZmlJbmZvLnNldEJTU0lEKHN0YXRlQ2hhbmdlUmVzdWx0LkJTU0lEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1TdXBwbGljYW50U3RhdGVUcmFja2VyLnNlbmRNZXNzYWdlKE1lc3NhZ2Uub2J0YWluKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgICAgICAgICAgbVdwc1N0YXRlTWFjaGluZS5zZW5kTWVzc2FnZShNZXNzYWdlLm9idGFpbihtZXNzYWdlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVTdXBwbGljYW50U3RhdGVDaGFuZ2UobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIC8qIERvIGEgcmVkdW5kYW50IGRpc2Nvbm5lY3Qgd2l0aG91dCB0cmFuc2l0aW9uICovCiAgICAgICAgICAgICAgICAgY2FzZSBDTURfRElTQ09OTkVDVDoKICAgICAgICAgICAgICAgICAgICAgV2lmaU5hdGl2ZS5kaXNjb25uZWN0Q29tbWFuZCgpOwpAQCAtMjY0NSwxMyArMjY1OSwxMSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBEaGNwSW5mb0ludGVybmFsIGRoY3BJbmZvSW50ZXJuYWwgPSBXaWZpQ29uZmlnU3RvcmUuZ2V0SXBDb25maWd1cmF0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3ROZXR3b3JrSWQpOwotICAgICAgICAgICAgICAgIElCaW5kZXIgYiA9IFNlcnZpY2VNYW5hZ2VyLmdldFNlcnZpY2UoQ29udGV4dC5ORVRXT1JLTUFOQUdFTUVOVF9TRVJWSUNFKTsKLSAgICAgICAgICAgICAgICBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlIG5ldGQgPSBJTmV0d29ya01hbmFnZW1lbnRTZXJ2aWNlLlN0dWIuYXNJbnRlcmZhY2UoYik7CiAgICAgICAgICAgICAgICAgSW50ZXJmYWNlQ29uZmlndXJhdGlvbiBpZmNnID0gbmV3IEludGVyZmFjZUNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgICAgICAgICBpZmNnLmFkZHIgPSBkaGNwSW5mb0ludGVybmFsLm1ha2VMaW5rQWRkcmVzcygpOwogICAgICAgICAgICAgICAgIGlmY2cuaW50ZXJmYWNlRmxhZ3MgPSAiW3VwXSI7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbmV0ZC5zZXRJbnRlcmZhY2VDb25maWcobUludGVyZmFjZU5hbWUsIGlmY2cpOworICAgICAgICAgICAgICAgICAgICBud1NlcnZpY2Uuc2V0SW50ZXJmYWNlQ29uZmlnKG1JbnRlcmZhY2VOYW1lLCBpZmNnKTsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiU3RhdGljIElQIGNvbmZpZ3VyYXRpb24gc3VjY2VlZGVkIik7CiAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlKENNRF9TVEFUSUNfSVBfU1VDQ0VTUywgZGhjcEluZm9JbnRlcm5hbCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIHJlKSB7CkBAIC0yODA1LDcgKzI4MTcsNiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVdpZmlJbmZvLmdldE5ldHdvcmtJZCgpID09IHJlc3VsdC5nZXROZXR3b3JrSWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oYXNJcENoYW5nZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywiUmVjb25maWd1cmluZyBJUCBvbiBjb25uZWN0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzLnJlc2V0Q29ubmVjdGlvbnMobUludGVyZmFjZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb25UbyhtQ29ubmVjdGluZ1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGFzUHJveHlDaGFuZ2VkKCkpIHsKQEAgLTI5NjcsNyArMjk3OCw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBTVVBQTElDQU5UX1NUQVRFX0NIQU5HRV9FVkVOVDoKICAgICAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VSZXN1bHQgc3RhdGVDaGFuZ2VSZXN1bHQgPSAoU3RhdGVDaGFuZ2VSZXN1bHQpIG1lc3NhZ2Uub2JqOwogICAgICAgICAgICAgICAgICAgICBzZXROZXR3b3JrRGV0YWlsZWRTdGF0ZShXaWZpSW5mby5nZXREZXRhaWxlZFN0YXRlT2Yoc3RhdGVDaGFuZ2VSZXN1bHQuc3RhdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgLyogRHJpdmVyU3RhcnRlZFN0YXRlIGRvZXMgdGhlIHJlc3Qgb2YgdGhlIGhhbmRsaW5nICovCisgICAgICAgICAgICAgICAgICAgIC8qIENvbm5lY3RNb2RlU3RhdGUgZG9lcyB0aGUgcmVzdCBvZiB0aGUgaGFuZGxpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9IQU5ETEVEOwogICAgICAgICAgICAgICAgIGNhc2UgQ01EX1NUQVJUX1NDQU46CiAgICAgICAgICAgICAgICAgICAgIC8qIERpc2FibGUgYmFja2dyb3VuZCBzY2FuIHRlbXBvcmFyaWx5IGR1cmluZyBhIHJlZ3VsYXIgc2NhbiAqLwo=